diff --git a/cmd/olm/main.go b/cmd/olm/main.go index a4bcfebb43..fcc42bcf1d 100644 --- a/cmd/olm/main.go +++ b/cmd/olm/main.go @@ -231,7 +231,7 @@ func main() { } // Start the controller manager - if err := mgr.Start(ctx.Done()); err != nil { + if err := mgr.Start(ctx); err != nil { logger.WithError(err).Fatal("controller manager stopped") } diff --git a/cmd/olm/manager.go b/cmd/olm/manager.go index a66adcfc9c..3699f85d4a 100644 --- a/cmd/olm/manager.go +++ b/cmd/olm/manager.go @@ -13,7 +13,7 @@ import ( var log = ctrl.Log.WithName("manager") func Manager(ctx context.Context, debug bool) (ctrl.Manager, error) { - ctrl.SetLogger(zap.Logger(debug)) + ctrl.SetLogger(zap.New(zap.UseDevMode(debug))) setupLog := log.WithName("setup").V(4) // Setup a Manager diff --git a/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml b/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml index cd32b78919..06d4050417 100644 --- a/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml +++ b/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml @@ -2,197 +2,165 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: catalogsources.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: CatalogSource listKind: CatalogSourceList plural: catalogsources shortNames: - - catsrc + - catsrc singular: catalogsource scope: Namespaced versions: - - additionalPrinterColumns: - - description: The pretty name of the catalog - jsonPath: .spec.displayName - name: Display - type: string - - description: The type of the catalog - jsonPath: .spec.sourceType - name: Type - type: string - - description: The publisher of the catalog - jsonPath: .spec.publisher - name: Publisher - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: CatalogSource is a repository of CSVs, CRDs, and operator packages. - type: object - required: - - metadata - - 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: - type: object - required: - - sourceType - properties: - address: - description: 'Address is a host that OLM can use to connect to a pre-existing - registry. Format: : Only used when SourceType - = SourceTypeGrpc. Ignored when the Image field is set.' - type: string - configMap: - description: ConfigMap is the name of the ConfigMap to be used to - back a configmap-server registry. Only used when SourceType = SourceTypeConfigmap - or SourceTypeInternal. - type: string - description: - type: string - displayName: - description: Metadata - type: string - icon: - type: object - required: - - base64data - - mediatype - properties: - base64data: - type: string - mediatype: - type: string - image: - description: Image is an operator-registry container image to instantiate - a registry-server with. Only used when SourceType = SourceTypeGrpc. - If present, the address field is ignored. - type: string - priority: - description: 'Priority field assigns a weight to the catalog source - to prioritize them so that it can be consumed by the dependency - resolver. Usage: Higher weight indicates that this catalog source - is preferred over lower weighted catalog sources during dependency - resolution. The range of the priority value can go from positive - to negative in the range of int32. The default value to a catalog - source with unassigned priority would be 0. The catalog source with - the same priority values will be ranked lexicographically based - on its name.' - type: integer - publisher: - type: string - secrets: - description: Secrets represent set of secrets that can be used to - access the contents of the catalog. It is best to keep this list - small, since each will need to be tried for every catalog entry. - type: array - items: + - additionalPrinterColumns: + - description: The pretty name of the catalog + jsonPath: .spec.displayName + name: Display + type: string + - description: The type of the catalog + jsonPath: .spec.sourceType + name: Type + type: string + - description: The publisher of the catalog + jsonPath: .spec.publisher + name: Publisher + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: CatalogSource is a repository of CSVs, CRDs, and operator packages. + type: object + required: + - metadata + - 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: + type: object + required: + - sourceType + properties: + address: + description: 'Address is a host that OLM can use to connect to a pre-existing registry. Format: : Only used when SourceType = SourceTypeGrpc. Ignored when the Image field is set.' type: string - sourceType: - description: SourceType is the type of source - type: string - updateStrategy: - description: UpdateStrategy defines how updated catalog source images - can be discovered Consists of an interval that defines polling duration - and an embedded strategy type - type: object - properties: - registryPoll: - type: object - properties: - interval: - description: Interval is used to determine the time interval - between checks of the latest catalog source version. The - catalog operator polls to see if a new version of the catalog - source is available. If available, the latest image is pulled - and gRPC traffic is directed to the latest catalog source. - type: string - status: - type: object - properties: - configMapReference: - type: object - required: - - name - - namespace - properties: - lastUpdateTime: - type: string - format: date-time - name: - type: string - namespace: - type: string - resourceVersion: - type: string - uid: - description: UID is a type that holds unique ID values, including - UUIDs. Because we don't ONLY use UUIDs, this is an alias to - string. Being a type captures intent and helps make sure that - UIDs and names do not get conflated. - type: string - connectionState: - type: object - required: - - lastObservedState - properties: - address: - type: string - lastConnect: - type: string - format: date-time - lastObservedState: - type: string - latestImageRegistryPoll: - description: The last time the CatalogSource image registry has been - polled to ensure the image is up-to-date - type: string - format: date-time - message: - description: A human readable message indicating details about why - the CatalogSource is in this condition. - type: string - reason: - description: Reason is the reason the CatalogSource was transitioned - to its current state. - type: string - registryService: - type: object - properties: - createdAt: - type: string - format: date-time - port: - type: string - protocol: - type: string - serviceName: - type: string - serviceNamespace: + configMap: + description: ConfigMap is the name of the ConfigMap to be used to back a configmap-server registry. Only used when SourceType = SourceTypeConfigmap or SourceTypeInternal. + type: string + description: + type: string + displayName: + description: Metadata + type: string + icon: + type: object + required: + - base64data + - mediatype + properties: + base64data: + type: string + mediatype: + type: string + image: + description: Image is an operator-registry container image to instantiate a registry-server with. Only used when SourceType = SourceTypeGrpc. If present, the address field is ignored. + type: string + priority: + description: 'Priority field assigns a weight to the catalog source to prioritize them so that it can be consumed by the dependency resolver. Usage: Higher weight indicates that this catalog source is preferred over lower weighted catalog sources during dependency resolution. The range of the priority value can go from positive to negative in the range of int32. The default value to a catalog source with unassigned priority would be 0. The catalog source with the same priority values will be ranked lexicographically based on its name.' + type: integer + publisher: + type: string + secrets: + description: Secrets represent set of secrets that can be used to access the contents of the catalog. It is best to keep this list small, since each will need to be tried for every catalog entry. + type: array + items: type: string - served: true - storage: true - subresources: - status: {} + sourceType: + description: SourceType is the type of source + type: string + updateStrategy: + description: UpdateStrategy defines how updated catalog source images can be discovered Consists of an interval that defines polling duration and an embedded strategy type + type: object + properties: + registryPoll: + type: object + properties: + interval: + description: Interval is used to determine the time interval between checks of the latest catalog source version. The catalog operator polls to see if a new version of the catalog source is available. If available, the latest image is pulled and gRPC traffic is directed to the latest catalog source. + type: string + status: + type: object + properties: + configMapReference: + type: object + required: + - name + - namespace + properties: + lastUpdateTime: + type: string + format: date-time + name: + type: string + namespace: + type: string + resourceVersion: + type: string + uid: + description: UID is a type that holds unique ID values, including UUIDs. Because we don't ONLY use UUIDs, this is an alias to string. Being a type captures intent and helps make sure that UIDs and names do not get conflated. + type: string + connectionState: + type: object + required: + - lastObservedState + properties: + address: + type: string + lastConnect: + type: string + format: date-time + lastObservedState: + type: string + latestImageRegistryPoll: + description: The last time the CatalogSource image registry has been polled to ensure the image is up-to-date + type: string + format: date-time + message: + description: A human readable message indicating details about why the CatalogSource is in this condition. + type: string + reason: + description: Reason is the reason the CatalogSource was transitioned to its current state. + type: string + registryService: + type: object + properties: + createdAt: + type: string + format: date-time + port: + type: string + protocol: + type: string + serviceName: + type: string + serviceNamespace: + type: string + served: true + storage: true + subresources: + status: {} diff --git a/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml b/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml index 6008cc0c32..1e5d355ed5 100644 --- a/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml +++ b/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml @@ -2,9513 +2,4780 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: clusterserviceversions.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: ClusterServiceVersion listKind: ClusterServiceVersionList plural: clusterserviceversions shortNames: - - csv - - csvs + - csv + - csvs singular: clusterserviceversion scope: Namespaced versions: - - additionalPrinterColumns: - - description: The name of the CSV - jsonPath: .spec.displayName - name: Display - type: string - - description: The version of the CSV - jsonPath: .spec.version - name: Version - type: string - - description: The name of a CSV that this one replaces - jsonPath: .spec.replaces - name: Replaces - type: string - - jsonPath: .status.phase - name: Phase - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: ClusterServiceVersion is a Custom Resource of type `ClusterServiceVersionSpec`. - type: object - required: - - metadata - - 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: ClusterServiceVersionSpec declarations tell OLM how to install - an operator that can manage apps for a given version. - type: object - required: - - displayName - - install - properties: - annotations: - description: Annotations is an unstructured key value map stored with - a resource that may be set by external tools to store and retrieve - arbitrary metadata. - type: object - additionalProperties: + - additionalPrinterColumns: + - description: The name of the CSV + jsonPath: .spec.displayName + name: Display + type: string + - description: The version of the CSV + jsonPath: .spec.version + name: Version + type: string + - description: The name of a CSV that this one replaces + jsonPath: .spec.replaces + name: Replaces + type: string + - jsonPath: .status.phase + name: Phase + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: ClusterServiceVersion is a Custom Resource of type `ClusterServiceVersionSpec`. + type: object + required: + - metadata + - 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: ClusterServiceVersionSpec declarations tell OLM how to install an operator that can manage apps for a given version. + type: object + required: + - displayName + - install + properties: + annotations: + description: Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. + type: object + additionalProperties: + type: string + apiservicedefinitions: + description: APIServiceDefinitions declares all of the extension apis managed or required by an operator being ran by ClusterServiceVersion. + type: object + properties: + owned: + type: array + items: + description: APIServiceDescription provides details to OLM about apis provided via aggregation + type: object + required: + - group + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + containerPort: + type: integer + format: int32 + deploymentName: + type: string + description: + type: string + displayName: + type: string + group: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + required: + type: array + items: + description: APIServiceDescription provides details to OLM about apis provided via aggregation + type: object + required: + - group + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + containerPort: + type: integer + format: int32 + deploymentName: + type: string + description: + type: string + displayName: + type: string + group: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + customresourcedefinitions: + description: "CustomResourceDefinitions declares all of the CRDs managed or required by an operator being ran by ClusterServiceVersion. \n If the CRD is present in the Owned list, it is implicitly required." + type: object + properties: + owned: + type: array + items: + description: CRDDescription provides details to OLM about the CRDs + type: object + required: + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + description: + type: string + displayName: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + required: + type: array + items: + description: CRDDescription provides details to OLM about the CRDs + type: object + required: + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + description: + type: string + displayName: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + description: type: string - apiservicedefinitions: - description: APIServiceDefinitions declares all of the extension apis - managed or required by an operator being ran by ClusterServiceVersion. - type: object - properties: - owned: - type: array - items: - description: APIServiceDescription provides details to OLM about - apis provided via aggregation + displayName: + type: string + icon: + type: array + items: + type: object + required: + - base64data + - mediatype + properties: + base64data: + type: string + mediatype: + type: string + install: + description: NamedInstallStrategy represents the block of an ClusterServiceVersion resource where the install strategy is specified. + type: object + required: + - strategy + properties: + spec: + description: StrategyDetailsDeployment represents the parsed details of a Deployment InstallStrategy. type: object required: - - group - - kind - - name - - version + - deployments properties: - actionDescriptors: + clusterPermissions: type: array items: - description: ActionDescriptor describes a declarative - action that can be performed on a custom resource instance + description: StrategyDeploymentPermissions describe the rbac rules and service account needed by the install strategy type: object required: - - path + - rules + - serviceAccountName properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: + rules: type: array items: - type: string - containerPort: - type: integer - format: int32 - deploymentName: - type: string - description: - type: string - displayName: - type: string - group: - type: string - kind: - type: string - name: - type: string - resources: + description: PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to. + type: object + required: + - verbs + properties: + apiGroups: + description: APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. + type: array + items: + type: string + nonResourceURLs: + description: NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both. + type: array + items: + type: string + resourceNames: + description: ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. + type: array + items: + type: string + resources: + description: Resources is a list of resources this rule applies to. ResourceAll represents all resources. + type: array + items: + type: string + verbs: + description: Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds. + type: array + items: + type: string + serviceAccountName: + type: string + deployments: type: array items: - description: APIResourceReference is a Kubernetes resource - type used by a custom resource + description: StrategyDeploymentSpec contains the name, spec and labels for the deployment ALM should create type: object required: - - kind - - name - - version + - name + - spec properties: - kind: - type: string - name: - type: string - version: - type: string - specDescriptors: - type: array - items: - description: SpecDescriptor describes a field in a spec - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - statusDescriptors: - type: array - items: - description: StatusDescriptor describes a field in a status - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - version: - type: string - required: - type: array - items: - description: APIServiceDescription provides details to OLM about - apis provided via aggregation - type: object - required: - - group - - kind - - name - - version - properties: - actionDescriptors: - type: array - items: - description: ActionDescriptor describes a declarative - action that can be performed on a custom resource instance - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - containerPort: - type: integer - format: int32 - deploymentName: - type: string - description: - type: string - displayName: - type: string - group: - type: string - kind: - type: string - name: - type: string - resources: - type: array - items: - description: APIResourceReference is a Kubernetes resource - type used by a custom resource - type: object - required: - - kind - - name - - version - properties: - kind: - type: string - name: - type: string - version: - type: string - specDescriptors: - type: array - items: - description: SpecDescriptor describes a field in a spec - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - statusDescriptors: - type: array - items: - description: StatusDescriptor describes a field in a status - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - version: - type: string - customresourcedefinitions: - description: "CustomResourceDefinitions declares all of the CRDs managed - or required by an operator being ran by ClusterServiceVersion. \n - If the CRD is present in the Owned list, it is implicitly required." - type: object - properties: - owned: - type: array - items: - description: CRDDescription provides details to OLM about the - CRDs - type: object - required: - - kind - - name - - version - properties: - actionDescriptors: - type: array - items: - description: ActionDescriptor describes a declarative - action that can be performed on a custom resource instance - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - description: - type: string - displayName: - type: string - kind: - type: string - name: - type: string - resources: - type: array - items: - description: APIResourceReference is a Kubernetes resource - type used by a custom resource - type: object - required: - - kind - - name - - version - properties: - kind: - type: string - name: - type: string - version: - type: string - specDescriptors: - type: array - items: - description: SpecDescriptor describes a field in a spec - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - statusDescriptors: - type: array - items: - description: StatusDescriptor describes a field in a status - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - version: - type: string - required: - type: array - items: - description: CRDDescription provides details to OLM about the - CRDs - type: object - required: - - kind - - name - - version - properties: - actionDescriptors: - type: array - items: - description: ActionDescriptor describes a declarative - action that can be performed on a custom resource instance - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: + label: + description: Set is a map of label:value. It implements Labels. + type: object + additionalProperties: type: string - description: - type: string - displayName: - type: string - kind: - type: string - name: - type: string - resources: - type: array - items: - description: APIResourceReference is a Kubernetes resource - type used by a custom resource - type: object - required: - - kind - - name - - version - properties: - kind: - type: string name: type: string - version: - type: string - specDescriptors: - type: array - items: - description: SpecDescriptor describes a field in a spec - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - statusDescriptors: - type: array - items: - description: StatusDescriptor describes a field in a status - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - version: - type: string - description: - type: string - displayName: - type: string - icon: - type: array - items: - type: object - required: - - base64data - - mediatype - properties: - base64data: - type: string - mediatype: - type: string - install: - description: NamedInstallStrategy represents the block of an ClusterServiceVersion - resource where the install strategy is specified. - type: object - required: - - strategy - properties: - spec: - description: StrategyDetailsDeployment represents the parsed details - of a Deployment InstallStrategy. - type: object - required: - - deployments - properties: - clusterPermissions: - type: array - items: - description: StrategyDeploymentPermissions describe the - rbac rules and service account needed by the install strategy - type: object - required: - - rules - - serviceAccountName - properties: - rules: - type: array - items: - description: PolicyRule holds information that describes - a policy rule, but does not contain information - about who the rule applies to or which namespace - the rule applies to. + spec: + description: DeploymentSpec is the specification of the desired behavior of the Deployment. type: object required: - - verbs + - selector + - template properties: - apiGroups: - description: APIGroups is the name of the APIGroup - that contains the resources. If multiple API - groups are specified, any action requested against - one of the enumerated resources in any API group - will be allowed. - type: array - items: - type: string - nonResourceURLs: - description: NonResourceURLs is a set of partial - urls that a user should have access to. *s - are allowed, but only as the full, final step - in the path Since non-resource URLs are not - namespaced, this field is only applicable for - ClusterRoles referenced from a ClusterRoleBinding. - Rules can either apply to API resources (such - as "pods" or "secrets") or non-resource URL - paths (such as "/api"), but not both. - type: array - items: - type: string - resourceNames: - description: ResourceNames is an optional white - list of names that the rule applies to. An - empty set means that everything is allowed. - type: array - items: - type: string - resources: - description: Resources is a list of resources - this rule applies to. ResourceAll represents - all resources. - type: array - items: - type: string - verbs: - description: Verbs is a list of Verbs that apply - to ALL the ResourceKinds and AttributeRestrictions - contained in this rule. VerbAll represents - all kinds. - type: array - items: - type: string - serviceAccountName: - type: string - deployments: - type: array - items: - description: StrategyDeploymentSpec contains the name, spec - and labels for the deployment ALM should create - type: object - required: - - name - - spec - properties: - label: - description: Set is a map of label:value. It implements - Labels. - type: object - additionalProperties: - type: string - name: - type: string - spec: - description: DeploymentSpec is the specification of - the desired behavior of the Deployment. - type: object - required: - - selector - - template - properties: - minReadySeconds: - description: Minimum number of seconds for which - a newly created pod should be ready without any - of its container crashing, for it to be considered - available. Defaults to 0 (pod will be considered - available as soon as it is ready) - type: integer - format: int32 - paused: - description: Indicates that the deployment is paused. - type: boolean - progressDeadlineSeconds: - description: The maximum time in seconds for a deployment - to make progress before it is considered to be - failed. The deployment controller will continue - to process failed deployments and a condition - with a ProgressDeadlineExceeded reason will be - surfaced in the deployment status. Note that progress - will not be estimated during the time a deployment - is paused. Defaults to 600s. - type: integer - format: int32 - replicas: - description: Number of desired pods. This is a pointer - to distinguish between explicit zero and not specified. - Defaults to 1. - type: integer - format: int32 - revisionHistoryLimit: - description: The number of old ReplicaSets to retain - to allow rollback. This is a pointer to distinguish - between explicit zero and not specified. Defaults - to 10. - type: integer - format: int32 - selector: - description: Label selector for pods. Existing ReplicaSets - whose pods are selected by this will be the ones - affected by this deployment. It must match the - pod template's labels. - 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. + minReadySeconds: + description: Minimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready) + type: integer + format: int32 + paused: + description: Indicates that the deployment is paused. + type: boolean + progressDeadlineSeconds: + description: The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s. + type: integer + format: int32 + replicas: + description: Number of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1. + type: integer + format: int32 + revisionHistoryLimit: + description: The number of old ReplicaSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 10. + type: integer + format: int32 + selector: + description: Label selector for pods. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment. It must match the pod template's labels. + 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 + strategy: + description: The deployment strategy to use to replace existing pods with new ones. + type: object + properties: + rollingUpdate: + description: 'Rolling update config params. Present only if DeploymentStrategyType = RollingUpdate. --- TODO: Update this to follow our convention for oneOf, whatever we decide it to be.' 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: + maxSurge: + description: 'The maximum number of pods that can be scheduled above the desired number of pods. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 25%. Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when the rolling update starts, such that the total number of old and new pods do not exceed 130% of desired pods. Once old pods have been killed, new ReplicaSet can be scaled up further, ensuring that total number of pods running at any time during the update is at most 130% of desired pods.' + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + maxUnavailable: + description: 'The maximum number of pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 25%. Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods immediately when the rolling update starts. Once new pods are ready, old ReplicaSet can be scaled down further, followed by scaling up the new ReplicaSet, ensuring that the total number of pods available at all times during the update is at least 70% of desired pods.' + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + type: + description: Type of deployment. Can be "Recreate" or "RollingUpdate". Default is RollingUpdate. type: string - strategy: - description: The deployment strategy to use to replace - existing pods with new ones. - type: object - properties: - rollingUpdate: - description: 'Rolling update config params. - Present only if DeploymentStrategyType = RollingUpdate. - --- TODO: Update this to follow our convention - for oneOf, whatever we decide it to be.' - type: object - properties: - maxSurge: - description: 'The maximum number of pods - that can be scheduled above the desired - number of pods. Value can be an absolute - number (ex: 5) or a percentage of desired - pods (ex: 10%). This can not be 0 if MaxUnavailable - is 0. Absolute number is calculated from - percentage by rounding up. Defaults to - 25%. Example: when this is set to 30%, - the new ReplicaSet can be scaled up immediately - when the rolling update starts, such that - the total number of old and new pods do - not exceed 130% of desired pods. Once - old pods have been killed, new ReplicaSet - can be scaled up further, ensuring that - total number of pods running at any time - during the update is at most 130% of desired - pods.' - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - maxUnavailable: - description: 'The maximum number of pods - that can be unavailable during the update. - Value can be an absolute number (ex: 5) - or a percentage of desired pods (ex: 10%). - Absolute number is calculated from percentage - by rounding down. This can not be 0 if - MaxSurge is 0. Defaults to 25%. Example: - when this is set to 30%, the old ReplicaSet - can be scaled down to 70% of desired pods - immediately when the rolling update starts. - Once new pods are ready, old ReplicaSet - can be scaled down further, followed by - scaling up the new ReplicaSet, ensuring - that the total number of pods available - at all times during the update is at least - 70% of desired pods.' - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - type: - description: Type of deployment. Can be "Recreate" - or "RollingUpdate". Default is RollingUpdate. - type: string - template: - description: Template describes the pods that will - be created. - type: object - properties: - metadata: - description: 'Standard object''s metadata. More - info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - type: object - x-kubernetes-preserve-unknown-fields: true - spec: - description: 'Specification of the desired behavior - of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' - type: object - required: - - containers - properties: - activeDeadlineSeconds: - description: Optional duration in seconds - the pod may be active on the node relative - to StartTime before the system will actively - try to mark it failed and kill associated - containers. Value must be a positive integer. - type: integer - format: int64 - affinity: - description: If specified, the pod's scheduling - constraints - type: object - properties: - nodeAffinity: - description: Describes node affinity - scheduling rules for the pod. - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will - prefer to schedule pods to nodes - that satisfy the affinity expressions - specified by this field, but it - may choose a node that violates - one or more of the expressions. - The node that is most preferred - is the one with the greatest sum - of weights, i.e. for each node - that meets all of the scheduling - requirements (resource request, - requiredDuringScheduling affinity - expressions, etc.), compute a - sum by iterating through the elements - of this field and adding "weight" - to the sum if the node matches - the corresponding matchExpressions; - the node(s) with the highest sum - are the most preferred. - type: array - items: - description: An empty preferred - scheduling term matches all - objects with implicit weight - 0 (i.e. it's a no-op). A null - preferred scheduling term matches - no objects (i.e. is also a no-op). + template: + description: Template describes the pods that will be created. + type: object + properties: + metadata: + description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' + type: object + x-kubernetes-preserve-unknown-fields: true + spec: + description: 'Specification of the desired behavior of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' + type: object + required: + - containers + properties: + activeDeadlineSeconds: + description: Optional duration in seconds the pod may be active on the node relative to StartTime before the system will actively try to mark it failed and kill associated containers. Value must be a positive integer. + type: integer + format: int64 + affinity: + description: If specified, the pod's scheduling constraints + type: object + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for the pod. + type: object + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. + type: array + items: + description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). + type: object + required: + - preference + - weight + properties: + preference: + description: A node selector term, associated with the corresponding weight. + type: object + properties: + matchExpressions: + description: A list of node selector requirements by node's labels. + type: array + items: + description: A node 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: The label key that the selector applies to. + type: string + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: 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. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchFields: + description: A list of node selector requirements by node's fields. + type: array + items: + description: A node 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: The label key that the selector applies to. + type: string + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: 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. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + weight: + description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. + type: integer + format: int32 + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. type: object required: - - preference - - weight + - nodeSelectorTerms properties: - preference: - description: A node selector - term, associated with the - corresponding weight. - type: object - properties: - matchExpressions: - description: A list of - node selector requirements - by node's labels. - type: array - items: - description: A node - 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: The - label key that - the selector applies - to. - type: string - operator: - description: Represents - a key's relationship - to a set of values. - Valid operators - are In, NotIn, - Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: 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. - If the operator - is Gt or Lt, the - values array must - have a single - element, which - will be interpreted - as an integer. - This array is - replaced during - a strategic merge - patch. - type: array - items: + nodeSelectorTerms: + description: Required. A list of node selector terms. The terms are ORed. + type: array + items: + description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements by node's labels. + type: array + items: + description: A node 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: The label key that the selector applies to. type: string - matchFields: - description: A list of - node selector requirements - by node's fields. - type: array - items: - description: A node - 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: The - label key that - the selector applies - to. - type: string - operator: - description: Represents - a key's relationship - to a set of values. - Valid operators - are In, NotIn, - Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: 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. - If the operator - is Gt or Lt, the - values array must - have a single - element, which - will be interpreted - as an integer. - This array is - replaced during - a strategic merge - patch. - type: array - items: + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. type: string - weight: - description: Weight associated - with matching the corresponding - nodeSelectorTerm, in the - range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements - specified by this field are not - met at scheduling time, the pod - will not be scheduled onto the - node. If the affinity requirements - specified by this field cease - to be met at some point during - pod execution (e.g. due to an - update), the system may or may - not try to eventually evict the - pod from its node. - type: object - required: - - nodeSelectorTerms - properties: - nodeSelectorTerms: - description: Required. A list - of node selector terms. The - terms are ORed. - type: array - items: - description: A null or empty - node selector term matches - no objects. The requirements - of them are ANDed. The TopologySelectorTerm - type implements a subset - of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of - node selector requirements - by node's labels. - type: array - items: - description: A node - 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: The - label key that - the selector applies - to. - type: string - operator: - description: Represents - a key's relationship - to a set of values. - Valid operators - are In, NotIn, - Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: 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. - If the operator - is Gt or Lt, the - values array must - have a single - element, which - will be interpreted - as an integer. - This array is - replaced during - a strategic merge - patch. - type: array - items: + values: + description: 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. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchFields: + description: A list of node selector requirements by node's fields. + type: array + items: + description: A node 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: The label key that the selector applies to. type: string - matchFields: - description: A list of - node selector requirements - by node's fields. - type: array - items: - description: A node - selector requirement - is a selector that - contains values, a - key, and an operator - that relates the key - and values. + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: 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. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + podAffinity: + description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). + type: object + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) + type: object + required: + - podAffinityTerm + - weight + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated with the corresponding weight. + type: object + required: + - topologyKey + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. type: object - required: - - key - - operator properties: - key: - description: The - label key that - the selector applies - to. - type: string - operator: - description: Represents - a key's relationship - to a set of values. - Valid operators - are In, NotIn, - Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: 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. - If the operator - is Gt or Lt, the - values array must - have a single - element, which - will be interpreted - as an integer. - This array is - replaced during - a strategic merge - patch. + 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 - podAffinity: - description: Describes pod affinity - scheduling rules (e.g. co-locate this - pod in the same node, zone, etc. as - some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will - prefer to schedule pods to nodes - that satisfy the affinity expressions - specified by this field, but it - may choose a node that violates - one or more of the expressions. - The node that is most preferred - is the one with the greatest sum - of weights, i.e. for each node - that meets all of the scheduling - requirements (resource request, - requiredDuringScheduling affinity - expressions, etc.), compute a - sum by iterating through the elements - of this field and adding "weight" - to the sum if the node has pods - which matches the corresponding - podAffinityTerm; the node(s) with - the highest sum are the most preferred. - type: array - items: - description: The weights of all - of the matched WeightedPodAffinityTerm - fields are added per-node to - find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod - affinity term, associated - with the corresponding weight. - type: object - required: + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: + type: string + topologyKey: + description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. + type: string + weight: + description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. + type: integer + format: int32 + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running + type: object + required: - topologyKey - properties: - labelSelector: - description: A label query - over a set of resources, - in this case pods. - 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: + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. + 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. + 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 - 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 - namespaces: - description: namespaces - specifies which namespaces - the labelSelector applies - to (matches against); - null or empty list means - "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod - should be co-located - (affinity) or not co-located - (anti-affinity) with - the pods matching the - labelSelector in the - specified namespaces, - where co-located is - defined as running on - a node whose value of - the label with key topologyKey - matches that of any - node on which any of - the selected pods is - running. Empty topologyKey - is not allowed. + 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 + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: type: string - weight: - description: weight associated - with matching the corresponding - podAffinityTerm, in the - range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements - specified by this field are not - met at scheduling time, the pod - will not be scheduled onto the - node. If the affinity requirements - specified by this field cease - to be met at some point during - pod execution (e.g. due to a pod - label update), the system may - or may not try to eventually evict - the pod from its node. When there - are multiple elements, the lists - of nodes corresponding to each - podAffinityTerm are intersected, - i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of - pods (namely those matching - the labelSelector relative to - the given namespace(s)) that - this pod should be co-located - (affinity) or not co-located - (anti-affinity) with, where - co-located is defined as running - on a node whose value of the - label with key - matches that of any node on - which a pod of the set of pods - is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query - over a set of resources, - in this case pods. - 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. + topologyKey: + description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. + type: string + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). + type: object + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) + type: object + required: + - podAffinityTerm + - weight + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated with the corresponding weight. + type: object + required: + - topologyKey + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. 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. + 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 - 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: + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: + type: string + topologyKey: + description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. type: string - namespaces: - description: namespaces specifies - which namespaces the labelSelector - applies to (matches against); - null or empty list means - "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should - be co-located (affinity) - or not co-located (anti-affinity) - with the pods matching the - labelSelector in the specified - namespaces, where co-located - is defined as running on - a node whose value of the - label with key topologyKey - matches that of any node - on which any of the selected - pods is running. Empty topologyKey - is not allowed. - type: string - podAntiAffinity: - description: Describes pod anti-affinity - scheduling rules (e.g. avoid putting - this pod in the same node, zone, etc. - as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will - prefer to schedule pods to nodes - that satisfy the anti-affinity - expressions specified by this - field, but it may choose a node - that violates one or more of the - expressions. The node that is - most preferred is the one with - the greatest sum of weights, i.e. - for each node that meets all of - the scheduling requirements (resource - request, requiredDuringScheduling - anti-affinity expressions, etc.), - compute a sum by iterating through - the elements of this field and - adding "weight" to the sum if - the node has pods which matches - the corresponding podAffinityTerm; - the node(s) with the highest sum - are the most preferred. - type: array - items: - description: The weights of all - of the matched WeightedPodAffinityTerm - fields are added per-node to - find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod - affinity term, associated - with the corresponding weight. - type: object - required: + weight: + description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. + type: integer + format: int32 + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running + type: object + required: - topologyKey - properties: - labelSelector: - description: A label query - over a set of resources, - in this case pods. - 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: + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. + 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. + 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 - 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 - namespaces: - description: namespaces - specifies which namespaces - the labelSelector applies - to (matches against); - null or empty list means - "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod - should be co-located - (affinity) or not co-located - (anti-affinity) with - the pods matching the - labelSelector in the - specified namespaces, - where co-located is - defined as running on - a node whose value of - the label with key topologyKey - matches that of any - node on which any of - the selected pods is - running. Empty topologyKey - is not allowed. + 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 + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: type: string - weight: - description: weight associated - with matching the corresponding - podAffinityTerm, in the - range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity - requirements specified by this - field are not met at scheduling - time, the pod will not be scheduled - onto the node. If the anti-affinity - requirements specified by this - field cease to be met at some - point during pod execution (e.g. - due to a pod label update), the - system may or may not try to eventually - evict the pod from its node. When - there are multiple elements, the - lists of nodes corresponding to - each podAffinityTerm are intersected, - i.e. all terms must be satisfied. + topologyKey: + description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. + type: string + automountServiceAccountToken: + description: AutomountServiceAccountToken indicates whether a service account token should be automatically mounted. + type: boolean + containers: + description: List of containers belonging to the pod. Containers cannot currently be added or removed. There must be at least one container in a Pod. Cannot be updated. + type: array + items: + description: A single application container that you want to run within a pod. + type: object + required: + - name + properties: + args: + description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + command: + description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + env: + description: List of environment variables to set in the container. Cannot be updated. type: array items: - description: Defines a set of - pods (namely those matching - the labelSelector relative to - the given namespace(s)) that - this pod should be co-located - (affinity) or not co-located - (anti-affinity) with, where - co-located is defined as running - on a node whose value of the - label with key - matches that of any node on - which a pod of the set of pods - is running + description: EnvVar represents an environment variable present in a Container. type: object required: - - topologyKey + - name properties: - labelSelector: - description: A label query - over a set of resources, - in this case pods. + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded using the previous 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. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(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: - 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: + configMapKeyRef: + description: Selects a key of a ConfigMap. + 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. + 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 + 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 - additionalProperties: - type: string - namespaces: - description: namespaces specifies - which namespaces the labelSelector - applies to (matches against); - null or empty list means - "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should - be co-located (affinity) - or not co-located (anti-affinity) - with the pods matching the - labelSelector in the specified - namespaces, where co-located - is defined as running on - a node whose value of the - label with key topologyKey - matches that of any node - on which any of the selected - pods is running. Empty topologyKey - is not allowed. + 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 + 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 + 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 + envFrom: + description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps + type: object + properties: + configMapRef: + description: The ConfigMap to select from + type: object + properties: + 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 must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. type: string - automountServiceAccountToken: - description: AutomountServiceAccountToken - indicates whether a service account token - should be automatically mounted. - type: boolean - containers: - description: List of containers belonging - to the pod. Containers cannot currently - be added or removed. There must be at - least one container in a Pod. Cannot be - updated. - type: array - items: - description: A single application container - that you want to run within a pod. - type: object - required: - - name - properties: - args: - description: 'Arguments to the entrypoint. - The docker image''s CMD is used - if this is not provided. Variable - references $(VAR_NAME) are expanded - using the container''s environment. - If a variable cannot be resolved, - the reference in the input string - will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless - of whether the variable exists or - not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + secretRef: + description: The Secret to select from + type: object + properties: + 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 must be defined + type: boolean + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.' type: string - command: - description: 'Entrypoint array. Not - executed within a shell. The docker - image''s ENTRYPOINT is used if this - is not provided. Variable references - $(VAR_NAME) are expanded using the - container''s environment. If a variable - cannot be resolved, the reference - in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped - with a double $$, ie: $$(VAR_NAME). - Escaped references will never be - expanded, regardless of whether - the variable exists or not. Cannot - be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string - env: - description: List of environment variables - to set in the container. Cannot - be updated. - type: array - items: - description: EnvVar represents an - environment variable present in - a Container. + lifecycle: + description: Actions that the management system should take in response to container lifecycle events. Cannot be updated. 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 previous 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. The $(VAR_NAME) - syntax can be escaped with - a double $$, ie: $$(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. + postStart: + description: 'PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' type: object properties: - configMapKeyRef: - description: Selects a key - of a ConfigMap. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - key + - port properties: - key: - description: The key - to select. + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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?' + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - optional: - description: Specify - whether the ConfigMap - or its key must be - defined - type: boolean - 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.' + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - fieldPath + - port 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. + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - 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.' + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + preStop: + description: 'PreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod''s termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod''s termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - resource + - port properties: - containerName: - description: 'Container - name: required for - volumes, optional - for env vars' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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]+))))?$ + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - resource: - description: 'Required: - resource to select' + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - secretKeyRef: - description: Selects a key - of a secret in the pod's - namespace + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - key + - port 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?' + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - optional: - description: Specify - whether the Secret - or its key must be - defined - type: boolean - envFrom: - description: List of sources to populate - environment variables in the container. - The keys defined within a source - must be a C_IDENTIFIER. All invalid - keys will be reported as an event - when the container is starting. - When a key exists in multiple sources, - the value associated with the last - source will take precedence. Values - defined by an Env with a duplicate - key will take precedence. Cannot - be updated. - type: array - items: - description: EnvFromSource represents - the source of a set of ConfigMaps + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + livenessProbe: + description: 'Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: object properties: - configMapRef: - description: The ConfigMap to - select from + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. type: object properties: - 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 must be - defined - type: boolean - prefix: - description: An optional identifier - to prepend to each key in - the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select - from + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. type: object + required: + - port properties: - 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?' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - optional: - description: Specify whether - the Secret must be defined - type: boolean - image: - description: 'Docker image name. More - info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow - higher level config management to - default or override container images - in workload controllers like Deployments - and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One - of Always, Never, IfNotPresent. - Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - lifecycle: - description: Actions that the management - system should take in response to - container lifecycle events. Cannot - be updated. - type: object - properties: - postStart: - description: 'PostStart is called - immediately after a container - is created. If the handler fails, - the container is terminated - and restarted according to its - restart policy. Other management - of the container blocks until - the hook completes. More info: - https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - preStop: - description: 'PreStop is called - immediately before a container - is terminated due to an API - request or management event - such as liveness/startup probe - failure, preemption, resource - contention, etc. The handler - is not called if the container - crashes or exits. The reason - for termination is passed to - the handler. The Pod''s termination - grace period countdown begins - before the PreStop hooked is - executed. Regardless of the - outcome of the handler, the - container will eventually terminate - within the Pod''s termination - grace period. Other management - of the container blocks until - the hook completes or until - the termination grace period - is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: - name - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: - type: integer - type: string - x-kubernetes-int-or-string: true - livenessProbe: - description: 'Periodic probe of container - liveness. Container will be restarted - if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - name: - description: Name of the container - specified as a DNS_LABEL. Each container - in a pod must have a unique name - (DNS_LABEL). Cannot be updated. - type: string - ports: - description: List of ports to expose - from the container. Exposing a port - here gives the system additional - information about the network connections - a container uses, but is primarily - informational. Not specifying a - port here DOES NOT prevent that - port from being exposed. Any port - which is listening on the default - "0.0.0.0" address inside a container - will be accessible from the network. - Cannot be updated. - type: array - items: - description: ContainerPort represents - a network port in a single container. - type: object - required: - - containerPort - properties: - containerPort: - description: Number of port - to expose on the pod's IP - address. This must be a valid - port number, 0 < x < 65536. + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: integer format: int32 - hostIP: - description: What host IP to - bind the external port to. - type: string - hostPort: - description: Number of port - to expose on the host. If - specified, this must be a - valid port number, 0 < x < - 65536. If HostNetwork is specified, - this must match ContainerPort. - Most containers do not need - this. + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: integer format: int32 - name: - description: If specified, this - must be an IANA_SVC_NAME and - unique within the pod. Each - named port in a pod must have - a unique name. Name for the - port that can be referred - to by services. - type: string - protocol: - description: Protocol for port. - Must be UDP, TCP, or SCTP. - Defaults to "TCP". - type: string - default: TCP - x-kubernetes-list-map-keys: - - containerPort - - protocol - x-kubernetes-list-type: map - readinessProbe: - description: 'Periodic probe of container - service readiness. Container will - be removed from service endpoints - if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: - type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. + name: + description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated. + type: string + ports: + description: List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network port in a single container. type: object required: - - port + - containerPort properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. + containerPort: + description: Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536. + type: integer + format: int32 + hostIP: + description: What host IP to bind the external port to. type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. + hostPort: + description: Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this. + type: integer + format: int32 + name: + description: If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services. type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' + protocol: + description: Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP". type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - resources: - description: 'Compute Resources required - by this container. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - properties: - limits: - description: 'Limits describes - the maximum amount of compute - resources allowed. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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 - securityContext: - description: 'Security options the - pod should run with. More info: - https://kubernetes.io/docs/concepts/policy/security-context/ - More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' - type: object - properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation - controls whether a process can - gain more privileges than its - parent process. This bool directly - controls if the no_new_privs - flag will be set on the container - process. AllowPrivilegeEscalation - is true always when the container - is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' - type: boolean - capabilities: - description: The capabilities - to add/drop when running containers. - Defaults to the default set - of capabilities granted by the - container runtime. - type: object - properties: - add: - description: Added capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + default: TCP + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + description: 'Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - drop: - description: Removed capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. type: string - privileged: - description: Run container in - privileged mode. Processes in - privileged containers are essentially - equivalent to root on the host. - Defaults to false. - type: boolean - procMount: - description: procMount denotes - the type of proc mount to use - for the containers. The default - is DefaultProcMount which uses - the container runtime defaults - for readonly paths and masked - paths. This requires the ProcMountType - feature flag to be enabled. - type: string - readOnlyRootFilesystem: - description: Whether this container - has a read-only root filesystem. - Default is false. - type: boolean - runAsGroup: - description: The GID to run the - entrypoint of the container - process. Uses runtime default - if unset. May also be set in - PodSecurityContext. If set - in both SecurityContext and - PodSecurityContext, the value - specified in SecurityContext - takes precedence. - type: integer - format: int64 - runAsNonRoot: - description: Indicates that the - container must run as a non-root - user. If true, the Kubelet will - validate the image at runtime - to ensure that it does not run - as UID 0 (root) and fail to - start the container if it does. - If unset or false, no such validation - will be performed. May also - be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: boolean - runAsUser: - description: The UID to run the - entrypoint of the container - process. Defaults to user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: integer - format: int64 - seLinuxOptions: - description: The SELinux context - to be applied to the container. - If unspecified, the container - runtime will allocate a random - SELinux context for each container. May - also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - 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 - seccompProfile: - description: The seccomp options - to use by this container. If - seccomp options are provided - at both the pod & container - level, the container options - override the pod options. - type: object - required: - - type - properties: - localhostProfile: - description: localhostProfile - indicates a profile defined - in a file on the node should - be used. The profile must - be preconfigured on the - node to work. Must be a - descending path, relative - to the kubelet's configured - seccomp profile location. - Must only be set if type - is "Localhost". - type: string - type: - description: "type indicates - which kind of seccomp profile - will be applied. Valid options - are: \n Localhost - a profile - defined in a file on the - node should be used. RuntimeDefault - - the container runtime - default profile should be - used. Unconfined - no profile - should be applied." - type: string - windowsOptions: - description: The Windows specific - settings applied to all containers. - If unspecified, the options - from the PodSecurityContext - will be used. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec - is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of - the GMSA credential spec - named by the GMSACredentialSpecName - field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName - is the name of the GMSA - credential spec to use. - type: string - runAsUserName: - description: The UserName - in Windows to run the entrypoint - of the container process. - Defaults to the user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. - If set in both SecurityContext - and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: string - startupProbe: - description: 'StartupProbe indicates - that the Pod has successfully initialized. - If specified, no other probes are - executed until this completes successfully. - If this probe fails, the Pod will - be restarted, just as if the livenessProbe - failed. This can be used to provide - different probe parameters at the - beginning of a Pod''s lifecycle, - when it might take a long time to - load data or warm a cache, than - during steady-state operation. This - cannot be updated. This is a beta - feature enabled by the StartupProbe - feature flag. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + resources: + description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - stdin: - description: Whether this container - should allocate a buffer for stdin - in the container runtime. If this - is not set, reads from stdin in - the container will always result - in EOF. Default is false. - type: boolean - stdinOnce: - description: Whether the container - runtime should close the stdin channel - after it has been opened by a single - attach. When stdin is true the stdin - stream will remain open across multiple - attach sessions. If stdinOnce is - set to true, stdin is opened on - container start, is empty until - the first client attaches to stdin, - and then remains open and accepts - data until the client disconnects, - at which time stdin is closed and - remains closed until the container - is restarted. If this flag is false, - a container processes that reads - from stdin will never receive an - EOF. Default is false - type: boolean - terminationMessagePath: - description: 'Optional: Path at which - the file to which the container''s - termination message will be written - is mounted into the container''s - filesystem. Message written is intended - to be brief final status, such as - an assertion failure message. Will - be truncated by the node if greater - than 4096 bytes. The total message - length across all containers will - be limited to 12kb. Defaults to - /dev/termination-log. Cannot be - updated.' - type: string - terminationMessagePolicy: - description: Indicate how the termination - message should be populated. File - will use the contents of terminationMessagePath - to populate the container status - message on both success and failure. - FallbackToLogsOnError will use the - last chunk of container log output - if the termination message file - is empty and the container exited - with an error. The log output is - limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to - File. Cannot be updated. - type: string - tty: - description: Whether this container - should allocate a TTY for itself, - also requires 'stdin' to be true. - Default is false. - type: boolean - volumeDevices: - description: volumeDevices is the - list of block devices to be used - by the container. - type: array - items: - description: volumeDevice describes - a mapping of a raw block device - within a container. + securityContext: + description: 'Security options the pod should run with. More info: https://kubernetes.io/docs/concepts/policy/security-context/ More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' type: object - required: - - devicePath - - name properties: - devicePath: - description: devicePath is the - path inside of the container - that the device will be mapped - to. - type: string - name: - description: name must match - the name of a persistentVolumeClaim - in the pod + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. + type: object + properties: + add: + description: Added capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + drop: + description: Removed capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + privileged: + description: Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. type: string - volumeMounts: - description: Pod volumes to mount - into the container's filesystem. - Cannot be updated. - type: array - items: - description: VolumeMount describes - a mounting of a Volume within - a container. + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + 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 + seccompProfile: + description: The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. + type: object + required: + - type + properties: + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". + type: string + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: string + startupProbe: + description: 'StartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod''s lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: object - required: - - mountPath - - name properties: - mountPath: - description: Path within the - container at which the volume - should be mounted. Must not - contain ':'. - type: string - mountPropagation: - description: mountPropagation - determines how mounts are - propagated from the host to - container and the other way - around. When not set, MountPropagationNone - is used. This field is beta - in 1.10. - type: string - name: - description: This must match - the Name of a Volume. - type: string - readOnly: - description: Mounted read-only - if true, read-write otherwise - (false or unspecified). Defaults - to false. - type: boolean - subPath: - description: Path within the - volume from which the container's - volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within - the volume from which the - container's volume should - be mounted. Behaves similarly - to SubPath but environment - variable references $(VAR_NAME) - are expanded using the container's - environment. Defaults to "" - (volume's root). SubPathExpr - and SubPath are mutually exclusive. - type: string - workingDir: - description: Container's working directory. - If not specified, the container - runtime's default will be used, - which might be configured in the - container image. Cannot be updated. - type: string - dnsConfig: - description: Specifies the DNS parameters - of a pod. Parameters specified here will - be merged to the generated DNS configuration - based on DNSPolicy. - type: object - properties: - nameservers: - description: A list of DNS name server - IP addresses. This will be appended - to the base nameservers generated - from DNSPolicy. Duplicated nameservers - will be removed. - type: array - items: - type: string - options: - description: A list of DNS resolver - options. This will be merged with - the base options generated from DNSPolicy. - Duplicated entries will be removed. - Resolution options given in Options - will override those that appear in - the base DNSPolicy. - type: array - items: - description: PodDNSConfigOption defines - DNS resolver options of a pod. - type: object - properties: - name: - description: Required. - type: string - value: - type: string - searches: - description: A list of DNS search domains - for host-name lookup. This will be - appended to the base search paths - generated from DNSPolicy. Duplicated - search paths will be removed. - type: array - items: - type: string - dnsPolicy: - description: Set DNS policy for the pod. - Defaults to "ClusterFirst". Valid values - are 'ClusterFirstWithHostNet', 'ClusterFirst', - 'Default' or 'None'. DNS parameters given - in DNSConfig will be merged with the policy - selected with DNSPolicy. To have DNS options - set along with hostNetwork, you have to - specify DNS policy explicitly to 'ClusterFirstWithHostNet'. - type: string - enableServiceLinks: - description: 'EnableServiceLinks indicates - whether information about services should - be injected into pod''s environment variables, - matching the syntax of Docker links. Optional: - Defaults to true.' - type: boolean - ephemeralContainers: - description: List of ephemeral containers - run in this pod. Ephemeral containers - may be run in an existing pod to perform - user-initiated actions such as debugging. - This list cannot be specified when creating - a pod, and it cannot be modified by updating - the pod spec. In order to add an ephemeral - container to an existing pod, use the - pod's ephemeralcontainers subresource. - This field is alpha-level and is only - honored by servers that enable the EphemeralContainers - feature. - type: array - items: - description: An EphemeralContainer is - a container that may be added temporarily - to an existing pod for user-initiated - activities such as debugging. Ephemeral - containers have no resource or scheduling - guarantees, and they will not be restarted - when they exit or when a pod is removed - or restarted. If an ephemeral container - causes a pod to exceed its resource - allocation, the pod may be evicted. - Ephemeral containers may not be added - by directly updating the pod spec. They - must be added via the pod's ephemeralcontainers - subresource, and they will appear in - the pod spec once added. This is an - alpha feature enabled by the EphemeralContainers - feature flag. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + stdin: + description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false + type: boolean + terminationMessagePath: + description: 'Optional: Path at which the file to which the container''s termination message will be written is mounted into the container''s filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.' + type: string + terminationMessagePolicy: + description: Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated. + type: string + tty: + description: Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be used by the container. + type: array + items: + description: volumeDevice describes a mapping of a raw block device within a container. + type: object + required: + - devicePath + - name + properties: + devicePath: + description: devicePath is the path inside of the container that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim in the pod + type: string + volumeMounts: + description: Pod volumes to mount into the container's filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. + type: object + required: + - mountPath + - name + properties: + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. + type: string + workingDir: + description: Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated. + type: string + dnsConfig: + description: Specifies the DNS parameters of a pod. Parameters specified here will be merged to the generated DNS configuration based on DNSPolicy. type: object - required: - - name properties: - args: - description: 'Arguments to the entrypoint. - The docker image''s CMD is used - if this is not provided. Variable - references $(VAR_NAME) are expanded - using the container''s environment. - If a variable cannot be resolved, - the reference in the input string - will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless - of whether the variable exists or - not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + nameservers: + description: A list of DNS name server IP addresses. This will be appended to the base nameservers generated from DNSPolicy. Duplicated nameservers will be removed. type: array items: type: string - command: - description: 'Entrypoint array. Not - executed within a shell. The docker - image''s ENTRYPOINT is used if this - is not provided. Variable references - $(VAR_NAME) are expanded using the - container''s environment. If a variable - cannot be resolved, the reference - in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped - with a double $$, ie: $$(VAR_NAME). - Escaped references will never be - expanded, regardless of whether - the variable exists or not. Cannot - be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + options: + description: A list of DNS resolver options. This will be merged with the base options generated from DNSPolicy. Duplicated entries will be removed. Resolution options given in Options will override those that appear in the base DNSPolicy. type: array items: - type: string - env: - description: List of environment variables - to set in the container. Cannot - be updated. - type: array - items: - description: EnvVar represents an - environment variable present in - a Container. + description: PodDNSConfigOption defines DNS resolver options of a pod. type: object - required: - - name properties: name: - description: Name of the environment - variable. Must be a C_IDENTIFIER. + description: Required. type: string value: - description: 'Variable references - $(VAR_NAME) are expanded using - the previous 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. The $(VAR_NAME) - syntax can be escaped with - a double $$, ie: $$(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. + searches: + description: A list of DNS search domains for host-name lookup. This will be appended to the base search paths generated from DNSPolicy. Duplicated search paths will be removed. + type: array + items: + type: string + dnsPolicy: + description: Set DNS policy for the pod. Defaults to "ClusterFirst". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'. + type: string + enableServiceLinks: + description: 'EnableServiceLinks indicates whether information about services should be injected into pod''s environment variables, matching the syntax of Docker links. Optional: Defaults to true.' + type: boolean + ephemeralContainers: + description: List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing pod to perform user-initiated actions such as debugging. This list cannot be specified when creating a pod, and it cannot be modified by updating the pod spec. In order to add an ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource. This field is alpha-level and is only honored by servers that enable the EphemeralContainers feature. + type: array + items: + description: An EphemeralContainer is a container that may be added temporarily to an existing pod for user-initiated activities such as debugging. Ephemeral containers have no resource or scheduling guarantees, and they will not be restarted when they exit or when a pod is removed or restarted. If an ephemeral container causes a pod to exceed its resource allocation, the pod may be evicted. Ephemeral containers may not be added by directly updating the pod spec. They must be added via the pod's ephemeralcontainers subresource, and they will appear in the pod spec once added. This is an alpha feature enabled by the EphemeralContainers feature flag. + type: object + required: + - name + properties: + args: + description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + command: + description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + env: + description: List of environment variables to set in the container. Cannot be updated. + 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 previous 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. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(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 + 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 + 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 + 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 + envFrom: + description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps + type: object + properties: + configMapRef: + description: The ConfigMap to select from + type: object + properties: + 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 must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + type: object + properties: + 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 must be defined + type: boolean + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + lifecycle: + description: Lifecycle is not allowed for ephemeral containers. + type: object + properties: + postStart: + description: 'PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' type: object properties: - configMapKeyRef: - description: Selects a key - of a ConfigMap. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - key + - port properties: - key: - description: The key - to select. + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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?' + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - optional: - description: Specify - whether the ConfigMap - or its key must be - defined - type: boolean - 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.' + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - fieldPath + - port properties: - apiVersion: - description: Version - of the schema the - FieldPath is written - in terms of, defaults - to "v1". + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - fieldPath: - description: Path of - the field to select - in the specified API - version. - type: string - 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.' + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + preStop: + description: 'PreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod''s termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod''s termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - resource + - port properties: - containerName: - description: 'Container - name: required for - volumes, optional - for env vars' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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]+))))?$ + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - resource: - description: 'Required: - resource to select' + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - secretKeyRef: - description: Selects a key - of a secret in the pod's - namespace + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - key + - port properties: - key: - description: The key - of the secret to select - from. Must be a valid - secret key. + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' 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 - envFrom: - description: List of sources to populate - environment variables in the container. - The keys defined within a source - must be a C_IDENTIFIER. All invalid - keys will be reported as an event - when the container is starting. - When a key exists in multiple sources, - the value associated with the last - source will take precedence. Values - defined by an Env with a duplicate - key will take precedence. Cannot - be updated. - type: array - items: - description: EnvFromSource represents - the source of a set of ConfigMaps + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + livenessProbe: + description: Probes are not allowed for ephemeral containers. type: object properties: - configMapRef: - description: The ConfigMap to - select from + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. type: object properties: - 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 must be - defined - type: boolean - prefix: - description: An optional identifier - to prepend to each key in - the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select - from + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. type: object + required: + - port properties: - 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?' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - optional: - description: Specify whether - the Secret must be defined - type: boolean - image: - description: 'Docker image name. More - info: https://kubernetes.io/docs/concepts/containers/images' - type: string - imagePullPolicy: - description: 'Image pull policy. One - of Always, Never, IfNotPresent. - Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - lifecycle: - description: Lifecycle is not allowed - for ephemeral containers. - type: object - properties: - postStart: - description: 'PostStart is called - immediately after a container - is created. If the handler fails, - the container is terminated - and restarted according to its - restart policy. Other management - of the container blocks until - the hook completes. More info: - https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - preStop: - description: 'PreStop is called - immediately before a container - is terminated due to an API - request or management event - such as liveness/startup probe - failure, preemption, resource - contention, etc. The handler - is not called if the container - crashes or exits. The reason - for termination is passed to - the handler. The Pod''s termination - grace period countdown begins - before the PreStop hooked is - executed. Regardless of the - outcome of the handler, the - container will eventually terminate - within the Pod''s termination - grace period. Other management - of the container blocks until - the hook completes or until - the termination grace period - is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: - name - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: - type: integer - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - livenessProbe: - description: Probes are not allowed - for ephemeral containers. - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + name: + description: Name of the ephemeral container specified as a DNS_LABEL. This name must be unique among all containers, init containers and ephemeral containers. + type: string + ports: + description: Ports are not allowed for ephemeral containers. + type: array + items: + description: ContainerPort represents a network port in a single container. type: object required: - - port + - containerPort properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' + containerPort: + description: Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536. + type: integer + format: int32 + hostIP: + description: What host IP to bind the external port to. type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - name: - description: Name of the ephemeral - container specified as a DNS_LABEL. - This name must be unique among all - containers, init containers and - ephemeral containers. - type: string - ports: - description: Ports are not allowed - for ephemeral containers. - type: array - items: - description: ContainerPort represents - a network port in a single container. + hostPort: + description: Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this. + type: integer + format: int32 + name: + description: If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services. + type: string + protocol: + description: Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP". + type: string + default: TCP + readinessProbe: + description: Probes are not allowed for ephemeral containers. type: object - required: - - containerPort properties: - containerPort: - description: Number of port - to expose on the pod's IP - address. This must be a valid - port number, 0 < x < 65536. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. type: integer format: int32 - hostIP: - description: What host IP to - bind the external port to. - type: string - hostPort: - description: Number of port - to expose on the host. If - specified, this must be a - valid port number, 0 < x < - 65536. If HostNetwork is specified, - this must match ContainerPort. - Most containers do not need - this. + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: integer format: int32 - name: - description: If specified, this - must be an IANA_SVC_NAME and - unique within the pod. Each - named port in a pod must have - a unique name. Name for the - port that can be referred - to by services. - type: string - protocol: - description: Protocol for port. - Must be UDP, TCP, or SCTP. - Defaults to "TCP". - type: string - readinessProbe: - description: Probes are not allowed - for ephemeral containers. - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + resources: + description: Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources already allocated to the pod. + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - resources: - description: Resources are not allowed - for ephemeral containers. Ephemeral - containers use spare resources already - allocated to the pod. - type: object - properties: - limits: - description: 'Limits describes - the maximum amount of compute - resources allowed. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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 - securityContext: - description: SecurityContext is not - allowed for ephemeral containers. - type: object - properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation - controls whether a process can - gain more privileges than its - parent process. This bool directly - controls if the no_new_privs - flag will be set on the container - process. AllowPrivilegeEscalation - is true always when the container - is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' - type: boolean - capabilities: - description: The capabilities - to add/drop when running containers. - Defaults to the default set - of capabilities granted by the - container runtime. - type: object - properties: - add: - description: Added capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + securityContext: + description: SecurityContext is not allowed for ephemeral containers. + type: object + properties: + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. + type: object + properties: + add: + description: Added capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + drop: + description: Removed capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + privileged: + description: Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. + type: string + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + level: + description: Level is SELinux level label that applies to the container. type: string - drop: - description: Removed capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + role: + description: Role is a SELinux role label that applies to the container. type: string - privileged: - description: Run container in - privileged mode. Processes in - privileged containers are essentially - equivalent to root on the host. - Defaults to false. - type: boolean - procMount: - description: procMount denotes - the type of proc mount to use - for the containers. The default - is DefaultProcMount which uses - the container runtime defaults - for readonly paths and masked - paths. This requires the ProcMountType - feature flag to be enabled. - type: string - readOnlyRootFilesystem: - description: Whether this container - has a read-only root filesystem. - Default is false. - type: boolean - runAsGroup: - description: The GID to run the - entrypoint of the container - process. Uses runtime default - if unset. May also be set in - PodSecurityContext. If set - in both SecurityContext and - PodSecurityContext, the value - specified in SecurityContext - takes precedence. - type: integer - format: int64 - runAsNonRoot: - description: Indicates that the - container must run as a non-root - user. If true, the Kubelet will - validate the image at runtime - to ensure that it does not run - as UID 0 (root) and fail to - start the container if it does. - If unset or false, no such validation - will be performed. May also - be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: boolean - runAsUser: - description: The UID to run the - entrypoint of the container - process. Defaults to user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: integer - format: int64 - seLinuxOptions: - description: The SELinux context - to be applied to the container. - If unspecified, the container - runtime will allocate a random - SELinux context for each container. May - also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. + 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 + seccompProfile: + description: The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. + type: object + required: + - type + properties: + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". + type: string + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: string + startupProbe: + description: Probes are not allowed for ephemeral containers. + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + stdin: + description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false + type: boolean + targetContainerName: + description: If set, the name of the container from PodSpec that this ephemeral container targets. The ephemeral container will be run in the namespaces (IPC, PID, etc) of this container. If not set then the ephemeral container is run in whatever namespaces are shared for the pod. Note that the container runtime must support this feature. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to which the container''s termination message will be written is mounted into the container''s filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.' + type: string + terminationMessagePolicy: + description: Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated. + type: string + tty: + description: Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be used by the container. + type: array + items: + description: volumeDevice describes a mapping of a raw block device within a container. type: object + required: + - devicePath + - name 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. + devicePath: + description: devicePath is the path inside of the container that the device will be mapped to. 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. + name: + description: name must match the name of a persistentVolumeClaim in the pod type: string - seccompProfile: - description: The seccomp options - to use by this container. If - seccomp options are provided - at both the pod & container - level, the container options - override the pod options. + volumeMounts: + description: Pod volumes to mount into the container's filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. type: object required: - - type + - mountPath + - name properties: - localhostProfile: - description: localhostProfile - indicates a profile defined - in a file on the node should - be used. The profile must - be preconfigured on the - node to work. Must be a - descending path, relative - to the kubelet's configured - seccomp profile location. - Must only be set if type - is "Localhost". + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. type: string - type: - description: "type indicates - which kind of seccomp profile - will be applied. Valid options - are: \n Localhost - a profile - defined in a file on the - node should be used. RuntimeDefault - - the container runtime - default profile should be - used. Unconfined - no profile - should be applied." + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. type: string - windowsOptions: - description: The Windows specific - settings applied to all containers. - If unspecified, the options - from the PodSecurityContext - will be used. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec - is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of - the GMSA credential spec - named by the GMSACredentialSpecName - field. + name: + description: This must match the Name of a Volume. type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName - is the name of the GMSA - credential spec to use. + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). type: string - runAsUserName: - description: The UserName - in Windows to run the entrypoint - of the container process. - Defaults to the user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. - If set in both SecurityContext - and PodSecurityContext, - the value specified in SecurityContext - takes precedence. + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. type: string - startupProbe: - description: Probes are not allowed - for ephemeral containers. - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: - type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. + workingDir: + description: Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated. + type: string + hostAliases: + description: HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts file if specified. This is only valid for non-hostNetwork pods. + type: array + items: + description: HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the pod's hosts file. + type: object + properties: + hostnames: + description: Hostnames for the above IP address. + type: array + items: + type: string + ip: + description: IP address of the host file entry. + type: string + hostIPC: + description: 'Use the host''s ipc namespace. Optional: Default to false.' + type: boolean + hostNetwork: + description: Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false. + type: boolean + hostPID: + description: 'Use the host''s pid namespace. Optional: Default to false.' + type: boolean + hostname: + description: Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. + type: string + imagePullSecrets: + description: 'ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. For example, in the case of docker, only DockerConfig type secrets are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod' + type: array + items: + description: LocalObjectReference contains enough information to let you locate the referenced object inside the same namespace. + type: object + properties: + 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 + initContainers: + description: 'List of initialization containers belonging to the pod. Init containers are executed in order prior to containers being started. If any init container fails, the pod is considered to have failed and is handled according to its restartPolicy. The name for an init container or normal container must be unique among all containers. Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes. The resourceRequirements of an init container are taken into account during scheduling by finding the highest request/limit for each resource type, and then using the max of of that value or the sum of the normal containers. Limits are applied to init containers in a similar fashion. Init containers cannot currently be added or removed. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/' + type: array + items: + description: A single application container that you want to run within a pod. + type: object + required: + - name + properties: + args: + description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + command: + description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + env: + description: List of environment variables to set in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable present in a Container. type: object required: - - port + - name properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. + value: + description: 'Variable references $(VAR_NAME) are expanded using the previous 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. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".' type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' + 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 + 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 + 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 + 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 + envFrom: + description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps type: object - required: - - port properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' + configMapRef: + description: The ConfigMap to select from + type: object + properties: + 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 must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - stdin: - description: Whether this container - should allocate a buffer for stdin - in the container runtime. If this - is not set, reads from stdin in - the container will always result - in EOF. Default is false. - type: boolean - stdinOnce: - description: Whether the container - runtime should close the stdin channel - after it has been opened by a single - attach. When stdin is true the stdin - stream will remain open across multiple - attach sessions. If stdinOnce is - set to true, stdin is opened on - container start, is empty until - the first client attaches to stdin, - and then remains open and accepts - data until the client disconnects, - at which time stdin is closed and - remains closed until the container - is restarted. If this flag is false, - a container processes that reads - from stdin will never receive an - EOF. Default is false - type: boolean - targetContainerName: - description: If set, the name of the - container from PodSpec that this - ephemeral container targets. The - ephemeral container will be run - in the namespaces (IPC, PID, etc) - of this container. If not set then - the ephemeral container is run in - whatever namespaces are shared for - the pod. Note that the container - runtime must support this feature. - type: string - terminationMessagePath: - description: 'Optional: Path at which - the file to which the container''s - termination message will be written - is mounted into the container''s - filesystem. Message written is intended - to be brief final status, such as - an assertion failure message. Will - be truncated by the node if greater - than 4096 bytes. The total message - length across all containers will - be limited to 12kb. Defaults to - /dev/termination-log. Cannot be - updated.' - type: string - terminationMessagePolicy: - description: Indicate how the termination - message should be populated. File - will use the contents of terminationMessagePath - to populate the container status - message on both success and failure. - FallbackToLogsOnError will use the - last chunk of container log output - if the termination message file - is empty and the container exited - with an error. The log output is - limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to - File. Cannot be updated. - type: string - tty: - description: Whether this container - should allocate a TTY for itself, - also requires 'stdin' to be true. - Default is false. - type: boolean - volumeDevices: - description: volumeDevices is the - list of block devices to be used - by the container. - type: array - items: - description: volumeDevice describes - a mapping of a raw block device - within a container. - type: object - required: - - devicePath - - name - properties: - devicePath: - description: devicePath is the - path inside of the container - that the device will be mapped - to. - type: string - name: - description: name must match - the name of a persistentVolumeClaim - in the pod - type: string - volumeMounts: - description: Pod volumes to mount - into the container's filesystem. - Cannot be updated. - type: array - items: - description: VolumeMount describes - a mounting of a Volume within - a container. - type: object - required: - - mountPath - - name - properties: - mountPath: - description: Path within the - container at which the volume - should be mounted. Must not - contain ':'. - type: string - mountPropagation: - description: mountPropagation - determines how mounts are - propagated from the host to - container and the other way - around. When not set, MountPropagationNone - is used. This field is beta - in 1.10. - type: string - name: - description: This must match - the Name of a Volume. - type: string - readOnly: - description: Mounted read-only - if true, read-write otherwise - (false or unspecified). Defaults - to false. - type: boolean - subPath: - description: Path within the - volume from which the container's - volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within - the volume from which the - container's volume should - be mounted. Behaves similarly - to SubPath but environment - variable references $(VAR_NAME) - are expanded using the container's - environment. Defaults to "" - (volume's root). SubPathExpr - and SubPath are mutually exclusive. - type: string - workingDir: - description: Container's working directory. - If not specified, the container - runtime's default will be used, - which might be configured in the - container image. Cannot be updated. - type: string - hostAliases: - description: HostAliases is an optional - list of hosts and IPs that will be injected - into the pod's hosts file if specified. - This is only valid for non-hostNetwork - pods. - type: array - items: - description: HostAlias holds the mapping - between IP and hostnames that will be - injected as an entry in the pod's hosts - file. - type: object - properties: - hostnames: - description: Hostnames for the above - IP address. - type: array - items: - type: string - ip: - description: IP address of the host - file entry. - type: string - hostIPC: - description: 'Use the host''s ipc namespace. - Optional: Default to false.' - type: boolean - hostNetwork: - description: Host networking requested for - this pod. Use the host's network namespace. - If this option is set, the ports that - will be used must be specified. Default - to false. - type: boolean - hostPID: - description: 'Use the host''s pid namespace. - Optional: Default to false.' - type: boolean - hostname: - description: Specifies the hostname of the - Pod If not specified, the pod's hostname - will be set to a system-defined value. - type: string - imagePullSecrets: - description: 'ImagePullSecrets is an optional - list of references to secrets in the same - namespace to use for pulling any of the - images used by this PodSpec. If specified, - these secrets will be passed to individual - puller implementations for them to use. - For example, in the case of docker, only - DockerConfig type secrets are honored. - More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod' - type: array - items: - description: LocalObjectReference contains - enough information to let you locate - the referenced object inside the same - namespace. - type: object - properties: - 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 - initContainers: - description: 'List of initialization containers - belonging to the pod. Init containers - are executed in order prior to containers - being started. If any init container fails, - the pod is considered to have failed and - is handled according to its restartPolicy. - The name for an init container or normal - container must be unique among all containers. - Init containers may not have Lifecycle - actions, Readiness probes, Liveness probes, - or Startup probes. The resourceRequirements - of an init container are taken into account - during scheduling by finding the highest - request/limit for each resource type, - and then using the max of of that value - or the sum of the normal containers. Limits - are applied to init containers in a similar - fashion. Init containers cannot currently - be added or removed. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/' - type: array - items: - description: A single application container - that you want to run within a pod. - type: object - required: - - name - properties: - args: - description: 'Arguments to the entrypoint. - The docker image''s CMD is used - if this is not provided. Variable - references $(VAR_NAME) are expanded - using the container''s environment. - If a variable cannot be resolved, - the reference in the input string - will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless - of whether the variable exists or - not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + secretRef: + description: The Secret to select from + type: object + properties: + 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 must be defined + type: boolean + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.' type: string - command: - description: 'Entrypoint array. Not - executed within a shell. The docker - image''s ENTRYPOINT is used if this - is not provided. Variable references - $(VAR_NAME) are expanded using the - container''s environment. If a variable - cannot be resolved, the reference - in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped - with a double $$, ie: $$(VAR_NAME). - Escaped references will never be - expanded, regardless of whether - the variable exists or not. Cannot - be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string - env: - description: List of environment variables - to set in the container. Cannot - be updated. - type: array - items: - description: EnvVar represents an - environment variable present in - a Container. + lifecycle: + description: Actions that the management system should take in response to container lifecycle events. Cannot be updated. 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 previous 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. The $(VAR_NAME) - syntax can be escaped with - a double $$, ie: $$(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. + postStart: + description: 'PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' type: object properties: - configMapKeyRef: - description: Selects a key - of a ConfigMap. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - key + - port properties: - key: - description: The key - to select. + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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?' + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - optional: - description: Specify - whether the ConfigMap - or its key must be - defined - type: boolean - 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.' + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - fieldPath + - port 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. + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - 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.' + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + preStop: + description: 'PreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod''s termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod''s termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - resource + - port properties: - containerName: - description: 'Container - name: required for - volumes, optional - for env vars' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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]+))))?$ + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - resource: - description: 'Required: - resource to select' + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - secretKeyRef: - description: Selects a key - of a secret in the pod's - namespace + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - key + - port 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?' + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - optional: - description: Specify - whether the Secret - or its key must be - defined - type: boolean - envFrom: - description: List of sources to populate - environment variables in the container. - The keys defined within a source - must be a C_IDENTIFIER. All invalid - keys will be reported as an event - when the container is starting. - When a key exists in multiple sources, - the value associated with the last - source will take precedence. Values - defined by an Env with a duplicate - key will take precedence. Cannot - be updated. - type: array - items: - description: EnvFromSource represents - the source of a set of ConfigMaps + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + livenessProbe: + description: 'Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: object properties: - configMapRef: - description: The ConfigMap to - select from + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. type: object properties: - 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 must be - defined - type: boolean - prefix: - description: An optional identifier - to prepend to each key in - the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select - from + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. type: object + required: + - port properties: - 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?' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - optional: - description: Specify whether - the Secret must be defined - type: boolean - image: - description: 'Docker image name. More - info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow - higher level config management to - default or override container images - in workload controllers like Deployments - and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One - of Always, Never, IfNotPresent. - Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - lifecycle: - description: Actions that the management - system should take in response to - container lifecycle events. Cannot - be updated. - type: object - properties: - postStart: - description: 'PostStart is called - immediately after a container - is created. If the handler fails, - the container is terminated - and restarted according to its - restart policy. Other management - of the container blocks until - the hook completes. More info: - https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - preStop: - description: 'PreStop is called - immediately before a container - is terminated due to an API - request or management event - such as liveness/startup probe - failure, preemption, resource - contention, etc. The handler - is not called if the container - crashes or exits. The reason - for termination is passed to - the handler. The Pod''s termination - grace period countdown begins - before the PreStop hooked is - executed. Regardless of the - outcome of the handler, the - container will eventually terminate - within the Pod''s termination - grace period. Other management - of the container blocks until - the hook completes or until - the termination grace period - is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: - name - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: - type: integer - type: string - x-kubernetes-int-or-string: true - livenessProbe: - description: 'Periodic probe of container - liveness. Container will be restarted - if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - name: - description: Name of the container - specified as a DNS_LABEL. Each container - in a pod must have a unique name - (DNS_LABEL). Cannot be updated. - type: string - ports: - description: List of ports to expose - from the container. Exposing a port - here gives the system additional - information about the network connections - a container uses, but is primarily - informational. Not specifying a - port here DOES NOT prevent that - port from being exposed. Any port - which is listening on the default - "0.0.0.0" address inside a container - will be accessible from the network. - Cannot be updated. - type: array - items: - description: ContainerPort represents - a network port in a single container. - type: object - required: - - containerPort - properties: - containerPort: - description: Number of port - to expose on the pod's IP - address. This must be a valid - port number, 0 < x < 65536. + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. type: integer format: int32 - hostIP: - description: What host IP to - bind the external port to. - type: string - hostPort: - description: Number of port - to expose on the host. If - specified, this must be a - valid port number, 0 < x < - 65536. If HostNetwork is specified, - this must match ContainerPort. - Most containers do not need - this. + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. type: integer format: int32 - name: - description: If specified, this - must be an IANA_SVC_NAME and - unique within the pod. Each - named port in a pod must have - a unique name. Name for the - port that can be referred - to by services. - type: string - protocol: - description: Protocol for port. - Must be UDP, TCP, or SCTP. - Defaults to "TCP". - type: string - default: TCP - x-kubernetes-list-map-keys: - - containerPort - - protocol - x-kubernetes-list-type: map - readinessProbe: - description: 'Periodic probe of container - service readiness. Container will - be removed from service endpoints - if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + name: + description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated. + type: string + ports: + description: List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network port in a single container. type: object required: - - port + - containerPort properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. + containerPort: + description: Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536. + type: integer + format: int32 + hostIP: + description: What host IP to bind the external port to. type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. + hostPort: + description: Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this. + type: integer + format: int32 + name: + description: If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services. type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' + protocol: + description: Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP". type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - resources: - description: 'Compute Resources required - by this container. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - properties: - limits: - description: 'Limits describes - the maximum amount of compute - resources allowed. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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 - securityContext: - description: 'Security options the - pod should run with. More info: - https://kubernetes.io/docs/concepts/policy/security-context/ - More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' - type: object - properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation - controls whether a process can - gain more privileges than its - parent process. This bool directly - controls if the no_new_privs - flag will be set on the container - process. AllowPrivilegeEscalation - is true always when the container - is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' - type: boolean - capabilities: - description: The capabilities - to add/drop when running containers. - Defaults to the default set - of capabilities granted by the - container runtime. - type: object - properties: - add: - description: Added capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + default: TCP + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + description: 'Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - drop: - description: Removed capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. type: string - privileged: - description: Run container in - privileged mode. Processes in - privileged containers are essentially - equivalent to root on the host. - Defaults to false. - type: boolean - procMount: - description: procMount denotes - the type of proc mount to use - for the containers. The default - is DefaultProcMount which uses - the container runtime defaults - for readonly paths and masked - paths. This requires the ProcMountType - feature flag to be enabled. - type: string - readOnlyRootFilesystem: - description: Whether this container - has a read-only root filesystem. - Default is false. - type: boolean - runAsGroup: - description: The GID to run the - entrypoint of the container - process. Uses runtime default - if unset. May also be set in - PodSecurityContext. If set - in both SecurityContext and - PodSecurityContext, the value - specified in SecurityContext - takes precedence. - type: integer - format: int64 - runAsNonRoot: - description: Indicates that the - container must run as a non-root - user. If true, the Kubelet will - validate the image at runtime - to ensure that it does not run - as UID 0 (root) and fail to - start the container if it does. - If unset or false, no such validation - will be performed. May also - be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: boolean - runAsUser: - description: The UID to run the - entrypoint of the container - process. Defaults to user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: integer - format: int64 - seLinuxOptions: - description: The SELinux context - to be applied to the container. - If unspecified, the container - runtime will allocate a random - SELinux context for each container. May - also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - 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 - seccompProfile: - description: The seccomp options - to use by this container. If - seccomp options are provided - at both the pod & container - level, the container options - override the pod options. - type: object - required: - - type - properties: - localhostProfile: - description: localhostProfile - indicates a profile defined - in a file on the node should - be used. The profile must - be preconfigured on the - node to work. Must be a - descending path, relative - to the kubelet's configured - seccomp profile location. - Must only be set if type - is "Localhost". - type: string - type: - description: "type indicates - which kind of seccomp profile - will be applied. Valid options - are: \n Localhost - a profile - defined in a file on the - node should be used. RuntimeDefault - - the container runtime - default profile should be - used. Unconfined - no profile - should be applied." - type: string - windowsOptions: - description: The Windows specific - settings applied to all containers. - If unspecified, the options - from the PodSecurityContext - will be used. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec - is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of - the GMSA credential spec - named by the GMSACredentialSpecName - field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName - is the name of the GMSA - credential spec to use. - type: string - runAsUserName: - description: The UserName - in Windows to run the entrypoint - of the container process. - Defaults to the user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. - If set in both SecurityContext - and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: string - startupProbe: - description: 'StartupProbe indicates - that the Pod has successfully initialized. - If specified, no other probes are - executed until this completes successfully. - If this probe fails, the Pod will - be restarted, just as if the livenessProbe - failed. This can be used to provide - different probe parameters at the - beginning of a Pod''s lifecycle, - when it might take a long time to - load data or warm a cache, than - during steady-state operation. This - cannot be updated. This is a beta - feature enabled by the StartupProbe - feature flag. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + resources: + description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - stdin: - description: Whether this container - should allocate a buffer for stdin - in the container runtime. If this - is not set, reads from stdin in - the container will always result - in EOF. Default is false. - type: boolean - stdinOnce: - description: Whether the container - runtime should close the stdin channel - after it has been opened by a single - attach. When stdin is true the stdin - stream will remain open across multiple - attach sessions. If stdinOnce is - set to true, stdin is opened on - container start, is empty until - the first client attaches to stdin, - and then remains open and accepts - data until the client disconnects, - at which time stdin is closed and - remains closed until the container - is restarted. If this flag is false, - a container processes that reads - from stdin will never receive an - EOF. Default is false - type: boolean - terminationMessagePath: - description: 'Optional: Path at which - the file to which the container''s - termination message will be written - is mounted into the container''s - filesystem. Message written is intended - to be brief final status, such as - an assertion failure message. Will - be truncated by the node if greater - than 4096 bytes. The total message - length across all containers will - be limited to 12kb. Defaults to - /dev/termination-log. Cannot be - updated.' - type: string - terminationMessagePolicy: - description: Indicate how the termination - message should be populated. File - will use the contents of terminationMessagePath - to populate the container status - message on both success and failure. - FallbackToLogsOnError will use the - last chunk of container log output - if the termination message file - is empty and the container exited - with an error. The log output is - limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to - File. Cannot be updated. - type: string - tty: - description: Whether this container - should allocate a TTY for itself, - also requires 'stdin' to be true. - Default is false. - type: boolean - volumeDevices: - description: volumeDevices is the - list of block devices to be used - by the container. - type: array - items: - description: volumeDevice describes - a mapping of a raw block device - within a container. + securityContext: + description: 'Security options the pod should run with. More info: https://kubernetes.io/docs/concepts/policy/security-context/ More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' type: object - required: - - devicePath - - name properties: - devicePath: - description: devicePath is the - path inside of the container - that the device will be mapped - to. - type: string - name: - description: name must match - the name of a persistentVolumeClaim - in the pod + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. + type: object + properties: + add: + description: Added capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + drop: + description: Removed capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + privileged: + description: Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. type: string - volumeMounts: - description: Pod volumes to mount - into the container's filesystem. - Cannot be updated. - type: array - items: - description: VolumeMount describes - a mounting of a Volume within - a container. + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + 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 + seccompProfile: + description: The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. + type: object + required: + - type + properties: + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". + type: string + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: string + startupProbe: + description: 'StartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod''s lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: object - required: - - mountPath - - name properties: - mountPath: - description: Path within the - container at which the volume - should be mounted. Must not - contain ':'. - type: string - mountPropagation: - description: mountPropagation - determines how mounts are - propagated from the host to - container and the other way - around. When not set, MountPropagationNone - is used. This field is beta - in 1.10. - type: string - name: - description: This must match - the Name of a Volume. - type: string - readOnly: - description: Mounted read-only - if true, read-write otherwise - (false or unspecified). Defaults - to false. - type: boolean - subPath: - description: Path within the - volume from which the container's - volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within - the volume from which the - container's volume should - be mounted. Behaves similarly - to SubPath but environment - variable references $(VAR_NAME) - are expanded using the container's - environment. Defaults to "" - (volume's root). SubPathExpr - and SubPath are mutually exclusive. - type: string - workingDir: - description: Container's working directory. - If not specified, the container - runtime's default will be used, - which might be configured in the - container image. Cannot be updated. - type: string - nodeName: - description: NodeName is a request to schedule - this pod onto a specific node. If it is - non-empty, the scheduler simply schedules - this pod onto that node, assuming that - it fits resource requirements. - type: string - nodeSelector: - description: 'NodeSelector is a selector - which must be true for the pod to fit - on a node. Selector which must match a - node''s labels for the pod to be scheduled - on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - overhead: - description: 'Overhead represents the resource - overhead associated with running a pod - for a given RuntimeClass. This field will - be autopopulated at admission time by - the RuntimeClass admission controller. - If the RuntimeClass admission controller - is enabled, overhead must not be set in - Pod create requests. The RuntimeClass - admission controller will reject Pod create - requests which have the overhead already - set. If RuntimeClass is configured and - selected in the PodSpec, Overhead will - be set to the value defined in the corresponding - RuntimeClass, otherwise it will remain - unset and treated as zero. More info: - https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md - This field is alpha-level as of Kubernetes - v1.16, and is only honored by servers - that enable the PodOverhead feature.' - 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 - preemptionPolicy: - description: PreemptionPolicy is the Policy - for preempting pods with lower priority. - One of Never, PreemptLowerPriority. Defaults - to PreemptLowerPriority if unset. This - field is beta-level, gated by the NonPreemptingPriority - feature-gate. - type: string - priority: - description: The priority value. Various - system components use this field to find - the priority of the pod. When Priority - Admission Controller is enabled, it prevents - users from setting this field. The admission - controller populates this field from PriorityClassName. - The higher the value, the higher the priority. - type: integer - format: int32 - priorityClassName: - description: If specified, indicates the - pod's priority. "system-node-critical" - and "system-cluster-critical" are two - special keywords which indicate the highest - priorities with the former being the highest - priority. Any other name must be defined - by creating a PriorityClass object with - that name. If not specified, the pod priority - will be default or zero if there is no - default. - type: string - readinessGates: - description: 'If specified, all readiness - gates will be evaluated for pod readiness. - A pod is ready when all its containers - are ready AND all conditions specified - in the readiness gates have status equal - to "True" More info: https://git.k8s.io/enhancements/keps/sig-network/0007-pod-ready%2B%2B.md' - type: array - items: - description: PodReadinessGate contains - the reference to a pod condition - type: object - required: - - conditionType - properties: - conditionType: - description: ConditionType refers - to a condition in the pod's condition - list with matching type. - type: string - restartPolicy: - description: 'Restart policy for all containers - within the pod. One of Always, OnFailure, - Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' - type: string - runtimeClassName: - description: 'RuntimeClassName refers to - a RuntimeClass object in the node.k8s.io - group, which should be used to run this - pod. If no RuntimeClass resource matches - the named class, the pod will not be run. - If unset or empty, the "legacy" RuntimeClass - will be used, which is an implicit class - with an empty definition that uses the - default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md - This is a beta feature as of Kubernetes - v1.14.' - type: string - schedulerName: - description: If specified, the pod will - be dispatched by specified scheduler. - If not specified, the pod will be dispatched - by default scheduler. - type: string - securityContext: - description: 'SecurityContext holds pod-level - security attributes and common container - settings. Optional: Defaults to empty. See - type description for default values of - each field.' - type: object - properties: - fsGroup: - description: "A special supplemental - group that applies to all containers - in a pod. Some volume types allow - the Kubelet to change the ownership - of that volume to be owned by the - pod: \n 1. The owning GID will be - the FSGroup 2. The setgid bit is set - (new files created in the volume will - be owned by FSGroup) 3. The permission - bits are OR'd with rw-rw---- \n If - unset, the Kubelet will not modify - the ownership and permissions of any - volume." - type: integer - format: int64 - fsGroupChangePolicy: - description: 'fsGroupChangePolicy defines - behavior of changing ownership and - permission of the volume before being - exposed inside Pod. This field will - only apply to volume types which support - fsGroup based ownership(and permissions). - It will have no effect on ephemeral - volume types such as: secret, configmaps - and emptydir. Valid values are "OnRootMismatch" - and "Always". If not specified defaults - to "Always".' - type: string - runAsGroup: - description: The GID to run the entrypoint - of the container process. Uses runtime - default if unset. May also be set - in SecurityContext. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence for that container. - type: integer - format: int64 - runAsNonRoot: - description: Indicates that the container - must run as a non-root user. If true, - the Kubelet will validate the image - at runtime to ensure that it does - not run as UID 0 (root) and fail to - start the container if it does. If - unset or false, no such validation - will be performed. May also be set - in SecurityContext. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: boolean - runAsUser: - description: The UID to run the entrypoint - of the container process. Defaults - to user specified in image metadata - if unspecified. May also be set in - SecurityContext. If set in both SecurityContext - and PodSecurityContext, the value - specified in SecurityContext takes - precedence for that container. - type: integer - format: int64 - seLinuxOptions: - description: The SELinux context to - be applied to all containers. If unspecified, - the container runtime will allocate - a random SELinux context for each - container. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence for that container. - 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. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + stdin: + description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false + type: boolean + terminationMessagePath: + description: 'Optional: Path at which the file to which the container''s termination message will be written is mounted into the container''s filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.' type: string - type: - description: Type is a SELinux type - label that applies to the container. + terminationMessagePolicy: + description: Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated. type: string - user: - description: User is a SELinux user - label that applies to the container. + tty: + description: Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be used by the container. + type: array + items: + description: volumeDevice describes a mapping of a raw block device within a container. + type: object + required: + - devicePath + - name + properties: + devicePath: + description: devicePath is the path inside of the container that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim in the pod + type: string + volumeMounts: + description: Pod volumes to mount into the container's filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. + type: object + required: + - mountPath + - name + properties: + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. + type: string + workingDir: + description: Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated. type: string - seccompProfile: - description: The seccomp options to - use by the containers in this pod. + nodeName: + description: NodeName is a request to schedule this pod onto a specific node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits resource requirements. + type: string + nodeSelector: + description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' + type: object + additionalProperties: + type: string + overhead: + description: 'Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. This field will be autopopulated at admission time by the RuntimeClass admission controller. If the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests. The RuntimeClass admission controller will reject Pod create requests which have the overhead already set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero. More info: https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md This field is alpha-level as of Kubernetes v1.16, and is only honored by servers that enable the PodOverhead feature.' + 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 + preemptionPolicy: + description: PreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is beta-level, gated by the NonPreemptingPriority feature-gate. + type: string + priority: + description: The priority value. Various system components use this field to find the priority of the pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. + type: integer + format: int32 + priorityClassName: + description: If specified, indicates the pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default. + type: string + readinessGates: + description: 'If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to "True" More info: https://git.k8s.io/enhancements/keps/sig-network/0007-pod-ready%2B%2B.md' + type: array + items: + description: PodReadinessGate contains the reference to a pod condition type: object required: - - type - properties: - localhostProfile: - description: localhostProfile indicates - a profile defined in a file on - the node should be used. The profile - must be preconfigured on the node - to work. Must be a descending - path, relative to the kubelet's - configured seccomp profile location. - Must only be set if type is "Localhost". - type: string - type: - description: "type indicates which - kind of seccomp profile will be - applied. Valid options are: \n - Localhost - a profile defined - in a file on the node should be - used. RuntimeDefault - the container - runtime default profile should - be used. Unconfined - no profile - should be applied." - type: string - supplementalGroups: - description: A list of groups applied - to the first process run in each container, - in addition to the container's primary - GID. If unspecified, no groups will - be added to any container. - type: array - items: - type: integer - format: int64 - sysctls: - description: Sysctls hold a list of - namespaced sysctls used for the pod. - Pods with unsupported sysctls (by - the container runtime) might fail - to launch. - type: array - items: - description: Sysctl defines a kernel - parameter to be set - type: object - required: - - name - - value - properties: - name: - description: Name of a property - to set - type: string - value: - description: Value of a property - to set - type: string - windowsOptions: - description: The Windows specific settings - applied to all containers. If unspecified, - the options within a container's SecurityContext - will be used. If set in both SecurityContext - and PodSecurityContext, the value - specified in SecurityContext takes - precedence. - type: object + - conditionType properties: - gmsaCredentialSpec: - description: GMSACredentialSpec - is where the GMSA admission webhook - (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA - credential spec named by the GMSACredentialSpecName - field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName - is the name of the GMSA credential - spec to use. - type: string - runAsUserName: - description: The UserName in Windows - to run the entrypoint of the container - process. Defaults to the user - specified in image metadata if - unspecified. May also be set in - PodSecurityContext. If set in - both SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. + conditionType: + description: ConditionType refers to a condition in the pod's condition list with matching type. type: string - serviceAccount: - description: 'DeprecatedServiceAccount is - a depreciated alias for ServiceAccountName. - Deprecated: Use serviceAccountName instead.' - type: string - serviceAccountName: - description: 'ServiceAccountName is the - name of the ServiceAccount to use to run - this pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/' - type: string - setHostnameAsFQDN: - description: If true the pod's hostname - will be configured as the pod's FQDN, - rather than the leaf name (the default). - In Linux containers, this means setting - the FQDN in the hostname field of the - kernel (the nodename field of struct utsname). - In Windows containers, this means setting - the registry value of hostname for the - registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters - to FQDN. If a pod does not have FQDN, - this has no effect. Default to false. - type: boolean - shareProcessNamespace: - description: 'Share a single process namespace - between all of the containers in a pod. - When this is set containers will be able - to view and signal processes from other - containers in the same pod, and the first - process in each container will not be - assigned PID 1. HostPID and ShareProcessNamespace - cannot both be set. Optional: Default - to false.' - type: boolean - subdomain: - description: If specified, the fully qualified - Pod hostname will be "...svc.". If not - specified, the pod will not have a domainname - at all. - type: string - terminationGracePeriodSeconds: - description: Optional duration in seconds - the pod needs to terminate gracefully. - May be decreased in delete request. Value - must be non-negative integer. The value - zero indicates delete immediately. If - this value is nil, the default grace period - will be used instead. The grace period - is the duration in seconds after the processes - running in the pod are sent a termination - signal and the time when the processes - are forcibly halted with a kill signal. - Set this value longer than the expected - cleanup time for your process. Defaults - to 30 seconds. - type: integer - format: int64 - tolerations: - description: If specified, the pod's tolerations. - type: array - items: - description: The pod this Toleration is - attached to tolerates any taint that - matches the triple - using the matching operator . + restartPolicy: + description: 'Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + type: string + runtimeClassName: + description: 'RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md This is a beta feature as of Kubernetes v1.14.' + type: string + schedulerName: + description: If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler. + type: string + securityContext: + description: 'SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field.' 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. + fsGroup: + description: "A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod: \n 1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw---- \n If unset, the Kubelet will not modify the ownership and permissions of any volume." 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. + fsGroupChangePolicy: + description: 'fsGroupChangePolicy defines behavior of changing ownership and permission of the volume before being exposed inside Pod. This field will only apply to volume types which support fsGroup based ownership(and permissions). It will have no effect on ephemeral volume types such as: secret, configmaps and emptydir. Valid values are "OnRootMismatch" and "Always". If not specified, "Always" is used.' type: string - topologySpreadConstraints: - description: TopologySpreadConstraints describes - how a group of pods ought to spread across - topology domains. Scheduler will schedule - pods in a way which abides by the constraints. - All topologySpreadConstraints are ANDed. - type: array - items: - description: TopologySpreadConstraint - specifies how to spread matching pods - among the given topology. - type: object - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - properties: - labelSelector: - description: LabelSelector is used - to find matching pods. Pods that - match this label selector are counted - to determine the number of pods - in their corresponding topology - domain. - 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 - maxSkew: - description: 'MaxSkew describes the - degree to which pods may be unevenly - distributed. When `whenUnsatisfiable=DoNotSchedule`, - it is the maximum permitted difference - between the number of matching pods - in the target topology and the global - minimum. For example, in a 3-zone - cluster, MaxSkew is set to 1, and - pods with the same labelSelector - spread as 1/1/0: | zone1 | zone2 - | zone3 | | P | P | | - - if MaxSkew is 1, incoming pod - can only be scheduled to zone3 to - become 1/1/1; scheduling it onto - zone1(zone2) would make the ActualSkew(2-0) - on zone1(zone2) violate MaxSkew(1). - - if MaxSkew is 2, incoming pod - can be scheduled onto any zone. - When `whenUnsatisfiable=ScheduleAnyway`, - it is used to give higher precedence - to topologies that satisfy it. It''s - a required field. Default value - is 1 and 0 is not allowed.' + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. type: integer - format: int32 - topologyKey: - description: TopologyKey is the key - of node labels. Nodes that have - a label with this key and identical - values are considered to be in the - same topology. We consider each - as a "bucket", and - try to put balanced number of pods - into each bucket. It's a required - field. - type: string - whenUnsatisfiable: - description: 'WhenUnsatisfiable indicates - how to deal with a pod if it doesn''t - satisfy the spread constraint. - - DoNotSchedule (default) tells the - scheduler not to schedule it. - - ScheduleAnyway tells the scheduler - to schedule the pod in any location, but - giving higher precedence to topologies - that would help reduce the skew. - A constraint is considered "Unsatisfiable" - for an incoming pod if and only - if every possible node assigment - for that pod would violate "MaxSkew" - on some topology. For example, in - a 3-zone cluster, MaxSkew is set - to 1, and pods with the same labelSelector - spread as 3/1/1: | zone1 | zone2 - | zone3 | | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, - incoming pod can only be scheduled - to zone2(zone3) to become 3/2/1(3/1/2) - as ActualSkew(2-1) on zone2(zone3) - satisfies MaxSkew(1). In other words, - the cluster can still be imbalanced, - but scheduler won''t make it *more* - imbalanced. It''s a required field.' - type: string - x-kubernetes-list-map-keys: - - topologyKey - - whenUnsatisfiable - x-kubernetes-list-type: map - volumes: - description: 'List of volumes that can be - mounted by containers belonging to the - pod. More info: https://kubernetes.io/docs/concepts/storage/volumes' - type: array - items: - description: Volume represents a named - volume in a pod that may be accessed - by any container in the pod. - type: object - required: - - name - properties: - awsElasticBlockStore: - description: 'AWSElasticBlockStore - represents an AWS Disk resource - that is attached to a kubelet''s - host machine and then exposed to - the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: object - required: - - volumeID - properties: - fsType: - description: 'Filesystem type - of the volume that you want - to mount. Tip: Ensure that the - filesystem type is supported - by the host operating system. - Examples: "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore - TODO: how do we prevent errors - in the filesystem from compromising - the machine' - type: string - partition: - description: 'The partition in - the volume that you want to - mount. If omitted, the default - is to mount by volume name. - Examples: For volume /dev/sda1, - you specify the partition as - "1". Similarly, the volume partition - for /dev/sda is "0" (or you - can leave the property empty).' - type: integer - format: int32 - readOnly: - description: 'Specify "true" to - force and set the ReadOnly property - in VolumeMounts to "true". If - omitted, the default is "false". - More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: boolean - volumeID: - description: 'Unique ID of the - persistent disk resource in - AWS (Amazon EBS volume). More - info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - azureDisk: - description: AzureDisk represents - an Azure Data Disk mount on the - host and bind mount to the pod. + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to all containers. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. type: object - required: - - diskName - - diskURI properties: - cachingMode: - description: 'Host Caching mode: - None, Read Only, Read Write.' - type: string - diskName: - description: The Name of the data - disk in the blob storage + level: + description: Level is SELinux level label that applies to the container. type: string - diskURI: - description: The URI the data - disk in the blob storage + role: + description: Role is a SELinux role label that applies to the container. type: string - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. + type: + description: Type is a SELinux type label that applies to the container. type: string - kind: - description: 'Expected values - Shared: multiple blob disks - per storage account Dedicated: - single blob disk per storage - account Managed: azure managed - data disk (only in managed availability - set). defaults to shared' + user: + description: User is a SELinux user label that applies to the container. type: string - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - azureFile: - description: AzureFile represents - an Azure File Service mount on the - host and bind mount to the pod. + seccompProfile: + description: The seccomp options to use by the containers in this pod. type: object required: - - secretName - - shareName + - type properties: - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - secretName: - description: the name of secret - that contains Azure Storage - Account Name and Key + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". type: string - shareName: - description: Share Name + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." type: string - cephfs: - description: CephFS represents a Ceph - FS mount on the host that shares - a pod's lifetime + supplementalGroups: + description: A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container. + type: array + items: + type: integer + format: int64 + sysctls: + description: Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch. + type: array + items: + description: Sysctl defines a kernel parameter to be set + type: object + required: + - name + - value + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options within a container's SecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. type: object - required: - - monitors properties: - monitors: - description: 'Required: Monitors - is a collection of Ceph monitors - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: array - items: - type: string - path: - description: 'Optional: Used as - the mounted root, rather than - the full Ceph tree, default - is /' + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. type: string - readOnly: - description: 'Optional: Defaults - to false (read/write). ReadOnly - here will force the ReadOnly - setting in VolumeMounts. More - info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: boolean - secretFile: - description: 'Optional: SecretFile - is the path to key ring for - User, default is /etc/ceph/user.secret - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - secretRef: - description: 'Optional: SecretRef - is reference to the authentication - secret for User, default is - empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: object - properties: - 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 - user: - description: 'Optional: User is - the rados user name, default - is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. type: string - cinder: - description: 'Cinder represents a - cinder volume attached and mounted - on kubelets host machine. More info: - https://examples.k8s.io/mysql-cinder-pd/README.md' - type: object - required: - - volumeID - properties: - fsType: - description: 'Filesystem type - to mount. Must be a filesystem - type supported by the host operating - system. Examples: "ext4", "xfs", - "ntfs". Implicitly inferred - to be "ext4" if unspecified. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. type: string - readOnly: - description: 'Optional: Defaults - to false (read/write). ReadOnly - here will force the ReadOnly - setting in VolumeMounts. More - info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: boolean - secretRef: - description: 'Optional: points - to a secret object containing - parameters used to connect to - OpenStack.' - type: object - properties: - 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?' + serviceAccount: + description: 'DeprecatedServiceAccount is a depreciated alias for ServiceAccountName. Deprecated: Use serviceAccountName instead.' + type: string + serviceAccountName: + description: 'ServiceAccountName is the name of the ServiceAccount to use to run this pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/' + type: string + setHostnameAsFQDN: + description: If true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default). In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname). In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters to FQDN. If a pod does not have FQDN, this has no effect. Default to false. + type: boolean + shareProcessNamespace: + description: 'Share a single process namespace between all of the containers in a pod. When this is set containers will be able to view and signal processes from other containers in the same pod, and the first process in each container will not be assigned PID 1. HostPID and ShareProcessNamespace cannot both be set. Optional: Default to false.' + type: boolean + subdomain: + description: If specified, the fully qualified Pod hostname will be "...svc.". If not specified, the pod will not have a domainname at all. + type: string + terminationGracePeriodSeconds: + description: Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period will be used instead. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. Defaults to 30 seconds. + type: integer + format: int64 + tolerations: + description: If specified, the pod's tolerations. + 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 + topologySpreadConstraints: + description: TopologySpreadConstraints describes how a group of pods ought to spread across topology domains. Scheduler will schedule pods in a way which abides by the constraints. All topologySpreadConstraints are ANDed. + type: array + items: + description: TopologySpreadConstraint specifies how to spread matching pods among the given topology. + type: object + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + properties: + labelSelector: + description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain. + 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 - volumeID: - description: 'volume id used to - identify the volume in cinder. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - configMap: - description: ConfigMap represents - a configMap that should populate - this volume - type: object - properties: - defaultMode: - description: 'Optional: mode bits - used to set permissions on created - files by default. Must be an - octal value between 0000 and - 0777 or a decimal value between - 0 and 511. YAML accepts both - octal and decimal values, JSON - requires decimal values for - mode bits. Defaults to 0644. - Directories within the path - are not affected by this setting. - This might be in conflict with - other options that affect the - file mode, like fsGroup, and - the result can be other mode - bits set.' - type: integer - format: int32 - items: - description: If unspecified, each - key-value pair in the Data field - of the referenced ConfigMap - will be projected into the volume - as a file whose name is the - key and content is the value. - If specified, the listed keys - will be projected into the specified - paths, and unlisted keys will - not be present. If a key is - specified which is not present - in the ConfigMap, the volume - setup will error unless it is - marked optional. Paths must - be relative and may not contain - the '..' path or start with - '..'. - type: array - items: - description: Maps a string key - to a path within a volume. + maxSkew: + description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 1/1/0: | zone1 | zone2 | zone3 | | P | P | | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 1/1/1; scheduling it onto zone1(zone2) would make the ActualSkew(2-0) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.' + type: integer + format: int32 + topologyKey: + description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a "bucket", and try to put balanced number of pods into each bucket. It's a required field. + type: string + whenUnsatisfiable: + description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assigment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.' + type: string + x-kubernetes-list-map-keys: + - topologyKey + - whenUnsatisfiable + x-kubernetes-list-type: map + volumes: + description: 'List of volumes that can be mounted by containers belonging to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes' + type: array + items: + description: Volume represents a named volume in a pod that may be accessed by any container in the pod. + type: object + required: + - name + properties: + awsElasticBlockStore: + description: 'AWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty).' + type: integer + format: int32 + readOnly: + description: 'Specify "true" to force and set the ReadOnly property in VolumeMounts to "true". If omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + volumeID: + description: 'Unique ID of the persistent disk resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + azureDisk: + description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. + type: object + required: + - diskName + - diskURI + properties: + cachingMode: + description: 'Host Caching mode: None, Read Only, Read Write.' + type: string + diskName: + description: The Name of the data disk in the blob storage + type: string + diskURI: + description: The URI the data disk in the blob storage + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + kind: + description: 'Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + azureFile: + description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. + type: object + required: + - secretName + - shareName + properties: + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretName: + description: the name of secret that contains Azure Storage Account Name and Key + type: string + shareName: + description: Share Name + type: string + cephfs: + description: CephFS represents a Ceph FS mount on the host that shares a pod's lifetime + type: object + required: + - monitors + properties: + monitors: + description: 'Required: Monitors is a collection of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: + type: string + path: + description: 'Optional: Used as the mounted root, rather than the full Ceph tree, default is /' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + secretFile: + description: 'Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + secretRef: + description: 'Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: object - required: - - key - - path properties: - key: - description: The key to - project. + 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 - mode: - description: 'Optional: - mode bits used to set - permissions on this file. - Must be an octal value - between 0000 and 0777 - or a decimal value between - 0 and 511. YAML accepts - both octal and decimal - values, JSON requires - decimal values for mode - bits. If not specified, - the volume defaultMode - will be used. This might - be in conflict with other - options that affect the - file mode, like fsGroup, - and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: The relative - path of the file to map - the key to. May not be - an absolute path. May - not contain the path element - '..'. May not start with - the string '..'. + user: + description: 'Optional: User is the rados user name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + cinder: + description: 'Cinder represents a cinder volume attached and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + secretRef: + description: 'Optional: points to a secret object containing parameters used to connect to OpenStack.' + type: object + properties: + 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 - 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 keys must be - defined - type: boolean - csi: - description: CSI (Container Storage - Interface) represents ephemeral - storage that is handled by certain - external CSI drivers (Beta feature). - type: object - required: - - driver - properties: - driver: - description: Driver is the name - of the CSI driver that handles - this volume. Consult with your - admin for the correct name as - registered in the cluster. - type: string - fsType: - description: Filesystem type to - mount. Ex. "ext4", "xfs", "ntfs". - If not provided, the empty value - is passed to the associated - CSI driver which will determine - the default filesystem to apply. - type: string - nodePublishSecretRef: - description: NodePublishSecretRef - is a reference to the secret - object containing sensitive - information to pass to the CSI - driver to complete the CSI NodePublishVolume - and NodeUnpublishVolume calls. - This field is optional, and may - be empty if no secret is required. - If the secret object contains - more than one secret, all secret - references are passed. - type: object - properties: - 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 - readOnly: - description: Specifies a read-only - configuration for the volume. - Defaults to false (read/write). - type: boolean - volumeAttributes: - description: VolumeAttributes - stores driver-specific properties - that are passed to the CSI driver. - Consult your driver's documentation - for supported values. - type: object - additionalProperties: + volumeID: + description: 'volume id used to identify the volume in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + configMap: + description: ConfigMap represents a configMap that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 keys must be defined + type: boolean + csi: + description: CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the CSI driver that handles this volume. Consult with your admin for the correct name as registered in the cluster. type: string - downwardAPI: - description: DownwardAPI represents - downward API about the pod that - should populate this volume - type: object - properties: - defaultMode: - description: 'Optional: mode bits - to use on created files by default. - Must be a Optional: mode bits - used to set permissions on created - files by default. Must be an - octal value between 0000 and - 0777 or a decimal value between - 0 and 511. YAML accepts both - octal and decimal values, JSON - requires decimal values for - mode bits. Defaults to 0644. - Directories within the path - are not affected by this setting. - This might be in conflict with - other options that affect the - file mode, like fsGroup, and - the result can be other mode - bits set.' - type: integer - format: int32 - items: - description: Items is a list of - downward API volume file - type: array - items: - description: DownwardAPIVolumeFile - represents information to - create the file containing - the pod field + fsType: + description: Filesystem type to mount. Ex. "ext4", "xfs", "ntfs". If not provided, the empty value is passed to the associated CSI driver which will determine the default filesystem to apply. + type: string + nodePublishSecretRef: + description: NodePublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodePublishVolume and NodeUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secret references are passed. type: object - required: - - path properties: - fieldRef: - description: 'Required: - Selects a field of the - pod: only annotations, - labels, name and namespace - are supported.' - 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 - mode: - description: 'Optional: - mode bits used to set - permissions on this file, - must be an octal value - between 0000 and 0777 - or a decimal value between - 0 and 511. YAML accepts - both octal and decimal - values, JSON requires - decimal values for mode - bits. If not specified, - the volume defaultMode - will be used. This might - be in conflict with other - options that affect the - file mode, like fsGroup, - and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: 'Required: - Path is the relative - path name of the file - to be created. Must not - be absolute or contain - the ''..'' path. Must - be utf-8 encoded. The - first item of the relative - path must not start with - ''..''' + 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 - resourceFieldRef: - description: 'Selects a - resource of the container: - only resources limits - and requests (limits.cpu, - limits.memory, requests.cpu - and requests.memory) 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 - emptyDir: - description: 'EmptyDir represents - a temporary directory that shares - a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: object - properties: - medium: - description: 'What type of storage - medium should back this directory. - The default is "" which means - to use the node''s default medium. - Must be an empty string (default) - or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: string - sizeLimit: - description: 'Total amount of - local storage required for this - EmptyDir volume. The size limit - is also applicable for memory - medium. The maximum usage on - memory medium EmptyDir would - be the minimum value between - the SizeLimit specified here - and the sum of memory limits - of all containers in a pod. - The default is nil which means - that the limit is undefined. - More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' - 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 - ephemeral: - description: "Ephemeral represents - a volume that is handled by a cluster - storage driver (Alpha feature). - The volume's lifecycle is tied to - the pod that defines it - it will - be created before the pod starts, - and deleted when the pod is removed. - \n Use this if: a) the volume is - only needed while the pod runs, - b) features of normal volumes like - restoring from snapshot or capacity - \ tracking are needed, c) the - storage driver is specified through - a storage class, and d) the storage - driver supports dynamic volume provisioning - through a PersistentVolumeClaim - (see EphemeralVolumeSource for more - \ information on the connection - between this volume type and - PersistentVolumeClaim). \n Use PersistentVolumeClaim - or one of the vendor-specific APIs - for volumes that persist for longer - than the lifecycle of an individual - pod. \n Use CSI for light-weight - local ephemeral volumes if the CSI - driver is meant to be used that - way - see the documentation of the - driver for more information. \n - A pod can use both types of ephemeral - volumes and persistent volumes at - the same time." - type: object - properties: - readOnly: - description: Specifies a read-only - configuration for the volume. - Defaults to false (read/write). - type: boolean - volumeClaimTemplate: - description: "Will be used to - create a stand-alone PVC to - provision the volume. The pod - in which this EphemeralVolumeSource - is embedded will be the owner - of the PVC, i.e. the PVC will - be deleted together with the - pod. The name of the PVC will - be `-` - where `` is the - name from the `PodSpec.Volumes` - array entry. Pod validation - will reject the pod if the concatenated - name is not valid for a PVC - (for example, too long). \n - An existing PVC with that name - that is not owned by the pod - will *not* be used for the pod - to avoid using an unrelated - volume by mistake. Starting - the pod is then blocked until - the unrelated PVC is removed. - If such a pre-created PVC is - meant to be used by the pod, - the PVC has to updated with - an owner reference to the pod - once the pod exists. Normally - this should not be necessary, - but it may be useful when manually - reconstructing a broken cluster. - \n This field is read-only and - no changes will be made by Kubernetes - to the PVC after it has been - created. \n Required, must not - be nil." - type: object - required: - - spec - properties: - metadata: - description: May contain labels - and annotations that will - be copied into the PVC when - creating it. No other fields - are allowed and will be - rejected during validation. - type: object - spec: - description: The specification - for the PersistentVolumeClaim. - The entire content is copied - unchanged into the PVC that - gets created from this template. - The same fields as in a - PersistentVolumeClaim are - also valid here. + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeAttributes: + description: VolumeAttributes stores driver-specific properties that are passed to the CSI driver. Consult your driver's documentation for supported values. + type: object + additionalProperties: + type: string + downwardAPI: + description: DownwardAPI represents downward API about the pod that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created files by default. Must be a Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: Items is a list of downward API volume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field type: object + required: + - path properties: - accessModes: - description: 'AccessModes - contains the desired - access modes the volume - should have. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' - type: array - items: - type: string - dataSource: - description: 'This field - can be used to specify - either: * An existing - VolumeSnapshot object - (snapshot.storage.k8s.io/VolumeSnapshot - - Beta) * An existing - PVC (PersistentVolumeClaim) - * An existing custom - resource/object that - implements data population - (Alpha) In order to - use VolumeSnapshot object - types, the appropriate - feature gate must be - enabled (VolumeSnapshotDataSource - or AnyVolumeDataSource) - If the provisioner or - an external controller - can support the specified - data source, it will - create a new volume - based on the contents - of the specified data - source. If the specified - data source is not supported, - the volume will not - be created and the failure - will be reported as - an event. In the future, - we plan to support more - data source types and - the behavior of the - provisioner may change.' + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' type: object required: - - kind - - name + - fieldPath properties: - apiGroup: - description: APIGroup - is the group for - the resource being - referenced. If APIGroup - is not specified, - the specified Kind - must be in the core - API group. For any - other third-party - types, APIGroup - is required. + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". type: string - kind: - description: Kind - is the type of resource - being referenced + fieldPath: + description: Path of the field to select in the specified API version. type: string - name: - description: Name - is the name of resource - being referenced - type: string - resources: - description: 'Resources - represents the minimum - resources the volume - should have. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: 'Required: Path is the relative path name of the file to be created. Must not be absolute or contain the ''..'' path. Must be utf-8 encoded. The first item of the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.' type: object + required: + - resource properties: - limits: - description: 'Limits - describes the maximum - amount of compute - resources allowed. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: + 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 - selector: - description: A label query - over volumes to consider - for binding. - 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. + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + emptyDir: + description: 'EmptyDir represents a temporary directory that shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: object + properties: + medium: + description: 'What type of storage medium should back this directory. The default is "" which means to use the node''s default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: string + sizeLimit: + description: 'Total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' + 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 + ephemeral: + description: "Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed. \n Use this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity tracking are needed, c) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through a PersistentVolumeClaim (see EphemeralVolumeSource for more information on the connection between this volume type and PersistentVolumeClaim). \n Use PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod. \n Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information. \n A pod can use both types of ephemeral volumes and persistent volumes at the same time." + type: object + properties: + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeClaimTemplate: + description: "Will be used to create a stand-alone PVC to provision the volume. The pod in which this EphemeralVolumeSource is embedded will be the owner of the PVC, i.e. the PVC will be deleted together with the pod. The name of the PVC will be `-` where `` is the name from the `PodSpec.Volumes` array entry. Pod validation will reject the pod if the concatenated name is not valid for a PVC (for example, too long). \n An existing PVC with that name that is not owned by the pod will *not* be used for the pod to avoid using an unrelated volume by mistake. Starting the pod is then blocked until the unrelated PVC is removed. If such a pre-created PVC is meant to be used by the pod, the PVC has to updated with an owner reference to the pod once the pod exists. Normally this should not be necessary, but it may be useful when manually reconstructing a broken cluster. \n This field is read-only and no changes will be made by Kubernetes to the PVC after it has been created. \n Required, must not be nil." + type: object + required: + - spec + properties: + metadata: + description: May contain labels and annotations that will be copied into the PVC when creating it. No other fields are allowed and will be rejected during validation. + type: object + spec: + description: The specification for the PersistentVolumeClaim. The entire content is copied unchanged into the PVC that gets created from this template. The same fields as in a PersistentVolumeClaim are also valid here. + type: object + properties: + accessModes: + description: 'AccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + type: array + items: + type: string + dataSource: + description: 'This field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) * An existing custom resource that implements data population (Alpha) In order to use custom resource types that implement data population, the AnyVolumeDataSource feature gate must be enabled. If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source.' + type: object + required: + - kind + - name + properties: + apiGroup: + description: APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + resources: + description: 'Resources represents the minimum resources the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' 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: + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + selector: + description: A label query over volumes to consider for binding. + 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 - 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 - storageClassName: - description: 'Name of - the StorageClass required - by the claim. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' - type: string - volumeMode: - description: volumeMode - defines what type of - volume is required by - the claim. Value of - Filesystem is implied - when not included in - claim spec. - type: string - volumeName: - description: VolumeName - is the binding reference - to the PersistentVolume - backing this claim. - type: string - fc: - description: FC represents a Fibre - Channel resource that is attached - to a kubelet's host machine and - then exposed to the pod. - type: object - properties: - fsType: - description: 'Filesystem type - to mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. TODO: how do - we prevent errors in the filesystem - from compromising the machine' - type: string - lun: - description: 'Optional: FC target - lun number' - type: integer - format: int32 - readOnly: - description: 'Optional: Defaults - to false (read/write). ReadOnly - here will force the ReadOnly - setting in VolumeMounts.' - type: boolean - targetWWNs: - description: 'Optional: FC target - worldwide names (WWNs)' - type: array - items: + 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 + storageClassName: + description: 'Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' + type: string + volumeMode: + description: volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. + type: string + volumeName: + description: VolumeName is the binding reference to the PersistentVolume backing this claim. + type: string + fc: + description: FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod. + type: object + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. TODO: how do we prevent errors in the filesystem from compromising the machine' type: string - wwids: - description: 'Optional: FC volume - world wide identifiers (wwids) - Either wwids or combination - of targetWWNs and lun must be - set, but not both simultaneously.' - type: array - items: + lun: + description: 'Optional: FC target lun number' + type: integer + format: int32 + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + targetWWNs: + description: 'Optional: FC target worldwide names (WWNs)' + type: array + items: + type: string + wwids: + description: 'Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.' + type: array + items: + type: string + flexVolume: + description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the driver to use for this volume. type: string - flexVolume: - description: FlexVolume represents - a generic volume resource that is - provisioned/attached using an exec - based plugin. - type: object - required: - - driver - properties: - driver: - description: Driver is the name - of the driver to use for this - volume. - type: string - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - The default filesystem depends - on FlexVolume script. - type: string - options: - description: 'Optional: Extra - command options if any.' - type: object - additionalProperties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script. type: string - readOnly: - description: 'Optional: Defaults - to false (read/write). ReadOnly - here will force the ReadOnly - setting in VolumeMounts.' - type: boolean - secretRef: - description: 'Optional: SecretRef - is reference to the secret object - containing sensitive information - to pass to the plugin scripts. - This may be empty if no secret - object is specified. If the - secret object contains more - than one secret, all secrets - are passed to the plugin scripts.' - type: object - properties: - 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?' + options: + description: 'Optional: Extra command options if any.' + type: object + additionalProperties: type: string - flocker: - description: Flocker represents a - Flocker volume attached to a kubelet's - host machine. This depends on the - Flocker control service being running - type: object - properties: - datasetName: - description: Name of the dataset - stored as metadata -> name on - the dataset for Flocker should - be considered as deprecated - type: string - datasetUUID: - description: UUID of the dataset. - This is unique identifier of - a Flocker dataset - type: string - gcePersistentDisk: - description: 'GCEPersistentDisk represents - a GCE Disk resource that is attached - to a kubelet''s host machine and - then exposed to the pod. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: object - required: - - pdName - properties: - fsType: - description: 'Filesystem type - of the volume that you want - to mount. Tip: Ensure that the - filesystem type is supported - by the host operating system. - Examples: "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk - TODO: how do we prevent errors - in the filesystem from compromising - the machine' - type: string - partition: - description: 'The partition in - the volume that you want to - mount. If omitted, the default - is to mount by volume name. - Examples: For volume /dev/sda1, - you specify the partition as - "1". Similarly, the volume partition - for /dev/sda is "0" (or you - can leave the property empty). - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: integer - format: int32 - pdName: - description: 'Unique name of the - PD resource in GCE. Used to - identify the disk in GCE. More - info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - readOnly: - description: 'ReadOnly here will - force the ReadOnly setting in - VolumeMounts. Defaults to false. - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: boolean - gitRepo: - description: 'GitRepo represents a - git repository at a particular revision. - DEPRECATED: GitRepo is deprecated. - To provision a container with a - git repo, mount an EmptyDir into - an InitContainer that clones the - repo using git, then mount the EmptyDir - into the Pod''s container.' - type: object - required: - - repository - properties: - directory: - description: Target directory - name. Must not contain or start - with '..'. If '.' is supplied, - the volume directory will be - the git repository. Otherwise, - if specified, the volume will - contain the git repository in - the subdirectory with the given - name. - type: string - repository: - description: Repository URL - type: string - revision: - description: Commit hash for the - specified revision. - type: string - glusterfs: - description: 'Glusterfs represents - a Glusterfs mount on the host that - shares a pod''s lifetime. More info: - https://examples.k8s.io/volumes/glusterfs/README.md' - type: object - required: - - endpoints - - path - properties: - endpoints: - description: 'EndpointsName is - the endpoint name that details - Glusterfs topology. More info: - https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - path: - description: 'Path is the Glusterfs - volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - readOnly: - description: 'ReadOnly here will - force the Glusterfs volume to - be mounted with read-only permissions. - Defaults to false. More info: - https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: boolean - hostPath: - description: 'HostPath represents - a pre-existing file or directory - on the host machine that is directly - exposed to the container. This is - generally used for system agents - or other privileged things that - are allowed to see the host machine. - Most containers will NOT need this. - More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath - --- TODO(jonesdl) We need to restrict - who can use host directory mounts - and who can/can not mount host directories - as read/write.' - type: object - required: - - path - properties: - path: - description: 'Path of the directory - on the host. If the path is - a symlink, it will follow the - link to the real path. More - info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - type: - description: 'Type for HostPath - Volume Defaults to "" More info: - https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - iscsi: - description: 'ISCSI represents an - ISCSI Disk resource that is attached - to a kubelet''s host machine and - then exposed to the pod. More info: - https://examples.k8s.io/volumes/iscsi/README.md' - type: object - required: - - iqn - - lun - - targetPortal - properties: - chapAuthDiscovery: - description: whether support iSCSI - Discovery CHAP authentication - type: boolean - chapAuthSession: - description: whether support iSCSI - Session CHAP authentication - type: boolean - fsType: - description: 'Filesystem type - of the volume that you want - to mount. Tip: Ensure that the - filesystem type is supported - by the host operating system. - Examples: "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi - TODO: how do we prevent errors - in the filesystem from compromising - the machine' - type: string - initiatorName: - description: Custom iSCSI Initiator - Name. If initiatorName is specified - with iscsiInterface simultaneously, - new iSCSI interface : will be - created for the connection. - type: string - iqn: - description: Target iSCSI Qualified - Name. - type: string - iscsiInterface: - description: iSCSI Interface Name - that uses an iSCSI transport. - Defaults to 'default' (tcp). - type: string - lun: - description: iSCSI Target Lun - number. - type: integer - format: int32 - portals: - description: iSCSI Target Portal - List. The portal is either an - IP or ip_addr:port if the port - is other than default (typically - TCP ports 860 and 3260). - type: array - items: + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + secretRef: + description: 'Optional: SecretRef is reference to the secret object containing sensitive information to pass to the plugin scripts. This may be empty if no secret object is specified. If the secret object contains more than one secret, all secrets are passed to the plugin scripts.' + type: object + properties: + 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 + flocker: + description: Flocker represents a Flocker volume attached to a kubelet's host machine. This depends on the Flocker control service being running + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata -> name on the dataset for Flocker should be considered as deprecated type: string - readOnly: - description: ReadOnly here will - force the ReadOnly setting in - VolumeMounts. Defaults to false. - type: boolean - secretRef: - description: CHAP Secret for iSCSI - target and initiator authentication - type: object - properties: - 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 - targetPortal: - description: iSCSI Target Portal. - The Portal is either an IP or - ip_addr:port if the port is - other than default (typically - TCP ports 860 and 3260). - type: string - name: - description: 'Volume''s name. Must - be a DNS_LABEL and unique within - the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - nfs: - description: 'NFS represents an NFS - mount on the host that shares a - pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: object - required: - - path - - server - properties: - path: - description: 'Path that is exported - by the NFS server. More info: - https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - readOnly: - description: 'ReadOnly here will - force the NFS export to be mounted - with read-only permissions. - Defaults to false. More info: - https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: boolean - server: - description: 'Server is the hostname - or IP address of the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - persistentVolumeClaim: - description: 'PersistentVolumeClaimVolumeSource - represents a reference to a PersistentVolumeClaim - in the same namespace. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: object - required: - - claimName - properties: - claimName: - description: 'ClaimName is the - name of a PersistentVolumeClaim - in the same namespace as the - pod using this volume. More - info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: string - readOnly: - description: Will force the ReadOnly - setting in VolumeMounts. Default - false. - type: boolean - photonPersistentDisk: - description: PhotonPersistentDisk - represents a PhotonController persistent - disk attached and mounted on kubelets - host machine - type: object - required: - - pdID - properties: - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. - type: string - pdID: - description: ID that identifies - Photon Controller persistent - disk - type: string - portworxVolume: - description: PortworxVolume represents - a portworx volume attached and mounted - on kubelets host machine - type: object - required: - - volumeID - properties: - fsType: - description: FSType represents - the filesystem type to mount - Must be a filesystem type supported - by the host operating system. - Ex. "ext4", "xfs". Implicitly - inferred to be "ext4" if unspecified. - type: string - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - volumeID: - description: VolumeID uniquely - identifies a Portworx volume - type: string - projected: - description: Items for all in one - resources secrets, configmaps, and - downward API - type: object - required: - - sources - properties: - defaultMode: - description: Mode bits used to - set permissions on created files - by default. Must be an octal - value between 0000 and 0777 - or a decimal value between 0 - and 511. YAML accepts both octal - and decimal values, JSON requires - decimal values for mode bits. - Directories within the path - are not affected by this setting. - This might be in conflict with - other options that affect the - file mode, like fsGroup, and - the result can be other mode - bits set. - type: integer - format: int32 - sources: - description: list of volume projections - type: array - items: - description: Projection that - may be projected along with - other supported volume types + datasetUUID: + description: UUID of the dataset. This is unique identifier of a Flocker dataset + type: string + gcePersistentDisk: + description: 'GCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: object + required: + - pdName + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: integer + format: int32 + pdName: + description: 'Unique name of the PD resource in GCE. Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + gitRepo: + description: 'GitRepo represents a git repository at a particular revision. DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod''s container.' + type: object + required: + - repository + properties: + directory: + description: Target directory name. Must not contain or start with '..'. If '.' is supplied, the volume directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name. + type: string + repository: + description: Repository URL + type: string + revision: + description: Commit hash for the specified revision. + type: string + glusterfs: + description: 'Glusterfs represents a Glusterfs mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' + type: object + required: + - endpoints + - path + properties: + endpoints: + description: 'EndpointsName is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + path: + description: 'Path is the Glusterfs volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + hostPath: + description: 'HostPath represents a pre-existing file or directory on the host machine that is directly exposed to the container. This is generally used for system agents or other privileged things that are allowed to see the host machine. Most containers will NOT need this. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath --- TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not mount host directories as read/write.' + type: object + required: + - path + properties: + path: + description: 'Path of the directory on the host. If the path is a symlink, it will follow the link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + iscsi: + description: 'ISCSI represents an ISCSI Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' + type: object + required: + - iqn + - lun + - targetPortal + properties: + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP authentication + type: boolean + chapAuthSession: + description: whether support iSCSI Session CHAP authentication + type: boolean + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface : will be created for the connection. + type: string + iqn: + description: Target iSCSI Qualified Name. + type: string + iscsiInterface: + description: iSCSI Interface Name that uses an iSCSI transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: integer + format: int32 + portals: + description: iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: array + items: + type: string + readOnly: + description: ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. + type: boolean + secretRef: + description: CHAP Secret for iSCSI target and initiator authentication type: object properties: - configMap: - description: information - about the configMap data - to project - type: object - properties: - items: - description: If unspecified, - each key-value pair - in the Data field - of the referenced - ConfigMap will be - projected into the - volume as a file whose - name is the key and - content is the value. - If specified, the - listed keys will be - projected into the - specified paths, and - unlisted keys will - not be present. If - a key is specified - which is not present - in the ConfigMap, - the volume setup will - error unless it is - marked optional. Paths - must be relative and - may not contain the - '..' path or start - with '..'. - type: array + 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 + targetPortal: + description: iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: string + name: + description: 'Volume''s name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: 'NFS represents an NFS mount on the host that shares a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: object + required: + - path + - server + properties: + path: + description: 'Path that is exported by the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS export to be mounted with read-only permissions. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + server: + description: 'Server is the hostname or IP address of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + persistentVolumeClaim: + description: 'PersistentVolumeClaimVolumeSource represents a reference to a PersistentVolumeClaim in the same namespace. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: object + required: + - claimName + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in VolumeMounts. Default false. + type: boolean + photonPersistentDisk: + description: PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine + type: object + required: + - pdID + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + pdID: + description: ID that identifies Photon Controller persistent disk + type: string + portworxVolume: + description: PortworxVolume represents a portworx volume attached and mounted on kubelets host machine + type: object + required: + - volumeID + properties: + fsType: + description: FSType represents the filesystem type to mount Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + volumeID: + description: VolumeID uniquely identifies a Portworx volume + type: string + projected: + description: Items for all in one resources secrets, configmaps, and downward API + type: object + properties: + defaultMode: + description: Mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set. + type: integer + format: int32 + sources: + description: list of volume projections + type: array + items: + description: Projection that may be projected along with other supported volume types + type: object + properties: + configMap: + description: information about the configMap data to project + type: object + properties: items: - description: Maps - a string key to - a path within a - volume. - type: object - required: - - key - - path - properties: - key: - description: The - key to project. - type: string - mode: - description: 'Optional: - mode bits used - to set permissions - on this file. - Must be an octal - value between - 0000 and 0777 - or a decimal - value between - 0 and 511. YAML - accepts both - octal and decimal - values, JSON - requires decimal - values for mode - bits. If not - specified, the - volume defaultMode - will be used. - This might be - in conflict - with other options - that affect - the file mode, - like fsGroup, - and the result - can be other - mode bits set.' - type: integer - format: int32 - path: - description: The - relative path - of the file - to map the key - to. May not - be an absolute - path. May not - contain the - path element - '..'. May not - start with the - string '..'. - 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 keys must be - defined - type: boolean - downwardAPI: - description: information - about the downwardAPI - data to project - type: object - properties: - items: - description: Items is - a list of DownwardAPIVolume - file - type: array + description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 keys must be defined + type: boolean + downwardAPI: + description: information about the downwardAPI data to project + type: object + properties: items: - description: DownwardAPIVolumeFile - represents information - to create the file - containing the pod - field - type: object - required: - - path - properties: - fieldRef: - description: 'Required: - Selects a field - of the pod: - only annotations, - labels, name - and namespace - are supported.' - 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 - mode: - description: 'Optional: - mode bits used - to set permissions - on this file, - must be an octal - value between - 0000 and 0777 - or a decimal - value between - 0 and 511. YAML - accepts both - octal and decimal - values, JSON - requires decimal - values for mode - bits. If not - specified, the - volume defaultMode - will be used. - This might be - in conflict - with other options - that affect - the file mode, - like fsGroup, - and the result - can be other - mode bits set.' - type: integer - format: int32 - path: - description: 'Required: - Path is the - relative path - name of the - file to be created. - Must not be - absolute or - contain the - ''..'' path. - Must be utf-8 - encoded. The - first item of - the relative - path must not - start with ''..''' - type: string - resourceFieldRef: - description: 'Selects - a resource of - the container: - only resources - limits and requests - (limits.cpu, - limits.memory, - requests.cpu - and requests.memory) - 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 - secret: - description: information - about the secret data - to project - type: object - properties: - items: - description: If unspecified, - each key-value pair - in the Data field - of the referenced - Secret will be projected - into the volume as - a file whose name - is the key and content - is the value. If specified, - the listed keys will - be projected into - the specified paths, - and unlisted keys - will not be present. - If a key is specified - which is not present - in the Secret, the - volume setup will - error unless it is - marked optional. Paths - must be relative and - may not contain the - '..' path or start - with '..'. - type: array + description: Items is a list of DownwardAPIVolume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field + type: object + required: + - path + properties: + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' + 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 + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: 'Required: Path is the relative path name of the file to be created. Must not be absolute or contain the ''..'' path. Must be utf-8 encoded. The first item of the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) 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 + secret: + description: information about the secret data to project + type: object + properties: items: - description: Maps - a string key to - a path within a - volume. - type: object - required: - - key - - path - properties: - key: - description: The - key to project. - type: string - mode: - description: 'Optional: - mode bits used - to set permissions - on this file. - Must be an octal - value between - 0000 and 0777 - or a decimal - value between - 0 and 511. YAML - accepts both - octal and decimal - values, JSON - requires decimal - values for mode - bits. If not - specified, the - volume defaultMode - will be used. - This might be - in conflict - with other options - that affect - the file mode, - like fsGroup, - and the result - can be other - mode bits set.' - type: integer - format: int32 - path: - description: The - relative path - of the file - to map the key - to. May not - be an absolute - path. May not - contain the - path element - '..'. May not - start with the - string '..'. - 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 - serviceAccountToken: - description: information - about the serviceAccountToken - data to project - type: object - required: - - path - properties: - audience: - description: Audience - is the intended audience - of the token. A recipient - of a token must identify - itself with an identifier - specified in the audience - of the token, and - otherwise should reject - the token. The audience - defaults to the identifier - of the apiserver. - type: string - expirationSeconds: - description: ExpirationSeconds - is the requested duration - of validity of the - service account token. - As the token approaches - expiration, the kubelet - volume plugin will - proactively rotate - the service account - token. The kubelet - will start trying - to rotate the token - if the token is older - than 80 percent of - its time to live or - if the token is older - than 24 hours.Defaults - to 1 hour and must - be at least 10 minutes. - type: integer - format: int64 - path: - description: Path is - the path relative - to the mount point - of the file to project - the token into. - type: string - quobyte: - description: Quobyte represents a - Quobyte mount on the host that shares - a pod's lifetime - type: object - required: - - registry - - volume - properties: - group: - description: Group to map volume - access to Default is no group - type: string - readOnly: - description: ReadOnly here will - force the Quobyte volume to - be mounted with read-only permissions. - Defaults to false. - type: boolean - registry: - description: Registry represents - a single or multiple Quobyte - Registry services specified - as a string as host:port pair - (multiple entries are separated - with commas) which acts as the - central registry for volumes - type: string - tenant: - description: Tenant owning the - given Quobyte volume in the - Backend Used with dynamically - provisioned Quobyte volumes, - value is set by the plugin - type: string - user: - description: User to map volume - access to Defaults to serivceaccount - user - type: string - volume: - description: Volume is a string - that references an already created - Quobyte volume by name. - type: string - rbd: - description: 'RBD represents a Rados - Block Device mount on the host that - shares a pod''s lifetime. More info: - https://examples.k8s.io/volumes/rbd/README.md' - type: object - required: - - image - - monitors - properties: - fsType: - description: 'Filesystem type - of the volume that you want - to mount. Tip: Ensure that the - filesystem type is supported - by the host operating system. - Examples: "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd - TODO: how do we prevent errors - in the filesystem from compromising - the machine' - type: string - image: - description: 'The rados image - name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - keyring: - description: 'Keyring is the path - to key ring for RBDUser. Default - is /etc/ceph/keyring. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - monitors: - description: 'A collection of - Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: array - items: + description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 + serviceAccountToken: + description: information about the serviceAccountToken data to project + type: object + required: + - path + properties: + audience: + description: Audience is the intended audience of the token. A recipient of a token must identify itself with an identifier specified in the audience of the token, and otherwise should reject the token. The audience defaults to the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the requested duration of validity of the service account token. As the token approaches expiration, the kubelet volume plugin will proactively rotate the service account token. The kubelet will start trying to rotate the token if the token is older than 80 percent of its time to live or if the token is older than 24 hours.Defaults to 1 hour and must be at least 10 minutes. + type: integer + format: int64 + path: + description: Path is the path relative to the mount point of the file to project the token into. + type: string + quobyte: + description: Quobyte represents a Quobyte mount on the host that shares a pod's lifetime + type: object + required: + - registry + - volume + properties: + group: + description: Group to map volume access to Default is no group type: string - pool: - description: 'The rados pool name. - Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - readOnly: - description: 'ReadOnly here will - force the ReadOnly setting in - VolumeMounts. Defaults to false. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: boolean - secretRef: - description: 'SecretRef is name - of the authentication secret - for RBDUser. If provided overrides - keyring. Default is nil. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: object - properties: - 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 - user: - description: 'The rados user name. - Default is admin. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - scaleIO: - description: ScaleIO represents a - ScaleIO persistent volume attached - and mounted on Kubernetes nodes. - type: object - required: - - gateway - - secretRef - - system - properties: - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Default is "xfs". - type: string - gateway: - description: The host address - of the ScaleIO API Gateway. - type: string - protectionDomain: - description: The name of the ScaleIO - Protection Domain for the configured - storage. - type: string - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - secretRef: - description: SecretRef references - to the secret for ScaleIO user - and other sensitive information. - If this is not provided, Login - operation will fail. - type: object - properties: - 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?' + readOnly: + description: ReadOnly here will force the Quobyte volume to be mounted with read-only permissions. Defaults to false. + type: boolean + registry: + description: Registry represents a single or multiple Quobyte Registry services specified as a string as host:port pair (multiple entries are separated with commas) which acts as the central registry for volumes + type: string + tenant: + description: Tenant owning the given Quobyte volume in the Backend Used with dynamically provisioned Quobyte volumes, value is set by the plugin + type: string + user: + description: User to map volume access to Defaults to serivceaccount user + type: string + volume: + description: Volume is a string that references an already created Quobyte volume by name. + type: string + rbd: + description: 'RBD represents a Rados Block Device mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md' + type: object + required: + - image + - monitors + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + image: + description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + keyring: + description: 'Keyring is the path to key ring for RBDUser. Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: type: string - sslEnabled: - description: Flag to enable/disable - SSL communication with Gateway, - default false - type: boolean - storageMode: - description: Indicates whether - the storage for a volume should - be ThickProvisioned or ThinProvisioned. - Default is ThinProvisioned. - type: string - storagePool: - description: The ScaleIO Storage - Pool associated with the protection - domain. - type: string - system: - description: The name of the storage - system as configured in ScaleIO. - type: string - volumeName: - description: The name of a volume - already created in the ScaleIO - system that is associated with - this volume source. - type: string - secret: - description: 'Secret represents a - secret that should populate this - volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: object - properties: - defaultMode: - description: 'Optional: mode bits - used to set permissions on created - files by default. Must be an - octal value between 0000 and - 0777 or a decimal value between - 0 and 511. YAML accepts both - octal and decimal values, JSON - requires decimal values for - mode bits. Defaults to 0644. - Directories within the path - are not affected by this setting. - This might be in conflict with - other options that affect the - file mode, like fsGroup, and - the result can be other mode - bits set.' - type: integer - format: int32 - items: - description: If unspecified, each - key-value pair in the Data field - of the referenced Secret will - be projected into the volume - as a file whose name is the - key and content is the value. - If specified, the listed keys - will be projected into the specified - paths, and unlisted keys will - not be present. If a key is - specified which is not present - in the Secret, the volume setup - will error unless it is marked - optional. Paths must be relative - and may not contain the '..' - path or start with '..'. - type: array - items: - description: Maps a string key - to a path within a volume. + pool: + description: 'The rados pool name. Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + secretRef: + description: 'SecretRef is name of the authentication secret for RBDUser. If provided overrides keyring. Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: object - required: - - key - - path properties: - key: - description: The key to - project. + 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 - mode: - description: 'Optional: - mode bits used to set - permissions on this file. - Must be an octal value - between 0000 and 0777 - or a decimal value between - 0 and 511. YAML accepts - both octal and decimal - values, JSON requires - decimal values for mode - bits. If not specified, - the volume defaultMode - will be used. This might - be in conflict with other - options that affect the - file mode, like fsGroup, - and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: The relative - path of the file to map - the key to. May not be - an absolute path. May - not contain the path element - '..'. May not start with - the string '..'. + user: + description: 'The rados user name. Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + scaleIO: + description: ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + type: object + required: + - gateway + - secretRef + - system + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Default is "xfs". + type: string + gateway: + description: The host address of the ScaleIO API Gateway. + type: string + protectionDomain: + description: The name of the ScaleIO Protection Domain for the configured storage. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail. + type: object + properties: + 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 keys must be defined - type: boolean - secretName: - description: 'Name of the secret - in the pod''s namespace to use. - More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: string - storageos: - description: StorageOS represents - a StorageOS volume attached and - mounted on Kubernetes nodes. - type: object - properties: - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. - type: string - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - secretRef: - description: SecretRef specifies - the secret to use for obtaining - the StorageOS API credentials. If - not specified, default values - will be attempted. - type: object - properties: - 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 - volumeName: - description: VolumeName is the - human-readable name of the StorageOS - volume. Volume names are only - unique within a namespace. - type: string - volumeNamespace: - description: VolumeNamespace specifies - the scope of the volume within - StorageOS. If no namespace - is specified then the Pod's - namespace will be used. This - allows the Kubernetes name scoping - to be mirrored within StorageOS - for tighter integration. Set - VolumeName to any name to override - the default behaviour. Set to - "default" if you are not using - namespaces within StorageOS. - Namespaces that do not pre-exist - within StorageOS will be created. - type: string - vsphereVolume: - description: VsphereVolume represents - a vSphere volume attached and mounted - on kubelets host machine - type: object - required: - - volumePath - properties: - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. - type: string - storagePolicyID: - description: Storage Policy Based - Management (SPBM) profile ID - associated with the StoragePolicyName. - type: string - storagePolicyName: - description: Storage Policy Based - Management (SPBM) profile name. - type: string - volumePath: - description: Path that identifies - vSphere volume vmdk - type: string - permissions: - type: array - items: - description: StrategyDeploymentPermissions describe the - rbac rules and service account needed by the install strategy - type: object - required: - - rules - - serviceAccountName - properties: - rules: - type: array - items: - description: PolicyRule holds information that describes - a policy rule, but does not contain information - about who the rule applies to or which namespace - the rule applies to. - type: object - required: - - verbs - properties: - apiGroups: - description: APIGroups is the name of the APIGroup - that contains the resources. If multiple API - groups are specified, any action requested against - one of the enumerated resources in any API group - will be allowed. - type: array - items: - type: string - nonResourceURLs: - description: NonResourceURLs is a set of partial - urls that a user should have access to. *s - are allowed, but only as the full, final step - in the path Since non-resource URLs are not - namespaced, this field is only applicable for - ClusterRoles referenced from a ClusterRoleBinding. - Rules can either apply to API resources (such - as "pods" or "secrets") or non-resource URL - paths (such as "/api"), but not both. - type: array - items: - type: string - resourceNames: - description: ResourceNames is an optional white - list of names that the rule applies to. An - empty set means that everything is allowed. - type: array - items: - type: string - resources: - description: Resources is a list of resources - this rule applies to. ResourceAll represents - all resources. - type: array - items: - type: string - verbs: - description: Verbs is a list of Verbs that apply - to ALL the ResourceKinds and AttributeRestrictions - contained in this rule. VerbAll represents - all kinds. - type: array - items: - type: string - serviceAccountName: - type: string - strategy: + sslEnabled: + description: Flag to enable/disable SSL communication with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned. + type: string + storagePool: + description: The ScaleIO Storage Pool associated with the protection domain. + type: string + system: + description: The name of the storage system as configured in ScaleIO. + type: string + volumeName: + description: The name of a volume already created in the ScaleIO system that is associated with this volume source. + type: string + secret: + description: 'Secret represents a secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + optional: + description: Specify whether the Secret or its keys must be defined + type: boolean + secretName: + description: 'Name of the secret in the pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + storageos: + description: StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes. + type: object + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef specifies the secret to use for obtaining the StorageOS API credentials. If not specified, default values will be attempted. + type: object + properties: + 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 + volumeName: + description: VolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace. + type: string + volumeNamespace: + description: VolumeNamespace specifies the scope of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping to be mirrored within StorageOS for tighter integration. Set VolumeName to any name to override the default behaviour. Set to "default" if you are not using namespaces within StorageOS. Namespaces that do not pre-exist within StorageOS will be created. + type: string + vsphereVolume: + description: VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine + type: object + required: + - volumePath + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName. + type: string + storagePolicyName: + description: Storage Policy Based Management (SPBM) profile name. + type: string + volumePath: + description: Path that identifies vSphere volume vmdk + type: string + permissions: + type: array + items: + description: StrategyDeploymentPermissions describe the rbac rules and service account needed by the install strategy + type: object + required: + - rules + - serviceAccountName + properties: + rules: + type: array + items: + description: PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to. + type: object + required: + - verbs + properties: + apiGroups: + description: APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. + type: array + items: + type: string + nonResourceURLs: + description: NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both. + type: array + items: + type: string + resourceNames: + description: ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. + type: array + items: + type: string + resources: + description: Resources is a list of resources this rule applies to. ResourceAll represents all resources. + type: array + items: + type: string + verbs: + description: Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds. + type: array + items: + type: string + serviceAccountName: + type: string + strategy: + type: string + installModes: + description: InstallModes specify supported installation types + type: array + items: + description: InstallMode associates an InstallModeType with a flag representing if the CSV supports it + type: object + required: + - supported + - type + properties: + supported: + type: boolean + type: + description: InstallModeType is a supported type of install mode for CSV installation + type: string + keywords: + type: array + items: type: string - installModes: - description: InstallModes specify supported installation types - type: array - items: - description: InstallMode associates an InstallModeType with a flag - representing if the CSV supports it + labels: + description: Map of string keys and values that can be used to organize and categorize (scope and select) objects. type: object - required: - - supported - - type - properties: - supported: - type: boolean - type: - description: InstallModeType is a supported type of install - mode for CSV installation - type: string - keywords: - type: array - items: + additionalProperties: + type: string + links: + type: array + items: + type: object + properties: + name: + type: string + url: + type: string + maintainers: + type: array + items: + type: object + properties: + email: + type: string + name: + type: string + maturity: type: string - labels: - description: Map of string keys and values that can be used to organize - and categorize (scope and select) objects. - type: object - additionalProperties: + minKubeVersion: type: string - links: - type: array - items: + nativeAPIs: + type: array + items: + description: GroupVersionKind unambiguously identifies a kind. It doesn't anonymously include GroupVersion to avoid automatic coersion. It doesn't use a GroupVersion to avoid custom marshalling + type: object + required: + - group + - kind + - version + properties: + group: + type: string + kind: + type: string + version: + type: string + provider: type: object properties: name: type: string url: type: string - maintainers: - type: array - items: - type: object - properties: - email: - type: string - name: - type: string - maturity: - type: string - minKubeVersion: - type: string - nativeAPIs: - type: array - items: - description: GroupVersionKind unambiguously identifies a kind. It - doesn't anonymously include GroupVersion to avoid automatic coersion. It - doesn't use a GroupVersion to avoid custom marshalling + replaces: + description: The name of a CSV this one replaces. Should match the `metadata.Name` field of the old CSV. + type: string + selector: + description: Label selector for related resources. type: object - required: - - group - - kind - - version properties: - group: - type: string - kind: - type: string - version: - type: string - provider: - type: object - properties: - name: - type: string - url: - type: string - replaces: - description: The name of a CSV this one replaces. Should match the - `metadata.Name` field of the old CSV. - type: string - selector: - description: Label selector for related resources. - 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. + 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 - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies - to. + additionalProperties: + type: string + version: + description: OperatorVersion is a wrapper around semver.Version which supports correct marshaling to YAML and JSON. + type: string + webhookdefinitions: + type: array + items: + description: WebhookDescription provides details to OLM about required webhooks + type: object + required: + - admissionReviewVersions + - generateName + - sideEffects + - type + properties: + admissionReviewVersions: + type: array + items: type: string - operator: - description: operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. + containerPort: + type: integer + format: int32 + default: 443 + maximum: 65535 + minimum: 1 + conversionCRDs: + type: array + items: 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 - version: - description: OperatorVersion is a wrapper around semver.Version which - supports correct marshaling to YAML and JSON. - type: string - webhookdefinitions: - type: array - items: - description: WebhookDescription provides details to OLM about required - webhooks - type: object - required: - - admissionReviewVersions - - generateName - - sideEffects - - type - properties: - admissionReviewVersions: - type: array - items: + deploymentName: type: string - containerPort: - type: integer - format: int32 - default: 443 - maximum: 65535 - minimum: 1 - conversionCRDs: - type: array - items: + failurePolicy: type: string - deploymentName: - type: string - failurePolicy: - type: string - generateName: - type: string - matchPolicy: - description: MatchPolicyType specifies the type of match policy - type: string - objectSelector: - description: A label selector is a label query over a set of - resources. The result of matchLabels and matchExpressions - are ANDed. An empty label selector matches all objects. A - null label selector matches no objects. - 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 - reinvocationPolicy: - description: ReinvocationPolicyType specifies what type of policy - the admission hook uses. - type: string - rules: - type: array - items: - description: RuleWithOperations is a tuple of Operations and - Resources. It is recommended to make sure that all the tuple - expansions are valid. + generateName: + type: string + matchPolicy: + description: MatchPolicyType specifies the type of match policy + type: string + objectSelector: + description: A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects. type: object properties: - apiGroups: - description: APIGroups is the API groups the resources - belong to. '*' is all groups. If '*' is present, the - length of the slice must be one. Required. + 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 - apiVersions: - description: APIVersions is the API versions the resources - belong to. '*' is all versions. If '*' is present, the - length of the slice must be one. Required. - type: array - items: + reinvocationPolicy: + description: ReinvocationPolicyType specifies what type of policy the admission hook uses. + type: string + rules: + type: array + items: + description: RuleWithOperations is a tuple of Operations and Resources. It is recommended to make sure that all the tuple expansions are valid. + type: object + properties: + apiGroups: + description: APIGroups is the API groups the resources belong to. '*' is all groups. If '*' is present, the length of the slice must be one. Required. + type: array + items: + type: string + apiVersions: + description: APIVersions is the API versions the resources belong to. '*' is all versions. If '*' is present, the length of the slice must be one. Required. + type: array + items: + type: string + operations: + description: Operations is the operations the admission hook cares about - CREATE, UPDATE, DELETE, CONNECT or * for all of those operations and any future admission operations that are added. If '*' is present, the length of the slice must be one. Required. + type: array + items: + type: string + resources: + description: "Resources is a list of resources this rule applies to. \n For example: 'pods' means pods. 'pods/log' means the log subresource of pods. '*' means all resources, but not subresources. 'pods/*' means all subresources of pods. '*/scale' means all scale subresources. '*/*' means all resources and their subresources. \n If wildcard is present, the validation rule will ensure resources do not overlap with each other. \n Depending on the enclosing object, subresources might not be allowed. Required." + type: array + items: + type: string + scope: + description: scope specifies the scope of this rule. Valid values are "Cluster", "Namespaced", and "*" "Cluster" means that only cluster-scoped resources will match this rule. Namespace API objects are cluster-scoped. "Namespaced" means that only namespaced resources will match this rule. "*" means that there are no scope restrictions. Subresources match the scope of their parent resource. Default is "*". type: string - operations: - description: Operations is the operations the admission - hook cares about - CREATE, UPDATE, DELETE, CONNECT or - * for all of those operations and any future admission - operations that are added. If '*' is present, the length - of the slice must be one. Required. - type: array - items: + sideEffects: + type: string + targetPort: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + type: integer + format: int32 + type: + description: WebhookAdmissionType is the type of admission webhooks supported by OLM + type: string + enum: + - ValidatingAdmissionWebhook + - MutatingAdmissionWebhook + - ConversionWebhook + webhookPath: + type: string + status: + description: ClusterServiceVersionStatus represents information about the status of a pod. Status may trail the actual state of a system. + type: object + properties: + certsLastUpdated: + description: Last time the owned APIService certs were updated + type: string + format: date-time + certsRotateAt: + description: Time the owned APIService certs will rotate next + type: string + format: date-time + conditions: + description: List of conditions, a history of state transitions + type: array + items: + description: Conditions appear in the status as a record of state transitions on the ClusterServiceVersion + type: object + properties: + lastTransitionTime: + description: Last time the status transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time we updated the status + type: string + format: date-time + message: + description: A human readable message indicating details about why the ClusterServiceVersion is in this condition. + type: string + phase: + description: Condition of the ClusterServiceVersion + type: string + reason: + description: A brief CamelCase message indicating details about why the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' + type: string + lastTransitionTime: + description: Last time the status transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time we updated the status + type: string + format: date-time + message: + description: A human readable message indicating details about why the ClusterServiceVersion is in this condition. + type: string + phase: + description: Current condition of the ClusterServiceVersion + type: string + reason: + description: A brief CamelCase message indicating details about why the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' + type: string + requirementStatus: + description: The status of each requirement for this CSV + type: array + items: + type: object + required: + - group + - kind + - message + - name + - status + - version + properties: + dependents: + type: array + items: + description: DependentStatus is the status for a dependent requirement (to prevent infinite nesting) + type: object + required: + - group + - kind + - status + - version + properties: + group: type: string - resources: - description: "Resources is a list of resources this rule - applies to. \n For example: 'pods' means pods. 'pods/log' - means the log subresource of pods. '*' means all resources, - but not subresources. 'pods/*' means all subresources - of pods. '*/scale' means all scale subresources. '*/*' - means all resources and their subresources. \n If wildcard - is present, the validation rule will ensure resources - do not overlap with each other. \n Depending on the - enclosing object, subresources might not be allowed. - Required." - type: array - items: + kind: type: string - scope: - description: scope specifies the scope of this rule. Valid - values are "Cluster", "Namespaced", and "*" "Cluster" - means that only cluster-scoped resources will match - this rule. Namespace API objects are cluster-scoped. - "Namespaced" means that only namespaced resources will - match this rule. "*" means that there are no scope restrictions. - Subresources match the scope of their parent resource. - Default is "*". - type: string - sideEffects: - type: string - targetPort: - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - type: integer - format: int32 - type: - description: WebhookAdmissionType is the type of admission webhooks - supported by OLM - type: string - enum: - - ValidatingAdmissionWebhook - - MutatingAdmissionWebhook - - ConversionWebhook - webhookPath: - type: string - status: - description: ClusterServiceVersionStatus represents information about - the status of a pod. Status may trail the actual state of a system. - type: object - properties: - certsLastUpdated: - description: Last time the owned APIService certs were updated - type: string - format: date-time - certsRotateAt: - description: Time the owned APIService certs will rotate next - type: string - format: date-time - conditions: - description: List of conditions, a history of state transitions - type: array - items: - description: Conditions appear in the status as a record of state - transitions on the ClusterServiceVersion - type: object - properties: - lastTransitionTime: - description: Last time the status transitioned from one status - to another. - type: string - format: date-time - lastUpdateTime: - description: Last time we updated the status - type: string - format: date-time - message: - description: A human readable message indicating details about - why the ClusterServiceVersion is in this condition. - type: string - phase: - description: Condition of the ClusterServiceVersion - type: string - reason: - description: A brief CamelCase message indicating details about - why the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' - type: string - lastTransitionTime: - description: Last time the status transitioned from one status to - another. - type: string - format: date-time - lastUpdateTime: - description: Last time we updated the status - type: string - format: date-time - message: - description: A human readable message indicating details about why - the ClusterServiceVersion is in this condition. - type: string - phase: - description: Current condition of the ClusterServiceVersion - type: string - reason: - description: A brief CamelCase message indicating details about why - the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' - type: string - requirementStatus: - description: The status of each requirement for this CSV - type: array - items: - type: object - required: - - group - - kind - - message - - name - - status - - version - properties: - dependents: - type: array - items: - description: DependentStatus is the status for a dependent - requirement (to prevent infinite nesting) - type: object - required: - - group - - kind - - status - - version - properties: - group: - type: string - kind: - type: string - message: - type: string - status: - description: StatusReason is a camelcased reason for the - status of a RequirementStatus or DependentStatus - type: string - uuid: - type: string - version: - type: string - group: - type: string - kind: - type: string - message: - type: string - name: - type: string - status: - description: StatusReason is a camelcased reason for the status - of a RequirementStatus or DependentStatus - type: string - uuid: - type: string - version: - type: string - served: true - storage: true - subresources: - status: {} + message: + type: string + status: + description: StatusReason is a camelcased reason for the status of a RequirementStatus or DependentStatus + type: string + uuid: + type: string + version: + type: string + group: + type: string + kind: + type: string + message: + type: string + name: + type: string + status: + description: StatusReason is a camelcased reason for the status of a RequirementStatus or DependentStatus + type: string + uuid: + type: string + version: + type: string + served: true + storage: true + subresources: + status: {} diff --git a/deploy/chart/crds/0000_50_olm_00-installplans.crd.yaml b/deploy/chart/crds/0000_50_olm_00-installplans.crd.yaml index 1a837e1452..a57681d57e 100644 --- a/deploy/chart/crds/0000_50_olm_00-installplans.crd.yaml +++ b/deploy/chart/crds/0000_50_olm_00-installplans.crd.yaml @@ -2,302 +2,254 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: installplans.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: InstallPlan listKind: InstallPlanList plural: installplans shortNames: - - ip + - ip singular: installplan scope: Namespaced versions: - - additionalPrinterColumns: - - description: The first CSV in the list of clusterServiceVersionNames - jsonPath: .spec.clusterServiceVersionNames[0] - name: CSV - type: string - - description: The approval mode - jsonPath: .spec.approval - name: Approval - type: string - - jsonPath: .spec.approved - name: Approved - type: boolean - name: v1alpha1 - schema: - openAPIV3Schema: - description: InstallPlan defines the installation of a set of operators. - type: object - required: - - metadata - - 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: InstallPlanSpec defines a set of Application resources to - be installed - type: object - required: - - approval - - approved - - clusterServiceVersionNames - properties: - approval: - description: Approval is the user approval policy for an InstallPlan. - It must be one of "Automatic" or "Manual". - type: string - approved: - type: boolean - clusterServiceVersionNames: - type: array - items: + - additionalPrinterColumns: + - description: The first CSV in the list of clusterServiceVersionNames + jsonPath: .spec.clusterServiceVersionNames[0] + name: CSV + type: string + - description: The approval mode + jsonPath: .spec.approval + name: Approval + type: string + - jsonPath: .spec.approved + name: Approved + type: boolean + name: v1alpha1 + schema: + openAPIV3Schema: + description: InstallPlan defines the installation of a set of operators. + type: object + required: + - metadata + - 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: InstallPlanSpec defines a set of Application resources to be installed + type: object + required: + - approval + - approved + - clusterServiceVersionNames + properties: + approval: + description: Approval is the user approval policy for an InstallPlan. It must be one of "Automatic" or "Manual". type: string - generation: - type: integer - source: - type: string - sourceNamespace: - type: string - status: - description: "InstallPlanStatus represents the information about the status - of steps required to complete installation. \n Status may trail the - actual state of a system." - type: object - required: - - catalogSources - - phase - properties: - attenuatedServiceAccountRef: - description: AttenuatedServiceAccountRef references the service account - that is used to do scoped operator install. - type: object - properties: - apiVersion: - description: API version of the referent. + approved: + type: boolean + clusterServiceVersionNames: + type: array + items: type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - bundleLookups: - description: BundleLookups is the set of in-progress requests to pull - and unpackage bundle content to the cluster. - type: array - items: - description: BundleLookup is a request to pull and unpackage the - content of a bundle to the cluster. + generation: + type: integer + source: + type: string + sourceNamespace: + type: string + status: + description: "InstallPlanStatus represents the information about the status of steps required to complete installation. \n Status may trail the actual state of a system." + type: object + required: + - catalogSources + - phase + properties: + attenuatedServiceAccountRef: + description: AttenuatedServiceAccountRef references the service account that is used to do scoped operator install. type: object - required: - - catalogSourceRef - - identifier - - path - - replaces properties: - catalogSourceRef: - description: CatalogSourceRef is a reference to the CatalogSource - the bundle path was resolved from. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this pod). - This syntax is chosen only to have some well-defined way - of referencing a part of an object. TODO: this design - is not final and this field is subject to change in the - future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - conditions: - description: Conditions represents the overall state of a BundleLookup. - type: array - items: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + bundleLookups: + description: BundleLookups is the set of in-progress requests to pull and unpackage bundle content to the cluster. + type: array + items: + description: BundleLookup is a request to pull and unpackage the content of a bundle to the cluster. + type: object + required: + - catalogSourceRef + - identifier + - path + - replaces + properties: + catalogSourceRef: + description: CatalogSourceRef is a reference to the CatalogSource the bundle path was resolved from. type: object - required: - - status - - type properties: - lastTransitionTime: - description: Last time the condition transitioned from - one status to another. + apiVersion: + description: API version of the referent. type: string - format: date-time - lastUpdateTime: - description: Last time the condition was probed. + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' type: string - format: date-time - message: - description: A human readable message indicating details - about the transition. + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' type: string - reason: - description: The reason for the condition's last transition. + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string - status: - description: Status of the condition, one of True, False, - Unknown. + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' type: string - type: - description: Type of condition. + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' type: string - identifier: - description: Identifier is the catalog-unique name of the operator - (the name of the CSV for bundles that contain CSVs) - type: string - path: - description: Path refers to the location of a bundle to pull. - It's typically an image reference. - type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + conditions: + description: Conditions represents the overall state of a BundleLookup. + type: array + items: + type: object + required: + - status + - type + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time the condition was probed. + type: string + format: date-time + message: + description: A human readable message indicating details about the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type of condition. + type: string + identifier: + description: Identifier is the catalog-unique name of the operator (the name of the CSV for bundles that contain CSVs) + type: string + path: + description: Path refers to the location of a bundle to pull. It's typically an image reference. + type: string + properties: + description: The effective properties of the unpacked bundle. + type: string + replaces: + description: Replaces is the name of the bundle to replace with the one found at Path. + type: string + catalogSources: + type: array + items: + type: string + conditions: + type: array + items: + description: InstallPlanCondition represents the overall status of the execution of an InstallPlan. + type: object properties: - description: The effective properties of the unpacked bundle. - type: string - replaces: - description: Replaces is the name of the bundle to replace with - the one found at Path. - type: string - catalogSources: - type: array - items: + lastTransitionTime: + type: string + format: date-time + lastUpdateTime: + type: string + format: date-time + message: + type: string + reason: + description: ConditionReason is a camelcased reason for the state transition. + type: string + status: + type: string + type: + description: InstallPlanConditionType describes the state of an InstallPlan at a certain point as a whole. + type: string + phase: + description: InstallPlanPhase is the current status of a InstallPlan as a whole. type: string - conditions: - type: array - items: - description: InstallPlanCondition represents the overall status - of the execution of an InstallPlan. - type: object - properties: - lastTransitionTime: - type: string - format: date-time - lastUpdateTime: - type: string - format: date-time - message: - type: string - reason: - description: ConditionReason is a camelcased reason for the - state transition. - type: string - status: - type: string - type: - description: InstallPlanConditionType describes the state of - an InstallPlan at a certain point as a whole. - type: string - phase: - description: InstallPlanPhase is the current status of a InstallPlan - as a whole. - type: string - plan: - type: array - items: - description: Step represents the status of an individual step in - an InstallPlan. - type: object - required: - - resolving - - resource - - status - properties: - resolving: - type: string - resource: - description: StepResource represents the status of a resource - to be tracked by an InstallPlan. - type: object - required: - - group - - kind - - name - - sourceName - - sourceNamespace - - version - properties: - group: - type: string - kind: - type: string - manifest: - type: string - name: - type: string - sourceName: - type: string - sourceNamespace: - type: string - version: - type: string - status: - description: StepStatus is the current status of a particular - resource an in InstallPlan - type: string - served: true - storage: true - subresources: - status: {} + plan: + type: array + items: + description: Step represents the status of an individual step in an InstallPlan. + type: object + required: + - resolving + - resource + - status + properties: + resolving: + type: string + resource: + description: StepResource represents the status of a resource to be tracked by an InstallPlan. + type: object + required: + - group + - kind + - name + - sourceName + - sourceNamespace + - version + properties: + group: + type: string + kind: + type: string + manifest: + type: string + name: + type: string + sourceName: + type: string + sourceNamespace: + type: string + version: + type: string + status: + description: StepStatus is the current status of a particular resource an in InstallPlan + type: string + served: true + storage: true + subresources: + status: {} diff --git a/deploy/chart/crds/0000_50_olm_00-operatorconditions.crd.yaml b/deploy/chart/crds/0000_50_olm_00-operatorconditions.crd.yaml index 56b22b3d3a..3b3a7cc0be 100644 --- a/deploy/chart/crds/0000_50_olm_00-operatorconditions.crd.yaml +++ b/deploy/chart/crds/0000_50_olm_00-operatorconditions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: operatorconditions.operators.coreos.com spec: @@ -14,185 +14,124 @@ spec: singular: operatorcondition scope: Namespaced versions: - - name: v1 - schema: - openAPIV3Schema: - description: OperatorCondition is a Custom Resource of type `OperatorCondition` - which is used to convey information to OLM about the state of an operator. - type: object - required: - - metadata - 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: OperatorConditionSpec allows a cluster admin to convey information - about the state of an operator to OLM, potentially overriding state - reported by the operator. - type: object - properties: - deployments: - type: array - items: - type: string - overrides: - 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, - 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])$ - serviceAccounts: - type: array - items: - type: string - status: - description: OperatorConditionStatus allows an operator to convey information - its state to OLM. The status may trail the actual state of a system. - type: object - properties: - conditions: - 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, - 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])$ - served: true - storage: true - subresources: - status: {} + - name: v1 + schema: + openAPIV3Schema: + description: OperatorCondition is a Custom Resource of type `OperatorCondition` which is used to convey information to OLM about the state of an operator. + type: object + required: + - metadata + 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: OperatorConditionSpec allows a cluster admin to convey information about the state of an operator to OLM, potentially overriding state reported by the operator. + type: object + properties: + deployments: + type: array + items: + type: string + overrides: + 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, 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: + - 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])$ + serviceAccounts: + type: array + items: + type: string + status: + description: OperatorConditionStatus allows an operator to convey information its state to OLM. The status may trail the actual state of a system. + type: object + properties: + conditions: + 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, 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])$ + served: true + storage: true + subresources: + status: {} diff --git a/deploy/chart/crds/0000_50_olm_00-operatorgroups.crd.yaml b/deploy/chart/crds/0000_50_olm_00-operatorgroups.crd.yaml index 2381cb446b..54f09643ff 100644 --- a/deploy/chart/crds/0000_50_olm_00-operatorgroups.crd.yaml +++ b/deploy/chart/crds/0000_50_olm_00-operatorgroups.crd.yaml @@ -2,303 +2,231 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: operatorgroups.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: OperatorGroup listKind: OperatorGroupList plural: operatorgroups shortNames: - - og + - og singular: operatorgroup scope: Namespaced versions: - - name: v1 - schema: - openAPIV3Schema: - description: OperatorGroup is the unit of multitenancy for OLM managed operators. - It constrains the installation of operators in its namespace to a specified - set of target namespaces. - type: object - required: - - metadata - 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: OperatorGroupSpec is the spec for an OperatorGroup resource. - type: object - properties: - selector: - description: Selector selects the OperatorGroup's target namespaces. - 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: + - name: v1 + schema: + openAPIV3Schema: + description: OperatorGroup is the unit of multitenancy for OLM managed operators. It constrains the installation of operators in its namespace to a specified set of target namespaces. + type: object + required: + - metadata + 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: OperatorGroupSpec is the spec for an OperatorGroup resource. + type: object + properties: + selector: + description: Selector selects the OperatorGroup's target namespaces. + 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 - 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 - serviceAccountName: - description: ServiceAccountName is the admin specified service account - which will be used to deploy operator(s) in this operator group. - type: string - staticProvidedAPIs: - description: Static tells OLM not to update the OperatorGroup's providedAPIs - annotation - type: boolean - targetNamespaces: - description: TargetNamespaces is an explicit set of namespaces to - target. If it is set, Selector is ignored. - type: array - items: - type: string - x-kubernetes-list-type: set - status: - description: OperatorGroupStatus is the status for an OperatorGroupResource. - type: object - required: - - lastUpdated - properties: - lastUpdated: - description: LastUpdated is a timestamp of the last time the OperatorGroup's - status was Updated. - type: string - format: date-time - namespaces: - description: Namespaces is the set of target namespaces for the OperatorGroup. - type: array - items: + 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 + serviceAccountName: + description: ServiceAccountName is the admin specified service account which will be used to deploy operator(s) in this operator group. type: string - x-kubernetes-list-type: set - serviceAccountRef: - description: ServiceAccountRef references the service account object - specified. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + staticProvidedAPIs: + description: Static tells OLM not to update the OperatorGroup's providedAPIs annotation + type: boolean + targetNamespaces: + description: TargetNamespaces is an explicit set of namespaces to target. If it is set, Selector is ignored. + type: array + items: type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + x-kubernetes-list-type: set + status: + description: OperatorGroupStatus is the status for an OperatorGroupResource. + type: object + required: + - lastUpdated + properties: + lastUpdated: + description: LastUpdated is a timestamp of the last time the OperatorGroup's status was Updated. + type: string + format: date-time + namespaces: + description: Namespaces is the set of target namespaces for the OperatorGroup. + type: array + items: type: string - served: true - storage: true - subresources: - status: {} - - name: v1alpha2 - schema: - openAPIV3Schema: - description: OperatorGroup is the unit of multitenancy for OLM managed operators. - It constrains the installation of operators in its namespace to a specified - set of target namespaces. - type: object - required: - - metadata - 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: OperatorGroupSpec is the spec for an OperatorGroup resource. - type: object - properties: - selector: - description: Selector selects the OperatorGroup's target namespaces. - 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: + x-kubernetes-list-type: set + serviceAccountRef: + description: ServiceAccountRef references the service account object specified. + type: object + properties: + apiVersion: + description: API version of the referent. type: string - serviceAccountName: - description: ServiceAccountName is the admin specified service account - which will be used to deploy operator(s) in this operator group. - type: string - staticProvidedAPIs: - description: Static tells OLM not to update the OperatorGroup's providedAPIs - annotation - type: boolean - targetNamespaces: - description: TargetNamespaces is an explicit set of namespaces to - target. If it is set, Selector is ignored. - type: array - items: - type: string - status: - description: OperatorGroupStatus is the status for an OperatorGroupResource. - type: object - required: - - lastUpdated - properties: - lastUpdated: - description: LastUpdated is a timestamp of the last time the OperatorGroup's - status was Updated. - type: string - format: date-time - namespaces: - description: Namespaces is the set of target namespaces for the OperatorGroup. - type: array - items: + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + served: true + storage: true + subresources: + status: {} + - name: v1alpha2 + schema: + openAPIV3Schema: + description: OperatorGroup is the unit of multitenancy for OLM managed operators. It constrains the installation of operators in its namespace to a specified set of target namespaces. + type: object + required: + - metadata + 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: OperatorGroupSpec is the spec for an OperatorGroup resource. + type: object + properties: + selector: + description: Selector selects the OperatorGroup's target namespaces. + 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 + serviceAccountName: + description: ServiceAccountName is the admin specified service account which will be used to deploy operator(s) in this operator group. type: string - serviceAccountRef: - description: ServiceAccountRef references the service account object - specified. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + staticProvidedAPIs: + description: Static tells OLM not to update the OperatorGroup's providedAPIs annotation + type: boolean + targetNamespaces: + description: TargetNamespaces is an explicit set of namespaces to target. If it is set, Selector is ignored. + type: array + items: type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + status: + description: OperatorGroupStatus is the status for an OperatorGroupResource. + type: object + required: + - lastUpdated + properties: + lastUpdated: + description: LastUpdated is a timestamp of the last time the OperatorGroup's status was Updated. + type: string + format: date-time + namespaces: + description: Namespaces is the set of target namespaces for the OperatorGroup. + type: array + items: type: string - served: true - storage: false - subresources: - status: {} + serviceAccountRef: + description: ServiceAccountRef references the service account object specified. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + served: true + storage: false + subresources: + status: {} diff --git a/deploy/chart/crds/0000_50_olm_00-operators.crd.yaml b/deploy/chart/crds/0000_50_olm_00-operators.crd.yaml index 10fd4a2c80..a1226a521f 100644 --- a/deploy/chart/crds/0000_50_olm_00-operators.crd.yaml +++ b/deploy/chart/crds/0000_50_olm_00-operators.crd.yaml @@ -2,175 +2,136 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: operators.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: Operator listKind: OperatorList plural: operators singular: operator scope: Cluster versions: - - name: v1 - schema: - openAPIV3Schema: - description: Operator represents a cluster operator. - 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: OperatorSpec defines the desired state of Operator - type: object - status: - description: OperatorStatus defines the observed state of an Operator - and its components - type: object - properties: - components: - description: Components describes resources that compose the operator. - type: object - required: - - labelSelector - properties: - labelSelector: - description: LabelSelector is a label query over a set of resources - used to select the operator's components - 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 - refs: - description: Refs are a set of references to the operator's component - resources, selected with LabelSelector. - type: array - items: - description: RichReference is a reference to a resource, enriched - with its status conditions. + - name: v1 + schema: + openAPIV3Schema: + description: Operator represents a cluster operator. + 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: OperatorSpec defines the desired state of Operator + type: object + status: + description: OperatorStatus defines the observed state of an Operator and its components + type: object + properties: + components: + description: Components describes resources that compose the operator. + type: object + required: + - labelSelector + properties: + labelSelector: + description: LabelSelector is a label query over a set of resources used to select the operator's components type: object properties: - apiVersion: - description: API version of the referent. - type: string - conditions: - description: Conditions represents the latest state of the - component. + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. type: array items: - description: Condition represent the latest available - observations of an component's state. + 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: - - status - - type + - key + - operator properties: - lastTransitionTime: - description: Last time the condition transitioned - from one status to another. - type: string - format: date-time - lastUpdateTime: - description: Last time the condition was probed - type: string - format: date-time - message: - description: A human readable message indicating details - about the transition. + key: + description: key is the label key that the selector applies to. type: string - reason: - description: The reason for the condition's last transition. + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. type: string - status: - description: Status of the condition, one of True, - False, Unknown. - type: string - type: - description: Type of condition. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this pod). - This syntax is chosen only to have some well-defined way - of referencing a part of an object. TODO: this design - is not final and this field is subject to change in the - future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - served: true - storage: true - subresources: - status: {} + 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 + refs: + description: Refs are a set of references to the operator's component resources, selected with LabelSelector. + type: array + items: + description: RichReference is a reference to a resource, enriched with its status conditions. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + conditions: + description: Conditions represents the latest state of the component. + type: array + items: + description: Condition represent the latest available observations of an component's state. + type: object + required: + - status + - type + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time the condition was probed + type: string + format: date-time + message: + description: A human readable message indicating details about the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type of condition. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + served: true + storage: true + subresources: + status: {} diff --git a/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml b/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml index 03b000332a..d2fb81feda 100644 --- a/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml +++ b/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml @@ -2,2080 +2,1340 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: subscriptions.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: Subscription listKind: SubscriptionList plural: subscriptions shortNames: - - sub - - subs + - sub + - subs singular: subscription scope: Namespaced versions: - - additionalPrinterColumns: - - description: The package subscribed to - jsonPath: .spec.name - name: Package - type: string - - description: The catalog source for the specified package - jsonPath: .spec.source - name: Source - type: string - - description: The channel of updates to subscribe to - jsonPath: .spec.channel - name: Channel - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: Subscription keeps operators up to date by tracking changes to - Catalogs. - type: object - required: - - metadata - - 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: SubscriptionSpec defines an Application that can be installed - type: object - required: - - name - - source - - sourceNamespace - properties: - channel: - type: string - config: - description: SubscriptionConfig contains configuration specified for - a subscription. - type: object - properties: - env: - description: Env is a list of environment variables to set in - the container. Cannot be updated. - 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 previous 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. The $(VAR_NAME) syntax can be - escaped with a double $$, ie: $$(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 - 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 - 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 - 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 - envFrom: - description: EnvFrom is a list of sources to populate environment - variables in the container. The keys defined within a source - must be a C_IDENTIFIER. All invalid keys will be reported as - an event when the container is starting. When a key exists in - multiple sources, the value associated with the last source - will take precedence. Values defined by an Env with a duplicate - key will take precedence. Immutable. - type: array - items: - description: EnvFromSource represents the source of a set of - ConfigMaps - type: object - properties: - configMapRef: - description: The ConfigMap to select from - type: object - properties: - 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 must be defined - type: boolean - prefix: - description: An optional identifier to prepend to each key - in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - type: object - properties: - 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 must be defined - type: boolean - nodeSelector: - description: 'NodeSelector is a selector which must be true for - the pod to fit on a node. Selector which must match a node''s - labels for the pod to be scheduled on that node. More info: - https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - resources: - description: 'Resources represents compute resources required - by this container. Immutable. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - properties: - limits: - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + - additionalPrinterColumns: + - description: The package subscribed to + jsonPath: .spec.name + name: Package + type: string + - description: The catalog source for the specified package + jsonPath: .spec.source + name: Source + type: string + - description: The channel of updates to subscribe to + jsonPath: .spec.channel + name: Channel + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: Subscription keeps operators up to date by tracking changes to Catalogs. + type: object + required: + - metadata + - 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: SubscriptionSpec defines an Application that can be installed + type: object + required: + - name + - source + - sourceNamespace + properties: + channel: + type: string + config: + description: SubscriptionConfig contains configuration specified for a subscription. + type: object + properties: + env: + description: Env is a list of environment variables to set in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable present in a Container. 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 previous 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. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(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 + 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 + 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 + 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 + envFrom: + description: EnvFrom is a list of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Immutable. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps 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 - selector: - description: Selector is the label selector for pods to be configured. - Existing ReplicaSets whose pods are selected by this will be - the ones affected by this deployment. It must match the pod - template's labels. - 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: + properties: + configMapRef: + description: The ConfigMap to select from + type: object + properties: + 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 - 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 - tolerations: - description: Tolerations are the pod's tolerations. - type: array - items: - description: The pod this Toleration is attached to tolerates - any taint that matches the triple using - the matching operator . + optional: + description: Specify whether the ConfigMap must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + type: object + properties: + 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 must be defined + type: boolean + nodeSelector: + description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' 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 - volumeMounts: - description: List of VolumeMounts to set in the container. - type: array - items: - description: VolumeMount describes a mounting of a Volume within - a container. + additionalProperties: + type: string + resources: + description: 'Resources represents compute resources required by this container. Immutable. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object - required: - - mountPath - - name properties: - mountPath: - description: Path within the container at which the volume - should be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts are - propagated from the host to container and the other way - around. When not set, MountPropagationNone is used. This - field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. - type: boolean - subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. Behaves similarly - to SubPath but environment variable references $(VAR_NAME) - are expanded using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath are mutually - exclusive. - type: string - volumes: - description: List of Volumes to set in the podSpec. - type: array - items: - description: Volume represents a named volume in a pod that - may be accessed by any container in the pod. - type: object - required: - - name - properties: - awsElasticBlockStore: - description: 'AWSElasticBlockStore represents an AWS Disk - resource that is attached to a kubelet''s host machine - and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: object - required: - - volumeID - properties: - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - partition: - description: 'The partition in the volume that you want - to mount. If omitted, the default is to mount by volume - name. Examples: For volume /dev/sda1, you specify - the partition as "1". Similarly, the volume partition - for /dev/sda is "0" (or you can leave the property - empty).' - type: integer - format: int32 - readOnly: - description: 'Specify "true" to force and set the ReadOnly - property in VolumeMounts to "true". If omitted, the - default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: boolean - volumeID: - description: 'Unique ID of the persistent disk resource - in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - azureDisk: - description: AzureDisk represents an Azure Data Disk mount - on the host and bind mount to the pod. + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object - required: - - diskName - - diskURI - properties: - cachingMode: - description: 'Host Caching mode: None, Read Only, Read - Write.' - type: string - diskName: - description: The Name of the data disk in the blob storage - type: string - diskURI: - description: The URI the data disk in the blob storage - type: string - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - kind: - description: 'Expected values Shared: multiple blob - disks per storage account Dedicated: single blob - disk per storage account Managed: azure managed data - disk (only in managed availability set). defaults - to shared' - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - azureFile: - description: AzureFile represents an Azure File Service - mount on the host and bind mount to the pod. - type: object - required: - - secretName - - shareName - properties: - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - secretName: - description: the name of secret that contains Azure - Storage Account Name and Key - type: string - shareName: - description: Share Name - type: string - cephfs: - description: CephFS represents a Ceph FS mount on the host - that shares a pod's lifetime + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object - required: - - monitors - properties: - monitors: - description: 'Required: Monitors is a collection of - Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: array - items: + 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 + selector: + description: Selector is the label selector for pods to be configured. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment. It must match the pod template's labels. + 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 - path: - description: 'Optional: Used as the mounted root, rather - than the full Ceph tree, default is /' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts. - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: boolean - secretFile: - description: 'Optional: SecretFile is the path to key - ring for User, default is /etc/ceph/user.secret More - info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - secretRef: - description: 'Optional: SecretRef is reference to the - authentication secret for User, default is empty. - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: object - properties: - 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?' + 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 - user: - description: 'Optional: User is the rados user name, - default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - cinder: - description: 'Cinder represents a cinder volume attached - and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + 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 - required: - - volumeID - properties: - fsType: - description: 'Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: boolean - secretRef: - description: 'Optional: points to a secret object containing - parameters used to connect to OpenStack.' - type: object - properties: - 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?' + additionalProperties: + type: string + tolerations: + description: Tolerations are the pod's tolerations. + 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 + volumeMounts: + description: List of VolumeMounts to set in the container. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. + type: object + required: + - mountPath + - name + properties: + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. + type: string + volumes: + description: List of Volumes to set in the podSpec. + type: array + items: + description: Volume represents a named volume in a pod that may be accessed by any container in the pod. + type: object + required: + - name + properties: + awsElasticBlockStore: + description: 'AWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty).' + type: integer + format: int32 + readOnly: + description: 'Specify "true" to force and set the ReadOnly property in VolumeMounts to "true". If omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + volumeID: + description: 'Unique ID of the persistent disk resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + azureDisk: + description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. + type: object + required: + - diskName + - diskURI + properties: + cachingMode: + description: 'Host Caching mode: None, Read Only, Read Write.' + type: string + diskName: + description: The Name of the data disk in the blob storage + type: string + diskURI: + description: The URI the data disk in the blob storage + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + kind: + description: 'Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + azureFile: + description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. + type: object + required: + - secretName + - shareName + properties: + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretName: + description: the name of secret that contains Azure Storage Account Name and Key + type: string + shareName: + description: Share Name + type: string + cephfs: + description: CephFS represents a Ceph FS mount on the host that shares a pod's lifetime + type: object + required: + - monitors + properties: + monitors: + description: 'Required: Monitors is a collection of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: type: string - volumeID: - description: 'volume id used to identify the volume - in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - configMap: - description: ConfigMap represents a configMap that should - populate this volume - type: object - properties: - defaultMode: - description: 'Optional: mode bits used to set permissions - on created files by default. Must be an octal value - between 0000 and 0777 or a decimal value between 0 - and 511. YAML accepts both octal and decimal values, - JSON requires decimal values for mode bits. Defaults - to 0644. Directories within the path are not affected - by this setting. This might be in conflict with other - options that affect the file mode, like fsGroup, and - the result can be other mode bits set.' - type: integer - format: int32 - items: - description: If unspecified, each key-value pair in - the Data field of the referenced ConfigMap will be - projected into the volume as a file whose name is - the key and content is the value. If specified, the - listed keys will be projected into the specified paths, - and unlisted keys will not be present. If a key is - specified which is not present in the ConfigMap, the - volume setup will error unless it is marked optional. - Paths must be relative and may not contain the '..' - path or start with '..'. - type: array - items: - description: Maps a string key to a path within a - volume. + path: + description: 'Optional: Used as the mounted root, rather than the full Ceph tree, default is /' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + secretFile: + description: 'Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + secretRef: + description: 'Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: object - required: - - key - - path properties: - key: - description: The key to project. + 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 - mode: - description: 'Optional: mode bits used to set - permissions on this file. Must be an octal value - between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal - values, JSON requires decimal values for mode - bits. If not specified, the volume defaultMode - will be used. This might be in conflict with - other options that affect the file mode, like - fsGroup, and the result can be other mode bits - set.' - type: integer - format: int32 - path: - description: The relative path of the file to - map the key to. May not be an absolute path. - May not contain the path element '..'. May not - start with the string '..'. + user: + description: 'Optional: User is the rados user name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + cinder: + description: 'Cinder represents a cinder volume attached and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + secretRef: + description: 'Optional: points to a secret object containing parameters used to connect to OpenStack.' + type: object + properties: + 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 - 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 keys - must be defined - type: boolean - csi: - description: CSI (Container Storage Interface) represents - ephemeral storage that is handled by certain external - CSI drivers (Beta feature). - type: object - required: - - driver - properties: - driver: - description: Driver is the name of the CSI driver that - handles this volume. Consult with your admin for the - correct name as registered in the cluster. - type: string - fsType: - description: Filesystem type to mount. Ex. "ext4", "xfs", - "ntfs". If not provided, the empty value is passed - to the associated CSI driver which will determine - the default filesystem to apply. - type: string - nodePublishSecretRef: - description: NodePublishSecretRef is a reference to - the secret object containing sensitive information - to pass to the CSI driver to complete the CSI NodePublishVolume - and NodeUnpublishVolume calls. This field is optional, - and may be empty if no secret is required. If the - secret object contains more than one secret, all secret - references are passed. - type: object - properties: - 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 - readOnly: - description: Specifies a read-only configuration for - the volume. Defaults to false (read/write). - type: boolean - volumeAttributes: - description: VolumeAttributes stores driver-specific - properties that are passed to the CSI driver. Consult - your driver's documentation for supported values. - type: object - additionalProperties: - type: string - downwardAPI: - description: DownwardAPI represents downward API about the - pod that should populate this volume - type: object - properties: - defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a Optional: mode bits used - to set permissions on created files by default. Must - be an octal value between 0000 and 0777 or a decimal - value between 0 and 511. YAML accepts both octal and - decimal values, JSON requires decimal values for mode - bits. Defaults to 0644. Directories within the path - are not affected by this setting. This might be in - conflict with other options that affect the file mode, - like fsGroup, and the result can be other mode bits - set.' - type: integer - format: int32 - items: - description: Items is a list of downward API volume - file - type: array + volumeID: + description: 'volume id used to identify the volume in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + configMap: + description: ConfigMap represents a configMap that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 items: - description: DownwardAPIVolumeFile represents information - to create the file containing the pod field + description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 keys must be defined + type: boolean + csi: + description: CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the CSI driver that handles this volume. Consult with your admin for the correct name as registered in the cluster. + type: string + fsType: + description: Filesystem type to mount. Ex. "ext4", "xfs", "ntfs". If not provided, the empty value is passed to the associated CSI driver which will determine the default filesystem to apply. + type: string + nodePublishSecretRef: + description: NodePublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodePublishVolume and NodeUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secret references are passed. type: object - required: - - path properties: - fieldRef: - description: 'Required: Selects a field of the - pod: only annotations, labels, name and namespace - are supported.' - 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 - mode: - description: 'Optional: mode bits used to set - permissions on this file, must be an octal value - between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal - values, JSON requires decimal values for mode - bits. If not specified, the volume defaultMode - will be used. This might be in conflict with - other options that affect the file mode, like - fsGroup, and the result can be other mode bits - set.' - type: integer - format: int32 - path: - description: 'Required: Path is the relative - path name of the file to be created. Must not - be absolute or contain the ''..'' path. Must - be utf-8 encoded. The first item of the relative - path must not start with ''..''' + 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 - resourceFieldRef: - description: 'Selects a resource of the container: - only resources limits and requests (limits.cpu, - limits.memory, requests.cpu and requests.memory) - 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 - emptyDir: - description: 'EmptyDir represents a temporary directory - that shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: object - properties: - medium: - description: 'What type of storage medium should back - this directory. The default is "" which means to use - the node''s default medium. Must be an empty string - (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: string - sizeLimit: - description: 'Total amount of local storage required - for this EmptyDir volume. The size limit is also applicable - for memory medium. The maximum usage on memory medium - EmptyDir would be the minimum value between the SizeLimit - specified here and the sum of memory limits of all - containers in a pod. The default is nil which means - that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' - 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 - ephemeral: - description: "Ephemeral represents a volume that is handled - by a cluster storage driver (Alpha feature). The volume's - lifecycle is tied to the pod that defines it - it will - be created before the pod starts, and deleted when the - pod is removed. \n Use this if: a) the volume is only - needed while the pod runs, b) features of normal volumes - like restoring from snapshot or capacity tracking are - needed, c) the storage driver is specified through a storage - class, and d) the storage driver supports dynamic volume - provisioning through a PersistentVolumeClaim (see EphemeralVolumeSource - for more information on the connection between this - volume type and PersistentVolumeClaim). \n Use PersistentVolumeClaim - or one of the vendor-specific APIs for volumes that persist - for longer than the lifecycle of an individual pod. \n - Use CSI for light-weight local ephemeral volumes if the - CSI driver is meant to be used that way - see the documentation - of the driver for more information. \n A pod can use both - types of ephemeral volumes and persistent volumes at the - same time." - type: object - properties: - readOnly: - description: Specifies a read-only configuration for - the volume. Defaults to false (read/write). - type: boolean - volumeClaimTemplate: - description: "Will be used to create a stand-alone PVC - to provision the volume. The pod in which this EphemeralVolumeSource - is embedded will be the owner of the PVC, i.e. the - PVC will be deleted together with the pod. The name - of the PVC will be `-` where - `` is the name from the `PodSpec.Volumes` - array entry. Pod validation will reject the pod if - the concatenated name is not valid for a PVC (for - example, too long). \n An existing PVC with that name - that is not owned by the pod will *not* be used for - the pod to avoid using an unrelated volume by mistake. - Starting the pod is then blocked until the unrelated - PVC is removed. If such a pre-created PVC is meant - to be used by the pod, the PVC has to updated with - an owner reference to the pod once the pod exists. - Normally this should not be necessary, but it may - be useful when manually reconstructing a broken cluster. - \n This field is read-only and no changes will be - made by Kubernetes to the PVC after it has been created. - \n Required, must not be nil." - type: object - required: - - spec - properties: - metadata: - description: May contain labels and annotations - that will be copied into the PVC when creating - it. No other fields are allowed and will be rejected - during validation. - type: object - spec: - description: The specification for the PersistentVolumeClaim. - The entire content is copied unchanged into the - PVC that gets created from this template. The - same fields as in a PersistentVolumeClaim are - also valid here. + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeAttributes: + description: VolumeAttributes stores driver-specific properties that are passed to the CSI driver. Consult your driver's documentation for supported values. + type: object + additionalProperties: + type: string + downwardAPI: + description: DownwardAPI represents downward API about the pod that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created files by default. Must be a Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: Items is a list of downward API volume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field type: object + required: + - path properties: - accessModes: - description: 'AccessModes contains the desired - access modes the volume should have. More - info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' - type: array - items: - type: string - dataSource: - description: 'This field can be used to specify - either: * An existing VolumeSnapshot object - (snapshot.storage.k8s.io/VolumeSnapshot - - Beta) * An existing PVC (PersistentVolumeClaim) - * An existing custom resource/object that - implements data population (Alpha) In order - to use VolumeSnapshot object types, the appropriate - feature gate must be enabled (VolumeSnapshotDataSource - or AnyVolumeDataSource) If the provisioner - or an external controller can support the - specified data source, it will create a new - volume based on the contents of the specified - data source. If the specified data source - is not supported, the volume will not be created - and the failure will be reported as an event. - In the future, we plan to support more data - source types and the behavior of the provisioner - may change.' + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' type: object required: - - kind - - name + - fieldPath properties: - apiGroup: - description: APIGroup is the group for the - resource being referenced. If APIGroup - is not specified, the specified Kind must - be in the core API group. For any other - third-party types, APIGroup is required. + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". type: string - kind: - description: Kind is the type of resource - being referenced + fieldPath: + description: Path of the field to select in the specified API version. type: string - name: - description: Name is the name of resource - being referenced - type: string - resources: - description: 'Resources represents the minimum - resources the volume should have. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: 'Required: Path is the relative path name of the file to be created. Must not be absolute or contain the ''..'' path. Must be utf-8 encoded. The first item of the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.' type: object + required: + - resource properties: - limits: - description: 'Limits describes the maximum - amount of compute resources allowed. More - info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: + 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 - selector: - description: A label query over volumes to consider - for binding. - 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 - storageClassName: - description: 'Name of the StorageClass required - by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' - type: string - volumeMode: - description: volumeMode defines what type of - volume is required by the claim. Value of - Filesystem is implied when not included in - claim spec. - type: string - volumeName: - description: VolumeName is the binding reference - to the PersistentVolume backing this claim. - type: string - fc: - description: FC represents a Fibre Channel resource that - is attached to a kubelet's host machine and then exposed - to the pod. - type: object - properties: - fsType: - description: 'Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. TODO: how do we prevent errors in the - filesystem from compromising the machine' - type: string - lun: - description: 'Optional: FC target lun number' - type: integer - format: int32 - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts.' - type: boolean - targetWWNs: - description: 'Optional: FC target worldwide names (WWNs)' - type: array - items: - type: string - wwids: - description: 'Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs - and lun must be set, but not both simultaneously.' - type: array - items: - type: string - flexVolume: - description: FlexVolume represents a generic volume resource - that is provisioned/attached using an exec based plugin. - type: object - required: - - driver - properties: - driver: - description: Driver is the name of the driver to use - for this volume. - type: string - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". The default filesystem depends on FlexVolume - script. - type: string - options: - description: 'Optional: Extra command options if any.' - type: object - additionalProperties: - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts.' - type: boolean - secretRef: - description: 'Optional: SecretRef is reference to the - secret object containing sensitive information to - pass to the plugin scripts. This may be empty if no - secret object is specified. If the secret object contains - more than one secret, all secrets are passed to the - plugin scripts.' - type: object - properties: - 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 - flocker: - description: Flocker represents a Flocker volume attached - to a kubelet's host machine. This depends on the Flocker - control service being running - type: object - properties: - datasetName: - description: Name of the dataset stored as metadata - -> name on the dataset for Flocker should be considered - as deprecated - type: string - datasetUUID: - description: UUID of the dataset. This is unique identifier - of a Flocker dataset - type: string - gcePersistentDisk: - description: 'GCEPersistentDisk represents a GCE Disk resource - that is attached to a kubelet''s host machine and then - exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: object - required: - - pdName - properties: - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - partition: - description: 'The partition in the volume that you want - to mount. If omitted, the default is to mount by volume - name. Examples: For volume /dev/sda1, you specify - the partition as "1". Similarly, the volume partition - for /dev/sda is "0" (or you can leave the property - empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: integer - format: int32 - pdName: - description: 'Unique name of the PD resource in GCE. - Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: boolean - gitRepo: - description: 'GitRepo represents a git repository at a particular - revision. DEPRECATED: GitRepo is deprecated. To provision - a container with a git repo, mount an EmptyDir into an - InitContainer that clones the repo using git, then mount - the EmptyDir into the Pod''s container.' - type: object - required: - - repository - properties: - directory: - description: Target directory name. Must not contain - or start with '..'. If '.' is supplied, the volume - directory will be the git repository. Otherwise, - if specified, the volume will contain the git repository - in the subdirectory with the given name. - type: string - repository: - description: Repository URL - type: string - revision: - description: Commit hash for the specified revision. - type: string - glusterfs: - description: 'Glusterfs represents a Glusterfs mount on - the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' - type: object - required: - - endpoints - - path - properties: - endpoints: - description: 'EndpointsName is the endpoint name that - details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - path: - description: 'Path is the Glusterfs volume path. More - info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - readOnly: - description: 'ReadOnly here will force the Glusterfs - volume to be mounted with read-only permissions. Defaults - to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: boolean - hostPath: - description: 'HostPath represents a pre-existing file or - directory on the host machine that is directly exposed - to the container. This is generally used for system agents - or other privileged things that are allowed to see the - host machine. Most containers will NOT need this. More - info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath - --- TODO(jonesdl) We need to restrict who can use host - directory mounts and who can/can not mount host directories - as read/write.' - type: object - required: - - path - properties: - path: - description: 'Path of the directory on the host. If - the path is a symlink, it will follow the link to - the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - type: - description: 'Type for HostPath Volume Defaults to "" - More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - iscsi: - description: 'ISCSI represents an ISCSI Disk resource that - is attached to a kubelet''s host machine and then exposed - to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' - type: object - required: - - iqn - - lun - - targetPortal - properties: - chapAuthDiscovery: - description: whether support iSCSI Discovery CHAP authentication - type: boolean - chapAuthSession: - description: whether support iSCSI Session CHAP authentication - type: boolean - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - initiatorName: - description: Custom iSCSI Initiator Name. If initiatorName - is specified with iscsiInterface simultaneously, new - iSCSI interface : will - be created for the connection. - type: string - iqn: - description: Target iSCSI Qualified Name. - type: string - iscsiInterface: - description: iSCSI Interface Name that uses an iSCSI - transport. Defaults to 'default' (tcp). - type: string - lun: - description: iSCSI Target Lun number. - type: integer - format: int32 - portals: - description: iSCSI Target Portal List. The portal is - either an IP or ip_addr:port if the port is other - than default (typically TCP ports 860 and 3260). - type: array - items: + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + emptyDir: + description: 'EmptyDir represents a temporary directory that shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: object + properties: + medium: + description: 'What type of storage medium should back this directory. The default is "" which means to use the node''s default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' type: string - readOnly: - description: ReadOnly here will force the ReadOnly setting - in VolumeMounts. Defaults to false. - type: boolean - secretRef: - description: CHAP Secret for iSCSI target and initiator - authentication - type: object - properties: - 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 - targetPortal: - description: iSCSI Target Portal. The Portal is either - an IP or ip_addr:port if the port is other than default - (typically TCP ports 860 and 3260). - type: string - name: - description: 'Volume''s name. Must be a DNS_LABEL and unique - within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - nfs: - description: 'NFS represents an NFS mount on the host that - shares a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: object - required: - - path - - server - properties: - path: - description: 'Path that is exported by the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - readOnly: - description: 'ReadOnly here will force the NFS export - to be mounted with read-only permissions. Defaults - to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: boolean - server: - description: 'Server is the hostname or IP address of - the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - persistentVolumeClaim: - description: 'PersistentVolumeClaimVolumeSource represents - a reference to a PersistentVolumeClaim in the same namespace. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: object - required: - - claimName - properties: - claimName: - description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this volume. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: string - readOnly: - description: Will force the ReadOnly setting in VolumeMounts. - Default false. - type: boolean - photonPersistentDisk: - description: PhotonPersistentDisk represents a PhotonController - persistent disk attached and mounted on kubelets host - machine - type: object - required: - - pdID - properties: - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - pdID: - description: ID that identifies Photon Controller persistent - disk - type: string - portworxVolume: - description: PortworxVolume represents a portworx volume - attached and mounted on kubelets host machine - type: object - required: - - volumeID - properties: - fsType: - description: FSType represents the filesystem type to - mount Must be a filesystem type supported by the host - operating system. Ex. "ext4", "xfs". Implicitly inferred - to be "ext4" if unspecified. - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - volumeID: - description: VolumeID uniquely identifies a Portworx - volume - type: string - projected: - description: Items for all in one resources secrets, configmaps, - and downward API - type: object - required: - - sources - properties: - defaultMode: - description: Mode bits used to set permissions on created - files by default. Must be an octal value between 0000 - and 0777 or a decimal value between 0 and 511. YAML - accepts both octal and decimal values, JSON requires - decimal values for mode bits. Directories within the - path are not affected by this setting. This might - be in conflict with other options that affect the - file mode, like fsGroup, and the result can be other - mode bits set. - type: integer - format: int32 - sources: - description: list of volume projections - type: array - items: - description: Projection that may be projected along - with other supported volume types + sizeLimit: + description: 'Total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' + 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 + ephemeral: + description: "Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed. \n Use this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity tracking are needed, c) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through a PersistentVolumeClaim (see EphemeralVolumeSource for more information on the connection between this volume type and PersistentVolumeClaim). \n Use PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod. \n Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information. \n A pod can use both types of ephemeral volumes and persistent volumes at the same time." + type: object + properties: + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeClaimTemplate: + description: "Will be used to create a stand-alone PVC to provision the volume. The pod in which this EphemeralVolumeSource is embedded will be the owner of the PVC, i.e. the PVC will be deleted together with the pod. The name of the PVC will be `-` where `` is the name from the `PodSpec.Volumes` array entry. Pod validation will reject the pod if the concatenated name is not valid for a PVC (for example, too long). \n An existing PVC with that name that is not owned by the pod will *not* be used for the pod to avoid using an unrelated volume by mistake. Starting the pod is then blocked until the unrelated PVC is removed. If such a pre-created PVC is meant to be used by the pod, the PVC has to updated with an owner reference to the pod once the pod exists. Normally this should not be necessary, but it may be useful when manually reconstructing a broken cluster. \n This field is read-only and no changes will be made by Kubernetes to the PVC after it has been created. \n Required, must not be nil." type: object + required: + - spec properties: - configMap: - description: information about the configMap data - to project + metadata: + description: May contain labels and annotations that will be copied into the PVC when creating it. No other fields are allowed and will be rejected during validation. type: object - properties: - items: - description: If unspecified, each key-value - pair in the Data field of the referenced - ConfigMap will be projected into the volume - as a file whose name is the key and content - is the value. If specified, the listed keys - will be projected into the specified paths, - and unlisted keys will not be present. If - a key is specified which is not present - in the ConfigMap, the volume setup will - error unless it is marked optional. Paths - must be relative and may not contain the - '..' path or start with '..'. - type: array - items: - description: Maps a string key to a path - within a volume. - type: object - required: - - key - - path - properties: - key: - description: The key to project. - type: string - mode: - description: 'Optional: mode bits used - to set permissions on this file. Must - be an octal value between 0000 and - 0777 or a decimal value between 0 - and 511. YAML accepts both octal and - decimal values, JSON requires decimal - values for mode bits. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: The relative path of the - file to map the key to. May not be - an absolute path. May not contain - the path element '..'. May not start - with the string '..'. - 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 keys must be defined - type: boolean - downwardAPI: - description: information about the downwardAPI - data to project + spec: + description: The specification for the PersistentVolumeClaim. The entire content is copied unchanged into the PVC that gets created from this template. The same fields as in a PersistentVolumeClaim are also valid here. type: object properties: - items: - description: Items is a list of DownwardAPIVolume - file + accessModes: + description: 'AccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' type: array items: - description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field - type: object - required: - - path - properties: - fieldRef: - description: 'Required: Selects a field - of the pod: only annotations, labels, - name and namespace are supported.' - 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 - mode: - description: 'Optional: mode bits used - to set permissions on this file, must - be an octal value between 0000 and - 0777 or a decimal value between 0 - and 511. YAML accepts both octal and - decimal values, JSON requires decimal - values for mode bits. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: 'Required: Path is the - relative path name of the file to - be created. Must not be absolute or - contain the ''..'' path. Must be utf-8 - encoded. The first item of the relative - path must not start with ''..''' - type: string - resourceFieldRef: - description: 'Selects a resource of - the container: only resources limits - and requests (limits.cpu, limits.memory, - requests.cpu and requests.memory) - are currently supported.' + type: string + dataSource: + description: 'This field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) * An existing custom resource that implements data population (Alpha) In order to use custom resource types that implement data population, the AnyVolumeDataSource feature gate must be enabled. If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source.' + type: object + required: + - kind + - name + properties: + apiGroup: + description: APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + resources: + description: 'Resources represents the minimum resources the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + selector: + description: A label query over volumes to consider for binding. + 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: - - resource + - key + - operator properties: - containerName: - description: 'Container name: required - for volumes, optional for env - vars' + key: + description: key is the label key that the selector applies to. 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' + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. type: string - secret: - description: information about the secret data - to project - type: object - properties: - items: - description: If unspecified, each key-value - pair in the Data field of the referenced - Secret will be projected into the volume - as a file whose name is the key and content - is the value. If specified, the listed keys - will be projected into the specified paths, - and unlisted keys will not be present. If - a key is specified which is not present - in the Secret, the volume setup will error - unless it is marked optional. Paths must - be relative and may not contain the '..' - path or start with '..'. - type: array - items: - description: Maps a string key to a path - within a volume. - type: object - required: - - key - - path - properties: - key: - description: The key to project. - type: string - mode: - description: 'Optional: mode bits used - to set permissions on this file. Must - be an octal value between 0000 and - 0777 or a decimal value between 0 - and 511. YAML accepts both octal and - decimal values, JSON requires decimal - values for mode bits. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: The relative path of the - file to map the key to. May not be - an absolute path. May not contain - the path element '..'. May not start - with the 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 - 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?' + storageClassName: + description: 'Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - serviceAccountToken: - description: information about the serviceAccountToken - data to project - type: object - required: - - path - properties: - audience: - description: Audience is the intended audience - of the token. A recipient of a token must - identify itself with an identifier specified - in the audience of the token, and otherwise - should reject the token. The audience defaults - to the identifier of the apiserver. + volumeMode: + description: volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. type: string - expirationSeconds: - description: ExpirationSeconds is the requested - duration of validity of the service account - token. As the token approaches expiration, - the kubelet volume plugin will proactively - rotate the service account token. The kubelet - will start trying to rotate the token if - the token is older than 80 percent of its - time to live or if the token is older than - 24 hours.Defaults to 1 hour and must be - at least 10 minutes. - type: integer - format: int64 - path: - description: Path is the path relative to - the mount point of the file to project the - token into. + volumeName: + description: VolumeName is the binding reference to the PersistentVolume backing this claim. type: string - quobyte: - description: Quobyte represents a Quobyte mount on the host - that shares a pod's lifetime - type: object - required: - - registry - - volume - properties: - group: - description: Group to map volume access to Default is - no group - type: string - readOnly: - description: ReadOnly here will force the Quobyte volume - to be mounted with read-only permissions. Defaults - to false. - type: boolean - registry: - description: Registry represents a single or multiple - Quobyte Registry services specified as a string as - host:port pair (multiple entries are separated with - commas) which acts as the central registry for volumes - type: string - tenant: - description: Tenant owning the given Quobyte volume - in the Backend Used with dynamically provisioned Quobyte - volumes, value is set by the plugin - type: string - user: - description: User to map volume access to Defaults to - serivceaccount user - type: string - volume: - description: Volume is a string that references an already - created Quobyte volume by name. - type: string - rbd: - description: 'RBD represents a Rados Block Device mount - on the host that shares a pod''s lifetime. More info: - https://examples.k8s.io/volumes/rbd/README.md' - type: object - required: - - image - - monitors - properties: - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - image: - description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - keyring: - description: 'Keyring is the path to key ring for RBDUser. - Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - monitors: - description: 'A collection of Ceph monitors. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: array - items: + fc: + description: FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod. + type: object + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. TODO: how do we prevent errors in the filesystem from compromising the machine' type: string - pool: - description: 'The rados pool name. Default is rbd. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: boolean - secretRef: - description: 'SecretRef is name of the authentication - secret for RBDUser. If provided overrides keyring. - Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: object - properties: - 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?' + lun: + description: 'Optional: FC target lun number' + type: integer + format: int32 + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + targetWWNs: + description: 'Optional: FC target worldwide names (WWNs)' + type: array + items: type: string - user: - description: 'The rados user name. Default is admin. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - scaleIO: - description: ScaleIO represents a ScaleIO persistent volume - attached and mounted on Kubernetes nodes. - type: object - required: - - gateway - - secretRef - - system - properties: - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Default is "xfs". - type: string - gateway: - description: The host address of the ScaleIO API Gateway. - type: string - protectionDomain: - description: The name of the ScaleIO Protection Domain - for the configured storage. - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: SecretRef references to the secret for - ScaleIO user and other sensitive information. If this - is not provided, Login operation will fail. - type: object - properties: - 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?' + wwids: + description: 'Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.' + type: array + items: type: string - sslEnabled: - description: Flag to enable/disable SSL communication - with Gateway, default false - type: boolean - storageMode: - description: Indicates whether the storage for a volume - should be ThickProvisioned or ThinProvisioned. Default - is ThinProvisioned. - type: string - storagePool: - description: The ScaleIO Storage Pool associated with - the protection domain. - type: string - system: - description: The name of the storage system as configured - in ScaleIO. - type: string - volumeName: - description: The name of a volume already created in - the ScaleIO system that is associated with this volume - source. - type: string - secret: - description: 'Secret represents a secret that should populate - this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: object - properties: - defaultMode: - description: 'Optional: mode bits used to set permissions - on created files by default. Must be an octal value - between 0000 and 0777 or a decimal value between 0 - and 511. YAML accepts both octal and decimal values, - JSON requires decimal values for mode bits. Defaults - to 0644. Directories within the path are not affected - by this setting. This might be in conflict with other - options that affect the file mode, like fsGroup, and - the result can be other mode bits set.' - type: integer - format: int32 - items: - description: If unspecified, each key-value pair in - the Data field of the referenced Secret will be projected - into the volume as a file whose name is the key and - content is the value. If specified, the listed keys - will be projected into the specified paths, and unlisted - keys will not be present. If a key is specified which - is not present in the Secret, the volume setup will - error unless it is marked optional. Paths must be - relative and may not contain the '..' path or start - with '..'. - type: array - items: - description: Maps a string key to a path within a - volume. + flexVolume: + description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the driver to use for this volume. + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script. + type: string + options: + description: 'Optional: Extra command options if any.' + type: object + additionalProperties: + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + secretRef: + description: 'Optional: SecretRef is reference to the secret object containing sensitive information to pass to the plugin scripts. This may be empty if no secret object is specified. If the secret object contains more than one secret, all secrets are passed to the plugin scripts.' type: object - required: - - key - - path properties: - key: - description: The key to project. + 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 - mode: - description: 'Optional: mode bits used to set - permissions on this file. Must be an octal value - between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal - values, JSON requires decimal values for mode - bits. If not specified, the volume defaultMode - will be used. This might be in conflict with - other options that affect the file mode, like - fsGroup, and the result can be other mode bits - set.' - type: integer - format: int32 - path: - description: The relative path of the file to - map the key to. May not be an absolute path. - May not contain the path element '..'. May not - start with the string '..'. + flocker: + description: Flocker represents a Flocker volume attached to a kubelet's host machine. This depends on the Flocker control service being running + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata -> name on the dataset for Flocker should be considered as deprecated + type: string + datasetUUID: + description: UUID of the dataset. This is unique identifier of a Flocker dataset + type: string + gcePersistentDisk: + description: 'GCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: object + required: + - pdName + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: integer + format: int32 + pdName: + description: 'Unique name of the PD resource in GCE. Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + gitRepo: + description: 'GitRepo represents a git repository at a particular revision. DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod''s container.' + type: object + required: + - repository + properties: + directory: + description: Target directory name. Must not contain or start with '..'. If '.' is supplied, the volume directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name. + type: string + repository: + description: Repository URL + type: string + revision: + description: Commit hash for the specified revision. + type: string + glusterfs: + description: 'Glusterfs represents a Glusterfs mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' + type: object + required: + - endpoints + - path + properties: + endpoints: + description: 'EndpointsName is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + path: + description: 'Path is the Glusterfs volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + hostPath: + description: 'HostPath represents a pre-existing file or directory on the host machine that is directly exposed to the container. This is generally used for system agents or other privileged things that are allowed to see the host machine. Most containers will NOT need this. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath --- TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not mount host directories as read/write.' + type: object + required: + - path + properties: + path: + description: 'Path of the directory on the host. If the path is a symlink, it will follow the link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + iscsi: + description: 'ISCSI represents an ISCSI Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' + type: object + required: + - iqn + - lun + - targetPortal + properties: + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP authentication + type: boolean + chapAuthSession: + description: whether support iSCSI Session CHAP authentication + type: boolean + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface : will be created for the connection. + type: string + iqn: + description: Target iSCSI Qualified Name. + type: string + iscsiInterface: + description: iSCSI Interface Name that uses an iSCSI transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: integer + format: int32 + portals: + description: iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: array + items: + type: string + readOnly: + description: ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. + type: boolean + secretRef: + description: CHAP Secret for iSCSI target and initiator authentication + type: object + properties: + 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 keys - must be defined - type: boolean - secretName: - description: 'Name of the secret in the pod''s namespace - to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: string - storageos: - description: StorageOS represents a StorageOS volume attached - and mounted on Kubernetes nodes. - type: object - properties: - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: SecretRef specifies the secret to use for - obtaining the StorageOS API credentials. If not specified, - default values will be attempted. - type: object - properties: - 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?' + targetPortal: + description: iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: string + name: + description: 'Volume''s name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: 'NFS represents an NFS mount on the host that shares a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: object + required: + - path + - server + properties: + path: + description: 'Path that is exported by the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS export to be mounted with read-only permissions. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + server: + description: 'Server is the hostname or IP address of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + persistentVolumeClaim: + description: 'PersistentVolumeClaimVolumeSource represents a reference to a PersistentVolumeClaim in the same namespace. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: object + required: + - claimName + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in VolumeMounts. Default false. + type: boolean + photonPersistentDisk: + description: PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine + type: object + required: + - pdID + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + pdID: + description: ID that identifies Photon Controller persistent disk + type: string + portworxVolume: + description: PortworxVolume represents a portworx volume attached and mounted on kubelets host machine + type: object + required: + - volumeID + properties: + fsType: + description: FSType represents the filesystem type to mount Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + volumeID: + description: VolumeID uniquely identifies a Portworx volume + type: string + projected: + description: Items for all in one resources secrets, configmaps, and downward API + type: object + properties: + defaultMode: + description: Mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set. + type: integer + format: int32 + sources: + description: list of volume projections + type: array + items: + description: Projection that may be projected along with other supported volume types + type: object + properties: + configMap: + description: information about the configMap data to project + type: object + properties: + items: + description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 keys must be defined + type: boolean + downwardAPI: + description: information about the downwardAPI data to project + type: object + properties: + items: + description: Items is a list of DownwardAPIVolume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field + type: object + required: + - path + properties: + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' + 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 + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: 'Required: Path is the relative path name of the file to be created. Must not be absolute or contain the ''..'' path. Must be utf-8 encoded. The first item of the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) 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 + secret: + description: information about the secret data to project + type: object + properties: + items: + description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 + serviceAccountToken: + description: information about the serviceAccountToken data to project + type: object + required: + - path + properties: + audience: + description: Audience is the intended audience of the token. A recipient of a token must identify itself with an identifier specified in the audience of the token, and otherwise should reject the token. The audience defaults to the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the requested duration of validity of the service account token. As the token approaches expiration, the kubelet volume plugin will proactively rotate the service account token. The kubelet will start trying to rotate the token if the token is older than 80 percent of its time to live or if the token is older than 24 hours.Defaults to 1 hour and must be at least 10 minutes. + type: integer + format: int64 + path: + description: Path is the path relative to the mount point of the file to project the token into. + type: string + quobyte: + description: Quobyte represents a Quobyte mount on the host that shares a pod's lifetime + type: object + required: + - registry + - volume + properties: + group: + description: Group to map volume access to Default is no group + type: string + readOnly: + description: ReadOnly here will force the Quobyte volume to be mounted with read-only permissions. Defaults to false. + type: boolean + registry: + description: Registry represents a single or multiple Quobyte Registry services specified as a string as host:port pair (multiple entries are separated with commas) which acts as the central registry for volumes + type: string + tenant: + description: Tenant owning the given Quobyte volume in the Backend Used with dynamically provisioned Quobyte volumes, value is set by the plugin + type: string + user: + description: User to map volume access to Defaults to serivceaccount user + type: string + volume: + description: Volume is a string that references an already created Quobyte volume by name. + type: string + rbd: + description: 'RBD represents a Rados Block Device mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md' + type: object + required: + - image + - monitors + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + image: + description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + keyring: + description: 'Keyring is the path to key ring for RBDUser. Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: type: string - volumeName: - description: VolumeName is the human-readable name of - the StorageOS volume. Volume names are only unique - within a namespace. - type: string - volumeNamespace: - description: VolumeNamespace specifies the scope of - the volume within StorageOS. If no namespace is specified - then the Pod's namespace will be used. This allows - the Kubernetes name scoping to be mirrored within - StorageOS for tighter integration. Set VolumeName - to any name to override the default behaviour. Set - to "default" if you are not using namespaces within - StorageOS. Namespaces that do not pre-exist within - StorageOS will be created. - type: string - vsphereVolume: - description: VsphereVolume represents a vSphere volume attached - and mounted on kubelets host machine - type: object - required: - - volumePath - properties: - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - storagePolicyID: - description: Storage Policy Based Management (SPBM) - profile ID associated with the StoragePolicyName. - type: string - storagePolicyName: - description: Storage Policy Based Management (SPBM) - profile name. - type: string - volumePath: - description: Path that identifies vSphere volume vmdk - type: string - installPlanApproval: - description: Approval is the user approval policy for an InstallPlan. - It must be one of "Automatic" or "Manual". - type: string - name: - type: string - source: - type: string - sourceNamespace: - type: string - startingCSV: - type: string - status: - type: object - required: - - lastUpdated - properties: - catalogHealth: - description: CatalogHealth contains the Subscription's view of its - relevant CatalogSources' status. It is used to determine SubscriptionStatusConditions - related to CatalogSources. - type: array - items: - description: SubscriptionCatalogHealth describes the health of a - CatalogSource the Subscription knows about. + pool: + description: 'The rados pool name. Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + secretRef: + description: 'SecretRef is name of the authentication secret for RBDUser. If provided overrides keyring. Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: object + properties: + 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 + user: + description: 'The rados user name. Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + scaleIO: + description: ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + type: object + required: + - gateway + - secretRef + - system + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Default is "xfs". + type: string + gateway: + description: The host address of the ScaleIO API Gateway. + type: string + protectionDomain: + description: The name of the ScaleIO Protection Domain for the configured storage. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail. + type: object + properties: + 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 + sslEnabled: + description: Flag to enable/disable SSL communication with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned. + type: string + storagePool: + description: The ScaleIO Storage Pool associated with the protection domain. + type: string + system: + description: The name of the storage system as configured in ScaleIO. + type: string + volumeName: + description: The name of a volume already created in the ScaleIO system that is associated with this volume source. + type: string + secret: + description: 'Secret represents a secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + optional: + description: Specify whether the Secret or its keys must be defined + type: boolean + secretName: + description: 'Name of the secret in the pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + storageos: + description: StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes. + type: object + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef specifies the secret to use for obtaining the StorageOS API credentials. If not specified, default values will be attempted. + type: object + properties: + 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 + volumeName: + description: VolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace. + type: string + volumeNamespace: + description: VolumeNamespace specifies the scope of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping to be mirrored within StorageOS for tighter integration. Set VolumeName to any name to override the default behaviour. Set to "default" if you are not using namespaces within StorageOS. Namespaces that do not pre-exist within StorageOS will be created. + type: string + vsphereVolume: + description: VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine + type: object + required: + - volumePath + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName. + type: string + storagePolicyName: + description: Storage Policy Based Management (SPBM) profile name. + type: string + volumePath: + description: Path that identifies vSphere volume vmdk + type: string + installPlanApproval: + description: Approval is the user approval policy for an InstallPlan. It must be one of "Automatic" or "Manual". + type: string + name: + type: string + source: + type: string + sourceNamespace: + type: string + startingCSV: + type: string + status: + type: object + required: + - lastUpdated + properties: + catalogHealth: + description: CatalogHealth contains the Subscription's view of its relevant CatalogSources' status. It is used to determine SubscriptionStatusConditions related to CatalogSources. + type: array + items: + description: SubscriptionCatalogHealth describes the health of a CatalogSource the Subscription knows about. + type: object + required: + - catalogSourceRef + - healthy + - lastUpdated + properties: + catalogSourceRef: + description: CatalogSourceRef is a reference to a CatalogSource. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + healthy: + description: Healthy is true if the CatalogSource is healthy; false otherwise. + type: boolean + lastUpdated: + description: LastUpdated represents the last time that the CatalogSourceHealth changed + type: string + format: date-time + conditions: + description: Conditions is a list of the latest available observations about a Subscription's current state. + type: array + items: + description: SubscriptionCondition represents the latest available observations of a Subscription's state. + type: object + required: + - status + - type + properties: + lastHeartbeatTime: + description: LastHeartbeatTime is the last time we got an update on a given condition + type: string + format: date-time + lastTransitionTime: + description: LastTransitionTime is the last time the condition transit from one status to another + type: string + format: date-time + message: + description: Message is a human-readable message indicating details about last transition. + type: string + reason: + description: Reason is a one-word CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition, one of True, False, Unknown. + type: string + type: + description: Type is the type of Subscription condition. + type: string + currentCSV: + description: CurrentCSV is the CSV the Subscription is progressing to. + type: string + installPlanGeneration: + description: InstallPlanGeneration is the current generation of the installplan + type: integer + installPlanRef: + description: InstallPlanRef is a reference to the latest InstallPlan that contains the Subscription's current CSV. type: object - required: - - catalogSourceRef - - healthy - - lastUpdated properties: - catalogSourceRef: - description: CatalogSourceRef is a reference to a CatalogSource. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this pod). - This syntax is chosen only to have some well-defined way - of referencing a part of an object. TODO: this design - is not final and this field is subject to change in the - future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - healthy: - description: Healthy is true if the CatalogSource is healthy; - false otherwise. - type: boolean - lastUpdated: - description: LastUpdated represents the last time that the CatalogSourceHealth - changed + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' type: string - format: date-time - conditions: - description: Conditions is a list of the latest available observations - about a Subscription's current state. - type: array - items: - description: SubscriptionCondition represents the latest available - observations of a Subscription's state. + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + installedCSV: + description: InstalledCSV is the CSV currently installed by the Subscription. + type: string + installplan: + description: 'Install is a reference to the latest InstallPlan generated for the Subscription. DEPRECATED: InstallPlanRef' type: object required: - - status - - type + - apiVersion + - kind + - name + - uuid properties: - lastHeartbeatTime: - description: LastHeartbeatTime is the last time we got an update - on a given condition - type: string - format: date-time - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transit from one status to another + apiVersion: type: string - format: date-time - message: - description: Message is a human-readable message indicating - details about last transition. + kind: type: string - reason: - description: Reason is a one-word CamelCase reason for the condition's - last transition. + name: type: string - status: - description: Status is the status of the condition, one of True, - False, Unknown. + uuid: + description: UID is a type that holds unique ID values, including UUIDs. Because we don't ONLY use UUIDs, this is an alias to string. Being a type captures intent and helps make sure that UIDs and names do not get conflated. type: string - type: - description: Type is the type of Subscription condition. - type: string - currentCSV: - description: CurrentCSV is the CSV the Subscription is progressing - to. - type: string - installPlanGeneration: - description: InstallPlanGeneration is the current generation of the - installplan - type: integer - installPlanRef: - description: InstallPlanRef is a reference to the latest InstallPlan - that contains the Subscription's current CSV. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - installedCSV: - description: InstalledCSV is the CSV currently installed by the Subscription. - type: string - installplan: - description: 'Install is a reference to the latest InstallPlan generated - for the Subscription. DEPRECATED: InstallPlanRef' - type: object - required: - - apiVersion - - kind - - name - - uuid - properties: - apiVersion: - type: string - kind: - type: string - name: - type: string - uuid: - description: UID is a type that holds unique ID values, including - UUIDs. Because we don't ONLY use UUIDs, this is an alias to - string. Being a type captures intent and helps make sure that - UIDs and names do not get conflated. - type: string - lastUpdated: - description: LastUpdated represents the last time that the Subscription - status was updated. - type: string - format: date-time - reason: - description: Reason is the reason the Subscription was transitioned - to its current state. - type: string - state: - description: State represents the current state of the Subscription - type: string - served: true - storage: true - subresources: - status: {} + lastUpdated: + description: LastUpdated represents the last time that the Subscription status was updated. + type: string + format: date-time + reason: + description: Reason is the reason the Subscription was transitioned to its current state. + type: string + state: + description: State represents the current state of the Subscription + type: string + served: true + storage: true + subresources: + status: {} diff --git a/go.mod b/go.mod index b9853b42e1..e6398794a1 100644 --- a/go.mod +++ b/go.mod @@ -3,29 +3,29 @@ module github.com/operator-framework/operator-lifecycle-manager go 1.13 require ( - github.com/blang/semver v3.5.1+incompatible + github.com/blang/semver/v4 v4.0.0 github.com/bshuster-repo/logrus-logstash-hook v1.0.0 // indirect github.com/coreos/go-semver v0.3.0 github.com/davecgh/go-spew v1.1.1 github.com/fsnotify/fsnotify v1.4.9 github.com/ghodss/yaml v1.0.0 github.com/go-bindata/go-bindata/v3 v3.1.3 - github.com/go-logr/logr v0.2.1 - github.com/go-logr/zapr v0.2.0 // indirect + github.com/go-logr/logr v0.3.0 github.com/go-openapi/spec v0.19.4 - github.com/golang/mock v1.3.1 - github.com/google/go-cmp v0.5.0 + github.com/golang/mock v1.4.1 + github.com/google/go-cmp v0.5.2 + github.com/googleapis/gnostic v0.5.1 github.com/irifrance/gini v1.0.1 github.com/itchyny/gojq v0.11.0 github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2 - github.com/mikefarah/yq/v3 v3.0.0-20201020025845-ccb718cd0f59 + github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37 github.com/mitchellh/hashstructure v1.0.0 github.com/mitchellh/mapstructure v1.1.2 - github.com/onsi/ginkgo v1.12.0 - github.com/onsi/gomega v1.9.0 + github.com/onsi/ginkgo v1.14.1 + github.com/onsi/gomega v1.10.2 github.com/openshift/api v0.0.0-20200331152225-585af27e34fd github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0 - github.com/operator-framework/api v0.3.25 + github.com/operator-framework/api v0.5.0 github.com/operator-framework/operator-registry v1.13.6 github.com/otiai10/copy v1.2.0 github.com/pkg/errors v0.9.1 @@ -33,32 +33,31 @@ require ( github.com/prometheus/client_model v0.2.0 github.com/prometheus/common v0.10.0 github.com/sirupsen/logrus v1.7.0 - github.com/spf13/cobra v1.0.0 + github.com/spf13/cobra v1.1.1 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.6.1 - golang.org/x/time v0.0.0-20191024005414-555d28b269f0 + golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e google.golang.org/grpc v1.30.0 - gopkg.in/yaml.v2 v2.2.8 - helm.sh/helm/v3 v3.4.0 - k8s.io/api v0.19.3 - k8s.io/apiextensions-apiserver v0.19.3 - k8s.io/apimachinery v0.19.3 - k8s.io/apiserver v0.19.3 - k8s.io/client-go v0.19.3 - k8s.io/code-generator v0.19.3 - k8s.io/component-base v0.19.3 + gopkg.in/yaml.v2 v2.3.0 + helm.sh/helm/v3 v3.1.0-rc.1.0.20201215141456-e71d38b414eb + k8s.io/api v0.20.0 + k8s.io/apiextensions-apiserver v0.20.0 + k8s.io/apimachinery v0.20.0 + k8s.io/apiserver v0.20.0 + k8s.io/client-go v0.20.0 + k8s.io/code-generator v0.20.0 + k8s.io/component-base v0.20.0 k8s.io/klog v1.0.0 - k8s.io/kube-aggregator v0.19.3 - k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6 + k8s.io/kube-aggregator v0.20.0 + k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd rsc.io/letsencrypt v0.0.3 // indirect - sigs.k8s.io/controller-runtime v0.6.0 - sigs.k8s.io/controller-tools v0.3.0 + sigs.k8s.io/controller-runtime v0.7.0 + sigs.k8s.io/controller-tools v0.4.1 sigs.k8s.io/kind v0.7.0 ) replace ( - github.com/Azure/go-autorest => github.com/Azure/go-autorest v13.3.2+incompatible - github.com/docker/docker => github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309 // Required by Helm + github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.4.1 // controller runtime github.com/openshift/api => github.com/openshift/api v0.0.0-20200331152225-585af27e34fd // release-4.5 @@ -70,7 +69,5 @@ replace ( google.golang.org/grpc/examples => google.golang.org/grpc/examples v0.0.0-20200709232328-d8193ee9cc3e // pinned because no tag supports 1.18 yet - // pinned because no tag supports 1.18 yet - sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.5.1-0.20200414221803-bac7e8aaf90a sigs.k8s.io/structured-merge-diff => sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06 ) diff --git a/go.sum b/go.sum index ebecad8d06..298075ae0f 100644 --- a/go.sum +++ b/go.sum @@ -7,39 +7,62 @@ cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6A 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.51.0 h1:PvKAVQWCtlGUSlZkGW3QLelKaWq7KYv/MW1EboG8bfM= +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 h1:3ithwDMr7/3vpAMXiH+ZQnYbuIsh+OPhUPMFC9enmn0= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= 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/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= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest v13.3.2+incompatible h1:VxzPyuhtnlBOzc4IWCZHqpyH2d+QMLQEuy3wREyY4oc= -github.com/Azure/go-autorest v13.3.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0 h1:MRvx8gncNaXJqOoLmhNjUAKh33JJF8LyxPhomEtOsjs= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.6 h1:5YWtOnckcudzIw8lPPBcWOnmIFWMtHci1ZWAZulMSx0= github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest v0.11.1 h1:eVvIXUKiTgv++6YnWb42DUA1YL7qDugnKP0HljexdnQ= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest/adal v0.5.0 h1:q2gDruN08/guU9vAjuPWff0+QIrpH6ediguzdAzXAUU= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.2 h1:O1X4oexUxnZCaEUGsvMnr8ZGj8HI37tNezwY4npRqA0= github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5 h1:Y3bBUV4rTuxenJJs41HU3qmqsb+auo+a3Lz+PlJPpL0= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/date v0.1.0 h1:YGrhWfrgtFs84+h0o46rJrlmsZtyZRg470CqAXTZaGM= 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 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= 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 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0 h1:Ww5g4zThfD/6cLb4z6xxgeyDa7QDkizMkJKe0ysZXp0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= 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= @@ -50,12 +73,12 @@ github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= github.com/Masterminds/goutils v1.1.0 h1:zukEsf/1JZwCMgHiK3GZftabmxiCw4apj3a28RPBiVg= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver/v3 v3.1.0 h1:Y2lUDsFKVRSYGojLJ1yLxSXdMmMYTYls0rCvoqmMUQk= -github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/sprig/v3 v3.1.0 h1:j7GpgZ7PdFqNsmncycTHsLmVPf5/3wJtlgW9TNDYD9Y= -github.com/Masterminds/sprig/v3 v3.1.0/go.mod h1:ONGMf7UfYGAbMXCZmQLy8x3lCDIPrEZE/rU8pmrbihA= -github.com/Masterminds/squirrel v1.4.0 h1:he5i/EXixZxrBUWcxzDYMiju9WZ3ld/l7QBNuo/eN3w= -github.com/Masterminds/squirrel v1.4.0/go.mod h1:yaPeOnPG5ZRwL9oKdTsO/prlkPbXWZlRVMQ/gGlzIuA= +github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig/v3 v3.2.0 h1:P1ekkbuU73Ui/wS0nK1HOM37hh4xdfZo485UPf8rc+Y= +github.com/Masterminds/sprig/v3 v3.2.0/go.mod h1:tWhwTbUTndesPNeF0C900vKoq283u6zp4APT9vaF3SI= +github.com/Masterminds/squirrel v1.5.0 h1:JukIZisrUXadA9pl3rMkjhiamxiB0cXiu+HGp/Y8cY8= +github.com/Masterminds/squirrel v1.5.0/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Masterminds/vcs v1.13.1 h1:NL3G1X7/7xduQtA2sJLpVpfHTNBALVNSjob6KEjPXNQ= github.com/Masterminds/vcs v1.13.1/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= @@ -117,10 +140,13 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bshuster-repo/logrus-logstash-hook v0.4.1 h1:pgAtgj+A31JBVtEHu2uHuEx0n+2ukqUJnS2vVe5pQNA= @@ -173,6 +199,7 @@ github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd h1:JNn81o/xG+8N github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= 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/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= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -225,6 +252,11 @@ github.com/docker/distribution v0.0.0-20191216044856-a8371794149d/go.mod h1:0+TT github.com/docker/distribution v2.7.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v0.7.3-0.20190103212154-2b7e084dc98b/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v0.7.3-0.20190817195342-4760db040282/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20200203170920-46ec8731fbce h1:KXS1Jg+ddGcWA8e1N7cupxaHHZhit5rB9tfDU+mfjyY= +github.com/docker/docker v1.4.2-0.20200203170920-46ec8731fbce/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= @@ -273,6 +305,8 @@ github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= 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 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= @@ -280,6 +314,7 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk= +github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/garyburd/redigo v1.6.0 h1:0VruCpn7yAIIu7pWVClQC8wxCJEcG3nyzpMSHKi1PQc= github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= @@ -290,7 +325,9 @@ github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0 github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-bindata/go-bindata/v3 v3.1.3 h1:F0nVttLC3ws0ojc7p60veTurcOm//D4QBODNM7EGrCI= github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I= +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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -301,8 +338,8 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.2.1 h1:fV3MLmabKIZ383XifUjFSwcoGee0v9qgPp8wy5svibE= -github.com/go-logr/logr v0.2.1/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.3.0 h1:q4c+kbcR0d5rSurhBR8dIgieOaYpXtsdTYfx22Cu6rs= +github.com/go-logr/logr v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/zapr v0.1.0 h1:h+WVe9j6HAA01niTJPA/kKH0i7e0rLZBCwauQFcRE54= github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-logr/zapr v0.2.0 h1:v6Ji8yBW77pva6NkJKQdHLAJKrIJKRHz0RXwPqCHSR4= @@ -407,15 +444,21 @@ github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1 h1:ocYkMQY5RrXTYgXl7ICpV0IXwlEQGwKIsery4gyXa1U= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 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= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -424,6 +467,8 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 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= @@ -439,6 +484,8 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= @@ -449,16 +496,16 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi 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-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/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.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= 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/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.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= -github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/gophercloud/gophercloud v0.1.0 h1:P/nh25+rzXouhytV2pUHBb65fnds26Ghl8/391+sT5o= @@ -478,6 +525,8 @@ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= @@ -492,7 +541,9 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.5 h1:UImYN5qQ8tuGpGE16ZmjvcTtTw24zw1 github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-health-probe v0.3.2/go.mod h1:izVOQ4RWbjUR6lm4nn+VLJyQ+FyaiGmprEYgI04Gs7U= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +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/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/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -511,6 +562,8 @@ github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +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= @@ -527,6 +580,9 @@ github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= @@ -541,7 +597,6 @@ github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80s github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 h1:IPJ3dvxmJ4uczJe5YQdrYB16oTJlGSC/OyZDqUk9xX4= github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -598,14 +653,15 @@ github.com/lestrrat-go/strftime v1.0.1 h1:o7qz5pmLzPDLyGW4lG6JvTKPUfTFXwe+vOamIY github.com/lestrrat-go/strftime v1.0.1/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.9.0 h1:L8nSXQQzAYByakOFMTwpjRoHsMJklur4Gi59b6VivR8= +github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= 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/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= @@ -654,8 +710,8 @@ github.com/mikefarah/yaml/v2 v2.4.0 h1:eYqfooY0BnvKTJxr7+ABJs13n3dg9n347GScDaU2L github.com/mikefarah/yaml/v2 v2.4.0/go.mod h1:ahVqZF4n1W4NqwvVnZzC4es67xsW9uR/RRf2RRxieJU= github.com/mikefarah/yq/v2 v2.4.1 h1:tajDonaFK6WqitSZExB6fKlWQy/yCkptqxh2AXEe3N4= github.com/mikefarah/yq/v2 v2.4.1/go.mod h1:i8SYf1XdgUvY2OFwSqGAtWOOgimD2McJ6iutoxRm4k0= -github.com/mikefarah/yq/v3 v3.0.0-20201020025845-ccb718cd0f59 h1:6nvF+EEFIVD4KT64CgvAzWaMVC283Huno59khWs9r1A= -github.com/mikefarah/yq/v3 v3.0.0-20201020025845-ccb718cd0f59/go.mod h1:7eVjFf5bgozMuHk+oKpyxR2zCN3iEN1tF0/bM5jvtKo= +github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37 h1:lPmsut5Sk7eK2BmDXuvNEvMbT7MkAJBu64Yxr7iJ6nk= +github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37/go.mod h1:dYWq+UWoFCDY1TndvFUQuhBbIYmZpjreC8adEAx93zE= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= @@ -674,8 +730,6 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309 h1:cvy4lBOYN3gKfKj8Lzz5Q9TfviP+L7koMHY7SvkyTKs= -github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd h1:aY7OQNf2XqY/JQ6qREWamhI/81os/agb2BAGpcx5yWI= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -703,6 +757,8 @@ github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi 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/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= 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/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -717,6 +773,9 @@ github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4= +github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -725,6 +784,9 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.2 h1:aY/nuoWlKJud2J6U0E3NWsjlg+0GtwXxgEqthRdzlcs= +github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -756,8 +818,8 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ 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/operator-framework/api v0.3.7-0.20200602203552-431198de9fc2/go.mod h1:Xbje9x0SHmh0nihE21kpesB38vk3cyxnE6JdDS8Jo1Q= -github.com/operator-framework/api v0.3.25 h1:d6WgHCshCffT37okVZeL+IbGlhrsHy57xdfMnopC8rI= -github.com/operator-framework/api v0.3.25/go.mod h1:GVNiB6AQucwdZz3ZFXNv9HtcLOzcFnr6O/QldzKG93g= +github.com/operator-framework/api v0.5.0 h1:pzlFOIyrbqoW5Fx6EgJNaEa2sipwPGhNhFxIwu9V6CY= +github.com/operator-framework/api v0.5.0/go.mod h1:A4VYTXGHHutXy4VrVvr3voBkObOaCaKaGF2dn5i0Fnw= github.com/operator-framework/operator-registry v1.13.6 h1:h/dIjQQS7uneQNRifrSz7h0xg4Xyjg6C9f6XZofbMPg= github.com/operator-framework/operator-registry v1.13.6/go.mod h1:YhnIzOVjRU2ZwZtzt+fjcjW8ujJaSFynBEu7QVKaSdU= github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= @@ -835,6 +897,8 @@ github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 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/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -857,6 +921,8 @@ github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24 github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -888,6 +954,8 @@ github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tL github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -897,6 +965,7 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= 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= @@ -912,6 +981,7 @@ github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tebeka/strftime v0.1.3 h1:5HQXOqWKYRFfNyBMNVc9z5+QzuBtIXy03psIhtdJYto= github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= @@ -974,15 +1044,23 @@ go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0 h1:sFPn2GLc3poCkfrpIXGhBD2X0CMIo4Q/zSULXrj/+uc= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -990,6 +1068,8 @@ go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= +go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 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= @@ -1012,11 +1092,18 @@ golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +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-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-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -1027,11 +1114,15 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE= 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 h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/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= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= @@ -1060,18 +1151,25 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/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-20191021144547-ec77196f6094/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271/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= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 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-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1080,6 +1178,8 @@ golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7O golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-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= @@ -1117,7 +1217,9 @@ golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/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= @@ -1132,29 +1234,37 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w 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-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/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-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f h1:Fqb3ao1hUmOR3GkUOg/Y+BadLwykBIzs5q8Ez2SbHyc= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd h1:5CtCZbICpIOFdgO940moixOPjc0178IU44m4EjOO5IY= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 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 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/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-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1184,14 +1294,31 @@ golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/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-20191030203535-5e247c9ad0a0/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-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-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-20200115044656-831fdb1e1868 h1:6VZw2h4iwEB4GwgQU3Jvcsm8l9+yReTrErAEK1k6AC4= golang.org/x/tools v0.0.0-20200115044656-831fdb1e1868/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= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200616133436-c1934b75d054 h1:HHeAlu5H9b71C+Fx0K+1dGgVFN1DM1/wz4aoGOA5qS8= golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5 h1:UaoXseXAWUJUcuJ2E2oczJdLxAJXL0lOmVaBl7kuk+I= +golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 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 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= @@ -1200,6 +1327,8 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1N golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= +gomodules.xyz/jsonpatch/v2 v2.1.0 h1:Phva6wqu+xR//Njw6iorylFFgn/z547tw5Ne3HZPQ+k= +gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= @@ -1207,7 +1336,12 @@ google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEt google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1215,6 +1349,8 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1227,11 +1363,22 @@ google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +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-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/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= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200701001935-0939c5918c31 h1:Of4QP8bfRqzDROen6+s2j/p0jCPgzvQRd9nHiactfn4= google.golang.org/genproto v0.0.0-20200701001935-0939c5918c31/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a h1:pOwg4OoaRYScjmR4LlLgdtnyoHYTSAVhhqe5uPdpII8= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200709232328-d8193ee9cc3e/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= @@ -1267,6 +1414,7 @@ gopkg.in/imdario/mergo.v0 v0.3.7 h1:QDotlIZtaO/p+Um0ok18HRTpq5i5/SAk/qprsor+9c8= gopkg.in/imdario/mergo.v0 v0.3.7/go.mod h1:9qPP6AGrlC1G2PTNXko614FwGZvorN7MiBU0Eppok+U= 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.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 h1:6D+BvnJ/j6e222UW8s2qTSe3wGBtvo0MbVQG/c5k8RE= @@ -1284,6 +1432,8 @@ 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 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2 h1:XZx7nhd5GMaZpmDaEHFVafUZC7ya0fuo7cSJ3UCKYmM= gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -1295,67 +1445,69 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -helm.sh/helm/v3 v3.4.0 h1:rsut6hqQfjD3G/ic1XPh3KyasfOHZuDUhtyAJjuquew= -helm.sh/helm/v3 v3.4.0/go.mod h1:jbfz/BoYmpJ3njhHBdH7F3kR8CNUGeRueliFtOhQK+M= +helm.sh/helm/v3 v3.1.0-rc.1.0.20201215141456-e71d38b414eb h1:DwYVbcqXBQkijLjtA2O1dVqz2oIwqDbUueJBx+MxrTg= +helm.sh/helm/v3 v3.1.0-rc.1.0.20201215141456-e71d38b414eb/go.mod h1:Y5K3Kpp4CgPLcW6KgR8FmW93jrdo0HPhA7/MPOSkMbw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8= k8s.io/api v0.18.2 h1:wG5g5ZmSVgm5B+eHMIbI9EGATS2L8Z72rda19RIEgY8= k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI= -k8s.io/api v0.19.3 h1:GN6ntFnv44Vptj/b+OnMW7FmzkpDoIDLZRvKX3XH9aU= -k8s.io/api v0.19.3/go.mod h1:VF+5FT1B74Pw3KxMdKyinLo+zynBaMBiAfGMuldcNDs= -k8s.io/apiextensions-apiserver v0.18.0/go.mod h1:18Cwn1Xws4xnWQNC00FLq1E350b9lUF+aOdIWDOZxgo= +k8s.io/api v0.20.0 h1:WwrYoZNM1W1aQEbyl8HNG+oWGzLpZQBlcerS9BQw9yI= +k8s.io/api v0.20.0/go.mod h1:HyLC5l5eoS/ygQYl1BXBgFzWNlkHiAuyNAbevIn+FKg= k8s.io/apiextensions-apiserver v0.18.2 h1:I4v3/jAuQC+89L3Z7dDgAiN4EOjN6sbm6iBqQwHTah8= k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg= -k8s.io/apiextensions-apiserver v0.19.3 h1:WZxBypSHW4SdXHbdPTS/Jy7L2la6Niggs8BuU5o+avo= -k8s.io/apiextensions-apiserver v0.19.3/go.mod h1:igVEkrE9TzInc1tYE7qSqxaLg/rEAp6B5+k9Q7+IC8Q= +k8s.io/apiextensions-apiserver v0.20.0 h1:HmeP9mLET/HlIQ5gjP+1c20tgJrlshY5nUyIand3AVg= +k8s.io/apiextensions-apiserver v0.20.0/go.mod h1:ZH+C33L2Bh1LY1+HphoRmN1IQVLTShVcTojivK3N9xg= k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= k8s.io/apimachinery v0.18.2 h1:44CmtbmkzVDAhCpRVSiP2R5PPrC2RtlIv/MoB8xpdRA= k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apimachinery v0.19.3 h1:bpIQXlKjB4cB/oNpnNnV+BybGPR7iP5oYpsOTEJ4hgc= -k8s.io/apimachinery v0.19.3/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apiserver v0.18.0/go.mod h1:3S2O6FeBBd6XTo0njUrLxiqk8GNy6wWOftjhJcXYnjw= +k8s.io/apimachinery v0.20.0 h1:jjzbTJRXk0unNS71L7h3lxGDH/2HPxMPaQY+MjECKL8= +k8s.io/apimachinery v0.20.0/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apiserver v0.18.2 h1:fwKxdTWwwYhxvtjo0UUfX+/fsitsNtfErPNegH2x9ic= k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA= -k8s.io/apiserver v0.19.3 h1:H7KUbLD74rh8NOPMLBJPSEG3Djqcv6Zxn5Ud0AL5u/k= -k8s.io/apiserver v0.19.3/go.mod h1:bx6dMm+H6ifgKFpCQT/SAhPwhzoeIMlHIaibomUDec0= +k8s.io/apiserver v0.20.0 h1:0MwO4xCoqZwhoLbFyyBSJdu55CScp4V4sAgX6z4oPBY= +k8s.io/apiserver v0.20.0/go.mod h1:6gRIWiOkvGvQt12WTYmsiYoUyYW0FXSiMdNl4m+sxY8= k8s.io/cli-runtime v0.18.0 h1:jG8XpSqQ5TrV0N+EZ3PFz6+gqlCk71dkggWCCq9Mq34= k8s.io/cli-runtime v0.18.0/go.mod h1:1eXfmBsIJosjn9LjEBUd2WVPoPAY9XGTqTFcPMIBsUQ= -k8s.io/cli-runtime v0.19.2 h1:d4uOtKhy3ImdaKqZJ8yQgLrdtUwsJLfP4Dw7L/kVPOo= -k8s.io/cli-runtime v0.19.2/go.mod h1:CMynmJM4Yf02TlkbhKxoSzi4Zf518PukJ5xep/NaNeY= +k8s.io/cli-runtime v0.20.0 h1:UfTR9vGUWshJpwuekl7MqRmWumNs5tvqPj20qnmOns8= +k8s.io/cli-runtime v0.20.0/go.mod h1:C5tewU1SC1t09D7pmkk83FT4lMAw+bvMDuRxA7f0t2s= k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8= k8s.io/client-go v0.18.2 h1:aLB0iaD4nmwh7arT2wIn+lMnAq7OswjaejkQ8p9bBYE= k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA= -k8s.io/client-go v0.19.3 h1:ctqR1nQ52NUs6LpI0w+a5U+xjYwflFwA13OJKcicMxg= -k8s.io/client-go v0.19.3/go.mod h1:+eEMktZM+MG0KO+PTkci8xnbCZHvj9TqR6Q1XDUIJOM= +k8s.io/client-go v0.20.0 h1:Xlax8PKbZsjX4gFvNtt4F5MoJ1V5prDvCuoq9B7iax0= +k8s.io/client-go v0.20.0/go.mod h1:4KWh/g+Ocd8KkCwKF8vUNnmqgv+EVnQDK4MBF4oB5tY= k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= k8s.io/code-generator v0.18.2 h1:C1Nn2JiMf244CvBDKVPX0W2mZFJkVBg54T8OV7/Imso= k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= -k8s.io/code-generator v0.19.3 h1:fTrTpJ8PZog5oo6MmeZtveo89emjQZHiw0ieybz1RSs= -k8s.io/code-generator v0.19.3/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= +k8s.io/code-generator v0.20.0 h1:c8JaABvEEZPDE8MICTOtveHX2axchl+EptM+o4OGvbg= +k8s.io/code-generator v0.20.0/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= k8s.io/component-base v0.18.0/go.mod h1:u3BCg0z1uskkzrnAKFzulmYaEpZF7XC9Pf/uFyb1v2c= k8s.io/component-base v0.18.2 h1:SJweNZAGcUvsypLGNPNGeJ9UgPZQ6+bW+gEHe8uyh/Y= k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo= -k8s.io/component-base v0.19.3 h1:c+DzDNAQFlaoyX+yv8YuWi8xmlQvvY5DnJGbaz5U74o= -k8s.io/component-base v0.19.3/go.mod h1:WhLWSIefQn8W8jxSLl5WNiR6z8oyMe/8Zywg7alOkRc= +k8s.io/component-base v0.20.0 h1:BXGL8iitIQD+0NgW49UsM7MraNUUGDU3FBmrfUAtmVQ= +k8s.io/component-base v0.20.0/go.mod h1:wKPj+RHnAr8LW2EIBIK7AxOHPde4gme2lzXwVSoRXeA= +k8s.io/component-helpers v0.20.0/go.mod h1:nx6NOtfSfGOxnSZsDJxpGbnsVuUA1UXpwDvZIrtigNk= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120 h1:RPscN6KhmG54S33L+lr3GS+oD1jmchIU0ll519K6FA4= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14 h1:t4L10Qfx/p7ASH3gXCdIUtPbbIuegCoUJf3TMSFekjw= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201113003025-83324d819ded h1:JApXBKYyB7l9xx+DK7/+mFjC7A9Bt5A93FPvFD0HIFE= +k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= @@ -1363,35 +1515,46 @@ k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/kube-aggregator v0.19.3 h1:neDqyJ0tiP1RNhrS9Vk9o2Id/u5+TJX7BH0QBSkLYxc= -k8s.io/kube-aggregator v0.19.3/go.mod h1:5KTkDBxx4YiAYUuqTGmwjH7v54hRdrykqzcPiF8hPJc= +k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/kube-aggregator v0.20.0 h1:hXjICaaB1d1vRFGTNbOd0Agdn56rihxeGvS8zpuoWuE= +k8s.io/kube-aggregator v0.20.0/go.mod h1:3Is/gzzWmhhG/rA3CpA1+eVye87lreBQDFGcAGT7gzo= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c h1:/KUFqjjqAcY4Us6luF5RDNZ16KJtb49HfR3ZHB9qYXM= k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6 h1:+WnxoVtG8TMiudHBSEtrVL1egv36TkkJm+bA8AxicmQ= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kubectl v0.18.0 h1:hu52Ndq/d099YW+3sS3VARxFz61Wheiq8K9S7oa82Dk= k8s.io/kubectl v0.18.0/go.mod h1:LOkWx9Z5DXMEg5KtOjHhRiC1fqJPLyCr3KtQgEolCkU= -k8s.io/kubectl v0.19.2 h1:/Dxz9u7S0GnchLA6Avqi5k1qhZH4Fusgecj8dHsSnbk= -k8s.io/kubectl v0.19.2/go.mod h1:4ib3oj5ma6gF95QukTvC7ZBMxp60+UEAhDPjLuBIrV4= +k8s.io/kubectl v0.20.0 h1:q6HH6jILYi2lkzFqBhs63M4bKLxYlM0HpFJ///MgARA= +k8s.io/kubectl v0.20.0/go.mod h1:8x5GzQkgikz7M2eFGGuu6yOfrenwnw5g4RXOUgbjR1M= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/metrics v0.18.0/go.mod h1:8aYTW18koXqjLVKL7Ds05RPMX9ipJZI3mywYvBOxXd4= -k8s.io/metrics v0.19.2/go.mod h1:IlLaAGXN0q7yrtB+SV0q3JIraf6VtlDr+iuTcX21fCU= +k8s.io/metrics v0.20.0/go.mod h1:9yiRhfr8K8sjdj2EthQQE9WvpYDvsXIV3CjN4Ruq4Jw= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89 h1:d4vVOjXm687F1iLSP2q3lyPPuyvTUt3aVoBpi2DqRsU= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K8Hf8whTseBgJcg= k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/letsencrypt v0.0.3 h1:H7xDfhkaFFSYEJlKeq38RwX2jYcnTeHuDQyT+mMNMwM= rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= +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.7 h1:uuHDyjllyzRyCIvvn0OBjiRB0SgBZGqHNYAmjR7fO50= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9 h1:rusRLrDhjBp6aYtl9sGEvQJr6faoHoDLd0YcUBTZguI= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= -sigs.k8s.io/controller-runtime v0.5.1-0.20200414221803-bac7e8aaf90a h1:VWIe85NweNf3H+5qK4xssTSWemfi+VqAFSdYnY2HP14= -sigs.k8s.io/controller-runtime v0.5.1-0.20200414221803-bac7e8aaf90a/go.mod h1:j4echH3Y/UPHRpXS65rxGXujda8iWOheMQvDh1uNgaY= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14 h1:TihvEz9MPj2u0KWds6E2OBUXfwaL4qRJ33c7HGiJpqk= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/controller-runtime v0.6.0/go.mod h1:CpYf5pdNY/B352A1TFLAS2JVSlnGQ5O2cftPHndTroo= +sigs.k8s.io/controller-runtime v0.7.0 h1:bU20IBBEPccWz5+zXpLnpVsgBYxqclaHu1pVDl/gEt8= +sigs.k8s.io/controller-runtime v0.7.0/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU= sigs.k8s.io/controller-tools v0.3.0 h1:y3YD99XOyWaXkiF1kd41uRvfp/64teWcrEZFuHxPhJ4= sigs.k8s.io/controller-tools v0.3.0/go.mod h1:enhtKGfxZD1GFEoMgP8Fdbu+uKQ/cq1/WGJhdVChfvI= +sigs.k8s.io/controller-tools v0.4.1 h1:VkuV0MxlRPmRu5iTgBZU4UxUX2LiR99n3sdQGRxZF4w= +sigs.k8s.io/controller-tools v0.4.1/go.mod h1:G9rHdZMVlBDocIxGkK3jHLWqcTMNvveypYJwrvYKjWU= sigs.k8s.io/kind v0.7.0 h1:7y7a8EYtGHM+auHmsvzuK5o84SrxPYGidlvfql7j/k4= sigs.k8s.io/kind v0.7.0/go.mod h1:An/AbWHT6pA/Lm0Og8j3ukGhfJP3RiVN/IBU6Lo3zl8= sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0= @@ -1401,8 +1564,9 @@ sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1 sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1 h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA= 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 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/manifests/0000_50_olm_00-catalogsources.crd.yaml b/manifests/0000_50_olm_00-catalogsources.crd.yaml index 39b7491d1c..95275ab00a 100644 --- a/manifests/0000_50_olm_00-catalogsources.crd.yaml +++ b/manifests/0000_50_olm_00-catalogsources.crd.yaml @@ -2,198 +2,166 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: catalogsources.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: CatalogSource listKind: CatalogSourceList plural: catalogsources shortNames: - - catsrc + - catsrc singular: catalogsource scope: Namespaced versions: - - additionalPrinterColumns: - - description: The pretty name of the catalog - jsonPath: .spec.displayName - name: Display - type: string - - description: The type of the catalog - jsonPath: .spec.sourceType - name: Type - type: string - - description: The publisher of the catalog - jsonPath: .spec.publisher - name: Publisher - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: CatalogSource is a repository of CSVs, CRDs, and operator packages. - type: object - required: - - metadata - - 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: - type: object - required: - - sourceType - properties: - address: - description: 'Address is a host that OLM can use to connect to a pre-existing - registry. Format: : Only used when SourceType - = SourceTypeGrpc. Ignored when the Image field is set.' - type: string - configMap: - description: ConfigMap is the name of the ConfigMap to be used to - back a configmap-server registry. Only used when SourceType = SourceTypeConfigmap - or SourceTypeInternal. - type: string - description: - type: string - displayName: - description: Metadata - type: string - icon: - type: object - required: - - base64data - - mediatype - properties: - base64data: - type: string - mediatype: - type: string - image: - description: Image is an operator-registry container image to instantiate - a registry-server with. Only used when SourceType = SourceTypeGrpc. - If present, the address field is ignored. - type: string - priority: - description: 'Priority field assigns a weight to the catalog source - to prioritize them so that it can be consumed by the dependency - resolver. Usage: Higher weight indicates that this catalog source - is preferred over lower weighted catalog sources during dependency - resolution. The range of the priority value can go from positive - to negative in the range of int32. The default value to a catalog - source with unassigned priority would be 0. The catalog source with - the same priority values will be ranked lexicographically based - on its name.' - type: integer - publisher: - type: string - secrets: - description: Secrets represent set of secrets that can be used to - access the contents of the catalog. It is best to keep this list - small, since each will need to be tried for every catalog entry. - type: array - items: + - additionalPrinterColumns: + - description: The pretty name of the catalog + jsonPath: .spec.displayName + name: Display + type: string + - description: The type of the catalog + jsonPath: .spec.sourceType + name: Type + type: string + - description: The publisher of the catalog + jsonPath: .spec.publisher + name: Publisher + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: CatalogSource is a repository of CSVs, CRDs, and operator packages. + type: object + required: + - metadata + - 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: + type: object + required: + - sourceType + properties: + address: + description: 'Address is a host that OLM can use to connect to a pre-existing registry. Format: : Only used when SourceType = SourceTypeGrpc. Ignored when the Image field is set.' type: string - sourceType: - description: SourceType is the type of source - type: string - updateStrategy: - description: UpdateStrategy defines how updated catalog source images - can be discovered Consists of an interval that defines polling duration - and an embedded strategy type - type: object - properties: - registryPoll: - type: object - properties: - interval: - description: Interval is used to determine the time interval - between checks of the latest catalog source version. The - catalog operator polls to see if a new version of the catalog - source is available. If available, the latest image is pulled - and gRPC traffic is directed to the latest catalog source. - type: string - status: - type: object - properties: - configMapReference: - type: object - required: - - name - - namespace - properties: - lastUpdateTime: - type: string - format: date-time - name: - type: string - namespace: - type: string - resourceVersion: - type: string - uid: - description: UID is a type that holds unique ID values, including - UUIDs. Because we don't ONLY use UUIDs, this is an alias to - string. Being a type captures intent and helps make sure that - UIDs and names do not get conflated. - type: string - connectionState: - type: object - required: - - lastObservedState - properties: - address: - type: string - lastConnect: - type: string - format: date-time - lastObservedState: - type: string - latestImageRegistryPoll: - description: The last time the CatalogSource image registry has been - polled to ensure the image is up-to-date - type: string - format: date-time - message: - description: A human readable message indicating details about why - the CatalogSource is in this condition. - type: string - reason: - description: Reason is the reason the CatalogSource was transitioned - to its current state. - type: string - registryService: - type: object - properties: - createdAt: - type: string - format: date-time - port: - type: string - protocol: - type: string - serviceName: - type: string - serviceNamespace: + configMap: + description: ConfigMap is the name of the ConfigMap to be used to back a configmap-server registry. Only used when SourceType = SourceTypeConfigmap or SourceTypeInternal. + type: string + description: + type: string + displayName: + description: Metadata + type: string + icon: + type: object + required: + - base64data + - mediatype + properties: + base64data: + type: string + mediatype: + type: string + image: + description: Image is an operator-registry container image to instantiate a registry-server with. Only used when SourceType = SourceTypeGrpc. If present, the address field is ignored. + type: string + priority: + description: 'Priority field assigns a weight to the catalog source to prioritize them so that it can be consumed by the dependency resolver. Usage: Higher weight indicates that this catalog source is preferred over lower weighted catalog sources during dependency resolution. The range of the priority value can go from positive to negative in the range of int32. The default value to a catalog source with unassigned priority would be 0. The catalog source with the same priority values will be ranked lexicographically based on its name.' + type: integer + publisher: + type: string + secrets: + description: Secrets represent set of secrets that can be used to access the contents of the catalog. It is best to keep this list small, since each will need to be tried for every catalog entry. + type: array + items: type: string - served: true - storage: true - subresources: - status: {} + sourceType: + description: SourceType is the type of source + type: string + updateStrategy: + description: UpdateStrategy defines how updated catalog source images can be discovered Consists of an interval that defines polling duration and an embedded strategy type + type: object + properties: + registryPoll: + type: object + properties: + interval: + description: Interval is used to determine the time interval between checks of the latest catalog source version. The catalog operator polls to see if a new version of the catalog source is available. If available, the latest image is pulled and gRPC traffic is directed to the latest catalog source. + type: string + status: + type: object + properties: + configMapReference: + type: object + required: + - name + - namespace + properties: + lastUpdateTime: + type: string + format: date-time + name: + type: string + namespace: + type: string + resourceVersion: + type: string + uid: + description: UID is a type that holds unique ID values, including UUIDs. Because we don't ONLY use UUIDs, this is an alias to string. Being a type captures intent and helps make sure that UIDs and names do not get conflated. + type: string + connectionState: + type: object + required: + - lastObservedState + properties: + address: + type: string + lastConnect: + type: string + format: date-time + lastObservedState: + type: string + latestImageRegistryPoll: + description: The last time the CatalogSource image registry has been polled to ensure the image is up-to-date + type: string + format: date-time + message: + description: A human readable message indicating details about why the CatalogSource is in this condition. + type: string + reason: + description: Reason is the reason the CatalogSource was transitioned to its current state. + type: string + registryService: + type: object + properties: + createdAt: + type: string + format: date-time + port: + type: string + protocol: + type: string + serviceName: + type: string + serviceNamespace: + type: string + served: true + storage: true + subresources: + status: {} diff --git a/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml b/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml index 9b8b5daadd..f96d8f1834 100644 --- a/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml +++ b/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml @@ -2,9514 +2,4781 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: clusterserviceversions.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: ClusterServiceVersion listKind: ClusterServiceVersionList plural: clusterserviceversions shortNames: - - csv - - csvs + - csv + - csvs singular: clusterserviceversion scope: Namespaced versions: - - additionalPrinterColumns: - - description: The name of the CSV - jsonPath: .spec.displayName - name: Display - type: string - - description: The version of the CSV - jsonPath: .spec.version - name: Version - type: string - - description: The name of a CSV that this one replaces - jsonPath: .spec.replaces - name: Replaces - type: string - - jsonPath: .status.phase - name: Phase - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: ClusterServiceVersion is a Custom Resource of type `ClusterServiceVersionSpec`. - type: object - required: - - metadata - - 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: ClusterServiceVersionSpec declarations tell OLM how to install - an operator that can manage apps for a given version. - type: object - required: - - displayName - - install - properties: - annotations: - description: Annotations is an unstructured key value map stored with - a resource that may be set by external tools to store and retrieve - arbitrary metadata. - type: object - additionalProperties: + - additionalPrinterColumns: + - description: The name of the CSV + jsonPath: .spec.displayName + name: Display + type: string + - description: The version of the CSV + jsonPath: .spec.version + name: Version + type: string + - description: The name of a CSV that this one replaces + jsonPath: .spec.replaces + name: Replaces + type: string + - jsonPath: .status.phase + name: Phase + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: ClusterServiceVersion is a Custom Resource of type `ClusterServiceVersionSpec`. + type: object + required: + - metadata + - 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: ClusterServiceVersionSpec declarations tell OLM how to install an operator that can manage apps for a given version. + type: object + required: + - displayName + - install + properties: + annotations: + description: Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. + type: object + additionalProperties: + type: string + apiservicedefinitions: + description: APIServiceDefinitions declares all of the extension apis managed or required by an operator being ran by ClusterServiceVersion. + type: object + properties: + owned: + type: array + items: + description: APIServiceDescription provides details to OLM about apis provided via aggregation + type: object + required: + - group + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + containerPort: + type: integer + format: int32 + deploymentName: + type: string + description: + type: string + displayName: + type: string + group: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + required: + type: array + items: + description: APIServiceDescription provides details to OLM about apis provided via aggregation + type: object + required: + - group + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + containerPort: + type: integer + format: int32 + deploymentName: + type: string + description: + type: string + displayName: + type: string + group: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + customresourcedefinitions: + description: "CustomResourceDefinitions declares all of the CRDs managed or required by an operator being ran by ClusterServiceVersion. \n If the CRD is present in the Owned list, it is implicitly required." + type: object + properties: + owned: + type: array + items: + description: CRDDescription provides details to OLM about the CRDs + type: object + required: + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + description: + type: string + displayName: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + required: + type: array + items: + description: CRDDescription provides details to OLM about the CRDs + type: object + required: + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + description: + type: string + displayName: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + description: type: string - apiservicedefinitions: - description: APIServiceDefinitions declares all of the extension apis - managed or required by an operator being ran by ClusterServiceVersion. - type: object - properties: - owned: - type: array - items: - description: APIServiceDescription provides details to OLM about - apis provided via aggregation + displayName: + type: string + icon: + type: array + items: + type: object + required: + - base64data + - mediatype + properties: + base64data: + type: string + mediatype: + type: string + install: + description: NamedInstallStrategy represents the block of an ClusterServiceVersion resource where the install strategy is specified. + type: object + required: + - strategy + properties: + spec: + description: StrategyDetailsDeployment represents the parsed details of a Deployment InstallStrategy. type: object required: - - group - - kind - - name - - version + - deployments properties: - actionDescriptors: + clusterPermissions: type: array items: - description: ActionDescriptor describes a declarative - action that can be performed on a custom resource instance + description: StrategyDeploymentPermissions describe the rbac rules and service account needed by the install strategy type: object required: - - path + - rules + - serviceAccountName properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: + rules: type: array items: - type: string - containerPort: - type: integer - format: int32 - deploymentName: - type: string - description: - type: string - displayName: - type: string - group: - type: string - kind: - type: string - name: - type: string - resources: + description: PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to. + type: object + required: + - verbs + properties: + apiGroups: + description: APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. + type: array + items: + type: string + nonResourceURLs: + description: NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both. + type: array + items: + type: string + resourceNames: + description: ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. + type: array + items: + type: string + resources: + description: Resources is a list of resources this rule applies to. ResourceAll represents all resources. + type: array + items: + type: string + verbs: + description: Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds. + type: array + items: + type: string + serviceAccountName: + type: string + deployments: type: array items: - description: APIResourceReference is a Kubernetes resource - type used by a custom resource + description: StrategyDeploymentSpec contains the name, spec and labels for the deployment ALM should create type: object required: - - kind - - name - - version + - name + - spec properties: - kind: - type: string - name: - type: string - version: - type: string - specDescriptors: - type: array - items: - description: SpecDescriptor describes a field in a spec - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - statusDescriptors: - type: array - items: - description: StatusDescriptor describes a field in a status - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - version: - type: string - required: - type: array - items: - description: APIServiceDescription provides details to OLM about - apis provided via aggregation - type: object - required: - - group - - kind - - name - - version - properties: - actionDescriptors: - type: array - items: - description: ActionDescriptor describes a declarative - action that can be performed on a custom resource instance - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - containerPort: - type: integer - format: int32 - deploymentName: - type: string - description: - type: string - displayName: - type: string - group: - type: string - kind: - type: string - name: - type: string - resources: - type: array - items: - description: APIResourceReference is a Kubernetes resource - type used by a custom resource - type: object - required: - - kind - - name - - version - properties: - kind: - type: string - name: - type: string - version: - type: string - specDescriptors: - type: array - items: - description: SpecDescriptor describes a field in a spec - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - statusDescriptors: - type: array - items: - description: StatusDescriptor describes a field in a status - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - version: - type: string - customresourcedefinitions: - description: "CustomResourceDefinitions declares all of the CRDs managed - or required by an operator being ran by ClusterServiceVersion. \n - If the CRD is present in the Owned list, it is implicitly required." - type: object - properties: - owned: - type: array - items: - description: CRDDescription provides details to OLM about the - CRDs - type: object - required: - - kind - - name - - version - properties: - actionDescriptors: - type: array - items: - description: ActionDescriptor describes a declarative - action that can be performed on a custom resource instance - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - description: - type: string - displayName: - type: string - kind: - type: string - name: - type: string - resources: - type: array - items: - description: APIResourceReference is a Kubernetes resource - type used by a custom resource - type: object - required: - - kind - - name - - version - properties: - kind: - type: string - name: - type: string - version: - type: string - specDescriptors: - type: array - items: - description: SpecDescriptor describes a field in a spec - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - statusDescriptors: - type: array - items: - description: StatusDescriptor describes a field in a status - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - version: - type: string - required: - type: array - items: - description: CRDDescription provides details to OLM about the - CRDs - type: object - required: - - kind - - name - - version - properties: - actionDescriptors: - type: array - items: - description: ActionDescriptor describes a declarative - action that can be performed on a custom resource instance - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: + label: + description: Set is a map of label:value. It implements Labels. + type: object + additionalProperties: type: string - description: - type: string - displayName: - type: string - kind: - type: string - name: - type: string - resources: - type: array - items: - description: APIResourceReference is a Kubernetes resource - type used by a custom resource - type: object - required: - - kind - - name - - version - properties: - kind: - type: string name: type: string - version: - type: string - specDescriptors: - type: array - items: - description: SpecDescriptor describes a field in a spec - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - statusDescriptors: - type: array - items: - description: StatusDescriptor describes a field in a status - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - version: - type: string - description: - type: string - displayName: - type: string - icon: - type: array - items: - type: object - required: - - base64data - - mediatype - properties: - base64data: - type: string - mediatype: - type: string - install: - description: NamedInstallStrategy represents the block of an ClusterServiceVersion - resource where the install strategy is specified. - type: object - required: - - strategy - properties: - spec: - description: StrategyDetailsDeployment represents the parsed details - of a Deployment InstallStrategy. - type: object - required: - - deployments - properties: - clusterPermissions: - type: array - items: - description: StrategyDeploymentPermissions describe the - rbac rules and service account needed by the install strategy - type: object - required: - - rules - - serviceAccountName - properties: - rules: - type: array - items: - description: PolicyRule holds information that describes - a policy rule, but does not contain information - about who the rule applies to or which namespace - the rule applies to. + spec: + description: DeploymentSpec is the specification of the desired behavior of the Deployment. type: object required: - - verbs + - selector + - template properties: - apiGroups: - description: APIGroups is the name of the APIGroup - that contains the resources. If multiple API - groups are specified, any action requested against - one of the enumerated resources in any API group - will be allowed. - type: array - items: - type: string - nonResourceURLs: - description: NonResourceURLs is a set of partial - urls that a user should have access to. *s - are allowed, but only as the full, final step - in the path Since non-resource URLs are not - namespaced, this field is only applicable for - ClusterRoles referenced from a ClusterRoleBinding. - Rules can either apply to API resources (such - as "pods" or "secrets") or non-resource URL - paths (such as "/api"), but not both. - type: array - items: - type: string - resourceNames: - description: ResourceNames is an optional white - list of names that the rule applies to. An - empty set means that everything is allowed. - type: array - items: - type: string - resources: - description: Resources is a list of resources - this rule applies to. ResourceAll represents - all resources. - type: array - items: - type: string - verbs: - description: Verbs is a list of Verbs that apply - to ALL the ResourceKinds and AttributeRestrictions - contained in this rule. VerbAll represents - all kinds. - type: array - items: - type: string - serviceAccountName: - type: string - deployments: - type: array - items: - description: StrategyDeploymentSpec contains the name, spec - and labels for the deployment ALM should create - type: object - required: - - name - - spec - properties: - label: - description: Set is a map of label:value. It implements - Labels. - type: object - additionalProperties: - type: string - name: - type: string - spec: - description: DeploymentSpec is the specification of - the desired behavior of the Deployment. - type: object - required: - - selector - - template - properties: - minReadySeconds: - description: Minimum number of seconds for which - a newly created pod should be ready without any - of its container crashing, for it to be considered - available. Defaults to 0 (pod will be considered - available as soon as it is ready) - type: integer - format: int32 - paused: - description: Indicates that the deployment is paused. - type: boolean - progressDeadlineSeconds: - description: The maximum time in seconds for a deployment - to make progress before it is considered to be - failed. The deployment controller will continue - to process failed deployments and a condition - with a ProgressDeadlineExceeded reason will be - surfaced in the deployment status. Note that progress - will not be estimated during the time a deployment - is paused. Defaults to 600s. - type: integer - format: int32 - replicas: - description: Number of desired pods. This is a pointer - to distinguish between explicit zero and not specified. - Defaults to 1. - type: integer - format: int32 - revisionHistoryLimit: - description: The number of old ReplicaSets to retain - to allow rollback. This is a pointer to distinguish - between explicit zero and not specified. Defaults - to 10. - type: integer - format: int32 - selector: - description: Label selector for pods. Existing ReplicaSets - whose pods are selected by this will be the ones - affected by this deployment. It must match the - pod template's labels. - 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. + minReadySeconds: + description: Minimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready) + type: integer + format: int32 + paused: + description: Indicates that the deployment is paused. + type: boolean + progressDeadlineSeconds: + description: The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s. + type: integer + format: int32 + replicas: + description: Number of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1. + type: integer + format: int32 + revisionHistoryLimit: + description: The number of old ReplicaSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 10. + type: integer + format: int32 + selector: + description: Label selector for pods. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment. It must match the pod template's labels. + 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 + strategy: + description: The deployment strategy to use to replace existing pods with new ones. + type: object + properties: + rollingUpdate: + description: 'Rolling update config params. Present only if DeploymentStrategyType = RollingUpdate. --- TODO: Update this to follow our convention for oneOf, whatever we decide it to be.' 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: + maxSurge: + description: 'The maximum number of pods that can be scheduled above the desired number of pods. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 25%. Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when the rolling update starts, such that the total number of old and new pods do not exceed 130% of desired pods. Once old pods have been killed, new ReplicaSet can be scaled up further, ensuring that total number of pods running at any time during the update is at most 130% of desired pods.' + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + maxUnavailable: + description: 'The maximum number of pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 25%. Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods immediately when the rolling update starts. Once new pods are ready, old ReplicaSet can be scaled down further, followed by scaling up the new ReplicaSet, ensuring that the total number of pods available at all times during the update is at least 70% of desired pods.' + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + type: + description: Type of deployment. Can be "Recreate" or "RollingUpdate". Default is RollingUpdate. type: string - strategy: - description: The deployment strategy to use to replace - existing pods with new ones. - type: object - properties: - rollingUpdate: - description: 'Rolling update config params. - Present only if DeploymentStrategyType = RollingUpdate. - --- TODO: Update this to follow our convention - for oneOf, whatever we decide it to be.' - type: object - properties: - maxSurge: - description: 'The maximum number of pods - that can be scheduled above the desired - number of pods. Value can be an absolute - number (ex: 5) or a percentage of desired - pods (ex: 10%). This can not be 0 if MaxUnavailable - is 0. Absolute number is calculated from - percentage by rounding up. Defaults to - 25%. Example: when this is set to 30%, - the new ReplicaSet can be scaled up immediately - when the rolling update starts, such that - the total number of old and new pods do - not exceed 130% of desired pods. Once - old pods have been killed, new ReplicaSet - can be scaled up further, ensuring that - total number of pods running at any time - during the update is at most 130% of desired - pods.' - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - maxUnavailable: - description: 'The maximum number of pods - that can be unavailable during the update. - Value can be an absolute number (ex: 5) - or a percentage of desired pods (ex: 10%). - Absolute number is calculated from percentage - by rounding down. This can not be 0 if - MaxSurge is 0. Defaults to 25%. Example: - when this is set to 30%, the old ReplicaSet - can be scaled down to 70% of desired pods - immediately when the rolling update starts. - Once new pods are ready, old ReplicaSet - can be scaled down further, followed by - scaling up the new ReplicaSet, ensuring - that the total number of pods available - at all times during the update is at least - 70% of desired pods.' - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - type: - description: Type of deployment. Can be "Recreate" - or "RollingUpdate". Default is RollingUpdate. - type: string - template: - description: Template describes the pods that will - be created. - type: object - properties: - metadata: - description: 'Standard object''s metadata. More - info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - type: object - x-kubernetes-preserve-unknown-fields: true - spec: - description: 'Specification of the desired behavior - of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' - type: object - required: - - containers - properties: - activeDeadlineSeconds: - description: Optional duration in seconds - the pod may be active on the node relative - to StartTime before the system will actively - try to mark it failed and kill associated - containers. Value must be a positive integer. - type: integer - format: int64 - affinity: - description: If specified, the pod's scheduling - constraints - type: object - properties: - nodeAffinity: - description: Describes node affinity - scheduling rules for the pod. - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will - prefer to schedule pods to nodes - that satisfy the affinity expressions - specified by this field, but it - may choose a node that violates - one or more of the expressions. - The node that is most preferred - is the one with the greatest sum - of weights, i.e. for each node - that meets all of the scheduling - requirements (resource request, - requiredDuringScheduling affinity - expressions, etc.), compute a - sum by iterating through the elements - of this field and adding "weight" - to the sum if the node matches - the corresponding matchExpressions; - the node(s) with the highest sum - are the most preferred. - type: array - items: - description: An empty preferred - scheduling term matches all - objects with implicit weight - 0 (i.e. it's a no-op). A null - preferred scheduling term matches - no objects (i.e. is also a no-op). + template: + description: Template describes the pods that will be created. + type: object + properties: + metadata: + description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' + type: object + x-kubernetes-preserve-unknown-fields: true + spec: + description: 'Specification of the desired behavior of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' + type: object + required: + - containers + properties: + activeDeadlineSeconds: + description: Optional duration in seconds the pod may be active on the node relative to StartTime before the system will actively try to mark it failed and kill associated containers. Value must be a positive integer. + type: integer + format: int64 + affinity: + description: If specified, the pod's scheduling constraints + type: object + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for the pod. + type: object + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. + type: array + items: + description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). + type: object + required: + - preference + - weight + properties: + preference: + description: A node selector term, associated with the corresponding weight. + type: object + properties: + matchExpressions: + description: A list of node selector requirements by node's labels. + type: array + items: + description: A node 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: The label key that the selector applies to. + type: string + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: 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. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchFields: + description: A list of node selector requirements by node's fields. + type: array + items: + description: A node 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: The label key that the selector applies to. + type: string + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: 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. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + weight: + description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. + type: integer + format: int32 + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. type: object required: - - preference - - weight + - nodeSelectorTerms properties: - preference: - description: A node selector - term, associated with the - corresponding weight. - type: object - properties: - matchExpressions: - description: A list of - node selector requirements - by node's labels. - type: array - items: - description: A node - 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: The - label key that - the selector applies - to. - type: string - operator: - description: Represents - a key's relationship - to a set of values. - Valid operators - are In, NotIn, - Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: 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. - If the operator - is Gt or Lt, the - values array must - have a single - element, which - will be interpreted - as an integer. - This array is - replaced during - a strategic merge - patch. - type: array - items: + nodeSelectorTerms: + description: Required. A list of node selector terms. The terms are ORed. + type: array + items: + description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements by node's labels. + type: array + items: + description: A node 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: The label key that the selector applies to. type: string - matchFields: - description: A list of - node selector requirements - by node's fields. - type: array - items: - description: A node - 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: The - label key that - the selector applies - to. - type: string - operator: - description: Represents - a key's relationship - to a set of values. - Valid operators - are In, NotIn, - Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: 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. - If the operator - is Gt or Lt, the - values array must - have a single - element, which - will be interpreted - as an integer. - This array is - replaced during - a strategic merge - patch. - type: array - items: + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. type: string - weight: - description: Weight associated - with matching the corresponding - nodeSelectorTerm, in the - range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements - specified by this field are not - met at scheduling time, the pod - will not be scheduled onto the - node. If the affinity requirements - specified by this field cease - to be met at some point during - pod execution (e.g. due to an - update), the system may or may - not try to eventually evict the - pod from its node. - type: object - required: - - nodeSelectorTerms - properties: - nodeSelectorTerms: - description: Required. A list - of node selector terms. The - terms are ORed. - type: array - items: - description: A null or empty - node selector term matches - no objects. The requirements - of them are ANDed. The TopologySelectorTerm - type implements a subset - of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of - node selector requirements - by node's labels. - type: array - items: - description: A node - 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: The - label key that - the selector applies - to. - type: string - operator: - description: Represents - a key's relationship - to a set of values. - Valid operators - are In, NotIn, - Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: 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. - If the operator - is Gt or Lt, the - values array must - have a single - element, which - will be interpreted - as an integer. - This array is - replaced during - a strategic merge - patch. - type: array - items: + values: + description: 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. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchFields: + description: A list of node selector requirements by node's fields. + type: array + items: + description: A node 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: The label key that the selector applies to. type: string - matchFields: - description: A list of - node selector requirements - by node's fields. - type: array - items: - description: A node - selector requirement - is a selector that - contains values, a - key, and an operator - that relates the key - and values. + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: 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. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + podAffinity: + description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). + type: object + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) + type: object + required: + - podAffinityTerm + - weight + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated with the corresponding weight. + type: object + required: + - topologyKey + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. type: object - required: - - key - - operator properties: - key: - description: The - label key that - the selector applies - to. - type: string - operator: - description: Represents - a key's relationship - to a set of values. - Valid operators - are In, NotIn, - Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: 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. - If the operator - is Gt or Lt, the - values array must - have a single - element, which - will be interpreted - as an integer. - This array is - replaced during - a strategic merge - patch. + 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 - podAffinity: - description: Describes pod affinity - scheduling rules (e.g. co-locate this - pod in the same node, zone, etc. as - some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will - prefer to schedule pods to nodes - that satisfy the affinity expressions - specified by this field, but it - may choose a node that violates - one or more of the expressions. - The node that is most preferred - is the one with the greatest sum - of weights, i.e. for each node - that meets all of the scheduling - requirements (resource request, - requiredDuringScheduling affinity - expressions, etc.), compute a - sum by iterating through the elements - of this field and adding "weight" - to the sum if the node has pods - which matches the corresponding - podAffinityTerm; the node(s) with - the highest sum are the most preferred. - type: array - items: - description: The weights of all - of the matched WeightedPodAffinityTerm - fields are added per-node to - find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod - affinity term, associated - with the corresponding weight. - type: object - required: + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: + type: string + topologyKey: + description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. + type: string + weight: + description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. + type: integer + format: int32 + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running + type: object + required: - topologyKey - properties: - labelSelector: - description: A label query - over a set of resources, - in this case pods. - 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: + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. + 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. + 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 - 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 - namespaces: - description: namespaces - specifies which namespaces - the labelSelector applies - to (matches against); - null or empty list means - "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod - should be co-located - (affinity) or not co-located - (anti-affinity) with - the pods matching the - labelSelector in the - specified namespaces, - where co-located is - defined as running on - a node whose value of - the label with key topologyKey - matches that of any - node on which any of - the selected pods is - running. Empty topologyKey - is not allowed. + 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 + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: type: string - weight: - description: weight associated - with matching the corresponding - podAffinityTerm, in the - range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements - specified by this field are not - met at scheduling time, the pod - will not be scheduled onto the - node. If the affinity requirements - specified by this field cease - to be met at some point during - pod execution (e.g. due to a pod - label update), the system may - or may not try to eventually evict - the pod from its node. When there - are multiple elements, the lists - of nodes corresponding to each - podAffinityTerm are intersected, - i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of - pods (namely those matching - the labelSelector relative to - the given namespace(s)) that - this pod should be co-located - (affinity) or not co-located - (anti-affinity) with, where - co-located is defined as running - on a node whose value of the - label with key - matches that of any node on - which a pod of the set of pods - is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query - over a set of resources, - in this case pods. - 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. + topologyKey: + description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. + type: string + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). + type: object + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) + type: object + required: + - podAffinityTerm + - weight + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated with the corresponding weight. + type: object + required: + - topologyKey + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. 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. + 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 - 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: + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: + type: string + topologyKey: + description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. type: string - namespaces: - description: namespaces specifies - which namespaces the labelSelector - applies to (matches against); - null or empty list means - "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should - be co-located (affinity) - or not co-located (anti-affinity) - with the pods matching the - labelSelector in the specified - namespaces, where co-located - is defined as running on - a node whose value of the - label with key topologyKey - matches that of any node - on which any of the selected - pods is running. Empty topologyKey - is not allowed. - type: string - podAntiAffinity: - description: Describes pod anti-affinity - scheduling rules (e.g. avoid putting - this pod in the same node, zone, etc. - as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will - prefer to schedule pods to nodes - that satisfy the anti-affinity - expressions specified by this - field, but it may choose a node - that violates one or more of the - expressions. The node that is - most preferred is the one with - the greatest sum of weights, i.e. - for each node that meets all of - the scheduling requirements (resource - request, requiredDuringScheduling - anti-affinity expressions, etc.), - compute a sum by iterating through - the elements of this field and - adding "weight" to the sum if - the node has pods which matches - the corresponding podAffinityTerm; - the node(s) with the highest sum - are the most preferred. - type: array - items: - description: The weights of all - of the matched WeightedPodAffinityTerm - fields are added per-node to - find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod - affinity term, associated - with the corresponding weight. - type: object - required: + weight: + description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. + type: integer + format: int32 + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running + type: object + required: - topologyKey - properties: - labelSelector: - description: A label query - over a set of resources, - in this case pods. - 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: + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. + 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. + 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 - 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 - namespaces: - description: namespaces - specifies which namespaces - the labelSelector applies - to (matches against); - null or empty list means - "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod - should be co-located - (affinity) or not co-located - (anti-affinity) with - the pods matching the - labelSelector in the - specified namespaces, - where co-located is - defined as running on - a node whose value of - the label with key topologyKey - matches that of any - node on which any of - the selected pods is - running. Empty topologyKey - is not allowed. + 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 + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: type: string - weight: - description: weight associated - with matching the corresponding - podAffinityTerm, in the - range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity - requirements specified by this - field are not met at scheduling - time, the pod will not be scheduled - onto the node. If the anti-affinity - requirements specified by this - field cease to be met at some - point during pod execution (e.g. - due to a pod label update), the - system may or may not try to eventually - evict the pod from its node. When - there are multiple elements, the - lists of nodes corresponding to - each podAffinityTerm are intersected, - i.e. all terms must be satisfied. + topologyKey: + description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. + type: string + automountServiceAccountToken: + description: AutomountServiceAccountToken indicates whether a service account token should be automatically mounted. + type: boolean + containers: + description: List of containers belonging to the pod. Containers cannot currently be added or removed. There must be at least one container in a Pod. Cannot be updated. + type: array + items: + description: A single application container that you want to run within a pod. + type: object + required: + - name + properties: + args: + description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + command: + description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + env: + description: List of environment variables to set in the container. Cannot be updated. type: array items: - description: Defines a set of - pods (namely those matching - the labelSelector relative to - the given namespace(s)) that - this pod should be co-located - (affinity) or not co-located - (anti-affinity) with, where - co-located is defined as running - on a node whose value of the - label with key - matches that of any node on - which a pod of the set of pods - is running + description: EnvVar represents an environment variable present in a Container. type: object required: - - topologyKey + - name properties: - labelSelector: - description: A label query - over a set of resources, - in this case pods. + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded using the previous 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. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(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: - 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: + configMapKeyRef: + description: Selects a key of a ConfigMap. + 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. + 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 + 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 - additionalProperties: - type: string - namespaces: - description: namespaces specifies - which namespaces the labelSelector - applies to (matches against); - null or empty list means - "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should - be co-located (affinity) - or not co-located (anti-affinity) - with the pods matching the - labelSelector in the specified - namespaces, where co-located - is defined as running on - a node whose value of the - label with key topologyKey - matches that of any node - on which any of the selected - pods is running. Empty topologyKey - is not allowed. + 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 + 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 + 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 + envFrom: + description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps + type: object + properties: + configMapRef: + description: The ConfigMap to select from + type: object + properties: + 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 must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. type: string - automountServiceAccountToken: - description: AutomountServiceAccountToken - indicates whether a service account token - should be automatically mounted. - type: boolean - containers: - description: List of containers belonging - to the pod. Containers cannot currently - be added or removed. There must be at - least one container in a Pod. Cannot be - updated. - type: array - items: - description: A single application container - that you want to run within a pod. - type: object - required: - - name - properties: - args: - description: 'Arguments to the entrypoint. - The docker image''s CMD is used - if this is not provided. Variable - references $(VAR_NAME) are expanded - using the container''s environment. - If a variable cannot be resolved, - the reference in the input string - will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless - of whether the variable exists or - not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + secretRef: + description: The Secret to select from + type: object + properties: + 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 must be defined + type: boolean + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.' type: string - command: - description: 'Entrypoint array. Not - executed within a shell. The docker - image''s ENTRYPOINT is used if this - is not provided. Variable references - $(VAR_NAME) are expanded using the - container''s environment. If a variable - cannot be resolved, the reference - in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped - with a double $$, ie: $$(VAR_NAME). - Escaped references will never be - expanded, regardless of whether - the variable exists or not. Cannot - be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string - env: - description: List of environment variables - to set in the container. Cannot - be updated. - type: array - items: - description: EnvVar represents an - environment variable present in - a Container. + lifecycle: + description: Actions that the management system should take in response to container lifecycle events. Cannot be updated. 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 previous 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. The $(VAR_NAME) - syntax can be escaped with - a double $$, ie: $$(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. + postStart: + description: 'PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' type: object properties: - configMapKeyRef: - description: Selects a key - of a ConfigMap. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - key + - port properties: - key: - description: The key - to select. + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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?' + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - optional: - description: Specify - whether the ConfigMap - or its key must be - defined - type: boolean - 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.' + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - fieldPath + - port 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. + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - 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.' + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + preStop: + description: 'PreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod''s termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod''s termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - resource + - port properties: - containerName: - description: 'Container - name: required for - volumes, optional - for env vars' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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]+))))?$ + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - resource: - description: 'Required: - resource to select' + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - secretKeyRef: - description: Selects a key - of a secret in the pod's - namespace + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - key + - port 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?' + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - optional: - description: Specify - whether the Secret - or its key must be - defined - type: boolean - envFrom: - description: List of sources to populate - environment variables in the container. - The keys defined within a source - must be a C_IDENTIFIER. All invalid - keys will be reported as an event - when the container is starting. - When a key exists in multiple sources, - the value associated with the last - source will take precedence. Values - defined by an Env with a duplicate - key will take precedence. Cannot - be updated. - type: array - items: - description: EnvFromSource represents - the source of a set of ConfigMaps + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + livenessProbe: + description: 'Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: object properties: - configMapRef: - description: The ConfigMap to - select from + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. type: object properties: - 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 must be - defined - type: boolean - prefix: - description: An optional identifier - to prepend to each key in - the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select - from + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. type: object + required: + - port properties: - 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?' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - optional: - description: Specify whether - the Secret must be defined - type: boolean - image: - description: 'Docker image name. More - info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow - higher level config management to - default or override container images - in workload controllers like Deployments - and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One - of Always, Never, IfNotPresent. - Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - lifecycle: - description: Actions that the management - system should take in response to - container lifecycle events. Cannot - be updated. - type: object - properties: - postStart: - description: 'PostStart is called - immediately after a container - is created. If the handler fails, - the container is terminated - and restarted according to its - restart policy. Other management - of the container blocks until - the hook completes. More info: - https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - preStop: - description: 'PreStop is called - immediately before a container - is terminated due to an API - request or management event - such as liveness/startup probe - failure, preemption, resource - contention, etc. The handler - is not called if the container - crashes or exits. The reason - for termination is passed to - the handler. The Pod''s termination - grace period countdown begins - before the PreStop hooked is - executed. Regardless of the - outcome of the handler, the - container will eventually terminate - within the Pod''s termination - grace period. Other management - of the container blocks until - the hook completes or until - the termination grace period - is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: - name - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: - type: integer - type: string - x-kubernetes-int-or-string: true - livenessProbe: - description: 'Periodic probe of container - liveness. Container will be restarted - if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - name: - description: Name of the container - specified as a DNS_LABEL. Each container - in a pod must have a unique name - (DNS_LABEL). Cannot be updated. - type: string - ports: - description: List of ports to expose - from the container. Exposing a port - here gives the system additional - information about the network connections - a container uses, but is primarily - informational. Not specifying a - port here DOES NOT prevent that - port from being exposed. Any port - which is listening on the default - "0.0.0.0" address inside a container - will be accessible from the network. - Cannot be updated. - type: array - items: - description: ContainerPort represents - a network port in a single container. - type: object - required: - - containerPort - properties: - containerPort: - description: Number of port - to expose on the pod's IP - address. This must be a valid - port number, 0 < x < 65536. + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: integer format: int32 - hostIP: - description: What host IP to - bind the external port to. - type: string - hostPort: - description: Number of port - to expose on the host. If - specified, this must be a - valid port number, 0 < x < - 65536. If HostNetwork is specified, - this must match ContainerPort. - Most containers do not need - this. + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: integer format: int32 - name: - description: If specified, this - must be an IANA_SVC_NAME and - unique within the pod. Each - named port in a pod must have - a unique name. Name for the - port that can be referred - to by services. - type: string - protocol: - description: Protocol for port. - Must be UDP, TCP, or SCTP. - Defaults to "TCP". - type: string - default: TCP - x-kubernetes-list-map-keys: - - containerPort - - protocol - x-kubernetes-list-type: map - readinessProbe: - description: 'Periodic probe of container - service readiness. Container will - be removed from service endpoints - if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: - type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. + name: + description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated. + type: string + ports: + description: List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network port in a single container. type: object required: - - port + - containerPort properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. + containerPort: + description: Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536. + type: integer + format: int32 + hostIP: + description: What host IP to bind the external port to. type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. + hostPort: + description: Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this. + type: integer + format: int32 + name: + description: If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services. type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' + protocol: + description: Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP". type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - resources: - description: 'Compute Resources required - by this container. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - properties: - limits: - description: 'Limits describes - the maximum amount of compute - resources allowed. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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 - securityContext: - description: 'Security options the - pod should run with. More info: - https://kubernetes.io/docs/concepts/policy/security-context/ - More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' - type: object - properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation - controls whether a process can - gain more privileges than its - parent process. This bool directly - controls if the no_new_privs - flag will be set on the container - process. AllowPrivilegeEscalation - is true always when the container - is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' - type: boolean - capabilities: - description: The capabilities - to add/drop when running containers. - Defaults to the default set - of capabilities granted by the - container runtime. - type: object - properties: - add: - description: Added capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + default: TCP + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + description: 'Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - drop: - description: Removed capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. type: string - privileged: - description: Run container in - privileged mode. Processes in - privileged containers are essentially - equivalent to root on the host. - Defaults to false. - type: boolean - procMount: - description: procMount denotes - the type of proc mount to use - for the containers. The default - is DefaultProcMount which uses - the container runtime defaults - for readonly paths and masked - paths. This requires the ProcMountType - feature flag to be enabled. - type: string - readOnlyRootFilesystem: - description: Whether this container - has a read-only root filesystem. - Default is false. - type: boolean - runAsGroup: - description: The GID to run the - entrypoint of the container - process. Uses runtime default - if unset. May also be set in - PodSecurityContext. If set - in both SecurityContext and - PodSecurityContext, the value - specified in SecurityContext - takes precedence. - type: integer - format: int64 - runAsNonRoot: - description: Indicates that the - container must run as a non-root - user. If true, the Kubelet will - validate the image at runtime - to ensure that it does not run - as UID 0 (root) and fail to - start the container if it does. - If unset or false, no such validation - will be performed. May also - be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: boolean - runAsUser: - description: The UID to run the - entrypoint of the container - process. Defaults to user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: integer - format: int64 - seLinuxOptions: - description: The SELinux context - to be applied to the container. - If unspecified, the container - runtime will allocate a random - SELinux context for each container. May - also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - 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 - seccompProfile: - description: The seccomp options - to use by this container. If - seccomp options are provided - at both the pod & container - level, the container options - override the pod options. - type: object - required: - - type - properties: - localhostProfile: - description: localhostProfile - indicates a profile defined - in a file on the node should - be used. The profile must - be preconfigured on the - node to work. Must be a - descending path, relative - to the kubelet's configured - seccomp profile location. - Must only be set if type - is "Localhost". - type: string - type: - description: "type indicates - which kind of seccomp profile - will be applied. Valid options - are: \n Localhost - a profile - defined in a file on the - node should be used. RuntimeDefault - - the container runtime - default profile should be - used. Unconfined - no profile - should be applied." - type: string - windowsOptions: - description: The Windows specific - settings applied to all containers. - If unspecified, the options - from the PodSecurityContext - will be used. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec - is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of - the GMSA credential spec - named by the GMSACredentialSpecName - field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName - is the name of the GMSA - credential spec to use. - type: string - runAsUserName: - description: The UserName - in Windows to run the entrypoint - of the container process. - Defaults to the user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. - If set in both SecurityContext - and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: string - startupProbe: - description: 'StartupProbe indicates - that the Pod has successfully initialized. - If specified, no other probes are - executed until this completes successfully. - If this probe fails, the Pod will - be restarted, just as if the livenessProbe - failed. This can be used to provide - different probe parameters at the - beginning of a Pod''s lifecycle, - when it might take a long time to - load data or warm a cache, than - during steady-state operation. This - cannot be updated. This is a beta - feature enabled by the StartupProbe - feature flag. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + resources: + description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - stdin: - description: Whether this container - should allocate a buffer for stdin - in the container runtime. If this - is not set, reads from stdin in - the container will always result - in EOF. Default is false. - type: boolean - stdinOnce: - description: Whether the container - runtime should close the stdin channel - after it has been opened by a single - attach. When stdin is true the stdin - stream will remain open across multiple - attach sessions. If stdinOnce is - set to true, stdin is opened on - container start, is empty until - the first client attaches to stdin, - and then remains open and accepts - data until the client disconnects, - at which time stdin is closed and - remains closed until the container - is restarted. If this flag is false, - a container processes that reads - from stdin will never receive an - EOF. Default is false - type: boolean - terminationMessagePath: - description: 'Optional: Path at which - the file to which the container''s - termination message will be written - is mounted into the container''s - filesystem. Message written is intended - to be brief final status, such as - an assertion failure message. Will - be truncated by the node if greater - than 4096 bytes. The total message - length across all containers will - be limited to 12kb. Defaults to - /dev/termination-log. Cannot be - updated.' - type: string - terminationMessagePolicy: - description: Indicate how the termination - message should be populated. File - will use the contents of terminationMessagePath - to populate the container status - message on both success and failure. - FallbackToLogsOnError will use the - last chunk of container log output - if the termination message file - is empty and the container exited - with an error. The log output is - limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to - File. Cannot be updated. - type: string - tty: - description: Whether this container - should allocate a TTY for itself, - also requires 'stdin' to be true. - Default is false. - type: boolean - volumeDevices: - description: volumeDevices is the - list of block devices to be used - by the container. - type: array - items: - description: volumeDevice describes - a mapping of a raw block device - within a container. + securityContext: + description: 'Security options the pod should run with. More info: https://kubernetes.io/docs/concepts/policy/security-context/ More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' type: object - required: - - devicePath - - name properties: - devicePath: - description: devicePath is the - path inside of the container - that the device will be mapped - to. - type: string - name: - description: name must match - the name of a persistentVolumeClaim - in the pod + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. + type: object + properties: + add: + description: Added capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + drop: + description: Removed capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + privileged: + description: Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. type: string - volumeMounts: - description: Pod volumes to mount - into the container's filesystem. - Cannot be updated. - type: array - items: - description: VolumeMount describes - a mounting of a Volume within - a container. + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + 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 + seccompProfile: + description: The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. + type: object + required: + - type + properties: + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". + type: string + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: string + startupProbe: + description: 'StartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod''s lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: object - required: - - mountPath - - name properties: - mountPath: - description: Path within the - container at which the volume - should be mounted. Must not - contain ':'. - type: string - mountPropagation: - description: mountPropagation - determines how mounts are - propagated from the host to - container and the other way - around. When not set, MountPropagationNone - is used. This field is beta - in 1.10. - type: string - name: - description: This must match - the Name of a Volume. - type: string - readOnly: - description: Mounted read-only - if true, read-write otherwise - (false or unspecified). Defaults - to false. - type: boolean - subPath: - description: Path within the - volume from which the container's - volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within - the volume from which the - container's volume should - be mounted. Behaves similarly - to SubPath but environment - variable references $(VAR_NAME) - are expanded using the container's - environment. Defaults to "" - (volume's root). SubPathExpr - and SubPath are mutually exclusive. - type: string - workingDir: - description: Container's working directory. - If not specified, the container - runtime's default will be used, - which might be configured in the - container image. Cannot be updated. - type: string - dnsConfig: - description: Specifies the DNS parameters - of a pod. Parameters specified here will - be merged to the generated DNS configuration - based on DNSPolicy. - type: object - properties: - nameservers: - description: A list of DNS name server - IP addresses. This will be appended - to the base nameservers generated - from DNSPolicy. Duplicated nameservers - will be removed. - type: array - items: - type: string - options: - description: A list of DNS resolver - options. This will be merged with - the base options generated from DNSPolicy. - Duplicated entries will be removed. - Resolution options given in Options - will override those that appear in - the base DNSPolicy. - type: array - items: - description: PodDNSConfigOption defines - DNS resolver options of a pod. - type: object - properties: - name: - description: Required. - type: string - value: - type: string - searches: - description: A list of DNS search domains - for host-name lookup. This will be - appended to the base search paths - generated from DNSPolicy. Duplicated - search paths will be removed. - type: array - items: - type: string - dnsPolicy: - description: Set DNS policy for the pod. - Defaults to "ClusterFirst". Valid values - are 'ClusterFirstWithHostNet', 'ClusterFirst', - 'Default' or 'None'. DNS parameters given - in DNSConfig will be merged with the policy - selected with DNSPolicy. To have DNS options - set along with hostNetwork, you have to - specify DNS policy explicitly to 'ClusterFirstWithHostNet'. - type: string - enableServiceLinks: - description: 'EnableServiceLinks indicates - whether information about services should - be injected into pod''s environment variables, - matching the syntax of Docker links. Optional: - Defaults to true.' - type: boolean - ephemeralContainers: - description: List of ephemeral containers - run in this pod. Ephemeral containers - may be run in an existing pod to perform - user-initiated actions such as debugging. - This list cannot be specified when creating - a pod, and it cannot be modified by updating - the pod spec. In order to add an ephemeral - container to an existing pod, use the - pod's ephemeralcontainers subresource. - This field is alpha-level and is only - honored by servers that enable the EphemeralContainers - feature. - type: array - items: - description: An EphemeralContainer is - a container that may be added temporarily - to an existing pod for user-initiated - activities such as debugging. Ephemeral - containers have no resource or scheduling - guarantees, and they will not be restarted - when they exit or when a pod is removed - or restarted. If an ephemeral container - causes a pod to exceed its resource - allocation, the pod may be evicted. - Ephemeral containers may not be added - by directly updating the pod spec. They - must be added via the pod's ephemeralcontainers - subresource, and they will appear in - the pod spec once added. This is an - alpha feature enabled by the EphemeralContainers - feature flag. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + stdin: + description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false + type: boolean + terminationMessagePath: + description: 'Optional: Path at which the file to which the container''s termination message will be written is mounted into the container''s filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.' + type: string + terminationMessagePolicy: + description: Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated. + type: string + tty: + description: Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be used by the container. + type: array + items: + description: volumeDevice describes a mapping of a raw block device within a container. + type: object + required: + - devicePath + - name + properties: + devicePath: + description: devicePath is the path inside of the container that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim in the pod + type: string + volumeMounts: + description: Pod volumes to mount into the container's filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. + type: object + required: + - mountPath + - name + properties: + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. + type: string + workingDir: + description: Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated. + type: string + dnsConfig: + description: Specifies the DNS parameters of a pod. Parameters specified here will be merged to the generated DNS configuration based on DNSPolicy. type: object - required: - - name properties: - args: - description: 'Arguments to the entrypoint. - The docker image''s CMD is used - if this is not provided. Variable - references $(VAR_NAME) are expanded - using the container''s environment. - If a variable cannot be resolved, - the reference in the input string - will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless - of whether the variable exists or - not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + nameservers: + description: A list of DNS name server IP addresses. This will be appended to the base nameservers generated from DNSPolicy. Duplicated nameservers will be removed. type: array items: type: string - command: - description: 'Entrypoint array. Not - executed within a shell. The docker - image''s ENTRYPOINT is used if this - is not provided. Variable references - $(VAR_NAME) are expanded using the - container''s environment. If a variable - cannot be resolved, the reference - in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped - with a double $$, ie: $$(VAR_NAME). - Escaped references will never be - expanded, regardless of whether - the variable exists or not. Cannot - be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + options: + description: A list of DNS resolver options. This will be merged with the base options generated from DNSPolicy. Duplicated entries will be removed. Resolution options given in Options will override those that appear in the base DNSPolicy. type: array items: - type: string - env: - description: List of environment variables - to set in the container. Cannot - be updated. - type: array - items: - description: EnvVar represents an - environment variable present in - a Container. + description: PodDNSConfigOption defines DNS resolver options of a pod. type: object - required: - - name properties: name: - description: Name of the environment - variable. Must be a C_IDENTIFIER. + description: Required. type: string value: - description: 'Variable references - $(VAR_NAME) are expanded using - the previous 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. The $(VAR_NAME) - syntax can be escaped with - a double $$, ie: $$(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. + searches: + description: A list of DNS search domains for host-name lookup. This will be appended to the base search paths generated from DNSPolicy. Duplicated search paths will be removed. + type: array + items: + type: string + dnsPolicy: + description: Set DNS policy for the pod. Defaults to "ClusterFirst". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'. + type: string + enableServiceLinks: + description: 'EnableServiceLinks indicates whether information about services should be injected into pod''s environment variables, matching the syntax of Docker links. Optional: Defaults to true.' + type: boolean + ephemeralContainers: + description: List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing pod to perform user-initiated actions such as debugging. This list cannot be specified when creating a pod, and it cannot be modified by updating the pod spec. In order to add an ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource. This field is alpha-level and is only honored by servers that enable the EphemeralContainers feature. + type: array + items: + description: An EphemeralContainer is a container that may be added temporarily to an existing pod for user-initiated activities such as debugging. Ephemeral containers have no resource or scheduling guarantees, and they will not be restarted when they exit or when a pod is removed or restarted. If an ephemeral container causes a pod to exceed its resource allocation, the pod may be evicted. Ephemeral containers may not be added by directly updating the pod spec. They must be added via the pod's ephemeralcontainers subresource, and they will appear in the pod spec once added. This is an alpha feature enabled by the EphemeralContainers feature flag. + type: object + required: + - name + properties: + args: + description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + command: + description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + env: + description: List of environment variables to set in the container. Cannot be updated. + 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 previous 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. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(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 + 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 + 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 + 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 + envFrom: + description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps + type: object + properties: + configMapRef: + description: The ConfigMap to select from + type: object + properties: + 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 must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + type: object + properties: + 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 must be defined + type: boolean + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + lifecycle: + description: Lifecycle is not allowed for ephemeral containers. + type: object + properties: + postStart: + description: 'PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' type: object properties: - configMapKeyRef: - description: Selects a key - of a ConfigMap. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - key + - port properties: - key: - description: The key - to select. + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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?' + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - optional: - description: Specify - whether the ConfigMap - or its key must be - defined - type: boolean - 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.' + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - fieldPath + - port properties: - apiVersion: - description: Version - of the schema the - FieldPath is written - in terms of, defaults - to "v1". + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - fieldPath: - description: Path of - the field to select - in the specified API - version. - type: string - 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.' + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + preStop: + description: 'PreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod''s termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod''s termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - resource + - port properties: - containerName: - description: 'Container - name: required for - volumes, optional - for env vars' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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]+))))?$ + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - resource: - description: 'Required: - resource to select' + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - secretKeyRef: - description: Selects a key - of a secret in the pod's - namespace + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - key + - port properties: - key: - description: The key - of the secret to select - from. Must be a valid - secret key. + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' 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 - envFrom: - description: List of sources to populate - environment variables in the container. - The keys defined within a source - must be a C_IDENTIFIER. All invalid - keys will be reported as an event - when the container is starting. - When a key exists in multiple sources, - the value associated with the last - source will take precedence. Values - defined by an Env with a duplicate - key will take precedence. Cannot - be updated. - type: array - items: - description: EnvFromSource represents - the source of a set of ConfigMaps + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + livenessProbe: + description: Probes are not allowed for ephemeral containers. type: object properties: - configMapRef: - description: The ConfigMap to - select from + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. type: object properties: - 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 must be - defined - type: boolean - prefix: - description: An optional identifier - to prepend to each key in - the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select - from + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. type: object + required: + - port properties: - 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?' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - optional: - description: Specify whether - the Secret must be defined - type: boolean - image: - description: 'Docker image name. More - info: https://kubernetes.io/docs/concepts/containers/images' - type: string - imagePullPolicy: - description: 'Image pull policy. One - of Always, Never, IfNotPresent. - Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - lifecycle: - description: Lifecycle is not allowed - for ephemeral containers. - type: object - properties: - postStart: - description: 'PostStart is called - immediately after a container - is created. If the handler fails, - the container is terminated - and restarted according to its - restart policy. Other management - of the container blocks until - the hook completes. More info: - https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - preStop: - description: 'PreStop is called - immediately before a container - is terminated due to an API - request or management event - such as liveness/startup probe - failure, preemption, resource - contention, etc. The handler - is not called if the container - crashes or exits. The reason - for termination is passed to - the handler. The Pod''s termination - grace period countdown begins - before the PreStop hooked is - executed. Regardless of the - outcome of the handler, the - container will eventually terminate - within the Pod''s termination - grace period. Other management - of the container blocks until - the hook completes or until - the termination grace period - is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: - name - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: - type: integer - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - livenessProbe: - description: Probes are not allowed - for ephemeral containers. - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + name: + description: Name of the ephemeral container specified as a DNS_LABEL. This name must be unique among all containers, init containers and ephemeral containers. + type: string + ports: + description: Ports are not allowed for ephemeral containers. + type: array + items: + description: ContainerPort represents a network port in a single container. type: object required: - - port + - containerPort properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' + containerPort: + description: Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536. + type: integer + format: int32 + hostIP: + description: What host IP to bind the external port to. type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - name: - description: Name of the ephemeral - container specified as a DNS_LABEL. - This name must be unique among all - containers, init containers and - ephemeral containers. - type: string - ports: - description: Ports are not allowed - for ephemeral containers. - type: array - items: - description: ContainerPort represents - a network port in a single container. + hostPort: + description: Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this. + type: integer + format: int32 + name: + description: If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services. + type: string + protocol: + description: Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP". + type: string + default: TCP + readinessProbe: + description: Probes are not allowed for ephemeral containers. type: object - required: - - containerPort properties: - containerPort: - description: Number of port - to expose on the pod's IP - address. This must be a valid - port number, 0 < x < 65536. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. type: integer format: int32 - hostIP: - description: What host IP to - bind the external port to. - type: string - hostPort: - description: Number of port - to expose on the host. If - specified, this must be a - valid port number, 0 < x < - 65536. If HostNetwork is specified, - this must match ContainerPort. - Most containers do not need - this. + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: integer format: int32 - name: - description: If specified, this - must be an IANA_SVC_NAME and - unique within the pod. Each - named port in a pod must have - a unique name. Name for the - port that can be referred - to by services. - type: string - protocol: - description: Protocol for port. - Must be UDP, TCP, or SCTP. - Defaults to "TCP". - type: string - readinessProbe: - description: Probes are not allowed - for ephemeral containers. - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + resources: + description: Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources already allocated to the pod. + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - resources: - description: Resources are not allowed - for ephemeral containers. Ephemeral - containers use spare resources already - allocated to the pod. - type: object - properties: - limits: - description: 'Limits describes - the maximum amount of compute - resources allowed. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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 - securityContext: - description: SecurityContext is not - allowed for ephemeral containers. - type: object - properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation - controls whether a process can - gain more privileges than its - parent process. This bool directly - controls if the no_new_privs - flag will be set on the container - process. AllowPrivilegeEscalation - is true always when the container - is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' - type: boolean - capabilities: - description: The capabilities - to add/drop when running containers. - Defaults to the default set - of capabilities granted by the - container runtime. - type: object - properties: - add: - description: Added capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + securityContext: + description: SecurityContext is not allowed for ephemeral containers. + type: object + properties: + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. + type: object + properties: + add: + description: Added capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + drop: + description: Removed capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + privileged: + description: Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. + type: string + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + level: + description: Level is SELinux level label that applies to the container. type: string - drop: - description: Removed capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + role: + description: Role is a SELinux role label that applies to the container. type: string - privileged: - description: Run container in - privileged mode. Processes in - privileged containers are essentially - equivalent to root on the host. - Defaults to false. - type: boolean - procMount: - description: procMount denotes - the type of proc mount to use - for the containers. The default - is DefaultProcMount which uses - the container runtime defaults - for readonly paths and masked - paths. This requires the ProcMountType - feature flag to be enabled. - type: string - readOnlyRootFilesystem: - description: Whether this container - has a read-only root filesystem. - Default is false. - type: boolean - runAsGroup: - description: The GID to run the - entrypoint of the container - process. Uses runtime default - if unset. May also be set in - PodSecurityContext. If set - in both SecurityContext and - PodSecurityContext, the value - specified in SecurityContext - takes precedence. - type: integer - format: int64 - runAsNonRoot: - description: Indicates that the - container must run as a non-root - user. If true, the Kubelet will - validate the image at runtime - to ensure that it does not run - as UID 0 (root) and fail to - start the container if it does. - If unset or false, no such validation - will be performed. May also - be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: boolean - runAsUser: - description: The UID to run the - entrypoint of the container - process. Defaults to user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: integer - format: int64 - seLinuxOptions: - description: The SELinux context - to be applied to the container. - If unspecified, the container - runtime will allocate a random - SELinux context for each container. May - also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. + 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 + seccompProfile: + description: The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. + type: object + required: + - type + properties: + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". + type: string + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: string + startupProbe: + description: Probes are not allowed for ephemeral containers. + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + stdin: + description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false + type: boolean + targetContainerName: + description: If set, the name of the container from PodSpec that this ephemeral container targets. The ephemeral container will be run in the namespaces (IPC, PID, etc) of this container. If not set then the ephemeral container is run in whatever namespaces are shared for the pod. Note that the container runtime must support this feature. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to which the container''s termination message will be written is mounted into the container''s filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.' + type: string + terminationMessagePolicy: + description: Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated. + type: string + tty: + description: Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be used by the container. + type: array + items: + description: volumeDevice describes a mapping of a raw block device within a container. type: object + required: + - devicePath + - name 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. + devicePath: + description: devicePath is the path inside of the container that the device will be mapped to. 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. + name: + description: name must match the name of a persistentVolumeClaim in the pod type: string - seccompProfile: - description: The seccomp options - to use by this container. If - seccomp options are provided - at both the pod & container - level, the container options - override the pod options. + volumeMounts: + description: Pod volumes to mount into the container's filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. type: object required: - - type + - mountPath + - name properties: - localhostProfile: - description: localhostProfile - indicates a profile defined - in a file on the node should - be used. The profile must - be preconfigured on the - node to work. Must be a - descending path, relative - to the kubelet's configured - seccomp profile location. - Must only be set if type - is "Localhost". + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. type: string - type: - description: "type indicates - which kind of seccomp profile - will be applied. Valid options - are: \n Localhost - a profile - defined in a file on the - node should be used. RuntimeDefault - - the container runtime - default profile should be - used. Unconfined - no profile - should be applied." + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. type: string - windowsOptions: - description: The Windows specific - settings applied to all containers. - If unspecified, the options - from the PodSecurityContext - will be used. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec - is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of - the GMSA credential spec - named by the GMSACredentialSpecName - field. + name: + description: This must match the Name of a Volume. type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName - is the name of the GMSA - credential spec to use. + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). type: string - runAsUserName: - description: The UserName - in Windows to run the entrypoint - of the container process. - Defaults to the user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. - If set in both SecurityContext - and PodSecurityContext, - the value specified in SecurityContext - takes precedence. + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. type: string - startupProbe: - description: Probes are not allowed - for ephemeral containers. - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: - type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. + workingDir: + description: Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated. + type: string + hostAliases: + description: HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts file if specified. This is only valid for non-hostNetwork pods. + type: array + items: + description: HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the pod's hosts file. + type: object + properties: + hostnames: + description: Hostnames for the above IP address. + type: array + items: + type: string + ip: + description: IP address of the host file entry. + type: string + hostIPC: + description: 'Use the host''s ipc namespace. Optional: Default to false.' + type: boolean + hostNetwork: + description: Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false. + type: boolean + hostPID: + description: 'Use the host''s pid namespace. Optional: Default to false.' + type: boolean + hostname: + description: Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. + type: string + imagePullSecrets: + description: 'ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. For example, in the case of docker, only DockerConfig type secrets are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod' + type: array + items: + description: LocalObjectReference contains enough information to let you locate the referenced object inside the same namespace. + type: object + properties: + 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 + initContainers: + description: 'List of initialization containers belonging to the pod. Init containers are executed in order prior to containers being started. If any init container fails, the pod is considered to have failed and is handled according to its restartPolicy. The name for an init container or normal container must be unique among all containers. Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes. The resourceRequirements of an init container are taken into account during scheduling by finding the highest request/limit for each resource type, and then using the max of of that value or the sum of the normal containers. Limits are applied to init containers in a similar fashion. Init containers cannot currently be added or removed. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/' + type: array + items: + description: A single application container that you want to run within a pod. + type: object + required: + - name + properties: + args: + description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + command: + description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + env: + description: List of environment variables to set in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable present in a Container. type: object required: - - port + - name properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. + value: + description: 'Variable references $(VAR_NAME) are expanded using the previous 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. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".' type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' + 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 + 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 + 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 + 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 + envFrom: + description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps type: object - required: - - port properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' + configMapRef: + description: The ConfigMap to select from + type: object + properties: + 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 must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - stdin: - description: Whether this container - should allocate a buffer for stdin - in the container runtime. If this - is not set, reads from stdin in - the container will always result - in EOF. Default is false. - type: boolean - stdinOnce: - description: Whether the container - runtime should close the stdin channel - after it has been opened by a single - attach. When stdin is true the stdin - stream will remain open across multiple - attach sessions. If stdinOnce is - set to true, stdin is opened on - container start, is empty until - the first client attaches to stdin, - and then remains open and accepts - data until the client disconnects, - at which time stdin is closed and - remains closed until the container - is restarted. If this flag is false, - a container processes that reads - from stdin will never receive an - EOF. Default is false - type: boolean - targetContainerName: - description: If set, the name of the - container from PodSpec that this - ephemeral container targets. The - ephemeral container will be run - in the namespaces (IPC, PID, etc) - of this container. If not set then - the ephemeral container is run in - whatever namespaces are shared for - the pod. Note that the container - runtime must support this feature. - type: string - terminationMessagePath: - description: 'Optional: Path at which - the file to which the container''s - termination message will be written - is mounted into the container''s - filesystem. Message written is intended - to be brief final status, such as - an assertion failure message. Will - be truncated by the node if greater - than 4096 bytes. The total message - length across all containers will - be limited to 12kb. Defaults to - /dev/termination-log. Cannot be - updated.' - type: string - terminationMessagePolicy: - description: Indicate how the termination - message should be populated. File - will use the contents of terminationMessagePath - to populate the container status - message on both success and failure. - FallbackToLogsOnError will use the - last chunk of container log output - if the termination message file - is empty and the container exited - with an error. The log output is - limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to - File. Cannot be updated. - type: string - tty: - description: Whether this container - should allocate a TTY for itself, - also requires 'stdin' to be true. - Default is false. - type: boolean - volumeDevices: - description: volumeDevices is the - list of block devices to be used - by the container. - type: array - items: - description: volumeDevice describes - a mapping of a raw block device - within a container. - type: object - required: - - devicePath - - name - properties: - devicePath: - description: devicePath is the - path inside of the container - that the device will be mapped - to. - type: string - name: - description: name must match - the name of a persistentVolumeClaim - in the pod - type: string - volumeMounts: - description: Pod volumes to mount - into the container's filesystem. - Cannot be updated. - type: array - items: - description: VolumeMount describes - a mounting of a Volume within - a container. - type: object - required: - - mountPath - - name - properties: - mountPath: - description: Path within the - container at which the volume - should be mounted. Must not - contain ':'. - type: string - mountPropagation: - description: mountPropagation - determines how mounts are - propagated from the host to - container and the other way - around. When not set, MountPropagationNone - is used. This field is beta - in 1.10. - type: string - name: - description: This must match - the Name of a Volume. - type: string - readOnly: - description: Mounted read-only - if true, read-write otherwise - (false or unspecified). Defaults - to false. - type: boolean - subPath: - description: Path within the - volume from which the container's - volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within - the volume from which the - container's volume should - be mounted. Behaves similarly - to SubPath but environment - variable references $(VAR_NAME) - are expanded using the container's - environment. Defaults to "" - (volume's root). SubPathExpr - and SubPath are mutually exclusive. - type: string - workingDir: - description: Container's working directory. - If not specified, the container - runtime's default will be used, - which might be configured in the - container image. Cannot be updated. - type: string - hostAliases: - description: HostAliases is an optional - list of hosts and IPs that will be injected - into the pod's hosts file if specified. - This is only valid for non-hostNetwork - pods. - type: array - items: - description: HostAlias holds the mapping - between IP and hostnames that will be - injected as an entry in the pod's hosts - file. - type: object - properties: - hostnames: - description: Hostnames for the above - IP address. - type: array - items: - type: string - ip: - description: IP address of the host - file entry. - type: string - hostIPC: - description: 'Use the host''s ipc namespace. - Optional: Default to false.' - type: boolean - hostNetwork: - description: Host networking requested for - this pod. Use the host's network namespace. - If this option is set, the ports that - will be used must be specified. Default - to false. - type: boolean - hostPID: - description: 'Use the host''s pid namespace. - Optional: Default to false.' - type: boolean - hostname: - description: Specifies the hostname of the - Pod If not specified, the pod's hostname - will be set to a system-defined value. - type: string - imagePullSecrets: - description: 'ImagePullSecrets is an optional - list of references to secrets in the same - namespace to use for pulling any of the - images used by this PodSpec. If specified, - these secrets will be passed to individual - puller implementations for them to use. - For example, in the case of docker, only - DockerConfig type secrets are honored. - More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod' - type: array - items: - description: LocalObjectReference contains - enough information to let you locate - the referenced object inside the same - namespace. - type: object - properties: - 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 - initContainers: - description: 'List of initialization containers - belonging to the pod. Init containers - are executed in order prior to containers - being started. If any init container fails, - the pod is considered to have failed and - is handled according to its restartPolicy. - The name for an init container or normal - container must be unique among all containers. - Init containers may not have Lifecycle - actions, Readiness probes, Liveness probes, - or Startup probes. The resourceRequirements - of an init container are taken into account - during scheduling by finding the highest - request/limit for each resource type, - and then using the max of of that value - or the sum of the normal containers. Limits - are applied to init containers in a similar - fashion. Init containers cannot currently - be added or removed. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/' - type: array - items: - description: A single application container - that you want to run within a pod. - type: object - required: - - name - properties: - args: - description: 'Arguments to the entrypoint. - The docker image''s CMD is used - if this is not provided. Variable - references $(VAR_NAME) are expanded - using the container''s environment. - If a variable cannot be resolved, - the reference in the input string - will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless - of whether the variable exists or - not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + secretRef: + description: The Secret to select from + type: object + properties: + 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 must be defined + type: boolean + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.' type: string - command: - description: 'Entrypoint array. Not - executed within a shell. The docker - image''s ENTRYPOINT is used if this - is not provided. Variable references - $(VAR_NAME) are expanded using the - container''s environment. If a variable - cannot be resolved, the reference - in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped - with a double $$, ie: $$(VAR_NAME). - Escaped references will never be - expanded, regardless of whether - the variable exists or not. Cannot - be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string - env: - description: List of environment variables - to set in the container. Cannot - be updated. - type: array - items: - description: EnvVar represents an - environment variable present in - a Container. + lifecycle: + description: Actions that the management system should take in response to container lifecycle events. Cannot be updated. 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 previous 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. The $(VAR_NAME) - syntax can be escaped with - a double $$, ie: $$(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. + postStart: + description: 'PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' type: object properties: - configMapKeyRef: - description: Selects a key - of a ConfigMap. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - key + - port properties: - key: - description: The key - to select. + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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?' + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - optional: - description: Specify - whether the ConfigMap - or its key must be - defined - type: boolean - 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.' + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - fieldPath + - port 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. + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - 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.' + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + preStop: + description: 'PreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod''s termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod''s termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - resource + - port properties: - containerName: - description: 'Container - name: required for - volumes, optional - for env vars' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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]+))))?$ + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - resource: - description: 'Required: - resource to select' + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - secretKeyRef: - description: Selects a key - of a secret in the pod's - namespace + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - key + - port 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?' + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - optional: - description: Specify - whether the Secret - or its key must be - defined - type: boolean - envFrom: - description: List of sources to populate - environment variables in the container. - The keys defined within a source - must be a C_IDENTIFIER. All invalid - keys will be reported as an event - when the container is starting. - When a key exists in multiple sources, - the value associated with the last - source will take precedence. Values - defined by an Env with a duplicate - key will take precedence. Cannot - be updated. - type: array - items: - description: EnvFromSource represents - the source of a set of ConfigMaps + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + livenessProbe: + description: 'Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: object properties: - configMapRef: - description: The ConfigMap to - select from + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. type: object properties: - 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 must be - defined - type: boolean - prefix: - description: An optional identifier - to prepend to each key in - the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select - from + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. type: object + required: + - port properties: - 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?' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - optional: - description: Specify whether - the Secret must be defined - type: boolean - image: - description: 'Docker image name. More - info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow - higher level config management to - default or override container images - in workload controllers like Deployments - and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One - of Always, Never, IfNotPresent. - Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - lifecycle: - description: Actions that the management - system should take in response to - container lifecycle events. Cannot - be updated. - type: object - properties: - postStart: - description: 'PostStart is called - immediately after a container - is created. If the handler fails, - the container is terminated - and restarted according to its - restart policy. Other management - of the container blocks until - the hook completes. More info: - https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - preStop: - description: 'PreStop is called - immediately before a container - is terminated due to an API - request or management event - such as liveness/startup probe - failure, preemption, resource - contention, etc. The handler - is not called if the container - crashes or exits. The reason - for termination is passed to - the handler. The Pod''s termination - grace period countdown begins - before the PreStop hooked is - executed. Regardless of the - outcome of the handler, the - container will eventually terminate - within the Pod''s termination - grace period. Other management - of the container blocks until - the hook completes or until - the termination grace period - is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: - name - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: - type: integer - type: string - x-kubernetes-int-or-string: true - livenessProbe: - description: 'Periodic probe of container - liveness. Container will be restarted - if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - name: - description: Name of the container - specified as a DNS_LABEL. Each container - in a pod must have a unique name - (DNS_LABEL). Cannot be updated. - type: string - ports: - description: List of ports to expose - from the container. Exposing a port - here gives the system additional - information about the network connections - a container uses, but is primarily - informational. Not specifying a - port here DOES NOT prevent that - port from being exposed. Any port - which is listening on the default - "0.0.0.0" address inside a container - will be accessible from the network. - Cannot be updated. - type: array - items: - description: ContainerPort represents - a network port in a single container. - type: object - required: - - containerPort - properties: - containerPort: - description: Number of port - to expose on the pod's IP - address. This must be a valid - port number, 0 < x < 65536. + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. type: integer format: int32 - hostIP: - description: What host IP to - bind the external port to. - type: string - hostPort: - description: Number of port - to expose on the host. If - specified, this must be a - valid port number, 0 < x < - 65536. If HostNetwork is specified, - this must match ContainerPort. - Most containers do not need - this. + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. type: integer format: int32 - name: - description: If specified, this - must be an IANA_SVC_NAME and - unique within the pod. Each - named port in a pod must have - a unique name. Name for the - port that can be referred - to by services. - type: string - protocol: - description: Protocol for port. - Must be UDP, TCP, or SCTP. - Defaults to "TCP". - type: string - default: TCP - x-kubernetes-list-map-keys: - - containerPort - - protocol - x-kubernetes-list-type: map - readinessProbe: - description: 'Periodic probe of container - service readiness. Container will - be removed from service endpoints - if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + name: + description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated. + type: string + ports: + description: List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network port in a single container. type: object required: - - port + - containerPort properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. + containerPort: + description: Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536. + type: integer + format: int32 + hostIP: + description: What host IP to bind the external port to. type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. + hostPort: + description: Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this. + type: integer + format: int32 + name: + description: If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services. type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' + protocol: + description: Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP". type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - resources: - description: 'Compute Resources required - by this container. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - properties: - limits: - description: 'Limits describes - the maximum amount of compute - resources allowed. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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 - securityContext: - description: 'Security options the - pod should run with. More info: - https://kubernetes.io/docs/concepts/policy/security-context/ - More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' - type: object - properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation - controls whether a process can - gain more privileges than its - parent process. This bool directly - controls if the no_new_privs - flag will be set on the container - process. AllowPrivilegeEscalation - is true always when the container - is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' - type: boolean - capabilities: - description: The capabilities - to add/drop when running containers. - Defaults to the default set - of capabilities granted by the - container runtime. - type: object - properties: - add: - description: Added capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + default: TCP + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + description: 'Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - drop: - description: Removed capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. type: string - privileged: - description: Run container in - privileged mode. Processes in - privileged containers are essentially - equivalent to root on the host. - Defaults to false. - type: boolean - procMount: - description: procMount denotes - the type of proc mount to use - for the containers. The default - is DefaultProcMount which uses - the container runtime defaults - for readonly paths and masked - paths. This requires the ProcMountType - feature flag to be enabled. - type: string - readOnlyRootFilesystem: - description: Whether this container - has a read-only root filesystem. - Default is false. - type: boolean - runAsGroup: - description: The GID to run the - entrypoint of the container - process. Uses runtime default - if unset. May also be set in - PodSecurityContext. If set - in both SecurityContext and - PodSecurityContext, the value - specified in SecurityContext - takes precedence. - type: integer - format: int64 - runAsNonRoot: - description: Indicates that the - container must run as a non-root - user. If true, the Kubelet will - validate the image at runtime - to ensure that it does not run - as UID 0 (root) and fail to - start the container if it does. - If unset or false, no such validation - will be performed. May also - be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: boolean - runAsUser: - description: The UID to run the - entrypoint of the container - process. Defaults to user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: integer - format: int64 - seLinuxOptions: - description: The SELinux context - to be applied to the container. - If unspecified, the container - runtime will allocate a random - SELinux context for each container. May - also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - 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 - seccompProfile: - description: The seccomp options - to use by this container. If - seccomp options are provided - at both the pod & container - level, the container options - override the pod options. - type: object - required: - - type - properties: - localhostProfile: - description: localhostProfile - indicates a profile defined - in a file on the node should - be used. The profile must - be preconfigured on the - node to work. Must be a - descending path, relative - to the kubelet's configured - seccomp profile location. - Must only be set if type - is "Localhost". - type: string - type: - description: "type indicates - which kind of seccomp profile - will be applied. Valid options - are: \n Localhost - a profile - defined in a file on the - node should be used. RuntimeDefault - - the container runtime - default profile should be - used. Unconfined - no profile - should be applied." - type: string - windowsOptions: - description: The Windows specific - settings applied to all containers. - If unspecified, the options - from the PodSecurityContext - will be used. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec - is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of - the GMSA credential spec - named by the GMSACredentialSpecName - field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName - is the name of the GMSA - credential spec to use. - type: string - runAsUserName: - description: The UserName - in Windows to run the entrypoint - of the container process. - Defaults to the user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. - If set in both SecurityContext - and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: string - startupProbe: - description: 'StartupProbe indicates - that the Pod has successfully initialized. - If specified, no other probes are - executed until this completes successfully. - If this probe fails, the Pod will - be restarted, just as if the livenessProbe - failed. This can be used to provide - different probe parameters at the - beginning of a Pod''s lifecycle, - when it might take a long time to - load data or warm a cache, than - during steady-state operation. This - cannot be updated. This is a beta - feature enabled by the StartupProbe - feature flag. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + resources: + description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - stdin: - description: Whether this container - should allocate a buffer for stdin - in the container runtime. If this - is not set, reads from stdin in - the container will always result - in EOF. Default is false. - type: boolean - stdinOnce: - description: Whether the container - runtime should close the stdin channel - after it has been opened by a single - attach. When stdin is true the stdin - stream will remain open across multiple - attach sessions. If stdinOnce is - set to true, stdin is opened on - container start, is empty until - the first client attaches to stdin, - and then remains open and accepts - data until the client disconnects, - at which time stdin is closed and - remains closed until the container - is restarted. If this flag is false, - a container processes that reads - from stdin will never receive an - EOF. Default is false - type: boolean - terminationMessagePath: - description: 'Optional: Path at which - the file to which the container''s - termination message will be written - is mounted into the container''s - filesystem. Message written is intended - to be brief final status, such as - an assertion failure message. Will - be truncated by the node if greater - than 4096 bytes. The total message - length across all containers will - be limited to 12kb. Defaults to - /dev/termination-log. Cannot be - updated.' - type: string - terminationMessagePolicy: - description: Indicate how the termination - message should be populated. File - will use the contents of terminationMessagePath - to populate the container status - message on both success and failure. - FallbackToLogsOnError will use the - last chunk of container log output - if the termination message file - is empty and the container exited - with an error. The log output is - limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to - File. Cannot be updated. - type: string - tty: - description: Whether this container - should allocate a TTY for itself, - also requires 'stdin' to be true. - Default is false. - type: boolean - volumeDevices: - description: volumeDevices is the - list of block devices to be used - by the container. - type: array - items: - description: volumeDevice describes - a mapping of a raw block device - within a container. + securityContext: + description: 'Security options the pod should run with. More info: https://kubernetes.io/docs/concepts/policy/security-context/ More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' type: object - required: - - devicePath - - name properties: - devicePath: - description: devicePath is the - path inside of the container - that the device will be mapped - to. - type: string - name: - description: name must match - the name of a persistentVolumeClaim - in the pod + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. + type: object + properties: + add: + description: Added capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + drop: + description: Removed capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + privileged: + description: Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. type: string - volumeMounts: - description: Pod volumes to mount - into the container's filesystem. - Cannot be updated. - type: array - items: - description: VolumeMount describes - a mounting of a Volume within - a container. + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + 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 + seccompProfile: + description: The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. + type: object + required: + - type + properties: + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". + type: string + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: string + startupProbe: + description: 'StartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod''s lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: object - required: - - mountPath - - name properties: - mountPath: - description: Path within the - container at which the volume - should be mounted. Must not - contain ':'. - type: string - mountPropagation: - description: mountPropagation - determines how mounts are - propagated from the host to - container and the other way - around. When not set, MountPropagationNone - is used. This field is beta - in 1.10. - type: string - name: - description: This must match - the Name of a Volume. - type: string - readOnly: - description: Mounted read-only - if true, read-write otherwise - (false or unspecified). Defaults - to false. - type: boolean - subPath: - description: Path within the - volume from which the container's - volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within - the volume from which the - container's volume should - be mounted. Behaves similarly - to SubPath but environment - variable references $(VAR_NAME) - are expanded using the container's - environment. Defaults to "" - (volume's root). SubPathExpr - and SubPath are mutually exclusive. - type: string - workingDir: - description: Container's working directory. - If not specified, the container - runtime's default will be used, - which might be configured in the - container image. Cannot be updated. - type: string - nodeName: - description: NodeName is a request to schedule - this pod onto a specific node. If it is - non-empty, the scheduler simply schedules - this pod onto that node, assuming that - it fits resource requirements. - type: string - nodeSelector: - description: 'NodeSelector is a selector - which must be true for the pod to fit - on a node. Selector which must match a - node''s labels for the pod to be scheduled - on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - overhead: - description: 'Overhead represents the resource - overhead associated with running a pod - for a given RuntimeClass. This field will - be autopopulated at admission time by - the RuntimeClass admission controller. - If the RuntimeClass admission controller - is enabled, overhead must not be set in - Pod create requests. The RuntimeClass - admission controller will reject Pod create - requests which have the overhead already - set. If RuntimeClass is configured and - selected in the PodSpec, Overhead will - be set to the value defined in the corresponding - RuntimeClass, otherwise it will remain - unset and treated as zero. More info: - https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md - This field is alpha-level as of Kubernetes - v1.16, and is only honored by servers - that enable the PodOverhead feature.' - 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 - preemptionPolicy: - description: PreemptionPolicy is the Policy - for preempting pods with lower priority. - One of Never, PreemptLowerPriority. Defaults - to PreemptLowerPriority if unset. This - field is beta-level, gated by the NonPreemptingPriority - feature-gate. - type: string - priority: - description: The priority value. Various - system components use this field to find - the priority of the pod. When Priority - Admission Controller is enabled, it prevents - users from setting this field. The admission - controller populates this field from PriorityClassName. - The higher the value, the higher the priority. - type: integer - format: int32 - priorityClassName: - description: If specified, indicates the - pod's priority. "system-node-critical" - and "system-cluster-critical" are two - special keywords which indicate the highest - priorities with the former being the highest - priority. Any other name must be defined - by creating a PriorityClass object with - that name. If not specified, the pod priority - will be default or zero if there is no - default. - type: string - readinessGates: - description: 'If specified, all readiness - gates will be evaluated for pod readiness. - A pod is ready when all its containers - are ready AND all conditions specified - in the readiness gates have status equal - to "True" More info: https://git.k8s.io/enhancements/keps/sig-network/0007-pod-ready%2B%2B.md' - type: array - items: - description: PodReadinessGate contains - the reference to a pod condition - type: object - required: - - conditionType - properties: - conditionType: - description: ConditionType refers - to a condition in the pod's condition - list with matching type. - type: string - restartPolicy: - description: 'Restart policy for all containers - within the pod. One of Always, OnFailure, - Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' - type: string - runtimeClassName: - description: 'RuntimeClassName refers to - a RuntimeClass object in the node.k8s.io - group, which should be used to run this - pod. If no RuntimeClass resource matches - the named class, the pod will not be run. - If unset or empty, the "legacy" RuntimeClass - will be used, which is an implicit class - with an empty definition that uses the - default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md - This is a beta feature as of Kubernetes - v1.14.' - type: string - schedulerName: - description: If specified, the pod will - be dispatched by specified scheduler. - If not specified, the pod will be dispatched - by default scheduler. - type: string - securityContext: - description: 'SecurityContext holds pod-level - security attributes and common container - settings. Optional: Defaults to empty. See - type description for default values of - each field.' - type: object - properties: - fsGroup: - description: "A special supplemental - group that applies to all containers - in a pod. Some volume types allow - the Kubelet to change the ownership - of that volume to be owned by the - pod: \n 1. The owning GID will be - the FSGroup 2. The setgid bit is set - (new files created in the volume will - be owned by FSGroup) 3. The permission - bits are OR'd with rw-rw---- \n If - unset, the Kubelet will not modify - the ownership and permissions of any - volume." - type: integer - format: int64 - fsGroupChangePolicy: - description: 'fsGroupChangePolicy defines - behavior of changing ownership and - permission of the volume before being - exposed inside Pod. This field will - only apply to volume types which support - fsGroup based ownership(and permissions). - It will have no effect on ephemeral - volume types such as: secret, configmaps - and emptydir. Valid values are "OnRootMismatch" - and "Always". If not specified defaults - to "Always".' - type: string - runAsGroup: - description: The GID to run the entrypoint - of the container process. Uses runtime - default if unset. May also be set - in SecurityContext. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence for that container. - type: integer - format: int64 - runAsNonRoot: - description: Indicates that the container - must run as a non-root user. If true, - the Kubelet will validate the image - at runtime to ensure that it does - not run as UID 0 (root) and fail to - start the container if it does. If - unset or false, no such validation - will be performed. May also be set - in SecurityContext. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: boolean - runAsUser: - description: The UID to run the entrypoint - of the container process. Defaults - to user specified in image metadata - if unspecified. May also be set in - SecurityContext. If set in both SecurityContext - and PodSecurityContext, the value - specified in SecurityContext takes - precedence for that container. - type: integer - format: int64 - seLinuxOptions: - description: The SELinux context to - be applied to all containers. If unspecified, - the container runtime will allocate - a random SELinux context for each - container. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence for that container. - 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. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + stdin: + description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false + type: boolean + terminationMessagePath: + description: 'Optional: Path at which the file to which the container''s termination message will be written is mounted into the container''s filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.' type: string - type: - description: Type is a SELinux type - label that applies to the container. + terminationMessagePolicy: + description: Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated. type: string - user: - description: User is a SELinux user - label that applies to the container. + tty: + description: Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be used by the container. + type: array + items: + description: volumeDevice describes a mapping of a raw block device within a container. + type: object + required: + - devicePath + - name + properties: + devicePath: + description: devicePath is the path inside of the container that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim in the pod + type: string + volumeMounts: + description: Pod volumes to mount into the container's filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. + type: object + required: + - mountPath + - name + properties: + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. + type: string + workingDir: + description: Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated. type: string - seccompProfile: - description: The seccomp options to - use by the containers in this pod. + nodeName: + description: NodeName is a request to schedule this pod onto a specific node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits resource requirements. + type: string + nodeSelector: + description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' + type: object + additionalProperties: + type: string + overhead: + description: 'Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. This field will be autopopulated at admission time by the RuntimeClass admission controller. If the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests. The RuntimeClass admission controller will reject Pod create requests which have the overhead already set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero. More info: https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md This field is alpha-level as of Kubernetes v1.16, and is only honored by servers that enable the PodOverhead feature.' + 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 + preemptionPolicy: + description: PreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is beta-level, gated by the NonPreemptingPriority feature-gate. + type: string + priority: + description: The priority value. Various system components use this field to find the priority of the pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. + type: integer + format: int32 + priorityClassName: + description: If specified, indicates the pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default. + type: string + readinessGates: + description: 'If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to "True" More info: https://git.k8s.io/enhancements/keps/sig-network/0007-pod-ready%2B%2B.md' + type: array + items: + description: PodReadinessGate contains the reference to a pod condition type: object required: - - type - properties: - localhostProfile: - description: localhostProfile indicates - a profile defined in a file on - the node should be used. The profile - must be preconfigured on the node - to work. Must be a descending - path, relative to the kubelet's - configured seccomp profile location. - Must only be set if type is "Localhost". - type: string - type: - description: "type indicates which - kind of seccomp profile will be - applied. Valid options are: \n - Localhost - a profile defined - in a file on the node should be - used. RuntimeDefault - the container - runtime default profile should - be used. Unconfined - no profile - should be applied." - type: string - supplementalGroups: - description: A list of groups applied - to the first process run in each container, - in addition to the container's primary - GID. If unspecified, no groups will - be added to any container. - type: array - items: - type: integer - format: int64 - sysctls: - description: Sysctls hold a list of - namespaced sysctls used for the pod. - Pods with unsupported sysctls (by - the container runtime) might fail - to launch. - type: array - items: - description: Sysctl defines a kernel - parameter to be set - type: object - required: - - name - - value - properties: - name: - description: Name of a property - to set - type: string - value: - description: Value of a property - to set - type: string - windowsOptions: - description: The Windows specific settings - applied to all containers. If unspecified, - the options within a container's SecurityContext - will be used. If set in both SecurityContext - and PodSecurityContext, the value - specified in SecurityContext takes - precedence. - type: object + - conditionType properties: - gmsaCredentialSpec: - description: GMSACredentialSpec - is where the GMSA admission webhook - (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA - credential spec named by the GMSACredentialSpecName - field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName - is the name of the GMSA credential - spec to use. - type: string - runAsUserName: - description: The UserName in Windows - to run the entrypoint of the container - process. Defaults to the user - specified in image metadata if - unspecified. May also be set in - PodSecurityContext. If set in - both SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. + conditionType: + description: ConditionType refers to a condition in the pod's condition list with matching type. type: string - serviceAccount: - description: 'DeprecatedServiceAccount is - a depreciated alias for ServiceAccountName. - Deprecated: Use serviceAccountName instead.' - type: string - serviceAccountName: - description: 'ServiceAccountName is the - name of the ServiceAccount to use to run - this pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/' - type: string - setHostnameAsFQDN: - description: If true the pod's hostname - will be configured as the pod's FQDN, - rather than the leaf name (the default). - In Linux containers, this means setting - the FQDN in the hostname field of the - kernel (the nodename field of struct utsname). - In Windows containers, this means setting - the registry value of hostname for the - registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters - to FQDN. If a pod does not have FQDN, - this has no effect. Default to false. - type: boolean - shareProcessNamespace: - description: 'Share a single process namespace - between all of the containers in a pod. - When this is set containers will be able - to view and signal processes from other - containers in the same pod, and the first - process in each container will not be - assigned PID 1. HostPID and ShareProcessNamespace - cannot both be set. Optional: Default - to false.' - type: boolean - subdomain: - description: If specified, the fully qualified - Pod hostname will be "...svc.". If not - specified, the pod will not have a domainname - at all. - type: string - terminationGracePeriodSeconds: - description: Optional duration in seconds - the pod needs to terminate gracefully. - May be decreased in delete request. Value - must be non-negative integer. The value - zero indicates delete immediately. If - this value is nil, the default grace period - will be used instead. The grace period - is the duration in seconds after the processes - running in the pod are sent a termination - signal and the time when the processes - are forcibly halted with a kill signal. - Set this value longer than the expected - cleanup time for your process. Defaults - to 30 seconds. - type: integer - format: int64 - tolerations: - description: If specified, the pod's tolerations. - type: array - items: - description: The pod this Toleration is - attached to tolerates any taint that - matches the triple - using the matching operator . + restartPolicy: + description: 'Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + type: string + runtimeClassName: + description: 'RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md This is a beta feature as of Kubernetes v1.14.' + type: string + schedulerName: + description: If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler. + type: string + securityContext: + description: 'SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field.' 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. + fsGroup: + description: "A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod: \n 1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw---- \n If unset, the Kubelet will not modify the ownership and permissions of any volume." 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. + fsGroupChangePolicy: + description: 'fsGroupChangePolicy defines behavior of changing ownership and permission of the volume before being exposed inside Pod. This field will only apply to volume types which support fsGroup based ownership(and permissions). It will have no effect on ephemeral volume types such as: secret, configmaps and emptydir. Valid values are "OnRootMismatch" and "Always". If not specified, "Always" is used.' type: string - topologySpreadConstraints: - description: TopologySpreadConstraints describes - how a group of pods ought to spread across - topology domains. Scheduler will schedule - pods in a way which abides by the constraints. - All topologySpreadConstraints are ANDed. - type: array - items: - description: TopologySpreadConstraint - specifies how to spread matching pods - among the given topology. - type: object - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - properties: - labelSelector: - description: LabelSelector is used - to find matching pods. Pods that - match this label selector are counted - to determine the number of pods - in their corresponding topology - domain. - 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 - maxSkew: - description: 'MaxSkew describes the - degree to which pods may be unevenly - distributed. When `whenUnsatisfiable=DoNotSchedule`, - it is the maximum permitted difference - between the number of matching pods - in the target topology and the global - minimum. For example, in a 3-zone - cluster, MaxSkew is set to 1, and - pods with the same labelSelector - spread as 1/1/0: | zone1 | zone2 - | zone3 | | P | P | | - - if MaxSkew is 1, incoming pod - can only be scheduled to zone3 to - become 1/1/1; scheduling it onto - zone1(zone2) would make the ActualSkew(2-0) - on zone1(zone2) violate MaxSkew(1). - - if MaxSkew is 2, incoming pod - can be scheduled onto any zone. - When `whenUnsatisfiable=ScheduleAnyway`, - it is used to give higher precedence - to topologies that satisfy it. It''s - a required field. Default value - is 1 and 0 is not allowed.' + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. type: integer - format: int32 - topologyKey: - description: TopologyKey is the key - of node labels. Nodes that have - a label with this key and identical - values are considered to be in the - same topology. We consider each - as a "bucket", and - try to put balanced number of pods - into each bucket. It's a required - field. - type: string - whenUnsatisfiable: - description: 'WhenUnsatisfiable indicates - how to deal with a pod if it doesn''t - satisfy the spread constraint. - - DoNotSchedule (default) tells the - scheduler not to schedule it. - - ScheduleAnyway tells the scheduler - to schedule the pod in any location, but - giving higher precedence to topologies - that would help reduce the skew. - A constraint is considered "Unsatisfiable" - for an incoming pod if and only - if every possible node assigment - for that pod would violate "MaxSkew" - on some topology. For example, in - a 3-zone cluster, MaxSkew is set - to 1, and pods with the same labelSelector - spread as 3/1/1: | zone1 | zone2 - | zone3 | | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, - incoming pod can only be scheduled - to zone2(zone3) to become 3/2/1(3/1/2) - as ActualSkew(2-1) on zone2(zone3) - satisfies MaxSkew(1). In other words, - the cluster can still be imbalanced, - but scheduler won''t make it *more* - imbalanced. It''s a required field.' - type: string - x-kubernetes-list-map-keys: - - topologyKey - - whenUnsatisfiable - x-kubernetes-list-type: map - volumes: - description: 'List of volumes that can be - mounted by containers belonging to the - pod. More info: https://kubernetes.io/docs/concepts/storage/volumes' - type: array - items: - description: Volume represents a named - volume in a pod that may be accessed - by any container in the pod. - type: object - required: - - name - properties: - awsElasticBlockStore: - description: 'AWSElasticBlockStore - represents an AWS Disk resource - that is attached to a kubelet''s - host machine and then exposed to - the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: object - required: - - volumeID - properties: - fsType: - description: 'Filesystem type - of the volume that you want - to mount. Tip: Ensure that the - filesystem type is supported - by the host operating system. - Examples: "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore - TODO: how do we prevent errors - in the filesystem from compromising - the machine' - type: string - partition: - description: 'The partition in - the volume that you want to - mount. If omitted, the default - is to mount by volume name. - Examples: For volume /dev/sda1, - you specify the partition as - "1". Similarly, the volume partition - for /dev/sda is "0" (or you - can leave the property empty).' - type: integer - format: int32 - readOnly: - description: 'Specify "true" to - force and set the ReadOnly property - in VolumeMounts to "true". If - omitted, the default is "false". - More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: boolean - volumeID: - description: 'Unique ID of the - persistent disk resource in - AWS (Amazon EBS volume). More - info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - azureDisk: - description: AzureDisk represents - an Azure Data Disk mount on the - host and bind mount to the pod. + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to all containers. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. type: object - required: - - diskName - - diskURI properties: - cachingMode: - description: 'Host Caching mode: - None, Read Only, Read Write.' - type: string - diskName: - description: The Name of the data - disk in the blob storage + level: + description: Level is SELinux level label that applies to the container. type: string - diskURI: - description: The URI the data - disk in the blob storage + role: + description: Role is a SELinux role label that applies to the container. type: string - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. + type: + description: Type is a SELinux type label that applies to the container. type: string - kind: - description: 'Expected values - Shared: multiple blob disks - per storage account Dedicated: - single blob disk per storage - account Managed: azure managed - data disk (only in managed availability - set). defaults to shared' + user: + description: User is a SELinux user label that applies to the container. type: string - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - azureFile: - description: AzureFile represents - an Azure File Service mount on the - host and bind mount to the pod. + seccompProfile: + description: The seccomp options to use by the containers in this pod. type: object required: - - secretName - - shareName + - type properties: - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - secretName: - description: the name of secret - that contains Azure Storage - Account Name and Key + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". type: string - shareName: - description: Share Name + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." type: string - cephfs: - description: CephFS represents a Ceph - FS mount on the host that shares - a pod's lifetime + supplementalGroups: + description: A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container. + type: array + items: + type: integer + format: int64 + sysctls: + description: Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch. + type: array + items: + description: Sysctl defines a kernel parameter to be set + type: object + required: + - name + - value + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options within a container's SecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. type: object - required: - - monitors properties: - monitors: - description: 'Required: Monitors - is a collection of Ceph monitors - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: array - items: - type: string - path: - description: 'Optional: Used as - the mounted root, rather than - the full Ceph tree, default - is /' + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. type: string - readOnly: - description: 'Optional: Defaults - to false (read/write). ReadOnly - here will force the ReadOnly - setting in VolumeMounts. More - info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: boolean - secretFile: - description: 'Optional: SecretFile - is the path to key ring for - User, default is /etc/ceph/user.secret - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - secretRef: - description: 'Optional: SecretRef - is reference to the authentication - secret for User, default is - empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: object - properties: - 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 - user: - description: 'Optional: User is - the rados user name, default - is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. type: string - cinder: - description: 'Cinder represents a - cinder volume attached and mounted - on kubelets host machine. More info: - https://examples.k8s.io/mysql-cinder-pd/README.md' - type: object - required: - - volumeID - properties: - fsType: - description: 'Filesystem type - to mount. Must be a filesystem - type supported by the host operating - system. Examples: "ext4", "xfs", - "ntfs". Implicitly inferred - to be "ext4" if unspecified. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. type: string - readOnly: - description: 'Optional: Defaults - to false (read/write). ReadOnly - here will force the ReadOnly - setting in VolumeMounts. More - info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: boolean - secretRef: - description: 'Optional: points - to a secret object containing - parameters used to connect to - OpenStack.' - type: object - properties: - 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?' + serviceAccount: + description: 'DeprecatedServiceAccount is a depreciated alias for ServiceAccountName. Deprecated: Use serviceAccountName instead.' + type: string + serviceAccountName: + description: 'ServiceAccountName is the name of the ServiceAccount to use to run this pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/' + type: string + setHostnameAsFQDN: + description: If true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default). In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname). In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters to FQDN. If a pod does not have FQDN, this has no effect. Default to false. + type: boolean + shareProcessNamespace: + description: 'Share a single process namespace between all of the containers in a pod. When this is set containers will be able to view and signal processes from other containers in the same pod, and the first process in each container will not be assigned PID 1. HostPID and ShareProcessNamespace cannot both be set. Optional: Default to false.' + type: boolean + subdomain: + description: If specified, the fully qualified Pod hostname will be "...svc.". If not specified, the pod will not have a domainname at all. + type: string + terminationGracePeriodSeconds: + description: Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period will be used instead. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. Defaults to 30 seconds. + type: integer + format: int64 + tolerations: + description: If specified, the pod's tolerations. + 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 + topologySpreadConstraints: + description: TopologySpreadConstraints describes how a group of pods ought to spread across topology domains. Scheduler will schedule pods in a way which abides by the constraints. All topologySpreadConstraints are ANDed. + type: array + items: + description: TopologySpreadConstraint specifies how to spread matching pods among the given topology. + type: object + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + properties: + labelSelector: + description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain. + 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 - volumeID: - description: 'volume id used to - identify the volume in cinder. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - configMap: - description: ConfigMap represents - a configMap that should populate - this volume - type: object - properties: - defaultMode: - description: 'Optional: mode bits - used to set permissions on created - files by default. Must be an - octal value between 0000 and - 0777 or a decimal value between - 0 and 511. YAML accepts both - octal and decimal values, JSON - requires decimal values for - mode bits. Defaults to 0644. - Directories within the path - are not affected by this setting. - This might be in conflict with - other options that affect the - file mode, like fsGroup, and - the result can be other mode - bits set.' - type: integer - format: int32 - items: - description: If unspecified, each - key-value pair in the Data field - of the referenced ConfigMap - will be projected into the volume - as a file whose name is the - key and content is the value. - If specified, the listed keys - will be projected into the specified - paths, and unlisted keys will - not be present. If a key is - specified which is not present - in the ConfigMap, the volume - setup will error unless it is - marked optional. Paths must - be relative and may not contain - the '..' path or start with - '..'. - type: array - items: - description: Maps a string key - to a path within a volume. + maxSkew: + description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 1/1/0: | zone1 | zone2 | zone3 | | P | P | | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 1/1/1; scheduling it onto zone1(zone2) would make the ActualSkew(2-0) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.' + type: integer + format: int32 + topologyKey: + description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a "bucket", and try to put balanced number of pods into each bucket. It's a required field. + type: string + whenUnsatisfiable: + description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assigment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.' + type: string + x-kubernetes-list-map-keys: + - topologyKey + - whenUnsatisfiable + x-kubernetes-list-type: map + volumes: + description: 'List of volumes that can be mounted by containers belonging to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes' + type: array + items: + description: Volume represents a named volume in a pod that may be accessed by any container in the pod. + type: object + required: + - name + properties: + awsElasticBlockStore: + description: 'AWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty).' + type: integer + format: int32 + readOnly: + description: 'Specify "true" to force and set the ReadOnly property in VolumeMounts to "true". If omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + volumeID: + description: 'Unique ID of the persistent disk resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + azureDisk: + description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. + type: object + required: + - diskName + - diskURI + properties: + cachingMode: + description: 'Host Caching mode: None, Read Only, Read Write.' + type: string + diskName: + description: The Name of the data disk in the blob storage + type: string + diskURI: + description: The URI the data disk in the blob storage + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + kind: + description: 'Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + azureFile: + description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. + type: object + required: + - secretName + - shareName + properties: + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretName: + description: the name of secret that contains Azure Storage Account Name and Key + type: string + shareName: + description: Share Name + type: string + cephfs: + description: CephFS represents a Ceph FS mount on the host that shares a pod's lifetime + type: object + required: + - monitors + properties: + monitors: + description: 'Required: Monitors is a collection of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: + type: string + path: + description: 'Optional: Used as the mounted root, rather than the full Ceph tree, default is /' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + secretFile: + description: 'Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + secretRef: + description: 'Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: object - required: - - key - - path properties: - key: - description: The key to - project. + 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 - mode: - description: 'Optional: - mode bits used to set - permissions on this file. - Must be an octal value - between 0000 and 0777 - or a decimal value between - 0 and 511. YAML accepts - both octal and decimal - values, JSON requires - decimal values for mode - bits. If not specified, - the volume defaultMode - will be used. This might - be in conflict with other - options that affect the - file mode, like fsGroup, - and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: The relative - path of the file to map - the key to. May not be - an absolute path. May - not contain the path element - '..'. May not start with - the string '..'. + user: + description: 'Optional: User is the rados user name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + cinder: + description: 'Cinder represents a cinder volume attached and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + secretRef: + description: 'Optional: points to a secret object containing parameters used to connect to OpenStack.' + type: object + properties: + 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 - 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 keys must be - defined - type: boolean - csi: - description: CSI (Container Storage - Interface) represents ephemeral - storage that is handled by certain - external CSI drivers (Beta feature). - type: object - required: - - driver - properties: - driver: - description: Driver is the name - of the CSI driver that handles - this volume. Consult with your - admin for the correct name as - registered in the cluster. - type: string - fsType: - description: Filesystem type to - mount. Ex. "ext4", "xfs", "ntfs". - If not provided, the empty value - is passed to the associated - CSI driver which will determine - the default filesystem to apply. - type: string - nodePublishSecretRef: - description: NodePublishSecretRef - is a reference to the secret - object containing sensitive - information to pass to the CSI - driver to complete the CSI NodePublishVolume - and NodeUnpublishVolume calls. - This field is optional, and may - be empty if no secret is required. - If the secret object contains - more than one secret, all secret - references are passed. - type: object - properties: - 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 - readOnly: - description: Specifies a read-only - configuration for the volume. - Defaults to false (read/write). - type: boolean - volumeAttributes: - description: VolumeAttributes - stores driver-specific properties - that are passed to the CSI driver. - Consult your driver's documentation - for supported values. - type: object - additionalProperties: + volumeID: + description: 'volume id used to identify the volume in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + configMap: + description: ConfigMap represents a configMap that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 keys must be defined + type: boolean + csi: + description: CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the CSI driver that handles this volume. Consult with your admin for the correct name as registered in the cluster. type: string - downwardAPI: - description: DownwardAPI represents - downward API about the pod that - should populate this volume - type: object - properties: - defaultMode: - description: 'Optional: mode bits - to use on created files by default. - Must be a Optional: mode bits - used to set permissions on created - files by default. Must be an - octal value between 0000 and - 0777 or a decimal value between - 0 and 511. YAML accepts both - octal and decimal values, JSON - requires decimal values for - mode bits. Defaults to 0644. - Directories within the path - are not affected by this setting. - This might be in conflict with - other options that affect the - file mode, like fsGroup, and - the result can be other mode - bits set.' - type: integer - format: int32 - items: - description: Items is a list of - downward API volume file - type: array - items: - description: DownwardAPIVolumeFile - represents information to - create the file containing - the pod field + fsType: + description: Filesystem type to mount. Ex. "ext4", "xfs", "ntfs". If not provided, the empty value is passed to the associated CSI driver which will determine the default filesystem to apply. + type: string + nodePublishSecretRef: + description: NodePublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodePublishVolume and NodeUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secret references are passed. type: object - required: - - path properties: - fieldRef: - description: 'Required: - Selects a field of the - pod: only annotations, - labels, name and namespace - are supported.' - 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 - mode: - description: 'Optional: - mode bits used to set - permissions on this file, - must be an octal value - between 0000 and 0777 - or a decimal value between - 0 and 511. YAML accepts - both octal and decimal - values, JSON requires - decimal values for mode - bits. If not specified, - the volume defaultMode - will be used. This might - be in conflict with other - options that affect the - file mode, like fsGroup, - and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: 'Required: - Path is the relative - path name of the file - to be created. Must not - be absolute or contain - the ''..'' path. Must - be utf-8 encoded. The - first item of the relative - path must not start with - ''..''' + 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 - resourceFieldRef: - description: 'Selects a - resource of the container: - only resources limits - and requests (limits.cpu, - limits.memory, requests.cpu - and requests.memory) 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 - emptyDir: - description: 'EmptyDir represents - a temporary directory that shares - a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: object - properties: - medium: - description: 'What type of storage - medium should back this directory. - The default is "" which means - to use the node''s default medium. - Must be an empty string (default) - or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: string - sizeLimit: - description: 'Total amount of - local storage required for this - EmptyDir volume. The size limit - is also applicable for memory - medium. The maximum usage on - memory medium EmptyDir would - be the minimum value between - the SizeLimit specified here - and the sum of memory limits - of all containers in a pod. - The default is nil which means - that the limit is undefined. - More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' - 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 - ephemeral: - description: "Ephemeral represents - a volume that is handled by a cluster - storage driver (Alpha feature). - The volume's lifecycle is tied to - the pod that defines it - it will - be created before the pod starts, - and deleted when the pod is removed. - \n Use this if: a) the volume is - only needed while the pod runs, - b) features of normal volumes like - restoring from snapshot or capacity - \ tracking are needed, c) the - storage driver is specified through - a storage class, and d) the storage - driver supports dynamic volume provisioning - through a PersistentVolumeClaim - (see EphemeralVolumeSource for more - \ information on the connection - between this volume type and - PersistentVolumeClaim). \n Use PersistentVolumeClaim - or one of the vendor-specific APIs - for volumes that persist for longer - than the lifecycle of an individual - pod. \n Use CSI for light-weight - local ephemeral volumes if the CSI - driver is meant to be used that - way - see the documentation of the - driver for more information. \n - A pod can use both types of ephemeral - volumes and persistent volumes at - the same time." - type: object - properties: - readOnly: - description: Specifies a read-only - configuration for the volume. - Defaults to false (read/write). - type: boolean - volumeClaimTemplate: - description: "Will be used to - create a stand-alone PVC to - provision the volume. The pod - in which this EphemeralVolumeSource - is embedded will be the owner - of the PVC, i.e. the PVC will - be deleted together with the - pod. The name of the PVC will - be `-` - where `` is the - name from the `PodSpec.Volumes` - array entry. Pod validation - will reject the pod if the concatenated - name is not valid for a PVC - (for example, too long). \n - An existing PVC with that name - that is not owned by the pod - will *not* be used for the pod - to avoid using an unrelated - volume by mistake. Starting - the pod is then blocked until - the unrelated PVC is removed. - If such a pre-created PVC is - meant to be used by the pod, - the PVC has to updated with - an owner reference to the pod - once the pod exists. Normally - this should not be necessary, - but it may be useful when manually - reconstructing a broken cluster. - \n This field is read-only and - no changes will be made by Kubernetes - to the PVC after it has been - created. \n Required, must not - be nil." - type: object - required: - - spec - properties: - metadata: - description: May contain labels - and annotations that will - be copied into the PVC when - creating it. No other fields - are allowed and will be - rejected during validation. - type: object - spec: - description: The specification - for the PersistentVolumeClaim. - The entire content is copied - unchanged into the PVC that - gets created from this template. - The same fields as in a - PersistentVolumeClaim are - also valid here. + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeAttributes: + description: VolumeAttributes stores driver-specific properties that are passed to the CSI driver. Consult your driver's documentation for supported values. + type: object + additionalProperties: + type: string + downwardAPI: + description: DownwardAPI represents downward API about the pod that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created files by default. Must be a Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: Items is a list of downward API volume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field type: object + required: + - path properties: - accessModes: - description: 'AccessModes - contains the desired - access modes the volume - should have. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' - type: array - items: - type: string - dataSource: - description: 'This field - can be used to specify - either: * An existing - VolumeSnapshot object - (snapshot.storage.k8s.io/VolumeSnapshot - - Beta) * An existing - PVC (PersistentVolumeClaim) - * An existing custom - resource/object that - implements data population - (Alpha) In order to - use VolumeSnapshot object - types, the appropriate - feature gate must be - enabled (VolumeSnapshotDataSource - or AnyVolumeDataSource) - If the provisioner or - an external controller - can support the specified - data source, it will - create a new volume - based on the contents - of the specified data - source. If the specified - data source is not supported, - the volume will not - be created and the failure - will be reported as - an event. In the future, - we plan to support more - data source types and - the behavior of the - provisioner may change.' + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' type: object required: - - kind - - name + - fieldPath properties: - apiGroup: - description: APIGroup - is the group for - the resource being - referenced. If APIGroup - is not specified, - the specified Kind - must be in the core - API group. For any - other third-party - types, APIGroup - is required. + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". type: string - kind: - description: Kind - is the type of resource - being referenced + fieldPath: + description: Path of the field to select in the specified API version. type: string - name: - description: Name - is the name of resource - being referenced - type: string - resources: - description: 'Resources - represents the minimum - resources the volume - should have. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: 'Required: Path is the relative path name of the file to be created. Must not be absolute or contain the ''..'' path. Must be utf-8 encoded. The first item of the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.' type: object + required: + - resource properties: - limits: - description: 'Limits - describes the maximum - amount of compute - resources allowed. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: + 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 - selector: - description: A label query - over volumes to consider - for binding. - 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. + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + emptyDir: + description: 'EmptyDir represents a temporary directory that shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: object + properties: + medium: + description: 'What type of storage medium should back this directory. The default is "" which means to use the node''s default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: string + sizeLimit: + description: 'Total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' + 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 + ephemeral: + description: "Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed. \n Use this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity tracking are needed, c) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through a PersistentVolumeClaim (see EphemeralVolumeSource for more information on the connection between this volume type and PersistentVolumeClaim). \n Use PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod. \n Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information. \n A pod can use both types of ephemeral volumes and persistent volumes at the same time." + type: object + properties: + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeClaimTemplate: + description: "Will be used to create a stand-alone PVC to provision the volume. The pod in which this EphemeralVolumeSource is embedded will be the owner of the PVC, i.e. the PVC will be deleted together with the pod. The name of the PVC will be `-` where `` is the name from the `PodSpec.Volumes` array entry. Pod validation will reject the pod if the concatenated name is not valid for a PVC (for example, too long). \n An existing PVC with that name that is not owned by the pod will *not* be used for the pod to avoid using an unrelated volume by mistake. Starting the pod is then blocked until the unrelated PVC is removed. If such a pre-created PVC is meant to be used by the pod, the PVC has to updated with an owner reference to the pod once the pod exists. Normally this should not be necessary, but it may be useful when manually reconstructing a broken cluster. \n This field is read-only and no changes will be made by Kubernetes to the PVC after it has been created. \n Required, must not be nil." + type: object + required: + - spec + properties: + metadata: + description: May contain labels and annotations that will be copied into the PVC when creating it. No other fields are allowed and will be rejected during validation. + type: object + spec: + description: The specification for the PersistentVolumeClaim. The entire content is copied unchanged into the PVC that gets created from this template. The same fields as in a PersistentVolumeClaim are also valid here. + type: object + properties: + accessModes: + description: 'AccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + type: array + items: + type: string + dataSource: + description: 'This field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) * An existing custom resource that implements data population (Alpha) In order to use custom resource types that implement data population, the AnyVolumeDataSource feature gate must be enabled. If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source.' + type: object + required: + - kind + - name + properties: + apiGroup: + description: APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + resources: + description: 'Resources represents the minimum resources the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' 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: + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + selector: + description: A label query over volumes to consider for binding. + 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 - 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 - storageClassName: - description: 'Name of - the StorageClass required - by the claim. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' - type: string - volumeMode: - description: volumeMode - defines what type of - volume is required by - the claim. Value of - Filesystem is implied - when not included in - claim spec. - type: string - volumeName: - description: VolumeName - is the binding reference - to the PersistentVolume - backing this claim. - type: string - fc: - description: FC represents a Fibre - Channel resource that is attached - to a kubelet's host machine and - then exposed to the pod. - type: object - properties: - fsType: - description: 'Filesystem type - to mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. TODO: how do - we prevent errors in the filesystem - from compromising the machine' - type: string - lun: - description: 'Optional: FC target - lun number' - type: integer - format: int32 - readOnly: - description: 'Optional: Defaults - to false (read/write). ReadOnly - here will force the ReadOnly - setting in VolumeMounts.' - type: boolean - targetWWNs: - description: 'Optional: FC target - worldwide names (WWNs)' - type: array - items: + 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 + storageClassName: + description: 'Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' + type: string + volumeMode: + description: volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. + type: string + volumeName: + description: VolumeName is the binding reference to the PersistentVolume backing this claim. + type: string + fc: + description: FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod. + type: object + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. TODO: how do we prevent errors in the filesystem from compromising the machine' type: string - wwids: - description: 'Optional: FC volume - world wide identifiers (wwids) - Either wwids or combination - of targetWWNs and lun must be - set, but not both simultaneously.' - type: array - items: + lun: + description: 'Optional: FC target lun number' + type: integer + format: int32 + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + targetWWNs: + description: 'Optional: FC target worldwide names (WWNs)' + type: array + items: + type: string + wwids: + description: 'Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.' + type: array + items: + type: string + flexVolume: + description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the driver to use for this volume. type: string - flexVolume: - description: FlexVolume represents - a generic volume resource that is - provisioned/attached using an exec - based plugin. - type: object - required: - - driver - properties: - driver: - description: Driver is the name - of the driver to use for this - volume. - type: string - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - The default filesystem depends - on FlexVolume script. - type: string - options: - description: 'Optional: Extra - command options if any.' - type: object - additionalProperties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script. type: string - readOnly: - description: 'Optional: Defaults - to false (read/write). ReadOnly - here will force the ReadOnly - setting in VolumeMounts.' - type: boolean - secretRef: - description: 'Optional: SecretRef - is reference to the secret object - containing sensitive information - to pass to the plugin scripts. - This may be empty if no secret - object is specified. If the - secret object contains more - than one secret, all secrets - are passed to the plugin scripts.' - type: object - properties: - 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?' + options: + description: 'Optional: Extra command options if any.' + type: object + additionalProperties: type: string - flocker: - description: Flocker represents a - Flocker volume attached to a kubelet's - host machine. This depends on the - Flocker control service being running - type: object - properties: - datasetName: - description: Name of the dataset - stored as metadata -> name on - the dataset for Flocker should - be considered as deprecated - type: string - datasetUUID: - description: UUID of the dataset. - This is unique identifier of - a Flocker dataset - type: string - gcePersistentDisk: - description: 'GCEPersistentDisk represents - a GCE Disk resource that is attached - to a kubelet''s host machine and - then exposed to the pod. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: object - required: - - pdName - properties: - fsType: - description: 'Filesystem type - of the volume that you want - to mount. Tip: Ensure that the - filesystem type is supported - by the host operating system. - Examples: "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk - TODO: how do we prevent errors - in the filesystem from compromising - the machine' - type: string - partition: - description: 'The partition in - the volume that you want to - mount. If omitted, the default - is to mount by volume name. - Examples: For volume /dev/sda1, - you specify the partition as - "1". Similarly, the volume partition - for /dev/sda is "0" (or you - can leave the property empty). - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: integer - format: int32 - pdName: - description: 'Unique name of the - PD resource in GCE. Used to - identify the disk in GCE. More - info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - readOnly: - description: 'ReadOnly here will - force the ReadOnly setting in - VolumeMounts. Defaults to false. - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: boolean - gitRepo: - description: 'GitRepo represents a - git repository at a particular revision. - DEPRECATED: GitRepo is deprecated. - To provision a container with a - git repo, mount an EmptyDir into - an InitContainer that clones the - repo using git, then mount the EmptyDir - into the Pod''s container.' - type: object - required: - - repository - properties: - directory: - description: Target directory - name. Must not contain or start - with '..'. If '.' is supplied, - the volume directory will be - the git repository. Otherwise, - if specified, the volume will - contain the git repository in - the subdirectory with the given - name. - type: string - repository: - description: Repository URL - type: string - revision: - description: Commit hash for the - specified revision. - type: string - glusterfs: - description: 'Glusterfs represents - a Glusterfs mount on the host that - shares a pod''s lifetime. More info: - https://examples.k8s.io/volumes/glusterfs/README.md' - type: object - required: - - endpoints - - path - properties: - endpoints: - description: 'EndpointsName is - the endpoint name that details - Glusterfs topology. More info: - https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - path: - description: 'Path is the Glusterfs - volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - readOnly: - description: 'ReadOnly here will - force the Glusterfs volume to - be mounted with read-only permissions. - Defaults to false. More info: - https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: boolean - hostPath: - description: 'HostPath represents - a pre-existing file or directory - on the host machine that is directly - exposed to the container. This is - generally used for system agents - or other privileged things that - are allowed to see the host machine. - Most containers will NOT need this. - More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath - --- TODO(jonesdl) We need to restrict - who can use host directory mounts - and who can/can not mount host directories - as read/write.' - type: object - required: - - path - properties: - path: - description: 'Path of the directory - on the host. If the path is - a symlink, it will follow the - link to the real path. More - info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - type: - description: 'Type for HostPath - Volume Defaults to "" More info: - https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - iscsi: - description: 'ISCSI represents an - ISCSI Disk resource that is attached - to a kubelet''s host machine and - then exposed to the pod. More info: - https://examples.k8s.io/volumes/iscsi/README.md' - type: object - required: - - iqn - - lun - - targetPortal - properties: - chapAuthDiscovery: - description: whether support iSCSI - Discovery CHAP authentication - type: boolean - chapAuthSession: - description: whether support iSCSI - Session CHAP authentication - type: boolean - fsType: - description: 'Filesystem type - of the volume that you want - to mount. Tip: Ensure that the - filesystem type is supported - by the host operating system. - Examples: "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi - TODO: how do we prevent errors - in the filesystem from compromising - the machine' - type: string - initiatorName: - description: Custom iSCSI Initiator - Name. If initiatorName is specified - with iscsiInterface simultaneously, - new iSCSI interface : will be - created for the connection. - type: string - iqn: - description: Target iSCSI Qualified - Name. - type: string - iscsiInterface: - description: iSCSI Interface Name - that uses an iSCSI transport. - Defaults to 'default' (tcp). - type: string - lun: - description: iSCSI Target Lun - number. - type: integer - format: int32 - portals: - description: iSCSI Target Portal - List. The portal is either an - IP or ip_addr:port if the port - is other than default (typically - TCP ports 860 and 3260). - type: array - items: + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + secretRef: + description: 'Optional: SecretRef is reference to the secret object containing sensitive information to pass to the plugin scripts. This may be empty if no secret object is specified. If the secret object contains more than one secret, all secrets are passed to the plugin scripts.' + type: object + properties: + 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 + flocker: + description: Flocker represents a Flocker volume attached to a kubelet's host machine. This depends on the Flocker control service being running + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata -> name on the dataset for Flocker should be considered as deprecated type: string - readOnly: - description: ReadOnly here will - force the ReadOnly setting in - VolumeMounts. Defaults to false. - type: boolean - secretRef: - description: CHAP Secret for iSCSI - target and initiator authentication - type: object - properties: - 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 - targetPortal: - description: iSCSI Target Portal. - The Portal is either an IP or - ip_addr:port if the port is - other than default (typically - TCP ports 860 and 3260). - type: string - name: - description: 'Volume''s name. Must - be a DNS_LABEL and unique within - the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - nfs: - description: 'NFS represents an NFS - mount on the host that shares a - pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: object - required: - - path - - server - properties: - path: - description: 'Path that is exported - by the NFS server. More info: - https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - readOnly: - description: 'ReadOnly here will - force the NFS export to be mounted - with read-only permissions. - Defaults to false. More info: - https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: boolean - server: - description: 'Server is the hostname - or IP address of the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - persistentVolumeClaim: - description: 'PersistentVolumeClaimVolumeSource - represents a reference to a PersistentVolumeClaim - in the same namespace. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: object - required: - - claimName - properties: - claimName: - description: 'ClaimName is the - name of a PersistentVolumeClaim - in the same namespace as the - pod using this volume. More - info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: string - readOnly: - description: Will force the ReadOnly - setting in VolumeMounts. Default - false. - type: boolean - photonPersistentDisk: - description: PhotonPersistentDisk - represents a PhotonController persistent - disk attached and mounted on kubelets - host machine - type: object - required: - - pdID - properties: - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. - type: string - pdID: - description: ID that identifies - Photon Controller persistent - disk - type: string - portworxVolume: - description: PortworxVolume represents - a portworx volume attached and mounted - on kubelets host machine - type: object - required: - - volumeID - properties: - fsType: - description: FSType represents - the filesystem type to mount - Must be a filesystem type supported - by the host operating system. - Ex. "ext4", "xfs". Implicitly - inferred to be "ext4" if unspecified. - type: string - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - volumeID: - description: VolumeID uniquely - identifies a Portworx volume - type: string - projected: - description: Items for all in one - resources secrets, configmaps, and - downward API - type: object - required: - - sources - properties: - defaultMode: - description: Mode bits used to - set permissions on created files - by default. Must be an octal - value between 0000 and 0777 - or a decimal value between 0 - and 511. YAML accepts both octal - and decimal values, JSON requires - decimal values for mode bits. - Directories within the path - are not affected by this setting. - This might be in conflict with - other options that affect the - file mode, like fsGroup, and - the result can be other mode - bits set. - type: integer - format: int32 - sources: - description: list of volume projections - type: array - items: - description: Projection that - may be projected along with - other supported volume types + datasetUUID: + description: UUID of the dataset. This is unique identifier of a Flocker dataset + type: string + gcePersistentDisk: + description: 'GCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: object + required: + - pdName + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: integer + format: int32 + pdName: + description: 'Unique name of the PD resource in GCE. Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + gitRepo: + description: 'GitRepo represents a git repository at a particular revision. DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod''s container.' + type: object + required: + - repository + properties: + directory: + description: Target directory name. Must not contain or start with '..'. If '.' is supplied, the volume directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name. + type: string + repository: + description: Repository URL + type: string + revision: + description: Commit hash for the specified revision. + type: string + glusterfs: + description: 'Glusterfs represents a Glusterfs mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' + type: object + required: + - endpoints + - path + properties: + endpoints: + description: 'EndpointsName is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + path: + description: 'Path is the Glusterfs volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + hostPath: + description: 'HostPath represents a pre-existing file or directory on the host machine that is directly exposed to the container. This is generally used for system agents or other privileged things that are allowed to see the host machine. Most containers will NOT need this. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath --- TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not mount host directories as read/write.' + type: object + required: + - path + properties: + path: + description: 'Path of the directory on the host. If the path is a symlink, it will follow the link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + iscsi: + description: 'ISCSI represents an ISCSI Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' + type: object + required: + - iqn + - lun + - targetPortal + properties: + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP authentication + type: boolean + chapAuthSession: + description: whether support iSCSI Session CHAP authentication + type: boolean + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface : will be created for the connection. + type: string + iqn: + description: Target iSCSI Qualified Name. + type: string + iscsiInterface: + description: iSCSI Interface Name that uses an iSCSI transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: integer + format: int32 + portals: + description: iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: array + items: + type: string + readOnly: + description: ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. + type: boolean + secretRef: + description: CHAP Secret for iSCSI target and initiator authentication type: object properties: - configMap: - description: information - about the configMap data - to project - type: object - properties: - items: - description: If unspecified, - each key-value pair - in the Data field - of the referenced - ConfigMap will be - projected into the - volume as a file whose - name is the key and - content is the value. - If specified, the - listed keys will be - projected into the - specified paths, and - unlisted keys will - not be present. If - a key is specified - which is not present - in the ConfigMap, - the volume setup will - error unless it is - marked optional. Paths - must be relative and - may not contain the - '..' path or start - with '..'. - type: array + 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 + targetPortal: + description: iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: string + name: + description: 'Volume''s name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: 'NFS represents an NFS mount on the host that shares a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: object + required: + - path + - server + properties: + path: + description: 'Path that is exported by the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS export to be mounted with read-only permissions. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + server: + description: 'Server is the hostname or IP address of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + persistentVolumeClaim: + description: 'PersistentVolumeClaimVolumeSource represents a reference to a PersistentVolumeClaim in the same namespace. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: object + required: + - claimName + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in VolumeMounts. Default false. + type: boolean + photonPersistentDisk: + description: PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine + type: object + required: + - pdID + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + pdID: + description: ID that identifies Photon Controller persistent disk + type: string + portworxVolume: + description: PortworxVolume represents a portworx volume attached and mounted on kubelets host machine + type: object + required: + - volumeID + properties: + fsType: + description: FSType represents the filesystem type to mount Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + volumeID: + description: VolumeID uniquely identifies a Portworx volume + type: string + projected: + description: Items for all in one resources secrets, configmaps, and downward API + type: object + properties: + defaultMode: + description: Mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set. + type: integer + format: int32 + sources: + description: list of volume projections + type: array + items: + description: Projection that may be projected along with other supported volume types + type: object + properties: + configMap: + description: information about the configMap data to project + type: object + properties: items: - description: Maps - a string key to - a path within a - volume. - type: object - required: - - key - - path - properties: - key: - description: The - key to project. - type: string - mode: - description: 'Optional: - mode bits used - to set permissions - on this file. - Must be an octal - value between - 0000 and 0777 - or a decimal - value between - 0 and 511. YAML - accepts both - octal and decimal - values, JSON - requires decimal - values for mode - bits. If not - specified, the - volume defaultMode - will be used. - This might be - in conflict - with other options - that affect - the file mode, - like fsGroup, - and the result - can be other - mode bits set.' - type: integer - format: int32 - path: - description: The - relative path - of the file - to map the key - to. May not - be an absolute - path. May not - contain the - path element - '..'. May not - start with the - string '..'. - 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 keys must be - defined - type: boolean - downwardAPI: - description: information - about the downwardAPI - data to project - type: object - properties: - items: - description: Items is - a list of DownwardAPIVolume - file - type: array + description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 keys must be defined + type: boolean + downwardAPI: + description: information about the downwardAPI data to project + type: object + properties: items: - description: DownwardAPIVolumeFile - represents information - to create the file - containing the pod - field - type: object - required: - - path - properties: - fieldRef: - description: 'Required: - Selects a field - of the pod: - only annotations, - labels, name - and namespace - are supported.' - 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 - mode: - description: 'Optional: - mode bits used - to set permissions - on this file, - must be an octal - value between - 0000 and 0777 - or a decimal - value between - 0 and 511. YAML - accepts both - octal and decimal - values, JSON - requires decimal - values for mode - bits. If not - specified, the - volume defaultMode - will be used. - This might be - in conflict - with other options - that affect - the file mode, - like fsGroup, - and the result - can be other - mode bits set.' - type: integer - format: int32 - path: - description: 'Required: - Path is the - relative path - name of the - file to be created. - Must not be - absolute or - contain the - ''..'' path. - Must be utf-8 - encoded. The - first item of - the relative - path must not - start with ''..''' - type: string - resourceFieldRef: - description: 'Selects - a resource of - the container: - only resources - limits and requests - (limits.cpu, - limits.memory, - requests.cpu - and requests.memory) - 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 - secret: - description: information - about the secret data - to project - type: object - properties: - items: - description: If unspecified, - each key-value pair - in the Data field - of the referenced - Secret will be projected - into the volume as - a file whose name - is the key and content - is the value. If specified, - the listed keys will - be projected into - the specified paths, - and unlisted keys - will not be present. - If a key is specified - which is not present - in the Secret, the - volume setup will - error unless it is - marked optional. Paths - must be relative and - may not contain the - '..' path or start - with '..'. - type: array + description: Items is a list of DownwardAPIVolume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field + type: object + required: + - path + properties: + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' + 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 + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: 'Required: Path is the relative path name of the file to be created. Must not be absolute or contain the ''..'' path. Must be utf-8 encoded. The first item of the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) 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 + secret: + description: information about the secret data to project + type: object + properties: items: - description: Maps - a string key to - a path within a - volume. - type: object - required: - - key - - path - properties: - key: - description: The - key to project. - type: string - mode: - description: 'Optional: - mode bits used - to set permissions - on this file. - Must be an octal - value between - 0000 and 0777 - or a decimal - value between - 0 and 511. YAML - accepts both - octal and decimal - values, JSON - requires decimal - values for mode - bits. If not - specified, the - volume defaultMode - will be used. - This might be - in conflict - with other options - that affect - the file mode, - like fsGroup, - and the result - can be other - mode bits set.' - type: integer - format: int32 - path: - description: The - relative path - of the file - to map the key - to. May not - be an absolute - path. May not - contain the - path element - '..'. May not - start with the - string '..'. - 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 - serviceAccountToken: - description: information - about the serviceAccountToken - data to project - type: object - required: - - path - properties: - audience: - description: Audience - is the intended audience - of the token. A recipient - of a token must identify - itself with an identifier - specified in the audience - of the token, and - otherwise should reject - the token. The audience - defaults to the identifier - of the apiserver. - type: string - expirationSeconds: - description: ExpirationSeconds - is the requested duration - of validity of the - service account token. - As the token approaches - expiration, the kubelet - volume plugin will - proactively rotate - the service account - token. The kubelet - will start trying - to rotate the token - if the token is older - than 80 percent of - its time to live or - if the token is older - than 24 hours.Defaults - to 1 hour and must - be at least 10 minutes. - type: integer - format: int64 - path: - description: Path is - the path relative - to the mount point - of the file to project - the token into. - type: string - quobyte: - description: Quobyte represents a - Quobyte mount on the host that shares - a pod's lifetime - type: object - required: - - registry - - volume - properties: - group: - description: Group to map volume - access to Default is no group - type: string - readOnly: - description: ReadOnly here will - force the Quobyte volume to - be mounted with read-only permissions. - Defaults to false. - type: boolean - registry: - description: Registry represents - a single or multiple Quobyte - Registry services specified - as a string as host:port pair - (multiple entries are separated - with commas) which acts as the - central registry for volumes - type: string - tenant: - description: Tenant owning the - given Quobyte volume in the - Backend Used with dynamically - provisioned Quobyte volumes, - value is set by the plugin - type: string - user: - description: User to map volume - access to Defaults to serivceaccount - user - type: string - volume: - description: Volume is a string - that references an already created - Quobyte volume by name. - type: string - rbd: - description: 'RBD represents a Rados - Block Device mount on the host that - shares a pod''s lifetime. More info: - https://examples.k8s.io/volumes/rbd/README.md' - type: object - required: - - image - - monitors - properties: - fsType: - description: 'Filesystem type - of the volume that you want - to mount. Tip: Ensure that the - filesystem type is supported - by the host operating system. - Examples: "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd - TODO: how do we prevent errors - in the filesystem from compromising - the machine' - type: string - image: - description: 'The rados image - name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - keyring: - description: 'Keyring is the path - to key ring for RBDUser. Default - is /etc/ceph/keyring. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - monitors: - description: 'A collection of - Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: array - items: + description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 + serviceAccountToken: + description: information about the serviceAccountToken data to project + type: object + required: + - path + properties: + audience: + description: Audience is the intended audience of the token. A recipient of a token must identify itself with an identifier specified in the audience of the token, and otherwise should reject the token. The audience defaults to the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the requested duration of validity of the service account token. As the token approaches expiration, the kubelet volume plugin will proactively rotate the service account token. The kubelet will start trying to rotate the token if the token is older than 80 percent of its time to live or if the token is older than 24 hours.Defaults to 1 hour and must be at least 10 minutes. + type: integer + format: int64 + path: + description: Path is the path relative to the mount point of the file to project the token into. + type: string + quobyte: + description: Quobyte represents a Quobyte mount on the host that shares a pod's lifetime + type: object + required: + - registry + - volume + properties: + group: + description: Group to map volume access to Default is no group type: string - pool: - description: 'The rados pool name. - Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - readOnly: - description: 'ReadOnly here will - force the ReadOnly setting in - VolumeMounts. Defaults to false. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: boolean - secretRef: - description: 'SecretRef is name - of the authentication secret - for RBDUser. If provided overrides - keyring. Default is nil. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: object - properties: - 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 - user: - description: 'The rados user name. - Default is admin. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - scaleIO: - description: ScaleIO represents a - ScaleIO persistent volume attached - and mounted on Kubernetes nodes. - type: object - required: - - gateway - - secretRef - - system - properties: - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Default is "xfs". - type: string - gateway: - description: The host address - of the ScaleIO API Gateway. - type: string - protectionDomain: - description: The name of the ScaleIO - Protection Domain for the configured - storage. - type: string - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - secretRef: - description: SecretRef references - to the secret for ScaleIO user - and other sensitive information. - If this is not provided, Login - operation will fail. - type: object - properties: - 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?' + readOnly: + description: ReadOnly here will force the Quobyte volume to be mounted with read-only permissions. Defaults to false. + type: boolean + registry: + description: Registry represents a single or multiple Quobyte Registry services specified as a string as host:port pair (multiple entries are separated with commas) which acts as the central registry for volumes + type: string + tenant: + description: Tenant owning the given Quobyte volume in the Backend Used with dynamically provisioned Quobyte volumes, value is set by the plugin + type: string + user: + description: User to map volume access to Defaults to serivceaccount user + type: string + volume: + description: Volume is a string that references an already created Quobyte volume by name. + type: string + rbd: + description: 'RBD represents a Rados Block Device mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md' + type: object + required: + - image + - monitors + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + image: + description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + keyring: + description: 'Keyring is the path to key ring for RBDUser. Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: type: string - sslEnabled: - description: Flag to enable/disable - SSL communication with Gateway, - default false - type: boolean - storageMode: - description: Indicates whether - the storage for a volume should - be ThickProvisioned or ThinProvisioned. - Default is ThinProvisioned. - type: string - storagePool: - description: The ScaleIO Storage - Pool associated with the protection - domain. - type: string - system: - description: The name of the storage - system as configured in ScaleIO. - type: string - volumeName: - description: The name of a volume - already created in the ScaleIO - system that is associated with - this volume source. - type: string - secret: - description: 'Secret represents a - secret that should populate this - volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: object - properties: - defaultMode: - description: 'Optional: mode bits - used to set permissions on created - files by default. Must be an - octal value between 0000 and - 0777 or a decimal value between - 0 and 511. YAML accepts both - octal and decimal values, JSON - requires decimal values for - mode bits. Defaults to 0644. - Directories within the path - are not affected by this setting. - This might be in conflict with - other options that affect the - file mode, like fsGroup, and - the result can be other mode - bits set.' - type: integer - format: int32 - items: - description: If unspecified, each - key-value pair in the Data field - of the referenced Secret will - be projected into the volume - as a file whose name is the - key and content is the value. - If specified, the listed keys - will be projected into the specified - paths, and unlisted keys will - not be present. If a key is - specified which is not present - in the Secret, the volume setup - will error unless it is marked - optional. Paths must be relative - and may not contain the '..' - path or start with '..'. - type: array - items: - description: Maps a string key - to a path within a volume. + pool: + description: 'The rados pool name. Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + secretRef: + description: 'SecretRef is name of the authentication secret for RBDUser. If provided overrides keyring. Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: object - required: - - key - - path properties: - key: - description: The key to - project. + 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 - mode: - description: 'Optional: - mode bits used to set - permissions on this file. - Must be an octal value - between 0000 and 0777 - or a decimal value between - 0 and 511. YAML accepts - both octal and decimal - values, JSON requires - decimal values for mode - bits. If not specified, - the volume defaultMode - will be used. This might - be in conflict with other - options that affect the - file mode, like fsGroup, - and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: The relative - path of the file to map - the key to. May not be - an absolute path. May - not contain the path element - '..'. May not start with - the string '..'. + user: + description: 'The rados user name. Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + scaleIO: + description: ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + type: object + required: + - gateway + - secretRef + - system + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Default is "xfs". + type: string + gateway: + description: The host address of the ScaleIO API Gateway. + type: string + protectionDomain: + description: The name of the ScaleIO Protection Domain for the configured storage. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail. + type: object + properties: + 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 keys must be defined - type: boolean - secretName: - description: 'Name of the secret - in the pod''s namespace to use. - More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: string - storageos: - description: StorageOS represents - a StorageOS volume attached and - mounted on Kubernetes nodes. - type: object - properties: - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. - type: string - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - secretRef: - description: SecretRef specifies - the secret to use for obtaining - the StorageOS API credentials. If - not specified, default values - will be attempted. - type: object - properties: - 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 - volumeName: - description: VolumeName is the - human-readable name of the StorageOS - volume. Volume names are only - unique within a namespace. - type: string - volumeNamespace: - description: VolumeNamespace specifies - the scope of the volume within - StorageOS. If no namespace - is specified then the Pod's - namespace will be used. This - allows the Kubernetes name scoping - to be mirrored within StorageOS - for tighter integration. Set - VolumeName to any name to override - the default behaviour. Set to - "default" if you are not using - namespaces within StorageOS. - Namespaces that do not pre-exist - within StorageOS will be created. - type: string - vsphereVolume: - description: VsphereVolume represents - a vSphere volume attached and mounted - on kubelets host machine - type: object - required: - - volumePath - properties: - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. - type: string - storagePolicyID: - description: Storage Policy Based - Management (SPBM) profile ID - associated with the StoragePolicyName. - type: string - storagePolicyName: - description: Storage Policy Based - Management (SPBM) profile name. - type: string - volumePath: - description: Path that identifies - vSphere volume vmdk - type: string - permissions: - type: array - items: - description: StrategyDeploymentPermissions describe the - rbac rules and service account needed by the install strategy - type: object - required: - - rules - - serviceAccountName - properties: - rules: - type: array - items: - description: PolicyRule holds information that describes - a policy rule, but does not contain information - about who the rule applies to or which namespace - the rule applies to. - type: object - required: - - verbs - properties: - apiGroups: - description: APIGroups is the name of the APIGroup - that contains the resources. If multiple API - groups are specified, any action requested against - one of the enumerated resources in any API group - will be allowed. - type: array - items: - type: string - nonResourceURLs: - description: NonResourceURLs is a set of partial - urls that a user should have access to. *s - are allowed, but only as the full, final step - in the path Since non-resource URLs are not - namespaced, this field is only applicable for - ClusterRoles referenced from a ClusterRoleBinding. - Rules can either apply to API resources (such - as "pods" or "secrets") or non-resource URL - paths (such as "/api"), but not both. - type: array - items: - type: string - resourceNames: - description: ResourceNames is an optional white - list of names that the rule applies to. An - empty set means that everything is allowed. - type: array - items: - type: string - resources: - description: Resources is a list of resources - this rule applies to. ResourceAll represents - all resources. - type: array - items: - type: string - verbs: - description: Verbs is a list of Verbs that apply - to ALL the ResourceKinds and AttributeRestrictions - contained in this rule. VerbAll represents - all kinds. - type: array - items: - type: string - serviceAccountName: - type: string - strategy: + sslEnabled: + description: Flag to enable/disable SSL communication with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned. + type: string + storagePool: + description: The ScaleIO Storage Pool associated with the protection domain. + type: string + system: + description: The name of the storage system as configured in ScaleIO. + type: string + volumeName: + description: The name of a volume already created in the ScaleIO system that is associated with this volume source. + type: string + secret: + description: 'Secret represents a secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + optional: + description: Specify whether the Secret or its keys must be defined + type: boolean + secretName: + description: 'Name of the secret in the pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + storageos: + description: StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes. + type: object + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef specifies the secret to use for obtaining the StorageOS API credentials. If not specified, default values will be attempted. + type: object + properties: + 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 + volumeName: + description: VolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace. + type: string + volumeNamespace: + description: VolumeNamespace specifies the scope of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping to be mirrored within StorageOS for tighter integration. Set VolumeName to any name to override the default behaviour. Set to "default" if you are not using namespaces within StorageOS. Namespaces that do not pre-exist within StorageOS will be created. + type: string + vsphereVolume: + description: VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine + type: object + required: + - volumePath + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName. + type: string + storagePolicyName: + description: Storage Policy Based Management (SPBM) profile name. + type: string + volumePath: + description: Path that identifies vSphere volume vmdk + type: string + permissions: + type: array + items: + description: StrategyDeploymentPermissions describe the rbac rules and service account needed by the install strategy + type: object + required: + - rules + - serviceAccountName + properties: + rules: + type: array + items: + description: PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to. + type: object + required: + - verbs + properties: + apiGroups: + description: APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. + type: array + items: + type: string + nonResourceURLs: + description: NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both. + type: array + items: + type: string + resourceNames: + description: ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. + type: array + items: + type: string + resources: + description: Resources is a list of resources this rule applies to. ResourceAll represents all resources. + type: array + items: + type: string + verbs: + description: Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds. + type: array + items: + type: string + serviceAccountName: + type: string + strategy: + type: string + installModes: + description: InstallModes specify supported installation types + type: array + items: + description: InstallMode associates an InstallModeType with a flag representing if the CSV supports it + type: object + required: + - supported + - type + properties: + supported: + type: boolean + type: + description: InstallModeType is a supported type of install mode for CSV installation + type: string + keywords: + type: array + items: type: string - installModes: - description: InstallModes specify supported installation types - type: array - items: - description: InstallMode associates an InstallModeType with a flag - representing if the CSV supports it + labels: + description: Map of string keys and values that can be used to organize and categorize (scope and select) objects. type: object - required: - - supported - - type - properties: - supported: - type: boolean - type: - description: InstallModeType is a supported type of install - mode for CSV installation - type: string - keywords: - type: array - items: + additionalProperties: + type: string + links: + type: array + items: + type: object + properties: + name: + type: string + url: + type: string + maintainers: + type: array + items: + type: object + properties: + email: + type: string + name: + type: string + maturity: type: string - labels: - description: Map of string keys and values that can be used to organize - and categorize (scope and select) objects. - type: object - additionalProperties: + minKubeVersion: type: string - links: - type: array - items: + nativeAPIs: + type: array + items: + description: GroupVersionKind unambiguously identifies a kind. It doesn't anonymously include GroupVersion to avoid automatic coersion. It doesn't use a GroupVersion to avoid custom marshalling + type: object + required: + - group + - kind + - version + properties: + group: + type: string + kind: + type: string + version: + type: string + provider: type: object properties: name: type: string url: type: string - maintainers: - type: array - items: - type: object - properties: - email: - type: string - name: - type: string - maturity: - type: string - minKubeVersion: - type: string - nativeAPIs: - type: array - items: - description: GroupVersionKind unambiguously identifies a kind. It - doesn't anonymously include GroupVersion to avoid automatic coersion. It - doesn't use a GroupVersion to avoid custom marshalling + replaces: + description: The name of a CSV this one replaces. Should match the `metadata.Name` field of the old CSV. + type: string + selector: + description: Label selector for related resources. type: object - required: - - group - - kind - - version properties: - group: - type: string - kind: - type: string - version: - type: string - provider: - type: object - properties: - name: - type: string - url: - type: string - replaces: - description: The name of a CSV this one replaces. Should match the - `metadata.Name` field of the old CSV. - type: string - selector: - description: Label selector for related resources. - 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. + 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 - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies - to. + additionalProperties: + type: string + version: + description: OperatorVersion is a wrapper around semver.Version which supports correct marshaling to YAML and JSON. + type: string + webhookdefinitions: + type: array + items: + description: WebhookDescription provides details to OLM about required webhooks + type: object + required: + - admissionReviewVersions + - generateName + - sideEffects + - type + properties: + admissionReviewVersions: + type: array + items: type: string - operator: - description: operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. + containerPort: + type: integer + format: int32 + default: 443 + maximum: 65535 + minimum: 1 + conversionCRDs: + type: array + items: 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 - version: - description: OperatorVersion is a wrapper around semver.Version which - supports correct marshaling to YAML and JSON. - type: string - webhookdefinitions: - type: array - items: - description: WebhookDescription provides details to OLM about required - webhooks - type: object - required: - - admissionReviewVersions - - generateName - - sideEffects - - type - properties: - admissionReviewVersions: - type: array - items: + deploymentName: type: string - containerPort: - type: integer - format: int32 - default: 443 - maximum: 65535 - minimum: 1 - conversionCRDs: - type: array - items: + failurePolicy: type: string - deploymentName: - type: string - failurePolicy: - type: string - generateName: - type: string - matchPolicy: - description: MatchPolicyType specifies the type of match policy - type: string - objectSelector: - description: A label selector is a label query over a set of - resources. The result of matchLabels and matchExpressions - are ANDed. An empty label selector matches all objects. A - null label selector matches no objects. - 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 - reinvocationPolicy: - description: ReinvocationPolicyType specifies what type of policy - the admission hook uses. - type: string - rules: - type: array - items: - description: RuleWithOperations is a tuple of Operations and - Resources. It is recommended to make sure that all the tuple - expansions are valid. + generateName: + type: string + matchPolicy: + description: MatchPolicyType specifies the type of match policy + type: string + objectSelector: + description: A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects. type: object properties: - apiGroups: - description: APIGroups is the API groups the resources - belong to. '*' is all groups. If '*' is present, the - length of the slice must be one. Required. + 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 - apiVersions: - description: APIVersions is the API versions the resources - belong to. '*' is all versions. If '*' is present, the - length of the slice must be one. Required. - type: array - items: + reinvocationPolicy: + description: ReinvocationPolicyType specifies what type of policy the admission hook uses. + type: string + rules: + type: array + items: + description: RuleWithOperations is a tuple of Operations and Resources. It is recommended to make sure that all the tuple expansions are valid. + type: object + properties: + apiGroups: + description: APIGroups is the API groups the resources belong to. '*' is all groups. If '*' is present, the length of the slice must be one. Required. + type: array + items: + type: string + apiVersions: + description: APIVersions is the API versions the resources belong to. '*' is all versions. If '*' is present, the length of the slice must be one. Required. + type: array + items: + type: string + operations: + description: Operations is the operations the admission hook cares about - CREATE, UPDATE, DELETE, CONNECT or * for all of those operations and any future admission operations that are added. If '*' is present, the length of the slice must be one. Required. + type: array + items: + type: string + resources: + description: "Resources is a list of resources this rule applies to. \n For example: 'pods' means pods. 'pods/log' means the log subresource of pods. '*' means all resources, but not subresources. 'pods/*' means all subresources of pods. '*/scale' means all scale subresources. '*/*' means all resources and their subresources. \n If wildcard is present, the validation rule will ensure resources do not overlap with each other. \n Depending on the enclosing object, subresources might not be allowed. Required." + type: array + items: + type: string + scope: + description: scope specifies the scope of this rule. Valid values are "Cluster", "Namespaced", and "*" "Cluster" means that only cluster-scoped resources will match this rule. Namespace API objects are cluster-scoped. "Namespaced" means that only namespaced resources will match this rule. "*" means that there are no scope restrictions. Subresources match the scope of their parent resource. Default is "*". type: string - operations: - description: Operations is the operations the admission - hook cares about - CREATE, UPDATE, DELETE, CONNECT or - * for all of those operations and any future admission - operations that are added. If '*' is present, the length - of the slice must be one. Required. - type: array - items: + sideEffects: + type: string + targetPort: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + type: integer + format: int32 + type: + description: WebhookAdmissionType is the type of admission webhooks supported by OLM + type: string + enum: + - ValidatingAdmissionWebhook + - MutatingAdmissionWebhook + - ConversionWebhook + webhookPath: + type: string + status: + description: ClusterServiceVersionStatus represents information about the status of a pod. Status may trail the actual state of a system. + type: object + properties: + certsLastUpdated: + description: Last time the owned APIService certs were updated + type: string + format: date-time + certsRotateAt: + description: Time the owned APIService certs will rotate next + type: string + format: date-time + conditions: + description: List of conditions, a history of state transitions + type: array + items: + description: Conditions appear in the status as a record of state transitions on the ClusterServiceVersion + type: object + properties: + lastTransitionTime: + description: Last time the status transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time we updated the status + type: string + format: date-time + message: + description: A human readable message indicating details about why the ClusterServiceVersion is in this condition. + type: string + phase: + description: Condition of the ClusterServiceVersion + type: string + reason: + description: A brief CamelCase message indicating details about why the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' + type: string + lastTransitionTime: + description: Last time the status transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time we updated the status + type: string + format: date-time + message: + description: A human readable message indicating details about why the ClusterServiceVersion is in this condition. + type: string + phase: + description: Current condition of the ClusterServiceVersion + type: string + reason: + description: A brief CamelCase message indicating details about why the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' + type: string + requirementStatus: + description: The status of each requirement for this CSV + type: array + items: + type: object + required: + - group + - kind + - message + - name + - status + - version + properties: + dependents: + type: array + items: + description: DependentStatus is the status for a dependent requirement (to prevent infinite nesting) + type: object + required: + - group + - kind + - status + - version + properties: + group: type: string - resources: - description: "Resources is a list of resources this rule - applies to. \n For example: 'pods' means pods. 'pods/log' - means the log subresource of pods. '*' means all resources, - but not subresources. 'pods/*' means all subresources - of pods. '*/scale' means all scale subresources. '*/*' - means all resources and their subresources. \n If wildcard - is present, the validation rule will ensure resources - do not overlap with each other. \n Depending on the - enclosing object, subresources might not be allowed. - Required." - type: array - items: + kind: type: string - scope: - description: scope specifies the scope of this rule. Valid - values are "Cluster", "Namespaced", and "*" "Cluster" - means that only cluster-scoped resources will match - this rule. Namespace API objects are cluster-scoped. - "Namespaced" means that only namespaced resources will - match this rule. "*" means that there are no scope restrictions. - Subresources match the scope of their parent resource. - Default is "*". - type: string - sideEffects: - type: string - targetPort: - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - type: integer - format: int32 - type: - description: WebhookAdmissionType is the type of admission webhooks - supported by OLM - type: string - enum: - - ValidatingAdmissionWebhook - - MutatingAdmissionWebhook - - ConversionWebhook - webhookPath: - type: string - status: - description: ClusterServiceVersionStatus represents information about - the status of a pod. Status may trail the actual state of a system. - type: object - properties: - certsLastUpdated: - description: Last time the owned APIService certs were updated - type: string - format: date-time - certsRotateAt: - description: Time the owned APIService certs will rotate next - type: string - format: date-time - conditions: - description: List of conditions, a history of state transitions - type: array - items: - description: Conditions appear in the status as a record of state - transitions on the ClusterServiceVersion - type: object - properties: - lastTransitionTime: - description: Last time the status transitioned from one status - to another. - type: string - format: date-time - lastUpdateTime: - description: Last time we updated the status - type: string - format: date-time - message: - description: A human readable message indicating details about - why the ClusterServiceVersion is in this condition. - type: string - phase: - description: Condition of the ClusterServiceVersion - type: string - reason: - description: A brief CamelCase message indicating details about - why the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' - type: string - lastTransitionTime: - description: Last time the status transitioned from one status to - another. - type: string - format: date-time - lastUpdateTime: - description: Last time we updated the status - type: string - format: date-time - message: - description: A human readable message indicating details about why - the ClusterServiceVersion is in this condition. - type: string - phase: - description: Current condition of the ClusterServiceVersion - type: string - reason: - description: A brief CamelCase message indicating details about why - the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' - type: string - requirementStatus: - description: The status of each requirement for this CSV - type: array - items: - type: object - required: - - group - - kind - - message - - name - - status - - version - properties: - dependents: - type: array - items: - description: DependentStatus is the status for a dependent - requirement (to prevent infinite nesting) - type: object - required: - - group - - kind - - status - - version - properties: - group: - type: string - kind: - type: string - message: - type: string - status: - description: StatusReason is a camelcased reason for the - status of a RequirementStatus or DependentStatus - type: string - uuid: - type: string - version: - type: string - group: - type: string - kind: - type: string - message: - type: string - name: - type: string - status: - description: StatusReason is a camelcased reason for the status - of a RequirementStatus or DependentStatus - type: string - uuid: - type: string - version: - type: string - served: true - storage: true - subresources: - status: {} + message: + type: string + status: + description: StatusReason is a camelcased reason for the status of a RequirementStatus or DependentStatus + type: string + uuid: + type: string + version: + type: string + group: + type: string + kind: + type: string + message: + type: string + name: + type: string + status: + description: StatusReason is a camelcased reason for the status of a RequirementStatus or DependentStatus + type: string + uuid: + type: string + version: + type: string + served: true + storage: true + subresources: + status: {} diff --git a/manifests/0000_50_olm_00-installplans.crd.yaml b/manifests/0000_50_olm_00-installplans.crd.yaml index 617c35e7b4..d2128a4d6a 100644 --- a/manifests/0000_50_olm_00-installplans.crd.yaml +++ b/manifests/0000_50_olm_00-installplans.crd.yaml @@ -2,303 +2,255 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: installplans.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: InstallPlan listKind: InstallPlanList plural: installplans shortNames: - - ip + - ip singular: installplan scope: Namespaced versions: - - additionalPrinterColumns: - - description: The first CSV in the list of clusterServiceVersionNames - jsonPath: .spec.clusterServiceVersionNames[0] - name: CSV - type: string - - description: The approval mode - jsonPath: .spec.approval - name: Approval - type: string - - jsonPath: .spec.approved - name: Approved - type: boolean - name: v1alpha1 - schema: - openAPIV3Schema: - description: InstallPlan defines the installation of a set of operators. - type: object - required: - - metadata - - 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: InstallPlanSpec defines a set of Application resources to - be installed - type: object - required: - - approval - - approved - - clusterServiceVersionNames - properties: - approval: - description: Approval is the user approval policy for an InstallPlan. - It must be one of "Automatic" or "Manual". - type: string - approved: - type: boolean - clusterServiceVersionNames: - type: array - items: + - additionalPrinterColumns: + - description: The first CSV in the list of clusterServiceVersionNames + jsonPath: .spec.clusterServiceVersionNames[0] + name: CSV + type: string + - description: The approval mode + jsonPath: .spec.approval + name: Approval + type: string + - jsonPath: .spec.approved + name: Approved + type: boolean + name: v1alpha1 + schema: + openAPIV3Schema: + description: InstallPlan defines the installation of a set of operators. + type: object + required: + - metadata + - 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: InstallPlanSpec defines a set of Application resources to be installed + type: object + required: + - approval + - approved + - clusterServiceVersionNames + properties: + approval: + description: Approval is the user approval policy for an InstallPlan. It must be one of "Automatic" or "Manual". type: string - generation: - type: integer - source: - type: string - sourceNamespace: - type: string - status: - description: "InstallPlanStatus represents the information about the status - of steps required to complete installation. \n Status may trail the - actual state of a system." - type: object - required: - - catalogSources - - phase - properties: - attenuatedServiceAccountRef: - description: AttenuatedServiceAccountRef references the service account - that is used to do scoped operator install. - type: object - properties: - apiVersion: - description: API version of the referent. + approved: + type: boolean + clusterServiceVersionNames: + type: array + items: type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - bundleLookups: - description: BundleLookups is the set of in-progress requests to pull - and unpackage bundle content to the cluster. - type: array - items: - description: BundleLookup is a request to pull and unpackage the - content of a bundle to the cluster. + generation: + type: integer + source: + type: string + sourceNamespace: + type: string + status: + description: "InstallPlanStatus represents the information about the status of steps required to complete installation. \n Status may trail the actual state of a system." + type: object + required: + - catalogSources + - phase + properties: + attenuatedServiceAccountRef: + description: AttenuatedServiceAccountRef references the service account that is used to do scoped operator install. type: object - required: - - catalogSourceRef - - identifier - - path - - replaces properties: - catalogSourceRef: - description: CatalogSourceRef is a reference to the CatalogSource - the bundle path was resolved from. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this pod). - This syntax is chosen only to have some well-defined way - of referencing a part of an object. TODO: this design - is not final and this field is subject to change in the - future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - conditions: - description: Conditions represents the overall state of a BundleLookup. - type: array - items: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + bundleLookups: + description: BundleLookups is the set of in-progress requests to pull and unpackage bundle content to the cluster. + type: array + items: + description: BundleLookup is a request to pull and unpackage the content of a bundle to the cluster. + type: object + required: + - catalogSourceRef + - identifier + - path + - replaces + properties: + catalogSourceRef: + description: CatalogSourceRef is a reference to the CatalogSource the bundle path was resolved from. type: object - required: - - status - - type properties: - lastTransitionTime: - description: Last time the condition transitioned from - one status to another. + apiVersion: + description: API version of the referent. type: string - format: date-time - lastUpdateTime: - description: Last time the condition was probed. + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' type: string - format: date-time - message: - description: A human readable message indicating details - about the transition. + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' type: string - reason: - description: The reason for the condition's last transition. + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string - status: - description: Status of the condition, one of True, False, - Unknown. + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' type: string - type: - description: Type of condition. + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' type: string - identifier: - description: Identifier is the catalog-unique name of the operator - (the name of the CSV for bundles that contain CSVs) - type: string - path: - description: Path refers to the location of a bundle to pull. - It's typically an image reference. - type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + conditions: + description: Conditions represents the overall state of a BundleLookup. + type: array + items: + type: object + required: + - status + - type + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time the condition was probed. + type: string + format: date-time + message: + description: A human readable message indicating details about the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type of condition. + type: string + identifier: + description: Identifier is the catalog-unique name of the operator (the name of the CSV for bundles that contain CSVs) + type: string + path: + description: Path refers to the location of a bundle to pull. It's typically an image reference. + type: string + properties: + description: The effective properties of the unpacked bundle. + type: string + replaces: + description: Replaces is the name of the bundle to replace with the one found at Path. + type: string + catalogSources: + type: array + items: + type: string + conditions: + type: array + items: + description: InstallPlanCondition represents the overall status of the execution of an InstallPlan. + type: object properties: - description: The effective properties of the unpacked bundle. - type: string - replaces: - description: Replaces is the name of the bundle to replace with - the one found at Path. - type: string - catalogSources: - type: array - items: + lastTransitionTime: + type: string + format: date-time + lastUpdateTime: + type: string + format: date-time + message: + type: string + reason: + description: ConditionReason is a camelcased reason for the state transition. + type: string + status: + type: string + type: + description: InstallPlanConditionType describes the state of an InstallPlan at a certain point as a whole. + type: string + phase: + description: InstallPlanPhase is the current status of a InstallPlan as a whole. type: string - conditions: - type: array - items: - description: InstallPlanCondition represents the overall status - of the execution of an InstallPlan. - type: object - properties: - lastTransitionTime: - type: string - format: date-time - lastUpdateTime: - type: string - format: date-time - message: - type: string - reason: - description: ConditionReason is a camelcased reason for the - state transition. - type: string - status: - type: string - type: - description: InstallPlanConditionType describes the state of - an InstallPlan at a certain point as a whole. - type: string - phase: - description: InstallPlanPhase is the current status of a InstallPlan - as a whole. - type: string - plan: - type: array - items: - description: Step represents the status of an individual step in - an InstallPlan. - type: object - required: - - resolving - - resource - - status - properties: - resolving: - type: string - resource: - description: StepResource represents the status of a resource - to be tracked by an InstallPlan. - type: object - required: - - group - - kind - - name - - sourceName - - sourceNamespace - - version - properties: - group: - type: string - kind: - type: string - manifest: - type: string - name: - type: string - sourceName: - type: string - sourceNamespace: - type: string - version: - type: string - status: - description: StepStatus is the current status of a particular - resource an in InstallPlan - type: string - served: true - storage: true - subresources: - status: {} + plan: + type: array + items: + description: Step represents the status of an individual step in an InstallPlan. + type: object + required: + - resolving + - resource + - status + properties: + resolving: + type: string + resource: + description: StepResource represents the status of a resource to be tracked by an InstallPlan. + type: object + required: + - group + - kind + - name + - sourceName + - sourceNamespace + - version + properties: + group: + type: string + kind: + type: string + manifest: + type: string + name: + type: string + sourceName: + type: string + sourceNamespace: + type: string + version: + type: string + status: + description: StepStatus is the current status of a particular resource an in InstallPlan + type: string + served: true + storage: true + subresources: + status: {} diff --git a/manifests/0000_50_olm_00-operatorconditions.crd.yaml b/manifests/0000_50_olm_00-operatorconditions.crd.yaml index dc22c082be..5ad175b4cc 100644 --- a/manifests/0000_50_olm_00-operatorconditions.crd.yaml +++ b/manifests/0000_50_olm_00-operatorconditions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: operatorconditions.operators.coreos.com spec: @@ -14,186 +14,125 @@ spec: singular: operatorcondition scope: Namespaced versions: - - name: v1 - schema: - openAPIV3Schema: - description: OperatorCondition is a Custom Resource of type `OperatorCondition` - which is used to convey information to OLM about the state of an operator. - type: object - required: - - metadata - 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: OperatorConditionSpec allows a cluster admin to convey information - about the state of an operator to OLM, potentially overriding state - reported by the operator. - type: object - properties: - deployments: - type: array - items: - type: string - overrides: - 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, - 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])$ - serviceAccounts: - type: array - items: - type: string - status: - description: OperatorConditionStatus allows an operator to convey information - its state to OLM. The status may trail the actual state of a system. - type: object - properties: - conditions: - 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, - 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])$ - served: true - storage: true - subresources: - status: {} + - name: v1 + schema: + openAPIV3Schema: + description: OperatorCondition is a Custom Resource of type `OperatorCondition` which is used to convey information to OLM about the state of an operator. + type: object + required: + - metadata + 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: OperatorConditionSpec allows a cluster admin to convey information about the state of an operator to OLM, potentially overriding state reported by the operator. + type: object + properties: + deployments: + type: array + items: + type: string + overrides: + 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, 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: + - 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])$ + serviceAccounts: + type: array + items: + type: string + status: + description: OperatorConditionStatus allows an operator to convey information its state to OLM. The status may trail the actual state of a system. + type: object + properties: + conditions: + 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, 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])$ + served: true + storage: true + subresources: + status: {} diff --git a/manifests/0000_50_olm_00-operatorgroups.crd.yaml b/manifests/0000_50_olm_00-operatorgroups.crd.yaml index 6b08f7a844..9aff8275ad 100644 --- a/manifests/0000_50_olm_00-operatorgroups.crd.yaml +++ b/manifests/0000_50_olm_00-operatorgroups.crd.yaml @@ -2,304 +2,232 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: operatorgroups.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: OperatorGroup listKind: OperatorGroupList plural: operatorgroups shortNames: - - og + - og singular: operatorgroup scope: Namespaced versions: - - name: v1 - schema: - openAPIV3Schema: - description: OperatorGroup is the unit of multitenancy for OLM managed operators. - It constrains the installation of operators in its namespace to a specified - set of target namespaces. - type: object - required: - - metadata - 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: OperatorGroupSpec is the spec for an OperatorGroup resource. - type: object - properties: - selector: - description: Selector selects the OperatorGroup's target namespaces. - 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: + - name: v1 + schema: + openAPIV3Schema: + description: OperatorGroup is the unit of multitenancy for OLM managed operators. It constrains the installation of operators in its namespace to a specified set of target namespaces. + type: object + required: + - metadata + 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: OperatorGroupSpec is the spec for an OperatorGroup resource. + type: object + properties: + selector: + description: Selector selects the OperatorGroup's target namespaces. + 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 - 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 - serviceAccountName: - description: ServiceAccountName is the admin specified service account - which will be used to deploy operator(s) in this operator group. - type: string - staticProvidedAPIs: - description: Static tells OLM not to update the OperatorGroup's providedAPIs - annotation - type: boolean - targetNamespaces: - description: TargetNamespaces is an explicit set of namespaces to - target. If it is set, Selector is ignored. - type: array - items: - type: string - x-kubernetes-list-type: set - status: - description: OperatorGroupStatus is the status for an OperatorGroupResource. - type: object - required: - - lastUpdated - properties: - lastUpdated: - description: LastUpdated is a timestamp of the last time the OperatorGroup's - status was Updated. - type: string - format: date-time - namespaces: - description: Namespaces is the set of target namespaces for the OperatorGroup. - type: array - items: + 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 + serviceAccountName: + description: ServiceAccountName is the admin specified service account which will be used to deploy operator(s) in this operator group. type: string - x-kubernetes-list-type: set - serviceAccountRef: - description: ServiceAccountRef references the service account object - specified. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + staticProvidedAPIs: + description: Static tells OLM not to update the OperatorGroup's providedAPIs annotation + type: boolean + targetNamespaces: + description: TargetNamespaces is an explicit set of namespaces to target. If it is set, Selector is ignored. + type: array + items: type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + x-kubernetes-list-type: set + status: + description: OperatorGroupStatus is the status for an OperatorGroupResource. + type: object + required: + - lastUpdated + properties: + lastUpdated: + description: LastUpdated is a timestamp of the last time the OperatorGroup's status was Updated. + type: string + format: date-time + namespaces: + description: Namespaces is the set of target namespaces for the OperatorGroup. + type: array + items: type: string - served: true - storage: true - subresources: - status: {} - - name: v1alpha2 - schema: - openAPIV3Schema: - description: OperatorGroup is the unit of multitenancy for OLM managed operators. - It constrains the installation of operators in its namespace to a specified - set of target namespaces. - type: object - required: - - metadata - 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: OperatorGroupSpec is the spec for an OperatorGroup resource. - type: object - properties: - selector: - description: Selector selects the OperatorGroup's target namespaces. - 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: + x-kubernetes-list-type: set + serviceAccountRef: + description: ServiceAccountRef references the service account object specified. + type: object + properties: + apiVersion: + description: API version of the referent. type: string - serviceAccountName: - description: ServiceAccountName is the admin specified service account - which will be used to deploy operator(s) in this operator group. - type: string - staticProvidedAPIs: - description: Static tells OLM not to update the OperatorGroup's providedAPIs - annotation - type: boolean - targetNamespaces: - description: TargetNamespaces is an explicit set of namespaces to - target. If it is set, Selector is ignored. - type: array - items: - type: string - status: - description: OperatorGroupStatus is the status for an OperatorGroupResource. - type: object - required: - - lastUpdated - properties: - lastUpdated: - description: LastUpdated is a timestamp of the last time the OperatorGroup's - status was Updated. - type: string - format: date-time - namespaces: - description: Namespaces is the set of target namespaces for the OperatorGroup. - type: array - items: + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + served: true + storage: true + subresources: + status: {} + - name: v1alpha2 + schema: + openAPIV3Schema: + description: OperatorGroup is the unit of multitenancy for OLM managed operators. It constrains the installation of operators in its namespace to a specified set of target namespaces. + type: object + required: + - metadata + 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: OperatorGroupSpec is the spec for an OperatorGroup resource. + type: object + properties: + selector: + description: Selector selects the OperatorGroup's target namespaces. + 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 + serviceAccountName: + description: ServiceAccountName is the admin specified service account which will be used to deploy operator(s) in this operator group. type: string - serviceAccountRef: - description: ServiceAccountRef references the service account object - specified. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + staticProvidedAPIs: + description: Static tells OLM not to update the OperatorGroup's providedAPIs annotation + type: boolean + targetNamespaces: + description: TargetNamespaces is an explicit set of namespaces to target. If it is set, Selector is ignored. + type: array + items: type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + status: + description: OperatorGroupStatus is the status for an OperatorGroupResource. + type: object + required: + - lastUpdated + properties: + lastUpdated: + description: LastUpdated is a timestamp of the last time the OperatorGroup's status was Updated. + type: string + format: date-time + namespaces: + description: Namespaces is the set of target namespaces for the OperatorGroup. + type: array + items: type: string - served: true - storage: false - subresources: - status: {} + serviceAccountRef: + description: ServiceAccountRef references the service account object specified. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + served: true + storage: false + subresources: + status: {} diff --git a/manifests/0000_50_olm_00-operators.crd.yaml b/manifests/0000_50_olm_00-operators.crd.yaml index b873484a13..48866ee6e9 100644 --- a/manifests/0000_50_olm_00-operators.crd.yaml +++ b/manifests/0000_50_olm_00-operators.crd.yaml @@ -2,176 +2,137 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: operators.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: Operator listKind: OperatorList plural: operators singular: operator scope: Cluster versions: - - name: v1 - schema: - openAPIV3Schema: - description: Operator represents a cluster operator. - 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: OperatorSpec defines the desired state of Operator - type: object - status: - description: OperatorStatus defines the observed state of an Operator - and its components - type: object - properties: - components: - description: Components describes resources that compose the operator. - type: object - required: - - labelSelector - properties: - labelSelector: - description: LabelSelector is a label query over a set of resources - used to select the operator's components - 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 - refs: - description: Refs are a set of references to the operator's component - resources, selected with LabelSelector. - type: array - items: - description: RichReference is a reference to a resource, enriched - with its status conditions. + - name: v1 + schema: + openAPIV3Schema: + description: Operator represents a cluster operator. + 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: OperatorSpec defines the desired state of Operator + type: object + status: + description: OperatorStatus defines the observed state of an Operator and its components + type: object + properties: + components: + description: Components describes resources that compose the operator. + type: object + required: + - labelSelector + properties: + labelSelector: + description: LabelSelector is a label query over a set of resources used to select the operator's components type: object properties: - apiVersion: - description: API version of the referent. - type: string - conditions: - description: Conditions represents the latest state of the - component. + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. type: array items: - description: Condition represent the latest available - observations of an component's state. + 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: - - status - - type + - key + - operator properties: - lastTransitionTime: - description: Last time the condition transitioned - from one status to another. - type: string - format: date-time - lastUpdateTime: - description: Last time the condition was probed - type: string - format: date-time - message: - description: A human readable message indicating details - about the transition. + key: + description: key is the label key that the selector applies to. type: string - reason: - description: The reason for the condition's last transition. + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. type: string - status: - description: Status of the condition, one of True, - False, Unknown. - type: string - type: - description: Type of condition. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this pod). - This syntax is chosen only to have some well-defined way - of referencing a part of an object. TODO: this design - is not final and this field is subject to change in the - future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - served: true - storage: true - subresources: - status: {} + 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 + refs: + description: Refs are a set of references to the operator's component resources, selected with LabelSelector. + type: array + items: + description: RichReference is a reference to a resource, enriched with its status conditions. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + conditions: + description: Conditions represents the latest state of the component. + type: array + items: + description: Condition represent the latest available observations of an component's state. + type: object + required: + - status + - type + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time the condition was probed + type: string + format: date-time + message: + description: A human readable message indicating details about the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type of condition. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + served: true + storage: true + subresources: + status: {} diff --git a/manifests/0000_50_olm_00-subscriptions.crd.yaml b/manifests/0000_50_olm_00-subscriptions.crd.yaml index 568e0be11c..77335cd5e9 100644 --- a/manifests/0000_50_olm_00-subscriptions.crd.yaml +++ b/manifests/0000_50_olm_00-subscriptions.crd.yaml @@ -2,2081 +2,1341 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: subscriptions.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: Subscription listKind: SubscriptionList plural: subscriptions shortNames: - - sub - - subs + - sub + - subs singular: subscription scope: Namespaced versions: - - additionalPrinterColumns: - - description: The package subscribed to - jsonPath: .spec.name - name: Package - type: string - - description: The catalog source for the specified package - jsonPath: .spec.source - name: Source - type: string - - description: The channel of updates to subscribe to - jsonPath: .spec.channel - name: Channel - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: Subscription keeps operators up to date by tracking changes to - Catalogs. - type: object - required: - - metadata - - 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: SubscriptionSpec defines an Application that can be installed - type: object - required: - - name - - source - - sourceNamespace - properties: - channel: - type: string - config: - description: SubscriptionConfig contains configuration specified for - a subscription. - type: object - properties: - env: - description: Env is a list of environment variables to set in - the container. Cannot be updated. - 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 previous 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. The $(VAR_NAME) syntax can be - escaped with a double $$, ie: $$(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 - 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 - 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 - 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 - envFrom: - description: EnvFrom is a list of sources to populate environment - variables in the container. The keys defined within a source - must be a C_IDENTIFIER. All invalid keys will be reported as - an event when the container is starting. When a key exists in - multiple sources, the value associated with the last source - will take precedence. Values defined by an Env with a duplicate - key will take precedence. Immutable. - type: array - items: - description: EnvFromSource represents the source of a set of - ConfigMaps - type: object - properties: - configMapRef: - description: The ConfigMap to select from - type: object - properties: - 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 must be defined - type: boolean - prefix: - description: An optional identifier to prepend to each key - in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - type: object - properties: - 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 must be defined - type: boolean - nodeSelector: - description: 'NodeSelector is a selector which must be true for - the pod to fit on a node. Selector which must match a node''s - labels for the pod to be scheduled on that node. More info: - https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - resources: - description: 'Resources represents compute resources required - by this container. Immutable. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - properties: - limits: - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + - additionalPrinterColumns: + - description: The package subscribed to + jsonPath: .spec.name + name: Package + type: string + - description: The catalog source for the specified package + jsonPath: .spec.source + name: Source + type: string + - description: The channel of updates to subscribe to + jsonPath: .spec.channel + name: Channel + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: Subscription keeps operators up to date by tracking changes to Catalogs. + type: object + required: + - metadata + - 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: SubscriptionSpec defines an Application that can be installed + type: object + required: + - name + - source + - sourceNamespace + properties: + channel: + type: string + config: + description: SubscriptionConfig contains configuration specified for a subscription. + type: object + properties: + env: + description: Env is a list of environment variables to set in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable present in a Container. 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 previous 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. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(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 + 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 + 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 + 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 + envFrom: + description: EnvFrom is a list of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Immutable. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps 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 - selector: - description: Selector is the label selector for pods to be configured. - Existing ReplicaSets whose pods are selected by this will be - the ones affected by this deployment. It must match the pod - template's labels. - 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: + properties: + configMapRef: + description: The ConfigMap to select from + type: object + properties: + 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 - 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 - tolerations: - description: Tolerations are the pod's tolerations. - type: array - items: - description: The pod this Toleration is attached to tolerates - any taint that matches the triple using - the matching operator . + optional: + description: Specify whether the ConfigMap must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + type: object + properties: + 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 must be defined + type: boolean + nodeSelector: + description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' 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 - volumeMounts: - description: List of VolumeMounts to set in the container. - type: array - items: - description: VolumeMount describes a mounting of a Volume within - a container. + additionalProperties: + type: string + resources: + description: 'Resources represents compute resources required by this container. Immutable. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object - required: - - mountPath - - name properties: - mountPath: - description: Path within the container at which the volume - should be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts are - propagated from the host to container and the other way - around. When not set, MountPropagationNone is used. This - field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. - type: boolean - subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. Behaves similarly - to SubPath but environment variable references $(VAR_NAME) - are expanded using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath are mutually - exclusive. - type: string - volumes: - description: List of Volumes to set in the podSpec. - type: array - items: - description: Volume represents a named volume in a pod that - may be accessed by any container in the pod. - type: object - required: - - name - properties: - awsElasticBlockStore: - description: 'AWSElasticBlockStore represents an AWS Disk - resource that is attached to a kubelet''s host machine - and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: object - required: - - volumeID - properties: - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - partition: - description: 'The partition in the volume that you want - to mount. If omitted, the default is to mount by volume - name. Examples: For volume /dev/sda1, you specify - the partition as "1". Similarly, the volume partition - for /dev/sda is "0" (or you can leave the property - empty).' - type: integer - format: int32 - readOnly: - description: 'Specify "true" to force and set the ReadOnly - property in VolumeMounts to "true". If omitted, the - default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: boolean - volumeID: - description: 'Unique ID of the persistent disk resource - in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - azureDisk: - description: AzureDisk represents an Azure Data Disk mount - on the host and bind mount to the pod. + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object - required: - - diskName - - diskURI - properties: - cachingMode: - description: 'Host Caching mode: None, Read Only, Read - Write.' - type: string - diskName: - description: The Name of the data disk in the blob storage - type: string - diskURI: - description: The URI the data disk in the blob storage - type: string - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - kind: - description: 'Expected values Shared: multiple blob - disks per storage account Dedicated: single blob - disk per storage account Managed: azure managed data - disk (only in managed availability set). defaults - to shared' - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - azureFile: - description: AzureFile represents an Azure File Service - mount on the host and bind mount to the pod. - type: object - required: - - secretName - - shareName - properties: - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - secretName: - description: the name of secret that contains Azure - Storage Account Name and Key - type: string - shareName: - description: Share Name - type: string - cephfs: - description: CephFS represents a Ceph FS mount on the host - that shares a pod's lifetime + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object - required: - - monitors - properties: - monitors: - description: 'Required: Monitors is a collection of - Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: array - items: + 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 + selector: + description: Selector is the label selector for pods to be configured. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment. It must match the pod template's labels. + 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 - path: - description: 'Optional: Used as the mounted root, rather - than the full Ceph tree, default is /' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts. - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: boolean - secretFile: - description: 'Optional: SecretFile is the path to key - ring for User, default is /etc/ceph/user.secret More - info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - secretRef: - description: 'Optional: SecretRef is reference to the - authentication secret for User, default is empty. - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: object - properties: - 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?' + 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 - user: - description: 'Optional: User is the rados user name, - default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - cinder: - description: 'Cinder represents a cinder volume attached - and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + 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 - required: - - volumeID - properties: - fsType: - description: 'Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: boolean - secretRef: - description: 'Optional: points to a secret object containing - parameters used to connect to OpenStack.' - type: object - properties: - 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?' + additionalProperties: + type: string + tolerations: + description: Tolerations are the pod's tolerations. + 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 + volumeMounts: + description: List of VolumeMounts to set in the container. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. + type: object + required: + - mountPath + - name + properties: + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. + type: string + volumes: + description: List of Volumes to set in the podSpec. + type: array + items: + description: Volume represents a named volume in a pod that may be accessed by any container in the pod. + type: object + required: + - name + properties: + awsElasticBlockStore: + description: 'AWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty).' + type: integer + format: int32 + readOnly: + description: 'Specify "true" to force and set the ReadOnly property in VolumeMounts to "true". If omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + volumeID: + description: 'Unique ID of the persistent disk resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + azureDisk: + description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. + type: object + required: + - diskName + - diskURI + properties: + cachingMode: + description: 'Host Caching mode: None, Read Only, Read Write.' + type: string + diskName: + description: The Name of the data disk in the blob storage + type: string + diskURI: + description: The URI the data disk in the blob storage + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + kind: + description: 'Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + azureFile: + description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. + type: object + required: + - secretName + - shareName + properties: + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretName: + description: the name of secret that contains Azure Storage Account Name and Key + type: string + shareName: + description: Share Name + type: string + cephfs: + description: CephFS represents a Ceph FS mount on the host that shares a pod's lifetime + type: object + required: + - monitors + properties: + monitors: + description: 'Required: Monitors is a collection of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: type: string - volumeID: - description: 'volume id used to identify the volume - in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - configMap: - description: ConfigMap represents a configMap that should - populate this volume - type: object - properties: - defaultMode: - description: 'Optional: mode bits used to set permissions - on created files by default. Must be an octal value - between 0000 and 0777 or a decimal value between 0 - and 511. YAML accepts both octal and decimal values, - JSON requires decimal values for mode bits. Defaults - to 0644. Directories within the path are not affected - by this setting. This might be in conflict with other - options that affect the file mode, like fsGroup, and - the result can be other mode bits set.' - type: integer - format: int32 - items: - description: If unspecified, each key-value pair in - the Data field of the referenced ConfigMap will be - projected into the volume as a file whose name is - the key and content is the value. If specified, the - listed keys will be projected into the specified paths, - and unlisted keys will not be present. If a key is - specified which is not present in the ConfigMap, the - volume setup will error unless it is marked optional. - Paths must be relative and may not contain the '..' - path or start with '..'. - type: array - items: - description: Maps a string key to a path within a - volume. + path: + description: 'Optional: Used as the mounted root, rather than the full Ceph tree, default is /' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + secretFile: + description: 'Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + secretRef: + description: 'Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: object - required: - - key - - path properties: - key: - description: The key to project. + 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 - mode: - description: 'Optional: mode bits used to set - permissions on this file. Must be an octal value - between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal - values, JSON requires decimal values for mode - bits. If not specified, the volume defaultMode - will be used. This might be in conflict with - other options that affect the file mode, like - fsGroup, and the result can be other mode bits - set.' - type: integer - format: int32 - path: - description: The relative path of the file to - map the key to. May not be an absolute path. - May not contain the path element '..'. May not - start with the string '..'. + user: + description: 'Optional: User is the rados user name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + cinder: + description: 'Cinder represents a cinder volume attached and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + secretRef: + description: 'Optional: points to a secret object containing parameters used to connect to OpenStack.' + type: object + properties: + 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 - 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 keys - must be defined - type: boolean - csi: - description: CSI (Container Storage Interface) represents - ephemeral storage that is handled by certain external - CSI drivers (Beta feature). - type: object - required: - - driver - properties: - driver: - description: Driver is the name of the CSI driver that - handles this volume. Consult with your admin for the - correct name as registered in the cluster. - type: string - fsType: - description: Filesystem type to mount. Ex. "ext4", "xfs", - "ntfs". If not provided, the empty value is passed - to the associated CSI driver which will determine - the default filesystem to apply. - type: string - nodePublishSecretRef: - description: NodePublishSecretRef is a reference to - the secret object containing sensitive information - to pass to the CSI driver to complete the CSI NodePublishVolume - and NodeUnpublishVolume calls. This field is optional, - and may be empty if no secret is required. If the - secret object contains more than one secret, all secret - references are passed. - type: object - properties: - 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 - readOnly: - description: Specifies a read-only configuration for - the volume. Defaults to false (read/write). - type: boolean - volumeAttributes: - description: VolumeAttributes stores driver-specific - properties that are passed to the CSI driver. Consult - your driver's documentation for supported values. - type: object - additionalProperties: - type: string - downwardAPI: - description: DownwardAPI represents downward API about the - pod that should populate this volume - type: object - properties: - defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a Optional: mode bits used - to set permissions on created files by default. Must - be an octal value between 0000 and 0777 or a decimal - value between 0 and 511. YAML accepts both octal and - decimal values, JSON requires decimal values for mode - bits. Defaults to 0644. Directories within the path - are not affected by this setting. This might be in - conflict with other options that affect the file mode, - like fsGroup, and the result can be other mode bits - set.' - type: integer - format: int32 - items: - description: Items is a list of downward API volume - file - type: array + volumeID: + description: 'volume id used to identify the volume in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + configMap: + description: ConfigMap represents a configMap that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 items: - description: DownwardAPIVolumeFile represents information - to create the file containing the pod field + description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 keys must be defined + type: boolean + csi: + description: CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the CSI driver that handles this volume. Consult with your admin for the correct name as registered in the cluster. + type: string + fsType: + description: Filesystem type to mount. Ex. "ext4", "xfs", "ntfs". If not provided, the empty value is passed to the associated CSI driver which will determine the default filesystem to apply. + type: string + nodePublishSecretRef: + description: NodePublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodePublishVolume and NodeUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secret references are passed. type: object - required: - - path properties: - fieldRef: - description: 'Required: Selects a field of the - pod: only annotations, labels, name and namespace - are supported.' - 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 - mode: - description: 'Optional: mode bits used to set - permissions on this file, must be an octal value - between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal - values, JSON requires decimal values for mode - bits. If not specified, the volume defaultMode - will be used. This might be in conflict with - other options that affect the file mode, like - fsGroup, and the result can be other mode bits - set.' - type: integer - format: int32 - path: - description: 'Required: Path is the relative - path name of the file to be created. Must not - be absolute or contain the ''..'' path. Must - be utf-8 encoded. The first item of the relative - path must not start with ''..''' + 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 - resourceFieldRef: - description: 'Selects a resource of the container: - only resources limits and requests (limits.cpu, - limits.memory, requests.cpu and requests.memory) - 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 - emptyDir: - description: 'EmptyDir represents a temporary directory - that shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: object - properties: - medium: - description: 'What type of storage medium should back - this directory. The default is "" which means to use - the node''s default medium. Must be an empty string - (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: string - sizeLimit: - description: 'Total amount of local storage required - for this EmptyDir volume. The size limit is also applicable - for memory medium. The maximum usage on memory medium - EmptyDir would be the minimum value between the SizeLimit - specified here and the sum of memory limits of all - containers in a pod. The default is nil which means - that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' - 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 - ephemeral: - description: "Ephemeral represents a volume that is handled - by a cluster storage driver (Alpha feature). The volume's - lifecycle is tied to the pod that defines it - it will - be created before the pod starts, and deleted when the - pod is removed. \n Use this if: a) the volume is only - needed while the pod runs, b) features of normal volumes - like restoring from snapshot or capacity tracking are - needed, c) the storage driver is specified through a storage - class, and d) the storage driver supports dynamic volume - provisioning through a PersistentVolumeClaim (see EphemeralVolumeSource - for more information on the connection between this - volume type and PersistentVolumeClaim). \n Use PersistentVolumeClaim - or one of the vendor-specific APIs for volumes that persist - for longer than the lifecycle of an individual pod. \n - Use CSI for light-weight local ephemeral volumes if the - CSI driver is meant to be used that way - see the documentation - of the driver for more information. \n A pod can use both - types of ephemeral volumes and persistent volumes at the - same time." - type: object - properties: - readOnly: - description: Specifies a read-only configuration for - the volume. Defaults to false (read/write). - type: boolean - volumeClaimTemplate: - description: "Will be used to create a stand-alone PVC - to provision the volume. The pod in which this EphemeralVolumeSource - is embedded will be the owner of the PVC, i.e. the - PVC will be deleted together with the pod. The name - of the PVC will be `-` where - `` is the name from the `PodSpec.Volumes` - array entry. Pod validation will reject the pod if - the concatenated name is not valid for a PVC (for - example, too long). \n An existing PVC with that name - that is not owned by the pod will *not* be used for - the pod to avoid using an unrelated volume by mistake. - Starting the pod is then blocked until the unrelated - PVC is removed. If such a pre-created PVC is meant - to be used by the pod, the PVC has to updated with - an owner reference to the pod once the pod exists. - Normally this should not be necessary, but it may - be useful when manually reconstructing a broken cluster. - \n This field is read-only and no changes will be - made by Kubernetes to the PVC after it has been created. - \n Required, must not be nil." - type: object - required: - - spec - properties: - metadata: - description: May contain labels and annotations - that will be copied into the PVC when creating - it. No other fields are allowed and will be rejected - during validation. - type: object - spec: - description: The specification for the PersistentVolumeClaim. - The entire content is copied unchanged into the - PVC that gets created from this template. The - same fields as in a PersistentVolumeClaim are - also valid here. + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeAttributes: + description: VolumeAttributes stores driver-specific properties that are passed to the CSI driver. Consult your driver's documentation for supported values. + type: object + additionalProperties: + type: string + downwardAPI: + description: DownwardAPI represents downward API about the pod that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created files by default. Must be a Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: Items is a list of downward API volume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field type: object + required: + - path properties: - accessModes: - description: 'AccessModes contains the desired - access modes the volume should have. More - info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' - type: array - items: - type: string - dataSource: - description: 'This field can be used to specify - either: * An existing VolumeSnapshot object - (snapshot.storage.k8s.io/VolumeSnapshot - - Beta) * An existing PVC (PersistentVolumeClaim) - * An existing custom resource/object that - implements data population (Alpha) In order - to use VolumeSnapshot object types, the appropriate - feature gate must be enabled (VolumeSnapshotDataSource - or AnyVolumeDataSource) If the provisioner - or an external controller can support the - specified data source, it will create a new - volume based on the contents of the specified - data source. If the specified data source - is not supported, the volume will not be created - and the failure will be reported as an event. - In the future, we plan to support more data - source types and the behavior of the provisioner - may change.' + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' type: object required: - - kind - - name + - fieldPath properties: - apiGroup: - description: APIGroup is the group for the - resource being referenced. If APIGroup - is not specified, the specified Kind must - be in the core API group. For any other - third-party types, APIGroup is required. + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". type: string - kind: - description: Kind is the type of resource - being referenced + fieldPath: + description: Path of the field to select in the specified API version. type: string - name: - description: Name is the name of resource - being referenced - type: string - resources: - description: 'Resources represents the minimum - resources the volume should have. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: 'Required: Path is the relative path name of the file to be created. Must not be absolute or contain the ''..'' path. Must be utf-8 encoded. The first item of the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.' type: object + required: + - resource properties: - limits: - description: 'Limits describes the maximum - amount of compute resources allowed. More - info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: + 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 - selector: - description: A label query over volumes to consider - for binding. - 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 - storageClassName: - description: 'Name of the StorageClass required - by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' - type: string - volumeMode: - description: volumeMode defines what type of - volume is required by the claim. Value of - Filesystem is implied when not included in - claim spec. - type: string - volumeName: - description: VolumeName is the binding reference - to the PersistentVolume backing this claim. - type: string - fc: - description: FC represents a Fibre Channel resource that - is attached to a kubelet's host machine and then exposed - to the pod. - type: object - properties: - fsType: - description: 'Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. TODO: how do we prevent errors in the - filesystem from compromising the machine' - type: string - lun: - description: 'Optional: FC target lun number' - type: integer - format: int32 - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts.' - type: boolean - targetWWNs: - description: 'Optional: FC target worldwide names (WWNs)' - type: array - items: - type: string - wwids: - description: 'Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs - and lun must be set, but not both simultaneously.' - type: array - items: - type: string - flexVolume: - description: FlexVolume represents a generic volume resource - that is provisioned/attached using an exec based plugin. - type: object - required: - - driver - properties: - driver: - description: Driver is the name of the driver to use - for this volume. - type: string - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". The default filesystem depends on FlexVolume - script. - type: string - options: - description: 'Optional: Extra command options if any.' - type: object - additionalProperties: - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts.' - type: boolean - secretRef: - description: 'Optional: SecretRef is reference to the - secret object containing sensitive information to - pass to the plugin scripts. This may be empty if no - secret object is specified. If the secret object contains - more than one secret, all secrets are passed to the - plugin scripts.' - type: object - properties: - 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 - flocker: - description: Flocker represents a Flocker volume attached - to a kubelet's host machine. This depends on the Flocker - control service being running - type: object - properties: - datasetName: - description: Name of the dataset stored as metadata - -> name on the dataset for Flocker should be considered - as deprecated - type: string - datasetUUID: - description: UUID of the dataset. This is unique identifier - of a Flocker dataset - type: string - gcePersistentDisk: - description: 'GCEPersistentDisk represents a GCE Disk resource - that is attached to a kubelet''s host machine and then - exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: object - required: - - pdName - properties: - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - partition: - description: 'The partition in the volume that you want - to mount. If omitted, the default is to mount by volume - name. Examples: For volume /dev/sda1, you specify - the partition as "1". Similarly, the volume partition - for /dev/sda is "0" (or you can leave the property - empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: integer - format: int32 - pdName: - description: 'Unique name of the PD resource in GCE. - Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: boolean - gitRepo: - description: 'GitRepo represents a git repository at a particular - revision. DEPRECATED: GitRepo is deprecated. To provision - a container with a git repo, mount an EmptyDir into an - InitContainer that clones the repo using git, then mount - the EmptyDir into the Pod''s container.' - type: object - required: - - repository - properties: - directory: - description: Target directory name. Must not contain - or start with '..'. If '.' is supplied, the volume - directory will be the git repository. Otherwise, - if specified, the volume will contain the git repository - in the subdirectory with the given name. - type: string - repository: - description: Repository URL - type: string - revision: - description: Commit hash for the specified revision. - type: string - glusterfs: - description: 'Glusterfs represents a Glusterfs mount on - the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' - type: object - required: - - endpoints - - path - properties: - endpoints: - description: 'EndpointsName is the endpoint name that - details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - path: - description: 'Path is the Glusterfs volume path. More - info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - readOnly: - description: 'ReadOnly here will force the Glusterfs - volume to be mounted with read-only permissions. Defaults - to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: boolean - hostPath: - description: 'HostPath represents a pre-existing file or - directory on the host machine that is directly exposed - to the container. This is generally used for system agents - or other privileged things that are allowed to see the - host machine. Most containers will NOT need this. More - info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath - --- TODO(jonesdl) We need to restrict who can use host - directory mounts and who can/can not mount host directories - as read/write.' - type: object - required: - - path - properties: - path: - description: 'Path of the directory on the host. If - the path is a symlink, it will follow the link to - the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - type: - description: 'Type for HostPath Volume Defaults to "" - More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - iscsi: - description: 'ISCSI represents an ISCSI Disk resource that - is attached to a kubelet''s host machine and then exposed - to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' - type: object - required: - - iqn - - lun - - targetPortal - properties: - chapAuthDiscovery: - description: whether support iSCSI Discovery CHAP authentication - type: boolean - chapAuthSession: - description: whether support iSCSI Session CHAP authentication - type: boolean - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - initiatorName: - description: Custom iSCSI Initiator Name. If initiatorName - is specified with iscsiInterface simultaneously, new - iSCSI interface : will - be created for the connection. - type: string - iqn: - description: Target iSCSI Qualified Name. - type: string - iscsiInterface: - description: iSCSI Interface Name that uses an iSCSI - transport. Defaults to 'default' (tcp). - type: string - lun: - description: iSCSI Target Lun number. - type: integer - format: int32 - portals: - description: iSCSI Target Portal List. The portal is - either an IP or ip_addr:port if the port is other - than default (typically TCP ports 860 and 3260). - type: array - items: + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + emptyDir: + description: 'EmptyDir represents a temporary directory that shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: object + properties: + medium: + description: 'What type of storage medium should back this directory. The default is "" which means to use the node''s default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' type: string - readOnly: - description: ReadOnly here will force the ReadOnly setting - in VolumeMounts. Defaults to false. - type: boolean - secretRef: - description: CHAP Secret for iSCSI target and initiator - authentication - type: object - properties: - 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 - targetPortal: - description: iSCSI Target Portal. The Portal is either - an IP or ip_addr:port if the port is other than default - (typically TCP ports 860 and 3260). - type: string - name: - description: 'Volume''s name. Must be a DNS_LABEL and unique - within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - nfs: - description: 'NFS represents an NFS mount on the host that - shares a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: object - required: - - path - - server - properties: - path: - description: 'Path that is exported by the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - readOnly: - description: 'ReadOnly here will force the NFS export - to be mounted with read-only permissions. Defaults - to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: boolean - server: - description: 'Server is the hostname or IP address of - the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - persistentVolumeClaim: - description: 'PersistentVolumeClaimVolumeSource represents - a reference to a PersistentVolumeClaim in the same namespace. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: object - required: - - claimName - properties: - claimName: - description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this volume. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: string - readOnly: - description: Will force the ReadOnly setting in VolumeMounts. - Default false. - type: boolean - photonPersistentDisk: - description: PhotonPersistentDisk represents a PhotonController - persistent disk attached and mounted on kubelets host - machine - type: object - required: - - pdID - properties: - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - pdID: - description: ID that identifies Photon Controller persistent - disk - type: string - portworxVolume: - description: PortworxVolume represents a portworx volume - attached and mounted on kubelets host machine - type: object - required: - - volumeID - properties: - fsType: - description: FSType represents the filesystem type to - mount Must be a filesystem type supported by the host - operating system. Ex. "ext4", "xfs". Implicitly inferred - to be "ext4" if unspecified. - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - volumeID: - description: VolumeID uniquely identifies a Portworx - volume - type: string - projected: - description: Items for all in one resources secrets, configmaps, - and downward API - type: object - required: - - sources - properties: - defaultMode: - description: Mode bits used to set permissions on created - files by default. Must be an octal value between 0000 - and 0777 or a decimal value between 0 and 511. YAML - accepts both octal and decimal values, JSON requires - decimal values for mode bits. Directories within the - path are not affected by this setting. This might - be in conflict with other options that affect the - file mode, like fsGroup, and the result can be other - mode bits set. - type: integer - format: int32 - sources: - description: list of volume projections - type: array - items: - description: Projection that may be projected along - with other supported volume types + sizeLimit: + description: 'Total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' + 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 + ephemeral: + description: "Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed. \n Use this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity tracking are needed, c) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through a PersistentVolumeClaim (see EphemeralVolumeSource for more information on the connection between this volume type and PersistentVolumeClaim). \n Use PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod. \n Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information. \n A pod can use both types of ephemeral volumes and persistent volumes at the same time." + type: object + properties: + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeClaimTemplate: + description: "Will be used to create a stand-alone PVC to provision the volume. The pod in which this EphemeralVolumeSource is embedded will be the owner of the PVC, i.e. the PVC will be deleted together with the pod. The name of the PVC will be `-` where `` is the name from the `PodSpec.Volumes` array entry. Pod validation will reject the pod if the concatenated name is not valid for a PVC (for example, too long). \n An existing PVC with that name that is not owned by the pod will *not* be used for the pod to avoid using an unrelated volume by mistake. Starting the pod is then blocked until the unrelated PVC is removed. If such a pre-created PVC is meant to be used by the pod, the PVC has to updated with an owner reference to the pod once the pod exists. Normally this should not be necessary, but it may be useful when manually reconstructing a broken cluster. \n This field is read-only and no changes will be made by Kubernetes to the PVC after it has been created. \n Required, must not be nil." type: object + required: + - spec properties: - configMap: - description: information about the configMap data - to project + metadata: + description: May contain labels and annotations that will be copied into the PVC when creating it. No other fields are allowed and will be rejected during validation. type: object - properties: - items: - description: If unspecified, each key-value - pair in the Data field of the referenced - ConfigMap will be projected into the volume - as a file whose name is the key and content - is the value. If specified, the listed keys - will be projected into the specified paths, - and unlisted keys will not be present. If - a key is specified which is not present - in the ConfigMap, the volume setup will - error unless it is marked optional. Paths - must be relative and may not contain the - '..' path or start with '..'. - type: array - items: - description: Maps a string key to a path - within a volume. - type: object - required: - - key - - path - properties: - key: - description: The key to project. - type: string - mode: - description: 'Optional: mode bits used - to set permissions on this file. Must - be an octal value between 0000 and - 0777 or a decimal value between 0 - and 511. YAML accepts both octal and - decimal values, JSON requires decimal - values for mode bits. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: The relative path of the - file to map the key to. May not be - an absolute path. May not contain - the path element '..'. May not start - with the string '..'. - 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 keys must be defined - type: boolean - downwardAPI: - description: information about the downwardAPI - data to project + spec: + description: The specification for the PersistentVolumeClaim. The entire content is copied unchanged into the PVC that gets created from this template. The same fields as in a PersistentVolumeClaim are also valid here. type: object properties: - items: - description: Items is a list of DownwardAPIVolume - file + accessModes: + description: 'AccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' type: array items: - description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field - type: object - required: - - path - properties: - fieldRef: - description: 'Required: Selects a field - of the pod: only annotations, labels, - name and namespace are supported.' - 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 - mode: - description: 'Optional: mode bits used - to set permissions on this file, must - be an octal value between 0000 and - 0777 or a decimal value between 0 - and 511. YAML accepts both octal and - decimal values, JSON requires decimal - values for mode bits. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: 'Required: Path is the - relative path name of the file to - be created. Must not be absolute or - contain the ''..'' path. Must be utf-8 - encoded. The first item of the relative - path must not start with ''..''' - type: string - resourceFieldRef: - description: 'Selects a resource of - the container: only resources limits - and requests (limits.cpu, limits.memory, - requests.cpu and requests.memory) - are currently supported.' + type: string + dataSource: + description: 'This field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) * An existing custom resource that implements data population (Alpha) In order to use custom resource types that implement data population, the AnyVolumeDataSource feature gate must be enabled. If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source.' + type: object + required: + - kind + - name + properties: + apiGroup: + description: APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + resources: + description: 'Resources represents the minimum resources the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + selector: + description: A label query over volumes to consider for binding. + 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: - - resource + - key + - operator properties: - containerName: - description: 'Container name: required - for volumes, optional for env - vars' + key: + description: key is the label key that the selector applies to. 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' + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. type: string - secret: - description: information about the secret data - to project - type: object - properties: - items: - description: If unspecified, each key-value - pair in the Data field of the referenced - Secret will be projected into the volume - as a file whose name is the key and content - is the value. If specified, the listed keys - will be projected into the specified paths, - and unlisted keys will not be present. If - a key is specified which is not present - in the Secret, the volume setup will error - unless it is marked optional. Paths must - be relative and may not contain the '..' - path or start with '..'. - type: array - items: - description: Maps a string key to a path - within a volume. - type: object - required: - - key - - path - properties: - key: - description: The key to project. - type: string - mode: - description: 'Optional: mode bits used - to set permissions on this file. Must - be an octal value between 0000 and - 0777 or a decimal value between 0 - and 511. YAML accepts both octal and - decimal values, JSON requires decimal - values for mode bits. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: The relative path of the - file to map the key to. May not be - an absolute path. May not contain - the path element '..'. May not start - with the 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 - 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?' + storageClassName: + description: 'Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - serviceAccountToken: - description: information about the serviceAccountToken - data to project - type: object - required: - - path - properties: - audience: - description: Audience is the intended audience - of the token. A recipient of a token must - identify itself with an identifier specified - in the audience of the token, and otherwise - should reject the token. The audience defaults - to the identifier of the apiserver. + volumeMode: + description: volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. type: string - expirationSeconds: - description: ExpirationSeconds is the requested - duration of validity of the service account - token. As the token approaches expiration, - the kubelet volume plugin will proactively - rotate the service account token. The kubelet - will start trying to rotate the token if - the token is older than 80 percent of its - time to live or if the token is older than - 24 hours.Defaults to 1 hour and must be - at least 10 minutes. - type: integer - format: int64 - path: - description: Path is the path relative to - the mount point of the file to project the - token into. + volumeName: + description: VolumeName is the binding reference to the PersistentVolume backing this claim. type: string - quobyte: - description: Quobyte represents a Quobyte mount on the host - that shares a pod's lifetime - type: object - required: - - registry - - volume - properties: - group: - description: Group to map volume access to Default is - no group - type: string - readOnly: - description: ReadOnly here will force the Quobyte volume - to be mounted with read-only permissions. Defaults - to false. - type: boolean - registry: - description: Registry represents a single or multiple - Quobyte Registry services specified as a string as - host:port pair (multiple entries are separated with - commas) which acts as the central registry for volumes - type: string - tenant: - description: Tenant owning the given Quobyte volume - in the Backend Used with dynamically provisioned Quobyte - volumes, value is set by the plugin - type: string - user: - description: User to map volume access to Defaults to - serivceaccount user - type: string - volume: - description: Volume is a string that references an already - created Quobyte volume by name. - type: string - rbd: - description: 'RBD represents a Rados Block Device mount - on the host that shares a pod''s lifetime. More info: - https://examples.k8s.io/volumes/rbd/README.md' - type: object - required: - - image - - monitors - properties: - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - image: - description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - keyring: - description: 'Keyring is the path to key ring for RBDUser. - Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - monitors: - description: 'A collection of Ceph monitors. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: array - items: + fc: + description: FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod. + type: object + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. TODO: how do we prevent errors in the filesystem from compromising the machine' type: string - pool: - description: 'The rados pool name. Default is rbd. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: boolean - secretRef: - description: 'SecretRef is name of the authentication - secret for RBDUser. If provided overrides keyring. - Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: object - properties: - 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?' + lun: + description: 'Optional: FC target lun number' + type: integer + format: int32 + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + targetWWNs: + description: 'Optional: FC target worldwide names (WWNs)' + type: array + items: type: string - user: - description: 'The rados user name. Default is admin. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - scaleIO: - description: ScaleIO represents a ScaleIO persistent volume - attached and mounted on Kubernetes nodes. - type: object - required: - - gateway - - secretRef - - system - properties: - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Default is "xfs". - type: string - gateway: - description: The host address of the ScaleIO API Gateway. - type: string - protectionDomain: - description: The name of the ScaleIO Protection Domain - for the configured storage. - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: SecretRef references to the secret for - ScaleIO user and other sensitive information. If this - is not provided, Login operation will fail. - type: object - properties: - 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?' + wwids: + description: 'Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.' + type: array + items: type: string - sslEnabled: - description: Flag to enable/disable SSL communication - with Gateway, default false - type: boolean - storageMode: - description: Indicates whether the storage for a volume - should be ThickProvisioned or ThinProvisioned. Default - is ThinProvisioned. - type: string - storagePool: - description: The ScaleIO Storage Pool associated with - the protection domain. - type: string - system: - description: The name of the storage system as configured - in ScaleIO. - type: string - volumeName: - description: The name of a volume already created in - the ScaleIO system that is associated with this volume - source. - type: string - secret: - description: 'Secret represents a secret that should populate - this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: object - properties: - defaultMode: - description: 'Optional: mode bits used to set permissions - on created files by default. Must be an octal value - between 0000 and 0777 or a decimal value between 0 - and 511. YAML accepts both octal and decimal values, - JSON requires decimal values for mode bits. Defaults - to 0644. Directories within the path are not affected - by this setting. This might be in conflict with other - options that affect the file mode, like fsGroup, and - the result can be other mode bits set.' - type: integer - format: int32 - items: - description: If unspecified, each key-value pair in - the Data field of the referenced Secret will be projected - into the volume as a file whose name is the key and - content is the value. If specified, the listed keys - will be projected into the specified paths, and unlisted - keys will not be present. If a key is specified which - is not present in the Secret, the volume setup will - error unless it is marked optional. Paths must be - relative and may not contain the '..' path or start - with '..'. - type: array - items: - description: Maps a string key to a path within a - volume. + flexVolume: + description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the driver to use for this volume. + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script. + type: string + options: + description: 'Optional: Extra command options if any.' + type: object + additionalProperties: + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + secretRef: + description: 'Optional: SecretRef is reference to the secret object containing sensitive information to pass to the plugin scripts. This may be empty if no secret object is specified. If the secret object contains more than one secret, all secrets are passed to the plugin scripts.' type: object - required: - - key - - path properties: - key: - description: The key to project. + 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 - mode: - description: 'Optional: mode bits used to set - permissions on this file. Must be an octal value - between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal - values, JSON requires decimal values for mode - bits. If not specified, the volume defaultMode - will be used. This might be in conflict with - other options that affect the file mode, like - fsGroup, and the result can be other mode bits - set.' - type: integer - format: int32 - path: - description: The relative path of the file to - map the key to. May not be an absolute path. - May not contain the path element '..'. May not - start with the string '..'. + flocker: + description: Flocker represents a Flocker volume attached to a kubelet's host machine. This depends on the Flocker control service being running + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata -> name on the dataset for Flocker should be considered as deprecated + type: string + datasetUUID: + description: UUID of the dataset. This is unique identifier of a Flocker dataset + type: string + gcePersistentDisk: + description: 'GCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: object + required: + - pdName + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: integer + format: int32 + pdName: + description: 'Unique name of the PD resource in GCE. Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + gitRepo: + description: 'GitRepo represents a git repository at a particular revision. DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod''s container.' + type: object + required: + - repository + properties: + directory: + description: Target directory name. Must not contain or start with '..'. If '.' is supplied, the volume directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name. + type: string + repository: + description: Repository URL + type: string + revision: + description: Commit hash for the specified revision. + type: string + glusterfs: + description: 'Glusterfs represents a Glusterfs mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' + type: object + required: + - endpoints + - path + properties: + endpoints: + description: 'EndpointsName is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + path: + description: 'Path is the Glusterfs volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + hostPath: + description: 'HostPath represents a pre-existing file or directory on the host machine that is directly exposed to the container. This is generally used for system agents or other privileged things that are allowed to see the host machine. Most containers will NOT need this. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath --- TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not mount host directories as read/write.' + type: object + required: + - path + properties: + path: + description: 'Path of the directory on the host. If the path is a symlink, it will follow the link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + iscsi: + description: 'ISCSI represents an ISCSI Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' + type: object + required: + - iqn + - lun + - targetPortal + properties: + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP authentication + type: boolean + chapAuthSession: + description: whether support iSCSI Session CHAP authentication + type: boolean + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface : will be created for the connection. + type: string + iqn: + description: Target iSCSI Qualified Name. + type: string + iscsiInterface: + description: iSCSI Interface Name that uses an iSCSI transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: integer + format: int32 + portals: + description: iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: array + items: + type: string + readOnly: + description: ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. + type: boolean + secretRef: + description: CHAP Secret for iSCSI target and initiator authentication + type: object + properties: + 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 keys - must be defined - type: boolean - secretName: - description: 'Name of the secret in the pod''s namespace - to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: string - storageos: - description: StorageOS represents a StorageOS volume attached - and mounted on Kubernetes nodes. - type: object - properties: - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: SecretRef specifies the secret to use for - obtaining the StorageOS API credentials. If not specified, - default values will be attempted. - type: object - properties: - 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?' + targetPortal: + description: iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: string + name: + description: 'Volume''s name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: 'NFS represents an NFS mount on the host that shares a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: object + required: + - path + - server + properties: + path: + description: 'Path that is exported by the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS export to be mounted with read-only permissions. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + server: + description: 'Server is the hostname or IP address of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + persistentVolumeClaim: + description: 'PersistentVolumeClaimVolumeSource represents a reference to a PersistentVolumeClaim in the same namespace. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: object + required: + - claimName + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in VolumeMounts. Default false. + type: boolean + photonPersistentDisk: + description: PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine + type: object + required: + - pdID + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + pdID: + description: ID that identifies Photon Controller persistent disk + type: string + portworxVolume: + description: PortworxVolume represents a portworx volume attached and mounted on kubelets host machine + type: object + required: + - volumeID + properties: + fsType: + description: FSType represents the filesystem type to mount Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + volumeID: + description: VolumeID uniquely identifies a Portworx volume + type: string + projected: + description: Items for all in one resources secrets, configmaps, and downward API + type: object + properties: + defaultMode: + description: Mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set. + type: integer + format: int32 + sources: + description: list of volume projections + type: array + items: + description: Projection that may be projected along with other supported volume types + type: object + properties: + configMap: + description: information about the configMap data to project + type: object + properties: + items: + description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 keys must be defined + type: boolean + downwardAPI: + description: information about the downwardAPI data to project + type: object + properties: + items: + description: Items is a list of DownwardAPIVolume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field + type: object + required: + - path + properties: + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' + 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 + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: 'Required: Path is the relative path name of the file to be created. Must not be absolute or contain the ''..'' path. Must be utf-8 encoded. The first item of the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) 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 + secret: + description: information about the secret data to project + type: object + properties: + items: + description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 + serviceAccountToken: + description: information about the serviceAccountToken data to project + type: object + required: + - path + properties: + audience: + description: Audience is the intended audience of the token. A recipient of a token must identify itself with an identifier specified in the audience of the token, and otherwise should reject the token. The audience defaults to the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the requested duration of validity of the service account token. As the token approaches expiration, the kubelet volume plugin will proactively rotate the service account token. The kubelet will start trying to rotate the token if the token is older than 80 percent of its time to live or if the token is older than 24 hours.Defaults to 1 hour and must be at least 10 minutes. + type: integer + format: int64 + path: + description: Path is the path relative to the mount point of the file to project the token into. + type: string + quobyte: + description: Quobyte represents a Quobyte mount on the host that shares a pod's lifetime + type: object + required: + - registry + - volume + properties: + group: + description: Group to map volume access to Default is no group + type: string + readOnly: + description: ReadOnly here will force the Quobyte volume to be mounted with read-only permissions. Defaults to false. + type: boolean + registry: + description: Registry represents a single or multiple Quobyte Registry services specified as a string as host:port pair (multiple entries are separated with commas) which acts as the central registry for volumes + type: string + tenant: + description: Tenant owning the given Quobyte volume in the Backend Used with dynamically provisioned Quobyte volumes, value is set by the plugin + type: string + user: + description: User to map volume access to Defaults to serivceaccount user + type: string + volume: + description: Volume is a string that references an already created Quobyte volume by name. + type: string + rbd: + description: 'RBD represents a Rados Block Device mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md' + type: object + required: + - image + - monitors + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + image: + description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + keyring: + description: 'Keyring is the path to key ring for RBDUser. Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: type: string - volumeName: - description: VolumeName is the human-readable name of - the StorageOS volume. Volume names are only unique - within a namespace. - type: string - volumeNamespace: - description: VolumeNamespace specifies the scope of - the volume within StorageOS. If no namespace is specified - then the Pod's namespace will be used. This allows - the Kubernetes name scoping to be mirrored within - StorageOS for tighter integration. Set VolumeName - to any name to override the default behaviour. Set - to "default" if you are not using namespaces within - StorageOS. Namespaces that do not pre-exist within - StorageOS will be created. - type: string - vsphereVolume: - description: VsphereVolume represents a vSphere volume attached - and mounted on kubelets host machine - type: object - required: - - volumePath - properties: - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - storagePolicyID: - description: Storage Policy Based Management (SPBM) - profile ID associated with the StoragePolicyName. - type: string - storagePolicyName: - description: Storage Policy Based Management (SPBM) - profile name. - type: string - volumePath: - description: Path that identifies vSphere volume vmdk - type: string - installPlanApproval: - description: Approval is the user approval policy for an InstallPlan. - It must be one of "Automatic" or "Manual". - type: string - name: - type: string - source: - type: string - sourceNamespace: - type: string - startingCSV: - type: string - status: - type: object - required: - - lastUpdated - properties: - catalogHealth: - description: CatalogHealth contains the Subscription's view of its - relevant CatalogSources' status. It is used to determine SubscriptionStatusConditions - related to CatalogSources. - type: array - items: - description: SubscriptionCatalogHealth describes the health of a - CatalogSource the Subscription knows about. + pool: + description: 'The rados pool name. Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + secretRef: + description: 'SecretRef is name of the authentication secret for RBDUser. If provided overrides keyring. Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: object + properties: + 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 + user: + description: 'The rados user name. Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + scaleIO: + description: ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + type: object + required: + - gateway + - secretRef + - system + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Default is "xfs". + type: string + gateway: + description: The host address of the ScaleIO API Gateway. + type: string + protectionDomain: + description: The name of the ScaleIO Protection Domain for the configured storage. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail. + type: object + properties: + 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 + sslEnabled: + description: Flag to enable/disable SSL communication with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned. + type: string + storagePool: + description: The ScaleIO Storage Pool associated with the protection domain. + type: string + system: + description: The name of the storage system as configured in ScaleIO. + type: string + volumeName: + description: The name of a volume already created in the ScaleIO system that is associated with this volume source. + type: string + secret: + description: 'Secret represents a secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + optional: + description: Specify whether the Secret or its keys must be defined + type: boolean + secretName: + description: 'Name of the secret in the pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + storageos: + description: StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes. + type: object + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef specifies the secret to use for obtaining the StorageOS API credentials. If not specified, default values will be attempted. + type: object + properties: + 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 + volumeName: + description: VolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace. + type: string + volumeNamespace: + description: VolumeNamespace specifies the scope of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping to be mirrored within StorageOS for tighter integration. Set VolumeName to any name to override the default behaviour. Set to "default" if you are not using namespaces within StorageOS. Namespaces that do not pre-exist within StorageOS will be created. + type: string + vsphereVolume: + description: VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine + type: object + required: + - volumePath + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName. + type: string + storagePolicyName: + description: Storage Policy Based Management (SPBM) profile name. + type: string + volumePath: + description: Path that identifies vSphere volume vmdk + type: string + installPlanApproval: + description: Approval is the user approval policy for an InstallPlan. It must be one of "Automatic" or "Manual". + type: string + name: + type: string + source: + type: string + sourceNamespace: + type: string + startingCSV: + type: string + status: + type: object + required: + - lastUpdated + properties: + catalogHealth: + description: CatalogHealth contains the Subscription's view of its relevant CatalogSources' status. It is used to determine SubscriptionStatusConditions related to CatalogSources. + type: array + items: + description: SubscriptionCatalogHealth describes the health of a CatalogSource the Subscription knows about. + type: object + required: + - catalogSourceRef + - healthy + - lastUpdated + properties: + catalogSourceRef: + description: CatalogSourceRef is a reference to a CatalogSource. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + healthy: + description: Healthy is true if the CatalogSource is healthy; false otherwise. + type: boolean + lastUpdated: + description: LastUpdated represents the last time that the CatalogSourceHealth changed + type: string + format: date-time + conditions: + description: Conditions is a list of the latest available observations about a Subscription's current state. + type: array + items: + description: SubscriptionCondition represents the latest available observations of a Subscription's state. + type: object + required: + - status + - type + properties: + lastHeartbeatTime: + description: LastHeartbeatTime is the last time we got an update on a given condition + type: string + format: date-time + lastTransitionTime: + description: LastTransitionTime is the last time the condition transit from one status to another + type: string + format: date-time + message: + description: Message is a human-readable message indicating details about last transition. + type: string + reason: + description: Reason is a one-word CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition, one of True, False, Unknown. + type: string + type: + description: Type is the type of Subscription condition. + type: string + currentCSV: + description: CurrentCSV is the CSV the Subscription is progressing to. + type: string + installPlanGeneration: + description: InstallPlanGeneration is the current generation of the installplan + type: integer + installPlanRef: + description: InstallPlanRef is a reference to the latest InstallPlan that contains the Subscription's current CSV. type: object - required: - - catalogSourceRef - - healthy - - lastUpdated properties: - catalogSourceRef: - description: CatalogSourceRef is a reference to a CatalogSource. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this pod). - This syntax is chosen only to have some well-defined way - of referencing a part of an object. TODO: this design - is not final and this field is subject to change in the - future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - healthy: - description: Healthy is true if the CatalogSource is healthy; - false otherwise. - type: boolean - lastUpdated: - description: LastUpdated represents the last time that the CatalogSourceHealth - changed + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' type: string - format: date-time - conditions: - description: Conditions is a list of the latest available observations - about a Subscription's current state. - type: array - items: - description: SubscriptionCondition represents the latest available - observations of a Subscription's state. + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + installedCSV: + description: InstalledCSV is the CSV currently installed by the Subscription. + type: string + installplan: + description: 'Install is a reference to the latest InstallPlan generated for the Subscription. DEPRECATED: InstallPlanRef' type: object required: - - status - - type + - apiVersion + - kind + - name + - uuid properties: - lastHeartbeatTime: - description: LastHeartbeatTime is the last time we got an update - on a given condition - type: string - format: date-time - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transit from one status to another + apiVersion: type: string - format: date-time - message: - description: Message is a human-readable message indicating - details about last transition. + kind: type: string - reason: - description: Reason is a one-word CamelCase reason for the condition's - last transition. + name: type: string - status: - description: Status is the status of the condition, one of True, - False, Unknown. + uuid: + description: UID is a type that holds unique ID values, including UUIDs. Because we don't ONLY use UUIDs, this is an alias to string. Being a type captures intent and helps make sure that UIDs and names do not get conflated. type: string - type: - description: Type is the type of Subscription condition. - type: string - currentCSV: - description: CurrentCSV is the CSV the Subscription is progressing - to. - type: string - installPlanGeneration: - description: InstallPlanGeneration is the current generation of the - installplan - type: integer - installPlanRef: - description: InstallPlanRef is a reference to the latest InstallPlan - that contains the Subscription's current CSV. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - installedCSV: - description: InstalledCSV is the CSV currently installed by the Subscription. - type: string - installplan: - description: 'Install is a reference to the latest InstallPlan generated - for the Subscription. DEPRECATED: InstallPlanRef' - type: object - required: - - apiVersion - - kind - - name - - uuid - properties: - apiVersion: - type: string - kind: - type: string - name: - type: string - uuid: - description: UID is a type that holds unique ID values, including - UUIDs. Because we don't ONLY use UUIDs, this is an alias to - string. Being a type captures intent and helps make sure that - UIDs and names do not get conflated. - type: string - lastUpdated: - description: LastUpdated represents the last time that the Subscription - status was updated. - type: string - format: date-time - reason: - description: Reason is the reason the Subscription was transitioned - to its current state. - type: string - state: - description: State represents the current state of the Subscription - type: string - served: true - storage: true - subresources: - status: {} + lastUpdated: + description: LastUpdated represents the last time that the Subscription status was updated. + type: string + format: date-time + reason: + description: Reason is the reason the Subscription was transitioned to its current state. + type: string + state: + description: State represents the current state of the Subscription + type: string + served: true + storage: true + subresources: + status: {} diff --git a/pkg/controller/operators/adoption_controller.go b/pkg/controller/operators/adoption_controller.go index f255e11117..50a2bf20bd 100644 --- a/pkg/controller/operators/adoption_controller.go +++ b/pkg/controller/operators/adoption_controller.go @@ -2,6 +2,7 @@ package operators import ( "context" + "fmt" "sync" "github.com/go-logr/logr" @@ -45,9 +46,7 @@ type AdoptionReconciler struct { // SetupWithManager adds the operator reconciler to the given controller manager. func (r *AdoptionReconciler) SetupWithManager(mgr ctrl.Manager) error { // Trigger operator events from the events of their compoenents. - enqueueSub := &handler.EnqueueRequestsFromMapFunc{ - ToRequests: handler.ToRequestsFunc(r.mapToSubscriptions), - } + enqueueSub := handler.EnqueueRequestsFromMapFunc(r.mapToSubscriptions) // Create multiple controllers for resource types that require automatic adoption err := ctrl.NewControllerManagedBy(mgr). @@ -60,12 +59,8 @@ func (r *AdoptionReconciler) SetupWithManager(mgr ctrl.Manager) error { } var ( - enqueueCSV = &handler.EnqueueRequestsFromMapFunc{ - ToRequests: handler.ToRequestsFunc(r.mapToClusterServiceVersions), - } - enqueueProviders = &handler.EnqueueRequestsFromMapFunc{ - ToRequests: handler.ToRequestsFunc(r.mapToProviders), - } + enqueueCSV = handler.EnqueueRequestsFromMapFunc(r.mapToClusterServiceVersions) + enqueueProviders = handler.EnqueueRequestsFromMapFunc(r.mapToProviders) ) err = ctrl.NewControllerManagedBy(mgr). For(&operatorsv1alpha1.ClusterServiceVersion{}). @@ -113,13 +108,12 @@ func NewAdoptionReconciler(cli client.Client, log logr.Logger, scheme *runtime.S } // ReconcileSubscription labels the CSVs installed by a Subscription as components of an operator named after the subscribed package and install namespace. -func (r *AdoptionReconciler) ReconcileSubscription(req ctrl.Request) (reconcile.Result, error) { +func (r *AdoptionReconciler) ReconcileSubscription(ctx context.Context, req ctrl.Request) (reconcile.Result, error) { // Set up a convenient log object so we don't have to type request over and over again log := r.log.WithValues("request", req) log.V(4).Info("reconciling subscription") // Fetch the Subscription from the cache - ctx := context.TODO() in := &operatorsv1alpha1.Subscription{} if err := r.Get(ctx, req.NamespacedName, in); err != nil { if apierrors.IsNotFound(err) { @@ -176,13 +170,12 @@ func (r *AdoptionReconciler) ReconcileSubscription(req ctrl.Request) (reconcile. } // ReconcileClusterServiceVersion projects the component labels of a given CSV onto all resources owned by it. -func (r *AdoptionReconciler) ReconcileClusterServiceVersion(req ctrl.Request) (reconcile.Result, error) { +func (r *AdoptionReconciler) ReconcileClusterServiceVersion(ctx context.Context, req ctrl.Request) (reconcile.Result, error) { // Set up a convenient log object so we don't have to type request over and over again log := r.log.WithValues("request", req) log.V(4).Info("reconciling csv") // Fetch the CSV from the cache - ctx := context.TODO() in := &operatorsv1alpha1.ClusterServiceVersion{} if err := r.Get(ctx, req.NamespacedName, in); err != nil { if apierrors.IsNotFound(err) { @@ -265,7 +258,12 @@ func (r *AdoptionReconciler) adopt(ctx context.Context, operator *decorators.Ope return nil } - if err := r.Get(ctx, types.NamespacedName{Namespace: m.GetNamespace(), Name: m.GetName()}, component); err != nil { + cObj, ok := component.(client.Object) + if !ok { + return fmt.Errorf("Unable to typecast runtime.Object to client.Object") + } + + if err := r.Get(ctx, types.NamespacedName{Namespace: m.GetNamespace(), Name: m.GetName()}, cObj); err != nil { if apierrors.IsNotFound(err) { r.log.Error(err, "component not found") err = nil @@ -273,7 +271,7 @@ func (r *AdoptionReconciler) adopt(ctx context.Context, operator *decorators.Ope return err } - candidate := component.DeepCopyObject() + candidate := cObj.DeepCopyObject() adopted, err := operator.AdoptComponent(candidate) if err != nil { @@ -282,14 +280,21 @@ func (r *AdoptionReconciler) adopt(ctx context.Context, operator *decorators.Ope if adopted { // Only update if freshly adopted - r.log.Info("component adopted", "component", candidate) - return r.Patch(ctx, candidate, client.MergeFrom(component)) + pCObj, ok := candidate.(client.Object) + if !ok { + return fmt.Errorf("Unable to typecast runtime.Object to client.Object") + } + return r.Patch(ctx, pCObj, client.MergeFrom(cObj)) } return nil } func (r *AdoptionReconciler) disown(ctx context.Context, operator *decorators.Operator, component runtime.Object) error { + cObj, ok := component.(client.Object) + if !ok { + return fmt.Errorf("Unable to typecast runtime.Object to client.Object") + } candidate := component.DeepCopyObject() disowned, err := operator.DisownComponent(candidate) if err != nil { @@ -303,7 +308,11 @@ func (r *AdoptionReconciler) disown(ctx context.Context, operator *decorators.Op // Only update if freshly disowned r.log.V(4).Info("component disowned", "component", candidate) - return r.Patch(ctx, candidate, client.MergeFrom(component)) + uCObj, ok := candidate.(client.Object) + if !ok { + return fmt.Errorf("Unable to typecast runtime.Object to client.Object") + } + return r.Patch(ctx, uCObj, client.MergeFrom(cObj)) } func (r *AdoptionReconciler) adoptees(ctx context.Context, operator decorators.Operator, csv *operatorsv1alpha1.ClusterServiceVersion) ([]runtime.Object, error) { @@ -335,7 +344,11 @@ func (r *AdoptionReconciler) adoptees(ctx context.Context, operator decorators.O } opt := client.MatchingLabelsSelector{Selector: selector} for _, list := range componentLists { - if err := r.List(ctx, list, opt); err != nil { + cList, ok := list.(client.ObjectList) + if !ok { + return nil, fmt.Errorf("Unable to typecast runtime.Object to client.ObjectList") + } + if err := r.List(ctx, cList, opt); err != nil { return nil, err } } @@ -415,8 +428,8 @@ func (r *AdoptionReconciler) adoptInstallPlan(ctx context.Context, operator *dec return utilerrors.NewAggregate(errs) } -func (r *AdoptionReconciler) mapToSubscriptions(obj handler.MapObject) (requests []reconcile.Request) { - if obj.Meta == nil { +func (r *AdoptionReconciler) mapToSubscriptions(obj client.Object) (requests []reconcile.Request) { + if obj == nil { return } @@ -424,7 +437,7 @@ func (r *AdoptionReconciler) mapToSubscriptions(obj handler.MapObject) (requests // The Subscription reconciler will sort out the important changes ctx := context.TODO() subs := &operatorsv1alpha1.SubscriptionList{} - if err := r.List(ctx, subs, client.InNamespace(obj.Meta.GetNamespace())); err != nil { + if err := r.List(ctx, subs, client.InNamespace(obj.GetNamespace())); err != nil { r.log.Error(err, "error listing subscriptions") } @@ -444,15 +457,15 @@ func (r *AdoptionReconciler) mapToSubscriptions(obj handler.MapObject) (requests return } -func (r *AdoptionReconciler) mapToClusterServiceVersions(obj handler.MapObject) (requests []reconcile.Request) { - if obj.Meta == nil { +func (r *AdoptionReconciler) mapToClusterServiceVersions(obj client.Object) (requests []reconcile.Request) { + if obj == nil { return } // Get all owner CSV from owner labels if cluster scoped - namespace := obj.Meta.GetNamespace() + namespace := obj.GetNamespace() if namespace == metav1.NamespaceAll { - name, ns, ok := ownerutil.GetOwnerByKindLabel(obj.Meta, operatorsv1alpha1.ClusterServiceVersionKind) + name, ns, ok := ownerutil.GetOwnerByKindLabel(obj, operatorsv1alpha1.ClusterServiceVersionKind) if ok { nsn := types.NamespacedName{Namespace: ns, Name: name} requests = append(requests, reconcile.Request{NamespacedName: nsn}) @@ -461,7 +474,7 @@ func (r *AdoptionReconciler) mapToClusterServiceVersions(obj handler.MapObject) } // Get all owner CSVs from OwnerReferences - owners := ownerutil.GetOwnersByKind(obj.Meta, operatorsv1alpha1.ClusterServiceVersionKind) + owners := ownerutil.GetOwnersByKind(obj, operatorsv1alpha1.ClusterServiceVersionKind) for _, owner := range owners { nsn := types.NamespacedName{Namespace: namespace, Name: owner.Name} requests = append(requests, reconcile.Request{NamespacedName: nsn}) @@ -470,8 +483,8 @@ func (r *AdoptionReconciler) mapToClusterServiceVersions(obj handler.MapObject) return } -func (r *AdoptionReconciler) mapToProviders(obj handler.MapObject) (requests []reconcile.Request) { - if obj.Meta == nil { +func (r *AdoptionReconciler) mapToProviders(obj client.Object) (requests []reconcile.Request) { + if obj == nil { return nil } @@ -489,7 +502,7 @@ func (r *AdoptionReconciler) mapToProviders(obj handler.MapObject) (requests []r NamespacedName: types.NamespacedName{Namespace: csv.GetNamespace(), Name: csv.GetName()}, } for _, provided := range csv.Spec.CustomResourceDefinitions.Owned { - if provided.Name == obj.Meta.GetName() { + if provided.Name == obj.GetName() { requests = append(requests, request) break } diff --git a/pkg/controller/operators/adoption_controller_test.go b/pkg/controller/operators/adoption_controller_test.go index c27af0d876..2c1505e157 100644 --- a/pkg/controller/operators/adoption_controller_test.go +++ b/pkg/controller/operators/adoption_controller_test.go @@ -12,9 +12,9 @@ import ( apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/tools/reference" apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" + "sigs.k8s.io/controller-runtime/pkg/client" operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/decorators" @@ -33,11 +33,11 @@ var _ = Describe("Adoption Controller", func() { Describe("Component label generation", func() { var ( - created []runtime.Object + created []client.Object ) BeforeEach(func() { - created = []runtime.Object{} + created = []client.Object{} }) JustAfterEach(func() { diff --git a/pkg/controller/operators/operator_controller.go b/pkg/controller/operators/operator_controller.go index d5494b3455..edfb27fd3a 100644 --- a/pkg/controller/operators/operator_controller.go +++ b/pkg/controller/operators/operator_controller.go @@ -2,6 +2,7 @@ package operators import ( "context" + "fmt" "sync" "github.com/go-logr/logr" @@ -58,10 +59,7 @@ type OperatorReconciler struct { // SetupWithManager adds the operator reconciler to the given controller manager. func (r *OperatorReconciler) SetupWithManager(mgr ctrl.Manager) error { // Trigger operator events from the events of their compoenents. - enqueueOperator := &handler.EnqueueRequestsFromMapFunc{ - ToRequests: handler.ToRequestsFunc(r.mapComponentRequests), - } - + enqueueOperator := handler.EnqueueRequestsFromMapFunc(r.mapComponentRequests) // Note: If we want to support resources composed of custom resources, we need to figure out how // to dynamically add resource types to watch. return ctrl.NewControllerManagedBy(mgr). @@ -110,13 +108,12 @@ func NewOperatorReconciler(cli client.Client, log logr.Logger, scheme *runtime.S // Implement reconcile.Reconciler so the controller can reconcile objects var _ reconcile.Reconciler = &OperatorReconciler{} -func (r *OperatorReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { +func (r *OperatorReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { // Set up a convenient log object so we don't have to type request over and over again log := r.log.WithValues("request", req) log.V(1).Info("reconciling operator") // Get the Operator - ctx := context.TODO() create := false name := req.NamespacedName.Name in := &operatorsv1.Operator{} @@ -210,7 +207,11 @@ func (r *OperatorReconciler) listComponents(ctx context.Context, selector labels opt := client.MatchingLabelsSelector{Selector: selector} for _, list := range componentLists { - if err := r.List(ctx, list, opt); err != nil { + cList, ok := list.(client.ObjectList) + if !ok { + return nil, fmt.Errorf("Unable to typecast runtime.Object to client.ObjectList") + } + if err := r.List(ctx, cList, opt); err != nil { return nil, err } } @@ -245,13 +246,14 @@ func (r *OperatorReconciler) unsetLastResourceVersion(name types.NamespacedName) delete(r.lastResourceVersion, name) } -func (r *OperatorReconciler) mapComponentRequests(obj handler.MapObject) []reconcile.Request { +func (r *OperatorReconciler) mapComponentRequests(obj client.Object) []reconcile.Request { var requests []reconcile.Request - if obj.Meta == nil { + if obj == nil { return requests } - for _, name := range decorators.OperatorNames(obj.Meta.GetLabels()) { + labels := decorators.OperatorNames(obj.GetLabels()) + for _, name := range labels { // unset the last recorded resource version so the Operator will reconcile r.unsetLastResourceVersion(name) requests = append(requests, reconcile.Request{NamespacedName: name}) diff --git a/pkg/controller/operators/operator_controller_test.go b/pkg/controller/operators/operator_controller_test.go index b6c402fefa..296db1f537 100644 --- a/pkg/controller/operators/operator_controller_test.go +++ b/pkg/controller/operators/operator_controller_test.go @@ -10,6 +10,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" operatorsv1 "github.com/operator-framework/api/pkg/operators/v1" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/decorators" @@ -83,7 +84,7 @@ var _ = Describe("Operator Controller", func() { ) for _, obj := range objs { - Expect(k8sClient.Create(ctx, obj)).To(Succeed()) + Expect(k8sClient.Create(ctx, obj.(client.Object))).To(Succeed()) } expectedRefs = toRefs(scheme, objs...) @@ -91,8 +92,8 @@ var _ = Describe("Operator Controller", func() { AfterEach(func() { for _, obj := range objs { - Expect(k8sClient.Get(ctx, testobj.NamespacedName(obj), obj)).To(Succeed()) - Expect(k8sClient.Delete(ctx, obj, deleteOpts)).To(Succeed()) + Expect(k8sClient.Get(ctx, testobj.NamespacedName(obj), obj.(client.Object))).To(Succeed()) + Expect(k8sClient.Delete(ctx, obj.(client.Object), deleteOpts)).To(Succeed()) } }) @@ -125,7 +126,7 @@ var _ = Describe("Operator Controller", func() { ) for _, obj := range newObjs { - Expect(k8sClient.Create(ctx, obj)).To(Succeed()) + Expect(k8sClient.Create(ctx, obj.(client.Object))).To(Succeed()) } objs = append(objs, newObjs...) @@ -143,7 +144,7 @@ var _ = Describe("Operator Controller", func() { Context("when component labels are removed", func() { BeforeEach(func() { for _, obj := range testobj.StripLabel(expectedKey, objs...) { - Expect(k8sClient.Update(ctx, obj)).To(Succeed()) + Expect(k8sClient.Update(ctx, obj.(client.Object))).To(Succeed()) } }) diff --git a/pkg/controller/operators/operatorcondition_controller.go b/pkg/controller/operators/operatorcondition_controller.go index a403400e6e..0ca82a7222 100644 --- a/pkg/controller/operators/operatorcondition_controller.go +++ b/pkg/controller/operators/operatorcondition_controller.go @@ -66,7 +66,7 @@ func NewOperatorConditionReconciler(cli client.Client, log logr.Logger, scheme * // Implement reconcile.Reconciler so the controller can reconcile objects var _ reconcile.Reconciler = &OperatorConditionReconciler{} -func (r *OperatorConditionReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { +func (r *OperatorConditionReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { // Set up a convenient log object so we don't have to type request over and over again log := r.log.WithValues("request", req) log.V(2).Info("reconciling operatorcondition") diff --git a/pkg/controller/operators/operatorcondition_controller_test.go b/pkg/controller/operators/operatorcondition_controller_test.go index 7537023647..4da2fea954 100644 --- a/pkg/controller/operators/operatorcondition_controller_test.go +++ b/pkg/controller/operators/operatorcondition_controller_test.go @@ -7,7 +7,6 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" operatorsv1 "github.com/operator-framework/api/pkg/operators/v1" - "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/testobj" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" @@ -46,17 +45,21 @@ var _ = Describe("OperatorCondition", func() { Context("The OperatorCondition Reconciler", func() { var ( ctx context.Context - namespace string - namespacedName types.NamespacedName operatorCondition *operatorsv1.OperatorCondition + namespace *corev1.Namespace + namespacedName types.NamespacedName ) BeforeEach(func() { ctx = context.Background() - namespace = genName("ns-") - Expect(k8sClient.Create(ctx, testobj.WithName(namespace, &corev1.Namespace{}))).To(Succeed()) + namespace = &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: genName("ns-"), + }, + } + Expect(k8sClient.Create(ctx, namespace)).To(Succeed()) - namespacedName = types.NamespacedName{Name: "test", Namespace: namespace} + namespacedName = types.NamespacedName{Name: "test", Namespace: namespace.GetName()} // Create the deployment labels := map[string]string{ @@ -64,7 +67,7 @@ var _ = Describe("OperatorCondition", func() { } deployment := &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{ Name: "deployment", - Namespace: namespacedName.Namespace, + Namespace: namespace.GetName(), }, Spec: appsv1.DeploymentSpec{ Selector: &metav1.LabelSelector{ @@ -73,7 +76,7 @@ var _ = Describe("OperatorCondition", func() { Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ GenerateName: "nginx-", - Namespace: namespacedName.Namespace, + Namespace: namespace.GetName(), Labels: labels, }, Spec: corev1.PodSpec{ @@ -188,7 +191,7 @@ var _ = Describe("OperatorCondition", func() { It("appends the OPERATOR_CONDITION_NAME environment variable to the containers in the deployments", func() { deployment := &appsv1.Deployment{} Eventually(func() error { - err := k8sClient.Get(ctx, types.NamespacedName{Name: operatorCondition.Spec.Deployments[0], Namespace: namespace}, deployment) + err := k8sClient.Get(ctx, types.NamespacedName{Name: operatorCondition.Spec.Deployments[0], Namespace: namespace.GetName()}, deployment) if err != nil { return err } diff --git a/pkg/controller/operators/operatorconditiongenerator_controller.go b/pkg/controller/operators/operatorconditiongenerator_controller.go index 3c5bcaac89..bab47ccdf3 100644 --- a/pkg/controller/operators/operatorconditiongenerator_controller.go +++ b/pkg/controller/operators/operatorconditiongenerator_controller.go @@ -39,25 +39,25 @@ func (r *OperatorConditionGeneratorReconciler) SetupWithManager(mgr ctrl.Manager } p := predicate.Funcs{ CreateFunc: func(e event.CreateEvent) bool { - if _, ok := e.Meta.GetLabels()[operatorsv1alpha1.CopiedLabelKey]; ok { + if _, ok := e.Object.GetLabels()[operatorsv1alpha1.CopiedLabelKey]; ok { return false } return true }, DeleteFunc: func(e event.DeleteEvent) bool { - if _, ok := e.Meta.GetLabels()[operatorsv1alpha1.CopiedLabelKey]; ok { + if _, ok := e.Object.GetLabels()[operatorsv1alpha1.CopiedLabelKey]; ok { return false } return true }, UpdateFunc: func(e event.UpdateEvent) bool { - if _, ok := e.MetaOld.GetLabels()[operatorsv1alpha1.CopiedLabelKey]; ok { + if _, ok := e.ObjectOld.GetLabels()[operatorsv1alpha1.CopiedLabelKey]; ok { return false } return true }, GenericFunc: func(e event.GenericEvent) bool { - if _, ok := e.Meta.GetLabels()[operatorsv1alpha1.CopiedLabelKey]; ok { + if _, ok := e.Object.GetLabels()[operatorsv1alpha1.CopiedLabelKey]; ok { return false } return true @@ -87,7 +87,7 @@ func NewOperatorConditionGeneratorReconciler(cli client.Client, log logr.Logger, // Implement reconcile.Reconciler so the controller can reconcile objects var _ reconcile.Reconciler = &OperatorConditionGeneratorReconciler{} -func (r *OperatorConditionGeneratorReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { +func (r *OperatorConditionGeneratorReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { // Set up a convenient log object so we don't have to type request over and over again log := r.log.WithValues("request", req) diff --git a/pkg/controller/operators/operatorconditiongenerator_controller_test.go b/pkg/controller/operators/operatorconditiongenerator_controller_test.go index bf4f8150e1..f990031ffd 100644 --- a/pkg/controller/operators/operatorconditiongenerator_controller_test.go +++ b/pkg/controller/operators/operatorconditiongenerator_controller_test.go @@ -11,13 +11,11 @@ import ( k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - "k8s.io/apiserver/pkg/storage/names" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" operatorsv1 "github.com/operator-framework/api/pkg/operators/v1" operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1" - "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/testobj" ) var _ = Describe("The OperatorConditionsGenerator Controller", func() { @@ -26,18 +24,19 @@ var _ = Describe("The OperatorConditionsGenerator Controller", func() { interval = time.Millisecond * 100 ) - var ( - genName = names.SimpleNameGenerator.GenerateName - ) var ( ctx context.Context - namespace string + namespace *corev1.Namespace ) BeforeEach(func() { ctx = context.Background() - namespace = genName("ns-") - Expect(k8sClient.Create(ctx, testobj.WithName(namespace, &corev1.Namespace{}))).To(Succeed()) + namespace = &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: genName("ns-"), + }, + } + Expect(k8sClient.Create(ctx, namespace)).To(Succeed()) }) It("creates an OperatorCondition for a CSV without a ServiceAccount", func() { @@ -49,7 +48,7 @@ var _ = Describe("The OperatorConditionsGenerator Controller", func() { }, ObjectMeta: metav1.ObjectMeta{ Name: genName("csv-"), - Namespace: namespace, + Namespace: namespace.GetName(), }, Spec: operatorsv1alpha1.ClusterServiceVersionSpec{ InstallModes: []operatorsv1alpha1.InstallMode{ @@ -109,7 +108,7 @@ var _ = Describe("The OperatorConditionsGenerator Controller", func() { }, ObjectMeta: metav1.ObjectMeta{ Name: genName("csv-"), - Namespace: namespace, + Namespace: namespace.GetName(), Labels: map[string]string{ operatorsv1alpha1.CopiedLabelKey: "", }, @@ -160,7 +159,7 @@ var _ = Describe("The OperatorConditionsGenerator Controller", func() { }, ObjectMeta: metav1.ObjectMeta{ Name: genName("csv-"), - Namespace: namespace, + Namespace: namespace.GetName(), }, Spec: operatorsv1alpha1.ClusterServiceVersionSpec{ InstallModes: []operatorsv1alpha1.InstallMode{ diff --git a/pkg/controller/operators/suite_test.go b/pkg/controller/operators/suite_test.go index 5c1d74fc04..cedf803775 100644 --- a/pkg/controller/operators/suite_test.go +++ b/pkg/controller/operators/suite_test.go @@ -1,6 +1,7 @@ package operators import ( + "context" "fmt" "testing" "time" @@ -45,7 +46,7 @@ var ( cfg *rest.Config k8sClient client.Client testEnv *envtest.Environment - stop chan struct{} + ctx context.Context scheme = runtime.NewScheme() gracePeriod int64 = 0 @@ -82,13 +83,12 @@ func TestAPIs(t *testing.T) { } var _ = BeforeSuite(func() { - logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) - + logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true))) By("bootstrapping test environment") useExisting := false testEnv = &envtest.Environment{ UseExistingCluster: &useExisting, - CRDs: []runtime.Object{ + CRDs: []client.Object{ crds.CatalogSource(), crds.ClusterServiceVersion(), crds.InstallPlan(), @@ -144,16 +144,16 @@ var _ = BeforeSuite(func() { Expect(operatorConditionReconciler.SetupWithManager(mgr)).ToNot(HaveOccurred()) Expect(operatorConditionGeneratorReconciler.SetupWithManager(mgr)).ToNot(HaveOccurred()) - stop = make(chan struct{}) + ctx = ctrl.SetupSignalHandler() go func() { defer GinkgoRecover() By("Starting managed controllers") - err = mgr.Start(stop) + err := mgr.Start(ctx) Expect(err).ToNot(HaveOccurred()) }() - Expect(mgr.GetCache().WaitForCacheSync(stop)).To(BeTrue(), "Cache sync failed on startup") + Expect(mgr.GetCache().WaitForCacheSync(ctx)).To(BeTrue(), "Cache sync failed on startup") k8sClient = mgr.GetClient() Expect(k8sClient).ToNot(BeNil()) @@ -161,7 +161,7 @@ var _ = BeforeSuite(func() { var _ = AfterSuite(func() { By("stopping the controller manager") - close(stop) + ctx.Done() By("tearing down the test environment") err := testEnv.Stop() diff --git a/pkg/controller/registry/resolver/cache.go b/pkg/controller/registry/resolver/cache.go index 7bea5e7425..fa7cad9f08 100644 --- a/pkg/controller/registry/resolver/cache.go +++ b/pkg/controller/registry/resolver/cache.go @@ -8,7 +8,7 @@ import ( "sync" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/sirupsen/logrus" "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1" diff --git a/pkg/controller/registry/resolver/operators.go b/pkg/controller/registry/resolver/operators.go index 484d6532a3..19a0b933ed 100644 --- a/pkg/controller/registry/resolver/operators.go +++ b/pkg/controller/registry/resolver/operators.go @@ -7,7 +7,7 @@ import ( "sort" "strings" - "github.com/blang/semver" + "github.com/blang/semver/v4" "k8s.io/apimachinery/pkg/runtime/schema" "github.com/operator-framework/api/pkg/operators/v1alpha1" diff --git a/pkg/controller/registry/resolver/operators_test.go b/pkg/controller/registry/resolver/operators_test.go index d535cbc163..5cbbdeabcd 100644 --- a/pkg/controller/registry/resolver/operators_test.go +++ b/pkg/controller/registry/resolver/operators_test.go @@ -6,7 +6,7 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/stretchr/testify/require" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -1029,23 +1029,23 @@ func TestNewOperatorFromBundle(t *testing.T) { ChannelName: "testChannel", Version: version.String(), BundlePath: "image", - Properties: []*api.Property{ + Properties: []*api.Property{ { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"crd.group.com\",\"kind\":\"OwnedCRD\",\"version\":\"v1\"}", }, { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"apis.group.com\",\"kind\":\"OwnedAPI\",\"version\":\"v1\"}", }, }, Dependencies: []*api.Dependency{ { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"crd.group.com\",\"kind\":\"RequiredCRD\",\"version\":\"v1\"}", }, { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"apis.group.com\",\"kind\":\"RequiredAPI\",\"version\":\"v1\"}", }, }, @@ -1128,23 +1128,23 @@ func TestNewOperatorFromBundle(t *testing.T) { Plural: "requiredapis", }: struct{}{}, }, - properties: []*api.Property{ + properties: []*api.Property{ { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"crd.group.com\",\"kind\":\"OwnedCRD\",\"version\":\"v1\"}", }, { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"apis.group.com\",\"kind\":\"OwnedAPI\",\"version\":\"v1\"}", }, }, dependencies: []*api.Dependency{ { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"crd.group.com\",\"kind\":\"RequiredCRD\",\"version\":\"v1\"}", }, { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"apis.group.com\",\"kind\":\"RequiredAPI\",\"version\":\"v1\"}", }, }, @@ -1212,23 +1212,23 @@ func TestNewOperatorFromBundle(t *testing.T) { Plural: "requiredapis", }: struct{}{}, }, - properties: []*api.Property{ + properties: []*api.Property{ { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"crd.group.com\",\"kind\":\"OwnedCRD\",\"version\":\"v1\"}", }, { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"apis.group.com\",\"kind\":\"OwnedAPI\",\"version\":\"v1\"}", }, }, dependencies: []*api.Dependency{ { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"apis.group.com\",\"kind\":\"RequiredAPI\",\"version\":\"v1\"}", }, { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"crd.group.com\",\"kind\":\"RequiredCRD\",\"version\":\"v1\"}", }, }, @@ -1289,27 +1289,27 @@ func TestNewOperatorFromBundle(t *testing.T) { sourceKey: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, }, want: &Operator{ - name: "testBundle", - version: &version.Version, + name: "testBundle", + version: &version.Version, providedAPIs: EmptyAPISet(), requiredAPIs: EmptyAPISet(), - properties: []*api.Property{ + properties: []*api.Property{ { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"crd.group.com\",\"kind\":\"OwnedCRD\",\"version\":\"v1\"}", }, { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"apis.group.com\",\"kind\":\"OwnedAPI\",\"version\":\"v1\"}", }, }, dependencies: []*api.Dependency{ { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"crd.group.com\",\"kind\":\"RequiredCRD\",\"version\":\"v1\"}", }, { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"apis.group.com\",\"kind\":\"RequiredAPI\",\"version\":\"v1\"}", }, }, @@ -1328,7 +1328,7 @@ func TestNewOperatorFromBundle(t *testing.T) { require.Equal(t, tt.wantErr, err) require.ElementsMatch(t, tt.want.dependencies, got.dependencies) require.ElementsMatch(t, tt.want.properties, got.properties) - tt.want.properties, tt.want.dependencies, got.dependencies, got.properties = nil,nil,nil,nil + tt.want.properties, tt.want.dependencies, got.dependencies, got.properties = nil, nil, nil, nil require.Equal(t, tt.want, got) }) } @@ -1404,11 +1404,11 @@ func TestNewOperatorFromCSV(t *testing.T) { }, properties: []*api.Property{ { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"g\",\"kind\":\"APIKind\",\"version\":\"v1\"}", }, { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"g\",\"kind\":\"CRDKind\",\"version\":\"v1\"}", }, }, @@ -1457,11 +1457,11 @@ func TestNewOperatorFromCSV(t *testing.T) { }, dependencies: []*api.Dependency{ { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"g\",\"kind\":\"APIKind\",\"version\":\"v1\"}", }, { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"g\",\"kind\":\"CRDKind\",\"version\":\"v1\"}", }, }, @@ -1527,21 +1527,21 @@ func TestNewOperatorFromCSV(t *testing.T) { }, properties: []*api.Property{ { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"g\",\"kind\":\"APIOwnedKind\",\"version\":\"v1\"}", }, { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"g\",\"kind\":\"CRDOwnedKind\",\"version\":\"v1\"}", }, }, dependencies: []*api.Dependency{ { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"g2\",\"kind\":\"APIReqKind\",\"version\":\"v1\"}", }, { - Type: "olm.gvk", + Type: "olm.gvk", Value: "{\"group\":\"g2\",\"kind\":\"CRDReqKind\",\"version\":\"v1\"}", }, }, @@ -1556,7 +1556,7 @@ func TestNewOperatorFromCSV(t *testing.T) { require.Equal(t, tt.wantErr, err) require.ElementsMatch(t, tt.want.dependencies, got.dependencies) require.ElementsMatch(t, tt.want.properties, got.properties) - tt.want.properties, tt.want.dependencies, got.dependencies, got.properties = nil,nil,nil,nil + tt.want.properties, tt.want.dependencies, got.dependencies, got.properties = nil, nil, nil, nil require.Equal(t, tt.want, got) }) } diff --git a/pkg/controller/registry/resolver/querier.go b/pkg/controller/registry/resolver/querier.go index 86e32dd12a..7acbc8a8a3 100644 --- a/pkg/controller/registry/resolver/querier.go +++ b/pkg/controller/registry/resolver/querier.go @@ -6,7 +6,7 @@ import ( "context" "fmt" - "github.com/blang/semver" + "github.com/blang/semver/v4" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/errors" diff --git a/pkg/controller/registry/resolver/querier_test.go b/pkg/controller/registry/resolver/querier_test.go index f92eb4d404..20d1c0e700 100644 --- a/pkg/controller/registry/resolver/querier_test.go +++ b/pkg/controller/registry/resolver/querier_test.go @@ -6,7 +6,7 @@ import ( "fmt" "testing" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/operator-framework/operator-registry/pkg/api" "github.com/operator-framework/operator-registry/pkg/client" opregistry "github.com/operator-framework/operator-registry/pkg/registry" diff --git a/pkg/controller/registry/resolver/resolver_test.go b/pkg/controller/registry/resolver/resolver_test.go index 4f17bea971..5e6b5c4491 100644 --- a/pkg/controller/registry/resolver/resolver_test.go +++ b/pkg/controller/registry/resolver/resolver_test.go @@ -3,7 +3,7 @@ package resolver import ( "testing" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/pkg/lib/controller-runtime/client/fake_ssa.go b/pkg/lib/controller-runtime/client/fake_ssa.go index 560933ab8a..a7e04cb873 100644 --- a/pkg/lib/controller-runtime/client/fake_ssa.go +++ b/pkg/lib/controller-runtime/client/fake_ssa.go @@ -2,6 +2,7 @@ package client import ( "context" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" k8scontrollerclient "sigs.k8s.io/controller-runtime/pkg/client" @@ -21,7 +22,7 @@ type fakeApplier struct { k8scontrollerclient.Client } -func (c *fakeApplier) Patch(ctx context.Context, obj runtime.Object, patch k8scontrollerclient.Patch, opts ...k8scontrollerclient.PatchOption) error { +func (c *fakeApplier) Patch(ctx context.Context, obj k8scontrollerclient.Object, patch k8scontrollerclient.Patch, opts ...k8scontrollerclient.PatchOption) error { patch, opts = convertApplyToMergePatch(patch, opts...) return c.Client.Patch(ctx, obj, patch, opts...) } @@ -34,7 +35,7 @@ type fakeStatusWriter struct { k8scontrollerclient.StatusWriter } -func (c fakeStatusWriter) Patch(ctx context.Context, obj runtime.Object, patch k8scontrollerclient.Patch, opts ...k8scontrollerclient.PatchOption) error { +func (c fakeStatusWriter) Patch(ctx context.Context, obj k8scontrollerclient.Object, patch k8scontrollerclient.Patch, opts ...k8scontrollerclient.PatchOption) error { patch, opts = convertApplyToMergePatch(patch, opts...) return c.StatusWriter.Patch(ctx, obj, patch, opts...) } diff --git a/pkg/lib/controller-runtime/client/ssa.go b/pkg/lib/controller-runtime/client/ssa.go index cae89e56d9..b13f923b3d 100644 --- a/pkg/lib/controller-runtime/client/ssa.go +++ b/pkg/lib/controller-runtime/client/ssa.go @@ -3,6 +3,8 @@ package client import ( "context" "fmt" + "reflect" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -10,7 +12,6 @@ import ( kscheme "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" - "reflect" k8scontrollerclient "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -130,10 +131,7 @@ func (c *ServerSideApplier) Apply(ctx context.Context, obj Object, changeFunc in _, applyStatus = unstructuredObj.Object["status"] } - key, err := k8scontrollerclient.ObjectKeyFromObject(obj) - if err != nil { - panic(fmt.Sprintf("unable to extract key from resource: %s", err)) - } + key := k8scontrollerclient.ObjectKeyFromObject(obj) // Ensure the GVK is set before patching SetDefaultGroupVersionKind(obj, c.Scheme) diff --git a/pkg/lib/operatorstatus/csv_reporter_test.go b/pkg/lib/operatorstatus/csv_reporter_test.go index c98d8fcf8e..5fccfe08a9 100644 --- a/pkg/lib/operatorstatus/csv_reporter_test.go +++ b/pkg/lib/operatorstatus/csv_reporter_test.go @@ -4,11 +4,11 @@ import ( "testing" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" configv1 "github.com/openshift/api/config/v1" + "github.com/operator-framework/api/pkg/lib/version" "github.com/operator-framework/api/pkg/operators/v1alpha1" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil" - "github.com/operator-framework/api/pkg/lib/version" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/pkg/package-server/client/openapi/zz_generated.openapi.go b/pkg/package-server/client/openapi/zz_generated.openapi.go index afcc17d041..a425e0d4fa 100644 --- a/pkg/package-server/client/openapi/zz_generated.openapi.go +++ b/pkg/package-server/client/openapi/zz_generated.openapi.go @@ -127,20 +127,23 @@ func schema_api_pkg_operators_v1alpha1_APIResourceReference(ref common.Reference Properties: map[string]spec.Schema{ "name": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "kind": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "version": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -163,7 +166,8 @@ func schema_api_pkg_operators_v1alpha1_APIServiceDefinitions(ref common.Referenc Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.APIServiceDescription"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.APIServiceDescription"), }, }, }, @@ -175,7 +179,8 @@ func schema_api_pkg_operators_v1alpha1_APIServiceDefinitions(ref common.Referenc Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.APIServiceDescription"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.APIServiceDescription"), }, }, }, @@ -198,26 +203,30 @@ func schema_api_pkg_operators_v1alpha1_APIServiceDescription(ref common.Referenc Properties: map[string]spec.Schema{ "name": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "group": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "version": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "kind": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "deploymentName": { @@ -250,7 +259,8 @@ func schema_api_pkg_operators_v1alpha1_APIServiceDescription(ref common.Referenc Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.APIResourceReference"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.APIResourceReference"), }, }, }, @@ -262,7 +272,8 @@ func schema_api_pkg_operators_v1alpha1_APIServiceDescription(ref common.Referenc Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.StatusDescriptor"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.StatusDescriptor"), }, }, }, @@ -274,7 +285,8 @@ func schema_api_pkg_operators_v1alpha1_APIServiceDescription(ref common.Referenc Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.SpecDescriptor"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.SpecDescriptor"), }, }, }, @@ -286,7 +298,8 @@ func schema_api_pkg_operators_v1alpha1_APIServiceDescription(ref common.Referenc Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.ActionDescriptor"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.ActionDescriptor"), }, }, }, @@ -310,8 +323,9 @@ func schema_api_pkg_operators_v1alpha1_ActionDescriptor(ref common.ReferenceCall Properties: map[string]spec.Schema{ "path": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "displayName": { @@ -332,8 +346,9 @@ func schema_api_pkg_operators_v1alpha1_ActionDescriptor(ref common.ReferenceCall Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -361,20 +376,23 @@ func schema_api_pkg_operators_v1alpha1_CRDDescription(ref common.ReferenceCallba Properties: map[string]spec.Schema{ "name": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "version": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "kind": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "displayName": { @@ -395,7 +413,8 @@ func schema_api_pkg_operators_v1alpha1_CRDDescription(ref common.ReferenceCallba Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.APIResourceReference"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.APIResourceReference"), }, }, }, @@ -407,7 +426,8 @@ func schema_api_pkg_operators_v1alpha1_CRDDescription(ref common.ReferenceCallba Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.StatusDescriptor"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.StatusDescriptor"), }, }, }, @@ -419,7 +439,8 @@ func schema_api_pkg_operators_v1alpha1_CRDDescription(ref common.ReferenceCallba Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.SpecDescriptor"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.SpecDescriptor"), }, }, }, @@ -431,7 +452,8 @@ func schema_api_pkg_operators_v1alpha1_CRDDescription(ref common.ReferenceCallba Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.ActionDescriptor"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.ActionDescriptor"), }, }, }, @@ -459,7 +481,8 @@ func schema_api_pkg_operators_v1alpha1_CustomResourceDefinitions(ref common.Refe Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.CRDDescription"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.CRDDescription"), }, }, }, @@ -471,7 +494,8 @@ func schema_api_pkg_operators_v1alpha1_CustomResourceDefinitions(ref common.Refe Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.CRDDescription"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.CRDDescription"), }, }, }, @@ -494,14 +518,16 @@ func schema_api_pkg_operators_v1alpha1_InstallMode(ref common.ReferenceCallback) Properties: map[string]spec.Schema{ "type": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "supported": { SchemaProps: spec.SchemaProps{ - Type: []string{"boolean"}, - Format: "", + Default: false, + Type: []string{"boolean"}, + Format: "", }, }, }, @@ -520,8 +546,9 @@ func schema_api_pkg_operators_v1alpha1_SpecDescriptor(ref common.ReferenceCallba Properties: map[string]spec.Schema{ "path": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "displayName": { @@ -542,8 +569,9 @@ func schema_api_pkg_operators_v1alpha1_SpecDescriptor(ref common.ReferenceCallba Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -571,8 +599,9 @@ func schema_api_pkg_operators_v1alpha1_StatusDescriptor(ref common.ReferenceCall Properties: map[string]spec.Schema{ "path": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "displayName": { @@ -593,8 +622,9 @@ func schema_api_pkg_operators_v1alpha1_StatusDescriptor(ref common.ReferenceCall Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -622,14 +652,16 @@ func schema_api_pkg_operators_v1alpha1_WebhookDescription(ref common.ReferenceCa Properties: map[string]spec.Schema{ "generateName": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "type": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "deploymentName": { @@ -655,7 +687,8 @@ func schema_api_pkg_operators_v1alpha1_WebhookDescription(ref common.ReferenceCa Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/api/admissionregistration/v1.RuleWithOperations"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/admissionregistration/v1.RuleWithOperations"), }, }, }, @@ -696,8 +729,9 @@ func schema_api_pkg_operators_v1alpha1_WebhookDescription(ref common.ReferenceCa Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -721,8 +755,9 @@ func schema_api_pkg_operators_v1alpha1_WebhookDescription(ref common.ReferenceCa Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -788,7 +823,8 @@ func schema_package_server_apis_operators_v1_CSVDescription(ref common.Reference Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.Icon"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.Icon"), }, }, }, @@ -797,12 +833,14 @@ func schema_package_server_apis_operators_v1_CSVDescription(ref common.Reference "version": { SchemaProps: spec.SchemaProps{ Description: "Version is the CSV's semantic version", + Default: map[string]interface{}{}, Ref: ref("github.com/operator-framework/api/pkg/lib/version.OperatorVersion"), }, }, "provider": { SchemaProps: spec.SchemaProps{ Description: "Provider is the CSV's provider", + Default: map[string]interface{}{}, Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.AppLink"), }, }, @@ -818,8 +856,9 @@ func schema_package_server_apis_operators_v1_CSVDescription(ref common.Reference Allows: true, Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -836,8 +875,9 @@ func schema_package_server_apis_operators_v1_CSVDescription(ref common.Reference Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -854,7 +894,8 @@ func schema_package_server_apis_operators_v1_CSVDescription(ref common.Reference Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.AppLink"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.AppLink"), }, }, }, @@ -871,7 +912,8 @@ func schema_package_server_apis_operators_v1_CSVDescription(ref common.Reference Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.Maintainer"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.Maintainer"), }, }, }, @@ -902,7 +944,8 @@ func schema_package_server_apis_operators_v1_CSVDescription(ref common.Reference Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.InstallMode"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.InstallMode"), }, }, }, @@ -910,12 +953,14 @@ func schema_package_server_apis_operators_v1_CSVDescription(ref common.Reference }, "customresourcedefinitions": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.CustomResourceDefinitions"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.CustomResourceDefinitions"), }, }, "apiservicedefinitions": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.APIServiceDefinitions"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.APIServiceDefinitions"), }, }, "nativeApis": { @@ -924,7 +969,8 @@ func schema_package_server_apis_operators_v1_CSVDescription(ref common.Reference Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.GroupVersionKind"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.GroupVersionKind"), }, }, }, @@ -944,8 +990,9 @@ func schema_package_server_apis_operators_v1_CSVDescription(ref common.Reference Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -1019,6 +1066,7 @@ func schema_package_server_apis_operators_v1_PackageChannel(ref common.Reference "name": { SchemaProps: spec.SchemaProps{ Description: "Name is the name of the channel, e.g. `alpha` or `stable`", + Default: "", Type: []string{"string"}, Format: "", }, @@ -1026,6 +1074,7 @@ func schema_package_server_apis_operators_v1_PackageChannel(ref common.Reference "currentCSV": { SchemaProps: spec.SchemaProps{ Description: "CurrentCSV defines a reference to the CSV holding the version of this package currently for the channel.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -1033,6 +1082,7 @@ func schema_package_server_apis_operators_v1_PackageChannel(ref common.Reference "currentCSVDesc": { SchemaProps: spec.SchemaProps{ Description: "CurrentCSVSpec holds the spec of the current CSV", + Default: map[string]interface{}{}, Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.CSVDescription"), }, }, @@ -1068,17 +1118,20 @@ func schema_package_server_apis_operators_v1_PackageManifest(ref common.Referenc }, "metadata": { SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), }, }, "spec": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.PackageManifestSpec"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.PackageManifestSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.PackageManifestStatus"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.PackageManifestStatus"), }, }, }, @@ -1112,7 +1165,8 @@ func schema_package_server_apis_operators_v1_PackageManifestList(ref common.Refe }, "metadata": { SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), }, }, "items": { @@ -1126,7 +1180,8 @@ func schema_package_server_apis_operators_v1_PackageManifestList(ref common.Refe Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.PackageManifest"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.PackageManifest"), }, }, }, @@ -1162,25 +1217,29 @@ func schema_package_server_apis_operators_v1_PackageManifestStatus(ref common.Re "catalogSource": { SchemaProps: spec.SchemaProps{ Description: "CatalogSource is the name of the CatalogSource this package belongs to", + Default: "", Type: []string{"string"}, Format: "", }, }, "catalogSourceDisplayName": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "catalogSourcePublisher": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "catalogSourceNamespace": { SchemaProps: spec.SchemaProps{ Description: "\n CatalogSourceNamespace is the namespace of the owning CatalogSource", + Default: "", Type: []string{"string"}, Format: "", }, @@ -1188,12 +1247,14 @@ func schema_package_server_apis_operators_v1_PackageManifestStatus(ref common.Re "provider": { SchemaProps: spec.SchemaProps{ Description: "Provider is the provider of the PackageManifest's default CSV", + Default: map[string]interface{}{}, Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.AppLink"), }, }, "packageName": { SchemaProps: spec.SchemaProps{ Description: "PackageName is the name of the overall package, ala `etcd`.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -1210,7 +1271,8 @@ func schema_package_server_apis_operators_v1_PackageManifestStatus(ref common.Re Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.PackageChannel"), + Default: map[string]interface{}{}, + Ref: ref("github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1.PackageChannel"), }, }, }, @@ -1219,6 +1281,7 @@ func schema_package_server_apis_operators_v1_PackageManifestStatus(ref common.Re "defaultChannel": { SchemaProps: spec.SchemaProps{ Description: "DefaultChannel is, if specified, the name of the default channel for the package. The default channel will be installed if no other channel is explicitly given. If the package has a single channel, then that channel is implicitly the default.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -1256,6 +1319,7 @@ func schema_pkg_apis_meta_v1_APIGroup(ref common.ReferenceCallback) common.OpenA "name": { SchemaProps: spec.SchemaProps{ Description: "name is the name of the group.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -1267,7 +1331,8 @@ func schema_pkg_apis_meta_v1_APIGroup(ref common.ReferenceCallback) common.OpenA Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.GroupVersionForDiscovery"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.GroupVersionForDiscovery"), }, }, }, @@ -1276,6 +1341,7 @@ func schema_pkg_apis_meta_v1_APIGroup(ref common.ReferenceCallback) common.OpenA "preferredVersion": { SchemaProps: spec.SchemaProps{ Description: "preferredVersion is the version preferred by the API server, which probably is the storage version.", + Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.GroupVersionForDiscovery"), }, }, @@ -1286,7 +1352,8 @@ func schema_pkg_apis_meta_v1_APIGroup(ref common.ReferenceCallback) common.OpenA Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ServerAddressByClientCIDR"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ServerAddressByClientCIDR"), }, }, }, @@ -1329,7 +1396,8 @@ func schema_pkg_apis_meta_v1_APIGroupList(ref common.ReferenceCallback) common.O Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.APIGroup"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.APIGroup"), }, }, }, @@ -1354,6 +1422,7 @@ func schema_pkg_apis_meta_v1_APIResource(ref common.ReferenceCallback) common.Op "name": { SchemaProps: spec.SchemaProps{ Description: "name is the plural name of the resource.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -1361,6 +1430,7 @@ func schema_pkg_apis_meta_v1_APIResource(ref common.ReferenceCallback) common.Op "singularName": { SchemaProps: spec.SchemaProps{ Description: "singularName is the singular name of the resource. This allows clients to handle plural and singular opaquely. The singularName is more correct for reporting status on a single item and both singular and plural are allowed from the kubectl CLI interface.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -1368,6 +1438,7 @@ func schema_pkg_apis_meta_v1_APIResource(ref common.ReferenceCallback) common.Op "namespaced": { SchemaProps: spec.SchemaProps{ Description: "namespaced indicates if a resource is namespaced or not.", + Default: false, Type: []string{"boolean"}, Format: "", }, @@ -1389,6 +1460,7 @@ func schema_pkg_apis_meta_v1_APIResource(ref common.ReferenceCallback) common.Op "kind": { SchemaProps: spec.SchemaProps{ Description: "kind is the kind for the resource (e.g. 'Foo' is the kind for a resource 'foo')", + Default: "", Type: []string{"string"}, Format: "", }, @@ -1400,8 +1472,9 @@ func schema_pkg_apis_meta_v1_APIResource(ref common.ReferenceCallback) common.Op Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -1414,8 +1487,9 @@ func schema_pkg_apis_meta_v1_APIResource(ref common.ReferenceCallback) common.Op Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -1428,8 +1502,9 @@ func schema_pkg_apis_meta_v1_APIResource(ref common.ReferenceCallback) common.Op Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -1473,6 +1548,7 @@ func schema_pkg_apis_meta_v1_APIResourceList(ref common.ReferenceCallback) commo "groupVersion": { SchemaProps: spec.SchemaProps{ Description: "groupVersion is the group and version this APIResourceList is for.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -1484,7 +1560,8 @@ func schema_pkg_apis_meta_v1_APIResourceList(ref common.ReferenceCallback) commo Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.APIResource"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.APIResource"), }, }, }, @@ -1527,8 +1604,9 @@ func schema_pkg_apis_meta_v1_APIVersions(ref common.ReferenceCallback) common.Op Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -1541,7 +1619,8 @@ func schema_pkg_apis_meta_v1_APIVersions(ref common.ReferenceCallback) common.Op Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ServerAddressByClientCIDR"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ServerAddressByClientCIDR"), }, }, }, @@ -1566,6 +1645,7 @@ func schema_pkg_apis_meta_v1_Condition(ref common.ReferenceCallback) common.Open "type": { SchemaProps: spec.SchemaProps{ Description: "type of condition in CamelCase or in foo.example.com/CamelCase.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -1573,6 +1653,7 @@ func schema_pkg_apis_meta_v1_Condition(ref common.ReferenceCallback) common.Open "status": { SchemaProps: spec.SchemaProps{ Description: "status of the condition, one of True, False, Unknown.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -1587,12 +1668,14 @@ func schema_pkg_apis_meta_v1_Condition(ref common.ReferenceCallback) common.Open "lastTransitionTime": { SchemaProps: spec.SchemaProps{ 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.", + Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), }, }, "reason": { SchemaProps: spec.SchemaProps{ 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.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -1600,6 +1683,7 @@ func schema_pkg_apis_meta_v1_Condition(ref common.ReferenceCallback) common.Open "message": { SchemaProps: spec.SchemaProps{ Description: "message is a human readable message indicating details about the transition. This may be an empty string.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -1641,8 +1725,9 @@ func schema_pkg_apis_meta_v1_CreateOptions(ref common.ReferenceCallback) common. Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -1716,8 +1801,9 @@ func schema_pkg_apis_meta_v1_DeleteOptions(ref common.ReferenceCallback) common. Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -1767,6 +1853,7 @@ func schema_pkg_apis_meta_v1_ExportOptions(ref common.ReferenceCallback) common. "export": { SchemaProps: spec.SchemaProps{ Description: "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + Default: false, Type: []string{"boolean"}, Format: "", }, @@ -1774,6 +1861,7 @@ func schema_pkg_apis_meta_v1_ExportOptions(ref common.ReferenceCallback) common. "exact": { SchemaProps: spec.SchemaProps{ Description: "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + Default: false, Type: []string{"boolean"}, Format: "", }, @@ -1839,14 +1927,16 @@ func schema_pkg_apis_meta_v1_GroupKind(ref common.ReferenceCallback) common.Open Properties: map[string]spec.Schema{ "group": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "kind": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -1865,14 +1955,16 @@ func schema_pkg_apis_meta_v1_GroupResource(ref common.ReferenceCallback) common. Properties: map[string]spec.Schema{ "group": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "resource": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -1891,14 +1983,16 @@ func schema_pkg_apis_meta_v1_GroupVersion(ref common.ReferenceCallback) common.O Properties: map[string]spec.Schema{ "group": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "version": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -1918,6 +2012,7 @@ func schema_pkg_apis_meta_v1_GroupVersionForDiscovery(ref common.ReferenceCallba "groupVersion": { SchemaProps: spec.SchemaProps{ Description: "groupVersion specifies the API group and version in the form \"group/version\"", + Default: "", Type: []string{"string"}, Format: "", }, @@ -1925,6 +2020,7 @@ func schema_pkg_apis_meta_v1_GroupVersionForDiscovery(ref common.ReferenceCallba "version": { SchemaProps: spec.SchemaProps{ Description: "version specifies the version in the form of \"version\". This is to save the clients the trouble of splitting the GroupVersion.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -1945,20 +2041,23 @@ func schema_pkg_apis_meta_v1_GroupVersionKind(ref common.ReferenceCallback) comm Properties: map[string]spec.Schema{ "group": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "version": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "kind": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -1977,20 +2076,23 @@ func schema_pkg_apis_meta_v1_GroupVersionResource(ref common.ReferenceCallback) Properties: map[string]spec.Schema{ "group": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "version": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "resource": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -2009,8 +2111,9 @@ func schema_pkg_apis_meta_v1_InternalEvent(ref common.ReferenceCallback) common. Properties: map[string]spec.Schema{ "Type": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "Object": { @@ -2043,8 +2146,9 @@ func schema_pkg_apis_meta_v1_LabelSelector(ref common.ReferenceCallback) common. Allows: true, Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -2057,7 +2161,8 @@ func schema_pkg_apis_meta_v1_LabelSelector(ref common.ReferenceCallback) common. Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelectorRequirement"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelectorRequirement"), }, }, }, @@ -2065,6 +2170,11 @@ func schema_pkg_apis_meta_v1_LabelSelector(ref common.ReferenceCallback) common. }, }, }, + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-map-type": "atomic", + }, + }, }, Dependencies: []string{ "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelectorRequirement"}, @@ -2087,6 +2197,7 @@ func schema_pkg_apis_meta_v1_LabelSelectorRequirement(ref common.ReferenceCallba }, SchemaProps: spec.SchemaProps{ Description: "key is the label key that the selector applies to.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -2094,6 +2205,7 @@ func schema_pkg_apis_meta_v1_LabelSelectorRequirement(ref common.ReferenceCallba "operator": { SchemaProps: spec.SchemaProps{ Description: "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -2105,8 +2217,9 @@ func schema_pkg_apis_meta_v1_LabelSelectorRequirement(ref common.ReferenceCallba Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -2143,6 +2256,7 @@ func schema_pkg_apis_meta_v1_List(ref common.ReferenceCallback) common.OpenAPIDe "metadata": { SchemaProps: spec.SchemaProps{ Description: "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), }, }, @@ -2153,7 +2267,8 @@ func schema_pkg_apis_meta_v1_List(ref common.ReferenceCallback) common.OpenAPIDe Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), }, }, }, @@ -2425,6 +2540,7 @@ func schema_pkg_apis_meta_v1_ObjectMeta(ref common.ReferenceCallback) common.Ope "creationTimestamp": { SchemaProps: spec.SchemaProps{ Description: "CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC.\n\nPopulated by the system. Read-only. Null for lists. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), }, }, @@ -2449,8 +2565,9 @@ func schema_pkg_apis_meta_v1_ObjectMeta(ref common.ReferenceCallback) common.Ope Allows: true, Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -2464,8 +2581,9 @@ func schema_pkg_apis_meta_v1_ObjectMeta(ref common.ReferenceCallback) common.Ope Allows: true, Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -2484,7 +2602,8 @@ func schema_pkg_apis_meta_v1_ObjectMeta(ref common.ReferenceCallback) common.Ope Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.OwnerReference"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.OwnerReference"), }, }, }, @@ -2502,8 +2621,9 @@ func schema_pkg_apis_meta_v1_ObjectMeta(ref common.ReferenceCallback) common.Ope Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -2523,7 +2643,8 @@ func schema_pkg_apis_meta_v1_ObjectMeta(ref common.ReferenceCallback) common.Ope Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ManagedFieldsEntry"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ManagedFieldsEntry"), }, }, }, @@ -2547,6 +2668,7 @@ func schema_pkg_apis_meta_v1_OwnerReference(ref common.ReferenceCallback) common "apiVersion": { SchemaProps: spec.SchemaProps{ Description: "API version of the referent.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -2554,6 +2676,7 @@ func schema_pkg_apis_meta_v1_OwnerReference(ref common.ReferenceCallback) common "kind": { SchemaProps: spec.SchemaProps{ Description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Default: "", Type: []string{"string"}, Format: "", }, @@ -2561,6 +2684,7 @@ func schema_pkg_apis_meta_v1_OwnerReference(ref common.ReferenceCallback) common "name": { SchemaProps: spec.SchemaProps{ Description: "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names", + Default: "", Type: []string{"string"}, Format: "", }, @@ -2568,6 +2692,7 @@ func schema_pkg_apis_meta_v1_OwnerReference(ref common.ReferenceCallback) common "uid": { SchemaProps: spec.SchemaProps{ Description: "UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids", + Default: "", Type: []string{"string"}, Format: "", }, @@ -2617,6 +2742,7 @@ func schema_pkg_apis_meta_v1_PartialObjectMetadata(ref common.ReferenceCallback) "metadata": { SchemaProps: spec.SchemaProps{ Description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), }, }, @@ -2652,6 +2778,7 @@ func schema_pkg_apis_meta_v1_PartialObjectMetadataList(ref common.ReferenceCallb "metadata": { SchemaProps: spec.SchemaProps{ Description: "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), }, }, @@ -2662,7 +2789,8 @@ func schema_pkg_apis_meta_v1_PartialObjectMetadataList(ref common.ReferenceCallb Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.PartialObjectMetadata"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.PartialObjectMetadata"), }, }, }, @@ -2716,8 +2844,9 @@ func schema_pkg_apis_meta_v1_PatchOptions(ref common.ReferenceCallback) common.O Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -2784,8 +2913,9 @@ func schema_pkg_apis_meta_v1_RootPaths(ref common.ReferenceCallback) common.Open Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -2808,6 +2938,7 @@ func schema_pkg_apis_meta_v1_ServerAddressByClientCIDR(ref common.ReferenceCallb "clientCIDR": { SchemaProps: spec.SchemaProps{ Description: "The CIDR with which clients can match their IP to figure out the server address that they should use.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -2815,6 +2946,7 @@ func schema_pkg_apis_meta_v1_ServerAddressByClientCIDR(ref common.ReferenceCallb "serverAddress": { SchemaProps: spec.SchemaProps{ Description: "Address of this server, suitable for a client that matches the above CIDR. This can be a hostname, hostname:port, IP or IP:port.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -2850,6 +2982,7 @@ func schema_pkg_apis_meta_v1_Status(ref common.ReferenceCallback) common.OpenAPI "metadata": { SchemaProps: spec.SchemaProps{ Description: "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), }, }, @@ -2971,7 +3104,8 @@ func schema_pkg_apis_meta_v1_StatusDetails(ref common.ReferenceCallback) common. Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.StatusCause"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.StatusCause"), }, }, }, @@ -3016,6 +3150,7 @@ func schema_pkg_apis_meta_v1_Table(ref common.ReferenceCallback) common.OpenAPID "metadata": { SchemaProps: spec.SchemaProps{ Description: "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), }, }, @@ -3026,7 +3161,8 @@ func schema_pkg_apis_meta_v1_Table(ref common.ReferenceCallback) common.OpenAPID Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.TableColumnDefinition"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.TableColumnDefinition"), }, }, }, @@ -3039,7 +3175,8 @@ func schema_pkg_apis_meta_v1_Table(ref common.ReferenceCallback) common.OpenAPID Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.TableRow"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.TableRow"), }, }, }, @@ -3064,6 +3201,7 @@ func schema_pkg_apis_meta_v1_TableColumnDefinition(ref common.ReferenceCallback) "name": { SchemaProps: spec.SchemaProps{ Description: "name is a human readable name for the column.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -3071,6 +3209,7 @@ func schema_pkg_apis_meta_v1_TableColumnDefinition(ref common.ReferenceCallback) "type": { SchemaProps: spec.SchemaProps{ Description: "type is an OpenAPI type definition for this column, such as number, integer, string, or array. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for more.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -3078,6 +3217,7 @@ func schema_pkg_apis_meta_v1_TableColumnDefinition(ref common.ReferenceCallback) "format": { SchemaProps: spec.SchemaProps{ Description: "format is an optional OpenAPI type modifier for this column. A format modifies the type and imposes additional rules, like date or time formatting for a string. The 'name' format is applied to the primary identifier column which has type 'string' to assist in clients identifying column is the resource name. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for more.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -3085,6 +3225,7 @@ func schema_pkg_apis_meta_v1_TableColumnDefinition(ref common.ReferenceCallback) "description": { SchemaProps: spec.SchemaProps{ Description: "description is a human readable description of this column.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -3092,6 +3233,7 @@ func schema_pkg_apis_meta_v1_TableColumnDefinition(ref common.ReferenceCallback) "priority": { SchemaProps: spec.SchemaProps{ Description: "priority is an integer defining the relative importance of this column compared to others. Lower numbers are considered higher priority. Columns that may be omitted in limited space scenarios should be given a higher priority.", + Default: 0, Type: []string{"integer"}, Format: "int32", }, @@ -3165,7 +3307,8 @@ func schema_pkg_apis_meta_v1_TableRow(ref common.ReferenceCallback) common.OpenA Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.TableRowCondition"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.TableRowCondition"), }, }, }, @@ -3174,6 +3317,7 @@ func schema_pkg_apis_meta_v1_TableRow(ref common.ReferenceCallback) common.OpenA "object": { SchemaProps: spec.SchemaProps{ Description: "This field contains the requested additional information about each object based on the includeObject policy when requesting the Table. If \"None\", this field is empty, if \"Object\" this will be the default serialization of the object for the current API version, and if \"Metadata\" (the default) will contain the object metadata. Check the returned kind and apiVersion of the object before parsing. The media type of the object will always match the enclosing list - if this as a JSON table, these will be JSON encoded objects.", + Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), }, }, @@ -3196,6 +3340,7 @@ func schema_pkg_apis_meta_v1_TableRowCondition(ref common.ReferenceCallback) com "type": { SchemaProps: spec.SchemaProps{ Description: "Type of row condition. The only defined value is 'Completed' indicating that the object this row represents has reached a completed state and may be given less visual priority than other rows. Clients are not required to honor any conditions but should be consistent where possible about handling the conditions.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -3203,6 +3348,7 @@ func schema_pkg_apis_meta_v1_TableRowCondition(ref common.ReferenceCallback) com "status": { SchemaProps: spec.SchemaProps{ Description: "Status of the condition, one of True, False, Unknown.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -3250,6 +3396,7 @@ func schema_pkg_apis_meta_v1_Timestamp(ref common.ReferenceCallback) common.Open "seconds": { SchemaProps: spec.SchemaProps{ Description: "Represents seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.", + Default: 0, Type: []string{"integer"}, Format: "int64", }, @@ -3257,6 +3404,7 @@ func schema_pkg_apis_meta_v1_Timestamp(ref common.ReferenceCallback) common.Open "nanos": { SchemaProps: spec.SchemaProps{ Description: "Non-negative fractions of a second at nanosecond resolution. Negative second values with fractions must still have non-negative nanos values that count forward in time. Must be from 0 to 999,999,999 inclusive. This field may be limited in precision depending on context.", + Default: 0, Type: []string{"integer"}, Format: "int32", }, @@ -3323,8 +3471,9 @@ func schema_pkg_apis_meta_v1_UpdateOptions(ref common.ReferenceCallback) common. Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, @@ -3352,13 +3501,15 @@ func schema_pkg_apis_meta_v1_WatchEvent(ref common.ReferenceCallback) common.Ope Properties: map[string]spec.Schema{ "type": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "object": { SchemaProps: spec.SchemaProps{ Description: "Object is:\n * If Type is Added or Modified: the new state of the object.\n * If Type is Deleted: the state of the object immediately before deletion.\n * If Type is Error: *Status is recommended; other types may make sense\n depending on context.", + Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), }, }, @@ -3436,6 +3587,7 @@ func schema_k8sio_apimachinery_pkg_runtime_Unknown(ref common.ReferenceCallback) "ContentEncoding": { SchemaProps: spec.SchemaProps{ Description: "ContentEncoding is encoding used to encode 'Raw' data. Unspecified means no encoding.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -3443,6 +3595,7 @@ func schema_k8sio_apimachinery_pkg_runtime_Unknown(ref common.ReferenceCallback) "ContentType": { SchemaProps: spec.SchemaProps{ Description: "ContentType is serialization method used to serialize 'Raw'. Unspecified means ContentTypeJSON.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -3463,56 +3616,65 @@ func schema_k8sio_apimachinery_pkg_version_Info(ref common.ReferenceCallback) co Properties: map[string]spec.Schema{ "major": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "minor": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "gitVersion": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "gitCommit": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "gitTreeState": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "buildDate": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "goVersion": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "compiler": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "platform": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, diff --git a/scripts/add_release_annotation.sh b/scripts/add_release_annotation.sh index b12d2cc7d3..d205d0fa92 100755 --- a/scripts/add_release_annotation.sh +++ b/scripts/add_release_annotation.sh @@ -8,5 +8,5 @@ chartdir=$1 yq=$2 for f in $chartdir/*.yaml; do - $yq w --inplace $f 'metadata.annotations['include.release.openshift.io/self-managed-high-availability']' true + $yq w --inplace --style=double $f 'metadata.annotations['include.release.openshift.io/self-managed-high-availability']' true done diff --git a/test/e2e/catalog_e2e_test.go b/test/e2e/catalog_e2e_test.go index 2d77e18eb6..e4a92297d5 100644 --- a/test/e2e/catalog_e2e_test.go +++ b/test/e2e/catalog_e2e_test.go @@ -10,7 +10,7 @@ import ( "strings" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" appsv1 "k8s.io/api/apps/v1" diff --git a/test/e2e/crd_e2e_test.go b/test/e2e/crd_e2e_test.go index 5c74f511cc..db2470423c 100644 --- a/test/e2e/crd_e2e_test.go +++ b/test/e2e/crd_e2e_test.go @@ -5,7 +5,7 @@ import ( "fmt" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1" @@ -486,7 +486,6 @@ var _ = Describe("CRD Versions", func() { crc.OperatorsV1alpha1().ClusterServiceVersions(testNamespace).Delete(context.TODO(), mainPackageStable, metav1.DeleteOptions{}) Expect(err).ToNot(HaveOccurred(), "error deleting old subscription") - // recreate subscription subscriptionNameNew := genName("sub-nginx-update2-new-") _ = createSubscriptionForCatalog(crc, testNamespace, subscriptionNameNew, mainCatalogName, mainPackageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic) diff --git a/test/e2e/csv_e2e_test.go b/test/e2e/csv_e2e_test.go index 040392d178..0a6a838505 100644 --- a/test/e2e/csv_e2e_test.go +++ b/test/e2e/csv_e2e_test.go @@ -85,8 +85,7 @@ var _ = Describe("ClusterServiceVersion", func() { Expect(ctx.Ctx().Client().Create(context.Background(), &original)).To(Succeed()) Eventually(func() error { - key, err := client.ObjectKeyFromObject(&original) - Expect(err).ToNot(HaveOccurred()) + key := client.ObjectKeyFromObject(&original) key.Namespace = target.GetName() return ctx.Ctx().Client().Get(context.Background(), key, ©) }).Should(Succeed()) @@ -100,10 +99,7 @@ var _ = Describe("ClusterServiceVersion", func() { It("is synchronized with the original csv", func() { Eventually(func() error { - key, err := client.ObjectKeyFromObject(©) - if err != nil { - return err - } + key := client.ObjectKeyFromObject(©) key.Namespace = target.Name if err := ctx.Ctx().Client().Get(context.Background(), key, ©); err != nil { @@ -115,10 +111,7 @@ var _ = Describe("ClusterServiceVersion", func() { }).Should(Succeed()) Eventually(func() (bool, error) { - key, err := client.ObjectKeyFromObject(&original) - if err != nil { - return false, err - } + key := client.ObjectKeyFromObject(&original) if err := ctx.Ctx().Client().Get(context.Background(), key, &original); err != nil { return false, err @@ -1313,28 +1306,42 @@ var _ = Describe("ClusterServiceVersion", func() { Expect(err).ShouldNot(HaveOccurred(), "error getting expected APIService") // Should create Service - _, err = c.GetService(testNamespace, serviceName) - Expect(err).ShouldNot(HaveOccurred(), "error getting expected Service") + Eventually(func() error { + _, err := c.GetService(testNamespace, serviceName) + return err + }, timeout, interval).ShouldNot(HaveOccurred()) // Should create certificate Secret secretName = fmt.Sprintf("%s-cert", serviceName) - _, err = c.GetSecret(testNamespace, secretName) - Expect(err).ShouldNot(HaveOccurred(), "error getting expected Secret") + Eventually(func() error { + _, err = c.GetSecret(testNamespace, secretName) + return err + }, timeout, interval).ShouldNot(HaveOccurred()) // Should create a Role for the Secret _, err = c.GetRole(testNamespace, secretName) - Expect(err).ShouldNot(HaveOccurred(), "error getting expected Secret Role") + Eventually(func() error { + _, err = c.GetRole(testNamespace, secretName) + return err + }, timeout, interval).ShouldNot(HaveOccurred()) // Should create a RoleBinding for the Secret - _, err = c.GetRoleBinding(testNamespace, secretName) - Expect(err).ShouldNot(HaveOccurred(), "error getting exptected Secret RoleBinding") + Eventually(func() error { + _, err = c.GetRoleBinding(testNamespace, secretName) + return err + }, timeout, interval).ShouldNot(HaveOccurred()) // Should create a system:auth-delegator Cluster RoleBinding - _, err = c.GetClusterRoleBinding(fmt.Sprintf("%s-system:auth-delegator", serviceName)) - Expect(err).ShouldNot(HaveOccurred(), "error getting expected system:auth-delegator ClusterRoleBinding") + Eventually(func() error { + _, err = c.GetClusterRoleBinding(fmt.Sprintf("%s-system:auth-delegator", serviceName)) + return err + }, timeout, interval).ShouldNot(HaveOccurred()) // Should create an extension-apiserver-authentication-reader RoleBinding in kube-system - _, err = c.GetRoleBinding("kube-system", fmt.Sprintf("%s-auth-reader", serviceName)) + Eventually(func() error { + _, err = c.GetRoleBinding("kube-system", fmt.Sprintf("%s-auth-reader", serviceName)) + return err + }, timeout, interval).ShouldNot(HaveOccurred()) Expect(err).ShouldNot(HaveOccurred(), "error getting expected extension-apiserver-authentication-reader RoleBinding") // Should eventually GC the CSV diff --git a/test/e2e/gc_e2e_test.go b/test/e2e/gc_e2e_test.go index 75e063f677..bfe8fda885 100644 --- a/test/e2e/gc_e2e_test.go +++ b/test/e2e/gc_e2e_test.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - "github.com/blang/semver" + "github.com/blang/semver/v4" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" . "github.com/operator-framework/operator-lifecycle-manager/test/e2e/dsl" diff --git a/test/e2e/installplan_e2e_test.go b/test/e2e/installplan_e2e_test.go index c7824e2066..c16d7fe22b 100644 --- a/test/e2e/installplan_e2e_test.go +++ b/test/e2e/installplan_e2e_test.go @@ -10,7 +10,7 @@ import ( "sync" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" . "github.com/onsi/ginkgo" "github.com/onsi/ginkgo/extensions/table" . "github.com/onsi/gomega" @@ -117,8 +117,7 @@ var _ = Describe("Install Plan", func() { Expect(ctx.Ctx().Client().Create(context.Background(), plan)).To(Succeed()) Expect(ctx.Ctx().Client().Status().Update(context.Background(), plan)).To(Succeed()) - key, err := runtimeclient.ObjectKeyFromObject(plan) - Expect(err).ToNot(HaveOccurred()) + key := runtimeclient.ObjectKeyFromObject(plan) HavePhase := func(goal operatorsv1alpha1.InstallPlanPhase) types.GomegaMatcher { return WithTransform(func(plan *operatorsv1alpha1.InstallPlan) operatorsv1alpha1.InstallPlanPhase { @@ -223,11 +222,12 @@ var _ = Describe("Install Plan", func() { // Fetch installplan again to check for unnecessary control loops fetchedInstallPlan, err = fetchInstallPlan(GinkgoT(), crc, fetchedInstallPlan.GetName(), func(fip *operatorsv1alpha1.InstallPlan) bool { - compareResources(GinkgoT(), fetchedInstallPlan, fip) + // Don't compare object meta as labels can be applied by the operator controller. + compareResources(GinkgoT(), fetchedInstallPlan.Spec, fip.Spec) + compareResources(GinkgoT(), fetchedInstallPlan.Status, fip.Status) return true }) require.NoError(GinkgoT(), err) - require.Equal(GinkgoT(), len(expectedStepSources), len(fetchedInstallPlan.Status.Plan), "Number of resolved steps matches the number of expected steps") // Ensure resolved step resources originate from the correct catalog sources @@ -2112,6 +2112,12 @@ var _ = Describe("Install Plan", func() { APIGroups: []string{"cluster.com"}, Resources: []string{crdPlural}, }, + // Permissions must be different than ClusterPermissions defined below if OLM is going to lift role/rolebindings to cluster level. + { + Verbs: []string{rbac.VerbAll}, + APIGroups: []string{corev1.GroupName}, + Resources: []string{corev1.ResourceConfigMaps.String()}, + }, }, }, } @@ -2206,6 +2212,7 @@ var _ = Describe("Install Plan", func() { } return true, nil }) + require.NoError(GinkgoT(), err) } if step.Resource.Kind == "RoleBinding" { err = wait.Poll(pollInterval, pollDuration, func() (bool, error) { @@ -2218,6 +2225,7 @@ var _ = Describe("Install Plan", func() { } return true, nil }) + require.NoError(GinkgoT(), err) } } @@ -2239,16 +2247,10 @@ var _ = Describe("Install Plan", func() { GinkgoT().Logf("Monitoring cluster role binding %v", binding.GetName()) } - // can't query by owner reference, so just use the name we know is in the install plan - createdServiceAccountNames := map[string]struct{}{serviceAccountName: {}} - GinkgoT().Logf("Monitoring service account %v", serviceAccountName) - crWatcher, err := c.KubernetesInterface().RbacV1().ClusterRoles().Watch(context.TODO(), metav1.ListOptions{LabelSelector: fmt.Sprintf("%v=%v", ownerutil.OwnerKey, stableCSVName)}) require.NoError(GinkgoT(), err) crbWatcher, err := c.KubernetesInterface().RbacV1().ClusterRoleBindings().Watch(context.TODO(), metav1.ListOptions{LabelSelector: fmt.Sprintf("%v=%v", ownerutil.OwnerKey, stableCSVName)}) require.NoError(GinkgoT(), err) - saWatcher, err := c.KubernetesInterface().CoreV1().ServiceAccounts(testNamespace).Watch(context.TODO(), metav1.ListOptions{}) - require.NoError(GinkgoT(), err) done := make(chan struct{}) errExit := make(chan error) @@ -2267,7 +2269,7 @@ var _ = Describe("Install Plan", func() { continue } delete(createdClusterRoleNames, cr.GetName()) - if len(createdClusterRoleNames) == 0 && len(createdClusterRoleBindingNames) == 0 && len(createdServiceAccountNames) == 0 { + if len(createdClusterRoleNames) == 0 && len(createdClusterRoleBindingNames) == 0 { done <- struct{}{} return } @@ -2283,23 +2285,7 @@ var _ = Describe("Install Plan", func() { continue } delete(createdClusterRoleBindingNames, crb.GetName()) - if len(createdClusterRoleNames) == 0 && len(createdClusterRoleBindingNames) == 0 && len(createdServiceAccountNames) == 0 { - done <- struct{}{} - return - } - } - case evt, ok := <-saWatcher.ResultChan(): - if !ok { - errExit <- errors.New("sa watch channel closed unexpectedly") - return - } - if evt.Type == watch.Deleted { - sa, ok := evt.Object.(*corev1.ServiceAccount) - if !ok { - continue - } - delete(createdServiceAccountNames, sa.GetName()) - if len(createdClusterRoleNames) == 0 && len(createdClusterRoleBindingNames) == 0 && len(createdServiceAccountNames) == 0 { + if len(createdClusterRoleNames) == 0 && len(createdClusterRoleBindingNames) == 0 { done <- struct{}{} return } @@ -2321,7 +2307,17 @@ var _ = Describe("Install Plan", func() { require.Emptyf(GinkgoT(), createdClusterRoleNames, "unexpected cluster role remain: %v", createdClusterRoleNames) require.Emptyf(GinkgoT(), createdClusterRoleBindingNames, "unexpected cluster role binding remain: %v", createdClusterRoleBindingNames) - require.Emptyf(GinkgoT(), createdServiceAccountNames, "unexpected service account remain: %v", createdServiceAccountNames) + + Eventually(func() error { + _, err := c.GetServiceAccount(testNamespace, serviceAccountName) + if err == nil { + return fmt.Errorf("The %v/%v ServiceAccount should have been deleted", testNamespace, serviceAccountName) + } + if !k8serrors.IsNotFound(err) { + return err + } + return nil + }, timeout, interval).Should(BeNil()) }) It("CRD validation", func() { @@ -2958,7 +2954,7 @@ func newCRD(plural string) apiextensions.CustomResourceDefinition { func newCSV(name, namespace, replaces string, version semver.Version, owned []apiextensions.CustomResourceDefinition, required []apiextensions.CustomResourceDefinition, namedStrategy *operatorsv1alpha1.NamedInstallStrategy) operatorsv1alpha1.ClusterServiceVersion { csvType = metav1.TypeMeta{ Kind: operatorsv1alpha1.ClusterServiceVersionKind, - APIVersion: operatorsv1alpha1.GroupVersion, + APIVersion: operatorsv1alpha1.SchemeGroupVersion.String(), } // set a simple default strategy if none given diff --git a/test/e2e/operator_condition_e2e_test.go b/test/e2e/operator_condition_e2e_test.go index 30e75b5254..2e804cff45 100644 --- a/test/e2e/operator_condition_e2e_test.go +++ b/test/e2e/operator_condition_e2e_test.go @@ -3,7 +3,7 @@ package e2e import ( "context" - "github.com/blang/semver" + "github.com/blang/semver/v4" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "github.com/stretchr/testify/require" diff --git a/test/e2e/operator_groups_e2e_test.go b/test/e2e/operator_groups_e2e_test.go index 92b4c4a09f..bdda2a5d65 100644 --- a/test/e2e/operator_groups_e2e_test.go +++ b/test/e2e/operator_groups_e2e_test.go @@ -6,7 +6,7 @@ import ( "strings" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "github.com/stretchr/testify/require" diff --git a/test/e2e/packagemanifest_e2e_test.go b/test/e2e/packagemanifest_e2e_test.go index 91610025a7..2bf2b7d2ee 100644 --- a/test/e2e/packagemanifest_e2e_test.go +++ b/test/e2e/packagemanifest_e2e_test.go @@ -5,7 +5,7 @@ import ( "encoding/base64" "encoding/json" - "github.com/blang/semver" + "github.com/blang/semver/v4" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" diff --git a/test/e2e/subscription_e2e_test.go b/test/e2e/subscription_e2e_test.go index 6a6d97d799..644ba5ade4 100644 --- a/test/e2e/subscription_e2e_test.go +++ b/test/e2e/subscription_e2e_test.go @@ -9,7 +9,7 @@ import ( "sync" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/ghodss/yaml" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" diff --git a/test/e2e/user_defined_sa_test.go b/test/e2e/user_defined_sa_test.go index bc08a01f03..a0ce539caf 100644 --- a/test/e2e/user_defined_sa_test.go +++ b/test/e2e/user_defined_sa_test.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - "github.com/blang/semver" + "github.com/blang/semver/v4" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" v1 "github.com/operator-framework/api/pkg/operators/v1" diff --git a/tools.go b/tools.go index d9db2974df..387556b9de 100644 --- a/tools.go +++ b/tools.go @@ -5,6 +5,7 @@ package tools import ( _ "github.com/go-bindata/go-bindata/v3/go-bindata/" _ "github.com/golang/mock/mockgen" + _ "github.com/googleapis/gnostic" _ "github.com/maxbrunsfeld/counterfeiter/v6" _ "github.com/mikefarah/yq/v3" _ "github.com/onsi/ginkgo/ginkgo" diff --git a/vendor/cloud.google.com/go/compute/metadata/.repo-metadata.json b/vendor/cloud.google.com/go/compute/metadata/.repo-metadata.json deleted file mode 100644 index ca022ccc41..0000000000 --- a/vendor/cloud.google.com/go/compute/metadata/.repo-metadata.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "metadata", - "name_pretty": "Google Compute Engine Metadata API", - "product_documentation": "https://cloud.google.com/compute/docs/storing-retrieving-metadata", - "client_documentation": "https://godoc.org/cloud.google.com/go/compute/metadata", - "release_level": "ga", - "language": "go", - "repo": "googleapis/google-cloud-go", - "distribution_name": "cloud.google.com/go/compute/metadata", - "api_id": "compute:metadata", - "requires_billing": false -} diff --git a/vendor/cloud.google.com/go/compute/metadata/metadata.go b/vendor/cloud.google.com/go/compute/metadata/metadata.go index 0b50c2a7a6..1a7a4c7e57 100644 --- a/vendor/cloud.google.com/go/compute/metadata/metadata.go +++ b/vendor/cloud.google.com/go/compute/metadata/metadata.go @@ -61,25 +61,14 @@ var ( instID = &cachedValue{k: "instance/id", trim: true} ) -var ( - defaultClient = &Client{hc: &http.Client{ - Transport: &http.Transport{ - Dial: (&net.Dialer{ - Timeout: 2 * time.Second, - KeepAlive: 30 * time.Second, - }).Dial, - ResponseHeaderTimeout: 2 * time.Second, - }, - }} - subscribeClient = &Client{hc: &http.Client{ - Transport: &http.Transport{ - Dial: (&net.Dialer{ - Timeout: 2 * time.Second, - KeepAlive: 30 * time.Second, - }).Dial, - }, - }} -) +var defaultClient = &Client{hc: &http.Client{ + Transport: &http.Transport{ + Dial: (&net.Dialer{ + Timeout: 2 * time.Second, + KeepAlive: 30 * time.Second, + }).Dial, + }, +}} // NotDefinedError is returned when requested metadata is not defined. // @@ -206,10 +195,9 @@ func systemInfoSuggestsGCE() bool { return name == "Google" || name == "Google Compute Engine" } -// Subscribe calls Client.Subscribe on a client designed for subscribing (one with no -// ResponseHeaderTimeout). +// Subscribe calls Client.Subscribe on the default client. func Subscribe(suffix string, fn func(v string, ok bool) error) error { - return subscribeClient.Subscribe(suffix, fn) + return defaultClient.Subscribe(suffix, fn) } // Get calls Client.Get on the default client. @@ -280,9 +268,14 @@ type Client struct { hc *http.Client } -// NewClient returns a Client that can be used to fetch metadata. All HTTP requests -// will use the given http.Client instead of the default client. +// NewClient returns a Client that can be used to fetch metadata. +// Returns the client that uses the specified http.Client for HTTP requests. +// If nil is specified, returns the default client. func NewClient(c *http.Client) *Client { + if c == nil { + return defaultClient + } + return &Client{hc: c} } diff --git a/vendor/github.com/Azure/go-autorest/.gitignore b/vendor/github.com/Azure/go-autorest/.gitignore new file mode 100644 index 0000000000..3350aaf706 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/.gitignore @@ -0,0 +1,32 @@ +# The standard Go .gitignore file follows. (Sourced from: github.com/github/gitignore/master/Go.gitignore) +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test +.DS_Store +.idea/ +.vscode/ + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof + +# go-autorest specific +vendor/ +autorest/azure/example/example diff --git a/vendor/github.com/Azure/go-autorest/CHANGELOG.md b/vendor/github.com/Azure/go-autorest/CHANGELOG.md new file mode 100644 index 0000000000..d1f596bfc9 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/CHANGELOG.md @@ -0,0 +1,1004 @@ +# CHANGELOG + +## v14.2.0 + +- Added package comment to make `github.com/Azure/go-autorest` importable. + +## v14.1.1 + +### Bug Fixes + +- Change `x-ms-authorization-auxiliary` header value separator to comma. + +## v14.1.0 + +### New Features + +- Added `azure.SetEnvironment()` that will update the global environments map with the specified values. + +## v14.0.1 + +### Bug Fixes + +- Fix race condition when refreshing token. +- Fixed some tests to work with Go 1.14. + +## v14.0.0 + +## Breaking Changes + +- By default, the `DoRetryForStatusCodes` functions will no longer infinitely retry a request when the response returns an HTTP status code of 429 (StatusTooManyRequests). To opt in to the old behavior set `autorest.Count429AsRetry` to `false`. + +## New Features + +- Variable `autorest.Max429Delay` can be used to control the maximum delay between retries when a 429 is received with no `Retry-After` header. The default is zero which means there is no cap. + +## v13.4.0 + +## New Features + +- Added field `SendDecorators` to the `Client` type. This can be used to specify a custom chain of SendDecorators per client. +- Added method `Client.Send()` which includes logic for selecting the preferred chain of SendDecorators. + +## v13.3.3 + +### Bug Fixes + +- Fixed connection leak when retrying requests. +- Enabled exponential back-off with a 2-minute cap when retrying on 429. +- Fixed some cases where errors were inadvertently dropped. + +## v13.3.2 + +### Bug Fixes + +- Updated `autorest.AsStringSlice()` to convert slice elements to their string representation. + +## v13.3.1 + +- Updated external dependencies. + +### Bug Fixes + +## v13.3.0 + +### New Features + +- Added support for shared key and shared access signature token authorization. + - `autorest.NewSharedKeyAuthorizer()` and dependent types. + - `autorest.NewSASTokenAuthorizer()` and dependent types. +- Added `ServicePrincipalToken.SetCustomRefresh()` so a custom refresh function can be invoked when a token has expired. + +### Bug Fixes + +- Fixed `cli.AccessTokensPath()` to respect `AZURE_CONFIG_DIR` when set. +- Support parsing error messages in XML responses. + +## v13.2.0 + +### New Features + +- Added the following functions to replace their versions that don't take a context. + - `adal.InitiateDeviceAuthWithContext()` + - `adal.CheckForUserCompletionWithContext()` + - `adal.WaitForUserCompletionWithContext()` + +## v13.1.0 + +### New Features + +- Added support for MSI authentication on Azure App Service and Azure Functions. + +## v13.0.2 + +### Bug Fixes + +- Always retry a request even if the sender returns a non-nil error. + +## v13.0.1 + +## Bug Fixes + +- Fixed `autorest.WithQueryParameters()` so that it properly encodes multi-value query parameters. + +## v13.0.0 + +## Breaking Changes + +The `tracing` package has been rewritten to provide a common interface for consumers to wire in the tracing package of their choice. +What this means is that by default no tracing provider will be compiled into your program and setting the `AZURE_SDK_TRACING_ENABLED` +environment variable will have no effect. To enable this previous behavior you must now add the following import to your source file. +```go + import _ "github.com/Azure/go-autorest/tracing/opencensus" +``` +The APIs required by autorest-generated code have remained but some APIs have been removed and new ones added. +The following APIs and variables have been removed (the majority of them were moved to the `opencensus` package). +- tracing.Transport +- tracing.Enable() +- tracing.EnableWithAIForwarding() +- tracing.Disable() + +The following APIs and types have been added +- tracing.Tracer +- tracing.Register() + +To hook up a tracer simply call `tracing.Register()` passing in a type that satisfies the `tracing.Tracer` interface. + +## v12.4.3 + +### Bug Fixes + +- `autorest.MultiTenantServicePrincipalTokenAuthorizer` will now properly add its auxiliary bearer tokens. + +## v12.4.2 + +### Bug Fixes + +- Improvements to the fixes made in v12.4.1. + - Remove `override` stanza from Gopkg.toml and `replace` directive from go.mod as they don't apply when being consumed as a dependency. + - Switched to latest version of `ocagent` that still depends on protobuf v1.2. + - Add indirect dependencies to the `required` clause with matching `constraint` stanzas so that `dep` dependencies match go.sum. + +## v12.4.1 + +### Bug Fixes + +- Updated OpenCensus and OCAgent versions to versions that don't depend on v1.3+ of protobuf as it was breaking kubernetes. +- Pinned opencensus-proto to a version that's compatible with our versions of OpenCensus and OCAgent. + +## v12.4.0 + +### New Features + +- Added `autorest.WithPrepareDecorators` and `autorest.GetPrepareDecorators` for adding and retrieving a custom chain of PrepareDecorators to the provided context. + +## v12.3.0 + +### New Features + +- Support for multi-tenant via x-ms-authorization-auxiliary header has been added for client credentials with + secret scenario; this basically bundles multiple OAuthConfig and ServicePrincipalToken types into corresponding + MultiTenant* types along with a new authorizer that adds the primary and auxiliary token headers to the reqest. + The authenticaion helpers have been updated to support this scenario; if environment var AZURE_AUXILIARY_TENANT_IDS + is set with a semicolon delimited list of tenants the multi-tenant codepath will kick in to create the appropriate authorizer. + See `adal.NewMultiTenantOAuthConfig`, `adal.NewMultiTenantServicePrincipalToken` and `autorest.NewMultiTenantServicePrincipalTokenAuthorizer` + along with their supporting types and methods. +- Added `autorest.WithSendDecorators` and `autorest.GetSendDecorators` for adding and retrieving a custom chain of SendDecorators to the provided context. +- Added `autorest.DoRetryForStatusCodesWithCap` and `autorest.DelayForBackoffWithCap` to enforce an upper bound on the duration between retries. + +## v12.2.0 + +### New Features + +- Added `autorest.WithXML`, `autorest.AsMerge`, `autorest.WithBytes` preparer decorators. +- Added `autorest.ByUnmarshallingBytes` response decorator. +- Added `Response.IsHTTPStatus` and `Response.HasHTTPStatus` helper methods for inspecting HTTP status code in `autorest.Response` types. + +### Bug Fixes + +- `autorest.DelayWithRetryAfter` now supports HTTP-Dates in the `Retry-After` header and is not limited to just 429 status codes. + +## v12.1.0 + +### New Features + +- Added `to.ByteSlicePtr()`. +- Added blob/queue storage resource ID to `azure.ResourceIdentifier`. + +## v12.0.0 + +### Breaking Changes + +In preparation for modules the following deprecated content has been removed. + + - async.NewFuture() + - async.Future.Done() + - async.Future.WaitForCompletion() + - async.DoPollForAsynchronous() + - The `utils` package + - validation.NewErrorWithValidationError() + - The `version` package + +## v11.9.0 + +### New Features + +- Add `ResourceIdentifiers` field to `azure.Environment` containing resource IDs for public and sovereign clouds. + +## v11.8.0 + +### New Features + +- Added `autorest.NewClientWithOptions()` to support endpoints that require free renegotiation. + +## v11.7.1 + +### Bug Fixes + +- Fix missing support for http(s) proxy when using the default sender. + +## v11.7.0 + +### New Features + +- Added methods to obtain a ServicePrincipalToken on the various credential configuration types in the `auth` package. + +## v11.6.1 + +### Bug Fixes + +- Fix ACR DNS endpoint for government clouds. +- Add Cosmos DB DNS endpoints. +- Update dependencies to resolve build breaks in OpenCensus. + +## v11.6.0 + +### New Features + +- Added type `autorest.BasicAuthorizer` to support Basic authentication. + +## v11.5.2 + +### Bug Fixes + +- Fixed `GetTokenFromCLI` did not work with zsh. + +## v11.5.1 + +### Bug Fixes + +- In `Client.sender()` set the minimum TLS version on HTTP clients to 1.2. + +## v11.5.0 + +### New Features + +- The `auth` package has been refactored so that the environment and file settings are now available. +- The methods used in `auth.NewAuthorizerFromEnvironment()` are now exported so that custom authorization chains can be created. +- Added support for certificate authorization for file-based config. + +## v11.4.0 + +### New Features + +- Added `adal.AddToUserAgent()` so callers can append custom data to the user-agent header used for ADAL requests. +- Exported `adal.UserAgent()` for parity with `autorest.Client`. + +## v11.3.2 + +### Bug Fixes + +- In `Future.WaitForCompletionRef()` if the provided context has a deadline don't add the default deadline. + +## v11.3.1 + +### Bug Fixes + +- For an LRO PUT operation the final GET URL was incorrectly set to the Location polling header in some cases. + +## v11.3.0 + +### New Features + +- Added method `ServicePrincipalToken()` to `DeviceFlowConfig` type. + +## v11.2.8 + +### Bug Fixes + +- Deprecate content in the `version` package. The functionality has been superseded by content in the `autorest` package. + +## v11.2.7 + +### Bug Fixes + +- Fix environment variable name for enabling tracing from `AZURE_SDK_TRACING_ENABELD` to `AZURE_SDK_TRACING_ENABLED`. + Note that for backward compatibility reasons, both will work until the next major version release of the package. + +## v11.2.6 + +### Bug Fixes + +- If zero bytes are read from a polling response body don't attempt to unmarshal them. + +## v11.2.5 + +### Bug Fixes + +- Removed race condition in `autorest.DoRetryForStatusCodes`. + +## v11.2.4 + +### Bug Fixes + +- Function `cli.ProfilePath` now respects environment `AZURE_CONFIG_DIR` if available. + +## v11.2.1 + +NOTE: Versions of Go prior to 1.10 have been removed from CI as they no +longer work with golint. + +### Bug Fixes + +- Method `MSIConfig.Authorizer` now supports user-assigned identities. +- The adal package now reports its own user-agent string. + +## v11.2.0 + +### New Features + +- Added `tracing` package that enables instrumentation of HTTP and API calls. + Setting the env variable `AZURE_SDK_TRACING_ENABLED` or calling `tracing.Enable` + will start instrumenting the code for metrics and traces. + Additionally, setting the env variable `OCAGENT_TRACE_EXPORTER_ENDPOINT` or + calling `tracing.EnableWithAIForwarding` will start the instrumentation and connect to an + App Insights Local Forwarder that is needs to be running. Note that if the + AI Local Forwarder is not running tracking will still be enabled. + By default, instrumentation is disabled. Once enabled, instrumentation can also + be programatically disabled by calling `Disable`. +- Added `DoneWithContext` call for checking LRO status. `Done` has been deprecated. + +### Bug Fixes + +- Don't use the initial request's context for LRO polling. +- Don't override the `refreshLock` and the `http.Client` when unmarshalling `ServicePrincipalToken` if + it is already set. + +## v11.1.1 + +### Bug Fixes + +- When creating a future always include the polling tracker even if there's a failure; this allows the underlying response to be obtained by the caller. + +## v11.1.0 + +### New Features + +- Added `auth.NewAuthorizerFromCLI` to create an authorizer configured from the Azure 2.0 CLI. +- Added `adal.NewOAuthConfigWithAPIVersion` to create an OAuthConfig with the specified API version. + +## v11.0.1 + +### New Features + +- Added `x5c` header to client assertion for certificate Issuer+Subject Name authentication. + +## v11.0.0 + +### Breaking Changes + +- To handle differences between ADFS and AAD the following fields have had their types changed from `string` to `json.Number` + - ExpiresIn + - ExpiresOn + - NotBefore + +### New Features + +- Added `auth.NewAuthorizerFromFileWithResource` to create an authorizer from the config file with the specified resource. +- Setting a client's `PollingDuration` to zero will use the provided context to control a LRO's polling duration. + +## v10.15.5 + +### Bug Fixes + +- In `DoRetryForStatusCodes`, if a request's context is cancelled return the last response. + +## v10.15.4 + +### Bug Fixes + +- If a polling operation returns a failure status code return the associated error. + +## v10.15.3 + +### Bug Fixes + +- Initialize the polling URL and method for an LRO tracker on each iteration, favoring the Azure-AsyncOperation header. + +## v10.15.2 + +### Bug Fixes + +- Use fmt.Fprint when printing request/response so that any escape sequences aren't treated as format specifiers. + +## v10.15.1 + +### Bug Fixes + +- If an LRO API returns a `Failed` provisioning state in the initial response return an error at that point so the caller doesn't have to poll. +- For failed LROs without an OData v4 error include the response body in the error's `AdditionalInfo` field to aid in diagnosing the failure. + +## v10.15.0 + +### New Features + +- Add initial support for request/response logging via setting environment variables. + Setting `AZURE_GO_SDK_LOG_LEVEL` to `LogInfo` will log request/response + without their bodies. To include the bodies set the log level to `LogDebug`. + By default the logger writes to strerr, however it can also write to stdout or a file + if specified in `AZURE_GO_SDK_LOG_FILE`. Note that if the specified file + already exists it will be truncated. + IMPORTANT: by default the logger will redact the Authorization and Ocp-Apim-Subscription-Key + headers. Any other secrets will _not_ be redacted. + +## v10.14.0 + +### New Features + +- Added package version that contains version constants and user-agent data. + +### Bug Fixes + +- Add the user-agent to token requests. + +## v10.13.0 + +- Added support for additionalInfo in ServiceError type. + +## v10.12.0 + +### New Features + +- Added field ServicePrincipalToken.MaxMSIRefreshAttempts to configure the maximun number of attempts to refresh an MSI token. + +## v10.11.4 + +### Bug Fixes + +- If an LRO returns http.StatusOK on the initial response with no async headers return the response body from Future.GetResult(). +- If there is no "final GET URL" return an error from Future.GetResult(). + +## v10.11.3 + +### Bug Fixes + +- In IMDS retry logic, if we don't receive a response don't retry. + - Renamed the retry function so it's clear it's meant for IMDS only. +- For error response bodies that aren't OData-v4 compliant stick the raw JSON in the ServiceError.Details field so the information isn't lost. + - Also add the raw HTTP response to the DetailedResponse. +- Removed superfluous wrapping of response error in azure.DoRetryWithRegistration(). + +## v10.11.2 + +### Bug Fixes + +- Validation for integers handles int and int64 types. + +## v10.11.1 + +### Bug Fixes + +- Adding User information to authorization config as parsed from CLI cache. + +## v10.11.0 + +### New Features + +- Added NewServicePrincipalTokenFromManualTokenSecret for creating a new SPT using a manual token and secret +- Added method ServicePrincipalToken.MarshalTokenJSON() to marshall the inner Token + +## v10.10.0 + +### New Features + +- Most ServicePrincipalTokens can now be marshalled/unmarshall to/from JSON (ServicePrincipalCertificateSecret and ServicePrincipalMSISecret are not supported). +- Added method ServicePrincipalToken.SetRefreshCallbacks(). + +## v10.9.2 + +### Bug Fixes + +- Refreshing a refresh token obtained from a web app authorization code now works. + +## v10.9.1 + +### Bug Fixes + +- The retry logic for MSI token requests now uses exponential backoff per the guidelines. +- IsTemporaryNetworkError() will return true for errors that don't implement the net.Error interface. + +## v10.9.0 + +### Deprecated Methods + +| Old Method | New Method | +| -------------------------: | :---------------------------: | +| azure.NewFuture() | azure.NewFutureFromResponse() | +| Future.WaitForCompletion() | Future.WaitForCompletionRef() | + +### New Features + +- Added azure.NewFutureFromResponse() for creating a Future from the initial response from an async operation. +- Added Future.GetResult() for making the final GET call to retrieve the result from an async operation. + +### Bug Fixes + +- Some futures failed to return their results, this should now be fixed. + +## v10.8.2 + +### Bug Fixes + +- Add nil-gaurd to token retry logic. + +## v10.8.1 + +### Bug Fixes + +- Return a TokenRefreshError if the sender fails on the initial request. +- Don't retry on non-temporary network errors. + +## v10.8.0 + +- Added NewAuthorizerFromEnvironmentWithResource() helper function. + +## v10.7.0 + +### New Features + +- Added \*WithContext() methods to ADAL token refresh operations. + +## v10.6.2 + +- Fixed a bug on device authentication. + +## v10.6.1 + +- Added retries to MSI token get request. + +## v10.6.0 + +- Changed MSI token implementation. Now, the token endpoint is the IMDS endpoint. + +## v10.5.1 + +### Bug Fixes + +- `DeviceFlowConfig.Authorizer()` now prints the device code message when running `go test`. `-v` flag is required. + +## v10.5.0 + +### New Features + +- Added NewPollingRequestWithContext() for use with polling asynchronous operations. + +### Bug Fixes + +- Make retry logic use the request's context instead of the deprecated Cancel object. + +## v10.4.0 + +### New Features + +- Added helper for parsing Azure Resource ID's. +- Added deprecation message to utils.GetEnvVarOrExit() + +## v10.3.0 + +### New Features + +- Added EnvironmentFromURL method to load an Environment from a given URL. This function is particularly useful in the private and hybrid Cloud model, where one may define their own endpoints +- Added TokenAudience endpoint to Environment structure. This is useful in private and hybrid cloud models where TokenAudience endpoint can be different from ResourceManagerEndpoint + +## v10.2.0 + +### New Features + +- Added endpoints for batch management. + +## v10.1.3 + +### Bug Fixes + +- In Client.Do() invoke WithInspection() last so that it will inspect WithAuthorization(). +- Fixed authorization methods to invoke p.Prepare() first, aligning them with the other preparers. + +## v10.1.2 + +- Corrected comment for auth.NewAuthorizerFromFile() function. + +## v10.1.1 + +- Updated version number to match current release. + +## v10.1.0 + +### New Features + +- Expose the polling URL for futures. + +### Bug Fixes + +- Add validation.NewErrorWithValidationError back to prevent breaking changes (it is deprecated). + +## v10.0.0 + +### New Features + +- Added target and innererror fields to ServiceError to comply with OData v4 spec. +- The Done() method on futures will now return a ServiceError object when available (it used to return a partial value of such errors). +- Added helper methods for obtaining authorizers. +- Expose the polling URL for futures. + +### Bug Fixes + +- Switched from glide to dep for dependency management. +- Fixed unmarshaling of ServiceError for JSON bodies that don't conform to the OData spec. +- Fixed a race condition in token refresh. + +### Breaking Changes + +- The ServiceError.Details field type has been changed to match the OData v4 spec. +- Go v1.7 has been dropped from CI. +- API parameter validation failures will now return a unique error type validation.Error. +- The adal.Token type has been decomposed from adal.ServicePrincipalToken (this was necessary in order to fix the token refresh race). + +## v9.10.0 + +- Fix the Service Bus suffix in Azure public env +- Add Service Bus Endpoint (AAD ResourceURI) for use in [Azure Service Bus RBAC Preview](https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-role-based-access-control) + +## v9.9.0 + +### New Features + +- Added EventGridKeyAuthorizer for key authorization with event grid topics. + +### Bug Fixes + +- Fixed race condition when auto-refreshing service principal tokens. + +## v9.8.1 + +### Bug Fixes + +- Added http.StatusNoContent (204) to the list of expected status codes for long-running operations. +- Updated runtime version info so it's current. + +## v9.8.0 + +### New Features + +- Added type azure.AsyncOpIncompleteError to be returned from a future's Result() method when the operation has not completed. + +## v9.7.1 + +### Bug Fixes + +- Use correct AAD and Graph endpoints for US Gov environment. + +## v9.7.0 + +### New Features + +- Added support for application/octet-stream MIME types. + +## v9.6.1 + +### Bug Fixes + +- Ensure Authorization header is added to request when polling for registration status. + +## v9.6.0 + +### New Features + +- Added support for acquiring tokens via MSI with a user assigned identity. + +## v9.5.3 + +### Bug Fixes + +- Don't remove encoding of existing URL Query parameters when calling autorest.WithQueryParameters. +- Set correct Content Type when using autorest.WithFormData. + +## v9.5.2 + +### Bug Fixes + +- Check for nil \*http.Response before dereferencing it. + +## v9.5.1 + +### Bug Fixes + +- Don't count http.StatusTooManyRequests (429) against the retry cap. +- Use retry logic when SkipResourceProviderRegistration is set to true. + +## v9.5.0 + +### New Features + +- Added support for username + password, API key, authoriazation code and cognitive services authentication. +- Added field SkipResourceProviderRegistration to clients to provide a way to skip auto-registration of RPs. +- Added utility function AsStringSlice() to convert its parameters to a string slice. + +### Bug Fixes + +- When checking for authentication failures look at the error type not the status code as it could vary. + +## v9.4.2 + +### Bug Fixes + +- Validate parameters when creating credentials. +- Don't retry requests if the returned status is a 401 (http.StatusUnauthorized) as it will never succeed. + +## v9.4.1 + +### Bug Fixes + +- Update the AccessTokensPath() to read access tokens path through AZURE_ACCESS_TOKEN_FILE. If this + environment variable is not set, it will fall back to use default path set by Azure CLI. +- Use case-insensitive string comparison for polling states. + +## v9.4.0 + +### New Features + +- Added WaitForCompletion() to Future as a default polling implementation. + +### Bug Fixes + +- Method Future.Done() shouldn't update polling status for unexpected HTTP status codes. + +## v9.3.1 + +### Bug Fixes + +- DoRetryForStatusCodes will retry if sender.Do returns a non-nil error. + +## v9.3.0 + +### New Features + +- Added PollingMethod() to Future so callers know what kind of polling mechanism is used. +- Added azure.ChangeToGet() which transforms an http.Request into a GET (to be used with LROs). + +## v9.2.0 + +### New Features + +- Added support for custom Azure Stack endpoints. +- Added type azure.Future used to track the status of long-running operations. + +### Bug Fixes + +- Preserve the original error in DoRetryWithRegistration when registration fails. + +## v9.1.1 + +- Fixes a bug regarding the cookie jar on `autorest.Client.Sender`. + +## v9.1.0 + +### New Features + +- In cases where there is a non-empty error from the service, attempt to unmarshal it instead of uniformly calling it an "Unknown" error. +- Support for loading Azure CLI Authentication files. +- Automatically register your subscription with the Azure Resource Provider if it hadn't been previously. + +### Bug Fixes + +- RetriableRequest can now tolerate a ReadSeekable body being read but not reset. +- Adding missing Apache Headers + +## v9.0.0 + +> **IMPORTANT:** This release was intially labeled incorrectly as `v8.4.0`. From the time it was released, it should have been marked `v9.0.0` because it contains breaking changes to the MSI packages. We appologize for any inconvenience this causes. + +Adding MSI Endpoint Support and CLI token rehydration. + +## v8.3.1 + +Pick up bug fix in adal for MSI support. + +## v8.3.0 + +Updates to Error string formats for clarity. Also, adding a copy of the http.Response to errors for an improved debugging experience. + +## v8.2.0 + +### New Features + +- Add support for bearer authentication callbacks +- Support 429 response codes that include "Retry-After" header +- Support validation constraint "Pattern" for map keys + +### Bug Fixes + +- Make RetriableRequest work with multiple versions of Go + +## v8.1.1 + +Updates the RetriableRequest to take advantage of GetBody() added in Go 1.8. + +## v8.1.0 + +Adds RetriableRequest type for more efficient handling of retrying HTTP requests. + +## v8.0.0 + +ADAL refactored into its own package. +Support for UNIX time. + +## v7.3.1 + +- Version Testing now removed from production bits that are shipped with the library. + +## v7.3.0 + +- Exposing new `RespondDecorator`, `ByDiscardingBody`. This allows operations + to acknowledge that they do not need either the entire or a trailing portion + of accepts response body. In doing so, Go's http library can reuse HTTP + connections more readily. +- Adding `PrepareDecorator` to target custom BaseURLs. +- Adding ACR suffix to public cloud environment. +- Updating Glide dependencies. + +## v7.2.5 + +- Fixed the Active Directory endpoint for the China cloud. +- Removes UTF-8 BOM if present in response payload. +- Added telemetry. + +## v7.2.3 + +- Fixing bug in calls to `DelayForBackoff` that caused doubling of delay + duration. + +## v7.2.2 + +- autorest/azure: added ASM and ARM VM DNS suffixes. + +## v7.2.1 + +- fixed parsing of UTC times that are not RFC3339 conformant. + +## v7.2.0 + +- autorest/validation: Reformat validation error for better error message. + +## v7.1.0 + +- preparer: Added support for multipart formdata - WithMultiPartFormdata() +- preparer: Added support for sending file in request body - WithFile +- client: Added RetryDuration parameter. +- autorest/validation: new package for validation code for Azure Go SDK. + +## v7.0.7 + +- Add trailing / to endpoint +- azure: add EnvironmentFromName + +## v7.0.6 + +- Add retry logic for 408, 500, 502, 503 and 504 status codes. +- Change url path and query encoding logic. +- Fix DelayForBackoff for proper exponential delay. +- Add CookieJar in Client. + +## v7.0.5 + +- Add check to start polling only when status is in [200,201,202]. +- Refactoring for unchecked errors. +- azure/persist changes. +- Fix 'file in use' issue in renewing token in deviceflow. +- Store header RetryAfter for subsequent requests in polling. +- Add attribute details in service error. + +## v7.0.4 + +- Better error messages for long running operation failures + +## v7.0.3 + +- Corrected DoPollForAsynchronous to properly handle the initial response + +## v7.0.2 + +- Corrected DoPollForAsynchronous to continue using the polling method first discovered + +## v7.0.1 + +- Fixed empty JSON input error in ByUnmarshallingJSON +- Fixed polling support for GET calls +- Changed format name from TimeRfc1123 to TimeRFC1123 + +## v7.0.0 + +- Added ByCopying responder with supporting TeeReadCloser +- Rewrote Azure asynchronous handling +- Reverted to only unmarshalling JSON +- Corrected handling of RFC3339 time strings and added support for Rfc1123 time format + +The `json.Decoder` does not catch bad data as thoroughly as `json.Unmarshal`. Since +`encoding/json` successfully deserializes all core types, and extended types normally provide +their custom JSON serialization handlers, the code has been reverted back to using +`json.Unmarshal`. The original change to use `json.Decode` was made to reduce duplicate +code; there is no loss of function, and there is a gain in accuracy, by reverting. + +Additionally, Azure services indicate requests to be polled by multiple means. The existing code +only checked for one of those (that is, the presence of the `Azure-AsyncOperation` header). +The new code correctly covers all cases and aligns with the other Azure SDKs. + +## v6.1.0 + +- Introduced `date.ByUnmarshallingJSONDate` and `date.ByUnmarshallingJSONTime` to enable JSON encoded values. + +## v6.0.0 + +- Completely reworked the handling of polled and asynchronous requests +- Removed unnecessary routines +- Reworked `mocks.Sender` to replay a series of `http.Response` objects +- Added `PrepareDecorators` for primitive types (e.g., bool, int32) + +Handling polled and asynchronous requests is no longer part of `Client#Send`. Instead new +`SendDecorators` implement different styles of polled behavior. See`autorest.DoPollForStatusCodes` +and `azure.DoPollForAsynchronous` for examples. + +## v5.0.0 + +- Added new RespondDecorators unmarshalling primitive types +- Corrected application of inspection and authorization PrependDecorators + +## v4.0.0 + +- Added support for Azure long-running operations. +- Added cancelation support to all decorators and functions that may delay. +- Breaking: `DelayForBackoff` now accepts a channel, which may be nil. + +## v3.1.0 + +- Add support for OAuth Device Flow authorization. +- Add support for ServicePrincipalTokens that are backed by an existing token, rather than other secret material. +- Add helpers for persisting and restoring Tokens. +- Increased code coverage in the github.com/Azure/autorest/azure package + +## v3.0.0 + +- Breaking: `NewErrorWithError` no longer takes `statusCode int`. +- Breaking: `NewErrorWithStatusCode` is replaced with `NewErrorWithResponse`. +- Breaking: `Client#Send()` no longer takes `codes ...int` argument. +- Add: XML unmarshaling support with `ByUnmarshallingXML()` +- Stopped vending dependencies locally and switched to [Glide](https://github.com/Masterminds/glide). + Applications using this library should either use Glide or vendor dependencies locally some other way. +- Add: `azure.WithErrorUnlessStatusCode()` decorator to handle Azure errors. +- Fix: use `net/http.DefaultClient` as base client. +- Fix: Missing inspection for polling responses added. +- Add: CopyAndDecode helpers. +- Improved `./autorest/to` with `[]string` helpers. +- Removed golint suppressions in .travis.yml. + +## v2.1.0 + +- Added `StatusCode` to `Error` for more easily obtaining the HTTP Reponse StatusCode (if any) + +## v2.0.0 + +- Changed `to.StringMapPtr` method signature to return a pointer +- Changed `ServicePrincipalCertificateSecret` and `NewServicePrincipalTokenFromCertificate` to support generic certificate and private keys + +## v1.0.0 + +- Added Logging inspectors to trace http.Request / Response +- Added support for User-Agent header +- Changed WithHeader PrepareDecorator to use set vs. add +- Added JSON to error when unmarshalling fails +- Added Client#Send method +- Corrected case of "Azure" in package paths +- Added "to" helpers, Azure helpers, and improved ease-of-use +- Corrected golint issues + +## v1.0.1 + +- Added CHANGELOG.md + +## v1.1.0 + +- Added mechanism to retrieve a ServicePrincipalToken using a certificate-signed JWT +- Added an example of creating a certificate-based ServicePrincipal and retrieving an OAuth token using the certificate + +## v1.1.1 + +- Introduce godeps and vendor dependencies introduced in v1.1.1 diff --git a/vendor/github.com/Azure/go-autorest/GNUmakefile b/vendor/github.com/Azure/go-autorest/GNUmakefile new file mode 100644 index 0000000000..a434e73ac4 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/GNUmakefile @@ -0,0 +1,23 @@ +DIR?=./autorest/ + +default: build + +build: fmt + go install $(DIR) + +test: + go test $(DIR) || exit 1 + +vet: + @echo "go vet ." + @go vet $(DIR)... ; if [ $$? -eq 1 ]; then \ + echo ""; \ + echo "Vet found suspicious constructs. Please check the reported constructs"; \ + echo "and fix them if necessary before submitting the code for review."; \ + exit 1; \ + fi + +fmt: + gofmt -w $(DIR) + +.PHONY: build test vet fmt diff --git a/vendor/github.com/Azure/go-autorest/Gopkg.lock b/vendor/github.com/Azure/go-autorest/Gopkg.lock new file mode 100644 index 0000000000..dc6e3e633e --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/Gopkg.lock @@ -0,0 +1,324 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + digest = "1:892e39e5c083d0943f1e80ab8351690f183c6a5ab24e1d280adcad424c26255e" + name = "contrib.go.opencensus.io/exporter/ocagent" + packages = ["."] + pruneopts = "UT" + revision = "a8a6f458bbc1d5042322ad1f9b65eeb0b69be9ea" + version = "v0.6.0" + +[[projects]] + digest = "1:8f5acd4d4462b5136af644d25101f0968a7a94ee90fcb2059cec5b7cc42e0b20" + name = "github.com/census-instrumentation/opencensus-proto" + packages = [ + "gen-go/agent/common/v1", + "gen-go/agent/metrics/v1", + "gen-go/agent/trace/v1", + "gen-go/metrics/v1", + "gen-go/resource/v1", + "gen-go/trace/v1", + ] + pruneopts = "UT" + revision = "d89fa54de508111353cb0b06403c00569be780d8" + version = "v0.2.1" + +[[projects]] + digest = "1:ffe9824d294da03b391f44e1ae8281281b4afc1bdaa9588c9097785e3af10cec" + name = "github.com/davecgh/go-spew" + packages = ["spew"] + pruneopts = "UT" + revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" + version = "v1.1.1" + +[[projects]] + digest = "1:76dc72490af7174349349838f2fe118996381b31ea83243812a97e5a0fd5ed55" + name = "github.com/dgrijalva/jwt-go" + packages = ["."] + pruneopts = "UT" + revision = "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e" + version = "v3.2.0" + +[[projects]] + digest = "1:cf0d2e435fd4ce45b789e93ef24b5f08e86be0e9807a16beb3694e2d8c9af965" + name = "github.com/dimchansky/utfbom" + packages = ["."] + pruneopts = "UT" + revision = "d2133a1ce379ef6fa992b0514a77146c60db9d1c" + version = "v1.1.0" + +[[projects]] + branch = "master" + digest = "1:b7cb6054d3dff43b38ad2e92492f220f57ae6087ee797dca298139776749ace8" + name = "github.com/golang/groupcache" + packages = ["lru"] + pruneopts = "UT" + revision = "611e8accdfc92c4187d399e95ce826046d4c8d73" + +[[projects]] + digest = "1:e3839df32927e8d3403cd5aa7253d966e8ff80fc8f10e2e35d146461cd83fcfa" + name = "github.com/golang/protobuf" + packages = [ + "descriptor", + "jsonpb", + "proto", + "protoc-gen-go/descriptor", + "ptypes", + "ptypes/any", + "ptypes/duration", + "ptypes/struct", + "ptypes/timestamp", + "ptypes/wrappers", + ] + pruneopts = "UT" + revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7" + version = "v1.3.2" + +[[projects]] + digest = "1:c560cd79300fac84f124b96225181a637a70b60155919a3c36db50b7cca6b806" + name = "github.com/grpc-ecosystem/grpc-gateway" + packages = [ + "internal", + "runtime", + "utilities", + ] + pruneopts = "UT" + revision = "f7120437bb4f6c71f7f5076ad65a45310de2c009" + version = "v1.12.1" + +[[projects]] + digest = "1:5d231480e1c64a726869bc4142d270184c419749d34f167646baa21008eb0a79" + name = "github.com/mitchellh/go-homedir" + packages = ["."] + pruneopts = "UT" + revision = "af06845cf3004701891bf4fdb884bfe4920b3727" + version = "v1.1.0" + +[[projects]] + digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" + name = "github.com/pmezard/go-difflib" + packages = ["difflib"] + pruneopts = "UT" + revision = "792786c7400a136282c1664665ae0a8db921c6c2" + version = "v1.0.0" + +[[projects]] + digest = "1:99d32780e5238c2621fff621123997c3e3cca96db8be13179013aea77dfab551" + name = "github.com/stretchr/testify" + packages = [ + "assert", + "require", + ] + pruneopts = "UT" + revision = "221dbe5ed46703ee255b1da0dec05086f5035f62" + version = "v1.4.0" + +[[projects]] + digest = "1:7c5e00383399fe13de0b4b65c9fdde16275407ce8ac02d867eafeaa916edcc71" + name = "go.opencensus.io" + packages = [ + ".", + "internal", + "internal/tagencoding", + "metric/metricdata", + "metric/metricproducer", + "plugin/ocgrpc", + "plugin/ochttp", + "plugin/ochttp/propagation/b3", + "plugin/ochttp/propagation/tracecontext", + "resource", + "stats", + "stats/internal", + "stats/view", + "tag", + "trace", + "trace/internal", + "trace/propagation", + "trace/tracestate", + ] + pruneopts = "UT" + revision = "aad2c527c5defcf89b5afab7f37274304195a6b2" + version = "v0.22.2" + +[[projects]] + branch = "master" + digest = "1:f604f5e2ee721b6757d962dfe7bab4f28aae50c456e39cfb2f3819762a44a6ae" + name = "golang.org/x/crypto" + packages = [ + "pkcs12", + "pkcs12/internal/rc2", + ] + pruneopts = "UT" + revision = "e9b2fee46413994441b28dfca259d911d963dfed" + +[[projects]] + branch = "master" + digest = "1:334b27eac455cb6567ea28cd424230b07b1a64334a2f861a8075ac26ce10af43" + name = "golang.org/x/lint" + packages = [ + ".", + "golint", + ] + pruneopts = "UT" + revision = "fdd1cda4f05fd1fd86124f0ef9ce31a0b72c8448" + +[[projects]] + branch = "master" + digest = "1:257a75d024975428ab9192bfc334c3490882f8cb21322ea5784ca8eca000a910" + name = "golang.org/x/net" + packages = [ + "http/httpguts", + "http2", + "http2/hpack", + "idna", + "internal/timeseries", + "trace", + ] + pruneopts = "UT" + revision = "1ddd1de85cb0337b623b740a609d35817d516a8d" + +[[projects]] + branch = "master" + digest = "1:382bb5a7fb4034db3b6a2d19e5a4a6bcf52f4750530603c01ca18a172fa3089b" + name = "golang.org/x/sync" + packages = ["semaphore"] + pruneopts = "UT" + revision = "cd5d95a43a6e21273425c7ae415d3df9ea832eeb" + +[[projects]] + branch = "master" + digest = "1:4da420ceda5f68e8d748aa2169d0ed44ffadb1bbd6537cf778a49563104189b8" + name = "golang.org/x/sys" + packages = ["unix"] + pruneopts = "UT" + revision = "ce4227a45e2eb77e5c847278dcc6a626742e2945" + +[[projects]] + digest = "1:8d8faad6b12a3a4c819a3f9618cb6ee1fa1cfc33253abeeea8b55336721e3405" + name = "golang.org/x/text" + packages = [ + "collate", + "collate/build", + "internal/colltab", + "internal/gen", + "internal/language", + "internal/language/compact", + "internal/tag", + "internal/triegen", + "internal/ucd", + "language", + "secure/bidirule", + "transform", + "unicode/bidi", + "unicode/cldr", + "unicode/norm", + "unicode/rangetable", + ] + pruneopts = "UT" + revision = "342b2e1fbaa52c93f31447ad2c6abc048c63e475" + version = "v0.3.2" + +[[projects]] + branch = "master" + digest = "1:4eb5ea8395fb60212dd58b92c9db80bab59d5e99c7435f9a6a0a528c373b60e7" + name = "golang.org/x/tools" + packages = [ + "go/ast/astutil", + "go/gcexportdata", + "go/internal/gcimporter", + "go/types/typeutil", + ] + pruneopts = "UT" + revision = "259af5ff87bdcd4abf2ecda8edc3f13f04f26a42" + +[[projects]] + digest = "1:964bb30febc27fabfbec4759fa530c6ec35e77a7c85fed90b9317ea39a054877" + name = "google.golang.org/api" + packages = ["support/bundler"] + pruneopts = "UT" + revision = "8a410c21381766a810817fd6200fce8838ecb277" + version = "v0.14.0" + +[[projects]] + branch = "master" + digest = "1:a8d5c2c6e746b3485e36908ab2a9e3d77b86b81f8156d88403c7d2b462431dfd" + name = "google.golang.org/genproto" + packages = [ + "googleapis/api/httpbody", + "googleapis/rpc/status", + "protobuf/field_mask", + ] + pruneopts = "UT" + revision = "51378566eb590fa106d1025ea12835a4416dda84" + +[[projects]] + digest = "1:b59ce3ddb11daeeccccc9cb3183b58ebf8e9a779f1c853308cd91612e817a301" + name = "google.golang.org/grpc" + packages = [ + ".", + "backoff", + "balancer", + "balancer/base", + "balancer/roundrobin", + "binarylog/grpc_binarylog_v1", + "codes", + "connectivity", + "credentials", + "credentials/internal", + "encoding", + "encoding/proto", + "grpclog", + "internal", + "internal/backoff", + "internal/balancerload", + "internal/binarylog", + "internal/buffer", + "internal/channelz", + "internal/envconfig", + "internal/grpcrand", + "internal/grpcsync", + "internal/resolver/dns", + "internal/resolver/passthrough", + "internal/syscall", + "internal/transport", + "keepalive", + "metadata", + "naming", + "peer", + "resolver", + "serviceconfig", + "stats", + "status", + "tap", + ] + pruneopts = "UT" + revision = "1a3960e4bd028ac0cec0a2afd27d7d8e67c11514" + version = "v1.25.1" + +[[projects]] + digest = "1:b75b3deb2bce8bc079e16bb2aecfe01eb80098f5650f9e93e5643ca8b7b73737" + name = "gopkg.in/yaml.v2" + packages = ["."] + pruneopts = "UT" + revision = "1f64d6156d11335c3f22d9330b0ad14fc1e789ce" + version = "v2.2.7" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + input-imports = [ + "contrib.go.opencensus.io/exporter/ocagent", + "github.com/dgrijalva/jwt-go", + "github.com/dimchansky/utfbom", + "github.com/mitchellh/go-homedir", + "github.com/stretchr/testify/require", + "go.opencensus.io/plugin/ochttp", + "go.opencensus.io/plugin/ochttp/propagation/tracecontext", + "go.opencensus.io/stats/view", + "go.opencensus.io/trace", + "golang.org/x/crypto/pkcs12", + "golang.org/x/lint/golint", + ] + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/vendor/github.com/Azure/go-autorest/Gopkg.toml b/vendor/github.com/Azure/go-autorest/Gopkg.toml new file mode 100644 index 0000000000..1fc2865969 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/Gopkg.toml @@ -0,0 +1,59 @@ +# Gopkg.toml example +# +# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html +# for detailed Gopkg.toml documentation. +# +# required = ["github.com/user/thing/cmd/thing"] +# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] +# +# [[constraint]] +# name = "github.com/user/project" +# version = "1.0.0" +# +# [[constraint]] +# name = "github.com/user/project2" +# branch = "dev" +# source = "github.com/myfork/project2" +# +# [[override]] +# name = "github.com/x/y" +# version = "2.4.0" +# +# [prune] +# non-go = false +# go-tests = true +# unused-packages = true + +required = ["golang.org/x/lint/golint"] + +[prune] + go-tests = true + unused-packages = true + +[[constraint]] + name = "contrib.go.opencensus.io/exporter/ocagent" + version = "0.6.0" + +[[constraint]] + name = "github.com/dgrijalva/jwt-go" + version = "3.2.0" + +[[constraint]] + name = "github.com/dimchansky/utfbom" + version = "1.1.0" + +[[constraint]] + name = "github.com/mitchellh/go-homedir" + version = "1.1.0" + +[[constraint]] + name = "github.com/stretchr/testify" + version = "1.3.0" + +[[constraint]] + name = "go.opencensus.io" + version = "0.22.0" + +[[constraint]] + branch = "master" + name = "golang.org/x/crypto" diff --git a/vendor/go.mongodb.org/mongo-driver/LICENSE b/vendor/github.com/Azure/go-autorest/LICENSE similarity index 94% rename from vendor/go.mongodb.org/mongo-driver/LICENSE rename to vendor/github.com/Azure/go-autorest/LICENSE index 261eeb9e9f..b9d6a27ea9 100644 --- a/vendor/go.mongodb.org/mongo-driver/LICENSE +++ b/vendor/github.com/Azure/go-autorest/LICENSE @@ -1,3 +1,4 @@ + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -175,18 +176,7 @@ 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] + Copyright 2015 Microsoft Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/Azure/go-autorest/README.md b/vendor/github.com/Azure/go-autorest/README.md new file mode 100644 index 0000000000..de1e19a44d --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/README.md @@ -0,0 +1,165 @@ +# go-autorest + +[![GoDoc](https://godoc.org/github.com/Azure/go-autorest/autorest?status.png)](https://godoc.org/github.com/Azure/go-autorest/autorest) +[![Build Status](https://dev.azure.com/azure-sdk/public/_apis/build/status/go/Azure.go-autorest?branchName=master)](https://dev.azure.com/azure-sdk/public/_build/latest?definitionId=625&branchName=master) +[![Go Report Card](https://goreportcard.com/badge/Azure/go-autorest)](https://goreportcard.com/report/Azure/go-autorest) + +Package go-autorest provides an HTTP request client for use with [Autorest](https://github.com/Azure/autorest.go)-generated API client packages. + +An authentication client tested with Azure Active Directory (AAD) is also +provided in this repo in the package +`github.com/Azure/go-autorest/autorest/adal`. Despite its name, this package +is maintained only as part of the Azure Go SDK and is not related to other +"ADAL" libraries in [github.com/AzureAD](https://github.com/AzureAD). + +## Overview + +Package go-autorest implements an HTTP request pipeline suitable for use across +multiple goroutines and provides the shared routines used by packages generated +by [Autorest](https://github.com/Azure/autorest.go). + +The package breaks sending and responding to HTTP requests into three phases: Preparing, Sending, +and Responding. A typical pattern is: + +```go + req, err := Prepare(&http.Request{}, + token.WithAuthorization()) + + resp, err := Send(req, + WithLogging(logger), + DoErrorIfStatusCode(http.StatusInternalServerError), + DoCloseIfError(), + DoRetryForAttempts(5, time.Second)) + + err = Respond(resp, + ByDiscardingBody(), + ByClosing()) +``` + +Each phase relies on decorators to modify and / or manage processing. Decorators may first modify +and then pass the data along, pass the data first and then modify the result, or wrap themselves +around passing the data (such as a logger might do). Decorators run in the order provided. For +example, the following: + +```go + req, err := Prepare(&http.Request{}, + WithBaseURL("https://microsoft.com/"), + WithPath("a"), + WithPath("b"), + WithPath("c")) +``` + +will set the URL to: + +``` + https://microsoft.com/a/b/c +``` + +Preparers and Responders may be shared and re-used (assuming the underlying decorators support +sharing and re-use). Performant use is obtained by creating one or more Preparers and Responders +shared among multiple go-routines, and a single Sender shared among multiple sending go-routines, +all bound together by means of input / output channels. + +Decorators hold their passed state within a closure (such as the path components in the example +above). Be careful to share Preparers and Responders only in a context where such held state +applies. For example, it may not make sense to share a Preparer that applies a query string from a +fixed set of values. Similarly, sharing a Responder that reads the response body into a passed +struct (e.g., `ByUnmarshallingJson`) is likely incorrect. + +Errors raised by autorest objects and methods will conform to the `autorest.Error` interface. + +See the included examples for more detail. For details on the suggested use of this package by +generated clients, see the Client described below. + +## Helpers + +### Handling Swagger Dates + +The Swagger specification (https://swagger.io) that drives AutoRest +(https://github.com/Azure/autorest/) precisely defines two date forms: date and date-time. The +github.com/Azure/go-autorest/autorest/date package provides time.Time derivations to ensure correct +parsing and formatting. + +### Handling Empty Values + +In JSON, missing values have different semantics than empty values. This is especially true for +services using the HTTP PATCH verb. The JSON submitted with a PATCH request generally contains +only those values to modify. Missing values are to be left unchanged. Developers, then, require a +means to both specify an empty value and to leave the value out of the submitted JSON. + +The Go JSON package (`encoding/json`) supports the `omitempty` tag. When specified, it omits +empty values from the rendered JSON. Since Go defines default values for all base types (such as "" +for string and 0 for int) and provides no means to mark a value as actually empty, the JSON package +treats default values as meaning empty, omitting them from the rendered JSON. This means that, using +the Go base types encoded through the default JSON package, it is not possible to create JSON to +clear a value at the server. + +The workaround within the Go community is to use pointers to base types in lieu of base types within +structures that map to JSON. For example, instead of a value of type `string`, the workaround uses +`*string`. While this enables distinguishing empty values from those to be unchanged, creating +pointers to a base type (notably constant, in-line values) requires additional variables. This, for +example, + +```go + s := struct { + S *string + }{ S: &"foo" } +``` +fails, while, this + +```go + v := "foo" + s := struct { + S *string + }{ S: &v } +``` +succeeds. + +To ease using pointers, the subpackage `to` contains helpers that convert to and from pointers for +Go base types which have Swagger analogs. It also provides a helper that converts between +`map[string]string` and `map[string]*string`, enabling the JSON to specify that the value +associated with a key should be cleared. With the helpers, the previous example becomes + +```go + s := struct { + S *string + }{ S: to.StringPtr("foo") } +``` + +## Install + +```bash +go get github.com/Azure/go-autorest/autorest +go get github.com/Azure/go-autorest/autorest/azure +go get github.com/Azure/go-autorest/autorest/date +go get github.com/Azure/go-autorest/autorest/to +``` + +### Using with Go Modules +In [v12.0.1](https://github.com/Azure/go-autorest/pull/386), this repository introduced the following modules. + +- autorest/adal +- autorest/azure/auth +- autorest/azure/cli +- autorest/date +- autorest/mocks +- autorest/to +- autorest/validation +- autorest +- logger +- tracing + +Tagging cumulative SDK releases as a whole (e.g. `v12.3.0`) is still enabled to support consumers of this repo that have not yet migrated to modules. + +## License + +See LICENSE file. + +----- + +This project has adopted the [Microsoft Open Source Code of +Conduct](https://opensource.microsoft.com/codeofconduct/). For more information +see the [Code of Conduct +FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact +[opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional +questions or comments. diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/devicetoken.go b/vendor/github.com/Azure/go-autorest/autorest/adal/devicetoken.go index 914f8af5e4..9daa4b58b8 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/adal/devicetoken.go +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/devicetoken.go @@ -222,6 +222,10 @@ func CheckForUserCompletionWithContext(ctx context.Context, sender Sender, code case "code_expired": return nil, ErrDeviceCodeExpired default: + // return a more meaningful error message if available + if token.ErrorDescription != nil { + return nil, fmt.Errorf("%s %s: %s", logPrefix, *token.Error, *token.ErrorDescription) + } return nil, ErrDeviceGeneric } } diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/go.mod b/vendor/github.com/Azure/go-autorest/autorest/adal/go.mod index a030eb42da..abcc27d4cc 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/adal/go.mod +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/go.mod @@ -3,10 +3,10 @@ module github.com/Azure/go-autorest/autorest/adal go 1.12 require ( - github.com/Azure/go-autorest/autorest v0.9.0 - github.com/Azure/go-autorest/autorest/date v0.2.0 - github.com/Azure/go-autorest/autorest/mocks v0.3.0 - github.com/Azure/go-autorest/tracing v0.5.0 - github.com/dgrijalva/jwt-go v3.2.0+incompatible - golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 + github.com/Azure/go-autorest v14.2.0+incompatible + github.com/Azure/go-autorest/autorest/date v0.3.0 + github.com/Azure/go-autorest/autorest/mocks v0.4.1 + github.com/Azure/go-autorest/tracing v0.6.0 + github.com/form3tech-oss/jwt-go v3.2.2+incompatible + golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 ) diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/go.sum b/vendor/github.com/Azure/go-autorest/autorest/adal/go.sum index e43cf6498d..9d55b0f596 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/adal/go.sum +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/go.sum @@ -1,26 +1,17 @@ -github.com/Azure/go-autorest/autorest v0.9.0 h1:MRvx8gncNaXJqOoLmhNjUAKh33JJF8LyxPhomEtOsjs= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/date v0.1.0 h1:YGrhWfrgtFs84+h0o46rJrlmsZtyZRg470CqAXTZaGM= -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 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/mocks v0.1.0 h1:Kx+AUU2Te+A3JIyYn6Dfs+cFgx5XorQKuIXrZGoq/SI= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0 h1:Ww5g4zThfD/6cLb4z6xxgeyDa7QDkizMkJKe0ysZXp0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/go_mod_tidy_hack.go b/vendor/github.com/Azure/go-autorest/autorest/adal/go_mod_tidy_hack.go index 28a4bfc4c4..7551b79235 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/adal/go_mod_tidy_hack.go +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/go_mod_tidy_hack.go @@ -16,9 +16,9 @@ package adal // See the License for the specific language governing permissions and // limitations under the License. -// This file, and the github.com/Azure/go-autorest/autorest import, won't actually become part of +// This file, and the github.com/Azure/go-autorest import, won't actually become part of // the resultant binary. // Necessary for safely adding multi-module repo. // See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository -import _ "github.com/Azure/go-autorest/autorest" +import _ "github.com/Azure/go-autorest" diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/persist.go b/vendor/github.com/Azure/go-autorest/autorest/adal/persist.go index 9e15f2751f..2a974a39b3 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/adal/persist.go +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/persist.go @@ -15,11 +15,24 @@ package adal // limitations under the License. import ( + "crypto/rsa" + "crypto/x509" "encoding/json" + "errors" "fmt" "io/ioutil" "os" "path/filepath" + + "golang.org/x/crypto/pkcs12" +) + +var ( + // ErrMissingCertificate is returned when no local certificate is found in the provided PFX data. + ErrMissingCertificate = errors.New("adal: certificate missing") + + // ErrMissingPrivateKey is returned when no private key is found in the provided PFX data. + ErrMissingPrivateKey = errors.New("adal: private key missing") ) // LoadToken restores a Token object from a file located at 'path'. @@ -71,3 +84,52 @@ func SaveToken(path string, mode os.FileMode, token Token) error { } return nil } + +// DecodePfxCertificateData extracts the x509 certificate and RSA private key from the provided PFX data. +// The PFX data must contain a private key along with a certificate whose public key matches that of the +// private key or an error is returned. +// If the private key is not password protected pass the empty string for password. +func DecodePfxCertificateData(pfxData []byte, password string) (*x509.Certificate, *rsa.PrivateKey, error) { + blocks, err := pkcs12.ToPEM(pfxData, password) + if err != nil { + return nil, nil, err + } + // first extract the private key + var priv *rsa.PrivateKey + for _, block := range blocks { + if block.Type == "PRIVATE KEY" { + priv, err = x509.ParsePKCS1PrivateKey(block.Bytes) + if err != nil { + return nil, nil, err + } + break + } + } + if priv == nil { + return nil, nil, ErrMissingPrivateKey + } + // now find the certificate with the matching public key of our private key + var cert *x509.Certificate + for _, block := range blocks { + if block.Type == "CERTIFICATE" { + pcert, err := x509.ParseCertificate(block.Bytes) + if err != nil { + return nil, nil, err + } + certKey, ok := pcert.PublicKey.(*rsa.PublicKey) + if !ok { + // keep looking + continue + } + if priv.E == certKey.E && priv.N.Cmp(certKey.N) == 0 { + // found a match + cert = pcert + break + } + } + } + if cert == nil { + return nil, nil, ErrMissingCertificate + } + return cert, priv, nil +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/token.go b/vendor/github.com/Azure/go-autorest/autorest/adal/token.go index b65b2c8b20..b83f16a49a 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/adal/token.go +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/token.go @@ -35,7 +35,7 @@ import ( "time" "github.com/Azure/go-autorest/autorest/date" - "github.com/dgrijalva/jwt-go" + "github.com/form3tech-oss/jwt-go" ) const ( @@ -62,6 +62,9 @@ const ( // msiEndpoint is the well known endpoint for getting MSI authentications tokens msiEndpoint = "http://169.254.169.254/metadata/identity/oauth2/token" + // the API version to use for the MSI endpoint + msiAPIVersion = "2018-02-01" + // the default number of attempts to refresh an MSI authentication token defaultMaxMSIRefreshAttempts = 5 @@ -70,6 +73,9 @@ const ( // asMSISecretEnv is the environment variable used to store the request secret on App Service and Functions asMSISecretEnv = "MSI_SECRET" + + // the API version to use for the App Service MSI endpoint + appServiceAPIVersion = "2017-09-01" ) // OAuthTokenProvider is an interface which should be implemented by an access token retriever @@ -354,6 +360,7 @@ type ServicePrincipalToken struct { customRefreshFunc TokenRefresh refreshCallbacks []TokenRefreshCallback // MaxMSIRefreshAttempts is the maximum number of attempts to refresh an MSI token. + // Settings this to a value less than 1 will use the default value. MaxMSIRefreshAttempts int } @@ -650,6 +657,8 @@ func GetMSIVMEndpoint() (string, error) { return msiEndpoint, nil } +// NOTE: this only indicates if the ASE environment credentials have been set +// which does not necessarily mean that the caller is authenticating via ASE! func isAppService() bool { _, asMSIEndpointEnvExists := os.LookupEnv(asMSIEndpointEnv) _, asMSISecretEnvExists := os.LookupEnv(asMSISecretEnv) @@ -678,16 +687,22 @@ func GetMSIEndpoint() (string, error) { // NewServicePrincipalTokenFromMSI creates a ServicePrincipalToken via the MSI VM Extension. // It will use the system assigned identity when creating the token. func NewServicePrincipalTokenFromMSI(msiEndpoint, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { - return newServicePrincipalTokenFromMSI(msiEndpoint, resource, nil, callbacks...) + return newServicePrincipalTokenFromMSI(msiEndpoint, resource, nil, nil, callbacks...) } // NewServicePrincipalTokenFromMSIWithUserAssignedID creates a ServicePrincipalToken via the MSI VM Extension. -// It will use the specified user assigned identity when creating the token. +// It will use the clientID of specified user assigned identity when creating the token. func NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, resource string, userAssignedID string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { - return newServicePrincipalTokenFromMSI(msiEndpoint, resource, &userAssignedID, callbacks...) + return newServicePrincipalTokenFromMSI(msiEndpoint, resource, &userAssignedID, nil, callbacks...) +} + +// NewServicePrincipalTokenFromMSIWithIdentityResourceID creates a ServicePrincipalToken via the MSI VM Extension. +// It will use the azure resource id of user assigned identity when creating the token. +func NewServicePrincipalTokenFromMSIWithIdentityResourceID(msiEndpoint, resource string, identityResourceID string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { + return newServicePrincipalTokenFromMSI(msiEndpoint, resource, nil, &identityResourceID, callbacks...) } -func newServicePrincipalTokenFromMSI(msiEndpoint, resource string, userAssignedID *string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { +func newServicePrincipalTokenFromMSI(msiEndpoint, resource string, userAssignedID *string, identityResourceID *string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { if err := validateStringParam(msiEndpoint, "msiEndpoint"); err != nil { return nil, err } @@ -699,6 +714,11 @@ func newServicePrincipalTokenFromMSI(msiEndpoint, resource string, userAssignedI return nil, err } } + if identityResourceID != nil { + if err := validateStringParam(*identityResourceID, "identityResourceID"); err != nil { + return nil, err + } + } // We set the oauth config token endpoint to be MSI's endpoint msiEndpointURL, err := url.Parse(msiEndpoint) if err != nil { @@ -709,13 +729,16 @@ func newServicePrincipalTokenFromMSI(msiEndpoint, resource string, userAssignedI v.Set("resource", resource) // App Service MSI currently only supports token API version 2017-09-01 if isAppService() { - v.Set("api-version", "2017-09-01") + v.Set("api-version", appServiceAPIVersion) } else { - v.Set("api-version", "2018-02-01") + v.Set("api-version", msiAPIVersion) } if userAssignedID != nil { v.Set("client_id", *userAssignedID) } + if identityResourceID != nil { + v.Set("mi_res_id", *identityResourceID) + } msiEndpointURL.RawQuery = v.Encode() spt := &ServicePrincipalToken{ @@ -771,8 +794,9 @@ func (spt *ServicePrincipalToken) EnsureFresh() error { // EnsureFreshWithContext will refresh the token if it will expire within the refresh window (as set by // RefreshWithin) and autoRefresh flag is on. This method is safe for concurrent use. func (spt *ServicePrincipalToken) EnsureFreshWithContext(ctx context.Context) error { - if spt.inner.AutoRefresh && spt.inner.Token.WillExpireIn(spt.inner.RefreshWithin) { - // take the write lock then check to see if the token was already refreshed + // must take the read lock when initially checking the token's expiration + if spt.inner.AutoRefresh && spt.Token().WillExpireIn(spt.inner.RefreshWithin) { + // take the write lock then check again to see if the token was already refreshed spt.refreshLock.Lock() defer spt.refreshLock.Unlock() if spt.inner.Token.WillExpireIn(spt.inner.RefreshWithin) { @@ -835,11 +859,28 @@ func (spt *ServicePrincipalToken) getGrantType() string { } func isIMDS(u url.URL) bool { - imds, err := url.Parse(msiEndpoint) + return isMSIEndpoint(u) == true || isASEEndpoint(u) == true +} + +func isMSIEndpoint(endpoint url.URL) bool { + msi, err := url.Parse(msiEndpoint) if err != nil { return false } - return (u.Host == imds.Host && u.Path == imds.Path) || isAppService() + return endpoint.Host == msi.Host && endpoint.Path == msi.Path +} + +func isASEEndpoint(endpoint url.URL) bool { + aseEndpoint, err := GetMSIAppServiceEndpoint() + if err != nil { + // app service environment isn't enabled + return false + } + ase, err := url.Parse(aseEndpoint) + if err != nil { + return false + } + return endpoint.Host == ase.Host && endpoint.Path == ase.Path } func (spt *ServicePrincipalToken) refreshInternal(ctx context.Context, resource string) error { @@ -858,7 +899,7 @@ func (spt *ServicePrincipalToken) refreshInternal(ctx context.Context, resource } req.Header.Add("User-Agent", UserAgent()) // Add header when runtime is on App Service or Functions - if isAppService() { + if isASEEndpoint(spt.inner.OauthConfig.TokenEndpoint) { asMSISecret, _ := os.LookupEnv(asMSISecretEnv) req.Header.Add("Secret", asMSISecret) } @@ -900,6 +941,14 @@ func (spt *ServicePrincipalToken) refreshInternal(ctx context.Context, resource } var resp *http.Response + if isMSIEndpoint(spt.inner.OauthConfig.TokenEndpoint) { + resp, err = getMSIEndpoint(ctx, spt.sender) + if err != nil { + // return a TokenRefreshError here so that we don't keep retrying + return newTokenRefreshError(fmt.Sprintf("the MSI endpoint is not available. Failed HTTP request to MSI endpoint: %v", err), nil) + } + resp.Body.Close() + } if isIMDS(spt.inner.OauthConfig.TokenEndpoint) { resp, err = retryForIMDS(spt.sender, req, spt.MaxMSIRefreshAttempts) } else { @@ -972,6 +1021,11 @@ func retryForIMDS(sender Sender, req *http.Request, maxAttempts int) (resp *http attempt := 0 delay := time.Duration(0) + // maxAttempts is user-specified, ensure that its value is greater than zero else no request will be made + if maxAttempts < 1 { + maxAttempts = defaultMaxMSIRefreshAttempts + } + for attempt < maxAttempts { if resp != nil && resp.Body != nil { io.Copy(ioutil.Discard, resp.Body) @@ -1133,3 +1187,12 @@ func NewMultiTenantServicePrincipalToken(multiTenantCfg MultiTenantOAuthConfig, } return &m, nil } + +// MSIAvailable returns true if the MSI endpoint is available for authentication. +func MSIAvailable(ctx context.Context, sender Sender) bool { + resp, err := getMSIEndpoint(ctx, sender) + if err == nil { + resp.Body.Close() + } + return err == nil +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/token_1.13.go b/vendor/github.com/Azure/go-autorest/autorest/adal/token_1.13.go new file mode 100644 index 0000000000..45e01a7eee --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/token_1.13.go @@ -0,0 +1,36 @@ +// +build go1.13 + +// Copyright 2017 Microsoft Corporation +// +// 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 adal + +import ( + "context" + "net/http" + "time" +) + +func getMSIEndpoint(ctx context.Context, sender Sender) (*http.Response, error) { + // this cannot fail, the return sig is due to legacy reasons + msiEndpoint, _ := GetMSIVMEndpoint() + tempCtx, cancel := context.WithTimeout(ctx, 500*time.Millisecond) + defer cancel() + // http.NewRequestWithContext() was added in Go 1.13 + req, _ := http.NewRequestWithContext(tempCtx, http.MethodGet, msiEndpoint, nil) + q := req.URL.Query() + q.Add("api-version", msiAPIVersion) + req.URL.RawQuery = q.Encode() + return sender.Do(req) +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/token_legacy.go b/vendor/github.com/Azure/go-autorest/autorest/adal/token_legacy.go new file mode 100644 index 0000000000..6f7ad8078c --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/token_legacy.go @@ -0,0 +1,36 @@ +// +build !go1.13 + +// Copyright 2017 Microsoft Corporation +// +// 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 adal + +import ( + "context" + "net/http" + "time" +) + +func getMSIEndpoint(ctx context.Context, sender Sender) (*http.Response, error) { + // this cannot fail, the return sig is due to legacy reasons + msiEndpoint, _ := GetMSIVMEndpoint() + tempCtx, cancel := context.WithTimeout(ctx, 500*time.Millisecond) + defer cancel() + req, _ := http.NewRequest(http.MethodGet, msiEndpoint, nil) + req = req.WithContext(tempCtx) + q := req.URL.Query() + q.Add("api-version", msiAPIVersion) + req.URL.RawQuery = q.Encode() + return sender.Do(req) +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/authorization.go b/vendor/github.com/Azure/go-autorest/autorest/authorization.go index f43e1a6ed5..15138b642f 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/authorization.go +++ b/vendor/github.com/Azure/go-autorest/autorest/authorization.go @@ -138,6 +138,11 @@ func (ba *BearerAuthorizer) WithAuthorization() PrepareDecorator { } } +// TokenProvider returns OAuthTokenProvider so that it can be used for authorization outside the REST. +func (ba *BearerAuthorizer) TokenProvider() adal.OAuthTokenProvider { + return ba.tokenProvider +} + // BearerAuthorizerCallbackFunc is the authentication callback signature. type BearerAuthorizerCallbackFunc func(tenantID, resource string) (*BearerAuthorizer, error) @@ -331,7 +336,7 @@ func (mt multiTenantSPTAuthorizer) WithAuthorization() PrepareDecorator { for i := range auxTokens { auxTokens[i] = fmt.Sprintf("Bearer %s", auxTokens[i]) } - return Prepare(r, WithHeader(headerAuxAuthorization, strings.Join(auxTokens, "; "))) + return Prepare(r, WithHeader(headerAuxAuthorization, strings.Join(auxTokens, ", "))) }) } } diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/async.go b/vendor/github.com/Azure/go-autorest/autorest/azure/async.go index c5fc511f67..5326f1fd3b 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/azure/async.go +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/async.go @@ -167,7 +167,13 @@ func (f *Future) WaitForCompletionRef(ctx context.Context, client autorest.Clien cancelCtx, cancel = context.WithTimeout(ctx, d) defer cancel() } - + // if the initial response has a Retry-After, sleep for the specified amount of time before starting to poll + if delay, ok := f.GetPollingDelay(); ok { + if delayElapsed := autorest.DelayForBackoff(delay, 0, cancelCtx.Done()); !delayElapsed { + err = cancelCtx.Err() + return + } + } done, err := f.DoneWithContext(ctx, client) for attempts := 0; !done; done, err = f.DoneWithContext(ctx, client) { if attempts >= client.RetryAttempts { diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go b/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go index 6c20b8179a..faff932759 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go @@ -127,7 +127,7 @@ var ( KeyVaultDNSSuffix: "vault.usgovcloudapi.net", ServiceBusEndpointSuffix: "servicebus.usgovcloudapi.net", ServiceManagementVMDNSSuffix: "usgovcloudapp.net", - ResourceManagerVMDNSSuffix: "cloudapp.windowsazure.us", + ResourceManagerVMDNSSuffix: "cloudapp.usgovcloudapi.net", ContainerRegistryDNSSuffix: "azurecr.us", CosmosDBDNSSuffix: "documents.azure.us", TokenAudience: "https://management.usgovcloudapi.net/", @@ -160,7 +160,7 @@ var ( KeyVaultDNSSuffix: "vault.azure.cn", ServiceBusEndpointSuffix: "servicebus.chinacloudapi.cn", ServiceManagementVMDNSSuffix: "chinacloudapp.cn", - ResourceManagerVMDNSSuffix: "cloudapp.azure.cn", + ResourceManagerVMDNSSuffix: "cloudapp.chinacloudapi.cn", ContainerRegistryDNSSuffix: "azurecr.cn", CosmosDBDNSSuffix: "documents.azure.cn", TokenAudience: "https://management.chinacloudapi.cn/", @@ -242,3 +242,8 @@ func EnvironmentFromFile(location string) (unmarshaled Environment, err error) { return } + +// SetEnvironment updates the environment map with the specified values. +func SetEnvironment(name string, env Environment) { + environments[strings.ToUpper(name)] = env +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/date/go.mod b/vendor/github.com/Azure/go-autorest/autorest/date/go.mod index 3adc4804c3..f88ecc4022 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/date/go.mod +++ b/vendor/github.com/Azure/go-autorest/autorest/date/go.mod @@ -2,4 +2,4 @@ module github.com/Azure/go-autorest/autorest/date go 1.12 -require github.com/Azure/go-autorest/autorest v0.9.0 +require github.com/Azure/go-autorest v14.2.0+incompatible diff --git a/vendor/github.com/Azure/go-autorest/autorest/date/go.sum b/vendor/github.com/Azure/go-autorest/autorest/date/go.sum index 9e2ee7a948..1fc56a962e 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/date/go.sum +++ b/vendor/github.com/Azure/go-autorest/autorest/date/go.sum @@ -1,16 +1,2 @@ -github.com/Azure/go-autorest/autorest v0.9.0 h1:MRvx8gncNaXJqOoLmhNjUAKh33JJF8LyxPhomEtOsjs= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0 h1:q2gDruN08/guU9vAjuPWff0+QIrpH6ediguzdAzXAUU= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0 h1:Ww5g4zThfD/6cLb4z6xxgeyDa7QDkizMkJKe0ysZXp0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= diff --git a/vendor/github.com/Azure/go-autorest/autorest/date/go_mod_tidy_hack.go b/vendor/github.com/Azure/go-autorest/autorest/date/go_mod_tidy_hack.go index 55adf930f4..4e05432071 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/date/go_mod_tidy_hack.go +++ b/vendor/github.com/Azure/go-autorest/autorest/date/go_mod_tidy_hack.go @@ -16,9 +16,9 @@ package date // See the License for the specific language governing permissions and // limitations under the License. -// This file, and the github.com/Azure/go-autorest/autorest import, won't actually become part of +// This file, and the github.com/Azure/go-autorest import, won't actually become part of // the resultant binary. // Necessary for safely adding multi-module repo. // See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository -import _ "github.com/Azure/go-autorest/autorest" +import _ "github.com/Azure/go-autorest" diff --git a/vendor/github.com/Azure/go-autorest/autorest/go.mod b/vendor/github.com/Azure/go-autorest/autorest/go.mod index 499c56de48..b66c78da2c 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/go.mod +++ b/vendor/github.com/Azure/go-autorest/autorest/go.mod @@ -3,9 +3,10 @@ module github.com/Azure/go-autorest/autorest go 1.12 require ( - github.com/Azure/go-autorest/autorest/adal v0.8.2 - github.com/Azure/go-autorest/autorest/mocks v0.3.0 - github.com/Azure/go-autorest/logger v0.1.0 - github.com/Azure/go-autorest/tracing v0.5.0 - golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 + github.com/Azure/go-autorest v14.2.0+incompatible + github.com/Azure/go-autorest/autorest/adal v0.9.0 + github.com/Azure/go-autorest/autorest/mocks v0.4.0 + github.com/Azure/go-autorest/logger v0.2.0 + github.com/Azure/go-autorest/tracing v0.6.0 + golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 ) diff --git a/vendor/github.com/Azure/go-autorest/autorest/go.sum b/vendor/github.com/Azure/go-autorest/autorest/go.sum index 37398d1d48..96d2ad0fcd 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/go.sum +++ b/vendor/github.com/Azure/go-autorest/autorest/go.sum @@ -1,28 +1,21 @@ -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0 h1:q2gDruN08/guU9vAjuPWff0+QIrpH6ediguzdAzXAUU= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.2 h1:O1X4oexUxnZCaEUGsvMnr8ZGj8HI37tNezwY4npRqA0= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/date v0.1.0 h1:YGrhWfrgtFs84+h0o46rJrlmsZtyZRg470CqAXTZaGM= -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 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/mocks v0.1.0 h1:Kx+AUU2Te+A3JIyYn6Dfs+cFgx5XorQKuIXrZGoq/SI= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0 h1:Ww5g4zThfD/6cLb4z6xxgeyDa7QDkizMkJKe0ysZXp0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest/adal v0.9.0 h1:SigMbuFNuKgc1xcGhaeapbh+8fgsu+GxgDRFyg7f5lM= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.0 h1:z20OWOSG5aCye0HEkDp6TPmP17ZcfeMxPi6HnSALa8c= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/vendor/github.com/Azure/go-autorest/autorest/go_mod_tidy_hack.go b/vendor/github.com/Azure/go-autorest/autorest/go_mod_tidy_hack.go new file mode 100644 index 0000000000..da65e1041e --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/go_mod_tidy_hack.go @@ -0,0 +1,24 @@ +// +build modhack + +package autorest + +// Copyright 2017 Microsoft Corporation +// +// 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, and the github.com/Azure/go-autorest import, won't actually become part of +// the resultant binary. + +// Necessary for safely adding multi-module repo. +// See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository +import _ "github.com/Azure/go-autorest" diff --git a/vendor/github.com/Azure/go-autorest/autorest/sender.go b/vendor/github.com/Azure/go-autorest/autorest/sender.go index a07670b8ce..704f3e55e0 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/sender.go +++ b/vendor/github.com/Azure/go-autorest/autorest/sender.go @@ -257,6 +257,12 @@ func DoRetryForAttempts(attempts int, backoff time.Duration) SendDecorator { } } +// Count429AsRetry indicates that a 429 response should be included as a retry attempt. +var Count429AsRetry = true + +// Max429Delay is the maximum duration to wait between retries on a 429 if no Retry-After header was received. +var Max429Delay time.Duration + // DoRetryForStatusCodes returns a SendDecorator that retries for specified statusCodes for up to the specified // number of attempts, exponentially backing off between requests using the supplied backoff // time.Duration (which may be zero). Retrying may be canceled by cancelling the context on the http.Request. @@ -264,7 +270,7 @@ func DoRetryForAttempts(attempts int, backoff time.Duration) SendDecorator { func DoRetryForStatusCodes(attempts int, backoff time.Duration, codes ...int) SendDecorator { return func(s Sender) Sender { return SenderFunc(func(r *http.Request) (*http.Response, error) { - return doRetryForStatusCodesImpl(s, r, false, attempts, backoff, 0, codes...) + return doRetryForStatusCodesImpl(s, r, Count429AsRetry, attempts, backoff, 0, codes...) }) } } @@ -276,7 +282,7 @@ func DoRetryForStatusCodes(attempts int, backoff time.Duration, codes ...int) Se func DoRetryForStatusCodesWithCap(attempts int, backoff, cap time.Duration, codes ...int) SendDecorator { return func(s Sender) Sender { return SenderFunc(func(r *http.Request) (*http.Response, error) { - return doRetryForStatusCodesImpl(s, r, true, attempts, backoff, cap, codes...) + return doRetryForStatusCodesImpl(s, r, Count429AsRetry, attempts, backoff, cap, codes...) }) } } @@ -297,11 +303,10 @@ func doRetryForStatusCodesImpl(s Sender, r *http.Request, count429 bool, attempt return resp, err } delayed := DelayWithRetryAfter(resp, r.Context().Done()) - // enforce a 2 minute cap between requests when 429 status codes are - // not going to be counted as an attempt and when the cap is 0. - // this should only happen in the absence of a retry-after header. - if !count429 && cap == 0 { - cap = 2 * time.Minute + // if this was a 429 set the delay cap as specified. + // applicable only in the absence of a retry-after header. + if resp != nil && resp.StatusCode == http.StatusTooManyRequests { + cap = Max429Delay } if !delayed && !DelayForBackoffWithCap(backoff, cap, delayCount, r.Context().Done()) { return resp, r.Context().Err() diff --git a/vendor/github.com/Azure/go-autorest/autorest/version.go b/vendor/github.com/Azure/go-autorest/autorest/version.go index a42f705d37..713e23581d 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/version.go +++ b/vendor/github.com/Azure/go-autorest/autorest/version.go @@ -19,7 +19,7 @@ import ( "runtime" ) -const number = "v13.4.0" +const number = "v14.2.1" var ( userAgent = fmt.Sprintf("Go/%s (%s-%s) go-autorest/%s", diff --git a/vendor/github.com/Azure/go-autorest/azure-pipelines.yml b/vendor/github.com/Azure/go-autorest/azure-pipelines.yml new file mode 100644 index 0000000000..6fb8404fd0 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/azure-pipelines.yml @@ -0,0 +1,105 @@ +variables: + GOPATH: '$(system.defaultWorkingDirectory)/work' + sdkPath: '$(GOPATH)/src/github.com/$(build.repository.name)' + +jobs: + - job: 'goautorest' + displayName: 'Run go-autorest CI Checks' + + strategy: + matrix: + Linux_Go113: + vm.image: 'ubuntu-18.04' + go.version: '1.13' + Linux_Go114: + vm.image: 'ubuntu-18.04' + go.version: '1.14' + + pool: + vmImage: '$(vm.image)' + + steps: + - task: GoTool@0 + inputs: + version: '$(go.version)' + displayName: "Select Go Version" + + - script: | + set -e + mkdir -p '$(GOPATH)/bin' + mkdir -p '$(sdkPath)' + shopt -s extglob + mv !(work) '$(sdkPath)' + echo '##vso[task.prependpath]$(GOPATH)/bin' + displayName: 'Create Go Workspace' + + - script: | + set -e + curl -sSL https://raw.githubusercontent.com/golang/dep/master/install.sh | sh + dep ensure -v + go install ./vendor/golang.org/x/lint/golint + go get github.com/jstemmer/go-junit-report + go get github.com/axw/gocov/gocov + go get github.com/AlekSi/gocov-xml + go get -u github.com/matm/gocov-html + workingDirectory: '$(sdkPath)' + displayName: 'Install Dependencies' + + - script: | + go vet ./autorest/... + go vet ./logger/... + go vet ./tracing/... + workingDirectory: '$(sdkPath)' + displayName: 'Vet' + + - script: | + go build -v ./autorest/... + go build -v ./logger/... + go build -v ./tracing/... + workingDirectory: '$(sdkPath)' + displayName: 'Build' + + - script: | + set -e + go test -race -v -coverprofile=coverage.txt -covermode atomic ./autorest/... ./logger/... ./tracing/... 2>&1 | go-junit-report > report.xml + gocov convert coverage.txt > coverage.json + gocov-xml < coverage.json > coverage.xml + gocov-html < coverage.json > coverage.html + workingDirectory: '$(sdkPath)' + displayName: 'Run Tests' + + - script: grep -L -r --include *.go --exclude-dir vendor -P "Copyright (\d{4}|\(c\)) Microsoft" ./ | tee >&2 + workingDirectory: '$(sdkPath)' + displayName: 'Copyright Header Check' + failOnStderr: true + condition: succeededOrFailed() + + - script: | + gofmt -s -l -w ./autorest/. >&2 + gofmt -s -l -w ./logger/. >&2 + gofmt -s -l -w ./tracing/. >&2 + workingDirectory: '$(sdkPath)' + displayName: 'Format Check' + failOnStderr: true + condition: succeededOrFailed() + + - script: | + golint ./autorest/... >&2 + golint ./logger/... >&2 + golint ./tracing/... >&2 + workingDirectory: '$(sdkPath)' + displayName: 'Linter Check' + failOnStderr: true + condition: succeededOrFailed() + + - task: PublishTestResults@2 + inputs: + testRunner: JUnit + testResultsFiles: $(sdkPath)/report.xml + failTaskOnFailedTests: true + + - task: PublishCodeCoverageResults@1 + inputs: + codeCoverageTool: Cobertura + summaryFileLocation: $(sdkPath)/coverage.xml + additionalCodeCoverageFiles: $(sdkPath)/coverage.html diff --git a/vendor/github.com/Azure/go-autorest/doc.go b/vendor/github.com/Azure/go-autorest/doc.go new file mode 100644 index 0000000000..99ae6ca988 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/doc.go @@ -0,0 +1,18 @@ +/* +Package go-autorest provides an HTTP request client for use with Autorest-generated API client packages. +*/ +package go_autorest + +// Copyright 2017 Microsoft Corporation +// +// 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/Azure/go-autorest/logger/go.mod b/vendor/github.com/Azure/go-autorest/logger/go.mod index f22ed56bcd..bedeaee039 100644 --- a/vendor/github.com/Azure/go-autorest/logger/go.mod +++ b/vendor/github.com/Azure/go-autorest/logger/go.mod @@ -1,3 +1,5 @@ module github.com/Azure/go-autorest/logger go 1.12 + +require github.com/Azure/go-autorest v14.2.0+incompatible diff --git a/vendor/github.com/Azure/go-autorest/logger/go.sum b/vendor/github.com/Azure/go-autorest/logger/go.sum new file mode 100644 index 0000000000..1fc56a962e --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/logger/go.sum @@ -0,0 +1,2 @@ +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= diff --git a/vendor/github.com/Azure/go-autorest/logger/go_mod_tidy_hack.go b/vendor/github.com/Azure/go-autorest/logger/go_mod_tidy_hack.go new file mode 100644 index 0000000000..0aa27680db --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/logger/go_mod_tidy_hack.go @@ -0,0 +1,24 @@ +// +build modhack + +package logger + +// Copyright 2017 Microsoft Corporation +// +// 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, and the github.com/Azure/go-autorest import, won't actually become part of +// the resultant binary. + +// Necessary for safely adding multi-module repo. +// See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository +import _ "github.com/Azure/go-autorest" diff --git a/vendor/github.com/Azure/go-autorest/tracing/go.mod b/vendor/github.com/Azure/go-autorest/tracing/go.mod index 25c34c1085..a2cdec78c8 100644 --- a/vendor/github.com/Azure/go-autorest/tracing/go.mod +++ b/vendor/github.com/Azure/go-autorest/tracing/go.mod @@ -1,3 +1,5 @@ module github.com/Azure/go-autorest/tracing go 1.12 + +require github.com/Azure/go-autorest v14.2.0+incompatible diff --git a/vendor/github.com/Azure/go-autorest/tracing/go.sum b/vendor/github.com/Azure/go-autorest/tracing/go.sum new file mode 100644 index 0000000000..1fc56a962e --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/tracing/go.sum @@ -0,0 +1,2 @@ +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= diff --git a/vendor/github.com/Azure/go-autorest/tracing/go_mod_tidy_hack.go b/vendor/github.com/Azure/go-autorest/tracing/go_mod_tidy_hack.go new file mode 100644 index 0000000000..e163975cd4 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/tracing/go_mod_tidy_hack.go @@ -0,0 +1,24 @@ +// +build modhack + +package tracing + +// Copyright 2017 Microsoft Corporation +// +// 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, and the github.com/Azure/go-autorest import, won't actually become part of +// the resultant binary. + +// Necessary for safely adding multi-module repo. +// See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository +import _ "github.com/Azure/go-autorest" diff --git a/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md b/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md index 947210d37c..1f90c38d26 100644 --- a/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md +++ b/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 3.1.1 (2020-11-23) + +### Fixed + +- #158: Fixed issue with generated regex operation order that could cause problem + ## 3.1.0 (2020-04-15) ### Added diff --git a/vendor/github.com/Masterminds/semver/v3/constraints.go b/vendor/github.com/Masterminds/semver/v3/constraints.go index 7420823675..547613f044 100644 --- a/vendor/github.com/Masterminds/semver/v3/constraints.go +++ b/vendor/github.com/Masterminds/semver/v3/constraints.go @@ -164,14 +164,11 @@ func init() { "^": constraintCaret, } - ops := make([]string, 0, len(constraintOps)) - for k := range constraintOps { - ops = append(ops, regexp.QuoteMeta(k)) - } + ops := `=||!=|>|<|>=|=>|<=|=<|~|~>|\^` constraintRegex = regexp.MustCompile(fmt.Sprintf( `^\s*(%s)\s*(%s)\s*$`, - strings.Join(ops, "|"), + ops, cvRegex)) constraintRangeRegex = regexp.MustCompile(fmt.Sprintf( @@ -180,12 +177,12 @@ func init() { findConstraintRegex = regexp.MustCompile(fmt.Sprintf( `(%s)\s*(%s)`, - strings.Join(ops, "|"), + ops, cvRegex)) validConstraintRegex = regexp.MustCompile(fmt.Sprintf( `^(\s*(%s)\s*(%s)\s*\,?)+$`, - strings.Join(ops, "|"), + ops, cvRegex)) } diff --git a/vendor/github.com/Masterminds/sprig/v3/CHANGELOG.md b/vendor/github.com/Masterminds/sprig/v3/CHANGELOG.md index 83b8e03049..61d8ebffc3 100644 --- a/vendor/github.com/Masterminds/sprig/v3/CHANGELOG.md +++ b/vendor/github.com/Masterminds/sprig/v3/CHANGELOG.md @@ -1,5 +1,35 @@ # Changelog +## Release 3.2.0 (2020-12-14) + +### Added + +- #211: Added randInt function (thanks @kochurovro) +- #223: Added fromJson and mustFromJson functions (thanks @mholt) +- #242: Added a bcrypt function (thanks @robbiet480) +- #253: Added randBytes function (thanks @MikaelSmith) +- #254: Added dig function for dicts (thanks @nyarly) +- #257: Added regexQuoteMeta for quoting regex metadata (thanks @rheaton) +- #261: Added filepath functions osBase, osDir, osExt, osClean, osIsAbs (thanks @zugl) +- #268: Added and and all functions for testing conditions (thanks @phuslu) +- #181: Added float64 arithmetic addf, add1f, subf, divf, mulf, maxf, and minf + (thanks @andrewmostello) +- #265: Added chunk function to split array into smaller arrays (thanks @karelbilek) +- #270: Extend certificate functions to handle non-RSA keys + add support for + ed25519 keys (thanks @misberner) + +### Changed + +- Removed testing and support for Go 1.12. ed25519 support requires Go 1.13 or newer +- Using semver 3.1.1 and mergo 0.3.11 + +### Fixed + +- #249: Fix htmlDateInZone example (thanks @spawnia) + +NOTE: The dependency github.com/imdario/mergo reverted the breaking change in +0.3.9 via 0.3.10 release. + ## Release 3.1.0 (2020-04-16) NOTE: The dependency github.com/imdario/mergo made a behavior change in 0.3.9 diff --git a/vendor/github.com/Masterminds/sprig/v3/crypto.go b/vendor/github.com/Masterminds/sprig/v3/crypto.go index 7ae3991cdc..13a5cd5593 100644 --- a/vendor/github.com/Masterminds/sprig/v3/crypto.go +++ b/vendor/github.com/Masterminds/sprig/v3/crypto.go @@ -2,10 +2,12 @@ package sprig import ( "bytes" + "crypto" "crypto/aes" "crypto/cipher" "crypto/dsa" "crypto/ecdsa" + "crypto/ed25519" "crypto/elliptic" "crypto/hmac" "crypto/rand" @@ -30,7 +32,7 @@ import ( "strings" "github.com/google/uuid" - "golang.org/x/crypto/bcrypt" + bcrypt_lib "golang.org/x/crypto/bcrypt" "golang.org/x/crypto/scrypt" ) @@ -49,15 +51,28 @@ func adler32sum(input string) string { return fmt.Sprintf("%d", hash) } +func bcrypt(input string) string { + hash, err := bcrypt_lib.GenerateFromPassword([]byte(input), bcrypt_lib.DefaultCost) + if err != nil { + return fmt.Sprintf("failed to encrypt string with bcrypt: %s", err) + } + + return string(hash) +} + func htpasswd(username string, password string) string { if strings.Contains(username, ":") { return fmt.Sprintf("invalid username: %s", username) } - hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) - if err != nil { - return fmt.Sprintf("failed to create htpasswd: %s", err) + return fmt.Sprintf("%s:%s", username, bcrypt(password)) +} + +func randBytes(count int) (string, error) { + buf := make([]byte, count) + if _, err := rand.Read(buf); err != nil { + return "", err } - return fmt.Sprintf("%s:%s", username, hash) + return base64.StdEncoding.EncodeToString(buf), nil } // uuidv4 provides a safe and secure UUID v4 implementation @@ -147,6 +162,8 @@ func generatePrivateKey(typ string) string { case "ecdsa": // again, good enough for government work priv, err = ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + case "ed25519": + _, priv, err = ed25519.GenerateKey(rand.Reader) default: return "Unknown type " + typ } @@ -179,7 +196,73 @@ func pemBlockForKey(priv interface{}) *pem.Block { b, _ := x509.MarshalECPrivateKey(k) return &pem.Block{Type: "EC PRIVATE KEY", Bytes: b} default: - return nil + // attempt PKCS#8 format for all other keys + b, err := x509.MarshalPKCS8PrivateKey(k) + if err != nil { + return nil + } + return &pem.Block{Type: "PRIVATE KEY", Bytes: b} + } +} + +func parsePrivateKeyPEM(pemBlock string) (crypto.PrivateKey, error) { + block, _ := pem.Decode([]byte(pemBlock)) + if block == nil { + return nil, errors.New("no PEM data in input") + } + + if block.Type == "PRIVATE KEY" { + priv, err := x509.ParsePKCS8PrivateKey(block.Bytes) + if err != nil { + return nil, fmt.Errorf("decoding PEM as PKCS#8: %s", err) + } + return priv, nil + } else if !strings.HasSuffix(block.Type, " PRIVATE KEY") { + return nil, fmt.Errorf("no private key data in PEM block of type %s", block.Type) + } + + switch block.Type[:len(block.Type)-12] { // strip " PRIVATE KEY" + case "RSA": + priv, err := x509.ParsePKCS1PrivateKey(block.Bytes) + if err != nil { + return nil, fmt.Errorf("parsing RSA private key from PEM: %s", err) + } + return priv, nil + case "EC": + priv, err := x509.ParseECPrivateKey(block.Bytes) + if err != nil { + return nil, fmt.Errorf("parsing EC private key from PEM: %s", err) + } + return priv, nil + case "DSA": + var k DSAKeyFormat + _, err := asn1.Unmarshal(block.Bytes, &k) + if err != nil { + return nil, fmt.Errorf("parsing DSA private key from PEM: %s", err) + } + priv := &dsa.PrivateKey{ + PublicKey: dsa.PublicKey{ + Parameters: dsa.Parameters{ + P: k.P, Q: k.Q, G: k.G, + }, + Y: k.Y, + }, + X: k.X, + } + return priv, nil + default: + return nil, fmt.Errorf("invalid private key type %s", block.Type) + } +} + +func getPublicKey(priv crypto.PrivateKey) (crypto.PublicKey, error) { + switch k := priv.(type) { + case interface{ Public() crypto.PublicKey }: + return k.Public(), nil + case *dsa.PrivateKey: + return &k.PublicKey, nil + default: + return nil, fmt.Errorf("unable to get public key for type %T", priv) } } @@ -213,14 +296,10 @@ func buildCustomCertificate(b64cert string, b64key string) (certificate, error) ) } - decodedKey, _ := pem.Decode(key) - if decodedKey == nil { - return crt, errors.New("unable to decode key") - } - _, err = x509.ParsePKCS1PrivateKey(decodedKey.Bytes) + _, err = parsePrivateKeyPEM(string(key)) if err != nil { return crt, fmt.Errorf( - "error parsing prive key: decodedKey.Bytes: %s", + "error parsing private key: %s", err, ) } @@ -234,6 +313,31 @@ func buildCustomCertificate(b64cert string, b64key string) (certificate, error) func generateCertificateAuthority( cn string, daysValid int, +) (certificate, error) { + priv, err := rsa.GenerateKey(rand.Reader, 2048) + if err != nil { + return certificate{}, fmt.Errorf("error generating rsa key: %s", err) + } + + return generateCertificateAuthorityWithKeyInternal(cn, daysValid, priv) +} + +func generateCertificateAuthorityWithPEMKey( + cn string, + daysValid int, + privPEM string, +) (certificate, error) { + priv, err := parsePrivateKeyPEM(privPEM) + if err != nil { + return certificate{}, fmt.Errorf("parsing private key: %s", err) + } + return generateCertificateAuthorityWithKeyInternal(cn, daysValid, priv) +} + +func generateCertificateAuthorityWithKeyInternal( + cn string, + daysValid int, + priv crypto.PrivateKey, ) (certificate, error) { ca := certificate{} @@ -247,11 +351,6 @@ func generateCertificateAuthority( x509.KeyUsageCertSign template.IsCA = true - priv, err := rsa.GenerateKey(rand.Reader, 2048) - if err != nil { - return ca, fmt.Errorf("error generating rsa key: %s", err) - } - ca.Cert, ca.Key, err = getCertAndKey(template, priv, template, priv) return ca, err @@ -263,16 +362,39 @@ func generateSelfSignedCertificate( alternateDNS []interface{}, daysValid int, ) (certificate, error) { - cert := certificate{} + priv, err := rsa.GenerateKey(rand.Reader, 2048) + if err != nil { + return certificate{}, fmt.Errorf("error generating rsa key: %s", err) + } + return generateSelfSignedCertificateWithKeyInternal(cn, ips, alternateDNS, daysValid, priv) +} - template, err := getBaseCertTemplate(cn, ips, alternateDNS, daysValid) +func generateSelfSignedCertificateWithPEMKey( + cn string, + ips []interface{}, + alternateDNS []interface{}, + daysValid int, + privPEM string, +) (certificate, error) { + priv, err := parsePrivateKeyPEM(privPEM) if err != nil { - return cert, err + return certificate{}, fmt.Errorf("parsing private key: %s", err) } + return generateSelfSignedCertificateWithKeyInternal(cn, ips, alternateDNS, daysValid, priv) +} - priv, err := rsa.GenerateKey(rand.Reader, 2048) +func generateSelfSignedCertificateWithKeyInternal( + cn string, + ips []interface{}, + alternateDNS []interface{}, + daysValid int, + priv crypto.PrivateKey, +) (certificate, error) { + cert := certificate{} + + template, err := getBaseCertTemplate(cn, ips, alternateDNS, daysValid) if err != nil { - return cert, fmt.Errorf("error generating rsa key: %s", err) + return cert, err } cert.Cert, cert.Key, err = getCertAndKey(template, priv, template, priv) @@ -286,6 +408,36 @@ func generateSignedCertificate( alternateDNS []interface{}, daysValid int, ca certificate, +) (certificate, error) { + priv, err := rsa.GenerateKey(rand.Reader, 2048) + if err != nil { + return certificate{}, fmt.Errorf("error generating rsa key: %s", err) + } + return generateSignedCertificateWithKeyInternal(cn, ips, alternateDNS, daysValid, ca, priv) +} + +func generateSignedCertificateWithPEMKey( + cn string, + ips []interface{}, + alternateDNS []interface{}, + daysValid int, + ca certificate, + privPEM string, +) (certificate, error) { + priv, err := parsePrivateKeyPEM(privPEM) + if err != nil { + return certificate{}, fmt.Errorf("parsing private key: %s", err) + } + return generateSignedCertificateWithKeyInternal(cn, ips, alternateDNS, daysValid, ca, priv) +} + +func generateSignedCertificateWithKeyInternal( + cn string, + ips []interface{}, + alternateDNS []interface{}, + daysValid int, + ca certificate, + priv crypto.PrivateKey, ) (certificate, error) { cert := certificate{} @@ -300,14 +452,10 @@ func generateSignedCertificate( err, ) } - decodedSignerKey, _ := pem.Decode([]byte(ca.Key)) - if decodedSignerKey == nil { - return cert, errors.New("unable to decode key") - } - signerKey, err := x509.ParsePKCS1PrivateKey(decodedSignerKey.Bytes) + signerKey, err := parsePrivateKeyPEM(ca.Key) if err != nil { return cert, fmt.Errorf( - "error parsing prive key: decodedSignerKey.Bytes: %s", + "error parsing private key: %s", err, ) } @@ -317,11 +465,6 @@ func generateSignedCertificate( return cert, err } - priv, err := rsa.GenerateKey(rand.Reader, 2048) - if err != nil { - return cert, fmt.Errorf("error generating rsa key: %s", err) - } - cert.Cert, cert.Key, err = getCertAndKey( template, priv, @@ -334,15 +477,19 @@ func generateSignedCertificate( func getCertAndKey( template *x509.Certificate, - signeeKey *rsa.PrivateKey, + signeeKey crypto.PrivateKey, parent *x509.Certificate, - signingKey *rsa.PrivateKey, + signingKey crypto.PrivateKey, ) (string, string, error) { + signeePubKey, err := getPublicKey(signeeKey) + if err != nil { + return "", "", fmt.Errorf("error retrieving public key from signee key: %s", err) + } derBytes, err := x509.CreateCertificate( rand.Reader, template, parent, - &signeeKey.PublicKey, + signeePubKey, signingKey, ) if err != nil { @@ -360,10 +507,7 @@ func getCertAndKey( keyBuffer := bytes.Buffer{} if err := pem.Encode( &keyBuffer, - &pem.Block{ - Type: "RSA PRIVATE KEY", - Bytes: x509.MarshalPKCS1PrivateKey(signeeKey), - }, + pemBlockForKey(signeeKey), ); err != nil { return "", "", fmt.Errorf("error pem-encoding key: %s", err) } diff --git a/vendor/github.com/Masterminds/sprig/v3/defaults.go b/vendor/github.com/Masterminds/sprig/v3/defaults.go index 97d7d6e645..b9f979666d 100644 --- a/vendor/github.com/Masterminds/sprig/v3/defaults.go +++ b/vendor/github.com/Masterminds/sprig/v3/defaults.go @@ -3,10 +3,16 @@ package sprig import ( "bytes" "encoding/json" + "math/rand" "reflect" "strings" + "time" ) +func init() { + rand.Seed(time.Now().UnixNano()) +} + // dfault checks whether `given` is set, and returns default if not set. // // This returns `d` if `given` appears not to be set, and `given` otherwise. @@ -63,6 +69,41 @@ func coalesce(v ...interface{}) interface{} { return nil } +// all returns true if empty(x) is false for all values x in the list. +// If the list is empty, return true. +func all(v ...interface{}) bool { + for _, val := range v { + if empty(val) { + return false + } + } + return true +} + +// any returns true if empty(x) is false for any x in the list. +// If the list is empty, return false. +func any(v ...interface{}) bool { + for _, val := range v { + if !empty(val) { + return true + } + } + return false +} + +// fromJson decodes JSON into a structured value, ignoring errors. +func fromJson(v string) interface{} { + output, _ := mustFromJson(v) + return output +} + +// mustFromJson decodes JSON into a structured value, returning errors. +func mustFromJson(v string) (interface{}, error) { + var output interface{} + err := json.Unmarshal([]byte(v), &output) + return output, err +} + // toJson encodes an item into a JSON string func toJson(v interface{}) string { output, _ := json.Marshal(v) diff --git a/vendor/github.com/Masterminds/sprig/v3/dict.go b/vendor/github.com/Masterminds/sprig/v3/dict.go index 11d943fc4b..ade8896984 100644 --- a/vendor/github.com/Masterminds/sprig/v3/dict.go +++ b/vendor/github.com/Masterminds/sprig/v3/dict.go @@ -146,3 +146,29 @@ func deepCopy(i interface{}) interface{} { func mustDeepCopy(i interface{}) (interface{}, error) { return copystructure.Copy(i) } + +func dig(ps ...interface{}) (interface{}, error) { + if len(ps) < 3 { + panic("dig needs at least three arguments") + } + dict := ps[len(ps)-1].(map[string]interface{}) + def := ps[len(ps)-2] + ks := make([]string, len(ps)-2) + for i := 0; i < len(ks); i++ { + ks[i] = ps[i].(string) + } + + return digFromDict(dict, def, ks) +} + +func digFromDict(dict map[string]interface{}, d interface{}, ks []string) (interface{}, error) { + k, ns := ks[0], ks[1:len(ks)] + step, has := dict[k] + if !has { + return d, nil + } + if len(ns) == 0 { + return step, nil + } + return digFromDict(step.(map[string]interface{}), d, ns) +} diff --git a/vendor/github.com/Masterminds/sprig/v3/functions.go b/vendor/github.com/Masterminds/sprig/v3/functions.go index c16e9c3ea0..57fcec1d9e 100644 --- a/vendor/github.com/Masterminds/sprig/v3/functions.go +++ b/vendor/github.com/Masterminds/sprig/v3/functions.go @@ -3,8 +3,10 @@ package sprig import ( "errors" "html/template" + "math/rand" "os" "path" + "path/filepath" "reflect" "strconv" "strings" @@ -13,6 +15,7 @@ import ( util "github.com/Masterminds/goutils" "github.com/huandu/xstrings" + "github.com/shopspring/decimal" ) // FuncMap produces the function map. @@ -80,6 +83,7 @@ var nonhermeticFunctions = []string{ "randAlpha", "randAscii", "randNumeric", + "randBytes", "uuidv4", // OS @@ -200,9 +204,28 @@ var genericMap = map[string]interface{}{ } return val }, + "randInt": func(min, max int) int { return rand.Intn(max-min) + min }, + "add1f": func(i interface{}) float64 { + return execDecimalOp(i, []interface{}{1}, func(d1, d2 decimal.Decimal) decimal.Decimal { return d1.Add(d2) }) + }, + "addf": func(i ...interface{}) float64 { + a := interface{}(float64(0)) + return execDecimalOp(a, i, func(d1, d2 decimal.Decimal) decimal.Decimal { return d1.Add(d2) }) + }, + "subf": func(a interface{}, v ...interface{}) float64 { + return execDecimalOp(a, v, func(d1, d2 decimal.Decimal) decimal.Decimal { return d1.Sub(d2) }) + }, + "divf": func(a interface{}, v ...interface{}) float64 { + return execDecimalOp(a, v, func(d1, d2 decimal.Decimal) decimal.Decimal { return d1.Div(d2) }) + }, + "mulf": func(a interface{}, v ...interface{}) float64 { + return execDecimalOp(a, v, func(d1, d2 decimal.Decimal) decimal.Decimal { return d1.Mul(d2) }) + }, "biggest": max, "max": max, "min": min, + "maxf": maxf, + "minf": minf, "ceil": ceil, "floor": floor, "round": round, @@ -216,11 +239,15 @@ var genericMap = map[string]interface{}{ "default": dfault, "empty": empty, "coalesce": coalesce, + "all": all, + "any": any, "compact": compact, "mustCompact": mustCompact, + "fromJson": fromJson, "toJson": toJson, "toPrettyJson": toPrettyJson, "toRawJson": toRawJson, + "mustFromJson": mustFromJson, "mustToJson": mustToJson, "mustToPrettyJson": mustToPrettyJson, "mustToRawJson": mustToRawJson, @@ -243,13 +270,20 @@ var genericMap = map[string]interface{}{ // Network: "getHostByName": getHostByName, - // File Paths: + // Paths: "base": path.Base, "dir": path.Dir, "clean": path.Clean, "ext": path.Ext, "isAbs": path.IsAbs, + // Filepaths: + "osBase": filepath.Base, + "osClean": filepath.Clean, + "osDir": filepath.Dir, + "osExt": filepath.Ext, + "osIsAbs": filepath.IsAbs, + // Encoding: "b64enc": base64encode, "b64dec": base64decode, @@ -297,17 +331,25 @@ var genericMap = map[string]interface{}{ "slice": slice, "mustSlice": mustSlice, "concat": concat, + "dig": dig, + "chunk": chunk, + "mustChunk": mustChunk, // Crypto: + "bcrypt": bcrypt, "htpasswd": htpasswd, "genPrivateKey": generatePrivateKey, "derivePassword": derivePassword, "buildCustomCert": buildCustomCertificate, "genCA": generateCertificateAuthority, + "genCAWithKey": generateCertificateAuthorityWithPEMKey, "genSelfSignedCert": generateSelfSignedCertificate, + "genSelfSignedCertWithKey": generateSelfSignedCertificateWithPEMKey, "genSignedCert": generateSignedCertificate, + "genSignedCertWithKey": generateSignedCertificateWithPEMKey, "encryptAES": encryptAES, "decryptAES": decryptAES, + "randBytes": randBytes, // UUIDs: "uuidv4": uuidv4, @@ -332,6 +374,7 @@ var genericMap = map[string]interface{}{ "mustRegexReplaceAllLiteral": mustRegexReplaceAllLiteral, "regexSplit": regexSplit, "mustRegexSplit": mustRegexSplit, + "regexQuoteMeta": regexQuoteMeta, // URLs: "urlParse": urlParse, diff --git a/vendor/github.com/Masterminds/sprig/v3/go.mod b/vendor/github.com/Masterminds/sprig/v3/go.mod index e064b8d75e..672e04f89a 100644 --- a/vendor/github.com/Masterminds/sprig/v3/go.mod +++ b/vendor/github.com/Masterminds/sprig/v3/go.mod @@ -4,11 +4,12 @@ go 1.13 require ( github.com/Masterminds/goutils v1.1.0 - github.com/Masterminds/semver/v3 v3.1.0 + github.com/Masterminds/semver/v3 v3.1.1 github.com/google/uuid v1.1.1 github.com/huandu/xstrings v1.3.1 - github.com/imdario/mergo v0.3.8 + github.com/imdario/mergo v0.3.11 github.com/mitchellh/copystructure v1.0.0 + github.com/shopspring/decimal v1.2.0 github.com/spf13/cast v1.3.1 github.com/stretchr/testify v1.5.1 golang.org/x/crypto v0.0.0-20200414173820-0848c9571904 diff --git a/vendor/github.com/Masterminds/sprig/v3/go.sum b/vendor/github.com/Masterminds/sprig/v3/go.sum index 47157a6737..c1c477990b 100644 --- a/vendor/github.com/Masterminds/sprig/v3/go.sum +++ b/vendor/github.com/Masterminds/sprig/v3/go.sum @@ -1,49 +1,41 @@ github.com/Masterminds/goutils v1.1.0 h1:zukEsf/1JZwCMgHiK3GZftabmxiCw4apj3a28RPBiVg= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver/v3 v3.0.1 h1:2kKm5lb7dKVrt5TYUiAavE6oFc1cFT0057UVGT+JqLk= -github.com/Masterminds/semver/v3 v3.0.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.0.2 h1:tRi7ENs+AaOUCH+j6qwNQgPYfV26dX3JNonq+V4mhqc= -github.com/Masterminds/semver/v3 v3.0.2/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.0.3 h1:znjIyLfpXEDQjOIEWh+ehwpTU14UzUPub3c3sm36u14= -github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.1.0 h1:Y2lUDsFKVRSYGojLJ1yLxSXdMmMYTYls0rCvoqmMUQk= github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/huandu/xstrings v1.2.0 h1:yPeWdRnmynF7p+lLYz0H2tthW9lqhMJrQV/U7yy4wX0= -github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= github.com/huandu/xstrings v1.3.1 h1:4jgBlKK6tLKFvO8u5pmYjG91cqytmDCDvGh7ECVFfFs= github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= -github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= github.com/imdario/mergo v0.3.9/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.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7 h1:0hQKqeLdqlt5iIwVOBErRisrHJAN57yOiPRQItI20fU= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200414173820-0848c9571904 h1:bXoxMPcSLOq08zI3/c5dEBT6lE4eh+jOh886GHrn6V8= golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -54,3 +46,5 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/Masterminds/sprig/v3/list.go b/vendor/github.com/Masterminds/sprig/v3/list.go index 063fe4f857..ca0fbb7893 100644 --- a/vendor/github.com/Masterminds/sprig/v3/list.go +++ b/vendor/github.com/Masterminds/sprig/v3/list.go @@ -2,6 +2,7 @@ package sprig import ( "fmt" + "math" "reflect" "sort" ) @@ -72,6 +73,50 @@ func mustPrepend(list interface{}, v interface{}) ([]interface{}, error) { } } +func chunk(size int, list interface{}) [][]interface{} { + l, err := mustChunk(size, list) + if err != nil { + panic(err) + } + + return l +} + +func mustChunk(size int, list interface{}) ([][]interface{}, error) { + tp := reflect.TypeOf(list).Kind() + switch tp { + case reflect.Slice, reflect.Array: + l2 := reflect.ValueOf(list) + + l := l2.Len() + + cs := int(math.Floor(float64(l-1)/float64(size)) + 1) + nl := make([][]interface{}, cs) + + for i := 0; i < cs; i++ { + clen := size + if i == cs-1 { + clen = int(math.Floor(math.Mod(float64(l), float64(size)))) + if clen == 0 { + clen = size + } + } + + nl[i] = make([]interface{}, clen) + + for j := 0; j < clen; j++ { + ix := i*size + j + nl[i][j] = l2.Index(ix).Interface() + } + } + + return nl, nil + + default: + return nil, fmt.Errorf("Cannot chunk type %s", tp) + } +} + func last(list interface{}) interface{} { l, err := mustLast(list) if err != nil { diff --git a/vendor/github.com/Masterminds/sprig/v3/network.go b/vendor/github.com/Masterminds/sprig/v3/network.go index d786cc7363..108d78a946 100644 --- a/vendor/github.com/Masterminds/sprig/v3/network.go +++ b/vendor/github.com/Masterminds/sprig/v3/network.go @@ -7,6 +7,6 @@ import ( func getHostByName(name string) string { addrs, _ := net.LookupHost(name) - //TODO: add error handing when release v3 cames out + //TODO: add error handing when release v3 comes out return addrs[rand.Intn(len(addrs))] } diff --git a/vendor/github.com/Masterminds/sprig/v3/numeric.go b/vendor/github.com/Masterminds/sprig/v3/numeric.go index 638ef2731e..f68e4182ee 100644 --- a/vendor/github.com/Masterminds/sprig/v3/numeric.go +++ b/vendor/github.com/Masterminds/sprig/v3/numeric.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/spf13/cast" + "github.com/shopspring/decimal" ) // toFloat64 converts 64-bit floats @@ -34,6 +35,15 @@ func max(a interface{}, i ...interface{}) int64 { return aa } +func maxf(a interface{}, i ...interface{}) float64 { + aa := toFloat64(a) + for _, b := range i { + bb := toFloat64(b) + aa = math.Max(aa, bb) + } + return aa +} + func min(a interface{}, i ...interface{}) int64 { aa := toInt64(a) for _, b := range i { @@ -45,6 +55,15 @@ func min(a interface{}, i ...interface{}) int64 { return aa } +func minf(a interface{}, i ...interface{}) float64 { + aa := toFloat64(a) + for _, b := range i { + bb := toFloat64(b) + aa = math.Min(aa, bb) + } + return aa +} + func until(count int) []int { step := 1 if count < 0 { @@ -153,3 +172,15 @@ func seq(params ...int) string { func intArrayToString(slice []int, delimeter string) string { return strings.Trim(strings.Join(strings.Fields(fmt.Sprint(slice)), delimeter), "[]") } + +// performs a float and subsequent decimal.Decimal conversion on inputs, +// and iterates through a and b executing the mathmetical operation f +func execDecimalOp(a interface{}, b []interface{}, f func(d1, d2 decimal.Decimal) decimal.Decimal) float64 { + prt := decimal.NewFromFloat(toFloat64(a)) + for _, x := range b { + dx := decimal.NewFromFloat(toFloat64(x)) + prt = f(prt, dx) + } + rslt, _ := prt.Float64() + return rslt +} diff --git a/vendor/github.com/Masterminds/sprig/v3/regex.go b/vendor/github.com/Masterminds/sprig/v3/regex.go index 2370878f16..fab5510189 100644 --- a/vendor/github.com/Masterminds/sprig/v3/regex.go +++ b/vendor/github.com/Masterminds/sprig/v3/regex.go @@ -77,3 +77,7 @@ func mustRegexSplit(regex string, s string, n int) ([]string, error) { } return r.Split(s, n), nil } + +func regexQuoteMeta(s string) string { + return regexp.QuoteMeta(s) +} diff --git a/vendor/github.com/Masterminds/squirrel/go.mod b/vendor/github.com/Masterminds/squirrel/go.mod index ba46589a6f..235b74d07f 100644 --- a/vendor/github.com/Masterminds/squirrel/go.mod +++ b/vendor/github.com/Masterminds/squirrel/go.mod @@ -1,5 +1,7 @@ module github.com/Masterminds/squirrel +go 1.14 + require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 diff --git a/vendor/github.com/Masterminds/squirrel/select.go b/vendor/github.com/Masterminds/squirrel/select.go index 315fe02acb..ad5312e258 100644 --- a/vendor/github.com/Masterminds/squirrel/select.go +++ b/vendor/github.com/Masterminds/squirrel/select.go @@ -304,6 +304,16 @@ func (b SelectBuilder) RightJoin(join string, rest ...interface{}) SelectBuilder return b.JoinClause("RIGHT JOIN "+join, rest...) } +// InnerJoin adds a INNER JOIN clause to the query. +func (b SelectBuilder) InnerJoin(join string, rest ...interface{}) SelectBuilder { + return b.JoinClause("INNER JOIN "+join, rest...) +} + +// CrossJoin adds a CROSS JOIN clause to the query. +func (b SelectBuilder) CrossJoin(join string, rest ...interface{}) SelectBuilder { + return b.JoinClause("CROSS JOIN "+join, rest...) +} + // Where adds an expression to the WHERE clause of the query. // // Expressions are ANDed together in the generated SQL. diff --git a/vendor/github.com/Masterminds/squirrel/update.go b/vendor/github.com/Masterminds/squirrel/update.go index e4927d79d6..70b6f68c8a 100644 --- a/vendor/github.com/Masterminds/squirrel/update.go +++ b/vendor/github.com/Masterminds/squirrel/update.go @@ -86,7 +86,11 @@ func (d *updateData) ToSql() (sqlStr string, args []interface{}, err error) { if err != nil { return "", nil, err } - valSql = vsql + if _, ok := vs.(SelectBuilder); ok { + valSql = fmt.Sprintf("(%s)", vsql) + } else { + valSql = vsql + } args = append(args, vargs...) } else { valSql = "?" diff --git a/vendor/go.uber.org/tools/LICENSE b/vendor/github.com/blang/semver/v4/LICENSE similarity index 92% rename from vendor/go.uber.org/tools/LICENSE rename to vendor/github.com/blang/semver/v4/LICENSE index 858e02475f..5ba5c86fcb 100644 --- a/vendor/go.uber.org/tools/LICENSE +++ b/vendor/github.com/blang/semver/v4/LICENSE @@ -1,4 +1,6 @@ -Copyright (c) 2017 Uber Technologies, Inc. +The MIT License + +Copyright (c) 2014 Benedikt Lang Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -17,3 +19,4 @@ 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/blang/semver/v4/go.mod b/vendor/github.com/blang/semver/v4/go.mod new file mode 100644 index 0000000000..06d2622187 --- /dev/null +++ b/vendor/github.com/blang/semver/v4/go.mod @@ -0,0 +1,3 @@ +module github.com/blang/semver/v4 + +go 1.14 diff --git a/vendor/github.com/blang/semver/v4/json.go b/vendor/github.com/blang/semver/v4/json.go new file mode 100644 index 0000000000..a74bf7c449 --- /dev/null +++ b/vendor/github.com/blang/semver/v4/json.go @@ -0,0 +1,23 @@ +package semver + +import ( + "encoding/json" +) + +// MarshalJSON implements the encoding/json.Marshaler interface. +func (v Version) MarshalJSON() ([]byte, error) { + return json.Marshal(v.String()) +} + +// UnmarshalJSON implements the encoding/json.Unmarshaler interface. +func (v *Version) UnmarshalJSON(data []byte) (err error) { + var versionString string + + if err = json.Unmarshal(data, &versionString); err != nil { + return + } + + *v, err = Parse(versionString) + + return +} diff --git a/vendor/github.com/blang/semver/v4/range.go b/vendor/github.com/blang/semver/v4/range.go new file mode 100644 index 0000000000..95f7139b97 --- /dev/null +++ b/vendor/github.com/blang/semver/v4/range.go @@ -0,0 +1,416 @@ +package semver + +import ( + "fmt" + "strconv" + "strings" + "unicode" +) + +type wildcardType int + +const ( + noneWildcard wildcardType = iota + majorWildcard wildcardType = 1 + minorWildcard wildcardType = 2 + patchWildcard wildcardType = 3 +) + +func wildcardTypefromInt(i int) wildcardType { + switch i { + case 1: + return majorWildcard + case 2: + return minorWildcard + case 3: + return patchWildcard + default: + return noneWildcard + } +} + +type comparator func(Version, Version) bool + +var ( + compEQ comparator = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) == 0 + } + compNE = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) != 0 + } + compGT = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) == 1 + } + compGE = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) >= 0 + } + compLT = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) == -1 + } + compLE = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) <= 0 + } +) + +type versionRange struct { + v Version + c comparator +} + +// rangeFunc creates a Range from the given versionRange. +func (vr *versionRange) rangeFunc() Range { + return Range(func(v Version) bool { + return vr.c(v, vr.v) + }) +} + +// Range represents a range of versions. +// A Range can be used to check if a Version satisfies it: +// +// range, err := semver.ParseRange(">1.0.0 <2.0.0") +// range(semver.MustParse("1.1.1") // returns true +type Range func(Version) bool + +// OR combines the existing Range with another Range using logical OR. +func (rf Range) OR(f Range) Range { + return Range(func(v Version) bool { + return rf(v) || f(v) + }) +} + +// AND combines the existing Range with another Range using logical AND. +func (rf Range) AND(f Range) Range { + return Range(func(v Version) bool { + return rf(v) && f(v) + }) +} + +// ParseRange parses a range and returns a Range. +// If the range could not be parsed an error is returned. +// +// Valid ranges are: +// - "<1.0.0" +// - "<=1.0.0" +// - ">1.0.0" +// - ">=1.0.0" +// - "1.0.0", "=1.0.0", "==1.0.0" +// - "!1.0.0", "!=1.0.0" +// +// A Range can consist of multiple ranges separated by space: +// Ranges can be linked by logical AND: +// - ">1.0.0 <2.0.0" would match between both ranges, so "1.1.1" and "1.8.7" but not "1.0.0" or "2.0.0" +// - ">1.0.0 <3.0.0 !2.0.3-beta.2" would match every version between 1.0.0 and 3.0.0 except 2.0.3-beta.2 +// +// Ranges can also be linked by logical OR: +// - "<2.0.0 || >=3.0.0" would match "1.x.x" and "3.x.x" but not "2.x.x" +// +// AND has a higher precedence than OR. It's not possible to use brackets. +// +// Ranges can be combined by both AND and OR +// +// - `>1.0.0 <2.0.0 || >3.0.0 !4.2.1` would match `1.2.3`, `1.9.9`, `3.1.1`, but not `4.2.1`, `2.1.1` +func ParseRange(s string) (Range, error) { + parts := splitAndTrim(s) + orParts, err := splitORParts(parts) + if err != nil { + return nil, err + } + expandedParts, err := expandWildcardVersion(orParts) + if err != nil { + return nil, err + } + var orFn Range + for _, p := range expandedParts { + var andFn Range + for _, ap := range p { + opStr, vStr, err := splitComparatorVersion(ap) + if err != nil { + return nil, err + } + vr, err := buildVersionRange(opStr, vStr) + if err != nil { + return nil, fmt.Errorf("Could not parse Range %q: %s", ap, err) + } + rf := vr.rangeFunc() + + // Set function + if andFn == nil { + andFn = rf + } else { // Combine with existing function + andFn = andFn.AND(rf) + } + } + if orFn == nil { + orFn = andFn + } else { + orFn = orFn.OR(andFn) + } + + } + return orFn, nil +} + +// splitORParts splits the already cleaned parts by '||'. +// Checks for invalid positions of the operator and returns an +// error if found. +func splitORParts(parts []string) ([][]string, error) { + var ORparts [][]string + last := 0 + for i, p := range parts { + if p == "||" { + if i == 0 { + return nil, fmt.Errorf("First element in range is '||'") + } + ORparts = append(ORparts, parts[last:i]) + last = i + 1 + } + } + if last == len(parts) { + return nil, fmt.Errorf("Last element in range is '||'") + } + ORparts = append(ORparts, parts[last:]) + return ORparts, nil +} + +// buildVersionRange takes a slice of 2: operator and version +// and builds a versionRange, otherwise an error. +func buildVersionRange(opStr, vStr string) (*versionRange, error) { + c := parseComparator(opStr) + if c == nil { + return nil, fmt.Errorf("Could not parse comparator %q in %q", opStr, strings.Join([]string{opStr, vStr}, "")) + } + v, err := Parse(vStr) + if err != nil { + return nil, fmt.Errorf("Could not parse version %q in %q: %s", vStr, strings.Join([]string{opStr, vStr}, ""), err) + } + + return &versionRange{ + v: v, + c: c, + }, nil + +} + +// inArray checks if a byte is contained in an array of bytes +func inArray(s byte, list []byte) bool { + for _, el := range list { + if el == s { + return true + } + } + return false +} + +// splitAndTrim splits a range string by spaces and cleans whitespaces +func splitAndTrim(s string) (result []string) { + last := 0 + var lastChar byte + excludeFromSplit := []byte{'>', '<', '='} + for i := 0; i < len(s); i++ { + if s[i] == ' ' && !inArray(lastChar, excludeFromSplit) { + if last < i-1 { + result = append(result, s[last:i]) + } + last = i + 1 + } else if s[i] != ' ' { + lastChar = s[i] + } + } + if last < len(s)-1 { + result = append(result, s[last:]) + } + + for i, v := range result { + result[i] = strings.Replace(v, " ", "", -1) + } + + // parts := strings.Split(s, " ") + // for _, x := range parts { + // if s := strings.TrimSpace(x); len(s) != 0 { + // result = append(result, s) + // } + // } + return +} + +// splitComparatorVersion splits the comparator from the version. +// Input must be free of leading or trailing spaces. +func splitComparatorVersion(s string) (string, string, error) { + i := strings.IndexFunc(s, unicode.IsDigit) + if i == -1 { + return "", "", fmt.Errorf("Could not get version from string: %q", s) + } + return strings.TrimSpace(s[0:i]), s[i:], nil +} + +// getWildcardType will return the type of wildcard that the +// passed version contains +func getWildcardType(vStr string) wildcardType { + parts := strings.Split(vStr, ".") + nparts := len(parts) + wildcard := parts[nparts-1] + + possibleWildcardType := wildcardTypefromInt(nparts) + if wildcard == "x" { + return possibleWildcardType + } + + return noneWildcard +} + +// createVersionFromWildcard will convert a wildcard version +// into a regular version, replacing 'x's with '0's, handling +// special cases like '1.x.x' and '1.x' +func createVersionFromWildcard(vStr string) string { + // handle 1.x.x + vStr2 := strings.Replace(vStr, ".x.x", ".x", 1) + vStr2 = strings.Replace(vStr2, ".x", ".0", 1) + parts := strings.Split(vStr2, ".") + + // handle 1.x + if len(parts) == 2 { + return vStr2 + ".0" + } + + return vStr2 +} + +// incrementMajorVersion will increment the major version +// of the passed version +func incrementMajorVersion(vStr string) (string, error) { + parts := strings.Split(vStr, ".") + i, err := strconv.Atoi(parts[0]) + if err != nil { + return "", err + } + parts[0] = strconv.Itoa(i + 1) + + return strings.Join(parts, "."), nil +} + +// incrementMajorVersion will increment the minor version +// of the passed version +func incrementMinorVersion(vStr string) (string, error) { + parts := strings.Split(vStr, ".") + i, err := strconv.Atoi(parts[1]) + if err != nil { + return "", err + } + parts[1] = strconv.Itoa(i + 1) + + return strings.Join(parts, "."), nil +} + +// expandWildcardVersion will expand wildcards inside versions +// following these rules: +// +// * when dealing with patch wildcards: +// >= 1.2.x will become >= 1.2.0 +// <= 1.2.x will become < 1.3.0 +// > 1.2.x will become >= 1.3.0 +// < 1.2.x will become < 1.2.0 +// != 1.2.x will become < 1.2.0 >= 1.3.0 +// +// * when dealing with minor wildcards: +// >= 1.x will become >= 1.0.0 +// <= 1.x will become < 2.0.0 +// > 1.x will become >= 2.0.0 +// < 1.0 will become < 1.0.0 +// != 1.x will become < 1.0.0 >= 2.0.0 +// +// * when dealing with wildcards without +// version operator: +// 1.2.x will become >= 1.2.0 < 1.3.0 +// 1.x will become >= 1.0.0 < 2.0.0 +func expandWildcardVersion(parts [][]string) ([][]string, error) { + var expandedParts [][]string + for _, p := range parts { + var newParts []string + for _, ap := range p { + if strings.Contains(ap, "x") { + opStr, vStr, err := splitComparatorVersion(ap) + if err != nil { + return nil, err + } + + versionWildcardType := getWildcardType(vStr) + flatVersion := createVersionFromWildcard(vStr) + + var resultOperator string + var shouldIncrementVersion bool + switch opStr { + case ">": + resultOperator = ">=" + shouldIncrementVersion = true + case ">=": + resultOperator = ">=" + case "<": + resultOperator = "<" + case "<=": + resultOperator = "<" + shouldIncrementVersion = true + case "", "=", "==": + newParts = append(newParts, ">="+flatVersion) + resultOperator = "<" + shouldIncrementVersion = true + case "!=", "!": + newParts = append(newParts, "<"+flatVersion) + resultOperator = ">=" + shouldIncrementVersion = true + } + + var resultVersion string + if shouldIncrementVersion { + switch versionWildcardType { + case patchWildcard: + resultVersion, _ = incrementMinorVersion(flatVersion) + case minorWildcard: + resultVersion, _ = incrementMajorVersion(flatVersion) + } + } else { + resultVersion = flatVersion + } + + ap = resultOperator + resultVersion + } + newParts = append(newParts, ap) + } + expandedParts = append(expandedParts, newParts) + } + + return expandedParts, nil +} + +func parseComparator(s string) comparator { + switch s { + case "==": + fallthrough + case "": + fallthrough + case "=": + return compEQ + case ">": + return compGT + case ">=": + return compGE + case "<": + return compLT + case "<=": + return compLE + case "!": + fallthrough + case "!=": + return compNE + } + + return nil +} + +// MustParseRange is like ParseRange but panics if the range cannot be parsed. +func MustParseRange(s string) Range { + r, err := ParseRange(s) + if err != nil { + panic(`semver: ParseRange(` + s + `): ` + err.Error()) + } + return r +} diff --git a/vendor/github.com/blang/semver/v4/semver.go b/vendor/github.com/blang/semver/v4/semver.go new file mode 100644 index 0000000000..307de610f9 --- /dev/null +++ b/vendor/github.com/blang/semver/v4/semver.go @@ -0,0 +1,476 @@ +package semver + +import ( + "errors" + "fmt" + "strconv" + "strings" +) + +const ( + numbers string = "0123456789" + alphas = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-" + alphanum = alphas + numbers +) + +// SpecVersion is the latest fully supported spec version of semver +var SpecVersion = Version{ + Major: 2, + Minor: 0, + Patch: 0, +} + +// Version represents a semver compatible version +type Version struct { + Major uint64 + Minor uint64 + Patch uint64 + Pre []PRVersion + Build []string //No Precedence +} + +// Version to string +func (v Version) String() string { + b := make([]byte, 0, 5) + b = strconv.AppendUint(b, v.Major, 10) + b = append(b, '.') + b = strconv.AppendUint(b, v.Minor, 10) + b = append(b, '.') + b = strconv.AppendUint(b, v.Patch, 10) + + if len(v.Pre) > 0 { + b = append(b, '-') + b = append(b, v.Pre[0].String()...) + + for _, pre := range v.Pre[1:] { + b = append(b, '.') + b = append(b, pre.String()...) + } + } + + if len(v.Build) > 0 { + b = append(b, '+') + b = append(b, v.Build[0]...) + + for _, build := range v.Build[1:] { + b = append(b, '.') + b = append(b, build...) + } + } + + return string(b) +} + +// FinalizeVersion discards prerelease and build number and only returns +// major, minor and patch number. +func (v Version) FinalizeVersion() string { + b := make([]byte, 0, 5) + b = strconv.AppendUint(b, v.Major, 10) + b = append(b, '.') + b = strconv.AppendUint(b, v.Minor, 10) + b = append(b, '.') + b = strconv.AppendUint(b, v.Patch, 10) + return string(b) +} + +// Equals checks if v is equal to o. +func (v Version) Equals(o Version) bool { + return (v.Compare(o) == 0) +} + +// EQ checks if v is equal to o. +func (v Version) EQ(o Version) bool { + return (v.Compare(o) == 0) +} + +// NE checks if v is not equal to o. +func (v Version) NE(o Version) bool { + return (v.Compare(o) != 0) +} + +// GT checks if v is greater than o. +func (v Version) GT(o Version) bool { + return (v.Compare(o) == 1) +} + +// GTE checks if v is greater than or equal to o. +func (v Version) GTE(o Version) bool { + return (v.Compare(o) >= 0) +} + +// GE checks if v is greater than or equal to o. +func (v Version) GE(o Version) bool { + return (v.Compare(o) >= 0) +} + +// LT checks if v is less than o. +func (v Version) LT(o Version) bool { + return (v.Compare(o) == -1) +} + +// LTE checks if v is less than or equal to o. +func (v Version) LTE(o Version) bool { + return (v.Compare(o) <= 0) +} + +// LE checks if v is less than or equal to o. +func (v Version) LE(o Version) bool { + return (v.Compare(o) <= 0) +} + +// Compare compares Versions v to o: +// -1 == v is less than o +// 0 == v is equal to o +// 1 == v is greater than o +func (v Version) Compare(o Version) int { + if v.Major != o.Major { + if v.Major > o.Major { + return 1 + } + return -1 + } + if v.Minor != o.Minor { + if v.Minor > o.Minor { + return 1 + } + return -1 + } + if v.Patch != o.Patch { + if v.Patch > o.Patch { + return 1 + } + return -1 + } + + // Quick comparison if a version has no prerelease versions + if len(v.Pre) == 0 && len(o.Pre) == 0 { + return 0 + } else if len(v.Pre) == 0 && len(o.Pre) > 0 { + return 1 + } else if len(v.Pre) > 0 && len(o.Pre) == 0 { + return -1 + } + + i := 0 + for ; i < len(v.Pre) && i < len(o.Pre); i++ { + if comp := v.Pre[i].Compare(o.Pre[i]); comp == 0 { + continue + } else if comp == 1 { + return 1 + } else { + return -1 + } + } + + // If all pr versions are the equal but one has further prversion, this one greater + if i == len(v.Pre) && i == len(o.Pre) { + return 0 + } else if i == len(v.Pre) && i < len(o.Pre) { + return -1 + } else { + return 1 + } + +} + +// IncrementPatch increments the patch version +func (v *Version) IncrementPatch() error { + v.Patch++ + return nil +} + +// IncrementMinor increments the minor version +func (v *Version) IncrementMinor() error { + v.Minor++ + v.Patch = 0 + return nil +} + +// IncrementMajor increments the major version +func (v *Version) IncrementMajor() error { + v.Major++ + v.Minor = 0 + v.Patch = 0 + return nil +} + +// Validate validates v and returns error in case +func (v Version) Validate() error { + // Major, Minor, Patch already validated using uint64 + + for _, pre := range v.Pre { + if !pre.IsNum { //Numeric prerelease versions already uint64 + if len(pre.VersionStr) == 0 { + return fmt.Errorf("Prerelease can not be empty %q", pre.VersionStr) + } + if !containsOnly(pre.VersionStr, alphanum) { + return fmt.Errorf("Invalid character(s) found in prerelease %q", pre.VersionStr) + } + } + } + + for _, build := range v.Build { + if len(build) == 0 { + return fmt.Errorf("Build meta data can not be empty %q", build) + } + if !containsOnly(build, alphanum) { + return fmt.Errorf("Invalid character(s) found in build meta data %q", build) + } + } + + return nil +} + +// New is an alias for Parse and returns a pointer, parses version string and returns a validated Version or error +func New(s string) (*Version, error) { + v, err := Parse(s) + vp := &v + return vp, err +} + +// Make is an alias for Parse, parses version string and returns a validated Version or error +func Make(s string) (Version, error) { + return Parse(s) +} + +// ParseTolerant allows for certain version specifications that do not strictly adhere to semver +// specs to be parsed by this library. It does so by normalizing versions before passing them to +// Parse(). It currently trims spaces, removes a "v" prefix, adds a 0 patch number to versions +// with only major and minor components specified, and removes leading 0s. +func ParseTolerant(s string) (Version, error) { + s = strings.TrimSpace(s) + s = strings.TrimPrefix(s, "v") + + // Split into major.minor.(patch+pr+meta) + parts := strings.SplitN(s, ".", 3) + // Remove leading zeros. + for i, p := range parts { + if len(p) > 1 { + p = strings.TrimLeft(p, "0") + if len(p) == 0 || !strings.ContainsAny(p[0:1], "0123456789") { + p = "0" + p + } + parts[i] = p + } + } + // Fill up shortened versions. + if len(parts) < 3 { + if strings.ContainsAny(parts[len(parts)-1], "+-") { + return Version{}, errors.New("Short version cannot contain PreRelease/Build meta data") + } + for len(parts) < 3 { + parts = append(parts, "0") + } + } + s = strings.Join(parts, ".") + + return Parse(s) +} + +// Parse parses version string and returns a validated Version or error +func Parse(s string) (Version, error) { + if len(s) == 0 { + return Version{}, errors.New("Version string empty") + } + + // Split into major.minor.(patch+pr+meta) + parts := strings.SplitN(s, ".", 3) + if len(parts) != 3 { + return Version{}, errors.New("No Major.Minor.Patch elements found") + } + + // Major + if !containsOnly(parts[0], numbers) { + return Version{}, fmt.Errorf("Invalid character(s) found in major number %q", parts[0]) + } + if hasLeadingZeroes(parts[0]) { + return Version{}, fmt.Errorf("Major number must not contain leading zeroes %q", parts[0]) + } + major, err := strconv.ParseUint(parts[0], 10, 64) + if err != nil { + return Version{}, err + } + + // Minor + if !containsOnly(parts[1], numbers) { + return Version{}, fmt.Errorf("Invalid character(s) found in minor number %q", parts[1]) + } + if hasLeadingZeroes(parts[1]) { + return Version{}, fmt.Errorf("Minor number must not contain leading zeroes %q", parts[1]) + } + minor, err := strconv.ParseUint(parts[1], 10, 64) + if err != nil { + return Version{}, err + } + + v := Version{} + v.Major = major + v.Minor = minor + + var build, prerelease []string + patchStr := parts[2] + + if buildIndex := strings.IndexRune(patchStr, '+'); buildIndex != -1 { + build = strings.Split(patchStr[buildIndex+1:], ".") + patchStr = patchStr[:buildIndex] + } + + if preIndex := strings.IndexRune(patchStr, '-'); preIndex != -1 { + prerelease = strings.Split(patchStr[preIndex+1:], ".") + patchStr = patchStr[:preIndex] + } + + if !containsOnly(patchStr, numbers) { + return Version{}, fmt.Errorf("Invalid character(s) found in patch number %q", patchStr) + } + if hasLeadingZeroes(patchStr) { + return Version{}, fmt.Errorf("Patch number must not contain leading zeroes %q", patchStr) + } + patch, err := strconv.ParseUint(patchStr, 10, 64) + if err != nil { + return Version{}, err + } + + v.Patch = patch + + // Prerelease + for _, prstr := range prerelease { + parsedPR, err := NewPRVersion(prstr) + if err != nil { + return Version{}, err + } + v.Pre = append(v.Pre, parsedPR) + } + + // Build meta data + for _, str := range build { + if len(str) == 0 { + return Version{}, errors.New("Build meta data is empty") + } + if !containsOnly(str, alphanum) { + return Version{}, fmt.Errorf("Invalid character(s) found in build meta data %q", str) + } + v.Build = append(v.Build, str) + } + + return v, nil +} + +// MustParse is like Parse but panics if the version cannot be parsed. +func MustParse(s string) Version { + v, err := Parse(s) + if err != nil { + panic(`semver: Parse(` + s + `): ` + err.Error()) + } + return v +} + +// PRVersion represents a PreRelease Version +type PRVersion struct { + VersionStr string + VersionNum uint64 + IsNum bool +} + +// NewPRVersion creates a new valid prerelease version +func NewPRVersion(s string) (PRVersion, error) { + if len(s) == 0 { + return PRVersion{}, errors.New("Prerelease is empty") + } + v := PRVersion{} + if containsOnly(s, numbers) { + if hasLeadingZeroes(s) { + return PRVersion{}, fmt.Errorf("Numeric PreRelease version must not contain leading zeroes %q", s) + } + num, err := strconv.ParseUint(s, 10, 64) + + // Might never be hit, but just in case + if err != nil { + return PRVersion{}, err + } + v.VersionNum = num + v.IsNum = true + } else if containsOnly(s, alphanum) { + v.VersionStr = s + v.IsNum = false + } else { + return PRVersion{}, fmt.Errorf("Invalid character(s) found in prerelease %q", s) + } + return v, nil +} + +// IsNumeric checks if prerelease-version is numeric +func (v PRVersion) IsNumeric() bool { + return v.IsNum +} + +// Compare compares two PreRelease Versions v and o: +// -1 == v is less than o +// 0 == v is equal to o +// 1 == v is greater than o +func (v PRVersion) Compare(o PRVersion) int { + if v.IsNum && !o.IsNum { + return -1 + } else if !v.IsNum && o.IsNum { + return 1 + } else if v.IsNum && o.IsNum { + if v.VersionNum == o.VersionNum { + return 0 + } else if v.VersionNum > o.VersionNum { + return 1 + } else { + return -1 + } + } else { // both are Alphas + if v.VersionStr == o.VersionStr { + return 0 + } else if v.VersionStr > o.VersionStr { + return 1 + } else { + return -1 + } + } +} + +// PreRelease version to string +func (v PRVersion) String() string { + if v.IsNum { + return strconv.FormatUint(v.VersionNum, 10) + } + return v.VersionStr +} + +func containsOnly(s string, set string) bool { + return strings.IndexFunc(s, func(r rune) bool { + return !strings.ContainsRune(set, r) + }) == -1 +} + +func hasLeadingZeroes(s string) bool { + return len(s) > 1 && s[0] == '0' +} + +// NewBuildVersion creates a new valid build version +func NewBuildVersion(s string) (string, error) { + if len(s) == 0 { + return "", errors.New("Buildversion is empty") + } + if !containsOnly(s, alphanum) { + return "", fmt.Errorf("Invalid character(s) found in build meta data %q", s) + } + return s, nil +} + +// FinalizeVersion returns the major, minor and patch number only and discards +// prerelease and build number. +func FinalizeVersion(s string) (string, error) { + v, err := Parse(s) + if err != nil { + return "", err + } + v.Pre = nil + v.Build = nil + + finalVer := v.String() + return finalVer, nil +} diff --git a/vendor/github.com/blang/semver/v4/sort.go b/vendor/github.com/blang/semver/v4/sort.go new file mode 100644 index 0000000000..e18f880826 --- /dev/null +++ b/vendor/github.com/blang/semver/v4/sort.go @@ -0,0 +1,28 @@ +package semver + +import ( + "sort" +) + +// Versions represents multiple versions. +type Versions []Version + +// Len returns length of version collection +func (s Versions) Len() int { + return len(s) +} + +// Swap swaps two versions inside the collection by its indices +func (s Versions) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +// Less checks if version at index i is less than version at index j +func (s Versions) Less(i, j int) bool { + return s[i].LT(s[j]) +} + +// Sort sorts a slice of versions +func Sort(versions []Version) { + sort.Sort(Versions(versions)) +} diff --git a/vendor/github.com/blang/semver/v4/sql.go b/vendor/github.com/blang/semver/v4/sql.go new file mode 100644 index 0000000000..db958134f3 --- /dev/null +++ b/vendor/github.com/blang/semver/v4/sql.go @@ -0,0 +1,30 @@ +package semver + +import ( + "database/sql/driver" + "fmt" +) + +// Scan implements the database/sql.Scanner interface. +func (v *Version) Scan(src interface{}) (err error) { + var str string + switch src := src.(type) { + case string: + str = src + case []byte: + str = string(src) + default: + return fmt.Errorf("version.Scan: cannot convert %T to string", src) + } + + if t, err := Parse(str); err == nil { + *v = t + } + + return +} + +// Value implements the database/sql/driver.Valuer interface. +func (v Version) Value() (driver.Value, error) { + return v.String(), nil +} diff --git a/vendor/github.com/containerd/continuity/pathdriver/path_driver.go b/vendor/github.com/containerd/continuity/pathdriver/path_driver.go deleted file mode 100644 index b0d5a6b567..0000000000 --- a/vendor/github.com/containerd/continuity/pathdriver/path_driver.go +++ /dev/null @@ -1,101 +0,0 @@ -/* - Copyright The containerd Authors. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package pathdriver - -import ( - "path/filepath" -) - -// PathDriver provides all of the path manipulation functions in a common -// interface. The context should call these and never use the `filepath` -// package or any other package to manipulate paths. -type PathDriver interface { - Join(paths ...string) string - IsAbs(path string) bool - Rel(base, target string) (string, error) - Base(path string) string - Dir(path string) string - Clean(path string) string - Split(path string) (dir, file string) - Separator() byte - Abs(path string) (string, error) - Walk(string, filepath.WalkFunc) error - FromSlash(path string) string - ToSlash(path string) string - Match(pattern, name string) (matched bool, err error) -} - -// pathDriver is a simple default implementation calls the filepath package. -type pathDriver struct{} - -// LocalPathDriver is the exported pathDriver struct for convenience. -var LocalPathDriver PathDriver = &pathDriver{} - -func (*pathDriver) Join(paths ...string) string { - return filepath.Join(paths...) -} - -func (*pathDriver) IsAbs(path string) bool { - return filepath.IsAbs(path) -} - -func (*pathDriver) Rel(base, target string) (string, error) { - return filepath.Rel(base, target) -} - -func (*pathDriver) Base(path string) string { - return filepath.Base(path) -} - -func (*pathDriver) Dir(path string) string { - return filepath.Dir(path) -} - -func (*pathDriver) Clean(path string) string { - return filepath.Clean(path) -} - -func (*pathDriver) Split(path string) (dir, file string) { - return filepath.Split(path) -} - -func (*pathDriver) Separator() byte { - return filepath.Separator -} - -func (*pathDriver) Abs(path string) (string, error) { - return filepath.Abs(path) -} - -// Note that filepath.Walk calls os.Stat, so if the context wants to -// to call Driver.Stat() for Walk, they need to create a new struct that -// overrides this method. -func (*pathDriver) Walk(root string, walkFn filepath.WalkFunc) error { - return filepath.Walk(root, walkFn) -} - -func (*pathDriver) FromSlash(path string) string { - return filepath.FromSlash(path) -} - -func (*pathDriver) ToSlash(path string) string { - return filepath.ToSlash(path) -} - -func (*pathDriver) Match(pattern, name string) (bool, error) { - return filepath.Match(pattern, name) -} diff --git a/vendor/github.com/docker/docker/AUTHORS b/vendor/github.com/docker/docker/AUTHORS index d5b6cbbead..ad166ba8df 100644 --- a/vendor/github.com/docker/docker/AUTHORS +++ b/vendor/github.com/docker/docker/AUTHORS @@ -18,6 +18,7 @@ Abhishek Chanda Abhishek Sharma Abin Shahab Adam Avilla +Adam Dobrawy Adam Eijdenberg Adam Kunk Adam Miller @@ -113,6 +114,7 @@ Anda Xu Anders Janmyr Andre Dublin <81dublin@gmail.com> Andre Granovsky +Andrea Denisse Gómez Andrea Luzzardi Andrea Turli Andreas Elvers @@ -177,8 +179,10 @@ Anusha Ragunathan apocas Arash Deshmeh ArikaChen +Arko Dasgupta Arnaud Lefebvre Arnaud Porterie +Arnaud Rebillout Arthur Barr Arthur Gautier Artur Meyster @@ -280,6 +284,7 @@ Carl Loa Odin Carl X. Su Carlo Mion Carlos Alexandro Becker +Carlos de Paula Carlos Sanchez Carol Fager-Higgins Cary @@ -329,6 +334,7 @@ Chris Gibson Chris Khoo Chris McKinnel Chris McKinnel +Chris Price Chris Seto Chris Snow Chris St. Pierre @@ -418,12 +424,14 @@ Daniel Norberg Daniel Nordberg Daniel Robinson Daniel S +Daniel Sweet Daniel Von Fange Daniel Watkins Daniel X Moore Daniel YC Lin Daniel Zhang Danny Berger +Danny Milosavljevic Danny Yates Danyal Khaliq Darren Coxall @@ -517,6 +525,8 @@ Dmitry Smirnov Dmitry V. Krivenok Dmitry Vorobev Dolph Mathews +Dominic Tubach +Dominic Yin Dominik Dingel Dominik Finkbeiner Dominik Honnef @@ -585,6 +595,7 @@ Erik Weathers Erno Hopearuoho Erwin van der Koogh Ethan Bell +Ethan Mosbaugh Euan Kemp Eugen Krizo Eugene Yakubovich @@ -621,6 +632,7 @@ Fareed Dudhia Fathi Boudra Federico Gimenez Felipe Oliveira +Felipe Ruhland Felix Abecassis Felix Geisendörfer Felix Hupfeld @@ -655,6 +667,7 @@ Frank Groeneveld Frank Herrmann Frank Macreery Frank Rosquin +frankyang Fred Lifton Frederick F. Kautz IV Frederik Loeffert @@ -702,6 +715,7 @@ Gleb M Borisov Glyn Normington GoBella Goffert van Gool +Goldwyn Rodrigues Gopikannan Venugopalsamy Gosuke Miyashita Gou Rao @@ -725,6 +739,7 @@ Guruprasad Gustav Sinder gwx296173 Günter Zöchbauer +Haichao Yang haikuoliu Hakan Özler Hamish Hutchings @@ -733,6 +748,7 @@ Hans Rødtang Hao Shu Wei Hao Zhang <21521210@zju.edu.cn> Harald Albers +Harald Niesche Harley Laue Harold Cooper Harrison Turton @@ -752,9 +768,11 @@ Hobofan Hollie Teal Hong Xu Hongbin Lu +Hongxu Jia hsinko <21551195@zju.edu.cn> Hu Keping Hu Tao +HuanHuan Ye Huanzhong Zhang Huayi Zhang Hugo Duncan @@ -898,6 +916,7 @@ Jie Luo Jihyun Hwang Jilles Oldenbeuving Jim Alateras +Jim Ehrismann Jim Galasyn Jim Minter Jim Perrin @@ -935,7 +954,7 @@ John Feminella John Gardiner Myers John Gossman John Harris -John Howard (VM) +John Howard John Laswell John Maguire John Mulhausen @@ -949,6 +968,7 @@ John Willis Jon Johnson Jon Surrell Jon Wedaman +Jonas Dohse Jonas Pfenniger Jonathan A. Schweder Jonathan A. Sternberg @@ -1002,6 +1022,7 @@ Julio Montes Jun-Ru Chang Jussi Nummelin Justas Brazauskas +Justen Martin Justin Cormack Justin Force Justin Menga @@ -1010,6 +1031,7 @@ Justin Simonelis Justin Terry Justyn Temme Jyrki Puttonen +Jérémy Leherpeur Jérôme Petazzoni Jörg Thalheim K. Heller @@ -1047,6 +1069,7 @@ Ken Reese Kenfe-Mickaël Laventure Kenjiro Nakayama Kent Johnson +Kenta Tada Kevin "qwazerty" Houdebert Kevin Burke Kevin Clark @@ -1057,6 +1080,7 @@ Kevin Kern Kevin Menard Kevin Meredith Kevin P. Kucharczyk +Kevin Parsons Kevin Richardson Kevin Shi Kevin Wallace @@ -1147,6 +1171,7 @@ longliqiang88 <394564827@qq.com> Lorenz Leutgeb Lorenzo Fontana Lotus Fenn +Louis Delossantos Louis Opter Luca Favatella Luca Marturana @@ -1159,12 +1184,14 @@ Lucas Silvestre Luciano Mores Luis Martínez de Bartolomé Izquierdo Luiz Svoboda +Lukas Heeren Lukas Waslowski lukaspustina Lukasz Zajaczkowski Luke Marsden Lyn Lynda O'Leary +lzhfromutsc Lénaïc Huard Ma Müller Ma Shimiao @@ -1298,6 +1325,7 @@ Michael Stapelberg Michael Steinert Michael Thies Michael West +Michael Zhao Michal Fojtik Michal Gebauer Michal Jemala @@ -1382,6 +1410,7 @@ Neyazul Haque Nghia Tran Niall O'Higgins Nicholas E. Rabenau +Nick Adcock Nick DeCoursin Nick Irvine Nick Neisen @@ -1420,6 +1449,7 @@ Nuutti Kotivuori nzwsch O.S. Tezer objectified +Odin Ugedal Oguz Bilgic Oh Jinkyun Ohad Schneider @@ -1430,6 +1460,7 @@ Oliver Reason Olivier Gambier Olle Jonsson Olli Janatuinen +Olly Pomeroy Omri Shiv Oriol Francès Oskar Niburski @@ -1439,6 +1470,7 @@ Ovidio Mallo Panagiotis Moustafellos Paolo G. Giarrusso Pascal +Pascal Bach Pascal Borreli Pascal Hartig Patrick Böänziger @@ -1463,6 +1495,7 @@ Paul Nasrat Paul Weaver Paulo Ribeiro Pavel Lobashov +Pavel Matěja Pavel Pletenev Pavel Pospisil Pavel Sutyrin @@ -1574,6 +1607,7 @@ Riku Voipio Riley Guerin Ritesh H Shukla Riyaz Faizullabhoy +Rob Gulewich Rob Vesse Robert Bachmann Robert Bittle @@ -1582,11 +1616,13 @@ Robert Schneider Robert Stern Robert Terhaar Robert Wallis +Robert Wang Roberto G. Hashioka Roberto Muñoz Fernández Robin Naundorf Robin Schneider Robin Speekenbrink +Robin Thoni robpc Rodolfo Carvalho Rodrigo Vaz @@ -1620,6 +1656,7 @@ Rozhnov Alexandr Rudolph Gottesheim Rui Cao Rui Lopes +Ruilin Li Runshen Zhu Russ Magee Ryan Abrams @@ -1658,6 +1695,7 @@ Sam J Sharpe Sam Neirinck Sam Reis Sam Rijs +Sam Whited Sambuddha Basu Sami Wagiaalla Samuel Andaya @@ -1672,6 +1710,7 @@ sapphiredev Sargun Dhillon Sascha Andres Sascha Grunert +SataQiu Satnam Singh Satoshi Amemiya Satoshi Tagomori @@ -1720,6 +1759,7 @@ Shijun Qin Shishir Mahajan Shoubhik Bose Shourya Sarcar +Shu-Wai Chow shuai-z Shukui Yang Shuwei Hao @@ -1730,6 +1770,7 @@ Silas Sewell Silvan Jegen Simão Reis Simei He +Simon Barendse Simon Eskildsen Simon Ferquel Simon Leinen @@ -1738,6 +1779,7 @@ Simon Taranto Simon Vikstrom Sindhu S Sjoerd Langkemper +skanehira Solganik Alexander Solomon Hykes Song Gao @@ -1749,6 +1791,7 @@ Sridatta Thatipamala Sridhar Ratnakumar Srini Brahmaroutu Srinivasan Srivatsan +Staf Wagemakers Stanislav Bondarenko Steeve Morin Stefan Berger @@ -1759,6 +1802,7 @@ Stefan Scherer Stefan Staudenmeyer Stefan Weil Stephan Spindler +Stephen Benjamin Stephen Crosby Stephen Day Stephen Drake @@ -1775,10 +1819,12 @@ Steven Iveson Steven Merrill Steven Richards Steven Taylor +Stig Larsson Subhajit Ghosh Sujith Haridasan Sun Gengze <690388648@qq.com> Sun Jianbo +Sune Keller Sunny Gogoi Suryakumar Sudar Sven Dowideit @@ -1829,6 +1875,7 @@ Tianyi Wang Tibor Vass Tiffany Jernigan Tiffany Low +Tim Tim Bart Tim Bosse Tim Dettrick @@ -1914,6 +1961,7 @@ Victor Palma Victor Vieux Victoria Bialas Vijaya Kumar K +Vikram bir Singh Viktor Stanchev Viktor Vojnovski VinayRaghavanKS @@ -1971,6 +2019,7 @@ Wenyu You <21551128@zju.edu.cn> Wenzhi Liang Wes Morgan Wewang Xiaorenfine +Wiktor Kwapisiewicz Will Dietz Will Rouesnel Will Weaver @@ -1998,6 +2047,7 @@ xichengliudui <1693291525@qq.com> xiekeyang Ximo Guanter Gonzálbez Xinbo Weng +Xinfeng Liu Xinzi Zhou Xiuming Chen Xuecong Liao @@ -2012,6 +2062,7 @@ Yang Pengfei yangchenliang Yanqiang Miao Yao Zaiyong +Yash Murty Yassine Tijani Yasunori Mahata Yazhong Liu @@ -2026,6 +2077,7 @@ Yongxin Li Yongzhi Pan Yosef Fertel You-Sheng Yang (楊有勝) +youcai Youcef YEKHLEF Yu Changchun Yu Chengxia @@ -2062,6 +2114,7 @@ Zhoulin Xie Zhu Guihua Zhu Kunjia Zhuoyun Wei +Ziheng Liu Zilin Du zimbatm Ziming Dong @@ -2070,7 +2123,7 @@ zmarouf Zoltan Tombol Zou Yu zqh -Zuhayr Elahi +Zuhayr Elahi Zunayed Ali Álex González Álvaro Lázaro diff --git a/vendor/github.com/docker/docker/api/types/client.go b/vendor/github.com/docker/docker/api/types/client.go index 4b9f50282b..6616cbcd59 100644 --- a/vendor/github.com/docker/docker/api/types/client.go +++ b/vendor/github.com/docker/docker/api/types/client.go @@ -205,7 +205,7 @@ const ( // BuilderV1 is the first generation builder in docker daemon BuilderV1 BuilderVersion = "1" // BuilderBuildKit is builder based on moby/buildkit project - BuilderBuildKit = "2" + BuilderBuildKit BuilderVersion = "2" ) // ImageBuildResponse holds information @@ -265,7 +265,7 @@ type ImagePullOptions struct { // if the privilege request fails. type RequestPrivilegeFunc func() (string, error) -//ImagePushOptions holds information to push images. +// ImagePushOptions holds information to push images. type ImagePushOptions ImagePullOptions // ImageRemoveOptions holds parameters to remove images. @@ -363,6 +363,10 @@ type ServiceUpdateOptions struct { // ServiceListOptions holds parameters to list services with. type ServiceListOptions struct { Filters filters.Args + + // Status indicates whether the server should include the service task + // count of running and desired tasks. + Status bool } // ServiceInspectOptions holds parameters related to the "service inspect" diff --git a/vendor/github.com/docker/docker/api/types/container/container_changes.go b/vendor/github.com/docker/docker/api/types/container/container_changes.go index 222d141007..16dd5019ee 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_changes.go +++ b/vendor/github.com/docker/docker/api/types/container/container_changes.go @@ -1,8 +1,7 @@ package container // import "github.com/docker/docker/api/types/container" // ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` +// Code generated by `swagger generate operation`. DO NOT EDIT. // // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- diff --git a/vendor/github.com/docker/docker/api/types/container/container_create.go b/vendor/github.com/docker/docker/api/types/container/container_create.go index 1ec9c3728b..d0c852f84d 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_create.go +++ b/vendor/github.com/docker/docker/api/types/container/container_create.go @@ -1,8 +1,7 @@ package container // import "github.com/docker/docker/api/types/container" // ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` +// Code generated by `swagger generate operation`. DO NOT EDIT. // // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- diff --git a/vendor/github.com/docker/docker/api/types/container/container_top.go b/vendor/github.com/docker/docker/api/types/container/container_top.go index f8a606687c..f0ee9dde70 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_top.go +++ b/vendor/github.com/docker/docker/api/types/container/container_top.go @@ -1,8 +1,7 @@ package container // import "github.com/docker/docker/api/types/container" // ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` +// Code generated by `swagger generate operation`. DO NOT EDIT. // // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- diff --git a/vendor/github.com/docker/docker/api/types/container/container_update.go b/vendor/github.com/docker/docker/api/types/container/container_update.go index 33addedf77..c10f175ea8 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_update.go +++ b/vendor/github.com/docker/docker/api/types/container/container_update.go @@ -1,8 +1,7 @@ package container // import "github.com/docker/docker/api/types/container" // ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` +// Code generated by `swagger generate operation`. DO NOT EDIT. // // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- diff --git a/vendor/github.com/docker/docker/api/types/container/container_wait.go b/vendor/github.com/docker/docker/api/types/container/container_wait.go index 94b6a20e15..49e05ae669 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_wait.go +++ b/vendor/github.com/docker/docker/api/types/container/container_wait.go @@ -1,8 +1,7 @@ package container // import "github.com/docker/docker/api/types/container" // ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` +// Code generated by `swagger generate operation`. DO NOT EDIT. // // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- diff --git a/vendor/github.com/docker/docker/api/types/container/host_config.go b/vendor/github.com/docker/docker/api/types/container/host_config.go index 654c88106c..b8a4b3aa62 100644 --- a/vendor/github.com/docker/docker/api/types/container/host_config.go +++ b/vendor/github.com/docker/docker/api/types/container/host_config.go @@ -7,7 +7,7 @@ import ( "github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/strslice" "github.com/docker/go-connections/nat" - "github.com/docker/go-units" + units "github.com/docker/go-units" ) // CgroupnsMode represents the cgroup namespace mode of the container @@ -145,7 +145,7 @@ func (n NetworkMode) ConnectedContainer() string { return "" } -//UserDefined indicates user-created network +// UserDefined indicates user-created network func (n NetworkMode) UserDefined() string { if n.IsUserDefined() { return string(n) diff --git a/vendor/github.com/docker/docker/api/types/filters/parse.go b/vendor/github.com/docker/docker/api/types/filters/parse.go index 1f75403f78..4bc91cffd6 100644 --- a/vendor/github.com/docker/docker/api/types/filters/parse.go +++ b/vendor/github.com/docker/docker/api/types/filters/parse.go @@ -36,6 +36,15 @@ func NewArgs(initialArgs ...KeyValuePair) Args { return args } +// Keys returns all the keys in list of Args +func (args Args) Keys() []string { + keys := make([]string, 0, len(args.fields)) + for k := range args.fields { + keys = append(keys, k) + } + return keys +} + // MarshalJSON returns a JSON byte representation of the Args func (args Args) MarshalJSON() ([]byte, error) { if len(args.fields) == 0 { @@ -57,7 +66,7 @@ func ToJSON(a Args) (string, error) { // then the encoded format will use an older legacy format where the values are a // list of strings, instead of a set. // -// Deprecated: Use ToJSON +// Deprecated: do not use in any new code; use ToJSON instead func ToParamWithVersion(version string, a Args) (string, error) { if a.Len() == 0 { return "", nil @@ -145,7 +154,7 @@ func (args Args) Len() int { func (args Args) MatchKVList(key string, sources map[string]string) bool { fieldValues := args.fields[key] - //do not filter if there is no filter set or cannot determine filter + // do not filter if there is no filter set or cannot determine filter if len(fieldValues) == 0 { return true } @@ -191,7 +200,7 @@ func (args Args) Match(field, source string) bool { // ExactMatch returns true if the source matches exactly one of the values. func (args Args) ExactMatch(key, source string) bool { fieldValues, ok := args.fields[key] - //do not filter if there is no filter set or cannot determine filter + // do not filter if there is no filter set or cannot determine filter if !ok || len(fieldValues) == 0 { return true } @@ -204,7 +213,7 @@ func (args Args) ExactMatch(key, source string) bool { // matches exactly the value. func (args Args) UniqueExactMatch(key, source string) bool { fieldValues := args.fields[key] - //do not filter if there is no filter set or cannot determine filter + // do not filter if there is no filter set or cannot determine filter if len(fieldValues) == 0 { return true } diff --git a/vendor/github.com/docker/docker/api/types/network/network.go b/vendor/github.com/docker/docker/api/types/network/network.go index 71e97338fd..7927dbfffb 100644 --- a/vendor/github.com/docker/docker/api/types/network/network.go +++ b/vendor/github.com/docker/docker/api/types/network/network.go @@ -13,7 +13,7 @@ type Address struct { // IPAM represents IP Address Management type IPAM struct { Driver string - Options map[string]string //Per network IPAM driver options + Options map[string]string // Per network IPAM driver options Config []IPAMConfig } diff --git a/vendor/github.com/docker/docker/api/types/registry/registry.go b/vendor/github.com/docker/docker/api/types/registry/registry.go index 8789ad3b32..53e47084c8 100644 --- a/vendor/github.com/docker/docker/api/types/registry/registry.go +++ b/vendor/github.com/docker/docker/api/types/registry/registry.go @@ -4,7 +4,7 @@ import ( "encoding/json" "net" - "github.com/opencontainers/image-spec/specs-go/v1" + v1 "github.com/opencontainers/image-spec/specs-go/v1" ) // ServiceConfig stores daemon registry services configuration. diff --git a/vendor/github.com/docker/docker/api/types/swarm/service.go b/vendor/github.com/docker/docker/api/types/swarm/service.go index abf192e759..6eb452d24d 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/service.go +++ b/vendor/github.com/docker/docker/api/types/swarm/service.go @@ -10,6 +10,17 @@ type Service struct { PreviousSpec *ServiceSpec `json:",omitempty"` Endpoint Endpoint `json:",omitempty"` UpdateStatus *UpdateStatus `json:",omitempty"` + + // ServiceStatus is an optional, extra field indicating the number of + // desired and running tasks. It is provided primarily as a shortcut to + // calculating these values client-side, which otherwise would require + // listing all tasks for a service, an operation that could be + // computation and network expensive. + ServiceStatus *ServiceStatus `json:",omitempty"` + + // JobStatus is the status of a Service which is in one of ReplicatedJob or + // GlobalJob modes. It is absent on Replicated and Global services. + JobStatus *JobStatus `json:",omitempty"` } // ServiceSpec represents the spec of a service. @@ -32,8 +43,10 @@ type ServiceSpec struct { // ServiceMode represents the mode of a service. type ServiceMode struct { - Replicated *ReplicatedService `json:",omitempty"` - Global *GlobalService `json:",omitempty"` + Replicated *ReplicatedService `json:",omitempty"` + Global *GlobalService `json:",omitempty"` + ReplicatedJob *ReplicatedJob `json:",omitempty"` + GlobalJob *GlobalJob `json:",omitempty"` } // UpdateState is the state of a service update. @@ -70,6 +83,32 @@ type ReplicatedService struct { // GlobalService is a kind of ServiceMode. type GlobalService struct{} +// ReplicatedJob is the a type of Service which executes a defined Tasks +// in parallel until the specified number of Tasks have succeeded. +type ReplicatedJob struct { + // MaxConcurrent indicates the maximum number of Tasks that should be + // executing simultaneously for this job at any given time. There may be + // fewer Tasks that MaxConcurrent executing simultaneously; for example, if + // there are fewer than MaxConcurrent tasks needed to reach + // TotalCompletions. + // + // If this field is empty, it will default to a max concurrency of 1. + MaxConcurrent *uint64 `json:",omitempty"` + + // TotalCompletions is the total number of Tasks desired to run to + // completion. + // + // If this field is empty, the value of MaxConcurrent will be used. + TotalCompletions *uint64 `json:",omitempty"` +} + +// GlobalJob is the type of a Service which executes a Task on every Node +// matching the Service's placement constraints. These tasks run to completion +// and then exit. +// +// This type is deliberately empty. +type GlobalJob struct{} + const ( // UpdateFailureActionPause PAUSE UpdateFailureActionPause = "pause" @@ -122,3 +161,42 @@ type UpdateConfig struct { // started, or the new task is started before the old task is shut down. Order string } + +// ServiceStatus represents the number of running tasks in a service and the +// number of tasks desired to be running. +type ServiceStatus struct { + // RunningTasks is the number of tasks for the service actually in the + // Running state + RunningTasks uint64 + + // DesiredTasks is the number of tasks desired to be running by the + // service. For replicated services, this is the replica count. For global + // services, this is computed by taking the number of tasks with desired + // state of not-Shutdown. + DesiredTasks uint64 + + // CompletedTasks is the number of tasks in the state Completed, if this + // service is in ReplicatedJob or GlobalJob mode. This field must be + // cross-referenced with the service type, because the default value of 0 + // may mean that a service is not in a job mode, or it may mean that the + // job has yet to complete any tasks. + CompletedTasks uint64 +} + +// JobStatus is the status of a job-type service. +type JobStatus struct { + // JobIteration is a value increased each time a Job is executed, + // successfully or otherwise. "Executed", in this case, means the job as a + // whole has been started, not that an individual Task has been launched. A + // job is "Executed" when its ServiceSpec is updated. JobIteration can be + // used to disambiguate Tasks belonging to different executions of a job. + // + // Though JobIteration will increase with each subsequent execution, it may + // not necessarily increase by 1, and so JobIteration should not be used to + // keep track of the number of times a job has been executed. + JobIteration Version + + // LastExecution is the time that the job was last executed, as observed by + // Swarm manager. + LastExecution time.Time `json:",omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/swarm/task.go b/vendor/github.com/docker/docker/api/types/swarm/task.go index d5a57df5db..9f193df37c 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/task.go +++ b/vendor/github.com/docker/docker/api/types/swarm/task.go @@ -56,6 +56,12 @@ type Task struct { DesiredState TaskState `json:",omitempty"` NetworksAttachments []NetworkAttachment `json:",omitempty"` GenericResources []GenericResource `json:",omitempty"` + + // JobIteration is the JobIteration of the Service that this Task was + // spawned from, if the Service is a ReplicatedJob or GlobalJob. This is + // used to determine which Tasks belong to which run of the job. This field + // is absent if the Service mode is Replicated or Global. + JobIteration *Version `json:",omitempty"` } // TaskSpec represents the spec of a task. diff --git a/vendor/github.com/docker/docker/api/types/types.go b/vendor/github.com/docker/docker/api/types/types.go index b13d9c4c7d..7486eab4d8 100644 --- a/vendor/github.com/docker/docker/api/types/types.go +++ b/vendor/github.com/docker/docker/api/types/types.go @@ -39,6 +39,7 @@ type ImageInspect struct { Author string Config *container.Config Architecture string + Variant string `json:",omitempty"` Os string OsVersion string `json:",omitempty"` Size int64 @@ -153,7 +154,7 @@ type Info struct { Images int Driver string DriverStatus [][2]string - SystemStatus [][2]string + SystemStatus [][2]string `json:",omitempty"` // SystemStatus is only propagated by the Swarm standalone API Plugins PluginsInfo MemoryLimit bool SwapLimit bool @@ -317,7 +318,7 @@ type ContainerState struct { } // ContainerNode stores information about the node that a container -// is running on. It's only available in Docker Swarm +// is running on. It's only used by the Docker Swarm standalone API type ContainerNode struct { ID string IPAddress string `json:"IP"` @@ -341,7 +342,7 @@ type ContainerJSONBase struct { HostnamePath string HostsPath string LogPath string - Node *ContainerNode `json:",omitempty"` + Node *ContainerNode `json:",omitempty"` // Node is only propagated by Docker Swarm standalone API Name string RestartCount int Driver string diff --git a/vendor/github.com/docker/docker/pkg/homedir/homedir_linux.go b/vendor/github.com/docker/docker/pkg/homedir/homedir_linux.go index 47ecd0c092..5e6310fdcd 100644 --- a/vendor/github.com/docker/docker/pkg/homedir/homedir_linux.go +++ b/vendor/github.com/docker/docker/pkg/homedir/homedir_linux.go @@ -5,24 +5,8 @@ import ( "os" "path/filepath" "strings" - - "github.com/docker/docker/pkg/idtools" ) -// GetStatic returns the home directory for the current user without calling -// os/user.Current(). This is useful for static-linked binary on glibc-based -// system, because a call to os/user.Current() in a static binary leads to -// segfault due to a glibc issue that won't be fixed in a short term. -// (#29344, golang/go#13470, https://sourceware.org/bugzilla/show_bug.cgi?id=19341) -func GetStatic() (string, error) { - uid := os.Getuid() - usr, err := idtools.LookupUID(uid) - if err != nil { - return "", err - } - return usr.Home, nil -} - // GetRuntimeDir returns XDG_RUNTIME_DIR. // XDG_RUNTIME_DIR is typically configured via pam_systemd. // GetRuntimeDir returns non-nil error if XDG_RUNTIME_DIR is not set. diff --git a/vendor/github.com/docker/docker/pkg/homedir/homedir_others.go b/vendor/github.com/docker/docker/pkg/homedir/homedir_others.go index f0a363dedf..67ab9e9b31 100644 --- a/vendor/github.com/docker/docker/pkg/homedir/homedir_others.go +++ b/vendor/github.com/docker/docker/pkg/homedir/homedir_others.go @@ -6,12 +6,6 @@ import ( "errors" ) -// GetStatic is not needed for non-linux systems. -// (Precisely, it is needed only for glibc-based linux systems.) -func GetStatic() (string, error) { - return "", errors.New("homedir.GetStatic() is not supported on this system") -} - // GetRuntimeDir is unsupported on non-linux system. func GetRuntimeDir() (string, error) { return "", errors.New("homedir.GetRuntimeDir() is not supported on this system") diff --git a/vendor/github.com/docker/docker/pkg/homedir/homedir_unix.go b/vendor/github.com/docker/docker/pkg/homedir/homedir_unix.go index d85e124488..441bd727b6 100644 --- a/vendor/github.com/docker/docker/pkg/homedir/homedir_unix.go +++ b/vendor/github.com/docker/docker/pkg/homedir/homedir_unix.go @@ -4,8 +4,7 @@ package homedir // import "github.com/docker/docker/pkg/homedir" import ( "os" - - "github.com/opencontainers/runc/libcontainer/user" + "os/user" ) // Key returns the env var name for the user's home dir based on @@ -17,11 +16,16 @@ func Key() string { // Get returns the home directory of the current user with the help of // environment variables depending on the target operating system. // Returned path should be used with "path/filepath" to form new paths. +// +// If linking statically with cgo enabled against glibc, ensure the +// osusergo build tag is used. +// +// If needing to do nss lookups, do not disable cgo or set osusergo. func Get() string { home := os.Getenv(Key()) if home == "" { - if u, err := user.CurrentUser(); err == nil { - return u.Home + if u, err := user.Current(); err == nil { + return u.HomeDir } } return home diff --git a/vendor/github.com/docker/docker/pkg/idtools/idtools.go b/vendor/github.com/docker/docker/pkg/idtools/idtools.go deleted file mode 100644 index b3af7a4226..0000000000 --- a/vendor/github.com/docker/docker/pkg/idtools/idtools.go +++ /dev/null @@ -1,264 +0,0 @@ -package idtools // import "github.com/docker/docker/pkg/idtools" - -import ( - "bufio" - "fmt" - "os" - "strconv" - "strings" -) - -// IDMap contains a single entry for user namespace range remapping. An array -// of IDMap entries represents the structure that will be provided to the Linux -// kernel for creating a user namespace. -type IDMap struct { - ContainerID int `json:"container_id"` - HostID int `json:"host_id"` - Size int `json:"size"` -} - -type subIDRange struct { - Start int - Length int -} - -type ranges []subIDRange - -func (e ranges) Len() int { return len(e) } -func (e ranges) Swap(i, j int) { e[i], e[j] = e[j], e[i] } -func (e ranges) Less(i, j int) bool { return e[i].Start < e[j].Start } - -const ( - subuidFileName = "/etc/subuid" - subgidFileName = "/etc/subgid" -) - -// MkdirAllAndChown creates a directory (include any along the path) and then modifies -// ownership to the requested uid/gid. If the directory already exists, this -// function will still change ownership to the requested uid/gid pair. -func MkdirAllAndChown(path string, mode os.FileMode, owner Identity) error { - return mkdirAs(path, mode, owner, true, true) -} - -// MkdirAndChown creates a directory and then modifies ownership to the requested uid/gid. -// If the directory already exists, this function still changes ownership. -// Note that unlike os.Mkdir(), this function does not return IsExist error -// in case path already exists. -func MkdirAndChown(path string, mode os.FileMode, owner Identity) error { - return mkdirAs(path, mode, owner, false, true) -} - -// MkdirAllAndChownNew creates a directory (include any along the path) and then modifies -// ownership ONLY of newly created directories to the requested uid/gid. If the -// directories along the path exist, no change of ownership will be performed -func MkdirAllAndChownNew(path string, mode os.FileMode, owner Identity) error { - return mkdirAs(path, mode, owner, true, false) -} - -// GetRootUIDGID retrieves the remapped root uid/gid pair from the set of maps. -// If the maps are empty, then the root uid/gid will default to "real" 0/0 -func GetRootUIDGID(uidMap, gidMap []IDMap) (int, int, error) { - uid, err := toHost(0, uidMap) - if err != nil { - return -1, -1, err - } - gid, err := toHost(0, gidMap) - if err != nil { - return -1, -1, err - } - return uid, gid, nil -} - -// toContainer takes an id mapping, and uses it to translate a -// host ID to the remapped ID. If no map is provided, then the translation -// assumes a 1-to-1 mapping and returns the passed in id -func toContainer(hostID int, idMap []IDMap) (int, error) { - if idMap == nil { - return hostID, nil - } - for _, m := range idMap { - if (hostID >= m.HostID) && (hostID <= (m.HostID + m.Size - 1)) { - contID := m.ContainerID + (hostID - m.HostID) - return contID, nil - } - } - return -1, fmt.Errorf("Host ID %d cannot be mapped to a container ID", hostID) -} - -// toHost takes an id mapping and a remapped ID, and translates the -// ID to the mapped host ID. If no map is provided, then the translation -// assumes a 1-to-1 mapping and returns the passed in id # -func toHost(contID int, idMap []IDMap) (int, error) { - if idMap == nil { - return contID, nil - } - for _, m := range idMap { - if (contID >= m.ContainerID) && (contID <= (m.ContainerID + m.Size - 1)) { - hostID := m.HostID + (contID - m.ContainerID) - return hostID, nil - } - } - return -1, fmt.Errorf("Container ID %d cannot be mapped to a host ID", contID) -} - -// Identity is either a UID and GID pair or a SID (but not both) -type Identity struct { - UID int - GID int - SID string -} - -// IdentityMapping contains a mappings of UIDs and GIDs -type IdentityMapping struct { - uids []IDMap - gids []IDMap -} - -// NewIdentityMapping takes a requested user and group name and -// using the data from /etc/sub{uid,gid} ranges, creates the -// proper uid and gid remapping ranges for that user/group pair -func NewIdentityMapping(username, groupname string) (*IdentityMapping, error) { - subuidRanges, err := parseSubuid(username) - if err != nil { - return nil, err - } - subgidRanges, err := parseSubgid(groupname) - if err != nil { - return nil, err - } - if len(subuidRanges) == 0 { - return nil, fmt.Errorf("No subuid ranges found for user %q", username) - } - if len(subgidRanges) == 0 { - return nil, fmt.Errorf("No subgid ranges found for group %q", groupname) - } - - return &IdentityMapping{ - uids: createIDMap(subuidRanges), - gids: createIDMap(subgidRanges), - }, nil -} - -// NewIDMappingsFromMaps creates a new mapping from two slices -// Deprecated: this is a temporary shim while transitioning to IDMapping -func NewIDMappingsFromMaps(uids []IDMap, gids []IDMap) *IdentityMapping { - return &IdentityMapping{uids: uids, gids: gids} -} - -// RootPair returns a uid and gid pair for the root user. The error is ignored -// because a root user always exists, and the defaults are correct when the uid -// and gid maps are empty. -func (i *IdentityMapping) RootPair() Identity { - uid, gid, _ := GetRootUIDGID(i.uids, i.gids) - return Identity{UID: uid, GID: gid} -} - -// ToHost returns the host UID and GID for the container uid, gid. -// Remapping is only performed if the ids aren't already the remapped root ids -func (i *IdentityMapping) ToHost(pair Identity) (Identity, error) { - var err error - target := i.RootPair() - - if pair.UID != target.UID { - target.UID, err = toHost(pair.UID, i.uids) - if err != nil { - return target, err - } - } - - if pair.GID != target.GID { - target.GID, err = toHost(pair.GID, i.gids) - } - return target, err -} - -// ToContainer returns the container UID and GID for the host uid and gid -func (i *IdentityMapping) ToContainer(pair Identity) (int, int, error) { - uid, err := toContainer(pair.UID, i.uids) - if err != nil { - return -1, -1, err - } - gid, err := toContainer(pair.GID, i.gids) - return uid, gid, err -} - -// Empty returns true if there are no id mappings -func (i *IdentityMapping) Empty() bool { - return len(i.uids) == 0 && len(i.gids) == 0 -} - -// UIDs return the UID mapping -// TODO: remove this once everything has been refactored to use pairs -func (i *IdentityMapping) UIDs() []IDMap { - return i.uids -} - -// GIDs return the UID mapping -// TODO: remove this once everything has been refactored to use pairs -func (i *IdentityMapping) GIDs() []IDMap { - return i.gids -} - -func createIDMap(subidRanges ranges) []IDMap { - idMap := []IDMap{} - - containerID := 0 - for _, idrange := range subidRanges { - idMap = append(idMap, IDMap{ - ContainerID: containerID, - HostID: idrange.Start, - Size: idrange.Length, - }) - containerID = containerID + idrange.Length - } - return idMap -} - -func parseSubuid(username string) (ranges, error) { - return parseSubidFile(subuidFileName, username) -} - -func parseSubgid(username string) (ranges, error) { - return parseSubidFile(subgidFileName, username) -} - -// parseSubidFile will read the appropriate file (/etc/subuid or /etc/subgid) -// and return all found ranges for a specified username. If the special value -// "ALL" is supplied for username, then all ranges in the file will be returned -func parseSubidFile(path, username string) (ranges, error) { - var rangeList ranges - - subidFile, err := os.Open(path) - if err != nil { - return rangeList, err - } - defer subidFile.Close() - - s := bufio.NewScanner(subidFile) - for s.Scan() { - if err := s.Err(); err != nil { - return rangeList, err - } - - text := strings.TrimSpace(s.Text()) - if text == "" || strings.HasPrefix(text, "#") { - continue - } - parts := strings.Split(text, ":") - if len(parts) != 3 { - return rangeList, fmt.Errorf("Cannot parse subuid/gid information: Format not correct for %s file", path) - } - if parts[0] == username || username == "ALL" { - startid, err := strconv.Atoi(parts[1]) - if err != nil { - return rangeList, fmt.Errorf("String to int conversion failed during subuid/gid parsing of %s: %v", path, err) - } - length, err := strconv.Atoi(parts[2]) - if err != nil { - return rangeList, fmt.Errorf("String to int conversion failed during subuid/gid parsing of %s: %v", path, err) - } - rangeList = append(rangeList, subIDRange{startid, length}) - } - } - return rangeList, nil -} diff --git a/vendor/github.com/docker/docker/pkg/idtools/idtools_unix.go b/vendor/github.com/docker/docker/pkg/idtools/idtools_unix.go deleted file mode 100644 index fb239743a0..0000000000 --- a/vendor/github.com/docker/docker/pkg/idtools/idtools_unix.go +++ /dev/null @@ -1,231 +0,0 @@ -// +build !windows - -package idtools // import "github.com/docker/docker/pkg/idtools" - -import ( - "bytes" - "fmt" - "io" - "os" - "path/filepath" - "strings" - "sync" - "syscall" - - "github.com/docker/docker/pkg/system" - "github.com/opencontainers/runc/libcontainer/user" -) - -var ( - entOnce sync.Once - getentCmd string -) - -func mkdirAs(path string, mode os.FileMode, owner Identity, mkAll, chownExisting bool) error { - // make an array containing the original path asked for, plus (for mkAll == true) - // all path components leading up to the complete path that don't exist before we MkdirAll - // so that we can chown all of them properly at the end. If chownExisting is false, we won't - // chown the full directory path if it exists - - var paths []string - - stat, err := system.Stat(path) - if err == nil { - if !stat.IsDir() { - return &os.PathError{Op: "mkdir", Path: path, Err: syscall.ENOTDIR} - } - if !chownExisting { - return nil - } - - // short-circuit--we were called with an existing directory and chown was requested - return lazyChown(path, owner.UID, owner.GID, stat) - } - - if os.IsNotExist(err) { - paths = []string{path} - } - - if mkAll { - // walk back to "/" looking for directories which do not exist - // and add them to the paths array for chown after creation - dirPath := path - for { - dirPath = filepath.Dir(dirPath) - if dirPath == "/" { - break - } - if _, err := os.Stat(dirPath); err != nil && os.IsNotExist(err) { - paths = append(paths, dirPath) - } - } - if err := system.MkdirAll(path, mode, ""); err != nil { - return err - } - } else { - if err := os.Mkdir(path, mode); err != nil && !os.IsExist(err) { - return err - } - } - // even if it existed, we will chown the requested path + any subpaths that - // didn't exist when we called MkdirAll - for _, pathComponent := range paths { - if err := lazyChown(pathComponent, owner.UID, owner.GID, nil); err != nil { - return err - } - } - return nil -} - -// CanAccess takes a valid (existing) directory and a uid, gid pair and determines -// if that uid, gid pair has access (execute bit) to the directory -func CanAccess(path string, pair Identity) bool { - statInfo, err := system.Stat(path) - if err != nil { - return false - } - fileMode := os.FileMode(statInfo.Mode()) - permBits := fileMode.Perm() - return accessible(statInfo.UID() == uint32(pair.UID), - statInfo.GID() == uint32(pair.GID), permBits) -} - -func accessible(isOwner, isGroup bool, perms os.FileMode) bool { - if isOwner && (perms&0100 == 0100) { - return true - } - if isGroup && (perms&0010 == 0010) { - return true - } - if perms&0001 == 0001 { - return true - } - return false -} - -// LookupUser uses traditional local system files lookup (from libcontainer/user) on a username, -// followed by a call to `getent` for supporting host configured non-files passwd and group dbs -func LookupUser(username string) (user.User, error) { - // first try a local system files lookup using existing capabilities - usr, err := user.LookupUser(username) - if err == nil { - return usr, nil - } - // local files lookup failed; attempt to call `getent` to query configured passwd dbs - usr, err = getentUser(fmt.Sprintf("%s %s", "passwd", username)) - if err != nil { - return user.User{}, err - } - return usr, nil -} - -// LookupUID uses traditional local system files lookup (from libcontainer/user) on a uid, -// followed by a call to `getent` for supporting host configured non-files passwd and group dbs -func LookupUID(uid int) (user.User, error) { - // first try a local system files lookup using existing capabilities - usr, err := user.LookupUid(uid) - if err == nil { - return usr, nil - } - // local files lookup failed; attempt to call `getent` to query configured passwd dbs - return getentUser(fmt.Sprintf("%s %d", "passwd", uid)) -} - -func getentUser(args string) (user.User, error) { - reader, err := callGetent(args) - if err != nil { - return user.User{}, err - } - users, err := user.ParsePasswd(reader) - if err != nil { - return user.User{}, err - } - if len(users) == 0 { - return user.User{}, fmt.Errorf("getent failed to find passwd entry for %q", strings.Split(args, " ")[1]) - } - return users[0], nil -} - -// LookupGroup uses traditional local system files lookup (from libcontainer/user) on a group name, -// followed by a call to `getent` for supporting host configured non-files passwd and group dbs -func LookupGroup(groupname string) (user.Group, error) { - // first try a local system files lookup using existing capabilities - group, err := user.LookupGroup(groupname) - if err == nil { - return group, nil - } - // local files lookup failed; attempt to call `getent` to query configured group dbs - return getentGroup(fmt.Sprintf("%s %s", "group", groupname)) -} - -// LookupGID uses traditional local system files lookup (from libcontainer/user) on a group ID, -// followed by a call to `getent` for supporting host configured non-files passwd and group dbs -func LookupGID(gid int) (user.Group, error) { - // first try a local system files lookup using existing capabilities - group, err := user.LookupGid(gid) - if err == nil { - return group, nil - } - // local files lookup failed; attempt to call `getent` to query configured group dbs - return getentGroup(fmt.Sprintf("%s %d", "group", gid)) -} - -func getentGroup(args string) (user.Group, error) { - reader, err := callGetent(args) - if err != nil { - return user.Group{}, err - } - groups, err := user.ParseGroup(reader) - if err != nil { - return user.Group{}, err - } - if len(groups) == 0 { - return user.Group{}, fmt.Errorf("getent failed to find groups entry for %q", strings.Split(args, " ")[1]) - } - return groups[0], nil -} - -func callGetent(args string) (io.Reader, error) { - entOnce.Do(func() { getentCmd, _ = resolveBinary("getent") }) - // if no `getent` command on host, can't do anything else - if getentCmd == "" { - return nil, fmt.Errorf("") - } - out, err := execCmd(getentCmd, args) - if err != nil { - exitCode, errC := system.GetExitCode(err) - if errC != nil { - return nil, err - } - switch exitCode { - case 1: - return nil, fmt.Errorf("getent reported invalid parameters/database unknown") - case 2: - terms := strings.Split(args, " ") - return nil, fmt.Errorf("getent unable to find entry %q in %s database", terms[1], terms[0]) - case 3: - return nil, fmt.Errorf("getent database doesn't support enumeration") - default: - return nil, err - } - - } - return bytes.NewReader(out), nil -} - -// lazyChown performs a chown only if the uid/gid don't match what's requested -// Normally a Chown is a no-op if uid/gid match, but in some cases this can still cause an error, e.g. if the -// dir is on an NFS share, so don't call chown unless we absolutely must. -func lazyChown(p string, uid, gid int, stat *system.StatT) error { - if stat == nil { - var err error - stat, err = system.Stat(p) - if err != nil { - return err - } - } - if stat.UID() == uint32(uid) && stat.GID() == uint32(gid) { - return nil - } - return os.Chown(p, uid, gid) -} diff --git a/vendor/github.com/docker/docker/pkg/idtools/idtools_windows.go b/vendor/github.com/docker/docker/pkg/idtools/idtools_windows.go deleted file mode 100644 index 4ae38a1b17..0000000000 --- a/vendor/github.com/docker/docker/pkg/idtools/idtools_windows.go +++ /dev/null @@ -1,25 +0,0 @@ -package idtools // import "github.com/docker/docker/pkg/idtools" - -import ( - "os" - - "github.com/docker/docker/pkg/system" -) - -// This is currently a wrapper around MkdirAll, however, since currently -// permissions aren't set through this path, the identity isn't utilized. -// Ownership is handled elsewhere, but in the future could be support here -// too. -func mkdirAs(path string, mode os.FileMode, owner Identity, mkAll, chownExisting bool) error { - if err := system.MkdirAll(path, mode, ""); err != nil { - return err - } - return nil -} - -// CanAccess takes a valid (existing) directory and a uid, gid pair and determines -// if that uid, gid pair has access (execute bit) to the directory -// Windows does not require/support this function, so always return true -func CanAccess(path string, identity Identity) bool { - return true -} diff --git a/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go b/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go deleted file mode 100644 index 6272c5a404..0000000000 --- a/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go +++ /dev/null @@ -1,164 +0,0 @@ -package idtools // import "github.com/docker/docker/pkg/idtools" - -import ( - "fmt" - "regexp" - "sort" - "strconv" - "strings" - "sync" -) - -// add a user and/or group to Linux /etc/passwd, /etc/group using standard -// Linux distribution commands: -// adduser --system --shell /bin/false --disabled-login --disabled-password --no-create-home --group -// useradd -r -s /bin/false - -var ( - once sync.Once - userCommand string - - cmdTemplates = map[string]string{ - "adduser": "--system --shell /bin/false --no-create-home --disabled-login --disabled-password --group %s", - "useradd": "-r -s /bin/false %s", - "usermod": "-%s %d-%d %s", - } - - idOutRegexp = regexp.MustCompile(`uid=([0-9]+).*gid=([0-9]+)`) - // default length for a UID/GID subordinate range - defaultRangeLen = 65536 - defaultRangeStart = 100000 - userMod = "usermod" -) - -// AddNamespaceRangesUser takes a username and uses the standard system -// utility to create a system user/group pair used to hold the -// /etc/sub{uid,gid} ranges which will be used for user namespace -// mapping ranges in containers. -func AddNamespaceRangesUser(name string) (int, int, error) { - if err := addUser(name); err != nil { - return -1, -1, fmt.Errorf("Error adding user %q: %v", name, err) - } - - // Query the system for the created uid and gid pair - out, err := execCmd("id", name) - if err != nil { - return -1, -1, fmt.Errorf("Error trying to find uid/gid for new user %q: %v", name, err) - } - matches := idOutRegexp.FindStringSubmatch(strings.TrimSpace(string(out))) - if len(matches) != 3 { - return -1, -1, fmt.Errorf("Can't find uid, gid from `id` output: %q", string(out)) - } - uid, err := strconv.Atoi(matches[1]) - if err != nil { - return -1, -1, fmt.Errorf("Can't convert found uid (%s) to int: %v", matches[1], err) - } - gid, err := strconv.Atoi(matches[2]) - if err != nil { - return -1, -1, fmt.Errorf("Can't convert found gid (%s) to int: %v", matches[2], err) - } - - // Now we need to create the subuid/subgid ranges for our new user/group (system users - // do not get auto-created ranges in subuid/subgid) - - if err := createSubordinateRanges(name); err != nil { - return -1, -1, fmt.Errorf("Couldn't create subordinate ID ranges: %v", err) - } - return uid, gid, nil -} - -func addUser(userName string) error { - once.Do(func() { - // set up which commands are used for adding users/groups dependent on distro - if _, err := resolveBinary("adduser"); err == nil { - userCommand = "adduser" - } else if _, err := resolveBinary("useradd"); err == nil { - userCommand = "useradd" - } - }) - if userCommand == "" { - return fmt.Errorf("Cannot add user; no useradd/adduser binary found") - } - args := fmt.Sprintf(cmdTemplates[userCommand], userName) - out, err := execCmd(userCommand, args) - if err != nil { - return fmt.Errorf("Failed to add user with error: %v; output: %q", err, string(out)) - } - return nil -} - -func createSubordinateRanges(name string) error { - - // first, we should verify that ranges weren't automatically created - // by the distro tooling - ranges, err := parseSubuid(name) - if err != nil { - return fmt.Errorf("Error while looking for subuid ranges for user %q: %v", name, err) - } - if len(ranges) == 0 { - // no UID ranges; let's create one - startID, err := findNextUIDRange() - if err != nil { - return fmt.Errorf("Can't find available subuid range: %v", err) - } - out, err := execCmd(userMod, fmt.Sprintf(cmdTemplates[userMod], "v", startID, startID+defaultRangeLen-1, name)) - if err != nil { - return fmt.Errorf("Unable to add subuid range to user: %q; output: %s, err: %v", name, out, err) - } - } - - ranges, err = parseSubgid(name) - if err != nil { - return fmt.Errorf("Error while looking for subgid ranges for user %q: %v", name, err) - } - if len(ranges) == 0 { - // no GID ranges; let's create one - startID, err := findNextGIDRange() - if err != nil { - return fmt.Errorf("Can't find available subgid range: %v", err) - } - out, err := execCmd(userMod, fmt.Sprintf(cmdTemplates[userMod], "w", startID, startID+defaultRangeLen-1, name)) - if err != nil { - return fmt.Errorf("Unable to add subgid range to user: %q; output: %s, err: %v", name, out, err) - } - } - return nil -} - -func findNextUIDRange() (int, error) { - ranges, err := parseSubuid("ALL") - if err != nil { - return -1, fmt.Errorf("Couldn't parse all ranges in /etc/subuid file: %v", err) - } - sort.Sort(ranges) - return findNextRangeStart(ranges) -} - -func findNextGIDRange() (int, error) { - ranges, err := parseSubgid("ALL") - if err != nil { - return -1, fmt.Errorf("Couldn't parse all ranges in /etc/subgid file: %v", err) - } - sort.Sort(ranges) - return findNextRangeStart(ranges) -} - -func findNextRangeStart(rangeList ranges) (int, error) { - startID := defaultRangeStart - for _, arange := range rangeList { - if wouldOverlap(arange, startID) { - startID = arange.Start + arange.Length - } - } - return startID, nil -} - -func wouldOverlap(arange subIDRange, ID int) bool { - low := ID - high := ID + defaultRangeLen - if (low >= arange.Start && low <= arange.Start+arange.Length) || - (high <= arange.Start+arange.Length && high >= arange.Start) { - return true - } - return false -} diff --git a/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_unsupported.go b/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_unsupported.go deleted file mode 100644 index e7c4d63118..0000000000 --- a/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_unsupported.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !linux - -package idtools // import "github.com/docker/docker/pkg/idtools" - -import "fmt" - -// AddNamespaceRangesUser takes a name and finds an unused uid, gid pair -// and calls the appropriate helper function to add the group and then -// the user to the group in /etc/group and /etc/passwd respectively. -func AddNamespaceRangesUser(name string) (int, int, error) { - return -1, -1, fmt.Errorf("No support for adding users or groups on this OS") -} diff --git a/vendor/github.com/docker/docker/pkg/idtools/utils_unix.go b/vendor/github.com/docker/docker/pkg/idtools/utils_unix.go deleted file mode 100644 index 903ac4501b..0000000000 --- a/vendor/github.com/docker/docker/pkg/idtools/utils_unix.go +++ /dev/null @@ -1,32 +0,0 @@ -// +build !windows - -package idtools // import "github.com/docker/docker/pkg/idtools" - -import ( - "fmt" - "os/exec" - "path/filepath" - "strings" -) - -func resolveBinary(binname string) (string, error) { - binaryPath, err := exec.LookPath(binname) - if err != nil { - return "", err - } - resolvedPath, err := filepath.EvalSymlinks(binaryPath) - if err != nil { - return "", err - } - //only return no error if the final resolved binary basename - //matches what was searched for - if filepath.Base(resolvedPath) == binname { - return resolvedPath, nil - } - return "", fmt.Errorf("Binary %q does not resolve to a binary of that name in $PATH (%q)", binname, resolvedPath) -} - -func execCmd(cmd, args string) ([]byte, error) { - execCmd := exec.Command(cmd, strings.Split(args, " ")...) - return execCmd.CombinedOutput() -} diff --git a/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go b/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go index a68b566cea..aa372c20ca 100644 --- a/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go +++ b/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go @@ -8,7 +8,7 @@ import ( "time" "github.com/docker/docker/pkg/term" - "github.com/docker/go-units" + units "github.com/docker/go-units" "github.com/morikuni/aec" ) @@ -139,13 +139,13 @@ type JSONMessage struct { Stream string `json:"stream,omitempty"` Status string `json:"status,omitempty"` Progress *JSONProgress `json:"progressDetail,omitempty"` - ProgressMessage string `json:"progress,omitempty"` //deprecated + ProgressMessage string `json:"progress,omitempty"` // deprecated ID string `json:"id,omitempty"` From string `json:"from,omitempty"` Time int64 `json:"time,omitempty"` TimeNano int64 `json:"timeNano,omitempty"` Error *JSONError `json:"errorDetail,omitempty"` - ErrorMessage string `json:"error,omitempty"` //deprecated + ErrorMessage string `json:"error,omitempty"` // deprecated // Aux contains out-of-band data, such as digests for push signing and image id after building. Aux *json.RawMessage `json:"aux,omitempty"` } @@ -177,8 +177,8 @@ func (jm *JSONMessage) Display(out io.Writer, isTerminal bool) error { if isTerminal && jm.Stream == "" && jm.Progress != nil { clearLine(out) endl = "\r" - fmt.Fprintf(out, endl) - } else if jm.Progress != nil && jm.Progress.String() != "" { //disable progressbar in non-terminal + fmt.Fprint(out, endl) + } else if jm.Progress != nil && jm.Progress.String() != "" { // disable progressbar in non-terminal return nil } if jm.TimeNano != 0 { @@ -194,7 +194,7 @@ func (jm *JSONMessage) Display(out io.Writer, isTerminal bool) error { } if jm.Progress != nil && isTerminal { fmt.Fprintf(out, "%s %s%s", jm.Status, jm.Progress.String(), endl) - } else if jm.ProgressMessage != "" { //deprecated + } else if jm.ProgressMessage != "" { // deprecated fmt.Fprintf(out, "%s %s%s", jm.Status, jm.ProgressMessage, endl) } else if jm.Stream != "" { fmt.Fprintf(out, "%s%s", jm.Stream, endl) diff --git a/vendor/github.com/docker/docker/pkg/mount/flags.go b/vendor/github.com/docker/docker/pkg/mount/flags.go deleted file mode 100644 index ffd473311d..0000000000 --- a/vendor/github.com/docker/docker/pkg/mount/flags.go +++ /dev/null @@ -1,137 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -import ( - "fmt" - "strings" -) - -var flags = map[string]struct { - clear bool - flag int -}{ - "defaults": {false, 0}, - "ro": {false, RDONLY}, - "rw": {true, RDONLY}, - "suid": {true, NOSUID}, - "nosuid": {false, NOSUID}, - "dev": {true, NODEV}, - "nodev": {false, NODEV}, - "exec": {true, NOEXEC}, - "noexec": {false, NOEXEC}, - "sync": {false, SYNCHRONOUS}, - "async": {true, SYNCHRONOUS}, - "dirsync": {false, DIRSYNC}, - "remount": {false, REMOUNT}, - "mand": {false, MANDLOCK}, - "nomand": {true, MANDLOCK}, - "atime": {true, NOATIME}, - "noatime": {false, NOATIME}, - "diratime": {true, NODIRATIME}, - "nodiratime": {false, NODIRATIME}, - "bind": {false, BIND}, - "rbind": {false, RBIND}, - "unbindable": {false, UNBINDABLE}, - "runbindable": {false, RUNBINDABLE}, - "private": {false, PRIVATE}, - "rprivate": {false, RPRIVATE}, - "shared": {false, SHARED}, - "rshared": {false, RSHARED}, - "slave": {false, SLAVE}, - "rslave": {false, RSLAVE}, - "relatime": {false, RELATIME}, - "norelatime": {true, RELATIME}, - "strictatime": {false, STRICTATIME}, - "nostrictatime": {true, STRICTATIME}, -} - -var validFlags = map[string]bool{ - "": true, - "size": true, - "mode": true, - "uid": true, - "gid": true, - "nr_inodes": true, - "nr_blocks": true, - "mpol": true, -} - -var propagationFlags = map[string]bool{ - "bind": true, - "rbind": true, - "unbindable": true, - "runbindable": true, - "private": true, - "rprivate": true, - "shared": true, - "rshared": true, - "slave": true, - "rslave": true, -} - -// MergeTmpfsOptions merge mount options to make sure there is no duplicate. -func MergeTmpfsOptions(options []string) ([]string, error) { - // We use collisions maps to remove duplicates. - // For flag, the key is the flag value (the key for propagation flag is -1) - // For data=value, the key is the data - flagCollisions := map[int]bool{} - dataCollisions := map[string]bool{} - - var newOptions []string - // We process in reverse order - for i := len(options) - 1; i >= 0; i-- { - option := options[i] - if option == "defaults" { - continue - } - if f, ok := flags[option]; ok && f.flag != 0 { - // There is only one propagation mode - key := f.flag - if propagationFlags[option] { - key = -1 - } - // Check to see if there is collision for flag - if !flagCollisions[key] { - // We prepend the option and add to collision map - newOptions = append([]string{option}, newOptions...) - flagCollisions[key] = true - } - continue - } - opt := strings.SplitN(option, "=", 2) - if len(opt) != 2 || !validFlags[opt[0]] { - return nil, fmt.Errorf("Invalid tmpfs option %q", opt) - } - if !dataCollisions[opt[0]] { - // We prepend the option and add to collision map - newOptions = append([]string{option}, newOptions...) - dataCollisions[opt[0]] = true - } - } - - return newOptions, nil -} - -// Parse fstab type mount options into mount() flags -// and device specific data -func parseOptions(options string) (int, string) { - var ( - flag int - data []string - ) - - for _, o := range strings.Split(options, ",") { - // If the option does not exist in the flags table or the flag - // is not supported on the platform, - // then it is a data value for a specific fs type - if f, exists := flags[o]; exists && f.flag != 0 { - if f.clear { - flag &= ^f.flag - } else { - flag |= f.flag - } - } else { - data = append(data, o) - } - } - return flag, strings.Join(data, ",") -} diff --git a/vendor/github.com/docker/docker/pkg/mount/flags_freebsd.go b/vendor/github.com/docker/docker/pkg/mount/flags_freebsd.go deleted file mode 100644 index ef35ef9059..0000000000 --- a/vendor/github.com/docker/docker/pkg/mount/flags_freebsd.go +++ /dev/null @@ -1,49 +0,0 @@ -// +build freebsd,cgo - -package mount // import "github.com/docker/docker/pkg/mount" - -/* -#include -*/ -import "C" - -const ( - // RDONLY will mount the filesystem as read-only. - RDONLY = C.MNT_RDONLY - - // NOSUID will not allow set-user-identifier or set-group-identifier bits to - // take effect. - NOSUID = C.MNT_NOSUID - - // NOEXEC will not allow execution of any binaries on the mounted file system. - NOEXEC = C.MNT_NOEXEC - - // SYNCHRONOUS will allow any I/O to the file system to be done synchronously. - SYNCHRONOUS = C.MNT_SYNCHRONOUS - - // NOATIME will not update the file access time when reading from a file. - NOATIME = C.MNT_NOATIME -) - -// These flags are unsupported. -const ( - BIND = 0 - DIRSYNC = 0 - MANDLOCK = 0 - NODEV = 0 - NODIRATIME = 0 - UNBINDABLE = 0 - RUNBINDABLE = 0 - PRIVATE = 0 - RPRIVATE = 0 - SHARED = 0 - RSHARED = 0 - SLAVE = 0 - RSLAVE = 0 - RBIND = 0 - RELATIVE = 0 - RELATIME = 0 - REMOUNT = 0 - STRICTATIME = 0 - mntDetach = 0 -) diff --git a/vendor/github.com/docker/docker/pkg/mount/flags_linux.go b/vendor/github.com/docker/docker/pkg/mount/flags_linux.go deleted file mode 100644 index a1b199a31a..0000000000 --- a/vendor/github.com/docker/docker/pkg/mount/flags_linux.go +++ /dev/null @@ -1,87 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -import ( - "golang.org/x/sys/unix" -) - -const ( - // RDONLY will mount the file system read-only. - RDONLY = unix.MS_RDONLY - - // NOSUID will not allow set-user-identifier or set-group-identifier bits to - // take effect. - NOSUID = unix.MS_NOSUID - - // NODEV will not interpret character or block special devices on the file - // system. - NODEV = unix.MS_NODEV - - // NOEXEC will not allow execution of any binaries on the mounted file system. - NOEXEC = unix.MS_NOEXEC - - // SYNCHRONOUS will allow I/O to the file system to be done synchronously. - SYNCHRONOUS = unix.MS_SYNCHRONOUS - - // DIRSYNC will force all directory updates within the file system to be done - // synchronously. This affects the following system calls: create, link, - // unlink, symlink, mkdir, rmdir, mknod and rename. - DIRSYNC = unix.MS_DIRSYNC - - // REMOUNT will attempt to remount an already-mounted file system. This is - // commonly used to change the mount flags for a file system, especially to - // make a readonly file system writeable. It does not change device or mount - // point. - REMOUNT = unix.MS_REMOUNT - - // MANDLOCK will force mandatory locks on a filesystem. - MANDLOCK = unix.MS_MANDLOCK - - // NOATIME will not update the file access time when reading from a file. - NOATIME = unix.MS_NOATIME - - // NODIRATIME will not update the directory access time. - NODIRATIME = unix.MS_NODIRATIME - - // BIND remounts a subtree somewhere else. - BIND = unix.MS_BIND - - // RBIND remounts a subtree and all possible submounts somewhere else. - RBIND = unix.MS_BIND | unix.MS_REC - - // UNBINDABLE creates a mount which cannot be cloned through a bind operation. - UNBINDABLE = unix.MS_UNBINDABLE - - // RUNBINDABLE marks the entire mount tree as UNBINDABLE. - RUNBINDABLE = unix.MS_UNBINDABLE | unix.MS_REC - - // PRIVATE creates a mount which carries no propagation abilities. - PRIVATE = unix.MS_PRIVATE - - // RPRIVATE marks the entire mount tree as PRIVATE. - RPRIVATE = unix.MS_PRIVATE | unix.MS_REC - - // SLAVE creates a mount which receives propagation from its master, but not - // vice versa. - SLAVE = unix.MS_SLAVE - - // RSLAVE marks the entire mount tree as SLAVE. - RSLAVE = unix.MS_SLAVE | unix.MS_REC - - // SHARED creates a mount which provides the ability to create mirrors of - // that mount such that mounts and unmounts within any of the mirrors - // propagate to the other mirrors. - SHARED = unix.MS_SHARED - - // RSHARED marks the entire mount tree as SHARED. - RSHARED = unix.MS_SHARED | unix.MS_REC - - // RELATIME updates inode access times relative to modify or change time. - RELATIME = unix.MS_RELATIME - - // STRICTATIME allows to explicitly request full atime updates. This makes - // it possible for the kernel to default to relatime or noatime but still - // allow userspace to override it. - STRICTATIME = unix.MS_STRICTATIME - - mntDetach = unix.MNT_DETACH -) diff --git a/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go deleted file mode 100644 index cc6c475908..0000000000 --- a/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go +++ /dev/null @@ -1,31 +0,0 @@ -// +build !linux,!freebsd freebsd,!cgo - -package mount // import "github.com/docker/docker/pkg/mount" - -// These flags are unsupported. -const ( - BIND = 0 - DIRSYNC = 0 - MANDLOCK = 0 - NOATIME = 0 - NODEV = 0 - NODIRATIME = 0 - NOEXEC = 0 - NOSUID = 0 - UNBINDABLE = 0 - RUNBINDABLE = 0 - PRIVATE = 0 - RPRIVATE = 0 - SHARED = 0 - RSHARED = 0 - SLAVE = 0 - RSLAVE = 0 - RBIND = 0 - RELATIME = 0 - RELATIVE = 0 - REMOUNT = 0 - STRICTATIME = 0 - SYNCHRONOUS = 0 - RDONLY = 0 - mntDetach = 0 -) diff --git a/vendor/github.com/docker/docker/pkg/mount/mount.go b/vendor/github.com/docker/docker/pkg/mount/mount.go deleted file mode 100644 index be0631c630..0000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mount.go +++ /dev/null @@ -1,159 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -import ( - "sort" - "strconv" - "strings" - - "github.com/sirupsen/logrus" -) - -// mountError records an error from mount or unmount operation -type mountError struct { - op string - source, target string - flags uintptr - data string - err error -} - -func (e *mountError) Error() string { - out := e.op + " " - - if e.source != "" { - out += e.source + ":" + e.target - } else { - out += e.target - } - - if e.flags != uintptr(0) { - out += ", flags: 0x" + strconv.FormatUint(uint64(e.flags), 16) - } - if e.data != "" { - out += ", data: " + e.data - } - - out += ": " + e.err.Error() - return out -} - -// Cause returns the underlying cause of the error -func (e *mountError) Cause() error { - return e.err -} - -// FilterFunc is a type defining a callback function -// to filter out unwanted entries. It takes a pointer -// to an Info struct (not fully populated, currently -// only Mountpoint is filled in), and returns two booleans: -// - skip: true if the entry should be skipped -// - stop: true if parsing should be stopped after the entry -type FilterFunc func(*Info) (skip, stop bool) - -// PrefixFilter discards all entries whose mount points -// do not start with a prefix specified -func PrefixFilter(prefix string) FilterFunc { - return func(m *Info) (bool, bool) { - skip := !strings.HasPrefix(m.Mountpoint, prefix) - return skip, false - } -} - -// SingleEntryFilter looks for a specific entry -func SingleEntryFilter(mp string) FilterFunc { - return func(m *Info) (bool, bool) { - if m.Mountpoint == mp { - return false, true // don't skip, stop now - } - return true, false // skip, keep going - } -} - -// ParentsFilter returns all entries whose mount points -// can be parents of a path specified, discarding others. -// For example, given `/var/lib/docker/something`, entries -// like `/var/lib/docker`, `/var` and `/` are returned. -func ParentsFilter(path string) FilterFunc { - return func(m *Info) (bool, bool) { - skip := !strings.HasPrefix(path, m.Mountpoint) - return skip, false - } -} - -// GetMounts retrieves a list of mounts for the current running process, -// with an optional filter applied (use nil for no filter). -func GetMounts(f FilterFunc) ([]*Info, error) { - return parseMountTable(f) -} - -// Mounted determines if a specified mountpoint has been mounted. -// On Linux it looks at /proc/self/mountinfo. -func Mounted(mountpoint string) (bool, error) { - entries, err := GetMounts(SingleEntryFilter(mountpoint)) - if err != nil { - return false, err - } - - return len(entries) > 0, nil -} - -// Mount will mount filesystem according to the specified configuration, on the -// condition that the target path is *not* already mounted. Options must be -// specified like the mount or fstab unix commands: "opt1=val1,opt2=val2". See -// flags.go for supported option flags. -func Mount(device, target, mType, options string) error { - flag, data := parseOptions(options) - if flag&REMOUNT != REMOUNT { - if mounted, err := Mounted(target); err != nil || mounted { - return err - } - } - return mount(device, target, mType, uintptr(flag), data) -} - -// ForceMount will mount a filesystem according to the specified configuration, -// *regardless* if the target path is not already mounted. Options must be -// specified like the mount or fstab unix commands: "opt1=val1,opt2=val2". See -// flags.go for supported option flags. -func ForceMount(device, target, mType, options string) error { - flag, data := parseOptions(options) - return mount(device, target, mType, uintptr(flag), data) -} - -// Unmount lazily unmounts a filesystem on supported platforms, otherwise -// does a normal unmount. -func Unmount(target string) error { - return unmount(target, mntDetach) -} - -// RecursiveUnmount unmounts the target and all mounts underneath, starting with -// the deepsest mount first. -func RecursiveUnmount(target string) error { - mounts, err := parseMountTable(PrefixFilter(target)) - if err != nil { - return err - } - - // Make the deepest mount be first - sort.Slice(mounts, func(i, j int) bool { - return len(mounts[i].Mountpoint) > len(mounts[j].Mountpoint) - }) - - for i, m := range mounts { - logrus.Debugf("Trying to unmount %s", m.Mountpoint) - err = unmount(m.Mountpoint, mntDetach) - if err != nil { - if i == len(mounts)-1 { // last mount - if mounted, e := Mounted(m.Mountpoint); e != nil || mounted { - return err - } - } else { - // This is some submount, we can ignore this error for now, the final unmount will fail if this is a real problem - logrus.WithError(err).Warnf("Failed to unmount submount %s", m.Mountpoint) - } - } - - logrus.Debugf("Unmounted %s", m.Mountpoint) - } - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mounter_freebsd.go b/vendor/github.com/docker/docker/pkg/mount/mounter_freebsd.go deleted file mode 100644 index 09ad360608..0000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mounter_freebsd.go +++ /dev/null @@ -1,59 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -/* -#include -#include -#include -#include -#include -#include -*/ -import "C" - -import ( - "strings" - "syscall" - "unsafe" -) - -func allocateIOVecs(options []string) []C.struct_iovec { - out := make([]C.struct_iovec, len(options)) - for i, option := range options { - out[i].iov_base = unsafe.Pointer(C.CString(option)) - out[i].iov_len = C.size_t(len(option) + 1) - } - return out -} - -func mount(device, target, mType string, flag uintptr, data string) error { - isNullFS := false - - xs := strings.Split(data, ",") - for _, x := range xs { - if x == "bind" { - isNullFS = true - } - } - - options := []string{"fspath", target} - if isNullFS { - options = append(options, "fstype", "nullfs", "target", device) - } else { - options = append(options, "fstype", mType, "from", device) - } - rawOptions := allocateIOVecs(options) - for _, rawOption := range rawOptions { - defer C.free(rawOption.iov_base) - } - - if errno := C.nmount(&rawOptions[0], C.uint(len(options)), C.int(flag)); errno != 0 { - return &mountError{ - op: "mount", - source: device, - target: target, - flags: flag, - err: syscall.Errno(errno), - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mounter_linux.go b/vendor/github.com/docker/docker/pkg/mount/mounter_linux.go deleted file mode 100644 index a0a1ad2364..0000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mounter_linux.go +++ /dev/null @@ -1,73 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -import ( - "golang.org/x/sys/unix" -) - -const ( - // ptypes is the set propagation types. - ptypes = unix.MS_SHARED | unix.MS_PRIVATE | unix.MS_SLAVE | unix.MS_UNBINDABLE - - // pflags is the full set valid flags for a change propagation call. - pflags = ptypes | unix.MS_REC | unix.MS_SILENT - - // broflags is the combination of bind and read only - broflags = unix.MS_BIND | unix.MS_RDONLY -) - -// isremount returns true if either device name or flags identify a remount request, false otherwise. -func isremount(device string, flags uintptr) bool { - switch { - // We treat device "" and "none" as a remount request to provide compatibility with - // requests that don't explicitly set MS_REMOUNT such as those manipulating bind mounts. - case flags&unix.MS_REMOUNT != 0, device == "", device == "none": - return true - default: - return false - } -} - -func mount(device, target, mType string, flags uintptr, data string) error { - oflags := flags &^ ptypes - if !isremount(device, flags) || data != "" { - // Initial call applying all non-propagation flags for mount - // or remount with changed data - if err := unix.Mount(device, target, mType, oflags, data); err != nil { - return &mountError{ - op: "mount", - source: device, - target: target, - flags: oflags, - data: data, - err: err, - } - } - } - - if flags&ptypes != 0 { - // Change the propagation type. - if err := unix.Mount("", target, "", flags&pflags, ""); err != nil { - return &mountError{ - op: "remount", - target: target, - flags: flags & pflags, - err: err, - } - } - } - - if oflags&broflags == broflags { - // Remount the bind to apply read only. - if err := unix.Mount("", target, "", oflags|unix.MS_REMOUNT, ""); err != nil { - return &mountError{ - op: "remount-ro", - target: target, - flags: oflags | unix.MS_REMOUNT, - err: err, - } - - } - } - - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go deleted file mode 100644 index c3e5aec274..0000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build !linux,!freebsd freebsd,!cgo - -package mount // import "github.com/docker/docker/pkg/mount" - -func mount(device, target, mType string, flag uintptr, data string) error { - panic("Not implemented") -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo.go deleted file mode 100644 index ecd03fc022..0000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo.go +++ /dev/null @@ -1,40 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -// Info reveals information about a particular mounted filesystem. This -// struct is populated from the content in the /proc//mountinfo file. -type Info struct { - // ID is a unique identifier of the mount (may be reused after umount). - ID int - - // Parent indicates the ID of the mount parent (or of self for the top of the - // mount tree). - Parent int - - // Major indicates one half of the device ID which identifies the device class. - Major int - - // Minor indicates one half of the device ID which identifies a specific - // instance of device. - Minor int - - // Root of the mount within the filesystem. - Root string - - // Mountpoint indicates the mount point relative to the process's root. - Mountpoint string - - // Opts represents mount-specific options. - Opts string - - // Optional represents optional fields. - Optional string - - // Fstype indicates the type of filesystem, such as EXT3. - Fstype string - - // Source indicates filesystem specific information or "none". - Source string - - // VfsOpts represents per super block options. - VfsOpts string -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go deleted file mode 100644 index 307b93459d..0000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go +++ /dev/null @@ -1,54 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -/* -#include -#include -#include -*/ -import "C" - -import ( - "fmt" - "reflect" - "unsafe" -) - -//parseMountTable returns information about mounted filesystems -func parseMountTable(filter FilterFunc) ([]*Info, error) { - var rawEntries *C.struct_statfs - - count := int(C.getmntinfo(&rawEntries, C.MNT_WAIT)) - if count == 0 { - return nil, fmt.Errorf("Failed to call getmntinfo") - } - - var entries []C.struct_statfs - header := (*reflect.SliceHeader)(unsafe.Pointer(&entries)) - header.Cap = count - header.Len = count - header.Data = uintptr(unsafe.Pointer(rawEntries)) - - var out []*Info - for _, entry := range entries { - var mountinfo Info - var skip, stop bool - mountinfo.Mountpoint = C.GoString(&entry.f_mntonname[0]) - - if filter != nil { - // filter out entries we're not interested in - skip, stop = filter(&mountinfo) - if skip { - continue - } - } - - mountinfo.Source = C.GoString(&entry.f_mntfromname[0]) - mountinfo.Fstype = C.GoString(&entry.f_fstypename[0]) - - out = append(out, &mountinfo) - if stop { - break - } - } - return out, nil -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go deleted file mode 100644 index fe6e3ddba1..0000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go +++ /dev/null @@ -1,144 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -import ( - "bufio" - "fmt" - "io" - "os" - "strconv" - "strings" - - "github.com/pkg/errors" -) - -func parseInfoFile(r io.Reader, filter FilterFunc) ([]*Info, error) { - s := bufio.NewScanner(r) - out := []*Info{} - var err error - for s.Scan() { - if err = s.Err(); err != nil { - return nil, err - } - /* - See http://man7.org/linux/man-pages/man5/proc.5.html - - 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue - (1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11) - - (1) mount ID: unique identifier of the mount (may be reused after umount) - (2) parent ID: ID of parent (or of self for the top of the mount tree) - (3) major:minor: value of st_dev for files on filesystem - (4) root: root of the mount within the filesystem - (5) mount point: mount point relative to the process's root - (6) mount options: per mount options - (7) optional fields: zero or more fields of the form "tag[:value]" - (8) separator: marks the end of the optional fields - (9) filesystem type: name of filesystem of the form "type[.subtype]" - (10) mount source: filesystem specific information or "none" - (11) super options: per super block options - */ - - text := s.Text() - fields := strings.Split(text, " ") - numFields := len(fields) - if numFields < 10 { - // should be at least 10 fields - return nil, fmt.Errorf("Parsing '%s' failed: not enough fields (%d)", text, numFields) - } - - p := &Info{} - // ignore any numbers parsing errors, as there should not be any - p.ID, _ = strconv.Atoi(fields[0]) - p.Parent, _ = strconv.Atoi(fields[1]) - mm := strings.Split(fields[2], ":") - if len(mm) != 2 { - return nil, fmt.Errorf("Parsing '%s' failed: unexpected minor:major pair %s", text, mm) - } - p.Major, _ = strconv.Atoi(mm[0]) - p.Minor, _ = strconv.Atoi(mm[1]) - - p.Root, err = strconv.Unquote(`"` + fields[3] + `"`) - if err != nil { - return nil, errors.Wrapf(err, "Parsing '%s' failed: unable to unquote root field", fields[3]) - } - - p.Mountpoint, err = strconv.Unquote(`"` + fields[4] + `"`) - if err != nil { - return nil, errors.Wrapf(err, "Parsing '%s' failed: unable to unquote mount point field", fields[4]) - } - p.Opts = fields[5] - - var skip, stop bool - if filter != nil { - // filter out entries we're not interested in - skip, stop = filter(p) - if skip { - continue - } - } - - // one or more optional fields, when a separator (-) - i := 6 - for ; i < numFields && fields[i] != "-"; i++ { - switch i { - case 6: - p.Optional = fields[6] - default: - /* NOTE there might be more optional fields before the such as - fields[7]...fields[N] (where N < sepIndex), although - as of Linux kernel 4.15 the only known ones are - mount propagation flags in fields[6]. The correct - behavior is to ignore any unknown optional fields. - */ - break - } - } - if i == numFields { - return nil, fmt.Errorf("Parsing '%s' failed: missing separator ('-')", text) - } - - // There should be 3 fields after the separator... - if i+4 > numFields { - return nil, fmt.Errorf("Parsing '%s' failed: not enough fields after a separator", text) - } - // ... but in Linux <= 3.9 mounting a cifs with spaces in a share name - // (like "//serv/My Documents") _may_ end up having a space in the last field - // of mountinfo (like "unc=//serv/My Documents"). Since kernel 3.10-rc1, cifs - // option unc= is ignored, so a space should not appear. In here we ignore - // those "extra" fields caused by extra spaces. - p.Fstype = fields[i+1] - p.Source = fields[i+2] - p.VfsOpts = fields[i+3] - - out = append(out, p) - if stop { - break - } - } - return out, nil -} - -// Parse /proc/self/mountinfo because comparing Dev and ino does not work from -// bind mounts -func parseMountTable(filter FilterFunc) ([]*Info, error) { - f, err := os.Open("/proc/self/mountinfo") - if err != nil { - return nil, err - } - defer f.Close() - - return parseInfoFile(f, filter) -} - -// PidMountInfo collects the mounts for a specific process ID. If the process -// ID is unknown, it is better to use `GetMounts` which will inspect -// "/proc/self/mountinfo" instead. -func PidMountInfo(pid int) ([]*Info, error) { - f, err := os.Open(fmt.Sprintf("/proc/%d/mountinfo", pid)) - if err != nil { - return nil, err - } - defer f.Close() - - return parseInfoFile(f, nil) -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go deleted file mode 100644 index fd16d3ed69..0000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !windows,!linux,!freebsd freebsd,!cgo - -package mount // import "github.com/docker/docker/pkg/mount" - -import ( - "fmt" - "runtime" -) - -func parseMountTable(f FilterFunc) ([]*Info, error) { - return nil, fmt.Errorf("mount.parseMountTable is not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go deleted file mode 100644 index 27e0f6976e..0000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go +++ /dev/null @@ -1,6 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -func parseMountTable(f FilterFunc) ([]*Info, error) { - // Do NOT return an error! - return nil, nil -} diff --git a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go b/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go deleted file mode 100644 index db3882874a..0000000000 --- a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go +++ /dev/null @@ -1,71 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -// MakeShared ensures a mounted filesystem has the SHARED mount option enabled. -// See the supported options in flags.go for further reference. -func MakeShared(mountPoint string) error { - return ensureMountedAs(mountPoint, SHARED) -} - -// MakeRShared ensures a mounted filesystem has the RSHARED mount option enabled. -// See the supported options in flags.go for further reference. -func MakeRShared(mountPoint string) error { - return ensureMountedAs(mountPoint, RSHARED) -} - -// MakePrivate ensures a mounted filesystem has the PRIVATE mount option enabled. -// See the supported options in flags.go for further reference. -func MakePrivate(mountPoint string) error { - return ensureMountedAs(mountPoint, PRIVATE) -} - -// MakeRPrivate ensures a mounted filesystem has the RPRIVATE mount option -// enabled. See the supported options in flags.go for further reference. -func MakeRPrivate(mountPoint string) error { - return ensureMountedAs(mountPoint, RPRIVATE) -} - -// MakeSlave ensures a mounted filesystem has the SLAVE mount option enabled. -// See the supported options in flags.go for further reference. -func MakeSlave(mountPoint string) error { - return ensureMountedAs(mountPoint, SLAVE) -} - -// MakeRSlave ensures a mounted filesystem has the RSLAVE mount option enabled. -// See the supported options in flags.go for further reference. -func MakeRSlave(mountPoint string) error { - return ensureMountedAs(mountPoint, RSLAVE) -} - -// MakeUnbindable ensures a mounted filesystem has the UNBINDABLE mount option -// enabled. See the supported options in flags.go for further reference. -func MakeUnbindable(mountPoint string) error { - return ensureMountedAs(mountPoint, UNBINDABLE) -} - -// MakeRUnbindable ensures a mounted filesystem has the RUNBINDABLE mount -// option enabled. See the supported options in flags.go for further reference. -func MakeRUnbindable(mountPoint string) error { - return ensureMountedAs(mountPoint, RUNBINDABLE) -} - -// MakeMount ensures that the file or directory given is a mount point, -// bind mounting it to itself it case it is not. -func MakeMount(mnt string) error { - mounted, err := Mounted(mnt) - if err != nil { - return err - } - if mounted { - return nil - } - - return mount(mnt, mnt, "none", uintptr(BIND), "") -} - -func ensureMountedAs(mnt string, flags int) error { - if err := MakeMount(mnt); err != nil { - return err - } - - return mount("", mnt, "none", uintptr(flags), "") -} diff --git a/vendor/github.com/docker/docker/pkg/mount/unmount_unix.go b/vendor/github.com/docker/docker/pkg/mount/unmount_unix.go deleted file mode 100644 index 4be4276851..0000000000 --- a/vendor/github.com/docker/docker/pkg/mount/unmount_unix.go +++ /dev/null @@ -1,22 +0,0 @@ -// +build !windows - -package mount // import "github.com/docker/docker/pkg/mount" - -import "golang.org/x/sys/unix" - -func unmount(target string, flags int) error { - err := unix.Unmount(target, flags) - if err == nil || err == unix.EINVAL { - // Ignore "not mounted" error here. Note the same error - // can be returned if flags are invalid, so this code - // assumes that the flags value is always correct. - return nil - } - - return &mountError{ - op: "umount", - target: target, - flags: uintptr(flags), - err: err, - } -} diff --git a/vendor/github.com/docker/docker/pkg/mount/unmount_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/unmount_unsupported.go deleted file mode 100644 index a88ad35774..0000000000 --- a/vendor/github.com/docker/docker/pkg/mount/unmount_unsupported.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build windows - -package mount // import "github.com/docker/docker/pkg/mount" - -func unmount(target string, flag int) error { - panic("Not implemented") -} diff --git a/vendor/github.com/docker/docker/pkg/system/args_windows.go b/vendor/github.com/docker/docker/pkg/system/args_windows.go deleted file mode 100644 index b7c9487a06..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/args_windows.go +++ /dev/null @@ -1,16 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "strings" - - "golang.org/x/sys/windows" -) - -// EscapeArgs makes a Windows-style escaped command line from a set of arguments -func EscapeArgs(args []string) string { - escapedArgs := make([]string, len(args)) - for i, a := range args { - escapedArgs[i] = windows.EscapeArg(a) - } - return strings.Join(escapedArgs, " ") -} diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes.go b/vendor/github.com/docker/docker/pkg/system/chtimes.go deleted file mode 100644 index c26a4e24b6..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/chtimes.go +++ /dev/null @@ -1,31 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "os" - "time" -) - -// Chtimes changes the access time and modified time of a file at the given path -func Chtimes(name string, atime time.Time, mtime time.Time) error { - unixMinTime := time.Unix(0, 0) - unixMaxTime := maxTime - - // If the modified time is prior to the Unix Epoch, or after the - // end of Unix Time, os.Chtimes has undefined behavior - // default to Unix Epoch in this case, just in case - - if atime.Before(unixMinTime) || atime.After(unixMaxTime) { - atime = unixMinTime - } - - if mtime.Before(unixMinTime) || mtime.After(unixMaxTime) { - mtime = unixMinTime - } - - if err := os.Chtimes(name, atime, mtime); err != nil { - return err - } - - // Take platform specific action for setting create time. - return setCTime(name, mtime) -} diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes_unix.go b/vendor/github.com/docker/docker/pkg/system/chtimes_unix.go deleted file mode 100644 index 259138a45b..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/chtimes_unix.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build !windows - -package system // import "github.com/docker/docker/pkg/system" - -import ( - "time" -) - -//setCTime will set the create time on a file. On Unix, the create -//time is updated as a side effect of setting the modified time, so -//no action is required. -func setCTime(path string, ctime time.Time) error { - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go b/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go deleted file mode 100644 index d3a115ff42..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go +++ /dev/null @@ -1,26 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "time" - - "golang.org/x/sys/windows" -) - -//setCTime will set the create time on a file. On Windows, this requires -//calling SetFileTime and explicitly including the create time. -func setCTime(path string, ctime time.Time) error { - ctimespec := windows.NsecToTimespec(ctime.UnixNano()) - pathp, e := windows.UTF16PtrFromString(path) - if e != nil { - return e - } - h, e := windows.CreateFile(pathp, - windows.FILE_WRITE_ATTRIBUTES, windows.FILE_SHARE_WRITE, nil, - windows.OPEN_EXISTING, windows.FILE_FLAG_BACKUP_SEMANTICS, 0) - if e != nil { - return e - } - defer windows.Close(h) - c := windows.NsecToFiletime(windows.TimespecToNsec(ctimespec)) - return windows.SetFileTime(h, &c, nil, nil) -} diff --git a/vendor/github.com/docker/docker/pkg/system/errors.go b/vendor/github.com/docker/docker/pkg/system/errors.go deleted file mode 100644 index 2573d71622..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/errors.go +++ /dev/null @@ -1,13 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "errors" -) - -var ( - // ErrNotSupportedPlatform means the platform is not supported. - ErrNotSupportedPlatform = errors.New("platform and architecture is not supported") - - // ErrNotSupportedOperatingSystem means the operating system is not supported. - ErrNotSupportedOperatingSystem = errors.New("operating system is not supported") -) diff --git a/vendor/github.com/docker/docker/pkg/system/exitcode.go b/vendor/github.com/docker/docker/pkg/system/exitcode.go deleted file mode 100644 index 4ba8fe35bf..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/exitcode.go +++ /dev/null @@ -1,19 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "fmt" - "os/exec" - "syscall" -) - -// GetExitCode returns the ExitStatus of the specified error if its type is -// exec.ExitError, returns 0 and an error otherwise. -func GetExitCode(err error) (int, error) { - exitCode := 0 - if exiterr, ok := err.(*exec.ExitError); ok { - if procExit, ok := exiterr.Sys().(syscall.WaitStatus); ok { - return procExit.ExitStatus(), nil - } - } - return exitCode, fmt.Errorf("failed to get exit code") -} diff --git a/vendor/github.com/docker/docker/pkg/system/filesys.go b/vendor/github.com/docker/docker/pkg/system/filesys.go deleted file mode 100644 index adeb163052..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/filesys.go +++ /dev/null @@ -1,67 +0,0 @@ -// +build !windows - -package system // import "github.com/docker/docker/pkg/system" - -import ( - "io/ioutil" - "os" - "path/filepath" -) - -// MkdirAllWithACL is a wrapper for MkdirAll on unix systems. -func MkdirAllWithACL(path string, perm os.FileMode, sddl string) error { - return MkdirAll(path, perm, sddl) -} - -// MkdirAll creates a directory named path along with any necessary parents, -// with permission specified by attribute perm for all dir created. -func MkdirAll(path string, perm os.FileMode, sddl string) error { - return os.MkdirAll(path, perm) -} - -// IsAbs is a platform-specific wrapper for filepath.IsAbs. -func IsAbs(path string) bool { - return filepath.IsAbs(path) -} - -// The functions below here are wrappers for the equivalents in the os and ioutils packages. -// They are passthrough on Unix platforms, and only relevant on Windows. - -// CreateSequential creates the named file with mode 0666 (before umask), truncating -// it if it already exists. If successful, methods on the returned -// File can be used for I/O; the associated file descriptor has mode -// O_RDWR. -// If there is an error, it will be of type *PathError. -func CreateSequential(name string) (*os.File, error) { - return os.Create(name) -} - -// OpenSequential opens the named file for reading. If successful, methods on -// the returned file can be used for reading; the associated file -// descriptor has mode O_RDONLY. -// If there is an error, it will be of type *PathError. -func OpenSequential(name string) (*os.File, error) { - return os.Open(name) -} - -// OpenFileSequential is the generalized open call; most users will use Open -// or Create instead. It opens the named file with specified flag -// (O_RDONLY etc.) and perm, (0666 etc.) if applicable. If successful, -// methods on the returned File can be used for I/O. -// If there is an error, it will be of type *PathError. -func OpenFileSequential(name string, flag int, perm os.FileMode) (*os.File, error) { - return os.OpenFile(name, flag, perm) -} - -// TempFileSequential creates a new temporary file in the directory dir -// with a name beginning with prefix, opens the file for reading -// and writing, and returns the resulting *os.File. -// If dir is the empty string, TempFile uses the default directory -// for temporary files (see os.TempDir). -// Multiple programs calling TempFile simultaneously -// will not choose the same file. The caller can use f.Name() -// to find the pathname of the file. It is the caller's responsibility -// to remove the file when no longer needed. -func TempFileSequential(dir, prefix string) (f *os.File, err error) { - return ioutil.TempFile(dir, prefix) -} diff --git a/vendor/github.com/docker/docker/pkg/system/filesys_windows.go b/vendor/github.com/docker/docker/pkg/system/filesys_windows.go deleted file mode 100644 index 3049ff38a4..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/filesys_windows.go +++ /dev/null @@ -1,294 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "os" - "path/filepath" - "regexp" - "strconv" - "strings" - "sync" - "syscall" - "time" - "unsafe" - - winio "github.com/Microsoft/go-winio" - "golang.org/x/sys/windows" -) - -const ( - // SddlAdministratorsLocalSystem is local administrators plus NT AUTHORITY\System - SddlAdministratorsLocalSystem = "D:P(A;OICI;GA;;;BA)(A;OICI;GA;;;SY)" -) - -// MkdirAllWithACL is a wrapper for MkdirAll that creates a directory -// with an appropriate SDDL defined ACL. -func MkdirAllWithACL(path string, perm os.FileMode, sddl string) error { - return mkdirall(path, true, sddl) -} - -// MkdirAll implementation that is volume path aware for Windows. -func MkdirAll(path string, _ os.FileMode, sddl string) error { - return mkdirall(path, false, sddl) -} - -// mkdirall is a custom version of os.MkdirAll modified for use on Windows -// so that it is both volume path aware, and can create a directory with -// a DACL. -func mkdirall(path string, applyACL bool, sddl string) error { - if re := regexp.MustCompile(`^\\\\\?\\Volume{[a-z0-9-]+}$`); re.MatchString(path) { - return nil - } - - // The rest of this method is largely copied from os.MkdirAll and should be kept - // as-is to ensure compatibility. - - // Fast path: if we can tell whether path is a directory or file, stop with success or error. - dir, err := os.Stat(path) - if err == nil { - if dir.IsDir() { - return nil - } - return &os.PathError{ - Op: "mkdir", - Path: path, - Err: syscall.ENOTDIR, - } - } - - // Slow path: make sure parent exists and then call Mkdir for path. - i := len(path) - for i > 0 && os.IsPathSeparator(path[i-1]) { // Skip trailing path separator. - i-- - } - - j := i - for j > 0 && !os.IsPathSeparator(path[j-1]) { // Scan backward over element. - j-- - } - - if j > 1 { - // Create parent - err = mkdirall(path[0:j-1], false, sddl) - if err != nil { - return err - } - } - - // Parent now exists; invoke os.Mkdir or mkdirWithACL and use its result. - if applyACL { - err = mkdirWithACL(path, sddl) - } else { - err = os.Mkdir(path, 0) - } - - if err != nil { - // Handle arguments like "foo/." by - // double-checking that directory doesn't exist. - dir, err1 := os.Lstat(path) - if err1 == nil && dir.IsDir() { - return nil - } - return err - } - return nil -} - -// mkdirWithACL creates a new directory. If there is an error, it will be of -// type *PathError. . -// -// This is a modified and combined version of os.Mkdir and windows.Mkdir -// in golang to cater for creating a directory am ACL permitting full -// access, with inheritance, to any subfolder/file for Built-in Administrators -// and Local System. -func mkdirWithACL(name string, sddl string) error { - sa := windows.SecurityAttributes{Length: 0} - sd, err := winio.SddlToSecurityDescriptor(sddl) - if err != nil { - return &os.PathError{Op: "mkdir", Path: name, Err: err} - } - sa.Length = uint32(unsafe.Sizeof(sa)) - sa.InheritHandle = 1 - sa.SecurityDescriptor = uintptr(unsafe.Pointer(&sd[0])) - - namep, err := windows.UTF16PtrFromString(name) - if err != nil { - return &os.PathError{Op: "mkdir", Path: name, Err: err} - } - - e := windows.CreateDirectory(namep, &sa) - if e != nil { - return &os.PathError{Op: "mkdir", Path: name, Err: e} - } - return nil -} - -// IsAbs is a platform-specific wrapper for filepath.IsAbs. On Windows, -// golang filepath.IsAbs does not consider a path \windows\system32 as absolute -// as it doesn't start with a drive-letter/colon combination. However, in -// docker we need to verify things such as WORKDIR /windows/system32 in -// a Dockerfile (which gets translated to \windows\system32 when being processed -// by the daemon. This SHOULD be treated as absolute from a docker processing -// perspective. -func IsAbs(path string) bool { - if !filepath.IsAbs(path) { - if !strings.HasPrefix(path, string(os.PathSeparator)) { - return false - } - } - return true -} - -// The origin of the functions below here are the golang OS and windows packages, -// slightly modified to only cope with files, not directories due to the -// specific use case. -// -// The alteration is to allow a file on Windows to be opened with -// FILE_FLAG_SEQUENTIAL_SCAN (particular for docker load), to avoid eating -// the standby list, particularly when accessing large files such as layer.tar. - -// CreateSequential creates the named file with mode 0666 (before umask), truncating -// it if it already exists. If successful, methods on the returned -// File can be used for I/O; the associated file descriptor has mode -// O_RDWR. -// If there is an error, it will be of type *PathError. -func CreateSequential(name string) (*os.File, error) { - return OpenFileSequential(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0) -} - -// OpenSequential opens the named file for reading. If successful, methods on -// the returned file can be used for reading; the associated file -// descriptor has mode O_RDONLY. -// If there is an error, it will be of type *PathError. -func OpenSequential(name string) (*os.File, error) { - return OpenFileSequential(name, os.O_RDONLY, 0) -} - -// OpenFileSequential is the generalized open call; most users will use Open -// or Create instead. -// If there is an error, it will be of type *PathError. -func OpenFileSequential(name string, flag int, _ os.FileMode) (*os.File, error) { - if name == "" { - return nil, &os.PathError{Op: "open", Path: name, Err: syscall.ENOENT} - } - r, errf := windowsOpenFileSequential(name, flag, 0) - if errf == nil { - return r, nil - } - return nil, &os.PathError{Op: "open", Path: name, Err: errf} -} - -func windowsOpenFileSequential(name string, flag int, _ os.FileMode) (file *os.File, err error) { - r, e := windowsOpenSequential(name, flag|windows.O_CLOEXEC, 0) - if e != nil { - return nil, e - } - return os.NewFile(uintptr(r), name), nil -} - -func makeInheritSa() *windows.SecurityAttributes { - var sa windows.SecurityAttributes - sa.Length = uint32(unsafe.Sizeof(sa)) - sa.InheritHandle = 1 - return &sa -} - -func windowsOpenSequential(path string, mode int, _ uint32) (fd windows.Handle, err error) { - if len(path) == 0 { - return windows.InvalidHandle, windows.ERROR_FILE_NOT_FOUND - } - pathp, err := windows.UTF16PtrFromString(path) - if err != nil { - return windows.InvalidHandle, err - } - var access uint32 - switch mode & (windows.O_RDONLY | windows.O_WRONLY | windows.O_RDWR) { - case windows.O_RDONLY: - access = windows.GENERIC_READ - case windows.O_WRONLY: - access = windows.GENERIC_WRITE - case windows.O_RDWR: - access = windows.GENERIC_READ | windows.GENERIC_WRITE - } - if mode&windows.O_CREAT != 0 { - access |= windows.GENERIC_WRITE - } - if mode&windows.O_APPEND != 0 { - access &^= windows.GENERIC_WRITE - access |= windows.FILE_APPEND_DATA - } - sharemode := uint32(windows.FILE_SHARE_READ | windows.FILE_SHARE_WRITE) - var sa *windows.SecurityAttributes - if mode&windows.O_CLOEXEC == 0 { - sa = makeInheritSa() - } - var createmode uint32 - switch { - case mode&(windows.O_CREAT|windows.O_EXCL) == (windows.O_CREAT | windows.O_EXCL): - createmode = windows.CREATE_NEW - case mode&(windows.O_CREAT|windows.O_TRUNC) == (windows.O_CREAT | windows.O_TRUNC): - createmode = windows.CREATE_ALWAYS - case mode&windows.O_CREAT == windows.O_CREAT: - createmode = windows.OPEN_ALWAYS - case mode&windows.O_TRUNC == windows.O_TRUNC: - createmode = windows.TRUNCATE_EXISTING - default: - createmode = windows.OPEN_EXISTING - } - // Use FILE_FLAG_SEQUENTIAL_SCAN rather than FILE_ATTRIBUTE_NORMAL as implemented in golang. - //https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx - const fileFlagSequentialScan = 0x08000000 // FILE_FLAG_SEQUENTIAL_SCAN - h, e := windows.CreateFile(pathp, access, sharemode, sa, createmode, fileFlagSequentialScan, 0) - return h, e -} - -// Helpers for TempFileSequential -var rand uint32 -var randmu sync.Mutex - -func reseed() uint32 { - return uint32(time.Now().UnixNano() + int64(os.Getpid())) -} -func nextSuffix() string { - randmu.Lock() - r := rand - if r == 0 { - r = reseed() - } - r = r*1664525 + 1013904223 // constants from Numerical Recipes - rand = r - randmu.Unlock() - return strconv.Itoa(int(1e9 + r%1e9))[1:] -} - -// TempFileSequential is a copy of ioutil.TempFile, modified to use sequential -// file access. Below is the original comment from golang: -// TempFile creates a new temporary file in the directory dir -// with a name beginning with prefix, opens the file for reading -// and writing, and returns the resulting *os.File. -// If dir is the empty string, TempFile uses the default directory -// for temporary files (see os.TempDir). -// Multiple programs calling TempFile simultaneously -// will not choose the same file. The caller can use f.Name() -// to find the pathname of the file. It is the caller's responsibility -// to remove the file when no longer needed. -func TempFileSequential(dir, prefix string) (f *os.File, err error) { - if dir == "" { - dir = os.TempDir() - } - - nconflict := 0 - for i := 0; i < 10000; i++ { - name := filepath.Join(dir, prefix+nextSuffix()) - f, err = OpenFileSequential(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) - if os.IsExist(err) { - if nconflict++; nconflict > 10 { - randmu.Lock() - rand = reseed() - randmu.Unlock() - } - continue - } - break - } - return -} diff --git a/vendor/github.com/docker/docker/pkg/system/init.go b/vendor/github.com/docker/docker/pkg/system/init.go deleted file mode 100644 index a17597aaba..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/init.go +++ /dev/null @@ -1,22 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "syscall" - "time" - "unsafe" -) - -// Used by chtimes -var maxTime time.Time - -func init() { - // chtimes initialization - if unsafe.Sizeof(syscall.Timespec{}.Nsec) == 8 { - // This is a 64 bit timespec - // os.Chtimes limits time to the following - maxTime = time.Unix(0, 1<<63-1) - } else { - // This is a 32 bit timespec - maxTime = time.Unix(1<<31-1, 0) - } -} diff --git a/vendor/github.com/docker/docker/pkg/system/init_unix.go b/vendor/github.com/docker/docker/pkg/system/init_unix.go deleted file mode 100644 index c2bb0f4cc4..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/init_unix.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !windows - -package system // import "github.com/docker/docker/pkg/system" - -// InitLCOW does nothing since LCOW is a windows only feature -func InitLCOW(experimental bool) { -} - -// ContainerdRuntimeSupported returns true if the use of ContainerD runtime is supported. -func ContainerdRuntimeSupported(_ bool, _ string) bool { - return true -} diff --git a/vendor/github.com/docker/docker/pkg/system/init_windows.go b/vendor/github.com/docker/docker/pkg/system/init_windows.go deleted file mode 100644 index f303aa9063..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/init_windows.go +++ /dev/null @@ -1,41 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "os" - - "github.com/Microsoft/hcsshim/osversion" - "github.com/sirupsen/logrus" -) - -var ( - // lcowSupported determines if Linux Containers on Windows are supported. - lcowSupported = false - - // containerdRuntimeSupported determines if ContainerD should be the runtime. - // As of March 2019, this is an experimental feature. - containerdRuntimeSupported = false -) - -// InitLCOW sets whether LCOW is supported or not. Requires RS5+ -func InitLCOW(experimental bool) { - v := GetOSVersion() - if experimental && v.Build >= osversion.RS5 { - lcowSupported = true - } -} - -// InitContainerdRuntime sets whether to use ContainerD for runtime -// on Windows. This is an experimental feature still in development, and -// also requires an environment variable to be set (so as not to turn the -// feature on from simply experimental which would also mean LCOW. -func InitContainerdRuntime(experimental bool, cdPath string) { - if experimental && len(cdPath) > 0 && len(os.Getenv("DOCKER_WINDOWS_CONTAINERD_RUNTIME")) > 0 { - logrus.Warnf("Using ContainerD runtime. This feature is experimental") - containerdRuntimeSupported = true - } -} - -// ContainerdRuntimeSupported returns true if the use of ContainerD runtime is supported. -func ContainerdRuntimeSupported() bool { - return containerdRuntimeSupported -} diff --git a/vendor/github.com/docker/docker/pkg/system/lcow.go b/vendor/github.com/docker/docker/pkg/system/lcow.go deleted file mode 100644 index 5be3e2182b..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/lcow.go +++ /dev/null @@ -1,32 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "runtime" - "strings" - - specs "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" -) - -// IsOSSupported determines if an operating system is supported by the host -func IsOSSupported(os string) bool { - if strings.EqualFold(runtime.GOOS, os) { - return true - } - if LCOWSupported() && strings.EqualFold(os, "linux") { - return true - } - return false -} - -// ValidatePlatform determines if a platform structure is valid. -// TODO This is a temporary windows-only function, should be replaced by -// comparison of worker capabilities -func ValidatePlatform(platform specs.Platform) error { - if runtime.GOOS == "windows" { - if !(platform.OS == runtime.GOOS || (LCOWSupported() && platform.OS == "linux")) { - return errors.Errorf("unsupported os %s", platform.OS) - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/lcow_unix.go b/vendor/github.com/docker/docker/pkg/system/lcow_unix.go deleted file mode 100644 index 26397fb8a1..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/lcow_unix.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !windows - -package system // import "github.com/docker/docker/pkg/system" - -// LCOWSupported returns true if Linux containers on Windows are supported. -func LCOWSupported() bool { - return false -} diff --git a/vendor/github.com/docker/docker/pkg/system/lcow_windows.go b/vendor/github.com/docker/docker/pkg/system/lcow_windows.go deleted file mode 100644 index f0139df8f7..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/lcow_windows.go +++ /dev/null @@ -1,6 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -// LCOWSupported returns true if Linux containers on Windows are supported. -func LCOWSupported() bool { - return lcowSupported -} diff --git a/vendor/github.com/docker/docker/pkg/system/lstat_unix.go b/vendor/github.com/docker/docker/pkg/system/lstat_unix.go deleted file mode 100644 index de5a1c0fb2..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/lstat_unix.go +++ /dev/null @@ -1,20 +0,0 @@ -// +build !windows - -package system // import "github.com/docker/docker/pkg/system" - -import ( - "os" - "syscall" -) - -// Lstat takes a path to a file and returns -// a system.StatT type pertaining to that file. -// -// Throws an error if the file does not exist -func Lstat(path string) (*StatT, error) { - s := &syscall.Stat_t{} - if err := syscall.Lstat(path, s); err != nil { - return nil, &os.PathError{Op: "Lstat", Path: path, Err: err} - } - return fromStatT(s) -} diff --git a/vendor/github.com/docker/docker/pkg/system/lstat_windows.go b/vendor/github.com/docker/docker/pkg/system/lstat_windows.go deleted file mode 100644 index 359c791d9b..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/lstat_windows.go +++ /dev/null @@ -1,14 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import "os" - -// Lstat calls os.Lstat to get a fileinfo interface back. -// This is then copied into our own locally defined structure. -func Lstat(path string) (*StatT, error) { - fi, err := os.Lstat(path) - if err != nil { - return nil, err - } - - return fromStatT(&fi) -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo.go b/vendor/github.com/docker/docker/pkg/system/meminfo.go deleted file mode 100644 index 6667eb84dc..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo.go +++ /dev/null @@ -1,17 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -// MemInfo contains memory statistics of the host system. -type MemInfo struct { - // Total usable RAM (i.e. physical RAM minus a few reserved bits and the - // kernel binary code). - MemTotal int64 - - // Amount of free memory. - MemFree int64 - - // Total amount of swap space available. - SwapTotal int64 - - // Amount of swap space that is currently unused. - SwapFree int64 -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go b/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go deleted file mode 100644 index 09a9d79f17..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go +++ /dev/null @@ -1,71 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "bufio" - "io" - "os" - "strconv" - "strings" - - "github.com/docker/go-units" -) - -// ReadMemInfo retrieves memory statistics of the host system and returns a -// MemInfo type. -func ReadMemInfo() (*MemInfo, error) { - file, err := os.Open("/proc/meminfo") - if err != nil { - return nil, err - } - defer file.Close() - return parseMemInfo(file) -} - -// parseMemInfo parses the /proc/meminfo file into -// a MemInfo object given an io.Reader to the file. -// Throws error if there are problems reading from the file -func parseMemInfo(reader io.Reader) (*MemInfo, error) { - meminfo := &MemInfo{} - scanner := bufio.NewScanner(reader) - memAvailable := int64(-1) - for scanner.Scan() { - // Expected format: ["MemTotal:", "1234", "kB"] - parts := strings.Fields(scanner.Text()) - - // Sanity checks: Skip malformed entries. - if len(parts) < 3 || parts[2] != "kB" { - continue - } - - // Convert to bytes. - size, err := strconv.Atoi(parts[1]) - if err != nil { - continue - } - bytes := int64(size) * units.KiB - - switch parts[0] { - case "MemTotal:": - meminfo.MemTotal = bytes - case "MemFree:": - meminfo.MemFree = bytes - case "MemAvailable:": - memAvailable = bytes - case "SwapTotal:": - meminfo.SwapTotal = bytes - case "SwapFree:": - meminfo.SwapFree = bytes - } - - } - if memAvailable != -1 { - meminfo.MemFree = memAvailable - } - - // Handle errors that may have occurred during the reading of the file. - if err := scanner.Err(); err != nil { - return nil, err - } - - return meminfo, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go b/vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go deleted file mode 100644 index 56f4494268..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !linux,!windows - -package system // import "github.com/docker/docker/pkg/system" - -// ReadMemInfo is not supported on platforms other than linux and windows. -func ReadMemInfo() (*MemInfo, error) { - return nil, ErrNotSupportedPlatform -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_windows.go b/vendor/github.com/docker/docker/pkg/system/meminfo_windows.go deleted file mode 100644 index 6ed93f2fe2..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_windows.go +++ /dev/null @@ -1,45 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -var ( - modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - - procGlobalMemoryStatusEx = modkernel32.NewProc("GlobalMemoryStatusEx") -) - -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366589(v=vs.85).aspx -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366770(v=vs.85).aspx -type memorystatusex struct { - dwLength uint32 - dwMemoryLoad uint32 - ullTotalPhys uint64 - ullAvailPhys uint64 - ullTotalPageFile uint64 - ullAvailPageFile uint64 - ullTotalVirtual uint64 - ullAvailVirtual uint64 - ullAvailExtendedVirtual uint64 -} - -// ReadMemInfo retrieves memory statistics of the host system and returns a -// MemInfo type. -func ReadMemInfo() (*MemInfo, error) { - msi := &memorystatusex{ - dwLength: 64, - } - r1, _, _ := procGlobalMemoryStatusEx.Call(uintptr(unsafe.Pointer(msi))) - if r1 == 0 { - return &MemInfo{}, nil - } - return &MemInfo{ - MemTotal: int64(msi.ullTotalPhys), - MemFree: int64(msi.ullAvailPhys), - SwapTotal: int64(msi.ullTotalPageFile), - SwapFree: int64(msi.ullAvailPageFile), - }, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/mknod.go b/vendor/github.com/docker/docker/pkg/system/mknod.go deleted file mode 100644 index b132482e03..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/mknod.go +++ /dev/null @@ -1,22 +0,0 @@ -// +build !windows - -package system // import "github.com/docker/docker/pkg/system" - -import ( - "golang.org/x/sys/unix" -) - -// Mknod creates a filesystem node (file, device special file or named pipe) named path -// with attributes specified by mode and dev. -func Mknod(path string, mode uint32, dev int) error { - return unix.Mknod(path, mode, dev) -} - -// Mkdev is used to build the value of linux devices (in /dev/) which specifies major -// and minor number of the newly created device special file. -// Linux device nodes are a bit weird due to backwards compat with 16 bit device nodes. -// They are, from low to high: the lower 8 bits of the minor, then 12 bits of the major, -// then the top 12 bits of the minor. -func Mkdev(major int64, minor int64) uint32 { - return uint32(unix.Mkdev(uint32(major), uint32(minor))) -} diff --git a/vendor/github.com/docker/docker/pkg/system/mknod_windows.go b/vendor/github.com/docker/docker/pkg/system/mknod_windows.go deleted file mode 100644 index ec89d7a15e..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/mknod_windows.go +++ /dev/null @@ -1,11 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -// Mknod is not implemented on Windows. -func Mknod(path string, mode uint32, dev int) error { - return ErrNotSupportedPlatform -} - -// Mkdev is not implemented on Windows. -func Mkdev(major int64, minor int64) uint32 { - panic("Mkdev not implemented on Windows.") -} diff --git a/vendor/github.com/docker/docker/pkg/system/path.go b/vendor/github.com/docker/docker/pkg/system/path.go deleted file mode 100644 index a3d957afab..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/path.go +++ /dev/null @@ -1,60 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "fmt" - "path/filepath" - "runtime" - "strings" - - "github.com/containerd/continuity/pathdriver" -) - -const defaultUnixPathEnv = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - -// DefaultPathEnv is unix style list of directories to search for -// executables. Each directory is separated from the next by a colon -// ':' character . -func DefaultPathEnv(os string) string { - if runtime.GOOS == "windows" { - if os != runtime.GOOS { - return defaultUnixPathEnv - } - // Deliberately empty on Windows containers on Windows as the default path will be set by - // the container. Docker has no context of what the default path should be. - return "" - } - return defaultUnixPathEnv - -} - -// CheckSystemDriveAndRemoveDriveLetter verifies that a path, if it includes a drive letter, -// is the system drive. -// On Linux: this is a no-op. -// On Windows: this does the following> -// CheckSystemDriveAndRemoveDriveLetter verifies and manipulates a Windows path. -// This is used, for example, when validating a user provided path in docker cp. -// If a drive letter is supplied, it must be the system drive. The drive letter -// is always removed. Also, it translates it to OS semantics (IOW / to \). We -// need the path in this syntax so that it can ultimately be concatenated with -// a Windows long-path which doesn't support drive-letters. Examples: -// C: --> Fail -// C:\ --> \ -// a --> a -// /a --> \a -// d:\ --> Fail -func CheckSystemDriveAndRemoveDriveLetter(path string, driver pathdriver.PathDriver) (string, error) { - if runtime.GOOS != "windows" || LCOWSupported() { - return path, nil - } - - if len(path) == 2 && string(path[1]) == ":" { - return "", fmt.Errorf("No relative path specified in %q", path) - } - if !driver.IsAbs(path) || len(path) < 2 { - return filepath.FromSlash(path), nil - } - if string(path[1]) == ":" && !strings.EqualFold(string(path[0]), "c") { - return "", fmt.Errorf("The specified path is not on the system drive (C:)") - } - return filepath.FromSlash(path[2:]), nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/path_unix.go b/vendor/github.com/docker/docker/pkg/system/path_unix.go deleted file mode 100644 index b0b93196a1..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/path_unix.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build !windows - -package system // import "github.com/docker/docker/pkg/system" - -// GetLongPathName converts Windows short pathnames to full pathnames. -// For example C:\Users\ADMIN~1 --> C:\Users\Administrator. -// It is a no-op on non-Windows platforms -func GetLongPathName(path string) (string, error) { - return path, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/path_windows.go b/vendor/github.com/docker/docker/pkg/system/path_windows.go deleted file mode 100644 index 188f2c2957..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/path_windows.go +++ /dev/null @@ -1,24 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import "syscall" - -// GetLongPathName converts Windows short pathnames to full pathnames. -// For example C:\Users\ADMIN~1 --> C:\Users\Administrator. -// It is a no-op on non-Windows platforms -func GetLongPathName(path string) (string, error) { - // See https://groups.google.com/forum/#!topic/golang-dev/1tufzkruoTg - p := syscall.StringToUTF16(path) - b := p // GetLongPathName says we can reuse buffer - n, err := syscall.GetLongPathName(&p[0], &b[0], uint32(len(b))) - if err != nil { - return "", err - } - if n > uint32(len(b)) { - b = make([]uint16, n) - _, err = syscall.GetLongPathName(&p[0], &b[0], uint32(len(b))) - if err != nil { - return "", err - } - } - return syscall.UTF16ToString(b), nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/process_unix.go b/vendor/github.com/docker/docker/pkg/system/process_unix.go deleted file mode 100644 index 0195a891b2..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/process_unix.go +++ /dev/null @@ -1,24 +0,0 @@ -// +build linux freebsd darwin - -package system // import "github.com/docker/docker/pkg/system" - -import ( - "syscall" - - "golang.org/x/sys/unix" -) - -// IsProcessAlive returns true if process with a given pid is running. -func IsProcessAlive(pid int) bool { - err := unix.Kill(pid, syscall.Signal(0)) - if err == nil || err == unix.EPERM { - return true - } - - return false -} - -// KillProcess force-stops a process. -func KillProcess(pid int) { - unix.Kill(pid, unix.SIGKILL) -} diff --git a/vendor/github.com/docker/docker/pkg/system/process_windows.go b/vendor/github.com/docker/docker/pkg/system/process_windows.go deleted file mode 100644 index 4e70c97b18..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/process_windows.go +++ /dev/null @@ -1,18 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import "os" - -// IsProcessAlive returns true if process with a given pid is running. -func IsProcessAlive(pid int) bool { - _, err := os.FindProcess(pid) - - return err == nil -} - -// KillProcess force-stops a process. -func KillProcess(pid int) { - p, err := os.FindProcess(pid) - if err == nil { - p.Kill() - } -} diff --git a/vendor/github.com/docker/docker/pkg/system/rm.go b/vendor/github.com/docker/docker/pkg/system/rm.go deleted file mode 100644 index b310991800..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/rm.go +++ /dev/null @@ -1,80 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "os" - "syscall" - "time" - - "github.com/docker/docker/pkg/mount" - "github.com/pkg/errors" -) - -// EnsureRemoveAll wraps `os.RemoveAll` to check for specific errors that can -// often be remedied. -// Only use `EnsureRemoveAll` if you really want to make every effort to remove -// a directory. -// -// Because of the way `os.Remove` (and by extension `os.RemoveAll`) works, there -// can be a race between reading directory entries and then actually attempting -// to remove everything in the directory. -// These types of errors do not need to be returned since it's ok for the dir to -// be gone we can just retry the remove operation. -// -// This should not return a `os.ErrNotExist` kind of error under any circumstances -func EnsureRemoveAll(dir string) error { - notExistErr := make(map[string]bool) - - // track retries - exitOnErr := make(map[string]int) - maxRetry := 50 - - // Attempt to unmount anything beneath this dir first - mount.RecursiveUnmount(dir) - - for { - err := os.RemoveAll(dir) - if err == nil { - return nil - } - - pe, ok := err.(*os.PathError) - if !ok { - return err - } - - if os.IsNotExist(err) { - if notExistErr[pe.Path] { - return err - } - notExistErr[pe.Path] = true - - // There is a race where some subdir can be removed but after the parent - // dir entries have been read. - // So the path could be from `os.Remove(subdir)` - // If the reported non-existent path is not the passed in `dir` we - // should just retry, but otherwise return with no error. - if pe.Path == dir { - return nil - } - continue - } - - if pe.Err != syscall.EBUSY { - return err - } - - if mounted, _ := mount.Mounted(pe.Path); mounted { - if e := mount.Unmount(pe.Path); e != nil { - if mounted, _ := mount.Mounted(pe.Path); mounted { - return errors.Wrapf(e, "error while removing %s", dir) - } - } - } - - if exitOnErr[pe.Path] == maxRetry { - return err - } - exitOnErr[pe.Path]++ - time.Sleep(100 * time.Millisecond) - } -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_darwin.go b/vendor/github.com/docker/docker/pkg/system/stat_darwin.go deleted file mode 100644 index c1c0ee9f38..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_darwin.go +++ /dev/null @@ -1,13 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import "syscall" - -// fromStatT converts a syscall.Stat_t type to a system.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: uint32(s.Mode), - uid: s.Uid, - gid: s.Gid, - rdev: uint64(s.Rdev), - mtim: s.Mtimespec}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_freebsd.go b/vendor/github.com/docker/docker/pkg/system/stat_freebsd.go deleted file mode 100644 index c1c0ee9f38..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_freebsd.go +++ /dev/null @@ -1,13 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import "syscall" - -// fromStatT converts a syscall.Stat_t type to a system.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: uint32(s.Mode), - uid: s.Uid, - gid: s.Gid, - rdev: uint64(s.Rdev), - mtim: s.Mtimespec}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_linux.go b/vendor/github.com/docker/docker/pkg/system/stat_linux.go deleted file mode 100644 index 17d5d131a3..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_linux.go +++ /dev/null @@ -1,20 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import "syscall" - -// fromStatT converts a syscall.Stat_t type to a system.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: s.Mode, - uid: s.Uid, - gid: s.Gid, - // the type is 32bit on mips - rdev: uint64(s.Rdev), // nolint: unconvert - mtim: s.Mtim}, nil -} - -// FromStatT converts a syscall.Stat_t type to a system.Stat_t type -// This is exposed on Linux as pkg/archive/changes uses it. -func FromStatT(s *syscall.Stat_t) (*StatT, error) { - return fromStatT(s) -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_openbsd.go b/vendor/github.com/docker/docker/pkg/system/stat_openbsd.go deleted file mode 100644 index 756b92d1e6..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_openbsd.go +++ /dev/null @@ -1,13 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import "syscall" - -// fromStatT converts a syscall.Stat_t type to a system.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: uint32(s.Mode), - uid: s.Uid, - gid: s.Gid, - rdev: uint64(s.Rdev), - mtim: s.Mtim}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_solaris.go b/vendor/github.com/docker/docker/pkg/system/stat_solaris.go deleted file mode 100644 index 756b92d1e6..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_solaris.go +++ /dev/null @@ -1,13 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import "syscall" - -// fromStatT converts a syscall.Stat_t type to a system.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: uint32(s.Mode), - uid: s.Uid, - gid: s.Gid, - rdev: uint64(s.Rdev), - mtim: s.Mtim}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_unix.go b/vendor/github.com/docker/docker/pkg/system/stat_unix.go deleted file mode 100644 index 86bb6dd55e..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_unix.go +++ /dev/null @@ -1,66 +0,0 @@ -// +build !windows - -package system // import "github.com/docker/docker/pkg/system" - -import ( - "os" - "syscall" -) - -// StatT type contains status of a file. It contains metadata -// like permission, owner, group, size, etc about a file. -type StatT struct { - mode uint32 - uid uint32 - gid uint32 - rdev uint64 - size int64 - mtim syscall.Timespec -} - -// Mode returns file's permission mode. -func (s StatT) Mode() uint32 { - return s.mode -} - -// UID returns file's user id of owner. -func (s StatT) UID() uint32 { - return s.uid -} - -// GID returns file's group id of owner. -func (s StatT) GID() uint32 { - return s.gid -} - -// Rdev returns file's device ID (if it's special file). -func (s StatT) Rdev() uint64 { - return s.rdev -} - -// Size returns file's size. -func (s StatT) Size() int64 { - return s.size -} - -// Mtim returns file's last modification time. -func (s StatT) Mtim() syscall.Timespec { - return s.mtim -} - -// IsDir reports whether s describes a directory. -func (s StatT) IsDir() bool { - return s.mode&syscall.S_IFDIR != 0 -} - -// Stat takes a path to a file and returns -// a system.StatT type pertaining to that file. -// -// Throws an error if the file does not exist -func Stat(path string) (*StatT, error) { - s := &syscall.Stat_t{} - if err := syscall.Stat(path, s); err != nil { - return nil, &os.PathError{Op: "Stat", Path: path, Err: err} - } - return fromStatT(s) -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_windows.go b/vendor/github.com/docker/docker/pkg/system/stat_windows.go deleted file mode 100644 index b2456cb887..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_windows.go +++ /dev/null @@ -1,49 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "os" - "time" -) - -// StatT type contains status of a file. It contains metadata -// like permission, size, etc about a file. -type StatT struct { - mode os.FileMode - size int64 - mtim time.Time -} - -// Size returns file's size. -func (s StatT) Size() int64 { - return s.size -} - -// Mode returns file's permission mode. -func (s StatT) Mode() os.FileMode { - return os.FileMode(s.mode) -} - -// Mtim returns file's last modification time. -func (s StatT) Mtim() time.Time { - return time.Time(s.mtim) -} - -// Stat takes a path to a file and returns -// a system.StatT type pertaining to that file. -// -// Throws an error if the file does not exist -func Stat(path string) (*StatT, error) { - fi, err := os.Stat(path) - if err != nil { - return nil, err - } - return fromStatT(&fi) -} - -// fromStatT converts a os.FileInfo type to a system.StatT type -func fromStatT(fi *os.FileInfo) (*StatT, error) { - return &StatT{ - size: (*fi).Size(), - mode: (*fi).Mode(), - mtim: (*fi).ModTime()}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/syscall_unix.go b/vendor/github.com/docker/docker/pkg/system/syscall_unix.go deleted file mode 100644 index 919a412a7b..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/syscall_unix.go +++ /dev/null @@ -1,17 +0,0 @@ -// +build linux freebsd - -package system // import "github.com/docker/docker/pkg/system" - -import "golang.org/x/sys/unix" - -// Unmount is a platform-specific helper function to call -// the unmount syscall. -func Unmount(dest string) error { - return unix.Unmount(dest, 0) -} - -// CommandLineToArgv should not be used on Unix. -// It simply returns commandLine in the only element in the returned array. -func CommandLineToArgv(commandLine string) ([]string, error) { - return []string{commandLine}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/syscall_windows.go b/vendor/github.com/docker/docker/pkg/system/syscall_windows.go deleted file mode 100644 index fd3682b3ee..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/syscall_windows.go +++ /dev/null @@ -1,176 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "fmt" - "syscall" - "unsafe" - - "github.com/sirupsen/logrus" - "golang.org/x/sys/windows" -) - -const ( - OWNER_SECURITY_INFORMATION = 0x00000001 - GROUP_SECURITY_INFORMATION = 0x00000002 - DACL_SECURITY_INFORMATION = 0x00000004 - SACL_SECURITY_INFORMATION = 0x00000008 - LABEL_SECURITY_INFORMATION = 0x00000010 - ATTRIBUTE_SECURITY_INFORMATION = 0x00000020 - SCOPE_SECURITY_INFORMATION = 0x00000040 - PROCESS_TRUST_LABEL_SECURITY_INFORMATION = 0x00000080 - ACCESS_FILTER_SECURITY_INFORMATION = 0x00000100 - BACKUP_SECURITY_INFORMATION = 0x00010000 - PROTECTED_DACL_SECURITY_INFORMATION = 0x80000000 - PROTECTED_SACL_SECURITY_INFORMATION = 0x40000000 - UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000 - UNPROTECTED_SACL_SECURITY_INFORMATION = 0x10000000 -) - -const ( - SE_UNKNOWN_OBJECT_TYPE = iota - SE_FILE_OBJECT - SE_SERVICE - SE_PRINTER - SE_REGISTRY_KEY - SE_LMSHARE - SE_KERNEL_OBJECT - SE_WINDOW_OBJECT - SE_DS_OBJECT - SE_DS_OBJECT_ALL - SE_PROVIDER_DEFINED_OBJECT - SE_WMIGUID_OBJECT - SE_REGISTRY_WOW64_32KEY -) - -const ( - SeTakeOwnershipPrivilege = "SeTakeOwnershipPrivilege" -) - -const ( - ContainerAdministratorSidString = "S-1-5-93-2-1" - ContainerUserSidString = "S-1-5-93-2-2" -) - -var ( - ntuserApiset = windows.NewLazyDLL("ext-ms-win-ntuser-window-l1-1-0") - modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") - procGetVersionExW = modkernel32.NewProc("GetVersionExW") - procSetNamedSecurityInfo = modadvapi32.NewProc("SetNamedSecurityInfoW") - procGetSecurityDescriptorDacl = modadvapi32.NewProc("GetSecurityDescriptorDacl") -) - -// OSVersion is a wrapper for Windows version information -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx -type OSVersion struct { - Version uint32 - MajorVersion uint8 - MinorVersion uint8 - Build uint16 -} - -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724833(v=vs.85).aspx -type osVersionInfoEx struct { - OSVersionInfoSize uint32 - MajorVersion uint32 - MinorVersion uint32 - BuildNumber uint32 - PlatformID uint32 - CSDVersion [128]uint16 - ServicePackMajor uint16 - ServicePackMinor uint16 - SuiteMask uint16 - ProductType byte - Reserve byte -} - -// GetOSVersion gets the operating system version on Windows. Note that -// docker.exe must be manifested to get the correct version information. -func GetOSVersion() OSVersion { - var err error - osv := OSVersion{} - osv.Version, err = windows.GetVersion() - if err != nil { - // GetVersion never fails. - panic(err) - } - osv.MajorVersion = uint8(osv.Version & 0xFF) - osv.MinorVersion = uint8(osv.Version >> 8 & 0xFF) - osv.Build = uint16(osv.Version >> 16) - return osv -} - -func (osv OSVersion) ToString() string { - return fmt.Sprintf("%d.%d.%d", osv.MajorVersion, osv.MinorVersion, osv.Build) -} - -// IsWindowsClient returns true if the SKU is client -// @engine maintainers - this function should not be removed or modified as it -// is used to enforce licensing restrictions on Windows. -func IsWindowsClient() bool { - osviex := &osVersionInfoEx{OSVersionInfoSize: 284} - r1, _, err := procGetVersionExW.Call(uintptr(unsafe.Pointer(osviex))) - if r1 == 0 { - logrus.Warnf("GetVersionExW failed - assuming server SKU: %v", err) - return false - } - const verNTWorkstation = 0x00000001 - return osviex.ProductType == verNTWorkstation -} - -// Unmount is a platform-specific helper function to call -// the unmount syscall. Not supported on Windows -func Unmount(dest string) error { - return nil -} - -// CommandLineToArgv wraps the Windows syscall to turn a commandline into an argument array. -func CommandLineToArgv(commandLine string) ([]string, error) { - var argc int32 - - argsPtr, err := windows.UTF16PtrFromString(commandLine) - if err != nil { - return nil, err - } - - argv, err := windows.CommandLineToArgv(argsPtr, &argc) - if err != nil { - return nil, err - } - defer windows.LocalFree(windows.Handle(uintptr(unsafe.Pointer(argv)))) - - newArgs := make([]string, argc) - for i, v := range (*argv)[:argc] { - newArgs[i] = string(windows.UTF16ToString((*v)[:])) - } - - return newArgs, nil -} - -// HasWin32KSupport determines whether containers that depend on win32k can -// run on this machine. Win32k is the driver used to implement windowing. -func HasWin32KSupport() bool { - // For now, check for ntuser API support on the host. In the future, a host - // may support win32k in containers even if the host does not support ntuser - // APIs. - return ntuserApiset.Load() == nil -} - -func SetNamedSecurityInfo(objectName *uint16, objectType uint32, securityInformation uint32, sidOwner *windows.SID, sidGroup *windows.SID, dacl *byte, sacl *byte) (result error) { - r0, _, _ := syscall.Syscall9(procSetNamedSecurityInfo.Addr(), 7, uintptr(unsafe.Pointer(objectName)), uintptr(objectType), uintptr(securityInformation), uintptr(unsafe.Pointer(sidOwner)), uintptr(unsafe.Pointer(sidGroup)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(sacl)), 0, 0) - if r0 != 0 { - result = syscall.Errno(r0) - } - return -} - -func GetSecurityDescriptorDacl(securityDescriptor *byte, daclPresent *uint32, dacl **byte, daclDefaulted *uint32) (result error) { - r1, _, e1 := syscall.Syscall6(procGetSecurityDescriptorDacl.Addr(), 4, uintptr(unsafe.Pointer(securityDescriptor)), uintptr(unsafe.Pointer(daclPresent)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(daclDefaulted)), 0, 0) - if r1 == 0 { - if e1 != 0 { - result = syscall.Errno(e1) - } else { - result = syscall.EINVAL - } - } - return -} diff --git a/vendor/github.com/docker/docker/pkg/system/umask.go b/vendor/github.com/docker/docker/pkg/system/umask.go deleted file mode 100644 index 9912a2babb..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/umask.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build !windows - -package system // import "github.com/docker/docker/pkg/system" - -import ( - "golang.org/x/sys/unix" -) - -// Umask sets current process's file mode creation mask to newmask -// and returns oldmask. -func Umask(newmask int) (oldmask int, err error) { - return unix.Umask(newmask), nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/umask_windows.go b/vendor/github.com/docker/docker/pkg/system/umask_windows.go deleted file mode 100644 index fc62388c38..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/umask_windows.go +++ /dev/null @@ -1,7 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -// Umask is not supported on the windows platform. -func Umask(newmask int) (oldmask int, err error) { - // should not be called on cli code path - return 0, ErrNotSupportedPlatform -} diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_unix.go b/vendor/github.com/docker/docker/pkg/system/utimes_unix.go deleted file mode 100644 index 61ba8c474c..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/utimes_unix.go +++ /dev/null @@ -1,24 +0,0 @@ -// +build linux freebsd - -package system // import "github.com/docker/docker/pkg/system" - -import ( - "syscall" - - "golang.org/x/sys/unix" -) - -// LUtimesNano is used to change access and modification time of the specified path. -// It's used for symbol link file because unix.UtimesNano doesn't support a NOFOLLOW flag atm. -func LUtimesNano(path string, ts []syscall.Timespec) error { - uts := []unix.Timespec{ - unix.NsecToTimespec(syscall.TimespecToNsec(ts[0])), - unix.NsecToTimespec(syscall.TimespecToNsec(ts[1])), - } - err := unix.UtimesNanoAt(unix.AT_FDCWD, path, uts, unix.AT_SYMLINK_NOFOLLOW) - if err != nil && err != unix.ENOSYS { - return err - } - - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go b/vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go deleted file mode 100644 index 095e072e1d..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build !linux,!freebsd - -package system // import "github.com/docker/docker/pkg/system" - -import "syscall" - -// LUtimesNano is only supported on linux and freebsd. -func LUtimesNano(path string, ts []syscall.Timespec) error { - return ErrNotSupportedPlatform -} diff --git a/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go b/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go deleted file mode 100644 index 66d4895b27..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go +++ /dev/null @@ -1,29 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import "golang.org/x/sys/unix" - -// Lgetxattr retrieves the value of the extended attribute identified by attr -// and associated with the given path in the file system. -// It will returns a nil slice and nil error if the xattr is not set. -func Lgetxattr(path string, attr string) ([]byte, error) { - dest := make([]byte, 128) - sz, errno := unix.Lgetxattr(path, attr, dest) - if errno == unix.ENODATA { - return nil, nil - } - if errno == unix.ERANGE { - dest = make([]byte, sz) - sz, errno = unix.Lgetxattr(path, attr, dest) - } - if errno != nil { - return nil, errno - } - - return dest[:sz], nil -} - -// Lsetxattr sets the value of the extended attribute identified by attr -// and associated with the given path in the file system. -func Lsetxattr(path string, attr string, data []byte, flags int) error { - return unix.Lsetxattr(path, attr, data, flags) -} diff --git a/vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go b/vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go deleted file mode 100644 index d780a90cd3..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build !linux - -package system // import "github.com/docker/docker/pkg/system" - -// Lgetxattr is not supported on platforms other than linux. -func Lgetxattr(path string, attr string) ([]byte, error) { - return nil, ErrNotSupportedPlatform -} - -// Lsetxattr is not supported on platforms other than linux. -func Lsetxattr(path string, attr string, data []byte, flags int) error { - return ErrNotSupportedPlatform -} diff --git a/vendor/github.com/docker/docker/pkg/term/term_windows.go b/vendor/github.com/docker/docker/pkg/term/term_windows.go index a3c3db1315..6e83b59e90 100644 --- a/vendor/github.com/docker/docker/pkg/term/term_windows.go +++ b/vendor/github.com/docker/docker/pkg/term/term_windows.go @@ -7,7 +7,7 @@ import ( "syscall" // used for STD_INPUT_HANDLE, STD_OUTPUT_HANDLE and STD_ERROR_HANDLE "github.com/Azure/go-ansiterm/winterm" - "github.com/docker/docker/pkg/term/windows" + windowsconsole "github.com/docker/docker/pkg/term/windows" ) // State holds the console mode for the terminal. diff --git a/vendor/github.com/docker/docker/pkg/term/windows/windows.go b/vendor/github.com/docker/docker/pkg/term/windows/windows.go index 3e5593ca6a..7e8f265d47 100644 --- a/vendor/github.com/docker/docker/pkg/term/windows/windows.go +++ b/vendor/github.com/docker/docker/pkg/term/windows/windows.go @@ -1,3 +1,4 @@ +// +build windows // These files implement ANSI-aware input and output streams for use by the Docker Windows client. // When asked for the set of standard streams (e.g., stdin, stdout, stderr), the code will create // and return pseudo-streams that convert ANSI sequences to / from Windows Console API calls. @@ -9,7 +10,7 @@ import ( "os" "sync" - "github.com/Azure/go-ansiterm" + ansiterm "github.com/Azure/go-ansiterm" "github.com/sirupsen/logrus" ) diff --git a/vendor/github.com/docker/docker/registry/auth.go b/vendor/github.com/docker/docker/registry/auth.go index 3f58fc6cff..bae093ec97 100644 --- a/vendor/github.com/docker/docker/registry/auth.go +++ b/vendor/github.com/docker/docker/registry/auth.go @@ -33,7 +33,7 @@ func loginV1(authConfig *types.AuthConfig, apiEndpoint APIEndpoint, userAgent st return "", "", errdefs.System(errors.New("server Error: Server Address not set")) } - req, err := http.NewRequest("GET", serverAddress+"users/", nil) + req, err := http.NewRequest(http.MethodGet, serverAddress+"users/", nil) if err != nil { return "", "", err } @@ -140,7 +140,7 @@ func loginV2(authConfig *types.AuthConfig, endpoint APIEndpoint, userAgent strin } endpointStr := strings.TrimRight(endpoint.URL.String(), "/") + "/v2/" - req, err := http.NewRequest("GET", endpointStr, nil) + req, err := http.NewRequest(http.MethodGet, endpointStr, nil) if err != nil { if !foundV2 { err = fallbackError{err: err} @@ -262,7 +262,7 @@ func PingV2Registry(endpoint *url.URL, transport http.RoundTripper) (challenge.M Timeout: 15 * time.Second, } endpointStr := strings.TrimRight(endpoint.String(), "/") + "/v2/" - req, err := http.NewRequest("GET", endpointStr, nil) + req, err := http.NewRequest(http.MethodGet, endpointStr, nil) if err != nil { return nil, false, err } diff --git a/vendor/github.com/docker/docker/registry/endpoint_v1.go b/vendor/github.com/docker/docker/registry/endpoint_v1.go index 832fdb95a4..db342d1412 100644 --- a/vendor/github.com/docker/docker/registry/endpoint_v1.go +++ b/vendor/github.com/docker/docker/registry/endpoint_v1.go @@ -124,9 +124,6 @@ func newV1EndpointFromStr(address string, tlsConfig *tls.Config, userAgent strin } endpoint := newV1Endpoint(*uri, tlsConfig, userAgent, metaHeaders) - if err != nil { - return nil, err - } return endpoint, nil } @@ -152,7 +149,7 @@ func (e *V1Endpoint) Ping() (PingResult, error) { return PingResult{Standalone: false}, nil } - req, err := http.NewRequest("GET", e.Path("_ping"), nil) + req, err := http.NewRequest(http.MethodGet, e.Path("_ping"), nil) if err != nil { return PingResult{Standalone: false}, err } diff --git a/vendor/github.com/docker/docker/registry/registry.go b/vendor/github.com/docker/docker/registry/registry.go index 6727b7dc32..7c24e4a9b1 100644 --- a/vendor/github.com/docker/docker/registry/registry.go +++ b/vendor/github.com/docker/docker/registry/registry.go @@ -14,7 +14,8 @@ import ( "time" "github.com/docker/distribution/registry/client/transport" - "github.com/docker/go-connections/sockets" + "github.com/docker/docker/pkg/homedir" + "github.com/docker/docker/rootless" "github.com/docker/go-connections/tlsconfig" "github.com/sirupsen/logrus" ) @@ -32,7 +33,19 @@ func newTLSConfig(hostname string, isSecure bool) (*tls.Config, error) { tlsConfig.InsecureSkipVerify = !isSecure if isSecure && CertsDir != "" { - hostDir := filepath.Join(CertsDir, cleanPath(hostname)) + certsDir := CertsDir + + if rootless.RunningWithRootlessKit() { + configHome, err := homedir.GetConfigHome() + if err != nil { + return nil, err + } + + certsDir = filepath.Join(configHome, "docker/certs.d") + } + + hostDir := filepath.Join(certsDir, cleanPath(hostname)) + logrus.Debugf("hostDir: %s", hostDir) if err := ReadCertsDirectory(tlsConfig, hostDir); err != nil { return nil, err @@ -56,7 +69,7 @@ func hasFile(files []os.FileInfo, name string) bool { // provided TLS configuration. func ReadCertsDirectory(tlsConfig *tls.Config, directory string) error { fs, err := ioutil.ReadDir(directory) - if err != nil && !os.IsNotExist(err) { + if err != nil && !os.IsNotExist(err) && !os.IsPermission(err) { return err } @@ -176,16 +189,12 @@ func NewTransport(tlsConfig *tls.Config) *http.Transport { base := &http.Transport{ Proxy: http.ProxyFromEnvironment, - Dial: direct.Dial, + DialContext: direct.DialContext, TLSHandshakeTimeout: 10 * time.Second, TLSClientConfig: tlsConfig, // TODO(dmcgowan): Call close idle connections when complete and use keep alive DisableKeepAlives: true, } - proxyDialer, err := sockets.DialerFromEnvironment(direct) - if err == nil { - base.Dial = proxyDialer.Dial - } return base } diff --git a/vendor/github.com/docker/docker/registry/resumable/resumablerequestreader.go b/vendor/github.com/docker/docker/registry/resumable/resumablerequestreader.go index 8e97a1a4d1..3649f36ede 100644 --- a/vendor/github.com/docker/docker/registry/resumable/resumablerequestreader.go +++ b/vendor/github.com/docker/docker/registry/resumable/resumablerequestreader.go @@ -56,10 +56,10 @@ func (r *requestReader) Read(p []byte) (n int, err error) { r.cleanUpResponse() return 0, err } - if r.currentResponse.StatusCode == 416 && r.lastRange == r.totalSize && r.currentResponse.ContentLength == 0 { + if r.currentResponse.StatusCode == http.StatusRequestedRangeNotSatisfiable && r.lastRange == r.totalSize && r.currentResponse.ContentLength == 0 { r.cleanUpResponse() return 0, io.EOF - } else if r.currentResponse.StatusCode != 206 && r.lastRange != 0 && isFreshRequest { + } else if r.currentResponse.StatusCode != http.StatusPartialContent && r.lastRange != 0 && isFreshRequest { r.cleanUpResponse() return 0, fmt.Errorf("the server doesn't support byte ranges") } diff --git a/vendor/github.com/docker/docker/registry/session.go b/vendor/github.com/docker/docker/registry/session.go index ef14299594..14825c5f9a 100644 --- a/vendor/github.com/docker/docker/registry/session.go +++ b/vendor/github.com/docker/docker/registry/session.go @@ -3,6 +3,7 @@ package registry // import "github.com/docker/docker/registry" import ( "bytes" "crypto/sha256" + // this is required for some certificates _ "crypto/sha512" "encoding/hex" @@ -132,7 +133,9 @@ func (tr *authTransport) RoundTrip(orig *http.Request) (*http.Response, error) { } resp, err := tr.RoundTripper.RoundTrip(req) if err != nil { + tr.mu.Lock() delete(tr.modReq, orig) + tr.mu.Unlock() return nil, err } if len(resp.Header["X-Docker-Token"]) > 0 { @@ -224,8 +227,8 @@ func (r *Session) GetRemoteHistory(imgID, registry string) ([]string, error) { return nil, err } defer res.Body.Close() - if res.StatusCode != 200 { - if res.StatusCode == 401 { + if res.StatusCode != http.StatusOK { + if res.StatusCode == http.StatusUnauthorized { return nil, errcode.ErrorCodeUnauthorized.WithArgs() } return nil, newJSONError(fmt.Sprintf("Server error: %d trying to fetch remote history for %s", res.StatusCode, imgID), res) @@ -247,7 +250,7 @@ func (r *Session) LookupRemoteImage(imgID, registry string) error { return err } res.Body.Close() - if res.StatusCode != 200 { + if res.StatusCode != http.StatusOK { return newJSONError(fmt.Sprintf("HTTP code %d", res.StatusCode), res) } return nil @@ -260,7 +263,7 @@ func (r *Session) GetRemoteImageJSON(imgID, registry string) ([]byte, int64, err return nil, -1, fmt.Errorf("Failed to download json: %s", err) } defer res.Body.Close() - if res.StatusCode != 200 { + if res.StatusCode != http.StatusOK { return nil, -1, newJSONError(fmt.Sprintf("HTTP code %d", res.StatusCode), res) } // if the size header is not present, then set it to '-1' @@ -288,7 +291,7 @@ func (r *Session) GetRemoteImageLayer(imgID, registry string, imgSize int64) (io imageURL = fmt.Sprintf("%simages/%s/layer", registry, imgID) ) - req, err := http.NewRequest("GET", imageURL, nil) + req, err := http.NewRequest(http.MethodGet, imageURL, nil) if err != nil { return nil, fmt.Errorf("Error while getting from the server: %v", err) } @@ -307,7 +310,7 @@ func (r *Session) GetRemoteImageLayer(imgID, registry string, imgSize int64) (io statusCode, imgID) } - if res.StatusCode != 200 { + if res.StatusCode != http.StatusOK { res.Body.Close() return nil, fmt.Errorf("Server error: Status %d while fetching image layer (%s)", res.StatusCode, imgID) @@ -346,7 +349,7 @@ func (r *Session) GetRemoteTag(registries []string, repositoryRef reference.Name if res.StatusCode == 404 { return "", ErrRepoNotFound } - if res.StatusCode != 200 { + if res.StatusCode != http.StatusOK { continue } @@ -384,7 +387,7 @@ func (r *Session) GetRemoteTags(registries []string, repositoryRef reference.Nam if res.StatusCode == 404 { return nil, ErrRepoNotFound } - if res.StatusCode != 200 { + if res.StatusCode != http.StatusOK { continue } @@ -422,7 +425,7 @@ func (r *Session) GetRepositoryData(name reference.Named) (*RepositoryData, erro logrus.Debugf("[registry] Calling GET %s", repositoryTarget) - req, err := http.NewRequest("GET", repositoryTarget, nil) + req, err := http.NewRequest(http.MethodGet, repositoryTarget, nil) if err != nil { return nil, err } @@ -440,14 +443,14 @@ func (r *Session) GetRepositoryData(name reference.Named) (*RepositoryData, erro return nil, fmt.Errorf("Error while pulling image: %v", err) } defer res.Body.Close() - if res.StatusCode == 401 { + if res.StatusCode == http.StatusUnauthorized { return nil, errcode.ErrorCodeUnauthorized.WithArgs() } // TODO: Right now we're ignoring checksums in the response body. // In the future, we need to use them to check image validity. if res.StatusCode == 404 { return nil, newJSONError(fmt.Sprintf("HTTP code: %d", res.StatusCode), res) - } else if res.StatusCode != 200 { + } else if res.StatusCode != http.StatusOK { errBody, err := ioutil.ReadAll(res.Body) if err != nil { logrus.Debugf("Error reading response body: %s", err) @@ -489,7 +492,7 @@ func (r *Session) PushImageChecksumRegistry(imgData *ImgData, registry string) e logrus.Debugf("[registry] Calling PUT %s", u) - req, err := http.NewRequest("PUT", u, nil) + req, err := http.NewRequest(http.MethodPut, u, nil) if err != nil { return err } @@ -504,7 +507,7 @@ func (r *Session) PushImageChecksumRegistry(imgData *ImgData, registry string) e if len(res.Cookies()) > 0 { r.client.Jar.SetCookies(req.URL, res.Cookies()) } - if res.StatusCode != 200 { + if res.StatusCode != http.StatusOK { errBody, err := ioutil.ReadAll(res.Body) if err != nil { return fmt.Errorf("HTTP code %d while uploading metadata and error when trying to parse response body: %s", res.StatusCode, err) @@ -527,7 +530,7 @@ func (r *Session) PushImageJSONRegistry(imgData *ImgData, jsonRaw []byte, regist logrus.Debugf("[registry] Calling PUT %s", u) - req, err := http.NewRequest("PUT", u, bytes.NewReader(jsonRaw)) + req, err := http.NewRequest(http.MethodPut, u, bytes.NewReader(jsonRaw)) if err != nil { return err } @@ -538,10 +541,10 @@ func (r *Session) PushImageJSONRegistry(imgData *ImgData, jsonRaw []byte, regist return fmt.Errorf("Failed to upload metadata: %s", err) } defer res.Body.Close() - if res.StatusCode == 401 && strings.HasPrefix(registry, "http://") { + if res.StatusCode == http.StatusUnauthorized && strings.HasPrefix(registry, "http://") { return newJSONError("HTTP code 401, Docker will not send auth headers over HTTP.", res) } - if res.StatusCode != 200 { + if res.StatusCode != http.StatusOK { errBody, err := ioutil.ReadAll(res.Body) if err != nil { return newJSONError(fmt.Sprintf("HTTP code %d while uploading metadata and error when trying to parse response body: %s", res.StatusCode, err), res) @@ -572,7 +575,7 @@ func (r *Session) PushImageLayerRegistry(imgID string, layer io.Reader, registry h.Write([]byte{'\n'}) checksumLayer := io.TeeReader(tarsumLayer, h) - req, err := http.NewRequest("PUT", u, checksumLayer) + req, err := http.NewRequest(http.MethodPut, u, checksumLayer) if err != nil { return "", "", err } @@ -590,7 +593,7 @@ func (r *Session) PushImageLayerRegistry(imgID string, layer io.Reader, registry } defer res.Body.Close() - if res.StatusCode != 200 { + if res.StatusCode != http.StatusOK { errBody, err := ioutil.ReadAll(res.Body) if err != nil { return "", "", newJSONError(fmt.Sprintf("HTTP code %d while uploading metadata and error when trying to parse response body: %s", res.StatusCode, err), res) @@ -609,7 +612,7 @@ func (r *Session) PushRegistryTag(remote reference.Named, revision, tag, registr revision = "\"" + revision + "\"" path := fmt.Sprintf("repositories/%s/tags/%s", reference.Path(remote), tag) - req, err := http.NewRequest("PUT", registry+path, strings.NewReader(revision)) + req, err := http.NewRequest(http.MethodPut, registry+path, strings.NewReader(revision)) if err != nil { return err } @@ -620,7 +623,7 @@ func (r *Session) PushRegistryTag(remote reference.Named, revision, tag, registr return err } res.Body.Close() - if res.StatusCode != 200 && res.StatusCode != 201 { + if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusCreated { return newJSONError(fmt.Sprintf("Internal server error: %d trying to push tag %s on %s", res.StatusCode, tag, reference.Path(remote)), res) } return nil @@ -674,13 +677,13 @@ func (r *Session) PushImageJSONIndex(remote reference.Named, imgList []*ImgData, } defer res.Body.Close() - if res.StatusCode == 401 { + if res.StatusCode == http.StatusUnauthorized { return nil, errcode.ErrorCodeUnauthorized.WithArgs() } var tokens, endpoints []string if !validate { - if res.StatusCode != 200 && res.StatusCode != 201 { + if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusCreated { errBody, err := ioutil.ReadAll(res.Body) if err != nil { logrus.Debugf("Error reading response body: %s", err) @@ -698,7 +701,7 @@ func (r *Session) PushImageJSONIndex(remote reference.Named, imgList []*ImgData, return nil, err } } else { - if res.StatusCode != 204 { + if res.StatusCode != http.StatusNoContent { errBody, err := ioutil.ReadAll(res.Body) if err != nil { logrus.Debugf("Error reading response body: %s", err) @@ -713,7 +716,7 @@ func (r *Session) PushImageJSONIndex(remote reference.Named, imgList []*ImgData, } func (r *Session) putImageRequest(u string, headers map[string][]string, body []byte) (*http.Response, error) { - req, err := http.NewRequest("PUT", u, bytes.NewReader(body)) + req, err := http.NewRequest(http.MethodPut, u, bytes.NewReader(body)) if err != nil { return nil, err } @@ -740,7 +743,7 @@ func (r *Session) SearchRepositories(term string, limit int) (*registrytypes.Sea logrus.Debugf("Index server: %s", r.indexEndpoint) u := r.indexEndpoint.String() + "search?q=" + url.QueryEscape(term) + "&n=" + url.QueryEscape(fmt.Sprintf("%d", limit)) - req, err := http.NewRequest("GET", u, nil) + req, err := http.NewRequest(http.MethodGet, u, nil) if err != nil { return nil, errors.Wrap(errdefs.InvalidParameter(err), "Error building request") } @@ -751,7 +754,7 @@ func (r *Session) SearchRepositories(term string, limit int) (*registrytypes.Sea return nil, errdefs.System(err) } defer res.Body.Close() - if res.StatusCode != 200 { + if res.StatusCode != http.StatusOK { return nil, newJSONError(fmt.Sprintf("Unexpected status code %d", res.StatusCode), res) } result := new(registrytypes.SearchResults) diff --git a/vendor/github.com/docker/docker/rootless/rootless.go b/vendor/github.com/docker/docker/rootless/rootless.go new file mode 100644 index 0000000000..376d5263de --- /dev/null +++ b/vendor/github.com/docker/docker/rootless/rootless.go @@ -0,0 +1,25 @@ +package rootless // import "github.com/docker/docker/rootless" + +import ( + "os" + "sync" +) + +const ( + // RootlessKitDockerProxyBinary is the binary name of rootlesskit-docker-proxy + RootlessKitDockerProxyBinary = "rootlesskit-docker-proxy" +) + +var ( + runningWithRootlessKit bool + runningWithRootlessKitOnce sync.Once +) + +// RunningWithRootlessKit returns true if running under RootlessKit namespaces. +func RunningWithRootlessKit() bool { + runningWithRootlessKitOnce.Do(func() { + u := os.Getenv("ROOTLESSKIT_STATE_DIR") + runningWithRootlessKit = u != "" + }) + return runningWithRootlessKit +} diff --git a/vendor/github.com/docker/go-connections/sockets/README.md b/vendor/github.com/docker/go-connections/sockets/README.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/github.com/docker/go-connections/sockets/inmem_socket.go b/vendor/github.com/docker/go-connections/sockets/inmem_socket.go deleted file mode 100644 index 99846ffddb..0000000000 --- a/vendor/github.com/docker/go-connections/sockets/inmem_socket.go +++ /dev/null @@ -1,81 +0,0 @@ -package sockets - -import ( - "errors" - "net" - "sync" -) - -var errClosed = errors.New("use of closed network connection") - -// InmemSocket implements net.Listener using in-memory only connections. -type InmemSocket struct { - chConn chan net.Conn - chClose chan struct{} - addr string - mu sync.Mutex -} - -// dummyAddr is used to satisfy net.Addr for the in-mem socket -// it is just stored as a string and returns the string for all calls -type dummyAddr string - -// NewInmemSocket creates an in-memory only net.Listener -// The addr argument can be any string, but is used to satisfy the `Addr()` part -// of the net.Listener interface -func NewInmemSocket(addr string, bufSize int) *InmemSocket { - return &InmemSocket{ - chConn: make(chan net.Conn, bufSize), - chClose: make(chan struct{}), - addr: addr, - } -} - -// Addr returns the socket's addr string to satisfy net.Listener -func (s *InmemSocket) Addr() net.Addr { - return dummyAddr(s.addr) -} - -// Accept implements the Accept method in the Listener interface; it waits for the next call and returns a generic Conn. -func (s *InmemSocket) Accept() (net.Conn, error) { - select { - case conn := <-s.chConn: - return conn, nil - case <-s.chClose: - return nil, errClosed - } -} - -// Close closes the listener. It will be unavailable for use once closed. -func (s *InmemSocket) Close() error { - s.mu.Lock() - defer s.mu.Unlock() - select { - case <-s.chClose: - default: - close(s.chClose) - } - return nil -} - -// Dial is used to establish a connection with the in-mem server -func (s *InmemSocket) Dial(network, addr string) (net.Conn, error) { - srvConn, clientConn := net.Pipe() - select { - case s.chConn <- srvConn: - case <-s.chClose: - return nil, errClosed - } - - return clientConn, nil -} - -// Network returns the addr string, satisfies net.Addr -func (a dummyAddr) Network() string { - return string(a) -} - -// String returns the string form -func (a dummyAddr) String() string { - return string(a) -} diff --git a/vendor/github.com/docker/go-connections/sockets/proxy.go b/vendor/github.com/docker/go-connections/sockets/proxy.go deleted file mode 100644 index 98e9a1dc61..0000000000 --- a/vendor/github.com/docker/go-connections/sockets/proxy.go +++ /dev/null @@ -1,51 +0,0 @@ -package sockets - -import ( - "net" - "net/url" - "os" - "strings" - - "golang.org/x/net/proxy" -) - -// GetProxyEnv allows access to the uppercase and the lowercase forms of -// proxy-related variables. See the Go specification for details on these -// variables. https://golang.org/pkg/net/http/ -func GetProxyEnv(key string) string { - proxyValue := os.Getenv(strings.ToUpper(key)) - if proxyValue == "" { - return os.Getenv(strings.ToLower(key)) - } - return proxyValue -} - -// DialerFromEnvironment takes in a "direct" *net.Dialer and returns a -// proxy.Dialer which will route the connections through the proxy using the -// given dialer. -func DialerFromEnvironment(direct *net.Dialer) (proxy.Dialer, error) { - allProxy := GetProxyEnv("all_proxy") - if len(allProxy) == 0 { - return direct, nil - } - - proxyURL, err := url.Parse(allProxy) - if err != nil { - return direct, err - } - - proxyFromURL, err := proxy.FromURL(proxyURL, direct) - if err != nil { - return direct, err - } - - noProxy := GetProxyEnv("no_proxy") - if len(noProxy) == 0 { - return proxyFromURL, nil - } - - perHost := proxy.NewPerHost(proxyFromURL, direct) - perHost.AddFromString(noProxy) - - return perHost, nil -} diff --git a/vendor/github.com/docker/go-connections/sockets/sockets.go b/vendor/github.com/docker/go-connections/sockets/sockets.go deleted file mode 100644 index a1d7beb4d8..0000000000 --- a/vendor/github.com/docker/go-connections/sockets/sockets.go +++ /dev/null @@ -1,38 +0,0 @@ -// Package sockets provides helper functions to create and configure Unix or TCP sockets. -package sockets - -import ( - "errors" - "net" - "net/http" - "time" -) - -// Why 32? See https://github.com/docker/docker/pull/8035. -const defaultTimeout = 32 * time.Second - -// ErrProtocolNotAvailable is returned when a given transport protocol is not provided by the operating system. -var ErrProtocolNotAvailable = errors.New("protocol not available") - -// ConfigureTransport configures the specified Transport according to the -// specified proto and addr. -// If the proto is unix (using a unix socket to communicate) or npipe the -// compression is disabled. -func ConfigureTransport(tr *http.Transport, proto, addr string) error { - switch proto { - case "unix": - return configureUnixTransport(tr, proto, addr) - case "npipe": - return configureNpipeTransport(tr, proto, addr) - default: - tr.Proxy = http.ProxyFromEnvironment - dialer, err := DialerFromEnvironment(&net.Dialer{ - Timeout: defaultTimeout, - }) - if err != nil { - return err - } - tr.Dial = dialer.Dial - } - return nil -} diff --git a/vendor/github.com/docker/go-connections/sockets/sockets_unix.go b/vendor/github.com/docker/go-connections/sockets/sockets_unix.go deleted file mode 100644 index 386cf0dbbd..0000000000 --- a/vendor/github.com/docker/go-connections/sockets/sockets_unix.go +++ /dev/null @@ -1,35 +0,0 @@ -// +build !windows - -package sockets - -import ( - "fmt" - "net" - "net/http" - "syscall" - "time" -) - -const maxUnixSocketPathSize = len(syscall.RawSockaddrUnix{}.Path) - -func configureUnixTransport(tr *http.Transport, proto, addr string) error { - if len(addr) > maxUnixSocketPathSize { - return fmt.Errorf("Unix socket path %q is too long", addr) - } - // No need for compression in local communications. - tr.DisableCompression = true - tr.Dial = func(_, _ string) (net.Conn, error) { - return net.DialTimeout(proto, addr, defaultTimeout) - } - return nil -} - -func configureNpipeTransport(tr *http.Transport, proto, addr string) error { - return ErrProtocolNotAvailable -} - -// DialPipe connects to a Windows named pipe. -// This is not supported on other OSes. -func DialPipe(_ string, _ time.Duration) (net.Conn, error) { - return nil, syscall.EAFNOSUPPORT -} diff --git a/vendor/github.com/docker/go-connections/sockets/sockets_windows.go b/vendor/github.com/docker/go-connections/sockets/sockets_windows.go deleted file mode 100644 index 5c21644e1f..0000000000 --- a/vendor/github.com/docker/go-connections/sockets/sockets_windows.go +++ /dev/null @@ -1,27 +0,0 @@ -package sockets - -import ( - "net" - "net/http" - "time" - - "github.com/Microsoft/go-winio" -) - -func configureUnixTransport(tr *http.Transport, proto, addr string) error { - return ErrProtocolNotAvailable -} - -func configureNpipeTransport(tr *http.Transport, proto, addr string) error { - // No need for compression in local communications. - tr.DisableCompression = true - tr.Dial = func(_, _ string) (net.Conn, error) { - return DialPipe(addr, defaultTimeout) - } - return nil -} - -// DialPipe connects to a Windows named pipe. -func DialPipe(addr string, timeout time.Duration) (net.Conn, error) { - return winio.DialPipe(addr, &timeout) -} diff --git a/vendor/github.com/docker/go-connections/sockets/tcp_socket.go b/vendor/github.com/docker/go-connections/sockets/tcp_socket.go deleted file mode 100644 index 53cbb6c79e..0000000000 --- a/vendor/github.com/docker/go-connections/sockets/tcp_socket.go +++ /dev/null @@ -1,22 +0,0 @@ -// Package sockets provides helper functions to create and configure Unix or TCP sockets. -package sockets - -import ( - "crypto/tls" - "net" -) - -// NewTCPSocket creates a TCP socket listener with the specified address and -// the specified tls configuration. If TLSConfig is set, will encapsulate the -// TCP listener inside a TLS one. -func NewTCPSocket(addr string, tlsConfig *tls.Config) (net.Listener, error) { - l, err := net.Listen("tcp", addr) - if err != nil { - return nil, err - } - if tlsConfig != nil { - tlsConfig.NextProtos = []string{"http/1.1"} - l = tls.NewListener(l, tlsConfig) - } - return l, nil -} diff --git a/vendor/github.com/docker/go-connections/sockets/unix_socket.go b/vendor/github.com/docker/go-connections/sockets/unix_socket.go deleted file mode 100644 index a8b5dbb6fd..0000000000 --- a/vendor/github.com/docker/go-connections/sockets/unix_socket.go +++ /dev/null @@ -1,32 +0,0 @@ -// +build !windows - -package sockets - -import ( - "net" - "os" - "syscall" -) - -// NewUnixSocket creates a unix socket with the specified path and group. -func NewUnixSocket(path string, gid int) (net.Listener, error) { - if err := syscall.Unlink(path); err != nil && !os.IsNotExist(err) { - return nil, err - } - mask := syscall.Umask(0777) - defer syscall.Umask(mask) - - l, err := net.Listen("unix", path) - if err != nil { - return nil, err - } - if err := os.Chown(path, 0, gid); err != nil { - l.Close() - return nil, err - } - if err := os.Chmod(path, 0660); err != nil { - l.Close() - return nil, err - } - return l, nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/.gitignore b/vendor/github.com/form3tech-oss/jwt-go/.gitignore similarity index 69% rename from vendor/github.com/dgrijalva/jwt-go/.gitignore rename to vendor/github.com/form3tech-oss/jwt-go/.gitignore index 80bed650ec..c0e81a8d92 100644 --- a/vendor/github.com/dgrijalva/jwt-go/.gitignore +++ b/vendor/github.com/form3tech-oss/jwt-go/.gitignore @@ -1,4 +1,5 @@ .DS_Store bin +.idea/ diff --git a/vendor/github.com/dgrijalva/jwt-go/.travis.yml b/vendor/github.com/form3tech-oss/jwt-go/.travis.yml similarity index 65% rename from vendor/github.com/dgrijalva/jwt-go/.travis.yml rename to vendor/github.com/form3tech-oss/jwt-go/.travis.yml index 1027f56cd9..3c7fb7e1ae 100644 --- a/vendor/github.com/dgrijalva/jwt-go/.travis.yml +++ b/vendor/github.com/form3tech-oss/jwt-go/.travis.yml @@ -5,9 +5,8 @@ script: - go test -v ./... go: - - 1.3 - - 1.4 - - 1.5 - - 1.6 - - 1.7 + - 1.12 + - 1.13 + - 1.14 + - 1.15 - tip diff --git a/vendor/github.com/dgrijalva/jwt-go/LICENSE b/vendor/github.com/form3tech-oss/jwt-go/LICENSE similarity index 100% rename from vendor/github.com/dgrijalva/jwt-go/LICENSE rename to vendor/github.com/form3tech-oss/jwt-go/LICENSE diff --git a/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md b/vendor/github.com/form3tech-oss/jwt-go/MIGRATION_GUIDE.md similarity index 100% rename from vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md rename to vendor/github.com/form3tech-oss/jwt-go/MIGRATION_GUIDE.md diff --git a/vendor/github.com/dgrijalva/jwt-go/README.md b/vendor/github.com/form3tech-oss/jwt-go/README.md similarity index 89% rename from vendor/github.com/dgrijalva/jwt-go/README.md rename to vendor/github.com/form3tech-oss/jwt-go/README.md index d358d881b8..d7749077fd 100644 --- a/vendor/github.com/dgrijalva/jwt-go/README.md +++ b/vendor/github.com/form3tech-oss/jwt-go/README.md @@ -9,7 +9,7 @@ A [go](http://www.golang.org) (or 'golang' for search engine friendliness) imple **SECURITY NOTICE:** Some older versions of Go have a security issue in the cryotp/elliptic. Recommendation is to upgrade to at least 1.8.3. See issue #216 for more detail. -**SECURITY NOTICE:** It's important that you [validate the `alg` presented is what you expect](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/). This library attempts to make it easy to do the right thing by requiring key types match the expected alg, but you should take the extra step to verify it in your usage. See the examples provided. +**SECURITY NOTICE:** It's important that you [validate the `alg` presented is what you expect](https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/). This library attempts to make it easy to do the right thing by requiring key types match the expected alg, but you should take the extra step to verify it in your usage. See the examples provided. ## What the heck is a JWT? @@ -19,7 +19,7 @@ In short, it's a signed JSON object that does something useful (for example, aut The first part is called the header. It contains the necessary information for verifying the last part, the signature. For example, which encryption method was used for signing and what key was used. -The part in the middle is the interesting bit. It's called the Claims and contains the actual stuff you care about. Refer to [the RFC](http://self-issued.info/docs/draft-jones-json-web-token.html) for information about reserved keys and the proper way to add your own. +The part in the middle is the interesting bit. It's called the Claims and contains the actual stuff you care about. Refer to [the RFC](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html) for information about reserved keys and the proper way to add your own. ## What's in the box? @@ -37,7 +37,7 @@ See [the project documentation](https://godoc.org/github.com/dgrijalva/jwt-go) f This library publishes all the necessary components for adding your own signing methods. Simply implement the `SigningMethod` interface and register a factory method using `RegisterSigningMethod`. -Here's an example of an extension that integrates with the Google App Engine signing tools: https://github.com/someone1/gcp-jwt-go +Here's an example of an extension that integrates with multiple Google Cloud Platform signing tools (AppEngine, IAM API, Cloud KMS): https://github.com/someone1/gcp-jwt-go ## Compliance @@ -93,6 +93,10 @@ Without going too far down the rabbit hole, here's a description of the interact * OAuth defines several options for passing around authentication data. One popular method is called a "bearer token". A bearer token is simply a string that _should_ only be held by an authenticated user. Thus, simply presenting this token proves your identity. You can probably derive from here why a JWT might make a good bearer token. * Because bearer tokens are used for authentication, it's important they're kept secret. This is why transactions that use bearer tokens typically happen over SSL. +### Troubleshooting + +This library uses descriptive error messages whenever possible. If you are not getting the expected result, have a look at the errors. The most common place people get stuck is providing the correct type of key to the parser. See the above section on signing methods and key types. + ## More Documentation can be found [on godoc.org](http://godoc.org/github.com/dgrijalva/jwt-go). diff --git a/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md b/vendor/github.com/form3tech-oss/jwt-go/VERSION_HISTORY.md similarity index 100% rename from vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md rename to vendor/github.com/form3tech-oss/jwt-go/VERSION_HISTORY.md diff --git a/vendor/github.com/dgrijalva/jwt-go/claims.go b/vendor/github.com/form3tech-oss/jwt-go/claims.go similarity index 93% rename from vendor/github.com/dgrijalva/jwt-go/claims.go rename to vendor/github.com/form3tech-oss/jwt-go/claims.go index f0228f02e0..624890666c 100644 --- a/vendor/github.com/dgrijalva/jwt-go/claims.go +++ b/vendor/github.com/form3tech-oss/jwt-go/claims.go @@ -16,7 +16,7 @@ type Claims interface { // https://tools.ietf.org/html/rfc7519#section-4.1 // See examples for how to use this with your own claim types type StandardClaims struct { - Audience string `json:"aud,omitempty"` + Audience []string `json:"aud,omitempty"` ExpiresAt int64 `json:"exp,omitempty"` Id string `json:"jti,omitempty"` IssuedAt int64 `json:"iat,omitempty"` @@ -90,15 +90,17 @@ func (c *StandardClaims) VerifyNotBefore(cmp int64, req bool) bool { // ----- helpers -func verifyAud(aud string, cmp string, required bool) bool { - if aud == "" { +func verifyAud(aud []string, cmp string, required bool) bool { + if len(aud) == 0 { return !required } - if subtle.ConstantTimeCompare([]byte(aud), []byte(cmp)) != 0 { - return true - } else { - return false + + for _, a := range aud { + if subtle.ConstantTimeCompare([]byte(a), []byte(cmp)) != 0 { + return true + } } + return false } func verifyExp(exp int64, now int64, required bool) bool { diff --git a/vendor/github.com/dgrijalva/jwt-go/doc.go b/vendor/github.com/form3tech-oss/jwt-go/doc.go similarity index 100% rename from vendor/github.com/dgrijalva/jwt-go/doc.go rename to vendor/github.com/form3tech-oss/jwt-go/doc.go diff --git a/vendor/github.com/dgrijalva/jwt-go/ecdsa.go b/vendor/github.com/form3tech-oss/jwt-go/ecdsa.go similarity index 100% rename from vendor/github.com/dgrijalva/jwt-go/ecdsa.go rename to vendor/github.com/form3tech-oss/jwt-go/ecdsa.go diff --git a/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go b/vendor/github.com/form3tech-oss/jwt-go/ecdsa_utils.go similarity index 93% rename from vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go rename to vendor/github.com/form3tech-oss/jwt-go/ecdsa_utils.go index d19624b726..db9f4be7d8 100644 --- a/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go +++ b/vendor/github.com/form3tech-oss/jwt-go/ecdsa_utils.go @@ -25,7 +25,9 @@ func ParseECPrivateKeyFromPEM(key []byte) (*ecdsa.PrivateKey, error) { // Parse the key var parsedKey interface{} if parsedKey, err = x509.ParseECPrivateKey(block.Bytes); err != nil { - return nil, err + if parsedKey, err = x509.ParsePKCS8PrivateKey(block.Bytes); err != nil { + return nil, err + } } var pkey *ecdsa.PrivateKey diff --git a/vendor/github.com/dgrijalva/jwt-go/errors.go b/vendor/github.com/form3tech-oss/jwt-go/errors.go similarity index 100% rename from vendor/github.com/dgrijalva/jwt-go/errors.go rename to vendor/github.com/form3tech-oss/jwt-go/errors.go diff --git a/vendor/github.com/dgrijalva/jwt-go/hmac.go b/vendor/github.com/form3tech-oss/jwt-go/hmac.go similarity index 100% rename from vendor/github.com/dgrijalva/jwt-go/hmac.go rename to vendor/github.com/form3tech-oss/jwt-go/hmac.go diff --git a/vendor/github.com/dgrijalva/jwt-go/map_claims.go b/vendor/github.com/form3tech-oss/jwt-go/map_claims.go similarity index 94% rename from vendor/github.com/dgrijalva/jwt-go/map_claims.go rename to vendor/github.com/form3tech-oss/jwt-go/map_claims.go index 291213c460..90ab6bea35 100644 --- a/vendor/github.com/dgrijalva/jwt-go/map_claims.go +++ b/vendor/github.com/form3tech-oss/jwt-go/map_claims.go @@ -13,7 +13,15 @@ type MapClaims map[string]interface{} // Compares the aud claim against cmp. // If required is false, this method will return true if the value matches or is unset func (m MapClaims) VerifyAudience(cmp string, req bool) bool { - aud, _ := m["aud"].(string) + aud, ok := m["aud"].([]string) + if !ok { + strAud, ok := m["aud"].(string) + if !ok { + return false + } + aud = append(aud, strAud) + } + return verifyAud(aud, cmp, req) } diff --git a/vendor/github.com/dgrijalva/jwt-go/none.go b/vendor/github.com/form3tech-oss/jwt-go/none.go similarity index 100% rename from vendor/github.com/dgrijalva/jwt-go/none.go rename to vendor/github.com/form3tech-oss/jwt-go/none.go diff --git a/vendor/github.com/dgrijalva/jwt-go/parser.go b/vendor/github.com/form3tech-oss/jwt-go/parser.go similarity index 100% rename from vendor/github.com/dgrijalva/jwt-go/parser.go rename to vendor/github.com/form3tech-oss/jwt-go/parser.go diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa.go b/vendor/github.com/form3tech-oss/jwt-go/rsa.go similarity index 100% rename from vendor/github.com/dgrijalva/jwt-go/rsa.go rename to vendor/github.com/form3tech-oss/jwt-go/rsa.go diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go b/vendor/github.com/form3tech-oss/jwt-go/rsa_pss.go similarity index 71% rename from vendor/github.com/dgrijalva/jwt-go/rsa_pss.go rename to vendor/github.com/form3tech-oss/jwt-go/rsa_pss.go index 10ee9db8a4..c014708648 100644 --- a/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go +++ b/vendor/github.com/form3tech-oss/jwt-go/rsa_pss.go @@ -12,9 +12,14 @@ import ( type SigningMethodRSAPSS struct { *SigningMethodRSA Options *rsa.PSSOptions + // VerifyOptions is optional. If set overrides Options for rsa.VerifyPPS. + // Used to accept tokens signed with rsa.PSSSaltLengthAuto, what doesn't follow + // https://tools.ietf.org/html/rfc7518#section-3.5 but was used previously. + // See https://github.com/dgrijalva/jwt-go/issues/285#issuecomment-437451244 for details. + VerifyOptions *rsa.PSSOptions } -// Specific instances for RS/PS and company +// Specific instances for RS/PS and company. var ( SigningMethodPS256 *SigningMethodRSAPSS SigningMethodPS384 *SigningMethodRSAPSS @@ -24,13 +29,15 @@ var ( func init() { // PS256 SigningMethodPS256 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ + SigningMethodRSA: &SigningMethodRSA{ Name: "PS256", Hash: crypto.SHA256, }, - &rsa.PSSOptions{ + Options: &rsa.PSSOptions{ + SaltLength: rsa.PSSSaltLengthEqualsHash, + }, + VerifyOptions: &rsa.PSSOptions{ SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA256, }, } RegisterSigningMethod(SigningMethodPS256.Alg(), func() SigningMethod { @@ -39,13 +46,15 @@ func init() { // PS384 SigningMethodPS384 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ + SigningMethodRSA: &SigningMethodRSA{ Name: "PS384", Hash: crypto.SHA384, }, - &rsa.PSSOptions{ + Options: &rsa.PSSOptions{ + SaltLength: rsa.PSSSaltLengthEqualsHash, + }, + VerifyOptions: &rsa.PSSOptions{ SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA384, }, } RegisterSigningMethod(SigningMethodPS384.Alg(), func() SigningMethod { @@ -54,13 +63,15 @@ func init() { // PS512 SigningMethodPS512 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ + SigningMethodRSA: &SigningMethodRSA{ Name: "PS512", Hash: crypto.SHA512, }, - &rsa.PSSOptions{ + Options: &rsa.PSSOptions{ + SaltLength: rsa.PSSSaltLengthEqualsHash, + }, + VerifyOptions: &rsa.PSSOptions{ SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA512, }, } RegisterSigningMethod(SigningMethodPS512.Alg(), func() SigningMethod { @@ -94,7 +105,12 @@ func (m *SigningMethodRSAPSS) Verify(signingString, signature string, key interf hasher := m.Hash.New() hasher.Write([]byte(signingString)) - return rsa.VerifyPSS(rsaKey, m.Hash, hasher.Sum(nil), sig, m.Options) + opts := m.Options + if m.VerifyOptions != nil { + opts = m.VerifyOptions + } + + return rsa.VerifyPSS(rsaKey, m.Hash, hasher.Sum(nil), sig, opts) } // Implements the Sign method from SigningMethod diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go b/vendor/github.com/form3tech-oss/jwt-go/rsa_utils.go similarity index 95% rename from vendor/github.com/dgrijalva/jwt-go/rsa_utils.go rename to vendor/github.com/form3tech-oss/jwt-go/rsa_utils.go index a5ababf956..14c78c292a 100644 --- a/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go +++ b/vendor/github.com/form3tech-oss/jwt-go/rsa_utils.go @@ -8,7 +8,7 @@ import ( ) var ( - ErrKeyMustBePEMEncoded = errors.New("Invalid Key: Key must be PEM encoded PKCS1 or PKCS8 private key") + ErrKeyMustBePEMEncoded = errors.New("Invalid Key: Key must be a PEM encoded PKCS1 or PKCS8 key") ErrNotRSAPrivateKey = errors.New("Key is not a valid RSA private key") ErrNotRSAPublicKey = errors.New("Key is not a valid RSA public key") ) diff --git a/vendor/github.com/dgrijalva/jwt-go/signing_method.go b/vendor/github.com/form3tech-oss/jwt-go/signing_method.go similarity index 100% rename from vendor/github.com/dgrijalva/jwt-go/signing_method.go rename to vendor/github.com/form3tech-oss/jwt-go/signing_method.go diff --git a/vendor/github.com/dgrijalva/jwt-go/token.go b/vendor/github.com/form3tech-oss/jwt-go/token.go similarity index 100% rename from vendor/github.com/dgrijalva/jwt-go/token.go rename to vendor/github.com/form3tech-oss/jwt-go/token.go diff --git a/vendor/github.com/go-logr/logr/README.md b/vendor/github.com/go-logr/logr/README.md index 97b1f904a6..e9b5520a1c 100644 --- a/vendor/github.com/go-logr/logr/README.md +++ b/vendor/github.com/go-logr/logr/README.md @@ -42,6 +42,7 @@ There are implementations for the following logging libraries: [stdr](https://github.com/go-logr/stdr) - **github.com/sirupsen/logrus**: [logrusr](https://github.com/bombsimon/logrusr) - **github.com/wojas/genericr**: [genericr](https://github.com/wojas/genericr) (makes it easy to implement your own backend) +- **logfmt** (Heroku style [logging](https://www.brandur.org/logfmt)): [logfmtr](https://github.com/iand/logfmtr) # FAQ diff --git a/vendor/github.com/go-logr/logr/discard.go b/vendor/github.com/go-logr/logr/discard.go new file mode 100644 index 0000000000..267c796c66 --- /dev/null +++ b/vendor/github.com/go-logr/logr/discard.go @@ -0,0 +1,35 @@ +package logr + +// Discard returns a valid Logger that discards all messages logged to it. +// It can be used whenever the caller is not interested in the logs. +func Discard() Logger { + return discardLogger{} +} + +// discardLogger is a Logger that discards all messages. +type discardLogger struct{} + +func (l discardLogger) Enabled() bool { + return false +} + +func (l discardLogger) Info(msg string, keysAndValues ...interface{}) { +} + +func (l discardLogger) Error(err error, msg string, keysAndValues ...interface{}) { +} + +func (l discardLogger) V(level int) Logger { + return l +} + +func (l discardLogger) WithValues(keysAndValues ...interface{}) Logger { + return l +} + +func (l discardLogger) WithName(name string) Logger { + return l +} + +// Verify that it actually implements the interface +var _ Logger = discardLogger{} diff --git a/vendor/github.com/go-logr/logr/logr.go b/vendor/github.com/go-logr/logr/logr.go index 50c3432972..e86896c6c0 100644 --- a/vendor/github.com/go-logr/logr/logr.go +++ b/vendor/github.com/go-logr/logr/logr.go @@ -40,17 +40,16 @@ limitations under the License. // we want to log that we've made some decision. // // With the traditional log package, we might write: -// log.Printf( -// "decided to set field foo to value %q for object %s/%s", +// log.Printf("decided to set field foo to value %q for object %s/%s", // targetValue, object.Namespace, object.Name) // // With logr's structured logging, we'd write: -// // elsewhere in the file, set up the logger to log with the prefix of "reconcilers", -// // and the named value target-type=Foo, for extra context. -// log := mainLogger.WithName("reconcilers").WithValues("target-type", "Foo") +// // elsewhere in the file, set up the logger to log with the prefix of +// // "reconcilers", and the named value target-type=Foo, for extra context. +// log := mainLogger.WithName("reconcilers").WithValues("target-type", "Foo") // -// // later on... -// log.Info("setting field foo on object", "value", targetValue, "object", object) +// // later on... +// log.Info("setting foo on object", "value", targetValue, "object", object) // // Depending on our logging implementation, we could then make logging decisions // based on field values (like only logging such events for objects in a certain @@ -128,8 +127,22 @@ limitations under the License. // 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). +// +// 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() +// } package logr +import ( + "context" +) + // TODO: consider adding back in format strings if they're really needed // TODO: consider other bits of zap/zapcore functionality like ObjectMarshaller (for arbitrary objects) // TODO: consider other bits of glog functionality like Flush, InfoDepth, OutputStats @@ -180,3 +193,30 @@ type Logger interface { // InfoLogger provides compatibility with code that relies on the v0.1.0 interface // Deprecated: use Logger instead. This will be removed in a future release. type InfoLogger = Logger + +type contextKey struct{} + +// FromContext returns a Logger constructed from ctx or nil if no +// logger details are found. +func FromContext(ctx context.Context) Logger { + if v, ok := ctx.Value(contextKey{}).(Logger); ok { + return v + } + + return nil +} + +// FromContextOrDiscard returns a Logger constructed from ctx or a Logger +// that discards all messages if no logger details are found. +func FromContextOrDiscard(ctx context.Context) Logger { + if v, ok := ctx.Value(contextKey{}).(Logger); ok { + return v + } + + return discardLogger{} +} + +// NewContext returns a new context derived from ctx that embeds the Logger. +func NewContext(ctx context.Context, l Logger) context.Context { + return context.WithValue(ctx, contextKey{}, l) +} diff --git a/vendor/github.com/go-openapi/analysis/.codecov.yml b/vendor/github.com/go-openapi/analysis/.codecov.yml deleted file mode 100644 index 841c4281e2..0000000000 --- a/vendor/github.com/go-openapi/analysis/.codecov.yml +++ /dev/null @@ -1,5 +0,0 @@ -coverage: - status: - patch: - default: - target: 80% diff --git a/vendor/github.com/go-openapi/analysis/.gitignore b/vendor/github.com/go-openapi/analysis/.gitignore deleted file mode 100644 index 87c3bd3e66..0000000000 --- a/vendor/github.com/go-openapi/analysis/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -secrets.yml -coverage.out -coverage.txt -*.cov -.idea diff --git a/vendor/github.com/go-openapi/analysis/.golangci.yml b/vendor/github.com/go-openapi/analysis/.golangci.yml deleted file mode 100644 index 76af8ab1c8..0000000000 --- a/vendor/github.com/go-openapi/analysis/.golangci.yml +++ /dev/null @@ -1,27 +0,0 @@ -linters-settings: - govet: - check-shadowing: true - golint: - min-confidence: 0 - gocyclo: - min-complexity: 40 - maligned: - suggest-new: true - dupl: - threshold: 100 - goconst: - min-len: 2 - min-occurrences: 4 - -linters: - enable-all: true - disable: - - maligned - - lll - - gochecknoglobals - - gochecknoinits - # scopelint is useful, but also reports false positives - # that unfortunately can't be disabled. So we disable the - # linter rather than changing code that works. - # see: https://github.com/kyoh86/scopelint/issues/4 - - scopelint diff --git a/vendor/github.com/go-openapi/analysis/.travis.yml b/vendor/github.com/go-openapi/analysis/.travis.yml deleted file mode 100644 index 7ecf865c21..0000000000 --- a/vendor/github.com/go-openapi/analysis/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -after_success: -- bash <(curl -s https://codecov.io/bash) -go: -- 1.11.x -- 1.12.x -install: -- GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on -language: go -notifications: - slack: - secure: Sf7kZf7ZGbnwWUMpffHwMu5A0cHkLK2MYY32LNTPj4+/3qC3Ghl7+9v4TSLOqOlCwdRNjOGblAq7s+GDJed6/xgRQl1JtCi1klzZNrYX4q01pgTPvvGcwbBkIYgeMaPeIRcK9OZnud7sRXdttozgTOpytps2U6Js32ip7uj5mHSg2ub0FwoSJwlS6dbezZ8+eDhoha0F/guY99BEwx8Bd+zROrT2TFGsSGOFGN6wFc7moCqTHO/YkWib13a2QNXqOxCCVBy/lt76Wp+JkeFppjHlzs/2lP3EAk13RIUAaesdEUHvIHrzCyNJEd3/+KO2DzsWOYfpktd+KBCvgaYOsoo7ubdT3IROeAegZdCgo/6xgCEsmFc9ZcqCfN5yNx2A+BZ2Vwmpws+bQ1E1+B5HDzzaiLcYfG4X2O210QVGVDLWsv1jqD+uPYeHY2WRfh5ZsIUFvaqgUEnwHwrK44/8REAhQavt1QAj5uJpsRd7CkRVPWRNK+yIky+wgbVUFEchRNmS55E7QWf+W4+4QZkQi7vUTMc9nbTUu2Es9NfvfudOpM2wZbn98fjpb/qq/nRv6Bk+ca+7XD5/IgNLMbWp2ouDdzbiHLCOfDUiHiDJhLfFZx9Bwo7ZwfzeOlbrQX66bx7xRKYmOe4DLrXhNcpbsMa8qbfxlZRCmYbubB/Y8h4= -script: -- gotestsum -f short-verbose -- -race -timeout=20m -coverprofile=coverage.txt -covermode=atomic ./... diff --git a/vendor/github.com/go-openapi/analysis/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/analysis/CODE_OF_CONDUCT.md deleted file mode 100644 index 9322b065e3..0000000000 --- a/vendor/github.com/go-openapi/analysis/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,74 +0,0 @@ -# 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/analysis/README.md b/vendor/github.com/go-openapi/analysis/README.md deleted file mode 100644 index efafdf8fd3..0000000000 --- a/vendor/github.com/go-openapi/analysis/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# OpenAPI initiative analysis [![Build Status](https://travis-ci.org/go-openapi/analysis.svg?branch=master)](https://travis-ci.org/go-openapi/analysis) [![Build status](https://ci.appveyor.com/api/projects/status/x377t5o9ennm847o/branch/master?svg=true)](https://ci.appveyor.com/project/casualjim/go-openapi/analysis/branch/master) [![codecov](https://codecov.io/gh/go-openapi/analysis/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/analysis) -[![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/analysis/master/LICENSE) -[![GoDoc](https://godoc.org/github.com/go-openapi/analysis?status.svg)](http://godoc.org/github.com/go-openapi/analysis) -[![GolangCI](https://golangci.com/badges/github.com/go-openapi/analysis.svg)](https://golangci.com) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/analysis)](https://goreportcard.com/report/github.com/go-openapi/analysis) - - -A foundational library to analyze an OAI specification document for easier reasoning about the content. diff --git a/vendor/github.com/go-openapi/analysis/analyzer.go b/vendor/github.com/go-openapi/analysis/analyzer.go deleted file mode 100644 index 4d98718c4e..0000000000 --- a/vendor/github.com/go-openapi/analysis/analyzer.go +++ /dev/null @@ -1,970 +0,0 @@ -// 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 analysis - -import ( - "fmt" - slashpath "path" - "strconv" - "strings" - - "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/spec" - "github.com/go-openapi/swag" -) - -type referenceAnalysis struct { - schemas map[string]spec.Ref - responses map[string]spec.Ref - parameters map[string]spec.Ref - items map[string]spec.Ref - headerItems map[string]spec.Ref - parameterItems map[string]spec.Ref - allRefs map[string]spec.Ref - pathItems map[string]spec.Ref -} - -func (r *referenceAnalysis) addRef(key string, ref spec.Ref) { - r.allRefs["#"+key] = ref -} - -func (r *referenceAnalysis) addItemsRef(key string, items *spec.Items, location string) { - r.items["#"+key] = items.Ref - r.addRef(key, items.Ref) - if location == "header" { - // NOTE: in swagger 2.0, headers and parameters (but not body param schemas) are simple schemas - // and $ref are not supported here. However it is possible to analyze this. - r.headerItems["#"+key] = items.Ref - } else { - r.parameterItems["#"+key] = items.Ref - } -} - -func (r *referenceAnalysis) addSchemaRef(key string, ref SchemaRef) { - r.schemas["#"+key] = ref.Schema.Ref - r.addRef(key, ref.Schema.Ref) -} - -func (r *referenceAnalysis) addResponseRef(key string, resp *spec.Response) { - r.responses["#"+key] = resp.Ref - r.addRef(key, resp.Ref) -} - -func (r *referenceAnalysis) addParamRef(key string, param *spec.Parameter) { - r.parameters["#"+key] = param.Ref - r.addRef(key, param.Ref) -} - -func (r *referenceAnalysis) addPathItemRef(key string, pathItem *spec.PathItem) { - r.pathItems["#"+key] = pathItem.Ref - r.addRef(key, pathItem.Ref) -} - -type patternAnalysis struct { - parameters map[string]string - headers map[string]string - items map[string]string - schemas map[string]string - allPatterns map[string]string -} - -func (p *patternAnalysis) addPattern(key, pattern string) { - p.allPatterns["#"+key] = pattern -} - -func (p *patternAnalysis) addParameterPattern(key, pattern string) { - p.parameters["#"+key] = pattern - p.addPattern(key, pattern) -} - -func (p *patternAnalysis) addHeaderPattern(key, pattern string) { - p.headers["#"+key] = pattern - p.addPattern(key, pattern) -} - -func (p *patternAnalysis) addItemsPattern(key, pattern string) { - p.items["#"+key] = pattern - p.addPattern(key, pattern) -} - -func (p *patternAnalysis) addSchemaPattern(key, pattern string) { - p.schemas["#"+key] = pattern - p.addPattern(key, pattern) -} - -type enumAnalysis struct { - parameters map[string][]interface{} - headers map[string][]interface{} - items map[string][]interface{} - schemas map[string][]interface{} - allEnums map[string][]interface{} -} - -func (p *enumAnalysis) addEnum(key string, enum []interface{}) { - p.allEnums["#"+key] = enum -} - -func (p *enumAnalysis) addParameterEnum(key string, enum []interface{}) { - p.parameters["#"+key] = enum - p.addEnum(key, enum) -} - -func (p *enumAnalysis) addHeaderEnum(key string, enum []interface{}) { - p.headers["#"+key] = enum - p.addEnum(key, enum) -} - -func (p *enumAnalysis) addItemsEnum(key string, enum []interface{}) { - p.items["#"+key] = enum - p.addEnum(key, enum) -} - -func (p *enumAnalysis) addSchemaEnum(key string, enum []interface{}) { - p.schemas["#"+key] = enum - p.addEnum(key, enum) -} - -// New takes a swagger spec object and returns an analyzed spec document. -// The analyzed document contains a number of indices that make it easier to -// reason about semantics of a swagger specification for use in code generation -// or validation etc. -func New(doc *spec.Swagger) *Spec { - a := &Spec{ - spec: doc, - references: referenceAnalysis{}, - patterns: patternAnalysis{}, - enums: enumAnalysis{}, - } - a.reset() - a.initialize() - return a -} - -// Spec is an analyzed specification object. It takes a swagger spec object and turns it into a registry -// with a bunch of utility methods to act on the information in the spec. -type Spec struct { - spec *spec.Swagger - consumes map[string]struct{} - produces map[string]struct{} - authSchemes map[string]struct{} - operations map[string]map[string]*spec.Operation - references referenceAnalysis - patterns patternAnalysis - enums enumAnalysis - allSchemas map[string]SchemaRef - allOfs map[string]SchemaRef -} - -func (s *Spec) reset() { - s.consumes = make(map[string]struct{}, 150) - s.produces = make(map[string]struct{}, 150) - s.authSchemes = make(map[string]struct{}, 150) - s.operations = make(map[string]map[string]*spec.Operation, 150) - s.allSchemas = make(map[string]SchemaRef, 150) - s.allOfs = make(map[string]SchemaRef, 150) - s.references.schemas = make(map[string]spec.Ref, 150) - s.references.pathItems = make(map[string]spec.Ref, 150) - s.references.responses = make(map[string]spec.Ref, 150) - s.references.parameters = make(map[string]spec.Ref, 150) - s.references.items = make(map[string]spec.Ref, 150) - s.references.headerItems = make(map[string]spec.Ref, 150) - s.references.parameterItems = make(map[string]spec.Ref, 150) - s.references.allRefs = make(map[string]spec.Ref, 150) - s.patterns.parameters = make(map[string]string, 150) - s.patterns.headers = make(map[string]string, 150) - s.patterns.items = make(map[string]string, 150) - s.patterns.schemas = make(map[string]string, 150) - s.patterns.allPatterns = make(map[string]string, 150) - s.enums.parameters = make(map[string][]interface{}, 150) - s.enums.headers = make(map[string][]interface{}, 150) - s.enums.items = make(map[string][]interface{}, 150) - s.enums.schemas = make(map[string][]interface{}, 150) - s.enums.allEnums = make(map[string][]interface{}, 150) -} - -func (s *Spec) reload() { - s.reset() - s.initialize() -} - -func (s *Spec) initialize() { - for _, c := range s.spec.Consumes { - s.consumes[c] = struct{}{} - } - for _, c := range s.spec.Produces { - s.produces[c] = struct{}{} - } - for _, ss := range s.spec.Security { - for k := range ss { - s.authSchemes[k] = struct{}{} - } - } - for path, pathItem := range s.AllPaths() { - s.analyzeOperations(path, &pathItem) - } - - for name, parameter := range s.spec.Parameters { - refPref := slashpath.Join("/parameters", jsonpointer.Escape(name)) - if parameter.Items != nil { - s.analyzeItems("items", parameter.Items, refPref, "parameter") - } - if parameter.In == "body" && parameter.Schema != nil { - s.analyzeSchema("schema", *parameter.Schema, refPref) - } - if parameter.Pattern != "" { - s.patterns.addParameterPattern(refPref, parameter.Pattern) - } - if len(parameter.Enum) > 0 { - s.enums.addParameterEnum(refPref, parameter.Enum) - } - } - - for name, response := range s.spec.Responses { - refPref := slashpath.Join("/responses", jsonpointer.Escape(name)) - for k, v := range response.Headers { - hRefPref := slashpath.Join(refPref, "headers", k) - if v.Items != nil { - s.analyzeItems("items", v.Items, hRefPref, "header") - } - if v.Pattern != "" { - s.patterns.addHeaderPattern(hRefPref, v.Pattern) - } - if len(v.Enum) > 0 { - s.enums.addHeaderEnum(hRefPref, v.Enum) - } - } - if response.Schema != nil { - s.analyzeSchema("schema", *response.Schema, refPref) - } - } - - for name, schema := range s.spec.Definitions { - s.analyzeSchema(name, schema, "/definitions") - } - // TODO: after analyzing all things and flattening schemas etc - // resolve all the collected references to their final representations - // best put in a separate method because this could get expensive -} - -func (s *Spec) analyzeOperations(path string, pi *spec.PathItem) { - // TODO: resolve refs here? - // Currently, operations declared via pathItem $ref are known only after expansion - op := pi - if pi.Ref.String() != "" { - key := slashpath.Join("/paths", jsonpointer.Escape(path)) - s.references.addPathItemRef(key, pi) - } - s.analyzeOperation("GET", path, op.Get) - s.analyzeOperation("PUT", path, op.Put) - s.analyzeOperation("POST", path, op.Post) - s.analyzeOperation("PATCH", path, op.Patch) - s.analyzeOperation("DELETE", path, op.Delete) - s.analyzeOperation("HEAD", path, op.Head) - s.analyzeOperation("OPTIONS", path, op.Options) - for i, param := range op.Parameters { - refPref := slashpath.Join("/paths", jsonpointer.Escape(path), "parameters", strconv.Itoa(i)) - if param.Ref.String() != "" { - s.references.addParamRef(refPref, ¶m) - } - if param.Pattern != "" { - s.patterns.addParameterPattern(refPref, param.Pattern) - } - if len(param.Enum) > 0 { - s.enums.addParameterEnum(refPref, param.Enum) - } - if param.Items != nil { - s.analyzeItems("items", param.Items, refPref, "parameter") - } - if param.Schema != nil { - s.analyzeSchema("schema", *param.Schema, refPref) - } - } -} - -func (s *Spec) analyzeItems(name string, items *spec.Items, prefix, location string) { - if items == nil { - return - } - refPref := slashpath.Join(prefix, name) - s.analyzeItems(name, items.Items, refPref, location) - if items.Ref.String() != "" { - s.references.addItemsRef(refPref, items, location) - } - if items.Pattern != "" { - s.patterns.addItemsPattern(refPref, items.Pattern) - } - if len(items.Enum) > 0 { - s.enums.addItemsEnum(refPref, items.Enum) - } -} - -func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) { - if op == nil { - return - } - - for _, c := range op.Consumes { - s.consumes[c] = struct{}{} - } - for _, c := range op.Produces { - s.produces[c] = struct{}{} - } - for _, ss := range op.Security { - for k := range ss { - s.authSchemes[k] = struct{}{} - } - } - if _, ok := s.operations[method]; !ok { - s.operations[method] = make(map[string]*spec.Operation) - } - s.operations[method][path] = op - prefix := slashpath.Join("/paths", jsonpointer.Escape(path), strings.ToLower(method)) - for i, param := range op.Parameters { - refPref := slashpath.Join(prefix, "parameters", strconv.Itoa(i)) - if param.Ref.String() != "" { - s.references.addParamRef(refPref, ¶m) - } - if param.Pattern != "" { - s.patterns.addParameterPattern(refPref, param.Pattern) - } - if len(param.Enum) > 0 { - s.enums.addParameterEnum(refPref, param.Enum) - } - s.analyzeItems("items", param.Items, refPref, "parameter") - if param.In == "body" && param.Schema != nil { - s.analyzeSchema("schema", *param.Schema, refPref) - } - } - if op.Responses != nil { - if op.Responses.Default != nil { - refPref := slashpath.Join(prefix, "responses", "default") - if op.Responses.Default.Ref.String() != "" { - s.references.addResponseRef(refPref, op.Responses.Default) - } - for k, v := range op.Responses.Default.Headers { - hRefPref := slashpath.Join(refPref, "headers", k) - s.analyzeItems("items", v.Items, hRefPref, "header") - if v.Pattern != "" { - s.patterns.addHeaderPattern(hRefPref, v.Pattern) - } - } - if op.Responses.Default.Schema != nil { - s.analyzeSchema("schema", *op.Responses.Default.Schema, refPref) - } - } - for k, res := range op.Responses.StatusCodeResponses { - refPref := slashpath.Join(prefix, "responses", strconv.Itoa(k)) - if res.Ref.String() != "" { - s.references.addResponseRef(refPref, &res) - } - for k, v := range res.Headers { - hRefPref := slashpath.Join(refPref, "headers", k) - s.analyzeItems("items", v.Items, hRefPref, "header") - if v.Pattern != "" { - s.patterns.addHeaderPattern(hRefPref, v.Pattern) - } - if len(v.Enum) > 0 { - s.enums.addHeaderEnum(hRefPref, v.Enum) - } - } - if res.Schema != nil { - s.analyzeSchema("schema", *res.Schema, refPref) - } - } - } -} - -func (s *Spec) analyzeSchema(name string, schema spec.Schema, prefix string) { - refURI := slashpath.Join(prefix, jsonpointer.Escape(name)) - schRef := SchemaRef{ - Name: name, - Schema: &schema, - Ref: spec.MustCreateRef("#" + refURI), - TopLevel: prefix == "/definitions", - } - - s.allSchemas["#"+refURI] = schRef - - if schema.Ref.String() != "" { - s.references.addSchemaRef(refURI, schRef) - } - if schema.Pattern != "" { - s.patterns.addSchemaPattern(refURI, schema.Pattern) - } - if len(schema.Enum) > 0 { - s.enums.addSchemaEnum(refURI, schema.Enum) - } - - for k, v := range schema.Definitions { - s.analyzeSchema(k, v, slashpath.Join(refURI, "definitions")) - } - for k, v := range schema.Properties { - s.analyzeSchema(k, v, slashpath.Join(refURI, "properties")) - } - for k, v := range schema.PatternProperties { - // NOTE: swagger 2.0 does not support PatternProperties. - // However it is possible to analyze this in a schema - s.analyzeSchema(k, v, slashpath.Join(refURI, "patternProperties")) - } - for i, v := range schema.AllOf { - s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "allOf")) - } - if len(schema.AllOf) > 0 { - s.allOfs["#"+refURI] = schRef - } - for i, v := range schema.AnyOf { - // NOTE: swagger 2.0 does not support anyOf constructs. - // However it is possible to analyze this in a schema - s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "anyOf")) - } - for i, v := range schema.OneOf { - // NOTE: swagger 2.0 does not support oneOf constructs. - // However it is possible to analyze this in a schema - s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "oneOf")) - } - if schema.Not != nil { - // NOTE: swagger 2.0 does not support "not" constructs. - // However it is possible to analyze this in a schema - s.analyzeSchema("not", *schema.Not, refURI) - } - if schema.AdditionalProperties != nil && schema.AdditionalProperties.Schema != nil { - s.analyzeSchema("additionalProperties", *schema.AdditionalProperties.Schema, refURI) - } - if schema.AdditionalItems != nil && schema.AdditionalItems.Schema != nil { - // NOTE: swagger 2.0 does not support AdditionalItems. - // However it is possible to analyze this in a schema - s.analyzeSchema("additionalItems", *schema.AdditionalItems.Schema, refURI) - } - if schema.Items != nil { - if schema.Items.Schema != nil { - s.analyzeSchema("items", *schema.Items.Schema, refURI) - } - for i, sch := range schema.Items.Schemas { - s.analyzeSchema(strconv.Itoa(i), sch, slashpath.Join(refURI, "items")) - } - } -} - -// SecurityRequirement is a representation of a security requirement for an operation -type SecurityRequirement struct { - Name string - Scopes []string -} - -// SecurityRequirementsFor gets the security requirements for the operation -func (s *Spec) SecurityRequirementsFor(operation *spec.Operation) [][]SecurityRequirement { - if s.spec.Security == nil && operation.Security == nil { - return nil - } - - schemes := s.spec.Security - if operation.Security != nil { - schemes = operation.Security - } - - result := [][]SecurityRequirement{} - for _, scheme := range schemes { - if len(scheme) == 0 { - // append a zero object for anonymous - result = append(result, []SecurityRequirement{{}}) - continue - } - var reqs []SecurityRequirement - for k, v := range scheme { - if v == nil { - v = []string{} - } - reqs = append(reqs, SecurityRequirement{Name: k, Scopes: v}) - } - result = append(result, reqs) - } - return result -} - -// SecurityDefinitionsForRequirements gets the matching security definitions for a set of requirements -func (s *Spec) SecurityDefinitionsForRequirements(requirements []SecurityRequirement) map[string]spec.SecurityScheme { - result := make(map[string]spec.SecurityScheme) - - for _, v := range requirements { - if definition, ok := s.spec.SecurityDefinitions[v.Name]; ok { - if definition != nil { - result[v.Name] = *definition - } - } - } - return result -} - -// SecurityDefinitionsFor gets the matching security definitions for a set of requirements -func (s *Spec) SecurityDefinitionsFor(operation *spec.Operation) map[string]spec.SecurityScheme { - requirements := s.SecurityRequirementsFor(operation) - if len(requirements) == 0 { - return nil - } - - result := make(map[string]spec.SecurityScheme) - for _, reqs := range requirements { - for _, v := range reqs { - if v.Name == "" { - // optional requirement - continue - } - if _, ok := result[v.Name]; ok { - // duplicate requirement - continue - } - if definition, ok := s.spec.SecurityDefinitions[v.Name]; ok { - if definition != nil { - result[v.Name] = *definition - } - } - } - } - return result -} - -// ConsumesFor gets the mediatypes for the operation -func (s *Spec) ConsumesFor(operation *spec.Operation) []string { - - if len(operation.Consumes) == 0 { - cons := make(map[string]struct{}, len(s.spec.Consumes)) - for _, k := range s.spec.Consumes { - cons[k] = struct{}{} - } - return s.structMapKeys(cons) - } - - cons := make(map[string]struct{}, len(operation.Consumes)) - for _, c := range operation.Consumes { - cons[c] = struct{}{} - } - return s.structMapKeys(cons) -} - -// ProducesFor gets the mediatypes for the operation -func (s *Spec) ProducesFor(operation *spec.Operation) []string { - if len(operation.Produces) == 0 { - prod := make(map[string]struct{}, len(s.spec.Produces)) - for _, k := range s.spec.Produces { - prod[k] = struct{}{} - } - return s.structMapKeys(prod) - } - - prod := make(map[string]struct{}, len(operation.Produces)) - for _, c := range operation.Produces { - prod[c] = struct{}{} - } - return s.structMapKeys(prod) -} - -func mapKeyFromParam(param *spec.Parameter) string { - return fmt.Sprintf("%s#%s", param.In, fieldNameFromParam(param)) -} - -func fieldNameFromParam(param *spec.Parameter) string { - // TODO: this should be x-go-name - if nm, ok := param.Extensions.GetString("go-name"); ok { - return nm - } - return swag.ToGoName(param.Name) -} - -// ErrorOnParamFunc is a callback function to be invoked -// whenever an error is encountered while resolving references -// on parameters. -// -// This function takes as input the spec.Parameter which triggered the -// error and the error itself. -// -// If the callback function returns false, the calling function should bail. -// -// If it returns true, the calling function should continue evaluating parameters. -// A nil ErrorOnParamFunc must be evaluated as equivalent to panic(). -type ErrorOnParamFunc func(spec.Parameter, error) bool - -func (s *Spec) paramsAsMap(parameters []spec.Parameter, res map[string]spec.Parameter, callmeOnError ErrorOnParamFunc) { - for _, param := range parameters { - pr := param - if pr.Ref.String() != "" { - obj, _, err := pr.Ref.GetPointer().Get(s.spec) - if err != nil { - if callmeOnError != nil { - if callmeOnError(param, fmt.Errorf("invalid reference: %q", pr.Ref.String())) { - continue - } - break - } else { - panic(fmt.Sprintf("invalid reference: %q", pr.Ref.String())) - } - } - if objAsParam, ok := obj.(spec.Parameter); ok { - pr = objAsParam - } else { - if callmeOnError != nil { - if callmeOnError(param, fmt.Errorf("resolved reference is not a parameter: %q", pr.Ref.String())) { - continue - } - break - } else { - panic(fmt.Sprintf("resolved reference is not a parameter: %q", pr.Ref.String())) - } - } - } - res[mapKeyFromParam(&pr)] = pr - } -} - -// ParametersFor the specified operation id. -// -// Assumes parameters properly resolve references if any and that -// such references actually resolve to a parameter object. -// Otherwise, panics. -func (s *Spec) ParametersFor(operationID string) []spec.Parameter { - return s.SafeParametersFor(operationID, nil) -} - -// SafeParametersFor the specified operation id. -// -// Does not assume parameters properly resolve references or that -// such references actually resolve to a parameter object. -// -// Upon error, invoke a ErrorOnParamFunc callback with the erroneous -// parameters. If the callback is set to nil, panics upon errors. -func (s *Spec) SafeParametersFor(operationID string, callmeOnError ErrorOnParamFunc) []spec.Parameter { - gatherParams := func(pi *spec.PathItem, op *spec.Operation) []spec.Parameter { - bag := make(map[string]spec.Parameter) - s.paramsAsMap(pi.Parameters, bag, callmeOnError) - s.paramsAsMap(op.Parameters, bag, callmeOnError) - - var res []spec.Parameter - for _, v := range bag { - res = append(res, v) - } - return res - } - for _, pi := range s.spec.Paths.Paths { - if pi.Get != nil && pi.Get.ID == operationID { - return gatherParams(&pi, pi.Get) - } - if pi.Head != nil && pi.Head.ID == operationID { - return gatherParams(&pi, pi.Head) - } - if pi.Options != nil && pi.Options.ID == operationID { - return gatherParams(&pi, pi.Options) - } - if pi.Post != nil && pi.Post.ID == operationID { - return gatherParams(&pi, pi.Post) - } - if pi.Patch != nil && pi.Patch.ID == operationID { - return gatherParams(&pi, pi.Patch) - } - if pi.Put != nil && pi.Put.ID == operationID { - return gatherParams(&pi, pi.Put) - } - if pi.Delete != nil && pi.Delete.ID == operationID { - return gatherParams(&pi, pi.Delete) - } - } - return nil -} - -// ParamsFor the specified method and path. Aggregates them with the defaults etc, so it's all the params that -// apply for the method and path. -// -// Assumes parameters properly resolve references if any and that -// such references actually resolve to a parameter object. -// Otherwise, panics. -func (s *Spec) ParamsFor(method, path string) map[string]spec.Parameter { - return s.SafeParamsFor(method, path, nil) -} - -// SafeParamsFor the specified method and path. Aggregates them with the defaults etc, so it's all the params that -// apply for the method and path. -// -// Does not assume parameters properly resolve references or that -// such references actually resolve to a parameter object. -// -// Upon error, invoke a ErrorOnParamFunc callback with the erroneous -// parameters. If the callback is set to nil, panics upon errors. -func (s *Spec) SafeParamsFor(method, path string, callmeOnError ErrorOnParamFunc) map[string]spec.Parameter { - res := make(map[string]spec.Parameter) - if pi, ok := s.spec.Paths.Paths[path]; ok { - s.paramsAsMap(pi.Parameters, res, callmeOnError) - s.paramsAsMap(s.operations[strings.ToUpper(method)][path].Parameters, res, callmeOnError) - } - return res -} - -// OperationForName gets the operation for the given id -func (s *Spec) OperationForName(operationID string) (string, string, *spec.Operation, bool) { - for method, pathItem := range s.operations { - for path, op := range pathItem { - if operationID == op.ID { - return method, path, op, true - } - } - } - return "", "", nil, false -} - -// OperationFor the given method and path -func (s *Spec) OperationFor(method, path string) (*spec.Operation, bool) { - if mp, ok := s.operations[strings.ToUpper(method)]; ok { - op, fn := mp[path] - return op, fn - } - return nil, false -} - -// Operations gathers all the operations specified in the spec document -func (s *Spec) Operations() map[string]map[string]*spec.Operation { - return s.operations -} - -func (s *Spec) structMapKeys(mp map[string]struct{}) []string { - if len(mp) == 0 { - return nil - } - - result := make([]string, 0, len(mp)) - for k := range mp { - result = append(result, k) - } - return result -} - -// AllPaths returns all the paths in the swagger spec -func (s *Spec) AllPaths() map[string]spec.PathItem { - if s.spec == nil || s.spec.Paths == nil { - return nil - } - return s.spec.Paths.Paths -} - -// OperationIDs gets all the operation ids based on method an dpath -func (s *Spec) OperationIDs() []string { - if len(s.operations) == 0 { - return nil - } - result := make([]string, 0, len(s.operations)) - for method, v := range s.operations { - for p, o := range v { - if o.ID != "" { - result = append(result, o.ID) - } else { - result = append(result, fmt.Sprintf("%s %s", strings.ToUpper(method), p)) - } - } - } - return result -} - -// OperationMethodPaths gets all the operation ids based on method an dpath -func (s *Spec) OperationMethodPaths() []string { - if len(s.operations) == 0 { - return nil - } - result := make([]string, 0, len(s.operations)) - for method, v := range s.operations { - for p := range v { - result = append(result, fmt.Sprintf("%s %s", strings.ToUpper(method), p)) - } - } - return result -} - -// RequiredConsumes gets all the distinct consumes that are specified in the specification document -func (s *Spec) RequiredConsumes() []string { - return s.structMapKeys(s.consumes) -} - -// RequiredProduces gets all the distinct produces that are specified in the specification document -func (s *Spec) RequiredProduces() []string { - return s.structMapKeys(s.produces) -} - -// RequiredSecuritySchemes gets all the distinct security schemes that are specified in the swagger spec -func (s *Spec) RequiredSecuritySchemes() []string { - return s.structMapKeys(s.authSchemes) -} - -// SchemaRef is a reference to a schema -type SchemaRef struct { - Name string - Ref spec.Ref - Schema *spec.Schema - TopLevel bool -} - -// SchemasWithAllOf returns schema references to all schemas that are defined -// with an allOf key -func (s *Spec) SchemasWithAllOf() (result []SchemaRef) { - for _, v := range s.allOfs { - result = append(result, v) - } - return -} - -// AllDefinitions returns schema references for all the definitions that were discovered -func (s *Spec) AllDefinitions() (result []SchemaRef) { - for _, v := range s.allSchemas { - result = append(result, v) - } - return -} - -// AllDefinitionReferences returns json refs for all the discovered schemas -func (s *Spec) AllDefinitionReferences() (result []string) { - for _, v := range s.references.schemas { - result = append(result, v.String()) - } - return -} - -// AllParameterReferences returns json refs for all the discovered parameters -func (s *Spec) AllParameterReferences() (result []string) { - for _, v := range s.references.parameters { - result = append(result, v.String()) - } - return -} - -// AllResponseReferences returns json refs for all the discovered responses -func (s *Spec) AllResponseReferences() (result []string) { - for _, v := range s.references.responses { - result = append(result, v.String()) - } - return -} - -// AllPathItemReferences returns the references for all the items -func (s *Spec) AllPathItemReferences() (result []string) { - for _, v := range s.references.pathItems { - result = append(result, v.String()) - } - return -} - -// AllItemsReferences returns the references for all the items in simple schemas (parameters or headers). -// -// NOTE: since Swagger 2.0 forbids $ref in simple params, this should always yield an empty slice for a valid -// Swagger 2.0 spec. -func (s *Spec) AllItemsReferences() (result []string) { - for _, v := range s.references.items { - result = append(result, v.String()) - } - return -} - -// AllReferences returns all the references found in the document, with possible duplicates -func (s *Spec) AllReferences() (result []string) { - for _, v := range s.references.allRefs { - result = append(result, v.String()) - } - return -} - -// AllRefs returns all the unique references found in the document -func (s *Spec) AllRefs() (result []spec.Ref) { - set := make(map[string]struct{}) - for _, v := range s.references.allRefs { - a := v.String() - if a == "" { - continue - } - if _, ok := set[a]; !ok { - set[a] = struct{}{} - result = append(result, v) - } - } - return -} - -func cloneStringMap(source map[string]string) map[string]string { - res := make(map[string]string, len(source)) - for k, v := range source { - res[k] = v - } - return res -} - -func cloneEnumMap(source map[string][]interface{}) map[string][]interface{} { - res := make(map[string][]interface{}, len(source)) - for k, v := range source { - res[k] = v - } - return res -} - -// ParameterPatterns returns all the patterns found in parameters -// the map is cloned to avoid accidental changes -func (s *Spec) ParameterPatterns() map[string]string { - return cloneStringMap(s.patterns.parameters) -} - -// HeaderPatterns returns all the patterns found in response headers -// the map is cloned to avoid accidental changes -func (s *Spec) HeaderPatterns() map[string]string { - return cloneStringMap(s.patterns.headers) -} - -// ItemsPatterns returns all the patterns found in simple array items -// the map is cloned to avoid accidental changes -func (s *Spec) ItemsPatterns() map[string]string { - return cloneStringMap(s.patterns.items) -} - -// SchemaPatterns returns all the patterns found in schemas -// the map is cloned to avoid accidental changes -func (s *Spec) SchemaPatterns() map[string]string { - return cloneStringMap(s.patterns.schemas) -} - -// AllPatterns returns all the patterns found in the spec -// the map is cloned to avoid accidental changes -func (s *Spec) AllPatterns() map[string]string { - return cloneStringMap(s.patterns.allPatterns) -} - -// ParameterEnums returns all the enums found in parameters -// the map is cloned to avoid accidental changes -func (s *Spec) ParameterEnums() map[string][]interface{} { - return cloneEnumMap(s.enums.parameters) -} - -// HeaderEnums returns all the enums found in response headers -// the map is cloned to avoid accidental changes -func (s *Spec) HeaderEnums() map[string][]interface{} { - return cloneEnumMap(s.enums.headers) -} - -// ItemsEnums returns all the enums found in simple array items -// the map is cloned to avoid accidental changes -func (s *Spec) ItemsEnums() map[string][]interface{} { - return cloneEnumMap(s.enums.items) -} - -// SchemaEnums returns all the enums found in schemas -// the map is cloned to avoid accidental changes -func (s *Spec) SchemaEnums() map[string][]interface{} { - return cloneEnumMap(s.enums.schemas) -} - -// AllEnums returns all the enums found in the spec -// the map is cloned to avoid accidental changes -func (s *Spec) AllEnums() map[string][]interface{} { - return cloneEnumMap(s.enums.allEnums) -} diff --git a/vendor/github.com/go-openapi/analysis/appveyor.yml b/vendor/github.com/go-openapi/analysis/appveyor.yml deleted file mode 100644 index 3239d74416..0000000000 --- a/vendor/github.com/go-openapi/analysis/appveyor.yml +++ /dev/null @@ -1,33 +0,0 @@ -version: "0.1.{build}" - -clone_folder: C:\go-openapi\analysis -shallow_clone: true # for startup speed -pull_requests: - do_not_increment_build_number: true - -#skip_tags: true -#skip_branch_with_pr: true - -# appveyor.yml -build: off - -environment: - GOPATH: c:\gopath - -stack: go 1.12 - -test_script: - - go test -v -timeout 20m ./... -#artifacts: -# - path: '%GOPATH%\bin\*.exe' -deploy: off - -notifications: - - provider: Slack - incoming_webhook: https://hooks.slack.com/services/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 - auth_token: - secure: Sf7kZf7ZGbnwWUMpffHwMu5A0cHkLK2MYY32LNTPj4+/3qC3Ghl7+9v4TSLOqOlCwdRNjOGblAq7s+GDJed6/xgRQl1JtCi1klzZNrYX4q01pgTPvvGcwbBkIYgeMaPeIRcK9OZnud7sRXdttozgTOpytps2U6Js32ip7uj5mHSg2ub0FwoSJwlS6dbezZ8+eDhoha0F/guY99BEwx8Bd+zROrT2TFGsSGOFGN6wFc7moCqTHO/YkWib13a2QNXqOxCCVBy/lt76Wp+JkeFppjHlzs/2lP3EAk13RIUAaesdEUHvIHrzCyNJEd3/+KO2DzsWOYfpktd+KBCvgaYOsoo7ubdT3IROeAegZdCgo/6xgCEsmFc9ZcqCfN5yNx2A+BZ2Vwmpws+bQ1E1+B5HDzzaiLcYfG4X2O210QVGVDLWsv1jqD+uPYeHY2WRfh5ZsIUFvaqgUEnwHwrK44/8REAhQavt1QAj5uJpsRd7CkRVPWRNK+yIky+wgbVUFEchRNmS55E7QWf+W4+4QZkQi7vUTMc9nbTUu2Es9NfvfudOpM2wZbn98fjpb/qq/nRv6Bk+ca+7XD5/IgNLMbWp2ouDdzbiHLCOfDUiHiDJhLfFZx9Bwo7ZwfzeOlbrQX66bx7xRKYmOe4DLrXhNcpbsMa8qbfxlZRCmYbubB/Y8h4= - channel: bots - on_build_success: false - on_build_failure: true - on_build_status_changed: true diff --git a/vendor/github.com/go-openapi/analysis/debug.go b/vendor/github.com/go-openapi/analysis/debug.go deleted file mode 100644 index 84cc4e54cb..0000000000 --- a/vendor/github.com/go-openapi/analysis/debug.go +++ /dev/null @@ -1,47 +0,0 @@ -// 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 analysis - -import ( - "fmt" - "log" - "os" - "path/filepath" - "runtime" -) - -var ( - // Debug is true when the SWAGGER_DEBUG env var is not empty. - // It enables a more verbose logging of the spec analyzer. - Debug = os.Getenv("SWAGGER_DEBUG") != "" - // analysisLogger is a debug logger for this package - analysisLogger *log.Logger -) - -func init() { - debugOptions() -} - -func debugOptions() { - analysisLogger = log.New(os.Stdout, "analysis:", log.LstdFlags) -} - -func debugLog(msg string, args ...interface{}) { - // A private, trivial trace logger, based on go-openapi/spec/expander.go:debugLog() - if Debug { - _, file1, pos1, _ := runtime.Caller(1) - analysisLogger.Printf("%s:%d: %s", filepath.Base(file1), pos1, fmt.Sprintf(msg, args...)) - } -} diff --git a/vendor/github.com/go-openapi/analysis/doc.go b/vendor/github.com/go-openapi/analysis/doc.go deleted file mode 100644 index d5294c0950..0000000000 --- a/vendor/github.com/go-openapi/analysis/doc.go +++ /dev/null @@ -1,43 +0,0 @@ -// 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 analysis provides methods to work with a Swagger specification document from -package go-openapi/spec. - -Analyzing a specification - -An analysed specification object (type Spec) provides methods to work with swagger definition. - -Flattening or expanding a specification - -Flattening a specification bundles all remote $ref in the main spec document. -Depending on flattening options, additional preprocessing may take place: - - full flattening: replacing all inline complex constructs by a named entry in #/definitions - - expand: replace all $ref's in the document by their expanded content - -Merging several specifications - -Mixin several specifications merges all Swagger constructs, and warns about found conflicts. - -Fixing a specification - -Unmarshalling a specification with golang json unmarshalling may lead to -some unwanted result on present but empty fields. - -Analyzing a Swagger schema - -Swagger schemas are analyzed to determine their complexity and qualify their content. -*/ -package analysis diff --git a/vendor/github.com/go-openapi/analysis/fixer.go b/vendor/github.com/go-openapi/analysis/fixer.go deleted file mode 100644 index bfe014ca51..0000000000 --- a/vendor/github.com/go-openapi/analysis/fixer.go +++ /dev/null @@ -1,76 +0,0 @@ -// 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 analysis - -import "github.com/go-openapi/spec" - -// FixEmptyResponseDescriptions replaces empty ("") response -// descriptions in the input with "(empty)" to ensure that the -// resulting Swagger is stays valid. The problem appears to arise -// from reading in valid specs that have a explicit response -// description of "" (valid, response.description is required), but -// due to zero values being omitted upon re-serializing (omitempty) we -// lose them unless we stick some chars in there. -func FixEmptyResponseDescriptions(s *spec.Swagger) { - if s.Paths != nil { - for _, v := range s.Paths.Paths { - if v.Get != nil { - FixEmptyDescs(v.Get.Responses) - } - if v.Put != nil { - FixEmptyDescs(v.Put.Responses) - } - if v.Post != nil { - FixEmptyDescs(v.Post.Responses) - } - if v.Delete != nil { - FixEmptyDescs(v.Delete.Responses) - } - if v.Options != nil { - FixEmptyDescs(v.Options.Responses) - } - if v.Head != nil { - FixEmptyDescs(v.Head.Responses) - } - if v.Patch != nil { - FixEmptyDescs(v.Patch.Responses) - } - } - } - for k, v := range s.Responses { - FixEmptyDesc(&v) - s.Responses[k] = v - } -} - -// FixEmptyDescs adds "(empty)" as the description for any Response in -// the given Responses object that doesn't already have one. -func FixEmptyDescs(rs *spec.Responses) { - FixEmptyDesc(rs.Default) - for k, v := range rs.StatusCodeResponses { - FixEmptyDesc(&v) - rs.StatusCodeResponses[k] = v - } -} - -// FixEmptyDesc adds "(empty)" as the description to the given -// Response object if it doesn't already have one and isn't a -// ref. No-op on nil input. -func FixEmptyDesc(rs *spec.Response) { - if rs == nil || rs.Description != "" || rs.Ref.Ref.GetURL() != nil { - return - } - rs.Description = "(empty)" -} diff --git a/vendor/github.com/go-openapi/analysis/flatten.go b/vendor/github.com/go-openapi/analysis/flatten.go deleted file mode 100644 index ae1eef5d19..0000000000 --- a/vendor/github.com/go-openapi/analysis/flatten.go +++ /dev/null @@ -1,1732 +0,0 @@ -// 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 analysis - -import ( - "fmt" - "log" - "net/http" - "net/url" - "os" - slashpath "path" - "path/filepath" - "sort" - "strings" - - "strconv" - - "github.com/go-openapi/analysis/internal" - "github.com/go-openapi/jsonpointer" - swspec "github.com/go-openapi/spec" - "github.com/go-openapi/swag" -) - -// FlattenOpts configuration for flattening a swagger specification. -type FlattenOpts struct { - Spec *Spec // The analyzed spec to work with - flattenContext *context // Internal context to track flattening activity - - BasePath string - - // Flattening options - Expand bool // If Expand is true, we skip flattening the spec and expand it instead - Minimal bool - Verbose bool - RemoveUnused bool - - /* Extra keys */ - _ struct{} // require keys -} - -// ExpandOpts creates a spec.ExpandOptions to configure expanding a specification document. -func (f *FlattenOpts) ExpandOpts(skipSchemas bool) *swspec.ExpandOptions { - return &swspec.ExpandOptions{RelativeBase: f.BasePath, SkipSchemas: skipSchemas} -} - -// Swagger gets the swagger specification for this flatten operation -func (f *FlattenOpts) Swagger() *swspec.Swagger { - return f.Spec.spec -} - -// newRef stores information about refs created during the flattening process -type newRef struct { - key string - newName string - path string - isOAIGen bool - resolved bool - schema *swspec.Schema - parents []string -} - -// context stores intermediary results from flatten -type context struct { - newRefs map[string]*newRef - warnings []string - resolved map[string]string -} - -func newContext() *context { - return &context{ - newRefs: make(map[string]*newRef, 150), - warnings: make([]string, 0), - resolved: make(map[string]string, 50), - } -} - -// Flatten an analyzed spec and produce a self-contained spec bundle. -// -// There is a minimal and a full flattening mode. -// -// Minimally flattening a spec means: -// - Expanding parameters, responses, path items, parameter items and header items (references to schemas are left -// unscathed) -// - Importing external (http, file) references so they become internal to the document -// - Moving every JSON pointer to a $ref to a named definition (i.e. the reworked spec does not contain pointers -// like "$ref": "#/definitions/myObject/allOfs/1") -// -// A minimally flattened spec thus guarantees the following properties: -// - all $refs point to a local definition (i.e. '#/definitions/...') -// - definitions are unique -// -// NOTE: arbitrary JSON pointers (other than $refs to top level definitions) are rewritten as definitions if they -// represent a complex schema or express commonality in the spec. -// Otherwise, they are simply expanded. -// -// Minimal flattening is necessary and sufficient for codegen rendering using go-swagger. -// -// Fully flattening a spec means: -// - Moving every complex inline schema to be a definition with an auto-generated name in a depth-first fashion. -// -// By complex, we mean every JSON object with some properties. -// Arrays, when they do not define a tuple, -// or empty objects with or without additionalProperties, are not considered complex and remain inline. -// -// NOTE: rewritten schemas get a vendor extension x-go-gen-location so we know from which part of the spec definitions -// have been created. -// -// Available flattening options: -// - Minimal: stops flattening after minimal $ref processing, leaving schema constructs untouched -// - Expand: expand all $ref's in the document (inoperant if Minimal set to true) -// - Verbose: croaks about name conflicts detected -// - RemoveUnused: removes unused parameters, responses and definitions after expansion/flattening -// -// NOTE: expansion removes all $ref save circular $ref, which remain in place -// -// TODO: additional options -// - ProgagateNameExtensions: ensure that created entries properly follow naming rules when their parent have set a -// x-go-name extension -// - LiftAllOfs: -// - limit the flattening of allOf members when simple objects -// - merge allOf with validation only -// - merge allOf with extensions only -// - ... -// -func Flatten(opts FlattenOpts) error { - // Make sure opts.BasePath is an absolute path - if !filepath.IsAbs(opts.BasePath) { - cwd, _ := os.Getwd() - opts.BasePath = filepath.Join(cwd, opts.BasePath) - } - // make sure drive letter on windows is normalized to lower case - u, _ := url.Parse(opts.BasePath) - opts.BasePath = u.String() - - opts.flattenContext = newContext() - - // recursively expand responses, parameters, path items and items in simple schemas. - // This simplifies the spec and leaves $ref only into schema objects. - if err := swspec.ExpandSpec(opts.Swagger(), opts.ExpandOpts(!opts.Expand)); err != nil { - return err - } - - // strip current file from $ref's, so we can recognize them as proper definitions - // In particular, this works around for issue go-openapi/spec#76: leading absolute file in $ref is stripped - if err := normalizeRef(&opts); err != nil { - return err - } - - if opts.RemoveUnused { - // optionally removes shared parameters and responses already expanded (now unused) - // default parameters (i.e. under paths) remain. - opts.Swagger().Parameters = nil - opts.Swagger().Responses = nil - } - - opts.Spec.reload() // re-analyze - - // at this point there are no references left but in schemas - - for imported := false; !imported; { - // iteratively import remote references until none left. - // This inlining deals with name conflicts by introducing auto-generated names ("OAIGen") - var err error - if imported, err = importExternalReferences(&opts); err != nil { - return err - } - opts.Spec.reload() // re-analyze - } - - if !opts.Minimal && !opts.Expand { - // full flattening: rewrite inline schemas (schemas that aren't simple types or arrays or maps) - if err := nameInlinedSchemas(&opts); err != nil { - return err - } - - opts.Spec.reload() // re-analyze - } - - // rewrite JSON pointers other than $ref to named definitions - // and attempt to resolve conflicting names whenever possible. - if err := stripPointersAndOAIGen(&opts); err != nil { - return err - } - - if opts.RemoveUnused { - // remove unused definitions - expected := make(map[string]struct{}) - for k := range opts.Swagger().Definitions { - expected[slashpath.Join(definitionsPath, jsonpointer.Escape(k))] = struct{}{} - } - for _, k := range opts.Spec.AllDefinitionReferences() { - delete(expected, k) - } - for k := range expected { - debugLog("removing unused definition %s", slashpath.Base(k)) - if opts.Verbose { - log.Printf("info: removing unused definition: %s", slashpath.Base(k)) - } - delete(opts.Swagger().Definitions, slashpath.Base(k)) - } - opts.Spec.reload() // re-analyze - } - - // TODO: simplify known schema patterns to flat objects with properties - // examples: - // - lift simple allOf object, - // - empty allOf with validation only or extensions only - // - rework allOf arrays - // - rework allOf additionalProperties - - if opts.Verbose { - // issue notifications - croak(&opts) - } - return nil -} - -// isAnalyzedAsComplex determines if an analyzed schema is eligible to flattening (i.e. it is "complex"). -// -// Complex means the schema is any of: -// - a simple type (primitive) -// - an array of something (items are possibly complex ; if this is the case, items will generate a definition) -// - a map of something (additionalProperties are possibly complex ; if this is the case, additionalProperties will -// generate a definition) -func isAnalyzedAsComplex(asch *AnalyzedSchema) bool { - if !asch.IsSimpleSchema && !asch.IsArray && !asch.IsMap { - return true - } - return false -} - -// nameInlinedSchemas replaces every complex inline construct by a named definition. -func nameInlinedSchemas(opts *FlattenOpts) error { - debugLog("nameInlinedSchemas") - namer := &inlineSchemaNamer{ - Spec: opts.Swagger(), - Operations: opRefsByRef(gatherOperations(opts.Spec, nil)), - flattenContext: opts.flattenContext, - opts: opts, - } - depthFirst := sortDepthFirst(opts.Spec.allSchemas) - for _, key := range depthFirst { - sch := opts.Spec.allSchemas[key] - if sch.Schema != nil && sch.Schema.Ref.String() == "" && !sch.TopLevel { // inline schema - asch, err := Schema(SchemaOpts{Schema: sch.Schema, Root: opts.Swagger(), BasePath: opts.BasePath}) - if err != nil { - return fmt.Errorf("schema analysis [%s]: %v", key, err) - } - - if isAnalyzedAsComplex(asch) { // move complex schemas to definitions - if err := namer.Name(key, sch.Schema, asch); err != nil { - return err - } - } - } - } - return nil -} - -var depthGroupOrder = []string{ - "sharedParam", "sharedResponse", "sharedOpParam", "opParam", "codeResponse", "defaultResponse", "definition", -} - -func sortDepthFirst(data map[string]SchemaRef) []string { - // group by category (shared params, op param, statuscode response, default response, definitions) - // sort groups internally by number of parts in the key and lexical names - // flatten groups into a single list of keys - sorted := make([]string, 0, len(data)) - grouped := make(map[string]keys, len(data)) - for k := range data { - split := keyParts(k) - var pk string - if split.IsSharedOperationParam() { - pk = "sharedOpParam" - } - if split.IsOperationParam() { - pk = "opParam" - } - if split.IsStatusCodeResponse() { - pk = "codeResponse" - } - if split.IsDefaultResponse() { - pk = "defaultResponse" - } - if split.IsDefinition() { - pk = "definition" - } - if split.IsSharedParam() { - pk = "sharedParam" - } - if split.IsSharedResponse() { - pk = "sharedResponse" - } - grouped[pk] = append(grouped[pk], key{Segments: len(split), Key: k}) - } - - for _, pk := range depthGroupOrder { - res := grouped[pk] - sort.Sort(res) - for _, v := range res { - sorted = append(sorted, v.Key) - } - } - return sorted -} - -type key struct { - Segments int - Key string -} -type keys []key - -func (k keys) Len() int { return len(k) } -func (k keys) Swap(i, j int) { k[i], k[j] = k[j], k[i] } -func (k keys) Less(i, j int) bool { - return k[i].Segments > k[j].Segments || (k[i].Segments == k[j].Segments && k[i].Key < k[j].Key) -} - -type inlineSchemaNamer struct { - Spec *swspec.Swagger - Operations map[string]opRef - flattenContext *context - opts *FlattenOpts -} - -func opRefsByRef(oprefs map[string]opRef) map[string]opRef { - result := make(map[string]opRef, len(oprefs)) - for _, v := range oprefs { - result[v.Ref.String()] = v - } - return result -} - -func (isn *inlineSchemaNamer) Name(key string, schema *swspec.Schema, aschema *AnalyzedSchema) error { - debugLog("naming inlined schema at %s", key) - - parts := keyParts(key) - for _, name := range namesFromKey(parts, aschema, isn.Operations) { - if name != "" { - // create unique name - newName, isOAIGen := uniqifyName(isn.Spec.Definitions, swag.ToJSONName(name)) - - // clone schema - sch, err := cloneSchema(schema) - if err != nil { - return err - } - - // replace values on schema - if err := rewriteSchemaToRef(isn.Spec, key, - swspec.MustCreateRef(slashpath.Join(definitionsPath, newName))); err != nil { - return fmt.Errorf("error while creating definition %q from inline schema: %v", newName, err) - } - - // rewrite any dependent $ref pointing to this place, - // when not already pointing to a top-level definition. - // - // NOTE: this is important if such referers use arbitrary JSON pointers. - an := New(isn.Spec) - for k, v := range an.references.allRefs { - r, _, erd := deepestRef(isn.opts, v) - if erd != nil { - return fmt.Errorf("at %s, %v", k, erd) - } - if r.String() == key || - r.String() == slashpath.Join(definitionsPath, newName) && - slashpath.Dir(v.String()) != definitionsPath { - debugLog("found a $ref to a rewritten schema: %s points to %s", k, v.String()) - - // rewrite $ref to the new target - if err := updateRef(isn.Spec, k, - swspec.MustCreateRef(slashpath.Join(definitionsPath, newName))); err != nil { - return err - } - } - } - - // NOTE: this extension is currently not used by go-swagger (provided for information only) - sch.AddExtension("x-go-gen-location", genLocation(parts)) - - // save cloned schema to definitions - saveSchema(isn.Spec, newName, sch) - - // keep track of created refs - if isn.flattenContext != nil { - debugLog("track created ref: key=%s, newName=%s, isOAIGen=%t", key, newName, isOAIGen) - resolved := false - if _, ok := isn.flattenContext.newRefs[key]; ok { - resolved = isn.flattenContext.newRefs[key].resolved - } - isn.flattenContext.newRefs[key] = &newRef{ - key: key, - newName: newName, - path: slashpath.Join(definitionsPath, newName), - isOAIGen: isOAIGen, - resolved: resolved, - schema: sch, - } - } - } - } - return nil -} - -// genLocation indicates from which section of the specification (models or operations) a definition has been created. -// -// This is reflected in the output spec with a "x-go-gen-location" extension. At the moment, this is is provided -// for information only. -func genLocation(parts splitKey) string { - if parts.IsOperation() { - return "operations" - } - if parts.IsDefinition() { - return "models" - } - return "" -} - -// uniqifyName yields a unique name for a definition -func uniqifyName(definitions swspec.Definitions, name string) (string, bool) { - isOAIGen := false - if name == "" { - name = "oaiGen" - isOAIGen = true - } - if len(definitions) == 0 { - return name, isOAIGen - } - - unq := true - for k := range definitions { - if strings.EqualFold(k, name) { - unq = false - break - } - } - - if unq { - return name, isOAIGen - } - - name += "OAIGen" - isOAIGen = true - var idx int - unique := name - _, known := definitions[unique] - for known { - idx++ - unique = fmt.Sprintf("%s%d", name, idx) - _, known = definitions[unique] - } - return unique, isOAIGen -} - -func namesFromKey(parts splitKey, aschema *AnalyzedSchema, operations map[string]opRef) []string { - var baseNames [][]string - var startIndex int - if parts.IsOperation() { - // params - if parts.IsOperationParam() || parts.IsSharedOperationParam() { - piref := parts.PathItemRef() - if piref.String() != "" && parts.IsOperationParam() { - if op, ok := operations[piref.String()]; ok { - startIndex = 5 - baseNames = append(baseNames, []string{op.ID, "params", "body"}) - } - } else if parts.IsSharedOperationParam() { - pref := parts.PathRef() - for k, v := range operations { - if strings.HasPrefix(k, pref.String()) { - startIndex = 4 - baseNames = append(baseNames, []string{v.ID, "params", "body"}) - } - } - } - } - // responses - if parts.IsOperationResponse() { - piref := parts.PathItemRef() - if piref.String() != "" { - if op, ok := operations[piref.String()]; ok { - startIndex = 6 - baseNames = append(baseNames, []string{op.ID, parts.ResponseName(), "body"}) - } - } - } - } - - // definitions - if parts.IsDefinition() { - nm := parts.DefinitionName() - if nm != "" { - startIndex = 2 - baseNames = append(baseNames, []string{parts.DefinitionName()}) - } - } - - var result []string - for _, segments := range baseNames { - nm := parts.BuildName(segments, startIndex, aschema) - if nm != "" { - result = append(result, nm) - } - } - sort.Strings(result) - return result -} - -const ( - paths = "paths" - responses = "responses" - parameters = "parameters" - definitions = "definitions" - definitionsPath = "#/definitions" -) - -var ( - ignoredKeys map[string]struct{} - validMethods map[string]struct{} -) - -func init() { - ignoredKeys = map[string]struct{}{ - "schema": {}, - "properties": {}, - "not": {}, - "anyOf": {}, - "oneOf": {}, - } - - validMethods = map[string]struct{}{ - "GET": {}, - "HEAD": {}, - "OPTIONS": {}, - "PATCH": {}, - "POST": {}, - "PUT": {}, - "DELETE": {}, - } -} - -type splitKey []string - -func (s splitKey) IsDefinition() bool { - return len(s) > 1 && s[0] == definitions -} - -func (s splitKey) DefinitionName() string { - if !s.IsDefinition() { - return "" - } - return s[1] -} - -func (s splitKey) isKeyName(i int) bool { - if i <= 0 { - return false - } - count := 0 - for idx := i - 1; idx > 0; idx-- { - if s[idx] != "properties" { - break - } - count++ - } - - return count%2 != 0 -} - -func (s splitKey) BuildName(segments []string, startIndex int, aschema *AnalyzedSchema) string { - for i, part := range s[startIndex:] { - if _, ignored := ignoredKeys[part]; !ignored || s.isKeyName(startIndex+i) { - if part == "items" || part == "additionalItems" { - if aschema.IsTuple || aschema.IsTupleWithExtra { - segments = append(segments, "tuple") - } else { - segments = append(segments, "items") - } - if part == "additionalItems" { - segments = append(segments, part) - } - continue - } - segments = append(segments, part) - } - } - return strings.Join(segments, " ") -} - -func (s splitKey) IsOperation() bool { - return len(s) > 1 && s[0] == paths -} - -func (s splitKey) IsSharedOperationParam() bool { - return len(s) > 2 && s[0] == paths && s[2] == parameters -} - -func (s splitKey) IsSharedParam() bool { - return len(s) > 1 && s[0] == parameters -} - -func (s splitKey) IsOperationParam() bool { - return len(s) > 3 && s[0] == paths && s[3] == parameters -} - -func (s splitKey) IsOperationResponse() bool { - return len(s) > 3 && s[0] == paths && s[3] == responses -} - -func (s splitKey) IsSharedResponse() bool { - return len(s) > 1 && s[0] == responses -} - -func (s splitKey) IsDefaultResponse() bool { - return len(s) > 4 && s[0] == paths && s[3] == responses && s[4] == "default" -} - -func (s splitKey) IsStatusCodeResponse() bool { - isInt := func() bool { - _, err := strconv.Atoi(s[4]) - return err == nil - } - return len(s) > 4 && s[0] == paths && s[3] == responses && isInt() -} - -func (s splitKey) ResponseName() string { - if s.IsStatusCodeResponse() { - code, _ := strconv.Atoi(s[4]) - return http.StatusText(code) - } - if s.IsDefaultResponse() { - return "Default" - } - return "" -} - -func (s splitKey) PathItemRef() swspec.Ref { - if len(s) < 3 { - return swspec.Ref{} - } - pth, method := s[1], s[2] - if _, isValidMethod := validMethods[strings.ToUpper(method)]; !isValidMethod && !strings.HasPrefix(method, "x-") { - return swspec.Ref{} - } - return swspec.MustCreateRef("#" + slashpath.Join("/", paths, jsonpointer.Escape(pth), strings.ToUpper(method))) -} - -func (s splitKey) PathRef() swspec.Ref { - if !s.IsOperation() { - return swspec.Ref{} - } - return swspec.MustCreateRef("#" + slashpath.Join("/", paths, jsonpointer.Escape(s[1]))) -} - -func keyParts(key string) splitKey { - var res []string - for _, part := range strings.Split(key[1:], "/") { - if part != "" { - res = append(res, jsonpointer.Unescape(part)) - } - } - return res -} - -func rewriteSchemaToRef(spec *swspec.Swagger, key string, ref swspec.Ref) error { - debugLog("rewriting schema to ref for %s with %s", key, ref.String()) - _, value, err := getPointerFromKey(spec, key) - if err != nil { - return err - } - - switch refable := value.(type) { - case *swspec.Schema: - return rewriteParentRef(spec, key, ref) - - case swspec.Schema: - return rewriteParentRef(spec, key, ref) - - case *swspec.SchemaOrArray: - if refable.Schema != nil { - refable.Schema = &swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} - } - - case *swspec.SchemaOrBool: - if refable.Schema != nil { - refable.Schema = &swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} - } - default: - return fmt.Errorf("no schema with ref found at %s for %T", key, value) - } - - return nil -} - -func rewriteParentRef(spec *swspec.Swagger, key string, ref swspec.Ref) error { - parent, entry, pvalue, err := getParentFromKey(spec, key) - if err != nil { - return err - } - - debugLog("rewriting holder for %T", pvalue) - switch container := pvalue.(type) { - case swspec.Response: - if err := rewriteParentRef(spec, "#"+parent, ref); err != nil { - return err - } - - case *swspec.Response: - container.Schema = &swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} - - case *swspec.Responses: - statusCode, err := strconv.Atoi(entry) - if err != nil { - return fmt.Errorf("%s not a number: %v", key[1:], err) - } - resp := container.StatusCodeResponses[statusCode] - resp.Schema = &swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} - container.StatusCodeResponses[statusCode] = resp - - case map[string]swspec.Response: - resp := container[entry] - resp.Schema = &swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} - container[entry] = resp - - case swspec.Parameter: - if err := rewriteParentRef(spec, "#"+parent, ref); err != nil { - return err - } - - case map[string]swspec.Parameter: - param := container[entry] - param.Schema = &swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} - container[entry] = param - - case []swspec.Parameter: - idx, err := strconv.Atoi(entry) - if err != nil { - return fmt.Errorf("%s not a number: %v", key[1:], err) - } - param := container[idx] - param.Schema = &swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} - container[idx] = param - - case swspec.Definitions: - container[entry] = swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} - - case map[string]swspec.Schema: - container[entry] = swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} - - case []swspec.Schema: - idx, err := strconv.Atoi(entry) - if err != nil { - return fmt.Errorf("%s not a number: %v", key[1:], err) - } - container[idx] = swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} - - case *swspec.SchemaOrArray: - // NOTE: this is necessarily an array - otherwise, the parent would be *Schema - idx, err := strconv.Atoi(entry) - if err != nil { - return fmt.Errorf("%s not a number: %v", key[1:], err) - } - container.Schemas[idx] = swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} - - // NOTE: can't have case *swspec.SchemaOrBool = parent in this case is *Schema - - default: - return fmt.Errorf("unhandled parent schema rewrite %s (%T)", key, pvalue) - } - return nil -} - -func cloneSchema(schema *swspec.Schema) (*swspec.Schema, error) { - var sch swspec.Schema - if err := swag.FromDynamicJSON(schema, &sch); err != nil { - return nil, fmt.Errorf("cannot clone schema: %v", err) - } - return &sch, nil -} - -// importExternalReferences iteratively digs remote references and imports them into the main schema. -// -// At every iteration, new remotes may be found when digging deeper: they are rebased to the current schema before being imported. -// -// This returns true when no more remote references can be found. -func importExternalReferences(opts *FlattenOpts) (bool, error) { - debugLog("importExternalReferences") - - groupedRefs := reverseIndexForSchemaRefs(opts) - sortedRefStr := make([]string, 0, len(groupedRefs)) - if opts.flattenContext == nil { - opts.flattenContext = newContext() - } - - // sort $ref resolution to ensure deterministic name conflict resolution - for refStr := range groupedRefs { - sortedRefStr = append(sortedRefStr, refStr) - } - sort.Strings(sortedRefStr) - - complete := true - - for _, refStr := range sortedRefStr { - entry := groupedRefs[refStr] - if entry.Ref.HasFragmentOnly { - continue - } - complete = false - var isOAIGen bool - - newName := opts.flattenContext.resolved[refStr] - if newName != "" { - // rewrite ref with already resolved external ref (useful for cyclical refs): - // rewrite external refs to local ones - debugLog("resolving known ref [%s] to %s", refStr, newName) - for _, key := range entry.Keys { - if err := updateRef(opts.Swagger(), key, - swspec.MustCreateRef(slashpath.Join(definitionsPath, newName))); err != nil { - return false, err - } - } - } else { - // resolve schemas - debugLog("resolving schema from remote $ref [%s]", refStr) - sch, err := swspec.ResolveRefWithBase(opts.Swagger(), &entry.Ref, opts.ExpandOpts(false)) - if err != nil { - return false, fmt.Errorf("could not resolve schema: %v", err) - } - - // at this stage only $ref analysis matters - partialAnalyzer := &Spec{ - references: referenceAnalysis{}, - patterns: patternAnalysis{}, - enums: enumAnalysis{}, - } - partialAnalyzer.reset() - partialAnalyzer.analyzeSchema("", *sch, "/") - - // now rewrite those refs with rebase - for key, ref := range partialAnalyzer.references.allRefs { - if err := updateRef(sch, key, swspec.MustCreateRef(rebaseRef(entry.Ref.String(), ref.String()))); err != nil { - return false, fmt.Errorf("failed to rewrite ref for key %q at %s: %v", key, entry.Ref.String(), err) - } - } - - // generate a unique name - isOAIGen means that a naming conflict was resolved by changing the name - newName, isOAIGen = uniqifyName(opts.Swagger().Definitions, nameFromRef(entry.Ref)) - debugLog("new name for [%s]: %s - with name conflict:%t", - strings.Join(entry.Keys, ", "), newName, isOAIGen) - - opts.flattenContext.resolved[refStr] = newName - - // rewrite the external refs to local ones - for _, key := range entry.Keys { - if err := updateRef(opts.Swagger(), key, - swspec.MustCreateRef(slashpath.Join(definitionsPath, newName))); err != nil { - return false, err - } - - // keep track of created refs - resolved := false - if _, ok := opts.flattenContext.newRefs[key]; ok { - resolved = opts.flattenContext.newRefs[key].resolved - } - opts.flattenContext.newRefs[key] = &newRef{ - key: key, - newName: newName, - path: slashpath.Join(definitionsPath, newName), - isOAIGen: isOAIGen, - resolved: resolved, - schema: sch, - } - } - - // add the resolved schema to the definitions - saveSchema(opts.Swagger(), newName, sch) - } - } - // maintains ref index entries - for k := range opts.flattenContext.newRefs { - r := opts.flattenContext.newRefs[k] - - // update tracking with resolved schemas - if r.schema.Ref.String() != "" { - ref := swspec.MustCreateRef(r.path) - sch, err := swspec.ResolveRefWithBase(opts.Swagger(), &ref, opts.ExpandOpts(false)) - if err != nil { - return false, fmt.Errorf("could not resolve schema: %v", err) - } - r.schema = sch - } - // update tracking with renamed keys: got a cascade of refs - if r.path != k { - renamed := *r - renamed.key = r.path - opts.flattenContext.newRefs[renamed.path] = &renamed - - // indirect ref - r.newName = slashpath.Base(k) - r.schema = swspec.RefSchema(r.path) - r.path = k - r.isOAIGen = strings.Contains(k, "OAIGen") - } - } - - return complete, nil -} - -type refRevIdx struct { - Ref swspec.Ref - Keys []string -} - -// rebaseRef rebase a remote ref relative to a base ref. -// -// NOTE: does not support JSONschema ID for $ref (we assume we are working with swagger specs here). -// -// NOTE(windows): -// * refs are assumed to have been normalized with drive letter lower cased (from go-openapi/spec) -// * "/ in paths may appear as escape sequences -func rebaseRef(baseRef string, ref string) string { - debugLog("rebasing ref: %s onto %s", ref, baseRef) - baseRef, _ = url.PathUnescape(baseRef) - ref, _ = url.PathUnescape(ref) - if baseRef == "" || baseRef == "." || strings.HasPrefix(baseRef, "#") { - return ref - } - - parts := strings.Split(ref, "#") - - baseParts := strings.Split(baseRef, "#") - baseURL, _ := url.Parse(baseParts[0]) - if strings.HasPrefix(ref, "#") { - if baseURL.Host == "" { - return strings.Join([]string{baseParts[0], parts[1]}, "#") - } - return strings.Join([]string{baseParts[0], parts[1]}, "#") - } - - refURL, _ := url.Parse(parts[0]) - if refURL.Host != "" || filepath.IsAbs(parts[0]) { - // not rebasing an absolute path - return ref - } - - // there is a relative path - var basePath string - if baseURL.Host != "" { - // when there is a host, standard URI rules apply (with "/") - baseURL.Path = slashpath.Dir(baseURL.Path) - baseURL.Path = slashpath.Join(baseURL.Path, "/"+parts[0]) - return baseURL.String() - } - - // this is a local relative path - // basePart[0] and parts[0] are local filesystem directories/files - basePath = filepath.Dir(baseParts[0]) - relPath := filepath.Join(basePath, string(filepath.Separator)+parts[0]) - if len(parts) > 1 { - return strings.Join([]string{relPath, parts[1]}, "#") - } - return relPath -} - -// normalizePath renders absolute path on remote file refs -// -// NOTE(windows): -// * refs are assumed to have been normalized with drive letter lower cased (from go-openapi/spec) -// * "/ in paths may appear as escape sequences -func normalizePath(ref swspec.Ref, opts *FlattenOpts) (normalizedPath string) { - uri, _ := url.PathUnescape(ref.String()) - if ref.HasFragmentOnly || filepath.IsAbs(uri) { - normalizedPath = uri - return - } - - refURL, _ := url.Parse(uri) - if refURL.Host != "" { - normalizedPath = uri - return - } - - parts := strings.Split(uri, "#") - // BasePath, parts[0] are local filesystem directories, guaranteed to be absolute at this stage - parts[0] = filepath.Join(filepath.Dir(opts.BasePath), parts[0]) - normalizedPath = strings.Join(parts, "#") - return -} - -func reverseIndexForSchemaRefs(opts *FlattenOpts) map[string]refRevIdx { - collected := make(map[string]refRevIdx) - for key, schRef := range opts.Spec.references.schemas { - // normalize paths before sorting, - // so we get together keys in same external file - normalizedPath := normalizePath(schRef, opts) - if entry, ok := collected[normalizedPath]; ok { - entry.Keys = append(entry.Keys, key) - collected[normalizedPath] = entry - } else { - collected[normalizedPath] = refRevIdx{ - Ref: schRef, - Keys: []string{key}, - } - } - } - return collected -} - -func nameFromRef(ref swspec.Ref) string { - u := ref.GetURL() - if u.Fragment != "" { - return swag.ToJSONName(slashpath.Base(u.Fragment)) - } - if u.Path != "" { - bn := slashpath.Base(u.Path) - if bn != "" && bn != "/" { - ext := slashpath.Ext(bn) - if ext != "" { - return swag.ToJSONName(bn[:len(bn)-len(ext)]) - } - return swag.ToJSONName(bn) - } - } - return swag.ToJSONName(strings.Replace(u.Host, ".", " ", -1)) -} - -func saveSchema(spec *swspec.Swagger, name string, schema *swspec.Schema) { - if schema == nil { - return - } - if spec.Definitions == nil { - spec.Definitions = make(map[string]swspec.Schema, 150) - } - spec.Definitions[name] = *schema -} - -// getPointerFromKey retrieves the content of the JSON pointer "key" -func getPointerFromKey(spec interface{}, key string) (string, interface{}, error) { - switch spec.(type) { - case *swspec.Schema: - case *swspec.Swagger: - default: - panic("unexpected type used in getPointerFromKey") - } - if key == "#/" { - return "", spec, nil - } - // unescape chars in key, e.g. "{}" from path params - pth, _ := internal.PathUnescape(key[1:]) - ptr, err := jsonpointer.New(pth) - if err != nil { - return "", nil, err - } - - value, _, err := ptr.Get(spec) - if err != nil { - debugLog("error when getting key: %s with path: %s", key, pth) - return "", nil, err - } - return pth, value, nil -} - -// getParentFromKey retrieves the container of the JSON pointer "key" -func getParentFromKey(spec interface{}, key string) (string, string, interface{}, error) { - switch spec.(type) { - case *swspec.Schema: - case *swspec.Swagger: - default: - panic("unexpected type used in getPointerFromKey") - } - // unescape chars in key, e.g. "{}" from path params - pth, _ := internal.PathUnescape(key[1:]) - - parent, entry := slashpath.Dir(pth), slashpath.Base(pth) - debugLog("getting schema holder at: %s, with entry: %s", parent, entry) - - pptr, err := jsonpointer.New(parent) - if err != nil { - return "", "", nil, err - } - pvalue, _, err := pptr.Get(spec) - if err != nil { - return "", "", nil, fmt.Errorf("can't get parent for %s: %v", parent, err) - } - return parent, entry, pvalue, nil -} - -// updateRef replaces a ref by another one -func updateRef(spec interface{}, key string, ref swspec.Ref) error { - switch spec.(type) { - case *swspec.Schema: - case *swspec.Swagger: - default: - panic("unexpected type used in getPointerFromKey") - } - debugLog("updating ref for %s with %s", key, ref.String()) - pth, value, err := getPointerFromKey(spec, key) - if err != nil { - return err - } - - switch refable := value.(type) { - case *swspec.Schema: - refable.Ref = ref - case *swspec.SchemaOrArray: - if refable.Schema != nil { - refable.Schema.Ref = ref - } - case *swspec.SchemaOrBool: - if refable.Schema != nil { - refable.Schema.Ref = ref - } - case swspec.Schema: - debugLog("rewriting holder for %T", refable) - _, entry, pvalue, erp := getParentFromKey(spec, key) - if erp != nil { - return err - } - switch container := pvalue.(type) { - case swspec.Definitions: - container[entry] = swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} - - case map[string]swspec.Schema: - container[entry] = swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} - - case []swspec.Schema: - idx, err := strconv.Atoi(entry) - if err != nil { - return fmt.Errorf("%s not a number: %v", pth, err) - } - container[idx] = swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} - - case *swspec.SchemaOrArray: - // NOTE: this is necessarily an array - otherwise, the parent would be *Schema - idx, err := strconv.Atoi(entry) - if err != nil { - return fmt.Errorf("%s not a number: %v", pth, err) - } - container.Schemas[idx] = swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} - - // NOTE: can't have case *swspec.SchemaOrBool = parent in this case is *Schema - - default: - return fmt.Errorf("unhandled container type at %s: %T", key, value) - } - - default: - return fmt.Errorf("no schema with ref found at %s for %T", key, value) - } - - return nil -} - -// updateRefWithSchema replaces a ref with a schema (i.e. re-inline schema) -func updateRefWithSchema(spec *swspec.Swagger, key string, sch *swspec.Schema) error { - debugLog("updating ref for %s with schema", key) - pth, value, err := getPointerFromKey(spec, key) - if err != nil { - return err - } - - switch refable := value.(type) { - case *swspec.Schema: - *refable = *sch - case swspec.Schema: - _, entry, pvalue, erp := getParentFromKey(spec, key) - if erp != nil { - return err - } - switch container := pvalue.(type) { - case swspec.Definitions: - container[entry] = *sch - - case map[string]swspec.Schema: - container[entry] = *sch - - case []swspec.Schema: - idx, err := strconv.Atoi(entry) - if err != nil { - return fmt.Errorf("%s not a number: %v", pth, err) - } - container[idx] = *sch - - case *swspec.SchemaOrArray: - // NOTE: this is necessarily an array - otherwise, the parent would be *Schema - idx, err := strconv.Atoi(entry) - if err != nil { - return fmt.Errorf("%s not a number: %v", pth, err) - } - container.Schemas[idx] = *sch - - // NOTE: can't have case *swspec.SchemaOrBool = parent in this case is *Schema - - default: - return fmt.Errorf("unhandled type for parent of [%s]: %T", key, value) - } - case *swspec.SchemaOrArray: - *refable.Schema = *sch - // NOTE: can't have case *swspec.SchemaOrBool = parent in this case is *Schema - case *swspec.SchemaOrBool: - *refable.Schema = *sch - default: - return fmt.Errorf("no schema with ref found at %s for %T", key, value) - } - - return nil -} - -func containsString(names []string, name string) bool { - for _, nm := range names { - if nm == name { - return true - } - } - return false -} - -type opRef struct { - Method string - Path string - Key string - ID string - Op *swspec.Operation - Ref swspec.Ref -} - -type opRefs []opRef - -func (o opRefs) Len() int { return len(o) } -func (o opRefs) Swap(i, j int) { o[i], o[j] = o[j], o[i] } -func (o opRefs) Less(i, j int) bool { return o[i].Key < o[j].Key } - -func gatherOperations(specDoc *Spec, operationIDs []string) map[string]opRef { - var oprefs opRefs - - for method, pathItem := range specDoc.Operations() { - for pth, operation := range pathItem { - vv := *operation - oprefs = append(oprefs, opRef{ - Key: swag.ToGoName(strings.ToLower(method) + " " + pth), - Method: method, - Path: pth, - ID: vv.ID, - Op: &vv, - Ref: swspec.MustCreateRef("#" + slashpath.Join("/paths", jsonpointer.Escape(pth), method)), - }) - } - } - - sort.Sort(oprefs) - - operations := make(map[string]opRef) - for _, opr := range oprefs { - nm := opr.ID - if nm == "" { - nm = opr.Key - } - - oo, found := operations[nm] - if found && oo.Method != opr.Method && oo.Path != opr.Path { - nm = opr.Key - } - if len(operationIDs) == 0 || containsString(operationIDs, opr.ID) || containsString(operationIDs, nm) { - opr.ID = nm - opr.Op.ID = nm - operations[nm] = opr - } - } - return operations -} - -// stripPointersAndOAIGen removes anonymous JSON pointers from spec and chain with name conflicts handler. -// This loops until the spec has no such pointer and all name conflicts have been reduced as much as possible. -func stripPointersAndOAIGen(opts *FlattenOpts) error { - // name all JSON pointers to anonymous documents - if err := namePointers(opts); err != nil { - return err - } - - // remove unnecessary OAIGen ref (created when flattening external refs creates name conflicts) - hasIntroducedPointerOrInline, ers := stripOAIGen(opts) - if ers != nil { - return ers - } - - // iterate as pointer or OAIGen resolution may introduce inline schemas or pointers - for hasIntroducedPointerOrInline { - if !opts.Minimal { - opts.Spec.reload() // re-analyze - if err := nameInlinedSchemas(opts); err != nil { - return err - } - } - - if err := namePointers(opts); err != nil { - return err - } - - // restrip - if hasIntroducedPointerOrInline, ers = stripOAIGen(opts); ers != nil { - return ers - } - - opts.Spec.reload() // re-analyze - } - return nil -} - -// stripOAIGen strips the spec from unnecessary OAIGen constructs, initially created to dedupe flattened definitions. -// -// A dedupe is deemed unnecessary whenever: -// - the only conflict is with its (single) parent: OAIGen is merged into its parent (reinlining) -// - there is a conflict with multiple parents: merge OAIGen in first parent, the rewrite other parents to point to -// the first parent. -// -// This function returns a true bool whenever it re-inlined a complex schema, so the caller may chose to iterate -// pointer and name resolution again. -func stripOAIGen(opts *FlattenOpts) (bool, error) { - debugLog("stripOAIGen") - replacedWithComplex := false - - // figure out referers of OAIGen definitions - for _, r := range opts.flattenContext.newRefs { - if !r.isOAIGen || r.resolved { // bail on already resolved entries (avoid looping) - continue - } - for k, v := range opts.Spec.references.allRefs { - if r.path != v.String() { - continue - } - found := false - for _, p := range r.parents { - if p == k { - found = true - break - } - } - if !found { - r.parents = append(r.parents, k) - } - } - } - - for k := range opts.flattenContext.newRefs { - r := opts.flattenContext.newRefs[k] - //debugLog("newRefs[%s]: isOAIGen: %t, resolved: %t, name: %s, path:%s, #parents: %d, parents: %v, ref: %s", - // k, r.isOAIGen, r.resolved, r.newName, r.path, len(r.parents), r.parents, r.schema.Ref.String()) - if r.isOAIGen && len(r.parents) >= 1 { - pr := r.parents - sort.Strings(pr) - - // rewrite first parent schema in lexicographical order - debugLog("rewrite first parent in lex order %s with schema", pr[0]) - if err := updateRefWithSchema(opts.Swagger(), pr[0], r.schema); err != nil { - return false, err - } - if pa, ok := opts.flattenContext.newRefs[pr[0]]; ok && pa.isOAIGen { - // update parent in ref index entry - debugLog("update parent entry: %s", pr[0]) - pa.schema = r.schema - pa.resolved = false - replacedWithComplex = true - } - - // rewrite other parents to point to first parent - if len(pr) > 1 { - for _, p := range pr[1:] { - replacingRef := swspec.MustCreateRef(pr[0]) - - // set complex when replacing ref is an anonymous jsonpointer: further processing may be required - replacedWithComplex = replacedWithComplex || - slashpath.Dir(replacingRef.String()) != definitionsPath - debugLog("rewrite parent with ref: %s", replacingRef.String()) - - // NOTE: it is possible at this stage to introduce json pointers (to non-definitions places). - // Those are stripped later on. - if err := updateRef(opts.Swagger(), p, replacingRef); err != nil { - return false, err - } - - if pa, ok := opts.flattenContext.newRefs[p]; ok && pa.isOAIGen { - // update parent in ref index - debugLog("update parent entry: %s", p) - pa.schema = r.schema - pa.resolved = false - replacedWithComplex = true - } - } - } - - // remove OAIGen definition - debugLog("removing definition %s", slashpath.Base(r.path)) - delete(opts.Swagger().Definitions, slashpath.Base(r.path)) - - // propagate changes in ref index for keys which have this one as a parent - for kk, value := range opts.flattenContext.newRefs { - if kk == k || !value.isOAIGen || value.resolved { - continue - } - found := false - newParents := make([]string, 0, len(value.parents)) - for _, parent := range value.parents { - switch { - case parent == r.path: - found = true - parent = pr[0] - case strings.HasPrefix(parent, r.path+"/"): - found = true - parent = slashpath.Join(pr[0], strings.TrimPrefix(parent, r.path)) - } - newParents = append(newParents, parent) - } - if found { - value.parents = newParents - } - } - - // mark naming conflict as resolved - debugLog("marking naming conflict resolved for key: %s", r.key) - opts.flattenContext.newRefs[r.key].isOAIGen = false - opts.flattenContext.newRefs[r.key].resolved = true - - // determine if the previous substitution did inline a complex schema - if r.schema != nil && r.schema.Ref.String() == "" { // inline schema - asch, err := Schema(SchemaOpts{Schema: r.schema, Root: opts.Swagger(), BasePath: opts.BasePath}) - if err != nil { - return false, err - } - debugLog("re-inlined schema: parent: %s, %t", pr[0], isAnalyzedAsComplex(asch)) - replacedWithComplex = replacedWithComplex || - !(slashpath.Dir(pr[0]) == definitionsPath) && isAnalyzedAsComplex(asch) - } - } - } - - debugLog("replacedWithComplex: %t", replacedWithComplex) - opts.Spec.reload() // re-analyze - return replacedWithComplex, nil -} - -// croak logs notifications and warnings about valid, but possibly unwanted constructs resulting -// from flattening a spec -func croak(opts *FlattenOpts) { - reported := make(map[string]bool, len(opts.flattenContext.newRefs)) - for _, v := range opts.Spec.references.allRefs { - // warns about duplicate handling - for _, r := range opts.flattenContext.newRefs { - if r.isOAIGen && r.path == v.String() { - reported[r.newName] = true - } - } - } - for k := range reported { - log.Printf("warning: duplicate flattened definition name resolved as %s", k) - } - // warns about possible type mismatches - uniqueMsg := make(map[string]bool) - for _, msg := range opts.flattenContext.warnings { - if _, ok := uniqueMsg[msg]; ok { - continue - } - log.Printf("warning: %s", msg) - uniqueMsg[msg] = true - } -} - -// namePointers replaces all JSON pointers to anonymous documents by a $ref to a new named definitions. -// -// This is carried on depth-first. Pointers to $refs which are top level definitions are replaced by the $ref itself. -// Pointers to simple types are expanded, unless they express commonality (i.e. several such $ref are used). -func namePointers(opts *FlattenOpts) error { - debugLog("name pointers") - refsToReplace := make(map[string]SchemaRef, len(opts.Spec.references.schemas)) - for k, ref := range opts.Spec.references.allRefs { - if slashpath.Dir(ref.String()) == definitionsPath { - // this a ref to a top-level definition: ok - continue - } - replacingRef, sch, erd := deepestRef(opts, ref) - if erd != nil { - return fmt.Errorf("at %s, %v", k, erd) - } - debugLog("planning pointer to replace at %s: %s, resolved to: %s", k, ref.String(), replacingRef.String()) - refsToReplace[k] = SchemaRef{ - Name: k, // caller - Ref: replacingRef, // callee - Schema: sch, - TopLevel: slashpath.Dir(replacingRef.String()) == definitionsPath, - } - } - depthFirst := sortDepthFirst(refsToReplace) - namer := &inlineSchemaNamer{ - Spec: opts.Swagger(), - Operations: opRefsByRef(gatherOperations(opts.Spec, nil)), - flattenContext: opts.flattenContext, - opts: opts, - } - - for _, key := range depthFirst { - v := refsToReplace[key] - // update current replacement, which may have been updated by previous changes of deeper elements - replacingRef, sch, erd := deepestRef(opts, v.Ref) - if erd != nil { - return fmt.Errorf("at %s, %v", key, erd) - } - v.Ref = replacingRef - v.Schema = sch - v.TopLevel = slashpath.Dir(replacingRef.String()) == definitionsPath - debugLog("replacing pointer at %s: resolved to: %s", key, v.Ref.String()) - - if v.TopLevel { - debugLog("replace pointer %s by canonical definition: %s", key, v.Ref.String()) - // if the schema is a $ref to a top level definition, just rewrite the pointer to this $ref - if err := updateRef(opts.Swagger(), key, v.Ref); err != nil { - return err - } - } else { - // this is a JSON pointer to an anonymous document (internal or external): - // create a definition for this schema when: - // - it is a complex schema - // - or it is pointed by more than one $ref (i.e. expresses commonality) - // otherwise, expand the pointer (single reference to a simple type) - // - // The named definition for this follows the target's key, not the caller's - debugLog("namePointers at %s for %s", key, v.Ref.String()) - - // qualify the expanded schema - /* - if key == "#/paths/~1some~1where~1{id}/get/parameters/1/items" { - // DEBUG - //func getPointerFromKey(spec interface{}, key string) (string, interface{}, error) { - k, res, err := getPointerFromKey(namer.Spec, key) - debugLog("k = %s, res=%#v, err=%v", k, res, err) - } - */ - asch, ers := Schema(SchemaOpts{Schema: v.Schema, Root: opts.Swagger(), BasePath: opts.BasePath}) - if ers != nil { - return fmt.Errorf("schema analysis [%s]: %v", key, ers) - } - callers := make([]string, 0, 64) - - debugLog("looking for callers") - an := New(opts.Swagger()) - for k, w := range an.references.allRefs { - r, _, erd := deepestRef(opts, w) - if erd != nil { - return fmt.Errorf("at %s, %v", key, erd) - } - if r.String() == v.Ref.String() { - callers = append(callers, k) - } - } - debugLog("callers for %s: %d", v.Ref.String(), len(callers)) - if len(callers) == 0 { - // has already been updated and resolved - continue - } - - parts := keyParts(v.Ref.String()) - debugLog("number of callers for %s: %d", v.Ref.String(), len(callers)) - // identifying edge case when the namer did nothing because we point to a non-schema object - // no definition is created and we expand the $ref for all callers - if (!asch.IsSimpleSchema || len(callers) > 1) && !parts.IsSharedParam() && !parts.IsSharedResponse() { - debugLog("replace JSON pointer at [%s] by definition: %s", key, v.Ref.String()) - if err := namer.Name(v.Ref.String(), v.Schema, asch); err != nil { - return err - } - - // regular case: we named the $ref as a definition, and we move all callers to this new $ref - for _, caller := range callers { - if caller != key { - // move $ref for next to resolve - debugLog("identified caller of %s at [%s]", v.Ref.String(), caller) - c := refsToReplace[caller] - c.Ref = v.Ref - refsToReplace[caller] = c - } - } - } else { - debugLog("expand JSON pointer for key=%s", key) - if err := updateRefWithSchema(opts.Swagger(), key, v.Schema); err != nil { - return err - } - // NOTE: there is no other caller to update - } - } - } - opts.Spec.reload() // re-analyze - return nil -} - -// deepestRef finds the first definition ref, from a cascade of nested refs which are not definitions. -// - if no definition is found, returns the deepest ref. -// - pointers to external files are expanded -// -// NOTE: all external $ref's are assumed to be already expanded at this stage. -func deepestRef(opts *FlattenOpts, ref swspec.Ref) (swspec.Ref, *swspec.Schema, error) { - if !ref.HasFragmentOnly { - // we found an external $ref, which is odd - // does nothing on external $refs - return ref, nil, nil - } - currentRef := ref - visited := make(map[string]bool, 64) -DOWNREF: - for currentRef.String() != "" { - if slashpath.Dir(currentRef.String()) == definitionsPath { - // this is a top-level definition: stop here and return this ref - return currentRef, nil, nil - } - if _, beenThere := visited[currentRef.String()]; beenThere { - return swspec.Ref{}, nil, - fmt.Errorf("cannot resolve cyclic chain of pointers under %s", currentRef.String()) - } - visited[currentRef.String()] = true - value, _, err := currentRef.GetPointer().Get(opts.Swagger()) - if err != nil { - return swspec.Ref{}, nil, err - } - switch refable := value.(type) { - case *swspec.Schema: - if refable.Ref.String() == "" { - break DOWNREF - } - currentRef = refable.Ref - - case swspec.Schema: - if refable.Ref.String() == "" { - break DOWNREF - } - currentRef = refable.Ref - - case *swspec.SchemaOrArray: - if refable.Schema == nil || refable.Schema != nil && refable.Schema.Ref.String() == "" { - break DOWNREF - } - currentRef = refable.Schema.Ref - - case *swspec.SchemaOrBool: - if refable.Schema == nil || refable.Schema != nil && refable.Schema.Ref.String() == "" { - break DOWNREF - } - currentRef = refable.Schema.Ref - - case swspec.Response: - // a pointer points to a schema initially marshalled in responses section... - // Attempt to convert this to a schema. If this fails, the spec is invalid - asJSON, _ := refable.MarshalJSON() - var asSchema swspec.Schema - err := asSchema.UnmarshalJSON(asJSON) - if err != nil { - return swspec.Ref{}, nil, - fmt.Errorf("invalid type for resolved JSON pointer %s. Expected a schema a, got: %T", - currentRef.String(), value) - - } - opts.flattenContext.warnings = append(opts.flattenContext.warnings, - fmt.Sprintf("found $ref %q (response) interpreted as schema", currentRef.String())) - - if asSchema.Ref.String() == "" { - break DOWNREF - } - currentRef = asSchema.Ref - - case swspec.Parameter: - // a pointer points to a schema initially marshalled in parameters section... - // Attempt to convert this to a schema. If this fails, the spec is invalid - asJSON, _ := refable.MarshalJSON() - var asSchema swspec.Schema - err := asSchema.UnmarshalJSON(asJSON) - if err != nil { - return swspec.Ref{}, nil, - fmt.Errorf("invalid type for resolved JSON pointer %s. Expected a schema a, got: %T", - currentRef.String(), value) - - } - opts.flattenContext.warnings = append(opts.flattenContext.warnings, - fmt.Sprintf("found $ref %q (parameter) interpreted as schema", currentRef.String())) - - if asSchema.Ref.String() == "" { - break DOWNREF - } - currentRef = asSchema.Ref - - default: - return swspec.Ref{}, nil, - fmt.Errorf("unhandled type to resolve JSON pointer %s. Expected a Schema, got: %T", - currentRef.String(), value) - - } - } - // assess what schema we're ending with - sch, erv := swspec.ResolveRefWithBase(opts.Swagger(), ¤tRef, opts.ExpandOpts(false)) - if erv != nil { - return swspec.Ref{}, nil, erv - } - if sch == nil { - return swspec.Ref{}, nil, fmt.Errorf("no schema found at %s", currentRef.String()) - } - return currentRef, sch, nil -} - -// normalizeRef strips the current file from any $ref. This works around issue go-openapi/spec#76: -// leading absolute file in $ref is stripped -func normalizeRef(opts *FlattenOpts) error { - debugLog("normalizeRef") - opts.Spec.reload() // re-analyze - for k, w := range opts.Spec.references.allRefs { - if strings.HasPrefix(w.String(), opts.BasePath+definitionsPath) { // may be a mix of / and \, depending on OS - // strip base path from definition - debugLog("stripping absolute path for: %s", w.String()) - if err := updateRef(opts.Swagger(), k, - swspec.MustCreateRef(slashpath.Join(definitionsPath, slashpath.Base(w.String())))); err != nil { - return err - } - } - } - opts.Spec.reload() // re-analyze - return nil -} diff --git a/vendor/github.com/go-openapi/analysis/go.mod b/vendor/github.com/go-openapi/analysis/go.mod deleted file mode 100644 index 6c8e58577c..0000000000 --- a/vendor/github.com/go-openapi/analysis/go.mod +++ /dev/null @@ -1,13 +0,0 @@ -module github.com/go-openapi/analysis - -require ( - github.com/go-openapi/jsonpointer v0.19.3 - github.com/go-openapi/loads v0.19.0 - github.com/go-openapi/spec v0.19.3 - github.com/go-openapi/strfmt v0.19.3 - github.com/go-openapi/swag v0.19.5 - github.com/stretchr/testify v1.3.0 - go.mongodb.org/mongo-driver v1.1.1 // indirect -) - -go 1.13 diff --git a/vendor/github.com/go-openapi/analysis/go.sum b/vendor/github.com/go-openapi/analysis/go.sum deleted file mode 100644 index 8e8b5f9bc4..0000000000 --- a/vendor/github.com/go-openapi/analysis/go.sum +++ /dev/null @@ -1,97 +0,0 @@ -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-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/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/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/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/loads v0.19.0 h1:wCOBNscACI8L93tt5tvB2zOMkJ098XCw3fP0BY2ybDA= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -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/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.2 h1:clPGfBnJohokno0e+d7hs6Yocrzjlgz6EsQSDncCRnE= -github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -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/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -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 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-openapi/analysis/internal/pre_go18.go b/vendor/github.com/go-openapi/analysis/internal/pre_go18.go deleted file mode 100644 index 4cc6441822..0000000000 --- a/vendor/github.com/go-openapi/analysis/internal/pre_go18.go +++ /dev/null @@ -1,29 +0,0 @@ -// +build !go1.8 - -// 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 internal - -import "net/url" - -// PathUnescape provides url.PathUnescape(), with seamless -// go version support for pre-go1.8 -// -// TODO: this function is currently defined in go-openapi/swag, -// but unexported. We might chose to export it, or simple phase -// out pre-go1.8 support. -func PathUnescape(path string) (string, error) { - return url.QueryUnescape(path) -} diff --git a/vendor/github.com/go-openapi/analysis/mixin.go b/vendor/github.com/go-openapi/analysis/mixin.go deleted file mode 100644 index 625c46f8f9..0000000000 --- a/vendor/github.com/go-openapi/analysis/mixin.go +++ /dev/null @@ -1,425 +0,0 @@ -// 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 analysis - -import ( - "fmt" - "reflect" - - "github.com/go-openapi/spec" -) - -// Mixin modifies the primary swagger spec by adding the paths and -// definitions from the mixin specs. Top level parameters and -// responses from the mixins are also carried over. Operation id -// collisions are avoided by appending "Mixin" but only if -// needed. -// -// The following parts of primary are subject to merge, filling empty details -// - Info -// - BasePath -// - Host -// - ExternalDocs -// -// Consider calling FixEmptyResponseDescriptions() on the modified primary -// if you read them from storage and they are valid to start with. -// -// Entries in "paths", "definitions", "parameters" and "responses" are -// added to the primary in the order of the given mixins. If the entry -// already exists in primary it is skipped with a warning message. -// -// The count of skipped entries (from collisions) is returned so any -// deviation from the number expected can flag a warning in your build -// scripts. Carefully review the collisions before accepting them; -// consider renaming things if possible. -// -// No key normalization takes place (paths, type defs, -// etc). Ensure they are canonical if your downstream tools do -// key normalization of any form. -// -// Merging schemes (http, https), and consumers/producers do not account for -// collisions. -func Mixin(primary *spec.Swagger, mixins ...*spec.Swagger) []string { - skipped := make([]string, 0, len(mixins)) - opIds := getOpIds(primary) - initPrimary(primary) - - for i, m := range mixins { - skipped = append(skipped, mergeSwaggerProps(primary, m)...) - - skipped = append(skipped, mergeConsumes(primary, m)...) - - skipped = append(skipped, mergeProduces(primary, m)...) - - skipped = append(skipped, mergeTags(primary, m)...) - - skipped = append(skipped, mergeSchemes(primary, m)...) - - skipped = append(skipped, mergeSecurityDefinitions(primary, m)...) - - skipped = append(skipped, mergeSecurityRequirements(primary, m)...) - - skipped = append(skipped, mergeDefinitions(primary, m)...) - - // merging paths requires a map of operationIDs to work with - skipped = append(skipped, mergePaths(primary, m, opIds, i)...) - - skipped = append(skipped, mergeParameters(primary, m)...) - - skipped = append(skipped, mergeResponses(primary, m)...) - } - return skipped -} - -// getOpIds extracts all the paths..operationIds from the given -// spec and returns them as the keys in a map with 'true' values. -func getOpIds(s *spec.Swagger) map[string]bool { - rv := make(map[string]bool) - if s.Paths == nil { - return rv - } - for _, v := range s.Paths.Paths { - piops := pathItemOps(v) - for _, op := range piops { - rv[op.ID] = true - } - } - return rv -} - -func pathItemOps(p spec.PathItem) []*spec.Operation { - var rv []*spec.Operation - rv = appendOp(rv, p.Get) - rv = appendOp(rv, p.Put) - rv = appendOp(rv, p.Post) - rv = appendOp(rv, p.Delete) - rv = appendOp(rv, p.Head) - rv = appendOp(rv, p.Patch) - return rv -} - -func appendOp(ops []*spec.Operation, op *spec.Operation) []*spec.Operation { - if op == nil { - return ops - } - return append(ops, op) -} - -func mergeSecurityDefinitions(primary *spec.Swagger, m *spec.Swagger) (skipped []string) { - for k, v := range m.SecurityDefinitions { - if _, exists := primary.SecurityDefinitions[k]; exists { - warn := fmt.Sprintf( - "SecurityDefinitions entry '%v' already exists in primary or higher priority mixin, skipping\n", k) - skipped = append(skipped, warn) - continue - } - primary.SecurityDefinitions[k] = v - } - return -} - -func mergeSecurityRequirements(primary *spec.Swagger, m *spec.Swagger) (skipped []string) { - for _, v := range m.Security { - found := false - for _, vv := range primary.Security { - if reflect.DeepEqual(v, vv) { - found = true - break - } - } - if found { - warn := fmt.Sprintf( - "Security requirement: '%v' already exists in primary or higher priority mixin, skipping\n", v) - skipped = append(skipped, warn) - continue - } - primary.Security = append(primary.Security, v) - } - return -} - -func mergeDefinitions(primary *spec.Swagger, m *spec.Swagger) (skipped []string) { - for k, v := range m.Definitions { - // assume name collisions represent IDENTICAL type. careful. - if _, exists := primary.Definitions[k]; exists { - warn := fmt.Sprintf( - "definitions entry '%v' already exists in primary or higher priority mixin, skipping\n", k) - skipped = append(skipped, warn) - continue - } - primary.Definitions[k] = v - } - return -} - -func mergePaths(primary *spec.Swagger, m *spec.Swagger, opIds map[string]bool, mixIndex int) (skipped []string) { - if m.Paths != nil { - for k, v := range m.Paths.Paths { - if _, exists := primary.Paths.Paths[k]; exists { - warn := fmt.Sprintf( - "paths entry '%v' already exists in primary or higher priority mixin, skipping\n", k) - skipped = append(skipped, warn) - continue - } - - // Swagger requires that operationIds be - // unique within a spec. If we find a - // collision we append "Mixin0" to the - // operatoinId we are adding, where 0 is mixin - // index. We assume that operationIds with - // all the proivded specs are already unique. - piops := pathItemOps(v) - for _, piop := range piops { - if opIds[piop.ID] { - piop.ID = fmt.Sprintf("%v%v%v", piop.ID, "Mixin", mixIndex) - } - opIds[piop.ID] = true - } - primary.Paths.Paths[k] = v - } - } - return -} - -func mergeParameters(primary *spec.Swagger, m *spec.Swagger) (skipped []string) { - for k, v := range m.Parameters { - // could try to rename on conflict but would - // have to fix $refs in the mixin. Complain - // for now - if _, exists := primary.Parameters[k]; exists { - warn := fmt.Sprintf( - "top level parameters entry '%v' already exists in primary or higher priority mixin, skipping\n", k) - skipped = append(skipped, warn) - continue - } - primary.Parameters[k] = v - } - return -} - -func mergeResponses(primary *spec.Swagger, m *spec.Swagger) (skipped []string) { - for k, v := range m.Responses { - // could try to rename on conflict but would - // have to fix $refs in the mixin. Complain - // for now - if _, exists := primary.Responses[k]; exists { - warn := fmt.Sprintf( - "top level responses entry '%v' already exists in primary or higher priority mixin, skipping\n", k) - skipped = append(skipped, warn) - continue - } - primary.Responses[k] = v - } - return skipped -} - -func mergeConsumes(primary *spec.Swagger, m *spec.Swagger) []string { - for _, v := range m.Consumes { - found := false - for _, vv := range primary.Consumes { - if v == vv { - found = true - break - } - } - if found { - // no warning here: we just skip it - continue - } - primary.Consumes = append(primary.Consumes, v) - } - return []string{} -} - -func mergeProduces(primary *spec.Swagger, m *spec.Swagger) []string { - for _, v := range m.Produces { - found := false - for _, vv := range primary.Produces { - if v == vv { - found = true - break - } - } - if found { - // no warning here: we just skip it - continue - } - primary.Produces = append(primary.Produces, v) - } - return []string{} -} - -func mergeTags(primary *spec.Swagger, m *spec.Swagger) (skipped []string) { - for _, v := range m.Tags { - found := false - for _, vv := range primary.Tags { - if v.Name == vv.Name { - found = true - break - } - } - if found { - warn := fmt.Sprintf( - "top level tags entry with name '%v' already exists in primary or higher priority mixin, skipping\n", v.Name) - skipped = append(skipped, warn) - continue - } - primary.Tags = append(primary.Tags, v) - } - return -} - -func mergeSchemes(primary *spec.Swagger, m *spec.Swagger) []string { - for _, v := range m.Schemes { - found := false - for _, vv := range primary.Schemes { - if v == vv { - found = true - break - } - } - if found { - // no warning here: we just skip it - continue - } - primary.Schemes = append(primary.Schemes, v) - } - return []string{} -} - -func mergeSwaggerProps(primary *spec.Swagger, m *spec.Swagger) []string { - var skipped []string - primary.Extensions, skipped = mergeExtensions(primary.Extensions, m.Extensions) - - // merging details in swagger top properties - if primary.Host == "" { - primary.Host = m.Host - } - if primary.BasePath == "" { - primary.BasePath = m.BasePath - } - if primary.Info == nil { - primary.Info = m.Info - } else if m.Info != nil { - var sk []string - primary.Info.Extensions, sk = mergeExtensions(primary.Info.Extensions, m.Info.Extensions) - skipped = append(skipped, sk...) - if primary.Info.Description == "" { - primary.Info.Description = m.Info.Description - } - if primary.Info.Title == "" { - primary.Info.Description = m.Info.Description - } - if primary.Info.TermsOfService == "" { - primary.Info.TermsOfService = m.Info.TermsOfService - } - if primary.Info.Version == "" { - primary.Info.Version = m.Info.Version - } - - if primary.Info.Contact == nil { - primary.Info.Contact = m.Info.Contact - } else if m.Info.Contact != nil { - if primary.Info.Contact.Name == "" { - primary.Info.Contact.Name = m.Info.Contact.Name - } - if primary.Info.Contact.URL == "" { - primary.Info.Contact.URL = m.Info.Contact.URL - } - if primary.Info.Contact.Email == "" { - primary.Info.Contact.Email = m.Info.Contact.Email - } - } - - if primary.Info.License == nil { - primary.Info.License = m.Info.License - } else if m.Info.License != nil { - if primary.Info.License.Name == "" { - primary.Info.License.Name = m.Info.License.Name - } - if primary.Info.License.URL == "" { - primary.Info.License.URL = m.Info.License.URL - } - } - - } - if primary.ExternalDocs == nil { - primary.ExternalDocs = m.ExternalDocs - } else if m.ExternalDocs != nil { - if primary.ExternalDocs.Description == "" { - primary.ExternalDocs.Description = m.ExternalDocs.Description - } - if primary.ExternalDocs.URL == "" { - primary.ExternalDocs.URL = m.ExternalDocs.URL - } - } - return skipped -} - -func mergeExtensions(primary spec.Extensions, m spec.Extensions) (result spec.Extensions, skipped []string) { - if primary == nil { - result = m - return - } - if m == nil { - result = primary - return - } - result = primary - for k, v := range m { - if _, found := primary[k]; found { - skipped = append(skipped, k) - continue - } - primary[k] = v - } - return -} - -func initPrimary(primary *spec.Swagger) { - if primary.SecurityDefinitions == nil { - primary.SecurityDefinitions = make(map[string]*spec.SecurityScheme) - } - if primary.Security == nil { - primary.Security = make([]map[string][]string, 0, 10) - } - if primary.Produces == nil { - primary.Produces = make([]string, 0, 10) - } - if primary.Consumes == nil { - primary.Consumes = make([]string, 0, 10) - } - if primary.Tags == nil { - primary.Tags = make([]spec.Tag, 0, 10) - } - if primary.Schemes == nil { - primary.Schemes = make([]string, 0, 10) - } - if primary.Paths == nil { - primary.Paths = &spec.Paths{Paths: make(map[string]spec.PathItem)} - } - if primary.Paths.Paths == nil { - primary.Paths.Paths = make(map[string]spec.PathItem) - } - if primary.Definitions == nil { - primary.Definitions = make(spec.Definitions) - } - if primary.Parameters == nil { - primary.Parameters = make(map[string]spec.Parameter) - } - if primary.Responses == nil { - primary.Responses = make(map[string]spec.Response) - } -} diff --git a/vendor/github.com/go-openapi/analysis/schema.go b/vendor/github.com/go-openapi/analysis/schema.go deleted file mode 100644 index 398c780639..0000000000 --- a/vendor/github.com/go-openapi/analysis/schema.go +++ /dev/null @@ -1,234 +0,0 @@ -package analysis - -import ( - "fmt" - - "github.com/go-openapi/spec" - "github.com/go-openapi/strfmt" -) - -// SchemaOpts configures the schema analyzer -type SchemaOpts struct { - Schema *spec.Schema - Root interface{} - BasePath string - _ struct{} -} - -// Schema analysis, will classify the schema according to known -// patterns. -func Schema(opts SchemaOpts) (*AnalyzedSchema, error) { - if opts.Schema == nil { - return nil, fmt.Errorf("no schema to analyze") - } - - a := &AnalyzedSchema{ - schema: opts.Schema, - root: opts.Root, - basePath: opts.BasePath, - } - - a.initializeFlags() - a.inferKnownType() - a.inferEnum() - a.inferBaseType() - - if err := a.inferMap(); err != nil { - return nil, err - } - if err := a.inferArray(); err != nil { - return nil, err - } - - a.inferTuple() - - if err := a.inferFromRef(); err != nil { - return nil, err - } - - a.inferSimpleSchema() - return a, nil -} - -// AnalyzedSchema indicates what the schema represents -type AnalyzedSchema struct { - schema *spec.Schema - root interface{} - basePath string - - hasProps bool - hasAllOf bool - hasItems bool - hasAdditionalProps bool - hasAdditionalItems bool - hasRef bool - - IsKnownType bool - IsSimpleSchema bool - IsArray bool - IsSimpleArray bool - IsMap bool - IsSimpleMap bool - IsExtendedObject bool - IsTuple bool - IsTupleWithExtra bool - IsBaseType bool - IsEnum bool -} - -// Inherits copies value fields from other onto this schema -func (a *AnalyzedSchema) inherits(other *AnalyzedSchema) { - if other == nil { - return - } - a.hasProps = other.hasProps - a.hasAllOf = other.hasAllOf - a.hasItems = other.hasItems - a.hasAdditionalItems = other.hasAdditionalItems - a.hasAdditionalProps = other.hasAdditionalProps - a.hasRef = other.hasRef - - a.IsKnownType = other.IsKnownType - a.IsSimpleSchema = other.IsSimpleSchema - a.IsArray = other.IsArray - a.IsSimpleArray = other.IsSimpleArray - a.IsMap = other.IsMap - a.IsSimpleMap = other.IsSimpleMap - a.IsExtendedObject = other.IsExtendedObject - a.IsTuple = other.IsTuple - a.IsTupleWithExtra = other.IsTupleWithExtra - a.IsBaseType = other.IsBaseType - a.IsEnum = other.IsEnum -} - -func (a *AnalyzedSchema) inferFromRef() error { - if a.hasRef { - sch := new(spec.Schema) - sch.Ref = a.schema.Ref - err := spec.ExpandSchema(sch, a.root, nil) - if err != nil { - return err - } - rsch, err := Schema(SchemaOpts{ - Schema: sch, - Root: a.root, - BasePath: a.basePath, - }) - if err != nil { - // NOTE(fredbi): currently the only cause for errors is - // unresolved ref. Since spec.ExpandSchema() expands the - // schema recursively, there is no chance to get there, - // until we add more causes for error in this schema analysis. - return err - } - a.inherits(rsch) - } - return nil -} - -func (a *AnalyzedSchema) inferSimpleSchema() { - a.IsSimpleSchema = a.IsKnownType || a.IsSimpleArray || a.IsSimpleMap -} - -func (a *AnalyzedSchema) inferKnownType() { - tpe := a.schema.Type - format := a.schema.Format - a.IsKnownType = tpe.Contains("boolean") || - tpe.Contains("integer") || - tpe.Contains("number") || - tpe.Contains("string") || - (format != "" && strfmt.Default.ContainsName(format)) || - (a.isObjectType() && !a.hasProps && !a.hasAllOf && !a.hasAdditionalProps && !a.hasAdditionalItems) -} - -func (a *AnalyzedSchema) inferMap() error { - if a.isObjectType() { - hasExtra := a.hasProps || a.hasAllOf - a.IsMap = a.hasAdditionalProps && !hasExtra - a.IsExtendedObject = a.hasAdditionalProps && hasExtra - if a.IsMap { - if a.schema.AdditionalProperties.Schema != nil { - msch, err := Schema(SchemaOpts{ - Schema: a.schema.AdditionalProperties.Schema, - Root: a.root, - BasePath: a.basePath, - }) - if err != nil { - return err - } - a.IsSimpleMap = msch.IsSimpleSchema - } else if a.schema.AdditionalProperties.Allows { - a.IsSimpleMap = true - } - } - } - return nil -} - -func (a *AnalyzedSchema) inferArray() error { - // an array has Items defined as an object schema, otherwise we qualify this JSON array as a tuple - // (yes, even if the Items array contains only one element). - // arrays in JSON schema may be unrestricted (i.e no Items specified). - // Note that arrays in Swagger MUST have Items. Nonetheless, we analyze unrestricted arrays. - // - // NOTE: the spec package misses the distinction between: - // items: [] and items: {}, so we consider both arrays here. - a.IsArray = a.isArrayType() && (a.schema.Items == nil || a.schema.Items.Schemas == nil) - if a.IsArray && a.hasItems { - if a.schema.Items.Schema != nil { - itsch, err := Schema(SchemaOpts{ - Schema: a.schema.Items.Schema, - Root: a.root, - BasePath: a.basePath, - }) - if err != nil { - return err - } - a.IsSimpleArray = itsch.IsSimpleSchema - } - } - if a.IsArray && !a.hasItems { - a.IsSimpleArray = true - } - return nil -} - -func (a *AnalyzedSchema) inferTuple() { - tuple := a.hasItems && a.schema.Items.Schemas != nil - a.IsTuple = tuple && !a.hasAdditionalItems - a.IsTupleWithExtra = tuple && a.hasAdditionalItems -} - -func (a *AnalyzedSchema) inferBaseType() { - if a.isObjectType() { - a.IsBaseType = a.schema.Discriminator != "" - } -} - -func (a *AnalyzedSchema) inferEnum() { - a.IsEnum = len(a.schema.Enum) > 0 -} - -func (a *AnalyzedSchema) initializeFlags() { - a.hasProps = len(a.schema.Properties) > 0 - a.hasAllOf = len(a.schema.AllOf) > 0 - a.hasRef = a.schema.Ref.String() != "" - - a.hasItems = a.schema.Items != nil && - (a.schema.Items.Schema != nil || len(a.schema.Items.Schemas) > 0) - - a.hasAdditionalProps = a.schema.AdditionalProperties != nil && - (a.schema.AdditionalProperties != nil || a.schema.AdditionalProperties.Allows) - - a.hasAdditionalItems = a.schema.AdditionalItems != nil && - (a.schema.AdditionalItems.Schema != nil || a.schema.AdditionalItems.Allows) - -} - -func (a *AnalyzedSchema) isObjectType() bool { - return !a.hasRef && (a.schema.Type == nil || a.schema.Type.Contains("") || a.schema.Type.Contains("object")) -} - -func (a *AnalyzedSchema) isArrayType() bool { - return !a.hasRef && (a.schema.Type != nil && a.schema.Type.Contains("array")) -} diff --git a/vendor/github.com/go-openapi/errors/.golangci.yml b/vendor/github.com/go-openapi/errors/.golangci.yml deleted file mode 100644 index 6badaf1549..0000000000 --- a/vendor/github.com/go-openapi/errors/.golangci.yml +++ /dev/null @@ -1,20 +0,0 @@ -linters-settings: - govet: - check-shadowing: true - golint: - min-confidence: 0 - gocyclo: - min-complexity: 30 - maligned: - suggest-new: true - dupl: - threshold: 100 - goconst: - min-len: 2 - min-occurrences: 4 -linters: - enable-all: true - disable: - - maligned - - lll - - gochecknoglobals diff --git a/vendor/github.com/go-openapi/errors/.travis.yml b/vendor/github.com/go-openapi/errors/.travis.yml deleted file mode 100644 index ba8a6d5918..0000000000 --- a/vendor/github.com/go-openapi/errors/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -after_success: -- bash <(curl -s https://codecov.io/bash) -go: -- 1.11.x -- 1.12.x -install: -- GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on -language: go -notifications: - slack: - secure: gZGp9NaHxi7zawlXJXKY92BGeDR1x0tbIcTyU5nMKLq0fhIaiEBJEeALwZ4VgqsSv3DytSSF5mLH8fevAM3ixE6hxjKQ+lQuf7V/w3btCN1CSWgoua5LOh1kTnqZQtJuRvO4pzoJcT3bJWBsVZ07VGNVzzJEy/zAKCHFqBUCXShw7QemlLBcYWFNqveTlvDIfCzvouoLnPoXwxEpkjxe9uz/ZKZgAnup/fXjC8RFctmgCnkCyvJTk0Y/fZCsufixJrJhshBWTnlrFCzRmgNkz2d+i1Ls3+MJ5EJJ2Tx/A5S63dL49J1f9Kr0AKHADmulSy8JNzIckKwbyFMYUecrsW+Lsu9DhnVMy1jj5pKsJDLRi2iIU3fXTMWbcyQbXjbbnBO2mPdP3Tzme75y4D9fc8hUPeyqVv2BU26NEbQ7EF2pKJ93OXvci7HlwRBgdJa8j6mP2LEDClcPQW00g7N/OZe0cTOMa8L5AwiBlbArwqt9wv6YLJoTG0wpDhzWsFvbCg5bJxe28Yn3fIDD0Lk1I7iSnBbp/5gzF19jmxqvcT8tHRkDL4xfjbENFTZjA5uB4Z4pj4WSyWQILLV/Jwhe3fi9uQwdviFHfj5pnVrmNUiGSOQL672K5wl2c3E9mGwejvsu2dfEz28n7Y/FUnOpY3/cBS0n27JJaerS0zMKNLE= -script: -- gotestsum -f short-verbose -- -race -coverprofile=coverage.txt -covermode=atomic ./... diff --git a/vendor/github.com/go-openapi/errors/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/errors/CODE_OF_CONDUCT.md deleted file mode 100644 index 9322b065e3..0000000000 --- a/vendor/github.com/go-openapi/errors/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,74 +0,0 @@ -# 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/errors/README.md b/vendor/github.com/go-openapi/errors/README.md deleted file mode 100644 index 0ce50b23b2..0000000000 --- a/vendor/github.com/go-openapi/errors/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# OpenAPI errors [![Build Status](https://travis-ci.org/go-openapi/errors.svg?branch=master)](https://travis-ci.org/go-openapi/errors) [![codecov](https://codecov.io/gh/go-openapi/errors/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/errors) [![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/errors/master/LICENSE) -[![GoDoc](https://godoc.org/github.com/go-openapi/errors?status.svg)](http://godoc.org/github.com/go-openapi/errors) -[![GolangCI](https://golangci.com/badges/github.com/go-openapi/errors.svg)](https://golangci.com) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/errors)](https://goreportcard.com/report/github.com/go-openapi/errors) - -Shared errors and error interface used throughout the various libraries found in the go-openapi toolkit. diff --git a/vendor/github.com/go-openapi/errors/api.go b/vendor/github.com/go-openapi/errors/api.go deleted file mode 100644 index 7667cee76c..0000000000 --- a/vendor/github.com/go-openapi/errors/api.go +++ /dev/null @@ -1,164 +0,0 @@ -// 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 errors - -import ( - "encoding/json" - "fmt" - "net/http" - "reflect" - "strings" -) - -// DefaultHTTPCode is used when the error Code cannot be used as an HTTP code. -var DefaultHTTPCode = http.StatusUnprocessableEntity - -// Error represents a error interface all swagger framework errors implement -type Error interface { - error - Code() int32 -} - -type apiError struct { - code int32 - message string -} - -func (a *apiError) Error() string { - return a.message -} - -func (a *apiError) Code() int32 { - return a.code -} - -// New creates a new API error with a code and a message -func New(code int32, message string, args ...interface{}) Error { - if len(args) > 0 { - return &apiError{code, fmt.Sprintf(message, args...)} - } - return &apiError{code, message} -} - -// NotFound creates a new not found error -func NotFound(message string, args ...interface{}) Error { - if message == "" { - message = "Not found" - } - return New(http.StatusNotFound, fmt.Sprintf(message, args...)) -} - -// NotImplemented creates a new not implemented error -func NotImplemented(message string) Error { - return New(http.StatusNotImplemented, message) -} - -// MethodNotAllowedError represents an error for when the path matches but the method doesn't -type MethodNotAllowedError struct { - code int32 - Allowed []string - message string -} - -func (m *MethodNotAllowedError) Error() string { - return m.message -} - -// Code the error code -func (m *MethodNotAllowedError) Code() int32 { - return m.code -} - -func errorAsJSON(err Error) []byte { - b, _ := json.Marshal(struct { - Code int32 `json:"code"` - Message string `json:"message"` - }{err.Code(), err.Error()}) - return b -} - -func flattenComposite(errs *CompositeError) *CompositeError { - var res []error - for _, er := range errs.Errors { - switch e := er.(type) { - case *CompositeError: - if len(e.Errors) > 0 { - flat := flattenComposite(e) - if len(flat.Errors) > 0 { - res = append(res, flat.Errors...) - } - } - default: - if e != nil { - res = append(res, e) - } - } - } - return CompositeValidationError(res...) -} - -// MethodNotAllowed creates a new method not allowed error -func MethodNotAllowed(requested string, allow []string) Error { - msg := fmt.Sprintf("method %s is not allowed, but [%s] are", requested, strings.Join(allow, ",")) - return &MethodNotAllowedError{code: http.StatusMethodNotAllowed, Allowed: allow, message: msg} -} - -// ServeError the error handler interface implementation -func ServeError(rw http.ResponseWriter, r *http.Request, err error) { - rw.Header().Set("Content-Type", "application/json") - switch e := err.(type) { - case *CompositeError: - er := flattenComposite(e) - // strips composite errors to first element only - if len(er.Errors) > 0 { - ServeError(rw, r, er.Errors[0]) - } else { - // guard against empty CompositeError (invalid construct) - ServeError(rw, r, nil) - } - case *MethodNotAllowedError: - rw.Header().Add("Allow", strings.Join(err.(*MethodNotAllowedError).Allowed, ",")) - rw.WriteHeader(asHTTPCode(int(e.Code()))) - if r == nil || r.Method != http.MethodHead { - _, _ = rw.Write(errorAsJSON(e)) - } - case Error: - value := reflect.ValueOf(e) - if value.Kind() == reflect.Ptr && value.IsNil() { - rw.WriteHeader(http.StatusInternalServerError) - _, _ = rw.Write(errorAsJSON(New(http.StatusInternalServerError, "Unknown error"))) - return - } - rw.WriteHeader(asHTTPCode(int(e.Code()))) - if r == nil || r.Method != http.MethodHead { - _, _ = rw.Write(errorAsJSON(e)) - } - case nil: - rw.WriteHeader(http.StatusInternalServerError) - _, _ = rw.Write(errorAsJSON(New(http.StatusInternalServerError, "Unknown error"))) - default: - rw.WriteHeader(http.StatusInternalServerError) - if r == nil || r.Method != http.MethodHead { - _, _ = rw.Write(errorAsJSON(New(http.StatusInternalServerError, err.Error()))) - } - } -} - -func asHTTPCode(input int) int { - if input >= 600 { - return DefaultHTTPCode - } - return input -} diff --git a/vendor/github.com/go-openapi/errors/go.mod b/vendor/github.com/go-openapi/errors/go.mod deleted file mode 100644 index 084143001f..0000000000 --- a/vendor/github.com/go-openapi/errors/go.mod +++ /dev/null @@ -1,6 +0,0 @@ -module github.com/go-openapi/errors - -require ( - github.com/stretchr/objx v0.2.0 // indirect - github.com/stretchr/testify v1.3.0 -) diff --git a/vendor/github.com/go-openapi/errors/go.sum b/vendor/github.com/go-openapi/errors/go.sum deleted file mode 100644 index e7314e279f..0000000000 --- a/vendor/github.com/go-openapi/errors/go.sum +++ /dev/null @@ -1,9 +0,0 @@ -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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/vendor/github.com/go-openapi/errors/headers.go b/vendor/github.com/go-openapi/errors/headers.go deleted file mode 100644 index 0360c094ea..0000000000 --- a/vendor/github.com/go-openapi/errors/headers.go +++ /dev/null @@ -1,85 +0,0 @@ -// 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 errors - -import ( - "fmt" - "net/http" -) - -// Validation represents a failure of a precondition -type Validation struct { - code int32 - Name string - In string - Value interface{} - message string - Values []interface{} -} - -func (e *Validation) Error() string { - return e.message -} - -// Code the error code -func (e *Validation) Code() int32 { - return e.code -} - -// ValidateName produces an error message name for an aliased property -func (e *Validation) ValidateName(name string) *Validation { - if e.Name == "" && name != "" { - e.Name = name - e.message = name + e.message - } - return e -} - -const ( - contentTypeFail = `unsupported media type %q, only %v are allowed` - responseFormatFail = `unsupported media type requested, only %v are available` -) - -// InvalidContentType error for an invalid content type -func InvalidContentType(value string, allowed []string) *Validation { - values := make([]interface{}, 0, len(allowed)) - for _, v := range allowed { - values = append(values, v) - } - return &Validation{ - code: http.StatusUnsupportedMediaType, - Name: "Content-Type", - In: "header", - Value: value, - Values: values, - message: fmt.Sprintf(contentTypeFail, value, allowed), - } -} - -// InvalidResponseFormat error for an unacceptable response format request -func InvalidResponseFormat(value string, allowed []string) *Validation { - values := make([]interface{}, 0, len(allowed)) - for _, v := range allowed { - values = append(values, v) - } - return &Validation{ - code: http.StatusNotAcceptable, - Name: "Accept", - In: "header", - Value: value, - Values: values, - message: fmt.Sprintf(responseFormatFail, allowed), - } -} diff --git a/vendor/github.com/go-openapi/errors/middleware.go b/vendor/github.com/go-openapi/errors/middleware.go deleted file mode 100644 index 6390d4636a..0000000000 --- a/vendor/github.com/go-openapi/errors/middleware.go +++ /dev/null @@ -1,51 +0,0 @@ -// 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 errors - -import ( - "bytes" - "fmt" - "strings" -) - -// APIVerificationFailed is an error that contains all the missing info for a mismatched section -// between the api registrations and the api spec -type APIVerificationFailed struct { - Section string - MissingSpecification []string - MissingRegistration []string -} - -// -func (v *APIVerificationFailed) Error() string { - buf := bytes.NewBuffer(nil) - - hasRegMissing := len(v.MissingRegistration) > 0 - hasSpecMissing := len(v.MissingSpecification) > 0 - - if hasRegMissing { - buf.WriteString(fmt.Sprintf("missing [%s] %s registrations", strings.Join(v.MissingRegistration, ", "), v.Section)) - } - - if hasRegMissing && hasSpecMissing { - buf.WriteString("\n") - } - - if hasSpecMissing { - buf.WriteString(fmt.Sprintf("missing from spec file [%s] %s", strings.Join(v.MissingSpecification, ", "), v.Section)) - } - - return buf.String() -} diff --git a/vendor/github.com/go-openapi/errors/parsing.go b/vendor/github.com/go-openapi/errors/parsing.go deleted file mode 100644 index 1bae87302a..0000000000 --- a/vendor/github.com/go-openapi/errors/parsing.go +++ /dev/null @@ -1,59 +0,0 @@ -// 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 errors - -import "fmt" - -// ParseError respresents a parsing error -type ParseError struct { - code int32 - Name string - In string - Value string - Reason error - message string -} - -func (e *ParseError) Error() string { - return e.message -} - -// Code returns the http status code for this error -func (e *ParseError) Code() int32 { - return e.code -} - -const ( - parseErrorTemplContent = `parsing %s %s from %q failed, because %s` - parseErrorTemplContentNoIn = `parsing %s from %q failed, because %s` -) - -// NewParseError creates a new parse error -func NewParseError(name, in, value string, reason error) *ParseError { - var msg string - if in == "" { - msg = fmt.Sprintf(parseErrorTemplContentNoIn, name, value, reason) - } else { - msg = fmt.Sprintf(parseErrorTemplContent, name, in, value, reason) - } - return &ParseError{ - code: 400, - Name: name, - In: in, - Value: value, - Reason: reason, - message: msg, - } -} diff --git a/vendor/github.com/go-openapi/loads/.editorconfig b/vendor/github.com/go-openapi/loads/.editorconfig deleted file mode 100644 index 3152da69a5..0000000000 --- a/vendor/github.com/go-openapi/loads/.editorconfig +++ /dev/null @@ -1,26 +0,0 @@ -# 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/loads/.gitignore b/vendor/github.com/go-openapi/loads/.gitignore deleted file mode 100644 index e4f15f17bf..0000000000 --- a/vendor/github.com/go-openapi/loads/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -secrets.yml -coverage.out -profile.cov -profile.out diff --git a/vendor/github.com/go-openapi/loads/.golangci.yml b/vendor/github.com/go-openapi/loads/.golangci.yml deleted file mode 100644 index 1932914e6d..0000000000 --- a/vendor/github.com/go-openapi/loads/.golangci.yml +++ /dev/null @@ -1,22 +0,0 @@ -linters-settings: - govet: - check-shadowing: true - golint: - min-confidence: 0 - gocyclo: - min-complexity: 30 - maligned: - suggest-new: true - dupl: - threshold: 100 - goconst: - min-len: 2 - min-occurrences: 4 - -linters: - enable-all: true - disable: - - maligned - - lll - - gochecknoglobals - - gochecknoinits diff --git a/vendor/github.com/go-openapi/loads/.travis.yml b/vendor/github.com/go-openapi/loads/.travis.yml deleted file mode 100644 index 8a7e05d911..0000000000 --- a/vendor/github.com/go-openapi/loads/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -after_success: -- bash <(curl -s https://codecov.io/bash) -go: -- 1.11.x -- 1.12.x -install: -- GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on -language: go -notifications: - slack: - secure: OxkPwVp35qBTUilgWC8xykSj+sGMcj0h8IIOKD+Rflx2schZVlFfdYdyVBM+s9OqeOfvtuvnR9v1Ye2rPKAvcjWdC4LpRGUsgmItZaI6Um8Aj6+K9udCw5qrtZVfOVmRu8LieH//XznWWKdOultUuniW0MLqw5+II87Gd00RWbCGi0hk0PykHe7uK+PDA2BEbqyZ2WKKYCvfB3j+0nrFOHScXqnh0V05l2E83J4+Sgy1fsPy+1WdX58ZlNBG333ibaC1FS79XvKSmTgKRkx3+YBo97u6ZtUmJa5WZjf2OdLG3KIckGWAv6R5xgxeU31N0Ng8L332w/Edpp2O/M2bZwdnKJ8hJQikXIAQbICbr+lTDzsoNzMdEIYcHpJ5hjPbiUl3Bmd+Jnsjf5McgAZDiWIfpCKZ29tPCEkVwRsOCqkyPRMNMzHHmoja495P5jR+ODS7+J8RFg5xgcnOgpP9D4Wlhztlf5WyZMpkLxTUD+bZq2SRf50HfHFXTkfq22zPl3d1eq0yrLwh/Z/fWKkfb6SyysROL8y6s8u3dpFX1YHSg0BR6i913h4aoZw9B2BG27cafLLTwKYsp2dFo1PWl4O6u9giFJIeqwloZHLKKrwh0cBFhB7RH0I58asxkZpCH6uWjJierahmHe7iS+E6i+9oCHkOZ59hmCYNimIs3hM= -script: -- gotestsum -f short-verbose -- -race -timeout=20m -coverprofile=coverage.txt -covermode=atomic ./... diff --git a/vendor/github.com/go-openapi/loads/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/loads/CODE_OF_CONDUCT.md deleted file mode 100644 index 9322b065e3..0000000000 --- a/vendor/github.com/go-openapi/loads/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,74 +0,0 @@ -# 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/loads/README.md b/vendor/github.com/go-openapi/loads/README.md deleted file mode 100644 index 071cf69ab9..0000000000 --- a/vendor/github.com/go-openapi/loads/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Loads OAI specs [![Build Status](https://travis-ci.org/go-openapi/loads.svg?branch=master)](https://travis-ci.org/go-openapi/loads) [![codecov](https://codecov.io/gh/go-openapi/loads/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/loads) [![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/loads/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/loads?status.svg)](http://godoc.org/github.com/go-openapi/loads) -[![GolangCI](https://golangci.com/badges/github.com/go-openapi/loads.svg)](https://golangci.com) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/loads)](https://goreportcard.com/report/github.com/go-openapi/loads) - -Loading of OAI specification documents from local or remote locations. Supports JSON and YAML documents. diff --git a/vendor/github.com/go-openapi/loads/go.mod b/vendor/github.com/go-openapi/loads/go.mod deleted file mode 100644 index 8cf62326f6..0000000000 --- a/vendor/github.com/go-openapi/loads/go.mod +++ /dev/null @@ -1,11 +0,0 @@ -module github.com/go-openapi/loads - -require ( - github.com/go-openapi/analysis v0.19.5 - github.com/go-openapi/spec v0.19.3 - github.com/go-openapi/swag v0.19.5 - github.com/stretchr/testify v1.3.0 - gopkg.in/yaml.v2 v2.2.4 -) - -go 1.13 diff --git a/vendor/github.com/go-openapi/loads/go.sum b/vendor/github.com/go-openapi/loads/go.sum deleted file mode 100644 index 6eebff99d9..0000000000 --- a/vendor/github.com/go-openapi/loads/go.sum +++ /dev/null @@ -1,98 +0,0 @@ -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-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/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/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/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -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/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -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/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -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 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-openapi/loads/spec.go b/vendor/github.com/go-openapi/loads/spec.go deleted file mode 100644 index e4b4a3cf76..0000000000 --- a/vendor/github.com/go-openapi/loads/spec.go +++ /dev/null @@ -1,298 +0,0 @@ -// 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 loads - -import ( - "bytes" - "encoding/gob" - "encoding/json" - "fmt" - "net/url" - - "github.com/go-openapi/analysis" - "github.com/go-openapi/spec" - "github.com/go-openapi/swag" -) - -// JSONDoc loads a json document from either a file or a remote url -func JSONDoc(path string) (json.RawMessage, error) { - data, err := swag.LoadFromFileOrHTTP(path) - if err != nil { - return nil, err - } - return json.RawMessage(data), nil -} - -// DocLoader represents a doc loader type -type DocLoader func(string) (json.RawMessage, error) - -// DocMatcher represents a predicate to check if a loader matches -type DocMatcher func(string) bool - -var ( - loaders *loader - defaultLoader *loader -) - -func init() { - defaultLoader = &loader{Match: func(_ string) bool { return true }, Fn: JSONDoc} - loaders = defaultLoader - spec.PathLoader = loaders.Fn - AddLoader(swag.YAMLMatcher, swag.YAMLDoc) - - gob.Register(map[string]interface{}{}) - gob.Register([]interface{}{}) - //gob.Register(spec.Refable{}) -} - -// AddLoader for a document -func AddLoader(predicate DocMatcher, load DocLoader) { - prev := loaders - loaders = &loader{ - Match: predicate, - Fn: load, - Next: prev, - } - spec.PathLoader = loaders.Fn -} - -type loader struct { - Fn DocLoader - Match DocMatcher - Next *loader -} - -// JSONSpec loads a spec from a json document -func JSONSpec(path string) (*Document, error) { - data, err := JSONDoc(path) - if err != nil { - return nil, err - } - // convert to json - return Analyzed(data, "") -} - -// Document represents a swagger spec document -type Document struct { - // specAnalyzer - Analyzer *analysis.Spec - spec *spec.Swagger - specFilePath string - origSpec *spec.Swagger - schema *spec.Schema - raw json.RawMessage -} - -// Embedded returns a Document based on embedded specs. No analysis is required -func Embedded(orig, flat json.RawMessage) (*Document, error) { - var origSpec, flatSpec spec.Swagger - if err := json.Unmarshal(orig, &origSpec); err != nil { - return nil, err - } - if err := json.Unmarshal(flat, &flatSpec); err != nil { - return nil, err - } - return &Document{ - raw: orig, - origSpec: &origSpec, - spec: &flatSpec, - }, nil -} - -// Spec loads a new spec document -func Spec(path string) (*Document, error) { - specURL, err := url.Parse(path) - if err != nil { - return nil, err - } - var lastErr error - for l := loaders.Next; l != nil; l = l.Next { - if loaders.Match(specURL.Path) { - b, err2 := loaders.Fn(path) - if err2 != nil { - lastErr = err2 - continue - } - doc, err3 := Analyzed(b, "") - if err3 != nil { - return nil, err3 - } - if doc != nil { - doc.specFilePath = path - } - return doc, nil - } - } - if lastErr != nil { - return nil, lastErr - } - b, err := defaultLoader.Fn(path) - if err != nil { - return nil, err - } - - document, err := Analyzed(b, "") - if document != nil { - document.specFilePath = path - } - - return document, err -} - -// Analyzed creates a new analyzed spec document -func Analyzed(data json.RawMessage, version string) (*Document, error) { - if version == "" { - version = "2.0" - } - if version != "2.0" { - return nil, fmt.Errorf("spec version %q is not supported", version) - } - - raw := data - trimmed := bytes.TrimSpace(data) - if len(trimmed) > 0 { - if trimmed[0] != '{' && trimmed[0] != '[' { - yml, err := swag.BytesToYAMLDoc(trimmed) - if err != nil { - return nil, fmt.Errorf("analyzed: %v", err) - } - d, err := swag.YAMLToJSON(yml) - if err != nil { - return nil, fmt.Errorf("analyzed: %v", err) - } - raw = d - } - } - - swspec := new(spec.Swagger) - if err := json.Unmarshal(raw, swspec); err != nil { - return nil, err - } - - origsqspec, err := cloneSpec(swspec) - if err != nil { - return nil, err - } - - d := &Document{ - Analyzer: analysis.New(swspec), - schema: spec.MustLoadSwagger20Schema(), - spec: swspec, - raw: raw, - origSpec: origsqspec, - } - return d, nil -} - -// Expanded expands the ref fields in the spec document and returns a new spec document -func (d *Document) Expanded(options ...*spec.ExpandOptions) (*Document, error) { - swspec := new(spec.Swagger) - if err := json.Unmarshal(d.raw, swspec); err != nil { - return nil, err - } - - var expandOptions *spec.ExpandOptions - if len(options) > 0 { - expandOptions = options[0] - } else { - expandOptions = &spec.ExpandOptions{ - RelativeBase: d.specFilePath, - } - } - - if err := spec.ExpandSpec(swspec, expandOptions); err != nil { - return nil, err - } - - dd := &Document{ - Analyzer: analysis.New(swspec), - spec: swspec, - specFilePath: d.specFilePath, - schema: spec.MustLoadSwagger20Schema(), - raw: d.raw, - origSpec: d.origSpec, - } - return dd, nil -} - -// BasePath the base path for this spec -func (d *Document) BasePath() string { - return d.spec.BasePath -} - -// Version returns the version of this spec -func (d *Document) Version() string { - return d.spec.Swagger -} - -// Schema returns the swagger 2.0 schema -func (d *Document) Schema() *spec.Schema { - return d.schema -} - -// Spec returns the swagger spec object model -func (d *Document) Spec() *spec.Swagger { - return d.spec -} - -// Host returns the host for the API -func (d *Document) Host() string { - return d.spec.Host -} - -// Raw returns the raw swagger spec as json bytes -func (d *Document) Raw() json.RawMessage { - return d.raw -} - -// OrigSpec yields the original spec -func (d *Document) OrigSpec() *spec.Swagger { - return d.origSpec -} - -// ResetDefinitions gives a shallow copy with the models reset -func (d *Document) ResetDefinitions() *Document { - defs := make(map[string]spec.Schema, len(d.origSpec.Definitions)) - for k, v := range d.origSpec.Definitions { - defs[k] = v - } - - d.spec.Definitions = defs - return d -} - -// Pristine creates a new pristine document instance based on the input data -func (d *Document) Pristine() *Document { - dd, _ := Analyzed(d.Raw(), d.Version()) - return dd -} - -// SpecFilePath returns the file path of the spec if one is defined -func (d *Document) SpecFilePath() string { - return d.specFilePath -} - -func cloneSpec(src *spec.Swagger) (*spec.Swagger, error) { - var b bytes.Buffer - if err := gob.NewEncoder(&b).Encode(src); err != nil { - return nil, err - } - - var dst spec.Swagger - if err := gob.NewDecoder(&b).Decode(&dst); err != nil { - return nil, err - } - return &dst, nil -} diff --git a/vendor/github.com/go-openapi/runtime/.editorconfig b/vendor/github.com/go-openapi/runtime/.editorconfig deleted file mode 100644 index 3152da69a5..0000000000 --- a/vendor/github.com/go-openapi/runtime/.editorconfig +++ /dev/null @@ -1,26 +0,0 @@ -# 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/runtime/.travis.yml b/vendor/github.com/go-openapi/runtime/.travis.yml deleted file mode 100644 index 2fc7b58ff2..0000000000 --- a/vendor/github.com/go-openapi/runtime/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -after_success: -- bash <(curl -s https://codecov.io/bash) -go: -- 1.11.x -- 1.12.x -install: -- GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on -language: go -notifications: - slack: - secure: EmObnQuM9Mw8J9vpFaKKHqSMN4Wsr/A9+v7ewAD5cEhA0T1P4m7MbJMiJOhxUhj/X+BFh2DamW+P2lT8mybj5wg8wnkQ2BteKA8Tawi6f9PRw2NRheO8tAi8o/npLnlmet0kc93mn+oLuqHw36w4+j5mkOl2FghkfGiUVhwrhkCP7KXQN+3TU87e+/HzQumlJ3nsE+6terVxkH3PmaUTsS5ONaODZfuxFpfb7RsoEl3skHf6d+tr+1nViLxxly7558Nc33C+W1mr0qiEvMLZ+kJ/CpGWBJ6CUJM3jm6hNe2eMuIPwEK2hxZob8c7n22VPap4K6a0bBRoydoDXaba+2sD7Ym6ivDO/DVyL44VeBBLyIiIBylDGQdZH+6SoWm90Qe/i7tnY/T5Ao5igT8f3cfQY1c3EsTfqmlDfrhmACBmwSlgkdVBLTprHL63JMY24LWmh4jhxsmMRZhCL4dze8su1w6pLN/pD1pGHtKYCEVbdTmaM3PblNRFf12XB7qosmQsgUndH4Vq3bTbU0s1pKjeDhRyLvFzvR0TBbo0pDLEoF1A/i5GVFWa7yLZNUDudQERRh7qv/xBl2excIaQ1sV4DSVm7bAE9l6Kp+yeHQJW2uN6Y3X8wu9gB9nv9l5HBze7wh8KE6PyWAOLYYqZg9/sAtsv/2GcQqXcKFF1zcA= -script: -- gotestsum -f short-verbose -- -race -timeout=20m -coverprofile=coverage.txt -covermode=atomic ./... diff --git a/vendor/github.com/go-openapi/runtime/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/runtime/CODE_OF_CONDUCT.md deleted file mode 100644 index 9322b065e3..0000000000 --- a/vendor/github.com/go-openapi/runtime/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,74 +0,0 @@ -# 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/runtime/README.md b/vendor/github.com/go-openapi/runtime/README.md deleted file mode 100644 index 5b1ec64945..0000000000 --- a/vendor/github.com/go-openapi/runtime/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# runtime [![Build Status](https://travis-ci.org/go-openapi/runtime.svg?branch=client-context)](https://travis-ci.org/go-openapi/runtime) [![codecov](https://codecov.io/gh/go-openapi/runtime/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/runtime) [![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/runtime/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/runtime?status.svg)](http://godoc.org/github.com/go-openapi/runtime) - -# golang Open-API toolkit - runtime - -The runtime component for use in codegeneration or as untyped usage. diff --git a/vendor/github.com/go-openapi/runtime/bytestream.go b/vendor/github.com/go-openapi/runtime/bytestream.go deleted file mode 100644 index 4459025b92..0000000000 --- a/vendor/github.com/go-openapi/runtime/bytestream.go +++ /dev/null @@ -1,155 +0,0 @@ -// 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 runtime - -import ( - "bytes" - "encoding" - "errors" - "fmt" - "io" - "reflect" - - "github.com/go-openapi/swag" -) - -func defaultCloser() error { return nil } - -type byteStreamOpt func(opts *byteStreamOpts) - -// ClosesStream when the bytestream consumer or producer is finished -func ClosesStream(opts *byteStreamOpts) { - opts.Close = true -} - -type byteStreamOpts struct { - Close bool -} - -// ByteStreamConsumer creates a consmer for byte streams, -// takes a Writer/BinaryUnmarshaler interface or binary slice by reference, -// and reads from the provided reader -func ByteStreamConsumer(opts ...byteStreamOpt) Consumer { - var vals byteStreamOpts - for _, opt := range opts { - opt(&vals) - } - - return ConsumerFunc(func(reader io.Reader, data interface{}) error { - if reader == nil { - return errors.New("ByteStreamConsumer requires a reader") // early exit - } - - close := defaultCloser - if vals.Close { - if cl, ok := reader.(io.Closer); ok { - close = cl.Close - } - } - defer close() - - if wrtr, ok := data.(io.Writer); ok { - _, err := io.Copy(wrtr, reader) - return err - } - - buf := new(bytes.Buffer) - _, err := buf.ReadFrom(reader) - if err != nil { - return err - } - b := buf.Bytes() - - if bu, ok := data.(encoding.BinaryUnmarshaler); ok { - return bu.UnmarshalBinary(b) - } - - if t := reflect.TypeOf(data); data != nil && t.Kind() == reflect.Ptr { - v := reflect.Indirect(reflect.ValueOf(data)) - if t = v.Type(); t.Kind() == reflect.Slice && t.Elem().Kind() == reflect.Uint8 { - v.SetBytes(b) - return nil - } - } - - return fmt.Errorf("%v (%T) is not supported by the ByteStreamConsumer, %s", - data, data, "can be resolved by supporting Writer/BinaryUnmarshaler interface") - }) -} - -// ByteStreamProducer creates a producer for byte streams, -// takes a Reader/BinaryMarshaler interface or binary slice, -// and writes to a writer (essentially a pipe) -func ByteStreamProducer(opts ...byteStreamOpt) Producer { - var vals byteStreamOpts - for _, opt := range opts { - opt(&vals) - } - return ProducerFunc(func(writer io.Writer, data interface{}) error { - if writer == nil { - return errors.New("ByteStreamProducer requires a writer") // early exit - } - close := defaultCloser - if vals.Close { - if cl, ok := writer.(io.Closer); ok { - close = cl.Close - } - } - defer close() - - if rc, ok := data.(io.ReadCloser); ok { - defer rc.Close() - } - - if rdr, ok := data.(io.Reader); ok { - _, err := io.Copy(writer, rdr) - return err - } - - if bm, ok := data.(encoding.BinaryMarshaler); ok { - bytes, err := bm.MarshalBinary() - if err != nil { - return err - } - - _, err = writer.Write(bytes) - return err - } - - if data != nil { - if e, ok := data.(error); ok { - _, err := writer.Write([]byte(e.Error())) - return err - } - - v := reflect.Indirect(reflect.ValueOf(data)) - if t := v.Type(); t.Kind() == reflect.Slice && t.Elem().Kind() == reflect.Uint8 { - _, err := writer.Write(v.Bytes()) - return err - } - if t := v.Type(); t.Kind() == reflect.Struct || t.Kind() == reflect.Slice { - b, err := swag.WriteJSON(data) - if err != nil { - return err - } - _, err = writer.Write(b) - return err - } - } - - return fmt.Errorf("%v (%T) is not supported by the ByteStreamProducer, %s", - data, data, "can be resolved by supporting Reader/BinaryMarshaler interface") - }) -} diff --git a/vendor/github.com/go-openapi/runtime/client_auth_info.go b/vendor/github.com/go-openapi/runtime/client_auth_info.go deleted file mode 100644 index c6c97d9a7c..0000000000 --- a/vendor/github.com/go-openapi/runtime/client_auth_info.go +++ /dev/null @@ -1,30 +0,0 @@ -// 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 runtime - -import "github.com/go-openapi/strfmt" - -// A ClientAuthInfoWriterFunc converts a function to a request writer interface -type ClientAuthInfoWriterFunc func(ClientRequest, strfmt.Registry) error - -// AuthenticateRequest adds authentication data to the request -func (fn ClientAuthInfoWriterFunc) AuthenticateRequest(req ClientRequest, reg strfmt.Registry) error { - return fn(req, reg) -} - -// A ClientAuthInfoWriter implementor knows how to write authentication info to a request -type ClientAuthInfoWriter interface { - AuthenticateRequest(ClientRequest, strfmt.Registry) error -} diff --git a/vendor/github.com/go-openapi/runtime/client_operation.go b/vendor/github.com/go-openapi/runtime/client_operation.go deleted file mode 100644 index fa21eacf33..0000000000 --- a/vendor/github.com/go-openapi/runtime/client_operation.go +++ /dev/null @@ -1,41 +0,0 @@ -// 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 runtime - -import ( - "context" - "net/http" -) - -// ClientOperation represents the context for a swagger operation to be submitted to the transport -type ClientOperation struct { - ID string - Method string - PathPattern string - ProducesMediaTypes []string - ConsumesMediaTypes []string - Schemes []string - AuthInfo ClientAuthInfoWriter - Params ClientRequestWriter - Reader ClientResponseReader - Context context.Context - Client *http.Client -} - -// A ClientTransport implementor knows how to submit Request objects to some destination -type ClientTransport interface { - //Submit(string, RequestWriter, ResponseReader, AuthInfoWriter) (interface{}, error) - Submit(*ClientOperation) (interface{}, error) -} diff --git a/vendor/github.com/go-openapi/runtime/client_request.go b/vendor/github.com/go-openapi/runtime/client_request.go deleted file mode 100644 index 904196ae3e..0000000000 --- a/vendor/github.com/go-openapi/runtime/client_request.go +++ /dev/null @@ -1,103 +0,0 @@ -// 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 runtime - -import ( - "io" - "io/ioutil" - "net/http" - "net/url" - "time" - - "github.com/go-openapi/strfmt" -) - -// ClientRequestWriterFunc converts a function to a request writer interface -type ClientRequestWriterFunc func(ClientRequest, strfmt.Registry) error - -// WriteToRequest adds data to the request -func (fn ClientRequestWriterFunc) WriteToRequest(req ClientRequest, reg strfmt.Registry) error { - return fn(req, reg) -} - -// ClientRequestWriter is an interface for things that know how to write to a request -type ClientRequestWriter interface { - WriteToRequest(ClientRequest, strfmt.Registry) error -} - -// ClientRequest is an interface for things that know how to -// add information to a swagger client request -type ClientRequest interface { - SetHeaderParam(string, ...string) error - - GetHeaderParams() http.Header - - SetQueryParam(string, ...string) error - - SetFormParam(string, ...string) error - - SetPathParam(string, string) error - - GetQueryParams() url.Values - - SetFileParam(string, ...NamedReadCloser) error - - SetBodyParam(interface{}) error - - SetTimeout(time.Duration) error - - GetMethod() string - - GetPath() string - - GetBody() []byte - - GetBodyParam() interface{} - - GetFileParam() map[string][]NamedReadCloser -} - -// NamedReadCloser represents a named ReadCloser interface -type NamedReadCloser interface { - io.ReadCloser - Name() string -} - -// NamedReader creates a NamedReadCloser for use as file upload -func NamedReader(name string, rdr io.Reader) NamedReadCloser { - rc, ok := rdr.(io.ReadCloser) - if !ok { - rc = ioutil.NopCloser(rdr) - } - return &namedReadCloser{ - name: name, - cr: rc, - } -} - -type namedReadCloser struct { - name string - cr io.ReadCloser -} - -func (n *namedReadCloser) Close() error { - return n.cr.Close() -} -func (n *namedReadCloser) Read(p []byte) (int, error) { - return n.cr.Read(p) -} -func (n *namedReadCloser) Name() string { - return n.name -} diff --git a/vendor/github.com/go-openapi/runtime/client_response.go b/vendor/github.com/go-openapi/runtime/client_response.go deleted file mode 100644 index 729e18b228..0000000000 --- a/vendor/github.com/go-openapi/runtime/client_response.go +++ /dev/null @@ -1,63 +0,0 @@ -// 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 runtime - -import ( - "fmt" - "io" -) - -// A ClientResponse represents a client response -// This bridges between responses obtained from different transports -type ClientResponse interface { - Code() int - Message() string - GetHeader(string) string - Body() io.ReadCloser -} - -// A ClientResponseReaderFunc turns a function into a ClientResponseReader interface implementation -type ClientResponseReaderFunc func(ClientResponse, Consumer) (interface{}, error) - -// ReadResponse reads the response -func (read ClientResponseReaderFunc) ReadResponse(resp ClientResponse, consumer Consumer) (interface{}, error) { - return read(resp, consumer) -} - -// A ClientResponseReader is an interface for things want to read a response. -// An application of this is to create structs from response values -type ClientResponseReader interface { - ReadResponse(ClientResponse, Consumer) (interface{}, error) -} - -// NewAPIError creates a new API error -func NewAPIError(opName string, payload interface{}, code int) *APIError { - return &APIError{ - OperationName: opName, - Response: payload, - Code: code, - } -} - -// APIError wraps an error model and captures the status code -type APIError struct { - OperationName string - Response interface{} - Code int -} - -func (a *APIError) Error() string { - return fmt.Sprintf("%s (status %d): %+v ", a.OperationName, a.Code, a.Response) -} diff --git a/vendor/github.com/go-openapi/runtime/constants.go b/vendor/github.com/go-openapi/runtime/constants.go deleted file mode 100644 index a4de897adc..0000000000 --- a/vendor/github.com/go-openapi/runtime/constants.go +++ /dev/null @@ -1,47 +0,0 @@ -// 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 runtime - -const ( - // HeaderContentType represents a http content-type header, it's value is supposed to be a mime type - HeaderContentType = "Content-Type" - - // HeaderTransferEncoding represents a http transfer-encoding header. - HeaderTransferEncoding = "Transfer-Encoding" - - // HeaderAccept the Accept header - HeaderAccept = "Accept" - - charsetKey = "charset" - - // DefaultMime the default fallback mime type - DefaultMime = "application/octet-stream" - // JSONMime the json mime type - JSONMime = "application/json" - // YAMLMime the yaml mime type - YAMLMime = "application/x-yaml" - // XMLMime the xml mime type - XMLMime = "application/xml" - // TextMime the text mime type - TextMime = "text/plain" - // HTMLMime the html mime type - HTMLMime = "text/html" - // CSVMime the csv mime type - CSVMime = "text/csv" - // MultipartFormMime the multipart form mime type - MultipartFormMime = "multipart/form-data" - // URLencodedFormMime the url encoded form mime type - URLencodedFormMime = "application/x-www-form-urlencoded" -) diff --git a/vendor/github.com/go-openapi/runtime/csv.go b/vendor/github.com/go-openapi/runtime/csv.go deleted file mode 100644 index d807bd915b..0000000000 --- a/vendor/github.com/go-openapi/runtime/csv.go +++ /dev/null @@ -1,77 +0,0 @@ -// 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 runtime - -import ( - "bytes" - "encoding/csv" - "errors" - "io" -) - -// CSVConsumer creates a new CSV consumer -func CSVConsumer() Consumer { - return ConsumerFunc(func(reader io.Reader, data interface{}) error { - if reader == nil { - return errors.New("CSVConsumer requires a reader") - } - - csvReader := csv.NewReader(reader) - writer, ok := data.(io.Writer) - if !ok { - return errors.New("data type must be io.Writer") - } - csvWriter := csv.NewWriter(writer) - records, err := csvReader.ReadAll() - if err != nil { - return err - } - for _, r := range records { - if err := csvWriter.Write(r); err != nil { - return err - } - } - csvWriter.Flush() - return nil - }) -} - -// CSVProducer creates a new CSV producer -func CSVProducer() Producer { - return ProducerFunc(func(writer io.Writer, data interface{}) error { - if writer == nil { - return errors.New("CSVProducer requires a writer") - } - - dataBytes, ok := data.([]byte) - if !ok { - return errors.New("data type must be byte array") - } - - csvReader := csv.NewReader(bytes.NewBuffer(dataBytes)) - records, err := csvReader.ReadAll() - if err != nil { - return err - } - csvWriter := csv.NewWriter(writer) - for _, r := range records { - if err := csvWriter.Write(r); err != nil { - return err - } - } - csvWriter.Flush() - return nil - }) -} diff --git a/vendor/github.com/go-openapi/runtime/discard.go b/vendor/github.com/go-openapi/runtime/discard.go deleted file mode 100644 index 0d390cfd64..0000000000 --- a/vendor/github.com/go-openapi/runtime/discard.go +++ /dev/null @@ -1,9 +0,0 @@ -package runtime - -import "io" - -// DiscardConsumer does absolutely nothing, it's a black hole. -var DiscardConsumer = ConsumerFunc(func(_ io.Reader, _ interface{}) error { return nil }) - -// DiscardProducer does absolutely nothing, it's a black hole. -var DiscardProducer = ProducerFunc(func(_ io.Writer, _ interface{}) error { return nil }) diff --git a/vendor/github.com/go-openapi/runtime/go.mod b/vendor/github.com/go-openapi/runtime/go.mod deleted file mode 100644 index ddf6f1613a..0000000000 --- a/vendor/github.com/go-openapi/runtime/go.mod +++ /dev/null @@ -1,16 +0,0 @@ -module github.com/go-openapi/runtime - -require ( - github.com/docker/go-units v0.4.0 - github.com/go-openapi/analysis v0.19.2 - github.com/go-openapi/errors v0.19.2 - github.com/go-openapi/loads v0.19.2 - github.com/go-openapi/spec v0.19.2 - github.com/go-openapi/strfmt v0.19.0 - github.com/go-openapi/swag v0.19.2 - github.com/go-openapi/validate v0.19.2 - github.com/stretchr/testify v1.3.0 - golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56 // indirect - golang.org/x/tools v0.0.0-20190617190820-da514acc4774 // indirect - gopkg.in/yaml.v2 v2.2.2 -) diff --git a/vendor/github.com/go-openapi/runtime/go.sum b/vendor/github.com/go-openapi/runtime/go.sum deleted file mode 100644 index bdb97c3a8a..0000000000 --- a/vendor/github.com/go-openapi/runtime/go.sum +++ /dev/null @@ -1,133 +0,0 @@ -github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4= -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-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/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf h1:eg0MeVzsP1G42dRafH3vf+al2vQIJU0YHX+1Tw87oco= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/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/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -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 h1:eYp14J1o8TTSCzndHBtsNuckikV1PfZOSnx4BcBeu0c= -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 h1:ophLETFestFZHk3ji7niPEL4d466QjW+0Tdg5VyDq7E= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.17.2 h1:azEQ8Fnx0jmtFF2fxsnmd6I0x6rsweUF63qqSO1NmKk= -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 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.17.2 h1:3ekBy41gar/iJi2KSh/au/PrC2vpLr85upF/UZmm3W0= -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 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.17.2 h1:lF3z7AH8dd0IKXc1zEBi1dj0B4XgVb5cVjn39dCK3Ls= -github.com/go-openapi/jsonreference v0.17.2/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.17.2 h1:tEXYu6Xc0pevpzzQx5ghrMN9F7IVpN/+u4iD3rkYE5o= -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 h1:rf5ArTHmIJxyV5Oiks+Su0mUens1+AjpkPoWr5xFRcI= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.17.2 h1:eb2NbuCnoe8cWAxhtK6CfMWUYmiFEZJ9Hx3Z2WRwJ5M= -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 h1:SStNd1jRcYtfKCN7R0laGNs80WYYvn5CbBjM2sOmCrE= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.17.2 h1:2KDns36DMHXG9/iYkOjiX+/8fKK9GCU5ELZ+J6qcRVA= -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 h1:0Dn9qy1G9+UJfRU7TR8bmdGxb4uifB7HNrJjOnV0yPk= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.17.2 h1:K/ycE/XTUDFltNHSO32cGRUhrVGJD64o8WgAIZNyc3k= -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 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/validate v0.17.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.17.2 h1:lwFfiS4sv5DvOrsYDsYq4N7UU8ghXiYtPJ+VcQnC3Xg= -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 h1:ky5l57HjyVRrsJfd2+Ro5Z9PjGuKbsmftwyMtk8H7js= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -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/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe h1:W/GaMY0y69G4cFlmsC6B9sbuo2fP8OFP1ABjt4kPz+w= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -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-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc h1:a3CU5tJYVj92DY2LaA1kUkrsqD5/3mLDhx2NcNqyW+0= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53 h1:kcXqo9vE6fsZY5X5Rd7R1l7fTgnWaDCVmln65REefiE= -golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -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= -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/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-openapi/runtime/interfaces.go b/vendor/github.com/go-openapi/runtime/interfaces.go deleted file mode 100644 index 65de0aa44b..0000000000 --- a/vendor/github.com/go-openapi/runtime/interfaces.go +++ /dev/null @@ -1,103 +0,0 @@ -// 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 runtime - -import ( - "io" - "net/http" - - "github.com/go-openapi/strfmt" -) - -// OperationHandlerFunc an adapter for a function to the OperationHandler interface -type OperationHandlerFunc func(interface{}) (interface{}, error) - -// Handle implements the operation handler interface -func (s OperationHandlerFunc) Handle(data interface{}) (interface{}, error) { - return s(data) -} - -// OperationHandler a handler for a swagger operation -type OperationHandler interface { - Handle(interface{}) (interface{}, error) -} - -// ConsumerFunc represents a function that can be used as a consumer -type ConsumerFunc func(io.Reader, interface{}) error - -// Consume consumes the reader into the data parameter -func (fn ConsumerFunc) Consume(reader io.Reader, data interface{}) error { - return fn(reader, data) -} - -// Consumer implementations know how to bind the values on the provided interface to -// data provided by the request body -type Consumer interface { - // Consume performs the binding of request values - Consume(io.Reader, interface{}) error -} - -// ProducerFunc represents a function that can be used as a producer -type ProducerFunc func(io.Writer, interface{}) error - -// Produce produces the response for the provided data -func (f ProducerFunc) Produce(writer io.Writer, data interface{}) error { - return f(writer, data) -} - -// Producer implementations know how to turn the provided interface into a valid -// HTTP response -type Producer interface { - // Produce writes to the http response - Produce(io.Writer, interface{}) error -} - -// AuthenticatorFunc turns a function into an authenticator -type AuthenticatorFunc func(interface{}) (bool, interface{}, error) - -// Authenticate authenticates the request with the provided data -func (f AuthenticatorFunc) Authenticate(params interface{}) (bool, interface{}, error) { - return f(params) -} - -// Authenticator represents an authentication strategy -// implementations of Authenticator know how to authenticate the -// request data and translate that into a valid principal object or an error -type Authenticator interface { - Authenticate(interface{}) (bool, interface{}, error) -} - -// AuthorizerFunc turns a function into an authorizer -type AuthorizerFunc func(*http.Request, interface{}) error - -// Authorize authorizes the processing of the request for the principal -func (f AuthorizerFunc) Authorize(r *http.Request, principal interface{}) error { - return f(r, principal) -} - -// Authorizer represents an authorization strategy -// implementations of Authorizer know how to authorize the principal object -// using the request data and returns error if unauthorized -type Authorizer interface { - Authorize(*http.Request, interface{}) error -} - -// Validatable types implementing this interface allow customizing their validation -// this will be used instead of the reflective validation based on the spec document. -// the implementations are assumed to have been generated by the swagger tool so they should -// contain all the validations obtained from the spec -type Validatable interface { - Validate(strfmt.Registry) error -} diff --git a/vendor/github.com/go-openapi/runtime/request.go b/vendor/github.com/go-openapi/runtime/request.go deleted file mode 100644 index 9e51b42b59..0000000000 --- a/vendor/github.com/go-openapi/runtime/request.go +++ /dev/null @@ -1,139 +0,0 @@ -// 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 runtime - -import ( - "bufio" - "io" - "net/http" - "strings" - - "github.com/go-openapi/swag" -) - -// CanHaveBody returns true if this method can have a body -func CanHaveBody(method string) bool { - mn := strings.ToUpper(method) - return mn == "POST" || mn == "PUT" || mn == "PATCH" || mn == "DELETE" -} - -// IsSafe returns true if this is a request with a safe method -func IsSafe(r *http.Request) bool { - mn := strings.ToUpper(r.Method) - return mn == "GET" || mn == "HEAD" -} - -// AllowsBody returns true if the request allows for a body -func AllowsBody(r *http.Request) bool { - mn := strings.ToUpper(r.Method) - return mn != "HEAD" -} - -// HasBody returns true if this method needs a content-type -func HasBody(r *http.Request) bool { - // happy case: we have a content length set - if r.ContentLength > 0 { - return true - } - - if r.Header.Get(http.CanonicalHeaderKey("content-length")) != "" { - // in this case, no Transfer-Encoding should be present - // we have a header set but it was explicitly set to 0, so we assume no body - return false - } - - rdr := newPeekingReader(r.Body) - r.Body = rdr - return rdr.HasContent() -} - -func newPeekingReader(r io.ReadCloser) *peekingReader { - if r == nil { - return nil - } - return &peekingReader{ - underlying: bufio.NewReader(r), - orig: r, - } -} - -type peekingReader struct { - underlying interface { - Buffered() int - Peek(int) ([]byte, error) - Read([]byte) (int, error) - } - orig io.ReadCloser -} - -func (p *peekingReader) HasContent() bool { - if p == nil { - return false - } - if p.underlying.Buffered() > 0 { - return true - } - b, err := p.underlying.Peek(1) - if err != nil { - return false - } - return len(b) > 0 -} - -func (p *peekingReader) Read(d []byte) (int, error) { - if p == nil { - return 0, io.EOF - } - return p.underlying.Read(d) -} - -func (p *peekingReader) Close() error { - p.underlying = nil - if p.orig != nil { - return p.orig.Close() - } - return nil -} - -// JSONRequest creates a new http request with json headers set -func JSONRequest(method, urlStr string, body io.Reader) (*http.Request, error) { - req, err := http.NewRequest(method, urlStr, body) - if err != nil { - return nil, err - } - req.Header.Add(HeaderContentType, JSONMime) - req.Header.Add(HeaderAccept, JSONMime) - return req, nil -} - -// Gettable for things with a method GetOK(string) (data string, hasKey bool, hasValue bool) -type Gettable interface { - GetOK(string) ([]string, bool, bool) -} - -// ReadSingleValue reads a single value from the source -func ReadSingleValue(values Gettable, name string) string { - vv, _, hv := values.GetOK(name) - if hv { - return vv[len(vv)-1] - } - return "" -} - -// ReadCollectionValue reads a collection value from a string data source -func ReadCollectionValue(values Gettable, name, collectionFormat string) []string { - v := ReadSingleValue(values, name) - return swag.SplitByFormat(v, collectionFormat) -} diff --git a/vendor/github.com/go-openapi/runtime/statuses.go b/vendor/github.com/go-openapi/runtime/statuses.go deleted file mode 100644 index 3b011a0bff..0000000000 --- a/vendor/github.com/go-openapi/runtime/statuses.go +++ /dev/null @@ -1,90 +0,0 @@ -// 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 runtime - -// Statuses lists the most common HTTP status codes to default message -// taken from https://httpstatuses.com/ -var Statuses = map[int]string{ - 100: "Continue", - 101: "Switching Protocols", - 102: "Processing", - 103: "Checkpoint", - 122: "URI too long", - 200: "OK", - 201: "Created", - 202: "Accepted", - 203: "Request Processed", - 204: "No Content", - 205: "Reset Content", - 206: "Partial Content", - 207: "Multi-Status", - 208: "Already Reported", - 226: "IM Used", - 300: "Multiple Choices", - 301: "Moved Permanently", - 302: "Found", - 303: "See Other", - 304: "Not Modified", - 305: "Use Proxy", - 306: "Switch Proxy", - 307: "Temporary Redirect", - 308: "Permanent Redirect", - 400: "Bad Request", - 401: "Unauthorized", - 402: "Payment Required", - 403: "Forbidden", - 404: "Not Found", - 405: "Method Not Allowed", - 406: "Not Acceptable", - 407: "Proxy Authentication Required", - 408: "Request Timeout", - 409: "Conflict", - 410: "Gone", - 411: "Length Required", - 412: "Precondition Failed", - 413: "Request Entity Too Large", - 414: "Request-URI Too Long", - 415: "Unsupported Media Type", - 416: "Request Range Not Satisfiable", - 417: "Expectation Failed", - 418: "I'm a teapot", - 420: "Enhance Your Calm", - 422: "Unprocessable Entity", - 423: "Locked", - 424: "Failed Dependency", - 426: "Upgrade Required", - 428: "Precondition Required", - 429: "Too Many Requests", - 431: "Request Header Fields Too Large", - 444: "No Response", - 449: "Retry With", - 450: "Blocked by Windows Parental Controls", - 451: "Wrong Exchange Server", - 499: "Client Closed Request", - 500: "Internal Server Error", - 501: "Not Implemented", - 502: "Bad Gateway", - 503: "Service Unavailable", - 504: "Gateway Timeout", - 505: "HTTP Version Not Supported", - 506: "Variant Also Negotiates", - 507: "Insufficient Storage", - 508: "Loop Detected", - 509: "Bandwidth Limit Exceeded", - 510: "Not Extended", - 511: "Network Authentication Required", - 598: "Network read timeout error", - 599: "Network connect timeout error", -} diff --git a/vendor/github.com/go-openapi/runtime/text.go b/vendor/github.com/go-openapi/runtime/text.go deleted file mode 100644 index c7fd04c3c5..0000000000 --- a/vendor/github.com/go-openapi/runtime/text.go +++ /dev/null @@ -1,117 +0,0 @@ -// 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 runtime - -import ( - "bytes" - "encoding" - "errors" - "fmt" - "io" - "reflect" - - "github.com/go-openapi/swag" -) - -// TextConsumer creates a new text consumer -func TextConsumer() Consumer { - return ConsumerFunc(func(reader io.Reader, data interface{}) error { - if reader == nil { - return errors.New("TextConsumer requires a reader") // early exit - } - - buf := new(bytes.Buffer) - _, err := buf.ReadFrom(reader) - if err != nil { - return err - } - b := buf.Bytes() - - // If the buffer is empty, no need to unmarshal it, which causes a panic. - if len(b) == 0 { - data = "" - return nil - } - - if tu, ok := data.(encoding.TextUnmarshaler); ok { - err := tu.UnmarshalText(b) - if err != nil { - return fmt.Errorf("text consumer: %v", err) - } - - return nil - } - - t := reflect.TypeOf(data) - if data != nil && t.Kind() == reflect.Ptr { - v := reflect.Indirect(reflect.ValueOf(data)) - if t.Elem().Kind() == reflect.String { - v.SetString(string(b)) - return nil - } - } - - return fmt.Errorf("%v (%T) is not supported by the TextConsumer, %s", - data, data, "can be resolved by supporting TextUnmarshaler interface") - }) -} - -// TextProducer creates a new text producer -func TextProducer() Producer { - return ProducerFunc(func(writer io.Writer, data interface{}) error { - if writer == nil { - return errors.New("TextProducer requires a writer") // early exit - } - - if data == nil { - return errors.New("no data given to produce text from") - } - - if tm, ok := data.(encoding.TextMarshaler); ok { - txt, err := tm.MarshalText() - if err != nil { - return fmt.Errorf("text producer: %v", err) - } - _, err = writer.Write(txt) - return err - } - - if str, ok := data.(error); ok { - _, err := writer.Write([]byte(str.Error())) - return err - } - - if str, ok := data.(fmt.Stringer); ok { - _, err := writer.Write([]byte(str.String())) - return err - } - - v := reflect.Indirect(reflect.ValueOf(data)) - if t := v.Type(); t.Kind() == reflect.Struct || t.Kind() == reflect.Slice { - b, err := swag.WriteJSON(data) - if err != nil { - return err - } - _, err = writer.Write(b) - return err - } - if v.Kind() != reflect.String { - return fmt.Errorf("%T is not a supported type by the TextProducer", data) - } - - _, err := writer.Write([]byte(v.String())) - return err - }) -} diff --git a/vendor/github.com/go-openapi/runtime/values.go b/vendor/github.com/go-openapi/runtime/values.go deleted file mode 100644 index 11f5732af4..0000000000 --- a/vendor/github.com/go-openapi/runtime/values.go +++ /dev/null @@ -1,19 +0,0 @@ -package runtime - -// Values typically represent parameters on a http request. -type Values map[string][]string - -// GetOK returns the values collection for the given key. -// When the key is present in the map it will return true for hasKey. -// When the value is not empty it will return true for hasValue. -func (v Values) GetOK(key string) (value []string, hasKey bool, hasValue bool) { - value, hasKey = v[key] - if !hasKey { - return - } - if len(value) == 0 { - return - } - hasValue = true - return -} diff --git a/vendor/github.com/go-openapi/runtime/xml.go b/vendor/github.com/go-openapi/runtime/xml.go deleted file mode 100644 index 821c7393df..0000000000 --- a/vendor/github.com/go-openapi/runtime/xml.go +++ /dev/null @@ -1,36 +0,0 @@ -// 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 runtime - -import ( - "encoding/xml" - "io" -) - -// XMLConsumer creates a new XML consumer -func XMLConsumer() Consumer { - return ConsumerFunc(func(reader io.Reader, data interface{}) error { - dec := xml.NewDecoder(reader) - return dec.Decode(data) - }) -} - -// XMLProducer creates a new XML producer -func XMLProducer() Producer { - return ProducerFunc(func(writer io.Writer, data interface{}) error { - enc := xml.NewEncoder(writer) - return enc.Encode(data) - }) -} diff --git a/vendor/github.com/go-openapi/strfmt/.editorconfig b/vendor/github.com/go-openapi/strfmt/.editorconfig deleted file mode 100644 index 3152da69a5..0000000000 --- a/vendor/github.com/go-openapi/strfmt/.editorconfig +++ /dev/null @@ -1,26 +0,0 @@ -# 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/strfmt/.golangci.yml b/vendor/github.com/go-openapi/strfmt/.golangci.yml deleted file mode 100644 index f260ce7e5c..0000000000 --- a/vendor/github.com/go-openapi/strfmt/.golangci.yml +++ /dev/null @@ -1,30 +0,0 @@ -linters-settings: - govet: - check-shadowing: true - golint: - min-confidence: 0 - gocyclo: - min-complexity: 31 - maligned: - suggest-new: true - dupl: - threshold: 100 - goconst: - min-len: 2 - min-occurrences: 4 - -linters: - enable-all: true - disable: - - maligned - - lll - - gochecknoinits - - gochecknoglobals - -issues: - exclude-rules: - - path: bson.go - text: "should be .*ObjectID" - linters: - - golint - diff --git a/vendor/github.com/go-openapi/strfmt/.travis.yml b/vendor/github.com/go-openapi/strfmt/.travis.yml deleted file mode 100644 index eb962aebcd..0000000000 --- a/vendor/github.com/go-openapi/strfmt/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -after_success: -- bash <(curl -s https://codecov.io/bash) -go: -- 1.11.x -- 1.12.x -install: -- GO111MODULE=off go get -u gotest.tools/gotestsum -language: go -env: -- GO111MODULE=on -notifications: - slack: - secure: zE5AtIYTpYfQPnTzP+EaQPN7JKtfFAGv6PrJqoIZLOXa8B6zGb6+J1JRNNxWi7faWbyJOxa4FSSsuPsKZMycUK6wlLFIdhDxwqeo7Ew8r6rdZKdfUHQggfNS9wO79ARoNYUDHtmnaBUS+eWSM1YqSc4i99QxyyfuURLOeAaA/q14YbdlTlaw3lrZ0qT92ot1FnVGNOx064zuHtFeUf+jAVRMZ6Q3rvqllwIlPszE6rmHGXBt2VoJxRaBetdwd7FgkcYw9FPXKHhadwC7/75ZAdmxIukhxNMw4Tr5NuPcqNcnbYLenDP7B3lssGVIrP4BRSqekS1d/tqvdvnnFWHMwrNCkSnSc065G5+qWTlXKAemIclgiXXqE2furBNLm05MDdG8fn5epS0UNarkjD+zX336RiqwBlOX4KbF+vPyqcO98CsN0lnd+H6loc9reiTHs37orFFpQ+309av9be2GGsHUsRB9ssIyrewmhAccOmkRtr2dVTZJNFQwa5Kph5TNJuTjnZEwG/xUkEX2YSfwShOsb062JWiflV6PJdnl80pc9Tn7D5sO5Bf9DbijGRJwwP+YiiJtwtr+vsvS+n4sM0b5eqm4UoRo+JJO8ffoJtHS7ItuyRbVQCwEPJ4221WLcf5PquEEDdAPwR+K4Gj8qTXqTDdxOiES1xFUKVgmzhI= -script: -- gotestsum -f short-verbose -- -race -coverprofile=coverage.txt -covermode=atomic ./... diff --git a/vendor/github.com/go-openapi/strfmt/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/strfmt/CODE_OF_CONDUCT.md deleted file mode 100644 index 9322b065e3..0000000000 --- a/vendor/github.com/go-openapi/strfmt/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,74 +0,0 @@ -# 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/strfmt/LICENSE b/vendor/github.com/go-openapi/strfmt/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/vendor/github.com/go-openapi/strfmt/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/go-openapi/strfmt/README.md b/vendor/github.com/go-openapi/strfmt/README.md deleted file mode 100644 index 87357cd024..0000000000 --- a/vendor/github.com/go-openapi/strfmt/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# Strfmt [![Build Status](https://travis-ci.org/go-openapi/strfmt.svg?branch=master)](https://travis-ci.org/go-openapi/strfmt) [![codecov](https://codecov.io/gh/go-openapi/strfmt/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/strfmt) [![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/strfmt/master/LICENSE) -[![GoDoc](https://godoc.org/github.com/go-openapi/strfmt?status.svg)](http://godoc.org/github.com/go-openapi/strfmt) -[![GolangCI](https://golangci.com/badges/github.com/go-openapi/strfmt.svg)](https://golangci.com) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/strfmt)](https://goreportcard.com/report/github.com/go-openapi/strfmt) - -This package exposes a registry of data types to support string formats in the go-openapi toolkit. - -strfmt represents a well known string format such as credit card or email. The go toolkit for OpenAPI specifications knows how to deal with those. - -## Supported data formats -go-openapi/strfmt follows the swagger 2.0 specification with the following formats -defined [here](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types). - -It also provides convenient extensions to go-openapi users. - -- [x] JSON-schema draft 4 formats - - date-time - - email - - hostname - - ipv4 - - ipv6 - - uri -- [x] swagger 2.0 format extensions - - binary - - byte (e.g. base64 encoded string) - - date (e.g. "1970-01-01") - - password -- [x] go-openapi custom format extensions - - bsonobjectid (BSON objectID) - - creditcard - - duration (e.g. "3 weeks", "1ms") - - hexcolor (e.g. "#FFFFFF") - - isbn, isbn10, isbn13 - - mac (e.g "01:02:03:04:05:06") - - rgbcolor (e.g. "rgb(100,100,100)") - - ssn - - uuid, uuid3, uuid4, uuid5 - - cidr (e.g. "192.0.2.1/24", "2001:db8:a0b:12f0::1/32") - -> NOTE: as the name stands for, this package is intended to support string formatting only. -> It does not provide validation for numerical values with swagger format extension for JSON types "number" or -> "integer" (e.g. float, double, int32...). - -## Format types -Types defined in strfmt expose marshaling and validation capabilities. - -List of defined types: -- Base64 -- CreditCard -- Date -- DateTime -- Duration -- Email -- HexColor -- Hostname -- IPv4 -- IPv6 -- CIDR -- ISBN -- ISBN10 -- ISBN13 -- MAC -- ObjectId -- Password -- RGBColor -- SSN -- URI -- UUID -- UUID3 -- UUID4 -- UUID5 diff --git a/vendor/github.com/go-openapi/strfmt/go.mod b/vendor/github.com/go-openapi/strfmt/go.mod deleted file mode 100644 index 78c8489b20..0000000000 --- a/vendor/github.com/go-openapi/strfmt/go.mod +++ /dev/null @@ -1,13 +0,0 @@ -module github.com/go-openapi/strfmt - -require ( - github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a - github.com/go-openapi/errors v0.19.2 - github.com/go-stack/stack v1.8.0 // indirect - github.com/google/go-cmp v0.3.0 // indirect - github.com/google/uuid v1.1.1 - github.com/mitchellh/mapstructure v1.1.2 - github.com/stretchr/testify v1.3.0 - github.com/tidwall/pretty v1.0.0 // indirect - go.mongodb.org/mongo-driver v1.0.3 -) diff --git a/vendor/github.com/go-openapi/strfmt/go.sum b/vendor/github.com/go-openapi/strfmt/go.sum deleted file mode 100644 index e53dd37c10..0000000000 --- a/vendor/github.com/go-openapi/strfmt/go.sum +++ /dev/null @@ -1,25 +0,0 @@ -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/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/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -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/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= diff --git a/vendor/github.com/go-openapi/validate/.editorconfig b/vendor/github.com/go-openapi/validate/.editorconfig deleted file mode 100644 index 3152da69a5..0000000000 --- a/vendor/github.com/go-openapi/validate/.editorconfig +++ /dev/null @@ -1,26 +0,0 @@ -# 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/validate/.golangci.yml b/vendor/github.com/go-openapi/validate/.golangci.yml deleted file mode 100644 index dc8178c809..0000000000 --- a/vendor/github.com/go-openapi/validate/.golangci.yml +++ /dev/null @@ -1,28 +0,0 @@ -linters-settings: - govet: - check-shadowing: true - golint: - min-confidence: 0 - gocyclo: - min-complexity: 50 - maligned: - suggest-new: true - dupl: - threshold: 100 - goconst: - min-len: 2 - min-occurrences: 3 - -linters: - enable-all: true - disable: - - maligned - - lll - - godox - - gocognit - - whitespace - - wsl - - funlen - - gochecknoglobals - - gochecknoinits - - scopelint diff --git a/vendor/github.com/go-openapi/validate/.travis.yml b/vendor/github.com/go-openapi/validate/.travis.yml deleted file mode 100644 index dd3a4b29fd..0000000000 --- a/vendor/github.com/go-openapi/validate/.travis.yml +++ /dev/null @@ -1,19 +0,0 @@ -after_success: -- bash <(curl -s https://codecov.io/bash) -go: -- 1.11.x -- 1.12.x -install: -- GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on -language: go -notifications: - slack: - secure: EmObnQuM9Mw8J9vpFaKKHqSMN4Wsr/A9+v7ewAD5cEhA0T1P4m7MbJMiJOhxUhj/X+BFh2DamW+P2lT8mybj5wg8wnkQ2BteKA8Tawi6f9PRw2NRheO8tAi8o/npLnlmet0kc93mn+oLuqHw36w4+j5mkOl2FghkfGiUVhwrhkCP7KXQN+3TU87e+/HzQumlJ3nsE+6terVxkH3PmaUTsS5ONaODZfuxFpfb7RsoEl3skHf6d+tr+1nViLxxly7558Nc33C+W1mr0qiEvMLZ+kJ/CpGWBJ6CUJM3jm6hNe2eMuIPwEK2hxZob8c7n22VPap4K6a0bBRoydoDXaba+2sD7Ym6ivDO/DVyL44VeBBLyIiIBylDGQdZH+6SoWm90Qe/i7tnY/T5Ao5igT8f3cfQY1c3EsTfqmlDfrhmACBmwSlgkdVBLTprHL63JMY24LWmh4jhxsmMRZhCL4dze8su1w6pLN/pD1pGHtKYCEVbdTmaM3PblNRFf12XB7qosmQsgUndH4Vq3bTbU0s1pKjeDhRyLvFzvR0TBbo0pDLEoF1A/i5GVFWa7yLZNUDudQERRh7qv/xBl2excIaQ1sV4DSVm7bAE9l6Kp+yeHQJW2uN6Y3X8wu9gB9nv9l5HBze7wh8KE6PyWAOLYYqZg9/sAtsv/2GcQqXcKFF1zcA= -script: -- gotestsum -f short-verbose -- -race ./... -- gotestsum -f short-verbose -- -timeout=20m -coverprofile=coverage.txt -covermode=atomic -args -enable-long ./... -- gotestsum -f short-verbose -- -timeout=30m -args -enable-go-swagger ./... -- go get -u github.com/go-openapi/runtime@master -- gotestsum -f short-verbose -- -timeout=30m github.com/go-openapi/runtime/... diff --git a/vendor/github.com/go-openapi/validate/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/validate/CODE_OF_CONDUCT.md deleted file mode 100644 index 9322b065e3..0000000000 --- a/vendor/github.com/go-openapi/validate/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,74 +0,0 @@ -# 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/validate/LICENSE b/vendor/github.com/go-openapi/validate/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/vendor/github.com/go-openapi/validate/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/go-openapi/validate/README.md b/vendor/github.com/go-openapi/validate/README.md deleted file mode 100644 index 08fb352bcf..0000000000 --- a/vendor/github.com/go-openapi/validate/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Validation helpers [![Build Status](https://travis-ci.org/go-openapi/validate.svg?branch=master)](https://travis-ci.org/go-openapi/validate) [![codecov](https://codecov.io/gh/go-openapi/validate/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/validate) [![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/validate/master/LICENSE) -[![GoDoc](https://godoc.org/github.com/go-openapi/validate?status.svg)](http://godoc.org/github.com/go-openapi/validate) -[![GolangCI](https://golangci.com/badges/github.com/go-openapi/validate.svg)](https://golangci.com) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/validate)](https://goreportcard.com/report/github.com/go-openapi/validate) diff --git a/vendor/github.com/go-openapi/validate/default_validator.go b/vendor/github.com/go-openapi/validate/default_validator.go deleted file mode 100644 index 26d54b7c23..0000000000 --- a/vendor/github.com/go-openapi/validate/default_validator.go +++ /dev/null @@ -1,281 +0,0 @@ -// 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 validate - -import ( - "fmt" - "strings" - - "github.com/go-openapi/spec" -) - -// defaultValidator validates default values in a spec. -// According to Swagger spec, default values MUST validate their schema. -type defaultValidator struct { - SpecValidator *SpecValidator - visitedSchemas map[string]bool -} - -// resetVisited resets the internal state of visited schemas -func (d *defaultValidator) resetVisited() { - d.visitedSchemas = map[string]bool{} -} - -func isVisited(path string, visitedSchemas map[string]bool) bool { - found := visitedSchemas[path] - if !found { - // search for overlapping paths - frags := strings.Split(path, ".") - if len(frags) < 2 { - // shortcut exit on smaller paths - return found - } - last := len(frags) - 1 - var currentFragStr, parent string - for i := range frags { - if i == 0 { - currentFragStr = frags[last] - } else { - currentFragStr = strings.Join([]string{frags[last-i], currentFragStr}, ".") - } - if i < last { - parent = strings.Join(frags[0:last-i], ".") - } else { - parent = "" - } - if strings.HasSuffix(parent, currentFragStr) { - found = true - break - } - } - } - return found -} - -// beingVisited asserts a schema is being visited -func (d *defaultValidator) beingVisited(path string) { - d.visitedSchemas[path] = true -} - -// isVisited tells if a path has already been visited -func (d *defaultValidator) isVisited(path string) bool { - return isVisited(path, d.visitedSchemas) -} - -// Validate validates the default values declared in the swagger spec -func (d *defaultValidator) Validate() (errs *Result) { - errs = new(Result) - if d == nil || d.SpecValidator == nil { - return errs - } - d.resetVisited() - errs.Merge(d.validateDefaultValueValidAgainstSchema()) // error - - return errs -} - -func (d *defaultValidator) validateDefaultValueValidAgainstSchema() *Result { - // every default value that is specified must validate against the schema for that property - // headers, items, parameters, schema - - res := new(Result) - s := d.SpecValidator - - for method, pathItem := range s.analyzer.Operations() { - for path, op := range pathItem { - // parameters - for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { - if param.Default != nil && param.Required { - res.AddWarnings(requiredHasDefaultMsg(param.Name, param.In)) - } - - // reset explored schemas to get depth-first recursive-proof exploration - d.resetVisited() - - // Check simple parameters first - // default values provided must validate against their inline definition (no explicit schema) - if param.Default != nil && param.Schema == nil { - // check param default value is valid - red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Default) - if red.HasErrorsOrWarnings() { - res.AddErrors(defaultValueDoesNotValidateMsg(param.Name, param.In)) - res.Merge(red) - } - } - - // Recursively follows Items and Schemas - if param.Items != nil { - red := d.validateDefaultValueItemsAgainstSchema(param.Name, param.In, ¶m, param.Items) - if red.HasErrorsOrWarnings() { - res.AddErrors(defaultValueItemsDoesNotValidateMsg(param.Name, param.In)) - res.Merge(red) - } - } - - if param.Schema != nil { - // Validate default value against schema - red := d.validateDefaultValueSchemaAgainstSchema(param.Name, param.In, param.Schema) - if red.HasErrorsOrWarnings() { - res.AddErrors(defaultValueDoesNotValidateMsg(param.Name, param.In)) - res.Merge(red) - } - } - } - - if op.Responses != nil { - if op.Responses.Default != nil { - // Same constraint on default Response - res.Merge(d.validateDefaultInResponse(op.Responses.Default, jsonDefault, path, 0, op.ID)) - } - // Same constraint on regular Responses - if op.Responses.StatusCodeResponses != nil { // Safeguard - for code, r := range op.Responses.StatusCodeResponses { - res.Merge(d.validateDefaultInResponse(&r, "response", path, code, op.ID)) - } - } - } else if op.ID != "" { - // Empty op.ID means there is no meaningful operation: no need to report a specific message - res.AddErrors(noValidResponseMsg(op.ID)) - } - } - } - if s.spec.Spec().Definitions != nil { // Safeguard - // reset explored schemas to get depth-first recursive-proof exploration - d.resetVisited() - for nm, sch := range s.spec.Spec().Definitions { - res.Merge(d.validateDefaultValueSchemaAgainstSchema(fmt.Sprintf("definitions.%s", nm), "body", &sch)) - } - } - return res -} - -func (d *defaultValidator) validateDefaultInResponse(resp *spec.Response, responseType, path string, responseCode int, operationID string) *Result { - s := d.SpecValidator - - response, res := responseHelp.expandResponseRef(resp, path, s) - if !res.IsValid() { - return res - } - - responseName, responseCodeAsStr := responseHelp.responseMsgVariants(responseType, responseCode) - - // nolint: dupl - if response.Headers != nil { // Safeguard - for nm, h := range response.Headers { - // reset explored schemas to get depth-first recursive-proof exploration - d.resetVisited() - - if h.Default != nil { - red := NewHeaderValidator(nm, &h, s.KnownFormats).Validate(h.Default) - if red.HasErrorsOrWarnings() { - res.AddErrors(defaultValueHeaderDoesNotValidateMsg(operationID, nm, responseName)) - res.Merge(red) - } - } - - // Headers have inline definition, like params - if h.Items != nil { - red := d.validateDefaultValueItemsAgainstSchema(nm, "header", &h, h.Items) - if red.HasErrorsOrWarnings() { - res.AddErrors(defaultValueHeaderItemsDoesNotValidateMsg(operationID, nm, responseName)) - res.Merge(red) - } - } - - if _, err := compileRegexp(h.Pattern); err != nil { - res.AddErrors(invalidPatternInHeaderMsg(operationID, nm, responseName, h.Pattern, err)) - } - - // Headers don't have schema - } - } - if response.Schema != nil { - // reset explored schemas to get depth-first recursive-proof exploration - d.resetVisited() - - red := d.validateDefaultValueSchemaAgainstSchema(responseCodeAsStr, "response", response.Schema) - if red.HasErrorsOrWarnings() { - // Additional message to make sure the context of the error is not lost - res.AddErrors(defaultValueInDoesNotValidateMsg(operationID, responseName)) - res.Merge(red) - } - } - return res -} - -func (d *defaultValidator) validateDefaultValueSchemaAgainstSchema(path, in string, schema *spec.Schema) *Result { - if schema == nil || d.isVisited(path) { - // Avoids recursing if we are already done with that check - return nil - } - d.beingVisited(path) - res := new(Result) - s := d.SpecValidator - - if schema.Default != nil { - res.Merge(NewSchemaValidator(schema, s.spec.Spec(), path+".default", s.KnownFormats, SwaggerSchema(true)).Validate(schema.Default)) - } - if schema.Items != nil { - if schema.Items.Schema != nil { - res.Merge(d.validateDefaultValueSchemaAgainstSchema(path+".items.default", in, schema.Items.Schema)) - } - // Multiple schemas in items - if schema.Items.Schemas != nil { // Safeguard - for i, sch := range schema.Items.Schemas { - res.Merge(d.validateDefaultValueSchemaAgainstSchema(fmt.Sprintf("%s.items[%d].default", path, i), in, &sch)) - } - } - } - if _, err := compileRegexp(schema.Pattern); err != nil { - res.AddErrors(invalidPatternInMsg(path, in, schema.Pattern)) - } - if schema.AdditionalItems != nil && schema.AdditionalItems.Schema != nil { - // NOTE: we keep validating values, even though additionalItems is not supported by Swagger 2.0 (and 3.0 as well) - res.Merge(d.validateDefaultValueSchemaAgainstSchema(fmt.Sprintf("%s.additionalItems", path), in, schema.AdditionalItems.Schema)) - } - for propName, prop := range schema.Properties { - res.Merge(d.validateDefaultValueSchemaAgainstSchema(path+"."+propName, in, &prop)) - } - for propName, prop := range schema.PatternProperties { - res.Merge(d.validateDefaultValueSchemaAgainstSchema(path+"."+propName, in, &prop)) - } - if schema.AdditionalProperties != nil && schema.AdditionalProperties.Schema != nil { - res.Merge(d.validateDefaultValueSchemaAgainstSchema(fmt.Sprintf("%s.additionalProperties", path), in, schema.AdditionalProperties.Schema)) - } - if schema.AllOf != nil { - for i, aoSch := range schema.AllOf { - res.Merge(d.validateDefaultValueSchemaAgainstSchema(fmt.Sprintf("%s.allOf[%d]", path, i), in, &aoSch)) - } - } - return res -} - -// TODO: Temporary duplicated code. Need to refactor with examples -// nolint: dupl -func (d *defaultValidator) validateDefaultValueItemsAgainstSchema(path, in string, root interface{}, items *spec.Items) *Result { - res := new(Result) - s := d.SpecValidator - if items != nil { - if items.Default != nil { - res.Merge(newItemsValidator(path, in, items, root, s.KnownFormats).Validate(0, items.Default)) - } - if items.Items != nil { - res.Merge(d.validateDefaultValueItemsAgainstSchema(path+"[0].default", in, root, items.Items)) - } - if _, err := compileRegexp(items.Pattern); err != nil { - res.AddErrors(invalidPatternInMsg(path, in, items.Pattern)) - } - } - return res -} diff --git a/vendor/github.com/go-openapi/validate/doc.go b/vendor/github.com/go-openapi/validate/doc.go deleted file mode 100644 index f5ca9a5d58..0000000000 --- a/vendor/github.com/go-openapi/validate/doc.go +++ /dev/null @@ -1,85 +0,0 @@ -// 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 validate provides methods to validate a swagger specification, -as well as tools to validate data against their schema. - -This package follows Swagger 2.0. specification (aka OpenAPI 2.0). Reference -can be found here: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md. - -Validating a specification - -Validates a spec document (from JSON or YAML) against the JSON schema for swagger, -then checks a number of extra rules that can't be expressed in JSON schema. - -Entry points: - - Spec() - - NewSpecValidator() - - SpecValidator.Validate() - -Reported as errors: - [x] definition can't declare a property that's already defined by one of its ancestors - [x] definition's ancestor can't be a descendant of the same model - [x] path uniqueness: each api path should be non-verbatim (account for path param names) unique per method - [x] each security reference should contain only unique scopes - [x] each security scope in a security definition should be unique - [x] parameters in path must be unique - [x] each path parameter must correspond to a parameter placeholder and vice versa - [x] each referenceable definition must have references - [x] each definition property listed in the required array must be defined in the properties of the model - [x] each parameter should have a unique `name` and `type` combination - [x] each operation should have only 1 parameter of type body - [x] each reference must point to a valid object - [x] every default value that is specified must validate against the schema for that property - [x] items property is required for all schemas/definitions of type `array` - [x] path parameters must be declared a required - [x] headers must not contain $ref - [x] schema and property examples provided must validate against their respective object's schema - [x] examples provided must validate their schema - -Reported as warnings: - [x] path parameters should not contain any of [{,},\w] - [x] empty path - [x] unused definitions - [x] unsupported validation of examples on non-JSON media types - [x] examples in response without schema - [x] readOnly properties should not be required - -Validating a schema - -The schema validation toolkit validates data against JSON-schema-draft 04 schema. - -It is tested against the full json-schema-testing-suite (https://github.com/json-schema-org/JSON-Schema-Test-Suite), -except for the optional part (bignum, ECMA regexp, ...). - -It supports the complete JSON-schema vocabulary, including keywords not supported by Swagger (e.g. additionalItems, ...) - -Entry points: - - AgainstSchema() - - ... - -Known limitations - -With the current version of this package, the following aspects of swagger are not yet supported: - [ ] errors and warnings are not reported with key/line number in spec - [ ] default values and examples on responses only support application/json producer type - [ ] invalid numeric constraints (such as Minimum, etc..) are not checked except for default and example values - [ ] rules for collectionFormat are not implemented - [ ] no validation rule for polymorphism support (discriminator) [not done here] - [ ] valid js ECMA regexp not supported by Go regexp engine are considered invalid - [ ] arbitrary large numbers are not supported: max is math.MaxFloat64 - -*/ -package validate diff --git a/vendor/github.com/go-openapi/validate/example_validator.go b/vendor/github.com/go-openapi/validate/example_validator.go deleted file mode 100644 index 1303591751..0000000000 --- a/vendor/github.com/go-openapi/validate/example_validator.go +++ /dev/null @@ -1,270 +0,0 @@ -// 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 validate - -import ( - "fmt" - - "github.com/go-openapi/spec" -) - -// ExampleValidator validates example values defined in a spec -type exampleValidator struct { - SpecValidator *SpecValidator - visitedSchemas map[string]bool -} - -// resetVisited resets the internal state of visited schemas -func (ex *exampleValidator) resetVisited() { - ex.visitedSchemas = map[string]bool{} -} - -// beingVisited asserts a schema is being visited -func (ex *exampleValidator) beingVisited(path string) { - ex.visitedSchemas[path] = true -} - -// isVisited tells if a path has already been visited -func (ex *exampleValidator) isVisited(path string) bool { - return isVisited(path, ex.visitedSchemas) -} - -// Validate validates the example values declared in the swagger spec -// Example values MUST conform to their schema. -// -// With Swagger 2.0, examples are supported in: -// - schemas -// - individual property -// - responses -// -func (ex *exampleValidator) Validate() (errs *Result) { - errs = new(Result) - if ex == nil || ex.SpecValidator == nil { - return errs - } - ex.resetVisited() - errs.Merge(ex.validateExampleValueValidAgainstSchema()) // error - - - return errs -} - -func (ex *exampleValidator) validateExampleValueValidAgainstSchema() *Result { - // every example value that is specified must validate against the schema for that property - // in: schemas, properties, object, items - // not in: headers, parameters without schema - - res := new(Result) - s := ex.SpecValidator - - for method, pathItem := range s.analyzer.Operations() { - for path, op := range pathItem { - // parameters - for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { - - // As of swagger 2.0, Examples are not supported in simple parameters - // However, it looks like it is supported by go-openapi - - // reset explored schemas to get depth-first recursive-proof exploration - ex.resetVisited() - - // Check simple parameters first - // default values provided must validate against their inline definition (no explicit schema) - if param.Example != nil && param.Schema == nil { - // check param default value is valid - red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Example) - if red.HasErrorsOrWarnings() { - res.AddWarnings(exampleValueDoesNotValidateMsg(param.Name, param.In)) - res.MergeAsWarnings(red) - } - } - - // Recursively follows Items and Schemas - if param.Items != nil { - red := ex.validateExampleValueItemsAgainstSchema(param.Name, param.In, ¶m, param.Items) - if red.HasErrorsOrWarnings() { - res.AddWarnings(exampleValueItemsDoesNotValidateMsg(param.Name, param.In)) - res.Merge(red) - } - } - - if param.Schema != nil { - // Validate example value against schema - red := ex.validateExampleValueSchemaAgainstSchema(param.Name, param.In, param.Schema) - if red.HasErrorsOrWarnings() { - res.AddWarnings(exampleValueDoesNotValidateMsg(param.Name, param.In)) - res.Merge(red) - } - } - } - - if op.Responses != nil { - if op.Responses.Default != nil { - // Same constraint on default Response - res.Merge(ex.validateExampleInResponse(op.Responses.Default, jsonDefault, path, 0, op.ID)) - } - // Same constraint on regular Responses - if op.Responses.StatusCodeResponses != nil { // Safeguard - for code, r := range op.Responses.StatusCodeResponses { - res.Merge(ex.validateExampleInResponse(&r, "response", path, code, op.ID)) - } - } - } else if op.ID != "" { - // Empty op.ID means there is no meaningful operation: no need to report a specific message - res.AddErrors(noValidResponseMsg(op.ID)) - } - } - } - if s.spec.Spec().Definitions != nil { // Safeguard - // reset explored schemas to get depth-first recursive-proof exploration - ex.resetVisited() - for nm, sch := range s.spec.Spec().Definitions { - res.Merge(ex.validateExampleValueSchemaAgainstSchema(fmt.Sprintf("definitions.%s", nm), "body", &sch)) - } - } - return res -} - -func (ex *exampleValidator) validateExampleInResponse(resp *spec.Response, responseType, path string, responseCode int, operationID string) *Result { - s := ex.SpecValidator - - response, res := responseHelp.expandResponseRef(resp, path, s) - if !res.IsValid() { // Safeguard - return res - } - - responseName, responseCodeAsStr := responseHelp.responseMsgVariants(responseType, responseCode) - - // nolint: dupl - if response.Headers != nil { // Safeguard - for nm, h := range response.Headers { - // reset explored schemas to get depth-first recursive-proof exploration - ex.resetVisited() - - if h.Example != nil { - red := NewHeaderValidator(nm, &h, s.KnownFormats).Validate(h.Example) - if red.HasErrorsOrWarnings() { - res.AddWarnings(exampleValueHeaderDoesNotValidateMsg(operationID, nm, responseName)) - res.MergeAsWarnings(red) - } - } - - // Headers have inline definition, like params - if h.Items != nil { - red := ex.validateExampleValueItemsAgainstSchema(nm, "header", &h, h.Items) - if red.HasErrorsOrWarnings() { - res.AddWarnings(exampleValueHeaderItemsDoesNotValidateMsg(operationID, nm, responseName)) - res.MergeAsWarnings(red) - } - } - - if _, err := compileRegexp(h.Pattern); err != nil { - res.AddErrors(invalidPatternInHeaderMsg(operationID, nm, responseName, h.Pattern, err)) - } - - // Headers don't have schema - } - } - if response.Schema != nil { - // reset explored schemas to get depth-first recursive-proof exploration - ex.resetVisited() - - red := ex.validateExampleValueSchemaAgainstSchema(responseCodeAsStr, "response", response.Schema) - if red.HasErrorsOrWarnings() { - // Additional message to make sure the context of the error is not lost - res.AddWarnings(exampleValueInDoesNotValidateMsg(operationID, responseName)) - res.Merge(red) - } - } - - if response.Examples != nil { - if response.Schema != nil { - if example, ok := response.Examples["application/json"]; ok { - res.MergeAsWarnings(NewSchemaValidator(response.Schema, s.spec.Spec(), path+".examples", s.KnownFormats, SwaggerSchema(true)).Validate(example)) - } else { - // TODO: validate other media types too - res.AddWarnings(examplesMimeNotSupportedMsg(operationID, responseName)) - } - } else { - res.AddWarnings(examplesWithoutSchemaMsg(operationID, responseName)) - } - } - return res -} - -func (ex *exampleValidator) validateExampleValueSchemaAgainstSchema(path, in string, schema *spec.Schema) *Result { - if schema == nil || ex.isVisited(path) { - // Avoids recursing if we are already done with that check - return nil - } - ex.beingVisited(path) - s := ex.SpecValidator - res := new(Result) - - if schema.Example != nil { - res.MergeAsWarnings(NewSchemaValidator(schema, s.spec.Spec(), path+".example", s.KnownFormats, SwaggerSchema(true)).Validate(schema.Example)) - } - if schema.Items != nil { - if schema.Items.Schema != nil { - res.Merge(ex.validateExampleValueSchemaAgainstSchema(path+".items.example", in, schema.Items.Schema)) - } - // Multiple schemas in items - if schema.Items.Schemas != nil { // Safeguard - for i, sch := range schema.Items.Schemas { - res.Merge(ex.validateExampleValueSchemaAgainstSchema(fmt.Sprintf("%s.items[%d].example", path, i), in, &sch)) - } - } - } - if _, err := compileRegexp(schema.Pattern); err != nil { - res.AddErrors(invalidPatternInMsg(path, in, schema.Pattern)) - } - if schema.AdditionalItems != nil && schema.AdditionalItems.Schema != nil { - // NOTE: we keep validating values, even though additionalItems is unsupported in Swagger 2.0 (and 3.0 as well) - res.Merge(ex.validateExampleValueSchemaAgainstSchema(fmt.Sprintf("%s.additionalItems", path), in, schema.AdditionalItems.Schema)) - } - for propName, prop := range schema.Properties { - res.Merge(ex.validateExampleValueSchemaAgainstSchema(path+"."+propName, in, &prop)) - } - for propName, prop := range schema.PatternProperties { - res.Merge(ex.validateExampleValueSchemaAgainstSchema(path+"."+propName, in, &prop)) - } - if schema.AdditionalProperties != nil && schema.AdditionalProperties.Schema != nil { - res.Merge(ex.validateExampleValueSchemaAgainstSchema(fmt.Sprintf("%s.additionalProperties", path), in, schema.AdditionalProperties.Schema)) - } - if schema.AllOf != nil { - for i, aoSch := range schema.AllOf { - res.Merge(ex.validateExampleValueSchemaAgainstSchema(fmt.Sprintf("%s.allOf[%d]", path, i), in, &aoSch)) - } - } - return res -} - -// TODO: Temporary duplicated code. Need to refactor with examples -// nolint: dupl -func (ex *exampleValidator) validateExampleValueItemsAgainstSchema(path, in string, root interface{}, items *spec.Items) *Result { - res := new(Result) - s := ex.SpecValidator - if items != nil { - if items.Example != nil { - res.MergeAsWarnings(newItemsValidator(path, in, items, root, s.KnownFormats).Validate(0, items.Example)) - } - if items.Items != nil { - res.Merge(ex.validateExampleValueItemsAgainstSchema(path+"[0].example", in, root, items.Items)) - } - if _, err := compileRegexp(items.Pattern); err != nil { - res.AddErrors(invalidPatternInMsg(path, in, items.Pattern)) - } - } - return res -} diff --git a/vendor/github.com/go-openapi/validate/go.mod b/vendor/github.com/go-openapi/validate/go.mod deleted file mode 100644 index 2d59ddbafa..0000000000 --- a/vendor/github.com/go-openapi/validate/go.mod +++ /dev/null @@ -1,20 +0,0 @@ -module github.com/go-openapi/validate - -require ( - github.com/go-openapi/analysis v0.19.5 - github.com/go-openapi/errors v0.19.2 - github.com/go-openapi/jsonpointer v0.19.3 - github.com/go-openapi/jsonreference v0.19.3 // indirect - github.com/go-openapi/loads v0.19.4 - github.com/go-openapi/runtime v0.19.4 - github.com/go-openapi/spec v0.19.3 - github.com/go-openapi/strfmt v0.19.3 - github.com/go-openapi/swag v0.19.5 - github.com/mailru/easyjson v0.7.0 // indirect - github.com/stretchr/testify v1.4.0 - github.com/vektah/gqlparser v1.1.2 - go.mongodb.org/mongo-driver v1.1.2 // indirect - gopkg.in/yaml.v2 v2.2.4 -) - -go 1.13 diff --git a/vendor/github.com/go-openapi/validate/go.sum b/vendor/github.com/go-openapi/validate/go.sum deleted file mode 100644 index 0e9c75c1f2..0000000000 --- a/vendor/github.com/go-openapi/validate/go.sum +++ /dev/null @@ -1,156 +0,0 @@ -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-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/agnivade/levenshtein v1.0.1 h1:3oJU7J3FGFmyhn8KHjmVaZCN5hxTr7GxgRue+sxIXdQ= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/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/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -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.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2 h1:ophLETFestFZHk3ji7niPEL4d466QjW+0Tdg5VyDq7E= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/errors v0.17.0/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 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.17.0/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 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/loads v0.17.0/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 h1:wCOBNscACI8L93tt5tvB2zOMkJ098XCw3fP0BY2ybDA= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2 h1:rf5ArTHmIJxyV5Oiks+Su0mUens1+AjpkPoWr5xFRcI= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.3 h1:jwIoahqCmaA5OBoc/B+1+Mu2L0Gr8xYQnbeyQEo/7b0= -github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= -github.com/go-openapi/loads v0.19.4 h1:5I4CCSqoWzT+82bBkNIvmLc0UOsoKKQ4Fz+3VxOB7SY= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0 h1:sU6pp4dSV2sGlNKKyHxZzi1m1kG4WnYtWcJ+HYbygjE= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/spec v0.17.0/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 h1:SStNd1jRcYtfKCN7R0laGNs80WYYvn5CbBjM2sOmCrE= -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/strfmt v0.17.0/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 h1:0Dn9qy1G9+UJfRU7TR8bmdGxb4uifB7HNrJjOnV0yPk= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/swag v0.17.0/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 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -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-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -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 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -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 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -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/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/vektah/gqlparser v1.1.2 h1:ZsyLGn7/7jDNI+y4SEhI4yAxRChlv15pUHMjijT+e68= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2 h1:jxcFYjlkl8xaERsgLo+RNquI0epW6zuy/ZRQs6jnrFA= -go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -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-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191014212845-da9a3fd4c582 h1:p9xBe/w/OzkeYVKm234g55gMdD1nSIooTir5kV11kfA= -golang.org/x/net v0.0.0-20191014212845-da9a3fd4c582/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -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= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-openapi/validate/helpers.go b/vendor/github.com/go-openapi/validate/helpers.go deleted file mode 100644 index 4b77a00047..0000000000 --- a/vendor/github.com/go-openapi/validate/helpers.go +++ /dev/null @@ -1,324 +0,0 @@ -// 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 validate - -// TODO: define this as package validate/internal -// This must be done while keeping CI intact with all tests and test coverage - -import ( - "reflect" - "strconv" - "strings" - - "github.com/go-openapi/errors" - "github.com/go-openapi/spec" -) - -const ( - swaggerBody = "body" - swaggerExample = "example" - swaggerExamples = "examples" -) - -const ( - objectType = "object" - arrayType = "array" - stringType = "string" - integerType = "integer" - numberType = "number" - booleanType = "boolean" - fileType = "file" - nullType = "null" -) - -const ( - jsonProperties = "properties" - jsonItems = "items" - jsonType = "type" - //jsonSchema = "schema" - jsonDefault = "default" -) - -const ( - stringFormatDate = "date" - stringFormatDateTime = "date-time" - stringFormatPassword = "password" - stringFormatByte = "byte" - //stringFormatBinary = "binary" - stringFormatCreditCard = "creditcard" - stringFormatDuration = "duration" - stringFormatEmail = "email" - stringFormatHexColor = "hexcolor" - stringFormatHostname = "hostname" - stringFormatIPv4 = "ipv4" - stringFormatIPv6 = "ipv6" - stringFormatISBN = "isbn" - stringFormatISBN10 = "isbn10" - stringFormatISBN13 = "isbn13" - stringFormatMAC = "mac" - stringFormatBSONObjectID = "bsonobjectid" - stringFormatRGBColor = "rgbcolor" - stringFormatSSN = "ssn" - stringFormatURI = "uri" - stringFormatUUID = "uuid" - stringFormatUUID3 = "uuid3" - stringFormatUUID4 = "uuid4" - stringFormatUUID5 = "uuid5" - - integerFormatInt32 = "int32" - integerFormatInt64 = "int64" - integerFormatUInt32 = "uint32" - integerFormatUInt64 = "uint64" - - numberFormatFloat32 = "float32" - numberFormatFloat64 = "float64" - numberFormatFloat = "float" - numberFormatDouble = "double" -) - -// Helpers available at the package level -var ( - pathHelp *pathHelper - valueHelp *valueHelper - errorHelp *errorHelper - paramHelp *paramHelper - responseHelp *responseHelper -) - -type errorHelper struct { - // A collection of unexported helpers for error construction -} - -func (h *errorHelper) sErr(err errors.Error) *Result { - // Builds a Result from standard errors.Error - return &Result{Errors: []error{err}} -} - -func (h *errorHelper) addPointerError(res *Result, err error, ref string, fromPath string) *Result { - // Provides more context on error messages - // reported by the jsoinpointer package by altering the passed Result - if err != nil { - res.AddErrors(cannotResolveRefMsg(fromPath, ref, err)) - } - return res -} - -type pathHelper struct { - // A collection of unexported helpers for path validation -} - -func (h *pathHelper) stripParametersInPath(path string) string { - // Returns a path stripped from all path parameters, with multiple or trailing slashes removed. - // - // Stripping is performed on a slash-separated basis, e.g '/a{/b}' remains a{/b} and not /a. - // - Trailing "/" make a difference, e.g. /a/ !~ /a (ex: canary/bitbucket.org/swagger.json) - // - presence or absence of a parameter makes a difference, e.g. /a/{log} !~ /a/ (ex: canary/kubernetes/swagger.json) - - // Regexp to extract parameters from path, with surrounding {}. - // NOTE: important non-greedy modifier - rexParsePathParam := mustCompileRegexp(`{[^{}]+?}`) - strippedSegments := []string{} - - for _, segment := range strings.Split(path, "/") { - strippedSegments = append(strippedSegments, rexParsePathParam.ReplaceAllString(segment, "X")) - } - return strings.Join(strippedSegments, "/") -} - -func (h *pathHelper) extractPathParams(path string) (params []string) { - // Extracts all params from a path, with surrounding "{}" - rexParsePathParam := mustCompileRegexp(`{[^{}]+?}`) - - for _, segment := range strings.Split(path, "/") { - for _, v := range rexParsePathParam.FindAllStringSubmatch(segment, -1) { - params = append(params, v...) - } - } - return -} - -type valueHelper struct { - // A collection of unexported helpers for value validation -} - -func (h *valueHelper) asInt64(val interface{}) int64 { - // Number conversion function for int64, without error checking - // (implements an implicit type upgrade). - v := reflect.ValueOf(val) - switch v.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return int64(v.Uint()) - case reflect.Float32, reflect.Float64: - return int64(v.Float()) - default: - //panic("Non numeric value in asInt64()") - return 0 - } -} - -func (h *valueHelper) asUint64(val interface{}) uint64 { - // Number conversion function for uint64, without error checking - // (implements an implicit type upgrade). - v := reflect.ValueOf(val) - switch v.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return uint64(v.Int()) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return v.Uint() - case reflect.Float32, reflect.Float64: - return uint64(v.Float()) - default: - //panic("Non numeric value in asUint64()") - return 0 - } -} - -// Same for unsigned floats -func (h *valueHelper) asFloat64(val interface{}) float64 { - // Number conversion function for float64, without error checking - // (implements an implicit type upgrade). - v := reflect.ValueOf(val) - switch v.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return float64(v.Int()) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return float64(v.Uint()) - case reflect.Float32, reflect.Float64: - return v.Float() - default: - //panic("Non numeric value in asFloat64()") - return 0 - } -} - -type paramHelper struct { - // A collection of unexported helpers for parameters resolution -} - -func (h *paramHelper) safeExpandedParamsFor(path, method, operationID string, res *Result, s *SpecValidator) (params []spec.Parameter) { - operation, ok := s.analyzer.OperationFor(method, path) - if ok { - // expand parameters first if necessary - resolvedParams := []spec.Parameter{} - for _, ppr := range operation.Parameters { - resolvedParam, red := h.resolveParam(path, method, operationID, &ppr, s) - res.Merge(red) - if resolvedParam != nil { - resolvedParams = append(resolvedParams, *resolvedParam) - } - } - // remove params with invalid expansion from Slice - operation.Parameters = resolvedParams - - for _, ppr := range s.analyzer.SafeParamsFor(method, path, - func(p spec.Parameter, err error) bool { - // since params have already been expanded, there are few causes for error - res.AddErrors(someParametersBrokenMsg(path, method, operationID)) - // original error from analyzer - res.AddErrors(err) - return true - }) { - params = append(params, ppr) - } - } - return -} - -func (h *paramHelper) resolveParam(path, method, operationID string, param *spec.Parameter, s *SpecValidator) (*spec.Parameter, *Result) { - // Ensure parameter is expanded - var err error - res := new(Result) - isRef := param.Ref.String() != "" - if s.spec.SpecFilePath() == "" { - err = spec.ExpandParameterWithRoot(param, s.spec.Spec(), nil) - } else { - err = spec.ExpandParameter(param, s.spec.SpecFilePath()) - - } - if err != nil { // Safeguard - // NOTE: we may enter enter here when the whole parameter is an unresolved $ref - refPath := strings.Join([]string{"\"" + path + "\"", method}, ".") - errorHelp.addPointerError(res, err, param.Ref.String(), refPath) - return nil, res - } - res.Merge(h.checkExpandedParam(param, param.Name, param.In, operationID, isRef)) - return param, res -} - -func (h *paramHelper) checkExpandedParam(pr *spec.Parameter, path, in, operation string, isRef bool) *Result { - // Secure parameter structure after $ref resolution - res := new(Result) - simpleZero := spec.SimpleSchema{} - // Try to explain why... best guess - switch { - case pr.In == swaggerBody && (pr.SimpleSchema != simpleZero && pr.SimpleSchema.Type != objectType): - if isRef { - // Most likely, a $ref with a sibling is an unwanted situation: in itself this is a warning... - // but we detect it because of the following error: - // schema took over Parameter for an unexplained reason - res.AddWarnings(refShouldNotHaveSiblingsMsg(path, operation)) - } - res.AddErrors(invalidParameterDefinitionMsg(path, in, operation)) - case pr.In != swaggerBody && pr.Schema != nil: - if isRef { - res.AddWarnings(refShouldNotHaveSiblingsMsg(path, operation)) - } - res.AddErrors(invalidParameterDefinitionAsSchemaMsg(path, in, operation)) - case (pr.In == swaggerBody && pr.Schema == nil) || (pr.In != swaggerBody && pr.SimpleSchema == simpleZero): - // Other unexpected mishaps - res.AddErrors(invalidParameterDefinitionMsg(path, in, operation)) - } - return res -} - -type responseHelper struct { - // A collection of unexported helpers for response resolution -} - -func (r *responseHelper) expandResponseRef( - response *spec.Response, - path string, s *SpecValidator) (*spec.Response, *Result) { - // Ensure response is expanded - var err error - res := new(Result) - if s.spec.SpecFilePath() == "" { - // there is no physical document to resolve $ref in response - err = spec.ExpandResponseWithRoot(response, s.spec.Spec(), nil) - } else { - err = spec.ExpandResponse(response, s.spec.SpecFilePath()) - } - if err != nil { // Safeguard - // NOTE: we may enter here when the whole response is an unresolved $ref. - errorHelp.addPointerError(res, err, response.Ref.String(), path) - return nil, res - } - return response, res -} - -func (r *responseHelper) responseMsgVariants( - responseType string, - responseCode int) (responseName, responseCodeAsStr string) { - // Path variants for messages - if responseType == jsonDefault { - responseCodeAsStr = jsonDefault - responseName = "default response" - } else { - responseCodeAsStr = strconv.Itoa(responseCode) - responseName = "response " + responseCodeAsStr - } - return -} diff --git a/vendor/github.com/go-openapi/validate/result.go b/vendor/github.com/go-openapi/validate/result.go deleted file mode 100644 index 8f5f935e5d..0000000000 --- a/vendor/github.com/go-openapi/validate/result.go +++ /dev/null @@ -1,486 +0,0 @@ -// 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 validate - -import ( - "fmt" - "reflect" - "strings" - - "github.com/go-openapi/errors" - "github.com/go-openapi/spec" -) - -// Result represents a validation result set, composed of -// errors and warnings. -// -// It is used to keep track of all detected errors and warnings during -// the validation of a specification. -// -// Matchcount is used to determine -// which errors are relevant in the case of AnyOf, OneOf -// schema validation. Results from the validation branch -// with most matches get eventually selected. -// -// TODO: keep path of key originating the error -type Result struct { - Errors []error - Warnings []error - MatchCount int - - // the object data - data interface{} - - // Schemata for the root object - rootObjectSchemata schemata - // Schemata for object fields - fieldSchemata []fieldSchemata - // Schemata for slice items - itemSchemata []itemSchemata - - cachedFieldSchemta map[FieldKey][]*spec.Schema - cachedItemSchemata map[ItemKey][]*spec.Schema -} - -// FieldKey is a pair of an object and a field, usable as a key for a map. -type FieldKey struct { - object reflect.Value // actually a map[string]interface{}, but the latter cannot be a key - field string -} - -// ItemKey is a pair of a slice and an index, usable as a key for a map. -type ItemKey struct { - slice reflect.Value // actually a []interface{}, but the latter cannot be a key - index int -} - -// NewFieldKey returns a pair of an object and field usable as a key of a map. -func NewFieldKey(obj map[string]interface{}, field string) FieldKey { - return FieldKey{object: reflect.ValueOf(obj), field: field} -} - -// Object returns the underlying object of this key. -func (fk *FieldKey) Object() map[string]interface{} { - return fk.object.Interface().(map[string]interface{}) -} - -// Field returns the underlying field of this key. -func (fk *FieldKey) Field() string { - return fk.field -} - -// NewItemKey returns a pair of a slice and index usable as a key of a map. -func NewItemKey(slice interface{}, i int) ItemKey { - return ItemKey{slice: reflect.ValueOf(slice), index: i} -} - -// Slice returns the underlying slice of this key. -func (ik *ItemKey) Slice() []interface{} { - return ik.slice.Interface().([]interface{}) -} - -// Index returns the underlying index of this key. -func (ik *ItemKey) Index() int { - return ik.index -} - -type fieldSchemata struct { - obj map[string]interface{} - field string - schemata schemata -} - -type itemSchemata struct { - slice reflect.Value - index int - schemata schemata -} - -// Merge merges this result with the other one(s), preserving match counts etc. -func (r *Result) Merge(others ...*Result) *Result { - for _, other := range others { - if other == nil { - continue - } - r.mergeWithoutRootSchemata(other) - r.rootObjectSchemata.Append(other.rootObjectSchemata) - } - return r -} - -// Data returns the original data object used for validation. Mutating this renders -// the result invalid. -func (r *Result) Data() interface{} { - return r.data -} - -// RootObjectSchemata returns the schemata which apply to the root object. -func (r *Result) RootObjectSchemata() []*spec.Schema { - return r.rootObjectSchemata.Slice() -} - -// FieldSchemata returns the schemata which apply to fields in objects. -// nolint: dupl -func (r *Result) FieldSchemata() map[FieldKey][]*spec.Schema { - if r.cachedFieldSchemta != nil { - return r.cachedFieldSchemta - } - - ret := make(map[FieldKey][]*spec.Schema, len(r.fieldSchemata)) - for _, fs := range r.fieldSchemata { - key := NewFieldKey(fs.obj, fs.field) - if fs.schemata.one != nil { - ret[key] = append(ret[key], fs.schemata.one) - } else if len(fs.schemata.multiple) > 0 { - ret[key] = append(ret[key], fs.schemata.multiple...) - } - } - r.cachedFieldSchemta = ret - return ret -} - -// ItemSchemata returns the schemata which apply to items in slices. -// nolint: dupl -func (r *Result) ItemSchemata() map[ItemKey][]*spec.Schema { - if r.cachedItemSchemata != nil { - return r.cachedItemSchemata - } - - ret := make(map[ItemKey][]*spec.Schema, len(r.itemSchemata)) - for _, ss := range r.itemSchemata { - key := NewItemKey(ss.slice, ss.index) - if ss.schemata.one != nil { - ret[key] = append(ret[key], ss.schemata.one) - } else if len(ss.schemata.multiple) > 0 { - ret[key] = append(ret[key], ss.schemata.multiple...) - } - } - r.cachedItemSchemata = ret - return ret -} - -func (r *Result) resetCaches() { - r.cachedFieldSchemta = nil - r.cachedItemSchemata = nil -} - -// mergeForField merges other into r, assigning other's root schemata to the given Object and field name. -// nolint: unparam -func (r *Result) mergeForField(obj map[string]interface{}, field string, other *Result) *Result { - if other == nil { - return r - } - r.mergeWithoutRootSchemata(other) - - if other.rootObjectSchemata.Len() > 0 { - if r.fieldSchemata == nil { - r.fieldSchemata = make([]fieldSchemata, len(obj)) - } - r.fieldSchemata = append(r.fieldSchemata, fieldSchemata{ - obj: obj, - field: field, - schemata: other.rootObjectSchemata, - }) - } - - return r -} - -// mergeForSlice merges other into r, assigning other's root schemata to the given slice and index. -// nolint: unparam -func (r *Result) mergeForSlice(slice reflect.Value, i int, other *Result) *Result { - if other == nil { - return r - } - r.mergeWithoutRootSchemata(other) - - if other.rootObjectSchemata.Len() > 0 { - if r.itemSchemata == nil { - r.itemSchemata = make([]itemSchemata, slice.Len()) - } - r.itemSchemata = append(r.itemSchemata, itemSchemata{ - slice: slice, - index: i, - schemata: other.rootObjectSchemata, - }) - } - - return r -} - -// addRootObjectSchemata adds the given schemata for the root object of the result. -// The slice schemata might be reused. I.e. do not modify it after being added to a result. -func (r *Result) addRootObjectSchemata(s *spec.Schema) { - r.rootObjectSchemata.Append(schemata{one: s}) -} - -// addPropertySchemata adds the given schemata for the object and field. -// The slice schemata might be reused. I.e. do not modify it after being added to a result. -func (r *Result) addPropertySchemata(obj map[string]interface{}, fld string, schema *spec.Schema) { - if r.fieldSchemata == nil { - r.fieldSchemata = make([]fieldSchemata, 0, len(obj)) - } - r.fieldSchemata = append(r.fieldSchemata, fieldSchemata{obj: obj, field: fld, schemata: schemata{one: schema}}) -} - -/* -// addSliceSchemata adds the given schemata for the slice and index. -// The slice schemata might be reused. I.e. do not modify it after being added to a result. -func (r *Result) addSliceSchemata(slice reflect.Value, i int, schema *spec.Schema) { - if r.itemSchemata == nil { - r.itemSchemata = make([]itemSchemata, 0, slice.Len()) - } - r.itemSchemata = append(r.itemSchemata, itemSchemata{slice: slice, index: i, schemata: schemata{one: schema}}) -} -*/ - -// mergeWithoutRootSchemata merges other into r, ignoring the rootObject schemata. -func (r *Result) mergeWithoutRootSchemata(other *Result) { - r.resetCaches() - r.AddErrors(other.Errors...) - r.AddWarnings(other.Warnings...) - r.MatchCount += other.MatchCount - - if other.fieldSchemata != nil { - if r.fieldSchemata == nil { - r.fieldSchemata = other.fieldSchemata - } else { - r.fieldSchemata = append(r.fieldSchemata, other.fieldSchemata...) - } - } - - if other.itemSchemata != nil { - if r.itemSchemata == nil { - r.itemSchemata = other.itemSchemata - } else { - r.itemSchemata = append(r.itemSchemata, other.itemSchemata...) - } - } -} - -// MergeAsErrors merges this result with the other one(s), preserving match counts etc. -// -// Warnings from input are merged as Errors in the returned merged Result. -func (r *Result) MergeAsErrors(others ...*Result) *Result { - for _, other := range others { - if other != nil { - r.resetCaches() - r.AddErrors(other.Errors...) - r.AddErrors(other.Warnings...) - r.MatchCount += other.MatchCount - } - } - return r -} - -// MergeAsWarnings merges this result with the other one(s), preserving match counts etc. -// -// Errors from input are merged as Warnings in the returned merged Result. -func (r *Result) MergeAsWarnings(others ...*Result) *Result { - for _, other := range others { - if other != nil { - r.resetCaches() - r.AddWarnings(other.Errors...) - r.AddWarnings(other.Warnings...) - r.MatchCount += other.MatchCount - } - } - return r -} - -// AddErrors adds errors to this validation result (if not already reported). -// -// Since the same check may be passed several times while exploring the -// spec structure (via $ref, ...) reported messages are kept -// unique. -func (r *Result) AddErrors(errors ...error) { - for _, e := range errors { - found := false - if e != nil { - for _, isReported := range r.Errors { - if e.Error() == isReported.Error() { - found = true - break - } - } - if !found { - r.Errors = append(r.Errors, e) - } - } - } -} - -// AddWarnings adds warnings to this validation result (if not already reported). -func (r *Result) AddWarnings(warnings ...error) { - for _, e := range warnings { - found := false - if e != nil { - for _, isReported := range r.Warnings { - if e.Error() == isReported.Error() { - found = true - break - } - } - if !found { - r.Warnings = append(r.Warnings, e) - } - } - } -} - -func (r *Result) keepRelevantErrors() *Result { - // TODO: this one is going to disapear... - // keepRelevantErrors strips a result from standard errors and keeps - // the ones which are supposedly more accurate. - // - // The original result remains unaffected (creates a new instance of Result). - // This method is used to work around the "matchCount" filter which would otherwise - // strip our result from some accurate error reporting from lower level validators. - // - // NOTE: this implementation with a placeholder (IMPORTANT!) is neither clean nor - // very efficient. On the other hand, relying on go-openapi/errors to manipulate - // codes would require to change a lot here. So, for the moment, let's go with - // placeholders. - strippedErrors := []error{} - for _, e := range r.Errors { - if strings.HasPrefix(e.Error(), "IMPORTANT!") { - strippedErrors = append(strippedErrors, fmt.Errorf(strings.TrimPrefix(e.Error(), "IMPORTANT!"))) - } - } - strippedWarnings := []error{} - for _, e := range r.Warnings { - if strings.HasPrefix(e.Error(), "IMPORTANT!") { - strippedWarnings = append(strippedWarnings, fmt.Errorf(strings.TrimPrefix(e.Error(), "IMPORTANT!"))) - } - } - strippedResult := new(Result) - strippedResult.Errors = strippedErrors - strippedResult.Warnings = strippedWarnings - return strippedResult -} - -// IsValid returns true when this result is valid. -// -// Returns true on a nil *Result. -func (r *Result) IsValid() bool { - if r == nil { - return true - } - return len(r.Errors) == 0 -} - -// HasErrors returns true when this result is invalid. -// -// Returns false on a nil *Result. -func (r *Result) HasErrors() bool { - if r == nil { - return false - } - return !r.IsValid() -} - -// HasWarnings returns true when this result contains warnings. -// -// Returns false on a nil *Result. -func (r *Result) HasWarnings() bool { - if r == nil { - return false - } - return len(r.Warnings) > 0 -} - -// HasErrorsOrWarnings returns true when this result contains -// either errors or warnings. -// -// Returns false on a nil *Result. -func (r *Result) HasErrorsOrWarnings() bool { - if r == nil { - return false - } - return len(r.Errors) > 0 || len(r.Warnings) > 0 -} - -// Inc increments the match count -func (r *Result) Inc() { - r.MatchCount++ -} - -// AsError renders this result as an error interface -// -// TODO: reporting / pretty print with path ordered and indented -func (r *Result) AsError() error { - if r.IsValid() { - return nil - } - return errors.CompositeValidationError(r.Errors...) -} - -// schemata is an arbitrary number of schemata. It does a distinction between zero, -// one and many schemata to avoid slice allocations. -type schemata struct { - // one is set if there is exactly one schema. In that case multiple must be nil. - one *spec.Schema - // multiple is an arbitrary number of schemas. If it is set, one must be nil. - multiple []*spec.Schema -} - -func (s *schemata) Len() int { - if s.one != nil { - return 1 - } - return len(s.multiple) -} - -func (s *schemata) Slice() []*spec.Schema { - if s == nil { - return nil - } - if s.one != nil { - return []*spec.Schema{s.one} - } - return s.multiple -} - -// appendSchemata appends the schemata in other to s. It mutated s in-place. -func (s *schemata) Append(other schemata) { - if other.one == nil && len(other.multiple) == 0 { - return - } - if s.one == nil && len(s.multiple) == 0 { - *s = other - return - } - - if s.one != nil { - if other.one != nil { - s.multiple = []*spec.Schema{s.one, other.one} - } else { - t := make([]*spec.Schema, 0, 1+len(other.multiple)) - s.multiple = append(append(t, s.one), other.multiple...) - } - s.one = nil - } else { - if other.one != nil { - s.multiple = append(s.multiple, other.one) - } else { - if cap(s.multiple) >= len(s.multiple)+len(other.multiple) { - s.multiple = append(s.multiple, other.multiple...) - } else { - t := make([]*spec.Schema, 0, len(s.multiple)+len(other.multiple)) - s.multiple = append(append(t, s.multiple...), other.multiple...) - } - } - } -} diff --git a/vendor/github.com/go-openapi/validate/schema_option.go b/vendor/github.com/go-openapi/validate/schema_option.go deleted file mode 100644 index 4b4879de8b..0000000000 --- a/vendor/github.com/go-openapi/validate/schema_option.go +++ /dev/null @@ -1,54 +0,0 @@ -// 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 validate - -// SchemaValidatorOptions defines optional rules for schema validation -type SchemaValidatorOptions struct { - EnableObjectArrayTypeCheck bool - EnableArrayMustHaveItemsCheck bool -} - -// Option sets optional rules for schema validation -type Option func(*SchemaValidatorOptions) - -// EnableObjectArrayTypeCheck activates the swagger rule: an items must be in type: array -func EnableObjectArrayTypeCheck(enable bool) Option { - return func(svo *SchemaValidatorOptions) { - svo.EnableObjectArrayTypeCheck = enable - } -} - -// EnableArrayMustHaveItemsCheck activates the swagger rule: an array must have items defined -func EnableArrayMustHaveItemsCheck(enable bool) Option { - return func(svo *SchemaValidatorOptions) { - svo.EnableArrayMustHaveItemsCheck = enable - } -} - -// SwaggerSchema activates swagger schema validation rules -func SwaggerSchema(enable bool) Option { - return func(svo *SchemaValidatorOptions) { - svo.EnableObjectArrayTypeCheck = enable - svo.EnableArrayMustHaveItemsCheck = enable - } -} - -// Options returns current options -func (svo SchemaValidatorOptions) Options() []Option { - return []Option{ - EnableObjectArrayTypeCheck(svo.EnableObjectArrayTypeCheck), - EnableArrayMustHaveItemsCheck(svo.EnableArrayMustHaveItemsCheck), - } -} diff --git a/vendor/github.com/go-openapi/validate/spec.go b/vendor/github.com/go-openapi/validate/spec.go deleted file mode 100644 index ce8ba17ca0..0000000000 --- a/vendor/github.com/go-openapi/validate/spec.go +++ /dev/null @@ -1,787 +0,0 @@ -// 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 validate - -import ( - "encoding/json" - "fmt" - "sort" - "strings" - - "github.com/go-openapi/analysis" - "github.com/go-openapi/errors" - "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/loads" - "github.com/go-openapi/spec" - "github.com/go-openapi/strfmt" -) - -// Spec validates an OpenAPI 2.0 specification document. -// -// Returns an error flattening in a single standard error, all validation messages. -// -// - TODO: $ref should not have siblings -// - TODO: make sure documentation reflects all checks and warnings -// - TODO: check on discriminators -// - TODO: explicit message on unsupported keywords (better than "forbidden property"...) -// - TODO: full list of unresolved refs -// - TODO: validate numeric constraints (issue#581): this should be handled like defaults and examples -// - TODO: option to determine if we validate for go-swagger or in a more general context -// - TODO: check on required properties to support anyOf, allOf, oneOf -// -// NOTE: SecurityScopes are maps: no need to check uniqueness -// -func Spec(doc *loads.Document, formats strfmt.Registry) error { - errs, _ /*warns*/ := NewSpecValidator(doc.Schema(), formats).Validate(doc) - if errs.HasErrors() { - return errors.CompositeValidationError(errs.Errors...) - } - return nil -} - -// SpecValidator validates a swagger 2.0 spec -type SpecValidator struct { - schema *spec.Schema // swagger 2.0 schema - spec *loads.Document - analyzer *analysis.Spec - expanded *loads.Document - KnownFormats strfmt.Registry - Options Opts // validation options -} - -// NewSpecValidator creates a new swagger spec validator instance -func NewSpecValidator(schema *spec.Schema, formats strfmt.Registry) *SpecValidator { - return &SpecValidator{ - schema: schema, - KnownFormats: formats, - Options: defaultOpts, - } -} - -// Validate validates the swagger spec -func (s *SpecValidator) Validate(data interface{}) (*Result, *Result) { - var sd *loads.Document - errs, warnings := new(Result), new(Result) - - if v, ok := data.(*loads.Document); ok { - sd = v - } - if sd == nil { - errs.AddErrors(invalidDocumentMsg()) - return errs, warnings // no point in continuing - } - s.spec = sd - s.analyzer = analysis.New(sd.Spec()) - - // Swagger schema validator - schv := NewSchemaValidator(s.schema, nil, "", s.KnownFormats, SwaggerSchema(true)) - var obj interface{} - - // Raw spec unmarshalling errors - if err := json.Unmarshal(sd.Raw(), &obj); err != nil { - // NOTE: under normal conditions, the *load.Document has been already unmarshalled - // So this one is just a paranoid check on the behavior of the spec package - panic(InvalidDocumentError) - } - - defer func() { - // errs holds all errors and warnings, - // warnings only warnings - errs.MergeAsWarnings(warnings) - warnings.AddErrors(errs.Warnings...) - }() - - errs.Merge(schv.Validate(obj)) // error - - // There may be a point in continuing to try and determine more accurate errors - if !s.Options.ContinueOnErrors && errs.HasErrors() { - return errs, warnings // no point in continuing - } - - errs.Merge(s.validateReferencesValid()) // error - - // There may be a point in continuing to try and determine more accurate errors - if !s.Options.ContinueOnErrors && errs.HasErrors() { - return errs, warnings // no point in continuing - } - - errs.Merge(s.validateDuplicateOperationIDs()) - errs.Merge(s.validateDuplicatePropertyNames()) // error - - errs.Merge(s.validateParameters()) // error - - errs.Merge(s.validateItems()) // error - - - // Properties in required definition MUST validate their schema - // Properties SHOULD NOT be declared as both required and readOnly (warning) - errs.Merge(s.validateRequiredDefinitions()) // error and warning - - // There may be a point in continuing to try and determine more accurate errors - if !s.Options.ContinueOnErrors && errs.HasErrors() { - return errs, warnings // no point in continuing - } - - // Values provided as default MUST validate their schema - df := &defaultValidator{SpecValidator: s} - errs.Merge(df.Validate()) - - // Values provided as examples MUST validate their schema - // Value provided as examples in a response without schema generate a warning - // Known limitations: examples in responses for mime type not application/json are ignored (warning) - ex := &exampleValidator{SpecValidator: s} - errs.Merge(ex.Validate()) - - errs.Merge(s.validateNonEmptyPathParamNames()) - - //errs.Merge(s.validateRefNoSibling()) // warning only - errs.Merge(s.validateReferenced()) // warning only - - return errs, warnings -} - -func (s *SpecValidator) validateNonEmptyPathParamNames() *Result { - res := new(Result) - if s.spec.Spec().Paths == nil { - // There is no Paths object: error - res.AddErrors(noValidPathMsg()) - } else { - if s.spec.Spec().Paths.Paths == nil { - // Paths may be empty: warning - res.AddWarnings(noValidPathMsg()) - } else { - for k := range s.spec.Spec().Paths.Paths { - if strings.Contains(k, "{}") { - res.AddErrors(emptyPathParameterMsg(k)) - } - } - } - } - return res -} - -func (s *SpecValidator) validateDuplicateOperationIDs() *Result { - // OperationID, if specified, must be unique across the board - res := new(Result) - known := make(map[string]int) - for _, v := range s.analyzer.OperationIDs() { - if v != "" { - known[v]++ - } - } - for k, v := range known { - if v > 1 { - res.AddErrors(nonUniqueOperationIDMsg(k, v)) - } - } - return res -} - -type dupProp struct { - Name string - Definition string -} - -func (s *SpecValidator) validateDuplicatePropertyNames() *Result { - // definition can't declare a property that's already defined by one of its ancestors - res := new(Result) - for k, sch := range s.spec.Spec().Definitions { - if len(sch.AllOf) == 0 { - continue - } - - knownanc := map[string]struct{}{ - "#/definitions/" + k: {}, - } - - ancs, rec := s.validateCircularAncestry(k, sch, knownanc) - if rec != nil && (rec.HasErrors() || !rec.HasWarnings()) { - res.Merge(rec) - } - if len(ancs) > 0 { - res.AddErrors(circularAncestryDefinitionMsg(k, ancs)) - return res - } - - knowns := make(map[string]struct{}) - dups, rep := s.validateSchemaPropertyNames(k, sch, knowns) - if rep != nil && (rep.HasErrors() || rep.HasWarnings()) { - res.Merge(rep) - } - if len(dups) > 0 { - var pns []string - for _, v := range dups { - pns = append(pns, v.Definition+"."+v.Name) - } - res.AddErrors(duplicatePropertiesMsg(k, pns)) - } - - } - return res -} - -func (s *SpecValidator) resolveRef(ref *spec.Ref) (*spec.Schema, error) { - if s.spec.SpecFilePath() != "" { - return spec.ResolveRefWithBase(s.spec.Spec(), ref, &spec.ExpandOptions{RelativeBase: s.spec.SpecFilePath()}) - } - // NOTE: it looks like with the new spec resolver, this code is now unrecheable - return spec.ResolveRef(s.spec.Spec(), ref) -} - -func (s *SpecValidator) validateSchemaPropertyNames(nm string, sch spec.Schema, knowns map[string]struct{}) ([]dupProp, *Result) { - var dups []dupProp - - schn := nm - schc := &sch - res := new(Result) - - for schc.Ref.String() != "" { - // gather property names - reso, err := s.resolveRef(&schc.Ref) - if err != nil { - errorHelp.addPointerError(res, err, schc.Ref.String(), nm) - return dups, res - } - schc = reso - schn = sch.Ref.String() - } - - if len(schc.AllOf) > 0 { - for _, chld := range schc.AllOf { - dup, rep := s.validateSchemaPropertyNames(schn, chld, knowns) - if rep != nil && (rep.HasErrors() || rep.HasWarnings()) { - res.Merge(rep) - } - dups = append(dups, dup...) - } - return dups, res - } - - for k := range schc.Properties { - _, ok := knowns[k] - if ok { - dups = append(dups, dupProp{Name: k, Definition: schn}) - } else { - knowns[k] = struct{}{} - } - } - - return dups, res -} - -func (s *SpecValidator) validateCircularAncestry(nm string, sch spec.Schema, knowns map[string]struct{}) ([]string, *Result) { - res := new(Result) - - if sch.Ref.String() == "" && len(sch.AllOf) == 0 { // Safeguard. We should not be able to actually get there - return nil, res - } - var ancs []string - - schn := nm - schc := &sch - - for schc.Ref.String() != "" { - reso, err := s.resolveRef(&schc.Ref) - if err != nil { - errorHelp.addPointerError(res, err, schc.Ref.String(), nm) - return ancs, res - } - schc = reso - schn = sch.Ref.String() - } - - if schn != nm && schn != "" { - if _, ok := knowns[schn]; ok { - ancs = append(ancs, schn) - } - knowns[schn] = struct{}{} - - if len(ancs) > 0 { - return ancs, res - } - } - - if len(schc.AllOf) > 0 { - for _, chld := range schc.AllOf { - if chld.Ref.String() != "" || len(chld.AllOf) > 0 { - anc, rec := s.validateCircularAncestry(schn, chld, knowns) - if rec != nil && (rec.HasErrors() || !rec.HasWarnings()) { - res.Merge(rec) - } - ancs = append(ancs, anc...) - if len(ancs) > 0 { - return ancs, res - } - } - } - } - return ancs, res -} - -func (s *SpecValidator) validateItems() *Result { - // validate parameter, items, schema and response objects for presence of item if type is array - res := new(Result) - - for method, pi := range s.analyzer.Operations() { - for path, op := range pi { - for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { - - if param.TypeName() == arrayType && param.ItemsTypeName() == "" { - res.AddErrors(arrayInParamRequiresItemsMsg(param.Name, op.ID)) - continue - } - if param.In != swaggerBody { - if param.Items != nil { - items := param.Items - for items.TypeName() == arrayType { - if items.ItemsTypeName() == "" { - res.AddErrors(arrayInParamRequiresItemsMsg(param.Name, op.ID)) - break - } - items = items.Items - } - } - } else { - // In: body - if param.Schema != nil { - res.Merge(s.validateSchemaItems(*param.Schema, fmt.Sprintf("body param %q", param.Name), op.ID)) - } - } - } - - var responses []spec.Response - if op.Responses != nil { - if op.Responses.Default != nil { - responses = append(responses, *op.Responses.Default) - } - if op.Responses.StatusCodeResponses != nil { - for _, v := range op.Responses.StatusCodeResponses { - responses = append(responses, v) - } - } - } - - for _, resp := range responses { - // Response headers with array - for hn, hv := range resp.Headers { - if hv.TypeName() == arrayType && hv.ItemsTypeName() == "" { - res.AddErrors(arrayInHeaderRequiresItemsMsg(hn, op.ID)) - } - } - if resp.Schema != nil { - res.Merge(s.validateSchemaItems(*resp.Schema, "response body", op.ID)) - } - } - } - } - return res -} - -// Verifies constraints on array type -func (s *SpecValidator) validateSchemaItems(schema spec.Schema, prefix, opID string) *Result { - res := new(Result) - if !schema.Type.Contains(arrayType) { - return res - } - - if schema.Items == nil || schema.Items.Len() == 0 { - res.AddErrors(arrayRequiresItemsMsg(prefix, opID)) - return res - } - - if schema.Items.Schema != nil { - schema = *schema.Items.Schema - if _, err := compileRegexp(schema.Pattern); err != nil { - res.AddErrors(invalidItemsPatternMsg(prefix, opID, schema.Pattern)) - } - - res.Merge(s.validateSchemaItems(schema, prefix, opID)) - } - return res -} - -func (s *SpecValidator) validatePathParamPresence(path string, fromPath, fromOperation []string) *Result { - // Each defined operation path parameters must correspond to a named element in the API's path pattern. - // (For example, you cannot have a path parameter named id for the following path /pets/{petId} but you must have a path parameter named petId.) - res := new(Result) - for _, l := range fromPath { - var matched bool - for _, r := range fromOperation { - if l == "{"+r+"}" { - matched = true - break - } - } - if !matched { - res.AddErrors(noParameterInPathMsg(l)) - } - } - - for _, p := range fromOperation { - var matched bool - for _, r := range fromPath { - if "{"+p+"}" == r { - matched = true - break - } - } - if !matched { - res.AddErrors(pathParamNotInPathMsg(path, p)) - } - } - - return res -} - -func (s *SpecValidator) validateReferenced() *Result { - var res Result - res.MergeAsWarnings(s.validateReferencedParameters()) - res.MergeAsWarnings(s.validateReferencedResponses()) - res.MergeAsWarnings(s.validateReferencedDefinitions()) - return &res -} - -// nolint: dupl -func (s *SpecValidator) validateReferencedParameters() *Result { - // Each referenceable definition should have references. - params := s.spec.Spec().Parameters - if len(params) == 0 { - return nil - } - - expected := make(map[string]struct{}) - for k := range params { - expected["#/parameters/"+jsonpointer.Escape(k)] = struct{}{} - } - for _, k := range s.analyzer.AllParameterReferences() { - delete(expected, k) - } - - if len(expected) == 0 { - return nil - } - result := new(Result) - for k := range expected { - result.AddWarnings(unusedParamMsg(k)) - } - return result -} - -// nolint: dupl -func (s *SpecValidator) validateReferencedResponses() *Result { - // Each referenceable definition should have references. - responses := s.spec.Spec().Responses - if len(responses) == 0 { - return nil - } - - expected := make(map[string]struct{}) - for k := range responses { - expected["#/responses/"+jsonpointer.Escape(k)] = struct{}{} - } - for _, k := range s.analyzer.AllResponseReferences() { - delete(expected, k) - } - - if len(expected) == 0 { - return nil - } - result := new(Result) - for k := range expected { - result.AddWarnings(unusedResponseMsg(k)) - } - return result -} - -// nolint: dupl -func (s *SpecValidator) validateReferencedDefinitions() *Result { - // Each referenceable definition must have references. - defs := s.spec.Spec().Definitions - if len(defs) == 0 { - return nil - } - - expected := make(map[string]struct{}) - for k := range defs { - expected["#/definitions/"+jsonpointer.Escape(k)] = struct{}{} - } - for _, k := range s.analyzer.AllDefinitionReferences() { - delete(expected, k) - } - - if len(expected) == 0 { - return nil - } - - result := new(Result) - for k := range expected { - result.AddWarnings(unusedDefinitionMsg(k)) - } - return result -} - -func (s *SpecValidator) validateRequiredDefinitions() *Result { - // Each property listed in the required array must be defined in the properties of the model - res := new(Result) - -DEFINITIONS: - for d, schema := range s.spec.Spec().Definitions { - if schema.Required != nil { // Safeguard - for _, pn := range schema.Required { - red := s.validateRequiredProperties(pn, d, &schema) - res.Merge(red) - if !red.IsValid() && !s.Options.ContinueOnErrors { - break DEFINITIONS // there is an error, let's stop that bleeding - } - } - } - } - return res -} - -func (s *SpecValidator) validateRequiredProperties(path, in string, v *spec.Schema) *Result { - // Takes care of recursive property definitions, which may be nested in additionalProperties schemas - res := new(Result) - propertyMatch := false - patternMatch := false - additionalPropertiesMatch := false - isReadOnly := false - - // Regular properties - if _, ok := v.Properties[path]; ok { - propertyMatch = true - isReadOnly = v.Properties[path].ReadOnly - } - - // NOTE: patternProperties are not supported in swagger. Even though, we continue validation here - // We check all defined patterns: if one regexp is invalid, croaks an error - for pp, pv := range v.PatternProperties { - re, err := compileRegexp(pp) - if err != nil { - res.AddErrors(invalidPatternMsg(pp, in)) - } else if re.MatchString(path) { - patternMatch = true - if !propertyMatch { - isReadOnly = pv.ReadOnly - } - } - } - - if !(propertyMatch || patternMatch) { - if v.AdditionalProperties != nil { - if v.AdditionalProperties.Allows && v.AdditionalProperties.Schema == nil { - additionalPropertiesMatch = true - } else if v.AdditionalProperties.Schema != nil { - // additionalProperties as schema are upported in swagger - // recursively validates additionalProperties schema - // TODO : anyOf, allOf, oneOf like in schemaPropsValidator - red := s.validateRequiredProperties(path, in, v.AdditionalProperties.Schema) - if red.IsValid() { - additionalPropertiesMatch = true - if !propertyMatch && !patternMatch { - isReadOnly = v.AdditionalProperties.Schema.ReadOnly - } - } - res.Merge(red) - } - } - } - - if !(propertyMatch || patternMatch || additionalPropertiesMatch) { - res.AddErrors(requiredButNotDefinedMsg(path, in)) - } - - if isReadOnly { - res.AddWarnings(readOnlyAndRequiredMsg(in, path)) - } - return res -} - -func (s *SpecValidator) validateParameters() *Result { - // - for each method, path is unique, regardless of path parameters - // e.g. GET:/petstore/{id}, GET:/petstore/{pet}, GET:/petstore are - // considered duplicate paths - // - each parameter should have a unique `name` and `type` combination - // - each operation should have only 1 parameter of type body - // - there must be at most 1 parameter in body - // - parameters with pattern property must specify valid patterns - // - $ref in parameters must resolve - // - path param must be required - res := new(Result) - rexGarbledPathSegment := mustCompileRegexp(`.*[{}\s]+.*`) - for method, pi := range s.analyzer.Operations() { - methodPaths := make(map[string]map[string]string) - for path, op := range pi { - pathToAdd := pathHelp.stripParametersInPath(path) - - // Warn on garbled path afer param stripping - if rexGarbledPathSegment.MatchString(pathToAdd) { - res.AddWarnings(pathStrippedParamGarbledMsg(pathToAdd)) - } - - // Check uniqueness of stripped paths - if _, found := methodPaths[method][pathToAdd]; found { - - // Sort names for stable, testable output - if strings.Compare(path, methodPaths[method][pathToAdd]) < 0 { - res.AddErrors(pathOverlapMsg(path, methodPaths[method][pathToAdd])) - } else { - res.AddErrors(pathOverlapMsg(methodPaths[method][pathToAdd], path)) - } - } else { - if _, found := methodPaths[method]; !found { - methodPaths[method] = map[string]string{} - } - methodPaths[method][pathToAdd] = path //Original non stripped path - - } - - var bodyParams []string - var paramNames []string - var hasForm, hasBody bool - - // Check parameters names uniqueness for operation - // TODO: should be done after param expansion - res.Merge(s.checkUniqueParams(path, method, op)) - - for _, pr := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { - // Validate pattern regexp for parameters with a Pattern property - if _, err := compileRegexp(pr.Pattern); err != nil { - res.AddErrors(invalidPatternInParamMsg(op.ID, pr.Name, pr.Pattern)) - } - - // There must be at most one parameter in body: list them all - if pr.In == swaggerBody { - bodyParams = append(bodyParams, fmt.Sprintf("%q", pr.Name)) - hasBody = true - } - - if pr.In == "path" { - paramNames = append(paramNames, pr.Name) - // Path declared in path must have the required: true property - if !pr.Required { - res.AddErrors(pathParamRequiredMsg(op.ID, pr.Name)) - } - } - - if pr.In == "formData" { - hasForm = true - } - - if !(pr.Type == numberType || pr.Type == integerType) && - (pr.Maximum != nil || pr.Minimum != nil || pr.MultipleOf != nil) { - // A non-numeric parameter has validation keywords for numeric instances (number and integer) - res.AddWarnings(parameterValidationTypeMismatchMsg(pr.Name, path, pr.Type)) - } - - if !(pr.Type == stringType) && - // A non-string parameter has validation keywords for strings - (pr.MaxLength != nil || pr.MinLength != nil || pr.Pattern != "") { - res.AddWarnings(parameterValidationTypeMismatchMsg(pr.Name, path, pr.Type)) - } - - if !(pr.Type == arrayType) && - // A non-array parameter has validation keywords for arrays - (pr.MaxItems != nil || pr.MinItems != nil || pr.UniqueItems) { - res.AddWarnings(parameterValidationTypeMismatchMsg(pr.Name, path, pr.Type)) - } - } - - // In:formData and In:body are mutually exclusive - if hasBody && hasForm { - res.AddErrors(bothFormDataAndBodyMsg(op.ID)) - } - // There must be at most one body param - // Accurately report situations when more than 1 body param is declared (possibly unnamed) - if len(bodyParams) > 1 { - sort.Strings(bodyParams) - res.AddErrors(multipleBodyParamMsg(op.ID, bodyParams)) - } - - // Check uniqueness of parameters in path - paramsInPath := pathHelp.extractPathParams(path) - for i, p := range paramsInPath { - for j, q := range paramsInPath { - if p == q && i > j { - res.AddErrors(pathParamNotUniqueMsg(path, p, q)) - break - } - } - } - - // Warns about possible malformed params in path - rexGarbledParam := mustCompileRegexp(`{.*[{}\s]+.*}`) - for _, p := range paramsInPath { - if rexGarbledParam.MatchString(p) { - res.AddWarnings(pathParamGarbledMsg(path, p)) - } - } - - // Match params from path vs params from params section - res.Merge(s.validatePathParamPresence(path, paramsInPath, paramNames)) - } - } - return res -} - -func (s *SpecValidator) validateReferencesValid() *Result { - // each reference must point to a valid object - res := new(Result) - for _, r := range s.analyzer.AllRefs() { - if !r.IsValidURI(s.spec.SpecFilePath()) { // Safeguard - spec should always yield a valid URI - res.AddErrors(invalidRefMsg(r.String())) - } - } - if !res.HasErrors() { - // NOTE: with default settings, loads.Document.Expanded() - // stops on first error. Anyhow, the expand option to continue - // on errors fails to report errors at all. - exp, err := s.spec.Expanded() - if err != nil { - res.AddErrors(unresolvedReferencesMsg(err)) - } - s.expanded = exp - } - return res -} - -func (s *SpecValidator) checkUniqueParams(path, method string, op *spec.Operation) *Result { - // Check for duplicate parameters declaration in param section. - // Each parameter should have a unique `name` and `type` combination - // NOTE: this could be factorized in analysis (when constructing the params map) - // However, there are some issues with such a factorization: - // - analysis does not seem to fully expand params - // - param keys may be altered by x-go-name - res := new(Result) - pnames := make(map[string]struct{}) - - if op.Parameters != nil { // Safeguard - for _, ppr := range op.Parameters { - var ok bool - pr, red := paramHelp.resolveParam(path, method, op.ID, &ppr, s) - res.Merge(red) - - if pr != nil && pr.Name != "" { // params with empty name does no participate the check - key := fmt.Sprintf("%s#%s", pr.In, pr.Name) - - if _, ok = pnames[key]; ok { - res.AddErrors(duplicateParamNameMsg(pr.In, pr.Name, op.ID)) - } - pnames[key] = struct{}{} - } - } - } - return res -} - -// SetContinueOnErrors sets the ContinueOnErrors option for this validator. -func (s *SpecValidator) SetContinueOnErrors(c bool) { - s.Options.ContinueOnErrors = c -} diff --git a/vendor/github.com/go-openapi/validate/spec_messages.go b/vendor/github.com/go-openapi/validate/spec_messages.go deleted file mode 100644 index 1a5892aee4..0000000000 --- a/vendor/github.com/go-openapi/validate/spec_messages.go +++ /dev/null @@ -1,360 +0,0 @@ -// 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 validate - -import ( - "net/http" - - "github.com/go-openapi/errors" -) - -// Error messages related to spec validation and returned as results. -const ( - // ArrayRequiresItemsError ... - ArrayRequiresItemsError = "%s for %q is a collection without an element type (array requires items definition)" - - // ArrayInParamRequiresItemsError ... - ArrayInParamRequiresItemsError = "param %q for %q is a collection without an element type (array requires item definition)" - - // ArrayInHeaderRequiresItemsError ... - ArrayInHeaderRequiresItemsError = "header %q for %q is a collection without an element type (array requires items definition)" - - // BothFormDataAndBodyError indicates that an operation specifies both a body and a formData parameter, which is forbidden - BothFormDataAndBodyError = "operation %q has both formData and body parameters. Only one such In: type may be used for a given operation" - - // CannotResolveRefError when a $ref could not be resolved - CannotResolveReferenceError = "could not resolve reference in %s to $ref %s: %v" - - // CircularAncestryDefinitionError ... - CircularAncestryDefinitionError = "definition %q has circular ancestry: %v" - - // DefaultValueDoesNotValidateError results from an invalid default value provided - DefaultValueDoesNotValidateError = "default value for %s in %s does not validate its schema" - - // DefaultValueItemsDoesNotValidateError results from an invalid default value provided for Items - DefaultValueItemsDoesNotValidateError = "default value for %s.items in %s does not validate its schema" - - // DefaultValueHeaderDoesNotValidateError results from an invalid default value provided in header - DefaultValueHeaderDoesNotValidateError = "in operation %q, default value in header %s for %s does not validate its schema" - - // DefaultValueHeaderItemsDoesNotValidateError results from an invalid default value provided in header.items - DefaultValueHeaderItemsDoesNotValidateError = "in operation %q, default value in header.items %s for %s does not validate its schema" - - // DefaultValueInDoesNotValidateError ... - DefaultValueInDoesNotValidateError = "in operation %q, default value in %s does not validate its schema" - - // DuplicateParamNameError ... - DuplicateParamNameError = "duplicate parameter name %q for %q in operation %q" - - // DuplicatePropertiesError ... - DuplicatePropertiesError = "definition %q contains duplicate properties: %v" - - // ExampleValueDoesNotValidateError results from an invalid example value provided - ExampleValueDoesNotValidateError = "example value for %s in %s does not validate its schema" - - // ExampleValueItemsDoesNotValidateError results from an invalid example value provided for Items - ExampleValueItemsDoesNotValidateError = "example value for %s.items in %s does not validate its schema" - - // ExampleValueHeaderDoesNotValidateError results from an invalid example value provided in header - ExampleValueHeaderDoesNotValidateError = "in operation %q, example value in header %s for %s does not validate its schema" - - // ExampleValueHeaderItemsDoesNotValidateError results from an invalid example value provided in header.items - ExampleValueHeaderItemsDoesNotValidateError = "in operation %q, example value in header.items %s for %s does not validate its schema" - - // ExampleValueInDoesNotValidateError ... - ExampleValueInDoesNotValidateError = "in operation %q, example value in %s does not validate its schema" - - // EmptyPathParameterError means that a path parameter was found empty (e.g. "{}") - EmptyPathParameterError = "%q contains an empty path parameter" - - // InvalidDocumentError states that spec validation only processes spec.Document objects - InvalidDocumentError = "spec validator can only validate spec.Document objects" - - // InvalidItemsPatternError indicates an Items definition with invalid pattern - InvalidItemsPatternError = "%s for %q has invalid items pattern: %q" - - // InvalidParameterDefinitionError indicates an error detected on a parameter definition - InvalidParameterDefinitionError = "invalid definition for parameter %s in %s in operation %q" - - // InvalidParameterDefinitionAsSchemaError indicates an error detected on a parameter definition, which was mistaken with a schema definition. - // Most likely, this situation is encountered whenever a $ref has been added as a sibling of the parameter definition. - InvalidParameterDefinitionAsSchemaError = "invalid definition as Schema for parameter %s in %s in operation %q" - - // InvalidPatternError ... - InvalidPatternError = "pattern %q is invalid in %s" - - // InvalidPatternInError indicates an invalid pattern in a schema or items definition - InvalidPatternInError = "%s in %s has invalid pattern: %q" - - // InvalidPatternInHeaderError indicates a header definition with an invalid pattern - InvalidPatternInHeaderError = "in operation %q, header %s for %s has invalid pattern %q: %v" - - // InvalidPatternInParamError ... - InvalidPatternInParamError = "operation %q has invalid pattern in param %q: %q" - - // InvalidReferenceError indicates that a $ref property could not be resolved - InvalidReferenceError = "invalid ref %q" - - // InvalidResponseDefinitionAsSchemaError indicates an error detected on a response definition, which was mistaken with a schema definition. - // Most likely, this situation is encountered whenever a $ref has been added as a sibling of the response definition. - InvalidResponseDefinitionAsSchemaError = "invalid definition as Schema for response %s in %s" - - // MultipleBodyParamError indicates that an operation specifies multiple parameter with in: body - MultipleBodyParamError = "operation %q has more than 1 body param: %v" - - // NonUniqueOperationIDError indicates that the same operationId has been specified several times - NonUniqueOperationIDError = "%q is defined %d times" - - // NoParameterInPathError indicates that a path was found without any parameter - NoParameterInPathError = "path param %q has no parameter definition" - - // NoValidPathErrorOrWarning indicates that no single path could be validated. If Paths is empty, this message is only a warning. - NoValidPathErrorOrWarning = "spec has no valid path defined" - - // NoValidResponseError indicates that no valid response description could be found for an operation - NoValidResponseError = "operation %q has no valid response" - - // PathOverlapError ... - PathOverlapError = "path %s overlaps with %s" - - // PathParamNotInPathError indicates that a parameter specified with in: path was not found in the path specification - PathParamNotInPathError = "path param %q is not present in path %q" - - // PathParamNotUniqueError ... - PathParamNotUniqueError = "params in path %q must be unique: %q conflicts with %q" - - // PathParamNotRequiredError ... - PathParamRequiredError = "in operation %q,path param %q must be declared as required" - - // RefNotAllowedInHeaderError indicates a $ref was found in a header definition, which is not allowed by Swagger - RefNotAllowedInHeaderError = "IMPORTANT!in %q: $ref are not allowed in headers. In context for header %q%s" - - // RequiredButNotDefinedError ... - RequiredButNotDefinedError = "%q is present in required but not defined as property in definition %q" - - // SomeParametersBrokenError indicates that some parameters could not be resolved, which might result in partial checks to be carried on - SomeParametersBrokenError = "some parameters definitions are broken in %q.%s. Cannot carry on full checks on parameters for operation %s" - - // UnresolvedReferencesError indicates that at least one $ref could not be resolved - UnresolvedReferencesError = "some references could not be resolved in spec. First found: %v" -) - -// Warning messages related to spec validation and returned as results -const ( - // ExamplesWithoutSchemaWarning indicates that examples are provided for a response,but not schema to validate the example against - ExamplesWithoutSchemaWarning = "Examples provided without schema in operation %q, %s" - - // ExamplesMimeNotSupportedWarning indicates that examples are provided with a mime type different than application/json, which - // the validator dos not support yetl - ExamplesMimeNotSupportedWarning = "No validation attempt for examples for media types other than application/json, in operation %q, %s" - - // PathParamGarbledWarning ... - PathParamGarbledWarning = "in path %q, param %q contains {,} or white space. Albeit not stricly illegal, this is probably no what you want" - - // ParamValidationTypeMismatch indicates that parameter has validation which does not match its type - ParamValidationTypeMismatch = "validation keywords of parameter %q in path %q don't match its type %s" - - // PathStrippedParamGarbledWarning ... - PathStrippedParamGarbledWarning = "path stripped from path parameters %s contains {,} or white space. This is probably no what you want." - - // ReadOnlyAndRequiredWarning ... - ReadOnlyAndRequiredWarning = "Required property %s in %q should not be marked as both required and readOnly" - - // RefShouldNotHaveSiblingsWarning indicates that a $ref was found with a sibling definition. This results in the $ref taking over its siblings, - // which is most likely not wanted. - RefShouldNotHaveSiblingsWarning = "$ref property should have no sibling in %q.%s" - - // RequiredHasDefaultWarning indicates that a required parameter property should not have a default - RequiredHasDefaultWarning = "%s in %s has a default value and is required as parameter" - - // UnusedDefinitionWarning ... - UnusedDefinitionWarning = "definition %q is not used anywhere" - - // UnusedParamWarning ... - UnusedParamWarning = "parameter %q is not used anywhere" - - // UnusedResponseWarning ... - UnusedResponseWarning = "response %q is not used anywhere" -) - -// Additional error codes -const ( - // InternalErrorCode reports an internal technical error - InternalErrorCode = http.StatusInternalServerError - // NotFoundErrorCode indicates that a resource (e.g. a $ref) could not be found - NotFoundErrorCode = http.StatusNotFound -) - -func invalidDocumentMsg() errors.Error { - return errors.New(InternalErrorCode, InvalidDocumentError) -} -func invalidRefMsg(path string) errors.Error { - return errors.New(NotFoundErrorCode, InvalidReferenceError, path) -} -func unresolvedReferencesMsg(err error) errors.Error { - return errors.New(errors.CompositeErrorCode, UnresolvedReferencesError, err) -} -func noValidPathMsg() errors.Error { - return errors.New(errors.CompositeErrorCode, NoValidPathErrorOrWarning) -} -func emptyPathParameterMsg(path string) errors.Error { - return errors.New(errors.CompositeErrorCode, EmptyPathParameterError, path) -} -func nonUniqueOperationIDMsg(path string, i int) errors.Error { - return errors.New(errors.CompositeErrorCode, NonUniqueOperationIDError, path, i) -} -func circularAncestryDefinitionMsg(path string, args interface{}) errors.Error { - return errors.New(errors.CompositeErrorCode, CircularAncestryDefinitionError, path, args) -} -func duplicatePropertiesMsg(path string, args interface{}) errors.Error { - return errors.New(errors.CompositeErrorCode, DuplicatePropertiesError, path, args) -} -func pathParamNotInPathMsg(path, param string) errors.Error { - return errors.New(errors.CompositeErrorCode, PathParamNotInPathError, param, path) -} -func arrayRequiresItemsMsg(path, operation string) errors.Error { - return errors.New(errors.CompositeErrorCode, ArrayRequiresItemsError, path, operation) -} -func arrayInParamRequiresItemsMsg(path, operation string) errors.Error { - return errors.New(errors.CompositeErrorCode, ArrayInParamRequiresItemsError, path, operation) -} -func arrayInHeaderRequiresItemsMsg(path, operation string) errors.Error { - return errors.New(errors.CompositeErrorCode, ArrayInHeaderRequiresItemsError, path, operation) -} -func invalidItemsPatternMsg(path, operation, pattern string) errors.Error { - return errors.New(errors.CompositeErrorCode, InvalidItemsPatternError, path, operation, pattern) -} -func invalidPatternMsg(pattern, path string) errors.Error { - return errors.New(errors.CompositeErrorCode, InvalidPatternError, pattern, path) -} -func requiredButNotDefinedMsg(path, definition string) errors.Error { - return errors.New(errors.CompositeErrorCode, RequiredButNotDefinedError, path, definition) -} -func pathParamGarbledMsg(path, param string) errors.Error { - return errors.New(errors.CompositeErrorCode, PathParamGarbledWarning, path, param) -} -func pathStrippedParamGarbledMsg(path string) errors.Error { - return errors.New(errors.CompositeErrorCode, PathStrippedParamGarbledWarning, path) -} -func pathOverlapMsg(path, arg string) errors.Error { - return errors.New(errors.CompositeErrorCode, PathOverlapError, path, arg) -} -func invalidPatternInParamMsg(operation, param, pattern string) errors.Error { - return errors.New(errors.CompositeErrorCode, InvalidPatternInParamError, operation, param, pattern) -} -func pathParamRequiredMsg(operation, param string) errors.Error { - return errors.New(errors.CompositeErrorCode, PathParamRequiredError, operation, param) -} -func bothFormDataAndBodyMsg(operation string) errors.Error { - return errors.New(errors.CompositeErrorCode, BothFormDataAndBodyError, operation) -} -func multipleBodyParamMsg(operation string, args interface{}) errors.Error { - return errors.New(errors.CompositeErrorCode, MultipleBodyParamError, operation, args) -} -func pathParamNotUniqueMsg(path, param, arg string) errors.Error { - return errors.New(errors.CompositeErrorCode, PathParamNotUniqueError, path, param, arg) -} -func duplicateParamNameMsg(path, param, operation string) errors.Error { - return errors.New(errors.CompositeErrorCode, DuplicateParamNameError, param, path, operation) -} -func unusedParamMsg(arg string) errors.Error { - return errors.New(errors.CompositeErrorCode, UnusedParamWarning, arg) -} -func unusedDefinitionMsg(arg string) errors.Error { - return errors.New(errors.CompositeErrorCode, UnusedDefinitionWarning, arg) -} -func unusedResponseMsg(arg string) errors.Error { - return errors.New(errors.CompositeErrorCode, UnusedResponseWarning, arg) -} -func readOnlyAndRequiredMsg(path, param string) errors.Error { - return errors.New(errors.CompositeErrorCode, ReadOnlyAndRequiredWarning, param, path) -} -func noParameterInPathMsg(param string) errors.Error { - return errors.New(errors.CompositeErrorCode, NoParameterInPathError, param) -} -func requiredHasDefaultMsg(param, path string) errors.Error { - return errors.New(errors.CompositeErrorCode, RequiredHasDefaultWarning, param, path) -} -func defaultValueDoesNotValidateMsg(param, path string) errors.Error { - return errors.New(errors.CompositeErrorCode, DefaultValueDoesNotValidateError, param, path) -} -func defaultValueItemsDoesNotValidateMsg(param, path string) errors.Error { - return errors.New(errors.CompositeErrorCode, DefaultValueItemsDoesNotValidateError, param, path) -} -func noValidResponseMsg(operation string) errors.Error { - return errors.New(errors.CompositeErrorCode, NoValidResponseError, operation) -} -func defaultValueHeaderDoesNotValidateMsg(operation, header, path string) errors.Error { - return errors.New(errors.CompositeErrorCode, DefaultValueHeaderDoesNotValidateError, operation, header, path) -} -func defaultValueHeaderItemsDoesNotValidateMsg(operation, header, path string) errors.Error { - return errors.New(errors.CompositeErrorCode, DefaultValueHeaderItemsDoesNotValidateError, operation, header, path) -} -func invalidPatternInHeaderMsg(operation, header, path, pattern string, args interface{}) errors.Error { - return errors.New(errors.CompositeErrorCode, InvalidPatternInHeaderError, operation, header, path, pattern, args) -} -func invalidPatternInMsg(path, in, pattern string) errors.Error { - return errors.New(errors.CompositeErrorCode, InvalidPatternInError, path, in, pattern) -} -func defaultValueInDoesNotValidateMsg(operation, path string) errors.Error { - return errors.New(errors.CompositeErrorCode, DefaultValueInDoesNotValidateError, operation, path) -} -func exampleValueDoesNotValidateMsg(param, path string) errors.Error { - return errors.New(errors.CompositeErrorCode, ExampleValueDoesNotValidateError, param, path) -} -func exampleValueItemsDoesNotValidateMsg(param, path string) errors.Error { - return errors.New(errors.CompositeErrorCode, ExampleValueItemsDoesNotValidateError, param, path) -} -func exampleValueHeaderDoesNotValidateMsg(operation, header, path string) errors.Error { - return errors.New(errors.CompositeErrorCode, ExampleValueHeaderDoesNotValidateError, operation, header, path) -} -func exampleValueHeaderItemsDoesNotValidateMsg(operation, header, path string) errors.Error { - return errors.New(errors.CompositeErrorCode, ExampleValueHeaderItemsDoesNotValidateError, operation, header, path) -} -func exampleValueInDoesNotValidateMsg(operation, path string) errors.Error { - return errors.New(errors.CompositeErrorCode, ExampleValueInDoesNotValidateError, operation, path) -} -func examplesWithoutSchemaMsg(operation, response string) errors.Error { - return errors.New(errors.CompositeErrorCode, ExamplesWithoutSchemaWarning, operation, response) -} -func examplesMimeNotSupportedMsg(operation, response string) errors.Error { - return errors.New(errors.CompositeErrorCode, ExamplesMimeNotSupportedWarning, operation, response) -} -func refNotAllowedInHeaderMsg(path, header, ref string) errors.Error { - return errors.New(errors.CompositeErrorCode, RefNotAllowedInHeaderError, path, header, ref) -} -func cannotResolveRefMsg(path, ref string, err error) errors.Error { - return errors.New(errors.CompositeErrorCode, CannotResolveReferenceError, path, ref, err) -} -func invalidParameterDefinitionMsg(path, method, operationID string) errors.Error { - return errors.New(errors.CompositeErrorCode, InvalidParameterDefinitionError, path, method, operationID) -} -func invalidParameterDefinitionAsSchemaMsg(path, method, operationID string) errors.Error { - return errors.New(errors.CompositeErrorCode, InvalidParameterDefinitionAsSchemaError, path, method, operationID) -} -func parameterValidationTypeMismatchMsg(param, path, typ string) errors.Error { - return errors.New(errors.CompositeErrorCode, ParamValidationTypeMismatch, param, path, typ) -} - -// disabled -//func invalidResponseDefinitionAsSchemaMsg(path, method string) errors.Error { -// return errors.New(errors.CompositeErrorCode, InvalidResponseDefinitionAsSchemaError, path, method) -//} -func someParametersBrokenMsg(path, method, operationID string) errors.Error { - return errors.New(errors.CompositeErrorCode, SomeParametersBrokenError, path, method, operationID) -} -func refShouldNotHaveSiblingsMsg(path, operationID string) errors.Error { - return errors.New(errors.CompositeErrorCode, RefShouldNotHaveSiblingsWarning, operationID, path) -} diff --git a/vendor/github.com/go-openapi/validate/update-fixtures.sh b/vendor/github.com/go-openapi/validate/update-fixtures.sh deleted file mode 100644 index 21b06e2b09..0000000000 --- a/vendor/github.com/go-openapi/validate/update-fixtures.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -set -eu -o pipefail -dir=$(git rev-parse --show-toplevel) -scratch=$(mktemp -d -t tmp.XXXXXXXXXX) - -function finish { - rm -rf "$scratch" -} -trap finish EXIT SIGHUP SIGINT SIGTERM - -cd "$scratch" -git clone https://github.com/json-schema-org/JSON-Schema-Test-Suite Suite -cp -r Suite/tests/draft4/* "$dir/fixtures/jsonschema_suite" -cp -a Suite/remotes "$dir/fixtures/jsonschema_suite" diff --git a/vendor/github.com/go-openapi/validate/validator.go b/vendor/github.com/go-openapi/validate/validator.go deleted file mode 100644 index 2acb839db8..0000000000 --- a/vendor/github.com/go-openapi/validate/validator.go +++ /dev/null @@ -1,646 +0,0 @@ -// 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 validate - -import ( - "fmt" - "reflect" - - "github.com/go-openapi/errors" - "github.com/go-openapi/spec" - "github.com/go-openapi/strfmt" -) - -// An EntityValidator is an interface for things that can validate entities -type EntityValidator interface { - Validate(interface{}) *Result -} - -type valueValidator interface { - SetPath(path string) - Applies(interface{}, reflect.Kind) bool - Validate(interface{}) *Result -} - -type itemsValidator struct { - items *spec.Items - root interface{} - path string - in string - validators []valueValidator - KnownFormats strfmt.Registry -} - -func newItemsValidator(path, in string, items *spec.Items, root interface{}, formats strfmt.Registry) *itemsValidator { - iv := &itemsValidator{path: path, in: in, items: items, root: root, KnownFormats: formats} - iv.validators = []valueValidator{ - &typeValidator{ - Type: spec.StringOrArray([]string{items.Type}), - Nullable: items.Nullable, - Format: items.Format, - In: in, - Path: path, - }, - iv.stringValidator(), - iv.formatValidator(), - iv.numberValidator(), - iv.sliceValidator(), - iv.commonValidator(), - } - return iv -} - -func (i *itemsValidator) Validate(index int, data interface{}) *Result { - tpe := reflect.TypeOf(data) - kind := tpe.Kind() - mainResult := new(Result) - path := fmt.Sprintf("%s.%d", i.path, index) - - for _, validator := range i.validators { - validator.SetPath(path) - if validator.Applies(i.root, kind) { - result := validator.Validate(data) - mainResult.Merge(result) - mainResult.Inc() - if result != nil && result.HasErrors() { - return mainResult - } - } - } - return mainResult -} - -func (i *itemsValidator) commonValidator() valueValidator { - return &basicCommonValidator{ - In: i.in, - Default: i.items.Default, - Enum: i.items.Enum, - } -} - -func (i *itemsValidator) sliceValidator() valueValidator { - return &basicSliceValidator{ - In: i.in, - Default: i.items.Default, - MaxItems: i.items.MaxItems, - MinItems: i.items.MinItems, - UniqueItems: i.items.UniqueItems, - Source: i.root, - Items: i.items.Items, - KnownFormats: i.KnownFormats, - } -} - -func (i *itemsValidator) numberValidator() valueValidator { - return &numberValidator{ - In: i.in, - Default: i.items.Default, - MultipleOf: i.items.MultipleOf, - Maximum: i.items.Maximum, - ExclusiveMaximum: i.items.ExclusiveMaximum, - Minimum: i.items.Minimum, - ExclusiveMinimum: i.items.ExclusiveMinimum, - Type: i.items.Type, - Format: i.items.Format, - } -} - -func (i *itemsValidator) stringValidator() valueValidator { - return &stringValidator{ - In: i.in, - Default: i.items.Default, - MaxLength: i.items.MaxLength, - MinLength: i.items.MinLength, - Pattern: i.items.Pattern, - AllowEmptyValue: false, - } -} - -func (i *itemsValidator) formatValidator() valueValidator { - return &formatValidator{ - In: i.in, - //Default: i.items.Default, - Format: i.items.Format, - KnownFormats: i.KnownFormats, - } -} - -type basicCommonValidator struct { - Path string - In string - Default interface{} - Enum []interface{} -} - -func (b *basicCommonValidator) SetPath(path string) { - b.Path = path -} - -func (b *basicCommonValidator) Applies(source interface{}, kind reflect.Kind) bool { - switch source.(type) { - case *spec.Parameter, *spec.Schema, *spec.Header: - return true - } - return false -} - -func (b *basicCommonValidator) Validate(data interface{}) (res *Result) { - if len(b.Enum) > 0 { - for _, enumValue := range b.Enum { - actualType := reflect.TypeOf(enumValue) - if actualType != nil { // Safeguard - expectedValue := reflect.ValueOf(data) - if expectedValue.IsValid() && expectedValue.Type().ConvertibleTo(actualType) { - if reflect.DeepEqual(expectedValue.Convert(actualType).Interface(), enumValue) { - return nil - } - } - } - } - return errorHelp.sErr(errors.EnumFail(b.Path, b.In, data, b.Enum)) - } - return nil -} - -// A HeaderValidator has very limited subset of validations to apply -type HeaderValidator struct { - name string - header *spec.Header - validators []valueValidator - KnownFormats strfmt.Registry -} - -// NewHeaderValidator creates a new header validator object -func NewHeaderValidator(name string, header *spec.Header, formats strfmt.Registry) *HeaderValidator { - p := &HeaderValidator{name: name, header: header, KnownFormats: formats} - p.validators = []valueValidator{ - &typeValidator{ - Type: spec.StringOrArray([]string{header.Type}), - Nullable: header.Nullable, - Format: header.Format, - In: "header", - Path: name, - }, - p.stringValidator(), - p.formatValidator(), - p.numberValidator(), - p.sliceValidator(), - p.commonValidator(), - } - return p -} - -// Validate the value of the header against its schema -func (p *HeaderValidator) Validate(data interface{}) *Result { - result := new(Result) - tpe := reflect.TypeOf(data) - kind := tpe.Kind() - - for _, validator := range p.validators { - if validator.Applies(p.header, kind) { - if err := validator.Validate(data); err != nil { - result.Merge(err) - if err.HasErrors() { - return result - } - } - } - } - return nil -} - -func (p *HeaderValidator) commonValidator() valueValidator { - return &basicCommonValidator{ - Path: p.name, - In: "response", - Default: p.header.Default, - Enum: p.header.Enum, - } -} - -func (p *HeaderValidator) sliceValidator() valueValidator { - return &basicSliceValidator{ - Path: p.name, - In: "response", - Default: p.header.Default, - MaxItems: p.header.MaxItems, - MinItems: p.header.MinItems, - UniqueItems: p.header.UniqueItems, - Items: p.header.Items, - Source: p.header, - KnownFormats: p.KnownFormats, - } -} - -func (p *HeaderValidator) numberValidator() valueValidator { - return &numberValidator{ - Path: p.name, - In: "response", - Default: p.header.Default, - MultipleOf: p.header.MultipleOf, - Maximum: p.header.Maximum, - ExclusiveMaximum: p.header.ExclusiveMaximum, - Minimum: p.header.Minimum, - ExclusiveMinimum: p.header.ExclusiveMinimum, - Type: p.header.Type, - Format: p.header.Format, - } -} - -func (p *HeaderValidator) stringValidator() valueValidator { - return &stringValidator{ - Path: p.name, - In: "response", - Default: p.header.Default, - Required: true, - MaxLength: p.header.MaxLength, - MinLength: p.header.MinLength, - Pattern: p.header.Pattern, - AllowEmptyValue: false, - } -} - -func (p *HeaderValidator) formatValidator() valueValidator { - return &formatValidator{ - Path: p.name, - In: "response", - //Default: p.header.Default, - Format: p.header.Format, - KnownFormats: p.KnownFormats, - } -} - -// A ParamValidator has very limited subset of validations to apply -type ParamValidator struct { - param *spec.Parameter - validators []valueValidator - KnownFormats strfmt.Registry -} - -// NewParamValidator creates a new param validator object -func NewParamValidator(param *spec.Parameter, formats strfmt.Registry) *ParamValidator { - p := &ParamValidator{param: param, KnownFormats: formats} - p.validators = []valueValidator{ - &typeValidator{ - Type: spec.StringOrArray([]string{param.Type}), - Nullable: param.Nullable, - Format: param.Format, - In: param.In, - Path: param.Name, - }, - p.stringValidator(), - p.formatValidator(), - p.numberValidator(), - p.sliceValidator(), - p.commonValidator(), - } - return p -} - -// Validate the data against the description of the parameter -func (p *ParamValidator) Validate(data interface{}) *Result { - result := new(Result) - tpe := reflect.TypeOf(data) - kind := tpe.Kind() - - // TODO: validate type - for _, validator := range p.validators { - if validator.Applies(p.param, kind) { - if err := validator.Validate(data); err != nil { - result.Merge(err) - if err.HasErrors() { - return result - } - } - } - } - return nil -} - -func (p *ParamValidator) commonValidator() valueValidator { - return &basicCommonValidator{ - Path: p.param.Name, - In: p.param.In, - Default: p.param.Default, - Enum: p.param.Enum, - } -} - -func (p *ParamValidator) sliceValidator() valueValidator { - return &basicSliceValidator{ - Path: p.param.Name, - In: p.param.In, - Default: p.param.Default, - MaxItems: p.param.MaxItems, - MinItems: p.param.MinItems, - UniqueItems: p.param.UniqueItems, - Items: p.param.Items, - Source: p.param, - KnownFormats: p.KnownFormats, - } -} - -func (p *ParamValidator) numberValidator() valueValidator { - return &numberValidator{ - Path: p.param.Name, - In: p.param.In, - Default: p.param.Default, - MultipleOf: p.param.MultipleOf, - Maximum: p.param.Maximum, - ExclusiveMaximum: p.param.ExclusiveMaximum, - Minimum: p.param.Minimum, - ExclusiveMinimum: p.param.ExclusiveMinimum, - Type: p.param.Type, - Format: p.param.Format, - } -} - -func (p *ParamValidator) stringValidator() valueValidator { - return &stringValidator{ - Path: p.param.Name, - In: p.param.In, - Default: p.param.Default, - AllowEmptyValue: p.param.AllowEmptyValue, - Required: p.param.Required, - MaxLength: p.param.MaxLength, - MinLength: p.param.MinLength, - Pattern: p.param.Pattern, - } -} - -func (p *ParamValidator) formatValidator() valueValidator { - return &formatValidator{ - Path: p.param.Name, - In: p.param.In, - //Default: p.param.Default, - Format: p.param.Format, - KnownFormats: p.KnownFormats, - } -} - -type basicSliceValidator struct { - Path string - In string - Default interface{} - MaxItems *int64 - MinItems *int64 - UniqueItems bool - Items *spec.Items - Source interface{} - itemsValidator *itemsValidator - KnownFormats strfmt.Registry -} - -func (s *basicSliceValidator) SetPath(path string) { - s.Path = path -} - -func (s *basicSliceValidator) Applies(source interface{}, kind reflect.Kind) bool { - switch source.(type) { - case *spec.Parameter, *spec.Items, *spec.Header: - return kind == reflect.Slice - } - return false -} - -func (s *basicSliceValidator) Validate(data interface{}) *Result { - val := reflect.ValueOf(data) - - size := int64(val.Len()) - if s.MinItems != nil { - if err := MinItems(s.Path, s.In, size, *s.MinItems); err != nil { - return errorHelp.sErr(err) - } - } - - if s.MaxItems != nil { - if err := MaxItems(s.Path, s.In, size, *s.MaxItems); err != nil { - return errorHelp.sErr(err) - } - } - - if s.UniqueItems { - if err := UniqueItems(s.Path, s.In, data); err != nil { - return errorHelp.sErr(err) - } - } - - if s.itemsValidator == nil && s.Items != nil { - s.itemsValidator = newItemsValidator(s.Path, s.In, s.Items, s.Source, s.KnownFormats) - } - - if s.itemsValidator != nil { - for i := 0; i < int(size); i++ { - ele := val.Index(i) - if err := s.itemsValidator.Validate(i, ele.Interface()); err != nil && err.HasErrors() { - return err - } - } - } - return nil -} - -/* unused -func (s *basicSliceValidator) hasDuplicates(value reflect.Value, size int) bool { - dict := make(map[interface{}]struct{}) - for i := 0; i < size; i++ { - ele := value.Index(i) - if _, ok := dict[ele.Interface()]; ok { - return true - } - dict[ele.Interface()] = struct{}{} - } - return false -} -*/ - -type numberValidator struct { - Path string - In string - Default interface{} - MultipleOf *float64 - Maximum *float64 - ExclusiveMaximum bool - Minimum *float64 - ExclusiveMinimum bool - // Allows for more accurate behavior regarding integers - Type string - Format string -} - -func (n *numberValidator) SetPath(path string) { - n.Path = path -} - -func (n *numberValidator) Applies(source interface{}, kind reflect.Kind) bool { - switch source.(type) { - case *spec.Parameter, *spec.Schema, *spec.Items, *spec.Header: - isInt := kind >= reflect.Int && kind <= reflect.Uint64 - isFloat := kind == reflect.Float32 || kind == reflect.Float64 - r := isInt || isFloat - debugLog("schema props validator for %q applies %t for %T (kind: %v) isInt=%t, isFloat=%t\n", n.Path, r, source, kind, isInt, isFloat) - return r - } - debugLog("schema props validator for %q applies %t for %T (kind: %v)\n", n.Path, false, source, kind) - return false -} - -// Validate provides a validator for generic JSON numbers, -// -// By default, numbers are internally represented as float64. -// Formats float, or float32 may alter this behavior by mapping to float32. -// A special validation process is followed for integers, with optional "format": -// this is an attempt to provide a validation with native types. -// -// NOTE: since the constraint specified (boundary, multipleOf) is unmarshalled -// as float64, loss of information remains possible (e.g. on very large integers). -// -// Since this value directly comes from the unmarshalling, it is not possible -// at this stage of processing to check further and guarantee the correctness of such values. -// -// Normally, the JSON Number.MAX_SAFE_INTEGER (resp. Number.MIN_SAFE_INTEGER) -// would check we do not get such a loss. -// -// If this is the case, replace AddErrors() by AddWarnings() and IsValid() by !HasWarnings(). -// -// TODO: consider replacing boundary check errors by simple warnings. -// -// TODO: default boundaries with MAX_SAFE_INTEGER are not checked (specific to json.Number?) -func (n *numberValidator) Validate(val interface{}) *Result { - res := new(Result) - - resMultiple := new(Result) - resMinimum := new(Result) - resMaximum := new(Result) - - // Used only to attempt to validate constraint on value, - // even though value or constraint specified do not match type and format - data := valueHelp.asFloat64(val) - - // Is the provided value within the range of the specified numeric type and format? - res.AddErrors(IsValueValidAgainstRange(val, n.Type, n.Format, "Checked", n.Path)) - - // nolint: dupl - if n.MultipleOf != nil { - // Is the constraint specifier within the range of the specific numeric type and format? - resMultiple.AddErrors(IsValueValidAgainstRange(*n.MultipleOf, n.Type, n.Format, "MultipleOf", n.Path)) - if resMultiple.IsValid() { - // Constraint validated with compatible types - if err := MultipleOfNativeType(n.Path, n.In, val, *n.MultipleOf); err != nil { - resMultiple.Merge(errorHelp.sErr(err)) - } - } else { - // Constraint nevertheless validated, converted as general number - if err := MultipleOf(n.Path, n.In, data, *n.MultipleOf); err != nil { - resMultiple.Merge(errorHelp.sErr(err)) - } - } - } - - // nolint: dupl - if n.Maximum != nil { - // Is the constraint specifier within the range of the specific numeric type and format? - resMaximum.AddErrors(IsValueValidAgainstRange(*n.Maximum, n.Type, n.Format, "Maximum boundary", n.Path)) - if resMaximum.IsValid() { - // Constraint validated with compatible types - if err := MaximumNativeType(n.Path, n.In, val, *n.Maximum, n.ExclusiveMaximum); err != nil { - resMaximum.Merge(errorHelp.sErr(err)) - } - } else { - // Constraint nevertheless validated, converted as general number - if err := Maximum(n.Path, n.In, data, *n.Maximum, n.ExclusiveMaximum); err != nil { - resMaximum.Merge(errorHelp.sErr(err)) - } - } - } - - // nolint: dupl - if n.Minimum != nil { - // Is the constraint specifier within the range of the specific numeric type and format? - resMinimum.AddErrors(IsValueValidAgainstRange(*n.Minimum, n.Type, n.Format, "Minimum boundary", n.Path)) - if resMinimum.IsValid() { - // Constraint validated with compatible types - if err := MinimumNativeType(n.Path, n.In, val, *n.Minimum, n.ExclusiveMinimum); err != nil { - resMinimum.Merge(errorHelp.sErr(err)) - } - } else { - // Constraint nevertheless validated, converted as general number - if err := Minimum(n.Path, n.In, data, *n.Minimum, n.ExclusiveMinimum); err != nil { - resMinimum.Merge(errorHelp.sErr(err)) - } - } - } - res.Merge(resMultiple, resMinimum, resMaximum) - res.Inc() - return res -} - -type stringValidator struct { - Default interface{} - Required bool - AllowEmptyValue bool - MaxLength *int64 - MinLength *int64 - Pattern string - Path string - In string -} - -func (s *stringValidator) SetPath(path string) { - s.Path = path -} - -func (s *stringValidator) Applies(source interface{}, kind reflect.Kind) bool { - switch source.(type) { - case *spec.Parameter, *spec.Schema, *spec.Items, *spec.Header: - r := kind == reflect.String - debugLog("string validator for %q applies %t for %T (kind: %v)\n", s.Path, r, source, kind) - return r - } - debugLog("string validator for %q applies %t for %T (kind: %v)\n", s.Path, false, source, kind) - return false -} - -func (s *stringValidator) Validate(val interface{}) *Result { - data, ok := val.(string) - if !ok { - return errorHelp.sErr(errors.InvalidType(s.Path, s.In, stringType, val)) - } - - if s.Required && !s.AllowEmptyValue && (s.Default == nil || s.Default == "") { - if err := RequiredString(s.Path, s.In, data); err != nil { - return errorHelp.sErr(err) - } - } - - if s.MaxLength != nil { - if err := MaxLength(s.Path, s.In, data, *s.MaxLength); err != nil { - return errorHelp.sErr(err) - } - } - - if s.MinLength != nil { - if err := MinLength(s.Path, s.In, data, *s.MinLength); err != nil { - return errorHelp.sErr(err) - } - } - - if s.Pattern != "" { - if err := Pattern(s.Path, s.In, data, s.Pattern); err != nil { - return errorHelp.sErr(err) - } - } - return nil -} diff --git a/vendor/github.com/go-stack/stack/.travis.yml b/vendor/github.com/go-stack/stack/.travis.yml deleted file mode 100644 index 5c5a2b516d..0000000000 --- a/vendor/github.com/go-stack/stack/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: go -sudo: false -go: - - 1.7.x - - 1.8.x - - 1.9.x - - 1.10.x - - 1.11.x - - tip - -before_install: - - go get github.com/mattn/goveralls - -script: - - goveralls -service=travis-ci diff --git a/vendor/github.com/go-stack/stack/LICENSE.md b/vendor/github.com/go-stack/stack/LICENSE.md deleted file mode 100644 index 2abf98ea83..0000000000 --- a/vendor/github.com/go-stack/stack/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Chris Hines - -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/go-stack/stack/README.md b/vendor/github.com/go-stack/stack/README.md deleted file mode 100644 index f11ccccaa4..0000000000 --- a/vendor/github.com/go-stack/stack/README.md +++ /dev/null @@ -1,38 +0,0 @@ -[![GoDoc](https://godoc.org/github.com/go-stack/stack?status.svg)](https://godoc.org/github.com/go-stack/stack) -[![Go Report Card](https://goreportcard.com/badge/go-stack/stack)](https://goreportcard.com/report/go-stack/stack) -[![TravisCI](https://travis-ci.org/go-stack/stack.svg?branch=master)](https://travis-ci.org/go-stack/stack) -[![Coverage Status](https://coveralls.io/repos/github/go-stack/stack/badge.svg?branch=master)](https://coveralls.io/github/go-stack/stack?branch=master) - -# stack - -Package stack implements utilities to capture, manipulate, and format call -stacks. It provides a simpler API than package runtime. - -The implementation takes care of the minutia and special cases of interpreting -the program counter (pc) values returned by runtime.Callers. - -## Versioning - -Package stack publishes releases via [semver](http://semver.org/) compatible Git -tags prefixed with a single 'v'. The master branch always contains the latest -release. The develop branch contains unreleased commits. - -## Formatting - -Package stack's types implement fmt.Formatter, which provides a simple and -flexible way to declaratively configure formatting when used with logging or -error tracking packages. - -```go -func DoTheThing() { - c := stack.Caller(0) - log.Print(c) // "source.go:10" - log.Printf("%+v", c) // "pkg/path/source.go:10" - log.Printf("%n", c) // "DoTheThing" - - s := stack.Trace().TrimRuntime() - log.Print(s) // "[source.go:15 caller.go:42 main.go:14]" -} -``` - -See the docs for all of the supported formatting options. diff --git a/vendor/github.com/go-stack/stack/go.mod b/vendor/github.com/go-stack/stack/go.mod deleted file mode 100644 index 96a53a1092..0000000000 --- a/vendor/github.com/go-stack/stack/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/go-stack/stack diff --git a/vendor/github.com/go-stack/stack/stack.go b/vendor/github.com/go-stack/stack/stack.go deleted file mode 100644 index ac3b93b14f..0000000000 --- a/vendor/github.com/go-stack/stack/stack.go +++ /dev/null @@ -1,400 +0,0 @@ -// +build go1.7 - -// Package stack implements utilities to capture, manipulate, and format call -// stacks. It provides a simpler API than package runtime. -// -// The implementation takes care of the minutia and special cases of -// interpreting the program counter (pc) values returned by runtime.Callers. -// -// Package stack's types implement fmt.Formatter, which provides a simple and -// flexible way to declaratively configure formatting when used with logging -// or error tracking packages. -package stack - -import ( - "bytes" - "errors" - "fmt" - "io" - "runtime" - "strconv" - "strings" -) - -// Call records a single function invocation from a goroutine stack. -type Call struct { - frame runtime.Frame -} - -// Caller returns a Call from the stack of the current goroutine. The argument -// skip is the number of stack frames to ascend, with 0 identifying the -// calling function. -func Caller(skip int) Call { - // As of Go 1.9 we need room for up to three PC entries. - // - // 0. An entry for the stack frame prior to the target to check for - // special handling needed if that prior entry is runtime.sigpanic. - // 1. A possible second entry to hold metadata about skipped inlined - // functions. If inline functions were not skipped the target frame - // PC will be here. - // 2. A third entry for the target frame PC when the second entry - // is used for skipped inline functions. - var pcs [3]uintptr - n := runtime.Callers(skip+1, pcs[:]) - frames := runtime.CallersFrames(pcs[:n]) - frame, _ := frames.Next() - frame, _ = frames.Next() - - return Call{ - frame: frame, - } -} - -// String implements fmt.Stinger. It is equivalent to fmt.Sprintf("%v", c). -func (c Call) String() string { - return fmt.Sprint(c) -} - -// MarshalText implements encoding.TextMarshaler. It formats the Call the same -// as fmt.Sprintf("%v", c). -func (c Call) MarshalText() ([]byte, error) { - if c.frame == (runtime.Frame{}) { - return nil, ErrNoFunc - } - - buf := bytes.Buffer{} - fmt.Fprint(&buf, c) - return buf.Bytes(), nil -} - -// ErrNoFunc means that the Call has a nil *runtime.Func. The most likely -// cause is a Call with the zero value. -var ErrNoFunc = errors.New("no call stack information") - -// Format implements fmt.Formatter with support for the following verbs. -// -// %s source file -// %d line number -// %n function name -// %k last segment of the package path -// %v equivalent to %s:%d -// -// It accepts the '+' and '#' flags for most of the verbs as follows. -// -// %+s path of source file relative to the compile time GOPATH, -// or the module path joined to the path of source file relative -// to module root -// %#s full path of source file -// %+n import path qualified function name -// %+k full package path -// %+v equivalent to %+s:%d -// %#v equivalent to %#s:%d -func (c Call) Format(s fmt.State, verb rune) { - if c.frame == (runtime.Frame{}) { - fmt.Fprintf(s, "%%!%c(NOFUNC)", verb) - return - } - - switch verb { - case 's', 'v': - file := c.frame.File - switch { - case s.Flag('#'): - // done - case s.Flag('+'): - file = pkgFilePath(&c.frame) - default: - const sep = "/" - if i := strings.LastIndex(file, sep); i != -1 { - file = file[i+len(sep):] - } - } - io.WriteString(s, file) - if verb == 'v' { - buf := [7]byte{':'} - s.Write(strconv.AppendInt(buf[:1], int64(c.frame.Line), 10)) - } - - case 'd': - buf := [6]byte{} - s.Write(strconv.AppendInt(buf[:0], int64(c.frame.Line), 10)) - - case 'k': - name := c.frame.Function - const pathSep = "/" - start, end := 0, len(name) - if i := strings.LastIndex(name, pathSep); i != -1 { - start = i + len(pathSep) - } - const pkgSep = "." - if i := strings.Index(name[start:], pkgSep); i != -1 { - end = start + i - } - if s.Flag('+') { - start = 0 - } - io.WriteString(s, name[start:end]) - - case 'n': - name := c.frame.Function - if !s.Flag('+') { - const pathSep = "/" - if i := strings.LastIndex(name, pathSep); i != -1 { - name = name[i+len(pathSep):] - } - const pkgSep = "." - if i := strings.Index(name, pkgSep); i != -1 { - name = name[i+len(pkgSep):] - } - } - io.WriteString(s, name) - } -} - -// Frame returns the call frame infomation for the Call. -func (c Call) Frame() runtime.Frame { - return c.frame -} - -// PC returns the program counter for this call frame; multiple frames may -// have the same PC value. -// -// Deprecated: Use Call.Frame instead. -func (c Call) PC() uintptr { - return c.frame.PC -} - -// CallStack records a sequence of function invocations from a goroutine -// stack. -type CallStack []Call - -// String implements fmt.Stinger. It is equivalent to fmt.Sprintf("%v", cs). -func (cs CallStack) String() string { - return fmt.Sprint(cs) -} - -var ( - openBracketBytes = []byte("[") - closeBracketBytes = []byte("]") - spaceBytes = []byte(" ") -) - -// MarshalText implements encoding.TextMarshaler. It formats the CallStack the -// same as fmt.Sprintf("%v", cs). -func (cs CallStack) MarshalText() ([]byte, error) { - buf := bytes.Buffer{} - buf.Write(openBracketBytes) - for i, pc := range cs { - if i > 0 { - buf.Write(spaceBytes) - } - fmt.Fprint(&buf, pc) - } - buf.Write(closeBracketBytes) - return buf.Bytes(), nil -} - -// Format implements fmt.Formatter by printing the CallStack as square brackets -// ([, ]) surrounding a space separated list of Calls each formatted with the -// supplied verb and options. -func (cs CallStack) Format(s fmt.State, verb rune) { - s.Write(openBracketBytes) - for i, pc := range cs { - if i > 0 { - s.Write(spaceBytes) - } - pc.Format(s, verb) - } - s.Write(closeBracketBytes) -} - -// Trace returns a CallStack for the current goroutine with element 0 -// identifying the calling function. -func Trace() CallStack { - var pcs [512]uintptr - n := runtime.Callers(1, pcs[:]) - - frames := runtime.CallersFrames(pcs[:n]) - cs := make(CallStack, 0, n) - - // Skip extra frame retrieved just to make sure the runtime.sigpanic - // special case is handled. - frame, more := frames.Next() - - for more { - frame, more = frames.Next() - cs = append(cs, Call{frame: frame}) - } - - return cs -} - -// TrimBelow returns a slice of the CallStack with all entries below c -// removed. -func (cs CallStack) TrimBelow(c Call) CallStack { - for len(cs) > 0 && cs[0] != c { - cs = cs[1:] - } - return cs -} - -// TrimAbove returns a slice of the CallStack with all entries above c -// removed. -func (cs CallStack) TrimAbove(c Call) CallStack { - for len(cs) > 0 && cs[len(cs)-1] != c { - cs = cs[:len(cs)-1] - } - return cs -} - -// pkgIndex returns the index that results in file[index:] being the path of -// file relative to the compile time GOPATH, and file[:index] being the -// $GOPATH/src/ portion of file. funcName must be the name of a function in -// file as returned by runtime.Func.Name. -func pkgIndex(file, funcName string) int { - // As of Go 1.6.2 there is no direct way to know the compile time GOPATH - // at runtime, but we can infer the number of path segments in the GOPATH. - // We note that runtime.Func.Name() returns the function name qualified by - // the import path, which does not include the GOPATH. Thus we can trim - // segments from the beginning of the file path until the number of path - // separators remaining is one more than the number of path separators in - // the function name. For example, given: - // - // GOPATH /home/user - // file /home/user/src/pkg/sub/file.go - // fn.Name() pkg/sub.Type.Method - // - // We want to produce: - // - // file[:idx] == /home/user/src/ - // file[idx:] == pkg/sub/file.go - // - // From this we can easily see that fn.Name() has one less path separator - // than our desired result for file[idx:]. We count separators from the - // end of the file path until it finds two more than in the function name - // and then move one character forward to preserve the initial path - // segment without a leading separator. - const sep = "/" - i := len(file) - for n := strings.Count(funcName, sep) + 2; n > 0; n-- { - i = strings.LastIndex(file[:i], sep) - if i == -1 { - i = -len(sep) - break - } - } - // get back to 0 or trim the leading separator - return i + len(sep) -} - -// pkgFilePath returns the frame's filepath relative to the compile-time GOPATH, -// or its module path joined to its path relative to the module root. -// -// As of Go 1.11 there is no direct way to know the compile time GOPATH or -// module paths at runtime, but we can piece together the desired information -// from available information. We note that runtime.Frame.Function contains the -// function name qualified by the package path, which includes the module path -// but not the GOPATH. We can extract the package path from that and append the -// last segments of the file path to arrive at the desired package qualified -// file path. For example, given: -// -// GOPATH /home/user -// import path pkg/sub -// frame.File /home/user/src/pkg/sub/file.go -// frame.Function pkg/sub.Type.Method -// Desired return pkg/sub/file.go -// -// It appears that we simply need to trim ".Type.Method" from frame.Function and -// append "/" + path.Base(file). -// -// But there are other wrinkles. Although it is idiomatic to do so, the internal -// name of a package is not required to match the last segment of its import -// path. In addition, the introduction of modules in Go 1.11 allows working -// without a GOPATH. So we also must make these work right: -// -// GOPATH /home/user -// import path pkg/go-sub -// package name sub -// frame.File /home/user/src/pkg/go-sub/file.go -// frame.Function pkg/sub.Type.Method -// Desired return pkg/go-sub/file.go -// -// Module path pkg/v2 -// import path pkg/v2/go-sub -// package name sub -// frame.File /home/user/cloned-pkg/go-sub/file.go -// frame.Function pkg/v2/sub.Type.Method -// Desired return pkg/v2/go-sub/file.go -// -// We can handle all of these situations by using the package path extracted -// from frame.Function up to, but not including, the last segment as the prefix -// and the last two segments of frame.File as the suffix of the returned path. -// This preserves the existing behavior when working in a GOPATH without modules -// and a semantically equivalent behavior when used in module aware project. -func pkgFilePath(frame *runtime.Frame) string { - pre := pkgPrefix(frame.Function) - post := pathSuffix(frame.File) - if pre == "" { - return post - } - return pre + "/" + post -} - -// pkgPrefix returns the import path of the function's package with the final -// segment removed. -func pkgPrefix(funcName string) string { - const pathSep = "/" - end := strings.LastIndex(funcName, pathSep) - if end == -1 { - return "" - } - return funcName[:end] -} - -// pathSuffix returns the last two segments of path. -func pathSuffix(path string) string { - const pathSep = "/" - lastSep := strings.LastIndex(path, pathSep) - if lastSep == -1 { - return path - } - return path[strings.LastIndex(path[:lastSep], pathSep)+1:] -} - -var runtimePath string - -func init() { - var pcs [3]uintptr - runtime.Callers(0, pcs[:]) - frames := runtime.CallersFrames(pcs[:]) - frame, _ := frames.Next() - file := frame.File - - idx := pkgIndex(frame.File, frame.Function) - - runtimePath = file[:idx] - if runtime.GOOS == "windows" { - runtimePath = strings.ToLower(runtimePath) - } -} - -func inGoroot(c Call) bool { - file := c.frame.File - if len(file) == 0 || file[0] == '?' { - return true - } - if runtime.GOOS == "windows" { - file = strings.ToLower(file) - } - return strings.HasPrefix(file, runtimePath) || strings.HasSuffix(file, "/_testmain.go") -} - -// TrimRuntime returns a slice of the CallStack with the topmost entries from -// the go runtime removed. It considers any calls originating from unknown -// files, files under GOROOT, or _testmain.go as part of the runtime. -func (cs CallStack) TrimRuntime() CallStack { - for len(cs) > 0 && inGoroot(cs[len(cs)-1]) { - cs = cs[:len(cs)-1] - } - return cs -} diff --git a/vendor/github.com/golang/mock/gomock/call.go b/vendor/github.com/golang/mock/gomock/call.go index 3d54d9f5d0..7345f6540f 100644 --- a/vendor/github.com/golang/mock/gomock/call.go +++ b/vendor/github.com/golang/mock/gomock/call.go @@ -82,8 +82,8 @@ func (c *Call) AnyTimes() *Call { return c } -// MinTimes requires the call to occur at least n times. If AnyTimes or MaxTimes have not been called, MinTimes also -// sets the maximum number of calls to infinity. +// MinTimes requires the call to occur at least n times. If AnyTimes or MaxTimes have not been called or if MaxTimes +// was previously called with 1, MinTimes also sets the maximum number of calls to infinity. func (c *Call) MinTimes(n int) *Call { c.minCalls = n if c.maxCalls == 1 { @@ -92,8 +92,8 @@ func (c *Call) MinTimes(n int) *Call { return c } -// MaxTimes limits the number of calls to n times. If AnyTimes or MinTimes have not been called, MaxTimes also -// sets the minimum number of calls to 0. +// MaxTimes limits the number of calls to n times. If AnyTimes or MinTimes have not been called or if MinTimes was +// previously called with 1, MaxTimes also sets the minimum number of calls to 0. func (c *Call) MaxTimes(n int) *Call { c.maxCalls = n if c.minCalls == 1 { @@ -276,7 +276,7 @@ func (c *Call) satisfied() bool { return c.numCalls >= c.minCalls } -// Returns true iff the maximum number of calls have been made. +// Returns true if the maximum number of calls have been made. func (c *Call) exhausted() bool { return c.numCalls >= c.maxCalls } @@ -295,27 +295,34 @@ func (c *Call) String() string { func (c *Call) matches(args []interface{}) error { if !c.methodType.IsVariadic() { if len(args) != len(c.args) { - return fmt.Errorf("Expected call at %s has the wrong number of arguments. Got: %d, want: %d", + return fmt.Errorf("expected call at %s has the wrong number of arguments. Got: %d, want: %d", c.origin, len(args), len(c.args)) } for i, m := range c.args { if !m.Matches(args[i]) { - return fmt.Errorf("Expected call at %s doesn't match the argument at index %s.\nGot: %v\nWant: %v", - c.origin, strconv.Itoa(i), args[i], m) + got := fmt.Sprintf("%v", args[i]) + if gs, ok := m.(GotFormatter); ok { + got = gs.Got(args[i]) + } + + return fmt.Errorf( + "expected call at %s doesn't match the argument at index %d.\nGot: %v\nWant: %v", + c.origin, i, got, m, + ) } } } else { if len(c.args) < c.methodType.NumIn()-1 { - return fmt.Errorf("Expected call at %s has the wrong number of matchers. Got: %d, want: %d", + return fmt.Errorf("expected call at %s has the wrong number of matchers. Got: %d, want: %d", c.origin, len(c.args), c.methodType.NumIn()-1) } if len(c.args) != c.methodType.NumIn() && len(args) != len(c.args) { - return fmt.Errorf("Expected call at %s has the wrong number of arguments. Got: %d, want: %d", + return fmt.Errorf("expected call at %s has the wrong number of arguments. Got: %d, want: %d", c.origin, len(args), len(c.args)) } if len(args) < len(c.args)-1 { - return fmt.Errorf("Expected call at %s has the wrong number of arguments. Got: %d, want: greater than or equal to %d", + return fmt.Errorf("expected call at %s has the wrong number of arguments. Got: %d, want: greater than or equal to %d", c.origin, len(args), len(c.args)-1) } @@ -323,7 +330,7 @@ func (c *Call) matches(args []interface{}) error { if i < c.methodType.NumIn()-1 { // Non-variadic args if !m.Matches(args[i]) { - return fmt.Errorf("Expected call at %s doesn't match the argument at index %s.\nGot: %v\nWant: %v", + return fmt.Errorf("expected call at %s doesn't match the argument at index %s.\nGot: %v\nWant: %v", c.origin, strconv.Itoa(i), args[i], m) } continue @@ -382,7 +389,7 @@ func (c *Call) matches(args []interface{}) error { // Check that the call is not exhausted. if c.exhausted() { - return fmt.Errorf("Expected call at %s has already been called the max number of times.", c.origin) + return fmt.Errorf("expected call at %s has already been called the max number of times", c.origin) } return nil @@ -396,7 +403,7 @@ func (c *Call) dropPrereqs() (preReqs []*Call) { return } -func (c *Call) call(args []interface{}) []func([]interface{}) []interface{} { +func (c *Call) call() []func([]interface{}) []interface{} { c.numCalls++ return c.actions } diff --git a/vendor/github.com/golang/mock/gomock/callset.go b/vendor/github.com/golang/mock/gomock/callset.go index c44a8a585b..b046b525e9 100644 --- a/vendor/github.com/golang/mock/gomock/callset.go +++ b/vendor/github.com/golang/mock/gomock/callset.go @@ -72,7 +72,7 @@ func (cs callSet) FindMatch(receiver interface{}, method string, args []interfac for _, call := range expected { err := call.matches(args) if err != nil { - fmt.Fprintf(&callsErrors, "\n%v", err) + _, _ = fmt.Fprintf(&callsErrors, "\n%v", err) } else { return call, nil } @@ -83,12 +83,12 @@ func (cs callSet) FindMatch(receiver interface{}, method string, args []interfac exhausted := cs.exhausted[key] for _, call := range exhausted { if err := call.matches(args); err != nil { - fmt.Fprintf(&callsErrors, "\n%v", err) + _, _ = fmt.Fprintf(&callsErrors, "\n%v", err) } } if len(expected)+len(exhausted) == 0 { - fmt.Fprintf(&callsErrors, "there are no expected calls of the method %q for that receiver", method) + _, _ = fmt.Fprintf(&callsErrors, "there are no expected calls of the method %q for that receiver", method) } return nil, fmt.Errorf(callsErrors.String()) diff --git a/vendor/github.com/golang/mock/gomock/controller.go b/vendor/github.com/golang/mock/gomock/controller.go index 0651c91e44..d7c3c656ae 100644 --- a/vendor/github.com/golang/mock/gomock/controller.go +++ b/vendor/github.com/golang/mock/gomock/controller.go @@ -84,7 +84,7 @@ type TestHelper interface { // defer. // // func TestFoo(t *testing.T) { -// ctrl := gomock.NewController(st) +// ctrl := gomock.NewController(t) // defer ctrl.Finish() // // .. // } @@ -209,7 +209,7 @@ func (ctrl *Controller) Call(receiver interface{}, method string, args ...interf ctrl.expectedCalls.Remove(preReqCall) } - actions := expected.call(args) + actions := expected.call() if expected.exhausted() { ctrl.expectedCalls.Remove(expected) } diff --git a/vendor/github.com/golang/mock/gomock/matchers.go b/vendor/github.com/golang/mock/gomock/matchers.go index fbff06062f..7bfc07be43 100644 --- a/vendor/github.com/golang/mock/gomock/matchers.go +++ b/vendor/github.com/golang/mock/gomock/matchers.go @@ -17,6 +17,7 @@ package gomock import ( "fmt" "reflect" + "strings" ) // A Matcher is a representation of a class of values. @@ -29,9 +30,66 @@ type Matcher interface { String() string } +// WantFormatter modifies the given Matcher's String() method to the given +// Stringer. This allows for control on how the "Want" is formatted when +// printing . +func WantFormatter(s fmt.Stringer, m Matcher) Matcher { + type matcher interface { + Matches(x interface{}) bool + } + + return struct { + matcher + fmt.Stringer + }{ + matcher: m, + Stringer: s, + } +} + +// StringerFunc type is an adapter to allow the use of ordinary functions as +// a Stringer. If f is a function with the appropriate signature, +// StringerFunc(f) is a Stringer that calls f. +type StringerFunc func() string + +// String implements fmt.Stringer. +func (f StringerFunc) String() string { + return f() +} + +// GotFormatter is used to better print failure messages. If a matcher +// implements GotFormatter, it will use the result from Got when printing +// the failure message. +type GotFormatter interface { + // Got is invoked with the received value. The result is used when + // printing the failure message. + Got(got interface{}) string +} + +// GotFormatterFunc type is an adapter to allow the use of ordinary +// functions as a GotFormatter. If f is a function with the appropriate +// signature, GotFormatterFunc(f) is a GotFormatter that calls f. +type GotFormatterFunc func(got interface{}) string + +// Got implements GotFormatter. +func (f GotFormatterFunc) Got(got interface{}) string { + return f(got) +} + +// GotFormatterAdapter attaches a GotFormatter to a Matcher. +func GotFormatterAdapter(s GotFormatter, m Matcher) Matcher { + return struct { + GotFormatter + Matcher + }{ + GotFormatter: s, + Matcher: m, + } +} + type anyMatcher struct{} -func (anyMatcher) Matches(x interface{}) bool { +func (anyMatcher) Matches(interface{}) bool { return true } @@ -97,7 +155,51 @@ func (m assignableToTypeOfMatcher) String() string { return "is assignable to " + m.targetType.Name() } +type allMatcher struct { + matchers []Matcher +} + +func (am allMatcher) Matches(x interface{}) bool { + for _, m := range am.matchers { + if !m.Matches(x) { + return false + } + } + return true +} + +func (am allMatcher) String() string { + ss := make([]string, 0, len(am.matchers)) + for _, matcher := range am.matchers { + ss = append(ss, matcher.String()) + } + return strings.Join(ss, "; ") +} + +type lenMatcher struct { + i int +} + +func (m lenMatcher) Matches(x interface{}) bool { + v := reflect.ValueOf(x) + switch v.Kind() { + case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == m.i + default: + return false + } +} + +func (m lenMatcher) String() string { + return fmt.Sprintf("has length %d", m.i) +} + // Constructors + +// All returns a composite Matcher that returns true if and only all of the +// matchers return true. +func All(ms ...Matcher) Matcher { return allMatcher{ms} } + // Any returns a matcher that always matches. func Any() Matcher { return anyMatcher{} } @@ -108,6 +210,12 @@ func Any() Matcher { return anyMatcher{} } // Eq(5).Matches(4) // returns false func Eq(x interface{}) Matcher { return eqMatcher{x} } +// Len returns a matcher that matches on length. This matcher returns false if +// is compared to a type that is not an array, chan, map, slice, or string. +func Len(i int) Matcher { + return lenMatcher{i} +} + // Nil returns a matcher that matches if the received value is nil. // // Example usage: @@ -136,6 +244,12 @@ func Not(x interface{}) Matcher { // var s fmt.Stringer = &bytes.Buffer{} // AssignableToTypeOf(s).Matches(time.Second) // returns true // AssignableToTypeOf(s).Matches(99) // returns false +// +// var ctx = reflect.TypeOf((*context.Context)).Elem() +// AssignableToTypeOf(ctx).Matches(context.Background()) // returns true func AssignableToTypeOf(x interface{}) Matcher { + if xt, ok := x.(reflect.Type); ok { + return assignableToTypeOfMatcher{xt} + } return assignableToTypeOfMatcher{reflect.TypeOf(x)} } diff --git a/vendor/github.com/golang/mock/mockgen/mockgen.go b/vendor/github.com/golang/mock/mockgen/mockgen.go index a64bd2554f..685a7cb749 100644 --- a/vendor/github.com/golang/mock/mockgen/mockgen.go +++ b/vendor/github.com/golang/mock/mockgen/mockgen.go @@ -20,6 +20,7 @@ package main import ( "bytes" + "encoding/json" "flag" "fmt" "go/build" @@ -29,6 +30,7 @@ import ( "io/ioutil" "log" "os" + "os/exec" "path" "path/filepath" "sort" @@ -43,6 +45,12 @@ const ( gomockImportPath = "github.com/golang/mock/gomock" ) +var ( + version = "" + commit = "none" + date = "unknown" +) + var ( source = flag.String("source", "", "(source mode) Input Go source file; enables source mode.") destination = flag.String("destination", "", "Output file; defaults to stdout.") @@ -53,22 +61,40 @@ var ( copyrightFile = flag.String("copyright_file", "", "Copyright file used to add copyright header") debugParser = flag.Bool("debug_parser", false, "Print out parser results only.") + showVersion = flag.Bool("version", false, "Print version.") ) func main() { flag.Usage = usage flag.Parse() + if *showVersion { + printVersion() + return + } + var pkg *model.Package var err error + var packageName string if *source != "" { - pkg, err = parseFile(*source) + pkg, err = sourceMode(*source) } else { if flag.NArg() != 2 { usage() log.Fatal("Expected exactly two arguments") } - pkg, err = reflect(flag.Arg(0), strings.Split(flag.Arg(1), ",")) + packageName = flag.Arg(0) + if packageName == "." { + dir, err := os.Getwd() + if err != nil { + log.Fatalf("Get current directory failed: %v", err) + } + packageName, err = packageNameOfDir(dir) + if err != nil { + log.Fatalf("Parse package name failed: %v", err) + } + } + pkg, err = reflectMode(packageName, strings.Split(flag.Arg(1), ",")) } if err != nil { log.Fatalf("Loading input failed: %v", err) @@ -92,11 +118,11 @@ func main() { dst = f } - packageName := *packageOut - if packageName == "" { + outputPackageName := *packageOut + if outputPackageName == "" { // pkg.Name in reflect mode is the base name of the import path, // which might have characters that are illegal to have in package names. - packageName = "mock_" + sanitize(pkg.Name) + outputPackageName = "mock_" + sanitize(pkg.Name) } // outputPackagePath represents the fully qualified name of the package of @@ -122,7 +148,7 @@ func main() { if *source != "" { g.filename = *source } else { - g.srcPackage = flag.Arg(0) + g.srcPackage = packageName g.srcInterfaces = flag.Arg(1) } @@ -137,7 +163,7 @@ func main() { g.copyrightHeader = string(header) } - if err := g.Generate(pkg, packageName, outputPackagePath); err != nil { + if err := g.Generate(pkg, outputPackageName, outputPackagePath); err != nil { log.Fatalf("Failed generating mock: %v", err) } if _, err := dst.Write(g.Output()); err != nil { @@ -158,7 +184,7 @@ func parseMockNames(names string) map[string]string { } func usage() { - io.WriteString(os.Stderr, usageText) + _, _ = io.WriteString(os.Stderr, usageText) flag.PrintDefaults() } @@ -234,8 +260,9 @@ func sanitize(s string) string { return t } -func (g *generator) Generate(pkg *model.Package, pkgName string, outputPackagePath string) error { - if pkgName != pkg.Name { +func (g *generator) Generate(pkg *model.Package, outputPkgName string, outputPackagePath string) error { + if outputPkgName != pkg.Name && *selfPackage == "" { + // reset outputPackagePath if it's not passed in through -self_package outputPackagePath = "" } @@ -269,7 +296,7 @@ func (g *generator) Generate(pkg *model.Package, pkgName string, outputPackagePa } // Sort keys to make import alias generation predictable - sortedPaths := make([]string, len(im), len(im)) + sortedPaths := make([]string, len(im)) x := 0 for pth := range im { sortedPaths[x] = pth @@ -277,10 +304,15 @@ func (g *generator) Generate(pkg *model.Package, pkgName string, outputPackagePa } sort.Strings(sortedPaths) + packagesName := createPackageMap(sortedPaths) + g.packageMap = make(map[string]string, len(im)) localNames := make(map[string]bool, len(im)) for _, pth := range sortedPaths { - base := sanitize(path.Base(pth)) + base, ok := packagesName[pth] + if !ok { + base = sanitize(path.Base(pth)) + } // Local names for an imported package can usually be the basename of the import path. // A couple of situations don't permit that, such as duplicate local names @@ -294,25 +326,30 @@ func (g *generator) Generate(pkg *model.Package, pkgName string, outputPackagePa i++ } + // Avoid importing package if source pkg == output pkg + if pth == pkg.PkgPath && outputPkgName == pkg.Name { + continue + } + g.packageMap[pth] = pkgName localNames[pkgName] = true } if *writePkgComment { - g.p("// Package %v is a generated GoMock package.", pkgName) + g.p("// Package %v is a generated GoMock package.", outputPkgName) } - g.p("package %v", pkgName) + g.p("package %v", outputPkgName) g.p("") g.p("import (") g.in() - for path, pkg := range g.packageMap { - if path == outputPackagePath { + for pkgPath, pkgName := range g.packageMap { + if pkgPath == outputPackagePath { continue } - g.p("%v %q", pkg, path) + g.p("%v %q", pkgName, pkgPath) } - for _, path := range pkg.DotImports { - g.p(". %q", path) + for _, pkgPath := range pkg.DotImports { + g.p(". %q", pkgPath) } g.out() g.p(")") @@ -357,9 +394,9 @@ func (g *generator) GenerateMockInterface(intf *model.Interface, outputPackagePa g.p("") // TODO: Re-enable this if we can import the interface reliably. - //g.p("// Verify that the mock satisfies the interface at compile time.") - //g.p("var _ %v = (*%v)(nil)", typeName, mockType) - //g.p("") + // g.p("// Verify that the mock satisfies the interface at compile time.") + // g.p("var _ %v = (*%v)(nil)", typeName, mockType) + // g.p("") g.p("// New%v creates a new mock instance", mockType) g.p("func New%v(ctrl *gomock.Controller) *%v {", mockType, mockType) @@ -387,9 +424,9 @@ func (g *generator) GenerateMockInterface(intf *model.Interface, outputPackagePa func (g *generator) GenerateMockMethods(mockType string, intf *model.Interface, pkgOverride string) { for _, m := range intf.Methods { g.p("") - g.GenerateMockMethod(mockType, m, pkgOverride) + _ = g.GenerateMockMethod(mockType, m, pkgOverride) g.p("") - g.GenerateMockRecorderMethod(mockType, m) + _ = g.GenerateMockRecorderMethod(mockType, m) } } @@ -531,7 +568,7 @@ func (g *generator) getArgNames(m *model.Method) []string { argNames := make([]string, len(m.In)) for i, p := range m.In { name := p.Name - if name == "" { + if name == "" || name == "_" { name = fmt.Sprintf("arg%d", i) } argNames[i] = name @@ -586,3 +623,37 @@ func (g *generator) Output() []byte { } return src } + +// createPackageMap returns a map of import path to package name +// for specified importPaths. +func createPackageMap(importPaths []string) map[string]string { + var pkg struct { + Name string + ImportPath string + } + pkgMap := make(map[string]string) + b := bytes.NewBuffer(nil) + args := []string{"list", "-json"} + args = append(args, importPaths...) + cmd := exec.Command("go", args...) + cmd.Stdout = b + cmd.Run() + dec := json.NewDecoder(b) + for dec.More() { + err := dec.Decode(&pkg) + if err != nil { + log.Printf("failed to decode 'go list' output: %v", err) + continue + } + pkgMap[pkg.ImportPath] = pkg.Name + } + return pkgMap +} + +func printVersion() { + if version != "" { + fmt.Printf("v%s\nCommit: %s\nDate: %s\n", version, commit, date) + } else { + printModuleVersion() + } +} diff --git a/vendor/github.com/golang/mock/mockgen/model/model.go b/vendor/github.com/golang/mock/mockgen/model/model.go index 8113e3d399..88783cfdf6 100644 --- a/vendor/github.com/golang/mock/mockgen/model/model.go +++ b/vendor/github.com/golang/mock/mockgen/model/model.go @@ -29,12 +29,14 @@ const pkgPath = "github.com/golang/mock/mockgen/model" // Package is a Go package. It may be a subset. type Package struct { Name string + PkgPath string Interfaces []*Interface DotImports []string } +// Print writes the package name and its exported interfaces. func (pkg *Package) Print(w io.Writer) { - fmt.Fprintf(w, "package %s\n", pkg.Name) + _, _ = fmt.Fprintf(w, "package %s\n", pkg.Name) for _, intf := range pkg.Interfaces { intf.Print(w) } @@ -55,8 +57,9 @@ type Interface struct { Methods []*Method } +// Print writes the interface name and its methods. func (intf *Interface) Print(w io.Writer) { - fmt.Fprintf(w, "interface %s\n", intf.Name) + _, _ = fmt.Fprintf(w, "interface %s\n", intf.Name) for _, m := range intf.Methods { m.Print(w) } @@ -75,20 +78,21 @@ type Method struct { Variadic *Parameter // may be nil } +// Print writes the method name and its signature. func (m *Method) Print(w io.Writer) { - fmt.Fprintf(w, " - method %s\n", m.Name) + _, _ = fmt.Fprintf(w, " - method %s\n", m.Name) if len(m.In) > 0 { - fmt.Fprintf(w, " in:\n") + _, _ = fmt.Fprintf(w, " in:\n") for _, p := range m.In { p.Print(w) } } if m.Variadic != nil { - fmt.Fprintf(w, " ...:\n") + _, _ = fmt.Fprintf(w, " ...:\n") m.Variadic.Print(w) } if len(m.Out) > 0 { - fmt.Fprintf(w, " out:\n") + _, _ = fmt.Fprintf(w, " out:\n") for _, p := range m.Out { p.Print(w) } @@ -113,12 +117,13 @@ type Parameter struct { Type Type } +// Print writes a method parameter. func (p *Parameter) Print(w io.Writer) { n := p.Name if n == "" { n = `""` } - fmt.Fprintf(w, " - %v: %v\n", n, p.Type.String(nil, "")) + _, _ = fmt.Fprintf(w, " - %v: %v\n", n, p.Type.String(nil, "")) } // Type is a Go type. @@ -183,6 +188,7 @@ func (ct *ChanType) addImports(im map[string]bool) { ct.Type.addImports(im) } // ChanDir is a channel direction. type ChanDir int +// Constants for channel directions. const ( RecvDir ChanDir = 1 SendDir ChanDir = 2 @@ -255,10 +261,11 @@ func (nt *NamedType) String(pm map[string]string, pkgOverride string) string { prefix := pm[nt.Package] if prefix != "" { return prefix + "." + nt.Type - } else { - return nt.Type } + + return nt.Type } + func (nt *NamedType) addImports(im map[string]bool) { if nt.Package != "" { im[nt.Package] = true @@ -278,11 +285,13 @@ func (pt *PointerType) addImports(im map[string]bool) { pt.Type.addImports(im) } // PredeclaredType is a predeclared type such as "int". type PredeclaredType string -func (pt PredeclaredType) String(pm map[string]string, pkgOverride string) string { return string(pt) } -func (pt PredeclaredType) addImports(im map[string]bool) {} +func (pt PredeclaredType) String(map[string]string, string) string { return string(pt) } +func (pt PredeclaredType) addImports(map[string]bool) {} // The following code is intended to be called by the program generated by ../reflect.go. +// InterfaceFromInterfaceType returns a pointer to an interface for the +// given reflection interface type. func InterfaceFromInterfaceType(it reflect.Type) (*Interface, error) { if it.Kind() != reflect.Interface { return nil, fmt.Errorf("%v is not an interface", it) diff --git a/vendor/github.com/golang/mock/mockgen/parse.go b/vendor/github.com/golang/mock/mockgen/parse.go index 9c5475e93a..a8edde805e 100644 --- a/vendor/github.com/golang/mock/mockgen/parse.go +++ b/vendor/github.com/golang/mock/mockgen/parse.go @@ -24,6 +24,7 @@ import ( "go/build" "go/parser" "go/token" + "io/ioutil" "log" "path" "path/filepath" @@ -41,25 +42,17 @@ var ( // TODO: simplify error reporting -func parseFile(source string) (*model.Package, error) { +// sourceMode generates mocks via source file. +func sourceMode(source string) (*model.Package, error) { srcDir, err := filepath.Abs(filepath.Dir(source)) if err != nil { return nil, fmt.Errorf("failed getting source directory: %v", err) } - cfg := &packages.Config{Mode: packages.LoadSyntax, Tests: true} - pkgs, err := packages.Load(cfg, "file="+source) + packageImport, err := parsePackageImport(source, srcDir) if err != nil { return nil, err } - if packages.PrintErrors(pkgs) > 0 || len(pkgs) == 0 { - return nil, errors.New("loading package failed") - } - - packageImport := pkgs[0].PkgPath - - // It is illegal to import a _test package. - packageImport = strings.TrimSuffix(packageImport, "_test") fs := token.NewFileSet() file, err := parser.ParseFile(fs, source, nil, 0) @@ -101,8 +94,8 @@ func parseFile(source string) (*model.Package, error) { if err != nil { return nil, err } - for path := range dotImports { - pkg.DotImports = append(pkg.DotImports, path) + for pkgPath := range dotImports { + pkg.DotImports = append(pkg.DotImports, pkgPath) } return pkg, nil } @@ -161,18 +154,18 @@ func (p *fileParser) addAuxInterfacesFromFile(pkg string, file *ast.File) { func (p *fileParser) parseFile(importPath string, file *ast.File) (*model.Package, error) { allImports, dotImports := importsOfFile(file) // Don't stomp imports provided by -imports. Those should take precedence. - for pkg, path := range allImports { + for pkg, pkgPath := range allImports { if _, ok := p.imports[pkg]; !ok { - p.imports[pkg] = path + p.imports[pkg] = pkgPath } } // Add imports from auxiliary files, which might be needed for embedded interfaces. // Don't stomp any other imports. for _, f := range p.auxFiles { auxImports, _ := importsOfFile(f) - for pkg, path := range auxImports { + for pkg, pkgPath := range auxImports { if _, ok := p.imports[pkg]; !ok { - p.imports[pkg] = path + p.imports[pkg] = pkgPath } } } @@ -187,6 +180,7 @@ func (p *fileParser) parseFile(importPath string, file *ast.File) (*model.Packag } return &model.Package{ Name: file.Name.String(), + PkgPath: importPath, Interfaces: is, DotImports: dotImports, }, nil @@ -250,9 +244,7 @@ func (p *fileParser) parseInterface(name, pkg string, it *ast.InterfaceType) (*m } // Copy the methods. // TODO: apply shadowing rules. - for _, m := range eintf.Methods { - intf.Methods = append(intf.Methods, m) - } + intf.Methods = append(intf.Methods, eintf.Methods...) case *ast.SelectorExpr: // Embedded interface in another package. fpkg, sel := v.X.(*ast.Ident).String(), v.Sel.String() @@ -278,9 +270,7 @@ func (p *fileParser) parseInterface(name, pkg string, it *ast.InterfaceType) (*m } // Copy the methods. // TODO: apply shadowing rules. - for _, m := range eintf.Methods { - intf.Methods = append(intf.Methods, m) - } + intf.Methods = append(intf.Methods, eintf.Methods...) default: return nil, fmt.Errorf("don't know how to mock method of type %T", field.Type) } @@ -442,6 +432,15 @@ func (p *fileParser) parseType(pkg string, typ ast.Expr) (model.Type, error) { // importsOfFile returns a map of package name to import path // of the imports in file. func importsOfFile(file *ast.File) (normalImports map[string]string, dotImports []string) { + var importPaths []string + for _, is := range file.Imports { + if is.Name != nil { + continue + } + importPath := is.Path.Value[1 : len(is.Path.Value)-1] // remove quotes + importPaths = append(importPaths, importPath) + } + packagesName := createPackageMap(importPaths) normalImports = make(map[string]string) dotImports = make([]string, 0) for _, is := range file.Imports { @@ -455,15 +454,15 @@ func importsOfFile(file *ast.File) (normalImports map[string]string, dotImports } pkgName = is.Name.Name } else { - pkg, err := build.Import(importPath, "", 0) - if err != nil { + pkg, ok := packagesName[importPath] + if !ok { // Fallback to import path suffix. Note that this is uncertain. _, last := path.Split(importPath) // If the last path component has dots, the first dot-delimited // field is used as the name. pkgName = strings.SplitN(last, ".", 2)[0] } else { - pkgName = pkg.Name + pkgName = pkg } } @@ -521,3 +520,46 @@ func isVariadic(f *ast.FuncType) bool { _, ok := f.Params.List[nargs-1].Type.(*ast.Ellipsis) return ok } + +// packageNameOfDir get package import path via dir +func packageNameOfDir(srcDir string) (string, error) { + files, err := ioutil.ReadDir(srcDir) + if err != nil { + log.Fatal(err) + } + + var goFilePath string + for _, file := range files { + if !file.IsDir() && strings.HasSuffix(file.Name(), ".go") { + goFilePath = file.Name() + break + } + } + if goFilePath == "" { + return "", fmt.Errorf("go source file not found %s", srcDir) + } + + packageImport, err := parsePackageImport(goFilePath, srcDir) + if err != nil { + return "", err + } + return packageImport, nil +} + +// parseImportPackage get package import path via source file +func parsePackageImport(source, srcDir string) (string, error) { + cfg := &packages.Config{Mode: packages.LoadFiles, Tests: true, Dir: srcDir} + pkgs, err := packages.Load(cfg, "file="+source) + if err != nil { + return "", err + } + if packages.PrintErrors(pkgs) > 0 || len(pkgs) == 0 { + return "", errors.New("loading package failed") + } + + packageImport := pkgs[0].PkgPath + + // It is illegal to import a _test package. + packageImport = strings.TrimSuffix(packageImport, "_test") + return packageImport, nil +} diff --git a/vendor/github.com/golang/mock/mockgen/reflect.go b/vendor/github.com/golang/mock/mockgen/reflect.go index d4c7b7fe2d..5604baf3dc 100644 --- a/vendor/github.com/golang/mock/mockgen/reflect.go +++ b/vendor/github.com/golang/mock/mockgen/reflect.go @@ -27,6 +27,7 @@ import ( "os/exec" "path/filepath" "runtime" + "strings" "text/template" "github.com/golang/mock/mockgen/model" @@ -116,7 +117,7 @@ func runInDir(program []byte, dir string) (*model.Package, error) { cmdArgs := []string{} cmdArgs = append(cmdArgs, "build") if *buildFlags != "" { - cmdArgs = append(cmdArgs, *buildFlags) + cmdArgs = append(cmdArgs, strings.Split(*buildFlags, " ")...) } cmdArgs = append(cmdArgs, "-o", progBinary, progSource) @@ -128,10 +129,12 @@ func runInDir(program []byte, dir string) (*model.Package, error) { if err := cmd.Run(); err != nil { return nil, err } + return run(filepath.Join(tmpDir, progBinary)) } -func reflect(importPath string, symbols []string) (*model.Package, error) { +// reflectMode generates mocks via reflection on an interface. +func reflectMode(importPath string, symbols []string) (*model.Package, error) { // TODO: sanity check arguments if *execOnly != "" { @@ -144,12 +147,17 @@ func reflect(importPath string, symbols []string) (*model.Package, error) { } if *progOnly { - os.Stdout.Write(program) + _, _ = os.Stdout.Write(program) os.Exit(0) } wd, _ := os.Getwd() + // Try to run the reflection program in the current working directory. + if p, err := runInDir(program, wd); err == nil { + return p, nil + } + // Try to run the program in the same directory as the input package. if p, err := build.Import(importPath, wd, build.FindOnly); err == nil { dir := p.Dir @@ -158,11 +166,7 @@ func reflect(importPath string, symbols []string) (*model.Package, error) { } } - // Since that didn't work, try to run it in the current working directory. - if p, err := runInDir(program, wd); err == nil { - return p, nil - } - // Since that didn't work, try to run it in a standard temp directory. + // Try to run it in a standard temp directory. return runInDir(program, "") } diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_mips64.go b/vendor/github.com/golang/mock/mockgen/version.1.11.go similarity index 66% rename from vendor/github.com/prometheus/procfs/cpuinfo_mips64.go rename to vendor/github.com/golang/mock/mockgen/version.1.11.go index 22d93f8ef0..e6b25db238 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo_mips64.go +++ b/vendor/github.com/golang/mock/mockgen/version.1.11.go @@ -1,9 +1,10 @@ -// Copyright 2020 The Prometheus Authors +// Copyright 2019 Google LLC +// // 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 +// 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, @@ -11,8 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -// +build linux +// +build !go1.12 + +package main -package procfs +import ( + "log" +) -var parseCPUInfo = parseCPUInfoMips +func printModuleVersion() { + log.Printf("No version information is available for Mockgen compiled with " + + "version 1.11") +} diff --git a/vendor/github.com/golang/mock/mockgen/version.1.12.go b/vendor/github.com/golang/mock/mockgen/version.1.12.go new file mode 100644 index 0000000000..ad121ae63c --- /dev/null +++ b/vendor/github.com/golang/mock/mockgen/version.1.12.go @@ -0,0 +1,35 @@ +// Copyright 2019 Google LLC +// +// 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. +// + +// +build go1.12 + +package main + +import ( + "fmt" + "log" + "runtime/debug" +) + +func printModuleVersion() { + if bi, exists := debug.ReadBuildInfo(); exists { + fmt.Println(bi.Main.Version) + } else { + log.Printf("No version information found. Make sure to use " + + "GO111MODULE=on when running 'go get' in order to use specific " + + "version of the binary.") + } + +} diff --git a/vendor/github.com/golang/protobuf/proto/text_decode.go b/vendor/github.com/golang/protobuf/proto/text_decode.go index 4a59310098..47eb3e4450 100644 --- a/vendor/github.com/golang/protobuf/proto/text_decode.go +++ b/vendor/github.com/golang/protobuf/proto/text_decode.go @@ -765,7 +765,7 @@ func unescape(s string) (ch string, tail string, err error) { if i > utf8.MaxRune { return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) } - return string(i), s, nil + return string(rune(i)), s, nil } return "", "", fmt.Errorf(`unknown escape \%c`, r) } diff --git a/vendor/github.com/google/go-cmp/cmp/compare.go b/vendor/github.com/google/go-cmp/cmp/compare.go index 580ae20978..6656186846 100644 --- a/vendor/github.com/google/go-cmp/cmp/compare.go +++ b/vendor/github.com/google/go-cmp/cmp/compare.go @@ -95,12 +95,12 @@ func Equal(x, y interface{}, opts ...Option) bool { return s.result.Equal() } -// Diff returns a human-readable report of the differences between two values. -// It returns an empty string if and only if Equal returns true for the same -// input values and options. +// Diff returns a human-readable report of the differences between two values: +// y - x. It returns an empty string if and only if Equal returns true for the +// same input values and options. // // The output is displayed as a literal in pseudo-Go syntax. -// At the start of each line, a "-" prefix indicates an element removed from x, +// At the start of each line, a "-" prefix indicates an element removed from y, // a "+" prefix to indicates an element added to y, and the lack of a prefix // indicates an element common to both x and y. If possible, the output // uses fmt.Stringer.String or error.Error methods to produce more humanly diff --git a/vendor/github.com/google/go-cmp/cmp/options.go b/vendor/github.com/google/go-cmp/cmp/options.go index abbd2a63b6..4b0407a7f8 100644 --- a/vendor/github.com/google/go-cmp/cmp/options.go +++ b/vendor/github.com/google/go-cmp/cmp/options.go @@ -225,11 +225,14 @@ func (validator) apply(s *state, vx, vy reflect.Value) { // Unable to Interface implies unexported field without visibility access. if !vx.CanInterface() || !vy.CanInterface() { - const help = "consider using a custom Comparer; if you control the implementation of type, you can also consider using an Exporter, AllowUnexported, or cmpopts.IgnoreUnexported" + help := "consider using a custom Comparer; if you control the implementation of type, you can also consider using an Exporter, AllowUnexported, or cmpopts.IgnoreUnexported" var name string if t := s.curPath.Index(-2).Type(); t.Name() != "" { // Named type with unexported fields. name = fmt.Sprintf("%q.%v", t.PkgPath(), t.Name()) // e.g., "path/to/package".MyType + if _, ok := reflect.New(t).Interface().(error); ok { + help = "consider using cmpopts.EquateErrors to compare error values" + } } else { // Unnamed type with unexported fields. Derive PkgPath from field. var pkgPath string diff --git a/vendor/github.com/google/go-cmp/cmp/report_reflect.go b/vendor/github.com/google/go-cmp/cmp/report_reflect.go index 2d722ea51d..786f671269 100644 --- a/vendor/github.com/google/go-cmp/cmp/report_reflect.go +++ b/vendor/github.com/google/go-cmp/cmp/report_reflect.go @@ -5,6 +5,7 @@ package cmp import ( + "bytes" "fmt" "reflect" "strconv" @@ -125,21 +126,20 @@ func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind, // implementations crash when doing so. if (t.Kind() != reflect.Ptr && t.Kind() != reflect.Interface) || !v.IsNil() { var prefix, strVal string - switch v := v.Interface().(type) { - case error: - prefix, strVal = "e", v.Error() - case fmt.Stringer: - prefix, strVal = "s", v.String() - } - if prefix != "" { - maxLen := len(strVal) - if opts.LimitVerbosity { - maxLen = (1 << opts.verbosity()) << 5 // 32, 64, 128, 256, etc... + func() { + // Swallow and ignore any panics from String or Error. + defer func() { recover() }() + switch v := v.Interface().(type) { + case error: + strVal = v.Error() + prefix = "e" + case fmt.Stringer: + strVal = v.String() + prefix = "s" } - if len(strVal) > maxLen+len(textEllipsis) { - return textLine(prefix + formatString(strVal[:maxLen]) + string(textEllipsis)) - } - return textLine(prefix + formatString(strVal)) + }() + if prefix != "" { + return opts.formatString(prefix, strVal) } } } @@ -171,14 +171,7 @@ func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind, case reflect.Complex64, reflect.Complex128: return textLine(fmt.Sprint(v.Complex())) case reflect.String: - maxLen := v.Len() - if opts.LimitVerbosity { - maxLen = (1 << opts.verbosity()) << 5 // 32, 64, 128, 256, etc... - } - if v.Len() > maxLen+len(textEllipsis) { - return textLine(formatString(v.String()[:maxLen]) + string(textEllipsis)) - } - return textLine(formatString(v.String())) + return opts.formatString("", v.String()) case reflect.UnsafePointer, reflect.Chan, reflect.Func: return textLine(formatPointer(value.PointerOf(v), true)) case reflect.Struct: @@ -210,6 +203,17 @@ func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind, if v.IsNil() { return textNil } + + // Check whether this is a []byte of text data. + if t.Elem() == reflect.TypeOf(byte(0)) { + b := v.Bytes() + isPrintSpace := func(r rune) bool { return unicode.IsPrint(r) && unicode.IsSpace(r) } + if len(b) > 0 && utf8.Valid(b) && len(bytes.TrimFunc(b, isPrintSpace)) == 0 { + out = opts.formatString("", string(b)) + return opts.WithTypeMode(emitType).FormatType(t, out) + } + } + fallthrough case reflect.Array: maxLen := v.Len() @@ -295,6 +299,49 @@ func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind, } } +func (opts formatOptions) formatString(prefix, s string) textNode { + maxLen := len(s) + maxLines := strings.Count(s, "\n") + 1 + if opts.LimitVerbosity { + maxLen = (1 << opts.verbosity()) << 5 // 32, 64, 128, 256, etc... + maxLines = (1 << opts.verbosity()) << 2 // 4, 8, 16, 32, 64, etc... + } + + // For multiline strings, use the triple-quote syntax, + // but only use it when printing removed or inserted nodes since + // we only want the extra verbosity for those cases. + lines := strings.Split(strings.TrimSuffix(s, "\n"), "\n") + isTripleQuoted := len(lines) >= 4 && (opts.DiffMode == '-' || opts.DiffMode == '+') + for i := 0; i < len(lines) && isTripleQuoted; i++ { + lines[i] = strings.TrimPrefix(strings.TrimSuffix(lines[i], "\r"), "\r") // trim leading/trailing carriage returns for legacy Windows endline support + isPrintable := func(r rune) bool { + return unicode.IsPrint(r) || r == '\t' // specially treat tab as printable + } + line := lines[i] + isTripleQuoted = !strings.HasPrefix(strings.TrimPrefix(line, prefix), `"""`) && !strings.HasPrefix(line, "...") && strings.TrimFunc(line, isPrintable) == "" && len(line) <= maxLen + } + if isTripleQuoted { + var list textList + list = append(list, textRecord{Diff: opts.DiffMode, Value: textLine(prefix + `"""`), ElideComma: true}) + for i, line := range lines { + if numElided := len(lines) - i; i == maxLines-1 && numElided > 1 { + comment := commentString(fmt.Sprintf("%d elided lines", numElided)) + list = append(list, textRecord{Diff: opts.DiffMode, Value: textEllipsis, ElideComma: true, Comment: comment}) + break + } + list = append(list, textRecord{Diff: opts.DiffMode, Value: textLine(line), ElideComma: true}) + } + list = append(list, textRecord{Diff: opts.DiffMode, Value: textLine(prefix + `"""`), ElideComma: true}) + return &textWrap{Prefix: "(", Value: list, Suffix: ")"} + } + + // Format the string as a single-line quoted string. + if len(s) > maxLen+len(textEllipsis) { + return textLine(prefix + formatString(s[:maxLen]) + string(textEllipsis)) + } + return textLine(prefix + formatString(s)) +} + // formatMapKey formats v as if it were a map key. // The result is guaranteed to be a single line. func formatMapKey(v reflect.Value, disambiguate bool, ptrs *pointerReferences) string { diff --git a/vendor/github.com/google/uuid/README.md b/vendor/github.com/google/uuid/README.md index 9d92c11f16..f765a46f91 100644 --- a/vendor/github.com/google/uuid/README.md +++ b/vendor/github.com/google/uuid/README.md @@ -16,4 +16,4 @@ change is the ability to represent an invalid UUID (vs a NIL UUID). Full `go doc` style documentation for the package can be viewed online without installing this package by using the GoDoc site here: -http://godoc.org/github.com/google/uuid +http://pkg.go.dev/github.com/google/uuid diff --git a/vendor/github.com/google/uuid/marshal.go b/vendor/github.com/google/uuid/marshal.go index 7f9e0c6c0e..14bd34072b 100644 --- a/vendor/github.com/google/uuid/marshal.go +++ b/vendor/github.com/google/uuid/marshal.go @@ -16,10 +16,11 @@ func (uuid UUID) MarshalText() ([]byte, error) { // UnmarshalText implements encoding.TextUnmarshaler. func (uuid *UUID) UnmarshalText(data []byte) error { id, err := ParseBytes(data) - if err == nil { - *uuid = id + if err != nil { + return err } - return err + *uuid = id + return nil } // MarshalBinary implements encoding.BinaryMarshaler. diff --git a/vendor/github.com/google/uuid/version1.go b/vendor/github.com/google/uuid/version1.go index 199a1ac654..463109629e 100644 --- a/vendor/github.com/google/uuid/version1.go +++ b/vendor/github.com/google/uuid/version1.go @@ -17,12 +17,6 @@ import ( // // In most cases, New should be used. func NewUUID() (UUID, error) { - nodeMu.Lock() - if nodeID == zeroID { - setNodeInterface("") - } - nodeMu.Unlock() - var uuid UUID now, seq, err := GetTime() if err != nil { @@ -38,7 +32,13 @@ func NewUUID() (UUID, error) { binary.BigEndian.PutUint16(uuid[4:], timeMid) binary.BigEndian.PutUint16(uuid[6:], timeHi) binary.BigEndian.PutUint16(uuid[8:], seq) + + nodeMu.Lock() + if nodeID == zeroID { + setNodeInterface("") + } copy(uuid[10:], nodeID[:]) + nodeMu.Unlock() return uuid, nil } diff --git a/vendor/github.com/google/uuid/version4.go b/vendor/github.com/google/uuid/version4.go index 84af91c9f5..c110465db5 100644 --- a/vendor/github.com/google/uuid/version4.go +++ b/vendor/github.com/google/uuid/version4.go @@ -27,8 +27,13 @@ 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) +} + +// NewRandomFromReader returns a UUID based on bytes read from a given io.Reader. +func NewRandomFromReader(r io.Reader) (UUID, error) { var uuid UUID - _, err := io.ReadFull(rander, uuid[:]) + _, err := io.ReadFull(r, uuid[:]) if err != nil { return Nil, err } diff --git a/vendor/github.com/googleapis/gnostic/.gitignore b/vendor/github.com/googleapis/gnostic/.gitignore new file mode 100644 index 0000000000..2a9d09b79d --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/.gitignore @@ -0,0 +1,21 @@ +# IntelliJ IDEA +.idea +# Eclipse +.checkstyle +.project +.settings +# Swift +.build +Packages +# Node +node_modules +package-lock.json +bundle.json +# vi +*.swp +# vscode +.vscode +.DS_Store +*~ +Package.resolved +extensions/sample/generated diff --git a/vendor/github.com/googleapis/gnostic/.travis-install.sh b/vendor/github.com/googleapis/gnostic/.travis-install.sh new file mode 100644 index 0000000000..3254abe2be --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/.travis-install.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +# +# Install dependencies that aren't available as Ubuntu packages. +# +# Everything goes into $HOME/local. +# +# Scripts should add +# - $HOME/local/bin to PATH +# - $HOME/local/lib to LD_LIBRARY_PATH +# + +cd +mkdir -p local + +# Install protoc +PROTOC_URL=https://github.com/google/protobuf/releases/download/v3.4.0/protoc-3.4.0-linux-x86_64.zip +echo $PROTOC_URL +curl -fSsL $PROTOC_URL -o protoc.zip +unzip protoc.zip -d local + +# Verify installation +find local diff --git a/vendor/github.com/googleapis/gnostic/.travis.yml b/vendor/github.com/googleapis/gnostic/.travis.yml new file mode 100644 index 0000000000..70801e2fa0 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/.travis.yml @@ -0,0 +1,34 @@ +# Travis CI build file for OpenAPI Compiler, including Go and Swift plugins + +# Use Ubuntu 14.04 +dist: trusty + +sudo: false + +language: go + +go: +- "1.13" + +addons: + apt: + packages: + - clang-3.8 + - lldb-3.8 + - libicu-dev + - libtool + - libcurl4-openssl-dev + - libbsd-dev + - build-essential + - libssl-dev + - uuid-dev + - curl + - unzip + +install: + - ./.travis-install.sh + - export PATH=.:$HOME/local/bin:$PATH + - make + +script: + - make test diff --git a/vendor/github.com/googleapis/gnostic/COMPILE-PROTOS.sh b/vendor/github.com/googleapis/gnostic/COMPILE-PROTOS.sh new file mode 100644 index 0000000000..b6e729e779 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/COMPILE-PROTOS.sh @@ -0,0 +1,25 @@ +#!/bin/sh +# +# Copyright 2016 Google Inc. 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. +# + +go get github.com/golang/protobuf/protoc-gen-go + +protoc --go_out=. openapiv2/OpenAPIv2.proto +protoc --go_out=. openapiv3/OpenAPIv3.proto +protoc --go_out=. discovery/discovery.proto +protoc --go_out=. plugins/plugin.proto +protoc --go_out=. extensions/extension.proto +protoc --go_out=. surface/surface.proto diff --git a/vendor/github.com/googleapis/gnostic/CONTRIBUTING.md b/vendor/github.com/googleapis/gnostic/CONTRIBUTING.md new file mode 100644 index 0000000000..6736efd943 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/CONTRIBUTING.md @@ -0,0 +1,35 @@ +# How to become a contributor and submit your own code + +## Contributor License Agreements + +We'd love to accept your sample apps and patches! Before we can take them, we +have to jump a couple of legal hurdles. + +Please fill out either the individual or corporate Contributor License Agreement +(CLA). + + * If you are an individual writing original source code and you're sure you + own the intellectual property, then you'll need to sign an [individual CLA] + (https://developers.google.com/open-source/cla/individual). + * If you work for a company that wants to allow you to contribute your work, + then you'll need to sign a [corporate CLA] + (https://developers.google.com/open-source/cla/corporate). + +Follow either of the two links above to access the appropriate CLA and +instructions for how to sign and return it. Once we receive it, we'll be able to +accept your pull requests. + +## Contributing A Patch + +1. Submit an issue describing your proposed change to the repo in question. +1. The repo owner will respond to your issue promptly. +1. If your proposed change is accepted, and you haven't already done so, sign a + Contributor License Agreement (see details above). +1. Fork the desired repo, develop and test your code changes. +1. Ensure that your code adheres to the existing style in the sample to which + you are contributing. Refer to the + [Google Cloud Platform Samples Style Guide] + (https://github.com/GoogleCloudPlatform/Template/wiki/style.html) for the + recommended coding standards for this organization. +1. Ensure that your code has an appropriate set of unit tests which all pass. +1. Submit a pull request. diff --git a/vendor/github.com/googleapis/gnostic/Makefile b/vendor/github.com/googleapis/gnostic/Makefile new file mode 100644 index 0000000000..f79c622b6e --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/Makefile @@ -0,0 +1,9 @@ + +all: + ./COMPILE-PROTOS.sh + go get ./... + go install ./... + cd extensions/sample; make + +test: + go test ./... -v diff --git a/vendor/github.com/googleapis/gnostic/README.md b/vendor/github.com/googleapis/gnostic/README.md new file mode 100644 index 0000000000..7d67e1ef13 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/README.md @@ -0,0 +1,112 @@ +[![Build Status](https://travis-ci.org/googleapis/gnostic.svg?branch=master)](https://travis-ci.org/googleapis/gnostic) + +# ⨁ gnostic + +This repository contains a Go command line tool which converts +JSON and YAML [OpenAPI](https://github.com/OAI/OpenAPI-Specification) +descriptions to and from equivalent Protocol Buffer representations. + +[Protocol Buffers](https://developers.google.com/protocol-buffers/) +provide a language-neutral, platform-neutral, extensible mechanism +for serializing structured data. +**gnostic**'s Protocol Buffer models for the OpenAPI Specification +can be used to generate code that includes data structures with +explicit fields for the elements of an OpenAPI description. +This makes it possible for developers to work with OpenAPI +descriptions in type-safe ways, which is particularly useful +in strongly-typed languages like Go and Swift. + +**gnostic** reads OpenAPI descriptions into +these generated data structures, reports errors, +resolves internal dependencies, and writes the results +in a binary form that can be used in any language that is +supported by the Protocol Buffer tools. +A plugin interface simplifies integration with API +tools written in a variety of different languages, +and when necessary, Protocol Buffer OpenAPI descriptions +can be reexported as JSON or YAML. + +**gnostic** compilation code and OpenAPI Protocol Buffer +models are automatically generated from an +[OpenAPI JSON Schema](https://github.com/OAI/OpenAPI-Specification/blob/master/schemas/v2.0/schema.json). +Source code for the generator is in the [generate-gnostic](generate-gnostic) directory. + +## Disclaimer + +This is prerelease software and work in progress. Feedback and +contributions are welcome, but we currently make no guarantees of +function or stability. + +## Requirements + +**gnostic** can be run in any environment that supports [Go](http://golang.org) +and the [Google Protocol Buffer Compiler](https://github.com/google/protobuf). + +## Installation + +The following instructions are for installing gnostic using +[Go modules](https://blog.golang.org/using-go-modules), +supported by Go 1.11 and later. + +1. Get this package by downloading it with `git clone`. + + git clone https://github.com/googleapis/gnostic + cd gnostic + +2. [Optional] Build and run the gnostic compiler generator. +This uses JSON schemas to generate Protocol Buffer language files +that describes supported API specification formats and Go-language +files of code that will read JSON or YAML API descriptions into +the generated protocol buffer models. + +Pre-generated versions of these files are checked into the directories +named OpenAPIv2, OpenAPIv3, and discovery. + + go install ./generate-gnostic + generate-gnostic --v2 + generate-gnostic --v3 + generate-gnostic --discovery + +3. Generate Protocol Buffer support code. +This step requires a local installation of protoc, the Protocol Buffer Compiler, +and the Go protoc plugin. +You can get protoc [here](https://github.com/google/protobuf). +You can install the plugin with this command: + + go get github.com/golang/protobuf/protoc-gen-go + +Then use the following to compile the gnostic Protocol Buffer models: + + ./COMPILE-PROTOS.sh + +4. Build **gnostic**. + + go install . + +5. Run **gnostic**. This sample invocation creates a file in the current directory named "petstore.pb" that contains a binary +Protocol Buffer description of a sample API. + + gnostic --pb-out=. examples/v2.0/json/petstore.json + +6. You can also compile files that you specify with a URL. Here's another way to compile the previous +example. This time we're creating "petstore.text", which contains a textual representation of the +Protocol Buffer description. This is mainly for use in testing and debugging. + + gnostic --text-out=petstore.text https://raw.githubusercontent.com/googleapis/gnostic/master/examples/v2.0/json/petstore.json + +7. For a sample application, see apps/report. + + go install ./apps/report + report petstore.pb + +8. **gnostic** supports plugins. Some are already implemented in the `plugins` directory. +Others, like [gnostic-go-generator](https://github.com/googleapis/gnostic-go-generator), +are separated into their own repositories. + +## Copyright + +Copyright 2017, Google Inc. + +## License + +Released under the Apache 2.0 license. diff --git a/vendor/github.com/googleapis/gnostic/discovery/README.md b/vendor/github.com/googleapis/gnostic/discovery/README.md new file mode 100644 index 0000000000..2237e24b1a --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/discovery/README.md @@ -0,0 +1,16 @@ +# API Discovery Format + +This directory contains a Protocol Buffer-language model +and related code for supporting Google's API Discovery Format. + +Gnostic applications and plugins can use Discovery.proto +to generate Protocol Buffer support code for their preferred languages. + +Discovery.go is used by Gnostic to read JSON and YAML Discovery +descriptions into the Protocol Buffer-based datastructures +generated from Discovery.proto. + +Discovery.proto and Discovery.go are generated by the Gnostic +compiler generator, and Discovery.pb.go is generated by +protoc, the Protocol Buffer compiler, and protoc-gen-go, the +Protocol Buffer Go code generation plugin. diff --git a/vendor/github.com/googleapis/gnostic/discovery/discovery.go b/vendor/github.com/googleapis/gnostic/discovery/discovery.go new file mode 100644 index 0000000000..209c6239ee --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/discovery/discovery.go @@ -0,0 +1,2766 @@ +// Copyright 2017 Google Inc. 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 discovery_v1 + +import ( + "fmt" + "github.com/googleapis/gnostic/compiler" + "gopkg.in/yaml.v2" + "regexp" + "strings" +) + +// Version returns the package name (and OpenAPI version). +func Version() string { + return "discovery_v1" +} + +// NewAnnotations creates an object of type Annotations if possible, returning an error if not. +func NewAnnotations(in interface{}, context *compiler.Context) (*Annotations, error) { + errors := make([]error, 0) + x := &Annotations{} + 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{"required"} + 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)) + } + // repeated string required = 1; + v1 := compiler.MapValueForKey(m, "required") + if v1 != nil { + v, ok := v1.([]interface{}) + if ok { + x.Required = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewAny creates an object of type Any if possible, returning an error if not. +func NewAny(in interface{}, context *compiler.Context) (*Any, error) { + errors := make([]error, 0) + x := &Any{} + bytes, _ := yaml.Marshal(in) + x.Yaml = string(bytes) + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewAuth creates an object of type Auth if possible, returning an error if not. +func NewAuth(in interface{}, context *compiler.Context) (*Auth, error) { + errors := make([]error, 0) + x := &Auth{} + 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{"oauth2"} + 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)) + } + // Oauth2 oauth2 = 1; + v1 := compiler.MapValueForKey(m, "oauth2") + if v1 != nil { + var err error + x.Oauth2, err = NewOauth2(v1, compiler.NewContext("oauth2", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewDocument creates an object of type Document if possible, returning an error if not. +func NewDocument(in interface{}, 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{"discoveryVersion", "kind"} + 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{"auth", "basePath", "baseUrl", "batchPath", "canonicalName", "description", "discoveryVersion", "documentationLink", "etag", "features", "fullyEncodeReservedExpansion", "icons", "id", "kind", "labels", "methods", "name", "ownerDomain", "ownerName", "packagePath", "parameters", "protocol", "resources", "revision", "rootUrl", "schemas", "servicePath", "title", "version", "version_module"} + 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 kind = 1; + v1 := compiler.MapValueForKey(m, "kind") + if v1 != nil { + x.Kind, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for kind: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string discovery_version = 2; + v2 := compiler.MapValueForKey(m, "discoveryVersion") + if v2 != nil { + x.DiscoveryVersion, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for discoveryVersion: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string id = 3; + v3 := compiler.MapValueForKey(m, "id") + if v3 != nil { + x.Id, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for id: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string name = 4; + v4 := compiler.MapValueForKey(m, "name") + if v4 != nil { + x.Name, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string version = 5; + v5 := compiler.MapValueForKey(m, "version") + if v5 != nil { + x.Version, ok = v5.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for version: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string revision = 6; + v6 := compiler.MapValueForKey(m, "revision") + if v6 != nil { + x.Revision, ok = v6.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for revision: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string title = 7; + v7 := compiler.MapValueForKey(m, "title") + if v7 != nil { + x.Title, ok = v7.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for title: %+v (%T)", v7, v7) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 8; + v8 := compiler.MapValueForKey(m, "description") + if v8 != nil { + x.Description, ok = v8.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v8, v8) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Icons icons = 9; + v9 := compiler.MapValueForKey(m, "icons") + if v9 != nil { + var err error + x.Icons, err = NewIcons(v9, compiler.NewContext("icons", context)) + if err != nil { + errors = append(errors, err) + } + } + // string documentation_link = 10; + v10 := compiler.MapValueForKey(m, "documentationLink") + if v10 != nil { + x.DocumentationLink, ok = v10.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for documentationLink: %+v (%T)", v10, v10) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string labels = 11; + v11 := compiler.MapValueForKey(m, "labels") + if v11 != nil { + v, ok := v11.([]interface{}) + if ok { + x.Labels = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for labels: %+v (%T)", v11, v11) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string protocol = 12; + v12 := compiler.MapValueForKey(m, "protocol") + if v12 != nil { + x.Protocol, ok = v12.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for protocol: %+v (%T)", v12, v12) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string base_url = 13; + v13 := compiler.MapValueForKey(m, "baseUrl") + if v13 != nil { + x.BaseUrl, ok = v13.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for baseUrl: %+v (%T)", v13, v13) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string base_path = 14; + v14 := compiler.MapValueForKey(m, "basePath") + if v14 != nil { + x.BasePath, ok = v14.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for basePath: %+v (%T)", v14, v14) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string root_url = 15; + v15 := compiler.MapValueForKey(m, "rootUrl") + if v15 != nil { + x.RootUrl, ok = v15.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for rootUrl: %+v (%T)", v15, v15) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string service_path = 16; + v16 := compiler.MapValueForKey(m, "servicePath") + if v16 != nil { + x.ServicePath, ok = v16.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for servicePath: %+v (%T)", v16, v16) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string batch_path = 17; + v17 := compiler.MapValueForKey(m, "batchPath") + if v17 != nil { + x.BatchPath, ok = v17.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for batchPath: %+v (%T)", v17, v17) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Parameters parameters = 18; + v18 := compiler.MapValueForKey(m, "parameters") + if v18 != nil { + var err error + x.Parameters, err = NewParameters(v18, compiler.NewContext("parameters", context)) + if err != nil { + errors = append(errors, err) + } + } + // Auth auth = 19; + v19 := compiler.MapValueForKey(m, "auth") + if v19 != nil { + var err error + x.Auth, err = NewAuth(v19, compiler.NewContext("auth", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated string features = 20; + v20 := compiler.MapValueForKey(m, "features") + if v20 != nil { + v, ok := v20.([]interface{}) + if ok { + x.Features = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for features: %+v (%T)", v20, v20) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Schemas schemas = 21; + v21 := compiler.MapValueForKey(m, "schemas") + if v21 != nil { + var err error + x.Schemas, err = NewSchemas(v21, compiler.NewContext("schemas", context)) + if err != nil { + errors = append(errors, err) + } + } + // Methods methods = 22; + v22 := compiler.MapValueForKey(m, "methods") + if v22 != nil { + var err error + x.Methods, err = NewMethods(v22, compiler.NewContext("methods", context)) + if err != nil { + errors = append(errors, err) + } + } + // Resources resources = 23; + v23 := compiler.MapValueForKey(m, "resources") + if v23 != nil { + var err error + x.Resources, err = NewResources(v23, compiler.NewContext("resources", context)) + if err != nil { + errors = append(errors, err) + } + } + // string etag = 24; + v24 := compiler.MapValueForKey(m, "etag") + if v24 != nil { + x.Etag, ok = v24.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for etag: %+v (%T)", v24, v24) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string owner_domain = 25; + v25 := compiler.MapValueForKey(m, "ownerDomain") + if v25 != nil { + x.OwnerDomain, ok = v25.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for ownerDomain: %+v (%T)", v25, v25) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string owner_name = 26; + v26 := compiler.MapValueForKey(m, "ownerName") + if v26 != nil { + x.OwnerName, ok = v26.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for ownerName: %+v (%T)", v26, v26) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool version_module = 27; + v27 := compiler.MapValueForKey(m, "version_module") + if v27 != nil { + x.VersionModule, ok = v27.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for version_module: %+v (%T)", v27, v27) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string canonical_name = 28; + v28 := compiler.MapValueForKey(m, "canonicalName") + if v28 != nil { + x.CanonicalName, ok = v28.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for canonicalName: %+v (%T)", v28, v28) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool fully_encode_reserved_expansion = 29; + v29 := compiler.MapValueForKey(m, "fullyEncodeReservedExpansion") + if v29 != nil { + x.FullyEncodeReservedExpansion, ok = v29.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for fullyEncodeReservedExpansion: %+v (%T)", v29, v29) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string package_path = 30; + v30 := compiler.MapValueForKey(m, "packagePath") + if v30 != nil { + x.PackagePath, ok = v30.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for packagePath: %+v (%T)", v30, v30) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewIcons creates an object of type Icons if possible, returning an error if not. +func NewIcons(in interface{}, context *compiler.Context) (*Icons, error) { + errors := make([]error, 0) + x := &Icons{} + 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{"x16", "x32"} + 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{"x16", "x32"} + 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 x16 = 1; + v1 := compiler.MapValueForKey(m, "x16") + if v1 != nil { + x.X16, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for x16: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string x32 = 2; + v2 := compiler.MapValueForKey(m, "x32") + if v2 != nil { + x.X32, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for x32: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewMediaUpload creates an object of type MediaUpload if possible, returning an error if not. +func NewMediaUpload(in interface{}, context *compiler.Context) (*MediaUpload, error) { + errors := make([]error, 0) + x := &MediaUpload{} + 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{"accept", "maxSize", "protocols", "supportsSubscription"} + 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)) + } + // repeated string accept = 1; + v1 := compiler.MapValueForKey(m, "accept") + if v1 != nil { + v, ok := v1.([]interface{}) + if ok { + x.Accept = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for accept: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string max_size = 2; + v2 := compiler.MapValueForKey(m, "maxSize") + if v2 != nil { + x.MaxSize, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for maxSize: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Protocols protocols = 3; + v3 := compiler.MapValueForKey(m, "protocols") + if v3 != nil { + var err error + x.Protocols, err = NewProtocols(v3, compiler.NewContext("protocols", context)) + if err != nil { + errors = append(errors, err) + } + } + // bool supports_subscription = 4; + v4 := compiler.MapValueForKey(m, "supportsSubscription") + if v4 != nil { + x.SupportsSubscription, ok = v4.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for supportsSubscription: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewMethod creates an object of type Method if possible, returning an error if not. +func NewMethod(in interface{}, context *compiler.Context) (*Method, error) { + errors := make([]error, 0) + x := &Method{} + 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", "etagRequired", "flatPath", "httpMethod", "id", "mediaUpload", "parameterOrder", "parameters", "path", "request", "response", "scopes", "supportsMediaDownload", "supportsMediaUpload", "supportsSubscription", "useMediaDownloadService"} + 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 id = 1; + v1 := compiler.MapValueForKey(m, "id") + if v1 != nil { + x.Id, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for id: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string path = 2; + v2 := compiler.MapValueForKey(m, "path") + if v2 != nil { + x.Path, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for path: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string http_method = 3; + v3 := compiler.MapValueForKey(m, "httpMethod") + if v3 != nil { + x.HttpMethod, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for httpMethod: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 4; + v4 := compiler.MapValueForKey(m, "description") + if v4 != nil { + x.Description, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Parameters parameters = 5; + v5 := compiler.MapValueForKey(m, "parameters") + if v5 != nil { + var err error + x.Parameters, err = NewParameters(v5, compiler.NewContext("parameters", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated string parameter_order = 6; + v6 := compiler.MapValueForKey(m, "parameterOrder") + if v6 != nil { + v, ok := v6.([]interface{}) + if ok { + x.ParameterOrder = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for parameterOrder: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Request request = 7; + v7 := compiler.MapValueForKey(m, "request") + if v7 != nil { + var err error + x.Request, err = NewRequest(v7, compiler.NewContext("request", context)) + if err != nil { + errors = append(errors, err) + } + } + // Response response = 8; + v8 := compiler.MapValueForKey(m, "response") + if v8 != nil { + var err error + x.Response, err = NewResponse(v8, compiler.NewContext("response", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated string scopes = 9; + v9 := compiler.MapValueForKey(m, "scopes") + if v9 != nil { + v, ok := v9.([]interface{}) + if ok { + x.Scopes = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for scopes: %+v (%T)", v9, v9) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool supports_media_download = 10; + v10 := compiler.MapValueForKey(m, "supportsMediaDownload") + if v10 != nil { + x.SupportsMediaDownload, ok = v10.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for supportsMediaDownload: %+v (%T)", v10, v10) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool supports_media_upload = 11; + v11 := compiler.MapValueForKey(m, "supportsMediaUpload") + if v11 != nil { + x.SupportsMediaUpload, ok = v11.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for supportsMediaUpload: %+v (%T)", v11, v11) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool use_media_download_service = 12; + v12 := compiler.MapValueForKey(m, "useMediaDownloadService") + if v12 != nil { + x.UseMediaDownloadService, ok = v12.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for useMediaDownloadService: %+v (%T)", v12, v12) + errors = append(errors, compiler.NewError(context, message)) + } + } + // MediaUpload media_upload = 13; + v13 := compiler.MapValueForKey(m, "mediaUpload") + if v13 != nil { + var err error + x.MediaUpload, err = NewMediaUpload(v13, compiler.NewContext("mediaUpload", context)) + if err != nil { + errors = append(errors, err) + } + } + // bool supports_subscription = 14; + v14 := compiler.MapValueForKey(m, "supportsSubscription") + if v14 != nil { + x.SupportsSubscription, ok = v14.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for supportsSubscription: %+v (%T)", v14, v14) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string flat_path = 15; + v15 := compiler.MapValueForKey(m, "flatPath") + if v15 != nil { + x.FlatPath, ok = v15.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for flatPath: %+v (%T)", v15, v15) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool etag_required = 16; + v16 := compiler.MapValueForKey(m, "etagRequired") + if v16 != nil { + x.EtagRequired, ok = v16.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for etagRequired: %+v (%T)", v16, v16) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewMethods creates an object of type Methods if possible, returning an error if not. +func NewMethods(in interface{}, context *compiler.Context) (*Methods, error) { + errors := make([]error, 0) + x := &Methods{} + 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 NamedMethod additional_properties = 1; + // MAP: Method + x.AdditionalProperties = make([]*NamedMethod, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedMethod{} + pair.Name = k + var err error + pair.Value, err = NewMethod(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedMethod creates an object of type NamedMethod if possible, returning an error if not. +func NewNamedMethod(in interface{}, context *compiler.Context) (*NamedMethod, error) { + errors := make([]error, 0) + x := &NamedMethod{} + 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Method value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewMethod(v2, compiler.NewContext("value", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedParameter creates an object of type NamedParameter if possible, returning an error if not. +func NewNamedParameter(in interface{}, context *compiler.Context) (*NamedParameter, error) { + errors := make([]error, 0) + x := &NamedParameter{} + 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Parameter value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewParameter(v2, compiler.NewContext("value", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedResource creates an object of type NamedResource if possible, returning an error if not. +func NewNamedResource(in interface{}, context *compiler.Context) (*NamedResource, error) { + errors := make([]error, 0) + x := &NamedResource{} + 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Resource value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewResource(v2, compiler.NewContext("value", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedSchema creates an object of type NamedSchema if possible, returning an error if not. +func NewNamedSchema(in interface{}, context *compiler.Context) (*NamedSchema, error) { + errors := make([]error, 0) + x := &NamedSchema{} + 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Schema value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewSchema(v2, compiler.NewContext("value", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedScope creates an object of type NamedScope if possible, returning an error if not. +func NewNamedScope(in interface{}, context *compiler.Context) (*NamedScope, error) { + errors := make([]error, 0) + x := &NamedScope{} + 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Scope value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewScope(v2, compiler.NewContext("value", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOauth2 creates an object of type Oauth2 if possible, returning an error if not. +func NewOauth2(in interface{}, context *compiler.Context) (*Oauth2, error) { + errors := make([]error, 0) + x := &Oauth2{} + 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{"scopes"} + 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)) + } + // Scopes scopes = 1; + v1 := compiler.MapValueForKey(m, "scopes") + if v1 != nil { + var err error + x.Scopes, err = NewScopes(v1, compiler.NewContext("scopes", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewParameter creates an object of type Parameter if possible, returning an error if not. +func NewParameter(in interface{}, 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 { + allowedKeys := []string{"$ref", "additionalProperties", "annotations", "default", "description", "enum", "enumDescriptions", "format", "id", "items", "location", "maximum", "minimum", "pattern", "properties", "repeated", "required", "type"} + 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 id = 1; + v1 := compiler.MapValueForKey(m, "id") + if v1 != nil { + x.Id, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for id: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string type = 2; + v2 := compiler.MapValueForKey(m, "type") + if v2 != nil { + x.Type, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string _ref = 3; + v3 := compiler.MapValueForKey(m, "$ref") + if v3 != nil { + x.XRef, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for $ref: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 4; + v4 := compiler.MapValueForKey(m, "description") + if v4 != nil { + x.Description, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string default = 5; + v5 := compiler.MapValueForKey(m, "default") + if v5 != nil { + x.Default, ok = v5.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for default: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool required = 6; + v6 := compiler.MapValueForKey(m, "required") + if v6 != nil { + x.Required, ok = v6.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 7; + v7 := compiler.MapValueForKey(m, "format") + if v7 != nil { + x.Format, ok = v7.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v7, v7) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 8; + v8 := compiler.MapValueForKey(m, "pattern") + if v8 != nil { + x.Pattern, ok = v8.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v8, v8) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string minimum = 9; + v9 := compiler.MapValueForKey(m, "minimum") + if v9 != nil { + x.Minimum, ok = v9.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v9, v9) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string maximum = 10; + v10 := compiler.MapValueForKey(m, "maximum") + if v10 != nil { + x.Maximum, ok = v10.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v10, v10) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string enum = 11; + v11 := compiler.MapValueForKey(m, "enum") + if v11 != nil { + v, ok := v11.([]interface{}) + if ok { + x.Enum = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for enum: %+v (%T)", v11, v11) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string enum_descriptions = 12; + v12 := compiler.MapValueForKey(m, "enumDescriptions") + if v12 != nil { + v, ok := v12.([]interface{}) + if ok { + x.EnumDescriptions = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for enumDescriptions: %+v (%T)", v12, v12) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool repeated = 13; + v13 := compiler.MapValueForKey(m, "repeated") + if v13 != nil { + x.Repeated, ok = v13.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for repeated: %+v (%T)", v13, v13) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string location = 14; + v14 := compiler.MapValueForKey(m, "location") + if v14 != nil { + x.Location, ok = v14.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for location: %+v (%T)", v14, v14) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Schemas properties = 15; + v15 := compiler.MapValueForKey(m, "properties") + if v15 != nil { + var err error + x.Properties, err = NewSchemas(v15, compiler.NewContext("properties", context)) + if err != nil { + errors = append(errors, err) + } + } + // Schema additional_properties = 16; + v16 := compiler.MapValueForKey(m, "additionalProperties") + if v16 != nil { + var err error + x.AdditionalProperties, err = NewSchema(v16, compiler.NewContext("additionalProperties", context)) + if err != nil { + errors = append(errors, err) + } + } + // Schema items = 17; + v17 := compiler.MapValueForKey(m, "items") + if v17 != nil { + var err error + x.Items, err = NewSchema(v17, compiler.NewContext("items", context)) + if err != nil { + errors = append(errors, err) + } + } + // Annotations annotations = 18; + v18 := compiler.MapValueForKey(m, "annotations") + if v18 != nil { + var err error + x.Annotations, err = NewAnnotations(v18, compiler.NewContext("annotations", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewParameters creates an object of type Parameters if possible, returning an error if not. +func NewParameters(in interface{}, context *compiler.Context) (*Parameters, error) { + errors := make([]error, 0) + x := &Parameters{} + 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 NamedParameter additional_properties = 1; + // MAP: Parameter + x.AdditionalProperties = make([]*NamedParameter, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedParameter{} + pair.Name = k + var err error + pair.Value, err = NewParameter(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewProtocols creates an object of type Protocols if possible, returning an error if not. +func NewProtocols(in interface{}, context *compiler.Context) (*Protocols, error) { + errors := make([]error, 0) + x := &Protocols{} + 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{"resumable", "simple"} + 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)) + } + // Simple simple = 1; + v1 := compiler.MapValueForKey(m, "simple") + if v1 != nil { + var err error + x.Simple, err = NewSimple(v1, compiler.NewContext("simple", context)) + if err != nil { + errors = append(errors, err) + } + } + // Resumable resumable = 2; + v2 := compiler.MapValueForKey(m, "resumable") + if v2 != nil { + var err error + x.Resumable, err = NewResumable(v2, compiler.NewContext("resumable", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewRequest creates an object of type Request if possible, returning an error if not. +func NewRequest(in interface{}, context *compiler.Context) (*Request, error) { + errors := make([]error, 0) + x := &Request{} + 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", "parameterName"} + 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 _ref = 1; + v1 := compiler.MapValueForKey(m, "$ref") + if v1 != nil { + x.XRef, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for $ref: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string parameter_name = 2; + v2 := compiler.MapValueForKey(m, "parameterName") + if v2 != nil { + x.ParameterName, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for parameterName: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResource creates an object of type Resource if possible, returning an error if not. +func NewResource(in interface{}, context *compiler.Context) (*Resource, error) { + errors := make([]error, 0) + x := &Resource{} + 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{"methods", "resources"} + 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)) + } + // Methods methods = 1; + v1 := compiler.MapValueForKey(m, "methods") + if v1 != nil { + var err error + x.Methods, err = NewMethods(v1, compiler.NewContext("methods", context)) + if err != nil { + errors = append(errors, err) + } + } + // Resources resources = 2; + v2 := compiler.MapValueForKey(m, "resources") + if v2 != nil { + var err error + x.Resources, err = NewResources(v2, compiler.NewContext("resources", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResources creates an object of type Resources if possible, returning an error if not. +func NewResources(in interface{}, context *compiler.Context) (*Resources, error) { + errors := make([]error, 0) + x := &Resources{} + 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 NamedResource additional_properties = 1; + // MAP: Resource + x.AdditionalProperties = make([]*NamedResource, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedResource{} + pair.Name = k + var err error + pair.Value, err = NewResource(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResponse creates an object of type Response if possible, returning an error if not. +func NewResponse(in interface{}, 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 { + allowedKeys := []string{"$ref"} + 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 _ref = 1; + v1 := compiler.MapValueForKey(m, "$ref") + if v1 != nil { + x.XRef, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for $ref: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResumable creates an object of type Resumable if possible, returning an error if not. +func NewResumable(in interface{}, context *compiler.Context) (*Resumable, error) { + errors := make([]error, 0) + x := &Resumable{} + 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{"multipart", "path"} + 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)) + } + // bool multipart = 1; + v1 := compiler.MapValueForKey(m, "multipart") + if v1 != nil { + x.Multipart, ok = v1.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for multipart: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string path = 2; + v2 := compiler.MapValueForKey(m, "path") + if v2 != nil { + x.Path, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for path: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSchema creates an object of type Schema if possible, returning an error if not. +func NewSchema(in interface{}, 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{"$ref", "additionalProperties", "annotations", "default", "description", "enum", "enumDescriptions", "format", "id", "items", "location", "maximum", "minimum", "pattern", "properties", "readOnly", "repeated", "required", "type"} + 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 id = 1; + v1 := compiler.MapValueForKey(m, "id") + if v1 != nil { + x.Id, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for id: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string type = 2; + v2 := compiler.MapValueForKey(m, "type") + if v2 != nil { + x.Type, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string default = 4; + v4 := compiler.MapValueForKey(m, "default") + if v4 != nil { + x.Default, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for default: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool required = 5; + v5 := compiler.MapValueForKey(m, "required") + if v5 != nil { + x.Required, ok = v5.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 6; + v6 := compiler.MapValueForKey(m, "format") + if v6 != nil { + x.Format, ok = v6.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 7; + v7 := compiler.MapValueForKey(m, "pattern") + if v7 != nil { + x.Pattern, ok = v7.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v7, v7) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string minimum = 8; + v8 := compiler.MapValueForKey(m, "minimum") + if v8 != nil { + x.Minimum, ok = v8.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v8, v8) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string maximum = 9; + v9 := compiler.MapValueForKey(m, "maximum") + if v9 != nil { + x.Maximum, ok = v9.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v9, v9) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string enum = 10; + v10 := compiler.MapValueForKey(m, "enum") + if v10 != nil { + v, ok := v10.([]interface{}) + if ok { + x.Enum = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for enum: %+v (%T)", v10, v10) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string enum_descriptions = 11; + v11 := compiler.MapValueForKey(m, "enumDescriptions") + if v11 != nil { + v, ok := v11.([]interface{}) + if ok { + x.EnumDescriptions = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for enumDescriptions: %+v (%T)", v11, v11) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool repeated = 12; + v12 := compiler.MapValueForKey(m, "repeated") + if v12 != nil { + x.Repeated, ok = v12.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for repeated: %+v (%T)", v12, v12) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string location = 13; + v13 := compiler.MapValueForKey(m, "location") + if v13 != nil { + x.Location, ok = v13.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for location: %+v (%T)", v13, v13) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Schemas properties = 14; + v14 := compiler.MapValueForKey(m, "properties") + if v14 != nil { + var err error + x.Properties, err = NewSchemas(v14, compiler.NewContext("properties", context)) + if err != nil { + errors = append(errors, err) + } + } + // Schema additional_properties = 15; + v15 := compiler.MapValueForKey(m, "additionalProperties") + if v15 != nil { + var err error + x.AdditionalProperties, err = NewSchema(v15, compiler.NewContext("additionalProperties", context)) + if err != nil { + errors = append(errors, err) + } + } + // Schema items = 16; + v16 := compiler.MapValueForKey(m, "items") + if v16 != nil { + var err error + x.Items, err = NewSchema(v16, compiler.NewContext("items", context)) + if err != nil { + errors = append(errors, err) + } + } + // string _ref = 17; + v17 := compiler.MapValueForKey(m, "$ref") + if v17 != nil { + x.XRef, ok = v17.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for $ref: %+v (%T)", v17, v17) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Annotations annotations = 18; + v18 := compiler.MapValueForKey(m, "annotations") + if v18 != nil { + var err error + x.Annotations, err = NewAnnotations(v18, compiler.NewContext("annotations", context)) + if err != nil { + errors = append(errors, err) + } + } + // bool read_only = 19; + v19 := compiler.MapValueForKey(m, "readOnly") + if v19 != nil { + x.ReadOnly, ok = v19.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for readOnly: %+v (%T)", v19, v19) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSchemas creates an object of type Schemas if possible, returning an error if not. +func NewSchemas(in interface{}, context *compiler.Context) (*Schemas, error) { + errors := make([]error, 0) + x := &Schemas{} + 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 NamedSchema additional_properties = 1; + // MAP: Schema + x.AdditionalProperties = make([]*NamedSchema, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedSchema{} + pair.Name = k + var err error + pair.Value, err = NewSchema(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewScope creates an object of type Scope if possible, returning an error if not. +func NewScope(in interface{}, context *compiler.Context) (*Scope, error) { + errors := make([]error, 0) + x := &Scope{} + 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"} + 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 description = 1; + v1 := compiler.MapValueForKey(m, "description") + if v1 != nil { + x.Description, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewScopes creates an object of type Scopes if possible, returning an error if not. +func NewScopes(in interface{}, context *compiler.Context) (*Scopes, error) { + errors := make([]error, 0) + x := &Scopes{} + 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 NamedScope additional_properties = 1; + // MAP: Scope + x.AdditionalProperties = make([]*NamedScope, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedScope{} + pair.Name = k + var err error + pair.Value, err = NewScope(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSimple creates an object of type Simple if possible, returning an error if not. +func NewSimple(in interface{}, context *compiler.Context) (*Simple, error) { + errors := make([]error, 0) + x := &Simple{} + 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{"multipart", "path"} + 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)) + } + // bool multipart = 1; + v1 := compiler.MapValueForKey(m, "multipart") + if v1 != nil { + x.Multipart, ok = v1.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for multipart: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string path = 2; + v2 := compiler.MapValueForKey(m, "path") + if v2 != nil { + x.Path, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for path: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewStringArray creates an object of type StringArray if possible, returning an error if not. +func NewStringArray(in interface{}, context *compiler.Context) (*StringArray, error) { + errors := make([]error, 0) + x := &StringArray{} + a, ok := in.([]interface{}) + if !ok { + message := fmt.Sprintf("has unexpected value for StringArray: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + x.Value = make([]string, 0) + for _, s := range a { + x.Value = append(x.Value, s.(string)) + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Annotations objects. +func (m *Annotations) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Any objects. +func (m *Any) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Auth objects. +func (m *Auth) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Oauth2 != nil { + _, err := m.Oauth2.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) (interface{}, error) { + errors := make([]error, 0) + if m.Icons != nil { + _, err := m.Icons.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.Auth != nil { + _, err := m.Auth.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Schemas != nil { + _, err := m.Schemas.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Methods != nil { + _, err := m.Methods.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Resources != nil { + _, err := m.Resources.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Icons objects. +func (m *Icons) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside MediaUpload objects. +func (m *MediaUpload) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Protocols != nil { + _, err := m.Protocols.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Method objects. +func (m *Method) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Parameters != nil { + _, err := m.Parameters.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Request != nil { + _, err := m.Request.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Response != nil { + _, err := m.Response.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.MediaUpload != nil { + _, err := m.MediaUpload.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Methods objects. +func (m *Methods) ResolveReferences(root string) (interface{}, 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 NamedMethod objects. +func (m *NamedMethod) ResolveReferences(root string) (interface{}, 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 NamedParameter objects. +func (m *NamedParameter) ResolveReferences(root string) (interface{}, 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 NamedResource objects. +func (m *NamedResource) ResolveReferences(root string) (interface{}, 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 NamedSchema objects. +func (m *NamedSchema) ResolveReferences(root string) (interface{}, 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 NamedScope objects. +func (m *NamedScope) ResolveReferences(root string) (interface{}, 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 Oauth2 objects. +func (m *Oauth2) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Scopes != nil { + _, err := m.Scopes.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) (interface{}, 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 := NewParameter(info, nil) + if err == nil { + *m = *replacement + return m.ResolveReferences(root) + } + } + return info, nil + } + 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.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Annotations != nil { + _, err := m.Annotations.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Parameters objects. +func (m *Parameters) ResolveReferences(root string) (interface{}, 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 Protocols objects. +func (m *Protocols) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Simple != nil { + _, err := m.Simple.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Resumable != nil { + _, err := m.Resumable.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Request objects. +func (m *Request) ResolveReferences(root string) (interface{}, 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 := NewRequest(info, nil) + if err == nil { + *m = *replacement + return m.ResolveReferences(root) + } + } + return info, nil + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Resource objects. +func (m *Resource) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Methods != nil { + _, err := m.Methods.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Resources != nil { + _, err := m.Resources.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Resources objects. +func (m *Resources) ResolveReferences(root string) (interface{}, 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 Response objects. +func (m *Response) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.XRef != "" { + info, err := compiler.ReadInfoForRef(root, m.XRef) + if err != nil { + return nil, err + } + return info, nil + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Resumable objects. +func (m *Resumable) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Schema objects. +func (m *Schema) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + 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.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.XRef != "" { + info, err := compiler.ReadInfoForRef(root, m.XRef) + if err != nil { + return nil, err + } + if info != nil { + replacement, err := NewSchema(info, nil) + if err == nil { + *m = *replacement + return m.ResolveReferences(root) + } + } + return info, nil + } + if m.Annotations != nil { + _, err := m.Annotations.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Schemas objects. +func (m *Schemas) ResolveReferences(root string) (interface{}, 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 Scope objects. +func (m *Scope) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Scopes objects. +func (m *Scopes) ResolveReferences(root string) (interface{}, 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 Simple objects. +func (m *Simple) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside StringArray objects. +func (m *StringArray) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ToRawInfo returns a description of Annotations suitable for JSON or YAML export. +func (m *Annotations) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if len(m.Required) != 0 { + info = append(info, yaml.MapItem{Key: "required", Value: m.Required}) + } + return info +} + +// ToRawInfo returns a description of Any suitable for JSON or YAML export. +func (m *Any) ToRawInfo() interface{} { + var err error + var info1 []yaml.MapSlice + err = yaml.Unmarshal([]byte(m.Yaml), &info1) + if err == nil { + return info1 + } + var info2 yaml.MapSlice + err = yaml.Unmarshal([]byte(m.Yaml), &info2) + if err == nil { + return info2 + } + var info3 interface{} + err = yaml.Unmarshal([]byte(m.Yaml), &info3) + if err == nil { + return info3 + } + return nil +} + +// ToRawInfo returns a description of Auth suitable for JSON or YAML export. +func (m *Auth) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Oauth2 != nil { + info = append(info, yaml.MapItem{Key: "oauth2", Value: m.Oauth2.ToRawInfo()}) + } + // &{Name:oauth2 Type:Oauth2 StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + return info +} + +// ToRawInfo returns a description of Document suitable for JSON or YAML export. +func (m *Document) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + // always include this required field. + info = append(info, yaml.MapItem{Key: "kind", Value: m.Kind}) + // always include this required field. + info = append(info, yaml.MapItem{Key: "discoveryVersion", Value: m.DiscoveryVersion}) + if m.Id != "" { + info = append(info, yaml.MapItem{Key: "id", Value: m.Id}) + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + if m.Version != "" { + info = append(info, yaml.MapItem{Key: "version", Value: m.Version}) + } + if m.Revision != "" { + info = append(info, yaml.MapItem{Key: "revision", Value: m.Revision}) + } + if m.Title != "" { + info = append(info, yaml.MapItem{Key: "title", Value: m.Title}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Icons != nil { + info = append(info, yaml.MapItem{Key: "icons", Value: m.Icons.ToRawInfo()}) + } + // &{Name:icons Type:Icons StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.DocumentationLink != "" { + info = append(info, yaml.MapItem{Key: "documentationLink", Value: m.DocumentationLink}) + } + if len(m.Labels) != 0 { + info = append(info, yaml.MapItem{Key: "labels", Value: m.Labels}) + } + if m.Protocol != "" { + info = append(info, yaml.MapItem{Key: "protocol", Value: m.Protocol}) + } + if m.BaseUrl != "" { + info = append(info, yaml.MapItem{Key: "baseUrl", Value: m.BaseUrl}) + } + if m.BasePath != "" { + info = append(info, yaml.MapItem{Key: "basePath", Value: m.BasePath}) + } + if m.RootUrl != "" { + info = append(info, yaml.MapItem{Key: "rootUrl", Value: m.RootUrl}) + } + if m.ServicePath != "" { + info = append(info, yaml.MapItem{Key: "servicePath", Value: m.ServicePath}) + } + if m.BatchPath != "" { + info = append(info, yaml.MapItem{Key: "batchPath", Value: m.BatchPath}) + } + if m.Parameters != nil { + info = append(info, yaml.MapItem{Key: "parameters", Value: m.Parameters.ToRawInfo()}) + } + // &{Name:parameters Type:Parameters StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Auth != nil { + info = append(info, yaml.MapItem{Key: "auth", Value: m.Auth.ToRawInfo()}) + } + // &{Name:auth Type:Auth StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if len(m.Features) != 0 { + info = append(info, yaml.MapItem{Key: "features", Value: m.Features}) + } + if m.Schemas != nil { + info = append(info, yaml.MapItem{Key: "schemas", Value: m.Schemas.ToRawInfo()}) + } + // &{Name:schemas Type:Schemas StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Methods != nil { + info = append(info, yaml.MapItem{Key: "methods", Value: m.Methods.ToRawInfo()}) + } + // &{Name:methods Type:Methods StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Resources != nil { + info = append(info, yaml.MapItem{Key: "resources", Value: m.Resources.ToRawInfo()}) + } + // &{Name:resources Type:Resources StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Etag != "" { + info = append(info, yaml.MapItem{Key: "etag", Value: m.Etag}) + } + if m.OwnerDomain != "" { + info = append(info, yaml.MapItem{Key: "ownerDomain", Value: m.OwnerDomain}) + } + if m.OwnerName != "" { + info = append(info, yaml.MapItem{Key: "ownerName", Value: m.OwnerName}) + } + if m.VersionModule != false { + info = append(info, yaml.MapItem{Key: "version_module", Value: m.VersionModule}) + } + if m.CanonicalName != "" { + info = append(info, yaml.MapItem{Key: "canonicalName", Value: m.CanonicalName}) + } + if m.FullyEncodeReservedExpansion != false { + info = append(info, yaml.MapItem{Key: "fullyEncodeReservedExpansion", Value: m.FullyEncodeReservedExpansion}) + } + if m.PackagePath != "" { + info = append(info, yaml.MapItem{Key: "packagePath", Value: m.PackagePath}) + } + return info +} + +// ToRawInfo returns a description of Icons suitable for JSON or YAML export. +func (m *Icons) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + // always include this required field. + info = append(info, yaml.MapItem{Key: "x16", Value: m.X16}) + // always include this required field. + info = append(info, yaml.MapItem{Key: "x32", Value: m.X32}) + return info +} + +// ToRawInfo returns a description of MediaUpload suitable for JSON or YAML export. +func (m *MediaUpload) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if len(m.Accept) != 0 { + info = append(info, yaml.MapItem{Key: "accept", Value: m.Accept}) + } + if m.MaxSize != "" { + info = append(info, yaml.MapItem{Key: "maxSize", Value: m.MaxSize}) + } + if m.Protocols != nil { + info = append(info, yaml.MapItem{Key: "protocols", Value: m.Protocols.ToRawInfo()}) + } + // &{Name:protocols Type:Protocols StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.SupportsSubscription != false { + info = append(info, yaml.MapItem{Key: "supportsSubscription", Value: m.SupportsSubscription}) + } + return info +} + +// ToRawInfo returns a description of Method suitable for JSON or YAML export. +func (m *Method) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Id != "" { + info = append(info, yaml.MapItem{Key: "id", Value: m.Id}) + } + if m.Path != "" { + info = append(info, yaml.MapItem{Key: "path", Value: m.Path}) + } + if m.HttpMethod != "" { + info = append(info, yaml.MapItem{Key: "httpMethod", Value: m.HttpMethod}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Parameters != nil { + info = append(info, yaml.MapItem{Key: "parameters", Value: m.Parameters.ToRawInfo()}) + } + // &{Name:parameters Type:Parameters StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if len(m.ParameterOrder) != 0 { + info = append(info, yaml.MapItem{Key: "parameterOrder", Value: m.ParameterOrder}) + } + if m.Request != nil { + info = append(info, yaml.MapItem{Key: "request", Value: m.Request.ToRawInfo()}) + } + // &{Name:request Type:Request StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Response != nil { + info = append(info, yaml.MapItem{Key: "response", Value: m.Response.ToRawInfo()}) + } + // &{Name:response Type:Response StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if len(m.Scopes) != 0 { + info = append(info, yaml.MapItem{Key: "scopes", Value: m.Scopes}) + } + if m.SupportsMediaDownload != false { + info = append(info, yaml.MapItem{Key: "supportsMediaDownload", Value: m.SupportsMediaDownload}) + } + if m.SupportsMediaUpload != false { + info = append(info, yaml.MapItem{Key: "supportsMediaUpload", Value: m.SupportsMediaUpload}) + } + if m.UseMediaDownloadService != false { + info = append(info, yaml.MapItem{Key: "useMediaDownloadService", Value: m.UseMediaDownloadService}) + } + if m.MediaUpload != nil { + info = append(info, yaml.MapItem{Key: "mediaUpload", Value: m.MediaUpload.ToRawInfo()}) + } + // &{Name:mediaUpload Type:MediaUpload StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.SupportsSubscription != false { + info = append(info, yaml.MapItem{Key: "supportsSubscription", Value: m.SupportsSubscription}) + } + if m.FlatPath != "" { + info = append(info, yaml.MapItem{Key: "flatPath", Value: m.FlatPath}) + } + if m.EtagRequired != false { + info = append(info, yaml.MapItem{Key: "etagRequired", Value: m.EtagRequired}) + } + return info +} + +// ToRawInfo returns a description of Methods suitable for JSON or YAML export. +func (m *Methods) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedMethod StringEnumValues:[] MapType:Method Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of NamedMethod suitable for JSON or YAML export. +func (m *NamedMethod) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + // &{Name:value Type:Method StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedParameter suitable for JSON or YAML export. +func (m *NamedParameter) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + // &{Name:value Type:Parameter StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedResource suitable for JSON or YAML export. +func (m *NamedResource) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + // &{Name:value Type:Resource StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedSchema suitable for JSON or YAML export. +func (m *NamedSchema) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + // &{Name:value Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedScope suitable for JSON or YAML export. +func (m *NamedScope) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + // &{Name:value Type:Scope StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of Oauth2 suitable for JSON or YAML export. +func (m *Oauth2) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Scopes != nil { + info = append(info, yaml.MapItem{Key: "scopes", Value: m.Scopes.ToRawInfo()}) + } + // &{Name:scopes Type:Scopes StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + return info +} + +// ToRawInfo returns a description of Parameter suitable for JSON or YAML export. +func (m *Parameter) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Id != "" { + info = append(info, yaml.MapItem{Key: "id", Value: m.Id}) + } + if m.Type != "" { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + } + if m.XRef != "" { + info = append(info, yaml.MapItem{Key: "$ref", Value: m.XRef}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Default != "" { + info = append(info, yaml.MapItem{Key: "default", Value: m.Default}) + } + if m.Required != false { + info = append(info, yaml.MapItem{Key: "required", Value: m.Required}) + } + if m.Format != "" { + info = append(info, yaml.MapItem{Key: "format", Value: m.Format}) + } + if m.Pattern != "" { + info = append(info, yaml.MapItem{Key: "pattern", Value: m.Pattern}) + } + if m.Minimum != "" { + info = append(info, yaml.MapItem{Key: "minimum", Value: m.Minimum}) + } + if m.Maximum != "" { + info = append(info, yaml.MapItem{Key: "maximum", Value: m.Maximum}) + } + if len(m.Enum) != 0 { + info = append(info, yaml.MapItem{Key: "enum", Value: m.Enum}) + } + if len(m.EnumDescriptions) != 0 { + info = append(info, yaml.MapItem{Key: "enumDescriptions", Value: m.EnumDescriptions}) + } + if m.Repeated != false { + info = append(info, yaml.MapItem{Key: "repeated", Value: m.Repeated}) + } + if m.Location != "" { + info = append(info, yaml.MapItem{Key: "location", Value: m.Location}) + } + if m.Properties != nil { + info = append(info, yaml.MapItem{Key: "properties", Value: m.Properties.ToRawInfo()}) + } + // &{Name:properties Type:Schemas StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.AdditionalProperties != nil { + info = append(info, yaml.MapItem{Key: "additionalProperties", Value: m.AdditionalProperties.ToRawInfo()}) + } + // &{Name:additionalProperties Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Items != nil { + info = append(info, yaml.MapItem{Key: "items", Value: m.Items.ToRawInfo()}) + } + // &{Name:items Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Annotations != nil { + info = append(info, yaml.MapItem{Key: "annotations", Value: m.Annotations.ToRawInfo()}) + } + // &{Name:annotations Type:Annotations StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + return info +} + +// ToRawInfo returns a description of Parameters suitable for JSON or YAML export. +func (m *Parameters) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedParameter StringEnumValues:[] MapType:Parameter Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Protocols suitable for JSON or YAML export. +func (m *Protocols) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Simple != nil { + info = append(info, yaml.MapItem{Key: "simple", Value: m.Simple.ToRawInfo()}) + } + // &{Name:simple Type:Simple StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Resumable != nil { + info = append(info, yaml.MapItem{Key: "resumable", Value: m.Resumable.ToRawInfo()}) + } + // &{Name:resumable Type:Resumable StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + return info +} + +// ToRawInfo returns a description of Request suitable for JSON or YAML export. +func (m *Request) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.XRef != "" { + info = append(info, yaml.MapItem{Key: "$ref", Value: m.XRef}) + } + if m.ParameterName != "" { + info = append(info, yaml.MapItem{Key: "parameterName", Value: m.ParameterName}) + } + return info +} + +// ToRawInfo returns a description of Resource suitable for JSON or YAML export. +func (m *Resource) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Methods != nil { + info = append(info, yaml.MapItem{Key: "methods", Value: m.Methods.ToRawInfo()}) + } + // &{Name:methods Type:Methods StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Resources != nil { + info = append(info, yaml.MapItem{Key: "resources", Value: m.Resources.ToRawInfo()}) + } + // &{Name:resources Type:Resources StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + return info +} + +// ToRawInfo returns a description of Resources suitable for JSON or YAML export. +func (m *Resources) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedResource StringEnumValues:[] MapType:Resource Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Response suitable for JSON or YAML export. +func (m *Response) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.XRef != "" { + info = append(info, yaml.MapItem{Key: "$ref", Value: m.XRef}) + } + return info +} + +// ToRawInfo returns a description of Resumable suitable for JSON or YAML export. +func (m *Resumable) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Multipart != false { + info = append(info, yaml.MapItem{Key: "multipart", Value: m.Multipart}) + } + if m.Path != "" { + info = append(info, yaml.MapItem{Key: "path", Value: m.Path}) + } + return info +} + +// ToRawInfo returns a description of Schema suitable for JSON or YAML export. +func (m *Schema) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Id != "" { + info = append(info, yaml.MapItem{Key: "id", Value: m.Id}) + } + if m.Type != "" { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Default != "" { + info = append(info, yaml.MapItem{Key: "default", Value: m.Default}) + } + if m.Required != false { + info = append(info, yaml.MapItem{Key: "required", Value: m.Required}) + } + if m.Format != "" { + info = append(info, yaml.MapItem{Key: "format", Value: m.Format}) + } + if m.Pattern != "" { + info = append(info, yaml.MapItem{Key: "pattern", Value: m.Pattern}) + } + if m.Minimum != "" { + info = append(info, yaml.MapItem{Key: "minimum", Value: m.Minimum}) + } + if m.Maximum != "" { + info = append(info, yaml.MapItem{Key: "maximum", Value: m.Maximum}) + } + if len(m.Enum) != 0 { + info = append(info, yaml.MapItem{Key: "enum", Value: m.Enum}) + } + if len(m.EnumDescriptions) != 0 { + info = append(info, yaml.MapItem{Key: "enumDescriptions", Value: m.EnumDescriptions}) + } + if m.Repeated != false { + info = append(info, yaml.MapItem{Key: "repeated", Value: m.Repeated}) + } + if m.Location != "" { + info = append(info, yaml.MapItem{Key: "location", Value: m.Location}) + } + if m.Properties != nil { + info = append(info, yaml.MapItem{Key: "properties", Value: m.Properties.ToRawInfo()}) + } + // &{Name:properties Type:Schemas StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.AdditionalProperties != nil { + info = append(info, yaml.MapItem{Key: "additionalProperties", Value: m.AdditionalProperties.ToRawInfo()}) + } + // &{Name:additionalProperties Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Items != nil { + info = append(info, yaml.MapItem{Key: "items", Value: m.Items.ToRawInfo()}) + } + // &{Name:items Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.XRef != "" { + info = append(info, yaml.MapItem{Key: "$ref", Value: m.XRef}) + } + if m.Annotations != nil { + info = append(info, yaml.MapItem{Key: "annotations", Value: m.Annotations.ToRawInfo()}) + } + // &{Name:annotations Type:Annotations StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.ReadOnly != false { + info = append(info, yaml.MapItem{Key: "readOnly", Value: m.ReadOnly}) + } + return info +} + +// ToRawInfo returns a description of Schemas suitable for JSON or YAML export. +func (m *Schemas) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedSchema StringEnumValues:[] MapType:Schema Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Scope suitable for JSON or YAML export. +func (m *Scope) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + return info +} + +// ToRawInfo returns a description of Scopes suitable for JSON or YAML export. +func (m *Scopes) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedScope StringEnumValues:[] MapType:Scope Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Simple suitable for JSON or YAML export. +func (m *Simple) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Multipart != false { + info = append(info, yaml.MapItem{Key: "multipart", Value: m.Multipart}) + } + if m.Path != "" { + info = append(info, yaml.MapItem{Key: "path", Value: m.Path}) + } + return info +} + +// ToRawInfo returns a description of StringArray suitable for JSON or YAML export. +func (m *StringArray) ToRawInfo() interface{} { + return m.Value +} + +var () diff --git a/vendor/github.com/googleapis/gnostic/discovery/discovery.json b/vendor/github.com/googleapis/gnostic/discovery/discovery.json new file mode 100644 index 0000000000..1ae3ceb96a --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/discovery/discovery.json @@ -0,0 +1,451 @@ +{ + "title": "A JSON Schema for the Google API Discovery Format.", + "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 Discovery Format.", + "required": [ + "kind", + "discoveryVersion" + ], + "additionalProperties": false, + "properties": { + "kind": { + "type": "string" + }, + "discoveryVersion": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "revision": { + "type": "string" + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "icons": { + "$ref": "#/definitions/icons" + }, + "documentationLink": { + "type": "string" + }, + "labels": { + "type": "array", + "items": { + "type": "string" + } + }, + "protocol": { + "type": "string" + }, + "baseUrl": { + "type": "string" + }, + "basePath": { + "type": "string" + }, + "rootUrl": { + "type": "string" + }, + "servicePath": { + "type": "string" + }, + "batchPath": { + "type": "string" + }, + "parameters": { + "$ref": "#/definitions/parameters" + }, + "auth": { + "$ref": "#/definitions/auth" + }, + "features": { + "type": "array", + "items": { + "type": "string" + } + }, + "schemas": { + "$ref": "#/definitions/schemas" + }, + "methods": { + "$ref": "#/definitions/methods" + }, + "resources": { + "$ref": "#/definitions/resources" + }, + "etag": { + "type": "string" + }, + "ownerDomain": { + "type": "string" + }, + "ownerName": { + "type": "string" + }, + "version_module": { + "type": "boolean" + }, + "canonicalName": { + "type": "string" + }, + "fullyEncodeReservedExpansion": { + "type": "boolean" + }, + "packagePath": { + "type": "string" + } + }, + "definitions": { + "icons": { + "type": "object", + "description": "Icons that represent the API.", + "required": [ + "x16", + "x32" + ], + "additionalProperties": false, + "properties": { + "x16": { + "type": "string" + }, + "x32": { + "type": "string" + } + } + }, + "parameters": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/parameter" + } + }, + "parameter": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + }, + "$ref": { + "type": "string" + }, + "description": { + "type": "string" + }, + "default": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "format": { + "type": "string" + }, + "pattern": { + "type": "string" + }, + "minimum": { + "type": "string" + }, + "maximum": { + "type": "string" + }, + "enum": { + "type": "array", + "items": { + "type": "string" + } + }, + "enumDescriptions": { + "type": "array", + "items": { + "type": "string" + } + }, + "repeated": { + "type": "boolean" + }, + "location": { + "type": "string" + }, + "properties": { + "$ref": "#/definitions/schemas" + }, + "additionalProperties": { + "$ref": "#/definitions/schema" + }, + "items": { + "$ref": "#/definitions/schema" + }, + "annotations": { + "$ref": "#/definitions/annotations" + } + } + }, + "auth": { + "type": "object", + "properties": { + "oauth2": { + "type": "object", + "properties": { + "scopes": { + "$ref": "#/definitions/scopes" + } + } + } + } + }, + "schemas": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schema" + } + }, + "schema": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + }, + "description": { + "type": "string" + }, + "default": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "format": { + "type": "string" + }, + "pattern": { + "type": "string" + }, + "minimum": { + "type": "string" + }, + "maximum": { + "type": "string" + }, + "enum": { + "type": "array", + "items": { + "type": "string" + } + }, + "enumDescriptions": { + "type": "array", + "items": { + "type": "string" + } + }, + "repeated": { + "type": "boolean" + }, + "location": { + "type": "string" + }, + "properties": { + "$ref": "#/definitions/schemas" + }, + "additionalProperties": { + "$ref": "#/definitions/schema" + }, + "items": { + "$ref": "#/definitions/schema" + }, + "$ref": { + "type": "string" + }, + "annotations": { + "$ref": "#/definitions/annotations" + }, + "readOnly": { + "type": "boolean" + } + } + }, + "methods": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/method" + } + }, + "method": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "path": { + "type": "string" + }, + "httpMethod": { + "type": "string" + }, + "description": { + "type": "string" + }, + "parameters": { + "$ref": "#/definitions/parameters" + }, + "parameterOrder": { + "type": "array", + "items": { + "type": "string" + } + }, + "request": { + "type": "object", + "properties": { + "$ref": { + "type": "string" + }, + "parameterName": { + "type": "string" + } + } + }, + "response": { + "type": "object", + "properties": { + "$ref": { + "type": "string" + } + } + }, + "scopes": { + "type": "array", + "items": { + "type": "string" + } + }, + "supportsMediaDownload": { + "type": "boolean" + }, + "supportsMediaUpload": { + "type": "boolean" + }, + "useMediaDownloadService": { + "type": "boolean" + }, + "mediaUpload": { + "$ref": "#/definitions/mediaUpload" + }, + "supportsSubscription": { + "type": "boolean" + }, + "flatPath": { + "type": "string" + }, + "etagRequired": { + "type": "boolean" + } + } + }, + "resources": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/resource" + } + }, + "resource": { + "type": "object", + "properties": { + "methods": { + "$ref": "#/definitions/methods" + }, + "resources": { + "$ref": "#/definitions/resources" + } + } + }, + "annotations": { + "type": "object", + "properties": { + "required": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "scopes": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/scope" + } + }, + "scope": { + "type": "object", + "properties": { + "description": { + "type": "string" + } + } + }, + "mediaUpload": { + "type": "object", + "properties": { + "accept": { + "type": "array", + "items": { + "type": "string" + } + }, + "maxSize": { + "type": "string" + }, + "protocols": { + "type": "object", + "properties": { + "simple": { + "type": "object", + "properties": { + "multipart": { + "type": "boolean" + }, + "path": { + "type": "string" + } + } + }, + "resumable": { + "type": "object", + "properties": { + "multipart": { + "type": "boolean" + }, + "path": { + "type": "string" + } + } + } + } + }, + "supportsSubscription": { + "type": "boolean" + } + } + } + } +} diff --git a/vendor/github.com/googleapis/gnostic/discovery/discovery.pb.go b/vendor/github.com/googleapis/gnostic/discovery/discovery.pb.go new file mode 100644 index 0000000000..21e290beb2 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/discovery/discovery.pb.go @@ -0,0 +1,2025 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: discovery/discovery.proto + +package discovery_v1 + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + any "github.com/golang/protobuf/ptypes/any" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type Annotations struct { + Required []string `protobuf:"bytes,1,rep,name=required,proto3" json:"required,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Annotations) Reset() { *m = Annotations{} } +func (m *Annotations) String() string { return proto.CompactTextString(m) } +func (*Annotations) ProtoMessage() {} +func (*Annotations) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{0} +} + +func (m *Annotations) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Annotations.Unmarshal(m, b) +} +func (m *Annotations) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Annotations.Marshal(b, m, deterministic) +} +func (m *Annotations) XXX_Merge(src proto.Message) { + xxx_messageInfo_Annotations.Merge(m, src) +} +func (m *Annotations) XXX_Size() int { + return xxx_messageInfo_Annotations.Size(m) +} +func (m *Annotations) XXX_DiscardUnknown() { + xxx_messageInfo_Annotations.DiscardUnknown(m) +} + +var xxx_messageInfo_Annotations proto.InternalMessageInfo + +func (m *Annotations) GetRequired() []string { + if m != nil { + return m.Required + } + return nil +} + +type Any struct { + Value *any.Any `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + Yaml string `protobuf:"bytes,2,opt,name=yaml,proto3" json:"yaml,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Any) Reset() { *m = Any{} } +func (m *Any) String() string { return proto.CompactTextString(m) } +func (*Any) ProtoMessage() {} +func (*Any) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{1} +} + +func (m *Any) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Any.Unmarshal(m, b) +} +func (m *Any) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Any.Marshal(b, m, deterministic) +} +func (m *Any) XXX_Merge(src proto.Message) { + xxx_messageInfo_Any.Merge(m, src) +} +func (m *Any) XXX_Size() int { + return xxx_messageInfo_Any.Size(m) +} +func (m *Any) XXX_DiscardUnknown() { + xxx_messageInfo_Any.DiscardUnknown(m) +} + +var xxx_messageInfo_Any proto.InternalMessageInfo + +func (m *Any) GetValue() *any.Any { + if m != nil { + return m.Value + } + return nil +} + +func (m *Any) GetYaml() string { + if m != nil { + return m.Yaml + } + return "" +} + +type Auth struct { + Oauth2 *Oauth2 `protobuf:"bytes,1,opt,name=oauth2,proto3" json:"oauth2,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Auth) Reset() { *m = Auth{} } +func (m *Auth) String() string { return proto.CompactTextString(m) } +func (*Auth) ProtoMessage() {} +func (*Auth) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{2} +} + +func (m *Auth) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Auth.Unmarshal(m, b) +} +func (m *Auth) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Auth.Marshal(b, m, deterministic) +} +func (m *Auth) XXX_Merge(src proto.Message) { + xxx_messageInfo_Auth.Merge(m, src) +} +func (m *Auth) XXX_Size() int { + return xxx_messageInfo_Auth.Size(m) +} +func (m *Auth) XXX_DiscardUnknown() { + xxx_messageInfo_Auth.DiscardUnknown(m) +} + +var xxx_messageInfo_Auth proto.InternalMessageInfo + +func (m *Auth) GetOauth2() *Oauth2 { + if m != nil { + return m.Oauth2 + } + return nil +} + +type Document struct { + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` + DiscoveryVersion string `protobuf:"bytes,2,opt,name=discovery_version,json=discoveryVersion,proto3" json:"discovery_version,omitempty"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Version string `protobuf:"bytes,5,opt,name=version,proto3" json:"version,omitempty"` + Revision string `protobuf:"bytes,6,opt,name=revision,proto3" json:"revision,omitempty"` + Title string `protobuf:"bytes,7,opt,name=title,proto3" json:"title,omitempty"` + Description string `protobuf:"bytes,8,opt,name=description,proto3" json:"description,omitempty"` + Icons *Icons `protobuf:"bytes,9,opt,name=icons,proto3" json:"icons,omitempty"` + DocumentationLink string `protobuf:"bytes,10,opt,name=documentation_link,json=documentationLink,proto3" json:"documentation_link,omitempty"` + Labels []string `protobuf:"bytes,11,rep,name=labels,proto3" json:"labels,omitempty"` + Protocol string `protobuf:"bytes,12,opt,name=protocol,proto3" json:"protocol,omitempty"` + BaseUrl string `protobuf:"bytes,13,opt,name=base_url,json=baseUrl,proto3" json:"base_url,omitempty"` + BasePath string `protobuf:"bytes,14,opt,name=base_path,json=basePath,proto3" json:"base_path,omitempty"` + RootUrl string `protobuf:"bytes,15,opt,name=root_url,json=rootUrl,proto3" json:"root_url,omitempty"` + ServicePath string `protobuf:"bytes,16,opt,name=service_path,json=servicePath,proto3" json:"service_path,omitempty"` + BatchPath string `protobuf:"bytes,17,opt,name=batch_path,json=batchPath,proto3" json:"batch_path,omitempty"` + Parameters *Parameters `protobuf:"bytes,18,opt,name=parameters,proto3" json:"parameters,omitempty"` + Auth *Auth `protobuf:"bytes,19,opt,name=auth,proto3" json:"auth,omitempty"` + Features []string `protobuf:"bytes,20,rep,name=features,proto3" json:"features,omitempty"` + Schemas *Schemas `protobuf:"bytes,21,opt,name=schemas,proto3" json:"schemas,omitempty"` + Methods *Methods `protobuf:"bytes,22,opt,name=methods,proto3" json:"methods,omitempty"` + Resources *Resources `protobuf:"bytes,23,opt,name=resources,proto3" json:"resources,omitempty"` + Etag string `protobuf:"bytes,24,opt,name=etag,proto3" json:"etag,omitempty"` + OwnerDomain string `protobuf:"bytes,25,opt,name=owner_domain,json=ownerDomain,proto3" json:"owner_domain,omitempty"` + OwnerName string `protobuf:"bytes,26,opt,name=owner_name,json=ownerName,proto3" json:"owner_name,omitempty"` + VersionModule bool `protobuf:"varint,27,opt,name=version_module,json=versionModule,proto3" json:"version_module,omitempty"` + CanonicalName string `protobuf:"bytes,28,opt,name=canonical_name,json=canonicalName,proto3" json:"canonical_name,omitempty"` + FullyEncodeReservedExpansion bool `protobuf:"varint,29,opt,name=fully_encode_reserved_expansion,json=fullyEncodeReservedExpansion,proto3" json:"fully_encode_reserved_expansion,omitempty"` + PackagePath string `protobuf:"bytes,30,opt,name=package_path,json=packagePath,proto3" json:"package_path,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Document) Reset() { *m = Document{} } +func (m *Document) String() string { return proto.CompactTextString(m) } +func (*Document) ProtoMessage() {} +func (*Document) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{3} +} + +func (m *Document) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Document.Unmarshal(m, b) +} +func (m *Document) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Document.Marshal(b, m, deterministic) +} +func (m *Document) XXX_Merge(src proto.Message) { + xxx_messageInfo_Document.Merge(m, src) +} +func (m *Document) XXX_Size() int { + return xxx_messageInfo_Document.Size(m) +} +func (m *Document) XXX_DiscardUnknown() { + xxx_messageInfo_Document.DiscardUnknown(m) +} + +var xxx_messageInfo_Document proto.InternalMessageInfo + +func (m *Document) GetKind() string { + if m != nil { + return m.Kind + } + return "" +} + +func (m *Document) GetDiscoveryVersion() string { + if m != nil { + return m.DiscoveryVersion + } + return "" +} + +func (m *Document) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *Document) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Document) GetVersion() string { + if m != nil { + return m.Version + } + return "" +} + +func (m *Document) GetRevision() string { + if m != nil { + return m.Revision + } + return "" +} + +func (m *Document) GetTitle() string { + if m != nil { + return m.Title + } + return "" +} + +func (m *Document) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Document) GetIcons() *Icons { + if m != nil { + return m.Icons + } + return nil +} + +func (m *Document) GetDocumentationLink() string { + if m != nil { + return m.DocumentationLink + } + return "" +} + +func (m *Document) GetLabels() []string { + if m != nil { + return m.Labels + } + return nil +} + +func (m *Document) GetProtocol() string { + if m != nil { + return m.Protocol + } + return "" +} + +func (m *Document) GetBaseUrl() string { + if m != nil { + return m.BaseUrl + } + return "" +} + +func (m *Document) GetBasePath() string { + if m != nil { + return m.BasePath + } + return "" +} + +func (m *Document) GetRootUrl() string { + if m != nil { + return m.RootUrl + } + return "" +} + +func (m *Document) GetServicePath() string { + if m != nil { + return m.ServicePath + } + return "" +} + +func (m *Document) GetBatchPath() string { + if m != nil { + return m.BatchPath + } + return "" +} + +func (m *Document) GetParameters() *Parameters { + if m != nil { + return m.Parameters + } + return nil +} + +func (m *Document) GetAuth() *Auth { + if m != nil { + return m.Auth + } + return nil +} + +func (m *Document) GetFeatures() []string { + if m != nil { + return m.Features + } + return nil +} + +func (m *Document) GetSchemas() *Schemas { + if m != nil { + return m.Schemas + } + return nil +} + +func (m *Document) GetMethods() *Methods { + if m != nil { + return m.Methods + } + return nil +} + +func (m *Document) GetResources() *Resources { + if m != nil { + return m.Resources + } + return nil +} + +func (m *Document) GetEtag() string { + if m != nil { + return m.Etag + } + return "" +} + +func (m *Document) GetOwnerDomain() string { + if m != nil { + return m.OwnerDomain + } + return "" +} + +func (m *Document) GetOwnerName() string { + if m != nil { + return m.OwnerName + } + return "" +} + +func (m *Document) GetVersionModule() bool { + if m != nil { + return m.VersionModule + } + return false +} + +func (m *Document) GetCanonicalName() string { + if m != nil { + return m.CanonicalName + } + return "" +} + +func (m *Document) GetFullyEncodeReservedExpansion() bool { + if m != nil { + return m.FullyEncodeReservedExpansion + } + return false +} + +func (m *Document) GetPackagePath() string { + if m != nil { + return m.PackagePath + } + return "" +} + +// Icons that represent the API. +type Icons struct { + X16 string `protobuf:"bytes,1,opt,name=x16,proto3" json:"x16,omitempty"` + X32 string `protobuf:"bytes,2,opt,name=x32,proto3" json:"x32,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Icons) Reset() { *m = Icons{} } +func (m *Icons) String() string { return proto.CompactTextString(m) } +func (*Icons) ProtoMessage() {} +func (*Icons) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{4} +} + +func (m *Icons) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Icons.Unmarshal(m, b) +} +func (m *Icons) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Icons.Marshal(b, m, deterministic) +} +func (m *Icons) XXX_Merge(src proto.Message) { + xxx_messageInfo_Icons.Merge(m, src) +} +func (m *Icons) XXX_Size() int { + return xxx_messageInfo_Icons.Size(m) +} +func (m *Icons) XXX_DiscardUnknown() { + xxx_messageInfo_Icons.DiscardUnknown(m) +} + +var xxx_messageInfo_Icons proto.InternalMessageInfo + +func (m *Icons) GetX16() string { + if m != nil { + return m.X16 + } + return "" +} + +func (m *Icons) GetX32() string { + if m != nil { + return m.X32 + } + return "" +} + +type MediaUpload struct { + Accept []string `protobuf:"bytes,1,rep,name=accept,proto3" json:"accept,omitempty"` + MaxSize string `protobuf:"bytes,2,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` + Protocols *Protocols `protobuf:"bytes,3,opt,name=protocols,proto3" json:"protocols,omitempty"` + SupportsSubscription bool `protobuf:"varint,4,opt,name=supports_subscription,json=supportsSubscription,proto3" json:"supports_subscription,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MediaUpload) Reset() { *m = MediaUpload{} } +func (m *MediaUpload) String() string { return proto.CompactTextString(m) } +func (*MediaUpload) ProtoMessage() {} +func (*MediaUpload) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{5} +} + +func (m *MediaUpload) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MediaUpload.Unmarshal(m, b) +} +func (m *MediaUpload) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MediaUpload.Marshal(b, m, deterministic) +} +func (m *MediaUpload) XXX_Merge(src proto.Message) { + xxx_messageInfo_MediaUpload.Merge(m, src) +} +func (m *MediaUpload) XXX_Size() int { + return xxx_messageInfo_MediaUpload.Size(m) +} +func (m *MediaUpload) XXX_DiscardUnknown() { + xxx_messageInfo_MediaUpload.DiscardUnknown(m) +} + +var xxx_messageInfo_MediaUpload proto.InternalMessageInfo + +func (m *MediaUpload) GetAccept() []string { + if m != nil { + return m.Accept + } + return nil +} + +func (m *MediaUpload) GetMaxSize() string { + if m != nil { + return m.MaxSize + } + return "" +} + +func (m *MediaUpload) GetProtocols() *Protocols { + if m != nil { + return m.Protocols + } + return nil +} + +func (m *MediaUpload) GetSupportsSubscription() bool { + if m != nil { + return m.SupportsSubscription + } + return false +} + +type Method struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + HttpMethod string `protobuf:"bytes,3,opt,name=http_method,json=httpMethod,proto3" json:"http_method,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + Parameters *Parameters `protobuf:"bytes,5,opt,name=parameters,proto3" json:"parameters,omitempty"` + ParameterOrder []string `protobuf:"bytes,6,rep,name=parameter_order,json=parameterOrder,proto3" json:"parameter_order,omitempty"` + Request *Request `protobuf:"bytes,7,opt,name=request,proto3" json:"request,omitempty"` + Response *Response `protobuf:"bytes,8,opt,name=response,proto3" json:"response,omitempty"` + Scopes []string `protobuf:"bytes,9,rep,name=scopes,proto3" json:"scopes,omitempty"` + SupportsMediaDownload bool `protobuf:"varint,10,opt,name=supports_media_download,json=supportsMediaDownload,proto3" json:"supports_media_download,omitempty"` + SupportsMediaUpload bool `protobuf:"varint,11,opt,name=supports_media_upload,json=supportsMediaUpload,proto3" json:"supports_media_upload,omitempty"` + UseMediaDownloadService bool `protobuf:"varint,12,opt,name=use_media_download_service,json=useMediaDownloadService,proto3" json:"use_media_download_service,omitempty"` + MediaUpload *MediaUpload `protobuf:"bytes,13,opt,name=media_upload,json=mediaUpload,proto3" json:"media_upload,omitempty"` + SupportsSubscription bool `protobuf:"varint,14,opt,name=supports_subscription,json=supportsSubscription,proto3" json:"supports_subscription,omitempty"` + FlatPath string `protobuf:"bytes,15,opt,name=flat_path,json=flatPath,proto3" json:"flat_path,omitempty"` + EtagRequired bool `protobuf:"varint,16,opt,name=etag_required,json=etagRequired,proto3" json:"etag_required,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Method) Reset() { *m = Method{} } +func (m *Method) String() string { return proto.CompactTextString(m) } +func (*Method) ProtoMessage() {} +func (*Method) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{6} +} + +func (m *Method) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Method.Unmarshal(m, b) +} +func (m *Method) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Method.Marshal(b, m, deterministic) +} +func (m *Method) XXX_Merge(src proto.Message) { + xxx_messageInfo_Method.Merge(m, src) +} +func (m *Method) XXX_Size() int { + return xxx_messageInfo_Method.Size(m) +} +func (m *Method) XXX_DiscardUnknown() { + xxx_messageInfo_Method.DiscardUnknown(m) +} + +var xxx_messageInfo_Method proto.InternalMessageInfo + +func (m *Method) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *Method) GetPath() string { + if m != nil { + return m.Path + } + return "" +} + +func (m *Method) GetHttpMethod() string { + if m != nil { + return m.HttpMethod + } + return "" +} + +func (m *Method) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Method) GetParameters() *Parameters { + if m != nil { + return m.Parameters + } + return nil +} + +func (m *Method) GetParameterOrder() []string { + if m != nil { + return m.ParameterOrder + } + return nil +} + +func (m *Method) GetRequest() *Request { + if m != nil { + return m.Request + } + return nil +} + +func (m *Method) GetResponse() *Response { + if m != nil { + return m.Response + } + return nil +} + +func (m *Method) GetScopes() []string { + if m != nil { + return m.Scopes + } + return nil +} + +func (m *Method) GetSupportsMediaDownload() bool { + if m != nil { + return m.SupportsMediaDownload + } + return false +} + +func (m *Method) GetSupportsMediaUpload() bool { + if m != nil { + return m.SupportsMediaUpload + } + return false +} + +func (m *Method) GetUseMediaDownloadService() bool { + if m != nil { + return m.UseMediaDownloadService + } + return false +} + +func (m *Method) GetMediaUpload() *MediaUpload { + if m != nil { + return m.MediaUpload + } + return nil +} + +func (m *Method) GetSupportsSubscription() bool { + if m != nil { + return m.SupportsSubscription + } + return false +} + +func (m *Method) GetFlatPath() string { + if m != nil { + return m.FlatPath + } + return "" +} + +func (m *Method) GetEtagRequired() bool { + if m != nil { + return m.EtagRequired + } + return false +} + +type Methods struct { + AdditionalProperties []*NamedMethod `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Methods) Reset() { *m = Methods{} } +func (m *Methods) String() string { return proto.CompactTextString(m) } +func (*Methods) ProtoMessage() {} +func (*Methods) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{7} +} + +func (m *Methods) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Methods.Unmarshal(m, b) +} +func (m *Methods) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Methods.Marshal(b, m, deterministic) +} +func (m *Methods) XXX_Merge(src proto.Message) { + xxx_messageInfo_Methods.Merge(m, src) +} +func (m *Methods) XXX_Size() int { + return xxx_messageInfo_Methods.Size(m) +} +func (m *Methods) XXX_DiscardUnknown() { + xxx_messageInfo_Methods.DiscardUnknown(m) +} + +var xxx_messageInfo_Methods proto.InternalMessageInfo + +func (m *Methods) GetAdditionalProperties() []*NamedMethod { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +// Automatically-generated message used to represent maps of Method as ordered (name,value) pairs. +type NamedMethod struct { + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *Method `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedMethod) Reset() { *m = NamedMethod{} } +func (m *NamedMethod) String() string { return proto.CompactTextString(m) } +func (*NamedMethod) ProtoMessage() {} +func (*NamedMethod) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{8} +} + +func (m *NamedMethod) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedMethod.Unmarshal(m, b) +} +func (m *NamedMethod) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedMethod.Marshal(b, m, deterministic) +} +func (m *NamedMethod) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedMethod.Merge(m, src) +} +func (m *NamedMethod) XXX_Size() int { + return xxx_messageInfo_NamedMethod.Size(m) +} +func (m *NamedMethod) XXX_DiscardUnknown() { + xxx_messageInfo_NamedMethod.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedMethod proto.InternalMessageInfo + +func (m *NamedMethod) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedMethod) GetValue() *Method { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of Parameter as ordered (name,value) pairs. +type NamedParameter struct { + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *Parameter `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedParameter) Reset() { *m = NamedParameter{} } +func (m *NamedParameter) String() string { return proto.CompactTextString(m) } +func (*NamedParameter) ProtoMessage() {} +func (*NamedParameter) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{9} +} + +func (m *NamedParameter) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedParameter.Unmarshal(m, b) +} +func (m *NamedParameter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedParameter.Marshal(b, m, deterministic) +} +func (m *NamedParameter) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedParameter.Merge(m, src) +} +func (m *NamedParameter) XXX_Size() int { + return xxx_messageInfo_NamedParameter.Size(m) +} +func (m *NamedParameter) XXX_DiscardUnknown() { + xxx_messageInfo_NamedParameter.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedParameter proto.InternalMessageInfo + +func (m *NamedParameter) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedParameter) GetValue() *Parameter { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of Resource as ordered (name,value) pairs. +type NamedResource struct { + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *Resource `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedResource) Reset() { *m = NamedResource{} } +func (m *NamedResource) String() string { return proto.CompactTextString(m) } +func (*NamedResource) ProtoMessage() {} +func (*NamedResource) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{10} +} + +func (m *NamedResource) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedResource.Unmarshal(m, b) +} +func (m *NamedResource) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedResource.Marshal(b, m, deterministic) +} +func (m *NamedResource) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedResource.Merge(m, src) +} +func (m *NamedResource) XXX_Size() int { + return xxx_messageInfo_NamedResource.Size(m) +} +func (m *NamedResource) XXX_DiscardUnknown() { + xxx_messageInfo_NamedResource.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedResource proto.InternalMessageInfo + +func (m *NamedResource) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedResource) GetValue() *Resource { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of Schema as ordered (name,value) pairs. +type NamedSchema struct { + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *Schema `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedSchema) Reset() { *m = NamedSchema{} } +func (m *NamedSchema) String() string { return proto.CompactTextString(m) } +func (*NamedSchema) ProtoMessage() {} +func (*NamedSchema) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{11} +} + +func (m *NamedSchema) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedSchema.Unmarshal(m, b) +} +func (m *NamedSchema) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedSchema.Marshal(b, m, deterministic) +} +func (m *NamedSchema) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedSchema.Merge(m, src) +} +func (m *NamedSchema) XXX_Size() int { + return xxx_messageInfo_NamedSchema.Size(m) +} +func (m *NamedSchema) XXX_DiscardUnknown() { + xxx_messageInfo_NamedSchema.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedSchema proto.InternalMessageInfo + +func (m *NamedSchema) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedSchema) GetValue() *Schema { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of Scope as ordered (name,value) pairs. +type NamedScope struct { + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *Scope `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedScope) Reset() { *m = NamedScope{} } +func (m *NamedScope) String() string { return proto.CompactTextString(m) } +func (*NamedScope) ProtoMessage() {} +func (*NamedScope) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{12} +} + +func (m *NamedScope) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedScope.Unmarshal(m, b) +} +func (m *NamedScope) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedScope.Marshal(b, m, deterministic) +} +func (m *NamedScope) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedScope.Merge(m, src) +} +func (m *NamedScope) XXX_Size() int { + return xxx_messageInfo_NamedScope.Size(m) +} +func (m *NamedScope) XXX_DiscardUnknown() { + xxx_messageInfo_NamedScope.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedScope proto.InternalMessageInfo + +func (m *NamedScope) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedScope) GetValue() *Scope { + if m != nil { + return m.Value + } + return nil +} + +type Oauth2 struct { + Scopes *Scopes `protobuf:"bytes,1,opt,name=scopes,proto3" json:"scopes,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Oauth2) Reset() { *m = Oauth2{} } +func (m *Oauth2) String() string { return proto.CompactTextString(m) } +func (*Oauth2) ProtoMessage() {} +func (*Oauth2) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{13} +} + +func (m *Oauth2) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Oauth2.Unmarshal(m, b) +} +func (m *Oauth2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Oauth2.Marshal(b, m, deterministic) +} +func (m *Oauth2) XXX_Merge(src proto.Message) { + xxx_messageInfo_Oauth2.Merge(m, src) +} +func (m *Oauth2) XXX_Size() int { + return xxx_messageInfo_Oauth2.Size(m) +} +func (m *Oauth2) XXX_DiscardUnknown() { + xxx_messageInfo_Oauth2.DiscardUnknown(m) +} + +var xxx_messageInfo_Oauth2 proto.InternalMessageInfo + +func (m *Oauth2) GetScopes() *Scopes { + if m != nil { + return m.Scopes + } + return nil +} + +type Parameter struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + XRef string `protobuf:"bytes,3,opt,name=_ref,json=Ref,proto3" json:"_ref,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + Default string `protobuf:"bytes,5,opt,name=default,proto3" json:"default,omitempty"` + Required bool `protobuf:"varint,6,opt,name=required,proto3" json:"required,omitempty"` + Format string `protobuf:"bytes,7,opt,name=format,proto3" json:"format,omitempty"` + Pattern string `protobuf:"bytes,8,opt,name=pattern,proto3" json:"pattern,omitempty"` + Minimum string `protobuf:"bytes,9,opt,name=minimum,proto3" json:"minimum,omitempty"` + Maximum string `protobuf:"bytes,10,opt,name=maximum,proto3" json:"maximum,omitempty"` + Enum []string `protobuf:"bytes,11,rep,name=enum,proto3" json:"enum,omitempty"` + EnumDescriptions []string `protobuf:"bytes,12,rep,name=enum_descriptions,json=enumDescriptions,proto3" json:"enum_descriptions,omitempty"` + Repeated bool `protobuf:"varint,13,opt,name=repeated,proto3" json:"repeated,omitempty"` + Location string `protobuf:"bytes,14,opt,name=location,proto3" json:"location,omitempty"` + Properties *Schemas `protobuf:"bytes,15,opt,name=properties,proto3" json:"properties,omitempty"` + AdditionalProperties *Schema `protobuf:"bytes,16,opt,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + Items *Schema `protobuf:"bytes,17,opt,name=items,proto3" json:"items,omitempty"` + Annotations *Annotations `protobuf:"bytes,18,opt,name=annotations,proto3" json:"annotations,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Parameter) Reset() { *m = Parameter{} } +func (m *Parameter) String() string { return proto.CompactTextString(m) } +func (*Parameter) ProtoMessage() {} +func (*Parameter) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{14} +} + +func (m *Parameter) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Parameter.Unmarshal(m, b) +} +func (m *Parameter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Parameter.Marshal(b, m, deterministic) +} +func (m *Parameter) XXX_Merge(src proto.Message) { + xxx_messageInfo_Parameter.Merge(m, src) +} +func (m *Parameter) XXX_Size() int { + return xxx_messageInfo_Parameter.Size(m) +} +func (m *Parameter) XXX_DiscardUnknown() { + xxx_messageInfo_Parameter.DiscardUnknown(m) +} + +var xxx_messageInfo_Parameter proto.InternalMessageInfo + +func (m *Parameter) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *Parameter) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *Parameter) GetXRef() string { + if m != nil { + return m.XRef + } + return "" +} + +func (m *Parameter) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Parameter) GetDefault() string { + if m != nil { + return m.Default + } + return "" +} + +func (m *Parameter) GetRequired() bool { + if m != nil { + return m.Required + } + return false +} + +func (m *Parameter) GetFormat() string { + if m != nil { + return m.Format + } + return "" +} + +func (m *Parameter) GetPattern() string { + if m != nil { + return m.Pattern + } + return "" +} + +func (m *Parameter) GetMinimum() string { + if m != nil { + return m.Minimum + } + return "" +} + +func (m *Parameter) GetMaximum() string { + if m != nil { + return m.Maximum + } + return "" +} + +func (m *Parameter) GetEnum() []string { + if m != nil { + return m.Enum + } + return nil +} + +func (m *Parameter) GetEnumDescriptions() []string { + if m != nil { + return m.EnumDescriptions + } + return nil +} + +func (m *Parameter) GetRepeated() bool { + if m != nil { + return m.Repeated + } + return false +} + +func (m *Parameter) GetLocation() string { + if m != nil { + return m.Location + } + return "" +} + +func (m *Parameter) GetProperties() *Schemas { + if m != nil { + return m.Properties + } + return nil +} + +func (m *Parameter) GetAdditionalProperties() *Schema { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +func (m *Parameter) GetItems() *Schema { + if m != nil { + return m.Items + } + return nil +} + +func (m *Parameter) GetAnnotations() *Annotations { + if m != nil { + return m.Annotations + } + return nil +} + +type Parameters struct { + AdditionalProperties []*NamedParameter `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Parameters) Reset() { *m = Parameters{} } +func (m *Parameters) String() string { return proto.CompactTextString(m) } +func (*Parameters) ProtoMessage() {} +func (*Parameters) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{15} +} + +func (m *Parameters) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Parameters.Unmarshal(m, b) +} +func (m *Parameters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Parameters.Marshal(b, m, deterministic) +} +func (m *Parameters) XXX_Merge(src proto.Message) { + xxx_messageInfo_Parameters.Merge(m, src) +} +func (m *Parameters) XXX_Size() int { + return xxx_messageInfo_Parameters.Size(m) +} +func (m *Parameters) XXX_DiscardUnknown() { + xxx_messageInfo_Parameters.DiscardUnknown(m) +} + +var xxx_messageInfo_Parameters proto.InternalMessageInfo + +func (m *Parameters) GetAdditionalProperties() []*NamedParameter { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +type Protocols struct { + Simple *Simple `protobuf:"bytes,1,opt,name=simple,proto3" json:"simple,omitempty"` + Resumable *Resumable `protobuf:"bytes,2,opt,name=resumable,proto3" json:"resumable,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Protocols) Reset() { *m = Protocols{} } +func (m *Protocols) String() string { return proto.CompactTextString(m) } +func (*Protocols) ProtoMessage() {} +func (*Protocols) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{16} +} + +func (m *Protocols) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Protocols.Unmarshal(m, b) +} +func (m *Protocols) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Protocols.Marshal(b, m, deterministic) +} +func (m *Protocols) XXX_Merge(src proto.Message) { + xxx_messageInfo_Protocols.Merge(m, src) +} +func (m *Protocols) XXX_Size() int { + return xxx_messageInfo_Protocols.Size(m) +} +func (m *Protocols) XXX_DiscardUnknown() { + xxx_messageInfo_Protocols.DiscardUnknown(m) +} + +var xxx_messageInfo_Protocols proto.InternalMessageInfo + +func (m *Protocols) GetSimple() *Simple { + if m != nil { + return m.Simple + } + return nil +} + +func (m *Protocols) GetResumable() *Resumable { + if m != nil { + return m.Resumable + } + return nil +} + +type Request struct { + XRef string `protobuf:"bytes,1,opt,name=_ref,json=Ref,proto3" json:"_ref,omitempty"` + ParameterName string `protobuf:"bytes,2,opt,name=parameter_name,json=parameterName,proto3" json:"parameter_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Request) Reset() { *m = Request{} } +func (m *Request) String() string { return proto.CompactTextString(m) } +func (*Request) ProtoMessage() {} +func (*Request) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{17} +} + +func (m *Request) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Request.Unmarshal(m, b) +} +func (m *Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Request.Marshal(b, m, deterministic) +} +func (m *Request) XXX_Merge(src proto.Message) { + xxx_messageInfo_Request.Merge(m, src) +} +func (m *Request) XXX_Size() int { + return xxx_messageInfo_Request.Size(m) +} +func (m *Request) XXX_DiscardUnknown() { + xxx_messageInfo_Request.DiscardUnknown(m) +} + +var xxx_messageInfo_Request proto.InternalMessageInfo + +func (m *Request) GetXRef() string { + if m != nil { + return m.XRef + } + return "" +} + +func (m *Request) GetParameterName() string { + if m != nil { + return m.ParameterName + } + return "" +} + +type Resource struct { + Methods *Methods `protobuf:"bytes,1,opt,name=methods,proto3" json:"methods,omitempty"` + Resources *Resources `protobuf:"bytes,2,opt,name=resources,proto3" json:"resources,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Resource) Reset() { *m = Resource{} } +func (m *Resource) String() string { return proto.CompactTextString(m) } +func (*Resource) ProtoMessage() {} +func (*Resource) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{18} +} + +func (m *Resource) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Resource.Unmarshal(m, b) +} +func (m *Resource) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Resource.Marshal(b, m, deterministic) +} +func (m *Resource) XXX_Merge(src proto.Message) { + xxx_messageInfo_Resource.Merge(m, src) +} +func (m *Resource) XXX_Size() int { + return xxx_messageInfo_Resource.Size(m) +} +func (m *Resource) XXX_DiscardUnknown() { + xxx_messageInfo_Resource.DiscardUnknown(m) +} + +var xxx_messageInfo_Resource proto.InternalMessageInfo + +func (m *Resource) GetMethods() *Methods { + if m != nil { + return m.Methods + } + return nil +} + +func (m *Resource) GetResources() *Resources { + if m != nil { + return m.Resources + } + return nil +} + +type Resources struct { + AdditionalProperties []*NamedResource `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Resources) Reset() { *m = Resources{} } +func (m *Resources) String() string { return proto.CompactTextString(m) } +func (*Resources) ProtoMessage() {} +func (*Resources) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{19} +} + +func (m *Resources) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Resources.Unmarshal(m, b) +} +func (m *Resources) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Resources.Marshal(b, m, deterministic) +} +func (m *Resources) XXX_Merge(src proto.Message) { + xxx_messageInfo_Resources.Merge(m, src) +} +func (m *Resources) XXX_Size() int { + return xxx_messageInfo_Resources.Size(m) +} +func (m *Resources) XXX_DiscardUnknown() { + xxx_messageInfo_Resources.DiscardUnknown(m) +} + +var xxx_messageInfo_Resources proto.InternalMessageInfo + +func (m *Resources) GetAdditionalProperties() []*NamedResource { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +type Response struct { + XRef string `protobuf:"bytes,1,opt,name=_ref,json=Ref,proto3" json:"_ref,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Response) Reset() { *m = Response{} } +func (m *Response) String() string { return proto.CompactTextString(m) } +func (*Response) ProtoMessage() {} +func (*Response) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{20} +} + +func (m *Response) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Response.Unmarshal(m, b) +} +func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Response.Marshal(b, m, deterministic) +} +func (m *Response) XXX_Merge(src proto.Message) { + xxx_messageInfo_Response.Merge(m, src) +} +func (m *Response) XXX_Size() int { + return xxx_messageInfo_Response.Size(m) +} +func (m *Response) XXX_DiscardUnknown() { + xxx_messageInfo_Response.DiscardUnknown(m) +} + +var xxx_messageInfo_Response proto.InternalMessageInfo + +func (m *Response) GetXRef() string { + if m != nil { + return m.XRef + } + return "" +} + +type Resumable struct { + Multipart bool `protobuf:"varint,1,opt,name=multipart,proto3" json:"multipart,omitempty"` + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Resumable) Reset() { *m = Resumable{} } +func (m *Resumable) String() string { return proto.CompactTextString(m) } +func (*Resumable) ProtoMessage() {} +func (*Resumable) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{21} +} + +func (m *Resumable) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Resumable.Unmarshal(m, b) +} +func (m *Resumable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Resumable.Marshal(b, m, deterministic) +} +func (m *Resumable) XXX_Merge(src proto.Message) { + xxx_messageInfo_Resumable.Merge(m, src) +} +func (m *Resumable) XXX_Size() int { + return xxx_messageInfo_Resumable.Size(m) +} +func (m *Resumable) XXX_DiscardUnknown() { + xxx_messageInfo_Resumable.DiscardUnknown(m) +} + +var xxx_messageInfo_Resumable proto.InternalMessageInfo + +func (m *Resumable) GetMultipart() bool { + if m != nil { + return m.Multipart + } + return false +} + +func (m *Resumable) GetPath() string { + if m != nil { + return m.Path + } + return "" +} + +type Schema struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Default string `protobuf:"bytes,4,opt,name=default,proto3" json:"default,omitempty"` + Required bool `protobuf:"varint,5,opt,name=required,proto3" json:"required,omitempty"` + Format string `protobuf:"bytes,6,opt,name=format,proto3" json:"format,omitempty"` + Pattern string `protobuf:"bytes,7,opt,name=pattern,proto3" json:"pattern,omitempty"` + Minimum string `protobuf:"bytes,8,opt,name=minimum,proto3" json:"minimum,omitempty"` + Maximum string `protobuf:"bytes,9,opt,name=maximum,proto3" json:"maximum,omitempty"` + Enum []string `protobuf:"bytes,10,rep,name=enum,proto3" json:"enum,omitempty"` + EnumDescriptions []string `protobuf:"bytes,11,rep,name=enum_descriptions,json=enumDescriptions,proto3" json:"enum_descriptions,omitempty"` + Repeated bool `protobuf:"varint,12,opt,name=repeated,proto3" json:"repeated,omitempty"` + Location string `protobuf:"bytes,13,opt,name=location,proto3" json:"location,omitempty"` + Properties *Schemas `protobuf:"bytes,14,opt,name=properties,proto3" json:"properties,omitempty"` + AdditionalProperties *Schema `protobuf:"bytes,15,opt,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + Items *Schema `protobuf:"bytes,16,opt,name=items,proto3" json:"items,omitempty"` + XRef string `protobuf:"bytes,17,opt,name=_ref,json=Ref,proto3" json:"_ref,omitempty"` + Annotations *Annotations `protobuf:"bytes,18,opt,name=annotations,proto3" json:"annotations,omitempty"` + ReadOnly bool `protobuf:"varint,19,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Schema) Reset() { *m = Schema{} } +func (m *Schema) String() string { return proto.CompactTextString(m) } +func (*Schema) ProtoMessage() {} +func (*Schema) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{22} +} + +func (m *Schema) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Schema.Unmarshal(m, b) +} +func (m *Schema) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Schema.Marshal(b, m, deterministic) +} +func (m *Schema) XXX_Merge(src proto.Message) { + xxx_messageInfo_Schema.Merge(m, src) +} +func (m *Schema) XXX_Size() int { + return xxx_messageInfo_Schema.Size(m) +} +func (m *Schema) XXX_DiscardUnknown() { + xxx_messageInfo_Schema.DiscardUnknown(m) +} + +var xxx_messageInfo_Schema proto.InternalMessageInfo + +func (m *Schema) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *Schema) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *Schema) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Schema) GetDefault() string { + if m != nil { + return m.Default + } + return "" +} + +func (m *Schema) GetRequired() bool { + if m != nil { + return m.Required + } + return false +} + +func (m *Schema) GetFormat() string { + if m != nil { + return m.Format + } + return "" +} + +func (m *Schema) GetPattern() string { + if m != nil { + return m.Pattern + } + return "" +} + +func (m *Schema) GetMinimum() string { + if m != nil { + return m.Minimum + } + return "" +} + +func (m *Schema) GetMaximum() string { + if m != nil { + return m.Maximum + } + return "" +} + +func (m *Schema) GetEnum() []string { + if m != nil { + return m.Enum + } + return nil +} + +func (m *Schema) GetEnumDescriptions() []string { + if m != nil { + return m.EnumDescriptions + } + return nil +} + +func (m *Schema) GetRepeated() bool { + if m != nil { + return m.Repeated + } + return false +} + +func (m *Schema) GetLocation() string { + if m != nil { + return m.Location + } + return "" +} + +func (m *Schema) GetProperties() *Schemas { + if m != nil { + return m.Properties + } + return nil +} + +func (m *Schema) GetAdditionalProperties() *Schema { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +func (m *Schema) GetItems() *Schema { + if m != nil { + return m.Items + } + return nil +} + +func (m *Schema) GetXRef() string { + if m != nil { + return m.XRef + } + return "" +} + +func (m *Schema) GetAnnotations() *Annotations { + if m != nil { + return m.Annotations + } + return nil +} + +func (m *Schema) GetReadOnly() bool { + if m != nil { + return m.ReadOnly + } + return false +} + +type Schemas struct { + AdditionalProperties []*NamedSchema `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Schemas) Reset() { *m = Schemas{} } +func (m *Schemas) String() string { return proto.CompactTextString(m) } +func (*Schemas) ProtoMessage() {} +func (*Schemas) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{23} +} + +func (m *Schemas) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Schemas.Unmarshal(m, b) +} +func (m *Schemas) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Schemas.Marshal(b, m, deterministic) +} +func (m *Schemas) XXX_Merge(src proto.Message) { + xxx_messageInfo_Schemas.Merge(m, src) +} +func (m *Schemas) XXX_Size() int { + return xxx_messageInfo_Schemas.Size(m) +} +func (m *Schemas) XXX_DiscardUnknown() { + xxx_messageInfo_Schemas.DiscardUnknown(m) +} + +var xxx_messageInfo_Schemas proto.InternalMessageInfo + +func (m *Schemas) GetAdditionalProperties() []*NamedSchema { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +type Scope struct { + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Scope) Reset() { *m = Scope{} } +func (m *Scope) String() string { return proto.CompactTextString(m) } +func (*Scope) ProtoMessage() {} +func (*Scope) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{24} +} + +func (m *Scope) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Scope.Unmarshal(m, b) +} +func (m *Scope) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Scope.Marshal(b, m, deterministic) +} +func (m *Scope) XXX_Merge(src proto.Message) { + xxx_messageInfo_Scope.Merge(m, src) +} +func (m *Scope) XXX_Size() int { + return xxx_messageInfo_Scope.Size(m) +} +func (m *Scope) XXX_DiscardUnknown() { + xxx_messageInfo_Scope.DiscardUnknown(m) +} + +var xxx_messageInfo_Scope proto.InternalMessageInfo + +func (m *Scope) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +type Scopes struct { + AdditionalProperties []*NamedScope `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Scopes) Reset() { *m = Scopes{} } +func (m *Scopes) String() string { return proto.CompactTextString(m) } +func (*Scopes) ProtoMessage() {} +func (*Scopes) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{25} +} + +func (m *Scopes) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Scopes.Unmarshal(m, b) +} +func (m *Scopes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Scopes.Marshal(b, m, deterministic) +} +func (m *Scopes) XXX_Merge(src proto.Message) { + xxx_messageInfo_Scopes.Merge(m, src) +} +func (m *Scopes) XXX_Size() int { + return xxx_messageInfo_Scopes.Size(m) +} +func (m *Scopes) XXX_DiscardUnknown() { + xxx_messageInfo_Scopes.DiscardUnknown(m) +} + +var xxx_messageInfo_Scopes proto.InternalMessageInfo + +func (m *Scopes) GetAdditionalProperties() []*NamedScope { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +type Simple struct { + Multipart bool `protobuf:"varint,1,opt,name=multipart,proto3" json:"multipart,omitempty"` + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Simple) Reset() { *m = Simple{} } +func (m *Simple) String() string { return proto.CompactTextString(m) } +func (*Simple) ProtoMessage() {} +func (*Simple) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{26} +} + +func (m *Simple) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Simple.Unmarshal(m, b) +} +func (m *Simple) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Simple.Marshal(b, m, deterministic) +} +func (m *Simple) XXX_Merge(src proto.Message) { + xxx_messageInfo_Simple.Merge(m, src) +} +func (m *Simple) XXX_Size() int { + return xxx_messageInfo_Simple.Size(m) +} +func (m *Simple) XXX_DiscardUnknown() { + xxx_messageInfo_Simple.DiscardUnknown(m) +} + +var xxx_messageInfo_Simple proto.InternalMessageInfo + +func (m *Simple) GetMultipart() bool { + if m != nil { + return m.Multipart + } + return false +} + +func (m *Simple) GetPath() string { + if m != nil { + return m.Path + } + return "" +} + +type StringArray struct { + Value []string `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StringArray) Reset() { *m = StringArray{} } +func (m *StringArray) String() string { return proto.CompactTextString(m) } +func (*StringArray) ProtoMessage() {} +func (*StringArray) Descriptor() ([]byte, []int) { + return fileDescriptor_fec68c2b2e63f812, []int{27} +} + +func (m *StringArray) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StringArray.Unmarshal(m, b) +} +func (m *StringArray) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StringArray.Marshal(b, m, deterministic) +} +func (m *StringArray) XXX_Merge(src proto.Message) { + xxx_messageInfo_StringArray.Merge(m, src) +} +func (m *StringArray) XXX_Size() int { + return xxx_messageInfo_StringArray.Size(m) +} +func (m *StringArray) XXX_DiscardUnknown() { + xxx_messageInfo_StringArray.DiscardUnknown(m) +} + +var xxx_messageInfo_StringArray proto.InternalMessageInfo + +func (m *StringArray) GetValue() []string { + if m != nil { + return m.Value + } + return nil +} + +func init() { + proto.RegisterType((*Annotations)(nil), "discovery.v1.Annotations") + proto.RegisterType((*Any)(nil), "discovery.v1.Any") + proto.RegisterType((*Auth)(nil), "discovery.v1.Auth") + proto.RegisterType((*Document)(nil), "discovery.v1.Document") + proto.RegisterType((*Icons)(nil), "discovery.v1.Icons") + proto.RegisterType((*MediaUpload)(nil), "discovery.v1.MediaUpload") + proto.RegisterType((*Method)(nil), "discovery.v1.Method") + proto.RegisterType((*Methods)(nil), "discovery.v1.Methods") + proto.RegisterType((*NamedMethod)(nil), "discovery.v1.NamedMethod") + proto.RegisterType((*NamedParameter)(nil), "discovery.v1.NamedParameter") + proto.RegisterType((*NamedResource)(nil), "discovery.v1.NamedResource") + proto.RegisterType((*NamedSchema)(nil), "discovery.v1.NamedSchema") + proto.RegisterType((*NamedScope)(nil), "discovery.v1.NamedScope") + proto.RegisterType((*Oauth2)(nil), "discovery.v1.Oauth2") + proto.RegisterType((*Parameter)(nil), "discovery.v1.Parameter") + proto.RegisterType((*Parameters)(nil), "discovery.v1.Parameters") + proto.RegisterType((*Protocols)(nil), "discovery.v1.Protocols") + proto.RegisterType((*Request)(nil), "discovery.v1.Request") + proto.RegisterType((*Resource)(nil), "discovery.v1.Resource") + proto.RegisterType((*Resources)(nil), "discovery.v1.Resources") + proto.RegisterType((*Response)(nil), "discovery.v1.Response") + proto.RegisterType((*Resumable)(nil), "discovery.v1.Resumable") + proto.RegisterType((*Schema)(nil), "discovery.v1.Schema") + proto.RegisterType((*Schemas)(nil), "discovery.v1.Schemas") + proto.RegisterType((*Scope)(nil), "discovery.v1.Scope") + proto.RegisterType((*Scopes)(nil), "discovery.v1.Scopes") + proto.RegisterType((*Simple)(nil), "discovery.v1.Simple") + proto.RegisterType((*StringArray)(nil), "discovery.v1.StringArray") +} + +func init() { proto.RegisterFile("discovery/discovery.proto", fileDescriptor_fec68c2b2e63f812) } + +var fileDescriptor_fec68c2b2e63f812 = []byte{ + // 1683 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0x5f, 0x53, 0xdc, 0xc8, + 0x11, 0xaf, 0x85, 0xfd, 0xdb, 0xbb, 0x0b, 0xcb, 0xf0, 0x4f, 0x60, 0x9c, 0x23, 0xba, 0xba, 0x04, + 0x72, 0x77, 0x50, 0xc6, 0x39, 0x57, 0x2a, 0x4e, 0x1e, 0x70, 0xe0, 0xc1, 0x95, 0x60, 0xb0, 0x28, + 0x27, 0x95, 0x87, 0x94, 0x6a, 0x90, 0x66, 0x59, 0x15, 0x92, 0x46, 0x19, 0x8d, 0x30, 0xeb, 0x8f, + 0x93, 0xaa, 0xbc, 0x25, 0xdf, 0x2a, 0x9f, 0x23, 0x75, 0x35, 0x3d, 0x23, 0xad, 0x16, 0xb4, 0x6b, + 0x8c, 0x9f, 0x98, 0xee, 0x5f, 0x77, 0x6b, 0xa6, 0xa7, 0xfb, 0x37, 0xbd, 0xc0, 0x96, 0x1f, 0xa4, + 0x1e, 0xbf, 0x65, 0x62, 0x7c, 0x58, 0xac, 0x0e, 0x12, 0xc1, 0x25, 0x27, 0xbd, 0x89, 0xe2, 0xf6, + 0xc5, 0xf6, 0xd6, 0x35, 0xe7, 0xd7, 0x21, 0x3b, 0x44, 0xec, 0x2a, 0x1b, 0x1e, 0xd2, 0xd8, 0x18, + 0xda, 0xfb, 0xd0, 0x3d, 0x8e, 0x63, 0x2e, 0xa9, 0x0c, 0x78, 0x9c, 0x92, 0x6d, 0x68, 0x0b, 0xf6, + 0xcf, 0x2c, 0x10, 0xcc, 0xb7, 0x6a, 0xbb, 0x8b, 0x7b, 0x1d, 0xa7, 0x90, 0xed, 0x53, 0x58, 0x3c, + 0x8e, 0xc7, 0xe4, 0x37, 0xd0, 0xb8, 0xa5, 0x61, 0xc6, 0xac, 0xda, 0x6e, 0x6d, 0xaf, 0x7b, 0xb4, + 0x76, 0xa0, 0x83, 0x1f, 0xe4, 0xc1, 0x0f, 0x8e, 0xe3, 0xb1, 0xa3, 0x4d, 0x08, 0x81, 0xfa, 0x98, + 0x46, 0xa1, 0xb5, 0xb0, 0x5b, 0xdb, 0xeb, 0x38, 0xb8, 0xb6, 0x7f, 0x0b, 0xf5, 0xe3, 0x4c, 0x8e, + 0xc8, 0x0f, 0xd0, 0xe4, 0x34, 0x93, 0xa3, 0xa3, 0x22, 0x50, 0x79, 0xcf, 0x07, 0xe7, 0x88, 0x39, + 0xc6, 0xc6, 0xfe, 0x77, 0x1b, 0xda, 0x27, 0xdc, 0xcb, 0x22, 0x16, 0x4b, 0x15, 0xf6, 0x26, 0x88, + 0x7d, 0x74, 0xec, 0x38, 0xb8, 0x26, 0xdf, 0xc3, 0x4a, 0xe1, 0xef, 0xde, 0x32, 0x91, 0x06, 0x3c, + 0x36, 0xdf, 0x1d, 0x14, 0xc0, 0x5f, 0xb5, 0x9e, 0x2c, 0xc1, 0x42, 0xe0, 0x5b, 0x8b, 0x88, 0x2e, + 0x04, 0xbe, 0x0a, 0x18, 0xd3, 0x88, 0x59, 0x75, 0x1d, 0x50, 0xad, 0x89, 0x05, 0xad, 0x3c, 0x4c, + 0x03, 0xd5, 0xb9, 0xa8, 0x93, 0x74, 0x1b, 0x20, 0xd4, 0x44, 0xa8, 0x90, 0xc9, 0x1a, 0x34, 0x64, + 0x20, 0x43, 0x66, 0xb5, 0x10, 0xd0, 0x02, 0xd9, 0x85, 0xae, 0xcf, 0x52, 0x4f, 0x04, 0x89, 0x4a, + 0xb3, 0xd5, 0x46, 0xac, 0xac, 0x22, 0xfb, 0xd0, 0x08, 0x3c, 0x1e, 0xa7, 0x56, 0x07, 0x93, 0xb1, + 0x3a, 0x9d, 0x8c, 0xb7, 0x0a, 0x72, 0xb4, 0x05, 0xf9, 0x11, 0x88, 0x6f, 0x32, 0x81, 0xb7, 0xe6, + 0x86, 0x41, 0x7c, 0x63, 0x01, 0xc6, 0x5c, 0x99, 0x42, 0xfe, 0x12, 0xc4, 0x37, 0x64, 0x03, 0x9a, + 0x21, 0xbd, 0x62, 0x61, 0x6a, 0x75, 0xf1, 0x42, 0x8d, 0xa4, 0x4e, 0x81, 0x57, 0xe6, 0xf1, 0xd0, + 0xea, 0xe9, 0x53, 0xe4, 0x32, 0xd9, 0x82, 0xf6, 0x15, 0x4d, 0x99, 0x9b, 0x89, 0xd0, 0xea, 0xeb, + 0xc3, 0x2b, 0xf9, 0x83, 0x08, 0xc9, 0x33, 0xe8, 0x20, 0x94, 0x50, 0x39, 0xb2, 0x96, 0xb4, 0x9f, + 0x52, 0x5c, 0x50, 0x39, 0x52, 0x7e, 0x82, 0x73, 0x89, 0x7e, 0xcb, 0xda, 0x4f, 0xc9, 0xca, 0xef, + 0x97, 0xd0, 0x4b, 0x99, 0xb8, 0x0d, 0x3c, 0xe3, 0x3a, 0xd0, 0x39, 0x30, 0x3a, 0xf4, 0x7e, 0x0e, + 0x70, 0x45, 0xa5, 0x37, 0xd2, 0x06, 0x2b, 0x68, 0xd0, 0x41, 0x0d, 0xc2, 0xbf, 0x03, 0x48, 0xa8, + 0xa0, 0x11, 0x93, 0x4c, 0xa4, 0x16, 0xc1, 0x3c, 0x59, 0xd3, 0x79, 0xba, 0x28, 0x70, 0xa7, 0x64, + 0x4b, 0x7e, 0x05, 0x75, 0x55, 0x45, 0xd6, 0x2a, 0xfa, 0x90, 0x69, 0x1f, 0x55, 0x8c, 0x0e, 0xe2, + 0x2a, 0x25, 0x43, 0x46, 0x65, 0x26, 0x58, 0x6a, 0xad, 0xe9, 0xea, 0xcf, 0x65, 0x72, 0x08, 0xad, + 0xd4, 0x1b, 0xb1, 0x88, 0xa6, 0xd6, 0x3a, 0x86, 0x59, 0x9f, 0x0e, 0x73, 0xa9, 0x41, 0x27, 0xb7, + 0x52, 0x0e, 0x11, 0x93, 0x23, 0xee, 0xa7, 0xd6, 0x46, 0x95, 0xc3, 0x99, 0x06, 0x9d, 0xdc, 0x8a, + 0xfc, 0x04, 0x1d, 0xc1, 0x52, 0x9e, 0x09, 0x8f, 0xa5, 0xd6, 0x26, 0xba, 0x6c, 0x4e, 0xbb, 0x38, + 0x39, 0xec, 0x4c, 0x2c, 0x55, 0xed, 0x32, 0x49, 0xaf, 0x2d, 0x4b, 0xd7, 0xae, 0x5a, 0xab, 0x64, + 0xf3, 0x8f, 0x31, 0x13, 0xae, 0xcf, 0x23, 0x1a, 0xc4, 0xd6, 0x96, 0x4e, 0x36, 0xea, 0x4e, 0x50, + 0xa5, 0x92, 0xad, 0x4d, 0xb0, 0xf0, 0xb7, 0x75, 0xb2, 0x51, 0xf3, 0x4e, 0x55, 0xff, 0x77, 0xb0, + 0x64, 0xca, 0xdd, 0x8d, 0xb8, 0x9f, 0x85, 0xcc, 0x7a, 0xb6, 0x5b, 0xdb, 0x6b, 0x3b, 0x7d, 0xa3, + 0x3d, 0x43, 0xa5, 0x32, 0xf3, 0x68, 0xcc, 0xe3, 0xc0, 0xa3, 0xa1, 0x8e, 0xb4, 0x83, 0x91, 0xfa, + 0x85, 0x16, 0xa3, 0x9d, 0xc2, 0x37, 0xc3, 0x2c, 0x0c, 0xc7, 0x2e, 0x8b, 0x3d, 0xee, 0x33, 0x57, + 0x30, 0x75, 0xef, 0xcc, 0x77, 0xd9, 0x5d, 0x42, 0x63, 0x6c, 0xa4, 0xe7, 0x18, 0x7e, 0x07, 0xcd, + 0x4e, 0xd1, 0xca, 0x31, 0x46, 0xa7, 0xb9, 0x8d, 0x3a, 0x56, 0x42, 0xbd, 0x1b, 0x7a, 0x6d, 0x6a, + 0xe8, 0x17, 0xfa, 0x58, 0x46, 0xa7, 0x8a, 0xc4, 0xfe, 0x1e, 0x1a, 0xd8, 0x2c, 0x64, 0x00, 0x8b, + 0x77, 0x2f, 0x5e, 0x19, 0x8a, 0x50, 0x4b, 0xd4, 0xbc, 0x3c, 0x32, 0x9c, 0xa0, 0x96, 0xf6, 0x7f, + 0x6a, 0xd0, 0x3d, 0x63, 0x7e, 0x40, 0x3f, 0x24, 0x21, 0xa7, 0xbe, 0x6a, 0x15, 0xea, 0x79, 0x2c, + 0x91, 0x86, 0xfb, 0x8c, 0xa4, 0xca, 0x3a, 0xa2, 0x77, 0x6e, 0x1a, 0x7c, 0x62, 0xc6, 0xbd, 0x15, + 0xd1, 0xbb, 0xcb, 0xe0, 0x13, 0x53, 0x97, 0x96, 0x77, 0x4d, 0x8a, 0x84, 0xf2, 0xe0, 0xd2, 0x2e, + 0x72, 0xd8, 0x99, 0x58, 0x92, 0x97, 0xb0, 0x9e, 0x66, 0x49, 0xc2, 0x85, 0x4c, 0xdd, 0x34, 0xbb, + 0x9a, 0x50, 0x43, 0x1d, 0xd3, 0xb0, 0x96, 0x83, 0x97, 0x25, 0xcc, 0xfe, 0x6f, 0x03, 0x9a, 0xba, + 0x6a, 0x0c, 0x81, 0xd5, 0xca, 0x04, 0x86, 0x19, 0x31, 0x44, 0xab, 0xd6, 0xe4, 0x1b, 0xe8, 0x8e, + 0xa4, 0x4c, 0x5c, 0x5d, 0x5f, 0x86, 0xed, 0x40, 0xa9, 0x4c, 0x90, 0x7b, 0xac, 0x54, 0x7f, 0xc8, + 0x4a, 0xd3, 0x2d, 0xd7, 0xf8, 0x82, 0x96, 0xfb, 0x35, 0x2c, 0x17, 0x92, 0xcb, 0x85, 0xcf, 0x84, + 0xd5, 0xc4, 0x9c, 0x2e, 0x15, 0xea, 0x73, 0xa5, 0x55, 0x6d, 0xa2, 0x5e, 0x18, 0x96, 0x4a, 0xa4, + 0xcc, 0x07, 0x6d, 0xe2, 0x68, 0xd0, 0xc9, 0xad, 0xc8, 0x91, 0x62, 0xdf, 0x34, 0xe1, 0x71, 0xca, + 0x90, 0x48, 0xbb, 0x47, 0x1b, 0x0f, 0xba, 0x04, 0x51, 0xa7, 0xb0, 0x53, 0x17, 0x9b, 0x7a, 0x3c, + 0x61, 0x8a, 0x5e, 0xf1, 0x62, 0xb5, 0x44, 0x5e, 0xc1, 0x66, 0x71, 0x0d, 0x91, 0x2a, 0x04, 0xd7, + 0xe7, 0x1f, 0x63, 0x55, 0x0b, 0xc8, 0xa7, 0x6d, 0xa7, 0xb8, 0x25, 0x2c, 0x93, 0x13, 0x03, 0x92, + 0xa3, 0xd2, 0xf5, 0x69, 0xbf, 0x0c, 0x2b, 0xc8, 0xea, 0xa2, 0xd7, 0xea, 0x94, 0x97, 0x29, 0xae, + 0xd7, 0xb0, 0x9d, 0xa5, 0xec, 0xde, 0x67, 0x5c, 0xc3, 0x7f, 0xc8, 0xc0, 0x6d, 0x67, 0x33, 0x4b, + 0xd9, 0xd4, 0x97, 0x2e, 0x35, 0x4c, 0xfe, 0x00, 0xbd, 0xa9, 0xef, 0xf4, 0xf1, 0xe0, 0x5b, 0xf7, + 0x19, 0xa5, 0xf8, 0x9a, 0xd3, 0x8d, 0x4a, 0x9f, 0x9e, 0x59, 0x6d, 0x4b, 0xb3, 0xab, 0x4d, 0x11, + 0xfd, 0x30, 0xa4, 0x52, 0x77, 0x9a, 0x26, 0xf3, 0xb6, 0x52, 0x20, 0x17, 0x7f, 0x0b, 0x7d, 0x45, + 0x34, 0x6e, 0x31, 0x2c, 0x0c, 0x30, 0x52, 0x4f, 0x29, 0x9d, 0x7c, 0x60, 0xf8, 0x3b, 0xb4, 0x0c, + 0xc9, 0x91, 0x77, 0xb0, 0x4e, 0x7d, 0x3f, 0x50, 0x81, 0x69, 0xe8, 0x26, 0x82, 0x27, 0x4c, 0xc8, + 0x80, 0xa5, 0xd8, 0x68, 0x0f, 0x0e, 0xa2, 0x38, 0xc3, 0xd7, 0xae, 0xce, 0xda, 0xc4, 0xef, 0xa2, + 0x70, 0xb3, 0xcf, 0xa0, 0x5b, 0x32, 0x2a, 0xde, 0xef, 0x5a, 0xe9, 0xfd, 0x2e, 0xe6, 0x94, 0x85, + 0xaa, 0xf1, 0xc2, 0x44, 0xd7, 0x26, 0xf6, 0x25, 0x2c, 0x61, 0xb8, 0xa2, 0x98, 0x2b, 0x23, 0xfe, + 0x38, 0x1d, 0x71, 0x73, 0x46, 0x23, 0xe4, 0x41, 0xdf, 0x43, 0x1f, 0x83, 0xe6, 0xac, 0x5d, 0x19, + 0xf3, 0x87, 0xe9, 0x98, 0x1b, 0xd5, 0x84, 0x9f, 0x87, 0xcc, 0x8f, 0xad, 0x1f, 0x9b, 0x27, 0x1c, + 0x5b, 0x3b, 0xe6, 0xe1, 0xfe, 0x0c, 0x60, 0xc2, 0xf1, 0xa4, 0x7a, 0x7b, 0xfb, 0xd3, 0xd1, 0x56, + 0xef, 0x47, 0xe3, 0x49, 0xb1, 0xb7, 0x57, 0xd0, 0xd4, 0x33, 0x9b, 0x9a, 0xec, 0x4c, 0xb7, 0xd5, + 0xaa, 0xf7, 0xa0, 0xb0, 0xbc, 0x07, 0xed, 0xff, 0xd5, 0xa1, 0x33, 0xc9, 0x7b, 0x05, 0xb1, 0xc9, + 0x71, 0x92, 0xd3, 0x2e, 0xae, 0xc9, 0x0a, 0xd4, 0x5d, 0xc1, 0x86, 0x86, 0xd1, 0x16, 0x1d, 0x36, + 0x7c, 0x04, 0x95, 0x59, 0xd0, 0xf2, 0xd9, 0x90, 0x66, 0xa1, 0xcc, 0xc7, 0x39, 0x23, 0x4e, 0xcd, + 0xbc, 0x4d, 0x2c, 0xe3, 0x42, 0x56, 0xc4, 0x31, 0xe4, 0x22, 0xa2, 0xd2, 0xcc, 0x73, 0x46, 0x52, + 0xd1, 0x12, 0x2a, 0x25, 0x13, 0xf9, 0x30, 0x97, 0x8b, 0x0a, 0x89, 0x82, 0x38, 0x88, 0xb2, 0x08, + 0x47, 0x39, 0xf5, 0x54, 0x68, 0x11, 0x11, 0x7a, 0x87, 0x08, 0x14, 0x8f, 0x08, 0x22, 0xea, 0x09, + 0x8f, 0xb3, 0xc8, 0x0c, 0x68, 0xb8, 0x56, 0xf3, 0xac, 0xfa, 0xeb, 0x96, 0xce, 0x90, 0x5a, 0x3d, + 0x34, 0x18, 0x28, 0xe0, 0xa4, 0xa4, 0xd7, 0x47, 0x48, 0x18, 0x95, 0x4c, 0x53, 0x03, 0x1e, 0x41, + 0xcb, 0x0a, 0x0b, 0xb9, 0x47, 0x8b, 0x7e, 0xef, 0x38, 0x85, 0x4c, 0x7e, 0x02, 0x28, 0xf5, 0xe2, + 0xf2, 0xbc, 0xb9, 0xa6, 0x64, 0x48, 0xde, 0xce, 0xea, 0xe6, 0xc1, 0x9c, 0x9a, 0xab, 0x6c, 0x64, + 0x55, 0xae, 0x81, 0x64, 0x51, 0x8a, 0xe3, 0xde, 0xcc, 0x72, 0x45, 0x13, 0xf2, 0x1a, 0xba, 0x74, + 0xf2, 0x5b, 0xc5, 0x4c, 0x80, 0xf7, 0xa8, 0xa3, 0xf4, 0x63, 0xc6, 0x29, 0x5b, 0xdb, 0x2e, 0xc0, + 0xe4, 0xa9, 0x22, 0xef, 0xe7, 0xf3, 0xd1, 0x4e, 0x05, 0x1f, 0x4d, 0xfa, 0xbb, 0x9a, 0x92, 0x12, + 0xe8, 0x14, 0x4f, 0x3d, 0xb6, 0x40, 0x10, 0x25, 0x21, 0x9b, 0xd1, 0x02, 0x88, 0x39, 0xc6, 0xc6, + 0x4c, 0x7e, 0x59, 0x44, 0xaf, 0xc2, 0x19, 0xe4, 0xe2, 0xe4, 0xb0, 0x33, 0xb1, 0xb4, 0xff, 0x04, + 0x2d, 0xf3, 0x3a, 0x16, 0x2d, 0x51, 0x9b, 0xb4, 0xc4, 0x77, 0x30, 0x79, 0x6a, 0xf5, 0x68, 0xa6, + 0x7b, 0xa8, 0x5f, 0x68, 0xd5, 0xb1, 0x6c, 0x01, 0xed, 0x82, 0xa0, 0x4a, 0x23, 0x6b, 0xed, 0xcb, + 0x47, 0xd6, 0x85, 0xc7, 0x8e, 0xac, 0xf6, 0x3f, 0xa0, 0x53, 0xe8, 0xc9, 0xc5, 0xfc, 0xab, 0x78, + 0x56, 0x71, 0x15, 0x05, 0x2d, 0x56, 0xdf, 0xc4, 0x73, 0x3c, 0x92, 0x7e, 0xf9, 0x1f, 0x26, 0xc6, + 0xfe, 0x23, 0x7e, 0x5d, 0xe7, 0x90, 0xec, 0x40, 0x27, 0xca, 0x42, 0x19, 0x24, 0x54, 0x48, 0x34, + 0x6a, 0x3b, 0x13, 0x45, 0xd5, 0x58, 0x65, 0xff, 0xbf, 0x0e, 0x4d, 0xc3, 0xbf, 0x8f, 0x21, 0xab, + 0x7b, 0xcc, 0xb4, 0x38, 0x97, 0x99, 0xea, 0xb3, 0x99, 0xa9, 0x31, 0x93, 0x99, 0x9a, 0xb3, 0x98, + 0xa9, 0x35, 0x93, 0x99, 0xda, 0x33, 0x99, 0xa9, 0x53, 0xcd, 0x4c, 0xf0, 0x39, 0x66, 0xea, 0x3e, + 0x82, 0x99, 0x7a, 0x73, 0x98, 0xa9, 0x3f, 0x97, 0x99, 0x96, 0xbe, 0x9a, 0x99, 0x96, 0x9f, 0xce, + 0x4c, 0x83, 0xcf, 0x33, 0x53, 0x5e, 0x65, 0x2b, 0x93, 0xf6, 0xfb, 0x1a, 0xb2, 0x52, 0xb3, 0x97, + 0x60, 0xd4, 0x77, 0x79, 0x1c, 0x8e, 0xf1, 0x57, 0x2b, 0xa6, 0x8d, 0xfa, 0xe7, 0x71, 0x38, 0x56, + 0x63, 0x95, 0x39, 0xfa, 0x53, 0xc6, 0xaa, 0x79, 0x67, 0xb6, 0xf7, 0xa1, 0xa1, 0x67, 0x81, 0x7b, + 0x55, 0x5b, 0x7b, 0x50, 0xb5, 0xf6, 0xdf, 0x54, 0x17, 0xe0, 0x10, 0x7d, 0x36, 0x7f, 0x13, 0x56, + 0xe5, 0x26, 0xd4, 0xe0, 0x50, 0xbd, 0x87, 0xdf, 0x43, 0x53, 0xd3, 0xe3, 0x13, 0x7a, 0xf3, 0x5b, + 0xe8, 0x5e, 0x4a, 0x11, 0xc4, 0xd7, 0xc7, 0x42, 0xd0, 0x31, 0x59, 0x9b, 0xfc, 0xab, 0x4a, 0x55, + 0xa7, 0x16, 0xde, 0xec, 0xc1, 0x80, 0x8b, 0xeb, 0x83, 0xd2, 0x7f, 0x8b, 0x5e, 0xbc, 0xe9, 0x9d, + 0x27, 0x2c, 0x3e, 0xbe, 0x78, 0x8b, 0x0c, 0x7e, 0x51, 0xfb, 0xd7, 0xc2, 0xe2, 0xf9, 0xf1, 0xe5, + 0x55, 0x13, 0x7f, 0xb0, 0xbd, 0xfc, 0x39, 0x00, 0x00, 0xff, 0xff, 0x0c, 0xae, 0x3c, 0xab, 0x69, + 0x13, 0x00, 0x00, +} diff --git a/vendor/github.com/googleapis/gnostic/discovery/discovery.proto b/vendor/github.com/googleapis/gnostic/discovery/discovery.proto new file mode 100644 index 0000000000..862ee88941 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/discovery/discovery.proto @@ -0,0 +1,265 @@ +// Copyright 2017 Google Inc. 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 discovery.v1; + +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.discovery_v1"; + +// 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"; + +message Annotations { + repeated string required = 1; +} + +message Any { + google.protobuf.Any value = 1; + string yaml = 2; +} + +message Auth { + Oauth2 oauth2 = 1; +} + +message Document { + string kind = 1; + string discovery_version = 2; + string id = 3; + string name = 4; + string version = 5; + string revision = 6; + string title = 7; + string description = 8; + Icons icons = 9; + string documentation_link = 10; + repeated string labels = 11; + string protocol = 12; + string base_url = 13; + string base_path = 14; + string root_url = 15; + string service_path = 16; + string batch_path = 17; + Parameters parameters = 18; + Auth auth = 19; + repeated string features = 20; + Schemas schemas = 21; + Methods methods = 22; + Resources resources = 23; + string etag = 24; + string owner_domain = 25; + string owner_name = 26; + bool version_module = 27; + string canonical_name = 28; + bool fully_encode_reserved_expansion = 29; + string package_path = 30; +} + +// Icons that represent the API. +message Icons { + string x16 = 1; + string x32 = 2; +} + +message MediaUpload { + repeated string accept = 1; + string max_size = 2; + Protocols protocols = 3; + bool supports_subscription = 4; +} + +message Method { + string id = 1; + string path = 2; + string http_method = 3; + string description = 4; + Parameters parameters = 5; + repeated string parameter_order = 6; + Request request = 7; + Response response = 8; + repeated string scopes = 9; + bool supports_media_download = 10; + bool supports_media_upload = 11; + bool use_media_download_service = 12; + MediaUpload media_upload = 13; + bool supports_subscription = 14; + string flat_path = 15; + bool etag_required = 16; +} + +message Methods { + repeated NamedMethod additional_properties = 1; +} + +// Automatically-generated message used to represent maps of Method as ordered (name,value) pairs. +message NamedMethod { + // Map key + string name = 1; + // Mapped value + Method value = 2; +} + +// Automatically-generated message used to represent maps of Parameter as ordered (name,value) pairs. +message NamedParameter { + // Map key + string name = 1; + // Mapped value + Parameter value = 2; +} + +// Automatically-generated message used to represent maps of Resource as ordered (name,value) pairs. +message NamedResource { + // Map key + string name = 1; + // Mapped value + Resource value = 2; +} + +// Automatically-generated message used to represent maps of Schema as ordered (name,value) pairs. +message NamedSchema { + // Map key + string name = 1; + // Mapped value + Schema value = 2; +} + +// Automatically-generated message used to represent maps of Scope as ordered (name,value) pairs. +message NamedScope { + // Map key + string name = 1; + // Mapped value + Scope value = 2; +} + +message Oauth2 { + Scopes scopes = 1; +} + +message Parameter { + string id = 1; + string type = 2; + string _ref = 3; + string description = 4; + string default = 5; + bool required = 6; + string format = 7; + string pattern = 8; + string minimum = 9; + string maximum = 10; + repeated string enum = 11; + repeated string enum_descriptions = 12; + bool repeated = 13; + string location = 14; + Schemas properties = 15; + Schema additional_properties = 16; + Schema items = 17; + Annotations annotations = 18; +} + +message Parameters { + repeated NamedParameter additional_properties = 1; +} + +message Protocols { + Simple simple = 1; + Resumable resumable = 2; +} + +message Request { + string _ref = 1; + string parameter_name = 2; +} + +message Resource { + Methods methods = 1; + Resources resources = 2; +} + +message Resources { + repeated NamedResource additional_properties = 1; +} + +message Response { + string _ref = 1; +} + +message Resumable { + bool multipart = 1; + string path = 2; +} + +message Schema { + string id = 1; + string type = 2; + string description = 3; + string default = 4; + bool required = 5; + string format = 6; + string pattern = 7; + string minimum = 8; + string maximum = 9; + repeated string enum = 10; + repeated string enum_descriptions = 11; + bool repeated = 12; + string location = 13; + Schemas properties = 14; + Schema additional_properties = 15; + Schema items = 16; + string _ref = 17; + Annotations annotations = 18; + bool read_only = 19; +} + +message Schemas { + repeated NamedSchema additional_properties = 1; +} + +message Scope { + string description = 1; +} + +message Scopes { + repeated NamedScope additional_properties = 1; +} + +message Simple { + bool multipart = 1; + string path = 2; +} + +message StringArray { + repeated string value = 1; +} + diff --git a/vendor/github.com/googleapis/gnostic/discovery/discovery.yaml b/vendor/github.com/googleapis/gnostic/discovery/discovery.yaml new file mode 100644 index 0000000000..9fa88b0151 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/discovery/discovery.yaml @@ -0,0 +1,297 @@ +title: A JSON Schema for the Google API Discovery Format. +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 Discovery Format. +required: +- kind +- discoveryVersion +additionalProperties: false +properties: + kind: + type: string + discoveryVersion: + type: string + id: + type: string + name: + type: string + version: + type: string + revision: + type: string + title: + type: string + description: + type: string + icons: + $ref: '#/definitions/icons' + documentationLink: + type: string + labels: + type: array + items: + type: string + protocol: + type: string + baseUrl: + type: string + basePath: + type: string + rootUrl: + type: string + servicePath: + type: string + batchPath: + type: string + parameters: + $ref: '#/definitions/parameters' + auth: + $ref: '#/definitions/auth' + features: + type: array + items: + type: string + schemas: + $ref: '#/definitions/schemas' + methods: + $ref: '#/definitions/methods' + resources: + $ref: '#/definitions/resources' + etag: + type: string + ownerDomain: + type: string + ownerName: + type: string + version_module: + type: boolean + canonicalName: + type: string + fullyEncodeReservedExpansion: + type: boolean + packagePath: + type: string +definitions: + icons: + type: object + description: Icons that represent the API. + required: + - x16 + - x32 + additionalProperties: false + properties: + x16: + type: string + x32: + type: string + parameters: + type: object + additionalProperties: + $ref: '#/definitions/parameter' + parameter: + type: object + properties: + id: + type: string + type: + type: string + $ref: + type: string + description: + type: string + default: + type: string + required: + type: boolean + format: + type: string + pattern: + type: string + minimum: + type: string + maximum: + type: string + enum: + type: array + items: + type: string + enumDescriptions: + type: array + items: + type: string + repeated: + type: boolean + location: + type: string + properties: + $ref: '#/definitions/schemas' + additionalProperties: + $ref: '#/definitions/schema' + items: + $ref: '#/definitions/schema' + annotations: + $ref: '#/definitions/annotations' + auth: + type: object + properties: + oauth2: + type: object + properties: + scopes: + $ref: '#/definitions/scopes' + schemas: + type: object + additionalProperties: + $ref: '#/definitions/schema' + schema: + type: object + properties: + id: + type: string + type: + type: string + description: + type: string + default: + type: string + required: + type: boolean + format: + type: string + pattern: + type: string + minimum: + type: string + maximum: + type: string + enum: + type: array + items: + type: string + enumDescriptions: + type: array + items: + type: string + repeated: + type: boolean + location: + type: string + properties: + $ref: '#/definitions/schemas' + additionalProperties: + $ref: '#/definitions/schema' + items: + $ref: '#/definitions/schema' + $ref: + type: string + annotations: + $ref: '#/definitions/annotations' + readOnly: + type: boolean + methods: + type: object + additionalProperties: + $ref: '#/definitions/method' + method: + type: object + properties: + id: + type: string + path: + type: string + httpMethod: + type: string + description: + type: string + parameters: + $ref: '#/definitions/parameters' + parameterOrder: + type: array + items: + type: string + request: + type: object + properties: + $ref: + type: string + parameterName: + type: string + response: + type: object + properties: + $ref: + type: string + scopes: + type: array + items: + type: string + supportsMediaDownload: + type: boolean + supportsMediaUpload: + type: boolean + useMediaDownloadService: + type: boolean + mediaUpload: + $ref: '#/definitions/mediaUpload' + supportsSubscription: + type: boolean + flatPath: + type: string + etagRequired: + type: boolean + resources: + type: object + additionalProperties: + $ref: '#/definitions/resource' + resource: + type: object + properties: + methods: + $ref: '#/definitions/methods' + resources: + $ref: '#/definitions/resources' + annotations: + type: object + properties: + required: + type: array + items: + type: string + scopes: + type: object + additionalProperties: + $ref: '#/definitions/scope' + scope: + type: object + properties: + description: + type: string + mediaUpload: + type: object + properties: + accept: + type: array + items: + type: string + maxSize: + type: string + protocols: + type: object + properties: + simple: + type: object + properties: + multipart: + type: boolean + path: + type: string + resumable: + type: object + properties: + multipart: + type: boolean + path: + type: string + supportsSubscription: + type: boolean diff --git a/vendor/github.com/googleapis/gnostic/discovery/document.go b/vendor/github.com/googleapis/gnostic/discovery/document.go new file mode 100644 index 0000000000..d9eb251df9 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/discovery/document.go @@ -0,0 +1,40 @@ +// Copyright 2019 Google Inc. 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 discovery_v1 + +import ( + "errors" + "log" + + "github.com/googleapis/gnostic/compiler" +) + +func FetchDocumentBytes(documentURL string) ([]byte, error) { + return compiler.FetchFile(documentURL) +} + +func ParseDocument(bytes []byte) (*Document, error) { + // Unpack the discovery document. + info, err := compiler.ReadInfoFromBytes("", bytes) + if err != nil { + return nil, err + } + m, ok := compiler.UnpackMap(info) + if !ok { + log.Printf("%s", string(bytes)) + return nil, errors.New("Invalid input") + } + return NewDocument(m, compiler.NewContext("$root", nil)) +} diff --git a/vendor/github.com/googleapis/gnostic/discovery/list.go b/vendor/github.com/googleapis/gnostic/discovery/list.go new file mode 100644 index 0000000000..20bcc7b0d7 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/discovery/list.go @@ -0,0 +1,94 @@ +// Copyright 2019 Google Inc. 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 discovery_v1 + +import ( + "encoding/json" + "errors" + "strings" + + "github.com/googleapis/gnostic/compiler" +) + +// APIsListServiceURL is the URL for the Google APIs Discovery Service +const APIsListServiceURL = "https://www.googleapis.com/discovery/v1/apis" + +// A List represents the results of a call to the apis/list API. +// https://developers.google.com/discovery/v1/reference/apis/list +type List struct { + Kind string `json:"kind"` + DiscoveryVersion string `json:"discoveryVersion"` + APIs []*API `json:"items"` +} + +func FetchListBytes() ([]byte, error) { + return compiler.FetchFile(APIsListServiceURL) +} + +// Read the list of APIs from the apis/list service. +func FetchList() (*List, error) { + bytes, err := FetchListBytes() + if err != nil { + return nil, err + } + return ParseList(bytes) +} + +// ParseList unmarshals the bytes into a Document. +func ParseList(bytes []byte) (*List, error) { + var listResponse List + err := json.Unmarshal(bytes, &listResponse) + return &listResponse, err +} + +// An API represents an API description returned by the apis/list API. +type API struct { + Kind string `json:"kind"` + ID string `json:"id"` + Name string `json:"name"` + Version string `json:"version"` + Title string `json:"title"` + Description string `json:"description"` + DiscoveryRestURL string `json:"discoveryRestUrl"` + DiscoveryLink string `json:"discoveryLink"` + Icons map[string]string `json:"icons"` + DocumentationLink string `json:"documentationLink"` + Labels []string `json:"labels"` + Preferred bool `json:"preferred"` +} + +// APIWithNameAndVersion returns the API with a specified name and version. +// If version is the empty string, the API name must be unique. +func (a *List) APIWithNameAndVersion(name string, version string) (*API, error) { + var api *API // the API to return + versions := make([]string, 0) // the matching version names + // Scan the list for matching APIs and versions. + for _, item := range a.APIs { + if item.Name == name { + if version == "" || version == item.Version { + api = item + versions = append(versions, item.Version) + } + } + } + switch { + case len(versions) == 0: + return nil, errors.New(name + " was not found.") + case len(versions) > 1: + return nil, errors.New(name + " has multiple versions: " + strings.Join(versions, ", ")) + default: + return api, nil + } +} diff --git a/vendor/github.com/googleapis/gnostic/gnostic.go b/vendor/github.com/googleapis/gnostic/gnostic.go new file mode 100644 index 0000000000..c19b41dde9 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/gnostic.go @@ -0,0 +1,49 @@ +// Copyright 2017 Google Inc. 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. + +//go:generate ./COMPILE-PROTOS.sh + +// Gnostic is a tool for building better REST APIs through knowledge. +// +// Gnostic reads declarative descriptions of REST APIs that conform +// to the OpenAPI Specification, reports errors, resolves internal +// dependencies, and puts the results in a binary form that can +// be used in any language that is supported by the Protocol Buffer +// tools. +// +// Gnostic models are validated and typed. This allows API tool +// developers to focus on their product and not worry about input +// validation and type checking. +// +// Gnostic calls plugins that implement a variety of API implementation +// and support features including generation of client and server +// support code. +package main + +import ( + "fmt" + "os" + + "github.com/googleapis/gnostic/lib" +) + +func main() { + // To simplify testing, Gnostic is implemented in an embeddable library. + g := lib.NewGnostic(os.Args) + err := g.Main() + if err != nil { + fmt.Fprintf(os.Stderr, "%s\n", err.Error()) + os.Exit(-1) + } +} diff --git a/vendor/github.com/googleapis/gnostic/go.mod b/vendor/github.com/googleapis/gnostic/go.mod new file mode 100644 index 0000000000..5115c1d7eb --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/go.mod @@ -0,0 +1,11 @@ +module github.com/googleapis/gnostic + +go 1.12 + +require ( + github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 + github.com/golang/protobuf v1.3.3 + github.com/kr/pretty v0.2.0 // indirect + gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 + gopkg.in/yaml.v2 v2.2.2 +) diff --git a/vendor/github.com/googleapis/gnostic/go.sum b/vendor/github.com/googleapis/gnostic/go.sum new file mode 100644 index 0000000000..ebd798b500 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/go.sum @@ -0,0 +1,17 @@ +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/googleapis/gnostic/jsonwriter/README.md b/vendor/github.com/googleapis/gnostic/jsonwriter/README.md new file mode 100644 index 0000000000..04700dc82a --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/jsonwriter/README.md @@ -0,0 +1,3 @@ +# jsonwriter + +This directory contains code for writing yaml.MapSlice structures as JSON files. diff --git a/vendor/github.com/googleapis/gnostic/jsonwriter/writer.go b/vendor/github.com/googleapis/gnostic/jsonwriter/writer.go new file mode 100644 index 0000000000..c070cd6867 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/jsonwriter/writer.go @@ -0,0 +1,168 @@ +// Copyright 2017 Google Inc. 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 jsonwriter + +import ( + "bytes" + "errors" + "fmt" + "strings" + + "gopkg.in/yaml.v2" +) + +const indentation = " " + +// basic escaping, will need to be improved or replaced +func escape(s string) string { + s = strings.Replace(s, "\n", "\\n", -1) + s = strings.Replace(s, "\"", "\\\"", -1) + return s +} + +type writer struct { + b bytes.Buffer +} + +func (w *writer) bytes() []byte { + return w.b.Bytes() +} + +func (w *writer) writeString(s string) { + w.b.Write([]byte(s)) +} + +func (w *writer) writeMap(info interface{}, indent string) { + w.writeString("{\n") + innerIndent := indent + indentation + switch pairs := info.(type) { + case yaml.MapSlice: + for i, pair := range pairs { + // first print the key + w.writeString(fmt.Sprintf("%s\"%+v\": ", innerIndent, pair.Key)) + // then the value + switch value := pair.Value.(type) { + case string: + w.writeString("\"") + w.writeString(escape(value)) + w.writeString("\"") + case bool: + if value { + w.writeString("true") + } else { + w.writeString("false") + } + case []interface{}: + w.writeArray(value, innerIndent) + case yaml.MapSlice: + w.writeMap(value, innerIndent) + case int: + w.writeString(fmt.Sprintf("%d", value)) + case int64: + w.writeString(fmt.Sprintf("%d", value)) + case []string: + w.writeStringArray(value, innerIndent) + case float64: + w.writeString(fmt.Sprintf("%f", value)) + case []yaml.MapSlice: + w.writeMapSliceArray(value, innerIndent) + default: + w.writeString(fmt.Sprintf("???MapItem(%+v, %T)", value, value)) + } + if i < len(pairs)-1 { + w.writeString(",") + } + w.writeString("\n") + } + default: + // t is some other type that we didn't name. + } + w.writeString(indent) + w.writeString("}") +} + +func (w *writer) writeArray(array []interface{}, indent string) { + w.writeString("[\n") + innerIndent := indent + indentation + for i, item := range array { + w.writeString(innerIndent) + switch item := item.(type) { + case string: + w.writeString("\"") + w.writeString(item) + w.writeString("\"") + case bool: + if item { + w.writeString("true") + } else { + w.writeString("false") + } + case yaml.MapSlice: + w.writeMap(item, innerIndent) + default: + w.writeString(fmt.Sprintf("???ArrayItem(%+v)", item)) + } + if i < len(array)-1 { + w.writeString(",") + } + w.writeString("\n") + } + w.writeString(indent) + w.writeString("]") +} + +func (w *writer) writeStringArray(array []string, indent string) { + w.writeString("[\n") + innerIndent := indent + indentation + for i, item := range array { + w.writeString(innerIndent) + w.writeString("\"") + w.writeString(escape(item)) + w.writeString("\"") + if i < len(array)-1 { + w.writeString(",") + } + w.writeString("\n") + } + w.writeString(indent) + w.writeString("]") +} + +func (w *writer) writeMapSliceArray(array []yaml.MapSlice, indent string) { + w.writeString("[\n") + innerIndent := indent + indentation + for i, item := range array { + w.writeString(innerIndent) + w.writeMap(item, innerIndent) + if i < len(array)-1 { + w.writeString(",") + } + w.writeString("\n") + } + w.writeString(indent) + w.writeString("]") +} + +// Marshal writes a yaml.MapSlice as JSON +func Marshal(in interface{}) (out []byte, err error) { + var w writer + m, ok := in.(yaml.MapSlice) + if !ok { + return nil, errors.New("invalid type passed to Marshal") + } + w.writeMap(m, "") + w.writeString("\n") + return w.bytes(), err +} diff --git a/vendor/github.com/googleapis/gnostic/lib/gnostic.go b/vendor/github.com/googleapis/gnostic/lib/gnostic.go new file mode 100644 index 0000000000..1c2e78f4aa --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/lib/gnostic.go @@ -0,0 +1,612 @@ +// Copyright 2017 Google Inc. 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 lib + +import ( + "bytes" + "errors" + "fmt" + "io" + "os" + "os/exec" + "path/filepath" + "regexp" + "strings" + "time" + + "github.com/golang/protobuf/proto" + openapi_v2 "github.com/googleapis/gnostic/openapiv2" + openapi_v3 "github.com/googleapis/gnostic/openapiv3" + "github.com/googleapis/gnostic/compiler" + discovery_v1 "github.com/googleapis/gnostic/discovery" + "github.com/googleapis/gnostic/jsonwriter" + plugins "github.com/googleapis/gnostic/plugins" + surface "github.com/googleapis/gnostic/surface" + "gopkg.in/yaml.v2" +) + +const ( + // SourceFormatUnknown represents an unrecognized source format + SourceFormatUnknown = 0 + // SourceFormatOpenAPI2 represents an OpenAPI v2 document + SourceFormatOpenAPI2 = 2 + // SourceFormatOpenAPI3 represents an OpenAPI v3 document + SourceFormatOpenAPI3 = 3 + // SourceFormatDiscovery represents a Google Discovery document + SourceFormatDiscovery = 4 +) + +// Determine the version of an OpenAPI description read from JSON or YAML. +func getOpenAPIVersionFromInfo(info interface{}) int { + m, ok := compiler.UnpackMap(info) + if !ok { + return SourceFormatUnknown + } + swagger, ok := compiler.MapValueForKey(m, "swagger").(string) + if ok && strings.HasPrefix(swagger, "2.0") { + return SourceFormatOpenAPI2 + } + openapi, ok := compiler.MapValueForKey(m, "openapi").(string) + if ok && strings.HasPrefix(openapi, "3.0") { + return SourceFormatOpenAPI3 + } + kind, ok := compiler.MapValueForKey(m, "kind").(string) + if ok && kind == "discovery#restDescription" { + return SourceFormatDiscovery + } + return SourceFormatUnknown +} + +const ( + pluginPrefix = "gnostic-" + extensionPrefix = "gnostic-x-" +) + +type pluginCall struct { + Name string + Invocation string +} + +// Invokes a plugin. +func (p *pluginCall) perform(document proto.Message, sourceFormat int, sourceName string, timePlugins bool) ([]*plugins.Message, error) { + if p.Name != "" { + request := &plugins.Request{} + + // Infer the name of the executable by adding the prefix. + executableName := pluginPrefix + p.Name + + // Validate invocation string with regular expression. + invocation := p.Invocation + + // + // Plugin invocations must consist of + // zero or more comma-separated key=value pairs followed by a path. + // If pairs are present, a colon separates them from the path. + // Keys and values must be alphanumeric strings and may contain + // dashes, underscores, periods, or forward slashes. + // A path can contain any characters other than the separators ',', ':', and '='. + // + invocationRegex := regexp.MustCompile(`^([\w-_\/\.]+=[\w-_\/\.]+(,[\w-_\/\.]+=[\w-_\/\.]+)*:)?[^,:=]+$`) + if !invocationRegex.Match([]byte(p.Invocation)) { + return nil, fmt.Errorf("Invalid invocation of %s: %s", executableName, invocation) + } + + invocationParts := strings.Split(p.Invocation, ":") + var outputLocation string + switch len(invocationParts) { + case 1: + outputLocation = invocationParts[0] + case 2: + parameters := strings.Split(invocationParts[0], ",") + for _, keyvalue := range parameters { + pair := strings.Split(keyvalue, "=") + if len(pair) == 2 { + request.Parameters = append(request.Parameters, &plugins.Parameter{Name: pair[0], Value: pair[1]}) + } + } + outputLocation = invocationParts[1] + default: + // badly-formed request + outputLocation = invocationParts[len(invocationParts)-1] + } + + version := &plugins.Version{} + version.Major = 0 + version.Minor = 1 + version.Patch = 0 + request.CompilerVersion = version + + request.OutputPath = outputLocation + + request.SourceName = sourceName + switch sourceFormat { + case SourceFormatOpenAPI2: + request.AddModel("openapi.v2.Document", document) + // include experimental API surface model + surfaceModel, err := surface.NewModelFromOpenAPI2(document.(*openapi_v2.Document), sourceName) + if err == nil { + request.AddModel("surface.v1.Model", surfaceModel) + } + case SourceFormatOpenAPI3: + request.AddModel("openapi.v3.Document", document) + // include experimental API surface model + surfaceModel, err := surface.NewModelFromOpenAPI3(document.(*openapi_v3.Document), sourceName) + if err == nil { + request.AddModel("surface.v1.Model", surfaceModel) + } + case SourceFormatDiscovery: + request.AddModel("discovery.v1.Document", document) + default: + } + + requestBytes, _ := proto.Marshal(request) + + cmd := exec.Command(executableName, "-plugin") + cmd.Stdin = bytes.NewReader(requestBytes) + cmd.Stderr = os.Stderr + pluginStartTime := time.Now() + output, err := cmd.Output() + pluginElapsedTime := time.Since(pluginStartTime) + if timePlugins { + fmt.Printf("> %s (%s)\n", executableName, pluginElapsedTime) + } + if err != nil { + return nil, err + } + response := &plugins.Response{} + err = proto.Unmarshal(output, response) + if err != nil { + // Gnostic expects plugins to only write the + // response message to stdout. Be sure that + // any logging messages are written to stderr only. + return nil, errors.New("invalid plugin response (plugins must write log messages to stderr, not stdout)") + } + + err = plugins.HandleResponse(response, outputLocation) + + return response.Messages, err + } + return nil, nil +} + +func isFile(path string) bool { + fileInfo, err := os.Stat(path) + if err != nil { + return false + } + return !fileInfo.IsDir() +} + +func isDirectory(path string) bool { + fileInfo, err := os.Stat(path) + if err != nil { + return false + } + return fileInfo.IsDir() +} + +// Write bytes to a named file. +// Certain names have special meaning: +// ! writes nothing +// - writes to stdout +// = writes to stderr +// If a directory name is given, the file is written there with +// a name derived from the source and extension arguments. +func writeFile(name string, bytes []byte, source string, extension string) { + var writer io.Writer + if name == "!" { + return + } else if name == "-" { + writer = os.Stdout + } else if name == "=" { + writer = os.Stderr + } else if isDirectory(name) { + base := filepath.Base(source) + // Remove the original source extension. + base = base[0 : len(base)-len(filepath.Ext(base))] + // Build the path that puts the result in the passed-in directory. + filename := name + "/" + base + "." + extension + file, _ := os.Create(filename) + defer file.Close() + writer = file + } else { + file, _ := os.Create(name) + defer file.Close() + writer = file + } + writer.Write(bytes) + if name == "-" || name == "=" { + writer.Write([]byte("\n")) + } +} + +// The Gnostic structure holds global state information for gnostic. +type Gnostic struct { + args []string + usage string + sourceName string + binaryOutputPath string + textOutputPath string + yamlOutputPath string + jsonOutputPath string + errorOutputPath string + messageOutputPath string + resolveReferences bool + pluginCalls []*pluginCall + extensionHandlers []compiler.ExtensionHandler + sourceFormat int + timePlugins bool +} + +// NewGnostic initializes a structure to store global application state. +func NewGnostic(args []string) *Gnostic { + g := &Gnostic{args: args} + // Option fields initialize to their default values. + g.usage = ` +Usage: gnostic SOURCE [OPTIONS] + SOURCE is the filename or URL of an API description. +Options: + --pb-out=PATH Write a binary proto to the specified location. + --text-out=PATH Write a text proto to the specified location. + --json-out=PATH Write a json API description to the specified location. + --yaml-out=PATH Write a yaml API description to the specified location. + --errors-out=PATH Write compilation errors to the specified location. + --messages-out=PATH Write messages generated by plugins to the specified + location. Messages from all plugin invocations are + written to a single common file. + --PLUGIN-out=PATH Run the plugin named gnostic-PLUGIN and write results + to the specified location. + --PLUGIN Run the plugin named gnostic-PLUGIN but don't write any + results. Used for plugins that return messages only. + PLUGIN must not match any other gnostic option. + --x-EXTENSION Use the extension named gnostic-x-EXTENSION + to process OpenAPI specification extensions. + --resolve-refs Explicitly resolve $ref references. + This could have problems with recursive definitions. + --time-plugins Report plugin runtimes. +` + // Initialize internal structures. + g.pluginCalls = make([]*pluginCall, 0) + g.extensionHandlers = make([]compiler.ExtensionHandler, 0) + return g +} + +// Parse command-line options. +func (g *Gnostic) readOptions() error { + // plugin processing matches patterns of the form "--PLUGIN-out=PATH" and "--PLUGIN_out=PATH" + pluginRegex := regexp.MustCompile("--(.+)[-_]out=(.+)") + + // extension processing matches patterns of the form "--x-EXTENSION" + extensionRegex := regexp.MustCompile("--x-(.+)") + + for i, arg := range g.args { + if i == 0 { + continue // skip the tool name + } + var m [][]byte + if m = pluginRegex.FindSubmatch([]byte(arg)); m != nil { + pluginName := string(m[1]) + invocation := string(m[2]) + switch pluginName { + case "pb": + g.binaryOutputPath = invocation + case "text": + g.textOutputPath = invocation + case "json": + g.jsonOutputPath = invocation + case "yaml": + g.yamlOutputPath = invocation + case "errors": + g.errorOutputPath = invocation + case "messages": + g.messageOutputPath = invocation + default: + p := &pluginCall{Name: pluginName, Invocation: invocation} + g.pluginCalls = append(g.pluginCalls, p) + } + } else if m = extensionRegex.FindSubmatch([]byte(arg)); m != nil { + extensionName := string(m[1]) + extensionHandler := compiler.ExtensionHandler{Name: extensionPrefix + extensionName} + g.extensionHandlers = append(g.extensionHandlers, extensionHandler) + } else if arg == "--resolve-refs" { + g.resolveReferences = true + } else if arg == "--time-plugins" { + g.timePlugins = true + } else if arg[0] == '-' && arg[1] == '-' { + // try letting the option specify a plugin with no output files (or unwanted output files) + // this is useful for calling plugins like linters that only return messages + p := &pluginCall{Name: arg[2:len(arg)], Invocation: "!"} + g.pluginCalls = append(g.pluginCalls, p) + } else if arg[0] == '-' { + return fmt.Errorf("unknown option: %s", arg) + } else { + g.sourceName = arg + } + } + return nil +} + +// Validate command-line options. +func (g *Gnostic) validateOptions() error { + if g.binaryOutputPath == "" && + g.textOutputPath == "" && + g.yamlOutputPath == "" && + g.jsonOutputPath == "" && + g.errorOutputPath == "" && + len(g.pluginCalls) == 0 { + return fmt.Errorf("missing output directives") + } + if g.sourceName == "" { + return fmt.Errorf("no input specified") + } + // If we get here and the error output is unspecified, write errors to stderr. + if g.errorOutputPath == "" { + g.errorOutputPath = "=" + } + return nil +} + +// Generate an error message to be written to stderr or a file. +func (g *Gnostic) errorBytes(err error) []byte { + return []byte("Errors reading " + g.sourceName + "\n" + err.Error()) +} + +// Read an OpenAPI description from YAML or JSON. +func (g *Gnostic) readOpenAPIText(bytes []byte) (message proto.Message, err error) { + info, err := compiler.ReadInfoFromBytes(g.sourceName, bytes) + if err != nil { + return nil, err + } + // Determine the OpenAPI version. + g.sourceFormat = getOpenAPIVersionFromInfo(info) + if g.sourceFormat == SourceFormatUnknown { + return nil, errors.New("unable to identify OpenAPI version") + } + // Compile to the proto model. + if g.sourceFormat == SourceFormatOpenAPI2 { + document, err := openapi_v2.NewDocument(info, compiler.NewContextWithExtensions("$root", nil, &g.extensionHandlers)) + if err != nil { + return nil, err + } + message = document + } else if g.sourceFormat == SourceFormatOpenAPI3 { + document, err := openapi_v3.NewDocument(info, compiler.NewContextWithExtensions("$root", nil, &g.extensionHandlers)) + if err != nil { + return nil, err + } + message = document + } else { + document, err := discovery_v1.NewDocument(info, compiler.NewContextWithExtensions("$root", nil, &g.extensionHandlers)) + if err != nil { + return nil, err + } + message = document + } + return message, err +} + +// Read an OpenAPI binary file. +func (g *Gnostic) readOpenAPIBinary(data []byte) (message proto.Message, err error) { + // try to read an OpenAPI v3 document + documentV3 := &openapi_v3.Document{} + err = proto.Unmarshal(data, documentV3) + if err == nil && strings.HasPrefix(documentV3.Openapi, "3.0") { + g.sourceFormat = SourceFormatOpenAPI3 + return documentV3, nil + } + // if that failed, try to read an OpenAPI v2 document + documentV2 := &openapi_v2.Document{} + err = proto.Unmarshal(data, documentV2) + if err == nil && strings.HasPrefix(documentV2.Swagger, "2.0") { + g.sourceFormat = SourceFormatOpenAPI2 + return documentV2, nil + } + // if that failed, try to read a Discovery Format document + discoveryDocument := &discovery_v1.Document{} + err = proto.Unmarshal(data, discoveryDocument) + if err == nil { // && strings.HasPrefix(documentV2.Swagger, "2.0") { + g.sourceFormat = SourceFormatDiscovery + return discoveryDocument, nil + } + return nil, err +} + +// Write a binary pb representation. +func (g *Gnostic) writeBinaryOutput(message proto.Message) error { + protoBytes, err := proto.Marshal(message) + if err != nil { + writeFile(g.errorOutputPath, g.errorBytes(err), g.sourceName, "errors") + } else { + writeFile(g.binaryOutputPath, protoBytes, g.sourceName, "pb") + } + return err +} + +// Write a text pb representation. +func (g *Gnostic) writeTextOutput(message proto.Message) { + bytes := []byte(proto.MarshalTextString(message)) + writeFile(g.textOutputPath, bytes, g.sourceName, "text") +} + +// Write JSON/YAML OpenAPI representations. +func (g *Gnostic) writeJSONYAMLOutput(message proto.Message) { + // Convert the OpenAPI document into an exportable MapSlice. + var rawInfo yaml.MapSlice + var ok bool + var err error + if g.sourceFormat == SourceFormatOpenAPI2 { + document := message.(*openapi_v2.Document) + rawInfo, ok = document.ToRawInfo().(yaml.MapSlice) + if !ok { + rawInfo = nil + } + } else if g.sourceFormat == SourceFormatOpenAPI3 { + document := message.(*openapi_v3.Document) + rawInfo, ok = document.ToRawInfo().(yaml.MapSlice) + if !ok { + rawInfo = nil + } + } else if g.sourceFormat == SourceFormatDiscovery { + document := message.(*discovery_v1.Document) + rawInfo, ok = document.ToRawInfo().(yaml.MapSlice) + if !ok { + rawInfo = nil + } + } + // Optionally write description in yaml format. + if g.yamlOutputPath != "" { + var bytes []byte + if rawInfo != nil { + bytes, err = yaml.Marshal(rawInfo) + if err != nil { + fmt.Fprintf(os.Stderr, "Error generating yaml output %s\n", err.Error()) + } + writeFile(g.yamlOutputPath, bytes, g.sourceName, "yaml") + } else { + fmt.Fprintf(os.Stderr, "No yaml output available.\n") + } + } + // Optionally write description in json format. + if g.jsonOutputPath != "" { + var bytes []byte + if rawInfo != nil { + bytes, _ = jsonwriter.Marshal(rawInfo) + if err != nil { + fmt.Fprintf(os.Stderr, "Error generating json output %s\n", err.Error()) + } + writeFile(g.jsonOutputPath, bytes, g.sourceName, "json") + } else { + fmt.Fprintf(os.Stderr, "No json output available.\n") + } + } +} + +// Write messages. +func (g *Gnostic) writeMessagesOutput(message proto.Message) error { + protoBytes, err := proto.Marshal(message) + if err != nil { + writeFile(g.messageOutputPath, g.errorBytes(err), g.sourceName, "errors") + } else { + writeFile(g.messageOutputPath, protoBytes, g.sourceName, "messages.pb") + } + return err +} + +// Perform all actions specified in the command-line options. +func (g *Gnostic) performActions(message proto.Message) (err error) { + // Optionally resolve internal references. + if g.resolveReferences { + if g.sourceFormat == SourceFormatOpenAPI2 { + document := message.(*openapi_v2.Document) + _, err = document.ResolveReferences(g.sourceName) + } else if g.sourceFormat == SourceFormatOpenAPI3 { + document := message.(*openapi_v3.Document) + _, err = document.ResolveReferences(g.sourceName) + } + if err != nil { + return err + } + } + // Optionally write proto in binary format. + if g.binaryOutputPath != "" { + err = g.writeBinaryOutput(message) + if err != nil { + return err + } + } + // Optionally write proto in text format. + if g.textOutputPath != "" { + g.writeTextOutput(message) + } + // Optionally write document in yaml and/or json formats. + if g.yamlOutputPath != "" || g.jsonOutputPath != "" { + g.writeJSONYAMLOutput(message) + } + // Call all specified plugins. + messages := make([]*plugins.Message, 0) + errors := make([]error, 0) + for _, p := range g.pluginCalls { + pluginMessages, err := p.perform(message, g.sourceFormat, g.sourceName, g.timePlugins) + if err != nil { + // we don't exit or fail here so that we run all plugins even when some have errors + errors = append(errors, err) + } + messages = append(messages, pluginMessages...) + } + if g.messageOutputPath != "" { + err = g.writeMessagesOutput(&plugins.Messages{Messages: messages}) + if err != nil { + return err + } + } else { + // Print any messages from the plugins + if len(messages) > 0 { + for _, message := range messages { + fmt.Printf("%+v\n", message) + } + } + } + return compiler.NewErrorGroupOrNil(errors) +} + +// Main is the main program for Gnostic. +func (g *Gnostic) Main() error { + + compiler.ClearCaches() + + var err error + err = g.readOptions() + if err != nil { + return err + } + err = g.validateOptions() + if err != nil { + return err + } + // Read the OpenAPI source. + bytes, err := compiler.ReadBytesForFile(g.sourceName) + if err != nil { + writeFile(g.errorOutputPath, g.errorBytes(err), g.sourceName, "errors") + return err + } + extension := strings.ToLower(filepath.Ext(g.sourceName)) + var message proto.Message + if extension == ".json" || extension == ".yaml" { + // Try to read the source as JSON/YAML. + message, err = g.readOpenAPIText(bytes) + if err != nil { + writeFile(g.errorOutputPath, g.errorBytes(err), g.sourceName, "errors") + return err + } + } else if extension == ".pb" { + // Try to read the source as a binary protocol buffer. + message, err = g.readOpenAPIBinary(bytes) + if err != nil { + writeFile(g.errorOutputPath, g.errorBytes(err), g.sourceName, "errors") + return err + } + } else { + err = errors.New("unknown file extension. 'json', 'yaml', and 'pb' are accepted") + writeFile(g.errorOutputPath, g.errorBytes(err), g.sourceName, "errors") + return err + } + // Perform actions specified by command options. + err = g.performActions(message) + if err != nil { + writeFile(g.errorOutputPath, g.errorBytes(err), g.sourceName, "errors") + return err + } + return nil +} diff --git a/vendor/github.com/googleapis/gnostic/openapiv3/OpenAPIv3.go b/vendor/github.com/googleapis/gnostic/openapiv3/OpenAPIv3.go new file mode 100644 index 0000000000..5a10bc5403 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/openapiv3/OpenAPIv3.go @@ -0,0 +1,8532 @@ +// Copyright 2017 Google Inc. 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" + "github.com/googleapis/gnostic/compiler" + "gopkg.in/yaml.v2" + "regexp" + "strings" +) + +// 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 interface{}, 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", context)) + if matchingError == nil { + x.Oneof = &AdditionalPropertiesItem_SchemaOrReference{SchemaOrReference: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // bool boolean = 2; + boolValue, ok := in.(bool) + if ok { + x.Oneof = &AdditionalPropertiesItem_Boolean{Boolean: boolValue} + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewAny creates an object of type Any if possible, returning an error if not. +func NewAny(in interface{}, context *compiler.Context) (*Any, error) { + errors := make([]error, 0) + x := &Any{} + bytes, _ := yaml.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 interface{}, 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", 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", 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) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewAnysOrExpressions creates an object of type AnysOrExpressions if possible, returning an error if not. +func NewAnysOrExpressions(in interface{}, context *compiler.Context) (*AnysOrExpressions, error) { + errors := make([]error, 0) + x := &AnysOrExpressions{} + 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 NamedAnyOrExpression additional_properties = 1; + // MAP: AnyOrExpression + x.AdditionalProperties = make([]*NamedAnyOrExpression, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedAnyOrExpression{} + pair.Name = k + var err error + pair.Value, err = NewAnyOrExpression(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewCallback creates an object of type Callback if possible, returning an error if not. +func NewCallback(in interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if true { + pair := &NamedPathItem{} + pair.Name = k + var err error + pair.Value, err = NewPathItem(v, compiler.NewContext(k, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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", 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", 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) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewCallbacksOrReferences creates an object of type CallbacksOrReferences if possible, returning an error if not. +func NewCallbacksOrReferences(in interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedCallbackOrReference{} + pair.Name = k + var err error + pair.Value, err = NewCallbackOrReference(v, compiler.NewContext(k, 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 interface{}, 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", 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", 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", 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", 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", 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", 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", 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", 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 10; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string url = 2; + v2 := compiler.MapValueForKey(m, "url") + if v2 != nil { + x.Url, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for url: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string email = 3; + v3 := compiler.MapValueForKey(m, "email") + if v3 != nil { + x.Email, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for email: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 4; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, context *compiler.Context) (*DefaultType, error) { + errors := make([]error, 0) + x := &DefaultType{} + matched := false + switch in := in.(type) { + case bool: + x.Oneof = &DefaultType_Boolean{Boolean: in} + matched = true + case string: + x.Oneof = &DefaultType_String_{String_: in} + matched = true + case int64: + x.Oneof = &DefaultType_Number{Number: float64(in)} + matched = true + case int32: + x.Oneof = &DefaultType_Number{Number: float64(in)} + matched = true + case int: + x.Oneof = &DefaultType_Number{Number: float64(in)} + matched = true + case float64: + x.Oneof = &DefaultType_Number{Number: in} + matched = true + case float32: + x.Oneof = &DefaultType_Number{Number: float64(in)} + matched = true + } + 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for propertyName: %+v (%T)", v1, 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 3; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for openapi: %+v (%T)", v1, 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", 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 := v3.([]interface{}) + if ok { + for _, item := range a { + y, err := NewServer(item, compiler.NewContext("servers", 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", 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", 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 := v6.([]interface{}) + if ok { + for _, item := range a { + y, err := NewSecurityRequirement(item, compiler.NewContext("security", 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 := v7.([]interface{}) + if ok { + for _, item := range a { + y, err := NewTag(item, compiler.NewContext("tags", 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 9; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for contentType: %+v (%T)", v1, 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // string style = 3; + v3 := compiler.MapValueForKey(m, "style") + if v3 != nil { + x.Style, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for style: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool explode = 4; + v4 := compiler.MapValueForKey(m, "explode") + if v4 != nil { + x.Explode, ok = v4.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for explode: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool allow_reserved = 5; + v5 := compiler.MapValueForKey(m, "allowReserved") + if v5 != nil { + x.AllowReserved, ok = v5.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for allowReserved: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 6; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedEncoding{} + pair.Name = k + var err error + pair.Value, err = NewEncoding(v, compiler.NewContext(k, 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for summary: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 2; + v2 := compiler.MapValueForKey(m, "description") + if v2 != nil { + x.Description, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v2, 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // string external_value = 4; + v4 := compiler.MapValueForKey(m, "externalValue") + if v4 != nil { + x.ExternalValue, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for externalValue: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 5; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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", 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", 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) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewExamplesOrReferences creates an object of type ExamplesOrReferences if possible, returning an error if not. +func NewExamplesOrReferences(in interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedExampleOrReference{} + pair.Name = k + var err error + pair.Value, err = NewExampleOrReference(v, compiler.NewContext(k, 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 interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string url = 2; + v2 := compiler.MapValueForKey(m, "url") + if v2 != nil { + x.Url, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for url: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 3; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool required = 2; + v2 := compiler.MapValueForKey(m, "required") + if v2 != nil { + x.Required, ok = v2.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool deprecated = 3; + v3 := compiler.MapValueForKey(m, "deprecated") + if v3 != nil { + x.Deprecated, ok = v3.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for deprecated: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool allow_empty_value = 4; + v4 := compiler.MapValueForKey(m, "allowEmptyValue") + if v4 != nil { + x.AllowEmptyValue, ok = v4.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for allowEmptyValue: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string style = 5; + v5 := compiler.MapValueForKey(m, "style") + if v5 != nil { + x.Style, ok = v5.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for style: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool explode = 6; + v6 := compiler.MapValueForKey(m, "explode") + if v6 != nil { + x.Explode, ok = v6.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for explode: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool allow_reserved = 7; + v7 := compiler.MapValueForKey(m, "allowReserved") + if v7 != nil { + x.AllowReserved, ok = v7.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for allowReserved: %+v (%T)", v7, 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", 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", 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", 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 12; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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", 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", 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) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewHeadersOrReferences creates an object of type HeadersOrReferences if possible, returning an error if not. +func NewHeadersOrReferences(in interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedHeaderOrReference{} + pair.Name = k + var err error + pair.Value, err = NewHeaderOrReference(v, compiler.NewContext(k, 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for title: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 2; + v2 := compiler.MapValueForKey(m, "description") + if v2 != nil { + x.Description, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string terms_of_service = 3; + v3 := compiler.MapValueForKey(m, "termsOfService") + if v3 != nil { + x.TermsOfService, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for termsOfService: %+v (%T)", v3, 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", 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // string version = 6; + v6 := compiler.MapValueForKey(m, "version") + if v6 != nil { + x.Version, ok = v6.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for version: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string summary = 7; + v7 := compiler.MapValueForKey(m, "summary") + if v7 != nil { + x.Summary, ok = v7.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for summary: %+v (%T)", v7, v7) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 8; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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("", 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string url = 2; + v2 := compiler.MapValueForKey(m, "url") + if v2 != nil { + x.Url, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for url: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 3; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for operationRef: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string operation_id = 2; + v2 := compiler.MapValueForKey(m, "operationId") + if v2 != nil { + x.OperationId, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for operationId: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // AnysOrExpressions parameters = 3; + v3 := compiler.MapValueForKey(m, "parameters") + if v3 != nil { + var err error + x.Parameters, err = NewAnysOrExpressions(v3, compiler.NewContext("parameters", 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // string description = 5; + v5 := compiler.MapValueForKey(m, "description") + if v5 != nil { + x.Description, ok = v5.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v5, 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 7; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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", 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", 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) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewLinksOrReferences creates an object of type LinksOrReferences if possible, returning an error if not. +func NewLinksOrReferences(in interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedLinkOrReference{} + pair.Name = k + var err error + pair.Value, err = NewLinkOrReference(v, compiler.NewContext(k, 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 interface{}, 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", 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", 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", 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 5; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedMediaType{} + pair.Name = k + var err error + pair.Value, err = NewMediaType(v, compiler.NewContext(k, 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, 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", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedAnyOrExpression creates an object of type NamedAnyOrExpression if possible, returning an error if not. +func NewNamedAnyOrExpression(in interface{}, context *compiler.Context) (*NamedAnyOrExpression, error) { + errors := make([]error, 0) + x := &NamedAnyOrExpression{} + 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // AnyOrExpression value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewAnyOrExpression(v2, compiler.NewContext("value", 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, 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", 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, 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", 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, 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", 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, 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", 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, 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", 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, 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", 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, 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", 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, 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", 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, 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", 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, 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", 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, 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", 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, 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", 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, 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", 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + x.Value, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for value: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOauthFlow creates an object of type OauthFlow if possible, returning an error if not. +func NewOauthFlow(in interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for authorizationUrl: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string token_url = 2; + v2 := compiler.MapValueForKey(m, "tokenUrl") + if v2 != nil { + x.TokenUrl, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for tokenUrl: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string refresh_url = 3; + v3 := compiler.MapValueForKey(m, "refreshUrl") + if v3 != nil { + x.RefreshUrl, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for refreshUrl: %+v (%T)", v3, 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 5; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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", 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", 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", 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 5; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 := v1.([]interface{}) + if ok { + x.Tags = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for tags: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string summary = 2; + v2 := compiler.MapValueForKey(m, "summary") + if v2 != nil { + x.Summary, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for summary: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // string operation_id = 5; + v5 := compiler.MapValueForKey(m, "operationId") + if v5 != nil { + x.OperationId, ok = v5.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for operationId: %+v (%T)", v5, 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 := v6.([]interface{}) + if ok { + for _, item := range a { + y, err := NewParameterOrReference(item, compiler.NewContext("parameters", 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", 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", 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // bool deprecated = 10; + v10 := compiler.MapValueForKey(m, "deprecated") + if v10 != nil { + x.Deprecated, ok = v10.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for deprecated: %+v (%T)", v10, 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 := v11.([]interface{}) + if ok { + for _, item := range a { + y, err := NewSecurityRequirement(item, compiler.NewContext("security", 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 := v12.([]interface{}) + if ok { + for _, item := range a { + y, err := NewServer(item, compiler.NewContext("servers", 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string in = 2; + v2 := compiler.MapValueForKey(m, "in") + if v2 != nil { + x.In, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool required = 4; + v4 := compiler.MapValueForKey(m, "required") + if v4 != nil { + x.Required, ok = v4.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool deprecated = 5; + v5 := compiler.MapValueForKey(m, "deprecated") + if v5 != nil { + x.Deprecated, ok = v5.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for deprecated: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool allow_empty_value = 6; + v6 := compiler.MapValueForKey(m, "allowEmptyValue") + if v6 != nil { + x.AllowEmptyValue, ok = v6.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for allowEmptyValue: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string style = 7; + v7 := compiler.MapValueForKey(m, "style") + if v7 != nil { + x.Style, ok = v7.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for style: %+v (%T)", v7, v7) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool explode = 8; + v8 := compiler.MapValueForKey(m, "explode") + if v8 != nil { + x.Explode, ok = v8.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for explode: %+v (%T)", v8, v8) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool allow_reserved = 9; + v9 := compiler.MapValueForKey(m, "allowReserved") + if v9 != nil { + x.AllowReserved, ok = v9.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for allowReserved: %+v (%T)", v9, 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", 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", 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", 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 14; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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", 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", 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) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewParametersOrReferences creates an object of type ParametersOrReferences if possible, returning an error if not. +func NewParametersOrReferences(in interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedParameterOrReference{} + pair.Name = k + var err error + pair.Value, err = NewParameterOrReference(v, compiler.NewContext(k, 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for $ref: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string summary = 2; + v2 := compiler.MapValueForKey(m, "summary") + if v2 != nil { + x.Summary, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for summary: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, 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", 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", 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", 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", 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", 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", 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", 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", 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 := v12.([]interface{}) + if ok { + for _, item := range a { + y, err := NewServer(item, compiler.NewContext("servers", 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 := v13.([]interface{}) + if ok { + for _, item := range a { + y, err := NewParameterOrReference(item, compiler.NewContext("parameters", 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "/") { + pair := &NamedPathItem{} + pair.Name = k + var err error + pair.Value, err = NewPathItem(v, compiler.NewContext(k, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedSchemaOrReference{} + pair.Name = k + var err error + pair.Value, err = NewSchemaOrReference(v, compiler.NewContext(k, 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 interface{}, 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)) + } + allowedKeys := []string{"$ref"} + 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 _ref = 1; + v1 := compiler.MapValueForKey(m, "$ref") + if v1 != nil { + x.XRef, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for $ref: %+v (%T)", v1, v1) + 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 interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedRequestBodyOrReference{} + pair.Name = k + var err error + pair.Value, err = NewRequestBodyOrReference(v, compiler.NewContext(k, 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v1, 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // bool required = 3; + v3 := compiler.MapValueForKey(m, "required") + if v3 != nil { + x.Required, ok = v3.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 4; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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", 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", 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) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResponse creates an object of type Response if possible, returning an error if not. +func NewResponse(in interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v1, 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", 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", 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 5; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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", 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", 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) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResponses creates an object of type Responses if possible, returning an error if not. +func NewResponses(in interface{}, 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", 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if pattern3.MatchString(k) { + pair := &NamedResponseOrReference{} + pair.Name = k + var err error + pair.Value, err = NewResponseOrReference(v, compiler.NewContext(k, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedResponseOrReference{} + pair.Name = k + var err error + pair.Value, err = NewResponseOrReference(v, compiler.NewContext(k, 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 interface{}, 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 = v1.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for nullable: %+v (%T)", v1, 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // bool read_only = 3; + v3 := compiler.MapValueForKey(m, "readOnly") + if v3 != nil { + x.ReadOnly, ok = v3.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for readOnly: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool write_only = 4; + v4 := compiler.MapValueForKey(m, "writeOnly") + if v4 != nil { + x.WriteOnly, ok = v4.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for writeOnly: %+v (%T)", v4, 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", 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", 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // bool deprecated = 8; + v8 := compiler.MapValueForKey(m, "deprecated") + if v8 != nil { + x.Deprecated, ok = v8.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for deprecated: %+v (%T)", v8, v8) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string title = 9; + v9 := compiler.MapValueForKey(m, "title") + if v9 != nil { + x.Title, ok = v9.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for title: %+v (%T)", v9, v9) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float multiple_of = 10; + v10 := compiler.MapValueForKey(m, "multipleOf") + if v10 != nil { + switch v10 := v10.(type) { + case float64: + x.MultipleOf = v10 + case float32: + x.MultipleOf = float64(v10) + case uint64: + x.MultipleOf = float64(v10) + case uint32: + x.MultipleOf = float64(v10) + case int64: + x.MultipleOf = float64(v10) + case int32: + x.MultipleOf = float64(v10) + case int: + x.MultipleOf = float64(v10) + default: + message := fmt.Sprintf("has unexpected value for multipleOf: %+v (%T)", v10, v10) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float maximum = 11; + v11 := compiler.MapValueForKey(m, "maximum") + if v11 != nil { + switch v11 := v11.(type) { + case float64: + x.Maximum = v11 + case float32: + x.Maximum = float64(v11) + case uint64: + x.Maximum = float64(v11) + case uint32: + x.Maximum = float64(v11) + case int64: + x.Maximum = float64(v11) + case int32: + x.Maximum = float64(v11) + case int: + x.Maximum = float64(v11) + default: + message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v11, v11) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_maximum = 12; + v12 := compiler.MapValueForKey(m, "exclusiveMaximum") + if v12 != nil { + x.ExclusiveMaximum, ok = v12.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %+v (%T)", v12, v12) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float minimum = 13; + v13 := compiler.MapValueForKey(m, "minimum") + if v13 != nil { + switch v13 := v13.(type) { + case float64: + x.Minimum = v13 + case float32: + x.Minimum = float64(v13) + case uint64: + x.Minimum = float64(v13) + case uint32: + x.Minimum = float64(v13) + case int64: + x.Minimum = float64(v13) + case int32: + x.Minimum = float64(v13) + case int: + x.Minimum = float64(v13) + default: + message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v13, v13) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_minimum = 14; + v14 := compiler.MapValueForKey(m, "exclusiveMinimum") + if v14 != nil { + x.ExclusiveMinimum, ok = v14.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %+v (%T)", v14, v14) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_length = 15; + v15 := compiler.MapValueForKey(m, "maxLength") + if v15 != nil { + t, ok := v15.(int) + if ok { + x.MaxLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxLength: %+v (%T)", v15, v15) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_length = 16; + v16 := compiler.MapValueForKey(m, "minLength") + if v16 != nil { + t, ok := v16.(int) + if ok { + x.MinLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minLength: %+v (%T)", v16, v16) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 17; + v17 := compiler.MapValueForKey(m, "pattern") + if v17 != nil { + x.Pattern, ok = v17.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v17, v17) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_items = 18; + v18 := compiler.MapValueForKey(m, "maxItems") + if v18 != nil { + t, ok := v18.(int) + if ok { + x.MaxItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxItems: %+v (%T)", v18, v18) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_items = 19; + v19 := compiler.MapValueForKey(m, "minItems") + if v19 != nil { + t, ok := v19.(int) + if ok { + x.MinItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minItems: %+v (%T)", v19, v19) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool unique_items = 20; + v20 := compiler.MapValueForKey(m, "uniqueItems") + if v20 != nil { + x.UniqueItems, ok = v20.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for uniqueItems: %+v (%T)", v20, v20) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_properties = 21; + v21 := compiler.MapValueForKey(m, "maxProperties") + if v21 != nil { + t, ok := v21.(int) + if ok { + x.MaxProperties = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxProperties: %+v (%T)", v21, v21) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_properties = 22; + v22 := compiler.MapValueForKey(m, "minProperties") + if v22 != nil { + t, ok := v22.(int) + if ok { + x.MinProperties = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minProperties: %+v (%T)", v22, v22) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string required = 23; + v23 := compiler.MapValueForKey(m, "required") + if v23 != nil { + v, ok := v23.([]interface{}) + if ok { + x.Required = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v23, 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 := v24.([]interface{}) + if ok { + for _, item := range a { + y, err := NewAny(item, compiler.NewContext("enum", 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 = v25.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v25, 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 := v26.([]interface{}) + if ok { + for _, item := range a { + y, err := NewSchemaOrReference(item, compiler.NewContext("allOf", 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 := v27.([]interface{}) + if ok { + for _, item := range a { + y, err := NewSchemaOrReference(item, compiler.NewContext("oneOf", 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 := v28.([]interface{}) + if ok { + for _, item := range a { + y, err := NewSchemaOrReference(item, compiler.NewContext("anyOf", 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", 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", 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", 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", 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // string description = 34; + v34 := compiler.MapValueForKey(m, "description") + if v34 != nil { + x.Description, ok = v34.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v34, v34) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 35; + v35 := compiler.MapValueForKey(m, "format") + if v35 != nil { + x.Format, ok = v35.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v35, v35) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 36; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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", 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", 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) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSchemasOrReferences creates an object of type SchemasOrReferences if possible, returning an error if not. +func NewSchemasOrReferences(in interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedSchemaOrReference{} + pair.Name = k + var err error + pair.Value, err = NewSchemaOrReference(v, compiler.NewContext(k, 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 interface{}, 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 { + allowedKeys := []string{} + allowedPatterns := []*regexp.Regexp{pattern4} + 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)) + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSecurityScheme creates an object of type SecurityScheme if possible, returning an error if not. +func NewSecurityScheme(in interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 2; + v2 := compiler.MapValueForKey(m, "description") + if v2 != nil { + x.Description, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string name = 3; + v3 := compiler.MapValueForKey(m, "name") + if v3 != nil { + x.Name, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string in = 4; + v4 := compiler.MapValueForKey(m, "in") + if v4 != nil { + x.In, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string scheme = 5; + v5 := compiler.MapValueForKey(m, "scheme") + if v5 != nil { + x.Scheme, ok = v5.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for scheme: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string bearer_format = 6; + v6 := compiler.MapValueForKey(m, "bearerFormat") + if v6 != nil { + x.BearerFormat, ok = v6.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for bearerFormat: %+v (%T)", v6, 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", 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 = v8.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for openIdConnectUrl: %+v (%T)", v8, v8) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 9; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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", 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", 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) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSecuritySchemesOrReferences creates an object of type SecuritySchemesOrReferences if possible, returning an error if not. +func NewSecuritySchemesOrReferences(in interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedSecuritySchemeOrReference{} + pair.Name = k + var err error + pair.Value, err = NewSecuritySchemeOrReference(v, compiler.NewContext(k, 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for url: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 2; + v2 := compiler.MapValueForKey(m, "description") + if v2 != nil { + x.Description, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v2, 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 4; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 := v1.([]interface{}) + if ok { + x.Enum = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for enum: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string default = 2; + v2 := compiler.MapValueForKey(m, "default") + if v2 != nil { + x.Default, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for default: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 4; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedServerVariable{} + pair.Name = k + var err error + pair.Value, err = NewServerVariable(v, compiler.NewContext(k, 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 interface{}, context *compiler.Context) (*SpecificationExtension, error) { + errors := make([]error, 0) + x := &SpecificationExtension{} + matched := false + switch in := in.(type) { + case bool: + x.Oneof = &SpecificationExtension_Boolean{Boolean: in} + matched = true + case string: + x.Oneof = &SpecificationExtension_String_{String_: in} + matched = true + case int64: + x.Oneof = &SpecificationExtension_Number{Number: float64(in)} + matched = true + case int32: + x.Oneof = &SpecificationExtension_Number{Number: float64(in)} + matched = true + case int: + x.Oneof = &SpecificationExtension_Number{Number: float64(in)} + matched = true + case float64: + x.Oneof = &SpecificationExtension_Number{Number: in} + matched = true + case float32: + x.Oneof = &SpecificationExtension_Number{Number: float64(in)} + matched = true + } + 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 interface{}, context *compiler.Context) (*StringArray, error) { + errors := make([]error, 0) + x := &StringArray{} + a, ok := in.([]interface{}) + if !ok { + message := fmt.Sprintf("has unexpected value for StringArray: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + x.Value = make([]string, 0) + for _, s := range a { + x.Value = append(x.Value, s.(string)) + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewStrings creates an object of type Strings if possible, returning an error if not. +func NewStrings(in interface{}, 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 _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedString{} + pair.Name = k + pair.Value = v.(string) + 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 2; + v2 := compiler.MapValueForKey(m, "description") + if v2 != nil { + x.Description, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v2, 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", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 4; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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 interface{}, 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 = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string namespace = 2; + v2 := compiler.MapValueForKey(m, "namespace") + if v2 != nil { + x.Namespace, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for namespace: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string prefix = 3; + v3 := compiler.MapValueForKey(m, "prefix") + if v3 != nil { + x.Prefix, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for prefix: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool attribute = 4; + v4 := compiler.MapValueForKey(m, "attribute") + if v4 != nil { + x.Attribute, ok = v4.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for attribute: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool wrapped = 5; + v5 := compiler.MapValueForKey(m, "wrapped") + if v5 != nil { + x.Wrapped, ok = v5.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for wrapped: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 6; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, 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) (interface{}, 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) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside AnyOrExpression objects. +func (m *AnyOrExpression) ResolveReferences(root string) (interface{}, 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 AnysOrExpressions objects. +func (m *AnysOrExpressions) ResolveReferences(root string) (interface{}, 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 Callback objects. +func (m *Callback) ResolveReferences(root string) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Discriminator objects. +func (m *Discriminator) ResolveReferences(root string) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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 NamedAnyOrExpression objects. +func (m *NamedAnyOrExpression) ResolveReferences(root string) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside OauthFlow objects. +func (m *OauthFlow) ResolveReferences(root string) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, error) { + errors := make([]error, 0) + if m.XRef != "" { + info, err := compiler.ReadInfoForRef(root, m.XRef) + if err != nil { + return nil, err + } + return info, nil + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside RequestBodiesOrReferences objects. +func (m *RequestBodiesOrReferences) ResolveReferences(root string) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside SecurityScheme objects. +func (m *SecurityScheme) ResolveReferences(root string) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, 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) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside StringArray objects. +func (m *StringArray) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Strings objects. +func (m *Strings) ResolveReferences(root string) (interface{}, 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) (interface{}, 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) (interface{}, 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() interface{} { + // 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 v1.Boolean + } + return nil +} + +// ToRawInfo returns a description of Any suitable for JSON or YAML export. +func (m *Any) ToRawInfo() interface{} { + var err error + var info1 []yaml.MapSlice + err = yaml.Unmarshal([]byte(m.Yaml), &info1) + if err == nil { + return info1 + } + var info2 yaml.MapSlice + err = yaml.Unmarshal([]byte(m.Yaml), &info2) + if err == nil { + return info2 + } + var info3 interface{} + err = yaml.Unmarshal([]byte(m.Yaml), &info3) + if err == nil { + return info3 + } + return nil +} + +// ToRawInfo returns a description of AnyOrExpression suitable for JSON or YAML export. +func (m *AnyOrExpression) ToRawInfo() interface{} { + // 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 nil +} + +// ToRawInfo returns a description of AnysOrExpressions suitable for JSON or YAML export. +func (m *AnysOrExpressions) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedAnyOrExpression StringEnumValues:[] MapType:AnyOrExpression Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Callback suitable for JSON or YAML export. +func (m *Callback) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Path != nil { + for _, item := range m.Path { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:Path Type:NamedPathItem StringEnumValues:[] MapType:PathItem Repeated:true Pattern:^ Implicit:true Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of CallbackOrReference suitable for JSON or YAML export. +func (m *CallbackOrReference) ToRawInfo() interface{} { + // 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 nil +} + +// ToRawInfo returns a description of CallbacksOrReferences suitable for JSON or YAML export. +func (m *CallbacksOrReferences) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedCallbackOrReference StringEnumValues:[] MapType:CallbackOrReference Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Components suitable for JSON or YAML export. +func (m *Components) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Schemas != nil { + info = append(info, yaml.MapItem{Key: "schemas", Value: m.Schemas.ToRawInfo()}) + } + // &{Name:schemas Type:SchemasOrReferences StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Responses != nil { + info = append(info, yaml.MapItem{Key: "responses", Value: m.Responses.ToRawInfo()}) + } + // &{Name:responses Type:ResponsesOrReferences StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Parameters != nil { + info = append(info, yaml.MapItem{Key: "parameters", Value: m.Parameters.ToRawInfo()}) + } + // &{Name:parameters Type:ParametersOrReferences StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Examples != nil { + info = append(info, yaml.MapItem{Key: "examples", Value: m.Examples.ToRawInfo()}) + } + // &{Name:examples Type:ExamplesOrReferences StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.RequestBodies != nil { + info = append(info, yaml.MapItem{Key: "requestBodies", Value: m.RequestBodies.ToRawInfo()}) + } + // &{Name:requestBodies Type:RequestBodiesOrReferences StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Headers != nil { + info = append(info, yaml.MapItem{Key: "headers", Value: m.Headers.ToRawInfo()}) + } + // &{Name:headers Type:HeadersOrReferences StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.SecuritySchemes != nil { + info = append(info, yaml.MapItem{Key: "securitySchemes", Value: m.SecuritySchemes.ToRawInfo()}) + } + // &{Name:securitySchemes Type:SecuritySchemesOrReferences StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Links != nil { + info = append(info, yaml.MapItem{Key: "links", Value: m.Links.ToRawInfo()}) + } + // &{Name:links Type:LinksOrReferences StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Callbacks != nil { + info = append(info, yaml.MapItem{Key: "callbacks", Value: m.Callbacks.ToRawInfo()}) + } + // &{Name:callbacks Type:CallbacksOrReferences StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Contact suitable for JSON or YAML export. +func (m *Contact) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + if m.Url != "" { + info = append(info, yaml.MapItem{Key: "url", Value: m.Url}) + } + if m.Email != "" { + info = append(info, yaml.MapItem{Key: "email", Value: m.Email}) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of DefaultType suitable for JSON or YAML export. +func (m *DefaultType) ToRawInfo() interface{} { + // 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 v0.Number + } + // {Name:boolean Type:bool StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if v1, ok := m.GetOneof().(*DefaultType_Boolean); ok { + return v1.Boolean + } + // {Name:string Type:string StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if v2, ok := m.GetOneof().(*DefaultType_String_); ok { + return v2.String_ + } + return nil +} + +// ToRawInfo returns a description of Discriminator suitable for JSON or YAML export. +func (m *Discriminator) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + // always include this required field. + info = append(info, yaml.MapItem{Key: "propertyName", Value: m.PropertyName}) + if m.Mapping != nil { + info = append(info, yaml.MapItem{Key: "mapping", Value: m.Mapping.ToRawInfo()}) + } + // &{Name:mapping Type:Strings StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Document suitable for JSON or YAML export. +func (m *Document) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + // always include this required field. + info = append(info, yaml.MapItem{Key: "openapi", Value: m.Openapi}) + // always include this required field. + info = append(info, yaml.MapItem{Key: "info", Value: m.Info.ToRawInfo()}) + // &{Name:info Type:Info StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if len(m.Servers) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Servers { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "servers", Value: items}) + } + // &{Name:servers Type:Server StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + // always include this required field. + info = append(info, yaml.MapItem{Key: "paths", Value: m.Paths.ToRawInfo()}) + // &{Name:paths Type:Paths StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Components != nil { + info = append(info, yaml.MapItem{Key: "components", Value: m.Components.ToRawInfo()}) + } + // &{Name:components Type:Components StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if len(m.Security) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Security { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "security", Value: items}) + } + // &{Name:security Type:SecurityRequirement StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if len(m.Tags) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Tags { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "tags", Value: items}) + } + // &{Name:tags Type:Tag StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.ExternalDocs != nil { + info = append(info, yaml.MapItem{Key: "externalDocs", Value: m.ExternalDocs.ToRawInfo()}) + } + // &{Name:externalDocs Type:ExternalDocs StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Encoding suitable for JSON or YAML export. +func (m *Encoding) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.ContentType != "" { + info = append(info, yaml.MapItem{Key: "contentType", Value: m.ContentType}) + } + if m.Headers != nil { + info = append(info, yaml.MapItem{Key: "headers", Value: m.Headers.ToRawInfo()}) + } + // &{Name:headers Type:HeadersOrReferences StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Style != "" { + info = append(info, yaml.MapItem{Key: "style", Value: m.Style}) + } + if m.Explode != false { + info = append(info, yaml.MapItem{Key: "explode", Value: m.Explode}) + } + if m.AllowReserved != false { + info = append(info, yaml.MapItem{Key: "allowReserved", Value: m.AllowReserved}) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Encodings suitable for JSON or YAML export. +func (m *Encodings) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedEncoding StringEnumValues:[] MapType:Encoding Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Example suitable for JSON or YAML export. +func (m *Example) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Summary != "" { + info = append(info, yaml.MapItem{Key: "summary", Value: m.Summary}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + // &{Name:value Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.ExternalValue != "" { + info = append(info, yaml.MapItem{Key: "externalValue", Value: m.ExternalValue}) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of ExampleOrReference suitable for JSON or YAML export. +func (m *ExampleOrReference) ToRawInfo() interface{} { + // 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 nil +} + +// ToRawInfo returns a description of ExamplesOrReferences suitable for JSON or YAML export. +func (m *ExamplesOrReferences) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedExampleOrReference StringEnumValues:[] MapType:ExampleOrReference Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Expression suitable for JSON or YAML export. +func (m *Expression) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of ExternalDocs suitable for JSON or YAML export. +func (m *ExternalDocs) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + // always include this required field. + info = append(info, yaml.MapItem{Key: "url", Value: m.Url}) + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Header suitable for JSON or YAML export. +func (m *Header) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Required != false { + info = append(info, yaml.MapItem{Key: "required", Value: m.Required}) + } + if m.Deprecated != false { + info = append(info, yaml.MapItem{Key: "deprecated", Value: m.Deprecated}) + } + if m.AllowEmptyValue != false { + info = append(info, yaml.MapItem{Key: "allowEmptyValue", Value: m.AllowEmptyValue}) + } + if m.Style != "" { + info = append(info, yaml.MapItem{Key: "style", Value: m.Style}) + } + if m.Explode != false { + info = append(info, yaml.MapItem{Key: "explode", Value: m.Explode}) + } + if m.AllowReserved != false { + info = append(info, yaml.MapItem{Key: "allowReserved", Value: m.AllowReserved}) + } + if m.Schema != nil { + info = append(info, yaml.MapItem{Key: "schema", Value: m.Schema.ToRawInfo()}) + } + // &{Name:schema Type:SchemaOrReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Example != nil { + info = append(info, yaml.MapItem{Key: "example", Value: m.Example.ToRawInfo()}) + } + // &{Name:example Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Examples != nil { + info = append(info, yaml.MapItem{Key: "examples", Value: m.Examples.ToRawInfo()}) + } + // &{Name:examples Type:ExamplesOrReferences StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Content != nil { + info = append(info, yaml.MapItem{Key: "content", Value: m.Content.ToRawInfo()}) + } + // &{Name:content Type:MediaTypes StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of HeaderOrReference suitable for JSON or YAML export. +func (m *HeaderOrReference) ToRawInfo() interface{} { + // 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 nil +} + +// ToRawInfo returns a description of HeadersOrReferences suitable for JSON or YAML export. +func (m *HeadersOrReferences) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedHeaderOrReference StringEnumValues:[] MapType:HeaderOrReference Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Info suitable for JSON or YAML export. +func (m *Info) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + // always include this required field. + info = append(info, yaml.MapItem{Key: "title", Value: m.Title}) + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.TermsOfService != "" { + info = append(info, yaml.MapItem{Key: "termsOfService", Value: m.TermsOfService}) + } + if m.Contact != nil { + info = append(info, yaml.MapItem{Key: "contact", Value: m.Contact.ToRawInfo()}) + } + // &{Name:contact Type:Contact StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.License != nil { + info = append(info, yaml.MapItem{Key: "license", Value: m.License.ToRawInfo()}) + } + // &{Name:license Type:License StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + // always include this required field. + info = append(info, yaml.MapItem{Key: "version", Value: m.Version}) + if m.Summary != "" { + info = append(info, yaml.MapItem{Key: "summary", Value: m.Summary}) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of ItemsItem suitable for JSON or YAML export. +func (m *ItemsItem) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if len(m.SchemaOrReference) != 0 { + items := make([]interface{}, 0) + for _, item := range m.SchemaOrReference { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "schemaOrReference", Value: items}) + } + // &{Name:schemaOrReference Type:SchemaOrReference StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + return info +} + +// ToRawInfo returns a description of License suitable for JSON or YAML export. +func (m *License) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + // always include this required field. + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + if m.Url != "" { + info = append(info, yaml.MapItem{Key: "url", Value: m.Url}) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Link suitable for JSON or YAML export. +func (m *Link) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.OperationRef != "" { + info = append(info, yaml.MapItem{Key: "operationRef", Value: m.OperationRef}) + } + if m.OperationId != "" { + info = append(info, yaml.MapItem{Key: "operationId", Value: m.OperationId}) + } + if m.Parameters != nil { + info = append(info, yaml.MapItem{Key: "parameters", Value: m.Parameters.ToRawInfo()}) + } + // &{Name:parameters Type:AnysOrExpressions StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.RequestBody != nil { + info = append(info, yaml.MapItem{Key: "requestBody", Value: m.RequestBody.ToRawInfo()}) + } + // &{Name:requestBody Type:AnyOrExpression StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Server != nil { + info = append(info, yaml.MapItem{Key: "server", Value: m.Server.ToRawInfo()}) + } + // &{Name:server Type:Server StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of LinkOrReference suitable for JSON or YAML export. +func (m *LinkOrReference) ToRawInfo() interface{} { + // 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 nil +} + +// ToRawInfo returns a description of LinksOrReferences suitable for JSON or YAML export. +func (m *LinksOrReferences) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedLinkOrReference StringEnumValues:[] MapType:LinkOrReference Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of MediaType suitable for JSON or YAML export. +func (m *MediaType) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Schema != nil { + info = append(info, yaml.MapItem{Key: "schema", Value: m.Schema.ToRawInfo()}) + } + // &{Name:schema Type:SchemaOrReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Example != nil { + info = append(info, yaml.MapItem{Key: "example", Value: m.Example.ToRawInfo()}) + } + // &{Name:example Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Examples != nil { + info = append(info, yaml.MapItem{Key: "examples", Value: m.Examples.ToRawInfo()}) + } + // &{Name:examples Type:ExamplesOrReferences StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Encoding != nil { + info = append(info, yaml.MapItem{Key: "encoding", Value: m.Encoding.ToRawInfo()}) + } + // &{Name:encoding Type:Encodings StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of MediaTypes suitable for JSON or YAML export. +func (m *MediaTypes) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedMediaType StringEnumValues:[] MapType:MediaType Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of NamedAny suitable for JSON or YAML export. +func (m *NamedAny) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + // &{Name:value Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedAnyOrExpression suitable for JSON or YAML export. +func (m *NamedAnyOrExpression) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + // &{Name:value Type:AnyOrExpression StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedCallbackOrReference suitable for JSON or YAML export. +func (m *NamedCallbackOrReference) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: 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() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: 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() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: 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() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: 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() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: 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() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: 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() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: 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() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: 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() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: 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() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: 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() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: 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() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: 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() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: 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() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + if m.Value != "" { + info = append(info, yaml.MapItem{Key: "value", Value: m.Value}) + } + return info +} + +// ToRawInfo returns a description of OauthFlow suitable for JSON or YAML export. +func (m *OauthFlow) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AuthorizationUrl != "" { + info = append(info, yaml.MapItem{Key: "authorizationUrl", Value: m.AuthorizationUrl}) + } + if m.TokenUrl != "" { + info = append(info, yaml.MapItem{Key: "tokenUrl", Value: m.TokenUrl}) + } + if m.RefreshUrl != "" { + info = append(info, yaml.MapItem{Key: "refreshUrl", Value: m.RefreshUrl}) + } + if m.Scopes != nil { + info = append(info, yaml.MapItem{Key: "scopes", Value: m.Scopes.ToRawInfo()}) + } + // &{Name:scopes Type:Strings StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of OauthFlows suitable for JSON or YAML export. +func (m *OauthFlows) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Implicit != nil { + info = append(info, yaml.MapItem{Key: "implicit", Value: m.Implicit.ToRawInfo()}) + } + // &{Name:implicit Type:OauthFlow StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Password != nil { + info = append(info, yaml.MapItem{Key: "password", Value: m.Password.ToRawInfo()}) + } + // &{Name:password Type:OauthFlow StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.ClientCredentials != nil { + info = append(info, yaml.MapItem{Key: "clientCredentials", Value: m.ClientCredentials.ToRawInfo()}) + } + // &{Name:clientCredentials Type:OauthFlow StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.AuthorizationCode != nil { + info = append(info, yaml.MapItem{Key: "authorizationCode", Value: m.AuthorizationCode.ToRawInfo()}) + } + // &{Name:authorizationCode Type:OauthFlow StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Object suitable for JSON or YAML export. +func (m *Object) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Operation suitable for JSON or YAML export. +func (m *Operation) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if len(m.Tags) != 0 { + info = append(info, yaml.MapItem{Key: "tags", Value: m.Tags}) + } + if m.Summary != "" { + info = append(info, yaml.MapItem{Key: "summary", Value: m.Summary}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.ExternalDocs != nil { + info = append(info, yaml.MapItem{Key: "externalDocs", Value: m.ExternalDocs.ToRawInfo()}) + } + // &{Name:externalDocs Type:ExternalDocs StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.OperationId != "" { + info = append(info, yaml.MapItem{Key: "operationId", Value: m.OperationId}) + } + if len(m.Parameters) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Parameters { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "parameters", Value: items}) + } + // &{Name:parameters Type:ParameterOrReference StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.RequestBody != nil { + info = append(info, yaml.MapItem{Key: "requestBody", Value: m.RequestBody.ToRawInfo()}) + } + // &{Name:requestBody Type:RequestBodyOrReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + // always include this required field. + info = append(info, yaml.MapItem{Key: "responses", Value: m.Responses.ToRawInfo()}) + // &{Name:responses Type:Responses StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Callbacks != nil { + info = append(info, yaml.MapItem{Key: "callbacks", Value: m.Callbacks.ToRawInfo()}) + } + // &{Name:callbacks Type:CallbacksOrReferences StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Deprecated != false { + info = append(info, yaml.MapItem{Key: "deprecated", Value: m.Deprecated}) + } + if len(m.Security) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Security { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "security", Value: items}) + } + // &{Name:security Type:SecurityRequirement StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if len(m.Servers) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Servers { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "servers", Value: items}) + } + // &{Name:servers Type:Server StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Parameter suitable for JSON or YAML export. +func (m *Parameter) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + // always include this required field. + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + // always include this required field. + info = append(info, yaml.MapItem{Key: "in", Value: m.In}) + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Required != false { + info = append(info, yaml.MapItem{Key: "required", Value: m.Required}) + } + if m.Deprecated != false { + info = append(info, yaml.MapItem{Key: "deprecated", Value: m.Deprecated}) + } + if m.AllowEmptyValue != false { + info = append(info, yaml.MapItem{Key: "allowEmptyValue", Value: m.AllowEmptyValue}) + } + if m.Style != "" { + info = append(info, yaml.MapItem{Key: "style", Value: m.Style}) + } + if m.Explode != false { + info = append(info, yaml.MapItem{Key: "explode", Value: m.Explode}) + } + if m.AllowReserved != false { + info = append(info, yaml.MapItem{Key: "allowReserved", Value: m.AllowReserved}) + } + if m.Schema != nil { + info = append(info, yaml.MapItem{Key: "schema", Value: m.Schema.ToRawInfo()}) + } + // &{Name:schema Type:SchemaOrReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Example != nil { + info = append(info, yaml.MapItem{Key: "example", Value: m.Example.ToRawInfo()}) + } + // &{Name:example Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Examples != nil { + info = append(info, yaml.MapItem{Key: "examples", Value: m.Examples.ToRawInfo()}) + } + // &{Name:examples Type:ExamplesOrReferences StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Content != nil { + info = append(info, yaml.MapItem{Key: "content", Value: m.Content.ToRawInfo()}) + } + // &{Name:content Type:MediaTypes StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of ParameterOrReference suitable for JSON or YAML export. +func (m *ParameterOrReference) ToRawInfo() interface{} { + // 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 nil +} + +// ToRawInfo returns a description of ParametersOrReferences suitable for JSON or YAML export. +func (m *ParametersOrReferences) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedParameterOrReference StringEnumValues:[] MapType:ParameterOrReference Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of PathItem suitable for JSON or YAML export. +func (m *PathItem) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.XRef != "" { + info = append(info, yaml.MapItem{Key: "$ref", Value: m.XRef}) + } + if m.Summary != "" { + info = append(info, yaml.MapItem{Key: "summary", Value: m.Summary}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Get != nil { + info = append(info, yaml.MapItem{Key: "get", Value: m.Get.ToRawInfo()}) + } + // &{Name:get Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Put != nil { + info = append(info, yaml.MapItem{Key: "put", Value: m.Put.ToRawInfo()}) + } + // &{Name:put Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Post != nil { + info = append(info, yaml.MapItem{Key: "post", Value: m.Post.ToRawInfo()}) + } + // &{Name:post Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Delete != nil { + info = append(info, yaml.MapItem{Key: "delete", Value: m.Delete.ToRawInfo()}) + } + // &{Name:delete Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Options != nil { + info = append(info, yaml.MapItem{Key: "options", Value: m.Options.ToRawInfo()}) + } + // &{Name:options Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Head != nil { + info = append(info, yaml.MapItem{Key: "head", Value: m.Head.ToRawInfo()}) + } + // &{Name:head Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Patch != nil { + info = append(info, yaml.MapItem{Key: "patch", Value: m.Patch.ToRawInfo()}) + } + // &{Name:patch Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Trace != nil { + info = append(info, yaml.MapItem{Key: "trace", Value: m.Trace.ToRawInfo()}) + } + // &{Name:trace Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if len(m.Servers) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Servers { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "servers", Value: items}) + } + // &{Name:servers Type:Server StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if len(m.Parameters) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Parameters { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "parameters", Value: items}) + } + // &{Name:parameters Type:ParameterOrReference StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Paths suitable for JSON or YAML export. +func (m *Paths) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Path != nil { + for _, item := range m.Path { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:Path Type:NamedPathItem StringEnumValues:[] MapType:PathItem Repeated:true Pattern:^/ Implicit:true Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Properties suitable for JSON or YAML export. +func (m *Properties) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedSchemaOrReference StringEnumValues:[] MapType:SchemaOrReference Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Reference suitable for JSON or YAML export. +func (m *Reference) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + // always include this required field. + info = append(info, yaml.MapItem{Key: "$ref", Value: m.XRef}) + return info +} + +// ToRawInfo returns a description of RequestBodiesOrReferences suitable for JSON or YAML export. +func (m *RequestBodiesOrReferences) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedRequestBodyOrReference StringEnumValues:[] MapType:RequestBodyOrReference Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of RequestBody suitable for JSON or YAML export. +func (m *RequestBody) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + // always include this required field. + info = append(info, yaml.MapItem{Key: "content", Value: m.Content.ToRawInfo()}) + // &{Name:content Type:MediaTypes StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Required != false { + info = append(info, yaml.MapItem{Key: "required", Value: m.Required}) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of RequestBodyOrReference suitable for JSON or YAML export. +func (m *RequestBodyOrReference) ToRawInfo() interface{} { + // 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 nil +} + +// ToRawInfo returns a description of Response suitable for JSON or YAML export. +func (m *Response) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + // always include this required field. + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + if m.Headers != nil { + info = append(info, yaml.MapItem{Key: "headers", Value: m.Headers.ToRawInfo()}) + } + // &{Name:headers Type:HeadersOrReferences StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Content != nil { + info = append(info, yaml.MapItem{Key: "content", Value: m.Content.ToRawInfo()}) + } + // &{Name:content Type:MediaTypes StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Links != nil { + info = append(info, yaml.MapItem{Key: "links", Value: m.Links.ToRawInfo()}) + } + // &{Name:links Type:LinksOrReferences StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of ResponseOrReference suitable for JSON or YAML export. +func (m *ResponseOrReference) ToRawInfo() interface{} { + // 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 nil +} + +// ToRawInfo returns a description of Responses suitable for JSON or YAML export. +func (m *Responses) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Default != nil { + info = append(info, yaml.MapItem{Key: "default", Value: m.Default.ToRawInfo()}) + } + // &{Name:default Type:ResponseOrReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.ResponseOrReference != nil { + for _, item := range m.ResponseOrReference { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:ResponseOrReference Type:NamedResponseOrReference StringEnumValues:[] MapType:ResponseOrReference Repeated:true Pattern:^([0-9X]{3})$ Implicit:true Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of ResponsesOrReferences suitable for JSON or YAML export. +func (m *ResponsesOrReferences) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedResponseOrReference StringEnumValues:[] MapType:ResponseOrReference Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Schema suitable for JSON or YAML export. +func (m *Schema) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Nullable != false { + info = append(info, yaml.MapItem{Key: "nullable", Value: m.Nullable}) + } + if m.Discriminator != nil { + info = append(info, yaml.MapItem{Key: "discriminator", Value: m.Discriminator.ToRawInfo()}) + } + // &{Name:discriminator Type:Discriminator StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.ReadOnly != false { + info = append(info, yaml.MapItem{Key: "readOnly", Value: m.ReadOnly}) + } + if m.WriteOnly != false { + info = append(info, yaml.MapItem{Key: "writeOnly", Value: m.WriteOnly}) + } + if m.Xml != nil { + info = append(info, yaml.MapItem{Key: "xml", Value: m.Xml.ToRawInfo()}) + } + // &{Name:xml Type:Xml StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.ExternalDocs != nil { + info = append(info, yaml.MapItem{Key: "externalDocs", Value: m.ExternalDocs.ToRawInfo()}) + } + // &{Name:externalDocs Type:ExternalDocs StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Example != nil { + info = append(info, yaml.MapItem{Key: "example", Value: m.Example.ToRawInfo()}) + } + // &{Name:example Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Deprecated != false { + info = append(info, yaml.MapItem{Key: "deprecated", Value: m.Deprecated}) + } + if m.Title != "" { + info = append(info, yaml.MapItem{Key: "title", Value: m.Title}) + } + if m.MultipleOf != 0.0 { + info = append(info, yaml.MapItem{Key: "multipleOf", Value: m.MultipleOf}) + } + if m.Maximum != 0.0 { + info = append(info, yaml.MapItem{Key: "maximum", Value: m.Maximum}) + } + if m.ExclusiveMaximum != false { + info = append(info, yaml.MapItem{Key: "exclusiveMaximum", Value: m.ExclusiveMaximum}) + } + if m.Minimum != 0.0 { + info = append(info, yaml.MapItem{Key: "minimum", Value: m.Minimum}) + } + if m.ExclusiveMinimum != false { + info = append(info, yaml.MapItem{Key: "exclusiveMinimum", Value: m.ExclusiveMinimum}) + } + if m.MaxLength != 0 { + info = append(info, yaml.MapItem{Key: "maxLength", Value: m.MaxLength}) + } + if m.MinLength != 0 { + info = append(info, yaml.MapItem{Key: "minLength", Value: m.MinLength}) + } + if m.Pattern != "" { + info = append(info, yaml.MapItem{Key: "pattern", Value: m.Pattern}) + } + if m.MaxItems != 0 { + info = append(info, yaml.MapItem{Key: "maxItems", Value: m.MaxItems}) + } + if m.MinItems != 0 { + info = append(info, yaml.MapItem{Key: "minItems", Value: m.MinItems}) + } + if m.UniqueItems != false { + info = append(info, yaml.MapItem{Key: "uniqueItems", Value: m.UniqueItems}) + } + if m.MaxProperties != 0 { + info = append(info, yaml.MapItem{Key: "maxProperties", Value: m.MaxProperties}) + } + if m.MinProperties != 0 { + info = append(info, yaml.MapItem{Key: "minProperties", Value: m.MinProperties}) + } + if len(m.Required) != 0 { + info = append(info, yaml.MapItem{Key: "required", Value: m.Required}) + } + if len(m.Enum) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Enum { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "enum", Value: items}) + } + // &{Name:enum Type:Any StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.Type != "" { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + } + if len(m.AllOf) != 0 { + items := make([]interface{}, 0) + for _, item := range m.AllOf { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "allOf", Value: items}) + } + // &{Name:allOf Type:SchemaOrReference StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if len(m.OneOf) != 0 { + items := make([]interface{}, 0) + for _, item := range m.OneOf { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "oneOf", Value: items}) + } + // &{Name:oneOf Type:SchemaOrReference StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if len(m.AnyOf) != 0 { + items := make([]interface{}, 0) + for _, item := range m.AnyOf { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "anyOf", Value: items}) + } + // &{Name:anyOf Type:SchemaOrReference StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.Not != nil { + info = append(info, yaml.MapItem{Key: "not", Value: m.Not.ToRawInfo()}) + } + // &{Name:not Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Items != nil { + items := make([]interface{}, 0) + for _, item := range m.Items.SchemaOrReference { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "items", Value: items[0]}) + } + // &{Name:items Type:ItemsItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Properties != nil { + info = append(info, yaml.MapItem{Key: "properties", Value: m.Properties.ToRawInfo()}) + } + // &{Name:properties Type:Properties StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.AdditionalProperties != nil { + info = append(info, yaml.MapItem{Key: "additionalProperties", Value: m.AdditionalProperties.ToRawInfo()}) + } + // &{Name:additionalProperties Type:AdditionalPropertiesItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Default != nil { + info = append(info, yaml.MapItem{Key: "default", Value: m.Default.ToRawInfo()}) + } + // &{Name:default Type:DefaultType StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Format != "" { + info = append(info, yaml.MapItem{Key: "format", Value: m.Format}) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of SchemaOrReference suitable for JSON or YAML export. +func (m *SchemaOrReference) ToRawInfo() interface{} { + // 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 nil +} + +// ToRawInfo returns a description of SchemasOrReferences suitable for JSON or YAML export. +func (m *SchemasOrReferences) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedSchemaOrReference StringEnumValues:[] MapType:SchemaOrReference Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of SecurityRequirement suitable for JSON or YAML export. +func (m *SecurityRequirement) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + return info +} + +// ToRawInfo returns a description of SecurityScheme suitable for JSON or YAML export. +func (m *SecurityScheme) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + // always include this required field. + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + if m.In != "" { + info = append(info, yaml.MapItem{Key: "in", Value: m.In}) + } + if m.Scheme != "" { + info = append(info, yaml.MapItem{Key: "scheme", Value: m.Scheme}) + } + if m.BearerFormat != "" { + info = append(info, yaml.MapItem{Key: "bearerFormat", Value: m.BearerFormat}) + } + if m.Flows != nil { + info = append(info, yaml.MapItem{Key: "flows", Value: m.Flows.ToRawInfo()}) + } + // &{Name:flows Type:OauthFlows StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.OpenIdConnectUrl != "" { + info = append(info, yaml.MapItem{Key: "openIdConnectUrl", Value: m.OpenIdConnectUrl}) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of SecuritySchemeOrReference suitable for JSON or YAML export. +func (m *SecuritySchemeOrReference) ToRawInfo() interface{} { + // 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 nil +} + +// ToRawInfo returns a description of SecuritySchemesOrReferences suitable for JSON or YAML export. +func (m *SecuritySchemesOrReferences) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedSecuritySchemeOrReference StringEnumValues:[] MapType:SecuritySchemeOrReference Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Server suitable for JSON or YAML export. +func (m *Server) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + // always include this required field. + info = append(info, yaml.MapItem{Key: "url", Value: m.Url}) + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Variables != nil { + info = append(info, yaml.MapItem{Key: "variables", Value: m.Variables.ToRawInfo()}) + } + // &{Name:variables Type:ServerVariables StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of ServerVariable suitable for JSON or YAML export. +func (m *ServerVariable) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if len(m.Enum) != 0 { + info = append(info, yaml.MapItem{Key: "enum", Value: m.Enum}) + } + // always include this required field. + info = append(info, yaml.MapItem{Key: "default", Value: m.Default}) + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of ServerVariables suitable for JSON or YAML export. +func (m *ServerVariables) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedServerVariable StringEnumValues:[] MapType:ServerVariable Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of SpecificationExtension suitable for JSON or YAML export. +func (m *SpecificationExtension) ToRawInfo() interface{} { + // 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 v0.Number + } + // {Name:boolean Type:bool StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if v1, ok := m.GetOneof().(*SpecificationExtension_Boolean); ok { + return v1.Boolean + } + // {Name:string Type:string StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if v2, ok := m.GetOneof().(*SpecificationExtension_String_); ok { + return v2.String_ + } + return nil +} + +// ToRawInfo returns a description of StringArray suitable for JSON or YAML export. +func (m *StringArray) ToRawInfo() interface{} { + return m.Value +} + +// ToRawInfo returns a description of Strings suitable for JSON or YAML export. +func (m *Strings) ToRawInfo() interface{} { + info := yaml.MapSlice{} + 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() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + // always include this required field. + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.ExternalDocs != nil { + info = append(info, yaml.MapItem{Key: "externalDocs", Value: m.ExternalDocs.ToRawInfo()}) + } + // &{Name:externalDocs Type:ExternalDocs StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Xml suitable for JSON or YAML export. +func (m *Xml) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m == nil { + return info + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + if m.Namespace != "" { + info = append(info, yaml.MapItem{Key: "namespace", Value: m.Namespace}) + } + if m.Prefix != "" { + info = append(info, yaml.MapItem{Key: "prefix", Value: m.Prefix}) + } + if m.Attribute != false { + info = append(info, yaml.MapItem{Key: "attribute", Value: m.Attribute}) + } + if m.Wrapped != false { + info = append(info, yaml.MapItem{Key: "wrapped", Value: m.Wrapped}) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:SpecificationExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +var ( + pattern0 = regexp.MustCompile("^") + pattern1 = regexp.MustCompile("^x-") + pattern2 = regexp.MustCompile("^/") + pattern3 = regexp.MustCompile("^([0-9X]{3})$") + pattern4 = regexp.MustCompile("^[a-zA-Z0-9\\.\\-_]+$") +) diff --git a/vendor/github.com/googleapis/gnostic/openapiv3/OpenAPIv3.pb.go b/vendor/github.com/googleapis/gnostic/openapiv3/OpenAPIv3.pb.go new file mode 100644 index 0000000000..6e936d2a67 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/openapiv3/OpenAPIv3.pb.go @@ -0,0 +1,5597 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: openapiv3/OpenAPIv3.proto + +package openapi_v3 + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + any "github.com/golang/protobuf/ptypes/any" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type AdditionalPropertiesItem struct { + // Types that are valid to be assigned to Oneof: + // *AdditionalPropertiesItem_SchemaOrReference + // *AdditionalPropertiesItem_Boolean + Oneof isAdditionalPropertiesItem_Oneof `protobuf_oneof:"oneof"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *AdditionalPropertiesItem) Reset() { *m = AdditionalPropertiesItem{} } +func (m *AdditionalPropertiesItem) String() string { return proto.CompactTextString(m) } +func (*AdditionalPropertiesItem) ProtoMessage() {} +func (*AdditionalPropertiesItem) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{0} +} + +func (m *AdditionalPropertiesItem) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_AdditionalPropertiesItem.Unmarshal(m, b) +} +func (m *AdditionalPropertiesItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_AdditionalPropertiesItem.Marshal(b, m, deterministic) +} +func (m *AdditionalPropertiesItem) XXX_Merge(src proto.Message) { + xxx_messageInfo_AdditionalPropertiesItem.Merge(m, src) +} +func (m *AdditionalPropertiesItem) XXX_Size() int { + return xxx_messageInfo_AdditionalPropertiesItem.Size(m) +} +func (m *AdditionalPropertiesItem) XXX_DiscardUnknown() { + xxx_messageInfo_AdditionalPropertiesItem.DiscardUnknown(m) +} + +var xxx_messageInfo_AdditionalPropertiesItem proto.InternalMessageInfo + +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() {} + +func (m *AdditionalPropertiesItem) GetOneof() isAdditionalPropertiesItem_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *AdditionalPropertiesItem) GetSchemaOrReference() *SchemaOrReference { + if x, ok := m.GetOneof().(*AdditionalPropertiesItem_SchemaOrReference); ok { + return x.SchemaOrReference + } + return nil +} + +func (m *AdditionalPropertiesItem) GetBoolean() bool { + if x, ok := m.GetOneof().(*AdditionalPropertiesItem_Boolean); ok { + return x.Boolean + } + return false +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*AdditionalPropertiesItem) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*AdditionalPropertiesItem_SchemaOrReference)(nil), + (*AdditionalPropertiesItem_Boolean)(nil), + } +} + +type Any struct { + Value *any.Any `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + Yaml string `protobuf:"bytes,2,opt,name=yaml,proto3" json:"yaml,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Any) Reset() { *m = Any{} } +func (m *Any) String() string { return proto.CompactTextString(m) } +func (*Any) ProtoMessage() {} +func (*Any) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{1} +} + +func (m *Any) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Any.Unmarshal(m, b) +} +func (m *Any) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Any.Marshal(b, m, deterministic) +} +func (m *Any) XXX_Merge(src proto.Message) { + xxx_messageInfo_Any.Merge(m, src) +} +func (m *Any) XXX_Size() int { + return xxx_messageInfo_Any.Size(m) +} +func (m *Any) XXX_DiscardUnknown() { + xxx_messageInfo_Any.DiscardUnknown(m) +} + +var xxx_messageInfo_Any proto.InternalMessageInfo + +func (m *Any) GetValue() *any.Any { + if m != nil { + return m.Value + } + return nil +} + +func (m *Any) GetYaml() string { + if m != nil { + return m.Yaml + } + return "" +} + +type AnyOrExpression struct { + // Types that are valid to be assigned to Oneof: + // *AnyOrExpression_Any + // *AnyOrExpression_Expression + Oneof isAnyOrExpression_Oneof `protobuf_oneof:"oneof"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *AnyOrExpression) Reset() { *m = AnyOrExpression{} } +func (m *AnyOrExpression) String() string { return proto.CompactTextString(m) } +func (*AnyOrExpression) ProtoMessage() {} +func (*AnyOrExpression) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{2} +} + +func (m *AnyOrExpression) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_AnyOrExpression.Unmarshal(m, b) +} +func (m *AnyOrExpression) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_AnyOrExpression.Marshal(b, m, deterministic) +} +func (m *AnyOrExpression) XXX_Merge(src proto.Message) { + xxx_messageInfo_AnyOrExpression.Merge(m, src) +} +func (m *AnyOrExpression) XXX_Size() int { + return xxx_messageInfo_AnyOrExpression.Size(m) +} +func (m *AnyOrExpression) XXX_DiscardUnknown() { + xxx_messageInfo_AnyOrExpression.DiscardUnknown(m) +} + +var xxx_messageInfo_AnyOrExpression proto.InternalMessageInfo + +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() {} + +func (m *AnyOrExpression) GetOneof() isAnyOrExpression_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *AnyOrExpression) GetAny() *Any { + if x, ok := m.GetOneof().(*AnyOrExpression_Any); ok { + return x.Any + } + return nil +} + +func (m *AnyOrExpression) GetExpression() *Expression { + if x, ok := m.GetOneof().(*AnyOrExpression_Expression); ok { + return x.Expression + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*AnyOrExpression) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*AnyOrExpression_Any)(nil), + (*AnyOrExpression_Expression)(nil), + } +} + +type AnysOrExpressions struct { + AdditionalProperties []*NamedAnyOrExpression `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *AnysOrExpressions) Reset() { *m = AnysOrExpressions{} } +func (m *AnysOrExpressions) String() string { return proto.CompactTextString(m) } +func (*AnysOrExpressions) ProtoMessage() {} +func (*AnysOrExpressions) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{3} +} + +func (m *AnysOrExpressions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_AnysOrExpressions.Unmarshal(m, b) +} +func (m *AnysOrExpressions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_AnysOrExpressions.Marshal(b, m, deterministic) +} +func (m *AnysOrExpressions) XXX_Merge(src proto.Message) { + xxx_messageInfo_AnysOrExpressions.Merge(m, src) +} +func (m *AnysOrExpressions) XXX_Size() int { + return xxx_messageInfo_AnysOrExpressions.Size(m) +} +func (m *AnysOrExpressions) XXX_DiscardUnknown() { + xxx_messageInfo_AnysOrExpressions.DiscardUnknown(m) +} + +var xxx_messageInfo_AnysOrExpressions proto.InternalMessageInfo + +func (m *AnysOrExpressions) GetAdditionalProperties() []*NamedAnyOrExpression { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +// 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 { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Callback) Reset() { *m = Callback{} } +func (m *Callback) String() string { return proto.CompactTextString(m) } +func (*Callback) ProtoMessage() {} +func (*Callback) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{4} +} + +func (m *Callback) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Callback.Unmarshal(m, b) +} +func (m *Callback) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Callback.Marshal(b, m, deterministic) +} +func (m *Callback) XXX_Merge(src proto.Message) { + xxx_messageInfo_Callback.Merge(m, src) +} +func (m *Callback) XXX_Size() int { + return xxx_messageInfo_Callback.Size(m) +} +func (m *Callback) XXX_DiscardUnknown() { + xxx_messageInfo_Callback.DiscardUnknown(m) +} + +var xxx_messageInfo_Callback proto.InternalMessageInfo + +func (m *Callback) GetPath() []*NamedPathItem { + if m != nil { + return m.Path + } + return nil +} + +func (m *Callback) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type CallbackOrReference struct { + // Types that are valid to be assigned to Oneof: + // *CallbackOrReference_Callback + // *CallbackOrReference_Reference + Oneof isCallbackOrReference_Oneof `protobuf_oneof:"oneof"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CallbackOrReference) Reset() { *m = CallbackOrReference{} } +func (m *CallbackOrReference) String() string { return proto.CompactTextString(m) } +func (*CallbackOrReference) ProtoMessage() {} +func (*CallbackOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{5} +} + +func (m *CallbackOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CallbackOrReference.Unmarshal(m, b) +} +func (m *CallbackOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CallbackOrReference.Marshal(b, m, deterministic) +} +func (m *CallbackOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_CallbackOrReference.Merge(m, src) +} +func (m *CallbackOrReference) XXX_Size() int { + return xxx_messageInfo_CallbackOrReference.Size(m) +} +func (m *CallbackOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_CallbackOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_CallbackOrReference proto.InternalMessageInfo + +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() {} + +func (m *CallbackOrReference) GetOneof() isCallbackOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *CallbackOrReference) GetCallback() *Callback { + if x, ok := m.GetOneof().(*CallbackOrReference_Callback); ok { + return x.Callback + } + return nil +} + +func (m *CallbackOrReference) GetReference() *Reference { + if x, ok := m.GetOneof().(*CallbackOrReference_Reference); ok { + return x.Reference + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*CallbackOrReference) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*CallbackOrReference_Callback)(nil), + (*CallbackOrReference_Reference)(nil), + } +} + +type CallbacksOrReferences struct { + AdditionalProperties []*NamedCallbackOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CallbacksOrReferences) Reset() { *m = CallbacksOrReferences{} } +func (m *CallbacksOrReferences) String() string { return proto.CompactTextString(m) } +func (*CallbacksOrReferences) ProtoMessage() {} +func (*CallbacksOrReferences) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{6} +} + +func (m *CallbacksOrReferences) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CallbacksOrReferences.Unmarshal(m, b) +} +func (m *CallbacksOrReferences) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CallbacksOrReferences.Marshal(b, m, deterministic) +} +func (m *CallbacksOrReferences) XXX_Merge(src proto.Message) { + xxx_messageInfo_CallbacksOrReferences.Merge(m, src) +} +func (m *CallbacksOrReferences) XXX_Size() int { + return xxx_messageInfo_CallbacksOrReferences.Size(m) +} +func (m *CallbacksOrReferences) XXX_DiscardUnknown() { + xxx_messageInfo_CallbacksOrReferences.DiscardUnknown(m) +} + +var xxx_messageInfo_CallbacksOrReferences proto.InternalMessageInfo + +func (m *CallbacksOrReferences) GetAdditionalProperties() []*NamedCallbackOrReference { + if m != nil { + return m.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 { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Components) Reset() { *m = Components{} } +func (m *Components) String() string { return proto.CompactTextString(m) } +func (*Components) ProtoMessage() {} +func (*Components) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{7} +} + +func (m *Components) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Components.Unmarshal(m, b) +} +func (m *Components) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Components.Marshal(b, m, deterministic) +} +func (m *Components) XXX_Merge(src proto.Message) { + xxx_messageInfo_Components.Merge(m, src) +} +func (m *Components) XXX_Size() int { + return xxx_messageInfo_Components.Size(m) +} +func (m *Components) XXX_DiscardUnknown() { + xxx_messageInfo_Components.DiscardUnknown(m) +} + +var xxx_messageInfo_Components proto.InternalMessageInfo + +func (m *Components) GetSchemas() *SchemasOrReferences { + if m != nil { + return m.Schemas + } + return nil +} + +func (m *Components) GetResponses() *ResponsesOrReferences { + if m != nil { + return m.Responses + } + return nil +} + +func (m *Components) GetParameters() *ParametersOrReferences { + if m != nil { + return m.Parameters + } + return nil +} + +func (m *Components) GetExamples() *ExamplesOrReferences { + if m != nil { + return m.Examples + } + return nil +} + +func (m *Components) GetRequestBodies() *RequestBodiesOrReferences { + if m != nil { + return m.RequestBodies + } + return nil +} + +func (m *Components) GetHeaders() *HeadersOrReferences { + if m != nil { + return m.Headers + } + return nil +} + +func (m *Components) GetSecuritySchemes() *SecuritySchemesOrReferences { + if m != nil { + return m.SecuritySchemes + } + return nil +} + +func (m *Components) GetLinks() *LinksOrReferences { + if m != nil { + return m.Links + } + return nil +} + +func (m *Components) GetCallbacks() *CallbacksOrReferences { + if m != nil { + return m.Callbacks + } + return nil +} + +func (m *Components) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +// Contact information for the exposed API. +type Contact struct { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Contact) Reset() { *m = Contact{} } +func (m *Contact) String() string { return proto.CompactTextString(m) } +func (*Contact) ProtoMessage() {} +func (*Contact) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{8} +} + +func (m *Contact) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Contact.Unmarshal(m, b) +} +func (m *Contact) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Contact.Marshal(b, m, deterministic) +} +func (m *Contact) XXX_Merge(src proto.Message) { + xxx_messageInfo_Contact.Merge(m, src) +} +func (m *Contact) XXX_Size() int { + return xxx_messageInfo_Contact.Size(m) +} +func (m *Contact) XXX_DiscardUnknown() { + xxx_messageInfo_Contact.DiscardUnknown(m) +} + +var xxx_messageInfo_Contact proto.InternalMessageInfo + +func (m *Contact) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Contact) GetUrl() string { + if m != nil { + return m.Url + } + return "" +} + +func (m *Contact) GetEmail() string { + if m != nil { + return m.Email + } + return "" +} + +func (m *Contact) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type DefaultType struct { + // Types that are valid to be assigned to Oneof: + // *DefaultType_Number + // *DefaultType_Boolean + // *DefaultType_String_ + Oneof isDefaultType_Oneof `protobuf_oneof:"oneof"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DefaultType) Reset() { *m = DefaultType{} } +func (m *DefaultType) String() string { return proto.CompactTextString(m) } +func (*DefaultType) ProtoMessage() {} +func (*DefaultType) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{9} +} + +func (m *DefaultType) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DefaultType.Unmarshal(m, b) +} +func (m *DefaultType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DefaultType.Marshal(b, m, deterministic) +} +func (m *DefaultType) XXX_Merge(src proto.Message) { + xxx_messageInfo_DefaultType.Merge(m, src) +} +func (m *DefaultType) XXX_Size() int { + return xxx_messageInfo_DefaultType.Size(m) +} +func (m *DefaultType) XXX_DiscardUnknown() { + xxx_messageInfo_DefaultType.DiscardUnknown(m) +} + +var xxx_messageInfo_DefaultType proto.InternalMessageInfo + +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() {} + +func (m *DefaultType) GetOneof() isDefaultType_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *DefaultType) GetNumber() float64 { + if x, ok := m.GetOneof().(*DefaultType_Number); ok { + return x.Number + } + return 0 +} + +func (m *DefaultType) GetBoolean() bool { + if x, ok := m.GetOneof().(*DefaultType_Boolean); ok { + return x.Boolean + } + return false +} + +func (m *DefaultType) GetString_() string { + if x, ok := m.GetOneof().(*DefaultType_String_); ok { + return x.String_ + } + return "" +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*DefaultType) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*DefaultType_Number)(nil), + (*DefaultType_Boolean)(nil), + (*DefaultType_String_)(nil), + } +} + +// 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 { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Discriminator) Reset() { *m = Discriminator{} } +func (m *Discriminator) String() string { return proto.CompactTextString(m) } +func (*Discriminator) ProtoMessage() {} +func (*Discriminator) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{10} +} + +func (m *Discriminator) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Discriminator.Unmarshal(m, b) +} +func (m *Discriminator) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Discriminator.Marshal(b, m, deterministic) +} +func (m *Discriminator) XXX_Merge(src proto.Message) { + xxx_messageInfo_Discriminator.Merge(m, src) +} +func (m *Discriminator) XXX_Size() int { + return xxx_messageInfo_Discriminator.Size(m) +} +func (m *Discriminator) XXX_DiscardUnknown() { + xxx_messageInfo_Discriminator.DiscardUnknown(m) +} + +var xxx_messageInfo_Discriminator proto.InternalMessageInfo + +func (m *Discriminator) GetPropertyName() string { + if m != nil { + return m.PropertyName + } + return "" +} + +func (m *Discriminator) GetMapping() *Strings { + if m != nil { + return m.Mapping + } + return nil +} + +func (m *Discriminator) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type Document struct { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Document) Reset() { *m = Document{} } +func (m *Document) String() string { return proto.CompactTextString(m) } +func (*Document) ProtoMessage() {} +func (*Document) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{11} +} + +func (m *Document) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Document.Unmarshal(m, b) +} +func (m *Document) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Document.Marshal(b, m, deterministic) +} +func (m *Document) XXX_Merge(src proto.Message) { + xxx_messageInfo_Document.Merge(m, src) +} +func (m *Document) XXX_Size() int { + return xxx_messageInfo_Document.Size(m) +} +func (m *Document) XXX_DiscardUnknown() { + xxx_messageInfo_Document.DiscardUnknown(m) +} + +var xxx_messageInfo_Document proto.InternalMessageInfo + +func (m *Document) GetOpenapi() string { + if m != nil { + return m.Openapi + } + return "" +} + +func (m *Document) GetInfo() *Info { + if m != nil { + return m.Info + } + return nil +} + +func (m *Document) GetServers() []*Server { + if m != nil { + return m.Servers + } + return nil +} + +func (m *Document) GetPaths() *Paths { + if m != nil { + return m.Paths + } + return nil +} + +func (m *Document) GetComponents() *Components { + if m != nil { + return m.Components + } + return nil +} + +func (m *Document) GetSecurity() []*SecurityRequirement { + if m != nil { + return m.Security + } + return nil +} + +func (m *Document) GetTags() []*Tag { + if m != nil { + return m.Tags + } + return nil +} + +func (m *Document) GetExternalDocs() *ExternalDocs { + if m != nil { + return m.ExternalDocs + } + return nil +} + +func (m *Document) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +// A single encoding definition applied to a single schema property. +type Encoding struct { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Encoding) Reset() { *m = Encoding{} } +func (m *Encoding) String() string { return proto.CompactTextString(m) } +func (*Encoding) ProtoMessage() {} +func (*Encoding) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{12} +} + +func (m *Encoding) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Encoding.Unmarshal(m, b) +} +func (m *Encoding) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Encoding.Marshal(b, m, deterministic) +} +func (m *Encoding) XXX_Merge(src proto.Message) { + xxx_messageInfo_Encoding.Merge(m, src) +} +func (m *Encoding) XXX_Size() int { + return xxx_messageInfo_Encoding.Size(m) +} +func (m *Encoding) XXX_DiscardUnknown() { + xxx_messageInfo_Encoding.DiscardUnknown(m) +} + +var xxx_messageInfo_Encoding proto.InternalMessageInfo + +func (m *Encoding) GetContentType() string { + if m != nil { + return m.ContentType + } + return "" +} + +func (m *Encoding) GetHeaders() *HeadersOrReferences { + if m != nil { + return m.Headers + } + return nil +} + +func (m *Encoding) GetStyle() string { + if m != nil { + return m.Style + } + return "" +} + +func (m *Encoding) GetExplode() bool { + if m != nil { + return m.Explode + } + return false +} + +func (m *Encoding) GetAllowReserved() bool { + if m != nil { + return m.AllowReserved + } + return false +} + +func (m *Encoding) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type Encodings struct { + AdditionalProperties []*NamedEncoding `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Encodings) Reset() { *m = Encodings{} } +func (m *Encodings) String() string { return proto.CompactTextString(m) } +func (*Encodings) ProtoMessage() {} +func (*Encodings) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{13} +} + +func (m *Encodings) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Encodings.Unmarshal(m, b) +} +func (m *Encodings) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Encodings.Marshal(b, m, deterministic) +} +func (m *Encodings) XXX_Merge(src proto.Message) { + xxx_messageInfo_Encodings.Merge(m, src) +} +func (m *Encodings) XXX_Size() int { + return xxx_messageInfo_Encodings.Size(m) +} +func (m *Encodings) XXX_DiscardUnknown() { + xxx_messageInfo_Encodings.DiscardUnknown(m) +} + +var xxx_messageInfo_Encodings proto.InternalMessageInfo + +func (m *Encodings) GetAdditionalProperties() []*NamedEncoding { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +type Example struct { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Example) Reset() { *m = Example{} } +func (m *Example) String() string { return proto.CompactTextString(m) } +func (*Example) ProtoMessage() {} +func (*Example) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{14} +} + +func (m *Example) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Example.Unmarshal(m, b) +} +func (m *Example) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Example.Marshal(b, m, deterministic) +} +func (m *Example) XXX_Merge(src proto.Message) { + xxx_messageInfo_Example.Merge(m, src) +} +func (m *Example) XXX_Size() int { + return xxx_messageInfo_Example.Size(m) +} +func (m *Example) XXX_DiscardUnknown() { + xxx_messageInfo_Example.DiscardUnknown(m) +} + +var xxx_messageInfo_Example proto.InternalMessageInfo + +func (m *Example) GetSummary() string { + if m != nil { + return m.Summary + } + return "" +} + +func (m *Example) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Example) GetValue() *Any { + if m != nil { + return m.Value + } + return nil +} + +func (m *Example) GetExternalValue() string { + if m != nil { + return m.ExternalValue + } + return "" +} + +func (m *Example) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type ExampleOrReference struct { + // Types that are valid to be assigned to Oneof: + // *ExampleOrReference_Example + // *ExampleOrReference_Reference + Oneof isExampleOrReference_Oneof `protobuf_oneof:"oneof"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ExampleOrReference) Reset() { *m = ExampleOrReference{} } +func (m *ExampleOrReference) String() string { return proto.CompactTextString(m) } +func (*ExampleOrReference) ProtoMessage() {} +func (*ExampleOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{15} +} + +func (m *ExampleOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ExampleOrReference.Unmarshal(m, b) +} +func (m *ExampleOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ExampleOrReference.Marshal(b, m, deterministic) +} +func (m *ExampleOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExampleOrReference.Merge(m, src) +} +func (m *ExampleOrReference) XXX_Size() int { + return xxx_messageInfo_ExampleOrReference.Size(m) +} +func (m *ExampleOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_ExampleOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_ExampleOrReference proto.InternalMessageInfo + +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() {} + +func (m *ExampleOrReference) GetOneof() isExampleOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *ExampleOrReference) GetExample() *Example { + if x, ok := m.GetOneof().(*ExampleOrReference_Example); ok { + return x.Example + } + return nil +} + +func (m *ExampleOrReference) GetReference() *Reference { + if x, ok := m.GetOneof().(*ExampleOrReference_Reference); ok { + return x.Reference + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*ExampleOrReference) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*ExampleOrReference_Example)(nil), + (*ExampleOrReference_Reference)(nil), + } +} + +type ExamplesOrReferences struct { + AdditionalProperties []*NamedExampleOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ExamplesOrReferences) Reset() { *m = ExamplesOrReferences{} } +func (m *ExamplesOrReferences) String() string { return proto.CompactTextString(m) } +func (*ExamplesOrReferences) ProtoMessage() {} +func (*ExamplesOrReferences) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{16} +} + +func (m *ExamplesOrReferences) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ExamplesOrReferences.Unmarshal(m, b) +} +func (m *ExamplesOrReferences) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ExamplesOrReferences.Marshal(b, m, deterministic) +} +func (m *ExamplesOrReferences) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExamplesOrReferences.Merge(m, src) +} +func (m *ExamplesOrReferences) XXX_Size() int { + return xxx_messageInfo_ExamplesOrReferences.Size(m) +} +func (m *ExamplesOrReferences) XXX_DiscardUnknown() { + xxx_messageInfo_ExamplesOrReferences.DiscardUnknown(m) +} + +var xxx_messageInfo_ExamplesOrReferences proto.InternalMessageInfo + +func (m *ExamplesOrReferences) GetAdditionalProperties() []*NamedExampleOrReference { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +type Expression struct { + AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Expression) Reset() { *m = Expression{} } +func (m *Expression) String() string { return proto.CompactTextString(m) } +func (*Expression) ProtoMessage() {} +func (*Expression) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{17} +} + +func (m *Expression) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Expression.Unmarshal(m, b) +} +func (m *Expression) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Expression.Marshal(b, m, deterministic) +} +func (m *Expression) XXX_Merge(src proto.Message) { + xxx_messageInfo_Expression.Merge(m, src) +} +func (m *Expression) XXX_Size() int { + return xxx_messageInfo_Expression.Size(m) +} +func (m *Expression) XXX_DiscardUnknown() { + xxx_messageInfo_Expression.DiscardUnknown(m) +} + +var xxx_messageInfo_Expression proto.InternalMessageInfo + +func (m *Expression) GetAdditionalProperties() []*NamedAny { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +// Allows referencing an external resource for extended documentation. +type ExternalDocs struct { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ExternalDocs) Reset() { *m = ExternalDocs{} } +func (m *ExternalDocs) String() string { return proto.CompactTextString(m) } +func (*ExternalDocs) ProtoMessage() {} +func (*ExternalDocs) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{18} +} + +func (m *ExternalDocs) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ExternalDocs.Unmarshal(m, b) +} +func (m *ExternalDocs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ExternalDocs.Marshal(b, m, deterministic) +} +func (m *ExternalDocs) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExternalDocs.Merge(m, src) +} +func (m *ExternalDocs) XXX_Size() int { + return xxx_messageInfo_ExternalDocs.Size(m) +} +func (m *ExternalDocs) XXX_DiscardUnknown() { + xxx_messageInfo_ExternalDocs.DiscardUnknown(m) +} + +var xxx_messageInfo_ExternalDocs proto.InternalMessageInfo + +func (m *ExternalDocs) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *ExternalDocs) GetUrl() string { + if m != nil { + return m.Url + } + return "" +} + +func (m *ExternalDocs) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.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 { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Header) Reset() { *m = Header{} } +func (m *Header) String() string { return proto.CompactTextString(m) } +func (*Header) ProtoMessage() {} +func (*Header) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{19} +} + +func (m *Header) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Header.Unmarshal(m, b) +} +func (m *Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Header.Marshal(b, m, deterministic) +} +func (m *Header) XXX_Merge(src proto.Message) { + xxx_messageInfo_Header.Merge(m, src) +} +func (m *Header) XXX_Size() int { + return xxx_messageInfo_Header.Size(m) +} +func (m *Header) XXX_DiscardUnknown() { + xxx_messageInfo_Header.DiscardUnknown(m) +} + +var xxx_messageInfo_Header proto.InternalMessageInfo + +func (m *Header) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Header) GetRequired() bool { + if m != nil { + return m.Required + } + return false +} + +func (m *Header) GetDeprecated() bool { + if m != nil { + return m.Deprecated + } + return false +} + +func (m *Header) GetAllowEmptyValue() bool { + if m != nil { + return m.AllowEmptyValue + } + return false +} + +func (m *Header) GetStyle() string { + if m != nil { + return m.Style + } + return "" +} + +func (m *Header) GetExplode() bool { + if m != nil { + return m.Explode + } + return false +} + +func (m *Header) GetAllowReserved() bool { + if m != nil { + return m.AllowReserved + } + return false +} + +func (m *Header) GetSchema() *SchemaOrReference { + if m != nil { + return m.Schema + } + return nil +} + +func (m *Header) GetExample() *Any { + if m != nil { + return m.Example + } + return nil +} + +func (m *Header) GetExamples() *ExamplesOrReferences { + if m != nil { + return m.Examples + } + return nil +} + +func (m *Header) GetContent() *MediaTypes { + if m != nil { + return m.Content + } + return nil +} + +func (m *Header) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type HeaderOrReference struct { + // Types that are valid to be assigned to Oneof: + // *HeaderOrReference_Header + // *HeaderOrReference_Reference + Oneof isHeaderOrReference_Oneof `protobuf_oneof:"oneof"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *HeaderOrReference) Reset() { *m = HeaderOrReference{} } +func (m *HeaderOrReference) String() string { return proto.CompactTextString(m) } +func (*HeaderOrReference) ProtoMessage() {} +func (*HeaderOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{20} +} + +func (m *HeaderOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_HeaderOrReference.Unmarshal(m, b) +} +func (m *HeaderOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_HeaderOrReference.Marshal(b, m, deterministic) +} +func (m *HeaderOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_HeaderOrReference.Merge(m, src) +} +func (m *HeaderOrReference) XXX_Size() int { + return xxx_messageInfo_HeaderOrReference.Size(m) +} +func (m *HeaderOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_HeaderOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_HeaderOrReference proto.InternalMessageInfo + +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() {} + +func (m *HeaderOrReference) GetOneof() isHeaderOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *HeaderOrReference) GetHeader() *Header { + if x, ok := m.GetOneof().(*HeaderOrReference_Header); ok { + return x.Header + } + return nil +} + +func (m *HeaderOrReference) GetReference() *Reference { + if x, ok := m.GetOneof().(*HeaderOrReference_Reference); ok { + return x.Reference + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*HeaderOrReference) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*HeaderOrReference_Header)(nil), + (*HeaderOrReference_Reference)(nil), + } +} + +type HeadersOrReferences struct { + AdditionalProperties []*NamedHeaderOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *HeadersOrReferences) Reset() { *m = HeadersOrReferences{} } +func (m *HeadersOrReferences) String() string { return proto.CompactTextString(m) } +func (*HeadersOrReferences) ProtoMessage() {} +func (*HeadersOrReferences) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{21} +} + +func (m *HeadersOrReferences) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_HeadersOrReferences.Unmarshal(m, b) +} +func (m *HeadersOrReferences) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_HeadersOrReferences.Marshal(b, m, deterministic) +} +func (m *HeadersOrReferences) XXX_Merge(src proto.Message) { + xxx_messageInfo_HeadersOrReferences.Merge(m, src) +} +func (m *HeadersOrReferences) XXX_Size() int { + return xxx_messageInfo_HeadersOrReferences.Size(m) +} +func (m *HeadersOrReferences) XXX_DiscardUnknown() { + xxx_messageInfo_HeadersOrReferences.DiscardUnknown(m) +} + +var xxx_messageInfo_HeadersOrReferences proto.InternalMessageInfo + +func (m *HeadersOrReferences) GetAdditionalProperties() []*NamedHeaderOrReference { + if m != nil { + return m.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 { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Info) Reset() { *m = Info{} } +func (m *Info) String() string { return proto.CompactTextString(m) } +func (*Info) ProtoMessage() {} +func (*Info) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{22} +} + +func (m *Info) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Info.Unmarshal(m, b) +} +func (m *Info) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Info.Marshal(b, m, deterministic) +} +func (m *Info) XXX_Merge(src proto.Message) { + xxx_messageInfo_Info.Merge(m, src) +} +func (m *Info) XXX_Size() int { + return xxx_messageInfo_Info.Size(m) +} +func (m *Info) XXX_DiscardUnknown() { + xxx_messageInfo_Info.DiscardUnknown(m) +} + +var xxx_messageInfo_Info proto.InternalMessageInfo + +func (m *Info) GetTitle() string { + if m != nil { + return m.Title + } + return "" +} + +func (m *Info) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Info) GetTermsOfService() string { + if m != nil { + return m.TermsOfService + } + return "" +} + +func (m *Info) GetContact() *Contact { + if m != nil { + return m.Contact + } + return nil +} + +func (m *Info) GetLicense() *License { + if m != nil { + return m.License + } + return nil +} + +func (m *Info) GetVersion() string { + if m != nil { + return m.Version + } + return "" +} + +func (m *Info) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +func (m *Info) GetSummary() string { + if m != nil { + return m.Summary + } + return "" +} + +type ItemsItem struct { + SchemaOrReference []*SchemaOrReference `protobuf:"bytes,1,rep,name=schema_or_reference,json=schemaOrReference,proto3" json:"schema_or_reference,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ItemsItem) Reset() { *m = ItemsItem{} } +func (m *ItemsItem) String() string { return proto.CompactTextString(m) } +func (*ItemsItem) ProtoMessage() {} +func (*ItemsItem) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{23} +} + +func (m *ItemsItem) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ItemsItem.Unmarshal(m, b) +} +func (m *ItemsItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ItemsItem.Marshal(b, m, deterministic) +} +func (m *ItemsItem) XXX_Merge(src proto.Message) { + xxx_messageInfo_ItemsItem.Merge(m, src) +} +func (m *ItemsItem) XXX_Size() int { + return xxx_messageInfo_ItemsItem.Size(m) +} +func (m *ItemsItem) XXX_DiscardUnknown() { + xxx_messageInfo_ItemsItem.DiscardUnknown(m) +} + +var xxx_messageInfo_ItemsItem proto.InternalMessageInfo + +func (m *ItemsItem) GetSchemaOrReference() []*SchemaOrReference { + if m != nil { + return m.SchemaOrReference + } + return nil +} + +// License information for the exposed API. +type License struct { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *License) Reset() { *m = License{} } +func (m *License) String() string { return proto.CompactTextString(m) } +func (*License) ProtoMessage() {} +func (*License) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{24} +} + +func (m *License) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_License.Unmarshal(m, b) +} +func (m *License) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_License.Marshal(b, m, deterministic) +} +func (m *License) XXX_Merge(src proto.Message) { + xxx_messageInfo_License.Merge(m, src) +} +func (m *License) XXX_Size() int { + return xxx_messageInfo_License.Size(m) +} +func (m *License) XXX_DiscardUnknown() { + xxx_messageInfo_License.DiscardUnknown(m) +} + +var xxx_messageInfo_License proto.InternalMessageInfo + +func (m *License) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *License) GetUrl() string { + if m != nil { + return m.Url + } + return "" +} + +func (m *License) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.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 { + 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 *AnysOrExpressions `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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Link) Reset() { *m = Link{} } +func (m *Link) String() string { return proto.CompactTextString(m) } +func (*Link) ProtoMessage() {} +func (*Link) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{25} +} + +func (m *Link) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Link.Unmarshal(m, b) +} +func (m *Link) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Link.Marshal(b, m, deterministic) +} +func (m *Link) XXX_Merge(src proto.Message) { + xxx_messageInfo_Link.Merge(m, src) +} +func (m *Link) XXX_Size() int { + return xxx_messageInfo_Link.Size(m) +} +func (m *Link) XXX_DiscardUnknown() { + xxx_messageInfo_Link.DiscardUnknown(m) +} + +var xxx_messageInfo_Link proto.InternalMessageInfo + +func (m *Link) GetOperationRef() string { + if m != nil { + return m.OperationRef + } + return "" +} + +func (m *Link) GetOperationId() string { + if m != nil { + return m.OperationId + } + return "" +} + +func (m *Link) GetParameters() *AnysOrExpressions { + if m != nil { + return m.Parameters + } + return nil +} + +func (m *Link) GetRequestBody() *AnyOrExpression { + if m != nil { + return m.RequestBody + } + return nil +} + +func (m *Link) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Link) GetServer() *Server { + if m != nil { + return m.Server + } + return nil +} + +func (m *Link) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type LinkOrReference struct { + // Types that are valid to be assigned to Oneof: + // *LinkOrReference_Link + // *LinkOrReference_Reference + Oneof isLinkOrReference_Oneof `protobuf_oneof:"oneof"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *LinkOrReference) Reset() { *m = LinkOrReference{} } +func (m *LinkOrReference) String() string { return proto.CompactTextString(m) } +func (*LinkOrReference) ProtoMessage() {} +func (*LinkOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{26} +} + +func (m *LinkOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_LinkOrReference.Unmarshal(m, b) +} +func (m *LinkOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_LinkOrReference.Marshal(b, m, deterministic) +} +func (m *LinkOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_LinkOrReference.Merge(m, src) +} +func (m *LinkOrReference) XXX_Size() int { + return xxx_messageInfo_LinkOrReference.Size(m) +} +func (m *LinkOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_LinkOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_LinkOrReference proto.InternalMessageInfo + +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() {} + +func (m *LinkOrReference) GetOneof() isLinkOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *LinkOrReference) GetLink() *Link { + if x, ok := m.GetOneof().(*LinkOrReference_Link); ok { + return x.Link + } + return nil +} + +func (m *LinkOrReference) GetReference() *Reference { + if x, ok := m.GetOneof().(*LinkOrReference_Reference); ok { + return x.Reference + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*LinkOrReference) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*LinkOrReference_Link)(nil), + (*LinkOrReference_Reference)(nil), + } +} + +type LinksOrReferences struct { + AdditionalProperties []*NamedLinkOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *LinksOrReferences) Reset() { *m = LinksOrReferences{} } +func (m *LinksOrReferences) String() string { return proto.CompactTextString(m) } +func (*LinksOrReferences) ProtoMessage() {} +func (*LinksOrReferences) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{27} +} + +func (m *LinksOrReferences) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_LinksOrReferences.Unmarshal(m, b) +} +func (m *LinksOrReferences) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_LinksOrReferences.Marshal(b, m, deterministic) +} +func (m *LinksOrReferences) XXX_Merge(src proto.Message) { + xxx_messageInfo_LinksOrReferences.Merge(m, src) +} +func (m *LinksOrReferences) XXX_Size() int { + return xxx_messageInfo_LinksOrReferences.Size(m) +} +func (m *LinksOrReferences) XXX_DiscardUnknown() { + xxx_messageInfo_LinksOrReferences.DiscardUnknown(m) +} + +var xxx_messageInfo_LinksOrReferences proto.InternalMessageInfo + +func (m *LinksOrReferences) GetAdditionalProperties() []*NamedLinkOrReference { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +// Each Media Type Object provides schema and examples for the media type identified by its key. +type MediaType struct { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MediaType) Reset() { *m = MediaType{} } +func (m *MediaType) String() string { return proto.CompactTextString(m) } +func (*MediaType) ProtoMessage() {} +func (*MediaType) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{28} +} + +func (m *MediaType) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MediaType.Unmarshal(m, b) +} +func (m *MediaType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MediaType.Marshal(b, m, deterministic) +} +func (m *MediaType) XXX_Merge(src proto.Message) { + xxx_messageInfo_MediaType.Merge(m, src) +} +func (m *MediaType) XXX_Size() int { + return xxx_messageInfo_MediaType.Size(m) +} +func (m *MediaType) XXX_DiscardUnknown() { + xxx_messageInfo_MediaType.DiscardUnknown(m) +} + +var xxx_messageInfo_MediaType proto.InternalMessageInfo + +func (m *MediaType) GetSchema() *SchemaOrReference { + if m != nil { + return m.Schema + } + return nil +} + +func (m *MediaType) GetExample() *Any { + if m != nil { + return m.Example + } + return nil +} + +func (m *MediaType) GetExamples() *ExamplesOrReferences { + if m != nil { + return m.Examples + } + return nil +} + +func (m *MediaType) GetEncoding() *Encodings { + if m != nil { + return m.Encoding + } + return nil +} + +func (m *MediaType) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type MediaTypes struct { + AdditionalProperties []*NamedMediaType `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MediaTypes) Reset() { *m = MediaTypes{} } +func (m *MediaTypes) String() string { return proto.CompactTextString(m) } +func (*MediaTypes) ProtoMessage() {} +func (*MediaTypes) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{29} +} + +func (m *MediaTypes) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MediaTypes.Unmarshal(m, b) +} +func (m *MediaTypes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MediaTypes.Marshal(b, m, deterministic) +} +func (m *MediaTypes) XXX_Merge(src proto.Message) { + xxx_messageInfo_MediaTypes.Merge(m, src) +} +func (m *MediaTypes) XXX_Size() int { + return xxx_messageInfo_MediaTypes.Size(m) +} +func (m *MediaTypes) XXX_DiscardUnknown() { + xxx_messageInfo_MediaTypes.DiscardUnknown(m) +} + +var xxx_messageInfo_MediaTypes proto.InternalMessageInfo + +func (m *MediaTypes) GetAdditionalProperties() []*NamedMediaType { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +// Automatically-generated message used to represent maps of Any as ordered (name,value) pairs. +type NamedAny struct { + // 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedAny) Reset() { *m = NamedAny{} } +func (m *NamedAny) String() string { return proto.CompactTextString(m) } +func (*NamedAny) ProtoMessage() {} +func (*NamedAny) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{30} +} + +func (m *NamedAny) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedAny.Unmarshal(m, b) +} +func (m *NamedAny) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedAny.Marshal(b, m, deterministic) +} +func (m *NamedAny) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedAny.Merge(m, src) +} +func (m *NamedAny) XXX_Size() int { + return xxx_messageInfo_NamedAny.Size(m) +} +func (m *NamedAny) XXX_DiscardUnknown() { + xxx_messageInfo_NamedAny.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedAny proto.InternalMessageInfo + +func (m *NamedAny) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedAny) GetValue() *Any { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of AnyOrExpression as ordered (name,value) pairs. +type NamedAnyOrExpression struct { + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *AnyOrExpression `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedAnyOrExpression) Reset() { *m = NamedAnyOrExpression{} } +func (m *NamedAnyOrExpression) String() string { return proto.CompactTextString(m) } +func (*NamedAnyOrExpression) ProtoMessage() {} +func (*NamedAnyOrExpression) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{31} +} + +func (m *NamedAnyOrExpression) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedAnyOrExpression.Unmarshal(m, b) +} +func (m *NamedAnyOrExpression) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedAnyOrExpression.Marshal(b, m, deterministic) +} +func (m *NamedAnyOrExpression) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedAnyOrExpression.Merge(m, src) +} +func (m *NamedAnyOrExpression) XXX_Size() int { + return xxx_messageInfo_NamedAnyOrExpression.Size(m) +} +func (m *NamedAnyOrExpression) XXX_DiscardUnknown() { + xxx_messageInfo_NamedAnyOrExpression.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedAnyOrExpression proto.InternalMessageInfo + +func (m *NamedAnyOrExpression) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedAnyOrExpression) GetValue() *AnyOrExpression { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of CallbackOrReference as ordered (name,value) pairs. +type NamedCallbackOrReference struct { + // 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedCallbackOrReference) Reset() { *m = NamedCallbackOrReference{} } +func (m *NamedCallbackOrReference) String() string { return proto.CompactTextString(m) } +func (*NamedCallbackOrReference) ProtoMessage() {} +func (*NamedCallbackOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{32} +} + +func (m *NamedCallbackOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedCallbackOrReference.Unmarshal(m, b) +} +func (m *NamedCallbackOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedCallbackOrReference.Marshal(b, m, deterministic) +} +func (m *NamedCallbackOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedCallbackOrReference.Merge(m, src) +} +func (m *NamedCallbackOrReference) XXX_Size() int { + return xxx_messageInfo_NamedCallbackOrReference.Size(m) +} +func (m *NamedCallbackOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_NamedCallbackOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedCallbackOrReference proto.InternalMessageInfo + +func (m *NamedCallbackOrReference) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedCallbackOrReference) GetValue() *CallbackOrReference { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of Encoding as ordered (name,value) pairs. +type NamedEncoding struct { + // 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedEncoding) Reset() { *m = NamedEncoding{} } +func (m *NamedEncoding) String() string { return proto.CompactTextString(m) } +func (*NamedEncoding) ProtoMessage() {} +func (*NamedEncoding) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{33} +} + +func (m *NamedEncoding) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedEncoding.Unmarshal(m, b) +} +func (m *NamedEncoding) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedEncoding.Marshal(b, m, deterministic) +} +func (m *NamedEncoding) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedEncoding.Merge(m, src) +} +func (m *NamedEncoding) XXX_Size() int { + return xxx_messageInfo_NamedEncoding.Size(m) +} +func (m *NamedEncoding) XXX_DiscardUnknown() { + xxx_messageInfo_NamedEncoding.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedEncoding proto.InternalMessageInfo + +func (m *NamedEncoding) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedEncoding) GetValue() *Encoding { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of ExampleOrReference as ordered (name,value) pairs. +type NamedExampleOrReference struct { + // 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedExampleOrReference) Reset() { *m = NamedExampleOrReference{} } +func (m *NamedExampleOrReference) String() string { return proto.CompactTextString(m) } +func (*NamedExampleOrReference) ProtoMessage() {} +func (*NamedExampleOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{34} +} + +func (m *NamedExampleOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedExampleOrReference.Unmarshal(m, b) +} +func (m *NamedExampleOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedExampleOrReference.Marshal(b, m, deterministic) +} +func (m *NamedExampleOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedExampleOrReference.Merge(m, src) +} +func (m *NamedExampleOrReference) XXX_Size() int { + return xxx_messageInfo_NamedExampleOrReference.Size(m) +} +func (m *NamedExampleOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_NamedExampleOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedExampleOrReference proto.InternalMessageInfo + +func (m *NamedExampleOrReference) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedExampleOrReference) GetValue() *ExampleOrReference { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of HeaderOrReference as ordered (name,value) pairs. +type NamedHeaderOrReference struct { + // 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedHeaderOrReference) Reset() { *m = NamedHeaderOrReference{} } +func (m *NamedHeaderOrReference) String() string { return proto.CompactTextString(m) } +func (*NamedHeaderOrReference) ProtoMessage() {} +func (*NamedHeaderOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{35} +} + +func (m *NamedHeaderOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedHeaderOrReference.Unmarshal(m, b) +} +func (m *NamedHeaderOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedHeaderOrReference.Marshal(b, m, deterministic) +} +func (m *NamedHeaderOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedHeaderOrReference.Merge(m, src) +} +func (m *NamedHeaderOrReference) XXX_Size() int { + return xxx_messageInfo_NamedHeaderOrReference.Size(m) +} +func (m *NamedHeaderOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_NamedHeaderOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedHeaderOrReference proto.InternalMessageInfo + +func (m *NamedHeaderOrReference) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedHeaderOrReference) GetValue() *HeaderOrReference { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of LinkOrReference as ordered (name,value) pairs. +type NamedLinkOrReference struct { + // 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedLinkOrReference) Reset() { *m = NamedLinkOrReference{} } +func (m *NamedLinkOrReference) String() string { return proto.CompactTextString(m) } +func (*NamedLinkOrReference) ProtoMessage() {} +func (*NamedLinkOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{36} +} + +func (m *NamedLinkOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedLinkOrReference.Unmarshal(m, b) +} +func (m *NamedLinkOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedLinkOrReference.Marshal(b, m, deterministic) +} +func (m *NamedLinkOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedLinkOrReference.Merge(m, src) +} +func (m *NamedLinkOrReference) XXX_Size() int { + return xxx_messageInfo_NamedLinkOrReference.Size(m) +} +func (m *NamedLinkOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_NamedLinkOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedLinkOrReference proto.InternalMessageInfo + +func (m *NamedLinkOrReference) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedLinkOrReference) GetValue() *LinkOrReference { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of MediaType as ordered (name,value) pairs. +type NamedMediaType struct { + // 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedMediaType) Reset() { *m = NamedMediaType{} } +func (m *NamedMediaType) String() string { return proto.CompactTextString(m) } +func (*NamedMediaType) ProtoMessage() {} +func (*NamedMediaType) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{37} +} + +func (m *NamedMediaType) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedMediaType.Unmarshal(m, b) +} +func (m *NamedMediaType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedMediaType.Marshal(b, m, deterministic) +} +func (m *NamedMediaType) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedMediaType.Merge(m, src) +} +func (m *NamedMediaType) XXX_Size() int { + return xxx_messageInfo_NamedMediaType.Size(m) +} +func (m *NamedMediaType) XXX_DiscardUnknown() { + xxx_messageInfo_NamedMediaType.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedMediaType proto.InternalMessageInfo + +func (m *NamedMediaType) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedMediaType) GetValue() *MediaType { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of ParameterOrReference as ordered (name,value) pairs. +type NamedParameterOrReference struct { + // 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedParameterOrReference) Reset() { *m = NamedParameterOrReference{} } +func (m *NamedParameterOrReference) String() string { return proto.CompactTextString(m) } +func (*NamedParameterOrReference) ProtoMessage() {} +func (*NamedParameterOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{38} +} + +func (m *NamedParameterOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedParameterOrReference.Unmarshal(m, b) +} +func (m *NamedParameterOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedParameterOrReference.Marshal(b, m, deterministic) +} +func (m *NamedParameterOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedParameterOrReference.Merge(m, src) +} +func (m *NamedParameterOrReference) XXX_Size() int { + return xxx_messageInfo_NamedParameterOrReference.Size(m) +} +func (m *NamedParameterOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_NamedParameterOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedParameterOrReference proto.InternalMessageInfo + +func (m *NamedParameterOrReference) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedParameterOrReference) GetValue() *ParameterOrReference { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of PathItem as ordered (name,value) pairs. +type NamedPathItem struct { + // 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedPathItem) Reset() { *m = NamedPathItem{} } +func (m *NamedPathItem) String() string { return proto.CompactTextString(m) } +func (*NamedPathItem) ProtoMessage() {} +func (*NamedPathItem) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{39} +} + +func (m *NamedPathItem) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedPathItem.Unmarshal(m, b) +} +func (m *NamedPathItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedPathItem.Marshal(b, m, deterministic) +} +func (m *NamedPathItem) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedPathItem.Merge(m, src) +} +func (m *NamedPathItem) XXX_Size() int { + return xxx_messageInfo_NamedPathItem.Size(m) +} +func (m *NamedPathItem) XXX_DiscardUnknown() { + xxx_messageInfo_NamedPathItem.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedPathItem proto.InternalMessageInfo + +func (m *NamedPathItem) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedPathItem) GetValue() *PathItem { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of RequestBodyOrReference as ordered (name,value) pairs. +type NamedRequestBodyOrReference struct { + // 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedRequestBodyOrReference) Reset() { *m = NamedRequestBodyOrReference{} } +func (m *NamedRequestBodyOrReference) String() string { return proto.CompactTextString(m) } +func (*NamedRequestBodyOrReference) ProtoMessage() {} +func (*NamedRequestBodyOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{40} +} + +func (m *NamedRequestBodyOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedRequestBodyOrReference.Unmarshal(m, b) +} +func (m *NamedRequestBodyOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedRequestBodyOrReference.Marshal(b, m, deterministic) +} +func (m *NamedRequestBodyOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedRequestBodyOrReference.Merge(m, src) +} +func (m *NamedRequestBodyOrReference) XXX_Size() int { + return xxx_messageInfo_NamedRequestBodyOrReference.Size(m) +} +func (m *NamedRequestBodyOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_NamedRequestBodyOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedRequestBodyOrReference proto.InternalMessageInfo + +func (m *NamedRequestBodyOrReference) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedRequestBodyOrReference) GetValue() *RequestBodyOrReference { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of ResponseOrReference as ordered (name,value) pairs. +type NamedResponseOrReference struct { + // 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedResponseOrReference) Reset() { *m = NamedResponseOrReference{} } +func (m *NamedResponseOrReference) String() string { return proto.CompactTextString(m) } +func (*NamedResponseOrReference) ProtoMessage() {} +func (*NamedResponseOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{41} +} + +func (m *NamedResponseOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedResponseOrReference.Unmarshal(m, b) +} +func (m *NamedResponseOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedResponseOrReference.Marshal(b, m, deterministic) +} +func (m *NamedResponseOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedResponseOrReference.Merge(m, src) +} +func (m *NamedResponseOrReference) XXX_Size() int { + return xxx_messageInfo_NamedResponseOrReference.Size(m) +} +func (m *NamedResponseOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_NamedResponseOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedResponseOrReference proto.InternalMessageInfo + +func (m *NamedResponseOrReference) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedResponseOrReference) GetValue() *ResponseOrReference { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of SchemaOrReference as ordered (name,value) pairs. +type NamedSchemaOrReference struct { + // 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedSchemaOrReference) Reset() { *m = NamedSchemaOrReference{} } +func (m *NamedSchemaOrReference) String() string { return proto.CompactTextString(m) } +func (*NamedSchemaOrReference) ProtoMessage() {} +func (*NamedSchemaOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{42} +} + +func (m *NamedSchemaOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedSchemaOrReference.Unmarshal(m, b) +} +func (m *NamedSchemaOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedSchemaOrReference.Marshal(b, m, deterministic) +} +func (m *NamedSchemaOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedSchemaOrReference.Merge(m, src) +} +func (m *NamedSchemaOrReference) XXX_Size() int { + return xxx_messageInfo_NamedSchemaOrReference.Size(m) +} +func (m *NamedSchemaOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_NamedSchemaOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedSchemaOrReference proto.InternalMessageInfo + +func (m *NamedSchemaOrReference) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedSchemaOrReference) GetValue() *SchemaOrReference { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of SecuritySchemeOrReference as ordered (name,value) pairs. +type NamedSecuritySchemeOrReference struct { + // 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedSecuritySchemeOrReference) Reset() { *m = NamedSecuritySchemeOrReference{} } +func (m *NamedSecuritySchemeOrReference) String() string { return proto.CompactTextString(m) } +func (*NamedSecuritySchemeOrReference) ProtoMessage() {} +func (*NamedSecuritySchemeOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{43} +} + +func (m *NamedSecuritySchemeOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedSecuritySchemeOrReference.Unmarshal(m, b) +} +func (m *NamedSecuritySchemeOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedSecuritySchemeOrReference.Marshal(b, m, deterministic) +} +func (m *NamedSecuritySchemeOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedSecuritySchemeOrReference.Merge(m, src) +} +func (m *NamedSecuritySchemeOrReference) XXX_Size() int { + return xxx_messageInfo_NamedSecuritySchemeOrReference.Size(m) +} +func (m *NamedSecuritySchemeOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_NamedSecuritySchemeOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedSecuritySchemeOrReference proto.InternalMessageInfo + +func (m *NamedSecuritySchemeOrReference) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedSecuritySchemeOrReference) GetValue() *SecuritySchemeOrReference { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of ServerVariable as ordered (name,value) pairs. +type NamedServerVariable struct { + // 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedServerVariable) Reset() { *m = NamedServerVariable{} } +func (m *NamedServerVariable) String() string { return proto.CompactTextString(m) } +func (*NamedServerVariable) ProtoMessage() {} +func (*NamedServerVariable) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{44} +} + +func (m *NamedServerVariable) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedServerVariable.Unmarshal(m, b) +} +func (m *NamedServerVariable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedServerVariable.Marshal(b, m, deterministic) +} +func (m *NamedServerVariable) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedServerVariable.Merge(m, src) +} +func (m *NamedServerVariable) XXX_Size() int { + return xxx_messageInfo_NamedServerVariable.Size(m) +} +func (m *NamedServerVariable) XXX_DiscardUnknown() { + xxx_messageInfo_NamedServerVariable.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedServerVariable proto.InternalMessageInfo + +func (m *NamedServerVariable) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedServerVariable) GetValue() *ServerVariable { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of string as ordered (name,value) pairs. +type NamedString struct { + // 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedString) Reset() { *m = NamedString{} } +func (m *NamedString) String() string { return proto.CompactTextString(m) } +func (*NamedString) ProtoMessage() {} +func (*NamedString) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{45} +} + +func (m *NamedString) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedString.Unmarshal(m, b) +} +func (m *NamedString) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedString.Marshal(b, m, deterministic) +} +func (m *NamedString) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedString.Merge(m, src) +} +func (m *NamedString) XXX_Size() int { + return xxx_messageInfo_NamedString.Size(m) +} +func (m *NamedString) XXX_DiscardUnknown() { + xxx_messageInfo_NamedString.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedString proto.InternalMessageInfo + +func (m *NamedString) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedString) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// Configuration details for a supported OAuth Flow +type OauthFlow struct { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OauthFlow) Reset() { *m = OauthFlow{} } +func (m *OauthFlow) String() string { return proto.CompactTextString(m) } +func (*OauthFlow) ProtoMessage() {} +func (*OauthFlow) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{46} +} + +func (m *OauthFlow) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OauthFlow.Unmarshal(m, b) +} +func (m *OauthFlow) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OauthFlow.Marshal(b, m, deterministic) +} +func (m *OauthFlow) XXX_Merge(src proto.Message) { + xxx_messageInfo_OauthFlow.Merge(m, src) +} +func (m *OauthFlow) XXX_Size() int { + return xxx_messageInfo_OauthFlow.Size(m) +} +func (m *OauthFlow) XXX_DiscardUnknown() { + xxx_messageInfo_OauthFlow.DiscardUnknown(m) +} + +var xxx_messageInfo_OauthFlow proto.InternalMessageInfo + +func (m *OauthFlow) GetAuthorizationUrl() string { + if m != nil { + return m.AuthorizationUrl + } + return "" +} + +func (m *OauthFlow) GetTokenUrl() string { + if m != nil { + return m.TokenUrl + } + return "" +} + +func (m *OauthFlow) GetRefreshUrl() string { + if m != nil { + return m.RefreshUrl + } + return "" +} + +func (m *OauthFlow) GetScopes() *Strings { + if m != nil { + return m.Scopes + } + return nil +} + +func (m *OauthFlow) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +// Allows configuration of the supported OAuth Flows. +type OauthFlows struct { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OauthFlows) Reset() { *m = OauthFlows{} } +func (m *OauthFlows) String() string { return proto.CompactTextString(m) } +func (*OauthFlows) ProtoMessage() {} +func (*OauthFlows) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{47} +} + +func (m *OauthFlows) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OauthFlows.Unmarshal(m, b) +} +func (m *OauthFlows) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OauthFlows.Marshal(b, m, deterministic) +} +func (m *OauthFlows) XXX_Merge(src proto.Message) { + xxx_messageInfo_OauthFlows.Merge(m, src) +} +func (m *OauthFlows) XXX_Size() int { + return xxx_messageInfo_OauthFlows.Size(m) +} +func (m *OauthFlows) XXX_DiscardUnknown() { + xxx_messageInfo_OauthFlows.DiscardUnknown(m) +} + +var xxx_messageInfo_OauthFlows proto.InternalMessageInfo + +func (m *OauthFlows) GetImplicit() *OauthFlow { + if m != nil { + return m.Implicit + } + return nil +} + +func (m *OauthFlows) GetPassword() *OauthFlow { + if m != nil { + return m.Password + } + return nil +} + +func (m *OauthFlows) GetClientCredentials() *OauthFlow { + if m != nil { + return m.ClientCredentials + } + return nil +} + +func (m *OauthFlows) GetAuthorizationCode() *OauthFlow { + if m != nil { + return m.AuthorizationCode + } + return nil +} + +func (m *OauthFlows) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type Object struct { + AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Object) Reset() { *m = Object{} } +func (m *Object) String() string { return proto.CompactTextString(m) } +func (*Object) ProtoMessage() {} +func (*Object) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{48} +} + +func (m *Object) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Object.Unmarshal(m, b) +} +func (m *Object) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Object.Marshal(b, m, deterministic) +} +func (m *Object) XXX_Merge(src proto.Message) { + xxx_messageInfo_Object.Merge(m, src) +} +func (m *Object) XXX_Size() int { + return xxx_messageInfo_Object.Size(m) +} +func (m *Object) XXX_DiscardUnknown() { + xxx_messageInfo_Object.DiscardUnknown(m) +} + +var xxx_messageInfo_Object proto.InternalMessageInfo + +func (m *Object) GetAdditionalProperties() []*NamedAny { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +// Describes a single API operation on a path. +type Operation struct { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Operation) Reset() { *m = Operation{} } +func (m *Operation) String() string { return proto.CompactTextString(m) } +func (*Operation) ProtoMessage() {} +func (*Operation) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{49} +} + +func (m *Operation) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Operation.Unmarshal(m, b) +} +func (m *Operation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Operation.Marshal(b, m, deterministic) +} +func (m *Operation) XXX_Merge(src proto.Message) { + xxx_messageInfo_Operation.Merge(m, src) +} +func (m *Operation) XXX_Size() int { + return xxx_messageInfo_Operation.Size(m) +} +func (m *Operation) XXX_DiscardUnknown() { + xxx_messageInfo_Operation.DiscardUnknown(m) +} + +var xxx_messageInfo_Operation proto.InternalMessageInfo + +func (m *Operation) GetTags() []string { + if m != nil { + return m.Tags + } + return nil +} + +func (m *Operation) GetSummary() string { + if m != nil { + return m.Summary + } + return "" +} + +func (m *Operation) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Operation) GetExternalDocs() *ExternalDocs { + if m != nil { + return m.ExternalDocs + } + return nil +} + +func (m *Operation) GetOperationId() string { + if m != nil { + return m.OperationId + } + return "" +} + +func (m *Operation) GetParameters() []*ParameterOrReference { + if m != nil { + return m.Parameters + } + return nil +} + +func (m *Operation) GetRequestBody() *RequestBodyOrReference { + if m != nil { + return m.RequestBody + } + return nil +} + +func (m *Operation) GetResponses() *Responses { + if m != nil { + return m.Responses + } + return nil +} + +func (m *Operation) GetCallbacks() *CallbacksOrReferences { + if m != nil { + return m.Callbacks + } + return nil +} + +func (m *Operation) GetDeprecated() bool { + if m != nil { + return m.Deprecated + } + return false +} + +func (m *Operation) GetSecurity() []*SecurityRequirement { + if m != nil { + return m.Security + } + return nil +} + +func (m *Operation) GetServers() []*Server { + if m != nil { + return m.Servers + } + return nil +} + +func (m *Operation) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +// Describes a single operation parameter. A unique parameter is defined by a combination of a name and location. +type Parameter struct { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Parameter) Reset() { *m = Parameter{} } +func (m *Parameter) String() string { return proto.CompactTextString(m) } +func (*Parameter) ProtoMessage() {} +func (*Parameter) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{50} +} + +func (m *Parameter) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Parameter.Unmarshal(m, b) +} +func (m *Parameter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Parameter.Marshal(b, m, deterministic) +} +func (m *Parameter) XXX_Merge(src proto.Message) { + xxx_messageInfo_Parameter.Merge(m, src) +} +func (m *Parameter) XXX_Size() int { + return xxx_messageInfo_Parameter.Size(m) +} +func (m *Parameter) XXX_DiscardUnknown() { + xxx_messageInfo_Parameter.DiscardUnknown(m) +} + +var xxx_messageInfo_Parameter proto.InternalMessageInfo + +func (m *Parameter) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Parameter) GetIn() string { + if m != nil { + return m.In + } + return "" +} + +func (m *Parameter) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Parameter) GetRequired() bool { + if m != nil { + return m.Required + } + return false +} + +func (m *Parameter) GetDeprecated() bool { + if m != nil { + return m.Deprecated + } + return false +} + +func (m *Parameter) GetAllowEmptyValue() bool { + if m != nil { + return m.AllowEmptyValue + } + return false +} + +func (m *Parameter) GetStyle() string { + if m != nil { + return m.Style + } + return "" +} + +func (m *Parameter) GetExplode() bool { + if m != nil { + return m.Explode + } + return false +} + +func (m *Parameter) GetAllowReserved() bool { + if m != nil { + return m.AllowReserved + } + return false +} + +func (m *Parameter) GetSchema() *SchemaOrReference { + if m != nil { + return m.Schema + } + return nil +} + +func (m *Parameter) GetExample() *Any { + if m != nil { + return m.Example + } + return nil +} + +func (m *Parameter) GetExamples() *ExamplesOrReferences { + if m != nil { + return m.Examples + } + return nil +} + +func (m *Parameter) GetContent() *MediaTypes { + if m != nil { + return m.Content + } + return nil +} + +func (m *Parameter) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type ParameterOrReference struct { + // Types that are valid to be assigned to Oneof: + // *ParameterOrReference_Parameter + // *ParameterOrReference_Reference + Oneof isParameterOrReference_Oneof `protobuf_oneof:"oneof"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ParameterOrReference) Reset() { *m = ParameterOrReference{} } +func (m *ParameterOrReference) String() string { return proto.CompactTextString(m) } +func (*ParameterOrReference) ProtoMessage() {} +func (*ParameterOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{51} +} + +func (m *ParameterOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ParameterOrReference.Unmarshal(m, b) +} +func (m *ParameterOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ParameterOrReference.Marshal(b, m, deterministic) +} +func (m *ParameterOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_ParameterOrReference.Merge(m, src) +} +func (m *ParameterOrReference) XXX_Size() int { + return xxx_messageInfo_ParameterOrReference.Size(m) +} +func (m *ParameterOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_ParameterOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_ParameterOrReference proto.InternalMessageInfo + +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() {} + +func (m *ParameterOrReference) GetOneof() isParameterOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *ParameterOrReference) GetParameter() *Parameter { + if x, ok := m.GetOneof().(*ParameterOrReference_Parameter); ok { + return x.Parameter + } + return nil +} + +func (m *ParameterOrReference) GetReference() *Reference { + if x, ok := m.GetOneof().(*ParameterOrReference_Reference); ok { + return x.Reference + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*ParameterOrReference) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*ParameterOrReference_Parameter)(nil), + (*ParameterOrReference_Reference)(nil), + } +} + +type ParametersOrReferences struct { + AdditionalProperties []*NamedParameterOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ParametersOrReferences) Reset() { *m = ParametersOrReferences{} } +func (m *ParametersOrReferences) String() string { return proto.CompactTextString(m) } +func (*ParametersOrReferences) ProtoMessage() {} +func (*ParametersOrReferences) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{52} +} + +func (m *ParametersOrReferences) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ParametersOrReferences.Unmarshal(m, b) +} +func (m *ParametersOrReferences) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ParametersOrReferences.Marshal(b, m, deterministic) +} +func (m *ParametersOrReferences) XXX_Merge(src proto.Message) { + xxx_messageInfo_ParametersOrReferences.Merge(m, src) +} +func (m *ParametersOrReferences) XXX_Size() int { + return xxx_messageInfo_ParametersOrReferences.Size(m) +} +func (m *ParametersOrReferences) XXX_DiscardUnknown() { + xxx_messageInfo_ParametersOrReferences.DiscardUnknown(m) +} + +var xxx_messageInfo_ParametersOrReferences proto.InternalMessageInfo + +func (m *ParametersOrReferences) GetAdditionalProperties() []*NamedParameterOrReference { + if m != nil { + return m.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 { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PathItem) Reset() { *m = PathItem{} } +func (m *PathItem) String() string { return proto.CompactTextString(m) } +func (*PathItem) ProtoMessage() {} +func (*PathItem) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{53} +} + +func (m *PathItem) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PathItem.Unmarshal(m, b) +} +func (m *PathItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PathItem.Marshal(b, m, deterministic) +} +func (m *PathItem) XXX_Merge(src proto.Message) { + xxx_messageInfo_PathItem.Merge(m, src) +} +func (m *PathItem) XXX_Size() int { + return xxx_messageInfo_PathItem.Size(m) +} +func (m *PathItem) XXX_DiscardUnknown() { + xxx_messageInfo_PathItem.DiscardUnknown(m) +} + +var xxx_messageInfo_PathItem proto.InternalMessageInfo + +func (m *PathItem) GetXRef() string { + if m != nil { + return m.XRef + } + return "" +} + +func (m *PathItem) GetSummary() string { + if m != nil { + return m.Summary + } + return "" +} + +func (m *PathItem) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *PathItem) GetGet() *Operation { + if m != nil { + return m.Get + } + return nil +} + +func (m *PathItem) GetPut() *Operation { + if m != nil { + return m.Put + } + return nil +} + +func (m *PathItem) GetPost() *Operation { + if m != nil { + return m.Post + } + return nil +} + +func (m *PathItem) GetDelete() *Operation { + if m != nil { + return m.Delete + } + return nil +} + +func (m *PathItem) GetOptions() *Operation { + if m != nil { + return m.Options + } + return nil +} + +func (m *PathItem) GetHead() *Operation { + if m != nil { + return m.Head + } + return nil +} + +func (m *PathItem) GetPatch() *Operation { + if m != nil { + return m.Patch + } + return nil +} + +func (m *PathItem) GetTrace() *Operation { + if m != nil { + return m.Trace + } + return nil +} + +func (m *PathItem) GetServers() []*Server { + if m != nil { + return m.Servers + } + return nil +} + +func (m *PathItem) GetParameters() []*ParameterOrReference { + if m != nil { + return m.Parameters + } + return nil +} + +func (m *PathItem) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.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 { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Paths) Reset() { *m = Paths{} } +func (m *Paths) String() string { return proto.CompactTextString(m) } +func (*Paths) ProtoMessage() {} +func (*Paths) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{54} +} + +func (m *Paths) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Paths.Unmarshal(m, b) +} +func (m *Paths) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Paths.Marshal(b, m, deterministic) +} +func (m *Paths) XXX_Merge(src proto.Message) { + xxx_messageInfo_Paths.Merge(m, src) +} +func (m *Paths) XXX_Size() int { + return xxx_messageInfo_Paths.Size(m) +} +func (m *Paths) XXX_DiscardUnknown() { + xxx_messageInfo_Paths.DiscardUnknown(m) +} + +var xxx_messageInfo_Paths proto.InternalMessageInfo + +func (m *Paths) GetPath() []*NamedPathItem { + if m != nil { + return m.Path + } + return nil +} + +func (m *Paths) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type Properties struct { + AdditionalProperties []*NamedSchemaOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Properties) Reset() { *m = Properties{} } +func (m *Properties) String() string { return proto.CompactTextString(m) } +func (*Properties) ProtoMessage() {} +func (*Properties) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{55} +} + +func (m *Properties) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Properties.Unmarshal(m, b) +} +func (m *Properties) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Properties.Marshal(b, m, deterministic) +} +func (m *Properties) XXX_Merge(src proto.Message) { + xxx_messageInfo_Properties.Merge(m, src) +} +func (m *Properties) XXX_Size() int { + return xxx_messageInfo_Properties.Size(m) +} +func (m *Properties) XXX_DiscardUnknown() { + xxx_messageInfo_Properties.DiscardUnknown(m) +} + +var xxx_messageInfo_Properties proto.InternalMessageInfo + +func (m *Properties) GetAdditionalProperties() []*NamedSchemaOrReference { + if m != nil { + return m.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 { + XRef string `protobuf:"bytes,1,opt,name=_ref,json=Ref,proto3" json:"_ref,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Reference) Reset() { *m = Reference{} } +func (m *Reference) String() string { return proto.CompactTextString(m) } +func (*Reference) ProtoMessage() {} +func (*Reference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{56} +} + +func (m *Reference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Reference.Unmarshal(m, b) +} +func (m *Reference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Reference.Marshal(b, m, deterministic) +} +func (m *Reference) XXX_Merge(src proto.Message) { + xxx_messageInfo_Reference.Merge(m, src) +} +func (m *Reference) XXX_Size() int { + return xxx_messageInfo_Reference.Size(m) +} +func (m *Reference) XXX_DiscardUnknown() { + xxx_messageInfo_Reference.DiscardUnknown(m) +} + +var xxx_messageInfo_Reference proto.InternalMessageInfo + +func (m *Reference) GetXRef() string { + if m != nil { + return m.XRef + } + return "" +} + +type RequestBodiesOrReferences struct { + AdditionalProperties []*NamedRequestBodyOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RequestBodiesOrReferences) Reset() { *m = RequestBodiesOrReferences{} } +func (m *RequestBodiesOrReferences) String() string { return proto.CompactTextString(m) } +func (*RequestBodiesOrReferences) ProtoMessage() {} +func (*RequestBodiesOrReferences) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{57} +} + +func (m *RequestBodiesOrReferences) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RequestBodiesOrReferences.Unmarshal(m, b) +} +func (m *RequestBodiesOrReferences) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RequestBodiesOrReferences.Marshal(b, m, deterministic) +} +func (m *RequestBodiesOrReferences) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestBodiesOrReferences.Merge(m, src) +} +func (m *RequestBodiesOrReferences) XXX_Size() int { + return xxx_messageInfo_RequestBodiesOrReferences.Size(m) +} +func (m *RequestBodiesOrReferences) XXX_DiscardUnknown() { + xxx_messageInfo_RequestBodiesOrReferences.DiscardUnknown(m) +} + +var xxx_messageInfo_RequestBodiesOrReferences proto.InternalMessageInfo + +func (m *RequestBodiesOrReferences) GetAdditionalProperties() []*NamedRequestBodyOrReference { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +// Describes a single request body. +type RequestBody struct { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RequestBody) Reset() { *m = RequestBody{} } +func (m *RequestBody) String() string { return proto.CompactTextString(m) } +func (*RequestBody) ProtoMessage() {} +func (*RequestBody) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{58} +} + +func (m *RequestBody) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RequestBody.Unmarshal(m, b) +} +func (m *RequestBody) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RequestBody.Marshal(b, m, deterministic) +} +func (m *RequestBody) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestBody.Merge(m, src) +} +func (m *RequestBody) XXX_Size() int { + return xxx_messageInfo_RequestBody.Size(m) +} +func (m *RequestBody) XXX_DiscardUnknown() { + xxx_messageInfo_RequestBody.DiscardUnknown(m) +} + +var xxx_messageInfo_RequestBody proto.InternalMessageInfo + +func (m *RequestBody) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *RequestBody) GetContent() *MediaTypes { + if m != nil { + return m.Content + } + return nil +} + +func (m *RequestBody) GetRequired() bool { + if m != nil { + return m.Required + } + return false +} + +func (m *RequestBody) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type RequestBodyOrReference struct { + // Types that are valid to be assigned to Oneof: + // *RequestBodyOrReference_RequestBody + // *RequestBodyOrReference_Reference + Oneof isRequestBodyOrReference_Oneof `protobuf_oneof:"oneof"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RequestBodyOrReference) Reset() { *m = RequestBodyOrReference{} } +func (m *RequestBodyOrReference) String() string { return proto.CompactTextString(m) } +func (*RequestBodyOrReference) ProtoMessage() {} +func (*RequestBodyOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{59} +} + +func (m *RequestBodyOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RequestBodyOrReference.Unmarshal(m, b) +} +func (m *RequestBodyOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RequestBodyOrReference.Marshal(b, m, deterministic) +} +func (m *RequestBodyOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestBodyOrReference.Merge(m, src) +} +func (m *RequestBodyOrReference) XXX_Size() int { + return xxx_messageInfo_RequestBodyOrReference.Size(m) +} +func (m *RequestBodyOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_RequestBodyOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_RequestBodyOrReference proto.InternalMessageInfo + +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() {} + +func (m *RequestBodyOrReference) GetOneof() isRequestBodyOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *RequestBodyOrReference) GetRequestBody() *RequestBody { + if x, ok := m.GetOneof().(*RequestBodyOrReference_RequestBody); ok { + return x.RequestBody + } + return nil +} + +func (m *RequestBodyOrReference) GetReference() *Reference { + if x, ok := m.GetOneof().(*RequestBodyOrReference_Reference); ok { + return x.Reference + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*RequestBodyOrReference) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*RequestBodyOrReference_RequestBody)(nil), + (*RequestBodyOrReference_Reference)(nil), + } +} + +// Describes a single response from an API Operation, including design-time, static `links` to operations based on the response. +type Response struct { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Response) Reset() { *m = Response{} } +func (m *Response) String() string { return proto.CompactTextString(m) } +func (*Response) ProtoMessage() {} +func (*Response) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{60} +} + +func (m *Response) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Response.Unmarshal(m, b) +} +func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Response.Marshal(b, m, deterministic) +} +func (m *Response) XXX_Merge(src proto.Message) { + xxx_messageInfo_Response.Merge(m, src) +} +func (m *Response) XXX_Size() int { + return xxx_messageInfo_Response.Size(m) +} +func (m *Response) XXX_DiscardUnknown() { + xxx_messageInfo_Response.DiscardUnknown(m) +} + +var xxx_messageInfo_Response proto.InternalMessageInfo + +func (m *Response) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Response) GetHeaders() *HeadersOrReferences { + if m != nil { + return m.Headers + } + return nil +} + +func (m *Response) GetContent() *MediaTypes { + if m != nil { + return m.Content + } + return nil +} + +func (m *Response) GetLinks() *LinksOrReferences { + if m != nil { + return m.Links + } + return nil +} + +func (m *Response) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type ResponseOrReference struct { + // Types that are valid to be assigned to Oneof: + // *ResponseOrReference_Response + // *ResponseOrReference_Reference + Oneof isResponseOrReference_Oneof `protobuf_oneof:"oneof"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ResponseOrReference) Reset() { *m = ResponseOrReference{} } +func (m *ResponseOrReference) String() string { return proto.CompactTextString(m) } +func (*ResponseOrReference) ProtoMessage() {} +func (*ResponseOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{61} +} + +func (m *ResponseOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ResponseOrReference.Unmarshal(m, b) +} +func (m *ResponseOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ResponseOrReference.Marshal(b, m, deterministic) +} +func (m *ResponseOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseOrReference.Merge(m, src) +} +func (m *ResponseOrReference) XXX_Size() int { + return xxx_messageInfo_ResponseOrReference.Size(m) +} +func (m *ResponseOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_ResponseOrReference proto.InternalMessageInfo + +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() {} + +func (m *ResponseOrReference) GetOneof() isResponseOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *ResponseOrReference) GetResponse() *Response { + if x, ok := m.GetOneof().(*ResponseOrReference_Response); ok { + return x.Response + } + return nil +} + +func (m *ResponseOrReference) GetReference() *Reference { + if x, ok := m.GetOneof().(*ResponseOrReference_Reference); ok { + return x.Reference + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*ResponseOrReference) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*ResponseOrReference_Response)(nil), + (*ResponseOrReference_Reference)(nil), + } +} + +// 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 { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Responses) Reset() { *m = Responses{} } +func (m *Responses) String() string { return proto.CompactTextString(m) } +func (*Responses) ProtoMessage() {} +func (*Responses) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{62} +} + +func (m *Responses) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Responses.Unmarshal(m, b) +} +func (m *Responses) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Responses.Marshal(b, m, deterministic) +} +func (m *Responses) XXX_Merge(src proto.Message) { + xxx_messageInfo_Responses.Merge(m, src) +} +func (m *Responses) XXX_Size() int { + return xxx_messageInfo_Responses.Size(m) +} +func (m *Responses) XXX_DiscardUnknown() { + xxx_messageInfo_Responses.DiscardUnknown(m) +} + +var xxx_messageInfo_Responses proto.InternalMessageInfo + +func (m *Responses) GetDefault() *ResponseOrReference { + if m != nil { + return m.Default + } + return nil +} + +func (m *Responses) GetResponseOrReference() []*NamedResponseOrReference { + if m != nil { + return m.ResponseOrReference + } + return nil +} + +func (m *Responses) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type ResponsesOrReferences struct { + AdditionalProperties []*NamedResponseOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ResponsesOrReferences) Reset() { *m = ResponsesOrReferences{} } +func (m *ResponsesOrReferences) String() string { return proto.CompactTextString(m) } +func (*ResponsesOrReferences) ProtoMessage() {} +func (*ResponsesOrReferences) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{63} +} + +func (m *ResponsesOrReferences) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ResponsesOrReferences.Unmarshal(m, b) +} +func (m *ResponsesOrReferences) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ResponsesOrReferences.Marshal(b, m, deterministic) +} +func (m *ResponsesOrReferences) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponsesOrReferences.Merge(m, src) +} +func (m *ResponsesOrReferences) XXX_Size() int { + return xxx_messageInfo_ResponsesOrReferences.Size(m) +} +func (m *ResponsesOrReferences) XXX_DiscardUnknown() { + xxx_messageInfo_ResponsesOrReferences.DiscardUnknown(m) +} + +var xxx_messageInfo_ResponsesOrReferences proto.InternalMessageInfo + +func (m *ResponsesOrReferences) GetAdditionalProperties() []*NamedResponseOrReference { + if m != nil { + return m.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 { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Schema) Reset() { *m = Schema{} } +func (m *Schema) String() string { return proto.CompactTextString(m) } +func (*Schema) ProtoMessage() {} +func (*Schema) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{64} +} + +func (m *Schema) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Schema.Unmarshal(m, b) +} +func (m *Schema) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Schema.Marshal(b, m, deterministic) +} +func (m *Schema) XXX_Merge(src proto.Message) { + xxx_messageInfo_Schema.Merge(m, src) +} +func (m *Schema) XXX_Size() int { + return xxx_messageInfo_Schema.Size(m) +} +func (m *Schema) XXX_DiscardUnknown() { + xxx_messageInfo_Schema.DiscardUnknown(m) +} + +var xxx_messageInfo_Schema proto.InternalMessageInfo + +func (m *Schema) GetNullable() bool { + if m != nil { + return m.Nullable + } + return false +} + +func (m *Schema) GetDiscriminator() *Discriminator { + if m != nil { + return m.Discriminator + } + return nil +} + +func (m *Schema) GetReadOnly() bool { + if m != nil { + return m.ReadOnly + } + return false +} + +func (m *Schema) GetWriteOnly() bool { + if m != nil { + return m.WriteOnly + } + return false +} + +func (m *Schema) GetXml() *Xml { + if m != nil { + return m.Xml + } + return nil +} + +func (m *Schema) GetExternalDocs() *ExternalDocs { + if m != nil { + return m.ExternalDocs + } + return nil +} + +func (m *Schema) GetExample() *Any { + if m != nil { + return m.Example + } + return nil +} + +func (m *Schema) GetDeprecated() bool { + if m != nil { + return m.Deprecated + } + return false +} + +func (m *Schema) GetTitle() string { + if m != nil { + return m.Title + } + return "" +} + +func (m *Schema) GetMultipleOf() float64 { + if m != nil { + return m.MultipleOf + } + return 0 +} + +func (m *Schema) GetMaximum() float64 { + if m != nil { + return m.Maximum + } + return 0 +} + +func (m *Schema) GetExclusiveMaximum() bool { + if m != nil { + return m.ExclusiveMaximum + } + return false +} + +func (m *Schema) GetMinimum() float64 { + if m != nil { + return m.Minimum + } + return 0 +} + +func (m *Schema) GetExclusiveMinimum() bool { + if m != nil { + return m.ExclusiveMinimum + } + return false +} + +func (m *Schema) GetMaxLength() int64 { + if m != nil { + return m.MaxLength + } + return 0 +} + +func (m *Schema) GetMinLength() int64 { + if m != nil { + return m.MinLength + } + return 0 +} + +func (m *Schema) GetPattern() string { + if m != nil { + return m.Pattern + } + return "" +} + +func (m *Schema) GetMaxItems() int64 { + if m != nil { + return m.MaxItems + } + return 0 +} + +func (m *Schema) GetMinItems() int64 { + if m != nil { + return m.MinItems + } + return 0 +} + +func (m *Schema) GetUniqueItems() bool { + if m != nil { + return m.UniqueItems + } + return false +} + +func (m *Schema) GetMaxProperties() int64 { + if m != nil { + return m.MaxProperties + } + return 0 +} + +func (m *Schema) GetMinProperties() int64 { + if m != nil { + return m.MinProperties + } + return 0 +} + +func (m *Schema) GetRequired() []string { + if m != nil { + return m.Required + } + return nil +} + +func (m *Schema) GetEnum() []*Any { + if m != nil { + return m.Enum + } + return nil +} + +func (m *Schema) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *Schema) GetAllOf() []*SchemaOrReference { + if m != nil { + return m.AllOf + } + return nil +} + +func (m *Schema) GetOneOf() []*SchemaOrReference { + if m != nil { + return m.OneOf + } + return nil +} + +func (m *Schema) GetAnyOf() []*SchemaOrReference { + if m != nil { + return m.AnyOf + } + return nil +} + +func (m *Schema) GetNot() *Schema { + if m != nil { + return m.Not + } + return nil +} + +func (m *Schema) GetItems() *ItemsItem { + if m != nil { + return m.Items + } + return nil +} + +func (m *Schema) GetProperties() *Properties { + if m != nil { + return m.Properties + } + return nil +} + +func (m *Schema) GetAdditionalProperties() *AdditionalPropertiesItem { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +func (m *Schema) GetDefault() *DefaultType { + if m != nil { + return m.Default + } + return nil +} + +func (m *Schema) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Schema) GetFormat() string { + if m != nil { + return m.Format + } + return "" +} + +func (m *Schema) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type SchemaOrReference struct { + // Types that are valid to be assigned to Oneof: + // *SchemaOrReference_Schema + // *SchemaOrReference_Reference + Oneof isSchemaOrReference_Oneof `protobuf_oneof:"oneof"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SchemaOrReference) Reset() { *m = SchemaOrReference{} } +func (m *SchemaOrReference) String() string { return proto.CompactTextString(m) } +func (*SchemaOrReference) ProtoMessage() {} +func (*SchemaOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{65} +} + +func (m *SchemaOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SchemaOrReference.Unmarshal(m, b) +} +func (m *SchemaOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SchemaOrReference.Marshal(b, m, deterministic) +} +func (m *SchemaOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_SchemaOrReference.Merge(m, src) +} +func (m *SchemaOrReference) XXX_Size() int { + return xxx_messageInfo_SchemaOrReference.Size(m) +} +func (m *SchemaOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_SchemaOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_SchemaOrReference proto.InternalMessageInfo + +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() {} + +func (m *SchemaOrReference) GetOneof() isSchemaOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *SchemaOrReference) GetSchema() *Schema { + if x, ok := m.GetOneof().(*SchemaOrReference_Schema); ok { + return x.Schema + } + return nil +} + +func (m *SchemaOrReference) GetReference() *Reference { + if x, ok := m.GetOneof().(*SchemaOrReference_Reference); ok { + return x.Reference + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*SchemaOrReference) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*SchemaOrReference_Schema)(nil), + (*SchemaOrReference_Reference)(nil), + } +} + +type SchemasOrReferences struct { + AdditionalProperties []*NamedSchemaOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SchemasOrReferences) Reset() { *m = SchemasOrReferences{} } +func (m *SchemasOrReferences) String() string { return proto.CompactTextString(m) } +func (*SchemasOrReferences) ProtoMessage() {} +func (*SchemasOrReferences) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{66} +} + +func (m *SchemasOrReferences) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SchemasOrReferences.Unmarshal(m, b) +} +func (m *SchemasOrReferences) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SchemasOrReferences.Marshal(b, m, deterministic) +} +func (m *SchemasOrReferences) XXX_Merge(src proto.Message) { + xxx_messageInfo_SchemasOrReferences.Merge(m, src) +} +func (m *SchemasOrReferences) XXX_Size() int { + return xxx_messageInfo_SchemasOrReferences.Size(m) +} +func (m *SchemasOrReferences) XXX_DiscardUnknown() { + xxx_messageInfo_SchemasOrReferences.DiscardUnknown(m) +} + +var xxx_messageInfo_SchemasOrReferences proto.InternalMessageInfo + +func (m *SchemasOrReferences) GetAdditionalProperties() []*NamedSchemaOrReference { + if m != nil { + return m.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 { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SecurityRequirement) Reset() { *m = SecurityRequirement{} } +func (m *SecurityRequirement) String() string { return proto.CompactTextString(m) } +func (*SecurityRequirement) ProtoMessage() {} +func (*SecurityRequirement) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{67} +} + +func (m *SecurityRequirement) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SecurityRequirement.Unmarshal(m, b) +} +func (m *SecurityRequirement) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SecurityRequirement.Marshal(b, m, deterministic) +} +func (m *SecurityRequirement) XXX_Merge(src proto.Message) { + xxx_messageInfo_SecurityRequirement.Merge(m, src) +} +func (m *SecurityRequirement) XXX_Size() int { + return xxx_messageInfo_SecurityRequirement.Size(m) +} +func (m *SecurityRequirement) XXX_DiscardUnknown() { + xxx_messageInfo_SecurityRequirement.DiscardUnknown(m) +} + +var xxx_messageInfo_SecurityRequirement proto.InternalMessageInfo + +// 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 { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SecurityScheme) Reset() { *m = SecurityScheme{} } +func (m *SecurityScheme) String() string { return proto.CompactTextString(m) } +func (*SecurityScheme) ProtoMessage() {} +func (*SecurityScheme) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{68} +} + +func (m *SecurityScheme) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SecurityScheme.Unmarshal(m, b) +} +func (m *SecurityScheme) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SecurityScheme.Marshal(b, m, deterministic) +} +func (m *SecurityScheme) XXX_Merge(src proto.Message) { + xxx_messageInfo_SecurityScheme.Merge(m, src) +} +func (m *SecurityScheme) XXX_Size() int { + return xxx_messageInfo_SecurityScheme.Size(m) +} +func (m *SecurityScheme) XXX_DiscardUnknown() { + xxx_messageInfo_SecurityScheme.DiscardUnknown(m) +} + +var xxx_messageInfo_SecurityScheme proto.InternalMessageInfo + +func (m *SecurityScheme) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *SecurityScheme) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *SecurityScheme) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *SecurityScheme) GetIn() string { + if m != nil { + return m.In + } + return "" +} + +func (m *SecurityScheme) GetScheme() string { + if m != nil { + return m.Scheme + } + return "" +} + +func (m *SecurityScheme) GetBearerFormat() string { + if m != nil { + return m.BearerFormat + } + return "" +} + +func (m *SecurityScheme) GetFlows() *OauthFlows { + if m != nil { + return m.Flows + } + return nil +} + +func (m *SecurityScheme) GetOpenIdConnectUrl() string { + if m != nil { + return m.OpenIdConnectUrl + } + return "" +} + +func (m *SecurityScheme) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type SecuritySchemeOrReference struct { + // Types that are valid to be assigned to Oneof: + // *SecuritySchemeOrReference_SecurityScheme + // *SecuritySchemeOrReference_Reference + Oneof isSecuritySchemeOrReference_Oneof `protobuf_oneof:"oneof"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SecuritySchemeOrReference) Reset() { *m = SecuritySchemeOrReference{} } +func (m *SecuritySchemeOrReference) String() string { return proto.CompactTextString(m) } +func (*SecuritySchemeOrReference) ProtoMessage() {} +func (*SecuritySchemeOrReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{69} +} + +func (m *SecuritySchemeOrReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SecuritySchemeOrReference.Unmarshal(m, b) +} +func (m *SecuritySchemeOrReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SecuritySchemeOrReference.Marshal(b, m, deterministic) +} +func (m *SecuritySchemeOrReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_SecuritySchemeOrReference.Merge(m, src) +} +func (m *SecuritySchemeOrReference) XXX_Size() int { + return xxx_messageInfo_SecuritySchemeOrReference.Size(m) +} +func (m *SecuritySchemeOrReference) XXX_DiscardUnknown() { + xxx_messageInfo_SecuritySchemeOrReference.DiscardUnknown(m) +} + +var xxx_messageInfo_SecuritySchemeOrReference proto.InternalMessageInfo + +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() {} + +func (m *SecuritySchemeOrReference) GetOneof() isSecuritySchemeOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *SecuritySchemeOrReference) GetSecurityScheme() *SecurityScheme { + if x, ok := m.GetOneof().(*SecuritySchemeOrReference_SecurityScheme); ok { + return x.SecurityScheme + } + return nil +} + +func (m *SecuritySchemeOrReference) GetReference() *Reference { + if x, ok := m.GetOneof().(*SecuritySchemeOrReference_Reference); ok { + return x.Reference + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*SecuritySchemeOrReference) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*SecuritySchemeOrReference_SecurityScheme)(nil), + (*SecuritySchemeOrReference_Reference)(nil), + } +} + +type SecuritySchemesOrReferences struct { + AdditionalProperties []*NamedSecuritySchemeOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SecuritySchemesOrReferences) Reset() { *m = SecuritySchemesOrReferences{} } +func (m *SecuritySchemesOrReferences) String() string { return proto.CompactTextString(m) } +func (*SecuritySchemesOrReferences) ProtoMessage() {} +func (*SecuritySchemesOrReferences) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{70} +} + +func (m *SecuritySchemesOrReferences) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SecuritySchemesOrReferences.Unmarshal(m, b) +} +func (m *SecuritySchemesOrReferences) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SecuritySchemesOrReferences.Marshal(b, m, deterministic) +} +func (m *SecuritySchemesOrReferences) XXX_Merge(src proto.Message) { + xxx_messageInfo_SecuritySchemesOrReferences.Merge(m, src) +} +func (m *SecuritySchemesOrReferences) XXX_Size() int { + return xxx_messageInfo_SecuritySchemesOrReferences.Size(m) +} +func (m *SecuritySchemesOrReferences) XXX_DiscardUnknown() { + xxx_messageInfo_SecuritySchemesOrReferences.DiscardUnknown(m) +} + +var xxx_messageInfo_SecuritySchemesOrReferences proto.InternalMessageInfo + +func (m *SecuritySchemesOrReferences) GetAdditionalProperties() []*NamedSecuritySchemeOrReference { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +// An object representing a Server. +type Server struct { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Server) Reset() { *m = Server{} } +func (m *Server) String() string { return proto.CompactTextString(m) } +func (*Server) ProtoMessage() {} +func (*Server) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{71} +} + +func (m *Server) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Server.Unmarshal(m, b) +} +func (m *Server) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Server.Marshal(b, m, deterministic) +} +func (m *Server) XXX_Merge(src proto.Message) { + xxx_messageInfo_Server.Merge(m, src) +} +func (m *Server) XXX_Size() int { + return xxx_messageInfo_Server.Size(m) +} +func (m *Server) XXX_DiscardUnknown() { + xxx_messageInfo_Server.DiscardUnknown(m) +} + +var xxx_messageInfo_Server proto.InternalMessageInfo + +func (m *Server) GetUrl() string { + if m != nil { + return m.Url + } + return "" +} + +func (m *Server) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Server) GetVariables() *ServerVariables { + if m != nil { + return m.Variables + } + return nil +} + +func (m *Server) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +// An object representing a Server Variable for server URL template substitution. +type ServerVariable struct { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ServerVariable) Reset() { *m = ServerVariable{} } +func (m *ServerVariable) String() string { return proto.CompactTextString(m) } +func (*ServerVariable) ProtoMessage() {} +func (*ServerVariable) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{72} +} + +func (m *ServerVariable) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServerVariable.Unmarshal(m, b) +} +func (m *ServerVariable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServerVariable.Marshal(b, m, deterministic) +} +func (m *ServerVariable) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServerVariable.Merge(m, src) +} +func (m *ServerVariable) XXX_Size() int { + return xxx_messageInfo_ServerVariable.Size(m) +} +func (m *ServerVariable) XXX_DiscardUnknown() { + xxx_messageInfo_ServerVariable.DiscardUnknown(m) +} + +var xxx_messageInfo_ServerVariable proto.InternalMessageInfo + +func (m *ServerVariable) GetEnum() []string { + if m != nil { + return m.Enum + } + return nil +} + +func (m *ServerVariable) GetDefault() string { + if m != nil { + return m.Default + } + return "" +} + +func (m *ServerVariable) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *ServerVariable) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +type ServerVariables struct { + AdditionalProperties []*NamedServerVariable `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ServerVariables) Reset() { *m = ServerVariables{} } +func (m *ServerVariables) String() string { return proto.CompactTextString(m) } +func (*ServerVariables) ProtoMessage() {} +func (*ServerVariables) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{73} +} + +func (m *ServerVariables) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServerVariables.Unmarshal(m, b) +} +func (m *ServerVariables) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServerVariables.Marshal(b, m, deterministic) +} +func (m *ServerVariables) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServerVariables.Merge(m, src) +} +func (m *ServerVariables) XXX_Size() int { + return xxx_messageInfo_ServerVariables.Size(m) +} +func (m *ServerVariables) XXX_DiscardUnknown() { + xxx_messageInfo_ServerVariables.DiscardUnknown(m) +} + +var xxx_messageInfo_ServerVariables proto.InternalMessageInfo + +func (m *ServerVariables) GetAdditionalProperties() []*NamedServerVariable { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +// Any property starting with x- is valid. +type SpecificationExtension struct { + // Types that are valid to be assigned to Oneof: + // *SpecificationExtension_Number + // *SpecificationExtension_Boolean + // *SpecificationExtension_String_ + Oneof isSpecificationExtension_Oneof `protobuf_oneof:"oneof"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SpecificationExtension) Reset() { *m = SpecificationExtension{} } +func (m *SpecificationExtension) String() string { return proto.CompactTextString(m) } +func (*SpecificationExtension) ProtoMessage() {} +func (*SpecificationExtension) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{74} +} + +func (m *SpecificationExtension) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SpecificationExtension.Unmarshal(m, b) +} +func (m *SpecificationExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SpecificationExtension.Marshal(b, m, deterministic) +} +func (m *SpecificationExtension) XXX_Merge(src proto.Message) { + xxx_messageInfo_SpecificationExtension.Merge(m, src) +} +func (m *SpecificationExtension) XXX_Size() int { + return xxx_messageInfo_SpecificationExtension.Size(m) +} +func (m *SpecificationExtension) XXX_DiscardUnknown() { + xxx_messageInfo_SpecificationExtension.DiscardUnknown(m) +} + +var xxx_messageInfo_SpecificationExtension proto.InternalMessageInfo + +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() {} + +func (m *SpecificationExtension) GetOneof() isSpecificationExtension_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *SpecificationExtension) GetNumber() float64 { + if x, ok := m.GetOneof().(*SpecificationExtension_Number); ok { + return x.Number + } + return 0 +} + +func (m *SpecificationExtension) GetBoolean() bool { + if x, ok := m.GetOneof().(*SpecificationExtension_Boolean); ok { + return x.Boolean + } + return false +} + +func (m *SpecificationExtension) GetString_() string { + if x, ok := m.GetOneof().(*SpecificationExtension_String_); ok { + return x.String_ + } + return "" +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*SpecificationExtension) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*SpecificationExtension_Number)(nil), + (*SpecificationExtension_Boolean)(nil), + (*SpecificationExtension_String_)(nil), + } +} + +type StringArray struct { + Value []string `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StringArray) Reset() { *m = StringArray{} } +func (m *StringArray) String() string { return proto.CompactTextString(m) } +func (*StringArray) ProtoMessage() {} +func (*StringArray) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{75} +} + +func (m *StringArray) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StringArray.Unmarshal(m, b) +} +func (m *StringArray) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StringArray.Marshal(b, m, deterministic) +} +func (m *StringArray) XXX_Merge(src proto.Message) { + xxx_messageInfo_StringArray.Merge(m, src) +} +func (m *StringArray) XXX_Size() int { + return xxx_messageInfo_StringArray.Size(m) +} +func (m *StringArray) XXX_DiscardUnknown() { + xxx_messageInfo_StringArray.DiscardUnknown(m) +} + +var xxx_messageInfo_StringArray proto.InternalMessageInfo + +func (m *StringArray) GetValue() []string { + if m != nil { + return m.Value + } + return nil +} + +type Strings struct { + AdditionalProperties []*NamedString `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Strings) Reset() { *m = Strings{} } +func (m *Strings) String() string { return proto.CompactTextString(m) } +func (*Strings) ProtoMessage() {} +func (*Strings) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{76} +} + +func (m *Strings) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Strings.Unmarshal(m, b) +} +func (m *Strings) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Strings.Marshal(b, m, deterministic) +} +func (m *Strings) XXX_Merge(src proto.Message) { + xxx_messageInfo_Strings.Merge(m, src) +} +func (m *Strings) XXX_Size() int { + return xxx_messageInfo_Strings.Size(m) +} +func (m *Strings) XXX_DiscardUnknown() { + xxx_messageInfo_Strings.DiscardUnknown(m) +} + +var xxx_messageInfo_Strings proto.InternalMessageInfo + +func (m *Strings) GetAdditionalProperties() []*NamedString { + if m != nil { + return m.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 { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Tag) Reset() { *m = Tag{} } +func (m *Tag) String() string { return proto.CompactTextString(m) } +func (*Tag) ProtoMessage() {} +func (*Tag) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{77} +} + +func (m *Tag) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Tag.Unmarshal(m, b) +} +func (m *Tag) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Tag.Marshal(b, m, deterministic) +} +func (m *Tag) XXX_Merge(src proto.Message) { + xxx_messageInfo_Tag.Merge(m, src) +} +func (m *Tag) XXX_Size() int { + return xxx_messageInfo_Tag.Size(m) +} +func (m *Tag) XXX_DiscardUnknown() { + xxx_messageInfo_Tag.DiscardUnknown(m) +} + +var xxx_messageInfo_Tag proto.InternalMessageInfo + +func (m *Tag) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Tag) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Tag) GetExternalDocs() *ExternalDocs { + if m != nil { + return m.ExternalDocs + } + return nil +} + +func (m *Tag) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.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 { + 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"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Xml) Reset() { *m = Xml{} } +func (m *Xml) String() string { return proto.CompactTextString(m) } +func (*Xml) ProtoMessage() {} +func (*Xml) Descriptor() ([]byte, []int) { + return fileDescriptor_2d98d18c4f6d777a, []int{78} +} + +func (m *Xml) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Xml.Unmarshal(m, b) +} +func (m *Xml) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Xml.Marshal(b, m, deterministic) +} +func (m *Xml) XXX_Merge(src proto.Message) { + xxx_messageInfo_Xml.Merge(m, src) +} +func (m *Xml) XXX_Size() int { + return xxx_messageInfo_Xml.Size(m) +} +func (m *Xml) XXX_DiscardUnknown() { + xxx_messageInfo_Xml.DiscardUnknown(m) +} + +var xxx_messageInfo_Xml proto.InternalMessageInfo + +func (m *Xml) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Xml) GetNamespace() string { + if m != nil { + return m.Namespace + } + return "" +} + +func (m *Xml) GetPrefix() string { + if m != nil { + return m.Prefix + } + return "" +} + +func (m *Xml) GetAttribute() bool { + if m != nil { + return m.Attribute + } + return false +} + +func (m *Xml) GetWrapped() bool { + if m != nil { + return m.Wrapped + } + return false +} + +func (m *Xml) GetSpecificationExtension() []*NamedAny { + if m != nil { + return m.SpecificationExtension + } + return nil +} + +func init() { + proto.RegisterType((*AdditionalPropertiesItem)(nil), "openapi.v3.AdditionalPropertiesItem") + proto.RegisterType((*Any)(nil), "openapi.v3.Any") + proto.RegisterType((*AnyOrExpression)(nil), "openapi.v3.AnyOrExpression") + proto.RegisterType((*AnysOrExpressions)(nil), "openapi.v3.AnysOrExpressions") + proto.RegisterType((*Callback)(nil), "openapi.v3.Callback") + proto.RegisterType((*CallbackOrReference)(nil), "openapi.v3.CallbackOrReference") + proto.RegisterType((*CallbacksOrReferences)(nil), "openapi.v3.CallbacksOrReferences") + proto.RegisterType((*Components)(nil), "openapi.v3.Components") + proto.RegisterType((*Contact)(nil), "openapi.v3.Contact") + proto.RegisterType((*DefaultType)(nil), "openapi.v3.DefaultType") + proto.RegisterType((*Discriminator)(nil), "openapi.v3.Discriminator") + proto.RegisterType((*Document)(nil), "openapi.v3.Document") + proto.RegisterType((*Encoding)(nil), "openapi.v3.Encoding") + proto.RegisterType((*Encodings)(nil), "openapi.v3.Encodings") + proto.RegisterType((*Example)(nil), "openapi.v3.Example") + proto.RegisterType((*ExampleOrReference)(nil), "openapi.v3.ExampleOrReference") + proto.RegisterType((*ExamplesOrReferences)(nil), "openapi.v3.ExamplesOrReferences") + proto.RegisterType((*Expression)(nil), "openapi.v3.Expression") + proto.RegisterType((*ExternalDocs)(nil), "openapi.v3.ExternalDocs") + proto.RegisterType((*Header)(nil), "openapi.v3.Header") + proto.RegisterType((*HeaderOrReference)(nil), "openapi.v3.HeaderOrReference") + proto.RegisterType((*HeadersOrReferences)(nil), "openapi.v3.HeadersOrReferences") + proto.RegisterType((*Info)(nil), "openapi.v3.Info") + proto.RegisterType((*ItemsItem)(nil), "openapi.v3.ItemsItem") + proto.RegisterType((*License)(nil), "openapi.v3.License") + proto.RegisterType((*Link)(nil), "openapi.v3.Link") + proto.RegisterType((*LinkOrReference)(nil), "openapi.v3.LinkOrReference") + proto.RegisterType((*LinksOrReferences)(nil), "openapi.v3.LinksOrReferences") + proto.RegisterType((*MediaType)(nil), "openapi.v3.MediaType") + proto.RegisterType((*MediaTypes)(nil), "openapi.v3.MediaTypes") + proto.RegisterType((*NamedAny)(nil), "openapi.v3.NamedAny") + proto.RegisterType((*NamedAnyOrExpression)(nil), "openapi.v3.NamedAnyOrExpression") + proto.RegisterType((*NamedCallbackOrReference)(nil), "openapi.v3.NamedCallbackOrReference") + proto.RegisterType((*NamedEncoding)(nil), "openapi.v3.NamedEncoding") + proto.RegisterType((*NamedExampleOrReference)(nil), "openapi.v3.NamedExampleOrReference") + proto.RegisterType((*NamedHeaderOrReference)(nil), "openapi.v3.NamedHeaderOrReference") + proto.RegisterType((*NamedLinkOrReference)(nil), "openapi.v3.NamedLinkOrReference") + proto.RegisterType((*NamedMediaType)(nil), "openapi.v3.NamedMediaType") + proto.RegisterType((*NamedParameterOrReference)(nil), "openapi.v3.NamedParameterOrReference") + proto.RegisterType((*NamedPathItem)(nil), "openapi.v3.NamedPathItem") + proto.RegisterType((*NamedRequestBodyOrReference)(nil), "openapi.v3.NamedRequestBodyOrReference") + proto.RegisterType((*NamedResponseOrReference)(nil), "openapi.v3.NamedResponseOrReference") + proto.RegisterType((*NamedSchemaOrReference)(nil), "openapi.v3.NamedSchemaOrReference") + proto.RegisterType((*NamedSecuritySchemeOrReference)(nil), "openapi.v3.NamedSecuritySchemeOrReference") + proto.RegisterType((*NamedServerVariable)(nil), "openapi.v3.NamedServerVariable") + proto.RegisterType((*NamedString)(nil), "openapi.v3.NamedString") + proto.RegisterType((*OauthFlow)(nil), "openapi.v3.OauthFlow") + proto.RegisterType((*OauthFlows)(nil), "openapi.v3.OauthFlows") + proto.RegisterType((*Object)(nil), "openapi.v3.Object") + proto.RegisterType((*Operation)(nil), "openapi.v3.Operation") + proto.RegisterType((*Parameter)(nil), "openapi.v3.Parameter") + proto.RegisterType((*ParameterOrReference)(nil), "openapi.v3.ParameterOrReference") + proto.RegisterType((*ParametersOrReferences)(nil), "openapi.v3.ParametersOrReferences") + proto.RegisterType((*PathItem)(nil), "openapi.v3.PathItem") + proto.RegisterType((*Paths)(nil), "openapi.v3.Paths") + proto.RegisterType((*Properties)(nil), "openapi.v3.Properties") + proto.RegisterType((*Reference)(nil), "openapi.v3.Reference") + proto.RegisterType((*RequestBodiesOrReferences)(nil), "openapi.v3.RequestBodiesOrReferences") + proto.RegisterType((*RequestBody)(nil), "openapi.v3.RequestBody") + proto.RegisterType((*RequestBodyOrReference)(nil), "openapi.v3.RequestBodyOrReference") + proto.RegisterType((*Response)(nil), "openapi.v3.Response") + proto.RegisterType((*ResponseOrReference)(nil), "openapi.v3.ResponseOrReference") + proto.RegisterType((*Responses)(nil), "openapi.v3.Responses") + proto.RegisterType((*ResponsesOrReferences)(nil), "openapi.v3.ResponsesOrReferences") + proto.RegisterType((*Schema)(nil), "openapi.v3.Schema") + proto.RegisterType((*SchemaOrReference)(nil), "openapi.v3.SchemaOrReference") + proto.RegisterType((*SchemasOrReferences)(nil), "openapi.v3.SchemasOrReferences") + proto.RegisterType((*SecurityRequirement)(nil), "openapi.v3.SecurityRequirement") + proto.RegisterType((*SecurityScheme)(nil), "openapi.v3.SecurityScheme") + proto.RegisterType((*SecuritySchemeOrReference)(nil), "openapi.v3.SecuritySchemeOrReference") + proto.RegisterType((*SecuritySchemesOrReferences)(nil), "openapi.v3.SecuritySchemesOrReferences") + proto.RegisterType((*Server)(nil), "openapi.v3.Server") + proto.RegisterType((*ServerVariable)(nil), "openapi.v3.ServerVariable") + proto.RegisterType((*ServerVariables)(nil), "openapi.v3.ServerVariables") + proto.RegisterType((*SpecificationExtension)(nil), "openapi.v3.SpecificationExtension") + proto.RegisterType((*StringArray)(nil), "openapi.v3.StringArray") + proto.RegisterType((*Strings)(nil), "openapi.v3.Strings") + proto.RegisterType((*Tag)(nil), "openapi.v3.Tag") + proto.RegisterType((*Xml)(nil), "openapi.v3.Xml") +} + +func init() { proto.RegisterFile("openapiv3/OpenAPIv3.proto", fileDescriptor_2d98d18c4f6d777a) } + +var fileDescriptor_2d98d18c4f6d777a = []byte{ + // 3549 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x1b, 0xc9, 0x6e, 0x1c, 0xc7, + 0x95, 0x3d, 0xfb, 0xbc, 0xe1, 0x5a, 0x5c, 0x34, 0x92, 0x2c, 0x89, 0x22, 0x25, 0x4b, 0xd6, 0x6a, + 0x8b, 0x96, 0x63, 0xc3, 0x76, 0x1c, 0x4a, 0xa2, 0x41, 0x01, 0x92, 0xa9, 0xb4, 0x64, 0x5b, 0xb1, + 0x63, 0x0c, 0x8a, 0x3d, 0x35, 0x64, 0x5b, 0xbd, 0xa9, 0xbb, 0x87, 0xe2, 0xe4, 0x60, 0x20, 0x07, + 0x03, 0x71, 0x80, 0x04, 0x09, 0x10, 0xf8, 0x96, 0x8b, 0xcf, 0x09, 0x8c, 0xe4, 0x23, 0x02, 0x18, + 0x48, 0x4e, 0x01, 0xf2, 0x01, 0x39, 0xe6, 0x12, 0x20, 0xc7, 0x9c, 0x82, 0xda, 0x7a, 0x99, 0xae, + 0x6e, 0x72, 0xc8, 0x31, 0x72, 0x22, 0xbb, 0xde, 0x52, 0xcb, 0x5b, 0xeb, 0xbd, 0x1a, 0x38, 0xe9, + 0x7a, 0xc4, 0xc1, 0x9e, 0xb9, 0xb7, 0x76, 0x73, 0xcb, 0x23, 0xce, 0xfa, 0xa3, 0xfb, 0x7b, 0x6b, + 0x37, 0x3c, 0xdf, 0x0d, 0x5d, 0x04, 0x02, 0x74, 0x63, 0x6f, 0xed, 0xd4, 0xc9, 0x1d, 0xd7, 0xdd, + 0xb1, 0xc8, 0x4d, 0x06, 0xd9, 0xee, 0xf7, 0x6e, 0x62, 0x67, 0xc0, 0xd1, 0x56, 0x7e, 0xa3, 0x41, + 0x7b, 0xbd, 0xdb, 0x35, 0x43, 0xd3, 0x75, 0xb0, 0xf5, 0xc8, 0x77, 0x3d, 0xe2, 0x87, 0x26, 0x09, + 0xee, 0x87, 0xc4, 0x46, 0x5b, 0x30, 0x1f, 0x18, 0xbb, 0xc4, 0xc6, 0x1d, 0xd7, 0xef, 0xf8, 0xa4, + 0x47, 0x7c, 0xe2, 0x18, 0xa4, 0xad, 0x2d, 0x6b, 0x97, 0x5b, 0xb7, 0xce, 0xdc, 0x88, 0x67, 0xb8, + 0xf1, 0x98, 0xa1, 0x6d, 0xf9, 0xba, 0x44, 0xda, 0x9c, 0xd0, 0xe7, 0x82, 0xe1, 0x41, 0x74, 0x0a, + 0xea, 0xdb, 0xae, 0x6b, 0x11, 0xec, 0xb4, 0x4b, 0xcb, 0xda, 0xe5, 0xc6, 0xe6, 0x84, 0x2e, 0x07, + 0xee, 0xd4, 0xa1, 0xea, 0x3a, 0xc4, 0xed, 0xad, 0x6c, 0x40, 0x79, 0xdd, 0x19, 0xa0, 0x2b, 0x50, + 0xdd, 0xc3, 0x56, 0x5f, 0x4e, 0xb7, 0x70, 0x83, 0x6f, 0xe2, 0x86, 0xdc, 0xc4, 0x8d, 0x75, 0x67, + 0xa0, 0x73, 0x14, 0x84, 0xa0, 0x32, 0xc0, 0xb6, 0xc5, 0x98, 0x36, 0x75, 0xf6, 0xff, 0xca, 0x00, + 0x66, 0xd6, 0x9d, 0xc1, 0x96, 0xbf, 0xb1, 0xef, 0xf9, 0x24, 0x08, 0x4c, 0xd7, 0x41, 0xab, 0x50, + 0xc6, 0xce, 0x40, 0x30, 0x9c, 0x49, 0xae, 0x7f, 0xdd, 0x19, 0x6c, 0x4e, 0xe8, 0x14, 0x8a, 0xde, + 0x04, 0x20, 0x11, 0x09, 0xe3, 0xd8, 0xba, 0xb5, 0x94, 0xc4, 0x8d, 0x19, 0x6e, 0x4e, 0xe8, 0x09, + 0xdc, 0x78, 0x07, 0x9f, 0xc3, 0xdc, 0xba, 0x33, 0x08, 0x92, 0x73, 0x07, 0xe8, 0x43, 0x58, 0xc4, + 0xd1, 0x41, 0x77, 0xbc, 0xe8, 0xa4, 0xdb, 0xda, 0x72, 0xf9, 0x72, 0xeb, 0xd6, 0x72, 0x72, 0x8a, + 0x0f, 0xb0, 0x4d, 0xba, 0x43, 0xab, 0xd7, 0x17, 0xb0, 0x42, 0x4e, 0x2b, 0xbf, 0xd0, 0xa0, 0x71, + 0x17, 0x5b, 0xd6, 0x36, 0x36, 0x9e, 0xa1, 0xeb, 0x50, 0xf1, 0x70, 0xb8, 0x2b, 0x58, 0x9e, 0xcc, + 0xb0, 0x7c, 0x84, 0xc3, 0x5d, 0x2a, 0x59, 0x9d, 0xa1, 0xa1, 0x87, 0x70, 0x22, 0xf0, 0x88, 0x61, + 0xf6, 0x4c, 0x03, 0x53, 0xc6, 0x1d, 0xb2, 0x1f, 0x12, 0x47, 0xec, 0xbb, 0xcc, 0x0e, 0x5d, 0xb1, + 0x28, 0x7d, 0x29, 0x45, 0xb4, 0x21, 0x69, 0x56, 0xbe, 0xd2, 0x60, 0x5e, 0x2e, 0x25, 0x29, 0xf5, + 0x5b, 0xd0, 0x30, 0xc4, 0x70, 0x24, 0xcc, 0x04, 0x5f, 0x49, 0xb2, 0x39, 0xa1, 0x47, 0x78, 0xe8, + 0x36, 0x34, 0x63, 0x85, 0xe3, 0x42, 0x58, 0x4c, 0x12, 0x25, 0x15, 0x2d, 0xc6, 0x8c, 0x45, 0xe0, + 0xc3, 0xa2, 0xe4, 0x1b, 0x24, 0xd6, 0x12, 0xa0, 0x9f, 0x14, 0x8b, 0xe1, 0x42, 0x66, 0xc7, 0x8a, + 0x1d, 0xe5, 0x88, 0xe2, 0x0f, 0x55, 0x80, 0xbb, 0xae, 0xed, 0xb9, 0x0e, 0x71, 0xc2, 0x00, 0xbd, + 0x05, 0x75, 0x6e, 0x01, 0x81, 0xd8, 0xf5, 0xb9, 0xac, 0xc5, 0xa4, 0xd6, 0xa6, 0x4b, 0x7c, 0xf4, + 0x1e, 0xdd, 0x7d, 0xe0, 0xb9, 0x4e, 0x40, 0x02, 0xb1, 0xfb, 0xf3, 0xe9, 0xdd, 0x0b, 0x60, 0x8a, + 0x3c, 0xa6, 0x41, 0x77, 0x00, 0x3c, 0xec, 0x63, 0x9b, 0x84, 0xc4, 0x0f, 0xda, 0x65, 0xc6, 0x61, + 0x25, 0xc9, 0xe1, 0x51, 0x04, 0x4d, 0xb1, 0x48, 0x50, 0xa1, 0x77, 0xa0, 0x41, 0xf6, 0xb1, 0xed, + 0x59, 0x24, 0x68, 0x57, 0x18, 0x87, 0xe5, 0xb4, 0x19, 0x70, 0x58, 0x8a, 0x3e, 0xa2, 0x40, 0x0f, + 0x60, 0xda, 0x27, 0xcf, 0xfb, 0x24, 0x08, 0x3b, 0xdb, 0x6e, 0x97, 0x1e, 0x70, 0x95, 0xf1, 0xb8, + 0x98, 0xde, 0x07, 0xc3, 0xb8, 0xc3, 0x10, 0x52, 0x8c, 0xa6, 0xfc, 0x24, 0x88, 0x9e, 0xe5, 0x2e, + 0xc1, 0x5d, 0xba, 0x99, 0x5a, 0xf6, 0x2c, 0x37, 0x39, 0x28, 0x7d, 0x96, 0x02, 0x1f, 0xe9, 0x30, + 0x1b, 0x10, 0xa3, 0xef, 0x9b, 0xe1, 0xa0, 0xc3, 0xce, 0x97, 0x04, 0xed, 0x3a, 0xe3, 0x71, 0x29, + 0x25, 0x0f, 0x81, 0xf3, 0x98, 0xa3, 0xa4, 0x78, 0xcd, 0x04, 0x69, 0x20, 0x5a, 0x83, 0xaa, 0x65, + 0x3a, 0xcf, 0x82, 0x76, 0x23, 0xeb, 0x0a, 0x1f, 0x50, 0x40, 0x8a, 0x9c, 0xe3, 0x52, 0xa1, 0x4a, + 0xf5, 0x0e, 0xda, 0xcd, 0xac, 0x50, 0x95, 0xfa, 0xaa, 0xc7, 0x34, 0x45, 0xe6, 0x0a, 0x47, 0x30, + 0xd7, 0xdf, 0x69, 0x50, 0xbf, 0xeb, 0x3a, 0x21, 0x36, 0x42, 0xea, 0x40, 0x1d, 0x6c, 0x73, 0x5f, + 0xdb, 0xd4, 0xd9, 0xff, 0x68, 0x16, 0xca, 0x7d, 0x5f, 0xfa, 0x54, 0xfa, 0x2f, 0x5a, 0x80, 0x2a, + 0xb1, 0xb1, 0x69, 0x31, 0x85, 0x6a, 0xea, 0xfc, 0xa3, 0x68, 0x59, 0x95, 0x23, 0x2c, 0xab, 0x07, + 0xad, 0x7b, 0xa4, 0x87, 0xfb, 0x56, 0xf8, 0x64, 0xe0, 0x11, 0xd4, 0x86, 0x9a, 0xd3, 0xb7, 0xb7, + 0x89, 0xcf, 0xd6, 0xa6, 0x6d, 0x4e, 0xe8, 0xe2, 0xbb, 0x28, 0x98, 0x50, 0xaa, 0x20, 0xf4, 0x4d, + 0x67, 0x87, 0x2f, 0x95, 0x52, 0xf1, 0xef, 0xd8, 0x43, 0xfc, 0x59, 0x83, 0xa9, 0x7b, 0x66, 0x60, + 0xf8, 0xa6, 0x6d, 0x3a, 0x38, 0x74, 0x7d, 0xb4, 0x0a, 0x53, 0xc2, 0x1f, 0x0c, 0x3a, 0x89, 0xd3, + 0x98, 0x94, 0x83, 0x74, 0xe9, 0xe8, 0x3a, 0xd4, 0x6d, 0xec, 0x79, 0x94, 0x35, 0x37, 0xcc, 0xf9, + 0x94, 0x16, 0xb1, 0x49, 0x02, 0x5d, 0xe2, 0x14, 0x1d, 0x4e, 0xf9, 0x08, 0x87, 0xf3, 0x5d, 0x19, + 0x1a, 0xf7, 0x5c, 0xa3, 0x6f, 0x13, 0x27, 0x44, 0x6d, 0xa8, 0x0b, 0x5a, 0xb1, 0x52, 0xf9, 0x89, + 0x2e, 0x40, 0xc5, 0x74, 0x7a, 0xae, 0x58, 0xe1, 0x6c, 0x72, 0x8a, 0xfb, 0x4e, 0xcf, 0xd5, 0x19, + 0x14, 0x5d, 0x83, 0x7a, 0x40, 0xfc, 0x3d, 0xee, 0x21, 0xe8, 0x5a, 0x50, 0xda, 0x20, 0x28, 0x48, + 0x97, 0x28, 0xe8, 0x12, 0x54, 0x69, 0xd0, 0x90, 0xbe, 0x60, 0x2e, 0xed, 0x4d, 0xc2, 0xdd, 0x40, + 0xe7, 0x70, 0xf4, 0x06, 0x80, 0x11, 0x79, 0x41, 0x61, 0xf5, 0xa9, 0x00, 0x1a, 0xfb, 0x48, 0x3d, + 0x81, 0x89, 0xde, 0x86, 0x86, 0xb4, 0xb3, 0x76, 0x8d, 0xad, 0xe7, 0x9c, 0xca, 0x40, 0xa9, 0xcf, + 0x30, 0x7d, 0x42, 0x4f, 0x40, 0x8f, 0x08, 0xd0, 0x2a, 0x54, 0x42, 0xbc, 0x43, 0x2d, 0xbb, 0x3c, + 0x1c, 0xdb, 0x9f, 0xe0, 0x1d, 0x9d, 0x01, 0xd1, 0xbb, 0x30, 0x45, 0x8f, 0xdf, 0xa7, 0x9e, 0xbf, + 0xeb, 0x1a, 0xd2, 0x7c, 0xdb, 0x69, 0xb7, 0xc6, 0x11, 0xee, 0xb9, 0x46, 0xa0, 0x4f, 0x92, 0xc4, + 0x57, 0x91, 0x2c, 0x9b, 0x47, 0x90, 0xe5, 0xaf, 0x4b, 0xd0, 0xd8, 0x70, 0x0c, 0xb7, 0x4b, 0xf5, + 0xe4, 0x3c, 0x4c, 0x1a, 0xae, 0x13, 0x12, 0x27, 0xec, 0x84, 0x03, 0x4f, 0xaa, 0x5e, 0x4b, 0x8c, + 0x31, 0x4b, 0x48, 0xf8, 0xc0, 0xd2, 0x88, 0x3e, 0x70, 0x01, 0xaa, 0x41, 0x38, 0xb0, 0x88, 0x34, + 0x5c, 0xf6, 0x41, 0xf5, 0x87, 0xec, 0x7b, 0x96, 0xdb, 0x25, 0x4c, 0xa6, 0x0d, 0x5d, 0x7e, 0xa2, + 0x8b, 0x30, 0x8d, 0x2d, 0xcb, 0x7d, 0xd1, 0xf1, 0x09, 0x13, 0x7f, 0x97, 0x89, 0xb1, 0xa1, 0x4f, + 0xb1, 0x51, 0x5d, 0x0c, 0x16, 0x1d, 0x48, 0xed, 0x08, 0x07, 0xf2, 0x29, 0x34, 0xe5, 0x79, 0x04, + 0xe8, 0x83, 0xe2, 0x38, 0x9d, 0xcd, 0x6d, 0x24, 0x69, 0x4e, 0x70, 0xfe, 0xa7, 0x06, 0x75, 0x11, + 0xb2, 0xe8, 0xc6, 0x83, 0xbe, 0x6d, 0x63, 0x7f, 0x20, 0x0d, 0x47, 0x7c, 0xa2, 0x65, 0x68, 0x75, + 0x09, 0xf5, 0x09, 0x5e, 0x28, 0xb3, 0xbf, 0xa6, 0x9e, 0x1c, 0x42, 0x17, 0x65, 0x5a, 0x5a, 0x56, + 0x66, 0x91, 0x32, 0x23, 0xbd, 0x08, 0xd3, 0x91, 0xaa, 0x71, 0xfc, 0x0a, 0xe3, 0x15, 0x29, 0xe0, + 0x47, 0x0c, 0xad, 0xe0, 0x04, 0xab, 0x47, 0x38, 0xc1, 0x2f, 0x35, 0x40, 0x62, 0x93, 0xc9, 0x04, + 0xec, 0x26, 0x15, 0x34, 0x1b, 0x15, 0x99, 0xc8, 0xbc, 0x22, 0x90, 0x53, 0xf7, 0x29, 0xb0, 0x8e, + 0x9d, 0x7d, 0x79, 0xb0, 0xa0, 0x4a, 0x0f, 0xd0, 0xd3, 0x62, 0xa1, 0xae, 0x66, 0x85, 0x9a, 0xd9, + 0x4c, 0x8e, 0x78, 0x3f, 0x06, 0x48, 0x24, 0xfa, 0xf7, 0x8b, 0xe7, 0x51, 0x1f, 0xaa, 0x9a, 0xf1, + 0x6f, 0x35, 0x98, 0x4c, 0xfa, 0x84, 0x61, 0x15, 0xd1, 0xb2, 0x2a, 0x92, 0x0d, 0x9c, 0x63, 0x8e, + 0x02, 0xbf, 0xac, 0x40, 0x8d, 0xdb, 0xfb, 0x21, 0x56, 0x73, 0x0a, 0x1a, 0x3e, 0x77, 0x99, 0x5d, + 0x1e, 0x27, 0xf5, 0xe8, 0x1b, 0x9d, 0x05, 0xe8, 0x12, 0xcf, 0x27, 0x06, 0x0e, 0x49, 0x97, 0x69, + 0x74, 0x43, 0x4f, 0x8c, 0xa0, 0x2b, 0x30, 0xc7, 0xfd, 0x00, 0xb1, 0xbd, 0x70, 0x90, 0x50, 0xe4, + 0x86, 0x3e, 0xc3, 0x00, 0x1b, 0x74, 0x9c, 0xab, 0x72, 0xe4, 0x63, 0xaa, 0x39, 0x3e, 0xa6, 0x76, + 0x90, 0x8f, 0xa9, 0xab, 0x7c, 0xcc, 0x6d, 0xa8, 0xf1, 0xac, 0x58, 0x95, 0x6b, 0x65, 0xae, 0x9d, + 0xba, 0x40, 0x46, 0xaf, 0xc4, 0x2a, 0xdf, 0x54, 0x1b, 0x6a, 0xa4, 0xec, 0xc9, 0x3c, 0x17, 0x46, + 0xce, 0x73, 0x5f, 0x85, 0xba, 0x70, 0xd2, 0xed, 0x56, 0x36, 0xd4, 0x3d, 0x24, 0x5d, 0x13, 0x53, + 0xef, 0x1d, 0xe8, 0x12, 0xad, 0x48, 0x19, 0x26, 0x8f, 0xa0, 0x0c, 0x3f, 0xd7, 0x60, 0x8e, 0x2b, + 0x43, 0xd2, 0xe4, 0xaf, 0x41, 0x8d, 0x3b, 0x7f, 0x61, 0xf1, 0x28, 0x1b, 0x2b, 0x68, 0x52, 0xc4, + 0x71, 0x8e, 0x6d, 0xef, 0x0e, 0xcc, 0x2b, 0xe2, 0x0f, 0xfa, 0xb8, 0xd8, 0x0c, 0x57, 0x32, 0xfb, + 0xcc, 0xec, 0x23, 0xc7, 0x28, 0xbf, 0x2b, 0x41, 0x85, 0x26, 0x32, 0x54, 0xe9, 0x42, 0x33, 0xb4, + 0x64, 0xbc, 0xe4, 0x1f, 0x87, 0xf0, 0xe2, 0x97, 0x61, 0x36, 0x24, 0xbe, 0x1d, 0x74, 0xdc, 0x5e, + 0x87, 0x2a, 0x9a, 0x69, 0xc8, 0xd8, 0x38, 0xcd, 0xc6, 0xb7, 0x7a, 0x8f, 0xf9, 0x28, 0xcd, 0xf7, + 0x0c, 0x9e, 0x24, 0x8b, 0xc4, 0x67, 0x3e, 0x9d, 0xca, 0x30, 0x90, 0x2e, 0x71, 0x28, 0xba, 0x65, + 0x1a, 0xc4, 0x09, 0x88, 0xc8, 0x7c, 0xe6, 0xd3, 0x77, 0x03, 0x06, 0xd2, 0x25, 0x0e, 0x35, 0x0f, + 0x9a, 0x5c, 0xf1, 0x88, 0xc9, 0x22, 0x91, 0xf8, 0x2c, 0xd2, 0x92, 0xfa, 0xe8, 0x5a, 0x92, 0x0c, + 0x79, 0x8d, 0x54, 0xc8, 0x5b, 0xf9, 0x04, 0x9a, 0xf7, 0x43, 0x62, 0xf3, 0x8a, 0xcf, 0xc3, 0xbc, + 0x8a, 0x4f, 0xf9, 0x60, 0xd3, 0xcb, 0xd6, 0x7b, 0x56, 0xbe, 0x80, 0xba, 0xd8, 0xf2, 0x21, 0x6f, + 0x18, 0x63, 0x76, 0x94, 0xff, 0x2a, 0x41, 0x85, 0xde, 0xc7, 0x68, 0x6a, 0x4f, 0x95, 0x87, 0xf3, + 0xf4, 0x49, 0x4f, 0xa6, 0xf6, 0xd1, 0xa0, 0x4e, 0x7a, 0x34, 0x07, 0x8b, 0x91, 0xcc, 0xae, 0xd4, + 0x9b, 0x68, 0xec, 0x7e, 0x17, 0xbd, 0xab, 0xb8, 0x57, 0x9f, 0x19, 0xf2, 0x2c, 0xe9, 0xba, 0x4f, + 0xea, 0x4a, 0xfd, 0x43, 0x98, 0x4c, 0x5c, 0x8a, 0x07, 0x42, 0xa3, 0x4e, 0x0f, 0x31, 0x48, 0x55, + 0x7d, 0x5a, 0xf1, 0x45, 0x38, 0x93, 0x9e, 0x54, 0xb3, 0x8a, 0x7d, 0x05, 0x6a, 0x3c, 0x61, 0x17, + 0xf7, 0x64, 0x55, 0x4a, 0x2f, 0x30, 0xc6, 0xac, 0x62, 0x2b, 0x03, 0x98, 0xa1, 0x67, 0x9d, 0xf4, + 0x42, 0x2f, 0x43, 0x85, 0xde, 0x7d, 0x85, 0x0f, 0x9a, 0x1d, 0xbe, 0x26, 0x6f, 0x4e, 0xe8, 0x0c, + 0x7e, 0x6c, 0xff, 0xf3, 0x39, 0xcc, 0x65, 0xae, 0xdd, 0xa3, 0x17, 0xdc, 0x86, 0x56, 0x9f, 0xe3, + 0x7b, 0xfe, 0x58, 0x82, 0x66, 0xe4, 0xd6, 0x13, 0xe1, 0x49, 0x3b, 0x62, 0x78, 0x2a, 0x8d, 0x10, + 0x9e, 0xca, 0x23, 0x87, 0xa7, 0xd7, 0xa0, 0x41, 0x44, 0x62, 0x2c, 0xb4, 0x2d, 0x75, 0xb0, 0x51, + 0xbe, 0xad, 0x47, 0x68, 0xe3, 0xce, 0x49, 0x3f, 0x03, 0x88, 0xa3, 0x20, 0xda, 0x2a, 0x16, 0xca, + 0xa9, 0x0c, 0xeb, 0x88, 0x36, 0x47, 0x1c, 0x1b, 0xd0, 0x90, 0x4b, 0x50, 0xfa, 0x98, 0x28, 0x5f, + 0x2f, 0x15, 0xe5, 0xeb, 0x2b, 0x9f, 0xc1, 0x82, 0xaa, 0xe8, 0xaa, 0x64, 0xf9, 0x5a, 0x9a, 0x65, + 0xa1, 0xf9, 0x0a, 0xf6, 0x04, 0xda, 0x79, 0xc5, 0x44, 0xe5, 0x14, 0xb7, 0xd3, 0x53, 0x9c, 0x53, + 0xd5, 0x89, 0x92, 0x7a, 0x25, 0xa6, 0xd9, 0x82, 0xa9, 0xd4, 0x5d, 0x48, 0xc9, 0xfb, 0x4a, 0x9a, + 0xf7, 0x82, 0x4a, 0x1f, 0x24, 0x43, 0x03, 0x4e, 0xe4, 0xe4, 0xe1, 0x4a, 0xd6, 0xaf, 0xa7, 0x59, + 0x9f, 0x55, 0x28, 0xaa, 0x62, 0xd5, 0x18, 0x96, 0xd4, 0xd1, 0x5f, 0x39, 0xc7, 0x5a, 0x7a, 0x8e, + 0x33, 0xd9, 0xc4, 0x46, 0x31, 0x85, 0x14, 0xef, 0xb0, 0x83, 0x1a, 0x55, 0xbc, 0xc3, 0x2e, 0x42, + 0xb0, 0xff, 0x31, 0x4c, 0xa7, 0x95, 0x55, 0xc9, 0xf8, 0x6a, 0x9a, 0xf1, 0xa2, 0x32, 0x51, 0x94, + 0x2c, 0x77, 0xe0, 0xa4, 0x28, 0xd9, 0x8b, 0xe8, 0x71, 0xd0, 0xb2, 0xdf, 0x48, 0x73, 0x5f, 0x56, + 0x56, 0x7b, 0x0b, 0x74, 0x46, 0xf6, 0x06, 0x46, 0xd6, 0x99, 0xa8, 0xa9, 0x20, 0x18, 0x3e, 0x83, + 0xd3, 0x8c, 0x61, 0x5c, 0xdc, 0x1d, 0x1c, 0xb4, 0xf6, 0x37, 0xd3, 0xec, 0x57, 0xd4, 0x35, 0xe2, + 0x81, 0x62, 0xf5, 0xd2, 0xb0, 0x64, 0x45, 0xfc, 0x38, 0x86, 0xa5, 0xe0, 0x31, 0xac, 0xa2, 0x19, + 0x8f, 0x3e, 0xb2, 0x8a, 0x66, 0x63, 0x82, 0x98, 0xe2, 0x39, 0x9c, 0xe5, 0x53, 0xa4, 0x6a, 0xcd, + 0x07, 0x4d, 0xf5, 0x76, 0x7a, 0xaa, 0x8b, 0xf9, 0x25, 0x6d, 0xc5, 0x94, 0x9f, 0xc2, 0xbc, 0x98, + 0x92, 0xe6, 0x03, 0x1f, 0x61, 0xdf, 0xc4, 0xdb, 0x96, 0x7a, 0x9e, 0x57, 0xd3, 0xf3, 0x9c, 0xca, + 0xa6, 0x15, 0x92, 0x5c, 0x32, 0xff, 0x01, 0xb4, 0x38, 0x73, 0x56, 0x12, 0x55, 0x32, 0x5d, 0x48, + 0x32, 0x6d, 0x4a, 0xc2, 0xff, 0x68, 0xd0, 0xdc, 0xc2, 0xfd, 0x70, 0xf7, 0x7d, 0xcb, 0x7d, 0x81, + 0xae, 0xc2, 0x1c, 0xfd, 0xdf, 0xf5, 0xcd, 0x9f, 0xf1, 0x68, 0x44, 0x33, 0x46, 0xce, 0x64, 0x36, + 0x05, 0xf8, 0xd0, 0xb7, 0xd0, 0x69, 0x68, 0x86, 0xee, 0x33, 0xc2, 0x91, 0x38, 0xd3, 0x06, 0x1b, + 0xa0, 0xc0, 0x73, 0xd0, 0xf2, 0x49, 0xcf, 0x27, 0xc1, 0x2e, 0x03, 0xf3, 0x74, 0x1f, 0xc4, 0x10, + 0x45, 0xb8, 0x4a, 0x63, 0xb9, 0xeb, 0x45, 0xed, 0x0e, 0x65, 0x65, 0x57, 0xa0, 0x8c, 0x3b, 0x4a, + 0xfe, 0xad, 0x04, 0x10, 0x6d, 0x9a, 0x85, 0x6d, 0xd3, 0xf6, 0x2c, 0xd3, 0x30, 0x43, 0x91, 0x58, + 0xa4, 0xbc, 0x45, 0x84, 0xa9, 0x47, 0x68, 0x94, 0xc4, 0xc3, 0x41, 0xf0, 0xc2, 0xf5, 0xbb, 0x2a, + 0x07, 0x93, 0x20, 0x91, 0x68, 0xe8, 0x1e, 0x20, 0xc3, 0x32, 0x89, 0x13, 0x76, 0x0c, 0x9f, 0x74, + 0x89, 0x13, 0x9a, 0xd8, 0x92, 0x49, 0x46, 0x0e, 0xf1, 0x1c, 0x27, 0xb8, 0x1b, 0xe3, 0x53, 0x2e, + 0x69, 0x09, 0x19, 0xb2, 0xa2, 0x98, 0xcf, 0x25, 0x45, 0x70, 0xd7, 0xed, 0x8e, 0xbd, 0x12, 0xf6, + 0x18, 0x6a, 0x5b, 0xdb, 0x9f, 0x13, 0x23, 0x1c, 0x67, 0x2d, 0xe8, 0xeb, 0x2a, 0x34, 0xb7, 0xe4, + 0x6d, 0x80, 0x6a, 0x34, 0x2b, 0x39, 0x53, 0x3e, 0x4d, 0x51, 0x61, 0x4e, 0x5c, 0xb3, 0x4a, 0x85, + 0x95, 0xc5, 0x72, 0x36, 0x75, 0xcf, 0x54, 0xa7, 0x2b, 0x23, 0x55, 0xa7, 0x87, 0x6f, 0x2f, 0xd5, + 0xec, 0xed, 0xe5, 0x47, 0xa9, 0xdb, 0x4b, 0x2d, 0x9b, 0x06, 0x2b, 0xe3, 0x44, 0xf2, 0x02, 0xb3, + 0x31, 0x74, 0x81, 0xa9, 0x1f, 0xda, 0x5f, 0xa7, 0xee, 0x31, 0x6b, 0xc9, 0xfe, 0x66, 0x43, 0x95, + 0xef, 0x0b, 0x60, 0xb2, 0xa7, 0x79, 0xec, 0xfe, 0x59, 0xba, 0xda, 0x05, 0x99, 0x6a, 0x57, 0xb2, + 0x01, 0xd1, 0x1a, 0xb5, 0x01, 0x91, 0x68, 0xa6, 0x4c, 0x1e, 0xdc, 0x4c, 0x29, 0xd0, 0xf6, 0xa9, + 0x23, 0x68, 0xfb, 0x9f, 0x2a, 0xd0, 0x8c, 0x64, 0xa7, 0x74, 0xb5, 0xd3, 0x50, 0x32, 0x65, 0x25, + 0xa4, 0x64, 0x3a, 0x87, 0x50, 0xc7, 0x64, 0xdd, 0xb0, 0x52, 0x58, 0x37, 0xac, 0x1e, 0xae, 0x6e, + 0x58, 0x3b, 0xa0, 0x6e, 0x58, 0xcf, 0xa9, 0x1b, 0x36, 0x0e, 0xaa, 0x1b, 0x36, 0x8b, 0xeb, 0x86, + 0x70, 0xc4, 0x8b, 0x59, 0x6b, 0x84, 0x8b, 0xd9, 0xe4, 0x71, 0xea, 0x86, 0x53, 0xc7, 0xae, 0x1b, + 0x4e, 0x1f, 0x41, 0x67, 0x7e, 0xa5, 0xc1, 0x82, 0x32, 0xb9, 0xbc, 0x0d, 0xcd, 0xc8, 0xe2, 0x55, + 0xc1, 0x27, 0x22, 0xa2, 0x97, 0xf1, 0x08, 0xf3, 0xd8, 0x77, 0xf8, 0x10, 0x96, 0xd4, 0x8f, 0x12, + 0xd0, 0x27, 0xc5, 0x1e, 0xfc, 0xa2, 0xe2, 0x99, 0x8b, 0xc2, 0x8d, 0xa9, 0x5d, 0xfa, 0x7f, 0x2b, + 0xd0, 0x88, 0x32, 0xdf, 0x39, 0xa8, 0x24, 0x8a, 0x43, 0x65, 0x9d, 0xf4, 0x8e, 0xe5, 0xd0, 0x2f, + 0x41, 0x79, 0x87, 0x84, 0xca, 0x48, 0x18, 0x95, 0x9d, 0x28, 0x06, 0x45, 0xf4, 0xfa, 0xa1, 0x28, + 0x18, 0xe6, 0x21, 0x7a, 0xfd, 0x10, 0xbd, 0x02, 0x15, 0xcf, 0x0d, 0x42, 0x51, 0xdb, 0xc9, 0xc1, + 0x64, 0x28, 0xe8, 0x3a, 0xd4, 0xba, 0xc4, 0x22, 0x21, 0x11, 0x3e, 0x3a, 0x07, 0x59, 0x20, 0xa1, + 0x9b, 0x50, 0x77, 0xd9, 0xaa, 0x95, 0xfe, 0x38, 0xc6, 0x97, 0x58, 0x74, 0x29, 0xbb, 0x04, 0x77, + 0x85, 0x23, 0xce, 0x5b, 0x0a, 0x45, 0xa1, 0xf7, 0x1e, 0x0f, 0x87, 0xc6, 0xae, 0xb0, 0xc4, 0x1c, + 0x5c, 0x8e, 0x43, 0x91, 0x43, 0x1f, 0x1b, 0xd2, 0xfc, 0xf2, 0x90, 0x19, 0xce, 0x88, 0x4e, 0x37, + 0x1d, 0xfe, 0xa6, 0x8e, 0x10, 0xfe, 0xc6, 0x6c, 0x82, 0x5f, 0x6a, 0x50, 0x65, 0xad, 0xf3, 0xff, + 0xf3, 0xc3, 0x2d, 0x02, 0x10, 0x9b, 0xc4, 0xe8, 0x55, 0xfb, 0xac, 0x37, 0x55, 0xdb, 0xda, 0x59, + 0x68, 0xc6, 0x5e, 0x26, 0x6b, 0x6b, 0x2b, 0x03, 0x38, 0x99, 0xfb, 0x20, 0x08, 0xfd, 0xb4, 0x78, + 0x55, 0x97, 0x32, 0xab, 0xca, 0xc9, 0x43, 0xd4, 0x4b, 0xfb, 0xab, 0x06, 0x2d, 0x3d, 0xbf, 0xd0, + 0xaa, 0x68, 0xab, 0x25, 0xfc, 0x77, 0xe9, 0x70, 0xfe, 0x3b, 0x19, 0x50, 0xcb, 0x43, 0x01, 0x75, + 0xcc, 0x6f, 0x68, 0xbe, 0xd6, 0x60, 0x29, 0xe7, 0xfa, 0xfd, 0xce, 0x50, 0x06, 0xc7, 0x1d, 0xfc, + 0x89, 0x9c, 0x0c, 0x6e, 0x73, 0x22, 0x9d, 0xb8, 0x1d, 0xd7, 0xc9, 0xff, 0xbe, 0x04, 0x0d, 0x99, + 0xdc, 0x1d, 0xe2, 0x90, 0x8f, 0xf1, 0xe4, 0x21, 0x21, 0x9f, 0xf2, 0xe1, 0xe4, 0x13, 0x3d, 0xea, + 0xaa, 0x8c, 0xf0, 0xa8, 0x6b, 0xcc, 0xd7, 0x96, 0xaf, 0x34, 0x98, 0x57, 0x95, 0x32, 0x6e, 0x51, + 0xdd, 0xe1, 0xc3, 0xaa, 0x27, 0x94, 0x92, 0x64, 0x73, 0x42, 0x8f, 0xf0, 0x8e, 0x2d, 0xab, 0x7f, + 0x6b, 0xd4, 0x5e, 0x65, 0xf6, 0xfd, 0x16, 0xd4, 0xbb, 0xfc, 0x59, 0x96, 0xea, 0x35, 0xa3, 0xaa, + 0x74, 0x22, 0xf1, 0xd1, 0x53, 0x58, 0x94, 0x8b, 0x4a, 0xb7, 0x95, 0x4a, 0x39, 0x4f, 0x2e, 0x55, + 0xdc, 0xe6, 0x7d, 0xc5, 0xb1, 0x8c, 0xb9, 0x5d, 0xe4, 0xc3, 0xa2, 0xf2, 0x65, 0xe5, 0xe8, 0x8f, + 0x46, 0x55, 0x3b, 0x50, 0x7b, 0x9e, 0x6f, 0x5b, 0x50, 0xe3, 0x0e, 0x94, 0x3a, 0x08, 0xa7, 0x6f, + 0x59, 0x78, 0x5b, 0xf4, 0x33, 0x1b, 0x7a, 0xf4, 0x8d, 0xde, 0x83, 0xa9, 0x6e, 0xf2, 0xb1, 0x9a, + 0x10, 0x68, 0x2a, 0x52, 0xa4, 0x5e, 0xb3, 0xe9, 0x69, 0x7c, 0x74, 0x9a, 0x6a, 0x03, 0xee, 0x76, + 0x5c, 0xc7, 0x1a, 0xc4, 0xee, 0x07, 0x77, 0xb7, 0x1c, 0x6b, 0x80, 0xce, 0x00, 0xbc, 0xf0, 0xcd, + 0x90, 0x70, 0x28, 0xcf, 0xf6, 0x9b, 0x6c, 0x84, 0x81, 0xcf, 0x43, 0x79, 0xdf, 0xb6, 0x44, 0x7e, + 0x92, 0x4a, 0x88, 0x9f, 0xda, 0x96, 0x4e, 0x61, 0xd9, 0xcb, 0x6b, 0x6d, 0xa4, 0xcb, 0x6b, 0x22, + 0xed, 0xae, 0x1f, 0x90, 0x76, 0xa7, 0xef, 0x1e, 0x8d, 0xcc, 0xdd, 0x23, 0x6a, 0x09, 0x37, 0x93, + 0x2d, 0xe1, 0x73, 0xd0, 0xb2, 0xfb, 0x56, 0x68, 0x7a, 0x16, 0xe9, 0xb8, 0x3d, 0x96, 0x89, 0x68, + 0x3a, 0xc8, 0xa1, 0x2d, 0x96, 0xe8, 0xd9, 0x78, 0xdf, 0xb4, 0xfb, 0x36, 0xcb, 0x3c, 0x34, 0x5d, + 0x7e, 0xa2, 0xab, 0x30, 0x47, 0xf6, 0x0d, 0xab, 0x1f, 0x98, 0x7b, 0xa4, 0x23, 0x71, 0x26, 0xd9, + 0xbc, 0xb3, 0x11, 0xe0, 0xa1, 0x40, 0xa6, 0x6c, 0x4c, 0x87, 0xa1, 0x4c, 0x09, 0x36, 0xfc, 0x73, + 0x88, 0x8d, 0xc0, 0x99, 0x1e, 0x66, 0x23, 0x90, 0xcf, 0x00, 0xd8, 0x78, 0xbf, 0x63, 0x11, 0x67, + 0x27, 0xdc, 0x6d, 0xcf, 0x2c, 0x6b, 0x97, 0xcb, 0x7a, 0xd3, 0xc6, 0xfb, 0x0f, 0xd8, 0x00, 0x03, + 0x9b, 0x8e, 0x04, 0xcf, 0x0a, 0xb0, 0xe9, 0x08, 0x70, 0x1b, 0xea, 0x1e, 0x0e, 0xe9, 0xf1, 0xb6, + 0xe7, 0x78, 0xd2, 0x2a, 0x3e, 0xa9, 0x16, 0x50, 0xbe, 0x66, 0x48, 0xec, 0xa0, 0x8d, 0x18, 0x5d, + 0xc3, 0xc6, 0xfb, 0xac, 0x01, 0xcc, 0x80, 0xa6, 0x23, 0x80, 0xf3, 0x02, 0x68, 0x3a, 0x1c, 0x78, + 0x1e, 0x26, 0xfb, 0x8e, 0xf9, 0xbc, 0x4f, 0x04, 0x7c, 0x81, 0xad, 0xbc, 0xc5, 0xc7, 0x38, 0xca, + 0x45, 0x98, 0xa6, 0xcc, 0x13, 0xe6, 0xb1, 0xc8, 0x98, 0x4c, 0xd9, 0x78, 0x3f, 0x91, 0x5f, 0x50, + 0x34, 0xd3, 0x49, 0xa2, 0x2d, 0x09, 0x34, 0xd3, 0x49, 0xa0, 0x25, 0xc3, 0xe5, 0x09, 0x56, 0x62, + 0x89, 0xc3, 0xe5, 0x2a, 0x54, 0x88, 0xd3, 0xb7, 0xdb, 0xed, 0xec, 0x6b, 0x3f, 0xaa, 0x2b, 0x0c, + 0xc8, 0xea, 0x33, 0x03, 0x8f, 0xb4, 0x4f, 0xf2, 0x6b, 0x30, 0xfd, 0x1f, 0xbd, 0x0e, 0x35, 0x6c, + 0x59, 0x54, 0x03, 0x4e, 0x1d, 0xa6, 0xa5, 0x5d, 0xc5, 0x96, 0xb5, 0xd5, 0xa3, 0x54, 0xae, 0xc3, + 0xf4, 0xe6, 0xf4, 0xa1, 0xa8, 0x5c, 0x87, 0x70, 0x2a, 0xec, 0x0c, 0x28, 0xd5, 0x4b, 0x87, 0x9b, + 0xcb, 0x19, 0x6c, 0xf5, 0xd0, 0x05, 0x28, 0x3b, 0x6e, 0xd8, 0x3e, 0xa3, 0xe8, 0xde, 0x32, 0x12, + 0x9d, 0x82, 0x69, 0x96, 0xcc, 0xc5, 0x70, 0x36, 0xeb, 0xd7, 0xa3, 0x6e, 0xbe, 0xce, 0x71, 0xd0, + 0x1b, 0x00, 0x89, 0xc3, 0x3e, 0x97, 0x8d, 0x86, 0xf1, 0xa9, 0xeb, 0x09, 0xcc, 0x7c, 0xaf, 0xb7, + 0xcc, 0x58, 0xa4, 0xbc, 0x5e, 0xde, 0x6f, 0x48, 0xd4, 0x5e, 0x0f, 0xbd, 0x16, 0x47, 0x93, 0xf3, + 0xd9, 0x04, 0x24, 0xf1, 0xfe, 0x37, 0x8e, 0x22, 0x43, 0xd9, 0xc2, 0x4a, 0x36, 0x5b, 0x58, 0x82, + 0x5a, 0xcf, 0xf5, 0x6d, 0x1c, 0xb6, 0x57, 0x19, 0x50, 0x7c, 0x15, 0x45, 0x89, 0x0b, 0x47, 0x7c, + 0x70, 0x93, 0xed, 0x03, 0x5c, 0x1b, 0x6a, 0x04, 0x2b, 0x44, 0xc7, 0x5e, 0x21, 0x73, 0x57, 0x3f, + 0x86, 0x07, 0x37, 0x8a, 0x1f, 0x10, 0x7c, 0x7f, 0xa9, 0xfb, 0x22, 0xcc, 0x2b, 0xca, 0x5f, 0x2b, + 0x7f, 0x2f, 0xc1, 0x74, 0xba, 0xcb, 0x10, 0x59, 0x9d, 0x96, 0xb0, 0xba, 0x83, 0xdf, 0xe3, 0xc8, + 0x92, 0x55, 0x39, 0x53, 0xb2, 0xaa, 0x44, 0x25, 0xab, 0x25, 0x71, 0xc2, 0xf2, 0x85, 0x99, 0xf8, + 0x42, 0xab, 0x30, 0xb5, 0x4d, 0xb0, 0x4f, 0xfc, 0x8e, 0x90, 0x3e, 0x7f, 0x49, 0x33, 0xc9, 0x07, + 0xdf, 0xe7, 0x3a, 0x70, 0x0d, 0xaa, 0x3d, 0xcb, 0x7d, 0x21, 0x9f, 0xfe, 0x2f, 0x29, 0xeb, 0xd2, + 0x81, 0xce, 0x91, 0xd0, 0x75, 0x98, 0xa7, 0xf0, 0x8e, 0xd9, 0xed, 0x18, 0xae, 0xe3, 0x10, 0x23, + 0x64, 0x2d, 0x03, 0xfe, 0x72, 0x66, 0x96, 0x82, 0xee, 0x77, 0xef, 0x72, 0xc0, 0x87, 0xc5, 0xaf, + 0x56, 0x8e, 0xf2, 0x30, 0xf8, 0x1b, 0x0d, 0x4e, 0xe6, 0x77, 0x81, 0x36, 0x60, 0x66, 0xe8, 0xf7, + 0x0c, 0x42, 0xe3, 0x4e, 0xe5, 0xf7, 0x7e, 0x36, 0x27, 0xf4, 0xe9, 0xf4, 0x6f, 0x18, 0x8e, 0xad, + 0x81, 0x5f, 0xc0, 0xe9, 0x82, 0x9f, 0x4c, 0xa0, 0x4e, 0xb1, 0x26, 0x5e, 0xc9, 0x6a, 0x62, 0x6e, + 0xb3, 0x4a, 0xad, 0x91, 0x7f, 0xd1, 0xa0, 0xc6, 0x2f, 0xf8, 0xf2, 0x19, 0x91, 0x16, 0x3f, 0x23, + 0x3a, 0x58, 0xe1, 0xde, 0x82, 0xe6, 0x9e, 0x68, 0x58, 0xc9, 0x8e, 0xc7, 0xe9, 0xfc, 0x9e, 0x56, + 0xa0, 0xc7, 0xd8, 0xe3, 0xbe, 0xab, 0x7d, 0xab, 0x51, 0x1b, 0x1a, 0x6e, 0xc0, 0xb1, 0xf0, 0x26, + 0x3a, 0x0b, 0x2c, 0x9a, 0xb5, 0x63, 0x8f, 0x29, 0x0a, 0x51, 0x39, 0x8e, 0x51, 0x51, 0x88, 0x1a, + 0xf3, 0x8a, 0x77, 0x60, 0x66, 0xe8, 0x78, 0xd0, 0x93, 0x62, 0x71, 0x9f, 0x53, 0x88, 0x3b, 0xd5, + 0x33, 0x54, 0xcb, 0xf8, 0x39, 0x2c, 0x3d, 0xce, 0x7b, 0xce, 0xf6, 0x3d, 0xfd, 0x2a, 0x64, 0x15, + 0x5a, 0xbc, 0xd3, 0xb7, 0xee, 0xfb, 0x78, 0x10, 0x77, 0x28, 0xb9, 0x28, 0x44, 0x87, 0xf2, 0x63, + 0xa8, 0x8b, 0x76, 0x20, 0x7a, 0x50, 0xbc, 0xf1, 0x13, 0xd9, 0x8d, 0x33, 0xc2, 0xbc, 0x77, 0x8d, + 0x1a, 0x94, 0x9f, 0x60, 0x75, 0xb3, 0xf4, 0x60, 0x9d, 0xce, 0xe4, 0xe0, 0xe5, 0x71, 0xfd, 0xbc, + 0xe1, 0x28, 0x5a, 0xf2, 0x0f, 0x0d, 0xca, 0x4f, 0x6d, 0x4b, 0xb9, 0x97, 0x97, 0xa0, 0x49, 0xff, + 0x06, 0x1e, 0x36, 0x64, 0xf3, 0x37, 0x1e, 0xa0, 0x8e, 0xde, 0xf3, 0x49, 0xcf, 0xdc, 0x17, 0xba, + 0x2c, 0xbe, 0x28, 0x15, 0x0e, 0x43, 0xdf, 0xdc, 0xee, 0x87, 0xf2, 0x15, 0x72, 0x3c, 0x40, 0x0d, + 0xe4, 0x85, 0x8f, 0x3d, 0x2f, 0x6a, 0x48, 0xc8, 0xcf, 0x31, 0xff, 0x4c, 0xe1, 0xce, 0xcb, 0x30, + 0xed, 0xfa, 0x3b, 0x92, 0xa4, 0xb3, 0xb7, 0x76, 0x67, 0x52, 0xfc, 0xf8, 0xf6, 0x91, 0xef, 0x86, + 0xee, 0x23, 0xed, 0x9b, 0x52, 0x79, 0x6b, 0xfd, 0xf1, 0x76, 0x8d, 0xfd, 0x52, 0x75, 0xed, 0x7f, + 0x01, 0x00, 0x00, 0xff, 0xff, 0xae, 0xd1, 0xdd, 0x50, 0xa5, 0x3b, 0x00, 0x00, +} diff --git a/vendor/github.com/googleapis/gnostic/openapiv3/OpenAPIv3.proto b/vendor/github.com/googleapis/gnostic/openapiv3/OpenAPIv3.proto new file mode 100644 index 0000000000..43a4d57d85 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/openapiv3/OpenAPIv3.proto @@ -0,0 +1,670 @@ +// Copyright 2017 Google Inc. 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"; + +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; + } +} + +message AnysOrExpressions { + repeated NamedAnyOrExpression additional_properties = 1; +} + +// 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; + AnysOrExpressions 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 AnyOrExpression as ordered (name,value) pairs. +message NamedAnyOrExpression { + // Map key + string name = 1; + // Mapped value + AnyOrExpression 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; +} + +// 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; +} + +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 { +} + +// 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/googleapis/gnostic/openapiv3/README.md b/vendor/github.com/googleapis/gnostic/openapiv3/README.md new file mode 100644 index 0000000000..b5a17275be --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/openapiv3/README.md @@ -0,0 +1,25 @@ +# 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/googleapis/gnostic/openapiv3/openapi-3.0.json b/vendor/github.com/googleapis/gnostic/openapiv3/openapi-3.0.json new file mode 100644 index 0000000000..aad0d1b65e --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/openapiv3/openapi-3.0.json @@ -0,0 +1,1245 @@ +{ + "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" + } + } + }, + "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/googleapis/gnostic/openapiv3/openapi-3.1.json b/vendor/github.com/googleapis/gnostic/openapiv3/openapi-3.1.json new file mode 100644 index 0000000000..3e666659e0 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/openapiv3/openapi-3.1.json @@ -0,0 +1,1253 @@ +{ + "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" + }, + "summary": { + "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" + } + } + }, + "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": 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/googleapis/gnostic/plugins/README.md b/vendor/github.com/googleapis/gnostic/plugins/README.md new file mode 100644 index 0000000000..b34b968c28 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/plugins/README.md @@ -0,0 +1,29 @@ +# Plugins + +This directory contains support code for building Gnostic plugins and associated examples. + +Plugins are used to process API descriptions and can perform tasks like documentation and +code generation. Plugins can be written in any language that is supported by the Protocol +Buffer tools. + +This directory contains several sample plugins and two support tools that make it easier +to test plugins by running them standalone. + +* `gnostic-plugin-request` is a plugin that captures a plugin request and writes it in +.json and binary .pb form. When the optional -verbose flag is provided, this plugin logs +the request to stdout. +* `gnostic-process-plugin-response` is a standalone tool that reads a plugin response on +stdin and handles the response in the same way that gnostic does. + +For example, this writes the plugin request to local files `plugin-request.json` and +`plugin-request.pb`. + +`% gnostic myapi.json --plugin-request-out=.` + +Then a plugin can be run standalone: + +`% gnostic-go-generator --plugin < plugin-request.pb > plugin-response.pb` + +Then you can use the following to process the plugin response: + +`% gnostic-process-plugin-response -output=. < plugin-response.pb` \ No newline at end of file diff --git a/vendor/github.com/googleapis/gnostic/plugins/environment.go b/vendor/github.com/googleapis/gnostic/plugins/environment.go new file mode 100644 index 0000000000..f0ca035be1 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/plugins/environment.go @@ -0,0 +1,235 @@ +package gnostic_plugin_v1 + +import ( + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "os" + "path" + "strings" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes/any" + + openapiv2 "github.com/googleapis/gnostic/openapiv2" + openapiv3 "github.com/googleapis/gnostic/openapiv3" + discovery "github.com/googleapis/gnostic/discovery" + surface "github.com/googleapis/gnostic/surface" +) + +// Environment contains the environment of a plugin call. +type Environment struct { + Request *Request // plugin request object + Response *Response // response message + Invocation string // string representation of call + RunningAsPlugin bool // true if app is being run as a plugin + Verbose bool // if true, plugin should log details to stderr +} + +// NewEnvironment creates a plugin context from arguments and standard input. +func NewEnvironment() (env *Environment, err error) { + env = &Environment{ + Invocation: os.Args[0], + Response: &Response{}, + } + + input := flag.String("input", "", "API description (in binary protocol buffer form)") + output := flag.String("output", "-", "Output file or directory") + plugin := flag.Bool("plugin", false, "Run as a gnostic plugin (other flags are ignored).") + verbose := flag.Bool("verbose", false, "Write details to stderr.") + flag.Parse() + + env.RunningAsPlugin = *plugin + env.Verbose = *verbose + programName := path.Base(os.Args[0]) + + if (*input == "") && !*plugin { + flag.Usage = func() { + fmt.Fprintf(os.Stderr, "\n") + fmt.Fprintf(os.Stderr, programName+" is a gnostic plugin.\n") + fmt.Fprintf(os.Stderr, ` +When it is run from gnostic, the -plugin option is specified and gnostic +writes a binary request to stdin and waits for a binary response on stdout. + +This program can also be run standalone using the other flags listed below. +When the -plugin option is specified, these flags are ignored.`) + fmt.Fprintf(os.Stderr, "\n\nUsage:\n") + flag.PrintDefaults() + } + flag.Usage() + os.Exit(0) + } + + if env.RunningAsPlugin { + // Handle invocation as a plugin. + + // Read the plugin input. + pluginData, err := ioutil.ReadAll(os.Stdin) + env.RespondAndExitIfError(err) + if len(pluginData) == 0 { + env.RespondAndExitIfError(fmt.Errorf("no input data")) + } + + // Deserialize the request from the input. + request := &Request{} + err = proto.Unmarshal(pluginData, request) + env.RespondAndExitIfError(err) + + // Collect parameters passed to the plugin. + parameters := request.Parameters + for _, parameter := range parameters { + env.Invocation += " " + parameter.Name + "=" + parameter.Value + } + + // Log the invocation. + //log.Printf("Running plugin %s", env.Invocation) + + env.Request = request + + } else { + // Handle invocation from the command line. + + // Read the input document. + apiData, err := ioutil.ReadFile(*input) + if len(apiData) == 0 { + env.RespondAndExitIfError(fmt.Errorf("no input data")) + } + + env.Request = &Request{} + env.Request.OutputPath = *output + env.Request.SourceName = path.Base(*input) + + // First try to unmarshal OpenAPI v2. + documentv2 := &openapiv2.Document{} + err = proto.Unmarshal(apiData, documentv2) + if err == nil { + env.Request.AddModel("openapi.v2.Document", documentv2) + sourceName := guessSourceName(*input) + // include experimental API surface model + surfaceModel, err := surface.NewModelFromOpenAPI2(documentv2, sourceName) + if err == nil { + env.Request.AddModel("surface.v1.Model", surfaceModel) + } + return env, err + } + // If that failed, ignore deserialization errors and try to unmarshal OpenAPI v3. + documentv3 := &openapiv3.Document{} + err = proto.Unmarshal(apiData, documentv3) + if err == nil { + env.Request.AddModel("openapi.v3.Document", documentv3) + sourceName := guessSourceName(*input) + // include experimental API surface model + surfaceModel, err := surface.NewModelFromOpenAPI3(documentv3, sourceName) + if err == nil { + env.Request.AddModel("surface.v1.Model", surfaceModel) + } + return env, err + } + // If that failed, ignore deserialization errors and try to unmarshal a Discovery document. + discoveryDocument := &discovery.Document{} + err = proto.Unmarshal(apiData, discoveryDocument) + if err == nil { + env.Request.AddModel("discovery.v1.Document", discoveryDocument) + return env, err + } + // If we get here, we don't know what we got + err = errors.New("Unrecognized format for input") + return env, err + } + return env, err +} + +// RespondAndExitIfError checks an error and if it is non-nil, records it and serializes and returns the response and then exits. +func (env *Environment) RespondAndExitIfError(err error) { + if err != nil { + env.Response.Errors = append(env.Response.Errors, err.Error()) + env.RespondAndExit() + } +} + +// RespondAndExit serializes and returns the plugin response and then exits. +func (env *Environment) RespondAndExit() { + if env.RunningAsPlugin { + responseBytes, _ := proto.Marshal(env.Response) + os.Stdout.Write(responseBytes) + } else { + err := HandleResponse(env.Response, env.Request.OutputPath) + if err != nil { + log.Printf("%s", err.Error()) + } + } + os.Exit(0) +} + +func HandleResponse(response *Response, outputLocation string) error { + if response.Errors != nil { + return fmt.Errorf("Plugin error: %+v", response.Errors) + } + + // Write files to the specified directory. + var writer io.Writer + switch { + case outputLocation == "!": + // Write nothing. + case outputLocation == "-": + writer = os.Stdout + for _, file := range response.Files { + writer.Write([]byte("\n\n" + file.Name + " -------------------- \n")) + writer.Write(file.Data) + } + case isFile(outputLocation): + return fmt.Errorf("unable to overwrite %s", outputLocation) + default: // write files into a directory named by outputLocation + if !isDirectory(outputLocation) { + os.Mkdir(outputLocation, 0755) + } + for _, file := range response.Files { + p := outputLocation + "/" + file.Name + dir := path.Dir(p) + os.MkdirAll(dir, 0755) + f, _ := os.Create(p) + defer f.Close() + f.Write(file.Data) + } + } + return nil +} + +func (request *Request) AddModel(modelType string, model proto.Message) error { + modelBytes, err := proto.Marshal(model) + request.Models = append(request.Models, &any.Any{TypeUrl: modelType, Value: modelBytes}) + return err +} + +func isFile(path string) bool { + fileInfo, err := os.Stat(path) + if err != nil { + return false + } + return !fileInfo.IsDir() +} + +func isDirectory(path string) bool { + fileInfo, err := os.Stat(path) + if err != nil { + return false + } + return fileInfo.IsDir() +} + +// Guesses the sourceName from the binary input file name. E.g.: given input: some/path/swagger.pb +// check for some/path/swagger.yaml and some/path/swagger.json. +func guessSourceName(input string) string { + sourceName := strings.Replace(input, ".pb", ".yaml", -1) + if _, err := os.Stat(sourceName); os.IsNotExist(err) { + // sourceName does not exist. Lets try .json instead + sourceName = strings.Replace(input, ".pb", ".json", -1) + if _, err := os.Stat(sourceName); os.IsNotExist(err) { + return "" + } + } + return sourceName +} diff --git a/vendor/github.com/googleapis/gnostic/plugins/plugin.pb.go b/vendor/github.com/googleapis/gnostic/plugins/plugin.pb.go new file mode 100644 index 0000000000..1ca419baac --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/plugins/plugin.pb.go @@ -0,0 +1,524 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: plugins/plugin.proto + +package gnostic_plugin_v1 + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + any "github.com/golang/protobuf/ptypes/any" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type Message_Level int32 + +const ( + Message_UNKNOWN Message_Level = 0 + Message_INFO Message_Level = 1 + Message_WARNING Message_Level = 2 + Message_ERROR Message_Level = 3 + Message_FATAL Message_Level = 4 +) + +var Message_Level_name = map[int32]string{ + 0: "UNKNOWN", + 1: "INFO", + 2: "WARNING", + 3: "ERROR", + 4: "FATAL", +} + +var Message_Level_value = map[string]int32{ + "UNKNOWN": 0, + "INFO": 1, + "WARNING": 2, + "ERROR": 3, + "FATAL": 4, +} + +func (x Message_Level) String() string { + return proto.EnumName(Message_Level_name, int32(x)) +} + +func (Message_Level) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_5be178a99b712ecb, []int{3, 0} +} + +// The version number of gnostic. +type Version struct { + Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` + Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` + Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` + // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should + // be empty for mainline stable releases. + Suffix string `protobuf:"bytes,4,opt,name=suffix,proto3" json:"suffix,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Version) Reset() { *m = Version{} } +func (m *Version) String() string { return proto.CompactTextString(m) } +func (*Version) ProtoMessage() {} +func (*Version) Descriptor() ([]byte, []int) { + return fileDescriptor_5be178a99b712ecb, []int{0} +} + +func (m *Version) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Version.Unmarshal(m, b) +} +func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Version.Marshal(b, m, deterministic) +} +func (m *Version) XXX_Merge(src proto.Message) { + xxx_messageInfo_Version.Merge(m, src) +} +func (m *Version) XXX_Size() int { + return xxx_messageInfo_Version.Size(m) +} +func (m *Version) XXX_DiscardUnknown() { + xxx_messageInfo_Version.DiscardUnknown(m) +} + +var xxx_messageInfo_Version proto.InternalMessageInfo + +func (m *Version) GetMajor() int32 { + if m != nil { + return m.Major + } + return 0 +} + +func (m *Version) GetMinor() int32 { + if m != nil { + return m.Minor + } + return 0 +} + +func (m *Version) GetPatch() int32 { + if m != nil { + return m.Patch + } + return 0 +} + +func (m *Version) GetSuffix() string { + if m != nil { + return m.Suffix + } + return "" +} + +// A parameter passed to the plugin from (or through) gnostic. +type Parameter struct { + // The name of the parameter as specified in the option string + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The parameter value as specified in the option string + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Parameter) Reset() { *m = Parameter{} } +func (m *Parameter) String() string { return proto.CompactTextString(m) } +func (*Parameter) ProtoMessage() {} +func (*Parameter) Descriptor() ([]byte, []int) { + return fileDescriptor_5be178a99b712ecb, []int{1} +} + +func (m *Parameter) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Parameter.Unmarshal(m, b) +} +func (m *Parameter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Parameter.Marshal(b, m, deterministic) +} +func (m *Parameter) XXX_Merge(src proto.Message) { + xxx_messageInfo_Parameter.Merge(m, src) +} +func (m *Parameter) XXX_Size() int { + return xxx_messageInfo_Parameter.Size(m) +} +func (m *Parameter) XXX_DiscardUnknown() { + xxx_messageInfo_Parameter.DiscardUnknown(m) +} + +var xxx_messageInfo_Parameter proto.InternalMessageInfo + +func (m *Parameter) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Parameter) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// An encoded Request is written to the plugin's stdin. +type Request struct { + // filename or URL of the original source document + SourceName string `protobuf:"bytes,1,opt,name=source_name,json=sourceName,proto3" json:"source_name,omitempty"` + // Output path specified in the plugin invocation. + OutputPath string `protobuf:"bytes,2,opt,name=output_path,json=outputPath,proto3" json:"output_path,omitempty"` + // Plugin parameters parsed from the invocation string. + Parameters []*Parameter `protobuf:"bytes,3,rep,name=parameters,proto3" json:"parameters,omitempty"` + // The version number of gnostic. + CompilerVersion *Version `protobuf:"bytes,4,opt,name=compiler_version,json=compilerVersion,proto3" json:"compiler_version,omitempty"` + // API models + Models []*any.Any `protobuf:"bytes,5,rep,name=models,proto3" json:"models,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Request) Reset() { *m = Request{} } +func (m *Request) String() string { return proto.CompactTextString(m) } +func (*Request) ProtoMessage() {} +func (*Request) Descriptor() ([]byte, []int) { + return fileDescriptor_5be178a99b712ecb, []int{2} +} + +func (m *Request) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Request.Unmarshal(m, b) +} +func (m *Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Request.Marshal(b, m, deterministic) +} +func (m *Request) XXX_Merge(src proto.Message) { + xxx_messageInfo_Request.Merge(m, src) +} +func (m *Request) XXX_Size() int { + return xxx_messageInfo_Request.Size(m) +} +func (m *Request) XXX_DiscardUnknown() { + xxx_messageInfo_Request.DiscardUnknown(m) +} + +var xxx_messageInfo_Request proto.InternalMessageInfo + +func (m *Request) GetSourceName() string { + if m != nil { + return m.SourceName + } + return "" +} + +func (m *Request) GetOutputPath() string { + if m != nil { + return m.OutputPath + } + return "" +} + +func (m *Request) GetParameters() []*Parameter { + if m != nil { + return m.Parameters + } + return nil +} + +func (m *Request) GetCompilerVersion() *Version { + if m != nil { + return m.CompilerVersion + } + return nil +} + +func (m *Request) GetModels() []*any.Any { + if m != nil { + return m.Models + } + return nil +} + +// Plugins can return messages to be collated and reported by gnostic. +type Message struct { + // message severity + Level Message_Level `protobuf:"varint,1,opt,name=level,proto3,enum=gnostic.plugin.v1.Message_Level" json:"level,omitempty"` + // a unique message identifier + Code string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` + // message text + Text string `protobuf:"bytes,3,opt,name=text,proto3" json:"text,omitempty"` + // an associated key path in an API description + Keys []string `protobuf:"bytes,4,rep,name=keys,proto3" json:"keys,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Message) Reset() { *m = Message{} } +func (m *Message) String() string { return proto.CompactTextString(m) } +func (*Message) ProtoMessage() {} +func (*Message) Descriptor() ([]byte, []int) { + return fileDescriptor_5be178a99b712ecb, []int{3} +} + +func (m *Message) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Message.Unmarshal(m, b) +} +func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Message.Marshal(b, m, deterministic) +} +func (m *Message) XXX_Merge(src proto.Message) { + xxx_messageInfo_Message.Merge(m, src) +} +func (m *Message) XXX_Size() int { + return xxx_messageInfo_Message.Size(m) +} +func (m *Message) XXX_DiscardUnknown() { + xxx_messageInfo_Message.DiscardUnknown(m) +} + +var xxx_messageInfo_Message proto.InternalMessageInfo + +func (m *Message) GetLevel() Message_Level { + if m != nil { + return m.Level + } + return Message_UNKNOWN +} + +func (m *Message) GetCode() string { + if m != nil { + return m.Code + } + return "" +} + +func (m *Message) GetText() string { + if m != nil { + return m.Text + } + return "" +} + +func (m *Message) GetKeys() []string { + if m != nil { + return m.Keys + } + return nil +} + +type Messages struct { + Messages []*Message `protobuf:"bytes,1,rep,name=messages,proto3" json:"messages,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Messages) Reset() { *m = Messages{} } +func (m *Messages) String() string { return proto.CompactTextString(m) } +func (*Messages) ProtoMessage() {} +func (*Messages) Descriptor() ([]byte, []int) { + return fileDescriptor_5be178a99b712ecb, []int{4} +} + +func (m *Messages) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Messages.Unmarshal(m, b) +} +func (m *Messages) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Messages.Marshal(b, m, deterministic) +} +func (m *Messages) XXX_Merge(src proto.Message) { + xxx_messageInfo_Messages.Merge(m, src) +} +func (m *Messages) XXX_Size() int { + return xxx_messageInfo_Messages.Size(m) +} +func (m *Messages) XXX_DiscardUnknown() { + xxx_messageInfo_Messages.DiscardUnknown(m) +} + +var xxx_messageInfo_Messages proto.InternalMessageInfo + +func (m *Messages) GetMessages() []*Message { + if m != nil { + return m.Messages + } + return nil +} + +// The plugin writes an encoded Response to stdout. +type Response struct { + // Error message. If non-empty, the plugin failed. + // The plugin process should exit with status code zero + // even if it reports an error in this way. + // + // This should be used to indicate errors which prevent the plugin from + // operating as intended. Errors which indicate a problem in gnostic + // itself -- such as the input Document being unparseable -- should be + // reported by writing a message to stderr and exiting with a non-zero + // status code. + Errors []string `protobuf:"bytes,1,rep,name=errors,proto3" json:"errors,omitempty"` + // file output, each file will be written by gnostic to an appropriate location. + Files []*File `protobuf:"bytes,2,rep,name=files,proto3" json:"files,omitempty"` + // informational messages to be collected and reported by gnostic. + Messages []*Message `protobuf:"bytes,3,rep,name=messages,proto3" json:"messages,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Response) Reset() { *m = Response{} } +func (m *Response) String() string { return proto.CompactTextString(m) } +func (*Response) ProtoMessage() {} +func (*Response) Descriptor() ([]byte, []int) { + return fileDescriptor_5be178a99b712ecb, []int{5} +} + +func (m *Response) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Response.Unmarshal(m, b) +} +func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Response.Marshal(b, m, deterministic) +} +func (m *Response) XXX_Merge(src proto.Message) { + xxx_messageInfo_Response.Merge(m, src) +} +func (m *Response) XXX_Size() int { + return xxx_messageInfo_Response.Size(m) +} +func (m *Response) XXX_DiscardUnknown() { + xxx_messageInfo_Response.DiscardUnknown(m) +} + +var xxx_messageInfo_Response proto.InternalMessageInfo + +func (m *Response) GetErrors() []string { + if m != nil { + return m.Errors + } + return nil +} + +func (m *Response) GetFiles() []*File { + if m != nil { + return m.Files + } + return nil +} + +func (m *Response) GetMessages() []*Message { + if m != nil { + return m.Messages + } + return nil +} + +// File describes a file generated by a plugin. +type File struct { + // name of the file + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // data to be written to the file + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *File) Reset() { *m = File{} } +func (m *File) String() string { return proto.CompactTextString(m) } +func (*File) ProtoMessage() {} +func (*File) Descriptor() ([]byte, []int) { + return fileDescriptor_5be178a99b712ecb, []int{6} +} + +func (m *File) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_File.Unmarshal(m, b) +} +func (m *File) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_File.Marshal(b, m, deterministic) +} +func (m *File) XXX_Merge(src proto.Message) { + xxx_messageInfo_File.Merge(m, src) +} +func (m *File) XXX_Size() int { + return xxx_messageInfo_File.Size(m) +} +func (m *File) XXX_DiscardUnknown() { + xxx_messageInfo_File.DiscardUnknown(m) +} + +var xxx_messageInfo_File proto.InternalMessageInfo + +func (m *File) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *File) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +func init() { + proto.RegisterEnum("gnostic.plugin.v1.Message_Level", Message_Level_name, Message_Level_value) + proto.RegisterType((*Version)(nil), "gnostic.plugin.v1.Version") + proto.RegisterType((*Parameter)(nil), "gnostic.plugin.v1.Parameter") + proto.RegisterType((*Request)(nil), "gnostic.plugin.v1.Request") + proto.RegisterType((*Message)(nil), "gnostic.plugin.v1.Message") + proto.RegisterType((*Messages)(nil), "gnostic.plugin.v1.Messages") + proto.RegisterType((*Response)(nil), "gnostic.plugin.v1.Response") + proto.RegisterType((*File)(nil), "gnostic.plugin.v1.File") +} + +func init() { proto.RegisterFile("plugins/plugin.proto", fileDescriptor_5be178a99b712ecb) } + +var fileDescriptor_5be178a99b712ecb = []byte{ + // 539 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0xc1, 0x6e, 0xd3, 0x40, + 0x10, 0xc5, 0xb1, 0xdd, 0xc4, 0x13, 0x28, 0x66, 0x55, 0x81, 0xa9, 0x90, 0x1a, 0xf9, 0x42, 0x0e, + 0xe0, 0xa8, 0x41, 0xf4, 0xc4, 0x25, 0x91, 0x9a, 0xa8, 0xa2, 0x38, 0xd1, 0x0a, 0xe8, 0x31, 0xda, + 0x3a, 0x1b, 0xc7, 0x60, 0x7b, 0xcd, 0xee, 0x3a, 0x6a, 0x3e, 0x81, 0xdf, 0xe0, 0x4b, 0xf8, 0x32, + 0x84, 0x76, 0xd7, 0x89, 0x8a, 0x08, 0x07, 0x4e, 0x7e, 0xf3, 0xf4, 0xfc, 0x66, 0xe6, 0xed, 0xc0, + 0x49, 0x95, 0xd7, 0x69, 0x56, 0x8a, 0x81, 0xf9, 0x46, 0x15, 0x67, 0x92, 0xa1, 0x27, 0x69, 0xc9, + 0x84, 0xcc, 0x92, 0xa8, 0x61, 0x37, 0xe7, 0xa7, 0xcf, 0x53, 0xc6, 0xd2, 0x9c, 0x0e, 0xb4, 0xe0, + 0xb6, 0x5e, 0x0d, 0x48, 0xb9, 0x35, 0xea, 0x30, 0x81, 0xf6, 0x67, 0xca, 0x45, 0xc6, 0x4a, 0x74, + 0x02, 0x6e, 0x41, 0xbe, 0x30, 0x1e, 0x58, 0x3d, 0xab, 0xef, 0x62, 0x53, 0x68, 0x36, 0x2b, 0x19, + 0x0f, 0x5a, 0x0d, 0xab, 0x0a, 0xc5, 0x56, 0x44, 0x26, 0xeb, 0xc0, 0x36, 0xac, 0x2e, 0xd0, 0x53, + 0x38, 0x12, 0xf5, 0x6a, 0x95, 0xdd, 0x05, 0x4e, 0xcf, 0xea, 0x7b, 0xb8, 0xa9, 0xc2, 0xb7, 0xe0, + 0xcd, 0x09, 0x27, 0x05, 0x95, 0x94, 0x23, 0x04, 0x4e, 0x49, 0x0a, 0xaa, 0xbb, 0x78, 0x58, 0x63, + 0x65, 0xb7, 0x21, 0x79, 0x4d, 0x75, 0x13, 0x0f, 0x9b, 0x22, 0xfc, 0x65, 0x41, 0x1b, 0xd3, 0x6f, + 0x35, 0x15, 0x12, 0x9d, 0x41, 0x57, 0xb0, 0x9a, 0x27, 0x74, 0x71, 0xef, 0x67, 0x30, 0x54, 0xac, + 0x2c, 0xce, 0xa0, 0xcb, 0x6a, 0x59, 0xd5, 0x72, 0x51, 0x11, 0xb9, 0x6e, 0x8c, 0xc0, 0x50, 0x73, + 0x22, 0xd7, 0xe8, 0x1d, 0x40, 0xb5, 0x1b, 0x42, 0x04, 0x76, 0xcf, 0xee, 0x77, 0x87, 0x2f, 0xa2, + 0xbf, 0xc2, 0x8a, 0xf6, 0x93, 0xe2, 0x7b, 0x7a, 0x74, 0x09, 0x7e, 0xc2, 0x8a, 0x2a, 0xcb, 0x29, + 0x5f, 0x6c, 0x4c, 0x60, 0x7a, 0xc9, 0xee, 0xf0, 0xf4, 0x80, 0x47, 0x13, 0x29, 0x7e, 0xbc, 0xfb, + 0x67, 0x97, 0xf1, 0x2b, 0x38, 0x2a, 0xd8, 0x92, 0xe6, 0x22, 0x70, 0xf5, 0x00, 0x27, 0x91, 0x79, + 0x9a, 0x68, 0xf7, 0x34, 0xd1, 0xa8, 0xdc, 0xe2, 0x46, 0x13, 0xfe, 0xb4, 0xa0, 0xfd, 0x81, 0x0a, + 0x41, 0x52, 0x8a, 0x2e, 0xc0, 0xcd, 0xe9, 0x86, 0xe6, 0x7a, 0xf5, 0xe3, 0x61, 0xef, 0x40, 0xd7, + 0x46, 0x1a, 0x5d, 0x2b, 0x1d, 0x36, 0x72, 0x15, 0x77, 0xc2, 0x96, 0xbb, 0x64, 0x35, 0x56, 0x9c, + 0xa4, 0x77, 0x52, 0x3f, 0x9e, 0x87, 0x35, 0x56, 0xdc, 0x57, 0xba, 0x15, 0x81, 0xd3, 0xb3, 0x15, + 0xa7, 0x70, 0x38, 0x02, 0x57, 0x7b, 0xa1, 0x2e, 0xb4, 0x3f, 0xc5, 0xef, 0xe3, 0xd9, 0x4d, 0xec, + 0x3f, 0x40, 0x1d, 0x70, 0xae, 0xe2, 0xc9, 0xcc, 0xb7, 0x14, 0x7d, 0x33, 0xc2, 0xf1, 0x55, 0x3c, + 0xf5, 0x5b, 0xc8, 0x03, 0xf7, 0x12, 0xe3, 0x19, 0xf6, 0x6d, 0x05, 0x27, 0xa3, 0x8f, 0xa3, 0x6b, + 0xdf, 0x09, 0xc7, 0xd0, 0x69, 0xc6, 0x12, 0xe8, 0x02, 0x3a, 0x45, 0x83, 0x03, 0x4b, 0xaf, 0x7f, + 0xfa, 0xef, 0x2d, 0xf0, 0x5e, 0x1b, 0x7e, 0xb7, 0xa0, 0x83, 0xa9, 0xa8, 0x58, 0x29, 0xa8, 0xba, + 0x31, 0xca, 0x39, 0xe3, 0xc6, 0xc2, 0xc3, 0x4d, 0x85, 0x5e, 0x83, 0xbb, 0xca, 0x72, 0x2a, 0x82, + 0x96, 0x76, 0x7e, 0x76, 0xc0, 0x79, 0x92, 0xe5, 0x14, 0x1b, 0xd5, 0x1f, 0xb3, 0xd8, 0xff, 0x31, + 0x4b, 0x04, 0x8e, 0xb2, 0x39, 0x78, 0xc5, 0x08, 0x9c, 0x25, 0x91, 0x44, 0x47, 0xfd, 0x10, 0x6b, + 0x3c, 0x7e, 0x09, 0xc7, 0x8c, 0xa7, 0x7b, 0xeb, 0xcd, 0xf9, 0xf8, 0xd1, 0xd4, 0xe0, 0xb9, 0xee, + 0x32, 0xb7, 0x7e, 0xb4, 0xec, 0x69, 0x3c, 0xbb, 0x3d, 0xd2, 0x17, 0xf0, 0xe6, 0x77, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x97, 0xa0, 0x65, 0xe7, 0xd5, 0x03, 0x00, 0x00, +} diff --git a/vendor/github.com/googleapis/gnostic/plugins/plugin.proto b/vendor/github.com/googleapis/gnostic/plugins/plugin.proto new file mode 100644 index 0000000000..078e1e091f --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/plugins/plugin.proto @@ -0,0 +1,148 @@ +// Copyright 2017 Google Inc. 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. + +// gnostic can be extended with plugins. +// A plugin is uset a program that reads a Request from stdin +// and writes a Response to stdout. +// +// A plugin executable needs only to be placed somewhere in the path. The +// plugin should be named "gnostic_$NAME", and will then be used when the +// flag "--${NAME}_out" is passed to gnostic. + +syntax = "proto3"; + +import "google/protobuf/any.proto"; + +package gnostic.plugin.v1; + +// 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 = "GnosticPlugin"; + +// The Java package name must be proto package name with proper prefix. +option java_package = "org.gnostic.v1"; + +// 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 = "GNO"; + +// The version number of gnostic. +message Version { + int32 major = 1; + int32 minor = 2; + int32 patch = 3; + // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should + // be empty for mainline stable releases. + string suffix = 4; +} + +// A parameter passed to the plugin from (or through) gnostic. +message Parameter { + // The name of the parameter as specified in the option string + string name = 1; + + // The parameter value as specified in the option string + string value = 2; +} + +// An encoded Request is written to the plugin's stdin. +message Request { + + // filename or URL of the original source document + string source_name = 1; + + // Output path specified in the plugin invocation. + string output_path = 2; + + // Plugin parameters parsed from the invocation string. + repeated Parameter parameters = 3; + + // The version number of gnostic. + Version compiler_version = 4; + + // API models + repeated google.protobuf.Any models = 5; +} + +// Plugins can return messages to be collated and reported by gnostic. +message Message { + + enum Level { + UNKNOWN = 0; + INFO = 1; + WARNING = 2; + ERROR = 3; + FATAL = 4; + } + + // message severity + Level level = 1; + + // a unique message identifier + string code = 2; + + // message text + string text = 3; + + // an associated key path in an API description + repeated string keys = 4; +} + +message Messages { + repeated Message messages = 1; +} + +// The plugin writes an encoded Response to stdout. +message Response { + + // Error message. If non-empty, the plugin failed. + // The plugin process should exit with status code zero + // even if it reports an error in this way. + // + // This should be used to indicate errors which prevent the plugin from + // operating as intended. Errors which indicate a problem in gnostic + // itself -- such as the input Document being unparseable -- should be + // reported by writing a message to stderr and exiting with a non-zero + // status code. + repeated string errors = 1; + + // file output, each file will be written by gnostic to an appropriate location. + repeated File files = 2; + + // informational messages to be collected and reported by gnostic. + repeated Message messages = 3; +} + +// File describes a file generated by a plugin. +message File { + + // name of the file + string name = 1; + + // data to be written to the file + bytes data = 2; +} + + diff --git a/vendor/github.com/googleapis/gnostic/surface/README.md b/vendor/github.com/googleapis/gnostic/surface/README.md new file mode 100644 index 0000000000..6870ccfce7 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/surface/README.md @@ -0,0 +1,10 @@ +# API Code Surface + +This directory contains a Protocol Buffer-language model +suitable for generating support code for calling and +implementing an API. + +It can be generated from other formats read by gnostic +and passed to code generator plugins to assist them by +providing a preprocessed API description that is easier +to generate. \ No newline at end of file diff --git a/vendor/github.com/go-openapi/errors/auth.go b/vendor/github.com/googleapis/gnostic/surface/field.go similarity index 69% rename from vendor/github.com/go-openapi/errors/auth.go rename to vendor/github.com/googleapis/gnostic/surface/field.go index 0545b501bd..da540a5f63 100644 --- a/vendor/github.com/go-openapi/errors/auth.go +++ b/vendor/github.com/googleapis/gnostic/surface/field.go @@ -1,4 +1,4 @@ -// Copyright 2015 go-swagger maintainers +// Copyright 2017 Google Inc. 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. @@ -12,11 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -package errors +package surface_v1 -import "net/http" - -// Unauthenticated returns an unauthenticated error -func Unauthenticated(scheme string) Error { - return New(http.StatusUnauthorized, "unauthenticated for %s", scheme) +// ServiceType returns the Type associated with a field. +func (f *Field) ServiceType(m *Model) *Type { + return m.TypeWithTypeName(f.NativeType) } diff --git a/vendor/github.com/googleapis/gnostic/surface/model.go b/vendor/github.com/googleapis/gnostic/surface/model.go new file mode 100644 index 0000000000..8b08d1a71f --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/surface/model.go @@ -0,0 +1,146 @@ +// Copyright 2017 Google Inc. 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 surface_v1 + +import ( + "log" + nethttp "net/http" + "net/url" + "path" + "strconv" + "strings" +) + +// The structure to transport information during the recursive calls inside model_openapiv2.go +// and model_openapiv3.go +type FieldInfo struct { + fieldKind FieldKind + fieldType string + fieldFormat string + // For parameters + fieldPosition Position + fieldName string +} + +func (m *Model) addType(t *Type) { + m.Types = append(m.Types, t) +} + +func (m *Model) addMethod(method *Method) { + m.Methods = append(m.Methods, method) +} + +func (m *Model) TypeWithTypeName(name string) *Type { + if name == "" { + return nil + } + for _, t := range m.Types { + if t.TypeName == name { + return t + } + } + return nil +} + +func generateOperationName(method, path string) string { + filteredPath := strings.Replace(path, "/", "_", -1) + filteredPath = strings.Replace(filteredPath, ".", "_", -1) + filteredPath = strings.Replace(filteredPath, "{", "", -1) + filteredPath = strings.Replace(filteredPath, "}", "", -1) + return strings.Title(method) + filteredPath +} + +func sanitizeOperationName(name string) string { + name = strings.Title(name) + name = strings.Replace(name, ".", "_", -1) + return name +} + +func typeForRef(ref string) (typeName string) { + return path.Base(ref) +} + +// Helper method to build a surface model Type +func makeType(name string) *Type { + t := &Type{ + Name: name, + Kind: TypeKind_STRUCT, + Fields: make([]*Field, 0), + } + return t +} + +// Helper method to build a surface model Field +func makeFieldAndAppendToType(info *FieldInfo, schemaType *Type, fieldName string) { + if info != nil { + f := &Field{Name: info.fieldName} + if fieldName != "" { + f.Name = fieldName + } + f.Type, f.Kind, f.Format, f.Position = info.fieldType, info.fieldKind, info.fieldFormat, info.fieldPosition + schemaType.Fields = append(schemaType.Fields, f) + } +} + +// Helper method to determine the type of the value property for a map. +func determineMapValueType(fInfo FieldInfo) (mapValueType string) { + if fInfo.fieldKind == FieldKind_ARRAY { + mapValueType = "[]" + } + if fInfo.fieldFormat != "" { + fInfo.fieldType = fInfo.fieldFormat + } + mapValueType += fInfo.fieldType + return mapValueType +} + +// Converts a string status code like: "504" into the corresponding text ("Gateway_Timeout") +func convertStatusCodeToText(c string) (statusText string) { + code, err := strconv.Atoi(c) + if err == nil { + statusText = nethttp.StatusText(code) + if statusText == "" { + log.Println("Status code " + c + " is not known to net.http.StatusText. This might cause unpredictable behavior.") + statusText = "unknownStatusCode" + } + statusText = strings.Replace(statusText, " ", "_", -1) + } + return statusText +} + +// Searches all created types so far and returns the Type where 'typeName' matches. +func findType(types []*Type, typeName string) *Type { + for _, t := range types { + if typeName == t.Name { + return t + } + } + return nil +} + +// Returns true if s is a valid URL. +func isSymbolicReference(s string) bool { + _, err := url.ParseRequestURI(s) + if err != nil { + return false + } + return true +} + +// Replace encoded URLS with actual characters +func validTypeForRef(XRef string) string { + t, _ := url.QueryUnescape(typeForRef(XRef)) + return t +} diff --git a/vendor/github.com/googleapis/gnostic/surface/model_openapiv2.go b/vendor/github.com/googleapis/gnostic/surface/model_openapiv2.go new file mode 100644 index 0000000000..104c54bb08 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/surface/model_openapiv2.go @@ -0,0 +1,437 @@ +// Copyright 2017 Google Inc. 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 surface_v1 + +import ( + openapiv2 "github.com/googleapis/gnostic/openapiv2" + "github.com/googleapis/gnostic/compiler" + "log" + "strconv" +) + +type OpenAPI2Builder struct { + model *Model +} + +// NewModelFromOpenAPI2 builds a model of an API service for use in code generation. +func NewModelFromOpenAPI2(document *openapiv2.Document, sourceName string) (*Model, error) { + return newOpenAPI2Builder().buildModel(document, sourceName) +} + +func newOpenAPI2Builder() *OpenAPI2Builder { + return &OpenAPI2Builder{model: &Model{}} +} + +// Fills the surface model with information from a parsed OpenAPI description. The surface model provides that information +// in a way that is more processable by plugins like gnostic-go-generator or gnostic-grpc. +// Since OpenAPI schemas can be indefinitely nested, it is a recursive approach to build all Types and Methods. +// The basic idea is that whenever we have "named OpenAPI object" (e.g.: NamedSchemaOrReference, NamedMediaType) we: +// 1. Create a Type with that name +// 2. Recursively execute according methods on child schemas (see buildFromSchema function) +// 3. Return a FieldInfo object that describes how the created Type should be represented inside another Type as field. +func (b *OpenAPI2Builder) buildModel(document *openapiv2.Document, sourceName string) (*Model, error) { + b.model.Types = make([]*Type, 0) + b.model.Methods = make([]*Method, 0) + // Set model properties from passed-in document. + b.model.Name = document.Info.Title + b.buildFromDocument(document) + err := b.buildSymbolicReferences(document, sourceName) + if err != nil { + log.Printf("Error while building symbolic references. This might cause the plugin to fail: %v", err) + } + return b.model, nil +} + +// Builds Types from definitions; builds Types and Methods from paths +func (b *OpenAPI2Builder) buildFromDocument(document *openapiv2.Document) { + b.buildFromDefinitions(document.Definitions) + b.buildFromParameterDefinitions(document.Parameters) + b.buildFromResponseDefinitions(document.Responses) + b.buildFromPaths(document.Paths) +} + +// Build surface Types from OpenAPI definitions +func (b *OpenAPI2Builder) buildFromDefinitions(definitions *openapiv2.Definitions) { + if definitions == nil { + return + } + + if schemas := definitions.AdditionalProperties; schemas != nil { + for _, namedSchema := range schemas { + fInfo := b.buildFromSchemaOrReference(namedSchema.Name, namedSchema.Value) + // In certain cases no type will be created during the recursion: e.g.: the schema is of type scalar, array + // or an reference. So we check whether the surface model Type already exists, and if not then we create it. + if t := findType(b.model.Types, namedSchema.Name); t == nil { + t = makeType(namedSchema.Name) + makeFieldAndAppendToType(fInfo, t, "value") + b.model.addType(t) + } + } + } +} + +// Build surface model Types from OpenAPI parameter definitions +func (b *OpenAPI2Builder) buildFromParameterDefinitions(parameters *openapiv2.ParameterDefinitions) { + if parameters == nil { + return + } + + for _, namedParameter := range parameters.AdditionalProperties { + // Parameters in OpenAPI have a name field. The name gets passed up the callstack and is therefore contained + // inside fInfo. That is why we pass "" as fieldName. A type with that parameter was never created, so we still + // need to do that. + t := makeType(namedParameter.Name) + fInfo := b.buildFromParam(namedParameter.Value) + makeFieldAndAppendToType(fInfo, t, "") + if len(t.Fields) > 0 { + b.model.addType(t) + } + } +} + +// Build surface model Types from OpenAPI response definitions +func (b *OpenAPI2Builder) buildFromResponseDefinitions(responses *openapiv2.ResponseDefinitions) { + if responses == nil { + return + } + for _, namedResponse := range responses.AdditionalProperties { + fInfo := b.buildFromResponse(namedResponse.Name, namedResponse.Value) + // In certain cases no type will be created during the recursion: e.g.: the schema is of type scalar, array + // or an reference. So we check whether the surface model Type already exists, and if not then we create it. + if t := findType(b.model.Types, namedResponse.Name); t == nil { + t = makeType(namedResponse.Name) + makeFieldAndAppendToType(fInfo, t, "value") + b.model.addType(t) + } + } +} + +// Builds all symbolic references. A symbolic reference is an URL to another OpenAPI description. We call "document.ResolveReferences" +// inside that method. This has the same effect like: "gnostic --resolve-refs" +func (b *OpenAPI2Builder) buildSymbolicReferences(document *openapiv2.Document, sourceName string) (err error) { + cache := compiler.GetInfoCache() + if len(cache) == 0 && sourceName != "" { + // Fills the compiler cache with all kind of references. + _, err = document.ResolveReferences(sourceName) + if err != nil { + return err + } + cache = compiler.GetInfoCache() + } + + for ref := range cache { + if isSymbolicReference(ref) { + b.model.SymbolicReferences = append(b.model.SymbolicReferences, ref) + } + } + // Clear compiler cache for recursive calls + compiler.ClearInfoCache() + return nil +} + +// Build Method and Types (parameter, request bodies, responses) from all paths +func (b *OpenAPI2Builder) buildFromPaths(paths *openapiv2.Paths) { + for _, path := range paths.Path { + b.buildFromNamedPath(path.Name, path.Value) + } +} + +// Builds a Method and adds it to the surface model +func (b *OpenAPI2Builder) buildFromNamedPath(name string, pathItem *openapiv2.PathItem) { + for _, method := range []string{"GET", "PUT", "POST", "DELETE", "OPTIONS", "HEAD", "PATCH"} { + var op *openapiv2.Operation + switch method { + case "GET": + op = pathItem.Get + case "PUT": + op = pathItem.Put + case "POST": + op = pathItem.Post + case "DELETE": + op = pathItem.Delete + case "OPTIONS": + op = pathItem.Options + case "HEAD": + op = pathItem.Head + case "PATCH": + op = pathItem.Patch + } + if op != nil { + m := &Method{ + Operation: op.OperationId, + Path: name, + Method: method, + Name: sanitizeOperationName(op.OperationId), + Description: op.Description, + } + if m.Name == "" { + m.Name = generateOperationName(method, name) + } + m.ParametersTypeName, m.ResponsesTypeName = b.buildFromNamedOperation(m.Name, op) + b.model.addMethod(m) + } + } +} + +// Builds the "Parameters" and "Responses" types for an operation, adds them to the model, and returns the names of the types. +// If no such Type is added to the model an empty string is returned. +func (b *OpenAPI2Builder) buildFromNamedOperation(name string, operation *openapiv2.Operation) (parametersTypeName string, responseTypeName string) { + // At first, we build the operations input parameters. This includes parameters (like PATH or QUERY parameters). + operationParameters := makeType(name + "Parameters") + operationParameters.Description = operationParameters.Name + " holds parameters to " + name + for _, paramOrRef := range operation.Parameters { + fieldInfo := b.buildFromParamOrRef(paramOrRef) + // For parameters the name of the field is contained inside fieldInfo. That is why we pass "" as fieldName + makeFieldAndAppendToType(fieldInfo, operationParameters, "") + } + if len(operationParameters.Fields) > 0 { + b.model.addType(operationParameters) + parametersTypeName = operationParameters.Name + } + + // Secondly, we build the response values for the method. + if responses := operation.Responses; responses != nil { + operationResponses := makeType(name + "Responses") + operationResponses.Description = operationResponses.Name + " holds responses of " + name + for _, namedResponse := range responses.ResponseCode { + fieldInfo := b.buildFromResponseOrRef(operation.OperationId+convertStatusCodeToText(namedResponse.Name), namedResponse.Value) + makeFieldAndAppendToType(fieldInfo, operationResponses, namedResponse.Name) + } + if len(operationResponses.Fields) > 0 { + b.model.addType(operationResponses) + responseTypeName = operationResponses.Name + } + } + return parametersTypeName, responseTypeName +} + +// A helper method to differentiate between references and actual objects. +// The actual Field and Type are created in the functions which call this function +func (b *OpenAPI2Builder) buildFromParamOrRef(paramOrRef *openapiv2.ParametersItem) (fInfo *FieldInfo) { + fInfo = &FieldInfo{} + if param := paramOrRef.GetParameter(); param != nil { + fInfo = b.buildFromParam(param) + return fInfo + } else if ref := paramOrRef.GetJsonReference(); ref != nil { + t := findType(b.model.Types, validTypeForRef(ref.XRef)) + if t != nil && len(t.Fields) > 0 { + fInfo.fieldKind, fInfo.fieldType, fInfo.fieldName, fInfo.fieldPosition = FieldKind_REFERENCE, validTypeForRef(ref.XRef), t.Name, t.Fields[0].Position + return fInfo + } + // TODO: This might happen for symbolic references --> fInfo.Position defaults to 'BODY' which is wrong. + log.Printf("Not able to find parameter information for: %v", ref) + fInfo.fieldKind, fInfo.fieldType = FieldKind_REFERENCE, validTypeForRef(ref.XRef) + return fInfo // Lets return fInfo for now otherwise we may get null pointer exception + } + return nil +} + +// Returns information on how to represent 'parameter' as field. This information gets propagated up the callstack. +// We have to differentiate between 'body' and 'non-body' parameters +func (b *OpenAPI2Builder) buildFromParam(parameter *openapiv2.Parameter) (fInfo *FieldInfo) { + if bodyParam := parameter.GetBodyParameter(); bodyParam != nil { + fInfo = b.buildFromSchemaOrReference(bodyParam.Name, bodyParam.Schema) + if fInfo != nil { + fInfo.fieldName, fInfo.fieldPosition = bodyParam.Name, Position_BODY + return fInfo + } + } else if nonBodyParam := parameter.GetNonBodyParameter(); nonBodyParam != nil { + fInfo = b.buildFromNonBodyParameter(nonBodyParam) + return fInfo + } + log.Printf("Couldn't build from parameter: %v", parameter) + return nil +} + +// Differentiates between different kind of non-body parameters +func (b *OpenAPI2Builder) buildFromNonBodyParameter(nonBodyParameter *openapiv2.NonBodyParameter) (fInfo *FieldInfo) { + fInfo = &FieldInfo{} + headerParameter := nonBodyParameter.GetHeaderParameterSubSchema() + if headerParameter != nil { + fInfo.fieldName, fInfo.fieldPosition, fInfo.fieldFormat = headerParameter.Name, Position_HEADER, headerParameter.Format + b.adaptFieldKindAndFieldType(fInfo, headerParameter.Type, headerParameter.Items) + } + formDataParameter := nonBodyParameter.GetFormDataParameterSubSchema() + if formDataParameter != nil { + fInfo.fieldName, fInfo.fieldPosition, fInfo.fieldFormat = formDataParameter.Name, Position_FORMDATA, formDataParameter.Format + b.adaptFieldKindAndFieldType(fInfo, formDataParameter.Type, formDataParameter.Items) + } + queryParameter := nonBodyParameter.GetQueryParameterSubSchema() + if queryParameter != nil { + fInfo.fieldName, fInfo.fieldPosition, fInfo.fieldFormat = queryParameter.Name, Position_QUERY, queryParameter.Format + b.adaptFieldKindAndFieldType(fInfo, queryParameter.Type, queryParameter.Items) + } + pathParameter := nonBodyParameter.GetPathParameterSubSchema() + if pathParameter != nil { + fInfo.fieldName, fInfo.fieldPosition, fInfo.fieldFormat = pathParameter.Name, Position_PATH, pathParameter.Format + b.adaptFieldKindAndFieldType(fInfo, pathParameter.Type, pathParameter.Items) + } + return fInfo +} + +// Changes the fieldKind and fieldType inside of 'fInfo' based on different conditions. In case of an array we have to +// consider that it consists of indefinitely nested items. +func (b *OpenAPI2Builder) adaptFieldKindAndFieldType(fInfo *FieldInfo, parameterType string, parameterItems *openapiv2.PrimitivesItems) { + fInfo.fieldKind, fInfo.fieldType = FieldKind_SCALAR, parameterType + + if parameterType == "array" && parameterItems != nil { + fInfo.fieldKind, fInfo.fieldType = FieldKind_ARRAY, "string" // Default to string in case we don't find the type + if parameterItems.Type != "" { + // We only need the fieldType here because we know for sure that it is an array. + fInfo.fieldType = b.buildFromPrimitiveItems(fInfo.fieldName, parameterItems, 0).fieldType + } + } + + if parameterType == "file" { + fInfo.fieldKind, fInfo.fieldType = FieldKind_SCALAR, "string" + } +} + +// A recursive method that build Types for nested PrimitiveItems. The 'ctr' is used for naming the different Types. +// The base condition is if we have scalar value (not an array). +func (b *OpenAPI2Builder) buildFromPrimitiveItems(name string, items *openapiv2.PrimitivesItems, ctr int) (fInfo *FieldInfo) { + fInfo = &FieldInfo{} + switch items.Type { + case "array": + t := makeType(name) + fieldInfo := b.buildFromPrimitiveItems(name+strconv.Itoa(ctr), items.Items, ctr+1) + makeFieldAndAppendToType(fieldInfo, t, "items") + + if len(t.Fields) > 0 { + b.model.addType(t) + fInfo.fieldKind, fInfo.fieldType = FieldKind_REFERENCE, t.Name + return fInfo + } + default: + // We got a scalar value + fInfo.fieldKind, fInfo.fieldType, fInfo.fieldFormat = FieldKind_SCALAR, items.Type, items.Format + return fInfo + } + return nil +} + +// A helper method to differentiate between references and actual objects +func (b *OpenAPI2Builder) buildFromResponseOrRef(name string, responseOrRef *openapiv2.ResponseValue) (fInfo *FieldInfo) { + fInfo = &FieldInfo{} + if response := responseOrRef.GetResponse(); response != nil { + fInfo = b.buildFromResponse(name, response) + return fInfo + } else if ref := responseOrRef.GetJsonReference(); ref != nil { + fInfo.fieldKind, fInfo.fieldType = FieldKind_REFERENCE, validTypeForRef(ref.XRef) + return fInfo + } + return nil +} + +// A helper method to propagate the information up the call stack +func (b *OpenAPI2Builder) buildFromResponse(name string, response *openapiv2.Response) (fInfo *FieldInfo) { + if response.Schema != nil && response.Schema.GetSchema() != nil { + fInfo = b.buildFromSchemaOrReference(name, response.Schema.GetSchema()) + return fInfo + } + return nil +} + +// A helper method to differentiate between references and actual objects +func (b *OpenAPI2Builder) buildFromSchemaOrReference(name string, schema *openapiv2.Schema) (fInfo *FieldInfo) { + fInfo = &FieldInfo{} + if schema.XRef != "" { + fInfo.fieldKind, fInfo.fieldType = FieldKind_REFERENCE, validTypeForRef(schema.XRef) + return fInfo + } else { + fInfo = b.buildFromSchema(name, schema) + return fInfo + } +} + +// Given an OpenAPI schema there are two possibilities: +// 1. The schema is an object/array: We create a type for the object, recursively call according methods for child +// schemas, and then return information on how to use the created Type as field. +// 2. The schema has a scalar type: We return information on how to represent a scalar schema as Field. Fields are +// created whenever Types are created (higher up in the callstack). This possibility can be considered as the "base condition" +// for the recursive approach. +func (b *OpenAPI2Builder) buildFromSchema(name string, schema *openapiv2.Schema) (fInfo *FieldInfo) { + fInfo = &FieldInfo{} + + t := "" + if schema.Type != nil && len(schema.Type.Value) == 1 && schema.Type.Value[0] != "null" { + t = schema.Type.Value[0] + } + switch t { + case "": + fallthrough + case "object": + schemaType := makeType(name) + if schema.Properties != nil && schema.Properties.AdditionalProperties != nil { + for _, namedSchema := range schema.Properties.AdditionalProperties { + fieldInfo := b.buildFromSchemaOrReference(namedSchema.Name, namedSchema.Value) + makeFieldAndAppendToType(fieldInfo, schemaType, namedSchema.Name) + } + } + if schema := schema.AdditionalProperties.GetSchema(); schema != nil { + // AdditionalProperties are represented as map + fieldInfo := b.buildFromSchemaOrReference(name+"AdditionalProperties", schema) + if fieldInfo != nil { + mapValueType := determineMapValueType(*fieldInfo) + fieldInfo.fieldKind, fieldInfo.fieldType, fieldInfo.fieldFormat = FieldKind_MAP, "map[string]"+mapValueType, "" + makeFieldAndAppendToType(fieldInfo, schemaType, "additional_properties") + } + } + + for idx, schemaOrRef := range schema.AllOf { + fieldInfo := b.buildFromSchemaOrReference(name+"AllOf"+strconv.Itoa(idx+1), schemaOrRef) + makeFieldAndAppendToType(fieldInfo, schemaType, "all_of_"+strconv.Itoa(idx+1)) + } + + if schema.Items != nil { + for idx, schema := range schema.Items.Schema { + fieldInfo := b.buildFromSchemaOrReference(name+"Items"+strconv.Itoa(idx+1), schema) + makeFieldAndAppendToType(fieldInfo, schemaType, "items_"+strconv.Itoa(idx+1)) + } + } + + if schema.Enum != nil { + // TODO: It is not defined how enums should be represented inside the surface model + fieldInfo := &FieldInfo{} + fieldInfo.fieldKind, fieldInfo.fieldType, fieldInfo.fieldName = FieldKind_ANY, "string", "enum" + makeFieldAndAppendToType(fieldInfo, schemaType, fieldInfo.fieldName) + } + + if len(schemaType.Fields) == 0 { + schemaType.Kind = TypeKind_OBJECT + schemaType.ContentType = "interface{}" + } + b.model.addType(schemaType) + fInfo.fieldKind, fInfo.fieldType = FieldKind_REFERENCE, schemaType.Name + return fInfo + case "array": + // Same as for OpenAPI v3. I believe this is a bug: schema.Items.Schema should not be an array + // but rather a single object describing the values of the array. Printing 'len(schema.Items.Schema)' + // for 2000+ API descriptions from API-guru always resulted with an array of length of 1. + for _, s := range schema.Items.Schema { + arrayFieldInfo := b.buildFromSchemaOrReference(name, s) + if arrayFieldInfo != nil { + fInfo.fieldKind, fInfo.fieldType, fInfo.fieldFormat = FieldKind_ARRAY, arrayFieldInfo.fieldType, arrayFieldInfo.fieldFormat + return fInfo + } + } + default: + // We got a scalar value + fInfo.fieldKind, fInfo.fieldType, fInfo.fieldFormat = FieldKind_SCALAR, t, schema.Format + return fInfo + } + log.Printf("Unimplemented: could not find field info for schema with name: '%v' and properties: %v", name, schema) + return nil +} diff --git a/vendor/github.com/googleapis/gnostic/surface/model_openapiv3.go b/vendor/github.com/googleapis/gnostic/surface/model_openapiv3.go new file mode 100644 index 0000000000..d7bf6e53b8 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/surface/model_openapiv3.go @@ -0,0 +1,441 @@ +// Copyright 2017 Google Inc. 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 surface_v1 + +import ( + openapiv3 "github.com/googleapis/gnostic/openapiv3" + "github.com/googleapis/gnostic/compiler" + "log" + "strconv" +) + +type OpenAPI3Builder struct { + model *Model +} + +// NewModelFromOpenAPIv3 builds a model of an API service for use in code generation. +func NewModelFromOpenAPI3(document *openapiv3.Document, sourceName string) (*Model, error) { + return newOpenAPI3Builder().buildModel(document, sourceName) +} + +func newOpenAPI3Builder() *OpenAPI3Builder { + return &OpenAPI3Builder{model: &Model{}} +} + +// Fills the surface model with information from a parsed OpenAPI description. The surface model provides that information +// in a way that is more processable by plugins like gnostic-go-generator or gnostic-grpc. +// Since OpenAPI schemas can be indefinitely nested, it is a recursive approach to build all Types and Methods. +// The basic idea is that whenever we have "named OpenAPI object" (e.g.: NamedSchemaOrReference, NamedMediaType) we: +// 1. Create a Type with that name +// 2. Recursively execute according methods on child schemas (see buildFromSchema function) +// 3. Return a FieldInfo object that describes how the created Type should be represented inside another Type as field. +func (b *OpenAPI3Builder) buildModel(document *openapiv3.Document, sourceName string) (*Model, error) { + b.model.Types = make([]*Type, 0) + b.model.Methods = make([]*Method, 0) + // Set model properties from passed-in document. + b.model.Name = document.Info.Title + b.buildFromDocument(document) + err := b.buildSymbolicReferences(document, sourceName) + if err != nil { + log.Printf("Error while building symbolic references. This might cause the plugin to fail: %v", err) + } + return b.model, nil +} + +// Builds Types from the component section; builds Types and methods from paths; +func (b *OpenAPI3Builder) buildFromDocument(document *openapiv3.Document) { + b.buildFromComponents(document.Components) + b.buildFromPaths(document.Paths) +} + +// Builds all Types from an "OpenAPI component" section +func (b *OpenAPI3Builder) buildFromComponents(components *openapiv3.Components) { + if components == nil { + return + } + + if schemas := components.Schemas; schemas != nil { + for _, namedSchema := range schemas.AdditionalProperties { + fInfo := b.buildFromSchemaOrReference(namedSchema.Name, namedSchema.Value) + // In certain cases no type will be created during the recursion: e.g.: the schema is of type scalar, array + // or an reference. So we check whether the surface model Type already exists, and if not then we create it. + if t := findType(b.model.Types, namedSchema.Name); t == nil { + t = makeType(namedSchema.Name) + makeFieldAndAppendToType(fInfo, t, "value") + b.model.addType(t) + } + } + } + + if parameters := components.Parameters; parameters != nil { + for _, namedParameter := range parameters.AdditionalProperties { + // Parameters in OpenAPI have a name field. See: https://swagger.io/specification/#parameterObject + // The name gets passed up the callstack and is therefore contained inside fInfo. That is why we pass "" as fieldName + // A type with that parameter was never created, so we still need to do that. + t := makeType(namedParameter.Name) + fInfo := b.buildFromParamOrRef(namedParameter.Value) + makeFieldAndAppendToType(fInfo, t, "") + if len(t.Fields) > 0 { + b.model.addType(t) + } + } + } + + if responses := components.Responses; responses != nil { + for _, namedResponses := range responses.AdditionalProperties { + fInfo := b.buildFromResponseOrRef(namedResponses.Name, namedResponses.Value) + // In certain cases no type will be created during the recursion: e.g.: the schema is of type scalar, array + // or an reference. So we check whether the surface model Type already exists, and if not then we create it. + if t := findType(b.model.Types, namedResponses.Name); t == nil { + t = makeType(namedResponses.Name) + makeFieldAndAppendToType(fInfo, t, "value") + b.model.addType(t) + } + } + } + + if requestBodies := components.RequestBodies; requestBodies != nil { + for _, namedRequestBody := range requestBodies.AdditionalProperties { + fInfo := b.buildFromRequestBodyOrRef(namedRequestBody.Name, namedRequestBody.Value) + // In certain cases no type will be created during the recursion: e.g.: the schema is of type scalar, array + // or an reference. So we check whether the surface model Type already exists, and if not then we create it. + if t := findType(b.model.Types, namedRequestBody.Name); t == nil { + t = makeType(namedRequestBody.Name) + makeFieldAndAppendToType(fInfo, t, "value") + b.model.addType(t) + } + } + } +} + +// Builds Methods and Types (parameters, request bodies, responses) from all paths +func (b *OpenAPI3Builder) buildFromPaths(paths *openapiv3.Paths) { + for _, path := range paths.Path { + b.buildFromNamedPath(path.Name, path.Value) + } +} + +// Builds all symbolic references. A symbolic reference is an URL to another OpenAPI description. We call "document.ResolveReferences" +// inside that method. This has the same effect like: "gnostic --resolve-refs" +func (b *OpenAPI3Builder) buildSymbolicReferences(document *openapiv3.Document, sourceName string) (err error) { + cache := compiler.GetInfoCache() + if len(cache) == 0 && sourceName != "" { + // Fills the compiler cache with all kind of references. + _, err = document.ResolveReferences(sourceName) + if err != nil { + return err + } + cache = compiler.GetInfoCache() + } + + for ref := range cache { + if isSymbolicReference(ref) { + b.model.SymbolicReferences = append(b.model.SymbolicReferences, ref) + } + } + // Clear compiler cache for recursive calls + compiler.ClearInfoCache() + return nil +} + +// Builds a Method and adds it to the surface model +func (b *OpenAPI3Builder) buildFromNamedPath(name string, pathItem *openapiv3.PathItem) { + for _, method := range []string{"GET", "PUT", "POST", "DELETE", "OPTIONS", "HEAD", "PATCH", "TRACE"} { + var op *openapiv3.Operation + switch method { + case "GET": + op = pathItem.Get + case "PUT": + op = pathItem.Put + case "POST": + op = pathItem.Post + case "DELETE": + op = pathItem.Delete + case "OPTIONS": + op = pathItem.Options + case "HEAD": + op = pathItem.Head + case "PATCH": + op = pathItem.Patch + case "TRACE": + op = pathItem.Trace + } + if op != nil { + m := &Method{ + Operation: op.OperationId, + Path: name, + Method: method, + Name: sanitizeOperationName(op.OperationId), + Description: op.Description, + } + if m.Name == "" { + m.Name = generateOperationName(method, name) + } + m.ParametersTypeName, m.ResponsesTypeName = b.buildFromNamedOperation(m.Name, op) + b.model.addMethod(m) + } + } +} + +// Builds the "Parameters" and "Responses" types for an operation, adds them to the model, and returns the names of the types. +// If no such Type is added to the model an empty string is returned. +func (b *OpenAPI3Builder) buildFromNamedOperation(name string, operation *openapiv3.Operation) (parametersTypeName string, responseTypeName string) { + // At first, we build the operations input parameters. This includes parameters (like PATH or QUERY parameters) and a request body + operationParameters := makeType(name + "Parameters") + operationParameters.Description = operationParameters.Name + " holds parameters to " + name + for _, paramOrRef := range operation.Parameters { + fieldInfo := b.buildFromParamOrRef(paramOrRef) + // For parameters the name of the field is contained inside fieldInfo. That is why we pass "" as fieldName + makeFieldAndAppendToType(fieldInfo, operationParameters, "") + } + + if operation.RequestBody != nil { + fInfo := b.buildFromRequestBodyOrRef(operation.OperationId+"RequestBody", operation.RequestBody) + makeFieldAndAppendToType(fInfo, operationParameters, "request_body") + } + + if len(operationParameters.Fields) > 0 { + b.model.addType(operationParameters) + parametersTypeName = operationParameters.Name + } + + // Secondly, we build the response values for the method. + if responses := operation.Responses; responses != nil { + operationResponses := makeType(name + "Responses") + operationResponses.Description = operationResponses.Name + " holds responses of " + name + for _, namedResponse := range responses.ResponseOrReference { + fieldInfo := b.buildFromResponseOrRef(operation.OperationId+convertStatusCodeToText(namedResponse.Name), namedResponse.Value) + makeFieldAndAppendToType(fieldInfo, operationResponses, namedResponse.Name) + } + if responses.Default != nil { + fieldInfo := b.buildFromResponseOrRef(operation.OperationId+"Default", responses.Default) + makeFieldAndAppendToType(fieldInfo, operationResponses, "default") + } + if len(operationResponses.Fields) > 0 { + b.model.addType(operationResponses) + responseTypeName = operationResponses.Name + } + } + return parametersTypeName, responseTypeName +} + +// A helper method to differentiate between references and actual objects. +// The actual Field and Type are created in the functions which call this function +func (b *OpenAPI3Builder) buildFromParamOrRef(paramOrRef *openapiv3.ParameterOrReference) (fInfo *FieldInfo) { + fInfo = &FieldInfo{} + if param := paramOrRef.GetParameter(); param != nil { + fInfo = b.buildFromParam(param) + return fInfo + } else if ref := paramOrRef.GetReference(); ref != nil { + t := findType(b.model.Types, validTypeForRef(ref.XRef)) + if t != nil && len(t.Fields) > 0 { + fInfo.fieldKind, fInfo.fieldType, fInfo.fieldName, fInfo.fieldPosition = FieldKind_REFERENCE, validTypeForRef(ref.XRef), t.Name, t.Fields[0].Position + return fInfo + } + // TODO: This might happen for symbolic references --> fInfo.Position defaults to 'BODY' which is wrong. + log.Printf("Not able to find parameter information for: %v", ref) + fInfo.fieldKind, fInfo.fieldType = FieldKind_REFERENCE, validTypeForRef(ref.XRef) + return fInfo // Lets return fInfo for now otherwise we may get null pointer exception + } + return nil +} + +// Returns information on how to represent 'parameter' as field. This information gets propagated up the callstack. +func (b *OpenAPI3Builder) buildFromParam(parameter *openapiv3.Parameter) (fInfo *FieldInfo) { + if schemaOrRef := parameter.Schema; schemaOrRef != nil { + fInfo = b.buildFromSchemaOrReference(parameter.Name, schemaOrRef) + fInfo.fieldName = parameter.Name + switch parameter.In { + case "body": + fInfo.fieldPosition = Position_BODY + case "header": + fInfo.fieldPosition = Position_HEADER + case "formdata": + fInfo.fieldPosition = Position_FORMDATA + case "query": + fInfo.fieldPosition = Position_QUERY + case "path": + fInfo.fieldPosition = Position_PATH + } + return fInfo + } + return nil +} + +// A helper method to differentiate between references and actual objects +func (b *OpenAPI3Builder) buildFromRequestBodyOrRef(name string, reqBodyOrRef *openapiv3.RequestBodyOrReference) (fInfo *FieldInfo) { + fInfo = &FieldInfo{} + if requestBody := reqBodyOrRef.GetRequestBody(); requestBody != nil { + fInfo = b.buildFromRequestBody(name, requestBody) + return fInfo + } else if ref := reqBodyOrRef.GetReference(); ref != nil { + fInfo.fieldKind, fInfo.fieldType = FieldKind_REFERENCE, validTypeForRef(ref.XRef) + return fInfo + } + return nil +} + +// Builds a Type for 'reqBody' and returns information on how to use this Type as field. +func (b *OpenAPI3Builder) buildFromRequestBody(name string, reqBody *openapiv3.RequestBody) (fInfo *FieldInfo) { + fInfo = &FieldInfo{} + if reqBody.Content != nil { + schemaType := makeType(name) + for _, namedMediaType := range reqBody.Content.AdditionalProperties { + fieldInfo := b.buildFromNamedMediaType(name+namedMediaType.Name, namedMediaType.Value) + makeFieldAndAppendToType(fieldInfo, schemaType, namedMediaType.Name) + } + b.model.addType(schemaType) + fInfo.fieldKind, fInfo.fieldType = FieldKind_REFERENCE, schemaType.Name + return fInfo + } + return nil +} + +// A helper method to differentiate between references and actual objects +func (b *OpenAPI3Builder) buildFromResponseOrRef(name string, responseOrRef *openapiv3.ResponseOrReference) (fInfo *FieldInfo) { + fInfo = &FieldInfo{} + if response := responseOrRef.GetResponse(); response != nil { + fInfo = b.buildFromResponse(name, response) + return fInfo + } else if ref := responseOrRef.GetReference(); ref != nil { + fInfo.fieldKind, fInfo.fieldType = FieldKind_REFERENCE, validTypeForRef(ref.XRef) + return fInfo + } + return nil +} + +// Builds a Type for 'response' and returns information on how to use this Type as field. +func (b *OpenAPI3Builder) buildFromResponse(name string, response *openapiv3.Response) (fInfo *FieldInfo) { + fInfo = &FieldInfo{} + if response.Content != nil && response.Content.AdditionalProperties != nil { + schemaType := makeType(name) + for _, namedMediaType := range response.Content.AdditionalProperties { + fieldInfo := b.buildFromNamedMediaType(name+namedMediaType.Name, namedMediaType.Value) + makeFieldAndAppendToType(fieldInfo, schemaType, namedMediaType.Name) + } + b.model.addType(schemaType) + fInfo.fieldKind, fInfo.fieldType = FieldKind_REFERENCE, schemaType.Name + return fInfo + } + return nil +} + +// A helper method to keep code organized +func (b *OpenAPI3Builder) buildFromNamedMediaType(name string, mediaType *openapiv3.MediaType) (fInfo *FieldInfo) { + if schemaOrRef := mediaType.Schema; schemaOrRef != nil { + fInfo = b.buildFromSchemaOrReference(name, schemaOrRef) + } + return fInfo +} + +// A helper method to differentiate between references and actual objects +func (b *OpenAPI3Builder) buildFromSchemaOrReference(name string, schemaOrReference *openapiv3.SchemaOrReference) (fInfo *FieldInfo) { + fInfo = &FieldInfo{} + if schema := schemaOrReference.GetSchema(); schema != nil { + fInfo = b.buildFromSchema(name, schema) + return fInfo + } else if ref := schemaOrReference.GetReference(); ref != nil { + fInfo.fieldKind, fInfo.fieldType = FieldKind_REFERENCE, validTypeForRef(ref.XRef) + return fInfo + } + return nil +} + +// Given an OpenAPI schema there are two possibilities: +// 1. The schema is an object/array: We create a type for the object, recursively call according methods for child +// schemas, and then return information on how to use the created Type as field. +// 2. The schema has a scalar type: We return information on how to represent a scalar schema as Field. Fields are +// created whenever Types are created (higher up in the callstack). This possibility can be considered as the "base condition" +// for the recursive approach. +func (b *OpenAPI3Builder) buildFromSchema(name string, schema *openapiv3.Schema) (fInfo *FieldInfo) { + fInfo = &FieldInfo{} + // Data types according to: https://swagger.io/docs/specification/data-models/data-types/ + switch schema.Type { + case "": + fallthrough + case "object": + schemaType := makeType(name) + if schema.Properties != nil && schema.Properties.AdditionalProperties != nil { + for _, namedSchema := range schema.Properties.AdditionalProperties { + fieldInfo := b.buildFromSchemaOrReference(namedSchema.Name, namedSchema.Value) + makeFieldAndAppendToType(fieldInfo, schemaType, namedSchema.Name) + } + } + if schemaOrRef := schema.AdditionalProperties.GetSchemaOrReference(); schemaOrRef != nil { + // AdditionalProperties are represented as map + fieldInfo := b.buildFromSchemaOrReference(name+"AdditionalProperties", schemaOrRef) + if fieldInfo != nil { + mapValueType := determineMapValueType(*fieldInfo) + fieldInfo.fieldKind, fieldInfo.fieldType, fieldInfo.fieldFormat = FieldKind_MAP, "map[string]"+mapValueType, "" + makeFieldAndAppendToType(fieldInfo, schemaType, "additional_properties") + } + } + + for idx, schemaOrRef := range schema.AnyOf { + fieldInfo := b.buildFromSchemaOrReference(name+"AnyOf"+strconv.Itoa(idx+1), schemaOrRef) + makeFieldAndAppendToType(fieldInfo, schemaType, "any_of_"+strconv.Itoa(idx+1)) + } + + for idx, schemaOrRef := range schema.OneOf { + fieldInfo := b.buildFromSchemaOrReference(name+"OneOf"+strconv.Itoa(idx+1), schemaOrRef) + makeFieldAndAppendToType(fieldInfo, schemaType, "one_of_"+strconv.Itoa(idx+1)) + } + + for idx, schemaOrRef := range schema.AllOf { + fieldInfo := b.buildFromSchemaOrReference(name+"AllOf"+strconv.Itoa(idx+1), schemaOrRef) + makeFieldAndAppendToType(fieldInfo, schemaType, "all_of_"+strconv.Itoa(idx+1)) + } + + if schema.Items != nil { + for _, schemaOrRef := range schema.Items.SchemaOrReference { + fieldInfo := b.buildFromSchemaOrReference(name+"Items", schemaOrRef) + makeFieldAndAppendToType(fieldInfo, schemaType, "items") + } + } + + if schema.Enum != nil { + // TODO: It is not defined how enums should be represented inside the surface model + fieldInfo := &FieldInfo{} + fieldInfo.fieldKind, fieldInfo.fieldType, fieldInfo.fieldName = FieldKind_ANY, "string", "enum" + makeFieldAndAppendToType(fieldInfo, schemaType, fieldInfo.fieldName) + } + + if len(schemaType.Fields) == 0 { + schemaType.Kind = TypeKind_OBJECT + schemaType.ContentType = "interface{}" + } + b.model.addType(schemaType) + fInfo.fieldKind, fInfo.fieldType = FieldKind_REFERENCE, schemaType.Name + return fInfo + case "array": + // I do believe there is a bug inside of OpenAPIv3.proto. I think the type of "schema.Items.SchemaOrReference" + // shouldn't be an array of pointers but rather a single pointer. + // According to: https://swagger.io/specification/#schemaObject + // The 'items' "Value MUST be an object and not an array" and "Inline or referenced schema MUST be of a Schema Object" + for _, schemaOrRef := range schema.Items.SchemaOrReference { + arrayFieldInfo := b.buildFromSchemaOrReference(name, schemaOrRef) + if arrayFieldInfo != nil { + fInfo.fieldKind, fInfo.fieldType, fInfo.fieldFormat = FieldKind_ARRAY, arrayFieldInfo.fieldType, arrayFieldInfo.fieldFormat + return fInfo + } + } + default: + // We go a scalar value + fInfo.fieldKind, fInfo.fieldType, fInfo.fieldFormat = FieldKind_SCALAR, schema.Type, schema.Format + return fInfo + } + log.Printf("Unimplemented: could not find field info for schema: %v", schema) + return nil +} diff --git a/vendor/github.com/googleapis/gnostic/surface/surface.pb.go b/vendor/github.com/googleapis/gnostic/surface/surface.pb.go new file mode 100644 index 0000000000..192eac6e29 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/surface/surface.pb.go @@ -0,0 +1,532 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: surface/surface.proto + +package surface_v1 + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type FieldKind int32 + +const ( + FieldKind_SCALAR FieldKind = 0 + FieldKind_MAP FieldKind = 1 + FieldKind_ARRAY FieldKind = 2 + FieldKind_REFERENCE FieldKind = 3 + FieldKind_ANY FieldKind = 4 +) + +var FieldKind_name = map[int32]string{ + 0: "SCALAR", + 1: "MAP", + 2: "ARRAY", + 3: "REFERENCE", + 4: "ANY", +} + +var FieldKind_value = map[string]int32{ + "SCALAR": 0, + "MAP": 1, + "ARRAY": 2, + "REFERENCE": 3, + "ANY": 4, +} + +func (x FieldKind) String() string { + return proto.EnumName(FieldKind_name, int32(x)) +} + +func (FieldKind) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_68892468a0db0ac7, []int{0} +} + +type TypeKind int32 + +const ( + TypeKind_STRUCT TypeKind = 0 + TypeKind_OBJECT TypeKind = 1 +) + +var TypeKind_name = map[int32]string{ + 0: "STRUCT", + 1: "OBJECT", +} + +var TypeKind_value = map[string]int32{ + "STRUCT": 0, + "OBJECT": 1, +} + +func (x TypeKind) String() string { + return proto.EnumName(TypeKind_name, int32(x)) +} + +func (TypeKind) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_68892468a0db0ac7, []int{1} +} + +type Position int32 + +const ( + Position_BODY Position = 0 + Position_HEADER Position = 1 + Position_FORMDATA Position = 2 + Position_QUERY Position = 3 + Position_PATH Position = 4 +) + +var Position_name = map[int32]string{ + 0: "BODY", + 1: "HEADER", + 2: "FORMDATA", + 3: "QUERY", + 4: "PATH", +} + +var Position_value = map[string]int32{ + "BODY": 0, + "HEADER": 1, + "FORMDATA": 2, + "QUERY": 3, + "PATH": 4, +} + +func (x Position) String() string { + return proto.EnumName(Position_name, int32(x)) +} + +func (Position) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_68892468a0db0ac7, []int{2} +} + +// Field is a field in a definition and can be associated with +// a position in a request structure. +type Field struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + Kind FieldKind `protobuf:"varint,3,opt,name=kind,proto3,enum=surface.v1.FieldKind" json:"kind,omitempty"` + Format string `protobuf:"bytes,4,opt,name=format,proto3" json:"format,omitempty"` + Position Position `protobuf:"varint,5,opt,name=position,proto3,enum=surface.v1.Position" json:"position,omitempty"` + NativeType string `protobuf:"bytes,6,opt,name=native_type,json=nativeType,proto3" json:"native_type,omitempty"` + FieldName string `protobuf:"bytes,7,opt,name=field_name,json=fieldName,proto3" json:"field_name,omitempty"` + ParameterName string `protobuf:"bytes,8,opt,name=parameter_name,json=parameterName,proto3" json:"parameter_name,omitempty"` + Serialize bool `protobuf:"varint,9,opt,name=serialize,proto3" json:"serialize,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Field) Reset() { *m = Field{} } +func (m *Field) String() string { return proto.CompactTextString(m) } +func (*Field) ProtoMessage() {} +func (*Field) Descriptor() ([]byte, []int) { + return fileDescriptor_68892468a0db0ac7, []int{0} +} + +func (m *Field) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Field.Unmarshal(m, b) +} +func (m *Field) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Field.Marshal(b, m, deterministic) +} +func (m *Field) XXX_Merge(src proto.Message) { + xxx_messageInfo_Field.Merge(m, src) +} +func (m *Field) XXX_Size() int { + return xxx_messageInfo_Field.Size(m) +} +func (m *Field) XXX_DiscardUnknown() { + xxx_messageInfo_Field.DiscardUnknown(m) +} + +var xxx_messageInfo_Field proto.InternalMessageInfo + +func (m *Field) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Field) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *Field) GetKind() FieldKind { + if m != nil { + return m.Kind + } + return FieldKind_SCALAR +} + +func (m *Field) GetFormat() string { + if m != nil { + return m.Format + } + return "" +} + +func (m *Field) GetPosition() Position { + if m != nil { + return m.Position + } + return Position_BODY +} + +func (m *Field) GetNativeType() string { + if m != nil { + return m.NativeType + } + return "" +} + +func (m *Field) GetFieldName() string { + if m != nil { + return m.FieldName + } + return "" +} + +func (m *Field) GetParameterName() string { + if m != nil { + return m.ParameterName + } + return "" +} + +func (m *Field) GetSerialize() bool { + if m != nil { + return m.Serialize + } + return false +} + +// Type typically corresponds to a definition, parameter, or response +// in an API and is represented by a type in generated code. +type Type struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Kind TypeKind `protobuf:"varint,2,opt,name=kind,proto3,enum=surface.v1.TypeKind" json:"kind,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + ContentType string `protobuf:"bytes,4,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` + Fields []*Field `protobuf:"bytes,5,rep,name=fields,proto3" json:"fields,omitempty"` + TypeName string `protobuf:"bytes,6,opt,name=type_name,json=typeName,proto3" json:"type_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Type) Reset() { *m = Type{} } +func (m *Type) String() string { return proto.CompactTextString(m) } +func (*Type) ProtoMessage() {} +func (*Type) Descriptor() ([]byte, []int) { + return fileDescriptor_68892468a0db0ac7, []int{1} +} + +func (m *Type) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Type.Unmarshal(m, b) +} +func (m *Type) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Type.Marshal(b, m, deterministic) +} +func (m *Type) XXX_Merge(src proto.Message) { + xxx_messageInfo_Type.Merge(m, src) +} +func (m *Type) XXX_Size() int { + return xxx_messageInfo_Type.Size(m) +} +func (m *Type) XXX_DiscardUnknown() { + xxx_messageInfo_Type.DiscardUnknown(m) +} + +var xxx_messageInfo_Type proto.InternalMessageInfo + +func (m *Type) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Type) GetKind() TypeKind { + if m != nil { + return m.Kind + } + return TypeKind_STRUCT +} + +func (m *Type) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Type) GetContentType() string { + if m != nil { + return m.ContentType + } + return "" +} + +func (m *Type) GetFields() []*Field { + if m != nil { + return m.Fields + } + return nil +} + +func (m *Type) GetTypeName() string { + if m != nil { + return m.TypeName + } + return "" +} + +// Method is an operation of an API and typically has associated client and server code. +type Method struct { + Operation string `protobuf:"bytes,1,opt,name=operation,proto3" json:"operation,omitempty"` + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + Method string `protobuf:"bytes,3,opt,name=method,proto3" json:"method,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` + HandlerName string `protobuf:"bytes,6,opt,name=handler_name,json=handlerName,proto3" json:"handler_name,omitempty"` + ProcessorName string `protobuf:"bytes,7,opt,name=processor_name,json=processorName,proto3" json:"processor_name,omitempty"` + ClientName string `protobuf:"bytes,8,opt,name=client_name,json=clientName,proto3" json:"client_name,omitempty"` + ParametersTypeName string `protobuf:"bytes,9,opt,name=parameters_type_name,json=parametersTypeName,proto3" json:"parameters_type_name,omitempty"` + ResponsesTypeName string `protobuf:"bytes,10,opt,name=responses_type_name,json=responsesTypeName,proto3" json:"responses_type_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Method) Reset() { *m = Method{} } +func (m *Method) String() string { return proto.CompactTextString(m) } +func (*Method) ProtoMessage() {} +func (*Method) Descriptor() ([]byte, []int) { + return fileDescriptor_68892468a0db0ac7, []int{2} +} + +func (m *Method) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Method.Unmarshal(m, b) +} +func (m *Method) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Method.Marshal(b, m, deterministic) +} +func (m *Method) XXX_Merge(src proto.Message) { + xxx_messageInfo_Method.Merge(m, src) +} +func (m *Method) XXX_Size() int { + return xxx_messageInfo_Method.Size(m) +} +func (m *Method) XXX_DiscardUnknown() { + xxx_messageInfo_Method.DiscardUnknown(m) +} + +var xxx_messageInfo_Method proto.InternalMessageInfo + +func (m *Method) GetOperation() string { + if m != nil { + return m.Operation + } + return "" +} + +func (m *Method) GetPath() string { + if m != nil { + return m.Path + } + return "" +} + +func (m *Method) GetMethod() string { + if m != nil { + return m.Method + } + return "" +} + +func (m *Method) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Method) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Method) GetHandlerName() string { + if m != nil { + return m.HandlerName + } + return "" +} + +func (m *Method) GetProcessorName() string { + if m != nil { + return m.ProcessorName + } + return "" +} + +func (m *Method) GetClientName() string { + if m != nil { + return m.ClientName + } + return "" +} + +func (m *Method) GetParametersTypeName() string { + if m != nil { + return m.ParametersTypeName + } + return "" +} + +func (m *Method) GetResponsesTypeName() string { + if m != nil { + return m.ResponsesTypeName + } + return "" +} + +// Model represents an API for code generation. +type Model struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Types []*Type `protobuf:"bytes,2,rep,name=types,proto3" json:"types,omitempty"` + Methods []*Method `protobuf:"bytes,3,rep,name=methods,proto3" json:"methods,omitempty"` + SymbolicReferences []string `protobuf:"bytes,4,rep,name=symbolic_references,json=symbolicReferences,proto3" json:"symbolic_references,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Model) Reset() { *m = Model{} } +func (m *Model) String() string { return proto.CompactTextString(m) } +func (*Model) ProtoMessage() {} +func (*Model) Descriptor() ([]byte, []int) { + return fileDescriptor_68892468a0db0ac7, []int{3} +} + +func (m *Model) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Model.Unmarshal(m, b) +} +func (m *Model) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Model.Marshal(b, m, deterministic) +} +func (m *Model) XXX_Merge(src proto.Message) { + xxx_messageInfo_Model.Merge(m, src) +} +func (m *Model) XXX_Size() int { + return xxx_messageInfo_Model.Size(m) +} +func (m *Model) XXX_DiscardUnknown() { + xxx_messageInfo_Model.DiscardUnknown(m) +} + +var xxx_messageInfo_Model proto.InternalMessageInfo + +func (m *Model) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Model) GetTypes() []*Type { + if m != nil { + return m.Types + } + return nil +} + +func (m *Model) GetMethods() []*Method { + if m != nil { + return m.Methods + } + return nil +} + +func (m *Model) GetSymbolicReferences() []string { + if m != nil { + return m.SymbolicReferences + } + return nil +} + +func init() { + proto.RegisterEnum("surface.v1.FieldKind", FieldKind_name, FieldKind_value) + proto.RegisterEnum("surface.v1.TypeKind", TypeKind_name, TypeKind_value) + proto.RegisterEnum("surface.v1.Position", Position_name, Position_value) + proto.RegisterType((*Field)(nil), "surface.v1.Field") + proto.RegisterType((*Type)(nil), "surface.v1.Type") + proto.RegisterType((*Method)(nil), "surface.v1.Method") + proto.RegisterType((*Model)(nil), "surface.v1.Model") +} + +func init() { proto.RegisterFile("surface/surface.proto", fileDescriptor_68892468a0db0ac7) } + +var fileDescriptor_68892468a0db0ac7 = []byte{ + // 638 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x54, 0xdd, 0x4e, 0xdb, 0x48, + 0x18, 0xc5, 0x7f, 0xc1, 0xfe, 0x02, 0xc8, 0x0c, 0xb0, 0xb2, 0xb4, 0xbb, 0x22, 0x44, 0xda, 0x55, + 0x8a, 0xaa, 0x40, 0xe9, 0x13, 0x98, 0x60, 0x84, 0xda, 0x06, 0xe8, 0xd4, 0x5c, 0xe4, 0x2a, 0x32, + 0xf6, 0x44, 0x58, 0x4d, 0x3c, 0xd6, 0x8c, 0x8b, 0x44, 0x1f, 0xa7, 0x77, 0x7d, 0x9c, 0x5e, 0xf4, + 0x7d, 0xaa, 0xf9, 0xc6, 0x76, 0x2c, 0xe0, 0x2a, 0xe3, 0xf3, 0x9d, 0x39, 0x9e, 0x73, 0xce, 0x38, + 0x70, 0x20, 0xbf, 0x89, 0x45, 0x92, 0xb2, 0x93, 0xfa, 0x77, 0x5c, 0x0a, 0x5e, 0x71, 0x02, 0xcd, + 0xe3, 0xe3, 0xbb, 0xe1, 0x4f, 0x13, 0x9c, 0xcb, 0x9c, 0x2d, 0x33, 0x42, 0xc0, 0x2e, 0x92, 0x15, + 0x0b, 0x8c, 0x81, 0x31, 0xf2, 0x28, 0xae, 0x15, 0x56, 0x3d, 0x95, 0x2c, 0x30, 0x35, 0xa6, 0xd6, + 0xe4, 0x0d, 0xd8, 0x5f, 0xf3, 0x22, 0x0b, 0xac, 0x81, 0x31, 0xda, 0x39, 0x3b, 0x18, 0xaf, 0xc5, + 0xc6, 0x28, 0xf4, 0x31, 0x2f, 0x32, 0x8a, 0x14, 0xf2, 0x17, 0xf4, 0x16, 0x5c, 0xac, 0x92, 0x2a, + 0xb0, 0x51, 0xa0, 0x7e, 0x22, 0xa7, 0xe0, 0x96, 0x5c, 0xe6, 0x55, 0xce, 0x8b, 0xc0, 0x41, 0x99, + 0xfd, 0xae, 0xcc, 0x6d, 0x3d, 0xa3, 0x2d, 0x8b, 0x1c, 0x42, 0xbf, 0x48, 0xaa, 0xfc, 0x91, 0xcd, + 0xf1, 0x3c, 0x3d, 0x94, 0x03, 0x0d, 0xc5, 0xea, 0x54, 0xff, 0x02, 0x2c, 0xd4, 0xdb, 0xe7, 0xe8, + 0x61, 0x13, 0xe7, 0x1e, 0x22, 0xd7, 0xca, 0xc8, 0x7f, 0xb0, 0x53, 0x26, 0x22, 0x59, 0xb1, 0x8a, + 0x09, 0x4d, 0x71, 0x91, 0xb2, 0xdd, 0xa2, 0x48, 0xfb, 0x07, 0x3c, 0xc9, 0x44, 0x9e, 0x2c, 0xf3, + 0xef, 0x2c, 0xf0, 0x06, 0xc6, 0xc8, 0xa5, 0x6b, 0x60, 0xf8, 0xcb, 0x00, 0x1b, 0x5f, 0xf6, 0x5a, + 0x54, 0xa3, 0x3a, 0x16, 0xf3, 0xa5, 0x1f, 0xb5, 0xa7, 0x93, 0xca, 0x00, 0xfa, 0x19, 0x93, 0xa9, + 0xc8, 0x4b, 0x0c, 0xc0, 0x42, 0x91, 0x2e, 0x44, 0x8e, 0x60, 0x2b, 0xe5, 0x45, 0xc5, 0x8a, 0x4a, + 0xdb, 0xd5, 0xe9, 0xf5, 0x6b, 0x2c, 0xd6, 0x2d, 0xf4, 0xd0, 0x9d, 0x0c, 0x9c, 0x81, 0x35, 0xea, + 0x9f, 0xed, 0xbe, 0xe8, 0x81, 0xd6, 0x04, 0xf2, 0x37, 0x78, 0x4a, 0x45, 0xdb, 0xd6, 0xc9, 0xb9, + 0x0a, 0x50, 0x8e, 0x87, 0xbf, 0x4d, 0xe8, 0x4d, 0x59, 0xf5, 0xc0, 0x33, 0x65, 0x9e, 0x97, 0x4c, + 0x24, 0x78, 0x2a, 0x6d, 0x6d, 0x0d, 0x28, 0xcf, 0x65, 0x52, 0x3d, 0x34, 0x57, 0x41, 0xad, 0x55, + 0xbf, 0x2b, 0xdc, 0x5b, 0x9b, 0xa8, 0x9f, 0x9e, 0x3b, 0xb4, 0x5f, 0x3a, 0x6c, 0x12, 0x74, 0x3a, + 0x09, 0x1e, 0xc1, 0xd6, 0x43, 0x52, 0x64, 0xcb, 0xa6, 0x21, 0x7d, 0xd4, 0x7e, 0x8d, 0xb5, 0x35, + 0x0a, 0x9e, 0x32, 0x29, 0xb9, 0xe8, 0x36, 0xbd, 0xdd, 0xa2, 0x48, 0x3b, 0x84, 0x7e, 0xba, 0xcc, + 0x55, 0x7c, 0x9d, 0xaa, 0x41, 0x43, 0x48, 0x38, 0x85, 0xfd, 0xb6, 0x78, 0x39, 0x5f, 0xa7, 0xe3, + 0x21, 0x93, 0xac, 0x67, 0x71, 0x9d, 0x13, 0x19, 0xc3, 0x9e, 0x60, 0xb2, 0xe4, 0x85, 0x64, 0xdd, + 0x0d, 0x80, 0x1b, 0x76, 0xdb, 0x51, 0xc3, 0x1f, 0xfe, 0x30, 0xc0, 0x99, 0xf2, 0x8c, 0x2d, 0x5f, + 0xbd, 0x2c, 0xff, 0x83, 0xa3, 0x34, 0x64, 0x60, 0x62, 0x79, 0xfe, 0xf3, 0xdb, 0x42, 0xf5, 0x98, + 0xbc, 0x85, 0x4d, 0x1d, 0xa9, 0x0c, 0x2c, 0x64, 0x92, 0x2e, 0x53, 0xf7, 0x46, 0x1b, 0x0a, 0x39, + 0x81, 0x3d, 0xf9, 0xb4, 0xba, 0xe7, 0xcb, 0x3c, 0x9d, 0x0b, 0xb6, 0x60, 0x82, 0x15, 0x29, 0x93, + 0x81, 0x3d, 0xb0, 0x94, 0xa9, 0x66, 0x44, 0xdb, 0xc9, 0xf1, 0x04, 0xbc, 0xf6, 0x93, 0x25, 0x00, + 0xbd, 0x2f, 0x93, 0xf0, 0x53, 0x48, 0xfd, 0x0d, 0xb2, 0x09, 0xd6, 0x34, 0xbc, 0xf5, 0x0d, 0xe2, + 0x81, 0x13, 0x52, 0x1a, 0xce, 0x7c, 0x93, 0x6c, 0x83, 0x47, 0xa3, 0xcb, 0x88, 0x46, 0xd7, 0x93, + 0xc8, 0xb7, 0x14, 0x25, 0xbc, 0x9e, 0xf9, 0xf6, 0xf1, 0x10, 0xdc, 0xe6, 0x82, 0xa3, 0x46, 0x4c, + 0xef, 0x26, 0xb1, 0xbf, 0xa1, 0xd6, 0x37, 0xe7, 0x1f, 0xa2, 0x49, 0xec, 0x1b, 0xc7, 0x13, 0x70, + 0x9b, 0x8f, 0x9a, 0xb8, 0x60, 0x9f, 0xdf, 0x5c, 0xcc, 0x34, 0xe3, 0x2a, 0x0a, 0x2f, 0x22, 0xea, + 0x1b, 0x64, 0x0b, 0xdc, 0xcb, 0x1b, 0x3a, 0xbd, 0x08, 0xe3, 0xd0, 0x37, 0xd5, 0x6b, 0x3f, 0xdf, + 0x45, 0x74, 0xe6, 0x5b, 0x8a, 0x7e, 0x1b, 0xc6, 0x57, 0xbe, 0x7d, 0xdf, 0xc3, 0x7f, 0xaf, 0xf7, + 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x16, 0x92, 0x74, 0x66, 0xd6, 0x04, 0x00, 0x00, +} diff --git a/vendor/github.com/googleapis/gnostic/surface/surface.proto b/vendor/github.com/googleapis/gnostic/surface/surface.proto new file mode 100644 index 0000000000..1afcdc1605 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/surface/surface.proto @@ -0,0 +1,92 @@ +// Copyright 2017 Google Inc. 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. + +// Model an API surface for code generation. + +syntax = "proto3"; + +package surface.v1; + +enum FieldKind { + SCALAR = 0; + MAP = 1; + ARRAY = 2; + REFERENCE = 3; + ANY = 4; +} + +enum TypeKind { + STRUCT = 0; // implement with named fields + OBJECT = 1; // implement with a map +} + +enum Position { + BODY = 0; + HEADER = 1; + FORMDATA = 2; + QUERY = 3; + PATH = 4; +} + +// Field is a field in a definition and can be associated with +// a position in a request structure. +message Field { + string name = 1; // the name as specified in the API description + string type = 2; // the specified content type of the field + FieldKind kind = 3; // what kind of thing is this field? scalar, reference, array, map of strings to the specified type + string format = 4; // the specified format of the field + Position position = 5; // "body", "header", "formdata", "query", or "path" + + string native_type = 6; // the programming-language native type of the field + string field_name = 7; // the name to use for a data structure field + string parameter_name = 8; // the name to use for a function parameter + + bool serialize = 9; // true if this field should be serialized (to JSON, etc) +} + +// Type typically corresponds to a definition, parameter, or response +// in an API and is represented by a type in generated code. +message Type { + string name = 1; // the name to use for the type + TypeKind kind = 2; // a meta-description of the type (struct, map, etc) + string description = 3; // a comment describing the type + string content_type = 4; // if the type is a map, this is its content type + repeated Field fields = 5; // the fields of the type + + string type_name = 6; // language-specific type name +} + +// Method is an operation of an API and typically has associated client and server code. +message Method { + string operation = 1; // Operation ID + string path = 2; // HTTP path + string method = 3; // HTTP method name + string description = 4; // description of method + + string name = 5; // Operation name, possibly generated from method and path + string handler_name = 6; // name of the generated handler + string processor_name = 7; // name of the processing function in the service interface + string client_name = 8; // name of client + + string parameters_type_name = 9; // parameters (input), with fields corresponding to input parameters + string responses_type_name = 10; // responses (output), with fields corresponding to possible response values +} + +// Model represents an API for code generation. +message Model { + string name = 1; // a free-form title for the API + repeated Type types = 2; // the types used by the API + repeated Method methods = 3; // the methods (functions) of the API + repeated string symbolic_references = 4; // references to other OpenAPI files. Currently only supported for OpenAPI v3. +} diff --git a/vendor/github.com/googleapis/gnostic/surface/type.go b/vendor/github.com/googleapis/gnostic/surface/type.go new file mode 100644 index 0000000000..60f3e88277 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/surface/type.go @@ -0,0 +1,60 @@ +// Copyright 2017 Google Inc. 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 surface_v1 + +func (t *Type) addField(f *Field) { + t.Fields = append(t.Fields, f) +} + +func (s *Type) HasFieldWithName(name string) bool { + return s.FieldWithName(name) != nil +} + +func (s *Type) FieldWithName(name string) *Field { + if s == nil || s.Fields == nil || name == "" { + return nil + } + // Compares Go specific field names. + for _, f := range s.Fields { + if f.FieldName == name { + return f + } + } + + // Compares names as specified in the OpenAPI description. + for _, f := range s.Fields { + if f.Name == name { + return f + } + } + + return nil +} + +func (s *Type) HasFieldWithPosition(position Position) bool { + return s.FieldWithPosition(position) != nil +} + +func (s *Type) FieldWithPosition(position Position) *Field { + if s == nil || s.Fields == nil { + return nil + } + for _, f := range s.Fields { + if f.Position == position { + return f + } + } + return nil +} diff --git a/vendor/github.com/hashicorp/golang-lru/go.mod b/vendor/github.com/hashicorp/golang-lru/go.mod index 824cb97e83..8ad8826b36 100644 --- a/vendor/github.com/hashicorp/golang-lru/go.mod +++ b/vendor/github.com/hashicorp/golang-lru/go.mod @@ -1 +1,3 @@ module github.com/hashicorp/golang-lru + +go 1.12 diff --git a/vendor/github.com/hashicorp/golang-lru/lru.go b/vendor/github.com/hashicorp/golang-lru/lru.go index 1cbe04b7d0..4e5e9d8fd0 100644 --- a/vendor/github.com/hashicorp/golang-lru/lru.go +++ b/vendor/github.com/hashicorp/golang-lru/lru.go @@ -37,7 +37,7 @@ func (c *Cache) Purge() { c.lock.Unlock() } -// Add adds a value to the cache. Returns true if an eviction occurred. +// Add adds a value to the cache. Returns true if an eviction occurred. func (c *Cache) Add(key, value interface{}) (evicted bool) { c.lock.Lock() evicted = c.lru.Add(key, value) @@ -71,8 +71,8 @@ func (c *Cache) Peek(key interface{}) (value interface{}, ok bool) { return value, ok } -// ContainsOrAdd checks if a key is in the cache without updating the -// recent-ness or deleting it for being stale, and if not, adds the value. +// ContainsOrAdd checks if a key is in the cache without updating the +// recent-ness or deleting it for being stale, and if not, adds the value. // Returns whether found and whether an eviction occurred. func (c *Cache) ContainsOrAdd(key, value interface{}) (ok, evicted bool) { c.lock.Lock() @@ -85,18 +85,52 @@ func (c *Cache) ContainsOrAdd(key, value interface{}) (ok, evicted bool) { return false, evicted } +// PeekOrAdd checks if a key is in the cache without updating the +// recent-ness or deleting it for being stale, and if not, adds the value. +// Returns whether found and whether an eviction occurred. +func (c *Cache) PeekOrAdd(key, value interface{}) (previous interface{}, ok, evicted bool) { + c.lock.Lock() + defer c.lock.Unlock() + + previous, ok = c.lru.Peek(key) + if ok { + return previous, true, false + } + + evicted = c.lru.Add(key, value) + return nil, false, evicted +} + // Remove removes the provided key from the cache. -func (c *Cache) Remove(key interface{}) { +func (c *Cache) Remove(key interface{}) (present bool) { c.lock.Lock() - c.lru.Remove(key) + present = c.lru.Remove(key) c.lock.Unlock() + return +} + +// Resize changes the cache size. +func (c *Cache) Resize(size int) (evicted int) { + c.lock.Lock() + evicted = c.lru.Resize(size) + c.lock.Unlock() + return evicted } // RemoveOldest removes the oldest item from the cache. -func (c *Cache) RemoveOldest() { +func (c *Cache) RemoveOldest() (key interface{}, value interface{}, ok bool) { + c.lock.Lock() + key, value, ok = c.lru.RemoveOldest() + c.lock.Unlock() + return +} + +// GetOldest returns the oldest entry +func (c *Cache) GetOldest() (key interface{}, value interface{}, ok bool) { c.lock.Lock() - c.lru.RemoveOldest() + key, value, ok = c.lru.GetOldest() c.lock.Unlock() + return } // Keys returns a slice of the keys in the cache, from oldest to newest. diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go index 5673773b22..a86c8539e0 100644 --- a/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go +++ b/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go @@ -73,6 +73,9 @@ func (c *LRU) Add(key, value interface{}) (evicted bool) { func (c *LRU) Get(key interface{}) (value interface{}, ok bool) { if ent, ok := c.items[key]; ok { c.evictList.MoveToFront(ent) + if ent.Value.(*entry) == nil { + return nil, false + } return ent.Value.(*entry).value, true } return @@ -142,6 +145,19 @@ func (c *LRU) Len() int { return c.evictList.Len() } +// Resize changes the cache size. +func (c *LRU) Resize(size int) (evicted int) { + diff := c.Len() - size + if diff < 0 { + diff = 0 + } + for i := 0; i < diff; i++ { + c.removeOldest() + } + c.size = size + return diff +} + // removeOldest removes the oldest item from the cache. func (c *LRU) removeOldest() { ent := c.evictList.Back() diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go index 74c7077440..92d70934d6 100644 --- a/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go +++ b/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go @@ -10,7 +10,7 @@ type LRUCache interface { // updates the "recently used"-ness of the key. #value, isFound Get(key interface{}) (value interface{}, ok bool) - // Check if a key exsists in cache without updating the recent-ness. + // Checks if a key exists in cache without updating the recent-ness. Contains(key interface{}) (ok bool) // Returns key's value without updating the "recently used"-ness of the key. @@ -31,6 +31,9 @@ type LRUCache interface { // Returns the number of items in the cache. Len() int - // Clear all cache entries + // Clears all cache entries. Purge() + + // Resizes cache, returning number evicted + Resize(int) int } diff --git a/vendor/github.com/hpcloud/tail/.gitignore b/vendor/github.com/hpcloud/tail/.gitignore deleted file mode 100644 index 6d9953c3c6..0000000000 --- a/vendor/github.com/hpcloud/tail/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.test -.go - diff --git a/vendor/github.com/hpcloud/tail/CHANGES.md b/vendor/github.com/hpcloud/tail/CHANGES.md deleted file mode 100644 index 422790c073..0000000000 --- a/vendor/github.com/hpcloud/tail/CHANGES.md +++ /dev/null @@ -1,63 +0,0 @@ -# API v1 (gopkg.in/hpcloud/tail.v1) - -## April, 2016 - -* Migrated to godep, as depman is not longer supported -* Introduced golang vendoring feature -* Fixed issue [#57](https://github.com/hpcloud/tail/issues/57) related to reopen deleted file - -## July, 2015 - -* Fix inotify watcher leak; remove `Cleanup` (#51) - -# API v0 (gopkg.in/hpcloud/tail.v0) - -## June, 2015 - -* Don't return partial lines (PR #40) -* Use stable version of fsnotify (#46) - -## July, 2014 - -* Fix tail for Windows (PR #36) - -## May, 2014 - -* Improved rate limiting using leaky bucket (PR #29) -* Fix odd line splitting (PR #30) - -## Apr, 2014 - -* LimitRate now discards read buffer (PR #28) -* allow reading of longer lines if MaxLineSize is unset (PR #24) -* updated deps.json to latest fsnotify (441bbc86b1) - -## Feb, 2014 - -* added `Config.Logger` to suppress library logging - -## Nov, 2013 - -* add Cleanup to remove leaky inotify watches (PR #20) - -## Aug, 2013 - -* redesigned Location field (PR #12) -* add tail.Tell (PR #14) - -## July, 2013 - -* Rate limiting (PR #10) - -## May, 2013 - -* Detect file deletions/renames in polling file watcher (PR #1) -* Detect file truncation -* Fix potential race condition when reopening the file (issue 5) -* Fix potential blocking of `tail.Stop` (issue 4) -* Fix uncleaned up ChangeEvents goroutines after calling tail.Stop -* Support Follow=false - -## Feb, 2013 - -* Initial open source release diff --git a/vendor/github.com/hpcloud/tail/Dockerfile b/vendor/github.com/hpcloud/tail/Dockerfile deleted file mode 100644 index cd297b940a..0000000000 --- a/vendor/github.com/hpcloud/tail/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM golang - -RUN mkdir -p $GOPATH/src/github.com/hpcloud/tail/ -ADD . $GOPATH/src/github.com/hpcloud/tail/ - -# expecting to fetch dependencies successfully. -RUN go get -v github.com/hpcloud/tail - -# expecting to run the test successfully. -RUN go test -v github.com/hpcloud/tail - -# expecting to install successfully -RUN go install -v github.com/hpcloud/tail -RUN go install -v github.com/hpcloud/tail/cmd/gotail - -RUN $GOPATH/bin/gotail -h || true - -ENV PATH $GOPATH/bin:$PATH -CMD ["gotail"] diff --git a/vendor/github.com/hpcloud/tail/Makefile b/vendor/github.com/hpcloud/tail/Makefile deleted file mode 100644 index 6591b24fc1..0000000000 --- a/vendor/github.com/hpcloud/tail/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -default: test - -test: *.go - go test -v -race ./... - -fmt: - gofmt -w . - -# Run the test in an isolated environment. -fulltest: - docker build -t hpcloud/tail . diff --git a/vendor/github.com/hpcloud/tail/README.md b/vendor/github.com/hpcloud/tail/README.md deleted file mode 100644 index fb7fbc26c6..0000000000 --- a/vendor/github.com/hpcloud/tail/README.md +++ /dev/null @@ -1,28 +0,0 @@ -[![Build Status](https://travis-ci.org/hpcloud/tail.svg)](https://travis-ci.org/hpcloud/tail) -[![Build status](https://ci.appveyor.com/api/projects/status/kohpsf3rvhjhrox6?svg=true)](https://ci.appveyor.com/project/HelionCloudFoundry/tail) - -# Go package for tail-ing files - -A Go package striving to emulate the features of the BSD `tail` program. - -```Go -t, err := tail.TailFile("/var/log/nginx.log", tail.Config{Follow: true}) -for line := range t.Lines { - fmt.Println(line.Text) -} -``` - -See [API documentation](http://godoc.org/github.com/hpcloud/tail). - -## Log rotation - -Tail comes with full support for truncation/move detection as it is -designed to work with log rotation tools. - -## Installing - - go get github.com/hpcloud/tail/... - -## Windows support - -This package [needs assistance](https://github.com/hpcloud/tail/labels/Windows) for full Windows support. diff --git a/vendor/github.com/imdario/mergo/.deepsource.toml b/vendor/github.com/imdario/mergo/.deepsource.toml new file mode 100644 index 0000000000..8a0681af85 --- /dev/null +++ b/vendor/github.com/imdario/mergo/.deepsource.toml @@ -0,0 +1,12 @@ +version = 1 + +test_patterns = [ + "*_test.go" +] + +[[analyzers]] +name = "go" +enabled = true + + [analyzers.meta] + import_path = "github.com/imdario/mergo" \ No newline at end of file diff --git a/vendor/github.com/imdario/mergo/README.md b/vendor/github.com/imdario/mergo/README.md index 02fc81e062..876abb500a 100644 --- a/vendor/github.com/imdario/mergo/README.md +++ b/vendor/github.com/imdario/mergo/README.md @@ -1,44 +1,54 @@ # Mergo -A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. - -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] -[![GoCard][5]][6] +[![GitHub release][5]][6] +[![GoCard][7]][8] [![Build Status][1]][2] -[![Coverage Status][7]][8] -[![Sourcegraph][9]][10] -[![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) +[![Coverage Status][9]][10] +[![Sourcegraph][11]][12] +[![FOSSA Status][13]][14] + +[![GoCenter Kudos][15]][16] [1]: https://travis-ci.org/imdario/mergo.png [2]: https://travis-ci.org/imdario/mergo [3]: https://godoc.org/github.com/imdario/mergo?status.svg [4]: https://godoc.org/github.com/imdario/mergo -[5]: https://goreportcard.com/badge/imdario/mergo -[6]: https://goreportcard.com/report/github.com/imdario/mergo -[7]: https://coveralls.io/repos/github/imdario/mergo/badge.svg?branch=master -[8]: https://coveralls.io/github/imdario/mergo?branch=master -[9]: https://sourcegraph.com/github.com/imdario/mergo/-/badge.svg -[10]: https://sourcegraph.com/github.com/imdario/mergo?badge +[5]: https://img.shields.io/github/release/imdario/mergo.svg +[6]: https://github.com/imdario/mergo/releases +[7]: https://goreportcard.com/badge/imdario/mergo +[8]: https://goreportcard.com/report/github.com/imdario/mergo +[9]: https://coveralls.io/repos/github/imdario/mergo/badge.svg?branch=master +[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://search.gocenter.io/api/ui/badge/github.com%2Fimdario%2Fmergo +[16]: https://search.gocenter.io/github.com/imdario/mergo -### Latest release +A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. -[Release v0.3.7](https://github.com/imdario/mergo/releases/tag/v0.3.7). +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). ### Important note -Please 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). An optional/variadic argument has been added, so it won't break existing code. +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. -If you were using Mergo **before** April 6th 2015, please check your project works as intended after updating your local copy with ```go get -u github.com/imdario/mergo```. I apologize for any issue caused by its previous behavior and any future bug that Mergo could cause (I hope it won't!) in existing projects after the change (release 0.2.0). +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. + +If you were using Mergo before April 6th, 2015, please check your project works as intended after updating your local copy with ```go get -u github.com/imdario/mergo```. I apologize for any issue caused by its previous behavior and any future bug that Mergo could cause in existing projects after the change (release 0.2.0). ### Donations -If Mergo is useful to you, consider buying me a coffee, a beer or making a monthly donation so I can keep building great free software. :heart_eyes: +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) @@ -87,8 +97,9 @@ If Mergo is useful to you, consider buying me a coffee, a beer or making a month - [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) -## Installation +## Install go get github.com/imdario/mergo @@ -99,7 +110,7 @@ If Mergo is useful to you, consider buying me a coffee, a beer or making a month ## Usage -You can only merge same-type structs with exported fields initialized as zero value of their type and same-types maps. Mergo won't merge unexported (private) fields but will do recursively any exported one. It won't merge empty structs value as [they are not considered zero values](https://golang.org/ref/spec#The_zero_value) either. Also maps will be merged recursively except for structs inside maps (because they are not addressable using Go reflection). +You can only merge same-type structs with exported fields initialized as zero value of their type and same-types maps. Mergo won't merge unexported (private) fields but will do recursively any exported one. It won't merge empty structs value as [they are zero values](https://golang.org/ref/spec#The_zero_value) too. Also, maps will be merged recursively except for structs inside maps (because they are not addressable using Go reflection). ```go if err := mergo.Merge(&dst, src); err != nil { @@ -125,9 +136,7 @@ if err := mergo.Map(&dst, srcMap); err != nil { Warning: if you map a struct to map, it won't do it recursively. Don't expect Mergo to map struct members of your struct as `map[string]interface{}`. They will be just assigned as values. -More information and examples in [godoc documentation](http://godoc.org/github.com/imdario/mergo). - -### Nice example +Here is a nice example: ```go package main @@ -175,10 +184,10 @@ import ( "time" ) -type timeTransfomer struct { +type timeTransformer struct { } -func (t timeTransfomer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error { +func (t timeTransformer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error { if typ == reflect.TypeOf(time.Time{}) { return func(dst, src reflect.Value) error { if dst.CanSet() { @@ -202,7 +211,7 @@ type Snapshot struct { func main() { src := Snapshot{time.Now()} dest := Snapshot{} - mergo.Merge(&dest, src, mergo.WithTransformers(timeTransfomer{})) + mergo.Merge(&dest, src, mergo.WithTransformers(timeTransformer{})) fmt.Println(dest) // Will print // { 2018-01-12 01:15:00 +0000 UTC m=+0.000000001 } diff --git a/vendor/github.com/imdario/mergo/doc.go b/vendor/github.com/imdario/mergo/doc.go index 6e9aa7baf3..fcd985f995 100644 --- a/vendor/github.com/imdario/mergo/doc.go +++ b/vendor/github.com/imdario/mergo/doc.go @@ -4,41 +4,140 @@ // license that can be found in the LICENSE file. /* -Package mergo merges same-type structs and maps by setting default values in zero-value fields. +A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. -Mergo won't merge unexported (private) fields but will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection). +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). + +Status + +It is ready for production use. It is used in several projects by Docker, Google, The Linux Foundation, VMWare, Shopify, etc. + +Important note + +Please keep in mind that a problematic PR broke 0.3.9. We reverted it in 0.3.10. We consider 0.3.10 as stable but not bug-free. . Also, this version adds suppot for go modules. + +Keep in mind that in 0.3.2, Mergo changed Merge() and Map() signatures to support transformers. We added an optional/variadic argument so that it won't break the existing code. + +If you were using Mergo before April 6th, 2015, please check your project works as intended after updating your local copy with go get -u github.com/imdario/mergo. I apologize for any issue caused by its previous behavior and any future bug that Mergo could cause in existing projects after the change (release 0.2.0). + +Install + +Do your usual installation procedure: + + go get github.com/imdario/mergo + + // use in your .go code + import ( + "github.com/imdario/mergo" + ) Usage -From my own work-in-progress project: +You can only merge same-type structs with exported fields initialized as zero value of their type and same-types maps. Mergo won't merge unexported (private) fields but will do recursively any exported one. It won't merge empty structs value as they are zero values too. Also, maps will be merged recursively except for structs inside maps (because they are not addressable using Go reflection). + + if err := mergo.Merge(&dst, src); err != nil { + // ... + } + +Also, you can merge overwriting values using the transformer WithOverride. + + if err := mergo.Merge(&dst, src, mergo.WithOverride); err != nil { + // ... + } + +Additionally, you can map a map[string]interface{} to a struct (and otherwise, from struct to map), following the same restrictions as in Merge(). Keys are capitalized to find each corresponding exported field. + + if err := mergo.Map(&dst, srcMap); err != nil { + // ... + } + +Warning: if you map a struct to map, it won't do it recursively. Don't expect Mergo to map struct members of your struct as map[string]interface{}. They will be just assigned as values. + +Here is a nice example: + + package main + + import ( + "fmt" + "github.com/imdario/mergo" + ) - type networkConfig struct { - Protocol string - Address string - ServerType string `json: "server_type"` - Port uint16 + type Foo struct { + A string + B int64 } - type FssnConfig struct { - Network networkConfig + func main() { + src := Foo{ + A: "one", + B: 2, + } + dest := Foo{ + A: "two", + } + mergo.Merge(&dest, src) + fmt.Println(dest) + // Will print + // {two 2} } - var fssnDefault = FssnConfig { - networkConfig { - "tcp", - "127.0.0.1", - "http", - 31560, - }, +Transformers + +Transformers allow to merge specific types differently than in the default behavior. In other words, now you can customize how some types are merged. For example, time.Time is a struct; it doesn't have zero value but IsZero can return true because it has fields with zero value. How can we merge a non-zero time.Time? + + package main + + import ( + "fmt" + "github.com/imdario/mergo" + "reflect" + "time" + ) + + type timeTransformer struct { } - // Inside a function [...] + func (t timeTransformer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error { + if typ == reflect.TypeOf(time.Time{}) { + return func(dst, src reflect.Value) error { + if dst.CanSet() { + isZero := dst.MethodByName("IsZero") + result := isZero.Call([]reflect.Value{}) + if result[0].Bool() { + dst.Set(src) + } + } + return nil + } + } + return nil + } + + type Snapshot struct { + Time time.Time + // ... + } - if err := mergo.Merge(&config, fssnDefault); err != nil { - log.Fatal(err) + func main() { + src := Snapshot{time.Now()} + dest := Snapshot{} + mergo.Merge(&dest, src, mergo.WithTransformers(timeTransformer{})) + fmt.Println(dest) + // Will print + // { 2018-01-12 01:15:00 +0000 UTC m=+0.000000001 } } - // More code [...] +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): https://twitter.com/im_dario + +About + +Written by Dario Castañé: https://da.rio.hn + +License + +BSD 3-Clause license, as Go language. */ package mergo diff --git a/vendor/github.com/imdario/mergo/go.mod b/vendor/github.com/imdario/mergo/go.mod new file mode 100644 index 0000000000..3d689d93eb --- /dev/null +++ b/vendor/github.com/imdario/mergo/go.mod @@ -0,0 +1,5 @@ +module github.com/imdario/mergo + +go 1.13 + +require gopkg.in/yaml.v2 v2.3.0 diff --git a/vendor/github.com/imdario/mergo/go.sum b/vendor/github.com/imdario/mergo/go.sum new file mode 100644 index 0000000000..168980da5f --- /dev/null +++ b/vendor/github.com/imdario/mergo/go.sum @@ -0,0 +1,4 @@ +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/imdario/mergo/map.go b/vendor/github.com/imdario/mergo/map.go index 3f5afa83a1..a13a7ee46c 100644 --- a/vendor/github.com/imdario/mergo/map.go +++ b/vendor/github.com/imdario/mergo/map.go @@ -141,6 +141,9 @@ 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 + } var ( vDst, vSrc reflect.Value err error diff --git a/vendor/github.com/imdario/mergo/merge.go b/vendor/github.com/imdario/mergo/merge.go index 3fb6c64d05..afa84a1e29 100644 --- a/vendor/github.com/imdario/mergo/merge.go +++ b/vendor/github.com/imdario/mergo/merge.go @@ -13,18 +13,30 @@ import ( "reflect" ) -func hasExportedField(dst reflect.Value) (exported bool) { +func hasMergeableFields(dst reflect.Value) (exported bool) { for i, n := 0, dst.NumField(); i < n; i++ { field := dst.Type().Field(i) if field.Anonymous && dst.Field(i).Kind() == reflect.Struct { - exported = exported || hasExportedField(dst.Field(i)) - } else { + exported = exported || hasMergeableFields(dst.Field(i)) + } else if isExportedComponent(&field) { exported = exported || len(field.PkgPath) == 0 } } return } +func isExportedComponent(field *reflect.StructField) bool { + pkgPath := field.PkgPath + if len(pkgPath) > 0 { + return false + } + c := field.Name[0] + if 'a' <= c && c <= 'z' || c == '_' { + return false + } + return true +} + type Config struct { Overwrite bool AppendSlice bool @@ -32,6 +44,8 @@ type Config struct { Transformers Transformers overwriteWithEmptyValue bool overwriteSliceWithEmptyValue bool + sliceDeepCopy bool + debug bool } type Transformers interface { @@ -46,7 +60,7 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co typeCheck := config.TypeCheck overwriteWithEmptySrc := config.overwriteWithEmptyValue overwriteSliceWithEmptySrc := config.overwriteSliceWithEmptyValue - config.overwriteWithEmptyValue = false + sliceDeepCopy := config.sliceDeepCopy if !src.IsValid() { return @@ -74,14 +88,14 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co switch dst.Kind() { case reflect.Struct: - if hasExportedField(dst) { + if hasMergeableFields(dst) { for i, n := 0, dst.NumField(); i < n; i++ { if err = deepMerge(dst.Field(i), src.Field(i), visited, depth+1, config); err != nil { return } } } else { - if dst.CanSet() && (!isEmptyValue(src) || overwriteWithEmptySrc) && (overwrite || isEmptyValue(dst)) { + if (isReflectNil(dst) || overwrite) && (!isEmptyValue(src) || overwriteWithEmptySrc) { dst.Set(src) } } @@ -89,6 +103,14 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co if dst.IsNil() && !src.IsNil() { dst.Set(reflect.MakeMap(dst.Type())) } + + if src.Kind() != reflect.Map { + if overwrite { + dst.Set(src) + } + return + } + for _, key := range src.MapKeys() { srcElement := src.MapIndex(key) if !srcElement.IsValid() { @@ -98,6 +120,9 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co switch srcElement.Kind() { case reflect.Chan, reflect.Func, reflect.Map, reflect.Interface, reflect.Slice: if srcElement.IsNil() { + if overwrite { + dst.SetMapIndex(key, srcElement) + } continue } fallthrough @@ -132,7 +157,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 { + if (!isEmptyValue(src) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !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()) } @@ -142,6 +167,24 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co return fmt.Errorf("cannot append two slices with different type (%s, %s)", srcSlice.Type(), dstSlice.Type()) } dstSlice = reflect.AppendSlice(dstSlice, srcSlice) + } else if sliceDeepCopy { + i := 0 + for ; i < srcSlice.Len() && i < dstSlice.Len(); i++ { + srcElement := srcSlice.Index(i) + dstElement := dstSlice.Index(i) + + if srcElement.CanInterface() { + srcElement = reflect.ValueOf(srcElement.Interface()) + } + if dstElement.CanInterface() { + dstElement = reflect.ValueOf(dstElement.Interface()) + } + + if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { + return + } + } + } dst.SetMapIndex(key, dstSlice) } @@ -161,26 +204,35 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co if !dst.CanSet() { break } - if (!isEmptyValue(src) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { + if (!isEmptyValue(src) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice && !sliceDeepCopy { dst.Set(src) } else if config.AppendSlice { if src.Type() != dst.Type() { return fmt.Errorf("cannot append two slice with different type (%s, %s)", src.Type(), dst.Type()) } dst.Set(reflect.AppendSlice(dst, src)) + } else if sliceDeepCopy { + for i := 0; i < src.Len() && i < dst.Len(); i++ { + srcElement := src.Index(i) + dstElement := dst.Index(i) + if srcElement.CanInterface() { + srcElement = reflect.ValueOf(srcElement.Interface()) + } + if dstElement.CanInterface() { + dstElement = reflect.ValueOf(dstElement.Interface()) + } + + if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { + return + } + } } case reflect.Ptr: fallthrough case reflect.Interface: - if src.IsNil() { - break - } - - if dst.Kind() != reflect.Ptr && src.Type().AssignableTo(dst.Type()) { - if dst.IsNil() || overwrite { - if dst.CanSet() && (overwrite || isEmptyValue(dst)) { - dst.Set(src) - } + if isReflectNil(src) { + if overwriteWithEmptySrc && dst.CanSet() && src.Type().AssignableTo(dst.Type()) { + dst.Set(src) } break } @@ -203,16 +255,28 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co } break } + if dst.IsNil() || overwrite { if dst.CanSet() && (overwrite || isEmptyValue(dst)) { dst.Set(src) } - } else if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { - return + break + } + + if dst.Elem().Kind() == src.Elem().Kind() { + if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { + return + } + break } default: - if dst.CanSet() && (!isEmptyValue(src) || overwriteWithEmptySrc) && (overwrite || isEmptyValue(dst)) { - dst.Set(src) + mustSet := (isEmptyValue(dst) || overwrite) && (!isEmptyValue(src) || overwriteWithEmptySrc) + if mustSet { + if dst.CanSet() { + dst.Set(src) + } else { + dst = src + } } } @@ -246,7 +310,13 @@ func WithOverride(config *Config) { config.Overwrite = true } -// WithOverride will make merge override empty dst slice with empty src slice. +// WithOverwriteWithEmptyValue will make merge override non empty dst attributes with empty src attributes values. +func WithOverwriteWithEmptyValue(config *Config) { + config.Overwrite = true + config.overwriteWithEmptyValue = true +} + +// WithOverrideEmptySlice will make merge override empty dst slice with empty src slice. func WithOverrideEmptySlice(config *Config) { config.overwriteSliceWithEmptyValue = true } @@ -261,7 +331,16 @@ func WithTypeCheck(config *Config) { config.TypeCheck = true } +// WithSliceDeepCopy will merge slice element one by one with Overwrite flag. +func WithSliceDeepCopy(config *Config) { + config.sliceDeepCopy = true + config.Overwrite = true +} + func merge(dst, src interface{}, opts ...func(*Config)) error { + if dst != nil && reflect.ValueOf(dst).Kind() != reflect.Ptr { + return ErrNonPointerAgument + } var ( vDst, vSrc reflect.Value err error @@ -281,3 +360,16 @@ func merge(dst, src interface{}, opts ...func(*Config)) error { } return deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config) } + +// IsReflectNil is the reflect value provided nil +func isReflectNil(v reflect.Value) bool { + k := v.Kind() + switch k { + case reflect.Interface, reflect.Slice, reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr: + // Both interface and slice are nil if first word is 0. + // Both are always bigger than a word; assume flagIndir. + return v.IsNil() + default: + return false + } +} diff --git a/vendor/github.com/imdario/mergo/mergo.go b/vendor/github.com/imdario/mergo/mergo.go index a82fea2fdc..3cc926c7f6 100644 --- a/vendor/github.com/imdario/mergo/mergo.go +++ b/vendor/github.com/imdario/mergo/mergo.go @@ -20,6 +20,7 @@ var ( ErrNotSupported = errors.New("only structs and maps 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") ) // During deepMerge, must keep track of checks that are @@ -75,23 +76,3 @@ func resolveValues(dst, src interface{}) (vDst, vSrc reflect.Value, err error) { } return } - -// Traverses recursively both values, assigning src's fields values to dst. -// The map argument tracks comparisons that have already been seen, which allows -// short circuiting on recursive types. -func deeper(dst, src reflect.Value, visited map[uintptr]*visit, depth int) (err error) { - if dst.CanAddr() { - addr := dst.UnsafeAddr() - h := 17 * addr - seen := visited[h] - typ := dst.Type() - for p := seen; p != nil; p = p.next { - if p.ptr == addr && p.typ == typ { - return nil - } - } - // Remember, remember... - visited[h] = &visit{addr, typ, seen} - } - return // TODO refactor -} diff --git a/vendor/github.com/lib/pq/.gitignore b/vendor/github.com/lib/pq/.gitignore index 0f1d00e119..3243952a4d 100644 --- a/vendor/github.com/lib/pq/.gitignore +++ b/vendor/github.com/lib/pq/.gitignore @@ -2,3 +2,5 @@ *.test *~ *.swp +.idea +.vscode \ No newline at end of file diff --git a/vendor/github.com/lib/pq/.travis.yml b/vendor/github.com/lib/pq/.travis.yml index 3498c53dcd..f378207f20 100644 --- a/vendor/github.com/lib/pq/.travis.yml +++ b/vendor/github.com/lib/pq/.travis.yml @@ -1,8 +1,8 @@ language: go go: - - 1.13.x - 1.14.x + - 1.15.x - master sudo: true @@ -13,6 +13,7 @@ env: - PQGOSSLTESTS=1 - PQSSLCERTTEST_PATH=$PWD/certs - PGHOST=127.0.0.1 + - GODEBUG=x509ignoreCN=0 matrix: - PGVERSION=10 - PGVERSION=9.6 diff --git a/vendor/github.com/lib/pq/array.go b/vendor/github.com/lib/pq/array.go index e4933e2276..405da23683 100644 --- a/vendor/github.com/lib/pq/array.go +++ b/vendor/github.com/lib/pq/array.go @@ -35,19 +35,31 @@ func Array(a interface{}) interface { return (*BoolArray)(&a) case []float64: return (*Float64Array)(&a) + case []float32: + return (*Float32Array)(&a) case []int64: return (*Int64Array)(&a) + case []int32: + return (*Int32Array)(&a) case []string: return (*StringArray)(&a) + case [][]byte: + return (*ByteaArray)(&a) case *[]bool: return (*BoolArray)(a) case *[]float64: return (*Float64Array)(a) + case *[]float32: + return (*Float32Array)(a) case *[]int64: return (*Int64Array)(a) + case *[]int32: + return (*Int32Array)(a) case *[]string: return (*StringArray)(a) + case *[][]byte: + return (*ByteaArray)(a) } return GenericArray{a} @@ -267,6 +279,70 @@ func (a Float64Array) Value() (driver.Value, error) { return "{}", nil } +// Float32Array represents a one-dimensional array of the PostgreSQL double +// precision type. +type Float32Array []float32 + +// Scan implements the sql.Scanner interface. +func (a *Float32Array) Scan(src interface{}) error { + switch src := src.(type) { + case []byte: + return a.scanBytes(src) + case string: + return a.scanBytes([]byte(src)) + case nil: + *a = nil + return nil + } + + return fmt.Errorf("pq: cannot convert %T to Float32Array", src) +} + +func (a *Float32Array) scanBytes(src []byte) error { + elems, err := scanLinearArray(src, []byte{','}, "Float32Array") + if err != nil { + return err + } + if *a != nil && len(elems) == 0 { + *a = (*a)[:0] + } else { + b := make(Float32Array, len(elems)) + for i, v := range elems { + var x float64 + if x, err = strconv.ParseFloat(string(v), 32); err != nil { + return fmt.Errorf("pq: parsing array element index %d: %v", i, err) + } + b[i] = float32(x) + } + *a = b + } + return nil +} + +// Value implements the driver.Valuer interface. +func (a Float32Array) Value() (driver.Value, error) { + if a == nil { + return nil, nil + } + + if n := len(a); n > 0 { + // There will be at least two curly brackets, N bytes of values, + // and N-1 bytes of delimiters. + b := make([]byte, 1, 1+2*n) + b[0] = '{' + + b = strconv.AppendFloat(b, float64(a[0]), 'f', -1, 32) + for i := 1; i < n; i++ { + b = append(b, ',') + b = strconv.AppendFloat(b, float64(a[i]), 'f', -1, 32) + } + + return string(append(b, '}')), nil + } + + return "{}", nil +} + // GenericArray implements the driver.Valuer and sql.Scanner interfaces for // an array or slice of any dimension. type GenericArray struct{ A interface{} } @@ -483,6 +559,69 @@ func (a Int64Array) Value() (driver.Value, error) { return "{}", nil } +// Int32Array represents a one-dimensional array of the PostgreSQL integer types. +type Int32Array []int32 + +// Scan implements the sql.Scanner interface. +func (a *Int32Array) Scan(src interface{}) error { + switch src := src.(type) { + case []byte: + return a.scanBytes(src) + case string: + return a.scanBytes([]byte(src)) + case nil: + *a = nil + return nil + } + + return fmt.Errorf("pq: cannot convert %T to Int32Array", src) +} + +func (a *Int32Array) scanBytes(src []byte) error { + elems, err := scanLinearArray(src, []byte{','}, "Int32Array") + if err != nil { + return err + } + if *a != nil && len(elems) == 0 { + *a = (*a)[:0] + } else { + b := make(Int32Array, len(elems)) + for i, v := range elems { + var x int + if x, err = strconv.Atoi(string(v)); err != nil { + return fmt.Errorf("pq: parsing array element index %d: %v", i, err) + } + b[i] = int32(x) + } + *a = b + } + return nil +} + +// Value implements the driver.Valuer interface. +func (a Int32Array) Value() (driver.Value, error) { + if a == nil { + return nil, nil + } + + if n := len(a); n > 0 { + // There will be at least two curly brackets, N bytes of values, + // and N-1 bytes of delimiters. + b := make([]byte, 1, 1+2*n) + b[0] = '{' + + b = strconv.AppendInt(b, int64(a[0]), 10) + for i := 1; i < n; i++ { + b = append(b, ',') + b = strconv.AppendInt(b, int64(a[i]), 10) + } + + return string(append(b, '}')), nil + } + + return "{}", nil +} + // StringArray represents a one-dimensional array of the PostgreSQL character types. type StringArray []string diff --git a/vendor/github.com/lib/pq/conn.go b/vendor/github.com/lib/pq/conn.go index f313c14986..db0b6cef5e 100644 --- a/vendor/github.com/lib/pq/conn.go +++ b/vendor/github.com/lib/pq/conn.go @@ -18,6 +18,7 @@ import ( "path/filepath" "strconv" "strings" + "sync/atomic" "time" "unicode" @@ -38,13 +39,18 @@ var ( errNoLastInsertID = errors.New("no LastInsertId available after the empty statement") ) +// Compile time validation that our types implement the expected interfaces +var ( + _ driver.Driver = Driver{} +) + // Driver is the Postgres database driver. type Driver struct{} // Open opens a new connection to the database. name is a connection string. // Most users should only use it through database/sql package from the standard // library. -func (d *Driver) Open(name string) (driver.Conn, error) { +func (d Driver) Open(name string) (driver.Conn, error) { return Open(name) } @@ -136,7 +142,7 @@ type conn struct { // If true, this connection is bad and all public-facing functions should // return ErrBadConn. - bad bool + bad *atomic.Value // If set, this connection should never use the binary format when // receiving query results from prepared statements. Only provided for @@ -294,9 +300,12 @@ func (c *Connector) open(ctx context.Context) (cn *conn, err error) { o := c.opts + bad := &atomic.Value{} + bad.Store(false) cn = &conn{ opts: o, dialer: c.dialer, + bad: bad, } err = cn.handleDriverSettings(o) if err != nil { @@ -501,9 +510,22 @@ func (cn *conn) isInTransaction() bool { cn.txnStatus == txnStatusInFailedTransaction } +func (cn *conn) setBad() { + if cn.bad != nil { + cn.bad.Store(true) + } +} + +func (cn *conn) getBad() bool { + if cn.bad != nil { + return cn.bad.Load().(bool) + } + return false +} + func (cn *conn) checkIsInTransaction(intxn bool) { if cn.isInTransaction() != intxn { - cn.bad = true + cn.setBad() errorf("unexpected transaction status %v", cn.txnStatus) } } @@ -513,7 +535,7 @@ func (cn *conn) Begin() (_ driver.Tx, err error) { } func (cn *conn) begin(mode string) (_ driver.Tx, err error) { - if cn.bad { + if cn.getBad() { return nil, driver.ErrBadConn } defer cn.errRecover(&err) @@ -524,11 +546,11 @@ func (cn *conn) begin(mode string) (_ driver.Tx, err error) { return nil, err } if commandTag != "BEGIN" { - cn.bad = true + cn.setBad() return nil, fmt.Errorf("unexpected command tag %s", commandTag) } if cn.txnStatus != txnStatusIdleInTransaction { - cn.bad = true + cn.setBad() return nil, fmt.Errorf("unexpected transaction status %v", cn.txnStatus) } return cn, nil @@ -542,7 +564,7 @@ func (cn *conn) closeTxn() { func (cn *conn) Commit() (err error) { defer cn.closeTxn() - if cn.bad { + if cn.getBad() { return driver.ErrBadConn } defer cn.errRecover(&err) @@ -564,12 +586,12 @@ func (cn *conn) Commit() (err error) { _, commandTag, err := cn.simpleExec("COMMIT") if err != nil { if cn.isInTransaction() { - cn.bad = true + cn.setBad() } return err } if commandTag != "COMMIT" { - cn.bad = true + cn.setBad() return fmt.Errorf("unexpected command tag %s", commandTag) } cn.checkIsInTransaction(false) @@ -578,7 +600,7 @@ func (cn *conn) Commit() (err error) { func (cn *conn) Rollback() (err error) { defer cn.closeTxn() - if cn.bad { + if cn.getBad() { return driver.ErrBadConn } defer cn.errRecover(&err) @@ -590,7 +612,7 @@ func (cn *conn) rollback() (err error) { _, commandTag, err := cn.simpleExec("ROLLBACK") if err != nil { if cn.isInTransaction() { - cn.bad = true + cn.setBad() } return err } @@ -630,7 +652,7 @@ func (cn *conn) simpleExec(q string) (res driver.Result, commandTag string, err case 'T', 'D': // ignore any results default: - cn.bad = true + cn.setBad() errorf("unknown response for simple query: %q", t) } } @@ -652,7 +674,7 @@ func (cn *conn) simpleQuery(q string) (res *rows, err error) { // the user can close, though, to avoid connections from being // leaked. A "rows" with done=true works fine for that purpose. if err != nil { - cn.bad = true + cn.setBad() errorf("unexpected message %q in simple query execution", t) } if res == nil { @@ -663,8 +685,11 @@ func (cn *conn) simpleQuery(q string) (res *rows, err error) { // Set the result and tag to the last command complete if there wasn't a // query already run. Although queries usually return from here and cede // control to Next, a query with zero results does not. - if t == 'C' && res.colNames == nil { + if t == 'C' { res.result, res.tag = cn.parseComplete(r.string()) + if res.colNames != nil { + return + } } res.done = true case 'Z': @@ -676,7 +701,7 @@ func (cn *conn) simpleQuery(q string) (res *rows, err error) { err = parseError(r) case 'D': if res == nil { - cn.bad = true + cn.setBad() errorf("unexpected DataRow in simple query execution") } // the query didn't fail; kick off to Next @@ -691,7 +716,7 @@ func (cn *conn) simpleQuery(q string) (res *rows, err error) { // To work around a bug in QueryRow in Go 1.2 and earlier, wait // until the first DataRow has been received. default: - cn.bad = true + cn.setBad() errorf("unknown response for simple query: %q", t) } } @@ -784,7 +809,7 @@ func (cn *conn) prepareTo(q, stmtName string) *stmt { } func (cn *conn) Prepare(q string) (_ driver.Stmt, err error) { - if cn.bad { + if cn.getBad() { return nil, driver.ErrBadConn } defer cn.errRecover(&err) @@ -823,7 +848,7 @@ func (cn *conn) Query(query string, args []driver.Value) (driver.Rows, error) { } func (cn *conn) query(query string, args []driver.Value) (_ *rows, err error) { - if cn.bad { + if cn.getBad() { return nil, driver.ErrBadConn } if cn.inCopy { @@ -857,7 +882,7 @@ func (cn *conn) query(query string, args []driver.Value) (_ *rows, err error) { // Implement the optional "Execer" interface for one-shot queries func (cn *conn) Exec(query string, args []driver.Value) (res driver.Result, err error) { - if cn.bad { + if cn.getBad() { return nil, driver.ErrBadConn } defer cn.errRecover(&err) @@ -891,9 +916,20 @@ func (cn *conn) Exec(query string, args []driver.Value) (res driver.Result, err return r, err } +type safeRetryError struct { + Err error +} + +func (se *safeRetryError) Error() string { + return se.Err.Error() +} + func (cn *conn) send(m *writeBuf) { - _, err := cn.c.Write(m.wrap()) + n, err := cn.c.Write(m.wrap()) if err != nil { + if n == 0 { + err = &safeRetryError{Err: err} + } panic(err) } } @@ -918,7 +954,7 @@ func (cn *conn) sendSimpleMessage(typ byte) (err error) { // the message yourself. func (cn *conn) saveMessage(typ byte, buf *readBuf) { if cn.saveMessageType != 0 { - cn.bad = true + cn.setBad() errorf("unexpected saveMessageType %d", cn.saveMessageType) } cn.saveMessageType = typ @@ -1288,7 +1324,7 @@ func (st *stmt) Close() (err error) { if st.closed { return nil } - if st.cn.bad { + if st.cn.getBad() { return driver.ErrBadConn } defer st.cn.errRecover(&err) @@ -1302,14 +1338,14 @@ func (st *stmt) Close() (err error) { t, _ := st.cn.recv1() if t != '3' { - st.cn.bad = true + st.cn.setBad() errorf("unexpected close response: %q", t) } st.closed = true t, r := st.cn.recv1() if t != 'Z' { - st.cn.bad = true + st.cn.setBad() errorf("expected ready for query, but got: %q", t) } st.cn.processReadyForQuery(r) @@ -1318,7 +1354,7 @@ func (st *stmt) Close() (err error) { } func (st *stmt) Query(v []driver.Value) (r driver.Rows, err error) { - if st.cn.bad { + if st.cn.getBad() { return nil, driver.ErrBadConn } defer st.cn.errRecover(&err) @@ -1331,7 +1367,7 @@ func (st *stmt) Query(v []driver.Value) (r driver.Rows, err error) { } func (st *stmt) Exec(v []driver.Value) (res driver.Result, err error) { - if st.cn.bad { + if st.cn.getBad() { return nil, driver.ErrBadConn } defer st.cn.errRecover(&err) @@ -1418,7 +1454,7 @@ func (cn *conn) parseComplete(commandTag string) (driver.Result, string) { if affectedRows == nil && strings.HasPrefix(commandTag, "INSERT ") { parts := strings.Split(commandTag, " ") if len(parts) != 3 { - cn.bad = true + cn.setBad() errorf("unexpected INSERT command tag %s", commandTag) } affectedRows = &parts[len(parts)-1] @@ -1430,7 +1466,7 @@ func (cn *conn) parseComplete(commandTag string) (driver.Result, string) { } n, err := strconv.ParseInt(*affectedRows, 10, 64) if err != nil { - cn.bad = true + cn.setBad() errorf("could not parse commandTag: %s", err) } return driver.RowsAffected(n), commandTag @@ -1497,7 +1533,7 @@ func (rs *rows) Next(dest []driver.Value) (err error) { } conn := rs.cn - if conn.bad { + if conn.getBad() { return driver.ErrBadConn } defer conn.errRecover(&err) @@ -1522,7 +1558,7 @@ func (rs *rows) Next(dest []driver.Value) (err error) { case 'D': n := rs.rb.int16() if err != nil { - conn.bad = true + conn.setBad() errorf("unexpected DataRow after error %s", err) } if n < len(dest) { @@ -1717,7 +1753,7 @@ func (cn *conn) readReadyForQuery() { cn.processReadyForQuery(r) return default: - cn.bad = true + cn.setBad() errorf("unexpected message %q; expected ReadyForQuery", t) } } @@ -1737,7 +1773,7 @@ func (cn *conn) readParseResponse() { cn.readReadyForQuery() panic(err) default: - cn.bad = true + cn.setBad() errorf("unexpected Parse response %q", t) } } @@ -1762,7 +1798,7 @@ func (cn *conn) readStatementDescribeResponse() (paramTyps []oid.Oid, colNames [ cn.readReadyForQuery() panic(err) default: - cn.bad = true + cn.setBad() errorf("unexpected Describe statement response %q", t) } } @@ -1780,7 +1816,7 @@ func (cn *conn) readPortalDescribeResponse() rowsHeader { cn.readReadyForQuery() panic(err) default: - cn.bad = true + cn.setBad() errorf("unexpected Describe response %q", t) } panic("not reached") @@ -1796,7 +1832,7 @@ func (cn *conn) readBindResponse() { cn.readReadyForQuery() panic(err) default: - cn.bad = true + cn.setBad() errorf("unexpected Bind response %q", t) } } @@ -1823,7 +1859,7 @@ func (cn *conn) postExecuteWorkaround() { cn.saveMessage(t, r) return default: - cn.bad = true + cn.setBad() errorf("unexpected message during extended query execution: %q", t) } } @@ -1836,7 +1872,7 @@ func (cn *conn) readExecuteResponse(protocolState string) (res driver.Result, co switch t { case 'C': if err != nil { - cn.bad = true + cn.setBad() errorf("unexpected CommandComplete after error %s", err) } res, commandTag = cn.parseComplete(r.string()) @@ -1850,7 +1886,7 @@ func (cn *conn) readExecuteResponse(protocolState string) (res driver.Result, co err = parseError(r) case 'T', 'D', 'I': if err != nil { - cn.bad = true + cn.setBad() errorf("unexpected %q after error %s", t, err) } if t == 'I' { @@ -1858,7 +1894,7 @@ func (cn *conn) readExecuteResponse(protocolState string) (res driver.Result, co } // ignore any results default: - cn.bad = true + cn.setBad() errorf("unknown %s response: %q", protocolState, t) } } diff --git a/vendor/github.com/lib/pq/conn_go18.go b/vendor/github.com/lib/pq/conn_go18.go index 09e2ea4648..8cab67c9d2 100644 --- a/vendor/github.com/lib/pq/conn_go18.go +++ b/vendor/github.com/lib/pq/conn_go18.go @@ -7,6 +7,7 @@ import ( "fmt" "io" "io/ioutil" + "sync/atomic" "time" ) @@ -89,10 +90,21 @@ func (cn *conn) Ping(ctx context.Context) error { func (cn *conn) watchCancel(ctx context.Context) func() { if done := ctx.Done(); done != nil { - finished := make(chan struct{}) + finished := make(chan struct{}, 1) go func() { select { case <-done: + select { + case finished <- struct{}{}: + default: + // We raced with the finish func, let the next query handle this with the + // context. + return + } + + // Set the connection state to bad so it does not get reused. + cn.setBad() + // At this point the function level context is canceled, // so it must not be used for the additional network // request to cancel the query. @@ -101,13 +113,14 @@ func (cn *conn) watchCancel(ctx context.Context) func() { defer cancel() _ = cn.cancel(ctxCancel) - finished <- struct{}{} case <-finished: } }() return func() { select { case <-finished: + cn.setBad() + cn.Close() case finished <- struct{}{}: } } @@ -123,8 +136,11 @@ func (cn *conn) cancel(ctx context.Context) error { defer c.Close() { + bad := &atomic.Value{} + bad.Store(false) can := conn{ - c: c, + c: c, + bad: bad, } err = can.ssl(cn.opts) if err != nil { diff --git a/vendor/github.com/lib/pq/copy.go b/vendor/github.com/lib/pq/copy.go index 38d5bb693f..bb3cbd7b99 100644 --- a/vendor/github.com/lib/pq/copy.go +++ b/vendor/github.com/lib/pq/copy.go @@ -176,13 +176,13 @@ func (ci *copyin) resploop() { func (ci *copyin) setBad() { ci.Lock() - ci.cn.bad = true + ci.cn.setBad() ci.Unlock() } func (ci *copyin) isBad() bool { ci.Lock() - b := ci.cn.bad + b := ci.cn.getBad() ci.Unlock() return b } @@ -213,10 +213,10 @@ func (ci *copyin) setResult(result driver.Result) { func (ci *copyin) getResult() driver.Result { ci.Lock() result := ci.Result + ci.Unlock() if result == nil { return driver.RowsAffected(0) } - ci.Unlock() return result } diff --git a/vendor/github.com/lib/pq/error.go b/vendor/github.com/lib/pq/error.go index 3d66ba7c52..c19c349f13 100644 --- a/vendor/github.com/lib/pq/error.go +++ b/vendor/github.com/lib/pq/error.go @@ -484,7 +484,7 @@ func (cn *conn) errRecover(err *error) { case nil: // Do nothing case runtime.Error: - cn.bad = true + cn.setBad() panic(v) case *Error: if v.Fatal() { @@ -493,8 +493,11 @@ func (cn *conn) errRecover(err *error) { *err = v } case *net.OpError: - cn.bad = true + cn.setBad() *err = v + case *safeRetryError: + cn.setBad() + *err = driver.ErrBadConn case error: if v == io.EOF || v.(error).Error() == "remote error: handshake failure" { *err = driver.ErrBadConn @@ -503,13 +506,13 @@ func (cn *conn) errRecover(err *error) { } default: - cn.bad = true + cn.setBad() panic(fmt.Sprintf("unknown error: %#v", e)) } // Any time we return ErrBadConn, we need to remember it since *Tx doesn't // mark the connection bad in database/sql. if *err == driver.ErrBadConn { - cn.bad = true + cn.setBad() } } diff --git a/vendor/github.com/mikefarah/yq/v3/Dockerfile b/vendor/github.com/mikefarah/yq/v3/Dockerfile index e2ceac7578..1858eea9e8 100644 --- a/vendor/github.com/mikefarah/yq/v3/Dockerfile +++ b/vendor/github.com/mikefarah/yq/v3/Dockerfile @@ -1,23 +1,23 @@ -FROM golang:1.15 as builder - -WORKDIR /go/src/mikefarah/yq - -# cache devtools -COPY ./scripts/devtools.sh /go/src/mikefarah/yq/scripts/devtools.sh -RUN ./scripts/devtools.sh - -COPY . /go/src/mikefarah/yq - -RUN CGO_ENABLED=0 make local build - -# Choose alpine as a base image to make this useful for CI, as many -# CI tools expect an interactive shell inside the container -FROM alpine:3.12 as production - -COPY --from=builder /go/src/mikefarah/yq/yq /usr/bin/yq -RUN chmod +x /usr/bin/yq - -ARG VERSION=none -LABEL version=${VERSION} - -WORKDIR /workdir +FROM golang:1.15 as builder + +WORKDIR /go/src/mikefarah/yq + +# cache devtools +COPY ./scripts/devtools.sh /go/src/mikefarah/yq/scripts/devtools.sh +RUN ./scripts/devtools.sh + +COPY . /go/src/mikefarah/yq + +RUN CGO_ENABLED=0 make local build + +# Choose alpine as a base image to make this useful for CI, as many +# CI tools expect an interactive shell inside the container +FROM alpine:3.12 as production + +COPY --from=builder /go/src/mikefarah/yq/yq /usr/bin/yq +RUN chmod +x /usr/bin/yq + +ARG VERSION=none +LABEL version=${VERSION} + +WORKDIR /workdir diff --git a/vendor/github.com/mikefarah/yq/v3/README.md b/vendor/github.com/mikefarah/yq/v3/README.md index 09a88c0c5e..87e97d7881 100644 --- a/vendor/github.com/mikefarah/yq/v3/README.md +++ b/vendor/github.com/mikefarah/yq/v3/README.md @@ -45,11 +45,11 @@ rm /etc/myfile.tmp Use wget to download the pre-compiled binaries: ```bash -wget https://github.com/mikefarah/yq/releases/download/{VERSION}/{BINARY} -O /usr/bin/yq &&\ +wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY} -O /usr/bin/yq &&\ chmod +x /usr/bin/yq ``` -For instance, VERSION=3.4.0 and BINARY=yq_linux_amd64 +For instance, VERSION=3.4.1 and BINARY=yq_linux_amd64 ### Run with Docker @@ -171,11 +171,12 @@ Use "yq [command] --help" for more information about a command. If you've been using v2 and want/need to upgrade, checkout the [upgrade guide](https://mikefarah.gitbook.io/yq/upgrading-from-v2). ## V4 is in development! -Beta will soon be released for community feedback! -V4 will be quite different from V3 (sorry for the migration), however it will be much more similar to ```jq```, use a similar expression syntax and therefore support much more complex functionality! +If you're keen - check out the alpha release [here](https://github.com/mikefarah/yq/releases/), or in docker `mikefarah/yq:4-beta1` and the docs (also in beta) [here](https://mikefarah.gitbook.io/yq/v/v4.x-alpha/). + +V4 is quite different from V3 (sorry for the migration), however it will be much more similar to ```jq```, use a similar expression syntax and therefore support much more complex functionality! For now - new features will be held off from V3 in anticipation of the V4 build. Critical fixes / issues will still be released. ## Known Issues / Missing Features - `yq` attempts to preserve comment positions and whitespace as much as possible, but it does not handle all scenarios (see https://github.com/go-yaml/yaml/tree/v3 for details) -- You cannot (yet) select multiple paths/keys from the yaml to be printed out (https://github.com/mikefarah/yq/issues/287) +- You cannot (yet) select multiple paths/keys from the yaml to be printed out (https://github.com/mikefarah/yq/issues/287) (although you can in v4!) diff --git a/vendor/github.com/mikefarah/yq/v3/go.mod b/vendor/github.com/mikefarah/yq/v3/go.mod index 9253a567c6..b2d77dc9fc 100644 --- a/vendor/github.com/mikefarah/yq/v3/go.mod +++ b/vendor/github.com/mikefarah/yq/v3/go.mod @@ -8,7 +8,6 @@ require ( github.com/pkg/errors v0.9.1 github.com/spf13/cobra v1.0.0 github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 diff --git a/vendor/github.com/mikefarah/yq/v3/go.sum b/vendor/github.com/mikefarah/yq/v3/go.sum index 7672e2c14f..807e86400f 100644 --- a/vendor/github.com/mikefarah/yq/v3/go.sum +++ b/vendor/github.com/mikefarah/yq/v3/go.sum @@ -143,9 +143,8 @@ golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f h1:Fqb3ao1hUmOR3GkUOg/Y+BadLwykBIzs5q8Ez2SbHyc= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/vendor/github.com/nxadm/tail/.gitignore b/vendor/github.com/nxadm/tail/.gitignore new file mode 100644 index 0000000000..fa81aa93a0 --- /dev/null +++ b/vendor/github.com/nxadm/tail/.gitignore @@ -0,0 +1,2 @@ +.idea/ +.test/ \ No newline at end of file diff --git a/vendor/github.com/hpcloud/tail/.travis.yml b/vendor/github.com/nxadm/tail/.travis.yml similarity index 52% rename from vendor/github.com/hpcloud/tail/.travis.yml rename to vendor/github.com/nxadm/tail/.travis.yml index 9cf8bb7fc5..95dd3bd782 100644 --- a/vendor/github.com/hpcloud/tail/.travis.yml +++ b/vendor/github.com/nxadm/tail/.travis.yml @@ -4,15 +4,13 @@ script: - go test -race -v ./... go: - - 1.4 - - 1.5 - - 1.6 + - "1.9" + - "1.10" + - "1.11" + - "1.12" + - "1.13" - tip matrix: allow_failures: - go: tip - -install: - - go get gopkg.in/fsnotify.v1 - - go get gopkg.in/tomb.v1 diff --git a/vendor/github.com/nxadm/tail/CHANGES.md b/vendor/github.com/nxadm/tail/CHANGES.md new file mode 100644 index 0000000000..ef1b5fbedb --- /dev/null +++ b/vendor/github.com/nxadm/tail/CHANGES.md @@ -0,0 +1,46 @@ +# Version v1.4.4 + +* Fix of checksum problem because of forced tag. No changes to the code. + +# Version v1.4.1 + +* Incorporated PR 162 by by Mohammed902: "Simplify non-Windows build tag". + +# Version v1.4.0 + +* Incorporated PR 9 by mschneider82: "Added seekinfo to Tail". + +# Version v1.3.1 + +* Incorporated PR 7: "Fix deadlock when stopping on non-empty file/buffer", +fixes upstream issue 93. + + +# Version v1.3.0 + +* Incorporated changes of unmerged upstream PR 149 by mezzi: "added line num +to Line struct". + +# Version v1.2.1 + +* Incorporated changes of unmerged upstream PR 128 by jadekler: "Compile-able +code in readme". +* Incorporated changes of unmerged upstream PR 130 by fgeller: "small change +to comment wording". +* Incorporated changes of unmerged upstream PR 133 by sm3142: "removed +spurious newlines from log messages". + +# Version v1.2.0 + +* Incorporated changes of unmerged upstream PR 126 by Code-Hex: "Solved the + problem for never return the last line if it's not followed by a newline". +* Incorporated changes of unmerged upstream PR 131 by StoicPerlman: "Remove +deprecated os.SEEK consts". The changes bumped the minimal supported Go +release to 1.9. + +# Version v1.1.0 + +* migration to go modules. +* release of master branch of the dormant upstream, because it contains +fixes and improvement no present in the tagged release. + diff --git a/vendor/github.com/nxadm/tail/Dockerfile b/vendor/github.com/nxadm/tail/Dockerfile new file mode 100644 index 0000000000..d9633891c0 --- /dev/null +++ b/vendor/github.com/nxadm/tail/Dockerfile @@ -0,0 +1,19 @@ +FROM golang + +RUN mkdir -p $GOPATH/src/github.com/nxadm/tail/ +ADD . $GOPATH/src/github.com/nxadm/tail/ + +# expecting to fetch dependencies successfully. +RUN go get -v github.com/nxadm/tail + +# expecting to run the test successfully. +RUN go test -v github.com/nxadm/tail + +# expecting to install successfully +RUN go install -v github.com/nxadm/tail +RUN go install -v github.com/nxadm/tail/cmd/gotail + +RUN $GOPATH/bin/gotail -h || true + +ENV PATH $GOPATH/bin:$PATH +CMD ["gotail"] diff --git a/vendor/github.com/hpcloud/tail/LICENSE.txt b/vendor/github.com/nxadm/tail/LICENSE similarity index 100% rename from vendor/github.com/hpcloud/tail/LICENSE.txt rename to vendor/github.com/nxadm/tail/LICENSE diff --git a/vendor/github.com/nxadm/tail/README.md b/vendor/github.com/nxadm/tail/README.md new file mode 100644 index 0000000000..dbb6c17274 --- /dev/null +++ b/vendor/github.com/nxadm/tail/README.md @@ -0,0 +1,36 @@ +[![Build Status](https://travis-ci.org/nxadm/tail.svg?branch=master)](https://travis-ci.org/nxadm/tail) + +This is repo is forked from the dormant upstream repo at +[hpcloud](https://github.com/hpcloud/tail). This fork adds support for go +modules, updates the dependencies, adds features and fixes bugs. Go 1.9 is +the oldest compiler release supported. + +# Go package for tail-ing files + +A Go package striving to emulate the features of the BSD `tail` program. + +```Go +t, err := tail.TailFile("/var/log/nginx.log", tail.Config{Follow: true}) +if err != nil { + panic(err) +} + +for line := range t.Lines { + fmt.Println(line.Text) +} +``` + +See [API documentation](http://godoc.org/github.com/nxadm/tail). + +## Log rotation + +Tail comes with full support for truncation/move detection as it is +designed to work with log rotation tools. + +## Installing + + go get github.com/nxadm/tail/... + +## Windows support + +This package [needs assistance](https://github.com/nxadm/tail/labels/Windows) for full Windows support. diff --git a/vendor/github.com/hpcloud/tail/appveyor.yml b/vendor/github.com/nxadm/tail/appveyor.yml similarity index 77% rename from vendor/github.com/hpcloud/tail/appveyor.yml rename to vendor/github.com/nxadm/tail/appveyor.yml index d370055b6f..e149bc62dd 100644 --- a/vendor/github.com/hpcloud/tail/appveyor.yml +++ b/vendor/github.com/nxadm/tail/appveyor.yml @@ -5,7 +5,7 @@ build_script: - SET GOPATH=c:\workspace - go test -v -race ./... test: off -clone_folder: c:\workspace\src\github.com\hpcloud\tail +clone_folder: c:\workspace\src\github.com\nxadm\tail branches: only: - master diff --git a/vendor/github.com/nxadm/tail/go.mod b/vendor/github.com/nxadm/tail/go.mod new file mode 100644 index 0000000000..fb10d42af0 --- /dev/null +++ b/vendor/github.com/nxadm/tail/go.mod @@ -0,0 +1,9 @@ +module github.com/nxadm/tail + +go 1.13 + +require ( + github.com/fsnotify/fsnotify v1.4.7 + golang.org/x/sys v0.0.0-20190904154756-749cb33beabd // indirect + gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 +) diff --git a/vendor/github.com/nxadm/tail/go.sum b/vendor/github.com/nxadm/tail/go.sum new file mode 100644 index 0000000000..b391f1904d --- /dev/null +++ b/vendor/github.com/nxadm/tail/go.sum @@ -0,0 +1,6 @@ +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd h1:DBH9mDw0zluJT/R+nGuV3jWFWLFaHyYZWD4tOT+cjn0= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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= diff --git a/vendor/github.com/hpcloud/tail/ratelimiter/Licence b/vendor/github.com/nxadm/tail/ratelimiter/Licence similarity index 100% rename from vendor/github.com/hpcloud/tail/ratelimiter/Licence rename to vendor/github.com/nxadm/tail/ratelimiter/Licence diff --git a/vendor/github.com/hpcloud/tail/ratelimiter/leakybucket.go b/vendor/github.com/nxadm/tail/ratelimiter/leakybucket.go similarity index 100% rename from vendor/github.com/hpcloud/tail/ratelimiter/leakybucket.go rename to vendor/github.com/nxadm/tail/ratelimiter/leakybucket.go diff --git a/vendor/github.com/hpcloud/tail/ratelimiter/memory.go b/vendor/github.com/nxadm/tail/ratelimiter/memory.go similarity index 81% rename from vendor/github.com/hpcloud/tail/ratelimiter/memory.go rename to vendor/github.com/nxadm/tail/ratelimiter/memory.go index 8f6a5784a9..bf3c2131b1 100644 --- a/vendor/github.com/hpcloud/tail/ratelimiter/memory.go +++ b/vendor/github.com/nxadm/tail/ratelimiter/memory.go @@ -5,7 +5,10 @@ import ( "time" ) -const GC_SIZE int = 100 +const ( + GC_SIZE int = 100 + GC_PERIOD time.Duration = 60 * time.Second +) type Memory struct { store map[string]LeakyBucket @@ -44,11 +47,10 @@ func (m *Memory) GarbageCollect() { now := time.Now() // rate limit GC to once per minute - if now.Add(60*time.Second).Unix() > m.lastGCCollected.Unix() { - + if now.Unix() >= m.lastGCCollected.Add(GC_PERIOD).Unix() { for key, bucket := range m.store { // if the bucket is drained, then GC - if bucket.DrainedAt().Unix() > now.Unix() { + if bucket.DrainedAt().Unix() < now.Unix() { delete(m.store, key) } } diff --git a/vendor/github.com/hpcloud/tail/ratelimiter/storage.go b/vendor/github.com/nxadm/tail/ratelimiter/storage.go similarity index 100% rename from vendor/github.com/hpcloud/tail/ratelimiter/storage.go rename to vendor/github.com/nxadm/tail/ratelimiter/storage.go diff --git a/vendor/github.com/hpcloud/tail/tail.go b/vendor/github.com/nxadm/tail/tail.go similarity index 85% rename from vendor/github.com/hpcloud/tail/tail.go rename to vendor/github.com/nxadm/tail/tail.go index 2d252d6057..58d3c4b95f 100644 --- a/vendor/github.com/hpcloud/tail/tail.go +++ b/vendor/github.com/nxadm/tail/tail.go @@ -15,31 +15,33 @@ import ( "sync" "time" - "github.com/hpcloud/tail/ratelimiter" - "github.com/hpcloud/tail/util" - "github.com/hpcloud/tail/watch" + "github.com/nxadm/tail/ratelimiter" + "github.com/nxadm/tail/util" + "github.com/nxadm/tail/watch" "gopkg.in/tomb.v1" ) var ( - ErrStop = fmt.Errorf("tail should now stop") + ErrStop = errors.New("tail should now stop") ) type Line struct { - Text string - Time time.Time - Err error // Error from tail + Text string + Num int + SeekInfo SeekInfo + Time time.Time + Err error // Error from tail } // NewLine returns a Line with present time. -func NewLine(text string) *Line { - return &Line{text, time.Now(), nil} +func NewLine(text string, lineNum int) *Line { + return &Line{text, lineNum, SeekInfo{}, time.Now(), nil} } -// SeekInfo represents arguments to `os.Seek` +// SeekInfo represents arguments to `io.Seek` type SeekInfo struct { Offset int64 - Whence int // os.SEEK_* + Whence int // io.Seek* } type logger interface { @@ -78,8 +80,9 @@ type Tail struct { Lines chan *Line Config - file *os.File - reader *bufio.Reader + file *os.File + reader *bufio.Reader + lineNum int watcher watch.FileWatcher changes *watch.FileChanges @@ -113,7 +116,7 @@ func TailFile(filename string, config Config) (*Tail, error) { // when Logger was not specified in config, use default logger if t.Logger == nil { - t.Logger = log.New(os.Stderr, "", log.LstdFlags) + t.Logger = DefaultLogger } if t.Poll { @@ -135,15 +138,15 @@ func TailFile(filename string, config Config) (*Tail, error) { return t, nil } -// Return the file's current position, like stdio's ftell(). +// Tell returns the file's current position, like stdio's ftell(). // But this value is not very accurate. -// it may readed one line in the chan(tail.Lines), -// so it may lost one line. +// One line from the chan(tail.Lines) may have been read, +// so it may have lost one line. func (tail *Tail) Tell() (offset int64, err error) { if tail.file == nil { return } - offset, err = tail.file.Seek(0, os.SEEK_CUR) + offset, err = tail.file.Seek(0, io.SeekCurrent) if err != nil { return } @@ -186,6 +189,7 @@ func (tail *Tail) closeFile() { func (tail *Tail) reopen() error { tail.closeFile() + tail.lineNum = 0 for { var err error tail.file, err = OpenFile(tail.Filename) @@ -241,7 +245,6 @@ func (tail *Tail) tailFileSync() { // Seek to requested location on first open of the file. if tail.Location != nil { _, err := tail.file.Seek(tail.Location.Offset, tail.Location.Whence) - tail.Logger.Printf("Seeked %s - %+v\n", tail.Filename, tail.Location) if err != nil { tail.Killf("Seek error on %s: %s", tail.Filename, err) return @@ -250,16 +253,12 @@ func (tail *Tail) tailFileSync() { tail.openReader() - var offset int64 = 0 - var err error - // Read line by line. for { // do not seek in named pipes if !tail.Pipe { // grab the position in case we need to back up in the event of a half-line - offset, err = tail.Tell() - if err != nil { + if _, err := tail.Tell(); err != nil { tail.Kill(err) return } @@ -273,10 +272,9 @@ func (tail *Tail) tailFileSync() { if cooloff { // Wait a second before seeking till the end of // file when rate limit is reached. - msg := fmt.Sprintf( - "Too much log activity; waiting a second " + - "before resuming tailing") - tail.Lines <- &Line{msg, time.Now(), fmt.Errorf(msg)} + msg := ("Too much log activity; waiting a second before resuming tailing") + offset, _ := tail.Tell() + tail.Lines <- &Line{msg, tail.lineNum, SeekInfo{Offset: offset}, time.Now(), errors.New(msg)} select { case <-time.After(time.Second): case <-tail.Dying(): @@ -296,10 +294,8 @@ func (tail *Tail) tailFileSync() { } if tail.Follow && line != "" { - // this has the potential to never return the last line if - // it's not followed by a newline; seems a fair trade here - err := tail.seekTo(SeekInfo{Offset: offset, Whence: 0}) - if err != nil { + tail.sendLine(line) + if err := tail.seekEnd(); err != nil { tail.Kill(err) return } @@ -337,7 +333,7 @@ func (tail *Tail) tailFileSync() { // reopened if ReOpen is true. Truncated files are always reopened. func (tail *Tail) waitForChanges() error { if tail.changes == nil { - pos, err := tail.file.Seek(0, os.SEEK_CUR) + pos, err := tail.file.Seek(0, io.SeekCurrent) if err != nil { return err } @@ -361,10 +357,9 @@ func (tail *Tail) waitForChanges() error { tail.Logger.Printf("Successfully reopened %s", tail.Filename) tail.openReader() return nil - } else { - tail.Logger.Printf("Stopping tail as file no longer exists: %s", tail.Filename) - return ErrStop } + tail.Logger.Printf("Stopping tail as file no longer exists: %s", tail.Filename) + return ErrStop case <-tail.changes.Truncated: // Always reopen truncated files (Follow is true) tail.Logger.Printf("Re-opening truncated file %s ...", tail.Filename) @@ -377,20 +372,21 @@ func (tail *Tail) waitForChanges() error { case <-tail.Dying(): return ErrStop } - panic("unreachable") } func (tail *Tail) openReader() { + tail.lk.Lock() if tail.MaxLineSize > 0 { // add 2 to account for newline characters tail.reader = bufio.NewReaderSize(tail.file, tail.MaxLineSize+2) } else { tail.reader = bufio.NewReader(tail.file) } + tail.lk.Unlock() } func (tail *Tail) seekEnd() error { - return tail.seekTo(SeekInfo{Offset: 0, Whence: os.SEEK_END}) + return tail.seekTo(SeekInfo{Offset: 0, Whence: io.SeekEnd}) } func (tail *Tail) seekTo(pos SeekInfo) error { @@ -415,13 +411,19 @@ func (tail *Tail) sendLine(line string) bool { } for _, line := range lines { - tail.Lines <- &Line{line, now, nil} + tail.lineNum++ + offset, _ := tail.Tell() + select { + case tail.Lines <- &Line{line, tail.lineNum, SeekInfo{Offset: offset}, now, nil}: + case <-tail.Dying(): + return true + } } if tail.Config.RateLimiter != nil { ok := tail.Config.RateLimiter.Pour(uint16(len(lines))) if !ok { - tail.Logger.Printf("Leaky bucket full (%v); entering 1s cooloff period.\n", + tail.Logger.Printf("Leaky bucket full (%v); entering 1s cooloff period.", tail.Filename) return false } diff --git a/vendor/github.com/hpcloud/tail/tail_posix.go b/vendor/github.com/nxadm/tail/tail_posix.go similarity index 71% rename from vendor/github.com/hpcloud/tail/tail_posix.go rename to vendor/github.com/nxadm/tail/tail_posix.go index bc4dc3357a..1b94520ecf 100644 --- a/vendor/github.com/hpcloud/tail/tail_posix.go +++ b/vendor/github.com/nxadm/tail/tail_posix.go @@ -1,4 +1,4 @@ -// +build linux darwin freebsd netbsd openbsd +// +build !windows package tail diff --git a/vendor/github.com/hpcloud/tail/tail_windows.go b/vendor/github.com/nxadm/tail/tail_windows.go similarity index 81% rename from vendor/github.com/hpcloud/tail/tail_windows.go rename to vendor/github.com/nxadm/tail/tail_windows.go index ef2cfca1b7..4aaceea286 100644 --- a/vendor/github.com/hpcloud/tail/tail_windows.go +++ b/vendor/github.com/nxadm/tail/tail_windows.go @@ -3,7 +3,7 @@ package tail import ( - "github.com/hpcloud/tail/winfile" + "github.com/nxadm/tail/winfile" "os" ) diff --git a/vendor/github.com/hpcloud/tail/util/util.go b/vendor/github.com/nxadm/tail/util/util.go similarity index 94% rename from vendor/github.com/hpcloud/tail/util/util.go rename to vendor/github.com/nxadm/tail/util/util.go index 54151fe39f..2ba0ed71c6 100644 --- a/vendor/github.com/hpcloud/tail/util/util.go +++ b/vendor/github.com/nxadm/tail/util/util.go @@ -18,7 +18,7 @@ var LOGGER = &Logger{log.New(os.Stderr, "", log.LstdFlags)} // fatal is like panic except it displays only the current goroutine's stack. func Fatal(format string, v ...interface{}) { - // https://github.com/hpcloud/log/blob/master/log.go#L45 + // https://github.com/nxadm/log/blob/master/log.go#L45 LOGGER.Output(2, fmt.Sprintf("FATAL -- "+format, v...)+"\n"+string(debug.Stack())) os.Exit(1) } diff --git a/vendor/github.com/hpcloud/tail/watch/filechanges.go b/vendor/github.com/nxadm/tail/watch/filechanges.go similarity index 93% rename from vendor/github.com/hpcloud/tail/watch/filechanges.go rename to vendor/github.com/nxadm/tail/watch/filechanges.go index 3ce5dcecbb..f80aead9ad 100644 --- a/vendor/github.com/hpcloud/tail/watch/filechanges.go +++ b/vendor/github.com/nxadm/tail/watch/filechanges.go @@ -8,7 +8,7 @@ type FileChanges struct { func NewFileChanges() *FileChanges { return &FileChanges{ - make(chan bool), make(chan bool), make(chan bool)} + make(chan bool, 1), make(chan bool, 1), make(chan bool, 1)} } func (fc *FileChanges) NotifyModified() { diff --git a/vendor/github.com/hpcloud/tail/watch/inotify.go b/vendor/github.com/nxadm/tail/watch/inotify.go similarity index 88% rename from vendor/github.com/hpcloud/tail/watch/inotify.go rename to vendor/github.com/nxadm/tail/watch/inotify.go index 4478f1e1a0..439921810c 100644 --- a/vendor/github.com/hpcloud/tail/watch/inotify.go +++ b/vendor/github.com/nxadm/tail/watch/inotify.go @@ -8,9 +8,9 @@ import ( "os" "path/filepath" - "github.com/hpcloud/tail/util" + "github.com/nxadm/tail/util" - "gopkg.in/fsnotify.v1" + "github.com/fsnotify/fsnotify" "gopkg.in/tomb.v1" ) @@ -75,7 +75,6 @@ func (fw *InotifyFileWatcher) ChangeEvents(t *tomb.Tomb, pos int64) (*FileChange fw.Size = pos go func() { - defer RemoveWatch(fw.Filename) events := Events(fw.Filename) @@ -88,9 +87,11 @@ func (fw *InotifyFileWatcher) ChangeEvents(t *tomb.Tomb, pos int64) (*FileChange select { case evt, ok = <-events: if !ok { + RemoveWatch(fw.Filename) return } case <-t.Dying(): + RemoveWatch(fw.Filename) return } @@ -99,13 +100,19 @@ func (fw *InotifyFileWatcher) ChangeEvents(t *tomb.Tomb, pos int64) (*FileChange fallthrough case evt.Op&fsnotify.Rename == fsnotify.Rename: + RemoveWatch(fw.Filename) changes.NotifyDeleted() return + //With an open fd, unlink(fd) - inotify returns IN_ATTRIB (==fsnotify.Chmod) + case evt.Op&fsnotify.Chmod == fsnotify.Chmod: + fallthrough + case evt.Op&fsnotify.Write == fsnotify.Write: fi, err := os.Stat(fw.Filename) if err != nil { if os.IsNotExist(err) { + RemoveWatch(fw.Filename) changes.NotifyDeleted() return } diff --git a/vendor/github.com/hpcloud/tail/watch/inotify_tracker.go b/vendor/github.com/nxadm/tail/watch/inotify_tracker.go similarity index 86% rename from vendor/github.com/hpcloud/tail/watch/inotify_tracker.go rename to vendor/github.com/nxadm/tail/watch/inotify_tracker.go index 03be4275ca..a94bcd4cbc 100644 --- a/vendor/github.com/hpcloud/tail/watch/inotify_tracker.go +++ b/vendor/github.com/nxadm/tail/watch/inotify_tracker.go @@ -10,9 +10,9 @@ import ( "sync" "syscall" - "github.com/hpcloud/tail/util" + "github.com/nxadm/tail/util" - "gopkg.in/fsnotify.v1" + "github.com/fsnotify/fsnotify" ) type InotifyTracker struct { @@ -83,21 +83,21 @@ func watch(winfo *watchInfo) error { } // RemoveWatch signals the run goroutine to remove the watch for the input filename -func RemoveWatch(fname string) { - remove(&watchInfo{ +func RemoveWatch(fname string) error { + return remove(&watchInfo{ fname: fname, }) } // RemoveWatch create signals the run goroutine to remove the watch for the input filename -func RemoveWatchCreate(fname string) { - remove(&watchInfo{ +func RemoveWatchCreate(fname string) error { + return remove(&watchInfo{ op: fsnotify.Create, fname: fname, }) } -func remove(winfo *watchInfo) { +func remove(winfo *watchInfo) error { // start running the shared InotifyTracker if not already running once.Do(goRun) @@ -108,27 +108,10 @@ func remove(winfo *watchInfo) { delete(shared.done, winfo.fname) close(done) } - - fname := winfo.fname - if winfo.isCreate() { - // Watch for new files to be created in the parent directory. - fname = filepath.Dir(fname) - } - shared.watchNums[fname]-- - watchNum := shared.watchNums[fname] - if watchNum == 0 { - delete(shared.watchNums, fname) - } shared.mux.Unlock() - // If we were the last ones to watch this file, unsubscribe from inotify. - // This needs to happen after releasing the lock because fsnotify waits - // synchronously for the kernel to acknowledge the removal of the watch - // for this file, which causes us to deadlock if we still held the lock. - if watchNum == 0 { - shared.watcher.Remove(fname) - } shared.remove <- winfo + return <-shared.error } // Events returns a channel to which FileEvents corresponding to the input filename @@ -142,8 +125,8 @@ func Events(fname string) <-chan fsnotify.Event { } // Cleanup removes the watch for the input filename if necessary. -func Cleanup(fname string) { - RemoveWatch(fname) +func Cleanup(fname string) error { + return RemoveWatch(fname) } // watchFlags calls fsnotify.WatchFlags for the input filename and flags, creating @@ -154,6 +137,8 @@ func (shared *InotifyTracker) addWatch(winfo *watchInfo) error { if shared.chans[winfo.fname] == nil { shared.chans[winfo.fname] = make(chan fsnotify.Event) + } + if shared.done[winfo.fname] == nil { shared.done[winfo.fname] = make(chan bool) } @@ -163,47 +148,50 @@ func (shared *InotifyTracker) addWatch(winfo *watchInfo) error { fname = filepath.Dir(fname) } + var err error // already in inotify watch - if shared.watchNums[fname] > 0 { - shared.watchNums[fname]++ - if winfo.isCreate() { - shared.watchNums[winfo.fname]++ - } - return nil + if shared.watchNums[fname] == 0 { + err = shared.watcher.Add(fname) } - - err := shared.watcher.Add(fname) if err == nil { shared.watchNums[fname]++ - if winfo.isCreate() { - shared.watchNums[winfo.fname]++ - } } return err } // removeWatch calls fsnotify.RemoveWatch for the input filename and closes the // corresponding events channel. -func (shared *InotifyTracker) removeWatch(winfo *watchInfo) { +func (shared *InotifyTracker) removeWatch(winfo *watchInfo) error { shared.mux.Lock() - defer shared.mux.Unlock() ch := shared.chans[winfo.fname] - if ch == nil { - return + if ch != nil { + delete(shared.chans, winfo.fname) + close(ch) } - delete(shared.chans, winfo.fname) - close(ch) - - if !winfo.isCreate() { - return + fname := winfo.fname + if winfo.isCreate() { + // Watch for new files to be created in the parent directory. + fname = filepath.Dir(fname) } + shared.watchNums[fname]-- + watchNum := shared.watchNums[fname] + if watchNum == 0 { + delete(shared.watchNums, fname) + } + shared.mux.Unlock() - shared.watchNums[winfo.fname]-- - if shared.watchNums[winfo.fname] == 0 { - delete(shared.watchNums, winfo.fname) + var err error + // If we were the last ones to watch this file, unsubscribe from inotify. + // This needs to happen after releasing the lock because fsnotify waits + // synchronously for the kernel to acknowledge the removal of the watch + // for this file, which causes us to deadlock if we still held the lock. + if watchNum == 0 { + err = shared.watcher.Remove(fname) } + + return err } // sendEvent sends the input event to the appropriate Tail. @@ -238,7 +226,7 @@ func (shared *InotifyTracker) run() { shared.error <- shared.addWatch(winfo) case winfo := <-shared.remove: - shared.removeWatch(winfo) + shared.error <- shared.removeWatch(winfo) case event, open := <-shared.watcher.Events: if !open { diff --git a/vendor/github.com/hpcloud/tail/watch/polling.go b/vendor/github.com/nxadm/tail/watch/polling.go similarity index 98% rename from vendor/github.com/hpcloud/tail/watch/polling.go rename to vendor/github.com/nxadm/tail/watch/polling.go index 49491f21db..fb1706908a 100644 --- a/vendor/github.com/hpcloud/tail/watch/polling.go +++ b/vendor/github.com/nxadm/tail/watch/polling.go @@ -8,7 +8,7 @@ import ( "runtime" "time" - "github.com/hpcloud/tail/util" + "github.com/nxadm/tail/util" "gopkg.in/tomb.v1" ) diff --git a/vendor/github.com/hpcloud/tail/watch/watch.go b/vendor/github.com/nxadm/tail/watch/watch.go similarity index 100% rename from vendor/github.com/hpcloud/tail/watch/watch.go rename to vendor/github.com/nxadm/tail/watch/watch.go diff --git a/vendor/github.com/hpcloud/tail/winfile/winfile.go b/vendor/github.com/nxadm/tail/winfile/winfile.go similarity index 100% rename from vendor/github.com/hpcloud/tail/winfile/winfile.go rename to vendor/github.com/nxadm/tail/winfile/winfile.go diff --git a/vendor/github.com/onsi/ginkgo/.travis.yml b/vendor/github.com/onsi/ginkgo/.travis.yml index 65dc3002be..079af24318 100644 --- a/vendor/github.com/onsi/ginkgo/.travis.yml +++ b/vendor/github.com/onsi/ginkgo/.travis.yml @@ -1,7 +1,7 @@ language: go go: - - 1.12.x - 1.13.x + - 1.14.x - tip cache: diff --git a/vendor/github.com/onsi/ginkgo/CHANGELOG.md b/vendor/github.com/onsi/ginkgo/CHANGELOG.md index 84b4794048..6092fcb633 100644 --- a/vendor/github.com/onsi/ginkgo/CHANGELOG.md +++ b/vendor/github.com/onsi/ginkgo/CHANGELOG.md @@ -1,3 +1,58 @@ +## 1.14.1 + +### Fixes +- Discard exported method declaration when running ginkgo bootstrap (#558) [f4b0240] + +## 1.14.0 + +### Features +- Defer running top-level container nodes until RunSpecs is called [d44dedf] +- [Document Ginkgo lifecycle](http://onsi.github.io/ginkgo/#understanding-ginkgos-lifecycle) +- Add `extensions/globals` package (#692) [3295c8f] - this can be helpful in contexts where you are test-driving your test-generation code (see [#692](https://github.com/onsi/ginkgo/pull/692)) +- Print Skip reason in JUnit reporter if one was provided [820dfab] + +## 1.13.0 + +### Features +- Add a version of table.Entry that allows dumping the entry parameters. (#689) [21eaef2] + +### Fixes +- Ensure integration tests pass in an environment sans GOPATH [606fba2] +- Add books package (#568) [fc0e44e] +- doc(readme): installation via "tools package" (#677) [83bb20e] +- Solve the undefined: unix.Dup2 compile error on mips64le (#680) [0624f75] +- Import package without dot (#687) [6321024] +- Fix integration tests to stop require GOPATH (#686) [a912ec5] + +## 1.12.3 + +### Fixes +- Print correct code location of failing table test (#666) [c6d7afb] + +## 1.12.2 + +### Fixes +- Update dependencies [ea4a036] + +## 1.12.1 + +### Fixes +- Make unfocus ("blur") much faster (#674) [8b18061] +- Fix typo (#673) [7fdcbe8] +- Test against 1.14 and remove 1.12 [d5c2ad6] +- Test if a coverprofile content is empty before checking its latest character (#670) [14d9fa2] +- replace tail package with maintained one. this fixes go get errors (#667) [4ba33d4] +- improve ginkgo performance - makes progress on #644 [a14f98e] +- fix convert integration tests [1f8ba69] +- fix typo succesful -> successful (#663) [1ea49cf] +- Fix invalid link (#658) [b886136] +- convert utility : Include comments from source (#657) [1077c6d] +- Explain what BDD means [d79e7fb] +- skip race detector test on unsupported platform (#642) [f8ab89d] +- Use Dup2 from golang.org/x/sys/unix instead of syscallDup (#638) [5d53c55] +- Fix missing newline in combined coverage file (#641) [6a07ea2] +- check if a spec is run before returning SpecSummary (#645) [8850000] + ## 1.12.0 ### Features @@ -208,7 +263,7 @@ New Features: - `ginkgo -tags=TAG_LIST` passes a list of tags down to the `go build` command. - `ginkgo --failFast` aborts the test suite after the first failure. - `ginkgo generate file_1 file_2` can take multiple file arguments. -- Ginkgo now summarizes any spec failures that occured at the end of the test run. +- Ginkgo now summarizes any spec failures that occurred at the end of the test run. - `ginkgo --randomizeSuites` will run tests *suites* in random order using the generated/passed-in seed. Improvements: diff --git a/vendor/github.com/onsi/ginkgo/README.md b/vendor/github.com/onsi/ginkgo/README.md index cdf8d054a1..475e04994f 100644 --- a/vendor/github.com/onsi/ginkgo/README.md +++ b/vendor/github.com/onsi/ginkgo/README.md @@ -1,29 +1,45 @@ -![Ginkgo: A Go BDD Testing Framework](http://onsi.github.io/ginkgo/images/ginkgo.png) +![Ginkgo: A Go BDD Testing Framework](https://onsi.github.io/ginkgo/images/ginkgo.png) [![Build Status](https://travis-ci.org/onsi/ginkgo.svg?branch=master)](https://travis-ci.org/onsi/ginkgo) -Jump to the [docs](http://onsi.github.io/ginkgo/) to learn more. To start rolling your Ginkgo tests *now* [keep reading](#set-me-up)! +Jump to the [docs](https://onsi.github.io/ginkgo/) to learn more. To start rolling your Ginkgo tests *now* [keep reading](#set-me-up)! -If you have a question, comment, bug report, feature request, etc. please open a GitHub issue. +If you have a question, comment, bug report, feature request, etc. please open a GitHub issue, or visit the [Ginkgo Slack channel](https://app.slack.com/client/T029RQSE6/CQQ50BBNW). + +## TLDR +Ginkgo builds on Go's `testing` package, allowing expressive [Behavior-Driven Development](https://en.wikipedia.org/wiki/Behavior-driven_development) ("BDD") style tests. +It is typically (and optionally) paired with the [Gomega](https://github.com/onsi/gomega) matcher library. + +```go +Describe("the strings package", func() { + Context("strings.Contains()", func() { + When("the string contains the substring in the middle", func() { + It("returns `true`", func() { + Expect(strings.Contains("Ginkgo is awesome", "is")).To(BeTrue()) + }) + }) + }) +}) +``` ## Feature List -- Ginkgo uses Go's `testing` package and can live alongside your existing `testing` tests. It's easy to [bootstrap](http://onsi.github.io/ginkgo/#bootstrapping-a-suite) and start writing your [first tests](http://onsi.github.io/ginkgo/#adding-specs-to-a-suite) +- Ginkgo uses Go's `testing` package and can live alongside your existing `testing` tests. It's easy to [bootstrap](https://onsi.github.io/ginkgo/#bootstrapping-a-suite) and start writing your [first tests](https://onsi.github.io/ginkgo/#adding-specs-to-a-suite) -- Structure your BDD-style tests expressively: - - Nestable [`Describe`, `Context` and `When` container blocks](http://onsi.github.io/ginkgo/#organizing-specs-with-containers-describe-and-context) - - [`BeforeEach` and `AfterEach` blocks](http://onsi.github.io/ginkgo/#extracting-common-setup-beforeeach) for setup and teardown - - [`It` and `Specify` blocks](http://onsi.github.io/ginkgo/#individual-specs-) that hold your assertions - - [`JustBeforeEach` blocks](http://onsi.github.io/ginkgo/#separating-creation-and-configuration-justbeforeeach) that separate creation from configuration (also known as the subject action pattern). - - [`BeforeSuite` and `AfterSuite` blocks](http://onsi.github.io/ginkgo/#global-setup-and-teardown-beforesuite-and-aftersuite) to prep for and cleanup after a suite. +- Ginkgo allows you to write tests in Go using expressive [Behavior-Driven Development](https://en.wikipedia.org/wiki/Behavior-driven_development) ("BDD") style: + - Nestable [`Describe`, `Context` and `When` container blocks](https://onsi.github.io/ginkgo/#organizing-specs-with-containers-describe-and-context) + - [`BeforeEach` and `AfterEach` blocks](https://onsi.github.io/ginkgo/#extracting-common-setup-beforeeach) for setup and teardown + - [`It` and `Specify` blocks](https://onsi.github.io/ginkgo/#individual-specs-it) that hold your assertions + - [`JustBeforeEach` blocks](https://onsi.github.io/ginkgo/#separating-creation-and-configuration-justbeforeeach) that separate creation from configuration (also known as the subject action pattern). + - [`BeforeSuite` and `AfterSuite` blocks](https://onsi.github.io/ginkgo/#global-setup-and-teardown-beforesuite-and-aftersuite) to prep for and cleanup after a suite. - A comprehensive test runner that lets you: - - Mark specs as [pending](http://onsi.github.io/ginkgo/#pending-specs) - - [Focus](http://onsi.github.io/ginkgo/#focused-specs) individual specs, and groups of specs, either programmatically or on the command line - - Run your tests in [random order](http://onsi.github.io/ginkgo/#spec-permutation), and then reuse random seeds to replicate the same order. - - Break up your test suite into parallel processes for straightforward [test parallelization](http://onsi.github.io/ginkgo/#parallel-specs) + - Mark specs as [pending](https://onsi.github.io/ginkgo/#pending-specs) + - [Focus](https://onsi.github.io/ginkgo/#focused-specs) individual specs, and groups of specs, either programmatically or on the command line + - Run your tests in [random order](https://onsi.github.io/ginkgo/#spec-permutation), and then reuse random seeds to replicate the same order. + - Break up your test suite into parallel processes for straightforward [test parallelization](https://onsi.github.io/ginkgo/#parallel-specs) -- `ginkgo`: a command line interface with plenty of handy command line arguments for [running your tests](http://onsi.github.io/ginkgo/#running-tests) and [generating](http://onsi.github.io/ginkgo/#generators) test files. Here are a few choice examples: +- `ginkgo`: a command line interface with plenty of handy command line arguments for [running your tests](https://onsi.github.io/ginkgo/#running-tests) and [generating](https://onsi.github.io/ginkgo/#generators) test files. Here are a few choice examples: - `ginkgo -nodes=N` runs your tests in `N` parallel processes and print out coherent output in realtime - `ginkgo -cover` runs your tests using Go's code coverage tool - `ginkgo convert` converts an XUnit-style `testing` package to a Ginkgo-style package @@ -37,37 +53,59 @@ If you have a question, comment, bug report, feature request, etc. please open a - `ginkgo watch` [watches](https://onsi.github.io/ginkgo/#watching-for-changes) packages *and their dependencies* for changes, then reruns tests. Run tests immediately as you develop! -- Built-in support for testing [asynchronicity](http://onsi.github.io/ginkgo/#asynchronous-tests) +- Built-in support for testing [asynchronicity](https://onsi.github.io/ginkgo/#asynchronous-tests) -- Built-in support for [benchmarking](http://onsi.github.io/ginkgo/#benchmark-tests) your code. Control the number of benchmark samples as you gather runtimes and other, arbitrary, bits of numerical information about your code. +- Built-in support for [benchmarking](https://onsi.github.io/ginkgo/#benchmark-tests) your code. Control the number of benchmark samples as you gather runtimes and other, arbitrary, bits of numerical information about your code. - [Completions for Sublime Text](https://github.com/onsi/ginkgo-sublime-completions): just use [Package Control](https://sublime.wbond.net/) to install `Ginkgo Completions`. - [Completions for VSCode](https://github.com/onsi/vscode-ginkgo): just use VSCode's extension installer to install `vscode-ginkgo`. -- Straightforward support for third-party testing libraries such as [Gomock](https://code.google.com/p/gomock/) and [Testify](https://github.com/stretchr/testify). Check out the [docs](http://onsi.github.io/ginkgo/#third-party-integrations) for details. +- Straightforward support for third-party testing libraries such as [Gomock](https://code.google.com/p/gomock/) and [Testify](https://github.com/stretchr/testify). Check out the [docs](https://onsi.github.io/ginkgo/#third-party-integrations) for details. - A modular architecture that lets you easily: - - Write [custom reporters](http://onsi.github.io/ginkgo/#writing-custom-reporters) (for example, Ginkgo comes with a [JUnit XML reporter](http://onsi.github.io/ginkgo/#generating-junit-xml-output) and a TeamCity reporter). - - [Adapt an existing matcher library (or write your own!)](http://onsi.github.io/ginkgo/#using-other-matcher-libraries) to work with Ginkgo + - Write [custom reporters](https://onsi.github.io/ginkgo/#writing-custom-reporters) (for example, Ginkgo comes with a [JUnit XML reporter](https://onsi.github.io/ginkgo/#generating-junit-xml-output) and a TeamCity reporter). + - [Adapt an existing matcher library (or write your own!)](https://onsi.github.io/ginkgo/#using-other-matcher-libraries) to work with Ginkgo -## [Gomega](http://github.com/onsi/gomega): Ginkgo's Preferred Matcher Library +## [Gomega](https://github.com/onsi/gomega): Ginkgo's Preferred Matcher Library -Ginkgo is best paired with Gomega. Learn more about Gomega [here](http://onsi.github.io/gomega/) +Ginkgo is best paired with Gomega. Learn more about Gomega [here](https://onsi.github.io/gomega/) -## [Agouti](http://github.com/sclevine/agouti): A Go Acceptance Testing Framework +## [Agouti](https://github.com/sclevine/agouti): A Go Acceptance Testing Framework -Agouti allows you run WebDriver integration tests. Learn more about Agouti [here](http://agouti.org) +Agouti allows you run WebDriver integration tests. Learn more about Agouti [here](https://agouti.org) -## Set Me Up! +## Getting Started -You'll need the Go command-line tools. Ginkgo is tested with Go 1.6+, but preferably you should get the latest. Follow the [installation instructions](https://golang.org/doc/install) if you don't have it installed. +You'll need the Go command-line tools. Follow the [installation instructions](https://golang.org/doc/install) if you don't have it installed. +### Global installation +To install the Ginkgo command line interface: ```bash +go get -u github.com/onsi/ginkgo/ginkgo +``` +Note that this will install it to `$GOBIN`, which will need to be in the `$PATH` (or equivalent). Run `go help install` for more information. + +### Go module ["tools package"](https://github.com/golang/go/issues/25922): +Create (or update) a file called `tools/tools.go` with the following contents: +```go +// +build tools -go get -u github.com/onsi/ginkgo/ginkgo # installs the ginkgo CLI -go get -u github.com/onsi/gomega/... # fetches the matcher library +package tools +import ( + _ "github.com/onsi/ginkgo/ginkgo" +) + +// This file imports packages that are used when running go generate, or used +// during the development process but not otherwise depended on by built code. +``` +The Ginkgo command can then be run via `go run github.com/onsi/ginkgo/ginkgo`. +This approach allows the version of Ginkgo to be maintained under source control for reproducible results, +and is well suited to automated test pipelines. + +### Bootstrapping +```bash cd path/to/package/you/want/to/test ginkgo bootstrap # set up a new ginkgo suite @@ -87,16 +125,16 @@ With that said, it's great to know what your options are :) ### What Go gives you out of the box -Testing is a first class citizen in Go, however Go's built-in testing primitives are somewhat limited: The [testing](http://golang.org/pkg/testing) package provides basic XUnit style tests and no assertion library. +Testing is a first class citizen in Go, however Go's built-in testing primitives are somewhat limited: The [testing](https://golang.org/pkg/testing) package provides basic XUnit style tests and no assertion library. ### Matcher libraries for Go's XUnit style tests A number of matcher libraries have been written to augment Go's built-in XUnit style tests. Here are two that have gained traction: - [testify](https://github.com/stretchr/testify) -- [gocheck](http://labix.org/gocheck) +- [gocheck](https://labix.org/gocheck) -You can also use Ginkgo's matcher library [Gomega](https://github.com/onsi/gomega) in [XUnit style tests](http://onsi.github.io/gomega/#using-gomega-with-golangs-xunitstyle-tests) +You can also use Ginkgo's matcher library [Gomega](https://github.com/onsi/gomega) in [XUnit style tests](https://onsi.github.io/gomega/#using-gomega-with-golangs-xunitstyle-tests) ### BDD style testing frameworks diff --git a/vendor/github.com/onsi/ginkgo/config/config.go b/vendor/github.com/onsi/ginkgo/config/config.go index 949f8130ff..feef2bcd6c 100644 --- a/vendor/github.com/onsi/ginkgo/config/config.go +++ b/vendor/github.com/onsi/ginkgo/config/config.go @@ -1,7 +1,7 @@ /* Ginkgo accepts a number of configuration options. -These are documented [here](http://onsi.github.io/ginkgo/#the_ginkgo_cli) +These are documented [here](http://onsi.github.io/ginkgo/#the-ginkgo-cli) You can also learn more via @@ -20,7 +20,7 @@ import ( "fmt" ) -const VERSION = "1.12.0" +const VERSION = "1.14.1" type GinkgoConfigType struct { RandomSeed int64 diff --git a/vendor/github.com/onsi/ginkgo/extensions/table/table.go b/vendor/github.com/onsi/ginkgo/extensions/table/table.go index ae8ab7d248..4b00278073 100644 --- a/vendor/github.com/onsi/ginkgo/extensions/table/table.go +++ b/vendor/github.com/onsi/ginkgo/extensions/table/table.go @@ -12,7 +12,9 @@ import ( "fmt" "reflect" - "github.com/onsi/ginkgo" + "github.com/onsi/ginkgo/internal/codelocation" + "github.com/onsi/ginkgo/internal/global" + "github.com/onsi/ginkgo/types" ) /* @@ -40,9 +42,28 @@ Under the hood, `DescribeTable` simply generates a new Ginkgo `Describe`. Each It's important to understand that the `Describe`s and `It`s are generated at evaluation time (i.e. when Ginkgo constructs the tree of tests and before the tests run). Individual Entries can be focused (with FEntry) or marked pending (with PEntry or XEntry). In addition, the entire table can be focused or marked pending with FDescribeTable and PDescribeTable/XDescribeTable. + +A description function can be passed to Entry in place of the description. The function is then fed with the entry parameters to generate the description of the It corresponding to that particular Entry. + +For example: + + describe := func(desc string) func(int, int, bool) string { + return func(x, y int, expected bool) string { + return fmt.Sprintf("%s x=%d y=%d expected:%t", desc, x, y, expected) + } + } + + DescribeTable("a simple table", + func(x int, y int, expected bool) { + Ω(x > y).Should(Equal(expected)) + }, + Entry(describe("x > y"), 1, 0, true), + Entry(describe("x == y"), 0, 0, false), + Entry(describe("x < y"), 0, 1, false), + ) */ func DescribeTable(description string, itBody interface{}, entries ...TableEntry) bool { - describeTable(description, itBody, entries, false, false) + describeTable(description, itBody, entries, types.FlagTypeNone) return true } @@ -50,7 +71,7 @@ func DescribeTable(description string, itBody interface{}, entries ...TableEntry You can focus a table with `FDescribeTable`. This is equivalent to `FDescribe`. */ func FDescribeTable(description string, itBody interface{}, entries ...TableEntry) bool { - describeTable(description, itBody, entries, false, true) + describeTable(description, itBody, entries, types.FlagTypeFocused) return true } @@ -58,7 +79,7 @@ func FDescribeTable(description string, itBody interface{}, entries ...TableEntr You can mark a table as pending with `PDescribeTable`. This is equivalent to `PDescribe`. */ func PDescribeTable(description string, itBody interface{}, entries ...TableEntry) bool { - describeTable(description, itBody, entries, true, false) + describeTable(description, itBody, entries, types.FlagTypePending) return true } @@ -66,33 +87,24 @@ func PDescribeTable(description string, itBody interface{}, entries ...TableEntr You can mark a table as pending with `XDescribeTable`. This is equivalent to `XDescribe`. */ func XDescribeTable(description string, itBody interface{}, entries ...TableEntry) bool { - describeTable(description, itBody, entries, true, false) + describeTable(description, itBody, entries, types.FlagTypePending) return true } -func describeTable(description string, itBody interface{}, entries []TableEntry, pending bool, focused bool) { +func describeTable(description string, itBody interface{}, entries []TableEntry, flag types.FlagType) { itBodyValue := reflect.ValueOf(itBody) if itBodyValue.Kind() != reflect.Func { panic(fmt.Sprintf("DescribeTable expects a function, got %#v", itBody)) } - if pending { - ginkgo.PDescribe(description, func() { + global.Suite.PushContainerNode( + description, + func() { for _, entry := range entries { entry.generateIt(itBodyValue) } - }) - } else if focused { - ginkgo.FDescribe(description, func() { - for _, entry := range entries { - entry.generateIt(itBodyValue) - } - }) - } else { - ginkgo.Describe(description, func() { - for _, entry := range entries { - entry.generateIt(itBodyValue) - } - }) - } + }, + flag, + codelocation.New(2), + ) } diff --git a/vendor/github.com/onsi/ginkgo/extensions/table/table_entry.go b/vendor/github.com/onsi/ginkgo/extensions/table/table_entry.go index 93f3bc3b00..4d9c237ad7 100644 --- a/vendor/github.com/onsi/ginkgo/extensions/table/table_entry.go +++ b/vendor/github.com/onsi/ginkgo/extensions/table/table_entry.go @@ -1,49 +1,76 @@ package table import ( + "fmt" "reflect" - "github.com/onsi/ginkgo" + "github.com/onsi/ginkgo/internal/codelocation" + "github.com/onsi/ginkgo/internal/global" + "github.com/onsi/ginkgo/types" ) /* TableEntry represents an entry in a table test. You generally use the `Entry` constructor. */ type TableEntry struct { - Description string - Parameters []interface{} - Pending bool - Focused bool + Description interface{} + Parameters []interface{} + Pending bool + Focused bool + codeLocation types.CodeLocation } func (t TableEntry) generateIt(itBody reflect.Value) { - if t.Pending { - ginkgo.PIt(t.Description) - return + var description string + descriptionValue := reflect.ValueOf(t.Description) + switch descriptionValue.Kind() { + case reflect.String: + description = descriptionValue.String() + case reflect.Func: + values := castParameters(descriptionValue, t.Parameters) + res := descriptionValue.Call(values) + if len(res) != 1 { + panic(fmt.Sprintf("The describe function should return only a value, returned %d", len(res))) + } + if res[0].Kind() != reflect.String { + panic(fmt.Sprintf("The describe function should return a string, returned %#v", res[0])) + } + description = res[0].String() + default: + panic(fmt.Sprintf("Description can either be a string or a function, got %#v", descriptionValue)) } - values := make([]reflect.Value, len(t.Parameters)) - iBodyType := itBody.Type() - for i, param := range t.Parameters { - if param == nil { - inType := iBodyType.In(i) - values[i] = reflect.Zero(inType) - } else { - values[i] = reflect.ValueOf(param) - } + if t.Pending { + global.Suite.PushItNode(description, func() {}, types.FlagTypePending, t.codeLocation, 0) + return } + values := castParameters(itBody, t.Parameters) body := func() { itBody.Call(values) } if t.Focused { - ginkgo.FIt(t.Description, body) + global.Suite.PushItNode(description, body, types.FlagTypeFocused, t.codeLocation, global.DefaultTimeout) } else { - ginkgo.It(t.Description, body) + global.Suite.PushItNode(description, body, types.FlagTypeNone, t.codeLocation, global.DefaultTimeout) } } +func castParameters(function reflect.Value, parameters []interface{}) []reflect.Value { + res := make([]reflect.Value, len(parameters)) + funcType := function.Type() + for i, param := range parameters { + if param == nil { + inType := funcType.In(i) + res[i] = reflect.Zero(inType) + } else { + res[i] = reflect.ValueOf(param) + } + } + return res +} + /* Entry constructs a TableEntry. @@ -52,27 +79,51 @@ Subsequent parameters are saved off and sent to the callback passed in to `Descr Each Entry ends up generating an individual Ginkgo It. */ -func Entry(description string, parameters ...interface{}) TableEntry { - return TableEntry{description, parameters, false, false} +func Entry(description interface{}, parameters ...interface{}) TableEntry { + return TableEntry{ + Description: description, + Parameters: parameters, + Pending: false, + Focused: false, + codeLocation: codelocation.New(1), + } } /* You can focus a particular entry with FEntry. This is equivalent to FIt. */ -func FEntry(description string, parameters ...interface{}) TableEntry { - return TableEntry{description, parameters, false, true} +func FEntry(description interface{}, parameters ...interface{}) TableEntry { + return TableEntry{ + Description: description, + Parameters: parameters, + Pending: false, + Focused: true, + codeLocation: codelocation.New(1), + } } /* You can mark a particular entry as pending with PEntry. This is equivalent to PIt. */ -func PEntry(description string, parameters ...interface{}) TableEntry { - return TableEntry{description, parameters, true, false} +func PEntry(description interface{}, parameters ...interface{}) TableEntry { + return TableEntry{ + Description: description, + Parameters: parameters, + Pending: true, + Focused: false, + codeLocation: codelocation.New(1), + } } /* You can mark a particular entry as pending with XEntry. This is equivalent to XIt. */ -func XEntry(description string, parameters ...interface{}) TableEntry { - return TableEntry{description, parameters, true, false} +func XEntry(description interface{}, parameters ...interface{}) TableEntry { + return TableEntry{ + Description: description, + Parameters: parameters, + Pending: true, + Focused: false, + codeLocation: codelocation.New(1), + } } diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/build_command.go b/vendor/github.com/onsi/ginkgo/ginkgo/build_command.go index f0eb375c3b..2fddef0f7b 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/build_command.go +++ b/vendor/github.com/onsi/ginkgo/ginkgo/build_command.go @@ -57,8 +57,6 @@ func (r *SpecBuilder) BuildSpecs(args []string, additionalArgs []string) { } else { fmt.Printf(" compiled %s.test\n", suite.PackageName) } - - runner.CleanUp() } if passed { diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/convert/package_rewriter.go b/vendor/github.com/onsi/ginkgo/ginkgo/convert/package_rewriter.go index 5e00d5618b..363e52fe2f 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/convert/package_rewriter.go +++ b/vendor/github.com/onsi/ginkgo/ginkgo/convert/package_rewriter.go @@ -33,7 +33,8 @@ func RewritePackage(packageName string) { */ func findTestsInPackage(pkg *build.Package) (testfiles []string) { for _, file := range append(pkg.TestGoFiles, pkg.XTestGoFiles...) { - testfiles = append(testfiles, filepath.Join(pkg.Dir, file)) + testfile, _ := filepath.Abs(filepath.Join(pkg.Dir, file)) + testfiles = append(testfiles, testfile) } dirFiles, err := ioutil.ReadDir(pkg.Dir) @@ -103,10 +104,11 @@ func addGinkgoSuiteForPackage(pkg *build.Package) { * Shells out to `go fmt` to format the package */ func goFmtPackage(pkg *build.Package) { - output, err := exec.Command("go", "fmt", pkg.ImportPath).Output() + path, _ := filepath.Abs(pkg.ImportPath) + output, err := exec.Command("go", "fmt", path).CombinedOutput() if err != nil { - fmt.Printf("Warning: Error running 'go fmt %s'.\nstdout: %s\n%s\n", pkg.ImportPath, output, err.Error()) + fmt.Printf("Warning: Error running 'go fmt %s'.\nstdout: %s\n%s\n", path, output, err.Error()) } } diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/convert/testfile_rewriter.go b/vendor/github.com/onsi/ginkgo/ginkgo/convert/testfile_rewriter.go index d415050ef3..60c73504ad 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/convert/testfile_rewriter.go +++ b/vendor/github.com/onsi/ginkgo/ginkgo/convert/testfile_rewriter.go @@ -22,7 +22,7 @@ import ( */ func rewriteTestsInFile(pathToFile string) { fileSet := token.NewFileSet() - rootNode, err := parser.ParseFile(fileSet, pathToFile, nil, 0) + rootNode, err := parser.ParseFile(fileSet, pathToFile, nil, parser.ParseComments) if err != nil { panic(fmt.Sprintf("Error parsing test file '%s':\n%s\n", pathToFile, err.Error())) } @@ -56,11 +56,12 @@ func rewriteTestsInFile(pathToFile string) { } fileInfo, err := os.Stat(pathToFile) + if err != nil { panic(fmt.Sprintf("Error stat'ing file: %s\n", pathToFile)) } - ioutil.WriteFile(pathToFile, buffer.Bytes(), fileInfo.Mode()) + err = ioutil.WriteFile(pathToFile, buffer.Bytes(), fileInfo.Mode()) } /* diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/generate_command.go b/vendor/github.com/onsi/ginkgo/ginkgo/generate_command.go index c0a39237e8..4099f99a8b 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/generate_command.go +++ b/vendor/github.com/onsi/ginkgo/ginkgo/generate_command.go @@ -39,7 +39,7 @@ import ( {{if .IncludeImports}}. "github.com/onsi/ginkgo"{{end}} {{if .IncludeImports}}. "github.com/onsi/gomega"{{end}} - {{if .DotImportPackage}}. "{{.PackageImportPath}}"{{end}} + {{if .ImportPackage}}"{{.PackageImportPath}}"{{end}} ) var _ = Describe("{{.Subject}}", func() { @@ -55,7 +55,7 @@ import ( "github.com/sclevine/agouti" . "github.com/sclevine/agouti/matchers" - {{if .DotImportPackage}}. "{{.PackageImportPath}}"{{end}} + {{if .ImportPackage}}"{{.PackageImportPath}}"{{end}} ) var _ = Describe("{{.Subject}}", func() { @@ -78,7 +78,7 @@ type specData struct { Subject string PackageImportPath string IncludeImports bool - DotImportPackage bool + ImportPackage bool } func generateSpec(args []string, agouti, noDot, internal bool) { @@ -119,7 +119,7 @@ func generateSpecForSubject(subject string, agouti, noDot, internal bool) error Subject: formattedName, PackageImportPath: getPackageImportPath(), IncludeImports: !noDot, - DotImportPackage: !internal, + ImportPackage: !internal, } targetFile := fmt.Sprintf("%s_test.go", specFilePrefix) diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/main.go b/vendor/github.com/onsi/ginkgo/ginkgo/main.go index 0741ba8c99..f60c48a72e 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/main.go +++ b/vendor/github.com/onsi/ginkgo/ginkgo/main.go @@ -288,9 +288,9 @@ func findSuites(args []string, recurseForAll bool, skipPackage string, allowPrec } func goFmt(path string) { - err := exec.Command("go", "fmt", path).Run() + out, err := exec.Command("go", "fmt", path).CombinedOutput() if err != nil { - complainAndQuit("Could not fmt: " + err.Error()) + complainAndQuit("Could not fmt: " + err.Error() + "\n" + string(out)) } } diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/nodot/nodot.go b/vendor/github.com/onsi/ginkgo/ginkgo/nodot/nodot.go index 3f7237c602..c87b721652 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/nodot/nodot.go +++ b/vendor/github.com/onsi/ginkgo/ginkgo/nodot/nodot.go @@ -186,7 +186,9 @@ func getExportedDeclarationsForFile(path string) ([]string, error) { declarations = append(declarations, s.Names[0].Name) } case *ast.FuncDecl: - declarations = append(declarations, x.Name.Name) + if x.Recv == nil { + declarations = append(declarations, x.Name.Name) + } } } diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/run_command.go b/vendor/github.com/onsi/ginkgo/ginkgo/run_command.go index 1d06e08fd4..f225d272f2 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/run_command.go +++ b/vendor/github.com/onsi/ginkgo/ginkgo/run_command.go @@ -179,19 +179,24 @@ func (r *SpecRunner) combineCoverprofiles(runners []*testrunner.TestRunner) erro for index, runner := range runners { contents, err := ioutil.ReadFile(runner.CoverageFile) + if err != nil { + fmt.Printf("Unable to read coverage file %s to combine, %v\n", runner.CoverageFile, err) + return nil // non-fatal error + } + // remove the cover mode line from every file // except the first one if index > 0 { contents = modeRegex.ReplaceAll(contents, []byte{}) } - if err != nil { - fmt.Printf("Unable to read coverage file %s to combine, %v\n", runner.CoverageFile, err) - return nil // non-fatal error - } - _, err = combined.Write(contents) + // Add a newline to the end of every file if missing. + if err == nil && len(contents) > 0 && contents[len(contents)-1] != '\n' { + _, err = combined.Write([]byte("\n")) + } + if err != nil { fmt.Printf("Unable to append to coverprofile, %v\n", err) return nil // non-fatal error diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/test_runner.go b/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/test_runner.go index 80670d24a0..66c0f06f62 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/test_runner.go +++ b/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/test_runner.go @@ -49,11 +49,7 @@ func New(suite testsuite.TestSuite, numCPU int, parallelStream bool, timeout tim } if !suite.Precompiled { - dir, err := ioutil.TempDir("", "ginkgo") - if err != nil { - panic(fmt.Sprintf("couldn't create temporary directory... might be time to rm -rf:\n%s", err.Error())) - } - runner.compilationTargetPath = filepath.Join(dir, suite.PackageName+".test") + runner.compilationTargetPath, _ = filepath.Abs(filepath.Join(suite.Path, suite.PackageName+".test")) } return runner @@ -248,7 +244,7 @@ func (t *TestRunner) CleanUp() { if t.Suite.Precompiled { return } - os.RemoveAll(filepath.Dir(t.compilationTargetPath)) + os.Remove(t.compilationTargetPath) } func (t *TestRunner) runSerialGinkgoSuite() RunResult { diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/unfocus_command.go b/vendor/github.com/onsi/ginkgo/ginkgo/unfocus_command.go index cedc2b59c2..d9dfb6e44c 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/unfocus_command.go +++ b/vendor/github.com/onsi/ginkgo/ginkgo/unfocus_command.go @@ -1,11 +1,18 @@ package main import ( + "bytes" "flag" "fmt" + "go/ast" + "go/parser" + "go/token" + "io" "io/ioutil" - "os/exec" + "os" + "path/filepath" "strings" + "sync" ) func BuildUnfocusCommand() *Command { @@ -22,40 +29,152 @@ func BuildUnfocusCommand() *Command { } func unfocusSpecs([]string, []string) { - unfocus("Describe") - unfocus("Context") - unfocus("It") - unfocus("Measure") - unfocus("DescribeTable") - unfocus("Entry") - unfocus("Specify") - unfocus("When") -} - -func unfocus(component string) { - fmt.Printf("Removing F%s...\n", component) - files, err := ioutil.ReadDir(".") + fmt.Println("Scanning for focus...") + + goFiles := make(chan string) + go func() { + unfocusDir(goFiles, ".") + close(goFiles) + }() + + const workers = 10 + wg := sync.WaitGroup{} + wg.Add(workers) + + for i := 0; i < workers; i++ { + go func() { + for path := range goFiles { + unfocusFile(path) + } + wg.Done() + }() + } + + wg.Wait() +} + +func unfocusDir(goFiles chan string, path string) { + files, err := ioutil.ReadDir(path) if err != nil { fmt.Println(err.Error()) return } + for _, f := range files { - // Exclude "vendor" directory - if f.IsDir() && f.Name() == "vendor" { - continue + switch { + case f.IsDir() && shouldProcessDir(f.Name()): + unfocusDir(goFiles, filepath.Join(path, f.Name())) + case !f.IsDir() && shouldProcessFile(f.Name()): + goFiles <- filepath.Join(path, f.Name()) } - // Exclude non-go files in the current directory - if !f.IsDir() && !strings.HasSuffix(f.Name(), ".go") { - continue + } +} + +func shouldProcessDir(basename string) bool { + return basename != "vendor" && !strings.HasPrefix(basename, ".") +} + +func shouldProcessFile(basename string) bool { + return strings.HasSuffix(basename, ".go") +} + +func unfocusFile(path string) { + data, err := ioutil.ReadFile(path) + if err != nil { + fmt.Printf("error reading file '%s': %s\n", path, err.Error()) + return + } + + ast, err := parser.ParseFile(token.NewFileSet(), path, bytes.NewReader(data), 0) + if err != nil { + fmt.Printf("error parsing file '%s': %s\n", path, err.Error()) + return + } + + eliminations := scanForFocus(ast) + if len(eliminations) == 0 { + return + } + + fmt.Printf("...updating %s\n", path) + backup, err := writeBackup(path, data) + if err != nil { + fmt.Printf("error creating backup file: %s\n", err.Error()) + return + } + + if err := updateFile(path, data, eliminations); err != nil { + fmt.Printf("error writing file '%s': %s\n", path, err.Error()) + return + } + + os.Remove(backup) +} + +func writeBackup(path string, data []byte) (string, error) { + t, err := ioutil.TempFile(filepath.Dir(path), filepath.Base(path)) + + if err != nil { + return "", fmt.Errorf("error creating temporary file: %w", err) + } + defer t.Close() + + if _, err := io.Copy(t, bytes.NewReader(data)); err != nil { + return "", fmt.Errorf("error writing to temporary file: %w", err) + } + + return t.Name(), nil +} + +func updateFile(path string, data []byte, eliminations []int64) error { + to, err := os.Create(path) + if err != nil { + return fmt.Errorf("error opening file for writing '%s': %w\n", path, err) + } + defer to.Close() + + from := bytes.NewReader(data) + var cursor int64 + for _, byteToEliminate := range eliminations { + if _, err := io.CopyN(to, from, byteToEliminate-cursor); err != nil { + return fmt.Errorf("error copying data: %w", err) } - // Recursively run `gofmt` otherwise - cmd := exec.Command("gofmt", fmt.Sprintf("-r=F%s -> %s", component, component), "-w", f.Name()) - out, err := cmd.CombinedOutput() - if err != nil { - fmt.Println(err.Error()) + + cursor = byteToEliminate + 1 + + if _, err := from.Seek(1, io.SeekCurrent); err != nil { + return fmt.Errorf("error seeking to position in buffer: %w", err) } - if string(out) != "" { - fmt.Println(string(out)) + } + + if _, err := io.Copy(to, from); err != nil { + return fmt.Errorf("error copying end data: %w", err) + } + + return nil +} + +func scanForFocus(file *ast.File) (eliminations []int64) { + ast.Inspect(file, func(n ast.Node) bool { + if c, ok := n.(*ast.CallExpr); ok { + if i, ok := c.Fun.(*ast.Ident); ok { + if isFocus(i.Name) { + eliminations = append(eliminations, int64(i.Pos()-file.Pos())) + } + } } + + return true + }) + + return eliminations +} + +func isFocus(name string) bool { + switch name { + case "FDescribe", "FContext", "FIt", "FMeasure", "FDescribeTable", "FEntry", "FSpecify", "FWhen": + return true + default: + return false } } diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/watch/dependencies.go b/vendor/github.com/onsi/ginkgo/ginkgo/watch/dependencies.go index b7f756777e..f5ddff30fc 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/watch/dependencies.go +++ b/vendor/github.com/onsi/ginkgo/ginkgo/watch/dependencies.go @@ -6,6 +6,7 @@ import ( ) var ginkgoAndGomegaFilter = regexp.MustCompile(`github\.com/onsi/ginkgo|github\.com/onsi/gomega`) +var ginkgoIntegrationTestFilter = regexp.MustCompile(`github\.com/onsi/ginkgo/integration`) //allow us to integration test this thing type Dependencies struct { deps map[string]int @@ -77,7 +78,7 @@ func (d Dependencies) resolveAndAdd(deps []string, depth int) { if err != nil { continue } - if !pkg.Goroot && !ginkgoAndGomegaFilter.Match([]byte(pkg.Dir)) { + if !pkg.Goroot && (!ginkgoAndGomegaFilter.Match([]byte(pkg.Dir)) || ginkgoIntegrationTestFilter.Match([]byte(pkg.Dir))) { d.addDepIfNotPresent(pkg.Dir, depth) } } diff --git a/vendor/github.com/onsi/ginkgo/ginkgo_dsl.go b/vendor/github.com/onsi/ginkgo/ginkgo_dsl.go index 3cbf89a35c..30ff86f59f 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo_dsl.go +++ b/vendor/github.com/onsi/ginkgo/ginkgo_dsl.go @@ -22,9 +22,8 @@ import ( "github.com/onsi/ginkgo/config" "github.com/onsi/ginkgo/internal/codelocation" - "github.com/onsi/ginkgo/internal/failer" + "github.com/onsi/ginkgo/internal/global" "github.com/onsi/ginkgo/internal/remote" - "github.com/onsi/ginkgo/internal/suite" "github.com/onsi/ginkgo/internal/testingtproxy" "github.com/onsi/ginkgo/internal/writer" "github.com/onsi/ginkgo/reporters" @@ -46,16 +45,10 @@ To circumvent this, you should call at the top of the goroutine that caused this panic. ` -const defaultTimeout = 1 - -var globalSuite *suite.Suite -var globalFailer *failer.Failer func init() { config.Flags(flag.CommandLine, "ginkgo", true) GinkgoWriter = writer.New(os.Stdout) - globalFailer = failer.New() - globalSuite = suite.New(globalFailer) } //GinkgoWriter implements an io.Writer @@ -156,7 +149,7 @@ type GinkgoTestDescription struct { //CurrentGinkgoTestDescripton returns information about the current running test. func CurrentGinkgoTestDescription() GinkgoTestDescription { - summary, ok := globalSuite.CurrentRunningSpecSummary() + summary, ok := global.Suite.CurrentRunningSpecSummary() if !ok { return GinkgoTestDescription{} } @@ -223,7 +216,7 @@ func RunSpecsWithCustomReporters(t GinkgoTestingT, description string, specRepor for i, reporter := range specReporters { reporters[i] = reporter } - passed, hasFocusedTests := globalSuite.Run(t, description, reporters, writer, config.GinkgoConfig) + passed, hasFocusedTests := global.Suite.Run(t, description, reporters, writer, config.GinkgoConfig) if passed && hasFocusedTests && strings.TrimSpace(os.Getenv("GINKGO_EDITOR_INTEGRATION")) == "" { fmt.Println("PASS | FOCUSED") os.Exit(types.GINKGO_FOCUS_EXIT_CODE) @@ -252,7 +245,7 @@ func Skip(message string, callerSkip ...int) { skip = callerSkip[0] } - globalFailer.Skip(message, codelocation.New(skip+1)) + global.Failer.Skip(message, codelocation.New(skip+1)) panic(GINKGO_PANIC) } @@ -263,7 +256,7 @@ func Fail(message string, callerSkip ...int) { skip = callerSkip[0] } - globalFailer.Fail(message, codelocation.New(skip+1)) + global.Failer.Fail(message, codelocation.New(skip+1)) panic(GINKGO_PANIC) } @@ -280,7 +273,7 @@ func Fail(message string, callerSkip ...int) { func GinkgoRecover() { e := recover() if e != nil { - globalFailer.Panic(codelocation.New(1), e) + global.Failer.Panic(codelocation.New(1), e) } } @@ -291,25 +284,25 @@ func GinkgoRecover() { //equivalent. The difference is purely semantic -- you typically Describe the behavior of an object //or method and, within that Describe, outline a number of Contexts and Whens. func Describe(text string, body func()) bool { - globalSuite.PushContainerNode(text, body, types.FlagTypeNone, codelocation.New(1)) + global.Suite.PushContainerNode(text, body, types.FlagTypeNone, codelocation.New(1)) return true } //You can focus the tests within a describe block using FDescribe func FDescribe(text string, body func()) bool { - globalSuite.PushContainerNode(text, body, types.FlagTypeFocused, codelocation.New(1)) + global.Suite.PushContainerNode(text, body, types.FlagTypeFocused, codelocation.New(1)) return true } //You can mark the tests within a describe block as pending using PDescribe func PDescribe(text string, body func()) bool { - globalSuite.PushContainerNode(text, body, types.FlagTypePending, codelocation.New(1)) + global.Suite.PushContainerNode(text, body, types.FlagTypePending, codelocation.New(1)) return true } //You can mark the tests within a describe block as pending using XDescribe func XDescribe(text string, body func()) bool { - globalSuite.PushContainerNode(text, body, types.FlagTypePending, codelocation.New(1)) + global.Suite.PushContainerNode(text, body, types.FlagTypePending, codelocation.New(1)) return true } @@ -320,25 +313,25 @@ func XDescribe(text string, body func()) bool { //equivalent. The difference is purely semantic -- you typical Describe the behavior of an object //or method and, within that Describe, outline a number of Contexts and Whens. func Context(text string, body func()) bool { - globalSuite.PushContainerNode(text, body, types.FlagTypeNone, codelocation.New(1)) + global.Suite.PushContainerNode(text, body, types.FlagTypeNone, codelocation.New(1)) return true } //You can focus the tests within a describe block using FContext func FContext(text string, body func()) bool { - globalSuite.PushContainerNode(text, body, types.FlagTypeFocused, codelocation.New(1)) + global.Suite.PushContainerNode(text, body, types.FlagTypeFocused, codelocation.New(1)) return true } //You can mark the tests within a describe block as pending using PContext func PContext(text string, body func()) bool { - globalSuite.PushContainerNode(text, body, types.FlagTypePending, codelocation.New(1)) + global.Suite.PushContainerNode(text, body, types.FlagTypePending, codelocation.New(1)) return true } //You can mark the tests within a describe block as pending using XContext func XContext(text string, body func()) bool { - globalSuite.PushContainerNode(text, body, types.FlagTypePending, codelocation.New(1)) + global.Suite.PushContainerNode(text, body, types.FlagTypePending, codelocation.New(1)) return true } @@ -349,25 +342,25 @@ func XContext(text string, body func()) bool { //equivalent. The difference is purely semantic -- you typical Describe the behavior of an object //or method and, within that Describe, outline a number of Contexts and Whens. func When(text string, body func()) bool { - globalSuite.PushContainerNode("when "+text, body, types.FlagTypeNone, codelocation.New(1)) + global.Suite.PushContainerNode("when "+text, body, types.FlagTypeNone, codelocation.New(1)) return true } //You can focus the tests within a describe block using FWhen func FWhen(text string, body func()) bool { - globalSuite.PushContainerNode("when "+text, body, types.FlagTypeFocused, codelocation.New(1)) + global.Suite.PushContainerNode("when "+text, body, types.FlagTypeFocused, codelocation.New(1)) return true } //You can mark the tests within a describe block as pending using PWhen func PWhen(text string, body func()) bool { - globalSuite.PushContainerNode("when "+text, body, types.FlagTypePending, codelocation.New(1)) + global.Suite.PushContainerNode("when "+text, body, types.FlagTypePending, codelocation.New(1)) return true } //You can mark the tests within a describe block as pending using XWhen func XWhen(text string, body func()) bool { - globalSuite.PushContainerNode("when "+text, body, types.FlagTypePending, codelocation.New(1)) + global.Suite.PushContainerNode("when "+text, body, types.FlagTypePending, codelocation.New(1)) return true } @@ -377,25 +370,25 @@ func XWhen(text string, body func()) bool { //Ginkgo will normally run It blocks synchronously. To perform asynchronous tests, pass a //function that accepts a Done channel. When you do this, you can also provide an optional timeout. func It(text string, body interface{}, timeout ...float64) bool { - globalSuite.PushItNode(text, body, types.FlagTypeNone, codelocation.New(1), parseTimeout(timeout...)) + global.Suite.PushItNode(text, body, types.FlagTypeNone, codelocation.New(1), parseTimeout(timeout...)) return true } //You can focus individual Its using FIt func FIt(text string, body interface{}, timeout ...float64) bool { - globalSuite.PushItNode(text, body, types.FlagTypeFocused, codelocation.New(1), parseTimeout(timeout...)) + global.Suite.PushItNode(text, body, types.FlagTypeFocused, codelocation.New(1), parseTimeout(timeout...)) return true } //You can mark Its as pending using PIt func PIt(text string, _ ...interface{}) bool { - globalSuite.PushItNode(text, func() {}, types.FlagTypePending, codelocation.New(1), 0) + global.Suite.PushItNode(text, func() {}, types.FlagTypePending, codelocation.New(1), 0) return true } //You can mark Its as pending using XIt func XIt(text string, _ ...interface{}) bool { - globalSuite.PushItNode(text, func() {}, types.FlagTypePending, codelocation.New(1), 0) + global.Suite.PushItNode(text, func() {}, types.FlagTypePending, codelocation.New(1), 0) return true } @@ -403,25 +396,25 @@ func XIt(text string, _ ...interface{}) bool { //which "It" does not fit into a natural sentence flow. All the same protocols apply for Specify blocks //which apply to It blocks. func Specify(text string, body interface{}, timeout ...float64) bool { - globalSuite.PushItNode(text, body, types.FlagTypeNone, codelocation.New(1), parseTimeout(timeout...)) + global.Suite.PushItNode(text, body, types.FlagTypeNone, codelocation.New(1), parseTimeout(timeout...)) return true } //You can focus individual Specifys using FSpecify func FSpecify(text string, body interface{}, timeout ...float64) bool { - globalSuite.PushItNode(text, body, types.FlagTypeFocused, codelocation.New(1), parseTimeout(timeout...)) + global.Suite.PushItNode(text, body, types.FlagTypeFocused, codelocation.New(1), parseTimeout(timeout...)) return true } //You can mark Specifys as pending using PSpecify func PSpecify(text string, is ...interface{}) bool { - globalSuite.PushItNode(text, func() {}, types.FlagTypePending, codelocation.New(1), 0) + global.Suite.PushItNode(text, func() {}, types.FlagTypePending, codelocation.New(1), 0) return true } //You can mark Specifys as pending using XSpecify func XSpecify(text string, is ...interface{}) bool { - globalSuite.PushItNode(text, func() {}, types.FlagTypePending, codelocation.New(1), 0) + global.Suite.PushItNode(text, func() {}, types.FlagTypePending, codelocation.New(1), 0) return true } @@ -452,25 +445,25 @@ func By(text string, callbacks ...func()) { //The body function must have the signature: // func(b Benchmarker) func Measure(text string, body interface{}, samples int) bool { - globalSuite.PushMeasureNode(text, body, types.FlagTypeNone, codelocation.New(1), samples) + global.Suite.PushMeasureNode(text, body, types.FlagTypeNone, codelocation.New(1), samples) return true } //You can focus individual Measures using FMeasure func FMeasure(text string, body interface{}, samples int) bool { - globalSuite.PushMeasureNode(text, body, types.FlagTypeFocused, codelocation.New(1), samples) + global.Suite.PushMeasureNode(text, body, types.FlagTypeFocused, codelocation.New(1), samples) return true } //You can mark Measurements as pending using PMeasure func PMeasure(text string, _ ...interface{}) bool { - globalSuite.PushMeasureNode(text, func(b Benchmarker) {}, types.FlagTypePending, codelocation.New(1), 0) + global.Suite.PushMeasureNode(text, func(b Benchmarker) {}, types.FlagTypePending, codelocation.New(1), 0) return true } //You can mark Measurements as pending using XMeasure func XMeasure(text string, _ ...interface{}) bool { - globalSuite.PushMeasureNode(text, func(b Benchmarker) {}, types.FlagTypePending, codelocation.New(1), 0) + global.Suite.PushMeasureNode(text, func(b Benchmarker) {}, types.FlagTypePending, codelocation.New(1), 0) return true } @@ -481,7 +474,7 @@ func XMeasure(text string, _ ...interface{}) bool { // //You may only register *one* BeforeSuite handler per test suite. You typically do so in your bootstrap file at the top level. func BeforeSuite(body interface{}, timeout ...float64) bool { - globalSuite.SetBeforeSuiteNode(body, codelocation.New(1), parseTimeout(timeout...)) + global.Suite.SetBeforeSuiteNode(body, codelocation.New(1), parseTimeout(timeout...)) return true } @@ -494,7 +487,7 @@ func BeforeSuite(body interface{}, timeout ...float64) bool { // //You may only register *one* AfterSuite handler per test suite. You typically do so in your bootstrap file at the top level. func AfterSuite(body interface{}, timeout ...float64) bool { - globalSuite.SetAfterSuiteNode(body, codelocation.New(1), parseTimeout(timeout...)) + global.Suite.SetAfterSuiteNode(body, codelocation.New(1), parseTimeout(timeout...)) return true } @@ -539,7 +532,7 @@ func AfterSuite(body interface{}, timeout ...float64) bool { // Ω(err).ShouldNot(HaveOccurred()) // }) func SynchronizedBeforeSuite(node1Body interface{}, allNodesBody interface{}, timeout ...float64) bool { - globalSuite.SetSynchronizedBeforeSuiteNode( + global.Suite.SetSynchronizedBeforeSuiteNode( node1Body, allNodesBody, codelocation.New(1), @@ -566,7 +559,7 @@ func SynchronizedBeforeSuite(node1Body interface{}, allNodesBody interface{}, ti // dbRunner.Stop() // }) func SynchronizedAfterSuite(allNodesBody interface{}, node1Body interface{}, timeout ...float64) bool { - globalSuite.SetSynchronizedAfterSuiteNode( + global.Suite.SetSynchronizedAfterSuiteNode( allNodesBody, node1Body, codelocation.New(1), @@ -581,7 +574,7 @@ func SynchronizedAfterSuite(allNodesBody interface{}, node1Body interface{}, tim //Like It blocks, BeforeEach blocks can be made asynchronous by providing a body function that accepts //a Done channel func BeforeEach(body interface{}, timeout ...float64) bool { - globalSuite.PushBeforeEachNode(body, codelocation.New(1), parseTimeout(timeout...)) + global.Suite.PushBeforeEachNode(body, codelocation.New(1), parseTimeout(timeout...)) return true } @@ -591,7 +584,7 @@ func BeforeEach(body interface{}, timeout ...float64) bool { //Like It blocks, BeforeEach blocks can be made asynchronous by providing a body function that accepts //a Done channel func JustBeforeEach(body interface{}, timeout ...float64) bool { - globalSuite.PushJustBeforeEachNode(body, codelocation.New(1), parseTimeout(timeout...)) + global.Suite.PushJustBeforeEachNode(body, codelocation.New(1), parseTimeout(timeout...)) return true } @@ -601,7 +594,7 @@ func JustBeforeEach(body interface{}, timeout ...float64) bool { //Like It blocks, JustAfterEach blocks can be made asynchronous by providing a body function that accepts //a Done channel func JustAfterEach(body interface{}, timeout ...float64) bool { - globalSuite.PushJustAfterEachNode(body, codelocation.New(1), parseTimeout(timeout...)) + global.Suite.PushJustAfterEachNode(body, codelocation.New(1), parseTimeout(timeout...)) return true } @@ -611,13 +604,13 @@ func JustAfterEach(body interface{}, timeout ...float64) bool { //Like It blocks, AfterEach blocks can be made asynchronous by providing a body function that accepts //a Done channel func AfterEach(body interface{}, timeout ...float64) bool { - globalSuite.PushAfterEachNode(body, codelocation.New(1), parseTimeout(timeout...)) + global.Suite.PushAfterEachNode(body, codelocation.New(1), parseTimeout(timeout...)) return true } func parseTimeout(timeout ...float64) time.Duration { if len(timeout) == 0 { - return time.Duration(defaultTimeout * int64(time.Second)) + return global.DefaultTimeout } else { return time.Duration(timeout[0] * float64(time.Second)) } diff --git a/vendor/github.com/onsi/ginkgo/go.mod b/vendor/github.com/onsi/ginkgo/go.mod index 15a4ab571b..1f71252280 100644 --- a/vendor/github.com/onsi/ginkgo/go.mod +++ b/vendor/github.com/onsi/ginkgo/go.mod @@ -1,9 +1,11 @@ module github.com/onsi/ginkgo require ( - github.com/hpcloud/tail v1.0.0 - github.com/onsi/gomega v1.7.1 - golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e + github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/nxadm/tail v1.4.4 + github.com/onsi/gomega v1.10.1 + golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 + golang.org/x/text v0.3.2 // indirect ) -go 1.12 +go 1.13 diff --git a/vendor/github.com/onsi/ginkgo/go.sum b/vendor/github.com/onsi/ginkgo/go.sum index 29adce41a5..2b774f3e82 100644 --- a/vendor/github.com/onsi/ginkgo/go.sum +++ b/vendor/github.com/onsi/ginkgo/go.sum @@ -1,21 +1,60 @@ github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +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= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/gomega v1.7.1 h1:K0jcRCwNQM3vFGh1ppMtDh/+7ApJrjldlX8fA0jDTLQ= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e h1:N7DeIrjYszNmSW409R3frPPwglRwMkXSBzwVbkOjLLA= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +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= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= @@ -24,3 +63,5 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/onsi/ginkgo/internal/global/init.go b/vendor/github.com/onsi/ginkgo/internal/global/init.go new file mode 100644 index 0000000000..109f617a5e --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/internal/global/init.go @@ -0,0 +1,22 @@ +package global + +import ( + "time" + + "github.com/onsi/ginkgo/internal/failer" + "github.com/onsi/ginkgo/internal/suite" +) + +const DefaultTimeout = time.Duration(1 * time.Second) + +var Suite *suite.Suite +var Failer *failer.Failer + +func init() { + InitializeGlobals() +} + +func InitializeGlobals() { + Failer = failer.New() + Suite = suite.New(Failer) +} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/aggregator.go b/vendor/github.com/onsi/ginkgo/internal/remote/aggregator.go index f9ab300675..992437d9e0 100644 --- a/vendor/github.com/onsi/ginkgo/internal/remote/aggregator.go +++ b/vendor/github.com/onsi/ginkgo/internal/remote/aggregator.go @@ -197,11 +197,11 @@ func (aggregator *Aggregator) announceSpec(specSummary *types.SpecSummary) { switch specSummary.State { case types.SpecStatePassed: if specSummary.IsMeasurement { - aggregator.stenographer.AnnounceSuccesfulMeasurement(specSummary, aggregator.config.Succinct) + aggregator.stenographer.AnnounceSuccessfulMeasurement(specSummary, aggregator.config.Succinct) } else if specSummary.RunTime.Seconds() >= aggregator.config.SlowSpecThreshold { - aggregator.stenographer.AnnounceSuccesfulSlowSpec(specSummary, aggregator.config.Succinct) + aggregator.stenographer.AnnounceSuccessfulSlowSpec(specSummary, aggregator.config.Succinct) } else { - aggregator.stenographer.AnnounceSuccesfulSpec(specSummary) + aggregator.stenographer.AnnounceSuccessfulSpec(specSummary) } case types.SpecStatePending: diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_darwin.go b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_darwin.go new file mode 100644 index 0000000000..e3d09eadb8 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_darwin.go @@ -0,0 +1,11 @@ +// +build darwin + +package remote + +import ( + "golang.org/x/sys/unix" +) + +func interceptorDupx(oldfd int, newfd int) { + unix.Dup2(oldfd, newfd) +} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_dragonfly.go b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_dragonfly.go new file mode 100644 index 0000000000..72d38686a0 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_dragonfly.go @@ -0,0 +1,11 @@ +// +build dragonfly + +package remote + +import ( + "golang.org/x/sys/unix" +) + +func interceptorDupx(oldfd int, newfd int) { + unix.Dup2(oldfd, newfd) +} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_freebsd.go b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_freebsd.go new file mode 100644 index 0000000000..497d548d99 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_freebsd.go @@ -0,0 +1,11 @@ +// +build freebsd + +package remote + +import ( + "golang.org/x/sys/unix" +) + +func interceptorDupx(oldfd int, newfd int) { + unix.Dup2(oldfd, newfd) +} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_linux.go b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_linux.go new file mode 100644 index 0000000000..29add0d330 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_linux.go @@ -0,0 +1,12 @@ +// +build linux +// +build !mips64le + +package remote + +import ( + "golang.org/x/sys/unix" +) + +func interceptorDupx(oldfd int, newfd int) { + unix.Dup2(oldfd, newfd) +} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_linux_mips64le.go b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_linux_mips64le.go new file mode 100644 index 0000000000..09bd062606 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_linux_mips64le.go @@ -0,0 +1,12 @@ +// +build linux +// +build mips64le + +package remote + +import ( + "golang.org/x/sys/unix" +) + +func interceptorDupx(oldfd int, newfd int) { + unix.Dup3(oldfd, newfd, 0) +} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_netbsd.go b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_netbsd.go new file mode 100644 index 0000000000..16ad6aeb29 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_netbsd.go @@ -0,0 +1,11 @@ +// +build netbsd + +package remote + +import ( + "golang.org/x/sys/unix" +) + +func interceptorDupx(oldfd int, newfd int) { + unix.Dup2(oldfd, newfd) +} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_openbsd.go b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_openbsd.go new file mode 100644 index 0000000000..4275f84210 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_openbsd.go @@ -0,0 +1,11 @@ +// +build openbsd + +package remote + +import ( + "golang.org/x/sys/unix" +) + +func interceptorDupx(oldfd int, newfd int) { + unix.Dup2(oldfd, newfd) +} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_solaris.go b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_solaris.go new file mode 100644 index 0000000000..882a38a9e0 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_solaris.go @@ -0,0 +1,11 @@ +// +build solaris + +package remote + +import ( + "golang.org/x/sys/unix" +) + +func interceptorDupx(oldfd int, newfd int) { + unix.Dup2(oldfd, newfd) +} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_unix.go b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_unix.go index ab6622a29c..80614d0ce5 100644 --- a/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_unix.go +++ b/vendor/github.com/onsi/ginkgo/internal/remote/output_interceptor_unix.go @@ -7,7 +7,7 @@ import ( "io/ioutil" "os" - "github.com/hpcloud/tail" + "github.com/nxadm/tail" ) func NewOutputInterceptor() OutputInterceptor { @@ -35,12 +35,8 @@ func (interceptor *outputInterceptor) StartInterceptingOutput() error { return err } - // Call a function in ./syscall_dup_*.go - // If building for everything other than linux_arm64, - // use a "normal" syscall.Dup2(oldfd, newfd) call. If building for linux_arm64 (which doesn't have syscall.Dup2) - // call syscall.Dup3(oldfd, newfd, 0). They are nearly identical, see: http://linux.die.net/man/2/dup3 - syscallDup(int(interceptor.redirectFile.Fd()), 1) - syscallDup(int(interceptor.redirectFile.Fd()), 2) + interceptorDupx(int(interceptor.redirectFile.Fd()), 1) + interceptorDupx(int(interceptor.redirectFile.Fd()), 2) if interceptor.streamTarget != nil { interceptor.tailer, _ = tail.TailFile(interceptor.redirectFile.Name(), tail.Config{Follow: true}) diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_linux_arm64.go b/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_linux_arm64.go deleted file mode 100644 index 9550d37b36..0000000000 --- a/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_linux_arm64.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build linux,arm64 - -package remote - -import "syscall" - -// linux_arm64 doesn't have syscall.Dup2 which ginkgo uses, so -// use the nearly identical syscall.Dup3 instead -func syscallDup(oldfd int, newfd int) (err error) { - return syscall.Dup3(oldfd, newfd, 0) -} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_linux_riscv64.go b/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_linux_riscv64.go deleted file mode 100644 index 0d40f0a541..0000000000 --- a/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_linux_riscv64.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build linux,riscv64 - -package remote - -import "syscall" - -// linux_riscv64 doesn't have syscall.Dup2 which ginkgo uses, so -// use the nearly identical syscall.Dup3 instead -func syscallDup(oldfd int, newfd int) (err error) { - return syscall.Dup3(oldfd, newfd, 0) -} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_solaris.go b/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_solaris.go deleted file mode 100644 index 75ef7fb78e..0000000000 --- a/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_solaris.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build solaris - -package remote - -import "golang.org/x/sys/unix" - -func syscallDup(oldfd int, newfd int) (err error) { - return unix.Dup2(oldfd, newfd) -} diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_unix.go b/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_unix.go deleted file mode 100644 index 981aa74664..0000000000 --- a/vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_unix.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !linux !arm64 -// +build !linux !riscv64 -// +build !windows -// +build !solaris - -package remote - -import "syscall" - -func syscallDup(oldfd int, newfd int) (err error) { - return syscall.Dup2(oldfd, newfd) -} diff --git a/vendor/github.com/onsi/ginkgo/internal/suite/suite.go b/vendor/github.com/onsi/ginkgo/internal/suite/suite.go index 3104bbc88c..e75da1f896 100644 --- a/vendor/github.com/onsi/ginkgo/internal/suite/suite.go +++ b/vendor/github.com/onsi/ginkgo/internal/suite/suite.go @@ -22,25 +22,37 @@ type ginkgoTestingT interface { Fail() } +type deferredContainerNode struct { + text string + body func() + flag types.FlagType + codeLocation types.CodeLocation +} + type Suite struct { topLevelContainer *containernode.ContainerNode currentContainer *containernode.ContainerNode - containerIndex int - beforeSuiteNode leafnodes.SuiteNode - afterSuiteNode leafnodes.SuiteNode - runner *specrunner.SpecRunner - failer *failer.Failer - running bool + + deferredContainerNodes []deferredContainerNode + + containerIndex int + beforeSuiteNode leafnodes.SuiteNode + afterSuiteNode leafnodes.SuiteNode + runner *specrunner.SpecRunner + failer *failer.Failer + running bool + expandTopLevelNodes bool } func New(failer *failer.Failer) *Suite { topLevelContainer := containernode.New("[Top Level]", types.FlagTypeNone, types.CodeLocation{}) return &Suite{ - topLevelContainer: topLevelContainer, - currentContainer: topLevelContainer, - failer: failer, - containerIndex: 1, + topLevelContainer: topLevelContainer, + currentContainer: topLevelContainer, + failer: failer, + containerIndex: 1, + deferredContainerNodes: []deferredContainerNode{}, } } @@ -53,6 +65,11 @@ func (suite *Suite) Run(t ginkgoTestingT, description string, reporters []report panic("ginkgo.parallel.node is one-indexed and must be <= ginkgo.parallel.total") } + suite.expandTopLevelNodes = true + for _, deferredNode := range suite.deferredContainerNodes { + suite.PushContainerNode(deferredNode.text, deferredNode.body, deferredNode.flag, deferredNode.codeLocation) + } + r := rand.New(rand.NewSource(config.RandomSeed)) suite.topLevelContainer.Shuffle(r) iterator, hasProgrammaticFocus := suite.generateSpecsIterator(description, config) @@ -102,6 +119,9 @@ func (suite *Suite) generateSpecsIterator(description string, config config.Gink } func (suite *Suite) CurrentRunningSpecSummary() (*types.SpecSummary, bool) { + if !suite.running { + return nil, false + } return suite.runner.CurrentSpecSummary() } @@ -134,6 +154,23 @@ func (suite *Suite) SetSynchronizedAfterSuiteNode(bodyA interface{}, bodyB inter } func (suite *Suite) PushContainerNode(text string, body func(), flag types.FlagType, codeLocation types.CodeLocation) { + /* + We defer walking the container nodes (which immediately evaluates the `body` function) + until `RunSpecs` is called. We do this by storing off the deferred container nodes. Then, when + `RunSpecs` is called we actually go through and add the container nodes to the test structure. + + This allows us to defer calling all the `body` functions until _after_ the top level functions + have been walked, _after_ func init()s have been called, and _after_ `go test` has called `flag.Parse()`. + + This allows users to load up configuration information in the `TestX` go test hook just before `RunSpecs` + is invoked and solves issues like #693 and makes the lifecycle easier to reason about. + + */ + if !suite.expandTopLevelNodes { + suite.deferredContainerNodes = append(suite.deferredContainerNodes, deferredContainerNode{text, body, flag, codeLocation}) + return + } + container := containernode.New(text, flag, codeLocation) suite.currentContainer.PushContainerNode(container) diff --git a/vendor/github.com/onsi/ginkgo/reporters/default_reporter.go b/vendor/github.com/onsi/ginkgo/reporters/default_reporter.go index c76283b46e..f0c9f61410 100644 --- a/vendor/github.com/onsi/ginkgo/reporters/default_reporter.go +++ b/vendor/github.com/onsi/ginkgo/reporters/default_reporter.go @@ -57,11 +57,11 @@ func (reporter *DefaultReporter) SpecDidComplete(specSummary *types.SpecSummary) switch specSummary.State { case types.SpecStatePassed: if specSummary.IsMeasurement { - reporter.stenographer.AnnounceSuccesfulMeasurement(specSummary, reporter.config.Succinct) + reporter.stenographer.AnnounceSuccessfulMeasurement(specSummary, reporter.config.Succinct) } else if specSummary.RunTime.Seconds() >= reporter.config.SlowSpecThreshold { - reporter.stenographer.AnnounceSuccesfulSlowSpec(specSummary, reporter.config.Succinct) + reporter.stenographer.AnnounceSuccessfulSlowSpec(specSummary, reporter.config.Succinct) } else { - reporter.stenographer.AnnounceSuccesfulSpec(specSummary) + reporter.stenographer.AnnounceSuccessfulSpec(specSummary) if reporter.config.ReportPassed { reporter.stenographer.AnnounceCapturedOutput(specSummary.CapturedOutput) } diff --git a/vendor/github.com/onsi/ginkgo/reporters/junit_reporter.go b/vendor/github.com/onsi/ginkgo/reporters/junit_reporter.go index d76e2fe77d..963caaaff1 100644 --- a/vendor/github.com/onsi/ginkgo/reporters/junit_reporter.go +++ b/vendor/github.com/onsi/ginkgo/reporters/junit_reporter.go @@ -50,7 +50,7 @@ type JUnitFailureMessage struct { } type JUnitSkipped struct { - XMLName xml.Name `xml:"skipped"` + Message string `xml:",chardata"` } type JUnitReporter struct { @@ -132,6 +132,9 @@ func (reporter *JUnitReporter) SpecDidComplete(specSummary *types.SpecSummary) { } if specSummary.State == types.SpecStateSkipped || specSummary.State == types.SpecStatePending { testCase.Skipped = &JUnitSkipped{} + if specSummary.Failure.Message != "" { + testCase.Skipped.Message = failureMessage(specSummary.Failure) + } } testCase.Time = specSummary.RunTime.Seconds() reporter.suite.TestCases = append(reporter.suite.TestCases, testCase) diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/fake_stenographer.go b/vendor/github.com/onsi/ginkgo/reporters/stenographer/fake_stenographer.go index 98854e7d9a..1aa5b9db0f 100644 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/fake_stenographer.go +++ b/vendor/github.com/onsi/ginkgo/reporters/stenographer/fake_stenographer.go @@ -105,16 +105,16 @@ func (stenographer *FakeStenographer) AnnounceCapturedOutput(output string) { stenographer.registerCall("AnnounceCapturedOutput", output) } -func (stenographer *FakeStenographer) AnnounceSuccesfulSpec(spec *types.SpecSummary) { - stenographer.registerCall("AnnounceSuccesfulSpec", spec) +func (stenographer *FakeStenographer) AnnounceSuccessfulSpec(spec *types.SpecSummary) { + stenographer.registerCall("AnnounceSuccessfulSpec", spec) } -func (stenographer *FakeStenographer) AnnounceSuccesfulSlowSpec(spec *types.SpecSummary, succinct bool) { - stenographer.registerCall("AnnounceSuccesfulSlowSpec", spec, succinct) +func (stenographer *FakeStenographer) AnnounceSuccessfulSlowSpec(spec *types.SpecSummary, succinct bool) { + stenographer.registerCall("AnnounceSuccessfulSlowSpec", spec, succinct) } -func (stenographer *FakeStenographer) AnnounceSuccesfulMeasurement(spec *types.SpecSummary, succinct bool) { - stenographer.registerCall("AnnounceSuccesfulMeasurement", spec, succinct) +func (stenographer *FakeStenographer) AnnounceSuccessfulMeasurement(spec *types.SpecSummary, succinct bool) { + stenographer.registerCall("AnnounceSuccessfulMeasurement", spec, succinct) } func (stenographer *FakeStenographer) AnnouncePendingSpec(spec *types.SpecSummary, noisy bool) { diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/stenographer.go b/vendor/github.com/onsi/ginkgo/reporters/stenographer/stenographer.go index 601c74d66e..638d6fbb1a 100644 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/stenographer.go +++ b/vendor/github.com/onsi/ginkgo/reporters/stenographer/stenographer.go @@ -47,9 +47,9 @@ type Stenographer interface { AnnounceCapturedOutput(output string) - AnnounceSuccesfulSpec(spec *types.SpecSummary) - AnnounceSuccesfulSlowSpec(spec *types.SpecSummary, succinct bool) - AnnounceSuccesfulMeasurement(spec *types.SpecSummary, succinct bool) + AnnounceSuccessfulSpec(spec *types.SpecSummary) + AnnounceSuccessfulSlowSpec(spec *types.SpecSummary, succinct bool) + AnnounceSuccessfulMeasurement(spec *types.SpecSummary, succinct bool) AnnouncePendingSpec(spec *types.SpecSummary, noisy bool) AnnounceSkippedSpec(spec *types.SpecSummary, succinct bool, fullTrace bool) @@ -245,12 +245,12 @@ func (s *consoleStenographer) AnnounceCapturedOutput(output string) { s.midBlock() } -func (s *consoleStenographer) AnnounceSuccesfulSpec(spec *types.SpecSummary) { +func (s *consoleStenographer) AnnounceSuccessfulSpec(spec *types.SpecSummary) { s.print(0, s.colorize(greenColor, s.denoter)) s.stream() } -func (s *consoleStenographer) AnnounceSuccesfulSlowSpec(spec *types.SpecSummary, succinct bool) { +func (s *consoleStenographer) AnnounceSuccessfulSlowSpec(spec *types.SpecSummary, succinct bool) { s.printBlockWithMessage( s.colorize(greenColor, "%s [SLOW TEST:%.3f seconds]", s.denoter, spec.RunTime.Seconds()), "", @@ -259,7 +259,7 @@ func (s *consoleStenographer) AnnounceSuccesfulSlowSpec(spec *types.SpecSummary, ) } -func (s *consoleStenographer) AnnounceSuccesfulMeasurement(spec *types.SpecSummary, succinct bool) { +func (s *consoleStenographer) AnnounceSuccessfulMeasurement(spec *types.SpecSummary, succinct bool) { s.printBlockWithMessage( s.colorize(greenColor, "%s [MEASUREMENT]", s.denoter), s.measurementReport(spec, succinct), diff --git a/vendor/github.com/onsi/gomega/.travis.yml b/vendor/github.com/onsi/gomega/.travis.yml index c6391855a2..072fdd2db3 100644 --- a/vendor/github.com/onsi/gomega/.travis.yml +++ b/vendor/github.com/onsi/gomega/.travis.yml @@ -1,8 +1,8 @@ language: go go: - - 1.12.x - 1.13.x + - 1.14.x - gotip env: diff --git a/vendor/github.com/onsi/gomega/CHANGELOG.md b/vendor/github.com/onsi/gomega/CHANGELOG.md index 3e9b5961b4..0b6c2fb612 100644 --- a/vendor/github.com/onsi/gomega/CHANGELOG.md +++ b/vendor/github.com/onsi/gomega/CHANGELOG.md @@ -1,3 +1,21 @@ +## 1.10.2 + +### Fixes +- Add ExpectWithOffset, EventuallyWithOffset and ConsistentlyWithOffset to WithT (#391) [990941a] + +## 1.10.1 + +### Fixes +- Update dependencies (#389) [9f5eecd] + +## 1.10.0 + +### Features +- Add HaveHTTPStatusMatcher (#378) [f335c94] +- Changed matcher for content-type in VerifyJSONRepresenting (#377) [6024f5b] +- Make ghttp usable with x-unit style tests (#376) [c0be499] +- Implement PanicWith matcher (#381) [f8032b4] + ## 1.9.0 ### Features diff --git a/vendor/github.com/onsi/gomega/go.mod b/vendor/github.com/onsi/gomega/go.mod index 1eb0dfa682..7789351417 100644 --- a/vendor/github.com/onsi/gomega/go.mod +++ b/vendor/github.com/onsi/gomega/go.mod @@ -1,17 +1,9 @@ module github.com/onsi/gomega require ( - github.com/fsnotify/fsnotify v1.4.7 // indirect - github.com/golang/protobuf v1.2.0 - github.com/hpcloud/tail v1.0.0 // indirect - github.com/onsi/ginkgo v1.6.0 - golang.org/x/net v0.0.0-20180906233101-161cd47e91fd - golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f // indirect - golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e // indirect - golang.org/x/text v0.3.0 // indirect - golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 - gopkg.in/fsnotify.v1 v1.4.7 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.2.4 + github.com/golang/protobuf v1.4.2 + github.com/onsi/ginkgo v1.12.1 + golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 + golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 + gopkg.in/yaml.v2 v2.3.0 ) - diff --git a/vendor/github.com/onsi/gomega/go.sum b/vendor/github.com/onsi/gomega/go.sum index b872e8a0df..610b09beef 100644 --- a/vendor/github.com/onsi/gomega/go.sum +++ b/vendor/github.com/onsi/gomega/go.sum @@ -2,20 +2,52 @@ github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +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= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e h1:N7DeIrjYszNmSW409R3frPPwglRwMkXSBzwVbkOjLLA= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +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= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= @@ -24,3 +56,5 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/onsi/gomega/gomega_dsl.go b/vendor/github.com/onsi/gomega/gomega_dsl.go index 0ab35bc7a7..b416d20ccf 100644 --- a/vendor/github.com/onsi/gomega/gomega_dsl.go +++ b/vendor/github.com/onsi/gomega/gomega_dsl.go @@ -24,7 +24,7 @@ import ( "github.com/onsi/gomega/types" ) -const GOMEGA_VERSION = "1.9.0" +const GOMEGA_VERSION = "1.10.2" const nilFailHandlerPanic = `You are trying to make an assertion, but Gomega's fail handler is nil. If you're using Ginkgo then you probably forgot to put your assertion in an It(). @@ -252,7 +252,7 @@ func Consistently(actual interface{}, intervals ...interface{}) AsyncAssertion { return ConsistentlyWithOffset(0, actual, intervals...) } -// ConsistentlyWithOffset operates like Consistnetly but takes an additional +// ConsistentlyWithOffset operates like Consistently but takes an additional // initial argument to indicate an offset in the call stack. This is useful when building helper // functions that contain matchers. To learn more, read about `ExpectWithOffset`. func ConsistentlyWithOffset(offset int, actual interface{}, intervals ...interface{}) AsyncAssertion { @@ -376,13 +376,13 @@ func NewGomegaWithT(t types.GomegaTestingT) *GomegaWithT { return NewWithT(t) } -// Expect is used to make assertions. See documentation for Expect. -func (g *WithT) Expect(actual interface{}, extra ...interface{}) Assertion { - return assertion.New(actual, testingtsupport.BuildTestingTGomegaFailWrapper(g.t), 0, extra...) +// ExpectWithOffset is used to make assertions. See documentation for ExpectWithOffset. +func (g *WithT) ExpectWithOffset(offset int, actual interface{}, extra ...interface{}) Assertion { + return assertion.New(actual, testingtsupport.BuildTestingTGomegaFailWrapper(g.t), offset, extra...) } -// Eventually is used to make asynchronous assertions. See documentation for Eventually. -func (g *WithT) Eventually(actual interface{}, intervals ...interface{}) AsyncAssertion { +// EventuallyWithOffset is used to make asynchronous assertions. See documentation for EventuallyWithOffset. +func (g *WithT) EventuallyWithOffset(offset int, actual interface{}, intervals ...interface{}) AsyncAssertion { timeoutInterval := defaultEventuallyTimeout pollingInterval := defaultEventuallyPollingInterval if len(intervals) > 0 { @@ -391,11 +391,11 @@ func (g *WithT) Eventually(actual interface{}, intervals ...interface{}) AsyncAs if len(intervals) > 1 { pollingInterval = toDuration(intervals[1]) } - return asyncassertion.New(asyncassertion.AsyncAssertionTypeEventually, actual, testingtsupport.BuildTestingTGomegaFailWrapper(g.t), timeoutInterval, pollingInterval, 0) + return asyncassertion.New(asyncassertion.AsyncAssertionTypeEventually, actual, testingtsupport.BuildTestingTGomegaFailWrapper(g.t), timeoutInterval, pollingInterval, offset) } -// Consistently is used to make asynchronous assertions. See documentation for Consistently. -func (g *WithT) Consistently(actual interface{}, intervals ...interface{}) AsyncAssertion { +// ConsistentlyWithOffset is used to make asynchronous assertions. See documentation for ConsistentlyWithOffset. +func (g *WithT) ConsistentlyWithOffset(offset int, actual interface{}, intervals ...interface{}) AsyncAssertion { timeoutInterval := defaultConsistentlyDuration pollingInterval := defaultConsistentlyPollingInterval if len(intervals) > 0 { @@ -404,7 +404,22 @@ func (g *WithT) Consistently(actual interface{}, intervals ...interface{}) Async if len(intervals) > 1 { pollingInterval = toDuration(intervals[1]) } - return asyncassertion.New(asyncassertion.AsyncAssertionTypeConsistently, actual, testingtsupport.BuildTestingTGomegaFailWrapper(g.t), timeoutInterval, pollingInterval, 0) + return asyncassertion.New(asyncassertion.AsyncAssertionTypeConsistently, actual, testingtsupport.BuildTestingTGomegaFailWrapper(g.t), timeoutInterval, pollingInterval, offset) +} + +// Expect is used to make assertions. See documentation for Expect. +func (g *WithT) Expect(actual interface{}, extra ...interface{}) Assertion { + return g.ExpectWithOffset(0, actual, extra...) +} + +// Eventually is used to make asynchronous assertions. See documentation for Eventually. +func (g *WithT) Eventually(actual interface{}, intervals ...interface{}) AsyncAssertion { + return g.EventuallyWithOffset(0, actual, intervals...) +} + +// Consistently is used to make asynchronous assertions. See documentation for Consistently. +func (g *WithT) Consistently(actual interface{}, intervals ...interface{}) AsyncAssertion { + return g.ConsistentlyWithOffset(0, actual, intervals...) } func toDuration(input interface{}) time.Duration { @@ -432,3 +447,32 @@ func toDuration(input interface{}) time.Duration { panic(fmt.Sprintf("%v is not a valid interval. Must be time.Duration, parsable duration string or a number.", input)) } + +// Gomega describes the essential Gomega DSL. This interface allows libraries +// to abstract between the standard package-level function implementations +// and alternatives like *WithT. +type Gomega interface { + Expect(actual interface{}, extra ...interface{}) Assertion + Eventually(actual interface{}, intervals ...interface{}) AsyncAssertion + Consistently(actual interface{}, intervals ...interface{}) AsyncAssertion +} + +type globalFailHandlerGomega struct{} + +// DefaultGomega supplies the standard package-level implementation +var Default Gomega = globalFailHandlerGomega{} + +// Expect is used to make assertions. See documentation for Expect. +func (globalFailHandlerGomega) Expect(actual interface{}, extra ...interface{}) Assertion { + return Expect(actual, extra...) +} + +// Eventually is used to make asynchronous assertions. See documentation for Eventually. +func (globalFailHandlerGomega) Eventually(actual interface{}, extra ...interface{}) AsyncAssertion { + return Eventually(actual, extra...) +} + +// Consistently is used to make asynchronous assertions. See documentation for Consistently. +func (globalFailHandlerGomega) Consistently(actual interface{}, extra ...interface{}) AsyncAssertion { + return Consistently(actual, extra...) +} diff --git a/vendor/github.com/onsi/gomega/matchers.go b/vendor/github.com/onsi/gomega/matchers.go index 11f5b10700..16218d4c52 100644 --- a/vendor/github.com/onsi/gomega/matchers.go +++ b/vendor/github.com/onsi/gomega/matchers.go @@ -390,6 +390,16 @@ func Panic() types.GomegaMatcher { return &matchers.PanicMatcher{} } +//PanicWith succeeds if actual is a function that, when invoked, panics with a specific value. +//Actual must be a function that takes no arguments and returns no results. +// +//By default PanicWith uses Equal() to perform the match, however a +//matcher can be passed in instead: +// Expect(fn).Should(PanicWith(MatchRegexp(`.+Foo$`))) +func PanicWith(expected interface{}) types.GomegaMatcher { + return &matchers.PanicMatcher{Expected: expected} +} + //BeAnExistingFile succeeds if a file exists. //Actual must be a string representing the abs path to the file being checked. func BeAnExistingFile() types.GomegaMatcher { @@ -408,6 +418,15 @@ func BeADirectory() types.GomegaMatcher { return &matchers.BeADirectoryMatcher{} } +//HaveHTTPStatus succeeds if the Status or StatusCode field of an HTTP response matches. +//Actual must be either a *http.Response or *httptest.ResponseRecorder. +//Expected must be either an int or a string. +// Expect(resp).Should(HaveHTTPStatus(http.StatusOK)) // asserts that resp.StatusCode == 200 +// Expect(resp).Should(HaveHTTPStatus("404 Not Found")) // asserts that resp.Status == "404 Not Found" +func HaveHTTPStatus(expected interface{}) types.GomegaMatcher { + return &matchers.HaveHTTPStatusMatcher{Expected: expected} +} + //And succeeds only if all of the given matchers succeed. //The matchers are tried in order, and will fail-fast if one doesn't succeed. // Expect("hi").To(And(HaveLen(2), Equal("hi")) diff --git a/vendor/github.com/onsi/gomega/matchers/have_http_status_matcher.go b/vendor/github.com/onsi/gomega/matchers/have_http_status_matcher.go new file mode 100644 index 0000000000..3ce4800b73 --- /dev/null +++ b/vendor/github.com/onsi/gomega/matchers/have_http_status_matcher.go @@ -0,0 +1,42 @@ +package matchers + +import ( + "fmt" + "net/http" + "net/http/httptest" + + "github.com/onsi/gomega/format" +) + +type HaveHTTPStatusMatcher struct { + Expected interface{} +} + +func (matcher *HaveHTTPStatusMatcher) Match(actual interface{}) (success bool, err error) { + var resp *http.Response + switch a := actual.(type) { + case *http.Response: + resp = a + case *httptest.ResponseRecorder: + resp = a.Result() + default: + return false, fmt.Errorf("HaveHTTPStatus matcher expects *http.Response or *httptest.ResponseRecorder. Got:\n%s", format.Object(actual, 1)) + } + + switch e := matcher.Expected.(type) { + case int: + return resp.StatusCode == e, nil + case string: + return resp.Status == e, nil + } + + return false, fmt.Errorf("HaveHTTPStatus matcher must be passed an int or a string. Got:\n%s", format.Object(matcher.Expected, 1)) +} + +func (matcher *HaveHTTPStatusMatcher) FailureMessage(actual interface{}) (message string) { + return format.Message(actual, "to have HTTP status", matcher.Expected) +} + +func (matcher *HaveHTTPStatusMatcher) NegatedFailureMessage(actual interface{}) (message string) { + return format.Message(actual, "not to have HTTP status", matcher.Expected) +} diff --git a/vendor/github.com/onsi/gomega/matchers/panic_matcher.go b/vendor/github.com/onsi/gomega/matchers/panic_matcher.go index 640f4db1a3..adc8cee630 100644 --- a/vendor/github.com/onsi/gomega/matchers/panic_matcher.go +++ b/vendor/github.com/onsi/gomega/matchers/panic_matcher.go @@ -8,7 +8,8 @@ import ( ) type PanicMatcher struct { - object interface{} + Expected interface{} + object interface{} } func (matcher *PanicMatcher) Match(actual interface{}) (success bool, err error) { @@ -28,7 +29,21 @@ func (matcher *PanicMatcher) Match(actual interface{}) (success bool, err error) defer func() { if e := recover(); e != nil { matcher.object = e - success = true + + if matcher.Expected == nil { + success = true + return + } + + valueMatcher, valueIsMatcher := matcher.Expected.(omegaMatcher) + if !valueIsMatcher { + valueMatcher = &EqualMatcher{Expected: matcher.Expected} + } + + success, err = valueMatcher.Match(e) + if err != nil { + err = fmt.Errorf("PanicMatcher's value matcher failed with:\n%s%s", format.Indent, err.Error()) + } } }() @@ -38,9 +53,62 @@ func (matcher *PanicMatcher) Match(actual interface{}) (success bool, err error) } func (matcher *PanicMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, "to panic") + if matcher.Expected == nil { + // We wanted any panic to occur, but none did. + return format.Message(actual, "to panic") + } + + if matcher.object == nil { + // We wanted a panic with a specific value to occur, but none did. + switch matcher.Expected.(type) { + case omegaMatcher: + return format.Message(actual, "to panic with a value matching", matcher.Expected) + default: + return format.Message(actual, "to panic with", matcher.Expected) + } + } + + // We got a panic, but the value isn't what we expected. + switch matcher.Expected.(type) { + case omegaMatcher: + return format.Message( + actual, + fmt.Sprintf( + "to panic with a value matching\n%s\nbut panicked with\n%s", + format.Object(matcher.Expected, 1), + format.Object(matcher.object, 1), + ), + ) + default: + return format.Message( + actual, + fmt.Sprintf( + "to panic with\n%s\nbut panicked with\n%s", + format.Object(matcher.Expected, 1), + format.Object(matcher.object, 1), + ), + ) + } } func (matcher *PanicMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, fmt.Sprintf("not to panic, but panicked with\n%s", format.Object(matcher.object, 1))) + if matcher.Expected == nil { + // We didn't want any panic to occur, but one did. + return format.Message(actual, fmt.Sprintf("not to panic, but panicked with\n%s", format.Object(matcher.object, 1))) + } + + // We wanted a to ensure a panic with a specific value did not occur, but it did. + switch matcher.Expected.(type) { + case omegaMatcher: + return format.Message( + actual, + fmt.Sprintf( + "not to panic with a value matching\n%s\nbut panicked with\n%s", + format.Object(matcher.Expected, 1), + format.Object(matcher.object, 1), + ), + ) + default: + return format.Message(actual, "not to panic with", matcher.Expected) + } } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/user/MAINTAINERS b/vendor/github.com/opencontainers/runc/libcontainer/user/MAINTAINERS deleted file mode 100644 index edbe200669..0000000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/user/MAINTAINERS +++ /dev/null @@ -1,2 +0,0 @@ -Tianon Gravi (@tianon) -Aleksa Sarai (@cyphar) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/user/lookup.go b/vendor/github.com/opencontainers/runc/libcontainer/user/lookup.go deleted file mode 100644 index ab1439f361..0000000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/user/lookup.go +++ /dev/null @@ -1,110 +0,0 @@ -package user - -import ( - "errors" - "syscall" -) - -var ( - // The current operating system does not provide the required data for user lookups. - ErrUnsupported = errors.New("user lookup: operating system does not provide passwd-formatted data") - // No matching entries found in file. - ErrNoPasswdEntries = errors.New("no matching entries in passwd file") - ErrNoGroupEntries = errors.New("no matching entries in group file") -) - -func lookupUser(filter func(u User) bool) (User, error) { - // Get operating system-specific passwd reader-closer. - passwd, err := GetPasswd() - if err != nil { - return User{}, err - } - defer passwd.Close() - - // Get the users. - users, err := ParsePasswdFilter(passwd, filter) - if err != nil { - return User{}, err - } - - // No user entries found. - if len(users) == 0 { - return User{}, ErrNoPasswdEntries - } - - // Assume the first entry is the "correct" one. - return users[0], nil -} - -// CurrentUser looks up the current user by their user id in /etc/passwd. If the -// user cannot be found (or there is no /etc/passwd file on the filesystem), -// then CurrentUser returns an error. -func CurrentUser() (User, error) { - return LookupUid(syscall.Getuid()) -} - -// LookupUser looks up a user by their username in /etc/passwd. If the user -// cannot be found (or there is no /etc/passwd file on the filesystem), then -// LookupUser returns an error. -func LookupUser(username string) (User, error) { - return lookupUser(func(u User) bool { - return u.Name == username - }) -} - -// LookupUid looks up a user by their user id in /etc/passwd. If the user cannot -// be found (or there is no /etc/passwd file on the filesystem), then LookupId -// returns an error. -func LookupUid(uid int) (User, error) { - return lookupUser(func(u User) bool { - return u.Uid == uid - }) -} - -func lookupGroup(filter func(g Group) bool) (Group, error) { - // Get operating system-specific group reader-closer. - group, err := GetGroup() - if err != nil { - return Group{}, err - } - defer group.Close() - - // Get the users. - groups, err := ParseGroupFilter(group, filter) - if err != nil { - return Group{}, err - } - - // No user entries found. - if len(groups) == 0 { - return Group{}, ErrNoGroupEntries - } - - // Assume the first entry is the "correct" one. - return groups[0], nil -} - -// CurrentGroup looks up the current user's group by their primary group id's -// entry in /etc/passwd. If the group cannot be found (or there is no -// /etc/group file on the filesystem), then CurrentGroup returns an error. -func CurrentGroup() (Group, error) { - return LookupGid(syscall.Getgid()) -} - -// LookupGroup looks up a group by its name in /etc/group. If the group cannot -// be found (or there is no /etc/group file on the filesystem), then LookupGroup -// returns an error. -func LookupGroup(groupname string) (Group, error) { - return lookupGroup(func(g Group) bool { - return g.Name == groupname - }) -} - -// LookupGid looks up a group by its group id in /etc/group. If the group cannot -// be found (or there is no /etc/group file on the filesystem), then LookupGid -// returns an error. -func LookupGid(gid int) (Group, error) { - return lookupGroup(func(g Group) bool { - return g.Gid == gid - }) -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/user/lookup_unix.go b/vendor/github.com/opencontainers/runc/libcontainer/user/lookup_unix.go deleted file mode 100644 index 758b734c22..0000000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/user/lookup_unix.go +++ /dev/null @@ -1,30 +0,0 @@ -// +build darwin dragonfly freebsd linux netbsd openbsd solaris - -package user - -import ( - "io" - "os" -) - -// Unix-specific path to the passwd and group formatted files. -const ( - unixPasswdPath = "/etc/passwd" - unixGroupPath = "/etc/group" -) - -func GetPasswdPath() (string, error) { - return unixPasswdPath, nil -} - -func GetPasswd() (io.ReadCloser, error) { - return os.Open(unixPasswdPath) -} - -func GetGroupPath() (string, error) { - return unixGroupPath, nil -} - -func GetGroup() (io.ReadCloser, error) { - return os.Open(unixGroupPath) -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/user/lookup_unsupported.go b/vendor/github.com/opencontainers/runc/libcontainer/user/lookup_unsupported.go deleted file mode 100644 index 7217948870..0000000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/user/lookup_unsupported.go +++ /dev/null @@ -1,21 +0,0 @@ -// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris - -package user - -import "io" - -func GetPasswdPath() (string, error) { - return "", ErrUnsupported -} - -func GetPasswd() (io.ReadCloser, error) { - return nil, ErrUnsupported -} - -func GetGroupPath() (string, error) { - return "", ErrUnsupported -} - -func GetGroup() (io.ReadCloser, error) { - return nil, ErrUnsupported -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/user/user.go b/vendor/github.com/opencontainers/runc/libcontainer/user/user.go deleted file mode 100644 index 43fd39ef54..0000000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/user/user.go +++ /dev/null @@ -1,441 +0,0 @@ -package user - -import ( - "bufio" - "fmt" - "io" - "os" - "strconv" - "strings" -) - -const ( - minId = 0 - maxId = 1<<31 - 1 //for 32-bit systems compatibility -) - -var ( - ErrRange = fmt.Errorf("uids and gids must be in range %d-%d", minId, maxId) -) - -type User struct { - Name string - Pass string - Uid int - Gid int - Gecos string - Home string - Shell string -} - -type Group struct { - Name string - Pass string - Gid int - List []string -} - -func parseLine(line string, v ...interface{}) { - if line == "" { - return - } - - parts := strings.Split(line, ":") - for i, p := range parts { - // Ignore cases where we don't have enough fields to populate the arguments. - // Some configuration files like to misbehave. - if len(v) <= i { - break - } - - // Use the type of the argument to figure out how to parse it, scanf() style. - // This is legit. - switch e := v[i].(type) { - case *string: - *e = p - case *int: - // "numbers", with conversion errors ignored because of some misbehaving configuration files. - *e, _ = strconv.Atoi(p) - case *[]string: - // Comma-separated lists. - if p != "" { - *e = strings.Split(p, ",") - } else { - *e = []string{} - } - default: - // Someone goof'd when writing code using this function. Scream so they can hear us. - panic(fmt.Sprintf("parseLine only accepts {*string, *int, *[]string} as arguments! %#v is not a pointer!", e)) - } - } -} - -func ParsePasswdFile(path string) ([]User, error) { - passwd, err := os.Open(path) - if err != nil { - return nil, err - } - defer passwd.Close() - return ParsePasswd(passwd) -} - -func ParsePasswd(passwd io.Reader) ([]User, error) { - return ParsePasswdFilter(passwd, nil) -} - -func ParsePasswdFileFilter(path string, filter func(User) bool) ([]User, error) { - passwd, err := os.Open(path) - if err != nil { - return nil, err - } - defer passwd.Close() - return ParsePasswdFilter(passwd, filter) -} - -func ParsePasswdFilter(r io.Reader, filter func(User) bool) ([]User, error) { - if r == nil { - return nil, fmt.Errorf("nil source for passwd-formatted data") - } - - var ( - s = bufio.NewScanner(r) - out = []User{} - ) - - for s.Scan() { - if err := s.Err(); err != nil { - return nil, err - } - - line := strings.TrimSpace(s.Text()) - if line == "" { - continue - } - - // see: man 5 passwd - // name:password:UID:GID:GECOS:directory:shell - // Name:Pass:Uid:Gid:Gecos:Home:Shell - // root:x:0:0:root:/root:/bin/bash - // adm:x:3:4:adm:/var/adm:/bin/false - p := User{} - parseLine(line, &p.Name, &p.Pass, &p.Uid, &p.Gid, &p.Gecos, &p.Home, &p.Shell) - - if filter == nil || filter(p) { - out = append(out, p) - } - } - - return out, nil -} - -func ParseGroupFile(path string) ([]Group, error) { - group, err := os.Open(path) - if err != nil { - return nil, err - } - - defer group.Close() - return ParseGroup(group) -} - -func ParseGroup(group io.Reader) ([]Group, error) { - return ParseGroupFilter(group, nil) -} - -func ParseGroupFileFilter(path string, filter func(Group) bool) ([]Group, error) { - group, err := os.Open(path) - if err != nil { - return nil, err - } - defer group.Close() - return ParseGroupFilter(group, filter) -} - -func ParseGroupFilter(r io.Reader, filter func(Group) bool) ([]Group, error) { - if r == nil { - return nil, fmt.Errorf("nil source for group-formatted data") - } - - var ( - s = bufio.NewScanner(r) - out = []Group{} - ) - - for s.Scan() { - if err := s.Err(); err != nil { - return nil, err - } - - text := s.Text() - if text == "" { - continue - } - - // see: man 5 group - // group_name:password:GID:user_list - // Name:Pass:Gid:List - // root:x:0:root - // adm:x:4:root,adm,daemon - p := Group{} - parseLine(text, &p.Name, &p.Pass, &p.Gid, &p.List) - - if filter == nil || filter(p) { - out = append(out, p) - } - } - - return out, nil -} - -type ExecUser struct { - Uid int - Gid int - Sgids []int - Home string -} - -// GetExecUserPath is a wrapper for GetExecUser. It reads data from each of the -// given file paths and uses that data as the arguments to GetExecUser. If the -// files cannot be opened for any reason, the error is ignored and a nil -// io.Reader is passed instead. -func GetExecUserPath(userSpec string, defaults *ExecUser, passwdPath, groupPath string) (*ExecUser, error) { - passwd, err := os.Open(passwdPath) - if err != nil { - passwd = nil - } else { - defer passwd.Close() - } - - group, err := os.Open(groupPath) - if err != nil { - group = nil - } else { - defer group.Close() - } - - return GetExecUser(userSpec, defaults, passwd, group) -} - -// GetExecUser parses a user specification string (using the passwd and group -// readers as sources for /etc/passwd and /etc/group data, respectively). In -// the case of blank fields or missing data from the sources, the values in -// defaults is used. -// -// GetExecUser will return an error if a user or group literal could not be -// found in any entry in passwd and group respectively. -// -// Examples of valid user specifications are: -// * "" -// * "user" -// * "uid" -// * "user:group" -// * "uid:gid -// * "user:gid" -// * "uid:group" -// -// It should be noted that if you specify a numeric user or group id, they will -// not be evaluated as usernames (only the metadata will be filled). So attempting -// to parse a user with user.Name = "1337" will produce the user with a UID of -// 1337. -func GetExecUser(userSpec string, defaults *ExecUser, passwd, group io.Reader) (*ExecUser, error) { - if defaults == nil { - defaults = new(ExecUser) - } - - // Copy over defaults. - user := &ExecUser{ - Uid: defaults.Uid, - Gid: defaults.Gid, - Sgids: defaults.Sgids, - Home: defaults.Home, - } - - // Sgids slice *cannot* be nil. - if user.Sgids == nil { - user.Sgids = []int{} - } - - // Allow for userArg to have either "user" syntax, or optionally "user:group" syntax - var userArg, groupArg string - parseLine(userSpec, &userArg, &groupArg) - - // Convert userArg and groupArg to be numeric, so we don't have to execute - // Atoi *twice* for each iteration over lines. - uidArg, uidErr := strconv.Atoi(userArg) - gidArg, gidErr := strconv.Atoi(groupArg) - - // Find the matching user. - users, err := ParsePasswdFilter(passwd, func(u User) bool { - if userArg == "" { - // Default to current state of the user. - return u.Uid == user.Uid - } - - if uidErr == nil { - // If the userArg is numeric, always treat it as a UID. - return uidArg == u.Uid - } - - return u.Name == userArg - }) - - // If we can't find the user, we have to bail. - if err != nil && passwd != nil { - if userArg == "" { - userArg = strconv.Itoa(user.Uid) - } - return nil, fmt.Errorf("unable to find user %s: %v", userArg, err) - } - - var matchedUserName string - if len(users) > 0 { - // First match wins, even if there's more than one matching entry. - matchedUserName = users[0].Name - user.Uid = users[0].Uid - user.Gid = users[0].Gid - user.Home = users[0].Home - } else if userArg != "" { - // If we can't find a user with the given username, the only other valid - // option is if it's a numeric username with no associated entry in passwd. - - if uidErr != nil { - // Not numeric. - return nil, fmt.Errorf("unable to find user %s: %v", userArg, ErrNoPasswdEntries) - } - user.Uid = uidArg - - // Must be inside valid uid range. - if user.Uid < minId || user.Uid > maxId { - return nil, ErrRange - } - - // Okay, so it's numeric. We can just roll with this. - } - - // On to the groups. If we matched a username, we need to do this because of - // the supplementary group IDs. - if groupArg != "" || matchedUserName != "" { - groups, err := ParseGroupFilter(group, func(g Group) bool { - // If the group argument isn't explicit, we'll just search for it. - if groupArg == "" { - // Check if user is a member of this group. - for _, u := range g.List { - if u == matchedUserName { - return true - } - } - return false - } - - if gidErr == nil { - // If the groupArg is numeric, always treat it as a GID. - return gidArg == g.Gid - } - - return g.Name == groupArg - }) - if err != nil && group != nil { - return nil, fmt.Errorf("unable to find groups for spec %v: %v", matchedUserName, err) - } - - // Only start modifying user.Gid if it is in explicit form. - if groupArg != "" { - if len(groups) > 0 { - // First match wins, even if there's more than one matching entry. - user.Gid = groups[0].Gid - } else if groupArg != "" { - // If we can't find a group with the given name, the only other valid - // option is if it's a numeric group name with no associated entry in group. - - if gidErr != nil { - // Not numeric. - return nil, fmt.Errorf("unable to find group %s: %v", groupArg, ErrNoGroupEntries) - } - user.Gid = gidArg - - // Must be inside valid gid range. - if user.Gid < minId || user.Gid > maxId { - return nil, ErrRange - } - - // Okay, so it's numeric. We can just roll with this. - } - } else if len(groups) > 0 { - // Supplementary group ids only make sense if in the implicit form. - user.Sgids = make([]int, len(groups)) - for i, group := range groups { - user.Sgids[i] = group.Gid - } - } - } - - return user, nil -} - -// GetAdditionalGroups looks up a list of groups by name or group id -// against the given /etc/group formatted data. If a group name cannot -// be found, an error will be returned. If a group id cannot be found, -// or the given group data is nil, the id will be returned as-is -// provided it is in the legal range. -func GetAdditionalGroups(additionalGroups []string, group io.Reader) ([]int, error) { - var groups = []Group{} - if group != nil { - var err error - groups, err = ParseGroupFilter(group, func(g Group) bool { - for _, ag := range additionalGroups { - if g.Name == ag || strconv.Itoa(g.Gid) == ag { - return true - } - } - return false - }) - if err != nil { - return nil, fmt.Errorf("Unable to find additional groups %v: %v", additionalGroups, err) - } - } - - gidMap := make(map[int]struct{}) - for _, ag := range additionalGroups { - var found bool - for _, g := range groups { - // if we found a matched group either by name or gid, take the - // first matched as correct - if g.Name == ag || strconv.Itoa(g.Gid) == ag { - if _, ok := gidMap[g.Gid]; !ok { - gidMap[g.Gid] = struct{}{} - found = true - break - } - } - } - // we asked for a group but didn't find it. let's check to see - // if we wanted a numeric group - if !found { - gid, err := strconv.Atoi(ag) - if err != nil { - return nil, fmt.Errorf("Unable to find group %s", ag) - } - // Ensure gid is inside gid range. - if gid < minId || gid > maxId { - return nil, ErrRange - } - gidMap[gid] = struct{}{} - } - } - gids := []int{} - for gid := range gidMap { - gids = append(gids, gid) - } - return gids, nil -} - -// GetAdditionalGroupsPath is a wrapper around GetAdditionalGroups -// that opens the groupPath given and gives it as an argument to -// GetAdditionalGroups. -func GetAdditionalGroupsPath(additionalGroups []string, groupPath string) ([]int, error) { - group, err := os.Open(groupPath) - if err == nil { - defer group.Close() - } - return GetAdditionalGroups(additionalGroups, group) -} diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml index cd32b78919..06d4050417 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml @@ -2,197 +2,165 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: catalogsources.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: CatalogSource listKind: CatalogSourceList plural: catalogsources shortNames: - - catsrc + - catsrc singular: catalogsource scope: Namespaced versions: - - additionalPrinterColumns: - - description: The pretty name of the catalog - jsonPath: .spec.displayName - name: Display - type: string - - description: The type of the catalog - jsonPath: .spec.sourceType - name: Type - type: string - - description: The publisher of the catalog - jsonPath: .spec.publisher - name: Publisher - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: CatalogSource is a repository of CSVs, CRDs, and operator packages. - type: object - required: - - metadata - - 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: - type: object - required: - - sourceType - properties: - address: - description: 'Address is a host that OLM can use to connect to a pre-existing - registry. Format: : Only used when SourceType - = SourceTypeGrpc. Ignored when the Image field is set.' - type: string - configMap: - description: ConfigMap is the name of the ConfigMap to be used to - back a configmap-server registry. Only used when SourceType = SourceTypeConfigmap - or SourceTypeInternal. - type: string - description: - type: string - displayName: - description: Metadata - type: string - icon: - type: object - required: - - base64data - - mediatype - properties: - base64data: - type: string - mediatype: - type: string - image: - description: Image is an operator-registry container image to instantiate - a registry-server with. Only used when SourceType = SourceTypeGrpc. - If present, the address field is ignored. - type: string - priority: - description: 'Priority field assigns a weight to the catalog source - to prioritize them so that it can be consumed by the dependency - resolver. Usage: Higher weight indicates that this catalog source - is preferred over lower weighted catalog sources during dependency - resolution. The range of the priority value can go from positive - to negative in the range of int32. The default value to a catalog - source with unassigned priority would be 0. The catalog source with - the same priority values will be ranked lexicographically based - on its name.' - type: integer - publisher: - type: string - secrets: - description: Secrets represent set of secrets that can be used to - access the contents of the catalog. It is best to keep this list - small, since each will need to be tried for every catalog entry. - type: array - items: + - additionalPrinterColumns: + - description: The pretty name of the catalog + jsonPath: .spec.displayName + name: Display + type: string + - description: The type of the catalog + jsonPath: .spec.sourceType + name: Type + type: string + - description: The publisher of the catalog + jsonPath: .spec.publisher + name: Publisher + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: CatalogSource is a repository of CSVs, CRDs, and operator packages. + type: object + required: + - metadata + - 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: + type: object + required: + - sourceType + properties: + address: + description: 'Address is a host that OLM can use to connect to a pre-existing registry. Format: : Only used when SourceType = SourceTypeGrpc. Ignored when the Image field is set.' type: string - sourceType: - description: SourceType is the type of source - type: string - updateStrategy: - description: UpdateStrategy defines how updated catalog source images - can be discovered Consists of an interval that defines polling duration - and an embedded strategy type - type: object - properties: - registryPoll: - type: object - properties: - interval: - description: Interval is used to determine the time interval - between checks of the latest catalog source version. The - catalog operator polls to see if a new version of the catalog - source is available. If available, the latest image is pulled - and gRPC traffic is directed to the latest catalog source. - type: string - status: - type: object - properties: - configMapReference: - type: object - required: - - name - - namespace - properties: - lastUpdateTime: - type: string - format: date-time - name: - type: string - namespace: - type: string - resourceVersion: - type: string - uid: - description: UID is a type that holds unique ID values, including - UUIDs. Because we don't ONLY use UUIDs, this is an alias to - string. Being a type captures intent and helps make sure that - UIDs and names do not get conflated. - type: string - connectionState: - type: object - required: - - lastObservedState - properties: - address: - type: string - lastConnect: - type: string - format: date-time - lastObservedState: - type: string - latestImageRegistryPoll: - description: The last time the CatalogSource image registry has been - polled to ensure the image is up-to-date - type: string - format: date-time - message: - description: A human readable message indicating details about why - the CatalogSource is in this condition. - type: string - reason: - description: Reason is the reason the CatalogSource was transitioned - to its current state. - type: string - registryService: - type: object - properties: - createdAt: - type: string - format: date-time - port: - type: string - protocol: - type: string - serviceName: - type: string - serviceNamespace: + configMap: + description: ConfigMap is the name of the ConfigMap to be used to back a configmap-server registry. Only used when SourceType = SourceTypeConfigmap or SourceTypeInternal. + type: string + description: + type: string + displayName: + description: Metadata + type: string + icon: + type: object + required: + - base64data + - mediatype + properties: + base64data: + type: string + mediatype: + type: string + image: + description: Image is an operator-registry container image to instantiate a registry-server with. Only used when SourceType = SourceTypeGrpc. If present, the address field is ignored. + type: string + priority: + description: 'Priority field assigns a weight to the catalog source to prioritize them so that it can be consumed by the dependency resolver. Usage: Higher weight indicates that this catalog source is preferred over lower weighted catalog sources during dependency resolution. The range of the priority value can go from positive to negative in the range of int32. The default value to a catalog source with unassigned priority would be 0. The catalog source with the same priority values will be ranked lexicographically based on its name.' + type: integer + publisher: + type: string + secrets: + description: Secrets represent set of secrets that can be used to access the contents of the catalog. It is best to keep this list small, since each will need to be tried for every catalog entry. + type: array + items: type: string - served: true - storage: true - subresources: - status: {} + sourceType: + description: SourceType is the type of source + type: string + updateStrategy: + description: UpdateStrategy defines how updated catalog source images can be discovered Consists of an interval that defines polling duration and an embedded strategy type + type: object + properties: + registryPoll: + type: object + properties: + interval: + description: Interval is used to determine the time interval between checks of the latest catalog source version. The catalog operator polls to see if a new version of the catalog source is available. If available, the latest image is pulled and gRPC traffic is directed to the latest catalog source. + type: string + status: + type: object + properties: + configMapReference: + type: object + required: + - name + - namespace + properties: + lastUpdateTime: + type: string + format: date-time + name: + type: string + namespace: + type: string + resourceVersion: + type: string + uid: + description: UID is a type that holds unique ID values, including UUIDs. Because we don't ONLY use UUIDs, this is an alias to string. Being a type captures intent and helps make sure that UIDs and names do not get conflated. + type: string + connectionState: + type: object + required: + - lastObservedState + properties: + address: + type: string + lastConnect: + type: string + format: date-time + lastObservedState: + type: string + latestImageRegistryPoll: + description: The last time the CatalogSource image registry has been polled to ensure the image is up-to-date + type: string + format: date-time + message: + description: A human readable message indicating details about why the CatalogSource is in this condition. + type: string + reason: + description: Reason is the reason the CatalogSource was transitioned to its current state. + type: string + registryService: + type: object + properties: + createdAt: + type: string + format: date-time + port: + type: string + protocol: + type: string + serviceName: + type: string + serviceNamespace: + type: string + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_clusterserviceversions.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_clusterserviceversions.yaml index 6008cc0c32..1e5d355ed5 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_clusterserviceversions.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_clusterserviceversions.yaml @@ -2,9513 +2,4780 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: clusterserviceversions.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: ClusterServiceVersion listKind: ClusterServiceVersionList plural: clusterserviceversions shortNames: - - csv - - csvs + - csv + - csvs singular: clusterserviceversion scope: Namespaced versions: - - additionalPrinterColumns: - - description: The name of the CSV - jsonPath: .spec.displayName - name: Display - type: string - - description: The version of the CSV - jsonPath: .spec.version - name: Version - type: string - - description: The name of a CSV that this one replaces - jsonPath: .spec.replaces - name: Replaces - type: string - - jsonPath: .status.phase - name: Phase - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: ClusterServiceVersion is a Custom Resource of type `ClusterServiceVersionSpec`. - type: object - required: - - metadata - - 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: ClusterServiceVersionSpec declarations tell OLM how to install - an operator that can manage apps for a given version. - type: object - required: - - displayName - - install - properties: - annotations: - description: Annotations is an unstructured key value map stored with - a resource that may be set by external tools to store and retrieve - arbitrary metadata. - type: object - additionalProperties: + - additionalPrinterColumns: + - description: The name of the CSV + jsonPath: .spec.displayName + name: Display + type: string + - description: The version of the CSV + jsonPath: .spec.version + name: Version + type: string + - description: The name of a CSV that this one replaces + jsonPath: .spec.replaces + name: Replaces + type: string + - jsonPath: .status.phase + name: Phase + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: ClusterServiceVersion is a Custom Resource of type `ClusterServiceVersionSpec`. + type: object + required: + - metadata + - 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: ClusterServiceVersionSpec declarations tell OLM how to install an operator that can manage apps for a given version. + type: object + required: + - displayName + - install + properties: + annotations: + description: Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. + type: object + additionalProperties: + type: string + apiservicedefinitions: + description: APIServiceDefinitions declares all of the extension apis managed or required by an operator being ran by ClusterServiceVersion. + type: object + properties: + owned: + type: array + items: + description: APIServiceDescription provides details to OLM about apis provided via aggregation + type: object + required: + - group + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + containerPort: + type: integer + format: int32 + deploymentName: + type: string + description: + type: string + displayName: + type: string + group: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + required: + type: array + items: + description: APIServiceDescription provides details to OLM about apis provided via aggregation + type: object + required: + - group + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + containerPort: + type: integer + format: int32 + deploymentName: + type: string + description: + type: string + displayName: + type: string + group: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + customresourcedefinitions: + description: "CustomResourceDefinitions declares all of the CRDs managed or required by an operator being ran by ClusterServiceVersion. \n If the CRD is present in the Owned list, it is implicitly required." + type: object + properties: + owned: + type: array + items: + description: CRDDescription provides details to OLM about the CRDs + type: object + required: + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + description: + type: string + displayName: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + required: + type: array + items: + description: CRDDescription provides details to OLM about the CRDs + type: object + required: + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + description: + type: string + displayName: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + description: type: string - apiservicedefinitions: - description: APIServiceDefinitions declares all of the extension apis - managed or required by an operator being ran by ClusterServiceVersion. - type: object - properties: - owned: - type: array - items: - description: APIServiceDescription provides details to OLM about - apis provided via aggregation + displayName: + type: string + icon: + type: array + items: + type: object + required: + - base64data + - mediatype + properties: + base64data: + type: string + mediatype: + type: string + install: + description: NamedInstallStrategy represents the block of an ClusterServiceVersion resource where the install strategy is specified. + type: object + required: + - strategy + properties: + spec: + description: StrategyDetailsDeployment represents the parsed details of a Deployment InstallStrategy. type: object required: - - group - - kind - - name - - version + - deployments properties: - actionDescriptors: + clusterPermissions: type: array items: - description: ActionDescriptor describes a declarative - action that can be performed on a custom resource instance + description: StrategyDeploymentPermissions describe the rbac rules and service account needed by the install strategy type: object required: - - path + - rules + - serviceAccountName properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: + rules: type: array items: - type: string - containerPort: - type: integer - format: int32 - deploymentName: - type: string - description: - type: string - displayName: - type: string - group: - type: string - kind: - type: string - name: - type: string - resources: + description: PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to. + type: object + required: + - verbs + properties: + apiGroups: + description: APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. + type: array + items: + type: string + nonResourceURLs: + description: NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both. + type: array + items: + type: string + resourceNames: + description: ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. + type: array + items: + type: string + resources: + description: Resources is a list of resources this rule applies to. ResourceAll represents all resources. + type: array + items: + type: string + verbs: + description: Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds. + type: array + items: + type: string + serviceAccountName: + type: string + deployments: type: array items: - description: APIResourceReference is a Kubernetes resource - type used by a custom resource + description: StrategyDeploymentSpec contains the name, spec and labels for the deployment ALM should create type: object required: - - kind - - name - - version + - name + - spec properties: - kind: - type: string - name: - type: string - version: - type: string - specDescriptors: - type: array - items: - description: SpecDescriptor describes a field in a spec - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - statusDescriptors: - type: array - items: - description: StatusDescriptor describes a field in a status - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - version: - type: string - required: - type: array - items: - description: APIServiceDescription provides details to OLM about - apis provided via aggregation - type: object - required: - - group - - kind - - name - - version - properties: - actionDescriptors: - type: array - items: - description: ActionDescriptor describes a declarative - action that can be performed on a custom resource instance - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - containerPort: - type: integer - format: int32 - deploymentName: - type: string - description: - type: string - displayName: - type: string - group: - type: string - kind: - type: string - name: - type: string - resources: - type: array - items: - description: APIResourceReference is a Kubernetes resource - type used by a custom resource - type: object - required: - - kind - - name - - version - properties: - kind: - type: string - name: - type: string - version: - type: string - specDescriptors: - type: array - items: - description: SpecDescriptor describes a field in a spec - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - statusDescriptors: - type: array - items: - description: StatusDescriptor describes a field in a status - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - version: - type: string - customresourcedefinitions: - description: "CustomResourceDefinitions declares all of the CRDs managed - or required by an operator being ran by ClusterServiceVersion. \n - If the CRD is present in the Owned list, it is implicitly required." - type: object - properties: - owned: - type: array - items: - description: CRDDescription provides details to OLM about the - CRDs - type: object - required: - - kind - - name - - version - properties: - actionDescriptors: - type: array - items: - description: ActionDescriptor describes a declarative - action that can be performed on a custom resource instance - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - description: - type: string - displayName: - type: string - kind: - type: string - name: - type: string - resources: - type: array - items: - description: APIResourceReference is a Kubernetes resource - type used by a custom resource - type: object - required: - - kind - - name - - version - properties: - kind: - type: string - name: - type: string - version: - type: string - specDescriptors: - type: array - items: - description: SpecDescriptor describes a field in a spec - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - statusDescriptors: - type: array - items: - description: StatusDescriptor describes a field in a status - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - version: - type: string - required: - type: array - items: - description: CRDDescription provides details to OLM about the - CRDs - type: object - required: - - kind - - name - - version - properties: - actionDescriptors: - type: array - items: - description: ActionDescriptor describes a declarative - action that can be performed on a custom resource instance - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: + label: + description: Set is a map of label:value. It implements Labels. + type: object + additionalProperties: type: string - description: - type: string - displayName: - type: string - kind: - type: string - name: - type: string - resources: - type: array - items: - description: APIResourceReference is a Kubernetes resource - type used by a custom resource - type: object - required: - - kind - - name - - version - properties: - kind: - type: string name: type: string - version: - type: string - specDescriptors: - type: array - items: - description: SpecDescriptor describes a field in a spec - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - statusDescriptors: - type: array - items: - description: StatusDescriptor describes a field in a status - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - version: - type: string - description: - type: string - displayName: - type: string - icon: - type: array - items: - type: object - required: - - base64data - - mediatype - properties: - base64data: - type: string - mediatype: - type: string - install: - description: NamedInstallStrategy represents the block of an ClusterServiceVersion - resource where the install strategy is specified. - type: object - required: - - strategy - properties: - spec: - description: StrategyDetailsDeployment represents the parsed details - of a Deployment InstallStrategy. - type: object - required: - - deployments - properties: - clusterPermissions: - type: array - items: - description: StrategyDeploymentPermissions describe the - rbac rules and service account needed by the install strategy - type: object - required: - - rules - - serviceAccountName - properties: - rules: - type: array - items: - description: PolicyRule holds information that describes - a policy rule, but does not contain information - about who the rule applies to or which namespace - the rule applies to. + spec: + description: DeploymentSpec is the specification of the desired behavior of the Deployment. type: object required: - - verbs + - selector + - template properties: - apiGroups: - description: APIGroups is the name of the APIGroup - that contains the resources. If multiple API - groups are specified, any action requested against - one of the enumerated resources in any API group - will be allowed. - type: array - items: - type: string - nonResourceURLs: - description: NonResourceURLs is a set of partial - urls that a user should have access to. *s - are allowed, but only as the full, final step - in the path Since non-resource URLs are not - namespaced, this field is only applicable for - ClusterRoles referenced from a ClusterRoleBinding. - Rules can either apply to API resources (such - as "pods" or "secrets") or non-resource URL - paths (such as "/api"), but not both. - type: array - items: - type: string - resourceNames: - description: ResourceNames is an optional white - list of names that the rule applies to. An - empty set means that everything is allowed. - type: array - items: - type: string - resources: - description: Resources is a list of resources - this rule applies to. ResourceAll represents - all resources. - type: array - items: - type: string - verbs: - description: Verbs is a list of Verbs that apply - to ALL the ResourceKinds and AttributeRestrictions - contained in this rule. VerbAll represents - all kinds. - type: array - items: - type: string - serviceAccountName: - type: string - deployments: - type: array - items: - description: StrategyDeploymentSpec contains the name, spec - and labels for the deployment ALM should create - type: object - required: - - name - - spec - properties: - label: - description: Set is a map of label:value. It implements - Labels. - type: object - additionalProperties: - type: string - name: - type: string - spec: - description: DeploymentSpec is the specification of - the desired behavior of the Deployment. - type: object - required: - - selector - - template - properties: - minReadySeconds: - description: Minimum number of seconds for which - a newly created pod should be ready without any - of its container crashing, for it to be considered - available. Defaults to 0 (pod will be considered - available as soon as it is ready) - type: integer - format: int32 - paused: - description: Indicates that the deployment is paused. - type: boolean - progressDeadlineSeconds: - description: The maximum time in seconds for a deployment - to make progress before it is considered to be - failed. The deployment controller will continue - to process failed deployments and a condition - with a ProgressDeadlineExceeded reason will be - surfaced in the deployment status. Note that progress - will not be estimated during the time a deployment - is paused. Defaults to 600s. - type: integer - format: int32 - replicas: - description: Number of desired pods. This is a pointer - to distinguish between explicit zero and not specified. - Defaults to 1. - type: integer - format: int32 - revisionHistoryLimit: - description: The number of old ReplicaSets to retain - to allow rollback. This is a pointer to distinguish - between explicit zero and not specified. Defaults - to 10. - type: integer - format: int32 - selector: - description: Label selector for pods. Existing ReplicaSets - whose pods are selected by this will be the ones - affected by this deployment. It must match the - pod template's labels. - 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. + minReadySeconds: + description: Minimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready) + type: integer + format: int32 + paused: + description: Indicates that the deployment is paused. + type: boolean + progressDeadlineSeconds: + description: The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s. + type: integer + format: int32 + replicas: + description: Number of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1. + type: integer + format: int32 + revisionHistoryLimit: + description: The number of old ReplicaSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 10. + type: integer + format: int32 + selector: + description: Label selector for pods. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment. It must match the pod template's labels. + 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 + strategy: + description: The deployment strategy to use to replace existing pods with new ones. + type: object + properties: + rollingUpdate: + description: 'Rolling update config params. Present only if DeploymentStrategyType = RollingUpdate. --- TODO: Update this to follow our convention for oneOf, whatever we decide it to be.' 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: + maxSurge: + description: 'The maximum number of pods that can be scheduled above the desired number of pods. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 25%. Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when the rolling update starts, such that the total number of old and new pods do not exceed 130% of desired pods. Once old pods have been killed, new ReplicaSet can be scaled up further, ensuring that total number of pods running at any time during the update is at most 130% of desired pods.' + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + maxUnavailable: + description: 'The maximum number of pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 25%. Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods immediately when the rolling update starts. Once new pods are ready, old ReplicaSet can be scaled down further, followed by scaling up the new ReplicaSet, ensuring that the total number of pods available at all times during the update is at least 70% of desired pods.' + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + type: + description: Type of deployment. Can be "Recreate" or "RollingUpdate". Default is RollingUpdate. type: string - strategy: - description: The deployment strategy to use to replace - existing pods with new ones. - type: object - properties: - rollingUpdate: - description: 'Rolling update config params. - Present only if DeploymentStrategyType = RollingUpdate. - --- TODO: Update this to follow our convention - for oneOf, whatever we decide it to be.' - type: object - properties: - maxSurge: - description: 'The maximum number of pods - that can be scheduled above the desired - number of pods. Value can be an absolute - number (ex: 5) or a percentage of desired - pods (ex: 10%). This can not be 0 if MaxUnavailable - is 0. Absolute number is calculated from - percentage by rounding up. Defaults to - 25%. Example: when this is set to 30%, - the new ReplicaSet can be scaled up immediately - when the rolling update starts, such that - the total number of old and new pods do - not exceed 130% of desired pods. Once - old pods have been killed, new ReplicaSet - can be scaled up further, ensuring that - total number of pods running at any time - during the update is at most 130% of desired - pods.' - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - maxUnavailable: - description: 'The maximum number of pods - that can be unavailable during the update. - Value can be an absolute number (ex: 5) - or a percentage of desired pods (ex: 10%). - Absolute number is calculated from percentage - by rounding down. This can not be 0 if - MaxSurge is 0. Defaults to 25%. Example: - when this is set to 30%, the old ReplicaSet - can be scaled down to 70% of desired pods - immediately when the rolling update starts. - Once new pods are ready, old ReplicaSet - can be scaled down further, followed by - scaling up the new ReplicaSet, ensuring - that the total number of pods available - at all times during the update is at least - 70% of desired pods.' - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - type: - description: Type of deployment. Can be "Recreate" - or "RollingUpdate". Default is RollingUpdate. - type: string - template: - description: Template describes the pods that will - be created. - type: object - properties: - metadata: - description: 'Standard object''s metadata. More - info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - type: object - x-kubernetes-preserve-unknown-fields: true - spec: - description: 'Specification of the desired behavior - of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' - type: object - required: - - containers - properties: - activeDeadlineSeconds: - description: Optional duration in seconds - the pod may be active on the node relative - to StartTime before the system will actively - try to mark it failed and kill associated - containers. Value must be a positive integer. - type: integer - format: int64 - affinity: - description: If specified, the pod's scheduling - constraints - type: object - properties: - nodeAffinity: - description: Describes node affinity - scheduling rules for the pod. - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will - prefer to schedule pods to nodes - that satisfy the affinity expressions - specified by this field, but it - may choose a node that violates - one or more of the expressions. - The node that is most preferred - is the one with the greatest sum - of weights, i.e. for each node - that meets all of the scheduling - requirements (resource request, - requiredDuringScheduling affinity - expressions, etc.), compute a - sum by iterating through the elements - of this field and adding "weight" - to the sum if the node matches - the corresponding matchExpressions; - the node(s) with the highest sum - are the most preferred. - type: array - items: - description: An empty preferred - scheduling term matches all - objects with implicit weight - 0 (i.e. it's a no-op). A null - preferred scheduling term matches - no objects (i.e. is also a no-op). + template: + description: Template describes the pods that will be created. + type: object + properties: + metadata: + description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' + type: object + x-kubernetes-preserve-unknown-fields: true + spec: + description: 'Specification of the desired behavior of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' + type: object + required: + - containers + properties: + activeDeadlineSeconds: + description: Optional duration in seconds the pod may be active on the node relative to StartTime before the system will actively try to mark it failed and kill associated containers. Value must be a positive integer. + type: integer + format: int64 + affinity: + description: If specified, the pod's scheduling constraints + type: object + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for the pod. + type: object + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. + type: array + items: + description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). + type: object + required: + - preference + - weight + properties: + preference: + description: A node selector term, associated with the corresponding weight. + type: object + properties: + matchExpressions: + description: A list of node selector requirements by node's labels. + type: array + items: + description: A node 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: The label key that the selector applies to. + type: string + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: 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. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchFields: + description: A list of node selector requirements by node's fields. + type: array + items: + description: A node 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: The label key that the selector applies to. + type: string + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: 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. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + weight: + description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. + type: integer + format: int32 + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. type: object required: - - preference - - weight + - nodeSelectorTerms properties: - preference: - description: A node selector - term, associated with the - corresponding weight. - type: object - properties: - matchExpressions: - description: A list of - node selector requirements - by node's labels. - type: array - items: - description: A node - 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: The - label key that - the selector applies - to. - type: string - operator: - description: Represents - a key's relationship - to a set of values. - Valid operators - are In, NotIn, - Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: 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. - If the operator - is Gt or Lt, the - values array must - have a single - element, which - will be interpreted - as an integer. - This array is - replaced during - a strategic merge - patch. - type: array - items: + nodeSelectorTerms: + description: Required. A list of node selector terms. The terms are ORed. + type: array + items: + description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements by node's labels. + type: array + items: + description: A node 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: The label key that the selector applies to. type: string - matchFields: - description: A list of - node selector requirements - by node's fields. - type: array - items: - description: A node - 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: The - label key that - the selector applies - to. - type: string - operator: - description: Represents - a key's relationship - to a set of values. - Valid operators - are In, NotIn, - Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: 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. - If the operator - is Gt or Lt, the - values array must - have a single - element, which - will be interpreted - as an integer. - This array is - replaced during - a strategic merge - patch. - type: array - items: + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. type: string - weight: - description: Weight associated - with matching the corresponding - nodeSelectorTerm, in the - range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements - specified by this field are not - met at scheduling time, the pod - will not be scheduled onto the - node. If the affinity requirements - specified by this field cease - to be met at some point during - pod execution (e.g. due to an - update), the system may or may - not try to eventually evict the - pod from its node. - type: object - required: - - nodeSelectorTerms - properties: - nodeSelectorTerms: - description: Required. A list - of node selector terms. The - terms are ORed. - type: array - items: - description: A null or empty - node selector term matches - no objects. The requirements - of them are ANDed. The TopologySelectorTerm - type implements a subset - of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of - node selector requirements - by node's labels. - type: array - items: - description: A node - 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: The - label key that - the selector applies - to. - type: string - operator: - description: Represents - a key's relationship - to a set of values. - Valid operators - are In, NotIn, - Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: 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. - If the operator - is Gt or Lt, the - values array must - have a single - element, which - will be interpreted - as an integer. - This array is - replaced during - a strategic merge - patch. - type: array - items: + values: + description: 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. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchFields: + description: A list of node selector requirements by node's fields. + type: array + items: + description: A node 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: The label key that the selector applies to. type: string - matchFields: - description: A list of - node selector requirements - by node's fields. - type: array - items: - description: A node - selector requirement - is a selector that - contains values, a - key, and an operator - that relates the key - and values. + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: 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. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + podAffinity: + description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). + type: object + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) + type: object + required: + - podAffinityTerm + - weight + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated with the corresponding weight. + type: object + required: + - topologyKey + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. type: object - required: - - key - - operator properties: - key: - description: The - label key that - the selector applies - to. - type: string - operator: - description: Represents - a key's relationship - to a set of values. - Valid operators - are In, NotIn, - Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: 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. - If the operator - is Gt or Lt, the - values array must - have a single - element, which - will be interpreted - as an integer. - This array is - replaced during - a strategic merge - patch. + 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 - podAffinity: - description: Describes pod affinity - scheduling rules (e.g. co-locate this - pod in the same node, zone, etc. as - some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will - prefer to schedule pods to nodes - that satisfy the affinity expressions - specified by this field, but it - may choose a node that violates - one or more of the expressions. - The node that is most preferred - is the one with the greatest sum - of weights, i.e. for each node - that meets all of the scheduling - requirements (resource request, - requiredDuringScheduling affinity - expressions, etc.), compute a - sum by iterating through the elements - of this field and adding "weight" - to the sum if the node has pods - which matches the corresponding - podAffinityTerm; the node(s) with - the highest sum are the most preferred. - type: array - items: - description: The weights of all - of the matched WeightedPodAffinityTerm - fields are added per-node to - find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod - affinity term, associated - with the corresponding weight. - type: object - required: + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: + type: string + topologyKey: + description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. + type: string + weight: + description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. + type: integer + format: int32 + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running + type: object + required: - topologyKey - properties: - labelSelector: - description: A label query - over a set of resources, - in this case pods. - 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: + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. + 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. + 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 - 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 - namespaces: - description: namespaces - specifies which namespaces - the labelSelector applies - to (matches against); - null or empty list means - "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod - should be co-located - (affinity) or not co-located - (anti-affinity) with - the pods matching the - labelSelector in the - specified namespaces, - where co-located is - defined as running on - a node whose value of - the label with key topologyKey - matches that of any - node on which any of - the selected pods is - running. Empty topologyKey - is not allowed. + 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 + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: type: string - weight: - description: weight associated - with matching the corresponding - podAffinityTerm, in the - range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements - specified by this field are not - met at scheduling time, the pod - will not be scheduled onto the - node. If the affinity requirements - specified by this field cease - to be met at some point during - pod execution (e.g. due to a pod - label update), the system may - or may not try to eventually evict - the pod from its node. When there - are multiple elements, the lists - of nodes corresponding to each - podAffinityTerm are intersected, - i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of - pods (namely those matching - the labelSelector relative to - the given namespace(s)) that - this pod should be co-located - (affinity) or not co-located - (anti-affinity) with, where - co-located is defined as running - on a node whose value of the - label with key - matches that of any node on - which a pod of the set of pods - is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query - over a set of resources, - in this case pods. - 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. + topologyKey: + description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. + type: string + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). + type: object + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) + type: object + required: + - podAffinityTerm + - weight + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated with the corresponding weight. + type: object + required: + - topologyKey + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. 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. + 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 - 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: + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: + type: string + topologyKey: + description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. type: string - namespaces: - description: namespaces specifies - which namespaces the labelSelector - applies to (matches against); - null or empty list means - "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should - be co-located (affinity) - or not co-located (anti-affinity) - with the pods matching the - labelSelector in the specified - namespaces, where co-located - is defined as running on - a node whose value of the - label with key topologyKey - matches that of any node - on which any of the selected - pods is running. Empty topologyKey - is not allowed. - type: string - podAntiAffinity: - description: Describes pod anti-affinity - scheduling rules (e.g. avoid putting - this pod in the same node, zone, etc. - as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will - prefer to schedule pods to nodes - that satisfy the anti-affinity - expressions specified by this - field, but it may choose a node - that violates one or more of the - expressions. The node that is - most preferred is the one with - the greatest sum of weights, i.e. - for each node that meets all of - the scheduling requirements (resource - request, requiredDuringScheduling - anti-affinity expressions, etc.), - compute a sum by iterating through - the elements of this field and - adding "weight" to the sum if - the node has pods which matches - the corresponding podAffinityTerm; - the node(s) with the highest sum - are the most preferred. - type: array - items: - description: The weights of all - of the matched WeightedPodAffinityTerm - fields are added per-node to - find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod - affinity term, associated - with the corresponding weight. - type: object - required: + weight: + description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. + type: integer + format: int32 + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running + type: object + required: - topologyKey - properties: - labelSelector: - description: A label query - over a set of resources, - in this case pods. - 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: + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. + 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. + 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 - 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 - namespaces: - description: namespaces - specifies which namespaces - the labelSelector applies - to (matches against); - null or empty list means - "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod - should be co-located - (affinity) or not co-located - (anti-affinity) with - the pods matching the - labelSelector in the - specified namespaces, - where co-located is - defined as running on - a node whose value of - the label with key topologyKey - matches that of any - node on which any of - the selected pods is - running. Empty topologyKey - is not allowed. + 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 + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: type: string - weight: - description: weight associated - with matching the corresponding - podAffinityTerm, in the - range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity - requirements specified by this - field are not met at scheduling - time, the pod will not be scheduled - onto the node. If the anti-affinity - requirements specified by this - field cease to be met at some - point during pod execution (e.g. - due to a pod label update), the - system may or may not try to eventually - evict the pod from its node. When - there are multiple elements, the - lists of nodes corresponding to - each podAffinityTerm are intersected, - i.e. all terms must be satisfied. + topologyKey: + description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. + type: string + automountServiceAccountToken: + description: AutomountServiceAccountToken indicates whether a service account token should be automatically mounted. + type: boolean + containers: + description: List of containers belonging to the pod. Containers cannot currently be added or removed. There must be at least one container in a Pod. Cannot be updated. + type: array + items: + description: A single application container that you want to run within a pod. + type: object + required: + - name + properties: + args: + description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + command: + description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + env: + description: List of environment variables to set in the container. Cannot be updated. type: array items: - description: Defines a set of - pods (namely those matching - the labelSelector relative to - the given namespace(s)) that - this pod should be co-located - (affinity) or not co-located - (anti-affinity) with, where - co-located is defined as running - on a node whose value of the - label with key - matches that of any node on - which a pod of the set of pods - is running + description: EnvVar represents an environment variable present in a Container. type: object required: - - topologyKey + - name properties: - labelSelector: - description: A label query - over a set of resources, - in this case pods. + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded using the previous 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. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(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: - 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: + configMapKeyRef: + description: Selects a key of a ConfigMap. + 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. + 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 + 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 - additionalProperties: - type: string - namespaces: - description: namespaces specifies - which namespaces the labelSelector - applies to (matches against); - null or empty list means - "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should - be co-located (affinity) - or not co-located (anti-affinity) - with the pods matching the - labelSelector in the specified - namespaces, where co-located - is defined as running on - a node whose value of the - label with key topologyKey - matches that of any node - on which any of the selected - pods is running. Empty topologyKey - is not allowed. + 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 + 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 + 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 + envFrom: + description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps + type: object + properties: + configMapRef: + description: The ConfigMap to select from + type: object + properties: + 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 must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. type: string - automountServiceAccountToken: - description: AutomountServiceAccountToken - indicates whether a service account token - should be automatically mounted. - type: boolean - containers: - description: List of containers belonging - to the pod. Containers cannot currently - be added or removed. There must be at - least one container in a Pod. Cannot be - updated. - type: array - items: - description: A single application container - that you want to run within a pod. - type: object - required: - - name - properties: - args: - description: 'Arguments to the entrypoint. - The docker image''s CMD is used - if this is not provided. Variable - references $(VAR_NAME) are expanded - using the container''s environment. - If a variable cannot be resolved, - the reference in the input string - will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless - of whether the variable exists or - not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + secretRef: + description: The Secret to select from + type: object + properties: + 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 must be defined + type: boolean + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.' type: string - command: - description: 'Entrypoint array. Not - executed within a shell. The docker - image''s ENTRYPOINT is used if this - is not provided. Variable references - $(VAR_NAME) are expanded using the - container''s environment. If a variable - cannot be resolved, the reference - in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped - with a double $$, ie: $$(VAR_NAME). - Escaped references will never be - expanded, regardless of whether - the variable exists or not. Cannot - be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string - env: - description: List of environment variables - to set in the container. Cannot - be updated. - type: array - items: - description: EnvVar represents an - environment variable present in - a Container. + lifecycle: + description: Actions that the management system should take in response to container lifecycle events. Cannot be updated. 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 previous 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. The $(VAR_NAME) - syntax can be escaped with - a double $$, ie: $$(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. + postStart: + description: 'PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' type: object properties: - configMapKeyRef: - description: Selects a key - of a ConfigMap. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - key + - port properties: - key: - description: The key - to select. + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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?' + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - optional: - description: Specify - whether the ConfigMap - or its key must be - defined - type: boolean - 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.' + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - fieldPath + - port 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. + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - 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.' + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + preStop: + description: 'PreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod''s termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod''s termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - resource + - port properties: - containerName: - description: 'Container - name: required for - volumes, optional - for env vars' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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]+))))?$ + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - resource: - description: 'Required: - resource to select' + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - secretKeyRef: - description: Selects a key - of a secret in the pod's - namespace + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - key + - port 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?' + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - optional: - description: Specify - whether the Secret - or its key must be - defined - type: boolean - envFrom: - description: List of sources to populate - environment variables in the container. - The keys defined within a source - must be a C_IDENTIFIER. All invalid - keys will be reported as an event - when the container is starting. - When a key exists in multiple sources, - the value associated with the last - source will take precedence. Values - defined by an Env with a duplicate - key will take precedence. Cannot - be updated. - type: array - items: - description: EnvFromSource represents - the source of a set of ConfigMaps + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + livenessProbe: + description: 'Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: object properties: - configMapRef: - description: The ConfigMap to - select from + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. type: object properties: - 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 must be - defined - type: boolean - prefix: - description: An optional identifier - to prepend to each key in - the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select - from + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. type: object + required: + - port properties: - 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?' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - optional: - description: Specify whether - the Secret must be defined - type: boolean - image: - description: 'Docker image name. More - info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow - higher level config management to - default or override container images - in workload controllers like Deployments - and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One - of Always, Never, IfNotPresent. - Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - lifecycle: - description: Actions that the management - system should take in response to - container lifecycle events. Cannot - be updated. - type: object - properties: - postStart: - description: 'PostStart is called - immediately after a container - is created. If the handler fails, - the container is terminated - and restarted according to its - restart policy. Other management - of the container blocks until - the hook completes. More info: - https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - preStop: - description: 'PreStop is called - immediately before a container - is terminated due to an API - request or management event - such as liveness/startup probe - failure, preemption, resource - contention, etc. The handler - is not called if the container - crashes or exits. The reason - for termination is passed to - the handler. The Pod''s termination - grace period countdown begins - before the PreStop hooked is - executed. Regardless of the - outcome of the handler, the - container will eventually terminate - within the Pod''s termination - grace period. Other management - of the container blocks until - the hook completes or until - the termination grace period - is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: - name - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: - type: integer - type: string - x-kubernetes-int-or-string: true - livenessProbe: - description: 'Periodic probe of container - liveness. Container will be restarted - if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - name: - description: Name of the container - specified as a DNS_LABEL. Each container - in a pod must have a unique name - (DNS_LABEL). Cannot be updated. - type: string - ports: - description: List of ports to expose - from the container. Exposing a port - here gives the system additional - information about the network connections - a container uses, but is primarily - informational. Not specifying a - port here DOES NOT prevent that - port from being exposed. Any port - which is listening on the default - "0.0.0.0" address inside a container - will be accessible from the network. - Cannot be updated. - type: array - items: - description: ContainerPort represents - a network port in a single container. - type: object - required: - - containerPort - properties: - containerPort: - description: Number of port - to expose on the pod's IP - address. This must be a valid - port number, 0 < x < 65536. + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: integer format: int32 - hostIP: - description: What host IP to - bind the external port to. - type: string - hostPort: - description: Number of port - to expose on the host. If - specified, this must be a - valid port number, 0 < x < - 65536. If HostNetwork is specified, - this must match ContainerPort. - Most containers do not need - this. + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: integer format: int32 - name: - description: If specified, this - must be an IANA_SVC_NAME and - unique within the pod. Each - named port in a pod must have - a unique name. Name for the - port that can be referred - to by services. - type: string - protocol: - description: Protocol for port. - Must be UDP, TCP, or SCTP. - Defaults to "TCP". - type: string - default: TCP - x-kubernetes-list-map-keys: - - containerPort - - protocol - x-kubernetes-list-type: map - readinessProbe: - description: 'Periodic probe of container - service readiness. Container will - be removed from service endpoints - if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: - type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. + name: + description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated. + type: string + ports: + description: List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network port in a single container. type: object required: - - port + - containerPort properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. + containerPort: + description: Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536. + type: integer + format: int32 + hostIP: + description: What host IP to bind the external port to. type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. + hostPort: + description: Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this. + type: integer + format: int32 + name: + description: If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services. type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' + protocol: + description: Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP". type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - resources: - description: 'Compute Resources required - by this container. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - properties: - limits: - description: 'Limits describes - the maximum amount of compute - resources allowed. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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 - securityContext: - description: 'Security options the - pod should run with. More info: - https://kubernetes.io/docs/concepts/policy/security-context/ - More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' - type: object - properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation - controls whether a process can - gain more privileges than its - parent process. This bool directly - controls if the no_new_privs - flag will be set on the container - process. AllowPrivilegeEscalation - is true always when the container - is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' - type: boolean - capabilities: - description: The capabilities - to add/drop when running containers. - Defaults to the default set - of capabilities granted by the - container runtime. - type: object - properties: - add: - description: Added capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + default: TCP + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + description: 'Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - drop: - description: Removed capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. type: string - privileged: - description: Run container in - privileged mode. Processes in - privileged containers are essentially - equivalent to root on the host. - Defaults to false. - type: boolean - procMount: - description: procMount denotes - the type of proc mount to use - for the containers. The default - is DefaultProcMount which uses - the container runtime defaults - for readonly paths and masked - paths. This requires the ProcMountType - feature flag to be enabled. - type: string - readOnlyRootFilesystem: - description: Whether this container - has a read-only root filesystem. - Default is false. - type: boolean - runAsGroup: - description: The GID to run the - entrypoint of the container - process. Uses runtime default - if unset. May also be set in - PodSecurityContext. If set - in both SecurityContext and - PodSecurityContext, the value - specified in SecurityContext - takes precedence. - type: integer - format: int64 - runAsNonRoot: - description: Indicates that the - container must run as a non-root - user. If true, the Kubelet will - validate the image at runtime - to ensure that it does not run - as UID 0 (root) and fail to - start the container if it does. - If unset or false, no such validation - will be performed. May also - be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: boolean - runAsUser: - description: The UID to run the - entrypoint of the container - process. Defaults to user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: integer - format: int64 - seLinuxOptions: - description: The SELinux context - to be applied to the container. - If unspecified, the container - runtime will allocate a random - SELinux context for each container. May - also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - 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 - seccompProfile: - description: The seccomp options - to use by this container. If - seccomp options are provided - at both the pod & container - level, the container options - override the pod options. - type: object - required: - - type - properties: - localhostProfile: - description: localhostProfile - indicates a profile defined - in a file on the node should - be used. The profile must - be preconfigured on the - node to work. Must be a - descending path, relative - to the kubelet's configured - seccomp profile location. - Must only be set if type - is "Localhost". - type: string - type: - description: "type indicates - which kind of seccomp profile - will be applied. Valid options - are: \n Localhost - a profile - defined in a file on the - node should be used. RuntimeDefault - - the container runtime - default profile should be - used. Unconfined - no profile - should be applied." - type: string - windowsOptions: - description: The Windows specific - settings applied to all containers. - If unspecified, the options - from the PodSecurityContext - will be used. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec - is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of - the GMSA credential spec - named by the GMSACredentialSpecName - field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName - is the name of the GMSA - credential spec to use. - type: string - runAsUserName: - description: The UserName - in Windows to run the entrypoint - of the container process. - Defaults to the user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. - If set in both SecurityContext - and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: string - startupProbe: - description: 'StartupProbe indicates - that the Pod has successfully initialized. - If specified, no other probes are - executed until this completes successfully. - If this probe fails, the Pod will - be restarted, just as if the livenessProbe - failed. This can be used to provide - different probe parameters at the - beginning of a Pod''s lifecycle, - when it might take a long time to - load data or warm a cache, than - during steady-state operation. This - cannot be updated. This is a beta - feature enabled by the StartupProbe - feature flag. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + resources: + description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - stdin: - description: Whether this container - should allocate a buffer for stdin - in the container runtime. If this - is not set, reads from stdin in - the container will always result - in EOF. Default is false. - type: boolean - stdinOnce: - description: Whether the container - runtime should close the stdin channel - after it has been opened by a single - attach. When stdin is true the stdin - stream will remain open across multiple - attach sessions. If stdinOnce is - set to true, stdin is opened on - container start, is empty until - the first client attaches to stdin, - and then remains open and accepts - data until the client disconnects, - at which time stdin is closed and - remains closed until the container - is restarted. If this flag is false, - a container processes that reads - from stdin will never receive an - EOF. Default is false - type: boolean - terminationMessagePath: - description: 'Optional: Path at which - the file to which the container''s - termination message will be written - is mounted into the container''s - filesystem. Message written is intended - to be brief final status, such as - an assertion failure message. Will - be truncated by the node if greater - than 4096 bytes. The total message - length across all containers will - be limited to 12kb. Defaults to - /dev/termination-log. Cannot be - updated.' - type: string - terminationMessagePolicy: - description: Indicate how the termination - message should be populated. File - will use the contents of terminationMessagePath - to populate the container status - message on both success and failure. - FallbackToLogsOnError will use the - last chunk of container log output - if the termination message file - is empty and the container exited - with an error. The log output is - limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to - File. Cannot be updated. - type: string - tty: - description: Whether this container - should allocate a TTY for itself, - also requires 'stdin' to be true. - Default is false. - type: boolean - volumeDevices: - description: volumeDevices is the - list of block devices to be used - by the container. - type: array - items: - description: volumeDevice describes - a mapping of a raw block device - within a container. + securityContext: + description: 'Security options the pod should run with. More info: https://kubernetes.io/docs/concepts/policy/security-context/ More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' type: object - required: - - devicePath - - name properties: - devicePath: - description: devicePath is the - path inside of the container - that the device will be mapped - to. - type: string - name: - description: name must match - the name of a persistentVolumeClaim - in the pod + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. + type: object + properties: + add: + description: Added capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + drop: + description: Removed capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + privileged: + description: Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. type: string - volumeMounts: - description: Pod volumes to mount - into the container's filesystem. - Cannot be updated. - type: array - items: - description: VolumeMount describes - a mounting of a Volume within - a container. + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + 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 + seccompProfile: + description: The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. + type: object + required: + - type + properties: + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". + type: string + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: string + startupProbe: + description: 'StartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod''s lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: object - required: - - mountPath - - name properties: - mountPath: - description: Path within the - container at which the volume - should be mounted. Must not - contain ':'. - type: string - mountPropagation: - description: mountPropagation - determines how mounts are - propagated from the host to - container and the other way - around. When not set, MountPropagationNone - is used. This field is beta - in 1.10. - type: string - name: - description: This must match - the Name of a Volume. - type: string - readOnly: - description: Mounted read-only - if true, read-write otherwise - (false or unspecified). Defaults - to false. - type: boolean - subPath: - description: Path within the - volume from which the container's - volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within - the volume from which the - container's volume should - be mounted. Behaves similarly - to SubPath but environment - variable references $(VAR_NAME) - are expanded using the container's - environment. Defaults to "" - (volume's root). SubPathExpr - and SubPath are mutually exclusive. - type: string - workingDir: - description: Container's working directory. - If not specified, the container - runtime's default will be used, - which might be configured in the - container image. Cannot be updated. - type: string - dnsConfig: - description: Specifies the DNS parameters - of a pod. Parameters specified here will - be merged to the generated DNS configuration - based on DNSPolicy. - type: object - properties: - nameservers: - description: A list of DNS name server - IP addresses. This will be appended - to the base nameservers generated - from DNSPolicy. Duplicated nameservers - will be removed. - type: array - items: - type: string - options: - description: A list of DNS resolver - options. This will be merged with - the base options generated from DNSPolicy. - Duplicated entries will be removed. - Resolution options given in Options - will override those that appear in - the base DNSPolicy. - type: array - items: - description: PodDNSConfigOption defines - DNS resolver options of a pod. - type: object - properties: - name: - description: Required. - type: string - value: - type: string - searches: - description: A list of DNS search domains - for host-name lookup. This will be - appended to the base search paths - generated from DNSPolicy. Duplicated - search paths will be removed. - type: array - items: - type: string - dnsPolicy: - description: Set DNS policy for the pod. - Defaults to "ClusterFirst". Valid values - are 'ClusterFirstWithHostNet', 'ClusterFirst', - 'Default' or 'None'. DNS parameters given - in DNSConfig will be merged with the policy - selected with DNSPolicy. To have DNS options - set along with hostNetwork, you have to - specify DNS policy explicitly to 'ClusterFirstWithHostNet'. - type: string - enableServiceLinks: - description: 'EnableServiceLinks indicates - whether information about services should - be injected into pod''s environment variables, - matching the syntax of Docker links. Optional: - Defaults to true.' - type: boolean - ephemeralContainers: - description: List of ephemeral containers - run in this pod. Ephemeral containers - may be run in an existing pod to perform - user-initiated actions such as debugging. - This list cannot be specified when creating - a pod, and it cannot be modified by updating - the pod spec. In order to add an ephemeral - container to an existing pod, use the - pod's ephemeralcontainers subresource. - This field is alpha-level and is only - honored by servers that enable the EphemeralContainers - feature. - type: array - items: - description: An EphemeralContainer is - a container that may be added temporarily - to an existing pod for user-initiated - activities such as debugging. Ephemeral - containers have no resource or scheduling - guarantees, and they will not be restarted - when they exit or when a pod is removed - or restarted. If an ephemeral container - causes a pod to exceed its resource - allocation, the pod may be evicted. - Ephemeral containers may not be added - by directly updating the pod spec. They - must be added via the pod's ephemeralcontainers - subresource, and they will appear in - the pod spec once added. This is an - alpha feature enabled by the EphemeralContainers - feature flag. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + stdin: + description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false + type: boolean + terminationMessagePath: + description: 'Optional: Path at which the file to which the container''s termination message will be written is mounted into the container''s filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.' + type: string + terminationMessagePolicy: + description: Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated. + type: string + tty: + description: Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be used by the container. + type: array + items: + description: volumeDevice describes a mapping of a raw block device within a container. + type: object + required: + - devicePath + - name + properties: + devicePath: + description: devicePath is the path inside of the container that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim in the pod + type: string + volumeMounts: + description: Pod volumes to mount into the container's filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. + type: object + required: + - mountPath + - name + properties: + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. + type: string + workingDir: + description: Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated. + type: string + dnsConfig: + description: Specifies the DNS parameters of a pod. Parameters specified here will be merged to the generated DNS configuration based on DNSPolicy. type: object - required: - - name properties: - args: - description: 'Arguments to the entrypoint. - The docker image''s CMD is used - if this is not provided. Variable - references $(VAR_NAME) are expanded - using the container''s environment. - If a variable cannot be resolved, - the reference in the input string - will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless - of whether the variable exists or - not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + nameservers: + description: A list of DNS name server IP addresses. This will be appended to the base nameservers generated from DNSPolicy. Duplicated nameservers will be removed. type: array items: type: string - command: - description: 'Entrypoint array. Not - executed within a shell. The docker - image''s ENTRYPOINT is used if this - is not provided. Variable references - $(VAR_NAME) are expanded using the - container''s environment. If a variable - cannot be resolved, the reference - in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped - with a double $$, ie: $$(VAR_NAME). - Escaped references will never be - expanded, regardless of whether - the variable exists or not. Cannot - be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + options: + description: A list of DNS resolver options. This will be merged with the base options generated from DNSPolicy. Duplicated entries will be removed. Resolution options given in Options will override those that appear in the base DNSPolicy. type: array items: - type: string - env: - description: List of environment variables - to set in the container. Cannot - be updated. - type: array - items: - description: EnvVar represents an - environment variable present in - a Container. + description: PodDNSConfigOption defines DNS resolver options of a pod. type: object - required: - - name properties: name: - description: Name of the environment - variable. Must be a C_IDENTIFIER. + description: Required. type: string value: - description: 'Variable references - $(VAR_NAME) are expanded using - the previous 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. The $(VAR_NAME) - syntax can be escaped with - a double $$, ie: $$(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. + searches: + description: A list of DNS search domains for host-name lookup. This will be appended to the base search paths generated from DNSPolicy. Duplicated search paths will be removed. + type: array + items: + type: string + dnsPolicy: + description: Set DNS policy for the pod. Defaults to "ClusterFirst". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'. + type: string + enableServiceLinks: + description: 'EnableServiceLinks indicates whether information about services should be injected into pod''s environment variables, matching the syntax of Docker links. Optional: Defaults to true.' + type: boolean + ephemeralContainers: + description: List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing pod to perform user-initiated actions such as debugging. This list cannot be specified when creating a pod, and it cannot be modified by updating the pod spec. In order to add an ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource. This field is alpha-level and is only honored by servers that enable the EphemeralContainers feature. + type: array + items: + description: An EphemeralContainer is a container that may be added temporarily to an existing pod for user-initiated activities such as debugging. Ephemeral containers have no resource or scheduling guarantees, and they will not be restarted when they exit or when a pod is removed or restarted. If an ephemeral container causes a pod to exceed its resource allocation, the pod may be evicted. Ephemeral containers may not be added by directly updating the pod spec. They must be added via the pod's ephemeralcontainers subresource, and they will appear in the pod spec once added. This is an alpha feature enabled by the EphemeralContainers feature flag. + type: object + required: + - name + properties: + args: + description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + command: + description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + env: + description: List of environment variables to set in the container. Cannot be updated. + 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 previous 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. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(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 + 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 + 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 + 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 + envFrom: + description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps + type: object + properties: + configMapRef: + description: The ConfigMap to select from + type: object + properties: + 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 must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + type: object + properties: + 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 must be defined + type: boolean + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + lifecycle: + description: Lifecycle is not allowed for ephemeral containers. + type: object + properties: + postStart: + description: 'PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' type: object properties: - configMapKeyRef: - description: Selects a key - of a ConfigMap. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - key + - port properties: - key: - description: The key - to select. + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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?' + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - optional: - description: Specify - whether the ConfigMap - or its key must be - defined - type: boolean - 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.' + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - fieldPath + - port properties: - apiVersion: - description: Version - of the schema the - FieldPath is written - in terms of, defaults - to "v1". + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - fieldPath: - description: Path of - the field to select - in the specified API - version. - type: string - 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.' + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + preStop: + description: 'PreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod''s termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod''s termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - resource + - port properties: - containerName: - description: 'Container - name: required for - volumes, optional - for env vars' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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]+))))?$ + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - resource: - description: 'Required: - resource to select' + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - secretKeyRef: - description: Selects a key - of a secret in the pod's - namespace + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - key + - port properties: - key: - description: The key - of the secret to select - from. Must be a valid - secret key. + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' 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 - envFrom: - description: List of sources to populate - environment variables in the container. - The keys defined within a source - must be a C_IDENTIFIER. All invalid - keys will be reported as an event - when the container is starting. - When a key exists in multiple sources, - the value associated with the last - source will take precedence. Values - defined by an Env with a duplicate - key will take precedence. Cannot - be updated. - type: array - items: - description: EnvFromSource represents - the source of a set of ConfigMaps + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + livenessProbe: + description: Probes are not allowed for ephemeral containers. type: object properties: - configMapRef: - description: The ConfigMap to - select from + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. type: object properties: - 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 must be - defined - type: boolean - prefix: - description: An optional identifier - to prepend to each key in - the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select - from + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. type: object + required: + - port properties: - 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?' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - optional: - description: Specify whether - the Secret must be defined - type: boolean - image: - description: 'Docker image name. More - info: https://kubernetes.io/docs/concepts/containers/images' - type: string - imagePullPolicy: - description: 'Image pull policy. One - of Always, Never, IfNotPresent. - Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - lifecycle: - description: Lifecycle is not allowed - for ephemeral containers. - type: object - properties: - postStart: - description: 'PostStart is called - immediately after a container - is created. If the handler fails, - the container is terminated - and restarted according to its - restart policy. Other management - of the container blocks until - the hook completes. More info: - https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - preStop: - description: 'PreStop is called - immediately before a container - is terminated due to an API - request or management event - such as liveness/startup probe - failure, preemption, resource - contention, etc. The handler - is not called if the container - crashes or exits. The reason - for termination is passed to - the handler. The Pod''s termination - grace period countdown begins - before the PreStop hooked is - executed. Regardless of the - outcome of the handler, the - container will eventually terminate - within the Pod''s termination - grace period. Other management - of the container blocks until - the hook completes or until - the termination grace period - is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: - name - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: - type: integer - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - livenessProbe: - description: Probes are not allowed - for ephemeral containers. - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + name: + description: Name of the ephemeral container specified as a DNS_LABEL. This name must be unique among all containers, init containers and ephemeral containers. + type: string + ports: + description: Ports are not allowed for ephemeral containers. + type: array + items: + description: ContainerPort represents a network port in a single container. type: object required: - - port + - containerPort properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' + containerPort: + description: Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536. + type: integer + format: int32 + hostIP: + description: What host IP to bind the external port to. type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - name: - description: Name of the ephemeral - container specified as a DNS_LABEL. - This name must be unique among all - containers, init containers and - ephemeral containers. - type: string - ports: - description: Ports are not allowed - for ephemeral containers. - type: array - items: - description: ContainerPort represents - a network port in a single container. + hostPort: + description: Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this. + type: integer + format: int32 + name: + description: If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services. + type: string + protocol: + description: Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP". + type: string + default: TCP + readinessProbe: + description: Probes are not allowed for ephemeral containers. type: object - required: - - containerPort properties: - containerPort: - description: Number of port - to expose on the pod's IP - address. This must be a valid - port number, 0 < x < 65536. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. type: integer format: int32 - hostIP: - description: What host IP to - bind the external port to. - type: string - hostPort: - description: Number of port - to expose on the host. If - specified, this must be a - valid port number, 0 < x < - 65536. If HostNetwork is specified, - this must match ContainerPort. - Most containers do not need - this. + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: integer format: int32 - name: - description: If specified, this - must be an IANA_SVC_NAME and - unique within the pod. Each - named port in a pod must have - a unique name. Name for the - port that can be referred - to by services. - type: string - protocol: - description: Protocol for port. - Must be UDP, TCP, or SCTP. - Defaults to "TCP". - type: string - readinessProbe: - description: Probes are not allowed - for ephemeral containers. - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + resources: + description: Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources already allocated to the pod. + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - resources: - description: Resources are not allowed - for ephemeral containers. Ephemeral - containers use spare resources already - allocated to the pod. - type: object - properties: - limits: - description: 'Limits describes - the maximum amount of compute - resources allowed. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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 - securityContext: - description: SecurityContext is not - allowed for ephemeral containers. - type: object - properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation - controls whether a process can - gain more privileges than its - parent process. This bool directly - controls if the no_new_privs - flag will be set on the container - process. AllowPrivilegeEscalation - is true always when the container - is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' - type: boolean - capabilities: - description: The capabilities - to add/drop when running containers. - Defaults to the default set - of capabilities granted by the - container runtime. - type: object - properties: - add: - description: Added capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + securityContext: + description: SecurityContext is not allowed for ephemeral containers. + type: object + properties: + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. + type: object + properties: + add: + description: Added capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + drop: + description: Removed capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + privileged: + description: Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. + type: string + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + level: + description: Level is SELinux level label that applies to the container. type: string - drop: - description: Removed capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + role: + description: Role is a SELinux role label that applies to the container. type: string - privileged: - description: Run container in - privileged mode. Processes in - privileged containers are essentially - equivalent to root on the host. - Defaults to false. - type: boolean - procMount: - description: procMount denotes - the type of proc mount to use - for the containers. The default - is DefaultProcMount which uses - the container runtime defaults - for readonly paths and masked - paths. This requires the ProcMountType - feature flag to be enabled. - type: string - readOnlyRootFilesystem: - description: Whether this container - has a read-only root filesystem. - Default is false. - type: boolean - runAsGroup: - description: The GID to run the - entrypoint of the container - process. Uses runtime default - if unset. May also be set in - PodSecurityContext. If set - in both SecurityContext and - PodSecurityContext, the value - specified in SecurityContext - takes precedence. - type: integer - format: int64 - runAsNonRoot: - description: Indicates that the - container must run as a non-root - user. If true, the Kubelet will - validate the image at runtime - to ensure that it does not run - as UID 0 (root) and fail to - start the container if it does. - If unset or false, no such validation - will be performed. May also - be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: boolean - runAsUser: - description: The UID to run the - entrypoint of the container - process. Defaults to user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: integer - format: int64 - seLinuxOptions: - description: The SELinux context - to be applied to the container. - If unspecified, the container - runtime will allocate a random - SELinux context for each container. May - also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. + 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 + seccompProfile: + description: The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. + type: object + required: + - type + properties: + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". + type: string + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: string + startupProbe: + description: Probes are not allowed for ephemeral containers. + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + stdin: + description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false + type: boolean + targetContainerName: + description: If set, the name of the container from PodSpec that this ephemeral container targets. The ephemeral container will be run in the namespaces (IPC, PID, etc) of this container. If not set then the ephemeral container is run in whatever namespaces are shared for the pod. Note that the container runtime must support this feature. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to which the container''s termination message will be written is mounted into the container''s filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.' + type: string + terminationMessagePolicy: + description: Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated. + type: string + tty: + description: Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be used by the container. + type: array + items: + description: volumeDevice describes a mapping of a raw block device within a container. type: object + required: + - devicePath + - name 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. + devicePath: + description: devicePath is the path inside of the container that the device will be mapped to. 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. + name: + description: name must match the name of a persistentVolumeClaim in the pod type: string - seccompProfile: - description: The seccomp options - to use by this container. If - seccomp options are provided - at both the pod & container - level, the container options - override the pod options. + volumeMounts: + description: Pod volumes to mount into the container's filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. type: object required: - - type + - mountPath + - name properties: - localhostProfile: - description: localhostProfile - indicates a profile defined - in a file on the node should - be used. The profile must - be preconfigured on the - node to work. Must be a - descending path, relative - to the kubelet's configured - seccomp profile location. - Must only be set if type - is "Localhost". + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. type: string - type: - description: "type indicates - which kind of seccomp profile - will be applied. Valid options - are: \n Localhost - a profile - defined in a file on the - node should be used. RuntimeDefault - - the container runtime - default profile should be - used. Unconfined - no profile - should be applied." + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. type: string - windowsOptions: - description: The Windows specific - settings applied to all containers. - If unspecified, the options - from the PodSecurityContext - will be used. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec - is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of - the GMSA credential spec - named by the GMSACredentialSpecName - field. + name: + description: This must match the Name of a Volume. type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName - is the name of the GMSA - credential spec to use. + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). type: string - runAsUserName: - description: The UserName - in Windows to run the entrypoint - of the container process. - Defaults to the user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. - If set in both SecurityContext - and PodSecurityContext, - the value specified in SecurityContext - takes precedence. + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. type: string - startupProbe: - description: Probes are not allowed - for ephemeral containers. - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: - type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. + workingDir: + description: Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated. + type: string + hostAliases: + description: HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts file if specified. This is only valid for non-hostNetwork pods. + type: array + items: + description: HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the pod's hosts file. + type: object + properties: + hostnames: + description: Hostnames for the above IP address. + type: array + items: + type: string + ip: + description: IP address of the host file entry. + type: string + hostIPC: + description: 'Use the host''s ipc namespace. Optional: Default to false.' + type: boolean + hostNetwork: + description: Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false. + type: boolean + hostPID: + description: 'Use the host''s pid namespace. Optional: Default to false.' + type: boolean + hostname: + description: Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. + type: string + imagePullSecrets: + description: 'ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. For example, in the case of docker, only DockerConfig type secrets are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod' + type: array + items: + description: LocalObjectReference contains enough information to let you locate the referenced object inside the same namespace. + type: object + properties: + 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 + initContainers: + description: 'List of initialization containers belonging to the pod. Init containers are executed in order prior to containers being started. If any init container fails, the pod is considered to have failed and is handled according to its restartPolicy. The name for an init container or normal container must be unique among all containers. Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes. The resourceRequirements of an init container are taken into account during scheduling by finding the highest request/limit for each resource type, and then using the max of of that value or the sum of the normal containers. Limits are applied to init containers in a similar fashion. Init containers cannot currently be added or removed. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/' + type: array + items: + description: A single application container that you want to run within a pod. + type: object + required: + - name + properties: + args: + description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + command: + description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + env: + description: List of environment variables to set in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable present in a Container. type: object required: - - port + - name properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. + value: + description: 'Variable references $(VAR_NAME) are expanded using the previous 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. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".' type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' + 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 + 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 + 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 + 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 + envFrom: + description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps type: object - required: - - port properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' + configMapRef: + description: The ConfigMap to select from + type: object + properties: + 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 must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - stdin: - description: Whether this container - should allocate a buffer for stdin - in the container runtime. If this - is not set, reads from stdin in - the container will always result - in EOF. Default is false. - type: boolean - stdinOnce: - description: Whether the container - runtime should close the stdin channel - after it has been opened by a single - attach. When stdin is true the stdin - stream will remain open across multiple - attach sessions. If stdinOnce is - set to true, stdin is opened on - container start, is empty until - the first client attaches to stdin, - and then remains open and accepts - data until the client disconnects, - at which time stdin is closed and - remains closed until the container - is restarted. If this flag is false, - a container processes that reads - from stdin will never receive an - EOF. Default is false - type: boolean - targetContainerName: - description: If set, the name of the - container from PodSpec that this - ephemeral container targets. The - ephemeral container will be run - in the namespaces (IPC, PID, etc) - of this container. If not set then - the ephemeral container is run in - whatever namespaces are shared for - the pod. Note that the container - runtime must support this feature. - type: string - terminationMessagePath: - description: 'Optional: Path at which - the file to which the container''s - termination message will be written - is mounted into the container''s - filesystem. Message written is intended - to be brief final status, such as - an assertion failure message. Will - be truncated by the node if greater - than 4096 bytes. The total message - length across all containers will - be limited to 12kb. Defaults to - /dev/termination-log. Cannot be - updated.' - type: string - terminationMessagePolicy: - description: Indicate how the termination - message should be populated. File - will use the contents of terminationMessagePath - to populate the container status - message on both success and failure. - FallbackToLogsOnError will use the - last chunk of container log output - if the termination message file - is empty and the container exited - with an error. The log output is - limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to - File. Cannot be updated. - type: string - tty: - description: Whether this container - should allocate a TTY for itself, - also requires 'stdin' to be true. - Default is false. - type: boolean - volumeDevices: - description: volumeDevices is the - list of block devices to be used - by the container. - type: array - items: - description: volumeDevice describes - a mapping of a raw block device - within a container. - type: object - required: - - devicePath - - name - properties: - devicePath: - description: devicePath is the - path inside of the container - that the device will be mapped - to. - type: string - name: - description: name must match - the name of a persistentVolumeClaim - in the pod - type: string - volumeMounts: - description: Pod volumes to mount - into the container's filesystem. - Cannot be updated. - type: array - items: - description: VolumeMount describes - a mounting of a Volume within - a container. - type: object - required: - - mountPath - - name - properties: - mountPath: - description: Path within the - container at which the volume - should be mounted. Must not - contain ':'. - type: string - mountPropagation: - description: mountPropagation - determines how mounts are - propagated from the host to - container and the other way - around. When not set, MountPropagationNone - is used. This field is beta - in 1.10. - type: string - name: - description: This must match - the Name of a Volume. - type: string - readOnly: - description: Mounted read-only - if true, read-write otherwise - (false or unspecified). Defaults - to false. - type: boolean - subPath: - description: Path within the - volume from which the container's - volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within - the volume from which the - container's volume should - be mounted. Behaves similarly - to SubPath but environment - variable references $(VAR_NAME) - are expanded using the container's - environment. Defaults to "" - (volume's root). SubPathExpr - and SubPath are mutually exclusive. - type: string - workingDir: - description: Container's working directory. - If not specified, the container - runtime's default will be used, - which might be configured in the - container image. Cannot be updated. - type: string - hostAliases: - description: HostAliases is an optional - list of hosts and IPs that will be injected - into the pod's hosts file if specified. - This is only valid for non-hostNetwork - pods. - type: array - items: - description: HostAlias holds the mapping - between IP and hostnames that will be - injected as an entry in the pod's hosts - file. - type: object - properties: - hostnames: - description: Hostnames for the above - IP address. - type: array - items: - type: string - ip: - description: IP address of the host - file entry. - type: string - hostIPC: - description: 'Use the host''s ipc namespace. - Optional: Default to false.' - type: boolean - hostNetwork: - description: Host networking requested for - this pod. Use the host's network namespace. - If this option is set, the ports that - will be used must be specified. Default - to false. - type: boolean - hostPID: - description: 'Use the host''s pid namespace. - Optional: Default to false.' - type: boolean - hostname: - description: Specifies the hostname of the - Pod If not specified, the pod's hostname - will be set to a system-defined value. - type: string - imagePullSecrets: - description: 'ImagePullSecrets is an optional - list of references to secrets in the same - namespace to use for pulling any of the - images used by this PodSpec. If specified, - these secrets will be passed to individual - puller implementations for them to use. - For example, in the case of docker, only - DockerConfig type secrets are honored. - More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod' - type: array - items: - description: LocalObjectReference contains - enough information to let you locate - the referenced object inside the same - namespace. - type: object - properties: - 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 - initContainers: - description: 'List of initialization containers - belonging to the pod. Init containers - are executed in order prior to containers - being started. If any init container fails, - the pod is considered to have failed and - is handled according to its restartPolicy. - The name for an init container or normal - container must be unique among all containers. - Init containers may not have Lifecycle - actions, Readiness probes, Liveness probes, - or Startup probes. The resourceRequirements - of an init container are taken into account - during scheduling by finding the highest - request/limit for each resource type, - and then using the max of of that value - or the sum of the normal containers. Limits - are applied to init containers in a similar - fashion. Init containers cannot currently - be added or removed. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/' - type: array - items: - description: A single application container - that you want to run within a pod. - type: object - required: - - name - properties: - args: - description: 'Arguments to the entrypoint. - The docker image''s CMD is used - if this is not provided. Variable - references $(VAR_NAME) are expanded - using the container''s environment. - If a variable cannot be resolved, - the reference in the input string - will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless - of whether the variable exists or - not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + secretRef: + description: The Secret to select from + type: object + properties: + 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 must be defined + type: boolean + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.' type: string - command: - description: 'Entrypoint array. Not - executed within a shell. The docker - image''s ENTRYPOINT is used if this - is not provided. Variable references - $(VAR_NAME) are expanded using the - container''s environment. If a variable - cannot be resolved, the reference - in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped - with a double $$, ie: $$(VAR_NAME). - Escaped references will never be - expanded, regardless of whether - the variable exists or not. Cannot - be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string - env: - description: List of environment variables - to set in the container. Cannot - be updated. - type: array - items: - description: EnvVar represents an - environment variable present in - a Container. + lifecycle: + description: Actions that the management system should take in response to container lifecycle events. Cannot be updated. 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 previous 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. The $(VAR_NAME) - syntax can be escaped with - a double $$, ie: $$(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. + postStart: + description: 'PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' type: object properties: - configMapKeyRef: - description: Selects a key - of a ConfigMap. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - key + - port properties: - key: - description: The key - to select. + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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?' + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - optional: - description: Specify - whether the ConfigMap - or its key must be - defined - type: boolean - 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.' + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - fieldPath + - port 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. + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - 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.' + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + preStop: + description: 'PreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod''s termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod''s termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - resource + - port properties: - containerName: - description: 'Container - name: required for - volumes, optional - for env vars' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. 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]+))))?$ + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - resource: - description: 'Required: - resource to select' + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - secretKeyRef: - description: Selects a key - of a secret in the pod's - namespace + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - key + - port 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?' + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - optional: - description: Specify - whether the Secret - or its key must be - defined - type: boolean - envFrom: - description: List of sources to populate - environment variables in the container. - The keys defined within a source - must be a C_IDENTIFIER. All invalid - keys will be reported as an event - when the container is starting. - When a key exists in multiple sources, - the value associated with the last - source will take precedence. Values - defined by an Env with a duplicate - key will take precedence. Cannot - be updated. - type: array - items: - description: EnvFromSource represents - the source of a set of ConfigMaps + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + livenessProbe: + description: 'Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: object properties: - configMapRef: - description: The ConfigMap to - select from + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. type: object properties: - 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 must be - defined - type: boolean - prefix: - description: An optional identifier - to prepend to each key in - the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select - from + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. type: object + required: + - port properties: - 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?' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - optional: - description: Specify whether - the Secret must be defined - type: boolean - image: - description: 'Docker image name. More - info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow - higher level config management to - default or override container images - in workload controllers like Deployments - and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One - of Always, Never, IfNotPresent. - Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - lifecycle: - description: Actions that the management - system should take in response to - container lifecycle events. Cannot - be updated. - type: object - properties: - postStart: - description: 'PostStart is called - immediately after a container - is created. If the handler fails, - the container is terminated - and restarted according to its - restart policy. Other management - of the container blocks until - the hook completes. More info: - https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - preStop: - description: 'PreStop is called - immediately before a container - is terminated due to an API - request or management event - such as liveness/startup probe - failure, preemption, resource - contention, etc. The handler - is not called if the container - crashes or exits. The reason - for termination is passed to - the handler. The Pod''s termination - grace period countdown begins - before the PreStop hooked is - executed. Regardless of the - outcome of the handler, the - container will eventually terminate - within the Pod''s termination - grace period. Other management - of the container blocks until - the hook completes or until - the termination grace period - is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: - name - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: - type: integer - type: string - x-kubernetes-int-or-string: true - livenessProbe: - description: 'Periodic probe of container - liveness. Container will be restarted - if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - name: - description: Name of the container - specified as a DNS_LABEL. Each container - in a pod must have a unique name - (DNS_LABEL). Cannot be updated. - type: string - ports: - description: List of ports to expose - from the container. Exposing a port - here gives the system additional - information about the network connections - a container uses, but is primarily - informational. Not specifying a - port here DOES NOT prevent that - port from being exposed. Any port - which is listening on the default - "0.0.0.0" address inside a container - will be accessible from the network. - Cannot be updated. - type: array - items: - description: ContainerPort represents - a network port in a single container. - type: object - required: - - containerPort - properties: - containerPort: - description: Number of port - to expose on the pod's IP - address. This must be a valid - port number, 0 < x < 65536. + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. type: integer format: int32 - hostIP: - description: What host IP to - bind the external port to. - type: string - hostPort: - description: Number of port - to expose on the host. If - specified, this must be a - valid port number, 0 < x < - 65536. If HostNetwork is specified, - this must match ContainerPort. - Most containers do not need - this. + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. type: integer format: int32 - name: - description: If specified, this - must be an IANA_SVC_NAME and - unique within the pod. Each - named port in a pod must have - a unique name. Name for the - port that can be referred - to by services. - type: string - protocol: - description: Protocol for port. - Must be UDP, TCP, or SCTP. - Defaults to "TCP". - type: string - default: TCP - x-kubernetes-list-map-keys: - - containerPort - - protocol - x-kubernetes-list-type: map - readinessProbe: - description: 'Periodic probe of container - service readiness. Container will - be removed from service endpoints - if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + name: + description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated. + type: string + ports: + description: List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network port in a single container. type: object required: - - port + - containerPort properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. + containerPort: + description: Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536. + type: integer + format: int32 + hostIP: + description: What host IP to bind the external port to. type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. + hostPort: + description: Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this. + type: integer + format: int32 + name: + description: If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services. type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' + protocol: + description: Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP". type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - resources: - description: 'Compute Resources required - by this container. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - properties: - limits: - description: 'Limits describes - the maximum amount of compute - resources allowed. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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 - securityContext: - description: 'Security options the - pod should run with. More info: - https://kubernetes.io/docs/concepts/policy/security-context/ - More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' - type: object - properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation - controls whether a process can - gain more privileges than its - parent process. This bool directly - controls if the no_new_privs - flag will be set on the container - process. AllowPrivilegeEscalation - is true always when the container - is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' - type: boolean - capabilities: - description: The capabilities - to add/drop when running containers. - Defaults to the default set - of capabilities granted by the - container runtime. - type: object - properties: - add: - description: Added capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + default: TCP + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + description: 'Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - drop: - description: Removed capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. type: string - privileged: - description: Run container in - privileged mode. Processes in - privileged containers are essentially - equivalent to root on the host. - Defaults to false. - type: boolean - procMount: - description: procMount denotes - the type of proc mount to use - for the containers. The default - is DefaultProcMount which uses - the container runtime defaults - for readonly paths and masked - paths. This requires the ProcMountType - feature flag to be enabled. - type: string - readOnlyRootFilesystem: - description: Whether this container - has a read-only root filesystem. - Default is false. - type: boolean - runAsGroup: - description: The GID to run the - entrypoint of the container - process. Uses runtime default - if unset. May also be set in - PodSecurityContext. If set - in both SecurityContext and - PodSecurityContext, the value - specified in SecurityContext - takes precedence. - type: integer - format: int64 - runAsNonRoot: - description: Indicates that the - container must run as a non-root - user. If true, the Kubelet will - validate the image at runtime - to ensure that it does not run - as UID 0 (root) and fail to - start the container if it does. - If unset or false, no such validation - will be performed. May also - be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: boolean - runAsUser: - description: The UID to run the - entrypoint of the container - process. Defaults to user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: integer - format: int64 - seLinuxOptions: - description: The SELinux context - to be applied to the container. - If unspecified, the container - runtime will allocate a random - SELinux context for each container. May - also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - 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 - seccompProfile: - description: The seccomp options - to use by this container. If - seccomp options are provided - at both the pod & container - level, the container options - override the pod options. - type: object - required: - - type - properties: - localhostProfile: - description: localhostProfile - indicates a profile defined - in a file on the node should - be used. The profile must - be preconfigured on the - node to work. Must be a - descending path, relative - to the kubelet's configured - seccomp profile location. - Must only be set if type - is "Localhost". - type: string - type: - description: "type indicates - which kind of seccomp profile - will be applied. Valid options - are: \n Localhost - a profile - defined in a file on the - node should be used. RuntimeDefault - - the container runtime - default profile should be - used. Unconfined - no profile - should be applied." - type: string - windowsOptions: - description: The Windows specific - settings applied to all containers. - If unspecified, the options - from the PodSecurityContext - will be used. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec - is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of - the GMSA credential spec - named by the GMSACredentialSpecName - field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName - is the name of the GMSA - credential spec to use. - type: string - runAsUserName: - description: The UserName - in Windows to run the entrypoint - of the container process. - Defaults to the user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. - If set in both SecurityContext - and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: string - startupProbe: - description: 'StartupProbe indicates - that the Pod has successfully initialized. - If specified, no other probes are - executed until this completes successfully. - If this probe fails, the Pod will - be restarted, just as if the livenessProbe - failed. This can be used to provide - different probe parameters at the - beginning of a Pod''s lifecycle, - when it might take a long time to - load data or warm a cache, than - during steady-state operation. This - cannot be updated. This is a beta - feature enabled by the StartupProbe - feature flag. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + resources: + description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + - type: integer + - type: string x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - stdin: - description: Whether this container - should allocate a buffer for stdin - in the container runtime. If this - is not set, reads from stdin in - the container will always result - in EOF. Default is false. - type: boolean - stdinOnce: - description: Whether the container - runtime should close the stdin channel - after it has been opened by a single - attach. When stdin is true the stdin - stream will remain open across multiple - attach sessions. If stdinOnce is - set to true, stdin is opened on - container start, is empty until - the first client attaches to stdin, - and then remains open and accepts - data until the client disconnects, - at which time stdin is closed and - remains closed until the container - is restarted. If this flag is false, - a container processes that reads - from stdin will never receive an - EOF. Default is false - type: boolean - terminationMessagePath: - description: 'Optional: Path at which - the file to which the container''s - termination message will be written - is mounted into the container''s - filesystem. Message written is intended - to be brief final status, such as - an assertion failure message. Will - be truncated by the node if greater - than 4096 bytes. The total message - length across all containers will - be limited to 12kb. Defaults to - /dev/termination-log. Cannot be - updated.' - type: string - terminationMessagePolicy: - description: Indicate how the termination - message should be populated. File - will use the contents of terminationMessagePath - to populate the container status - message on both success and failure. - FallbackToLogsOnError will use the - last chunk of container log output - if the termination message file - is empty and the container exited - with an error. The log output is - limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to - File. Cannot be updated. - type: string - tty: - description: Whether this container - should allocate a TTY for itself, - also requires 'stdin' to be true. - Default is false. - type: boolean - volumeDevices: - description: volumeDevices is the - list of block devices to be used - by the container. - type: array - items: - description: volumeDevice describes - a mapping of a raw block device - within a container. + securityContext: + description: 'Security options the pod should run with. More info: https://kubernetes.io/docs/concepts/policy/security-context/ More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' type: object - required: - - devicePath - - name properties: - devicePath: - description: devicePath is the - path inside of the container - that the device will be mapped - to. - type: string - name: - description: name must match - the name of a persistentVolumeClaim - in the pod + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. + type: object + properties: + add: + description: Added capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + drop: + description: Removed capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + privileged: + description: Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. type: string - volumeMounts: - description: Pod volumes to mount - into the container's filesystem. - Cannot be updated. - type: array - items: - description: VolumeMount describes - a mounting of a Volume within - a container. + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + 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 + seccompProfile: + description: The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. + type: object + required: + - type + properties: + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". + type: string + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: string + startupProbe: + description: 'StartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod''s lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: object - required: - - mountPath - - name properties: - mountPath: - description: Path within the - container at which the volume - should be mounted. Must not - contain ':'. - type: string - mountPropagation: - description: mountPropagation - determines how mounts are - propagated from the host to - container and the other way - around. When not set, MountPropagationNone - is used. This field is beta - in 1.10. - type: string - name: - description: This must match - the Name of a Volume. - type: string - readOnly: - description: Mounted read-only - if true, read-write otherwise - (false or unspecified). Defaults - to false. - type: boolean - subPath: - description: Path within the - volume from which the container's - volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within - the volume from which the - container's volume should - be mounted. Behaves similarly - to SubPath but environment - variable references $(VAR_NAME) - are expanded using the container's - environment. Defaults to "" - (volume's root). SubPathExpr - and SubPath are mutually exclusive. - type: string - workingDir: - description: Container's working directory. - If not specified, the container - runtime's default will be used, - which might be configured in the - container image. Cannot be updated. - type: string - nodeName: - description: NodeName is a request to schedule - this pod onto a specific node. If it is - non-empty, the scheduler simply schedules - this pod onto that node, assuming that - it fits resource requirements. - type: string - nodeSelector: - description: 'NodeSelector is a selector - which must be true for the pod to fit - on a node. Selector which must match a - node''s labels for the pod to be scheduled - on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - overhead: - description: 'Overhead represents the resource - overhead associated with running a pod - for a given RuntimeClass. This field will - be autopopulated at admission time by - the RuntimeClass admission controller. - If the RuntimeClass admission controller - is enabled, overhead must not be set in - Pod create requests. The RuntimeClass - admission controller will reject Pod create - requests which have the overhead already - set. If RuntimeClass is configured and - selected in the PodSpec, Overhead will - be set to the value defined in the corresponding - RuntimeClass, otherwise it will remain - unset and treated as zero. More info: - https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md - This field is alpha-level as of Kubernetes - v1.16, and is only honored by servers - that enable the PodOverhead feature.' - 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 - preemptionPolicy: - description: PreemptionPolicy is the Policy - for preempting pods with lower priority. - One of Never, PreemptLowerPriority. Defaults - to PreemptLowerPriority if unset. This - field is beta-level, gated by the NonPreemptingPriority - feature-gate. - type: string - priority: - description: The priority value. Various - system components use this field to find - the priority of the pod. When Priority - Admission Controller is enabled, it prevents - users from setting this field. The admission - controller populates this field from PriorityClassName. - The higher the value, the higher the priority. - type: integer - format: int32 - priorityClassName: - description: If specified, indicates the - pod's priority. "system-node-critical" - and "system-cluster-critical" are two - special keywords which indicate the highest - priorities with the former being the highest - priority. Any other name must be defined - by creating a PriorityClass object with - that name. If not specified, the pod priority - will be default or zero if there is no - default. - type: string - readinessGates: - description: 'If specified, all readiness - gates will be evaluated for pod readiness. - A pod is ready when all its containers - are ready AND all conditions specified - in the readiness gates have status equal - to "True" More info: https://git.k8s.io/enhancements/keps/sig-network/0007-pod-ready%2B%2B.md' - type: array - items: - description: PodReadinessGate contains - the reference to a pod condition - type: object - required: - - conditionType - properties: - conditionType: - description: ConditionType refers - to a condition in the pod's condition - list with matching type. - type: string - restartPolicy: - description: 'Restart policy for all containers - within the pod. One of Always, OnFailure, - Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' - type: string - runtimeClassName: - description: 'RuntimeClassName refers to - a RuntimeClass object in the node.k8s.io - group, which should be used to run this - pod. If no RuntimeClass resource matches - the named class, the pod will not be run. - If unset or empty, the "legacy" RuntimeClass - will be used, which is an implicit class - with an empty definition that uses the - default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md - This is a beta feature as of Kubernetes - v1.14.' - type: string - schedulerName: - description: If specified, the pod will - be dispatched by specified scheduler. - If not specified, the pod will be dispatched - by default scheduler. - type: string - securityContext: - description: 'SecurityContext holds pod-level - security attributes and common container - settings. Optional: Defaults to empty. See - type description for default values of - each field.' - type: object - properties: - fsGroup: - description: "A special supplemental - group that applies to all containers - in a pod. Some volume types allow - the Kubelet to change the ownership - of that volume to be owned by the - pod: \n 1. The owning GID will be - the FSGroup 2. The setgid bit is set - (new files created in the volume will - be owned by FSGroup) 3. The permission - bits are OR'd with rw-rw---- \n If - unset, the Kubelet will not modify - the ownership and permissions of any - volume." - type: integer - format: int64 - fsGroupChangePolicy: - description: 'fsGroupChangePolicy defines - behavior of changing ownership and - permission of the volume before being - exposed inside Pod. This field will - only apply to volume types which support - fsGroup based ownership(and permissions). - It will have no effect on ephemeral - volume types such as: secret, configmaps - and emptydir. Valid values are "OnRootMismatch" - and "Always". If not specified defaults - to "Always".' - type: string - runAsGroup: - description: The GID to run the entrypoint - of the container process. Uses runtime - default if unset. May also be set - in SecurityContext. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence for that container. - type: integer - format: int64 - runAsNonRoot: - description: Indicates that the container - must run as a non-root user. If true, - the Kubelet will validate the image - at runtime to ensure that it does - not run as UID 0 (root) and fail to - start the container if it does. If - unset or false, no such validation - will be performed. May also be set - in SecurityContext. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: boolean - runAsUser: - description: The UID to run the entrypoint - of the container process. Defaults - to user specified in image metadata - if unspecified. May also be set in - SecurityContext. If set in both SecurityContext - and PodSecurityContext, the value - specified in SecurityContext takes - precedence for that container. - type: integer - format: int64 - seLinuxOptions: - description: The SELinux context to - be applied to all containers. If unspecified, - the container runtime will allocate - a random SELinux context for each - container. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence for that container. - 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. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + stdin: + description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false + type: boolean + terminationMessagePath: + description: 'Optional: Path at which the file to which the container''s termination message will be written is mounted into the container''s filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.' type: string - type: - description: Type is a SELinux type - label that applies to the container. + terminationMessagePolicy: + description: Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated. type: string - user: - description: User is a SELinux user - label that applies to the container. + tty: + description: Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be used by the container. + type: array + items: + description: volumeDevice describes a mapping of a raw block device within a container. + type: object + required: + - devicePath + - name + properties: + devicePath: + description: devicePath is the path inside of the container that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim in the pod + type: string + volumeMounts: + description: Pod volumes to mount into the container's filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. + type: object + required: + - mountPath + - name + properties: + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. + type: string + workingDir: + description: Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated. type: string - seccompProfile: - description: The seccomp options to - use by the containers in this pod. + nodeName: + description: NodeName is a request to schedule this pod onto a specific node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits resource requirements. + type: string + nodeSelector: + description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' + type: object + additionalProperties: + type: string + overhead: + description: 'Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. This field will be autopopulated at admission time by the RuntimeClass admission controller. If the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests. The RuntimeClass admission controller will reject Pod create requests which have the overhead already set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero. More info: https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md This field is alpha-level as of Kubernetes v1.16, and is only honored by servers that enable the PodOverhead feature.' + 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 + preemptionPolicy: + description: PreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is beta-level, gated by the NonPreemptingPriority feature-gate. + type: string + priority: + description: The priority value. Various system components use this field to find the priority of the pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. + type: integer + format: int32 + priorityClassName: + description: If specified, indicates the pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default. + type: string + readinessGates: + description: 'If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to "True" More info: https://git.k8s.io/enhancements/keps/sig-network/0007-pod-ready%2B%2B.md' + type: array + items: + description: PodReadinessGate contains the reference to a pod condition type: object required: - - type - properties: - localhostProfile: - description: localhostProfile indicates - a profile defined in a file on - the node should be used. The profile - must be preconfigured on the node - to work. Must be a descending - path, relative to the kubelet's - configured seccomp profile location. - Must only be set if type is "Localhost". - type: string - type: - description: "type indicates which - kind of seccomp profile will be - applied. Valid options are: \n - Localhost - a profile defined - in a file on the node should be - used. RuntimeDefault - the container - runtime default profile should - be used. Unconfined - no profile - should be applied." - type: string - supplementalGroups: - description: A list of groups applied - to the first process run in each container, - in addition to the container's primary - GID. If unspecified, no groups will - be added to any container. - type: array - items: - type: integer - format: int64 - sysctls: - description: Sysctls hold a list of - namespaced sysctls used for the pod. - Pods with unsupported sysctls (by - the container runtime) might fail - to launch. - type: array - items: - description: Sysctl defines a kernel - parameter to be set - type: object - required: - - name - - value - properties: - name: - description: Name of a property - to set - type: string - value: - description: Value of a property - to set - type: string - windowsOptions: - description: The Windows specific settings - applied to all containers. If unspecified, - the options within a container's SecurityContext - will be used. If set in both SecurityContext - and PodSecurityContext, the value - specified in SecurityContext takes - precedence. - type: object + - conditionType properties: - gmsaCredentialSpec: - description: GMSACredentialSpec - is where the GMSA admission webhook - (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA - credential spec named by the GMSACredentialSpecName - field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName - is the name of the GMSA credential - spec to use. - type: string - runAsUserName: - description: The UserName in Windows - to run the entrypoint of the container - process. Defaults to the user - specified in image metadata if - unspecified. May also be set in - PodSecurityContext. If set in - both SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. + conditionType: + description: ConditionType refers to a condition in the pod's condition list with matching type. type: string - serviceAccount: - description: 'DeprecatedServiceAccount is - a depreciated alias for ServiceAccountName. - Deprecated: Use serviceAccountName instead.' - type: string - serviceAccountName: - description: 'ServiceAccountName is the - name of the ServiceAccount to use to run - this pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/' - type: string - setHostnameAsFQDN: - description: If true the pod's hostname - will be configured as the pod's FQDN, - rather than the leaf name (the default). - In Linux containers, this means setting - the FQDN in the hostname field of the - kernel (the nodename field of struct utsname). - In Windows containers, this means setting - the registry value of hostname for the - registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters - to FQDN. If a pod does not have FQDN, - this has no effect. Default to false. - type: boolean - shareProcessNamespace: - description: 'Share a single process namespace - between all of the containers in a pod. - When this is set containers will be able - to view and signal processes from other - containers in the same pod, and the first - process in each container will not be - assigned PID 1. HostPID and ShareProcessNamespace - cannot both be set. Optional: Default - to false.' - type: boolean - subdomain: - description: If specified, the fully qualified - Pod hostname will be "...svc.". If not - specified, the pod will not have a domainname - at all. - type: string - terminationGracePeriodSeconds: - description: Optional duration in seconds - the pod needs to terminate gracefully. - May be decreased in delete request. Value - must be non-negative integer. The value - zero indicates delete immediately. If - this value is nil, the default grace period - will be used instead. The grace period - is the duration in seconds after the processes - running in the pod are sent a termination - signal and the time when the processes - are forcibly halted with a kill signal. - Set this value longer than the expected - cleanup time for your process. Defaults - to 30 seconds. - type: integer - format: int64 - tolerations: - description: If specified, the pod's tolerations. - type: array - items: - description: The pod this Toleration is - attached to tolerates any taint that - matches the triple - using the matching operator . + restartPolicy: + description: 'Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + type: string + runtimeClassName: + description: 'RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md This is a beta feature as of Kubernetes v1.14.' + type: string + schedulerName: + description: If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler. + type: string + securityContext: + description: 'SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field.' 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. + fsGroup: + description: "A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod: \n 1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw---- \n If unset, the Kubelet will not modify the ownership and permissions of any volume." 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. + fsGroupChangePolicy: + description: 'fsGroupChangePolicy defines behavior of changing ownership and permission of the volume before being exposed inside Pod. This field will only apply to volume types which support fsGroup based ownership(and permissions). It will have no effect on ephemeral volume types such as: secret, configmaps and emptydir. Valid values are "OnRootMismatch" and "Always". If not specified, "Always" is used.' type: string - topologySpreadConstraints: - description: TopologySpreadConstraints describes - how a group of pods ought to spread across - topology domains. Scheduler will schedule - pods in a way which abides by the constraints. - All topologySpreadConstraints are ANDed. - type: array - items: - description: TopologySpreadConstraint - specifies how to spread matching pods - among the given topology. - type: object - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - properties: - labelSelector: - description: LabelSelector is used - to find matching pods. Pods that - match this label selector are counted - to determine the number of pods - in their corresponding topology - domain. - 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 - maxSkew: - description: 'MaxSkew describes the - degree to which pods may be unevenly - distributed. When `whenUnsatisfiable=DoNotSchedule`, - it is the maximum permitted difference - between the number of matching pods - in the target topology and the global - minimum. For example, in a 3-zone - cluster, MaxSkew is set to 1, and - pods with the same labelSelector - spread as 1/1/0: | zone1 | zone2 - | zone3 | | P | P | | - - if MaxSkew is 1, incoming pod - can only be scheduled to zone3 to - become 1/1/1; scheduling it onto - zone1(zone2) would make the ActualSkew(2-0) - on zone1(zone2) violate MaxSkew(1). - - if MaxSkew is 2, incoming pod - can be scheduled onto any zone. - When `whenUnsatisfiable=ScheduleAnyway`, - it is used to give higher precedence - to topologies that satisfy it. It''s - a required field. Default value - is 1 and 0 is not allowed.' + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. type: integer - format: int32 - topologyKey: - description: TopologyKey is the key - of node labels. Nodes that have - a label with this key and identical - values are considered to be in the - same topology. We consider each - as a "bucket", and - try to put balanced number of pods - into each bucket. It's a required - field. - type: string - whenUnsatisfiable: - description: 'WhenUnsatisfiable indicates - how to deal with a pod if it doesn''t - satisfy the spread constraint. - - DoNotSchedule (default) tells the - scheduler not to schedule it. - - ScheduleAnyway tells the scheduler - to schedule the pod in any location, but - giving higher precedence to topologies - that would help reduce the skew. - A constraint is considered "Unsatisfiable" - for an incoming pod if and only - if every possible node assigment - for that pod would violate "MaxSkew" - on some topology. For example, in - a 3-zone cluster, MaxSkew is set - to 1, and pods with the same labelSelector - spread as 3/1/1: | zone1 | zone2 - | zone3 | | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, - incoming pod can only be scheduled - to zone2(zone3) to become 3/2/1(3/1/2) - as ActualSkew(2-1) on zone2(zone3) - satisfies MaxSkew(1). In other words, - the cluster can still be imbalanced, - but scheduler won''t make it *more* - imbalanced. It''s a required field.' - type: string - x-kubernetes-list-map-keys: - - topologyKey - - whenUnsatisfiable - x-kubernetes-list-type: map - volumes: - description: 'List of volumes that can be - mounted by containers belonging to the - pod. More info: https://kubernetes.io/docs/concepts/storage/volumes' - type: array - items: - description: Volume represents a named - volume in a pod that may be accessed - by any container in the pod. - type: object - required: - - name - properties: - awsElasticBlockStore: - description: 'AWSElasticBlockStore - represents an AWS Disk resource - that is attached to a kubelet''s - host machine and then exposed to - the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: object - required: - - volumeID - properties: - fsType: - description: 'Filesystem type - of the volume that you want - to mount. Tip: Ensure that the - filesystem type is supported - by the host operating system. - Examples: "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore - TODO: how do we prevent errors - in the filesystem from compromising - the machine' - type: string - partition: - description: 'The partition in - the volume that you want to - mount. If omitted, the default - is to mount by volume name. - Examples: For volume /dev/sda1, - you specify the partition as - "1". Similarly, the volume partition - for /dev/sda is "0" (or you - can leave the property empty).' - type: integer - format: int32 - readOnly: - description: 'Specify "true" to - force and set the ReadOnly property - in VolumeMounts to "true". If - omitted, the default is "false". - More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: boolean - volumeID: - description: 'Unique ID of the - persistent disk resource in - AWS (Amazon EBS volume). More - info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - azureDisk: - description: AzureDisk represents - an Azure Data Disk mount on the - host and bind mount to the pod. + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to all containers. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. type: object - required: - - diskName - - diskURI properties: - cachingMode: - description: 'Host Caching mode: - None, Read Only, Read Write.' - type: string - diskName: - description: The Name of the data - disk in the blob storage + level: + description: Level is SELinux level label that applies to the container. type: string - diskURI: - description: The URI the data - disk in the blob storage + role: + description: Role is a SELinux role label that applies to the container. type: string - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. + type: + description: Type is a SELinux type label that applies to the container. type: string - kind: - description: 'Expected values - Shared: multiple blob disks - per storage account Dedicated: - single blob disk per storage - account Managed: azure managed - data disk (only in managed availability - set). defaults to shared' + user: + description: User is a SELinux user label that applies to the container. type: string - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - azureFile: - description: AzureFile represents - an Azure File Service mount on the - host and bind mount to the pod. + seccompProfile: + description: The seccomp options to use by the containers in this pod. type: object required: - - secretName - - shareName + - type properties: - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - secretName: - description: the name of secret - that contains Azure Storage - Account Name and Key + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". type: string - shareName: - description: Share Name + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." type: string - cephfs: - description: CephFS represents a Ceph - FS mount on the host that shares - a pod's lifetime + supplementalGroups: + description: A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container. + type: array + items: + type: integer + format: int64 + sysctls: + description: Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch. + type: array + items: + description: Sysctl defines a kernel parameter to be set + type: object + required: + - name + - value + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options within a container's SecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. type: object - required: - - monitors properties: - monitors: - description: 'Required: Monitors - is a collection of Ceph monitors - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: array - items: - type: string - path: - description: 'Optional: Used as - the mounted root, rather than - the full Ceph tree, default - is /' + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. type: string - readOnly: - description: 'Optional: Defaults - to false (read/write). ReadOnly - here will force the ReadOnly - setting in VolumeMounts. More - info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: boolean - secretFile: - description: 'Optional: SecretFile - is the path to key ring for - User, default is /etc/ceph/user.secret - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - secretRef: - description: 'Optional: SecretRef - is reference to the authentication - secret for User, default is - empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: object - properties: - 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 - user: - description: 'Optional: User is - the rados user name, default - is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. type: string - cinder: - description: 'Cinder represents a - cinder volume attached and mounted - on kubelets host machine. More info: - https://examples.k8s.io/mysql-cinder-pd/README.md' - type: object - required: - - volumeID - properties: - fsType: - description: 'Filesystem type - to mount. Must be a filesystem - type supported by the host operating - system. Examples: "ext4", "xfs", - "ntfs". Implicitly inferred - to be "ext4" if unspecified. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. type: string - readOnly: - description: 'Optional: Defaults - to false (read/write). ReadOnly - here will force the ReadOnly - setting in VolumeMounts. More - info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: boolean - secretRef: - description: 'Optional: points - to a secret object containing - parameters used to connect to - OpenStack.' - type: object - properties: - 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?' + serviceAccount: + description: 'DeprecatedServiceAccount is a depreciated alias for ServiceAccountName. Deprecated: Use serviceAccountName instead.' + type: string + serviceAccountName: + description: 'ServiceAccountName is the name of the ServiceAccount to use to run this pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/' + type: string + setHostnameAsFQDN: + description: If true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default). In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname). In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters to FQDN. If a pod does not have FQDN, this has no effect. Default to false. + type: boolean + shareProcessNamespace: + description: 'Share a single process namespace between all of the containers in a pod. When this is set containers will be able to view and signal processes from other containers in the same pod, and the first process in each container will not be assigned PID 1. HostPID and ShareProcessNamespace cannot both be set. Optional: Default to false.' + type: boolean + subdomain: + description: If specified, the fully qualified Pod hostname will be "...svc.". If not specified, the pod will not have a domainname at all. + type: string + terminationGracePeriodSeconds: + description: Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period will be used instead. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. Defaults to 30 seconds. + type: integer + format: int64 + tolerations: + description: If specified, the pod's tolerations. + 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 + topologySpreadConstraints: + description: TopologySpreadConstraints describes how a group of pods ought to spread across topology domains. Scheduler will schedule pods in a way which abides by the constraints. All topologySpreadConstraints are ANDed. + type: array + items: + description: TopologySpreadConstraint specifies how to spread matching pods among the given topology. + type: object + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + properties: + labelSelector: + description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain. + 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 - volumeID: - description: 'volume id used to - identify the volume in cinder. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - configMap: - description: ConfigMap represents - a configMap that should populate - this volume - type: object - properties: - defaultMode: - description: 'Optional: mode bits - used to set permissions on created - files by default. Must be an - octal value between 0000 and - 0777 or a decimal value between - 0 and 511. YAML accepts both - octal and decimal values, JSON - requires decimal values for - mode bits. Defaults to 0644. - Directories within the path - are not affected by this setting. - This might be in conflict with - other options that affect the - file mode, like fsGroup, and - the result can be other mode - bits set.' - type: integer - format: int32 - items: - description: If unspecified, each - key-value pair in the Data field - of the referenced ConfigMap - will be projected into the volume - as a file whose name is the - key and content is the value. - If specified, the listed keys - will be projected into the specified - paths, and unlisted keys will - not be present. If a key is - specified which is not present - in the ConfigMap, the volume - setup will error unless it is - marked optional. Paths must - be relative and may not contain - the '..' path or start with - '..'. - type: array - items: - description: Maps a string key - to a path within a volume. + maxSkew: + description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 1/1/0: | zone1 | zone2 | zone3 | | P | P | | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 1/1/1; scheduling it onto zone1(zone2) would make the ActualSkew(2-0) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.' + type: integer + format: int32 + topologyKey: + description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a "bucket", and try to put balanced number of pods into each bucket. It's a required field. + type: string + whenUnsatisfiable: + description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assigment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.' + type: string + x-kubernetes-list-map-keys: + - topologyKey + - whenUnsatisfiable + x-kubernetes-list-type: map + volumes: + description: 'List of volumes that can be mounted by containers belonging to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes' + type: array + items: + description: Volume represents a named volume in a pod that may be accessed by any container in the pod. + type: object + required: + - name + properties: + awsElasticBlockStore: + description: 'AWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty).' + type: integer + format: int32 + readOnly: + description: 'Specify "true" to force and set the ReadOnly property in VolumeMounts to "true". If omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + volumeID: + description: 'Unique ID of the persistent disk resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + azureDisk: + description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. + type: object + required: + - diskName + - diskURI + properties: + cachingMode: + description: 'Host Caching mode: None, Read Only, Read Write.' + type: string + diskName: + description: The Name of the data disk in the blob storage + type: string + diskURI: + description: The URI the data disk in the blob storage + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + kind: + description: 'Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + azureFile: + description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. + type: object + required: + - secretName + - shareName + properties: + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretName: + description: the name of secret that contains Azure Storage Account Name and Key + type: string + shareName: + description: Share Name + type: string + cephfs: + description: CephFS represents a Ceph FS mount on the host that shares a pod's lifetime + type: object + required: + - monitors + properties: + monitors: + description: 'Required: Monitors is a collection of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: + type: string + path: + description: 'Optional: Used as the mounted root, rather than the full Ceph tree, default is /' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + secretFile: + description: 'Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + secretRef: + description: 'Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: object - required: - - key - - path properties: - key: - description: The key to - project. + 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 - mode: - description: 'Optional: - mode bits used to set - permissions on this file. - Must be an octal value - between 0000 and 0777 - or a decimal value between - 0 and 511. YAML accepts - both octal and decimal - values, JSON requires - decimal values for mode - bits. If not specified, - the volume defaultMode - will be used. This might - be in conflict with other - options that affect the - file mode, like fsGroup, - and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: The relative - path of the file to map - the key to. May not be - an absolute path. May - not contain the path element - '..'. May not start with - the string '..'. + user: + description: 'Optional: User is the rados user name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + cinder: + description: 'Cinder represents a cinder volume attached and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + secretRef: + description: 'Optional: points to a secret object containing parameters used to connect to OpenStack.' + type: object + properties: + 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 - 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 keys must be - defined - type: boolean - csi: - description: CSI (Container Storage - Interface) represents ephemeral - storage that is handled by certain - external CSI drivers (Beta feature). - type: object - required: - - driver - properties: - driver: - description: Driver is the name - of the CSI driver that handles - this volume. Consult with your - admin for the correct name as - registered in the cluster. - type: string - fsType: - description: Filesystem type to - mount. Ex. "ext4", "xfs", "ntfs". - If not provided, the empty value - is passed to the associated - CSI driver which will determine - the default filesystem to apply. - type: string - nodePublishSecretRef: - description: NodePublishSecretRef - is a reference to the secret - object containing sensitive - information to pass to the CSI - driver to complete the CSI NodePublishVolume - and NodeUnpublishVolume calls. - This field is optional, and may - be empty if no secret is required. - If the secret object contains - more than one secret, all secret - references are passed. - type: object - properties: - 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 - readOnly: - description: Specifies a read-only - configuration for the volume. - Defaults to false (read/write). - type: boolean - volumeAttributes: - description: VolumeAttributes - stores driver-specific properties - that are passed to the CSI driver. - Consult your driver's documentation - for supported values. - type: object - additionalProperties: + volumeID: + description: 'volume id used to identify the volume in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + configMap: + description: ConfigMap represents a configMap that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 keys must be defined + type: boolean + csi: + description: CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the CSI driver that handles this volume. Consult with your admin for the correct name as registered in the cluster. type: string - downwardAPI: - description: DownwardAPI represents - downward API about the pod that - should populate this volume - type: object - properties: - defaultMode: - description: 'Optional: mode bits - to use on created files by default. - Must be a Optional: mode bits - used to set permissions on created - files by default. Must be an - octal value between 0000 and - 0777 or a decimal value between - 0 and 511. YAML accepts both - octal and decimal values, JSON - requires decimal values for - mode bits. Defaults to 0644. - Directories within the path - are not affected by this setting. - This might be in conflict with - other options that affect the - file mode, like fsGroup, and - the result can be other mode - bits set.' - type: integer - format: int32 - items: - description: Items is a list of - downward API volume file - type: array - items: - description: DownwardAPIVolumeFile - represents information to - create the file containing - the pod field + fsType: + description: Filesystem type to mount. Ex. "ext4", "xfs", "ntfs". If not provided, the empty value is passed to the associated CSI driver which will determine the default filesystem to apply. + type: string + nodePublishSecretRef: + description: NodePublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodePublishVolume and NodeUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secret references are passed. type: object - required: - - path properties: - fieldRef: - description: 'Required: - Selects a field of the - pod: only annotations, - labels, name and namespace - are supported.' - 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 - mode: - description: 'Optional: - mode bits used to set - permissions on this file, - must be an octal value - between 0000 and 0777 - or a decimal value between - 0 and 511. YAML accepts - both octal and decimal - values, JSON requires - decimal values for mode - bits. If not specified, - the volume defaultMode - will be used. This might - be in conflict with other - options that affect the - file mode, like fsGroup, - and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: 'Required: - Path is the relative - path name of the file - to be created. Must not - be absolute or contain - the ''..'' path. Must - be utf-8 encoded. The - first item of the relative - path must not start with - ''..''' + 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 - resourceFieldRef: - description: 'Selects a - resource of the container: - only resources limits - and requests (limits.cpu, - limits.memory, requests.cpu - and requests.memory) 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 - emptyDir: - description: 'EmptyDir represents - a temporary directory that shares - a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: object - properties: - medium: - description: 'What type of storage - medium should back this directory. - The default is "" which means - to use the node''s default medium. - Must be an empty string (default) - or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: string - sizeLimit: - description: 'Total amount of - local storage required for this - EmptyDir volume. The size limit - is also applicable for memory - medium. The maximum usage on - memory medium EmptyDir would - be the minimum value between - the SizeLimit specified here - and the sum of memory limits - of all containers in a pod. - The default is nil which means - that the limit is undefined. - More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' - 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 - ephemeral: - description: "Ephemeral represents - a volume that is handled by a cluster - storage driver (Alpha feature). - The volume's lifecycle is tied to - the pod that defines it - it will - be created before the pod starts, - and deleted when the pod is removed. - \n Use this if: a) the volume is - only needed while the pod runs, - b) features of normal volumes like - restoring from snapshot or capacity - \ tracking are needed, c) the - storage driver is specified through - a storage class, and d) the storage - driver supports dynamic volume provisioning - through a PersistentVolumeClaim - (see EphemeralVolumeSource for more - \ information on the connection - between this volume type and - PersistentVolumeClaim). \n Use PersistentVolumeClaim - or one of the vendor-specific APIs - for volumes that persist for longer - than the lifecycle of an individual - pod. \n Use CSI for light-weight - local ephemeral volumes if the CSI - driver is meant to be used that - way - see the documentation of the - driver for more information. \n - A pod can use both types of ephemeral - volumes and persistent volumes at - the same time." - type: object - properties: - readOnly: - description: Specifies a read-only - configuration for the volume. - Defaults to false (read/write). - type: boolean - volumeClaimTemplate: - description: "Will be used to - create a stand-alone PVC to - provision the volume. The pod - in which this EphemeralVolumeSource - is embedded will be the owner - of the PVC, i.e. the PVC will - be deleted together with the - pod. The name of the PVC will - be `-` - where `` is the - name from the `PodSpec.Volumes` - array entry. Pod validation - will reject the pod if the concatenated - name is not valid for a PVC - (for example, too long). \n - An existing PVC with that name - that is not owned by the pod - will *not* be used for the pod - to avoid using an unrelated - volume by mistake. Starting - the pod is then blocked until - the unrelated PVC is removed. - If such a pre-created PVC is - meant to be used by the pod, - the PVC has to updated with - an owner reference to the pod - once the pod exists. Normally - this should not be necessary, - but it may be useful when manually - reconstructing a broken cluster. - \n This field is read-only and - no changes will be made by Kubernetes - to the PVC after it has been - created. \n Required, must not - be nil." - type: object - required: - - spec - properties: - metadata: - description: May contain labels - and annotations that will - be copied into the PVC when - creating it. No other fields - are allowed and will be - rejected during validation. - type: object - spec: - description: The specification - for the PersistentVolumeClaim. - The entire content is copied - unchanged into the PVC that - gets created from this template. - The same fields as in a - PersistentVolumeClaim are - also valid here. + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeAttributes: + description: VolumeAttributes stores driver-specific properties that are passed to the CSI driver. Consult your driver's documentation for supported values. + type: object + additionalProperties: + type: string + downwardAPI: + description: DownwardAPI represents downward API about the pod that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created files by default. Must be a Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: Items is a list of downward API volume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field type: object + required: + - path properties: - accessModes: - description: 'AccessModes - contains the desired - access modes the volume - should have. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' - type: array - items: - type: string - dataSource: - description: 'This field - can be used to specify - either: * An existing - VolumeSnapshot object - (snapshot.storage.k8s.io/VolumeSnapshot - - Beta) * An existing - PVC (PersistentVolumeClaim) - * An existing custom - resource/object that - implements data population - (Alpha) In order to - use VolumeSnapshot object - types, the appropriate - feature gate must be - enabled (VolumeSnapshotDataSource - or AnyVolumeDataSource) - If the provisioner or - an external controller - can support the specified - data source, it will - create a new volume - based on the contents - of the specified data - source. If the specified - data source is not supported, - the volume will not - be created and the failure - will be reported as - an event. In the future, - we plan to support more - data source types and - the behavior of the - provisioner may change.' + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' type: object required: - - kind - - name + - fieldPath properties: - apiGroup: - description: APIGroup - is the group for - the resource being - referenced. If APIGroup - is not specified, - the specified Kind - must be in the core - API group. For any - other third-party - types, APIGroup - is required. + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". type: string - kind: - description: Kind - is the type of resource - being referenced + fieldPath: + description: Path of the field to select in the specified API version. type: string - name: - description: Name - is the name of resource - being referenced - type: string - resources: - description: 'Resources - represents the minimum - resources the volume - should have. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: 'Required: Path is the relative path name of the file to be created. Must not be absolute or contain the ''..'' path. Must be utf-8 encoded. The first item of the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.' type: object + required: + - resource properties: - limits: - description: 'Limits - describes the maximum - amount of compute - resources allowed. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: + 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 - selector: - description: A label query - over volumes to consider - for binding. - 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. + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + emptyDir: + description: 'EmptyDir represents a temporary directory that shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: object + properties: + medium: + description: 'What type of storage medium should back this directory. The default is "" which means to use the node''s default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: string + sizeLimit: + description: 'Total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' + 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 + ephemeral: + description: "Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed. \n Use this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity tracking are needed, c) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through a PersistentVolumeClaim (see EphemeralVolumeSource for more information on the connection between this volume type and PersistentVolumeClaim). \n Use PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod. \n Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information. \n A pod can use both types of ephemeral volumes and persistent volumes at the same time." + type: object + properties: + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeClaimTemplate: + description: "Will be used to create a stand-alone PVC to provision the volume. The pod in which this EphemeralVolumeSource is embedded will be the owner of the PVC, i.e. the PVC will be deleted together with the pod. The name of the PVC will be `-` where `` is the name from the `PodSpec.Volumes` array entry. Pod validation will reject the pod if the concatenated name is not valid for a PVC (for example, too long). \n An existing PVC with that name that is not owned by the pod will *not* be used for the pod to avoid using an unrelated volume by mistake. Starting the pod is then blocked until the unrelated PVC is removed. If such a pre-created PVC is meant to be used by the pod, the PVC has to updated with an owner reference to the pod once the pod exists. Normally this should not be necessary, but it may be useful when manually reconstructing a broken cluster. \n This field is read-only and no changes will be made by Kubernetes to the PVC after it has been created. \n Required, must not be nil." + type: object + required: + - spec + properties: + metadata: + description: May contain labels and annotations that will be copied into the PVC when creating it. No other fields are allowed and will be rejected during validation. + type: object + spec: + description: The specification for the PersistentVolumeClaim. The entire content is copied unchanged into the PVC that gets created from this template. The same fields as in a PersistentVolumeClaim are also valid here. + type: object + properties: + accessModes: + description: 'AccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + type: array + items: + type: string + dataSource: + description: 'This field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) * An existing custom resource that implements data population (Alpha) In order to use custom resource types that implement data population, the AnyVolumeDataSource feature gate must be enabled. If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source.' + type: object + required: + - kind + - name + properties: + apiGroup: + description: APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + resources: + description: 'Resources represents the minimum resources the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' 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: + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + selector: + description: A label query over volumes to consider for binding. + 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 - 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 - storageClassName: - description: 'Name of - the StorageClass required - by the claim. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' - type: string - volumeMode: - description: volumeMode - defines what type of - volume is required by - the claim. Value of - Filesystem is implied - when not included in - claim spec. - type: string - volumeName: - description: VolumeName - is the binding reference - to the PersistentVolume - backing this claim. - type: string - fc: - description: FC represents a Fibre - Channel resource that is attached - to a kubelet's host machine and - then exposed to the pod. - type: object - properties: - fsType: - description: 'Filesystem type - to mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. TODO: how do - we prevent errors in the filesystem - from compromising the machine' - type: string - lun: - description: 'Optional: FC target - lun number' - type: integer - format: int32 - readOnly: - description: 'Optional: Defaults - to false (read/write). ReadOnly - here will force the ReadOnly - setting in VolumeMounts.' - type: boolean - targetWWNs: - description: 'Optional: FC target - worldwide names (WWNs)' - type: array - items: + 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 + storageClassName: + description: 'Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' + type: string + volumeMode: + description: volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. + type: string + volumeName: + description: VolumeName is the binding reference to the PersistentVolume backing this claim. + type: string + fc: + description: FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod. + type: object + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. TODO: how do we prevent errors in the filesystem from compromising the machine' type: string - wwids: - description: 'Optional: FC volume - world wide identifiers (wwids) - Either wwids or combination - of targetWWNs and lun must be - set, but not both simultaneously.' - type: array - items: + lun: + description: 'Optional: FC target lun number' + type: integer + format: int32 + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + targetWWNs: + description: 'Optional: FC target worldwide names (WWNs)' + type: array + items: + type: string + wwids: + description: 'Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.' + type: array + items: + type: string + flexVolume: + description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the driver to use for this volume. type: string - flexVolume: - description: FlexVolume represents - a generic volume resource that is - provisioned/attached using an exec - based plugin. - type: object - required: - - driver - properties: - driver: - description: Driver is the name - of the driver to use for this - volume. - type: string - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - The default filesystem depends - on FlexVolume script. - type: string - options: - description: 'Optional: Extra - command options if any.' - type: object - additionalProperties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script. type: string - readOnly: - description: 'Optional: Defaults - to false (read/write). ReadOnly - here will force the ReadOnly - setting in VolumeMounts.' - type: boolean - secretRef: - description: 'Optional: SecretRef - is reference to the secret object - containing sensitive information - to pass to the plugin scripts. - This may be empty if no secret - object is specified. If the - secret object contains more - than one secret, all secrets - are passed to the plugin scripts.' - type: object - properties: - 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?' + options: + description: 'Optional: Extra command options if any.' + type: object + additionalProperties: type: string - flocker: - description: Flocker represents a - Flocker volume attached to a kubelet's - host machine. This depends on the - Flocker control service being running - type: object - properties: - datasetName: - description: Name of the dataset - stored as metadata -> name on - the dataset for Flocker should - be considered as deprecated - type: string - datasetUUID: - description: UUID of the dataset. - This is unique identifier of - a Flocker dataset - type: string - gcePersistentDisk: - description: 'GCEPersistentDisk represents - a GCE Disk resource that is attached - to a kubelet''s host machine and - then exposed to the pod. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: object - required: - - pdName - properties: - fsType: - description: 'Filesystem type - of the volume that you want - to mount. Tip: Ensure that the - filesystem type is supported - by the host operating system. - Examples: "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk - TODO: how do we prevent errors - in the filesystem from compromising - the machine' - type: string - partition: - description: 'The partition in - the volume that you want to - mount. If omitted, the default - is to mount by volume name. - Examples: For volume /dev/sda1, - you specify the partition as - "1". Similarly, the volume partition - for /dev/sda is "0" (or you - can leave the property empty). - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: integer - format: int32 - pdName: - description: 'Unique name of the - PD resource in GCE. Used to - identify the disk in GCE. More - info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - readOnly: - description: 'ReadOnly here will - force the ReadOnly setting in - VolumeMounts. Defaults to false. - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: boolean - gitRepo: - description: 'GitRepo represents a - git repository at a particular revision. - DEPRECATED: GitRepo is deprecated. - To provision a container with a - git repo, mount an EmptyDir into - an InitContainer that clones the - repo using git, then mount the EmptyDir - into the Pod''s container.' - type: object - required: - - repository - properties: - directory: - description: Target directory - name. Must not contain or start - with '..'. If '.' is supplied, - the volume directory will be - the git repository. Otherwise, - if specified, the volume will - contain the git repository in - the subdirectory with the given - name. - type: string - repository: - description: Repository URL - type: string - revision: - description: Commit hash for the - specified revision. - type: string - glusterfs: - description: 'Glusterfs represents - a Glusterfs mount on the host that - shares a pod''s lifetime. More info: - https://examples.k8s.io/volumes/glusterfs/README.md' - type: object - required: - - endpoints - - path - properties: - endpoints: - description: 'EndpointsName is - the endpoint name that details - Glusterfs topology. More info: - https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - path: - description: 'Path is the Glusterfs - volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - readOnly: - description: 'ReadOnly here will - force the Glusterfs volume to - be mounted with read-only permissions. - Defaults to false. More info: - https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: boolean - hostPath: - description: 'HostPath represents - a pre-existing file or directory - on the host machine that is directly - exposed to the container. This is - generally used for system agents - or other privileged things that - are allowed to see the host machine. - Most containers will NOT need this. - More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath - --- TODO(jonesdl) We need to restrict - who can use host directory mounts - and who can/can not mount host directories - as read/write.' - type: object - required: - - path - properties: - path: - description: 'Path of the directory - on the host. If the path is - a symlink, it will follow the - link to the real path. More - info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - type: - description: 'Type for HostPath - Volume Defaults to "" More info: - https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - iscsi: - description: 'ISCSI represents an - ISCSI Disk resource that is attached - to a kubelet''s host machine and - then exposed to the pod. More info: - https://examples.k8s.io/volumes/iscsi/README.md' - type: object - required: - - iqn - - lun - - targetPortal - properties: - chapAuthDiscovery: - description: whether support iSCSI - Discovery CHAP authentication - type: boolean - chapAuthSession: - description: whether support iSCSI - Session CHAP authentication - type: boolean - fsType: - description: 'Filesystem type - of the volume that you want - to mount. Tip: Ensure that the - filesystem type is supported - by the host operating system. - Examples: "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi - TODO: how do we prevent errors - in the filesystem from compromising - the machine' - type: string - initiatorName: - description: Custom iSCSI Initiator - Name. If initiatorName is specified - with iscsiInterface simultaneously, - new iSCSI interface : will be - created for the connection. - type: string - iqn: - description: Target iSCSI Qualified - Name. - type: string - iscsiInterface: - description: iSCSI Interface Name - that uses an iSCSI transport. - Defaults to 'default' (tcp). - type: string - lun: - description: iSCSI Target Lun - number. - type: integer - format: int32 - portals: - description: iSCSI Target Portal - List. The portal is either an - IP or ip_addr:port if the port - is other than default (typically - TCP ports 860 and 3260). - type: array - items: + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + secretRef: + description: 'Optional: SecretRef is reference to the secret object containing sensitive information to pass to the plugin scripts. This may be empty if no secret object is specified. If the secret object contains more than one secret, all secrets are passed to the plugin scripts.' + type: object + properties: + 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 + flocker: + description: Flocker represents a Flocker volume attached to a kubelet's host machine. This depends on the Flocker control service being running + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata -> name on the dataset for Flocker should be considered as deprecated type: string - readOnly: - description: ReadOnly here will - force the ReadOnly setting in - VolumeMounts. Defaults to false. - type: boolean - secretRef: - description: CHAP Secret for iSCSI - target and initiator authentication - type: object - properties: - 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 - targetPortal: - description: iSCSI Target Portal. - The Portal is either an IP or - ip_addr:port if the port is - other than default (typically - TCP ports 860 and 3260). - type: string - name: - description: 'Volume''s name. Must - be a DNS_LABEL and unique within - the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - nfs: - description: 'NFS represents an NFS - mount on the host that shares a - pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: object - required: - - path - - server - properties: - path: - description: 'Path that is exported - by the NFS server. More info: - https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - readOnly: - description: 'ReadOnly here will - force the NFS export to be mounted - with read-only permissions. - Defaults to false. More info: - https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: boolean - server: - description: 'Server is the hostname - or IP address of the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - persistentVolumeClaim: - description: 'PersistentVolumeClaimVolumeSource - represents a reference to a PersistentVolumeClaim - in the same namespace. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: object - required: - - claimName - properties: - claimName: - description: 'ClaimName is the - name of a PersistentVolumeClaim - in the same namespace as the - pod using this volume. More - info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: string - readOnly: - description: Will force the ReadOnly - setting in VolumeMounts. Default - false. - type: boolean - photonPersistentDisk: - description: PhotonPersistentDisk - represents a PhotonController persistent - disk attached and mounted on kubelets - host machine - type: object - required: - - pdID - properties: - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. - type: string - pdID: - description: ID that identifies - Photon Controller persistent - disk - type: string - portworxVolume: - description: PortworxVolume represents - a portworx volume attached and mounted - on kubelets host machine - type: object - required: - - volumeID - properties: - fsType: - description: FSType represents - the filesystem type to mount - Must be a filesystem type supported - by the host operating system. - Ex. "ext4", "xfs". Implicitly - inferred to be "ext4" if unspecified. - type: string - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - volumeID: - description: VolumeID uniquely - identifies a Portworx volume - type: string - projected: - description: Items for all in one - resources secrets, configmaps, and - downward API - type: object - required: - - sources - properties: - defaultMode: - description: Mode bits used to - set permissions on created files - by default. Must be an octal - value between 0000 and 0777 - or a decimal value between 0 - and 511. YAML accepts both octal - and decimal values, JSON requires - decimal values for mode bits. - Directories within the path - are not affected by this setting. - This might be in conflict with - other options that affect the - file mode, like fsGroup, and - the result can be other mode - bits set. - type: integer - format: int32 - sources: - description: list of volume projections - type: array - items: - description: Projection that - may be projected along with - other supported volume types + datasetUUID: + description: UUID of the dataset. This is unique identifier of a Flocker dataset + type: string + gcePersistentDisk: + description: 'GCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: object + required: + - pdName + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: integer + format: int32 + pdName: + description: 'Unique name of the PD resource in GCE. Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + gitRepo: + description: 'GitRepo represents a git repository at a particular revision. DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod''s container.' + type: object + required: + - repository + properties: + directory: + description: Target directory name. Must not contain or start with '..'. If '.' is supplied, the volume directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name. + type: string + repository: + description: Repository URL + type: string + revision: + description: Commit hash for the specified revision. + type: string + glusterfs: + description: 'Glusterfs represents a Glusterfs mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' + type: object + required: + - endpoints + - path + properties: + endpoints: + description: 'EndpointsName is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + path: + description: 'Path is the Glusterfs volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + hostPath: + description: 'HostPath represents a pre-existing file or directory on the host machine that is directly exposed to the container. This is generally used for system agents or other privileged things that are allowed to see the host machine. Most containers will NOT need this. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath --- TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not mount host directories as read/write.' + type: object + required: + - path + properties: + path: + description: 'Path of the directory on the host. If the path is a symlink, it will follow the link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + iscsi: + description: 'ISCSI represents an ISCSI Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' + type: object + required: + - iqn + - lun + - targetPortal + properties: + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP authentication + type: boolean + chapAuthSession: + description: whether support iSCSI Session CHAP authentication + type: boolean + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface : will be created for the connection. + type: string + iqn: + description: Target iSCSI Qualified Name. + type: string + iscsiInterface: + description: iSCSI Interface Name that uses an iSCSI transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: integer + format: int32 + portals: + description: iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: array + items: + type: string + readOnly: + description: ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. + type: boolean + secretRef: + description: CHAP Secret for iSCSI target and initiator authentication type: object properties: - configMap: - description: information - about the configMap data - to project - type: object - properties: - items: - description: If unspecified, - each key-value pair - in the Data field - of the referenced - ConfigMap will be - projected into the - volume as a file whose - name is the key and - content is the value. - If specified, the - listed keys will be - projected into the - specified paths, and - unlisted keys will - not be present. If - a key is specified - which is not present - in the ConfigMap, - the volume setup will - error unless it is - marked optional. Paths - must be relative and - may not contain the - '..' path or start - with '..'. - type: array + 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 + targetPortal: + description: iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: string + name: + description: 'Volume''s name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: 'NFS represents an NFS mount on the host that shares a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: object + required: + - path + - server + properties: + path: + description: 'Path that is exported by the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS export to be mounted with read-only permissions. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + server: + description: 'Server is the hostname or IP address of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + persistentVolumeClaim: + description: 'PersistentVolumeClaimVolumeSource represents a reference to a PersistentVolumeClaim in the same namespace. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: object + required: + - claimName + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in VolumeMounts. Default false. + type: boolean + photonPersistentDisk: + description: PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine + type: object + required: + - pdID + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + pdID: + description: ID that identifies Photon Controller persistent disk + type: string + portworxVolume: + description: PortworxVolume represents a portworx volume attached and mounted on kubelets host machine + type: object + required: + - volumeID + properties: + fsType: + description: FSType represents the filesystem type to mount Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + volumeID: + description: VolumeID uniquely identifies a Portworx volume + type: string + projected: + description: Items for all in one resources secrets, configmaps, and downward API + type: object + properties: + defaultMode: + description: Mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set. + type: integer + format: int32 + sources: + description: list of volume projections + type: array + items: + description: Projection that may be projected along with other supported volume types + type: object + properties: + configMap: + description: information about the configMap data to project + type: object + properties: items: - description: Maps - a string key to - a path within a - volume. - type: object - required: - - key - - path - properties: - key: - description: The - key to project. - type: string - mode: - description: 'Optional: - mode bits used - to set permissions - on this file. - Must be an octal - value between - 0000 and 0777 - or a decimal - value between - 0 and 511. YAML - accepts both - octal and decimal - values, JSON - requires decimal - values for mode - bits. If not - specified, the - volume defaultMode - will be used. - This might be - in conflict - with other options - that affect - the file mode, - like fsGroup, - and the result - can be other - mode bits set.' - type: integer - format: int32 - path: - description: The - relative path - of the file - to map the key - to. May not - be an absolute - path. May not - contain the - path element - '..'. May not - start with the - string '..'. - 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 keys must be - defined - type: boolean - downwardAPI: - description: information - about the downwardAPI - data to project - type: object - properties: - items: - description: Items is - a list of DownwardAPIVolume - file - type: array + description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 keys must be defined + type: boolean + downwardAPI: + description: information about the downwardAPI data to project + type: object + properties: items: - description: DownwardAPIVolumeFile - represents information - to create the file - containing the pod - field - type: object - required: - - path - properties: - fieldRef: - description: 'Required: - Selects a field - of the pod: - only annotations, - labels, name - and namespace - are supported.' - 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 - mode: - description: 'Optional: - mode bits used - to set permissions - on this file, - must be an octal - value between - 0000 and 0777 - or a decimal - value between - 0 and 511. YAML - accepts both - octal and decimal - values, JSON - requires decimal - values for mode - bits. If not - specified, the - volume defaultMode - will be used. - This might be - in conflict - with other options - that affect - the file mode, - like fsGroup, - and the result - can be other - mode bits set.' - type: integer - format: int32 - path: - description: 'Required: - Path is the - relative path - name of the - file to be created. - Must not be - absolute or - contain the - ''..'' path. - Must be utf-8 - encoded. The - first item of - the relative - path must not - start with ''..''' - type: string - resourceFieldRef: - description: 'Selects - a resource of - the container: - only resources - limits and requests - (limits.cpu, - limits.memory, - requests.cpu - and requests.memory) - 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 - secret: - description: information - about the secret data - to project - type: object - properties: - items: - description: If unspecified, - each key-value pair - in the Data field - of the referenced - Secret will be projected - into the volume as - a file whose name - is the key and content - is the value. If specified, - the listed keys will - be projected into - the specified paths, - and unlisted keys - will not be present. - If a key is specified - which is not present - in the Secret, the - volume setup will - error unless it is - marked optional. Paths - must be relative and - may not contain the - '..' path or start - with '..'. - type: array + description: Items is a list of DownwardAPIVolume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field + type: object + required: + - path + properties: + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' + 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 + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: 'Required: Path is the relative path name of the file to be created. Must not be absolute or contain the ''..'' path. Must be utf-8 encoded. The first item of the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) 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 + secret: + description: information about the secret data to project + type: object + properties: items: - description: Maps - a string key to - a path within a - volume. - type: object - required: - - key - - path - properties: - key: - description: The - key to project. - type: string - mode: - description: 'Optional: - mode bits used - to set permissions - on this file. - Must be an octal - value between - 0000 and 0777 - or a decimal - value between - 0 and 511. YAML - accepts both - octal and decimal - values, JSON - requires decimal - values for mode - bits. If not - specified, the - volume defaultMode - will be used. - This might be - in conflict - with other options - that affect - the file mode, - like fsGroup, - and the result - can be other - mode bits set.' - type: integer - format: int32 - path: - description: The - relative path - of the file - to map the key - to. May not - be an absolute - path. May not - contain the - path element - '..'. May not - start with the - string '..'. - 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 - serviceAccountToken: - description: information - about the serviceAccountToken - data to project - type: object - required: - - path - properties: - audience: - description: Audience - is the intended audience - of the token. A recipient - of a token must identify - itself with an identifier - specified in the audience - of the token, and - otherwise should reject - the token. The audience - defaults to the identifier - of the apiserver. - type: string - expirationSeconds: - description: ExpirationSeconds - is the requested duration - of validity of the - service account token. - As the token approaches - expiration, the kubelet - volume plugin will - proactively rotate - the service account - token. The kubelet - will start trying - to rotate the token - if the token is older - than 80 percent of - its time to live or - if the token is older - than 24 hours.Defaults - to 1 hour and must - be at least 10 minutes. - type: integer - format: int64 - path: - description: Path is - the path relative - to the mount point - of the file to project - the token into. - type: string - quobyte: - description: Quobyte represents a - Quobyte mount on the host that shares - a pod's lifetime - type: object - required: - - registry - - volume - properties: - group: - description: Group to map volume - access to Default is no group - type: string - readOnly: - description: ReadOnly here will - force the Quobyte volume to - be mounted with read-only permissions. - Defaults to false. - type: boolean - registry: - description: Registry represents - a single or multiple Quobyte - Registry services specified - as a string as host:port pair - (multiple entries are separated - with commas) which acts as the - central registry for volumes - type: string - tenant: - description: Tenant owning the - given Quobyte volume in the - Backend Used with dynamically - provisioned Quobyte volumes, - value is set by the plugin - type: string - user: - description: User to map volume - access to Defaults to serivceaccount - user - type: string - volume: - description: Volume is a string - that references an already created - Quobyte volume by name. - type: string - rbd: - description: 'RBD represents a Rados - Block Device mount on the host that - shares a pod''s lifetime. More info: - https://examples.k8s.io/volumes/rbd/README.md' - type: object - required: - - image - - monitors - properties: - fsType: - description: 'Filesystem type - of the volume that you want - to mount. Tip: Ensure that the - filesystem type is supported - by the host operating system. - Examples: "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd - TODO: how do we prevent errors - in the filesystem from compromising - the machine' - type: string - image: - description: 'The rados image - name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - keyring: - description: 'Keyring is the path - to key ring for RBDUser. Default - is /etc/ceph/keyring. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - monitors: - description: 'A collection of - Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: array - items: + description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 + serviceAccountToken: + description: information about the serviceAccountToken data to project + type: object + required: + - path + properties: + audience: + description: Audience is the intended audience of the token. A recipient of a token must identify itself with an identifier specified in the audience of the token, and otherwise should reject the token. The audience defaults to the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the requested duration of validity of the service account token. As the token approaches expiration, the kubelet volume plugin will proactively rotate the service account token. The kubelet will start trying to rotate the token if the token is older than 80 percent of its time to live or if the token is older than 24 hours.Defaults to 1 hour and must be at least 10 minutes. + type: integer + format: int64 + path: + description: Path is the path relative to the mount point of the file to project the token into. + type: string + quobyte: + description: Quobyte represents a Quobyte mount on the host that shares a pod's lifetime + type: object + required: + - registry + - volume + properties: + group: + description: Group to map volume access to Default is no group type: string - pool: - description: 'The rados pool name. - Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - readOnly: - description: 'ReadOnly here will - force the ReadOnly setting in - VolumeMounts. Defaults to false. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: boolean - secretRef: - description: 'SecretRef is name - of the authentication secret - for RBDUser. If provided overrides - keyring. Default is nil. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: object - properties: - 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 - user: - description: 'The rados user name. - Default is admin. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - scaleIO: - description: ScaleIO represents a - ScaleIO persistent volume attached - and mounted on Kubernetes nodes. - type: object - required: - - gateway - - secretRef - - system - properties: - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Default is "xfs". - type: string - gateway: - description: The host address - of the ScaleIO API Gateway. - type: string - protectionDomain: - description: The name of the ScaleIO - Protection Domain for the configured - storage. - type: string - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - secretRef: - description: SecretRef references - to the secret for ScaleIO user - and other sensitive information. - If this is not provided, Login - operation will fail. - type: object - properties: - 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?' + readOnly: + description: ReadOnly here will force the Quobyte volume to be mounted with read-only permissions. Defaults to false. + type: boolean + registry: + description: Registry represents a single or multiple Quobyte Registry services specified as a string as host:port pair (multiple entries are separated with commas) which acts as the central registry for volumes + type: string + tenant: + description: Tenant owning the given Quobyte volume in the Backend Used with dynamically provisioned Quobyte volumes, value is set by the plugin + type: string + user: + description: User to map volume access to Defaults to serivceaccount user + type: string + volume: + description: Volume is a string that references an already created Quobyte volume by name. + type: string + rbd: + description: 'RBD represents a Rados Block Device mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md' + type: object + required: + - image + - monitors + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + image: + description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + keyring: + description: 'Keyring is the path to key ring for RBDUser. Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: type: string - sslEnabled: - description: Flag to enable/disable - SSL communication with Gateway, - default false - type: boolean - storageMode: - description: Indicates whether - the storage for a volume should - be ThickProvisioned or ThinProvisioned. - Default is ThinProvisioned. - type: string - storagePool: - description: The ScaleIO Storage - Pool associated with the protection - domain. - type: string - system: - description: The name of the storage - system as configured in ScaleIO. - type: string - volumeName: - description: The name of a volume - already created in the ScaleIO - system that is associated with - this volume source. - type: string - secret: - description: 'Secret represents a - secret that should populate this - volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: object - properties: - defaultMode: - description: 'Optional: mode bits - used to set permissions on created - files by default. Must be an - octal value between 0000 and - 0777 or a decimal value between - 0 and 511. YAML accepts both - octal and decimal values, JSON - requires decimal values for - mode bits. Defaults to 0644. - Directories within the path - are not affected by this setting. - This might be in conflict with - other options that affect the - file mode, like fsGroup, and - the result can be other mode - bits set.' - type: integer - format: int32 - items: - description: If unspecified, each - key-value pair in the Data field - of the referenced Secret will - be projected into the volume - as a file whose name is the - key and content is the value. - If specified, the listed keys - will be projected into the specified - paths, and unlisted keys will - not be present. If a key is - specified which is not present - in the Secret, the volume setup - will error unless it is marked - optional. Paths must be relative - and may not contain the '..' - path or start with '..'. - type: array - items: - description: Maps a string key - to a path within a volume. + pool: + description: 'The rados pool name. Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + secretRef: + description: 'SecretRef is name of the authentication secret for RBDUser. If provided overrides keyring. Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: object - required: - - key - - path properties: - key: - description: The key to - project. + 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 - mode: - description: 'Optional: - mode bits used to set - permissions on this file. - Must be an octal value - between 0000 and 0777 - or a decimal value between - 0 and 511. YAML accepts - both octal and decimal - values, JSON requires - decimal values for mode - bits. If not specified, - the volume defaultMode - will be used. This might - be in conflict with other - options that affect the - file mode, like fsGroup, - and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: The relative - path of the file to map - the key to. May not be - an absolute path. May - not contain the path element - '..'. May not start with - the string '..'. + user: + description: 'The rados user name. Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + scaleIO: + description: ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + type: object + required: + - gateway + - secretRef + - system + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Default is "xfs". + type: string + gateway: + description: The host address of the ScaleIO API Gateway. + type: string + protectionDomain: + description: The name of the ScaleIO Protection Domain for the configured storage. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail. + type: object + properties: + 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 keys must be defined - type: boolean - secretName: - description: 'Name of the secret - in the pod''s namespace to use. - More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: string - storageos: - description: StorageOS represents - a StorageOS volume attached and - mounted on Kubernetes nodes. - type: object - properties: - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. - type: string - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - secretRef: - description: SecretRef specifies - the secret to use for obtaining - the StorageOS API credentials. If - not specified, default values - will be attempted. - type: object - properties: - 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 - volumeName: - description: VolumeName is the - human-readable name of the StorageOS - volume. Volume names are only - unique within a namespace. - type: string - volumeNamespace: - description: VolumeNamespace specifies - the scope of the volume within - StorageOS. If no namespace - is specified then the Pod's - namespace will be used. This - allows the Kubernetes name scoping - to be mirrored within StorageOS - for tighter integration. Set - VolumeName to any name to override - the default behaviour. Set to - "default" if you are not using - namespaces within StorageOS. - Namespaces that do not pre-exist - within StorageOS will be created. - type: string - vsphereVolume: - description: VsphereVolume represents - a vSphere volume attached and mounted - on kubelets host machine - type: object - required: - - volumePath - properties: - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. - type: string - storagePolicyID: - description: Storage Policy Based - Management (SPBM) profile ID - associated with the StoragePolicyName. - type: string - storagePolicyName: - description: Storage Policy Based - Management (SPBM) profile name. - type: string - volumePath: - description: Path that identifies - vSphere volume vmdk - type: string - permissions: - type: array - items: - description: StrategyDeploymentPermissions describe the - rbac rules and service account needed by the install strategy - type: object - required: - - rules - - serviceAccountName - properties: - rules: - type: array - items: - description: PolicyRule holds information that describes - a policy rule, but does not contain information - about who the rule applies to or which namespace - the rule applies to. - type: object - required: - - verbs - properties: - apiGroups: - description: APIGroups is the name of the APIGroup - that contains the resources. If multiple API - groups are specified, any action requested against - one of the enumerated resources in any API group - will be allowed. - type: array - items: - type: string - nonResourceURLs: - description: NonResourceURLs is a set of partial - urls that a user should have access to. *s - are allowed, but only as the full, final step - in the path Since non-resource URLs are not - namespaced, this field is only applicable for - ClusterRoles referenced from a ClusterRoleBinding. - Rules can either apply to API resources (such - as "pods" or "secrets") or non-resource URL - paths (such as "/api"), but not both. - type: array - items: - type: string - resourceNames: - description: ResourceNames is an optional white - list of names that the rule applies to. An - empty set means that everything is allowed. - type: array - items: - type: string - resources: - description: Resources is a list of resources - this rule applies to. ResourceAll represents - all resources. - type: array - items: - type: string - verbs: - description: Verbs is a list of Verbs that apply - to ALL the ResourceKinds and AttributeRestrictions - contained in this rule. VerbAll represents - all kinds. - type: array - items: - type: string - serviceAccountName: - type: string - strategy: + sslEnabled: + description: Flag to enable/disable SSL communication with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned. + type: string + storagePool: + description: The ScaleIO Storage Pool associated with the protection domain. + type: string + system: + description: The name of the storage system as configured in ScaleIO. + type: string + volumeName: + description: The name of a volume already created in the ScaleIO system that is associated with this volume source. + type: string + secret: + description: 'Secret represents a secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + optional: + description: Specify whether the Secret or its keys must be defined + type: boolean + secretName: + description: 'Name of the secret in the pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + storageos: + description: StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes. + type: object + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef specifies the secret to use for obtaining the StorageOS API credentials. If not specified, default values will be attempted. + type: object + properties: + 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 + volumeName: + description: VolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace. + type: string + volumeNamespace: + description: VolumeNamespace specifies the scope of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping to be mirrored within StorageOS for tighter integration. Set VolumeName to any name to override the default behaviour. Set to "default" if you are not using namespaces within StorageOS. Namespaces that do not pre-exist within StorageOS will be created. + type: string + vsphereVolume: + description: VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine + type: object + required: + - volumePath + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName. + type: string + storagePolicyName: + description: Storage Policy Based Management (SPBM) profile name. + type: string + volumePath: + description: Path that identifies vSphere volume vmdk + type: string + permissions: + type: array + items: + description: StrategyDeploymentPermissions describe the rbac rules and service account needed by the install strategy + type: object + required: + - rules + - serviceAccountName + properties: + rules: + type: array + items: + description: PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to. + type: object + required: + - verbs + properties: + apiGroups: + description: APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. + type: array + items: + type: string + nonResourceURLs: + description: NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both. + type: array + items: + type: string + resourceNames: + description: ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. + type: array + items: + type: string + resources: + description: Resources is a list of resources this rule applies to. ResourceAll represents all resources. + type: array + items: + type: string + verbs: + description: Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds. + type: array + items: + type: string + serviceAccountName: + type: string + strategy: + type: string + installModes: + description: InstallModes specify supported installation types + type: array + items: + description: InstallMode associates an InstallModeType with a flag representing if the CSV supports it + type: object + required: + - supported + - type + properties: + supported: + type: boolean + type: + description: InstallModeType is a supported type of install mode for CSV installation + type: string + keywords: + type: array + items: type: string - installModes: - description: InstallModes specify supported installation types - type: array - items: - description: InstallMode associates an InstallModeType with a flag - representing if the CSV supports it + labels: + description: Map of string keys and values that can be used to organize and categorize (scope and select) objects. type: object - required: - - supported - - type - properties: - supported: - type: boolean - type: - description: InstallModeType is a supported type of install - mode for CSV installation - type: string - keywords: - type: array - items: + additionalProperties: + type: string + links: + type: array + items: + type: object + properties: + name: + type: string + url: + type: string + maintainers: + type: array + items: + type: object + properties: + email: + type: string + name: + type: string + maturity: type: string - labels: - description: Map of string keys and values that can be used to organize - and categorize (scope and select) objects. - type: object - additionalProperties: + minKubeVersion: type: string - links: - type: array - items: + nativeAPIs: + type: array + items: + description: GroupVersionKind unambiguously identifies a kind. It doesn't anonymously include GroupVersion to avoid automatic coersion. It doesn't use a GroupVersion to avoid custom marshalling + type: object + required: + - group + - kind + - version + properties: + group: + type: string + kind: + type: string + version: + type: string + provider: type: object properties: name: type: string url: type: string - maintainers: - type: array - items: - type: object - properties: - email: - type: string - name: - type: string - maturity: - type: string - minKubeVersion: - type: string - nativeAPIs: - type: array - items: - description: GroupVersionKind unambiguously identifies a kind. It - doesn't anonymously include GroupVersion to avoid automatic coersion. It - doesn't use a GroupVersion to avoid custom marshalling + replaces: + description: The name of a CSV this one replaces. Should match the `metadata.Name` field of the old CSV. + type: string + selector: + description: Label selector for related resources. type: object - required: - - group - - kind - - version properties: - group: - type: string - kind: - type: string - version: - type: string - provider: - type: object - properties: - name: - type: string - url: - type: string - replaces: - description: The name of a CSV this one replaces. Should match the - `metadata.Name` field of the old CSV. - type: string - selector: - description: Label selector for related resources. - 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. + 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 - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies - to. + additionalProperties: + type: string + version: + description: OperatorVersion is a wrapper around semver.Version which supports correct marshaling to YAML and JSON. + type: string + webhookdefinitions: + type: array + items: + description: WebhookDescription provides details to OLM about required webhooks + type: object + required: + - admissionReviewVersions + - generateName + - sideEffects + - type + properties: + admissionReviewVersions: + type: array + items: type: string - operator: - description: operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. + containerPort: + type: integer + format: int32 + default: 443 + maximum: 65535 + minimum: 1 + conversionCRDs: + type: array + items: 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 - version: - description: OperatorVersion is a wrapper around semver.Version which - supports correct marshaling to YAML and JSON. - type: string - webhookdefinitions: - type: array - items: - description: WebhookDescription provides details to OLM about required - webhooks - type: object - required: - - admissionReviewVersions - - generateName - - sideEffects - - type - properties: - admissionReviewVersions: - type: array - items: + deploymentName: type: string - containerPort: - type: integer - format: int32 - default: 443 - maximum: 65535 - minimum: 1 - conversionCRDs: - type: array - items: + failurePolicy: type: string - deploymentName: - type: string - failurePolicy: - type: string - generateName: - type: string - matchPolicy: - description: MatchPolicyType specifies the type of match policy - type: string - objectSelector: - description: A label selector is a label query over a set of - resources. The result of matchLabels and matchExpressions - are ANDed. An empty label selector matches all objects. A - null label selector matches no objects. - 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 - reinvocationPolicy: - description: ReinvocationPolicyType specifies what type of policy - the admission hook uses. - type: string - rules: - type: array - items: - description: RuleWithOperations is a tuple of Operations and - Resources. It is recommended to make sure that all the tuple - expansions are valid. + generateName: + type: string + matchPolicy: + description: MatchPolicyType specifies the type of match policy + type: string + objectSelector: + description: A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects. type: object properties: - apiGroups: - description: APIGroups is the API groups the resources - belong to. '*' is all groups. If '*' is present, the - length of the slice must be one. Required. + 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 - apiVersions: - description: APIVersions is the API versions the resources - belong to. '*' is all versions. If '*' is present, the - length of the slice must be one. Required. - type: array - items: + reinvocationPolicy: + description: ReinvocationPolicyType specifies what type of policy the admission hook uses. + type: string + rules: + type: array + items: + description: RuleWithOperations is a tuple of Operations and Resources. It is recommended to make sure that all the tuple expansions are valid. + type: object + properties: + apiGroups: + description: APIGroups is the API groups the resources belong to. '*' is all groups. If '*' is present, the length of the slice must be one. Required. + type: array + items: + type: string + apiVersions: + description: APIVersions is the API versions the resources belong to. '*' is all versions. If '*' is present, the length of the slice must be one. Required. + type: array + items: + type: string + operations: + description: Operations is the operations the admission hook cares about - CREATE, UPDATE, DELETE, CONNECT or * for all of those operations and any future admission operations that are added. If '*' is present, the length of the slice must be one. Required. + type: array + items: + type: string + resources: + description: "Resources is a list of resources this rule applies to. \n For example: 'pods' means pods. 'pods/log' means the log subresource of pods. '*' means all resources, but not subresources. 'pods/*' means all subresources of pods. '*/scale' means all scale subresources. '*/*' means all resources and their subresources. \n If wildcard is present, the validation rule will ensure resources do not overlap with each other. \n Depending on the enclosing object, subresources might not be allowed. Required." + type: array + items: + type: string + scope: + description: scope specifies the scope of this rule. Valid values are "Cluster", "Namespaced", and "*" "Cluster" means that only cluster-scoped resources will match this rule. Namespace API objects are cluster-scoped. "Namespaced" means that only namespaced resources will match this rule. "*" means that there are no scope restrictions. Subresources match the scope of their parent resource. Default is "*". type: string - operations: - description: Operations is the operations the admission - hook cares about - CREATE, UPDATE, DELETE, CONNECT or - * for all of those operations and any future admission - operations that are added. If '*' is present, the length - of the slice must be one. Required. - type: array - items: + sideEffects: + type: string + targetPort: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + type: integer + format: int32 + type: + description: WebhookAdmissionType is the type of admission webhooks supported by OLM + type: string + enum: + - ValidatingAdmissionWebhook + - MutatingAdmissionWebhook + - ConversionWebhook + webhookPath: + type: string + status: + description: ClusterServiceVersionStatus represents information about the status of a pod. Status may trail the actual state of a system. + type: object + properties: + certsLastUpdated: + description: Last time the owned APIService certs were updated + type: string + format: date-time + certsRotateAt: + description: Time the owned APIService certs will rotate next + type: string + format: date-time + conditions: + description: List of conditions, a history of state transitions + type: array + items: + description: Conditions appear in the status as a record of state transitions on the ClusterServiceVersion + type: object + properties: + lastTransitionTime: + description: Last time the status transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time we updated the status + type: string + format: date-time + message: + description: A human readable message indicating details about why the ClusterServiceVersion is in this condition. + type: string + phase: + description: Condition of the ClusterServiceVersion + type: string + reason: + description: A brief CamelCase message indicating details about why the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' + type: string + lastTransitionTime: + description: Last time the status transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time we updated the status + type: string + format: date-time + message: + description: A human readable message indicating details about why the ClusterServiceVersion is in this condition. + type: string + phase: + description: Current condition of the ClusterServiceVersion + type: string + reason: + description: A brief CamelCase message indicating details about why the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' + type: string + requirementStatus: + description: The status of each requirement for this CSV + type: array + items: + type: object + required: + - group + - kind + - message + - name + - status + - version + properties: + dependents: + type: array + items: + description: DependentStatus is the status for a dependent requirement (to prevent infinite nesting) + type: object + required: + - group + - kind + - status + - version + properties: + group: type: string - resources: - description: "Resources is a list of resources this rule - applies to. \n For example: 'pods' means pods. 'pods/log' - means the log subresource of pods. '*' means all resources, - but not subresources. 'pods/*' means all subresources - of pods. '*/scale' means all scale subresources. '*/*' - means all resources and their subresources. \n If wildcard - is present, the validation rule will ensure resources - do not overlap with each other. \n Depending on the - enclosing object, subresources might not be allowed. - Required." - type: array - items: + kind: type: string - scope: - description: scope specifies the scope of this rule. Valid - values are "Cluster", "Namespaced", and "*" "Cluster" - means that only cluster-scoped resources will match - this rule. Namespace API objects are cluster-scoped. - "Namespaced" means that only namespaced resources will - match this rule. "*" means that there are no scope restrictions. - Subresources match the scope of their parent resource. - Default is "*". - type: string - sideEffects: - type: string - targetPort: - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - type: integer - format: int32 - type: - description: WebhookAdmissionType is the type of admission webhooks - supported by OLM - type: string - enum: - - ValidatingAdmissionWebhook - - MutatingAdmissionWebhook - - ConversionWebhook - webhookPath: - type: string - status: - description: ClusterServiceVersionStatus represents information about - the status of a pod. Status may trail the actual state of a system. - type: object - properties: - certsLastUpdated: - description: Last time the owned APIService certs were updated - type: string - format: date-time - certsRotateAt: - description: Time the owned APIService certs will rotate next - type: string - format: date-time - conditions: - description: List of conditions, a history of state transitions - type: array - items: - description: Conditions appear in the status as a record of state - transitions on the ClusterServiceVersion - type: object - properties: - lastTransitionTime: - description: Last time the status transitioned from one status - to another. - type: string - format: date-time - lastUpdateTime: - description: Last time we updated the status - type: string - format: date-time - message: - description: A human readable message indicating details about - why the ClusterServiceVersion is in this condition. - type: string - phase: - description: Condition of the ClusterServiceVersion - type: string - reason: - description: A brief CamelCase message indicating details about - why the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' - type: string - lastTransitionTime: - description: Last time the status transitioned from one status to - another. - type: string - format: date-time - lastUpdateTime: - description: Last time we updated the status - type: string - format: date-time - message: - description: A human readable message indicating details about why - the ClusterServiceVersion is in this condition. - type: string - phase: - description: Current condition of the ClusterServiceVersion - type: string - reason: - description: A brief CamelCase message indicating details about why - the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' - type: string - requirementStatus: - description: The status of each requirement for this CSV - type: array - items: - type: object - required: - - group - - kind - - message - - name - - status - - version - properties: - dependents: - type: array - items: - description: DependentStatus is the status for a dependent - requirement (to prevent infinite nesting) - type: object - required: - - group - - kind - - status - - version - properties: - group: - type: string - kind: - type: string - message: - type: string - status: - description: StatusReason is a camelcased reason for the - status of a RequirementStatus or DependentStatus - type: string - uuid: - type: string - version: - type: string - group: - type: string - kind: - type: string - message: - type: string - name: - type: string - status: - description: StatusReason is a camelcased reason for the status - of a RequirementStatus or DependentStatus - type: string - uuid: - type: string - version: - type: string - served: true - storage: true - subresources: - status: {} + message: + type: string + status: + description: StatusReason is a camelcased reason for the status of a RequirementStatus or DependentStatus + type: string + uuid: + type: string + version: + type: string + group: + type: string + kind: + type: string + message: + type: string + name: + type: string + status: + description: StatusReason is a camelcased reason for the status of a RequirementStatus or DependentStatus + type: string + uuid: + type: string + version: + type: string + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_installplans.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_installplans.yaml index 1a837e1452..a57681d57e 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_installplans.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_installplans.yaml @@ -2,302 +2,254 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: installplans.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: InstallPlan listKind: InstallPlanList plural: installplans shortNames: - - ip + - ip singular: installplan scope: Namespaced versions: - - additionalPrinterColumns: - - description: The first CSV in the list of clusterServiceVersionNames - jsonPath: .spec.clusterServiceVersionNames[0] - name: CSV - type: string - - description: The approval mode - jsonPath: .spec.approval - name: Approval - type: string - - jsonPath: .spec.approved - name: Approved - type: boolean - name: v1alpha1 - schema: - openAPIV3Schema: - description: InstallPlan defines the installation of a set of operators. - type: object - required: - - metadata - - 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: InstallPlanSpec defines a set of Application resources to - be installed - type: object - required: - - approval - - approved - - clusterServiceVersionNames - properties: - approval: - description: Approval is the user approval policy for an InstallPlan. - It must be one of "Automatic" or "Manual". - type: string - approved: - type: boolean - clusterServiceVersionNames: - type: array - items: + - additionalPrinterColumns: + - description: The first CSV in the list of clusterServiceVersionNames + jsonPath: .spec.clusterServiceVersionNames[0] + name: CSV + type: string + - description: The approval mode + jsonPath: .spec.approval + name: Approval + type: string + - jsonPath: .spec.approved + name: Approved + type: boolean + name: v1alpha1 + schema: + openAPIV3Schema: + description: InstallPlan defines the installation of a set of operators. + type: object + required: + - metadata + - 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: InstallPlanSpec defines a set of Application resources to be installed + type: object + required: + - approval + - approved + - clusterServiceVersionNames + properties: + approval: + description: Approval is the user approval policy for an InstallPlan. It must be one of "Automatic" or "Manual". type: string - generation: - type: integer - source: - type: string - sourceNamespace: - type: string - status: - description: "InstallPlanStatus represents the information about the status - of steps required to complete installation. \n Status may trail the - actual state of a system." - type: object - required: - - catalogSources - - phase - properties: - attenuatedServiceAccountRef: - description: AttenuatedServiceAccountRef references the service account - that is used to do scoped operator install. - type: object - properties: - apiVersion: - description: API version of the referent. + approved: + type: boolean + clusterServiceVersionNames: + type: array + items: type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - bundleLookups: - description: BundleLookups is the set of in-progress requests to pull - and unpackage bundle content to the cluster. - type: array - items: - description: BundleLookup is a request to pull and unpackage the - content of a bundle to the cluster. + generation: + type: integer + source: + type: string + sourceNamespace: + type: string + status: + description: "InstallPlanStatus represents the information about the status of steps required to complete installation. \n Status may trail the actual state of a system." + type: object + required: + - catalogSources + - phase + properties: + attenuatedServiceAccountRef: + description: AttenuatedServiceAccountRef references the service account that is used to do scoped operator install. type: object - required: - - catalogSourceRef - - identifier - - path - - replaces properties: - catalogSourceRef: - description: CatalogSourceRef is a reference to the CatalogSource - the bundle path was resolved from. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this pod). - This syntax is chosen only to have some well-defined way - of referencing a part of an object. TODO: this design - is not final and this field is subject to change in the - future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - conditions: - description: Conditions represents the overall state of a BundleLookup. - type: array - items: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + bundleLookups: + description: BundleLookups is the set of in-progress requests to pull and unpackage bundle content to the cluster. + type: array + items: + description: BundleLookup is a request to pull and unpackage the content of a bundle to the cluster. + type: object + required: + - catalogSourceRef + - identifier + - path + - replaces + properties: + catalogSourceRef: + description: CatalogSourceRef is a reference to the CatalogSource the bundle path was resolved from. type: object - required: - - status - - type properties: - lastTransitionTime: - description: Last time the condition transitioned from - one status to another. + apiVersion: + description: API version of the referent. type: string - format: date-time - lastUpdateTime: - description: Last time the condition was probed. + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' type: string - format: date-time - message: - description: A human readable message indicating details - about the transition. + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' type: string - reason: - description: The reason for the condition's last transition. + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string - status: - description: Status of the condition, one of True, False, - Unknown. + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' type: string - type: - description: Type of condition. + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' type: string - identifier: - description: Identifier is the catalog-unique name of the operator - (the name of the CSV for bundles that contain CSVs) - type: string - path: - description: Path refers to the location of a bundle to pull. - It's typically an image reference. - type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + conditions: + description: Conditions represents the overall state of a BundleLookup. + type: array + items: + type: object + required: + - status + - type + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time the condition was probed. + type: string + format: date-time + message: + description: A human readable message indicating details about the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type of condition. + type: string + identifier: + description: Identifier is the catalog-unique name of the operator (the name of the CSV for bundles that contain CSVs) + type: string + path: + description: Path refers to the location of a bundle to pull. It's typically an image reference. + type: string + properties: + description: The effective properties of the unpacked bundle. + type: string + replaces: + description: Replaces is the name of the bundle to replace with the one found at Path. + type: string + catalogSources: + type: array + items: + type: string + conditions: + type: array + items: + description: InstallPlanCondition represents the overall status of the execution of an InstallPlan. + type: object properties: - description: The effective properties of the unpacked bundle. - type: string - replaces: - description: Replaces is the name of the bundle to replace with - the one found at Path. - type: string - catalogSources: - type: array - items: + lastTransitionTime: + type: string + format: date-time + lastUpdateTime: + type: string + format: date-time + message: + type: string + reason: + description: ConditionReason is a camelcased reason for the state transition. + type: string + status: + type: string + type: + description: InstallPlanConditionType describes the state of an InstallPlan at a certain point as a whole. + type: string + phase: + description: InstallPlanPhase is the current status of a InstallPlan as a whole. type: string - conditions: - type: array - items: - description: InstallPlanCondition represents the overall status - of the execution of an InstallPlan. - type: object - properties: - lastTransitionTime: - type: string - format: date-time - lastUpdateTime: - type: string - format: date-time - message: - type: string - reason: - description: ConditionReason is a camelcased reason for the - state transition. - type: string - status: - type: string - type: - description: InstallPlanConditionType describes the state of - an InstallPlan at a certain point as a whole. - type: string - phase: - description: InstallPlanPhase is the current status of a InstallPlan - as a whole. - type: string - plan: - type: array - items: - description: Step represents the status of an individual step in - an InstallPlan. - type: object - required: - - resolving - - resource - - status - properties: - resolving: - type: string - resource: - description: StepResource represents the status of a resource - to be tracked by an InstallPlan. - type: object - required: - - group - - kind - - name - - sourceName - - sourceNamespace - - version - properties: - group: - type: string - kind: - type: string - manifest: - type: string - name: - type: string - sourceName: - type: string - sourceNamespace: - type: string - version: - type: string - status: - description: StepStatus is the current status of a particular - resource an in InstallPlan - type: string - served: true - storage: true - subresources: - status: {} + plan: + type: array + items: + description: Step represents the status of an individual step in an InstallPlan. + type: object + required: + - resolving + - resource + - status + properties: + resolving: + type: string + resource: + description: StepResource represents the status of a resource to be tracked by an InstallPlan. + type: object + required: + - group + - kind + - name + - sourceName + - sourceNamespace + - version + properties: + group: + type: string + kind: + type: string + manifest: + type: string + name: + type: string + sourceName: + type: string + sourceNamespace: + type: string + version: + type: string + status: + description: StepStatus is the current status of a particular resource an in InstallPlan + type: string + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operatorconditions.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operatorconditions.yaml index 56b22b3d3a..3b3a7cc0be 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operatorconditions.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operatorconditions.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: operatorconditions.operators.coreos.com spec: @@ -14,185 +14,124 @@ spec: singular: operatorcondition scope: Namespaced versions: - - name: v1 - schema: - openAPIV3Schema: - description: OperatorCondition is a Custom Resource of type `OperatorCondition` - which is used to convey information to OLM about the state of an operator. - type: object - required: - - metadata - 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: OperatorConditionSpec allows a cluster admin to convey information - about the state of an operator to OLM, potentially overriding state - reported by the operator. - type: object - properties: - deployments: - type: array - items: - type: string - overrides: - 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, - 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])$ - serviceAccounts: - type: array - items: - type: string - status: - description: OperatorConditionStatus allows an operator to convey information - its state to OLM. The status may trail the actual state of a system. - type: object - properties: - conditions: - 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, - 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])$ - served: true - storage: true - subresources: - status: {} + - name: v1 + schema: + openAPIV3Schema: + description: OperatorCondition is a Custom Resource of type `OperatorCondition` which is used to convey information to OLM about the state of an operator. + type: object + required: + - metadata + 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: OperatorConditionSpec allows a cluster admin to convey information about the state of an operator to OLM, potentially overriding state reported by the operator. + type: object + properties: + deployments: + type: array + items: + type: string + overrides: + 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, 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: + - 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])$ + serviceAccounts: + type: array + items: + type: string + status: + description: OperatorConditionStatus allows an operator to convey information its state to OLM. The status may trail the actual state of a system. + type: object + properties: + conditions: + 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, 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])$ + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operatorgroups.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operatorgroups.yaml index 2381cb446b..54f09643ff 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operatorgroups.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operatorgroups.yaml @@ -2,303 +2,231 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: operatorgroups.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: OperatorGroup listKind: OperatorGroupList plural: operatorgroups shortNames: - - og + - og singular: operatorgroup scope: Namespaced versions: - - name: v1 - schema: - openAPIV3Schema: - description: OperatorGroup is the unit of multitenancy for OLM managed operators. - It constrains the installation of operators in its namespace to a specified - set of target namespaces. - type: object - required: - - metadata - 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: OperatorGroupSpec is the spec for an OperatorGroup resource. - type: object - properties: - selector: - description: Selector selects the OperatorGroup's target namespaces. - 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: + - name: v1 + schema: + openAPIV3Schema: + description: OperatorGroup is the unit of multitenancy for OLM managed operators. It constrains the installation of operators in its namespace to a specified set of target namespaces. + type: object + required: + - metadata + 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: OperatorGroupSpec is the spec for an OperatorGroup resource. + type: object + properties: + selector: + description: Selector selects the OperatorGroup's target namespaces. + 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 - 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 - serviceAccountName: - description: ServiceAccountName is the admin specified service account - which will be used to deploy operator(s) in this operator group. - type: string - staticProvidedAPIs: - description: Static tells OLM not to update the OperatorGroup's providedAPIs - annotation - type: boolean - targetNamespaces: - description: TargetNamespaces is an explicit set of namespaces to - target. If it is set, Selector is ignored. - type: array - items: - type: string - x-kubernetes-list-type: set - status: - description: OperatorGroupStatus is the status for an OperatorGroupResource. - type: object - required: - - lastUpdated - properties: - lastUpdated: - description: LastUpdated is a timestamp of the last time the OperatorGroup's - status was Updated. - type: string - format: date-time - namespaces: - description: Namespaces is the set of target namespaces for the OperatorGroup. - type: array - items: + 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 + serviceAccountName: + description: ServiceAccountName is the admin specified service account which will be used to deploy operator(s) in this operator group. type: string - x-kubernetes-list-type: set - serviceAccountRef: - description: ServiceAccountRef references the service account object - specified. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + staticProvidedAPIs: + description: Static tells OLM not to update the OperatorGroup's providedAPIs annotation + type: boolean + targetNamespaces: + description: TargetNamespaces is an explicit set of namespaces to target. If it is set, Selector is ignored. + type: array + items: type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + x-kubernetes-list-type: set + status: + description: OperatorGroupStatus is the status for an OperatorGroupResource. + type: object + required: + - lastUpdated + properties: + lastUpdated: + description: LastUpdated is a timestamp of the last time the OperatorGroup's status was Updated. + type: string + format: date-time + namespaces: + description: Namespaces is the set of target namespaces for the OperatorGroup. + type: array + items: type: string - served: true - storage: true - subresources: - status: {} - - name: v1alpha2 - schema: - openAPIV3Schema: - description: OperatorGroup is the unit of multitenancy for OLM managed operators. - It constrains the installation of operators in its namespace to a specified - set of target namespaces. - type: object - required: - - metadata - 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: OperatorGroupSpec is the spec for an OperatorGroup resource. - type: object - properties: - selector: - description: Selector selects the OperatorGroup's target namespaces. - 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: + x-kubernetes-list-type: set + serviceAccountRef: + description: ServiceAccountRef references the service account object specified. + type: object + properties: + apiVersion: + description: API version of the referent. type: string - serviceAccountName: - description: ServiceAccountName is the admin specified service account - which will be used to deploy operator(s) in this operator group. - type: string - staticProvidedAPIs: - description: Static tells OLM not to update the OperatorGroup's providedAPIs - annotation - type: boolean - targetNamespaces: - description: TargetNamespaces is an explicit set of namespaces to - target. If it is set, Selector is ignored. - type: array - items: - type: string - status: - description: OperatorGroupStatus is the status for an OperatorGroupResource. - type: object - required: - - lastUpdated - properties: - lastUpdated: - description: LastUpdated is a timestamp of the last time the OperatorGroup's - status was Updated. - type: string - format: date-time - namespaces: - description: Namespaces is the set of target namespaces for the OperatorGroup. - type: array - items: + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + served: true + storage: true + subresources: + status: {} + - name: v1alpha2 + schema: + openAPIV3Schema: + description: OperatorGroup is the unit of multitenancy for OLM managed operators. It constrains the installation of operators in its namespace to a specified set of target namespaces. + type: object + required: + - metadata + 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: OperatorGroupSpec is the spec for an OperatorGroup resource. + type: object + properties: + selector: + description: Selector selects the OperatorGroup's target namespaces. + 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 + serviceAccountName: + description: ServiceAccountName is the admin specified service account which will be used to deploy operator(s) in this operator group. type: string - serviceAccountRef: - description: ServiceAccountRef references the service account object - specified. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + staticProvidedAPIs: + description: Static tells OLM not to update the OperatorGroup's providedAPIs annotation + type: boolean + targetNamespaces: + description: TargetNamespaces is an explicit set of namespaces to target. If it is set, Selector is ignored. + type: array + items: type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + status: + description: OperatorGroupStatus is the status for an OperatorGroupResource. + type: object + required: + - lastUpdated + properties: + lastUpdated: + description: LastUpdated is a timestamp of the last time the OperatorGroup's status was Updated. + type: string + format: date-time + namespaces: + description: Namespaces is the set of target namespaces for the OperatorGroup. + type: array + items: type: string - served: true - storage: false - subresources: - status: {} + serviceAccountRef: + description: ServiceAccountRef references the service account object specified. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + served: true + storage: false + subresources: + status: {} diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operators.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operators.yaml index 10fd4a2c80..a1226a521f 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operators.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operators.yaml @@ -2,175 +2,136 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: operators.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: Operator listKind: OperatorList plural: operators singular: operator scope: Cluster versions: - - name: v1 - schema: - openAPIV3Schema: - description: Operator represents a cluster operator. - 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: OperatorSpec defines the desired state of Operator - type: object - status: - description: OperatorStatus defines the observed state of an Operator - and its components - type: object - properties: - components: - description: Components describes resources that compose the operator. - type: object - required: - - labelSelector - properties: - labelSelector: - description: LabelSelector is a label query over a set of resources - used to select the operator's components - 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 - refs: - description: Refs are a set of references to the operator's component - resources, selected with LabelSelector. - type: array - items: - description: RichReference is a reference to a resource, enriched - with its status conditions. + - name: v1 + schema: + openAPIV3Schema: + description: Operator represents a cluster operator. + 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: OperatorSpec defines the desired state of Operator + type: object + status: + description: OperatorStatus defines the observed state of an Operator and its components + type: object + properties: + components: + description: Components describes resources that compose the operator. + type: object + required: + - labelSelector + properties: + labelSelector: + description: LabelSelector is a label query over a set of resources used to select the operator's components type: object properties: - apiVersion: - description: API version of the referent. - type: string - conditions: - description: Conditions represents the latest state of the - component. + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. type: array items: - description: Condition represent the latest available - observations of an component's state. + 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: - - status - - type + - key + - operator properties: - lastTransitionTime: - description: Last time the condition transitioned - from one status to another. - type: string - format: date-time - lastUpdateTime: - description: Last time the condition was probed - type: string - format: date-time - message: - description: A human readable message indicating details - about the transition. + key: + description: key is the label key that the selector applies to. type: string - reason: - description: The reason for the condition's last transition. + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. type: string - status: - description: Status of the condition, one of True, - False, Unknown. - type: string - type: - description: Type of condition. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this pod). - This syntax is chosen only to have some well-defined way - of referencing a part of an object. TODO: this design - is not final and this field is subject to change in the - future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - served: true - storage: true - subresources: - status: {} + 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 + refs: + description: Refs are a set of references to the operator's component resources, selected with LabelSelector. + type: array + items: + description: RichReference is a reference to a resource, enriched with its status conditions. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + conditions: + description: Conditions represents the latest state of the component. + type: array + items: + description: Condition represent the latest available observations of an component's state. + type: object + required: + - status + - type + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time the condition was probed + type: string + format: date-time + message: + description: A human readable message indicating details about the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type of condition. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_subscriptions.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_subscriptions.yaml index 03b000332a..d2fb81feda 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_subscriptions.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_subscriptions.yaml @@ -2,2080 +2,1340 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: v0.4.1 creationTimestamp: null name: subscriptions.operators.coreos.com spec: group: operators.coreos.com names: categories: - - olm + - olm kind: Subscription listKind: SubscriptionList plural: subscriptions shortNames: - - sub - - subs + - sub + - subs singular: subscription scope: Namespaced versions: - - additionalPrinterColumns: - - description: The package subscribed to - jsonPath: .spec.name - name: Package - type: string - - description: The catalog source for the specified package - jsonPath: .spec.source - name: Source - type: string - - description: The channel of updates to subscribe to - jsonPath: .spec.channel - name: Channel - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: Subscription keeps operators up to date by tracking changes to - Catalogs. - type: object - required: - - metadata - - 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: SubscriptionSpec defines an Application that can be installed - type: object - required: - - name - - source - - sourceNamespace - properties: - channel: - type: string - config: - description: SubscriptionConfig contains configuration specified for - a subscription. - type: object - properties: - env: - description: Env is a list of environment variables to set in - the container. Cannot be updated. - 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 previous 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. The $(VAR_NAME) syntax can be - escaped with a double $$, ie: $$(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 - 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 - 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 - 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 - envFrom: - description: EnvFrom is a list of sources to populate environment - variables in the container. The keys defined within a source - must be a C_IDENTIFIER. All invalid keys will be reported as - an event when the container is starting. When a key exists in - multiple sources, the value associated with the last source - will take precedence. Values defined by an Env with a duplicate - key will take precedence. Immutable. - type: array - items: - description: EnvFromSource represents the source of a set of - ConfigMaps - type: object - properties: - configMapRef: - description: The ConfigMap to select from - type: object - properties: - 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 must be defined - type: boolean - prefix: - description: An optional identifier to prepend to each key - in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - type: object - properties: - 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 must be defined - type: boolean - nodeSelector: - description: 'NodeSelector is a selector which must be true for - the pod to fit on a node. Selector which must match a node''s - labels for the pod to be scheduled on that node. More info: - https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - resources: - description: 'Resources represents compute resources required - by this container. Immutable. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - properties: - limits: - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + - additionalPrinterColumns: + - description: The package subscribed to + jsonPath: .spec.name + name: Package + type: string + - description: The catalog source for the specified package + jsonPath: .spec.source + name: Source + type: string + - description: The channel of updates to subscribe to + jsonPath: .spec.channel + name: Channel + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: Subscription keeps operators up to date by tracking changes to Catalogs. + type: object + required: + - metadata + - 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: SubscriptionSpec defines an Application that can be installed + type: object + required: + - name + - source + - sourceNamespace + properties: + channel: + type: string + config: + description: SubscriptionConfig contains configuration specified for a subscription. + type: object + properties: + env: + description: Env is a list of environment variables to set in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable present in a Container. 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 previous 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. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(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 + 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 + 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 + 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 + envFrom: + description: EnvFrom is a list of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Immutable. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps 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 - selector: - description: Selector is the label selector for pods to be configured. - Existing ReplicaSets whose pods are selected by this will be - the ones affected by this deployment. It must match the pod - template's labels. - 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: + properties: + configMapRef: + description: The ConfigMap to select from + type: object + properties: + 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 - 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 - tolerations: - description: Tolerations are the pod's tolerations. - type: array - items: - description: The pod this Toleration is attached to tolerates - any taint that matches the triple using - the matching operator . + optional: + description: Specify whether the ConfigMap must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + type: object + properties: + 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 must be defined + type: boolean + nodeSelector: + description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' 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 - volumeMounts: - description: List of VolumeMounts to set in the container. - type: array - items: - description: VolumeMount describes a mounting of a Volume within - a container. + additionalProperties: + type: string + resources: + description: 'Resources represents compute resources required by this container. Immutable. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object - required: - - mountPath - - name properties: - mountPath: - description: Path within the container at which the volume - should be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts are - propagated from the host to container and the other way - around. When not set, MountPropagationNone is used. This - field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. - type: boolean - subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. Behaves similarly - to SubPath but environment variable references $(VAR_NAME) - are expanded using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath are mutually - exclusive. - type: string - volumes: - description: List of Volumes to set in the podSpec. - type: array - items: - description: Volume represents a named volume in a pod that - may be accessed by any container in the pod. - type: object - required: - - name - properties: - awsElasticBlockStore: - description: 'AWSElasticBlockStore represents an AWS Disk - resource that is attached to a kubelet''s host machine - and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: object - required: - - volumeID - properties: - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - partition: - description: 'The partition in the volume that you want - to mount. If omitted, the default is to mount by volume - name. Examples: For volume /dev/sda1, you specify - the partition as "1". Similarly, the volume partition - for /dev/sda is "0" (or you can leave the property - empty).' - type: integer - format: int32 - readOnly: - description: 'Specify "true" to force and set the ReadOnly - property in VolumeMounts to "true". If omitted, the - default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: boolean - volumeID: - description: 'Unique ID of the persistent disk resource - in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - azureDisk: - description: AzureDisk represents an Azure Data Disk mount - on the host and bind mount to the pod. + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object - required: - - diskName - - diskURI - properties: - cachingMode: - description: 'Host Caching mode: None, Read Only, Read - Write.' - type: string - diskName: - description: The Name of the data disk in the blob storage - type: string - diskURI: - description: The URI the data disk in the blob storage - type: string - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - kind: - description: 'Expected values Shared: multiple blob - disks per storage account Dedicated: single blob - disk per storage account Managed: azure managed data - disk (only in managed availability set). defaults - to shared' - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - azureFile: - description: AzureFile represents an Azure File Service - mount on the host and bind mount to the pod. - type: object - required: - - secretName - - shareName - properties: - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - secretName: - description: the name of secret that contains Azure - Storage Account Name and Key - type: string - shareName: - description: Share Name - type: string - cephfs: - description: CephFS represents a Ceph FS mount on the host - that shares a pod's lifetime + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object - required: - - monitors - properties: - monitors: - description: 'Required: Monitors is a collection of - Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: array - items: + 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 + selector: + description: Selector is the label selector for pods to be configured. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment. It must match the pod template's labels. + 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 - path: - description: 'Optional: Used as the mounted root, rather - than the full Ceph tree, default is /' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts. - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: boolean - secretFile: - description: 'Optional: SecretFile is the path to key - ring for User, default is /etc/ceph/user.secret More - info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - secretRef: - description: 'Optional: SecretRef is reference to the - authentication secret for User, default is empty. - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: object - properties: - 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?' + 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 - user: - description: 'Optional: User is the rados user name, - default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - cinder: - description: 'Cinder represents a cinder volume attached - and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + 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 - required: - - volumeID - properties: - fsType: - description: 'Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: boolean - secretRef: - description: 'Optional: points to a secret object containing - parameters used to connect to OpenStack.' - type: object - properties: - 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?' + additionalProperties: + type: string + tolerations: + description: Tolerations are the pod's tolerations. + 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 + volumeMounts: + description: List of VolumeMounts to set in the container. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. + type: object + required: + - mountPath + - name + properties: + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. + type: string + volumes: + description: List of Volumes to set in the podSpec. + type: array + items: + description: Volume represents a named volume in a pod that may be accessed by any container in the pod. + type: object + required: + - name + properties: + awsElasticBlockStore: + description: 'AWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty).' + type: integer + format: int32 + readOnly: + description: 'Specify "true" to force and set the ReadOnly property in VolumeMounts to "true". If omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + volumeID: + description: 'Unique ID of the persistent disk resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + azureDisk: + description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. + type: object + required: + - diskName + - diskURI + properties: + cachingMode: + description: 'Host Caching mode: None, Read Only, Read Write.' + type: string + diskName: + description: The Name of the data disk in the blob storage + type: string + diskURI: + description: The URI the data disk in the blob storage + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + kind: + description: 'Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + azureFile: + description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. + type: object + required: + - secretName + - shareName + properties: + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretName: + description: the name of secret that contains Azure Storage Account Name and Key + type: string + shareName: + description: Share Name + type: string + cephfs: + description: CephFS represents a Ceph FS mount on the host that shares a pod's lifetime + type: object + required: + - monitors + properties: + monitors: + description: 'Required: Monitors is a collection of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: type: string - volumeID: - description: 'volume id used to identify the volume - in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - configMap: - description: ConfigMap represents a configMap that should - populate this volume - type: object - properties: - defaultMode: - description: 'Optional: mode bits used to set permissions - on created files by default. Must be an octal value - between 0000 and 0777 or a decimal value between 0 - and 511. YAML accepts both octal and decimal values, - JSON requires decimal values for mode bits. Defaults - to 0644. Directories within the path are not affected - by this setting. This might be in conflict with other - options that affect the file mode, like fsGroup, and - the result can be other mode bits set.' - type: integer - format: int32 - items: - description: If unspecified, each key-value pair in - the Data field of the referenced ConfigMap will be - projected into the volume as a file whose name is - the key and content is the value. If specified, the - listed keys will be projected into the specified paths, - and unlisted keys will not be present. If a key is - specified which is not present in the ConfigMap, the - volume setup will error unless it is marked optional. - Paths must be relative and may not contain the '..' - path or start with '..'. - type: array - items: - description: Maps a string key to a path within a - volume. + path: + description: 'Optional: Used as the mounted root, rather than the full Ceph tree, default is /' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + secretFile: + description: 'Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + secretRef: + description: 'Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: object - required: - - key - - path properties: - key: - description: The key to project. + 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 - mode: - description: 'Optional: mode bits used to set - permissions on this file. Must be an octal value - between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal - values, JSON requires decimal values for mode - bits. If not specified, the volume defaultMode - will be used. This might be in conflict with - other options that affect the file mode, like - fsGroup, and the result can be other mode bits - set.' - type: integer - format: int32 - path: - description: The relative path of the file to - map the key to. May not be an absolute path. - May not contain the path element '..'. May not - start with the string '..'. + user: + description: 'Optional: User is the rados user name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + cinder: + description: 'Cinder represents a cinder volume attached and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + secretRef: + description: 'Optional: points to a secret object containing parameters used to connect to OpenStack.' + type: object + properties: + 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 - 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 keys - must be defined - type: boolean - csi: - description: CSI (Container Storage Interface) represents - ephemeral storage that is handled by certain external - CSI drivers (Beta feature). - type: object - required: - - driver - properties: - driver: - description: Driver is the name of the CSI driver that - handles this volume. Consult with your admin for the - correct name as registered in the cluster. - type: string - fsType: - description: Filesystem type to mount. Ex. "ext4", "xfs", - "ntfs". If not provided, the empty value is passed - to the associated CSI driver which will determine - the default filesystem to apply. - type: string - nodePublishSecretRef: - description: NodePublishSecretRef is a reference to - the secret object containing sensitive information - to pass to the CSI driver to complete the CSI NodePublishVolume - and NodeUnpublishVolume calls. This field is optional, - and may be empty if no secret is required. If the - secret object contains more than one secret, all secret - references are passed. - type: object - properties: - 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 - readOnly: - description: Specifies a read-only configuration for - the volume. Defaults to false (read/write). - type: boolean - volumeAttributes: - description: VolumeAttributes stores driver-specific - properties that are passed to the CSI driver. Consult - your driver's documentation for supported values. - type: object - additionalProperties: - type: string - downwardAPI: - description: DownwardAPI represents downward API about the - pod that should populate this volume - type: object - properties: - defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a Optional: mode bits used - to set permissions on created files by default. Must - be an octal value between 0000 and 0777 or a decimal - value between 0 and 511. YAML accepts both octal and - decimal values, JSON requires decimal values for mode - bits. Defaults to 0644. Directories within the path - are not affected by this setting. This might be in - conflict with other options that affect the file mode, - like fsGroup, and the result can be other mode bits - set.' - type: integer - format: int32 - items: - description: Items is a list of downward API volume - file - type: array + volumeID: + description: 'volume id used to identify the volume in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + configMap: + description: ConfigMap represents a configMap that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 items: - description: DownwardAPIVolumeFile represents information - to create the file containing the pod field + description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 keys must be defined + type: boolean + csi: + description: CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the CSI driver that handles this volume. Consult with your admin for the correct name as registered in the cluster. + type: string + fsType: + description: Filesystem type to mount. Ex. "ext4", "xfs", "ntfs". If not provided, the empty value is passed to the associated CSI driver which will determine the default filesystem to apply. + type: string + nodePublishSecretRef: + description: NodePublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodePublishVolume and NodeUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secret references are passed. type: object - required: - - path properties: - fieldRef: - description: 'Required: Selects a field of the - pod: only annotations, labels, name and namespace - are supported.' - 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 - mode: - description: 'Optional: mode bits used to set - permissions on this file, must be an octal value - between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal - values, JSON requires decimal values for mode - bits. If not specified, the volume defaultMode - will be used. This might be in conflict with - other options that affect the file mode, like - fsGroup, and the result can be other mode bits - set.' - type: integer - format: int32 - path: - description: 'Required: Path is the relative - path name of the file to be created. Must not - be absolute or contain the ''..'' path. Must - be utf-8 encoded. The first item of the relative - path must not start with ''..''' + 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 - resourceFieldRef: - description: 'Selects a resource of the container: - only resources limits and requests (limits.cpu, - limits.memory, requests.cpu and requests.memory) - 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 - emptyDir: - description: 'EmptyDir represents a temporary directory - that shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: object - properties: - medium: - description: 'What type of storage medium should back - this directory. The default is "" which means to use - the node''s default medium. Must be an empty string - (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: string - sizeLimit: - description: 'Total amount of local storage required - for this EmptyDir volume. The size limit is also applicable - for memory medium. The maximum usage on memory medium - EmptyDir would be the minimum value between the SizeLimit - specified here and the sum of memory limits of all - containers in a pod. The default is nil which means - that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' - 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 - ephemeral: - description: "Ephemeral represents a volume that is handled - by a cluster storage driver (Alpha feature). The volume's - lifecycle is tied to the pod that defines it - it will - be created before the pod starts, and deleted when the - pod is removed. \n Use this if: a) the volume is only - needed while the pod runs, b) features of normal volumes - like restoring from snapshot or capacity tracking are - needed, c) the storage driver is specified through a storage - class, and d) the storage driver supports dynamic volume - provisioning through a PersistentVolumeClaim (see EphemeralVolumeSource - for more information on the connection between this - volume type and PersistentVolumeClaim). \n Use PersistentVolumeClaim - or one of the vendor-specific APIs for volumes that persist - for longer than the lifecycle of an individual pod. \n - Use CSI for light-weight local ephemeral volumes if the - CSI driver is meant to be used that way - see the documentation - of the driver for more information. \n A pod can use both - types of ephemeral volumes and persistent volumes at the - same time." - type: object - properties: - readOnly: - description: Specifies a read-only configuration for - the volume. Defaults to false (read/write). - type: boolean - volumeClaimTemplate: - description: "Will be used to create a stand-alone PVC - to provision the volume. The pod in which this EphemeralVolumeSource - is embedded will be the owner of the PVC, i.e. the - PVC will be deleted together with the pod. The name - of the PVC will be `-` where - `` is the name from the `PodSpec.Volumes` - array entry. Pod validation will reject the pod if - the concatenated name is not valid for a PVC (for - example, too long). \n An existing PVC with that name - that is not owned by the pod will *not* be used for - the pod to avoid using an unrelated volume by mistake. - Starting the pod is then blocked until the unrelated - PVC is removed. If such a pre-created PVC is meant - to be used by the pod, the PVC has to updated with - an owner reference to the pod once the pod exists. - Normally this should not be necessary, but it may - be useful when manually reconstructing a broken cluster. - \n This field is read-only and no changes will be - made by Kubernetes to the PVC after it has been created. - \n Required, must not be nil." - type: object - required: - - spec - properties: - metadata: - description: May contain labels and annotations - that will be copied into the PVC when creating - it. No other fields are allowed and will be rejected - during validation. - type: object - spec: - description: The specification for the PersistentVolumeClaim. - The entire content is copied unchanged into the - PVC that gets created from this template. The - same fields as in a PersistentVolumeClaim are - also valid here. + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeAttributes: + description: VolumeAttributes stores driver-specific properties that are passed to the CSI driver. Consult your driver's documentation for supported values. + type: object + additionalProperties: + type: string + downwardAPI: + description: DownwardAPI represents downward API about the pod that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created files by default. Must be a Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: Items is a list of downward API volume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field type: object + required: + - path properties: - accessModes: - description: 'AccessModes contains the desired - access modes the volume should have. More - info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' - type: array - items: - type: string - dataSource: - description: 'This field can be used to specify - either: * An existing VolumeSnapshot object - (snapshot.storage.k8s.io/VolumeSnapshot - - Beta) * An existing PVC (PersistentVolumeClaim) - * An existing custom resource/object that - implements data population (Alpha) In order - to use VolumeSnapshot object types, the appropriate - feature gate must be enabled (VolumeSnapshotDataSource - or AnyVolumeDataSource) If the provisioner - or an external controller can support the - specified data source, it will create a new - volume based on the contents of the specified - data source. If the specified data source - is not supported, the volume will not be created - and the failure will be reported as an event. - In the future, we plan to support more data - source types and the behavior of the provisioner - may change.' + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' type: object required: - - kind - - name + - fieldPath properties: - apiGroup: - description: APIGroup is the group for the - resource being referenced. If APIGroup - is not specified, the specified Kind must - be in the core API group. For any other - third-party types, APIGroup is required. + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". type: string - kind: - description: Kind is the type of resource - being referenced + fieldPath: + description: Path of the field to select in the specified API version. type: string - name: - description: Name is the name of resource - being referenced - type: string - resources: - description: 'Resources represents the minimum - resources the volume should have. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: 'Required: Path is the relative path name of the file to be created. Must not be absolute or contain the ''..'' path. Must be utf-8 encoded. The first item of the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.' type: object + required: + - resource properties: - limits: - description: 'Limits describes the maximum - amount of compute resources allowed. More - info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: + 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 - selector: - description: A label query over volumes to consider - for binding. - 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 - storageClassName: - description: 'Name of the StorageClass required - by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' - type: string - volumeMode: - description: volumeMode defines what type of - volume is required by the claim. Value of - Filesystem is implied when not included in - claim spec. - type: string - volumeName: - description: VolumeName is the binding reference - to the PersistentVolume backing this claim. - type: string - fc: - description: FC represents a Fibre Channel resource that - is attached to a kubelet's host machine and then exposed - to the pod. - type: object - properties: - fsType: - description: 'Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. TODO: how do we prevent errors in the - filesystem from compromising the machine' - type: string - lun: - description: 'Optional: FC target lun number' - type: integer - format: int32 - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts.' - type: boolean - targetWWNs: - description: 'Optional: FC target worldwide names (WWNs)' - type: array - items: - type: string - wwids: - description: 'Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs - and lun must be set, but not both simultaneously.' - type: array - items: - type: string - flexVolume: - description: FlexVolume represents a generic volume resource - that is provisioned/attached using an exec based plugin. - type: object - required: - - driver - properties: - driver: - description: Driver is the name of the driver to use - for this volume. - type: string - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". The default filesystem depends on FlexVolume - script. - type: string - options: - description: 'Optional: Extra command options if any.' - type: object - additionalProperties: - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts.' - type: boolean - secretRef: - description: 'Optional: SecretRef is reference to the - secret object containing sensitive information to - pass to the plugin scripts. This may be empty if no - secret object is specified. If the secret object contains - more than one secret, all secrets are passed to the - plugin scripts.' - type: object - properties: - 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 - flocker: - description: Flocker represents a Flocker volume attached - to a kubelet's host machine. This depends on the Flocker - control service being running - type: object - properties: - datasetName: - description: Name of the dataset stored as metadata - -> name on the dataset for Flocker should be considered - as deprecated - type: string - datasetUUID: - description: UUID of the dataset. This is unique identifier - of a Flocker dataset - type: string - gcePersistentDisk: - description: 'GCEPersistentDisk represents a GCE Disk resource - that is attached to a kubelet''s host machine and then - exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: object - required: - - pdName - properties: - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - partition: - description: 'The partition in the volume that you want - to mount. If omitted, the default is to mount by volume - name. Examples: For volume /dev/sda1, you specify - the partition as "1". Similarly, the volume partition - for /dev/sda is "0" (or you can leave the property - empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: integer - format: int32 - pdName: - description: 'Unique name of the PD resource in GCE. - Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: boolean - gitRepo: - description: 'GitRepo represents a git repository at a particular - revision. DEPRECATED: GitRepo is deprecated. To provision - a container with a git repo, mount an EmptyDir into an - InitContainer that clones the repo using git, then mount - the EmptyDir into the Pod''s container.' - type: object - required: - - repository - properties: - directory: - description: Target directory name. Must not contain - or start with '..'. If '.' is supplied, the volume - directory will be the git repository. Otherwise, - if specified, the volume will contain the git repository - in the subdirectory with the given name. - type: string - repository: - description: Repository URL - type: string - revision: - description: Commit hash for the specified revision. - type: string - glusterfs: - description: 'Glusterfs represents a Glusterfs mount on - the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' - type: object - required: - - endpoints - - path - properties: - endpoints: - description: 'EndpointsName is the endpoint name that - details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - path: - description: 'Path is the Glusterfs volume path. More - info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - readOnly: - description: 'ReadOnly here will force the Glusterfs - volume to be mounted with read-only permissions. Defaults - to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: boolean - hostPath: - description: 'HostPath represents a pre-existing file or - directory on the host machine that is directly exposed - to the container. This is generally used for system agents - or other privileged things that are allowed to see the - host machine. Most containers will NOT need this. More - info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath - --- TODO(jonesdl) We need to restrict who can use host - directory mounts and who can/can not mount host directories - as read/write.' - type: object - required: - - path - properties: - path: - description: 'Path of the directory on the host. If - the path is a symlink, it will follow the link to - the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - type: - description: 'Type for HostPath Volume Defaults to "" - More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - iscsi: - description: 'ISCSI represents an ISCSI Disk resource that - is attached to a kubelet''s host machine and then exposed - to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' - type: object - required: - - iqn - - lun - - targetPortal - properties: - chapAuthDiscovery: - description: whether support iSCSI Discovery CHAP authentication - type: boolean - chapAuthSession: - description: whether support iSCSI Session CHAP authentication - type: boolean - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - initiatorName: - description: Custom iSCSI Initiator Name. If initiatorName - is specified with iscsiInterface simultaneously, new - iSCSI interface : will - be created for the connection. - type: string - iqn: - description: Target iSCSI Qualified Name. - type: string - iscsiInterface: - description: iSCSI Interface Name that uses an iSCSI - transport. Defaults to 'default' (tcp). - type: string - lun: - description: iSCSI Target Lun number. - type: integer - format: int32 - portals: - description: iSCSI Target Portal List. The portal is - either an IP or ip_addr:port if the port is other - than default (typically TCP ports 860 and 3260). - type: array - items: + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + emptyDir: + description: 'EmptyDir represents a temporary directory that shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: object + properties: + medium: + description: 'What type of storage medium should back this directory. The default is "" which means to use the node''s default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' type: string - readOnly: - description: ReadOnly here will force the ReadOnly setting - in VolumeMounts. Defaults to false. - type: boolean - secretRef: - description: CHAP Secret for iSCSI target and initiator - authentication - type: object - properties: - 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 - targetPortal: - description: iSCSI Target Portal. The Portal is either - an IP or ip_addr:port if the port is other than default - (typically TCP ports 860 and 3260). - type: string - name: - description: 'Volume''s name. Must be a DNS_LABEL and unique - within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - nfs: - description: 'NFS represents an NFS mount on the host that - shares a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: object - required: - - path - - server - properties: - path: - description: 'Path that is exported by the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - readOnly: - description: 'ReadOnly here will force the NFS export - to be mounted with read-only permissions. Defaults - to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: boolean - server: - description: 'Server is the hostname or IP address of - the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - persistentVolumeClaim: - description: 'PersistentVolumeClaimVolumeSource represents - a reference to a PersistentVolumeClaim in the same namespace. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: object - required: - - claimName - properties: - claimName: - description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this volume. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: string - readOnly: - description: Will force the ReadOnly setting in VolumeMounts. - Default false. - type: boolean - photonPersistentDisk: - description: PhotonPersistentDisk represents a PhotonController - persistent disk attached and mounted on kubelets host - machine - type: object - required: - - pdID - properties: - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - pdID: - description: ID that identifies Photon Controller persistent - disk - type: string - portworxVolume: - description: PortworxVolume represents a portworx volume - attached and mounted on kubelets host machine - type: object - required: - - volumeID - properties: - fsType: - description: FSType represents the filesystem type to - mount Must be a filesystem type supported by the host - operating system. Ex. "ext4", "xfs". Implicitly inferred - to be "ext4" if unspecified. - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - volumeID: - description: VolumeID uniquely identifies a Portworx - volume - type: string - projected: - description: Items for all in one resources secrets, configmaps, - and downward API - type: object - required: - - sources - properties: - defaultMode: - description: Mode bits used to set permissions on created - files by default. Must be an octal value between 0000 - and 0777 or a decimal value between 0 and 511. YAML - accepts both octal and decimal values, JSON requires - decimal values for mode bits. Directories within the - path are not affected by this setting. This might - be in conflict with other options that affect the - file mode, like fsGroup, and the result can be other - mode bits set. - type: integer - format: int32 - sources: - description: list of volume projections - type: array - items: - description: Projection that may be projected along - with other supported volume types + sizeLimit: + description: 'Total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' + 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 + ephemeral: + description: "Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed. \n Use this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity tracking are needed, c) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through a PersistentVolumeClaim (see EphemeralVolumeSource for more information on the connection between this volume type and PersistentVolumeClaim). \n Use PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod. \n Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information. \n A pod can use both types of ephemeral volumes and persistent volumes at the same time." + type: object + properties: + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeClaimTemplate: + description: "Will be used to create a stand-alone PVC to provision the volume. The pod in which this EphemeralVolumeSource is embedded will be the owner of the PVC, i.e. the PVC will be deleted together with the pod. The name of the PVC will be `-` where `` is the name from the `PodSpec.Volumes` array entry. Pod validation will reject the pod if the concatenated name is not valid for a PVC (for example, too long). \n An existing PVC with that name that is not owned by the pod will *not* be used for the pod to avoid using an unrelated volume by mistake. Starting the pod is then blocked until the unrelated PVC is removed. If such a pre-created PVC is meant to be used by the pod, the PVC has to updated with an owner reference to the pod once the pod exists. Normally this should not be necessary, but it may be useful when manually reconstructing a broken cluster. \n This field is read-only and no changes will be made by Kubernetes to the PVC after it has been created. \n Required, must not be nil." type: object + required: + - spec properties: - configMap: - description: information about the configMap data - to project + metadata: + description: May contain labels and annotations that will be copied into the PVC when creating it. No other fields are allowed and will be rejected during validation. type: object - properties: - items: - description: If unspecified, each key-value - pair in the Data field of the referenced - ConfigMap will be projected into the volume - as a file whose name is the key and content - is the value. If specified, the listed keys - will be projected into the specified paths, - and unlisted keys will not be present. If - a key is specified which is not present - in the ConfigMap, the volume setup will - error unless it is marked optional. Paths - must be relative and may not contain the - '..' path or start with '..'. - type: array - items: - description: Maps a string key to a path - within a volume. - type: object - required: - - key - - path - properties: - key: - description: The key to project. - type: string - mode: - description: 'Optional: mode bits used - to set permissions on this file. Must - be an octal value between 0000 and - 0777 or a decimal value between 0 - and 511. YAML accepts both octal and - decimal values, JSON requires decimal - values for mode bits. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: The relative path of the - file to map the key to. May not be - an absolute path. May not contain - the path element '..'. May not start - with the string '..'. - 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 keys must be defined - type: boolean - downwardAPI: - description: information about the downwardAPI - data to project + spec: + description: The specification for the PersistentVolumeClaim. The entire content is copied unchanged into the PVC that gets created from this template. The same fields as in a PersistentVolumeClaim are also valid here. type: object properties: - items: - description: Items is a list of DownwardAPIVolume - file + accessModes: + description: 'AccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' type: array items: - description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field - type: object - required: - - path - properties: - fieldRef: - description: 'Required: Selects a field - of the pod: only annotations, labels, - name and namespace are supported.' - 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 - mode: - description: 'Optional: mode bits used - to set permissions on this file, must - be an octal value between 0000 and - 0777 or a decimal value between 0 - and 511. YAML accepts both octal and - decimal values, JSON requires decimal - values for mode bits. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: 'Required: Path is the - relative path name of the file to - be created. Must not be absolute or - contain the ''..'' path. Must be utf-8 - encoded. The first item of the relative - path must not start with ''..''' - type: string - resourceFieldRef: - description: 'Selects a resource of - the container: only resources limits - and requests (limits.cpu, limits.memory, - requests.cpu and requests.memory) - are currently supported.' + type: string + dataSource: + description: 'This field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) * An existing custom resource that implements data population (Alpha) In order to use custom resource types that implement data population, the AnyVolumeDataSource feature gate must be enabled. If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source.' + type: object + required: + - kind + - name + properties: + apiGroup: + description: APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + resources: + description: 'Resources represents the minimum resources the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + 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 + selector: + description: A label query over volumes to consider for binding. + 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: - - resource + - key + - operator properties: - containerName: - description: 'Container name: required - for volumes, optional for env - vars' + key: + description: key is the label key that the selector applies to. 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' + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. type: string - secret: - description: information about the secret data - to project - type: object - properties: - items: - description: If unspecified, each key-value - pair in the Data field of the referenced - Secret will be projected into the volume - as a file whose name is the key and content - is the value. If specified, the listed keys - will be projected into the specified paths, - and unlisted keys will not be present. If - a key is specified which is not present - in the Secret, the volume setup will error - unless it is marked optional. Paths must - be relative and may not contain the '..' - path or start with '..'. - type: array - items: - description: Maps a string key to a path - within a volume. - type: object - required: - - key - - path - properties: - key: - description: The key to project. - type: string - mode: - description: 'Optional: mode bits used - to set permissions on this file. Must - be an octal value between 0000 and - 0777 or a decimal value between 0 - and 511. YAML accepts both octal and - decimal values, JSON requires decimal - values for mode bits. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can be - other mode bits set.' - type: integer - format: int32 - path: - description: The relative path of the - file to map the key to. May not be - an absolute path. May not contain - the path element '..'. May not start - with the 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 - 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?' + storageClassName: + description: 'Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - serviceAccountToken: - description: information about the serviceAccountToken - data to project - type: object - required: - - path - properties: - audience: - description: Audience is the intended audience - of the token. A recipient of a token must - identify itself with an identifier specified - in the audience of the token, and otherwise - should reject the token. The audience defaults - to the identifier of the apiserver. + volumeMode: + description: volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. type: string - expirationSeconds: - description: ExpirationSeconds is the requested - duration of validity of the service account - token. As the token approaches expiration, - the kubelet volume plugin will proactively - rotate the service account token. The kubelet - will start trying to rotate the token if - the token is older than 80 percent of its - time to live or if the token is older than - 24 hours.Defaults to 1 hour and must be - at least 10 minutes. - type: integer - format: int64 - path: - description: Path is the path relative to - the mount point of the file to project the - token into. + volumeName: + description: VolumeName is the binding reference to the PersistentVolume backing this claim. type: string - quobyte: - description: Quobyte represents a Quobyte mount on the host - that shares a pod's lifetime - type: object - required: - - registry - - volume - properties: - group: - description: Group to map volume access to Default is - no group - type: string - readOnly: - description: ReadOnly here will force the Quobyte volume - to be mounted with read-only permissions. Defaults - to false. - type: boolean - registry: - description: Registry represents a single or multiple - Quobyte Registry services specified as a string as - host:port pair (multiple entries are separated with - commas) which acts as the central registry for volumes - type: string - tenant: - description: Tenant owning the given Quobyte volume - in the Backend Used with dynamically provisioned Quobyte - volumes, value is set by the plugin - type: string - user: - description: User to map volume access to Defaults to - serivceaccount user - type: string - volume: - description: Volume is a string that references an already - created Quobyte volume by name. - type: string - rbd: - description: 'RBD represents a Rados Block Device mount - on the host that shares a pod''s lifetime. More info: - https://examples.k8s.io/volumes/rbd/README.md' - type: object - required: - - image - - monitors - properties: - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - image: - description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - keyring: - description: 'Keyring is the path to key ring for RBDUser. - Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - monitors: - description: 'A collection of Ceph monitors. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: array - items: + fc: + description: FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod. + type: object + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. TODO: how do we prevent errors in the filesystem from compromising the machine' type: string - pool: - description: 'The rados pool name. Default is rbd. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: boolean - secretRef: - description: 'SecretRef is name of the authentication - secret for RBDUser. If provided overrides keyring. - Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: object - properties: - 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?' + lun: + description: 'Optional: FC target lun number' + type: integer + format: int32 + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + targetWWNs: + description: 'Optional: FC target worldwide names (WWNs)' + type: array + items: type: string - user: - description: 'The rados user name. Default is admin. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - scaleIO: - description: ScaleIO represents a ScaleIO persistent volume - attached and mounted on Kubernetes nodes. - type: object - required: - - gateway - - secretRef - - system - properties: - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Default is "xfs". - type: string - gateway: - description: The host address of the ScaleIO API Gateway. - type: string - protectionDomain: - description: The name of the ScaleIO Protection Domain - for the configured storage. - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: SecretRef references to the secret for - ScaleIO user and other sensitive information. If this - is not provided, Login operation will fail. - type: object - properties: - 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?' + wwids: + description: 'Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.' + type: array + items: type: string - sslEnabled: - description: Flag to enable/disable SSL communication - with Gateway, default false - type: boolean - storageMode: - description: Indicates whether the storage for a volume - should be ThickProvisioned or ThinProvisioned. Default - is ThinProvisioned. - type: string - storagePool: - description: The ScaleIO Storage Pool associated with - the protection domain. - type: string - system: - description: The name of the storage system as configured - in ScaleIO. - type: string - volumeName: - description: The name of a volume already created in - the ScaleIO system that is associated with this volume - source. - type: string - secret: - description: 'Secret represents a secret that should populate - this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: object - properties: - defaultMode: - description: 'Optional: mode bits used to set permissions - on created files by default. Must be an octal value - between 0000 and 0777 or a decimal value between 0 - and 511. YAML accepts both octal and decimal values, - JSON requires decimal values for mode bits. Defaults - to 0644. Directories within the path are not affected - by this setting. This might be in conflict with other - options that affect the file mode, like fsGroup, and - the result can be other mode bits set.' - type: integer - format: int32 - items: - description: If unspecified, each key-value pair in - the Data field of the referenced Secret will be projected - into the volume as a file whose name is the key and - content is the value. If specified, the listed keys - will be projected into the specified paths, and unlisted - keys will not be present. If a key is specified which - is not present in the Secret, the volume setup will - error unless it is marked optional. Paths must be - relative and may not contain the '..' path or start - with '..'. - type: array - items: - description: Maps a string key to a path within a - volume. + flexVolume: + description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the driver to use for this volume. + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script. + type: string + options: + description: 'Optional: Extra command options if any.' + type: object + additionalProperties: + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + secretRef: + description: 'Optional: SecretRef is reference to the secret object containing sensitive information to pass to the plugin scripts. This may be empty if no secret object is specified. If the secret object contains more than one secret, all secrets are passed to the plugin scripts.' type: object - required: - - key - - path properties: - key: - description: The key to project. + 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 - mode: - description: 'Optional: mode bits used to set - permissions on this file. Must be an octal value - between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal - values, JSON requires decimal values for mode - bits. If not specified, the volume defaultMode - will be used. This might be in conflict with - other options that affect the file mode, like - fsGroup, and the result can be other mode bits - set.' - type: integer - format: int32 - path: - description: The relative path of the file to - map the key to. May not be an absolute path. - May not contain the path element '..'. May not - start with the string '..'. + flocker: + description: Flocker represents a Flocker volume attached to a kubelet's host machine. This depends on the Flocker control service being running + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata -> name on the dataset for Flocker should be considered as deprecated + type: string + datasetUUID: + description: UUID of the dataset. This is unique identifier of a Flocker dataset + type: string + gcePersistentDisk: + description: 'GCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: object + required: + - pdName + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: integer + format: int32 + pdName: + description: 'Unique name of the PD resource in GCE. Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + gitRepo: + description: 'GitRepo represents a git repository at a particular revision. DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod''s container.' + type: object + required: + - repository + properties: + directory: + description: Target directory name. Must not contain or start with '..'. If '.' is supplied, the volume directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name. + type: string + repository: + description: Repository URL + type: string + revision: + description: Commit hash for the specified revision. + type: string + glusterfs: + description: 'Glusterfs represents a Glusterfs mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' + type: object + required: + - endpoints + - path + properties: + endpoints: + description: 'EndpointsName is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + path: + description: 'Path is the Glusterfs volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + hostPath: + description: 'HostPath represents a pre-existing file or directory on the host machine that is directly exposed to the container. This is generally used for system agents or other privileged things that are allowed to see the host machine. Most containers will NOT need this. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath --- TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not mount host directories as read/write.' + type: object + required: + - path + properties: + path: + description: 'Path of the directory on the host. If the path is a symlink, it will follow the link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + iscsi: + description: 'ISCSI represents an ISCSI Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' + type: object + required: + - iqn + - lun + - targetPortal + properties: + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP authentication + type: boolean + chapAuthSession: + description: whether support iSCSI Session CHAP authentication + type: boolean + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface : will be created for the connection. + type: string + iqn: + description: Target iSCSI Qualified Name. + type: string + iscsiInterface: + description: iSCSI Interface Name that uses an iSCSI transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: integer + format: int32 + portals: + description: iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: array + items: + type: string + readOnly: + description: ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. + type: boolean + secretRef: + description: CHAP Secret for iSCSI target and initiator authentication + type: object + properties: + 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 keys - must be defined - type: boolean - secretName: - description: 'Name of the secret in the pod''s namespace - to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: string - storageos: - description: StorageOS represents a StorageOS volume attached - and mounted on Kubernetes nodes. - type: object - properties: - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: SecretRef specifies the secret to use for - obtaining the StorageOS API credentials. If not specified, - default values will be attempted. - type: object - properties: - 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?' + targetPortal: + description: iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: string + name: + description: 'Volume''s name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: 'NFS represents an NFS mount on the host that shares a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: object + required: + - path + - server + properties: + path: + description: 'Path that is exported by the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS export to be mounted with read-only permissions. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + server: + description: 'Server is the hostname or IP address of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + persistentVolumeClaim: + description: 'PersistentVolumeClaimVolumeSource represents a reference to a PersistentVolumeClaim in the same namespace. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: object + required: + - claimName + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in VolumeMounts. Default false. + type: boolean + photonPersistentDisk: + description: PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine + type: object + required: + - pdID + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + pdID: + description: ID that identifies Photon Controller persistent disk + type: string + portworxVolume: + description: PortworxVolume represents a portworx volume attached and mounted on kubelets host machine + type: object + required: + - volumeID + properties: + fsType: + description: FSType represents the filesystem type to mount Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + volumeID: + description: VolumeID uniquely identifies a Portworx volume + type: string + projected: + description: Items for all in one resources secrets, configmaps, and downward API + type: object + properties: + defaultMode: + description: Mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set. + type: integer + format: int32 + sources: + description: list of volume projections + type: array + items: + description: Projection that may be projected along with other supported volume types + type: object + properties: + configMap: + description: information about the configMap data to project + type: object + properties: + items: + description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 keys must be defined + type: boolean + downwardAPI: + description: information about the downwardAPI data to project + type: object + properties: + items: + description: Items is a list of DownwardAPIVolume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field + type: object + required: + - path + properties: + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' + 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 + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: 'Required: Path is the relative path name of the file to be created. Must not be absolute or contain the ''..'' path. Must be utf-8 encoded. The first item of the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) 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 + secret: + description: information about the secret data to project + type: object + properties: + items: + description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + 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 + serviceAccountToken: + description: information about the serviceAccountToken data to project + type: object + required: + - path + properties: + audience: + description: Audience is the intended audience of the token. A recipient of a token must identify itself with an identifier specified in the audience of the token, and otherwise should reject the token. The audience defaults to the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the requested duration of validity of the service account token. As the token approaches expiration, the kubelet volume plugin will proactively rotate the service account token. The kubelet will start trying to rotate the token if the token is older than 80 percent of its time to live or if the token is older than 24 hours.Defaults to 1 hour and must be at least 10 minutes. + type: integer + format: int64 + path: + description: Path is the path relative to the mount point of the file to project the token into. + type: string + quobyte: + description: Quobyte represents a Quobyte mount on the host that shares a pod's lifetime + type: object + required: + - registry + - volume + properties: + group: + description: Group to map volume access to Default is no group + type: string + readOnly: + description: ReadOnly here will force the Quobyte volume to be mounted with read-only permissions. Defaults to false. + type: boolean + registry: + description: Registry represents a single or multiple Quobyte Registry services specified as a string as host:port pair (multiple entries are separated with commas) which acts as the central registry for volumes + type: string + tenant: + description: Tenant owning the given Quobyte volume in the Backend Used with dynamically provisioned Quobyte volumes, value is set by the plugin + type: string + user: + description: User to map volume access to Defaults to serivceaccount user + type: string + volume: + description: Volume is a string that references an already created Quobyte volume by name. + type: string + rbd: + description: 'RBD represents a Rados Block Device mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md' + type: object + required: + - image + - monitors + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + image: + description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + keyring: + description: 'Keyring is the path to key ring for RBDUser. Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: type: string - volumeName: - description: VolumeName is the human-readable name of - the StorageOS volume. Volume names are only unique - within a namespace. - type: string - volumeNamespace: - description: VolumeNamespace specifies the scope of - the volume within StorageOS. If no namespace is specified - then the Pod's namespace will be used. This allows - the Kubernetes name scoping to be mirrored within - StorageOS for tighter integration. Set VolumeName - to any name to override the default behaviour. Set - to "default" if you are not using namespaces within - StorageOS. Namespaces that do not pre-exist within - StorageOS will be created. - type: string - vsphereVolume: - description: VsphereVolume represents a vSphere volume attached - and mounted on kubelets host machine - type: object - required: - - volumePath - properties: - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - storagePolicyID: - description: Storage Policy Based Management (SPBM) - profile ID associated with the StoragePolicyName. - type: string - storagePolicyName: - description: Storage Policy Based Management (SPBM) - profile name. - type: string - volumePath: - description: Path that identifies vSphere volume vmdk - type: string - installPlanApproval: - description: Approval is the user approval policy for an InstallPlan. - It must be one of "Automatic" or "Manual". - type: string - name: - type: string - source: - type: string - sourceNamespace: - type: string - startingCSV: - type: string - status: - type: object - required: - - lastUpdated - properties: - catalogHealth: - description: CatalogHealth contains the Subscription's view of its - relevant CatalogSources' status. It is used to determine SubscriptionStatusConditions - related to CatalogSources. - type: array - items: - description: SubscriptionCatalogHealth describes the health of a - CatalogSource the Subscription knows about. + pool: + description: 'The rados pool name. Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + secretRef: + description: 'SecretRef is name of the authentication secret for RBDUser. If provided overrides keyring. Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: object + properties: + 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 + user: + description: 'The rados user name. Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + scaleIO: + description: ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + type: object + required: + - gateway + - secretRef + - system + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Default is "xfs". + type: string + gateway: + description: The host address of the ScaleIO API Gateway. + type: string + protectionDomain: + description: The name of the ScaleIO Protection Domain for the configured storage. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail. + type: object + properties: + 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 + sslEnabled: + description: Flag to enable/disable SSL communication with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned. + type: string + storagePool: + description: The ScaleIO Storage Pool associated with the protection domain. + type: string + system: + description: The name of the storage system as configured in ScaleIO. + type: string + volumeName: + description: The name of a volume already created in the ScaleIO system that is associated with this volume source. + type: string + secret: + description: 'Secret represents a secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + optional: + description: Specify whether the Secret or its keys must be defined + type: boolean + secretName: + description: 'Name of the secret in the pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + storageos: + description: StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes. + type: object + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef specifies the secret to use for obtaining the StorageOS API credentials. If not specified, default values will be attempted. + type: object + properties: + 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 + volumeName: + description: VolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace. + type: string + volumeNamespace: + description: VolumeNamespace specifies the scope of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping to be mirrored within StorageOS for tighter integration. Set VolumeName to any name to override the default behaviour. Set to "default" if you are not using namespaces within StorageOS. Namespaces that do not pre-exist within StorageOS will be created. + type: string + vsphereVolume: + description: VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine + type: object + required: + - volumePath + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName. + type: string + storagePolicyName: + description: Storage Policy Based Management (SPBM) profile name. + type: string + volumePath: + description: Path that identifies vSphere volume vmdk + type: string + installPlanApproval: + description: Approval is the user approval policy for an InstallPlan. It must be one of "Automatic" or "Manual". + type: string + name: + type: string + source: + type: string + sourceNamespace: + type: string + startingCSV: + type: string + status: + type: object + required: + - lastUpdated + properties: + catalogHealth: + description: CatalogHealth contains the Subscription's view of its relevant CatalogSources' status. It is used to determine SubscriptionStatusConditions related to CatalogSources. + type: array + items: + description: SubscriptionCatalogHealth describes the health of a CatalogSource the Subscription knows about. + type: object + required: + - catalogSourceRef + - healthy + - lastUpdated + properties: + catalogSourceRef: + description: CatalogSourceRef is a reference to a CatalogSource. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + healthy: + description: Healthy is true if the CatalogSource is healthy; false otherwise. + type: boolean + lastUpdated: + description: LastUpdated represents the last time that the CatalogSourceHealth changed + type: string + format: date-time + conditions: + description: Conditions is a list of the latest available observations about a Subscription's current state. + type: array + items: + description: SubscriptionCondition represents the latest available observations of a Subscription's state. + type: object + required: + - status + - type + properties: + lastHeartbeatTime: + description: LastHeartbeatTime is the last time we got an update on a given condition + type: string + format: date-time + lastTransitionTime: + description: LastTransitionTime is the last time the condition transit from one status to another + type: string + format: date-time + message: + description: Message is a human-readable message indicating details about last transition. + type: string + reason: + description: Reason is a one-word CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition, one of True, False, Unknown. + type: string + type: + description: Type is the type of Subscription condition. + type: string + currentCSV: + description: CurrentCSV is the CSV the Subscription is progressing to. + type: string + installPlanGeneration: + description: InstallPlanGeneration is the current generation of the installplan + type: integer + installPlanRef: + description: InstallPlanRef is a reference to the latest InstallPlan that contains the Subscription's current CSV. type: object - required: - - catalogSourceRef - - healthy - - lastUpdated properties: - catalogSourceRef: - description: CatalogSourceRef is a reference to a CatalogSource. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this pod). - This syntax is chosen only to have some well-defined way - of referencing a part of an object. TODO: this design - is not final and this field is subject to change in the - future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - healthy: - description: Healthy is true if the CatalogSource is healthy; - false otherwise. - type: boolean - lastUpdated: - description: LastUpdated represents the last time that the CatalogSourceHealth - changed + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' type: string - format: date-time - conditions: - description: Conditions is a list of the latest available observations - about a Subscription's current state. - type: array - items: - description: SubscriptionCondition represents the latest available - observations of a Subscription's state. + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + installedCSV: + description: InstalledCSV is the CSV currently installed by the Subscription. + type: string + installplan: + description: 'Install is a reference to the latest InstallPlan generated for the Subscription. DEPRECATED: InstallPlanRef' type: object required: - - status - - type + - apiVersion + - kind + - name + - uuid properties: - lastHeartbeatTime: - description: LastHeartbeatTime is the last time we got an update - on a given condition - type: string - format: date-time - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transit from one status to another + apiVersion: type: string - format: date-time - message: - description: Message is a human-readable message indicating - details about last transition. + kind: type: string - reason: - description: Reason is a one-word CamelCase reason for the condition's - last transition. + name: type: string - status: - description: Status is the status of the condition, one of True, - False, Unknown. + uuid: + description: UID is a type that holds unique ID values, including UUIDs. Because we don't ONLY use UUIDs, this is an alias to string. Being a type captures intent and helps make sure that UIDs and names do not get conflated. type: string - type: - description: Type is the type of Subscription condition. - type: string - currentCSV: - description: CurrentCSV is the CSV the Subscription is progressing - to. - type: string - installPlanGeneration: - description: InstallPlanGeneration is the current generation of the - installplan - type: integer - installPlanRef: - description: InstallPlanRef is a reference to the latest InstallPlan - that contains the Subscription's current CSV. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - installedCSV: - description: InstalledCSV is the CSV currently installed by the Subscription. - type: string - installplan: - description: 'Install is a reference to the latest InstallPlan generated - for the Subscription. DEPRECATED: InstallPlanRef' - type: object - required: - - apiVersion - - kind - - name - - uuid - properties: - apiVersion: - type: string - kind: - type: string - name: - type: string - uuid: - description: UID is a type that holds unique ID values, including - UUIDs. Because we don't ONLY use UUIDs, this is an alias to - string. Being a type captures intent and helps make sure that - UIDs and names do not get conflated. - type: string - lastUpdated: - description: LastUpdated represents the last time that the Subscription - status was updated. - type: string - format: date-time - reason: - description: Reason is the reason the Subscription was transitioned - to its current state. - type: string - state: - description: State represents the current state of the Subscription - type: string - served: true - storage: true - subresources: - status: {} + lastUpdated: + description: LastUpdated represents the last time that the Subscription status was updated. + type: string + format: date-time + reason: + description: Reason is the reason the Subscription was transitioned to its current state. + type: string + state: + description: State represents the current state of the Subscription + type: string + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/operator-framework/api/crds/zz_defs.go b/vendor/github.com/operator-framework/api/crds/zz_defs.go index 3aafed754d..df9f39aeb1 100644 --- a/vendor/github.com/operator-framework/api/crds/zz_defs.go +++ b/vendor/github.com/operator-framework/api/crds/zz_defs.go @@ -84,7 +84,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x59\x4b\x8f\x1b\xb9\xf1\xbf\xcf\xa7\x28\xe0\x7f\xf0\x65\xd4\xb3\xfb\x77\x10\x04\xc2\x66\x01\x67\x26\x0f\x21\xf6\x7a\x30\x63\x1b\xc8\xb1\x44\x96\xba\xb9\xc3\x26\x7b\x59\x6c\xc9\xda\x20\xdf\x3d\x28\xb2\xbb\xf5\xea\x96\x46\x46\xcc\x8b\x2d\x36\x59\xef\xfa\x55\x15\x07\x1b\xf3\x85\x02\x1b\xef\xe6\x80\x8d\xa1\xaf\x91\x9c\xfc\xe2\xe2\xe5\x4f\x5c\x18\x7f\xb7\xfe\xf1\xe6\xc5\x38\x3d\x87\xfb\x96\xa3\xaf\x9f\x88\x7d\x1b\x14\x3d\xd0\xca\x38\x13\x8d\x77\x37\x35\x45\xd4\x18\x71\x7e\x03\x80\xce\xf9\x88\xb2\xcd\xf2\x13\x40\x79\x17\x83\xb7\x96\xc2\xac\x24\x57\xbc\xb4\x4b\x5a\xb6\xc6\x6a\x0a\x89\x78\xcf\x7a\xfd\x43\xf1\xb6\xf8\xe1\x06\x40\x05\x4a\xd7\x3f\x99\x9a\x38\x62\xdd\xcc\xc1\xb5\xd6\xde\x00\x38\xac\x69\x0e\x0a\x23\x5a\x5f\x66\x21\xb8\xf0\x0d\x05\x8c\x3e\x70\xa1\x7c\x20\x2f\xff\xd4\x37\xdc\x90\x12\xee\x65\xf0\x6d\x33\x87\xd1\x33\x99\x5e\x2f\x24\x46\x2a\x7d\x30\xfd\xef\x19\x78\x5b\xa7\xff\x75\xaa\x67\xa6\xcf\x89\x69\xda\xb7\x86\xe3\x3f\x4f\xbf\xbd\x37\x1c\xd3\xf7\xc6\xb6\x01\xed\xb1\xb8\xe9\x13\x57\x3e\xc4\x5f\x76\xcc\x67\x72\x88\x83\xca\x1f\x8d\x2b\x5b\x8b\xe1\xe8\xe6\x0d\x00\x2b\xdf\xd0\x1c\xd2\xc5\x06\x15\xe9\x1b\x80\xce\x7c\x89\xd0\x0c\x50\xeb\xe4\x10\xb4\x8f\xc1\xb8\x48\xe1\xde\xdb\xb6\x76\x03\x1b\x4d\xac\x82\x69\x62\x32\xf8\xa7\x8a\xa0\x09\x14\xe3\x36\x19\x02\xfc\x0a\x62\x45\x3d\xd7\x74\x03\xe0\x57\xf6\xee\x11\x63\x35\x87\x42\x6c\x5a\x68\xc3\x8d\xc5\xad\xc8\xd0\x9d\xc8\x4e\x79\xc8\xfb\xdd\x5e\xdc\x8a\xa0\x1c\x83\x71\xe5\x14\x6b\x39\xf3\x3a\x9e\xd9\x00\x9f\xb6\xcd\x21\xcb\xbd\x8d\xd7\xf0\x6b\xda\xa5\x35\x5c\x51\x78\x1d\xd3\xe1\xf8\x01\xcf\xc7\xa3\xdd\x11\xc6\x7b\x84\xfa\xb4\x28\x4e\x42\xfa\x80\xe8\xbb\xf2\x50\x0f\x8d\x31\x6f\xe4\xcf\xeb\x1f\xd1\x36\x15\xfe\x98\xa3\x43\x55\x54\xe3\xbc\x3b\xef\x1b\x72\xef\x1e\x17\x5f\xde\x3e\x1f\x6c\xc3\xa1\xf6\x07\xf1\x09\x86\x01\x21\x50\xe3\xd9\x44\x1f\xb6\x62\x8d\xfb\xe7\x2f\x7c\x0b\xf7\x4f\x0f\x7c\x0b\xe8\xf4\x90\x2e\xd0\xa0\x7a\xc1\x92\xb8\x18\x08\x67\x09\xfd\xf2\x57\x52\x71\xd8\x0c\xf4\x5b\x6b\x02\xe9\x1d\xff\x19\xf4\xba\xef\x6d\x89\x5d\x87\x9f\x4d\x10\x2e\x71\x48\xb8\xbc\xf6\xb0\x68\x6f\xf7\x48\x9f\x37\xa2\x72\x3e\x05\x5a\x40\x88\x38\x39\xb4\xcb\x05\xd2\x9d\x95\xb2\xa3\x0d\x8b\xb6\x81\x98\x5c\x86\xa5\x03\xc2\x20\x87\xd0\x75\x1a\x15\xf0\x4c\x41\xc8\x48\x8a\xb6\x56\x0b\x76\xad\x29\x44\x08\xa4\x7c\xe9\xcc\xef\x03\x6d\x86\xe8\x13\x53\x8b\x91\x38\x1e\xd1\x4c\xb9\xe7\xd0\xc2\x1a\x6d\x4b\xd9\xa8\x35\x6e\x21\x90\x70\x81\xd6\xed\xd1\x4b\x47\xb8\x80\x0f\x3e\x10\x18\xb7\xf2\x73\xa8\x62\x6c\x78\x7e\x77\x57\x9a\xd8\x63\xb0\xf2\x75\xdd\x3a\x13\xb7\x77\x09\x4e\xcd\xb2\x15\x38\xbb\xd3\xb4\x26\x7b\xc7\xa6\x9c\x61\x50\x95\x89\xa4\x62\x1b\xe8\x0e\x1b\x33\x4b\xa2\xbb\x84\xc3\x45\xad\xff\x2f\x74\xa8\xcd\x6f\x0e\x64\x3d\x09\xe0\xbc\x12\xe8\x9d\xf1\x80\x00\x5f\x8e\xa4\x7c\x35\x6b\xb1\x33\xb4\x6c\x89\x75\x9e\xfe\xfa\xfc\x09\x7a\xd6\xc9\x19\xc7\xd6\x4f\x76\xdf\x5d\xe4\x9d\x0b\xc4\x60\xc6\xad\x28\x64\x27\xae\x82\xaf\x13\x4d\x72\xba\xf1\xc6\xc5\x9c\xc4\xd6\x90\x3b\x36\x3f\xb7\xcb\xda\x44\x4e\x71\x49\x1c\xc5\x57\x05\xdc\xa7\xc2\x04\x4b\x82\xb6\x91\x0c\xd3\x05\x2c\x1c\xdc\x63\x4d\xf6\x1e\x99\xbe\xbb\x03\xc4\xd2\x3c\x13\xc3\xbe\xce\x05\xfb\x35\xf5\xf8\xf0\x51\xfe\x01\xf4\xf5\xee\xe2\xc1\xb1\x64\x85\x9c\x9d\xc7\x28\x9b\xd7\x78\x9e\xca\x42\xad\x03\xf1\xc9\xf6\x49\xb2\xe6\x63\x39\x5a\x2a\xcf\xe2\x37\x8c\xf0\xf1\xfd\x07\x50\xe8\xa0\x65\x92\x54\x52\xde\x39\x09\x84\xe8\x01\xa5\x2a\xcd\xe8\xab\xe1\x78\x68\x91\x9d\x06\xa5\xe1\x18\xb6\x05\xfc\xcd\x87\x1a\xe3\x1c\x7e\xea\xb7\x66\x89\x81\x0f\x60\x9a\x9f\xe7\x3f\x35\x3e\xc4\x9f\xe1\xa3\xb3\x5b\x61\xa3\x61\x53\x91\x83\xe7\x71\x3d\xf3\xfa\xf3\xde\xe7\xbf\x87\x46\x15\xb0\x28\x9d\x0f\xfd\x5d\x89\xb8\x45\x8d\x25\xc1\xca\x90\x4d\x19\xc0\x14\x8b\x37\x27\x94\x26\x7c\x0a\xb9\x1d\x5a\x99\xf2\x03\x36\x17\x0c\x77\xdf\x9f\x13\x2e\xc2\x78\xbf\x48\xef\x3e\x46\x9f\x42\x5a\xd4\x8b\x7e\x44\xa3\x25\xaa\x17\xc0\x8e\x6b\x8d\xcd\x8c\x53\x7a\xed\x19\x71\xd2\x3e\x07\xd6\xb8\xef\x09\x8c\xf0\xf0\x61\xef\xe0\xa2\xc3\xbe\xe2\x1a\xa3\xec\x6b\x7e\xd5\xbd\x5d\x3b\x72\xc1\x9c\x1f\x8e\xeb\xd1\x2b\xa8\x1b\x35\x2d\xce\x48\x66\xc1\x64\x76\x41\xca\xb0\x25\x32\xfd\xf1\x0f\xa3\x42\x48\xbd\xd4\x06\xe3\x58\x54\x4e\x67\x20\x24\xff\xf6\x44\xc7\xbe\x9e\x55\x0f\x12\xca\x74\x6c\xaf\xbe\x6d\x24\x0f\x2e\x18\x3d\xe7\x8a\x64\xbe\x1b\x9a\x8a\x59\x1f\x79\x69\x30\x40\xe3\x28\x64\x5a\x12\xca\xc6\x71\x44\x17\x4d\xdf\x01\x1d\x2e\x1c\xa2\xb6\x8f\xe2\x8d\x89\xd5\x6b\x23\x38\xe5\xf3\x08\xd5\xc5\x0a\xba\xe2\x73\x9b\x72\xab\xc3\xb5\x5d\x8a\x9b\x0c\x01\x57\x05\x74\x13\x8c\x0f\x26\x6e\x2f\xa1\xe3\x63\x77\xae\xe3\x86\xcc\xa6\x74\x82\x94\x1b\x32\x65\x15\xfb\x2e\xa3\xeb\x55\x81\x77\xf3\xc7\x91\x28\xbe\x67\x69\x7e\x97\x42\x4b\x35\xb0\xcf\x48\x6b\x62\x02\xda\x25\x89\xc1\xb9\xad\x49\xc3\x72\x9b\xa8\x6a\x6a\xc8\x69\x72\x6a\x3b\x8a\xb2\xec\xed\x9a\x42\x01\x9f\x59\x3c\x0d\xff\x30\xa5\x74\xcf\x9d\x60\xc6\x69\x23\x43\x13\x67\x26\xa9\x44\x5f\x94\xd2\xb0\x98\x7a\x45\x41\x10\xd5\x8b\x03\xad\xdf\x0c\x34\x49\x1f\x51\x60\xd0\x6d\xea\x2e\x2e\x0b\xda\x8a\x3d\x8b\xd4\xe8\x07\x74\xe5\x00\x94\xbd\x1f\xba\x06\x45\x0c\x51\xfa\xdc\x4b\xa4\x0e\xd8\xac\x27\xac\xe9\xa8\x44\xf9\x0a\x26\xc3\xfe\x40\xd5\xb8\xf8\xf6\xff\x33\x27\x4d\x2b\x6c\x6d\xec\x68\xa7\xd2\x75\x38\x54\xec\xaf\xae\x07\x92\x88\x85\xd6\x65\x47\x93\xde\x09\xb8\x49\x0d\xe7\x92\xe0\x87\x4c\xfc\xd0\x14\xe9\xde\x98\xa4\x15\x01\x4b\x61\x38\x54\x94\x61\x63\xac\x15\x6a\x01\xdd\x0b\x69\xb0\xf4\xd5\x28\x5f\x06\x6c\x2a\xa3\xd0\xda\x6d\x02\x0e\x3d\x06\xe6\x0e\xa4\x77\x92\x6a\x33\x59\xd8\xa4\xbf\x2d\x87\x21\xa8\x5f\xc3\xc8\x74\x15\x84\x33\xa9\x40\xf1\x52\x1b\xf1\x9c\x4f\xed\x1a\x45\x29\xbc\xe2\x8e\xee\x7a\x8e\xc2\x2e\xce\xa7\xab\x21\x2a\x25\xa9\x9d\x52\xca\xbb\x28\x0d\xe7\xd1\x38\x58\xc0\x22\x4a\x9c\x2e\x89\x53\xf6\xbd\x10\x35\x39\xba\xad\x39\xe9\xf3\x93\xfc\x35\x5a\x7b\x2b\x63\xbb\x22\x20\x54\x55\x36\xbd\xa3\x24\x83\x88\x13\x83\x21\x0d\x2b\x1f\x80\xd6\x24\xb8\xd7\x79\x96\x9c\xd4\xdf\x09\x5b\x61\x08\x78\x1a\xed\x26\x52\x3d\x5a\x06\xce\x19\x78\x40\xc0\x4b\x36\xde\xe1\x66\xd7\x72\xf4\x33\xfa\x44\x42\x9f\x61\x9a\x7b\xec\xe7\x18\x30\x52\x79\x09\x05\x3f\x1f\x1c\x1e\x66\xba\xca\x6f\xfa\x5e\xfd\x38\x1b\x52\xc1\x38\x9e\x25\x20\xbd\xe3\xa4\x08\xd0\x86\x95\xe0\x0b\x69\x69\x95\xd8\x70\xf6\x33\xba\x3c\x9a\xad\xd1\xe6\x80\xe9\x59\x35\xde\xda\x04\x34\x6d\x18\x9b\x11\x65\xc9\x0c\x87\x0e\xa8\x5e\x92\xd6\x32\x07\xf6\xe2\x8e\x16\xed\xb3\x4d\xc2\xf9\x8a\xde\xd7\xb8\x47\x6f\xed\xb9\xaa\x3c\x41\xfc\x32\x03\xe8\x27\xd4\x35\x4e\x30\x80\x93\x42\xde\x5b\xcd\x70\x9f\x5d\xa0\x29\x52\xa8\x8d\xa3\x1c\x2a\xa6\xa6\x81\xea\x24\x51\x80\x25\xc5\x0d\x91\x03\x55\x91\x7a\x19\x92\x2f\x4f\xd1\xc7\x5e\xee\x06\xfa\x84\x87\x67\x48\xf6\xb7\x76\xcf\x16\xde\xda\x34\xa0\x33\x11\x98\x15\x20\x38\xda\xf4\xd4\xc6\x9f\x7f\xc6\x16\xef\x1e\x4c\xd6\x68\x2c\x2e\x2d\x15\xd2\x2d\x0c\xbf\x6e\xf7\x65\x37\x7d\xaf\xd3\xb4\xd6\x8e\x22\x6b\xbf\x24\x92\xca\xa7\xc7\x7b\x88\x01\x57\x2b\xa3\xe4\x92\x36\x81\x54\xcc\x86\x9d\x34\xc8\x58\xf7\x92\xd7\x44\x26\x72\xc4\xd8\xf2\x2b\x07\xc3\xe9\xa0\x19\x46\x96\x27\xa9\xdd\xe4\xd4\x08\x92\x7c\x73\x57\xec\x76\x4f\x89\xc7\xdb\xe9\x95\xf3\xca\xec\xb1\xc8\x31\xe3\xc9\x27\x33\x36\x14\xc0\xe5\x9e\x18\x04\xab\xd3\x5c\x29\x64\x66\x12\xd9\x23\xa7\xdc\xe8\xcc\xf1\x0a\xf2\x83\x66\xdf\x74\xbb\x7f\x4c\x19\x7d\x26\x7b\x25\x8d\xd6\x8c\x78\x02\x4e\x50\x79\xf1\x90\x87\xf6\x54\x05\x12\x5c\x56\xde\x6a\x86\xd6\x99\xdf\x5a\x82\xc5\x43\xd7\x6b\xdc\x82\x71\xca\xb6\x7a\xca\x9a\x00\x9f\x3f\x2f\x1e\xb8\x00\xf8\x0b\x29\x94\x81\x7f\x43\xa0\xbd\x7b\x13\xe1\xe3\x2f\xef\xff\x95\x9e\x00\xd2\x89\xdb\x5c\x68\xf3\xbc\x80\xd6\xa4\x57\xb6\x09\x92\x59\xb9\x44\x53\x80\xbb\x93\x52\x61\x13\xdb\x40\x9c\x90\xc8\xc5\x94\x6a\x15\xd9\x86\xa1\xc6\x17\x02\x6e\x43\xd6\x64\x4a\xce\xc5\x03\xa7\x3b\xc9\x47\xa0\x3d\x38\x1f\xa1\xa4\x98\x52\xc0\xa6\x57\xa3\x6b\x0d\xde\xbd\x6c\x18\xef\x9e\x23\xc6\xff\x65\xe6\x48\xa8\x7f\x5c\xa6\x49\x48\x27\xda\x57\xa6\xca\xe4\x03\xce\x05\x8d\xa0\x4b\xb3\xfb\xac\xd9\x77\xcc\xb1\x13\x0d\xaf\xe6\x95\x71\x34\xcd\xa1\x4f\x67\xeb\xea\xc9\xdf\x0b\x84\x77\xae\x6a\xe9\xc1\xe5\xf0\x0d\x3d\x61\xfd\x30\xc8\x56\x28\xfd\x22\x8d\x75\x0d\x52\x8a\x32\xaa\x93\xeb\xa2\x8f\x76\xa5\xa2\x6d\x66\xd1\xcf\xf4\x98\xeb\xce\xda\xef\x92\xed\x6a\x62\xbe\x3c\x9d\xbf\x83\xaa\xad\xd1\x41\x20\xd4\x52\xce\xfa\x6b\xfd\x6c\x97\x27\xaf\x88\xc6\x32\xe0\xd2\xb7\x11\x36\xd5\xd8\x00\x36\x62\x1f\xce\x63\x93\xcc\x84\xde\xe5\xbf\x49\x5d\x35\x3e\x07\x42\x1e\x03\xb7\x03\xf9\x9f\xd2\xa1\xbe\x57\xcd\x57\x46\x84\xd9\x08\x8c\x04\x74\x9c\xc4\x18\xad\xcc\xd1\xa7\x99\x47\xb5\x21\xa4\xd1\x42\x42\xed\x4a\x79\x73\x28\x3c\x53\x58\x9b\xab\xcb\xe3\xf9\x34\x4d\x7f\x3c\x22\xfd\xee\x7b\x26\x5a\xe3\xc3\xb7\x91\x6f\x82\x8f\x5e\xf9\xb3\x8d\xea\xe4\x65\xce\xd6\x1a\x7f\xbd\xbb\xee\xfe\x35\x05\x35\xe3\xc9\x1c\x62\x68\xb3\x2d\x38\xfa\x90\x9e\x38\x76\x3b\xed\x72\xf8\x83\x49\x4f\xb5\x6b\xa6\xe0\xdf\xff\xb9\xf9\x6f\x00\x00\x00\xff\xff\xda\xfa\xc4\xca\x33\x1f\x00\x00") +var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x59\x4b\x6f\x23\xb9\x11\xbe\xfb\x57\x14\x90\xc3\x5e\xac\xf6\x4e\x76\x11\x04\xc2\x66\x81\x89\x9c\x87\x91\x99\x1d\xc3\xf2\x0c\x90\x63\xa9\x59\xea\xe6\x9a\x4d\xf6\xb2\xaa\xa5\xd1\x06\xf9\xef\x41\x91\xdd\x7a\xbf\xec\x60\x74\xb1\xc4\x47\x55\xf1\x63\x7d\xf5\xa0\xb1\xb5\x5f\x28\xb2\x0d\x7e\x0c\xd8\x5a\xfa\x2a\xe4\xf5\x17\x17\x2f\x7f\xe6\xc2\x86\xbb\xc5\xbb\x9b\x17\xeb\xcd\x18\x26\x1d\x4b\x68\x9e\x88\x43\x17\x4b\xba\xa7\xb9\xf5\x56\x6c\xf0\x37\x0d\x09\x1a\x14\x1c\xdf\x00\xa0\xf7\x41\x50\x87\x59\x7f\x02\x94\xc1\x4b\x0c\xce\x51\x1c\x55\xe4\x8b\x97\x6e\x46\xb3\xce\x3a\x43\x31\x09\x1f\x54\x2f\xbe\x2f\x7e\x2c\xde\xdd\x00\x94\x91\xd2\xf6\x67\xdb\x10\x0b\x36\xed\x18\x7c\xe7\xdc\x0d\x80\xc7\x86\xc6\x50\xa2\xa0\x0b\x55\x36\x82\x8b\xd0\x52\x44\x09\x91\x8b\x32\x44\x0a\xfa\xa7\xb9\xe1\x96\x4a\xd5\x5e\xc5\xd0\xb5\x63\x38\xba\x26\xcb\x1b\x8c\x44\xa1\x2a\x44\x3b\xfc\x06\x18\x41\x70\x4d\xfa\xde\x1f\x3e\xab\x9d\x26\xb5\x69\xdc\x59\x96\x7f\x1d\xce\x7d\xb0\x2c\x69\xbe\x75\x5d\x44\xb7\x6f\x70\x9a\xe2\x3a\x44\xf9\x65\xa3\x5e\xd5\x95\x28\x1c\xcb\x3c\x6d\x7d\xd5\x39\x8c\x7b\x7b\x6f\x00\xb8\x0c\x2d\x8d\x21\x6d\x6d\xb1\x24\x73\x03\xd0\x43\xd8\x8b\x1a\x01\x1a\x93\xae\x05\xdd\x63\xb4\x5e\x28\x4e\x82\xeb\x1a\xbf\x56\xa5\x6b\x0c\x71\x19\x6d\x2b\x09\xfa\xe7\x9a\xa0\x8d\x24\xb2\x4a\x90\x40\x98\x83\xd4\x34\xe8\x5e\xef\x02\xf8\x95\x83\x7f\x44\xa9\xc7\x50\x28\xc2\x85\xb1\xdc\x3a\x5c\xa9\x35\x5b\xab\xf2\x35\xdd\xe7\xb9\xad\x71\x59\xa9\xe9\x2c\xd1\xfa\xea\x9c\x29\xba\xee\x7a\x1b\x32\x34\xcf\xab\xf6\xd0\x84\xbd\xc1\x6b\xf5\xb7\xdd\xcc\x59\xae\x29\x5e\x6f\xc4\x7a\xcb\x81\x0d\x8f\x47\x66\x4e\x18\xb2\x25\x74\x20\x54\x71\x40\x86\x03\x05\xef\xab\xc3\x33\x1a\x94\x61\x30\x2f\x5a\xbc\x43\xd7\xd6\xf8\xae\x1f\xe4\xb2\xa6\x06\x37\xfe\x10\x5a\xf2\xef\x1f\x1f\xbe\xfc\x30\xdd\x9b\x80\x5d\x74\x76\xfc\x1c\x2c\x03\x42\xa4\x36\xb0\x95\x10\x57\x8a\xd6\x64\xfa\x85\x6f\x61\xf2\x74\xcf\xb7\x80\xde\xac\x89\x07\x2d\x96\x2f\x58\x11\x17\x07\xb6\x86\xd9\xaf\x54\xca\xd6\x70\xa4\xdf\x3a\x1b\xc9\x6c\x5b\xa1\xf0\x0c\x98\xec\x0d\x2b\xfe\x5b\x43\x6d\x54\x9d\xb2\x45\xe4\xfc\xd9\x8a\x72\x3b\xe3\x7b\x27\xfc\x4e\x61\xc8\xeb\xc0\x68\x80\x23\x4e\x2e\xd0\x73\x8c\x4c\x8f\x5d\x76\x0d\xcb\x7a\xfe\x48\x4c\x3e\x87\x3c\x1d\x46\xdf\x9f\xa9\x80\x29\x45\xdd\xa8\x74\xef\x9c\xd1\x48\xb8\xa0\x28\x10\xa9\x0c\x95\xb7\xbf\xaf\xa5\x31\x48\x48\x6a\x1c\x0a\xb1\x40\x62\xad\x47\x07\x0b\x74\x1d\x65\x28\x1b\x5c\x41\x24\x95\x0b\x9d\xdf\x92\x90\x96\x70\x01\x1f\x43\x24\xb0\x7e\x1e\xc6\x50\x8b\xb4\x3c\xbe\xbb\xab\xac\x0c\x31\xbc\x0c\x4d\xd3\x79\x2b\xab\xbb\x14\x8e\xed\xac\xd3\x70\x78\x67\x68\x41\xee\x8e\x6d\x35\xc2\x58\xd6\x56\xa8\x94\x2e\xd2\x1d\xb6\x76\x94\x8c\xf5\x29\x8e\x17\x8d\xf9\x43\xec\xa3\x3e\x7f\xb7\x07\xdf\x51\x67\x86\x21\x6c\x9e\xc5\x5a\x83\x67\xf6\xa2\xbc\x3d\x9f\x65\x03\xa9\x0e\x29\x2a\x4f\x7f\x9b\x3e\xc3\x60\x40\x86\x3d\x23\xbc\x59\xca\x1b\xb0\x15\x28\xeb\xe7\x14\xf3\xca\x79\x0c\x4d\x92\x42\xde\xb4\xc1\x7a\xc9\x94\x76\x96\xbc\x00\x77\xb3\xc6\x0a\x27\x9f\x23\x16\xbd\x87\x02\x26\x29\x85\xc1\x8c\xa0\x6b\x95\x49\xa6\x80\x07\x0f\x13\x6c\xc8\x4d\x90\xe9\x9b\x43\xad\x88\xf2\x48\xe1\xbb\x1e\xec\xed\x0c\x7c\xb8\xe1\x80\x63\x00\x43\x86\xbc\x6a\xf1\x29\x52\x42\x66\xe0\xb1\x08\x0c\x67\xb8\xa8\x1f\x34\x26\x12\x1f\x99\x38\x20\x64\x5e\x98\xfd\xa4\x0e\xac\xf7\x87\x02\x9f\x3e\x7c\x84\x12\x3d\x74\x4c\x4a\x9e\x32\x78\xaf\x0e\x21\x01\x50\x73\xd9\x88\xbe\x5a\x4e\x0e\x14\xa9\xb2\x2c\x71\x55\xc0\xdf\x43\x6c\x50\xc6\xf0\xd3\x30\x34\x4a\xe2\x42\x04\xdb\xfe\x3c\xfe\xa9\x0d\x51\x7e\x86\x4f\xde\xad\x54\xa8\x81\x65\x4d\x1e\xa6\xeb\xb3\xc1\x5f\xb6\x7e\xfc\x23\xb6\x65\x01\x0f\x95\x0f\x71\x58\xa9\x5e\xf5\xd0\x60\x45\x30\xb7\xe4\x92\x5f\x33\x49\xb1\x7f\x83\x67\x6f\x11\x72\xb9\x34\xb7\xd5\x47\x6c\x2f\x42\x33\x19\x56\xaa\x2e\x55\xbf\x9d\xbc\x37\x93\x12\x92\x2b\xeb\x91\xf4\x2b\x96\x2f\x80\xbd\x96\x06\xdb\x11\x27\xda\x6c\xc1\x74\x1d\x02\x93\x41\x80\xe2\xb7\x19\x7e\xe8\x23\x57\xf1\xda\x63\x6f\x9f\xec\xd5\x7b\x37\x65\xc8\x45\xd0\x3e\x1e\xcb\x22\x57\xe8\xb0\xe5\x39\xc3\x8e\x72\x06\xce\xf2\x06\x12\x77\x66\xc8\xf4\xa7\x1f\x4f\x18\x94\xb3\x9e\xb1\x28\x87\xdc\x82\x0b\xfc\xd2\xcf\x46\xf8\xf1\xf9\x0b\x47\x86\x14\x57\x7a\xf5\x6f\x92\x60\x95\x0f\x17\xaf\x24\xb3\x46\xf9\xed\xd7\x05\xc3\x68\xf0\xc7\xd4\x3e\xa0\xf5\x14\xb3\x34\xf5\x61\xeb\x59\xd0\x8b\x45\xa1\x54\x81\xf4\x6c\xee\x3d\x79\x69\xa5\xbe\xd6\x8b\x7b\x1e\xcf\xa1\x4f\x23\xb7\x89\x3b\x7d\x6c\xda\x10\xd9\x66\xa2\xbf\xda\xa9\xdb\x68\x43\xb4\xb2\xba\x1c\xe5\x1e\xfb\x95\xbd\x4e\x64\xb6\x95\xd7\x88\xb7\x24\x5b\xd5\x32\xd4\x07\x7d\x25\x0a\x43\x2a\x0c\x83\x0a\xfb\xbb\x26\x46\x6a\x80\x43\x8e\x8f\x56\x52\x78\x9c\x91\x02\xc8\x5d\x43\x06\x66\xab\x24\xc3\x50\x4b\xde\x90\x2f\x57\x29\xa7\xba\x05\xc5\x02\x3e\xb3\xde\x14\xfc\xd3\x56\x5a\xf7\xf6\x4a\xad\x37\x56\x1b\x23\xce\x22\x53\x3a\xdd\xb3\xc0\xb2\x42\x37\xa7\xa8\x71\x30\x28\xfc\x2e\x2c\xd7\x12\xc8\xec\xad\x67\x30\x5d\xca\xf4\xfb\x46\x74\x8a\x43\x91\xca\xef\x88\xbe\x5a\x87\xb1\x01\xc1\xbe\x34\xd0\x23\x55\x21\xe7\xf4\x54\x77\xda\x45\x42\xc1\x53\x85\xe9\xbb\xcd\x81\x78\x2d\xc3\x7a\xf9\xe1\x8f\x59\xae\xa1\x39\x76\x4e\x7a\x49\x29\x51\xec\x1d\x46\x3d\x07\x3a\x9f\xc1\x27\xb3\x51\xbe\x4c\xe5\xdb\x8c\xe0\xfb\x2c\xea\xd8\x3e\x55\xcb\x1a\x80\x77\x4d\x66\x58\x5a\xe7\x74\x6f\x44\xff\x42\x06\x1c\x7d\xb5\x65\xa8\x22\xb6\xb5\x2d\xd1\xb9\x55\xa2\xa9\x81\xe0\x41\x2b\x11\x8d\xe1\x67\x92\x86\x56\x86\xd5\x4e\x33\xd1\x7b\xda\xd0\x66\xbc\x3a\x78\x32\x95\x91\xe4\x72\x22\x9e\xe6\x75\x9b\x92\x4b\xd3\x9b\x42\xdc\x0b\xc8\x3e\xd2\xfb\xdc\x90\x6d\xb0\x2c\x95\x48\xc9\x75\x83\x17\x2d\xd4\xf6\x9a\xaa\x02\x1e\x44\xbd\x68\xa6\x75\xaf\x04\x78\x21\x6a\xb3\xa7\x69\x7b\x0d\xdc\xa0\x73\xb7\xda\x10\x97\x04\x84\x65\x9d\xe1\xf4\xd4\x67\x33\x02\x89\x96\x0c\xcc\x43\x04\x5a\x90\xc6\x8b\xfe\x6e\xc8\x6b\x36\x3b\x89\x06\xc6\xb8\xd3\x9c\x0e\x1f\x2b\xd4\x9c\x08\xa7\xe7\x61\x5c\xc7\x94\xcb\x48\x6e\x62\x51\x9f\xb8\x87\x8e\x97\x37\x8f\x0b\xaf\x50\x9d\xab\xd4\xa9\x44\x14\xaa\x2e\xc7\x9a\xcf\x3b\xcb\xd7\x5d\x4e\x1d\x96\x43\xbd\x7b\x40\x72\x0d\xbc\x3c\xdc\xad\xb1\x5c\x2a\xd3\xc9\x68\x91\xc1\x96\xf3\x9d\xa2\xcf\x6d\xcb\x02\x5d\x76\x85\x41\x70\x1b\x9c\x4b\x94\xef\x62\xee\x91\xb4\x9b\x41\x0f\xd4\xcc\xc8\x18\xed\x81\x06\x53\x4e\xa4\xb9\x0b\x29\xf6\x52\x16\x1c\xf2\xc3\x63\x70\xee\x7c\x16\x3b\xa9\xe2\x1a\x35\xfa\x19\x00\x38\xbd\x62\x3f\xf5\x0d\x88\x59\x5e\x73\xc6\x90\x50\x6c\xac\xa7\xec\x1a\xb6\xa1\x0d\xb0\x33\x92\x25\x91\x87\xb2\xa6\xf2\x65\x4d\xa5\xbe\x6b\xdc\xbb\xb5\xbe\x65\xdd\x8d\x58\x9b\x86\x3c\x38\x97\xda\x4e\x26\x02\x3b\x07\x04\x4f\xcb\x61\xcf\x1e\x47\xb7\x82\x3d\x2e\xd0\x3a\x9c\x39\x4a\x59\x73\xfd\xeb\x76\xa7\x7b\x1d\xf2\x79\xdb\x39\x47\x26\xdd\x77\xf5\xf4\x38\x01\x89\x38\x9f\xdb\x52\xa7\x8c\x8d\x54\x4a\x3e\xf0\xc9\x23\x1c\x63\xef\xee\x8d\x1d\x61\x04\x0b\x4a\x77\x70\x47\x67\x2e\xf8\xdc\xc5\xae\x8b\xf1\x27\xcd\x71\xe4\xcb\xa3\xec\xfe\x3f\x6b\x40\xbf\xfb\x7c\xb6\x3f\x95\xde\xf9\xde\xe0\xf7\x0e\x59\x32\xd7\x9f\xed\xf1\xc2\x18\xae\xa9\x00\x41\x63\x6b\xea\x9b\x54\xd4\x48\xfd\xf1\xe8\x3a\x7f\xa2\xfa\xbe\x4a\xc9\xfa\x9c\x6f\x96\x30\x3c\x0f\x9c\x78\xe4\xb9\x5a\x4e\x67\x4f\xdc\xd3\x7e\x14\x7d\xb8\xcf\x2d\x69\x8a\xdd\x29\xe0\xd5\xc1\x19\x86\xce\xdb\xdf\x3a\x82\x87\xfb\x3e\xff\xdf\x82\xf5\xa5\xeb\x8c\x86\xc0\xcf\x9f\x1f\xee\xb9\x00\xf8\x2b\x95\xa8\x8d\xeb\x92\xc0\x04\xff\x9d\xc0\xa7\x5f\x3e\xfc\x3b\xb5\xb2\x69\xc5\x6d\x4e\x80\xb9\x22\x46\x67\xf3\xfb\x50\x36\x3a\xed\x56\x59\xbd\xe6\x12\x5b\xe9\x22\x71\x8a\x11\x5e\x12\xd9\x6a\x72\x2d\x43\x83\x2f\x04\xdc\xc5\xde\x3a\x15\x9c\x66\x13\xd6\x60\x02\xf8\x20\x50\x91\x24\x27\x77\xe9\x9d\xe3\x2d\xa0\xf5\x9d\xb7\x0d\x7e\x2a\x28\xdf\x82\x1f\xea\xc8\x9f\x66\xa9\xba\x37\x49\xc7\x1b\xc8\x70\xe6\xb9\xe1\xe2\x09\xa1\x27\xd3\x24\x9f\xf4\x9b\x33\xe9\xe0\xbc\x6f\xd2\x98\x23\x6a\xea\xad\x9e\x2e\x64\xc0\x83\x17\x70\xb5\x20\x67\x9e\xf4\x94\xb0\xfb\xea\x9b\xa2\xfb\xba\x3d\xab\x51\x6b\x37\xf2\x29\xa1\xe4\x78\x4e\xbe\xf7\x3a\xda\xa4\x82\xae\x1d\x49\x18\x99\xe3\x97\x77\x01\xb9\xcb\xa8\x35\xc4\x7c\x4d\xa7\xf9\x1e\xea\xae\x41\x0f\x91\xd0\x68\xda\x1a\x36\x0e\x9d\x4e\xee\x4c\x04\xad\x63\xc0\x59\xe8\x04\x96\xf5\xea\x18\x06\x9c\x1b\x0d\xed\x87\x82\xcf\xff\x6d\x79\x75\x73\x18\x09\xf9\x78\xa0\xda\xb1\xf9\x29\x2d\x1b\x2a\xc5\xbc\xe9\x88\x49\x4b\x0d\x12\x11\x3d\x27\x63\xf2\x45\x68\x3f\x51\x76\x31\xa6\x62\x5d\x1d\xe9\x0d\x36\xe6\x6b\x9e\x52\x5c\xd8\x37\x25\xbf\x4b\xc4\x4c\xff\xe0\x20\xf3\xfe\xdb\xd3\xaa\x0d\xf1\xed\x4a\xda\x18\x24\x94\xe1\x42\x01\x79\x46\x00\x67\x04\x4f\xbd\x51\xbd\x56\xc6\x6b\x93\x65\x8e\x26\x63\x90\xd8\x0d\xe8\xb0\x84\x98\x9a\xfe\xed\xb1\x6e\xb6\x7e\xe8\xdf\x48\xef\x4b\x2a\xf8\xcf\x7f\x6f\xfe\x17\x00\x00\xff\xff\xe3\x8c\x7a\xb6\x2d\x1e\x00\x00") func operatorsCoreosCom_catalogsourcesYamlBytes() ([]byte, error) { return bindataRead( @@ -99,12 +99,12 @@ func operatorsCoreosCom_catalogsourcesYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "operators.coreos.com_catalogsources.yaml", size: 7987, mode: os.FileMode(436), modTime: time.Unix(1606762434, 0)} + info := bindataFileInfo{name: "operators.coreos.com_catalogsources.yaml", size: 7725, mode: os.FileMode(436), modTime: time.Unix(1607977322, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x73\x24\xb7\x91\x2f\xfa\xbf\x3f\x45\xc6\x58\x7b\x48\xae\xd8\xcd\x19\x7b\xed\xbb\x3b\xc7\xf7\x28\xb8\x33\x94\xcc\xab\x19\x0e\x63\x48\x49\xc7\x21\x6b\xb5\xe8\x2a\x74\x37\x96\x55\x40\x19\x40\x35\xa7\xf7\xe8\x7c\xf7\x1b\x48\xa0\x5e\xdd\x4d\xb2\x0b\x00\x4d\x8e\x8c\x74\x84\x35\x7c\x65\xe3\x99\x99\xc8\xfc\x65\x26\xa9\xd8\xf7\x54\x2a\x26\xf8\x6b\x20\x15\xa3\x9f\x34\xe5\xe6\x2b\x35\xbd\xf9\x57\x35\x65\xe2\x64\xf5\xea\x37\x37\x8c\xe7\xaf\xe1\x4d\xad\xb4\x28\x3f\x52\x25\x6a\x99\xd1\xb7\x74\xce\x38\xd3\x4c\xf0\xdf\x94\x54\x93\x9c\x68\xf2\xfa\x37\x00\x84\x73\xa1\x89\xf9\xb6\x32\x5f\x02\x64\x82\x6b\x29\x8a\x82\xca\xc9\x82\xf2\xe9\x4d\x3d\xa3\xb3\x9a\x15\x39\x95\xc8\xbc\xf9\xe8\xd5\xcb\xe9\xef\xa7\x2f\x7f\x03\x90\x49\x8a\x7f\x7e\xcd\x4a\xaa\x34\x29\xab\xd7\xc0\xeb\xa2\xf8\x0d\x00\x27\x25\x7d\x0d\x59\x51\x2b\x4d\xa5\xa2\x72\xc5\x32\xea\xfe\x5e\x4d\x45\x45\x25\xd1\x42\xaa\x69\x26\x24\x15\xe6\x3f\xe5\x6f\x54\x45\x33\x33\x8a\x85\x14\x75\xf5\x1a\x76\xfe\x8e\xe5\xdb\x0c\x96\x68\xba\x10\x92\x35\x5f\x4f\x40\x14\x25\xfe\xcb\x2d\x81\xfd\xf0\x2b\xfb\xe1\x6e\xdd\xf0\xe7\x05\x53\xfa\xdb\xbb\x7f\xe7\x1d\x53\x1a\x7f\xaf\x2a\x6a\x49\x8a\xbb\xa6\x81\xbf\xa2\x96\x42\xea\x8b\x6e\x50\x13\xc8\xd4\xaa\xfb\x97\xfb\x25\xc6\x17\x75\x41\xe4\x1d\x9c\x7e\x03\xa0\x32\x51\xd1\xd7\x80\x8c\x2a\x92\xd1\xfc\x37\x00\xcd\xe7\x18\xc6\x13\x20\x79\x8e\x1b\x48\x8a\x4b\xc9\xb8\xa6\xf2\x8d\x28\xea\x92\xb7\x1f\x9b\x53\x95\x49\x56\x69\xdc\xa0\xeb\x25\xc5\x95\x02\x31\x07\xbd\xa4\xf0\xe6\xea\x7b\xfc\x35\x80\xff\x52\x82\x5f\x12\xbd\x7c\x0d\x53\xb3\xe0\xd3\x9c\xa9\xaa\x20\x6b\xf3\xc1\xee\x37\xec\xce\xbd\xb5\xdf\x77\xdf\xd3\x6b\x33\x3a\xa5\x25\xe3\x8b\xbb\x3e\xcf\x0d\xf7\xe1\x8f\x5c\xf5\x76\xa2\xf9\xb8\xef\x07\xdf\xdb\xe7\xe3\x9a\xe9\x11\xf3\x49\xa0\x97\x44\x83\x5e\x32\x05\x82\x53\x90\xb4\x2a\x48\x46\xd5\x1d\x03\xd8\xf8\xb1\x1d\xc1\xc7\xe1\x37\x77\x0c\xa1\xcf\x46\x13\x5d\xab\x69\xb5\x24\x6a\xb8\x6c\x97\xbd\xef\x6c\xb1\xb0\xbf\xb2\x7a\x45\x8a\x6a\x49\x5e\xd9\x93\x91\x2d\x69\x49\x5e\xbb\xbf\x10\x15\xe5\xa7\x97\xe7\xdf\xff\xfe\x6a\xf0\x6d\x18\xce\x7e\xe7\x99\x05\xa6\xcc\x52\xe0\xad\x87\xe6\xda\xe3\x5e\xac\x2b\x0a\xff\xb9\xf3\x6f\xae\x2a\x9a\xfd\xe7\xb4\xfd\x10\x3b\x5e\x31\xfb\x2f\x9a\xe9\xf6\x9b\x92\xfe\xad\x66\x92\xe6\xdd\x58\x26\xd0\x88\x90\xde\xb7\xcc\xba\xb6\x5f\x56\xd2\x5c\x5e\xdd\x5e\x4c\x4b\x3d\xd9\xd5\xfb\xee\xc6\xdc\x0e\xcc\xf4\xdd\x8c\x72\x23\xb4\xa8\xc2\xd3\xe4\xce\x0c\xcd\xdd\x8a\xd9\x53\xc6\x94\xd9\x6a\x49\x15\xe5\x56\x8c\x0d\x18\x03\x1e\x0f\xee\x66\x34\x05\x33\x79\x2a\x95\xb9\xb2\x75\x91\x1b\x59\xb7\xa2\x52\x83\xa4\x99\x58\x70\xf6\xdf\x2d\x6f\x05\x5a\xe0\x87\x16\x44\x53\xa5\x37\x78\xe2\xdd\xe3\xa4\x80\x15\x29\x6a\x7a\x0c\x84\xe7\x50\x92\x35\x48\x6a\x3e\x05\x6a\xde\xe3\x87\xbf\xa2\xa6\xf0\x5e\x48\x0a\x8c\xcf\xc5\x6b\x58\x6a\x5d\xa9\xd7\x27\x27\x0b\xa6\x1b\x99\x9d\x89\xb2\xac\x39\xd3\xeb\x13\x14\xbf\x6c\x56\x1b\xb1\x77\x92\xd3\x15\x2d\x4e\x14\x5b\x4c\x88\xcc\x96\x4c\xd3\x4c\xd7\x92\x9e\x90\x8a\x4d\x70\xe8\x1c\xe5\xf6\xb4\xcc\x7f\x2b\xdd\x76\xab\x83\xc1\x58\xb7\xce\x9f\x25\x14\x8e\xf7\xec\x80\x11\x8c\xf6\x34\xd9\x3f\xb5\xb3\xe8\x16\xda\x7c\xcb\xac\xce\xc7\xb3\xab\x6b\x68\x3e\x1a\x37\x63\x73\xf5\x71\xdd\xbb\x3f\x54\xdd\x16\x98\x05\x63\x7c\x4e\xa5\xdd\xc4\xb9\x14\x25\xf2\xa4\x3c\xaf\x04\xe3\x1a\xbf\xc8\x0a\x46\xf9\xe6\xf2\xab\x7a\x56\x32\xad\xf0\x5c\x52\xa5\xcd\x5e\x4d\xe1\x0d\x2a\x32\x98\x51\xa8\xab\x9c\x68\x9a\x4f\xe1\x9c\xc3\x1b\x52\xd2\xe2\x0d\x51\xf4\xd1\x37\xc0\xac\xb4\x9a\x98\x85\xdd\x6f\x0b\xfa\x3a\x78\xf3\x97\x37\xee\x1f\x40\xa3\x17\xef\xd8\xaf\x3b\x6f\x36\xe4\x34\x2b\x88\xb4\xea\x1d\x34\x2d\x0a\xf8\xf0\xee\x3d\x2c\xc5\xad\x39\xdf\x8c\x2b\x4d\x50\x53\xf7\xc9\xdc\x16\xa7\x77\xad\x48\xcd\x08\x87\x92\x70\xb2\xa0\x40\xaa\x4a\xc1\x5c\x48\x20\xb0\x60\x2b\xca\x9b\x3b\x39\xdd\x67\x12\xbb\x04\x09\x58\xc1\xbe\xa5\x80\x9a\x9f\xec\x1a\xe2\x6e\xd1\x62\x87\xbe\x61\xcb\xdc\xb9\x62\xa7\xdd\x6f\xe2\x39\xe7\x50\x73\xa5\x65\x8d\xdb\x9b\xc3\x0d\x5d\xbb\x23\x5f\x92\x0a\x94\x16\xe6\x9b\xb7\x4c\x2f\xb7\xb8\x02\x90\xfe\x05\x20\x1a\xcf\xf5\x8c\x82\xa2\x1a\x66\x6b\x30\xe6\x19\x8a\x0a\x2d\x44\x81\x52\x05\xb9\xa1\xc8\x90\x54\x4b\x46\x57\x74\x17\x53\x39\x63\x5a\x12\xb9\x6e\xcf\xc9\x74\xeb\xb7\xee\x5c\x66\x64\xd0\x33\x15\xee\x5a\x2e\xb8\xfb\x74\x82\x15\xd6\xce\x46\xc9\x5b\xd3\xf1\xc1\x75\xbd\x3c\x77\xa7\xb0\x33\x37\x95\x3b\x85\x54\x01\x29\x8a\xc6\x36\x68\xed\x56\xfc\x9c\x1d\x23\xb3\x47\x2e\x07\x21\xdb\x73\x63\x16\xb4\x7f\x3c\x67\xd4\x08\x22\x49\xb8\xf9\xc1\xce\x4b\x30\x72\xd5\xee\x3e\x5a\x86\xc4\x2d\xdf\x3c\xbb\x43\xae\x44\xca\xd6\x5c\x1a\x12\xd3\xb4\xdc\xc9\xf3\xde\x15\x6c\xbf\x6d\x06\xb6\x62\x39\x35\x4b\xa9\x09\xb3\x07\xc9\xdc\x64\x32\x13\xf5\xf6\x34\x1a\x32\x2b\xdb\xfc\x69\x0e\x2b\x46\x80\x2c\x16\x92\x2e\x76\xe9\xc9\xbd\xd6\xc7\xd2\xee\x6b\xdc\xd1\xc4\xda\xef\x77\xfe\xd4\x08\xc9\x3b\x7f\xc8\x37\x85\x40\xff\x87\x43\xb3\x71\x93\xee\xdf\x3d\x4b\x24\x33\x73\x6f\x96\x56\xc8\x7b\x7e\xf5\xe1\x5d\xb5\x74\xef\xde\x5a\x1a\xee\xf0\xc6\x10\xdc\x4f\x67\xe6\x7e\x74\x02\x7b\xa7\x58\xd8\x9e\x49\x27\xa2\x67\x14\x2a\x2a\xe7\x42\x96\xe6\xd2\x70\x20\x90\x59\x4b\xb0\x15\x4f\x28\x4c\x79\x76\x3f\xe3\x3d\xf6\xdf\xd2\x43\xa7\xc0\xd2\x04\x2a\xb2\x53\x6c\x76\xb4\xcf\xb6\x59\xea\x2f\xe3\x03\xbf\x7a\xaf\x64\xdb\xe2\xdb\xe9\x9f\xa8\x7c\xcd\xd4\xa3\x32\x44\x9d\xf4\x30\xc7\xc1\x71\xfb\x48\x6e\xdf\x53\xa5\x8c\xfa\x46\x8b\x4e\x92\x5b\xa0\x3c\x13\x46\x24\xfc\x7f\x57\x1f\x2e\x2c\xd3\x6d\x41\xb9\x4d\xe7\x1a\x58\x59\x15\xb4\x34\x86\x1c\xbc\x27\x52\x2d\x49\x41\x25\xea\xb2\xef\x78\x39\xf8\x3a\x23\x77\xdd\xd2\x3e\x19\x6b\x4d\xd1\xdc\x48\xb3\x9c\x16\x64\x6d\x07\x94\xd3\x4c\xe4\x46\xb2\x0b\x09\x95\x31\xa5\xcb\xaa\xd6\x14\x08\xfe\x74\x0f\xae\x38\x3b\xc6\x17\x0f\xcf\x69\xc4\xd2\x83\xb1\x7b\x4a\xa2\x5f\xc3\x6c\xad\x1f\xba\x9b\x9f\x26\xf9\x7e\x12\xa6\x3f\x8c\x87\xe4\x8c\xa5\x3d\xa4\x4d\x9f\xe9\x03\x73\x33\xc6\x2e\x61\x9c\xca\x4b\x21\xf5\xc3\xa2\xd0\x3c\x7c\x16\x54\xde\xf3\x7b\xcd\x22\x31\xae\x7f\xff\xbb\x3b\x7f\x2f\xa7\x55\x21\xd6\xe6\x1c\x3d\x74\xe7\xf6\x9a\xc5\x9e\x72\x61\x3f\x5e\xfb\xc9\x82\xbd\x78\x59\x37\x56\x28\x97\xed\xc7\x9a\x07\x13\x1e\x63\x3e\xed\x23\xf3\x09\x94\xe6\xe5\x79\xe3\xd1\xf8\x48\xe7\x54\x52\x9e\x39\x79\xf6\x6d\x3d\xa3\x92\x53\x4d\x55\x3b\xbe\x07\x6e\x07\xba\x43\x50\xee\x18\x7b\x72\x53\x4d\xfe\x7d\xb5\xe3\x3d\xb6\x50\xf3\x2b\xf7\x58\x44\xcd\xaf\xdc\x6f\x17\x59\xda\x5f\xcd\x3e\x74\xe0\x2c\x8d\x90\x9d\x0f\x1d\xbe\xd1\x0c\x57\xbb\x9c\x48\xde\x3c\xcd\xeb\xfa\x49\x2d\xc2\xab\xc1\x00\x06\xf6\xe0\x9c\xd1\x22\x07\x66\xcc\xb9\x81\x7f\x6d\x37\xcd\x0a\x91\xdd\x38\x8f\xe8\xc7\xb7\xa0\x84\x35\x0f\xcd\x4b\xc1\x98\x88\x99\xe0\xaa\x2e\x29\xb0\xfb\xcf\x6e\x32\x01\xe3\xf1\x4d\x26\xe0\x03\x94\x4c\xc0\xde\x30\x9e\xc2\x04\xb4\x71\x8c\xa7\x95\x7f\x1b\x43\xb8\x53\x02\xe2\xef\x25\x19\x98\x64\x60\x92\x81\x0f\x73\x4d\x32\x10\xf6\x9d\xdb\x1e\xf6\xe4\x03\x7c\xee\x17\x03\xc9\x3d\xdc\xa3\xe4\x1e\xde\xa4\xe4\x1e\xbe\x87\x92\x5e\x4c\x7a\x31\xe9\xc5\xe4\x1e\xf6\x9f\x45\x72\x0f\x27\xf7\x70\x72\x0f\x27\xf7\xb0\x27\xcf\xe4\x1e\xde\x35\xc9\x64\x02\xc6\xe0\x9b\x4c\xc0\x07\x28\x99\x80\xbd\x61\x24\xf7\x70\x72\x0f\x27\x19\x98\x64\x60\x92\x81\x0f\xfd\xee\x73\x72\x0f\xdb\x07\x44\xf3\x7e\xd8\x1f\x4b\xfd\xe2\xae\xfc\xbd\xdd\x80\xea\x37\x1f\xdf\xaa\x06\x34\xbd\x63\xa0\x61\x30\x6a\xf8\xeb\xae\x83\x7a\xde\x7e\x32\xa0\x27\x19\x53\x3c\x8c\x2c\x36\xdf\xfd\x70\xcb\x69\x8e\x69\x76\xc7\xc0\xb4\xf9\x05\x73\x2d\x58\xc6\x74\xb1\x6e\x87\x32\x7d\xb1\xc5\xf6\xb9\x03\xb4\xdf\x7c\x7c\xbb\xb7\xeb\xdd\x2c\xc4\x9d\x87\xc6\x6c\xd8\x1d\x3f\x8c\xe2\x65\x4f\x7e\xf4\xe4\x47\xef\x51\x32\x20\x92\x01\x91\x0c\x88\xa7\x31\x20\x9e\xab\x07\x3a\xf9\x8e\x93\xef\x38\xf9\x8e\x07\x94\x7c\xc7\xbb\x29\xf9\x4d\x06\x94\xcc\x9e\x64\xf6\x3c\xf4\x9b\xff\xf0\x66\x4f\xf2\x1d\xdf\x3d\xd1\x24\x03\x63\xf0\x4d\x32\xf0\x01\x4a\x32\xb0\x37\x8c\xcf\xcf\x77\x0c\x7f\x47\x68\x71\x72\x6c\x26\xc7\x66\x72\x6c\xb6\x94\xb4\x5b\xd2\x6e\x0f\xfd\xe6\x3f\xbc\x76\x4b\x8e\xcd\xe4\xd8\x4c\x8e\xcd\xe4\xd8\x4c\x8e\xcd\x64\xf6\x44\xe3\x9b\xcc\x9e\x07\x28\x99\x3d\xbd\x61\x24\xc7\x66\x72\x6c\x26\x19\x98\x64\x60\x92\x81\x0f\xfd\xee\x73\x72\x6c\xde\x7b\x1f\xef\xfb\xbb\xfb\xee\xdb\x3d\x7f\xc7\xb2\xbb\x3f\x68\xf7\xea\xdd\xb9\x5a\x0f\x88\xb9\xfb\x84\xdb\x04\x66\x44\xd1\x3f\xfe\xcb\xa0\x72\x7e\xff\xc7\x25\xcd\x19\x31\x1f\xb0\xe3\xa7\x0f\x09\xbb\x8e\xf5\x5d\x7b\xf2\xe0\xbe\xb6\x1f\xef\xc1\xc1\x95\xea\x7e\x00\xd4\x6c\x36\x2e\x3f\xb7\xbf\x7a\xa5\x25\xd1\x74\xb1\xee\x95\x87\x47\xe4\x70\xa7\x8d\xf8\x3d\x0d\x3c\x86\xd4\x3a\x29\x6f\x97\x54\x52\x64\xe3\x06\x64\x46\x6b\x3f\x86\x29\x7c\x0f\xb0\x39\xa3\xf9\xc8\xc2\xd0\x77\x6f\xea\xa4\xe5\xbf\xf5\xa3\xfb\x37\x6c\xbb\xa6\xfb\xce\x05\x6b\x16\xe9\xad\xf5\xc2\xbf\x6d\x53\xa3\x37\x57\xad\x22\xd2\xc8\x43\xe7\xad\xbf\x63\xff\x50\xc5\xf7\x78\x6c\xec\xc4\x6e\xb1\xf7\xa0\x5e\xbf\x5f\x9f\x4f\x7a\xf9\xdc\xbb\xc7\xf5\xb0\x1a\x77\x3d\x53\x2e\xa9\x2c\x99\x52\xbb\xc1\xf3\xc3\xe1\xde\x2f\x12\x1f\x14\x85\x77\xec\x41\x33\x8f\xde\x40\x5a\xc3\xeb\xde\x98\x88\x21\x39\x23\x19\xc8\xba\x30\x26\x1a\xcf\xc1\x15\x57\x07\x92\x65\xa2\xe6\x1a\x38\xa5\xb9\xf5\xaf\xec\x3a\xbd\x0f\x8a\xd9\x07\xed\xae\x7d\xac\xae\x89\x1d\xdf\xbd\xbf\xe1\xc6\x7d\x6a\x87\xbd\x55\xb4\x7f\x48\xfb\x5a\x68\xf8\xb1\x0f\xe9\xa6\xfd\x95\xdd\x9e\xaa\x6e\xb0\xcb\x97\xa2\x60\xd9\xfa\x63\x5d\x50\x58\x8a\x22\x57\xd8\x2c\xc2\xe8\xed\x36\x4c\xd2\x9a\xd8\x7b\xe8\x50\x02\x15\xf2\xc3\x99\x1d\xc3\xac\xd6\x90\x0b\xaa\x80\x0b\xdd\x94\x55\xe8\x7f\xc0\x3e\x1c\x31\xf0\x76\xbb\xb4\x8d\x49\x0c\x5b\x20\x55\x55\x30\x8a\xa1\x39\x21\xe1\x76\xc9\xb2\xa5\xed\x8e\x54\x91\x07\x3d\x7a\x86\x76\x30\xda\xd7\xf2\xd9\xc3\xcc\x87\xbd\x4d\x7d\x68\x3c\x72\xb3\x87\x97\x76\x7f\x9b\x1f\x6c\x8d\xa3\x6f\xa4\xa8\xab\xbd\x7e\x79\xdb\x7f\x6a\xff\xd6\x68\x0e\xbd\xd1\x4e\xa9\xf9\xe1\x5e\x6c\xc1\x85\xd9\xec\xbe\x5b\x66\xad\x63\x78\x8a\x89\x34\x65\x5d\x68\x56\x15\xc8\x78\x4f\x9e\x0b\x3b\x38\x22\x69\xa7\xd7\x8e\x81\xf0\x75\x13\xdb\x73\x0d\x52\x68\x0e\x64\x61\x3e\xf7\xe1\xed\xb2\x24\x78\x3b\x4d\xca\xeb\x92\x1a\x09\x94\x77\x03\xc6\x87\x25\x5f\x9b\x91\xde\x5b\xca\x69\x93\x6e\x59\x51\x18\xbb\x9d\x14\x85\xb8\xdd\xa5\x82\x77\xd1\x18\x03\x17\xc6\x18\xb9\x30\xd6\x88\x07\xe0\x82\x37\x0e\xf5\xef\x3e\xbe\xf3\x39\x52\x17\x43\x0e\xae\xc7\x0e\xd5\x66\xb9\x2b\x22\x35\x23\x9b\xed\x58\xee\xa2\x5a\x16\xca\x9e\x2a\x62\x1e\x42\xb2\x69\x69\xb4\x24\x2b\x54\x29\x54\xd9\xbe\x38\xf0\xcf\xfb\x48\x2b\xc0\x9e\x23\xed\xd6\x58\x79\x25\x78\xb1\x06\x62\x4f\xeb\xbc\x2e\x8a\x63\x98\x33\x4e\x8c\x4a\xa2\xfb\x6e\xb9\xcb\x05\x33\xaf\x59\xb8\x62\x3c\xa3\x66\x0d\x27\xad\xb1\x86\x6b\x60\x3e\x97\x8b\x7d\xcf\x66\x2b\xde\xf2\x63\xd7\x38\xc8\xfa\x3a\x94\x1b\xae\x11\x64\x19\x99\x15\xd4\x3c\xba\xf6\xe4\xe9\x8c\xcc\x8f\xa2\xc0\x80\x88\x0b\x95\xe4\xb6\x27\x11\xe9\xff\xf8\xdf\x19\xdf\xef\x79\x68\xe9\x23\x2a\xfb\x8c\x70\xa0\x4c\x2f\xcd\xfb\xb6\xaa\x8a\xb5\x11\xd7\xe6\xee\x74\x17\xea\x50\xd5\xd9\xfd\x9e\x8e\x8e\x88\x82\x17\x95\xc8\xd5\x0b\x23\xf2\x5f\x28\x9a\x49\xaa\xd5\x8b\x23\xf3\xd5\xe6\xda\xee\xc9\xd1\xec\x8e\x1b\x03\x72\x3f\x21\x15\x7b\x71\x74\x0c\x78\x08\xb0\xa9\x92\xd0\xcb\xcf\xef\xb6\x36\x2b\xd1\xeb\xcc\xf7\x10\x0d\xbd\x1f\xfd\xbf\x77\x5d\x82\x44\x65\x9b\xea\x18\x5d\xfb\xe0\x53\xbe\xa1\x82\x29\xbc\xe0\x78\x74\x9b\x36\x75\xdb\x8a\x17\xe0\x74\x1f\x33\xc0\x10\x2d\x2b\xbd\x46\xb9\x51\x52\xc2\x1d\x4f\xba\xa2\x72\xad\x97\x8c\x2f\x70\xb0\x9f\xab\x90\xdd\x2b\x60\xda\xd1\xce\x2d\x73\x82\xb5\x59\xf8\x96\xe5\xde\xca\x9a\xa9\x1d\xdb\xd3\x70\x3f\x2d\x8a\xde\xe3\x6b\xdf\x6b\x8b\x7f\xd4\xa8\xfc\xcf\x6e\x57\xd0\x36\xf3\xd8\x91\xef\xcd\xdf\x0d\x77\xc3\x7e\xcb\xaa\x2e\x23\x0e\xf7\x1d\xb0\x80\xd3\x77\xef\x6c\xdb\x39\xb7\x8e\xdf\x32\x9e\xdb\xb7\xd4\xa9\xb6\x3d\xdb\xe8\x47\x6a\xa6\x84\xe6\xcf\xbe\x3b\xd3\x14\x39\xcb\xad\xb6\x72\x5b\x3f\x05\x1c\xa8\xf7\x5e\x63\x27\xb8\xcf\x69\x9f\xb7\x9f\x75\xfb\x3d\xc7\xee\x65\xdd\x7b\xf9\x3f\xed\x83\x1d\xbb\xe1\x0d\xec\x6f\x23\x8d\x8f\x1f\x0e\x10\x9b\xd3\x55\x90\x19\x2d\x6c\xe3\x3b\xf3\x97\xdd\xa4\xe0\xf4\xdd\xfb\xb6\x97\xa4\xa4\xe4\x5e\x95\x10\xf5\x99\xfe\x00\xc0\x61\xf2\xd0\xc4\xf6\x7d\x45\xe1\xd4\xc7\x04\x57\xe0\x8a\x6a\x7b\xdf\x4b\x52\x99\xeb\x6e\x39\xd8\x48\xc1\x30\x0e\xf0\xe0\x09\x7e\x87\xeb\xfe\xd0\x25\x1a\xf1\x1e\xdd\xb7\x2b\xde\xae\x0f\xd8\xe3\x0a\xed\x83\xd9\xd8\xff\x3e\xde\xe9\x1f\xec\x68\xb0\xf0\x1b\x87\xdd\xbd\x59\xdd\xcb\x30\xb3\x6e\x0c\x31\x7f\x78\xb6\x78\xc2\x95\x2d\x14\x41\x97\x64\xc5\x84\x6c\x5e\x83\xdd\x47\x44\xdc\x94\x7d\x5d\x04\x13\x50\xb4\xa0\x99\x7e\xd0\xac\x9f\x80\xa6\x65\x55\xdc\x7f\x1b\x61\xa4\x2b\xa1\x64\xfc\x23\x25\xf9\xfa\x8a\x66\x82\xe7\x7b\x89\xdf\xc1\xee\xbc\x67\x9c\x95\x75\x09\xbc\x2e\x67\x14\x17\x54\x59\x4e\x28\x56\xd0\x75\xb3\x97\x44\x27\xc0\xe9\x6d\xb1\x76\xe2\x26\x87\x4a\xe4\x8d\x04\x9a\x51\x90\x66\x88\xd8\xa9\x52\xd4\xda\x3c\xd2\xf7\xe2\x29\xe6\xc0\xb4\xea\xaa\x7d\x42\x26\x89\x32\x86\xe4\x31\x0e\x8e\x69\xa3\x7c\x67\x14\xe3\xc0\x2c\xa7\x72\x67\x81\x91\x1d\x43\x5d\x11\x56\x98\xa7\xd8\x14\xde\xd2\x39\xa9\x0b\x6c\xd5\x0a\x2f\xe1\xd0\x0c\xba\xf1\x06\xf8\x32\x35\x4f\x15\x25\x04\x37\xff\xb5\xf5\x45\x70\xf2\x47\xfb\xb8\xbd\xf0\x70\x3e\x5c\xad\xb4\xa1\xfd\xaa\x96\x36\x54\x91\x5a\xed\xe3\xf0\xda\x38\x20\xe7\x3c\x37\xb7\xb4\xff\x42\xe8\x29\x1a\xa6\x1c\xdf\x7d\x4c\x0a\x3b\xbf\x99\x10\x05\xdd\x23\x96\x5a\x49\xb1\x90\x54\xa9\xb7\x94\xe4\x05\xe3\xd4\xf7\x84\x5f\x2f\x29\x94\xe4\x13\x9e\x72\xcd\x4a\x6a\xcc\xa9\xfe\x19\x27\xbd\xf9\xec\x67\x17\x09\x28\xc9\x0d\x6d\x07\x08\x33\x3a\xc7\x26\xbe\xb8\x1c\xdd\xb9\xb1\xa7\x73\x2f\x96\x73\xc2\x0a\x9a\x4f\x71\xac\xbd\xd5\xed\x7a\xde\xdb\x63\x69\xbe\x66\xbc\xde\x8f\xa7\x16\x66\x84\xe8\x70\xb1\xec\xfb\x56\x0f\xda\x0f\xc4\x30\xb4\x9a\x67\x2f\x8e\xe6\xfe\x02\x81\xcb\x8d\x8d\x39\xfb\x94\xd9\x10\x81\xa4\x44\x09\xde\xdc\xa0\xbd\x58\xaa\x5a\xce\x49\xd6\xd8\xb8\x83\xc9\xbb\x46\xe6\x70\x21\xb4\x6b\x61\xdb\x2c\xf8\x9e\x83\x2d\x0a\x70\xad\x97\xa9\xd2\xac\x44\xb1\x94\xd7\xb2\x69\x12\x8d\x67\x61\xf4\xe6\x77\x07\x7e\x20\x3c\xfe\xf8\xf2\xe5\x5e\x56\xf5\xe3\x5e\x71\x49\xd1\xcb\x34\xfe\x8e\x5c\xb4\xd2\xbf\x51\xb1\x95\xc8\x95\x39\x8f\xcc\xbd\x92\xb0\xf7\xf5\x5e\x43\xc6\x93\x97\x33\xa5\x19\x5f\xd4\x4c\x2d\x61\x46\xf5\x2d\xa5\x1c\xe8\x27\x5b\x67\x09\xfe\x9b\x4a\x81\x07\xd0\x6c\xcf\x3d\xa1\xcf\x5d\xd4\x5f\xf4\x57\xcf\x61\xc5\x57\x4c\x31\xc1\xff\xcc\x94\x16\x72\xfd\x8e\x95\xec\xde\x82\xd4\x0d\x6d\x49\xa8\x4e\xff\x8a\x22\xc7\x8e\xff\x2c\x23\x57\xd4\x4e\x54\x52\xa3\x00\xf7\x5d\x7b\x74\xb1\x80\x91\x1b\x33\x92\xdd\xec\xd8\xc4\x8d\x0d\xda\x8b\xef\xbe\x9b\xd8\x6e\xd0\xbe\xa3\x7d\xf5\xf2\xe9\x77\xb1\x31\xe0\x46\xef\x1c\xbe\x04\xda\x3f\x47\x75\x62\x2f\xce\xd9\x27\xbb\xbe\xfd\x9d\xdc\x4f\x6c\x2d\x85\xa2\xc8\xc4\x06\x50\x90\x75\x13\x7e\x65\xaa\x35\x4f\x8c\x04\x13\x7c\x4f\xd7\x11\x99\xcf\x87\x5c\x3a\xa1\x87\x6f\x9f\xb2\x56\x1a\x4a\xa2\xb3\xe5\x83\xc1\xe2\x86\x8c\xa9\xd4\x98\xb3\x07\xca\x3d\x45\xf7\xdf\xc9\x3d\xc3\x74\x63\xc3\x6a\x60\x67\x71\xf6\xa9\x32\x7a\xe2\xfe\x78\xfc\x90\x06\xdb\xba\xc9\x64\xe8\x28\xc2\xb9\xee\xc9\xb6\x3b\x5b\xcd\x7b\x02\xd5\xaf\xd5\xf4\xfd\xef\x98\xdd\xde\x9b\xe7\xe9\xc5\xdb\x7d\xe5\xe5\x78\x37\xce\x48\x47\xce\x66\x70\xd2\x2e\xcf\xce\x69\xef\xcd\x11\x9a\x00\x94\xe3\x31\x8c\x52\xe2\x9b\x5d\x1d\x03\x81\x1b\xba\x3e\x1e\xc1\x14\x6d\x9e\x5e\x81\x41\x64\x2b\x69\xe1\xac\x5b\x8a\xfd\xf5\xc9\x03\x49\x1c\x43\xb2\x63\xd9\x77\x2b\x46\x9f\x7e\x4b\xfb\x07\xab\x1b\x9a\x98\xa9\x8c\xf8\xed\x66\x49\xf6\xfe\x93\xb1\xd7\xd2\xd2\x0d\x5d\x8f\xf9\xf5\x8d\xa3\x65\x76\xc7\x79\x0f\xec\x19\x33\xdf\x30\x7b\x38\x8a\xa5\xf5\x24\xb4\x47\x6b\x0c\xc2\x60\xc0\x64\x9c\x9f\xba\xa1\x66\xa1\x03\x96\xa1\x3d\xbe\x3d\xa0\x15\x5e\x85\x83\x7d\xfd\xc0\x0d\xe1\xd1\x37\xf2\x6d\xc9\x2a\x34\x1c\x9a\x90\xaf\x3b\xd5\xf0\x3d\x29\xd8\x98\xdb\xd0\x9f\xa1\xd5\x5f\xe7\xfc\xd8\x18\xf0\xe6\x3f\xa8\x12\xd5\xc8\xfb\x65\xe8\xad\xa0\xea\x42\x68\xfc\xfb\xbf\xcb\x26\xd9\xe9\x07\x6c\x91\x65\xe0\x62\x73\x28\x79\xd1\xb1\x32\x76\x1c\xdd\x58\xa6\x4d\x4d\xd3\x76\xf3\x99\x82\x73\x0e\x42\xba\xd5\xf5\xb8\x02\x6e\x90\x76\x78\x68\x01\xcc\x6c\x18\x1c\xa3\x78\xe3\x16\x1a\x76\x8d\xcf\x6d\xb8\x90\x83\x1d\x8c\x36\x54\x3b\x4c\xb4\x6e\x47\xb2\xb4\x7c\xd0\x33\x53\x15\xf8\xfa\x74\xcf\x42\xd2\xc0\xda\xd8\x43\xd9\x59\x9b\x54\x52\xb9\x40\x3c\x41\xb6\x67\x44\xba\x9d\xde\x68\xed\x6c\x69\xa4\x8e\xee\x7f\xd8\x88\x73\x88\x86\x90\x75\x77\xfb\x1b\x52\xf6\xef\x07\xce\xf7\xff\x63\x34\x37\xee\xea\xff\xdd\x5f\xe5\x10\x26\xd5\x14\x4e\x41\x31\xbe\x28\x68\x9f\x47\xe3\x3d\xe8\x7d\xdc\xde\x6c\xcd\x88\x98\x02\xa3\x62\x57\xa4\xa0\x1c\x9d\x8a\x84\x03\xb5\xd1\x00\x33\xda\x4d\x73\x70\xff\x23\x6c\xad\x79\xa3\xa7\x5a\x38\xc8\x8b\x1b\xba\x7e\x71\xbc\x79\x59\xf6\xe6\xf8\xe2\x9c\xbf\x38\x46\x4b\x66\xeb\x62\xb4\x06\x12\x22\x4e\x5e\xe0\xcf\x5e\xec\x7f\x1a\x77\x59\xa4\x3e\x96\xe6\x28\xe3\xc6\x2f\xf2\x31\xfc\xc0\x3d\xcf\x73\x83\x58\xf5\x7a\x9e\x0f\xfc\x52\x0e\xb7\xad\x05\xd4\x8a\xda\xf7\x39\xca\x91\xbd\xc6\x4d\x9b\x97\x21\xbe\xf1\xd0\xa5\xc6\xe9\x2d\xbe\xe5\x9e\xc1\xf3\x49\x8a\xa2\x60\x7c\xf1\x5d\x95\x13\xbd\x47\x5a\x8e\xa5\xc1\x6a\x1d\x7c\xb4\x2c\xa0\x46\x1e\xe6\x54\xce\xd9\x02\x2a\x22\x49\x39\xc2\x50\xbe\x74\x55\xbb\xf1\x2c\xb3\x79\x3f\x8a\xe4\xd6\xff\x7a\x5d\x51\xf8\x7f\xe1\x63\x7f\xc4\xfb\xf3\x9f\x4c\x26\x70\xfd\xe1\xed\x87\xd7\x60\xff\xd2\xbe\x8b\xb5\x80\xb9\x40\xf7\x89\xa8\xa5\x19\xfa\x8a\xf2\xbd\xdd\xa3\x60\xfd\x0e\x66\x2b\x3f\xcc\x8f\xe1\x76\x49\x34\x5d\x51\x09\xb7\xe6\xf8\x64\x2c\xa7\x6d\xc4\x62\x7a\xf0\x78\x37\xca\xc7\x32\x2f\xc9\xa7\xab\x5a\x2e\xf6\xde\x70\xd8\xda\xf4\xbe\x93\xbd\x73\x65\x99\x23\x3e\x4e\x1b\xf6\xaa\xbe\xa8\x6c\x49\xf3\xba\xa0\x39\x90\x99\x58\xd1\x7e\x00\x70\x14\xcf\xe1\x70\xd0\xa8\xad\x69\xf3\x21\xc6\x3e\x9b\x29\x51\xd4\x7b\xa3\xa6\x06\x4c\x0f\xe9\xa7\xd7\xf0\x07\x04\xb9\x11\xa8\xa8\xcc\x28\xd7\x64\x41\x7b\x8e\xd4\x51\x5c\x51\x24\x20\xcf\x57\x2f\xff\xe9\xc8\x79\xee\xcc\x48\x9d\x1f\xfb\xa5\xb9\x09\xef\xc9\xa7\xef\x78\x1b\x6e\x1a\x67\x34\x28\x78\x39\x85\x53\x37\xe1\x66\x12\xf8\x19\x45\x56\x17\xe8\x21\x9f\x4b\x51\x8e\x1b\x74\x37\xed\xd9\x1a\xa4\xa8\x11\x8a\x08\x75\x35\xf0\x90\x8f\x62\xf9\xbb\x3f\xfc\xd3\x14\xce\x3e\x91\xb2\x2a\xe8\x6b\xb8\x5d\x52\x07\x80\x61\x0a\x5f\x28\x5a\xc0\xef\x5f\xfe\xd3\x38\x43\x12\xa1\x15\xf4\xb6\xe7\x8f\xeb\xce\x19\x31\x87\xac\xae\x80\x95\x36\xd1\x88\xee\x0d\xfe\xb1\xe4\x06\x48\x1b\xe9\xd9\x88\x3e\xa5\x89\xd4\xea\x18\x10\xc1\x38\xfa\xa1\x8a\x31\x0a\xa1\x49\xb1\xe1\x1b\x46\x9f\x2b\xbd\xb5\x87\x25\x1f\xb7\xb0\xe6\x1c\x51\x0c\xd7\xc0\xab\xdf\xbf\xfc\xa7\x6d\x87\xff\x87\x87\xea\x28\x6d\x92\x19\x11\x8e\x04\x01\xbe\x33\x4a\x39\xdc\xb0\xa2\xa0\xf9\xf1\xc6\x72\x8f\xe2\xba\xb5\x35\xf3\x5a\xea\x25\x95\xc7\x40\xb9\x6a\x42\x38\x63\xd7\x73\x63\x2d\x71\xd4\xb2\xe6\x1c\x2d\x7f\x8c\x4a\x63\x4c\x68\xdc\xb3\xaf\x8b\x27\xb9\x4d\x37\x66\xae\x86\x52\x28\xbd\xb9\xc4\xa3\x45\xc1\xde\x6a\x02\xd0\xb9\xb5\xfe\x30\x1f\x23\xc0\x27\xa3\x9d\xea\x9b\x7f\x39\xfa\x41\xfb\x69\x72\xd3\x56\x78\x99\x30\xae\x27\x42\x4e\x2c\x93\xd7\xa0\xe5\x9e\x71\x4d\xb0\x0a\xab\x27\x03\x9f\x95\xda\xaa\xbb\x71\x6d\x9f\x8e\x71\x6f\xc3\xbb\x34\xd5\x86\xf6\x19\x77\x5f\xef\xd4\x54\x9b\xda\x67\x14\xdb\x87\x75\x4a\xef\x43\x47\x71\xee\xeb\x94\x5c\xdc\xf2\xdd\x5a\x71\x14\xcb\xf7\xce\xdc\x71\xfa\xb0\x1f\x52\x1c\x68\x1e\x1f\x25\xb0\xa5\xa5\xec\x4b\x6f\x10\xd3\x0b\x10\x85\x66\x05\x0c\xe7\xff\x67\x5b\x78\x8f\xb3\x04\x3a\x55\xf7\x80\xfa\x1a\x77\x0e\x3e\x60\x2e\x45\xa3\x9d\xcc\x0b\x12\xd1\x2f\xc7\x91\x57\xa0\x55\x07\xd6\x5a\xc7\xc8\xd6\x28\x9e\x86\x99\x9d\xea\x0e\xcb\xa0\xd3\x32\xe3\xa5\xc0\x2e\xad\x6d\xd7\xc2\xcb\x62\x33\x7a\xa9\x28\x50\x2f\xa9\x3b\x95\x4d\x41\xc9\xde\x39\x54\x96\x76\x1c\x9f\xa4\x6c\x76\xd1\x7d\x49\xe7\x9b\x34\x74\x1a\x98\xd7\x29\x2e\x71\x17\x69\x7d\x63\x0f\xf2\x8b\x8f\xd4\xa2\xe4\xb6\x9b\x4c\xdd\x45\x42\xc2\x8b\xc1\x43\xf7\x45\x2b\xb6\xcc\x19\xf0\x7a\x03\x8f\x5a\xd6\x26\xd4\x3b\xde\x79\xe2\xfe\xb0\x57\x07\x06\x33\xaf\xcc\x95\xc0\x0b\x73\xcb\x8a\xfd\x82\xa9\x33\xda\x80\x0b\x9f\x81\x9f\xa4\xa4\x9a\xdc\x57\xd2\x60\x93\x86\x66\xc7\x95\x26\x3c\x27\x32\x77\xe3\x3b\x38\x50\x2d\xc3\x29\xbc\x17\x23\x22\xc1\x8c\xcf\xc5\x6b\x58\x6a\x5d\xa9\xd7\x27\x27\x0b\xa6\xa7\x37\xff\xaa\xa6\x4c\x9c\x64\xa2\x2c\x6b\xce\xf4\xfa\x04\x41\x64\x6c\x56\x6b\x21\xd5\x49\x4e\x57\xb4\x38\x51\x6c\x31\x21\x32\x5b\x32\x4d\x33\x5d\x4b\x7a\x42\x2a\x36\xe9\xbc\x1d\x6a\x5a\xe6\xbf\x6d\x06\xf4\x88\xae\x8a\xc1\x0d\xc5\x58\x96\x5c\xd1\x49\xcd\x6f\xb8\xb8\xe5\x13\xf4\x98\xaa\x11\x77\x75\x1f\x64\x72\x43\x1b\xfb\xb1\x01\x46\xde\x09\x36\xde\xff\xb2\xce\x9b\x23\x6e\x37\xf3\x11\x37\xc9\x4c\x79\x42\x78\x3e\xb1\x60\xb9\x47\xdc\xab\xb1\x31\xe8\x49\x07\xdb\xdd\xd7\x32\xf1\xf1\x5c\x91\x4c\xb3\x15\xf5\x80\x88\x36\x34\x38\x08\x1f\x9a\x34\xba\xbc\x96\xf6\x2c\x74\x58\xd1\xd1\x6f\xf7\x4a\xe4\x50\x92\x35\xda\xee\x38\x4a\x10\xd6\xcc\xe2\x22\xa7\x2e\xf6\xfa\x60\x35\xe4\x0d\xb6\x02\xae\x8c\x51\x76\xcd\x4a\xda\xa0\x4e\x31\x9a\xbd\x56\x9a\x96\x16\x1b\x64\x3f\x6b\xa4\x07\x43\xcb\xb5\x85\xb5\xca\x1b\x60\xba\xc1\x8b\x12\x9e\xe3\x63\x1e\x88\x52\x22\x33\xd6\xe2\xb8\x37\x6c\x77\x02\x1a\xaf\x5b\x13\xbb\x23\x50\x09\xc5\x70\x51\x9c\x45\x30\xc6\xcc\xf4\x35\x25\x7a\xa0\xb0\x3f\xfe\xcb\xfe\x47\x6c\x8e\x0d\x2e\x47\x21\x17\x86\x08\xea\x79\x3f\x0f\xde\x1d\x8d\x03\xd5\x38\x38\xc7\x9a\x99\x99\xe0\x4a\x4b\xc2\xf6\xcf\xfb\x02\x5f\xe0\x89\x2f\xce\x03\xf0\x8c\x9f\x7a\x2c\x1c\x6c\x67\x8f\x34\x66\x03\x5e\x9b\x66\x33\x46\xb2\x84\xde\x62\xbb\x52\x27\x4d\xd6\x94\x11\xd3\x5e\x61\xd4\xd1\x6b\x09\x01\xeb\x69\xff\x96\xce\xa9\x94\x34\x7f\x8b\xef\x80\xab\x76\x46\xe7\x0b\x2e\xda\x6f\x9f\x7d\xa2\x59\xbd\x5f\x3d\xb9\x6d\xda\x8a\x7b\x35\x4e\x78\xb9\xbf\x9d\xb6\x7b\xd8\x46\xbc\x34\xcc\x9c\xf5\x27\x70\x4b\xc7\x06\xef\x2d\xa1\xe9\xa8\x88\x66\x6a\x6e\xeb\xd2\x34\x07\x03\x68\x17\xa7\xf5\xe2\xdc\x5e\xd5\x16\x2c\x89\x86\x88\x2d\x3d\xf0\x40\xa5\xc1\xbb\xc8\xa8\x81\x6c\x29\x84\x32\x92\x0f\xcf\x31\x8e\x7f\xc5\x04\x62\xcf\xbc\x78\x62\x31\x0c\x09\xa5\xd1\x01\x4d\x51\x8c\x6e\xea\x63\x8f\xb4\xa5\xeb\x46\x3b\xe1\xf0\x98\xb2\x6e\xcc\xf6\xdc\x79\xf1\x74\x88\x2d\x33\x5c\x0c\x76\x9a\x2f\x16\x68\xc7\x2b\x0d\xaa\x1e\x17\x6b\x68\x48\xcc\xe1\x96\xb2\xc5\x52\xab\x63\x60\x53\x3a\xc5\xdb\x4c\x49\xb6\xc4\xe1\xfb\x9f\xa8\x92\x52\x3d\xe8\x5e\xec\x29\xa3\x1b\x1a\xc4\xd3\x0f\xdb\x1a\x08\xae\x00\xca\x58\x28\xcc\x80\xe7\x96\x14\xf0\x97\x8d\x80\x61\xe9\x0e\xde\x00\x54\x67\xd3\xa3\x63\x68\xcb\x14\xfa\x5d\xa4\xba\x34\x57\x88\x69\x6a\x6c\x29\xf4\x5b\x48\x51\x2f\xec\x09\xa0\xfb\xe6\x5a\xee\x22\xdc\x9b\xb6\xc4\x06\xa2\x3a\x73\xf4\x0f\xbe\xb0\x87\x62\xff\x77\x75\x9f\xb4\x2d\x60\x64\x86\xcd\xe6\x9d\xa1\x86\xe0\x0f\x6f\x29\x45\x21\x13\x52\x52\x55\x09\xeb\xc1\xdc\x84\x92\xfc\x4f\x6f\xbe\x66\x70\x87\xea\xa8\xbb\x54\x4b\xb6\x58\x86\xdc\x29\xe2\x8c\xc9\xe1\x9d\xf7\x11\x24\xbe\x98\x26\x4b\x5e\xc8\x26\x4b\x43\x24\x32\x77\xf5\x28\xc2\xe4\xd7\xc0\x74\xd0\x54\x96\xcd\x89\x30\x62\xc2\x93\xa3\x35\x1d\x1c\xfa\xa3\x69\x3f\xee\x24\x9a\x27\xcb\x97\x70\x88\x82\x90\xe9\x03\x85\x4a\x66\x22\xaa\xa3\x29\x9c\x02\xaf\xbd\x87\xd9\x2e\xdc\x5d\x4b\xe0\xc9\x97\x8b\x76\x05\xdc\xa0\xcd\x62\x2a\xd1\x8d\xdb\xef\x56\xf8\x9b\x65\x96\xc6\xe3\xac\xfb\x34\x71\xeb\x45\xc7\x86\x50\x3b\x06\x01\x27\x20\xc4\xb0\x6c\x38\x34\xa3\xf7\xe5\xb0\x95\x0a\x80\x02\x74\xcf\xec\xe8\xfb\xc8\x9c\xb9\xe3\xde\x2b\xb4\x15\x7a\x01\x3c\x87\x72\xd9\xae\xbc\xdf\xb9\x83\x18\x67\x0f\xa2\xec\x21\x04\x64\xc0\xec\xa6\xcd\xe4\x0e\x9b\x03\x13\xc4\x12\x86\xe7\x62\x60\x24\x05\x32\x9e\xad\x91\xf7\xa8\x84\xa4\xbb\x29\x4c\x8f\x75\x14\xa0\xd1\x3a\xda\x71\xb5\x02\x39\xee\xce\x4d\x0a\x66\xba\x9d\xba\x13\xcc\x72\x3b\xf5\x27\x98\xe5\x0d\x5d\x1f\x6f\x26\x04\x05\x33\xdd\x95\x50\x14\xcc\xd4\x0c\x72\x6c\x9a\xd1\x1d\xc3\x8b\x21\xa4\x2c\x85\xa9\xca\x8e\xc6\x25\x2a\xdd\xc5\x23\xd2\x06\xc6\x91\xbf\x96\x46\xa7\x3a\xed\xa6\x4d\x87\x4c\x04\x96\x10\x96\x3d\xb5\x9b\x76\xe5\x54\xc5\x61\x3c\x32\x2f\xeb\x0e\x2e\x7e\x21\xe4\xdd\xe4\x97\xc3\xb5\x9b\x36\xca\xc4\x8d\x2c\xe8\x75\x3f\xb9\xa4\xb0\x41\x9a\x57\xa4\x3d\xd9\x4a\x15\x8b\xc2\x17\xd3\xcd\xba\x04\xb2\x38\x8b\x30\x48\x42\x8b\xc2\xd2\xe6\x35\x1d\x07\xe4\xa5\xdd\x45\xdf\x68\xab\x93\xde\x45\xe1\x17\xf5\xd0\xfb\xe4\xc4\xed\xa6\x8d\x47\x7a\xa4\x5d\x0e\xc9\xb1\xdb\x4d\xc3\xcc\xbb\x28\x2c\x87\xd9\x7b\x71\x58\x36\x19\x80\xd1\x06\xb9\x95\x6c\x17\x85\x6b\x48\x6e\xe1\x6e\xda\xc8\x38\x8c\xc2\x33\x5a\xd6\xe2\x6e\xda\x4c\xd9\x8a\xc2\x74\x98\x0f\xf9\x9c\x97\xf6\x1b\x6d\x96\xf5\x9d\x7e\xee\x67\xd5\xd6\xaa\x76\x79\x86\x51\x38\x3a\x77\xf7\xf1\x88\x82\x6a\x0f\x51\x53\x08\x04\x2b\xba\x54\x92\x8e\x0d\xce\xdf\x45\x04\x93\x96\x3d\xa2\xf2\x77\x13\x02\x76\x9b\xa4\xdb\x28\x1c\x37\x12\x77\x23\x99\x4b\x6d\xf2\xaf\x4d\xe7\x8d\xc2\xd5\x23\x25\x78\x37\xc5\x72\x46\x58\x8a\xe2\x92\xe8\x0f\x2c\x58\xf1\xa2\xdb\xea\x6b\x8b\xf9\xfa\x87\xf4\x58\x59\xbc\x5b\xf2\x58\xdd\x4b\xc9\x63\x95\x3c\x56\x7e\x94\x3c\x56\x0f\x50\xf2\x58\x25\x8f\xd5\x1e\x94\x3c\x56\x3d\x4a\x1e\xab\xe4\xb1\xf2\xa3\xe4\xb1\x7a\xee\x5e\x80\xe4\xb1\x4a\x1e\xab\xe4\xb1\x4a\x1e\xab\xe4\xb1\xf2\xa4\x5f\xb3\xc7\xca\xe2\xc5\x22\x01\xe5\x7e\x40\x66\xbe\x59\x56\x1b\x03\x63\x7a\x69\x7d\x69\x4d\xaa\xf8\x00\xe8\x16\xc0\x99\x8b\x9c\x5e\xb9\x07\xd3\x35\x02\xf2\x6c\xd5\xbd\x00\x96\x92\xf0\x05\x85\x57\x93\x57\x2f\xf7\x2a\x02\xbe\x9b\x7c\xb3\xc1\x86\x34\xae\x60\xf8\x26\xdd\x85\xc9\x7f\xa4\xcc\x1c\xa7\xed\xda\x9c\x97\x60\x7f\xe4\x1d\x49\x2f\x23\x7b\x60\x0e\xa9\xa4\x1a\x88\x1e\x40\x87\x59\x49\xdb\x04\x38\x2f\x9e\xfd\xa6\x0e\x5d\x7d\x30\xc1\x2d\x76\xdf\x8b\xa5\x39\xd6\xd3\xbf\xdf\x8a\x66\x94\x28\xcf\x04\x15\xec\x75\xd3\xac\xaa\x28\xa9\x2d\xe7\x1f\xa2\x50\x2a\x91\x03\x6d\x4e\x25\x1c\xd2\xe9\x62\x0a\x79\x4d\x6d\x05\x4c\x2f\x8e\xb6\x2e\xc5\xd1\x71\x3f\x2d\xb5\x34\x0f\x1d\x69\xfe\xe3\xb9\x41\xba\xc9\x4f\xa5\x2b\xca\x75\x4d\x8a\x62\x0d\x74\xc5\x32\xed\xbd\xe9\x66\xe2\x58\x94\x86\x69\x9b\x58\xe8\x9f\xe6\xe0\xed\x9c\x0c\x71\x48\x4e\xb6\xa4\xb1\xcf\x29\x0d\xf5\x1e\x6e\x8d\xc1\x57\x1f\x6e\xf8\x94\xec\xba\x4c\x5d\xf0\xc6\x5b\xa4\x8b\xf9\x46\xd8\x46\x9b\x31\x4e\x83\x9c\x92\xc8\x02\xc5\xe2\x87\x8f\x7e\xc9\x31\x10\xc5\x32\x0a\xb4\x86\x36\x43\x33\x75\x51\x98\x2b\x8a\x0f\xb2\x40\x13\x61\xb8\xdc\x81\x99\x22\x30\xc8\x16\xd9\xee\x9a\x10\xc0\xd6\x26\xf8\x95\xbd\x2a\xb7\xc8\xfd\x5a\x54\xa2\x10\x8b\x75\xff\x5c\x07\x7c\x8a\xd9\xe9\x5e\x6b\x41\x63\xb2\xd7\x33\x35\xb2\x00\xd2\xae\x81\xc3\xc5\xc6\xe5\x4b\xb9\x0b\x5b\xf4\xb9\x46\x82\x53\xee\xc2\x1e\x94\x22\xc1\x29\x12\xec\x47\x29\x12\xfc\x00\xa5\x48\x70\x8a\x04\xef\x41\x29\x12\xdc\xa3\x14\x09\x4e\x91\x60\x3f\x4a\x91\xe0\xe7\x1e\x5d\x4b\x91\xe0\x14\x09\x4e\x91\xe0\x14\x09\x4e\x91\x60\x4f\xfa\x35\x47\x82\x21\xe5\x2e\xa4\xdc\x85\xbd\x28\x79\xac\x92\xc7\xca\x8f\x92\xc7\xea\x01\x4a\x1e\xab\xe4\xb1\xda\x83\x92\xc7\xaa\x47\xc9\x63\x95\x3c\x56\x7e\x94\x3c\x56\xcf\xdd\x0b\x90\x3c\x56\xc9\x63\x95\x3c\x56\xc9\x63\x95\x3c\x56\x9e\xf4\xeb\xf3\x58\x55\x22\x8f\xdc\x90\xa3\x12\x79\xc4\x7e\x1c\x16\x7d\x9c\x89\x49\x21\xb2\xa6\x1f\xf7\x68\xae\x66\x48\x36\x2b\x01\x14\x29\x6d\x91\xf4\x63\xf8\x6f\xc1\xa9\x2d\x6a\x0f\x64\x3c\x4f\x84\x5a\x0b\xbd\xa4\xd2\xb0\x3f\x54\x47\xa3\xcb\x53\xa7\x7e\x21\xe3\x87\x9d\xfa\x85\xa4\x7e\x21\xa9\x5f\x48\xea\x17\xf2\xd9\xf5\x0b\x59\x12\x35\xbe\x1d\x6f\x43\x68\xb0\xb6\x0d\x26\xe2\x64\xef\xf5\x14\xff\x35\x95\xe5\xff\xdc\xea\x1e\xe2\x79\xfc\x07\x1d\x47\x7e\x75\xdd\x43\x8c\x68\x73\x22\xc3\x9c\x9f\x80\x5e\x1f\xf6\x6c\xd8\x3d\xcd\x5d\xae\x27\xcd\x2f\x87\xbb\xe2\xc9\xdc\xc6\xdd\x70\xf1\x49\x9e\xd3\x1c\x2a\x2a\x27\x56\x22\x0b\x6f\x96\x3c\xdf\xb1\x93\xcd\x89\xf1\x3b\x2c\x4f\xde\x99\x23\xc2\x6a\x3f\x75\x7b\x8e\xe1\x14\x22\xe5\xfe\xf4\x93\xad\x7c\x93\x32\x2d\xb5\x06\xd5\x66\xb3\x8e\x00\x9e\xad\x01\xf0\x0c\x9b\x75\x84\xc7\xe4\x26\xa0\x5d\xb2\xd1\xb7\x01\x51\xb9\x38\x61\x34\x0c\x52\x35\xe9\x44\x71\x31\x0c\x18\xfe\xfa\x5b\x4d\x65\xe8\x4b\x5a\xac\xa8\xec\x42\x21\x8d\x71\xa4\x42\x9d\x85\xcc\xb5\xed\xcf\x88\xb2\x2f\x8d\x18\x30\x86\x08\x61\xdf\x78\xf1\xd1\xb8\x59\x55\xb0\xb9\xc7\x9b\xec\x63\x38\x4c\x14\x90\x06\xfd\x62\x4f\x50\x04\xa6\x3b\x21\x30\x31\x9c\x45\x11\xb3\x12\x1b\xea\xb2\x12\xc3\x61\x12\x11\x5d\x59\xd1\x1c\x59\xbb\x84\x44\x14\xff\xd8\xa3\x80\x6c\x60\x13\x68\x13\x29\x3e\x41\x74\x0b\xb6\x89\xe8\xa0\x3f\xb6\xb1\xe8\x38\x41\x94\xd8\xa0\x1d\xd8\x01\xdc\x89\xc2\xf4\x86\xae\x23\x82\x77\x20\x2e\x80\x07\x22\x82\x78\x20\x12\x90\x07\x62\x82\x79\x20\x32\xa0\x07\xe2\x81\x7a\x60\x53\xdc\xc4\x59\x3a\x4b\xce\x5b\x15\x4f\x7e\x81\x3b\xca\x78\x47\x62\xdd\x0d\xe8\x0b\xc6\x98\x78\x21\x88\x86\x19\x82\xd8\x10\x0a\x88\x8c\x1d\x82\xcd\x63\x14\x55\x24\x82\x0d\xb3\xc5\x04\x24\xc1\x63\x82\x92\x60\x08\x4c\x8a\xc6\xb3\x81\x81\x20\x38\x29\x1a\xd7\xb8\x20\x27\x78\x1c\xa0\x13\xb4\x60\x27\xa3\xc7\xa2\xb1\x8c\x8f\x9b\x7a\x84\x8b\x1a\x0f\xef\x04\x9b\xd7\xd4\xb2\x8e\x29\xf0\x09\x8f\x88\x27\x01\xeb\x22\x8c\xb8\x96\x30\x40\x53\xc5\xbb\xed\xb1\x21\x2a\x60\x57\xf3\x9c\x77\xa8\xaa\xa8\x83\x8d\xbc\xf1\x91\x51\x2f\xf0\x28\x28\x2d\x78\x24\x38\x11\xf4\xd1\x5a\xf1\xce\xfd\x63\xa0\xbe\xe0\x73\xda\xfe\xc8\x5b\xdf\x41\x7f\x62\xee\x7a\x03\xff\x89\xc6\xd3\xc2\x88\xfa\x10\xa0\x68\xac\x11\x4a\x14\x0f\x06\x04\xd1\xa1\x40\x10\x17\x0e\x04\x71\xb5\x31\xba\xf2\xde\x61\xf9\xa1\xc7\x70\x12\x5a\xce\xb1\xfc\x83\x25\xa9\x8c\xea\xfc\x3f\x37\x74\x7d\x8c\xb7\xfd\xff\xc6\x78\xc4\x12\x26\xd5\x14\x4e\xe3\xe1\x11\x7b\xe3\x0b\xaf\x98\xda\x50\x6f\x39\xcd\x3a\xc4\x59\x52\xfa\xb7\x9a\xad\x48\x41\xb9\xf6\x0f\x1f\xf6\x89\xf0\x26\x6e\x6f\xf6\x69\xd3\x4d\x1c\x43\xdc\xdf\x2e\x85\xc2\xbc\x2f\x1b\x09\x8d\xb3\x0c\x2f\x6e\xe8\xfa\xc5\x71\x6c\x25\x6a\x18\x9f\xf3\x17\x36\xe5\x20\xce\x21\x18\xe0\x71\x23\x3a\x12\x05\x2f\xd6\xf0\x02\xb9\xbf\x08\x2b\x97\xd8\xd1\x00\xd9\x42\x64\x0c\x96\x51\xfd\xe3\x91\xdc\x7c\x24\xcf\x99\x11\x78\xa4\xb8\x8c\xea\x0d\x8b\x24\xe3\x39\x29\xa9\xaa\x48\x16\x3a\xa8\x81\x68\xef\x98\x06\x4e\xb4\x81\xd2\x29\x87\x83\x89\xc6\xb8\x75\xd1\x5d\xc5\x75\x82\x69\x01\x87\x0d\x58\x87\x2c\xcc\xed\xd3\x47\xff\x33\x90\xe7\xa0\x16\xa7\x8d\x81\x95\x94\x04\xdf\xeb\x17\x18\xe3\xac\x44\x7e\xa0\xba\x75\xf5\x03\x3e\x35\xf4\xac\x12\xb6\x23\x5d\x90\x5e\x44\x3e\xe2\x0d\xb9\x76\x6b\x1f\x7a\x3f\x96\xa2\x2e\x72\xf3\x6e\x68\x61\xd2\xa1\x2c\x0f\x1b\xd8\xc6\x91\x39\x73\x5c\xe8\x98\xac\xb9\x66\x93\x8e\xbf\x37\xd4\xac\x23\x57\x3a\x5c\x0d\x0a\xdc\x07\xf2\x1c\xca\x85\x28\x06\x5a\x07\x09\xee\x24\x58\xa8\xb5\x73\xbb\xa4\xb2\xbf\xef\xe1\xb9\x1d\x39\x9d\x33\x4e\x73\x20\x0a\x64\xcd\xb9\x59\x4d\x11\x9a\x25\xe7\xd0\xca\xd6\x2c\x43\x03\x22\xdc\x39\xdc\x0a\x6f\x0b\x07\xc2\xe0\x48\x04\xdc\x8c\xa5\x0e\x6a\x49\xd0\x48\x25\x3c\x94\x23\x2e\x80\xe0\x4e\x85\x11\xbe\x8e\xb3\x02\x36\x7c\x43\x73\x7b\xfe\x83\x37\xdf\xed\xf8\x14\xce\x50\xcd\xc4\x5b\x50\xa6\x50\x8a\x90\xa2\x10\xb7\xa1\xd6\xd9\x73\xeb\xd3\x71\xfb\x59\xf4\xe9\xd8\x00\x0a\xa6\x36\x1d\x1d\xa5\x36\x1d\xdb\x94\xda\x74\x7c\xd6\x6d\x3a\xbc\xf7\xc8\xaa\xd4\x3b\xfa\x75\x78\x71\xb4\x3d\x3e\xee\xeb\xd7\xe1\xb7\xa0\xf6\x20\x6e\xf4\xeb\x80\x1f\x96\x14\xe5\x9a\xa7\x2b\xc1\x5c\x99\xb2\x2e\x34\xab\x8a\x2e\xbb\xc4\x2e\x43\xe1\x1d\xe4\x70\x1d\x27\xd4\x06\x5e\xd9\xac\x04\xf1\x4c\x44\xde\x90\xe6\x38\x6e\x4c\x42\x56\x68\x0e\xf8\x99\x95\x98\x02\x45\x8a\xc2\xb5\xb3\x68\x72\xda\x6d\x7e\x1c\xfb\x9c\xd3\x36\xde\xa2\x51\xab\x42\x81\x09\x68\x64\x1d\x1a\xeb\xbd\x30\x62\xc1\x58\xb3\x8d\xae\xf6\xe4\xb8\xed\x82\xb0\x98\x8c\x55\x40\xaa\x06\xa6\xc6\xb1\x15\xe5\xdd\x3b\xe3\x50\x1d\x1d\x85\xd4\x19\x6a\xbc\x04\x31\xdf\x9a\x8f\xf0\xc6\xdc\xf5\xb6\x3c\xb6\x6f\x24\x4f\x8e\x83\x97\xd5\x8e\xb7\x91\x27\x5b\xc1\x77\xbf\x89\x02\x2c\xb2\x8d\xb7\xd0\x9f\x7a\xb6\xfb\xff\xf2\x64\xb9\xe3\x15\xd4\xbc\x63\x7c\xed\x6e\xfb\xfa\xc1\xa3\xd4\xa4\x46\x5a\xdc\xbe\x77\x6e\x9c\x8d\x45\x06\xec\xc6\x93\x67\x21\x85\xbe\xb2\xc2\x01\x96\x91\xd2\x3c\x1e\x25\xc5\xe3\x11\xd2\x3b\x22\xa6\x76\xfc\x63\x34\xc9\x89\x9c\xca\xb1\x9d\xc6\x11\x0b\x41\x3f\x48\xe1\x88\x9d\x80\x11\x29\xf9\xe2\x59\xf9\xc7\x1f\x25\xe1\x22\x55\x34\x4d\x15\x4d\xfd\x28\x55\x34\x7d\x80\x1e\xa3\xa2\x69\xac\xc4\x87\x7e\xd2\x43\x34\xa6\x4d\xc2\x43\xdc\x1c\x2b\x17\xe7\xfd\x87\x2a\x6c\x1a\x15\xf9\xd9\x25\x25\x34\xc9\x04\x91\xd8\x76\x09\x09\x71\xc0\x46\x90\xaa\xa4\x62\xe2\x40\x74\xc0\xff\xe7\x50\xd8\x34\x22\xd8\xb7\x07\xf0\x8f\x95\xd8\x62\xd7\x2e\xea\xb1\x7c\xa4\x9a\x91\xd1\xc1\xf8\x8f\x5a\x83\x33\x95\x38\xfd\x5c\x4a\x9c\xa6\x9a\x94\xd1\x04\xf1\xaf\xa9\x26\xe5\x90\xa2\x81\xcf\x1f\x09\x78\xfe\x38\xa0\xf3\x0d\xc0\x79\x44\xce\xae\x10\x66\x5c\xa8\xf8\x26\x4c\x1c\x48\x28\x66\xe8\x11\x21\xe2\x1b\xf0\xf0\x0e\xdc\x1d\x01\x90\xd3\xaf\x2e\x8e\xc0\xee\x50\xa7\x93\x2b\xbb\x15\x51\x9c\xb7\x6e\x8f\x01\xa0\x3b\x90\xe9\xa6\xaf\x2d\x02\x98\x3b\x9a\xaf\x2d\x82\x6b\xe2\x31\x00\xdc\x11\xe4\x63\x0c\xe0\xf6\x1d\xa0\xed\x0e\x76\x1d\x02\x67\xda\x00\x6c\x6f\xc7\x3b\x03\x98\x77\x8f\xf8\xb8\x70\xeb\x47\x80\x5a\x47\x86\x59\xc7\x50\xf9\xc1\x8a\x3e\xc2\xf1\x8d\x02\xab\xde\x09\xa9\x76\x81\xea\x80\xe9\x0d\x42\xdc\xbd\x60\x75\x48\x28\x6b\x33\xcc\xbd\x19\xb0\x0e\x05\x0e\xc6\x06\x42\xef\x02\x41\x77\xd8\xa8\x90\x2b\xd6\x01\xa0\xb7\x20\xcc\x21\x81\xbd\x5d\x21\xfa\x30\xf8\x72\xec\x30\x3d\x6c\x87\xea\xe3\xa0\x6c\xef\x0a\xd6\x87\x9c\xd7\x21\x5c\x79\x00\x38\x0e\x60\xeb\xa0\xca\x8f\x03\x36\x8e\x05\x34\x0e\x2a\xa8\xcf\x35\x7b\x8c\xa2\xfa\x7d\x59\x31\x7a\x62\x77\x54\xd6\x27\x2b\xc1\x72\xa8\x6a\xad\x7d\xc4\x78\x8b\x0b\xba\xaf\xba\xfe\x68\xae\x44\xa5\xea\xfa\xf7\xd0\x67\x5c\x5d\x3f\xe8\x04\xc3\xb0\xbe\xf8\x36\x48\xd7\x8b\xe3\xa0\x2c\xff\x76\x89\x7d\xff\x89\x37\x65\xf9\x77\x94\xd8\x0f\x9d\xfa\x74\xab\xc4\xbe\x17\xc7\x8d\x52\xce\x1b\x25\xf6\x3d\x67\x3e\x2c\xcb\xbf\x55\x62\xdf\x6f\x8f\xfa\x65\xf9\xb7\x4b\xec\x7b\x8f\xb4\x2f\x13\x77\x96\xd8\xf7\xc6\x83\x51\xa5\x8f\xef\xcc\x2b\xf0\xe2\x3a\xb8\x3b\xbb\xea\xec\x7b\x71\x6d\x6b\xf3\xdf\x59\x67\xdf\x7b\x71\x1b\xf4\xf4\x76\x9d\x7d\xbf\xf9\x0f\x6b\xf3\x0f\xeb\xec\x7b\x0f\x72\x50\x9b\x7f\x58\x67\xdf\x9b\xe7\x10\xe5\xbd\x59\x67\x3f\x68\xa8\x4d\x6d\xfe\xcd\x3a\xfb\x7e\x2b\x9a\x6a\xf3\xef\xa6\x54\x9b\xff\x19\xa0\x62\x53\x6d\xfe\x8e\x52\x6d\xfe\x54\x9b\x7f\x8b\x52\x6d\xfe\x54\x9b\x7f\x04\xa5\xda\xfc\x7d\x4a\xb5\xf9\x47\x53\xaa\xcd\x9f\x6a\xf3\xa7\xda\xfc\xde\x94\x6a\xf3\x8f\xa3\x54\x9b\x3f\xd5\xe6\x8f\x40\xa9\x36\x7f\x9f\x52\x6d\xfe\x54\x9b\x3f\xd5\xe6\x8f\x40\xa9\x36\x7f\xaa\xcd\x9f\x6a\xf3\xa7\xda\xfc\xc1\x94\x6a\xf3\xa7\xda\xfc\x41\x94\x6a\xf3\xa7\xda\xfc\xa9\x36\x7f\xaa\xcd\x9f\x6a\xf3\x7b\x52\xaa\xcd\x1f\x40\xa9\x36\x7f\xaa\xcd\x1f\x36\x98\x54\x9b\x7f\x24\xa5\xda\xfc\xa9\x36\x7f\xaa\xcd\x9f\x6a\xf3\xa7\xda\xfc\xbb\x29\xd5\xe6\x4f\xb5\xf9\xc7\xd0\xce\xda\xfc\xc1\x89\x2a\x83\xc7\x53\xc4\x4c\x95\xa6\xa8\xff\x76\x81\x7e\x2f\x9e\x83\xa2\xfe\xbb\x0b\xf4\x7b\xf1\x6d\x8a\xfa\x6f\x14\xe8\x7f\xbe\xcb\x8a\x95\xfd\xb7\xab\xf4\x7b\x71\xec\x57\xf6\xdf\x55\xa5\xdf\x8b\x69\xbf\xb2\xff\x8e\x2a\xfd\x5e\x3c\xbb\xca\xfe\xf7\x56\xe9\xf7\xe2\x8d\x95\xfd\xef\xab\xd2\xef\x77\x5e\xd1\xa6\xba\xbb\x4a\xbf\x17\xd3\xc2\x56\x62\xba\xab\x4a\xbf\xdf\xf4\x49\xb6\x4c\x55\xfa\x1f\xa4\x54\xa5\x3f\x55\xe9\x4f\x55\xfa\x53\x95\xfe\x07\xe9\xc9\xf3\x91\x52\x95\xfe\xfb\x28\x55\xe9\xdf\x93\x52\x95\xfe\x54\xa5\x7f\x34\xa5\x2a\xfd\xa9\x4a\x7f\xaa\xd2\x7f\x07\x8f\x54\xa5\x7f\x14\xa5\x2a\xfd\xa9\x4a\x7f\x30\xdb\x54\xa5\x3f\x55\xe9\x0f\xa1\x54\xa5\x3f\x55\xe9\x4f\x55\xfa\x53\x95\xfe\x54\xa5\xdf\x8f\x52\x95\xfe\xb1\x94\xaa\xf4\xa7\x2a\xfd\x96\x52\x95\xfe\x54\xa5\x7f\xf4\xe0\x52\x95\x7e\x5f\x4a\x55\xfa\x53\x95\xfe\x54\xa5\xdf\x51\xaa\xd2\x9f\xaa\xf4\xa7\x2a\xfd\x4f\x5c\xa5\x9f\xd4\x5a\x94\xa2\xe6\xfa\x8a\xca\x15\xcb\xe8\x69\x96\x99\xaf\xae\xc5\x0d\x1d\x05\x20\x1d\x46\xe5\xee\x61\x3a\x6a\x7a\x8c\xe7\x2c\xc3\x18\xd2\xed\x92\x62\x01\x7c\x02\xca\xf2\x04\x62\x99\x82\x1e\xcd\xb5\x43\x04\xe1\xec\x89\x66\x19\x29\x8a\x35\xe0\x90\xc7\xed\x80\x5d\xf3\x99\x10\x05\x1d\xf1\x7c\x70\xe6\x2c\x95\xa3\xb4\xd9\x60\x89\xdf\xb9\x58\x74\xc7\x0a\x66\xb4\x10\x7c\x31\x56\xb5\x39\x68\x6a\x25\xf2\x29\xbc\xe9\x98\x65\x84\xa3\xe0\xaf\xa5\xa4\x5c\x8f\x84\x3d\xce\x9a\x72\xbe\x18\x50\x2d\xc5\x8a\xe6\x18\xda\x46\xa4\xa2\x75\xc9\x8c\x8c\x85\x16\x94\x98\xf9\x72\xda\x4d\xd8\x08\x77\x02\x97\x38\x6e\x3b\xd8\xd9\x38\xc9\x61\x11\xa3\x1e\xdb\x3d\xd6\x8a\xf1\xb0\x5b\x36\x82\xdc\xee\x45\x8d\xe6\x63\x86\xe1\x86\x6e\x1d\x46\xca\x0b\x14\xb6\x6b\x51\xc3\x2d\xb1\xcf\x5e\x59\x73\x14\xec\xb8\x9c\xe6\x18\x8c\x3b\x3e\xbe\xcf\x15\xbf\xb8\xe9\x04\xf5\xf0\xa8\x3f\xf1\x8f\x65\x12\xb9\xf0\x30\x37\x07\x5b\x77\x70\x2a\x17\xb5\x7d\x5d\xba\x8b\x46\xb9\x96\x6b\x04\x45\xfb\x48\x7a\xf3\x66\xcd\x45\x76\x63\x8e\x7f\x49\x16\xf4\xe0\x40\xc1\x9b\xf7\x6f\x8d\x0e\xa9\x95\x97\x8a\x63\xae\x20\xbd\xd3\x42\x95\x14\x2b\x96\x9b\xfb\xfa\x3d\x91\x8c\xcc\xbc\x4a\x08\x60\xd1\x6d\xca\xcd\xeb\xe9\x8b\xc3\xef\x4f\x3f\xfe\x7c\x71\xfa\xfe\xec\x08\xa3\x45\xf4\x53\x45\x78\xee\x35\xd2\x5a\x75\xa9\x26\xee\xec\x9b\xe9\x53\xbe\x62\x52\x70\xb3\xc8\x3e\x2b\x7a\x3e\x07\x02\x2b\x37\xd7\x46\xec\xcd\x28\xc2\xb6\x8a\x95\x1f\x2e\x59\xa3\x67\xc1\xad\x41\x63\x84\x32\x5e\xd5\xda\xff\xf1\x81\xe9\x08\x33\x0a\x35\xcf\x96\x84\x2f\x9c\x44\xed\xaf\xaf\x07\x53\xb5\xe6\x9a\x7c\x32\xb3\x46\x37\xb9\xca\x48\x45\x73\x6b\xe6\x11\xc8\x45\xed\xb7\xfd\x5f\x7c\x71\x0c\x8c\xbe\x86\x2f\x7a\x83\x9b\xc2\x99\xe3\xde\x1d\x0e\xdf\x55\xe0\x74\x45\x25\x0e\xd8\x1d\xa6\x63\x90\x74\x41\x64\x5e\x50\xe5\xc3\x54\xcc\x5b\xf3\xc2\xfa\xad\xdc\x61\xa0\x4d\xbc\xc3\x83\x27\x17\xba\xa7\x97\x5a\x5d\x03\xef\x05\xc2\xde\xe7\xc2\xe7\xf5\xb8\xd4\xba\x52\xaf\x4f\x4e\x6e\xea\x19\x95\x9c\x6a\xaa\xa6\x4c\x9c\xe4\x22\x53\x27\x9a\xa8\x1b\x75\xc2\xb8\x91\xc3\x93\x9c\x68\x32\xe9\x29\x8b\x13\xfb\xc4\x98\x64\xa2\x2c\x09\xcf\x27\xc4\x09\xa5\x49\x7b\x91\x4e\x7e\xeb\x4c\xdb\x09\x69\x7f\x8b\xf1\x09\x99\xa8\x25\x2d\x8a\x83\xd1\x63\x0d\x79\xee\x7b\x3f\xf3\x03\x9e\xf7\x6e\xce\xa1\xd2\xfe\xac\x15\xee\x76\xee\x53\xb8\x10\x3e\x5e\x3c\x9b\x23\xe3\xae\x22\x2a\x66\xdc\x87\x69\x4f\xfe\xfb\x88\xfa\x46\x63\x9c\x5d\x5c\x7f\xfc\xcb\xe5\x87\xf3\x8b\xeb\x46\x71\x34\x6a\xc0\x87\xeb\x5d\x8a\x23\xec\xa6\xdf\xa5\x38\x3a\x35\xe0\xc1\xf4\x4e\xc5\x31\x54\x03\x3e\x9c\xb7\x15\xc7\x50\x0d\xf8\xac\xec\xb6\xe2\xd8\xa1\x06\x3c\xad\x88\xfe\xfa\xee\x54\x03\x5e\xd2\xb9\xa7\x38\x76\xab\x01\x0f\xae\xdb\x8a\x63\xa8\x06\xbc\xee\xd7\xb6\xe2\xe8\xa9\x01\x4f\x95\xbf\xad\x38\xfa\x6a\xc0\x83\xe9\x6e\xc5\x91\xd4\xc0\x3e\x1f\xea\xa5\x06\x28\x5f\x05\xaa\x80\xe6\x5d\xde\x13\x2e\xed\xb9\xf0\x11\x83\x5a\x20\x16\xcc\x89\x82\x76\xa3\xe2\x1c\xaa\xcf\x63\x3f\x07\xeb\x7b\xc6\x57\xdf\x13\x39\x00\xf3\xf9\xf9\x4a\x77\x6d\x10\x38\xa6\xc0\xfc\x78\x92\xce\x83\xe2\x9f\x78\xe8\x1d\xfa\x0b\x41\x22\x7b\xbc\xab\x2d\x85\x22\x85\xcd\xc7\xfa\x06\x52\x06\x07\xe3\x82\x94\x8d\x9f\xbb\xbf\xb7\xde\xde\xd4\xe6\x4c\x4c\xe1\x7d\xe3\xb2\x82\x37\x3f\x9f\xbf\x3d\xbb\xb8\x3e\xff\xfa\xfc\xec\xa3\xaf\x9f\x36\x38\x06\x85\x1e\xfd\x28\x4b\x76\x10\xc7\x52\xb3\x74\xbf\xbd\xe6\xef\xd4\x5e\xe2\xad\x5c\x31\x51\x77\x91\x92\x98\xfb\xab\xb6\x64\xab\x37\x4b\x9b\x44\xb1\x6e\x3d\xd4\x51\x87\x39\xdd\xe9\xa9\xf0\xe6\x1b\xd5\x50\xb5\x74\x8f\xb9\xea\xcd\x33\xaa\xb7\xc3\xd2\xdd\x3e\x0f\xff\x8d\x8f\x6d\xf2\x5a\xba\xd7\xf0\x0d\xd9\xf9\x3b\xcc\x5f\x6f\x96\xf7\x78\x4f\xbc\x79\x36\xc6\xf3\x5b\x3a\x27\x75\x61\xfd\xa7\x2f\x5e\x4c\xc7\xdb\xa0\x96\xe2\x88\xdd\xaf\xa5\xf0\xee\x5c\x37\x10\xbd\x57\x98\x12\x8a\xbd\x5c\x43\x02\xb3\xbb\x8c\x98\x03\x97\x1c\xe6\x7f\xee\x7a\x6e\x2b\xe7\x1a\xb0\x51\xe4\x00\xc0\xab\xe1\x17\x84\xc2\x8d\x00\x8b\x8a\x91\xd4\x94\x09\x3e\x67\x8b\xf7\xa4\xfa\x96\xae\x3f\xd2\x79\x08\x18\x65\x78\x1e\x30\x46\xed\x32\x53\x82\x40\x5a\x62\x6e\xcd\x50\x3b\xcc\x10\x2c\x5a\x24\x24\x5a\x8c\x04\xb9\xd0\xe4\xb8\x58\xf9\x6c\x11\x72\xd9\xb6\xba\xb4\xc6\x48\x3b\xc3\x57\xa2\x39\x41\x71\x12\x23\x23\xa4\xc8\x84\xd8\xf5\x0d\x0d\x8d\x55\x67\xe0\x87\xaf\x55\x67\xec\x68\xeb\x56\x09\x66\xf9\xa0\x5b\x26\x13\x3c\xa3\x95\x56\x27\x62\x65\x6c\x43\x7a\x7b\x72\x2b\xe4\x0d\xe3\x8b\x89\xb1\x3b\x26\xf6\x8e\xa9\x13\xc4\x18\x9d\xfc\x16\xff\x13\x3c\xa8\xeb\x0f\x6f\x3f\xbc\x86\xd3\x3c\x07\x81\xca\xb9\x56\x74\x5e\x87\x67\x4a\xdb\x96\xbd\x53\x20\x15\xfb\x9e\x4a\xc5\x44\x84\xfc\x9a\x1b\xc6\xf3\x63\xa8\x59\xfe\x95\xaf\x7a\x6f\x28\xda\xf9\x15\x95\xc5\xce\x46\x3d\xc3\x57\x88\x43\x0b\xbf\xee\x7d\x7b\xab\x15\xf5\xc1\x5c\x85\xc4\xa2\x54\x37\x74\xdd\xa0\x34\x82\x59\xba\x07\x5b\x94\x4d\x1d\x0b\xb2\xd9\x24\x3c\xb8\x31\x75\xf6\x41\xab\xb4\x83\xe6\x67\x01\xfd\xce\x73\x51\x89\xfc\x35\xa8\xba\xaa\x84\x0c\x2c\xfe\x50\x52\x4d\x72\xa2\xc9\xd4\x48\x93\xe3\xe1\x97\x88\x63\x0c\xbb\xb6\xff\xd9\x32\x44\x68\xa0\xfa\xf1\xe0\xe0\x4f\xdf\x9e\xfd\xe5\x7f\x1d\x1c\xfc\xf4\x9f\xb1\x38\xa3\x19\x6a\x93\x6b\xe3\xb1\x57\x15\xcd\xa6\x5c\xe4\xf4\x02\xd7\x05\xbf\x54\x03\x98\x1a\xfe\x20\xec\x33\x34\xd1\xb5\x9a\x2e\x85\xd2\xe7\x97\xc7\xcd\x97\x95\xc8\xcf\x2f\xa3\x30\x46\x4e\xca\xfb\x2d\x04\xcf\xcd\xb8\xc3\x2b\x70\x49\x82\xea\x2b\xc7\x32\xf1\x3a\xbd\x16\x55\xf4\x3b\x9e\xe1\x42\xda\x61\x5a\xb3\x25\x2d\x49\x94\x3e\x0c\x5f\x37\x8b\x0f\x4c\xc1\xad\x64\x5a\x7b\x96\x23\xec\x13\xe3\xae\x22\x9f\x98\x1f\x1b\x2d\x80\x4f\xf8\x18\x66\xee\x8b\xd5\xab\xe0\xc4\x9f\x68\x46\x42\x7b\x6e\xa3\x1e\x15\xdc\x8b\x48\x86\xae\x55\x2e\xed\xf3\x20\xca\xbe\xf6\x01\xf5\x70\x7a\x79\x1e\xcc\x74\x65\xef\xc6\xb3\xd8\xd6\xa6\x5a\xd7\xd7\xcf\xd4\x5a\x68\xc6\xd7\x08\x82\xd6\x6b\x1d\x76\x04\x31\xaf\xae\xad\x54\x06\x05\x2b\x59\xe0\x7d\x25\x3c\x47\xed\x40\x95\x56\x70\x68\x19\x4e\xb3\xaa\x0e\x53\x80\x8e\x4f\x49\x4b\x21\xd7\xc7\xcd\x97\xb4\x5a\xd2\x92\x4a\x52\x4c\x94\x16\x92\x2c\x02\xd5\x77\x33\x6c\x1c\x6e\xf7\x95\xfd\xd0\x68\x8b\xb2\x3d\xea\x90\x64\x1a\x5b\x8b\xa3\x85\x6b\x37\x36\x24\xcd\x7f\x3d\x56\x42\x73\x3c\x9f\x81\x91\xd0\xde\xba\x8b\xe8\x6e\x8e\x37\xc1\x61\xa8\x86\xd0\x05\xd3\xae\x3d\xcc\x23\x14\x82\x58\x89\xa2\x2e\xa9\x3a\x6e\x9f\xc7\xe1\xee\x04\x21\x81\xf2\x15\xac\x88\x54\xcf\xe6\xf1\x9f\xb3\x15\x53\xe1\xf5\x8c\x76\xbc\xfd\x63\x34\xae\xc6\x9c\xed\x5a\x57\xb5\x76\xe5\xe4\x63\x19\x95\xf4\x53\x25\x14\xc6\x9b\x22\x54\xac\xb4\x94\xf7\xa3\x37\xaf\xc2\xfa\xf5\x60\x01\x0a\x4d\x25\x7f\x0d\xff\x71\xf8\xd7\x2f\x7f\x99\x1c\x7d\x75\x78\xf8\xe3\xcb\xc9\xbf\xfd\xf4\xe5\xe1\x5f\xa7\xf8\x8f\x7f\x3e\xfa\xea\xe8\x97\xe6\x8b\x2f\x8f\x8e\x0e\x0f\x7f\xfc\xf6\xfd\x37\xd7\x97\x67\x3f\xb1\xa3\x5f\x7e\xe4\x75\x79\x63\xbf\xfa\xe5\xf0\x47\x7a\xf6\xd3\x9e\x4c\x8e\x8e\xbe\xfa\x22\x70\xe0\x84\xaf\x3f\x04\x99\x12\x60\xcb\xae\x46\xe9\x41\x30\xe4\x16\xa5\x1c\xd2\xa7\x49\xe7\xf4\x9c\x30\xae\x27\x42\x4e\x2c\xe3\xd7\xa0\x65\x1d\xf6\x48\x69\x8e\x63\x5c\x39\xfb\x31\x52\xdd\xbe\x9e\x49\xd6\x9a\xd9\xcf\x42\x90\x29\x9a\x49\xaa\x9f\x77\x9c\xca\x8e\xb1\x79\x55\x60\xb2\x79\x70\xd4\x01\x9d\x5b\xbf\x16\x9b\x27\x85\xbd\xee\xa3\x36\xc1\x17\x4f\x51\xbc\x57\xee\x5c\x8a\x72\x0a\x3d\xe0\xd7\x2a\x4a\x3b\x7f\x37\xce\x1b\x1a\x5c\x8b\x2a\x85\xe9\x7c\x28\x85\xe9\xc2\x28\x85\xe9\xc6\x51\x3f\x4c\x77\x85\x77\x3f\xc5\xe8\x76\x11\xe5\x2b\x3f\x60\xd5\x4e\xe4\x7d\xe3\xc3\xd2\x02\x2a\x51\xd5\x05\xd1\x5e\x19\x22\xbb\xf0\xfb\xdb\x30\x7c\x0f\xce\x4e\xf9\x75\x68\xd6\x2e\xc7\xcb\xd7\xbd\x51\xee\x46\x28\xc3\x69\x51\x00\xe3\xbe\xca\x0b\x07\xd9\xe4\x1b\x49\x6a\xdd\x49\x40\xb0\xaa\x28\xf6\x43\xf2\xe0\x79\xbb\xa4\x1b\x4b\x08\x4c\x81\xd2\x44\x6a\xc6\xbd\x9a\x41\xfd\x60\x38\xa2\x39\xda\xa4\xdd\x30\xde\xf5\x43\x0a\x78\xc8\xb6\x25\xcc\x7a\x0d\xf3\xba\x9a\x35\x05\x51\x3e\xf3\x77\x2f\x05\x5c\x55\x4d\x6e\x10\xdb\x9c\xd1\x9c\xf2\x8c\x4e\xe1\x7b\xdf\xda\xaf\xcd\x49\x9a\xad\xcd\xde\x9c\xf1\x55\x9b\x89\x55\xdb\xe4\x1f\x9f\x43\x65\x56\x74\xf7\x38\xff\x71\x53\x4f\x8c\x98\x72\xd0\xcd\x2e\x03\xc5\x4b\x72\xa2\xdd\xda\x7a\xf2\xdb\x82\xcf\x2d\x9a\xc3\x2b\x57\x28\xec\xe5\x12\xfa\x5a\x68\xb1\x91\x01\x0f\xce\xad\x67\x42\xbb\x20\x21\xb5\xb5\xed\xb3\x00\xcd\x7a\x4f\x1e\xcf\x04\x7e\x1a\x6a\xae\xef\x34\xd5\x83\xa3\xc8\x43\x33\xfd\xf9\x99\xd9\x8f\x60\x62\xef\x30\xaf\xad\x79\x1c\xc4\x35\xd4\xb4\x8e\x62\x56\xc7\x30\xa9\x77\x99\xd3\x01\xc9\xb5\x1d\x0d\x10\x6f\x51\x4c\xe0\x70\xf3\x37\x1c\x9e\x56\x49\x3a\x67\x9f\xa2\xc8\xcc\x53\xde\x6e\x20\xb0\x9c\x72\xcd\xe6\x2c\x60\xcd\x8d\x11\x2d\x69\x45\x39\x82\x08\xb0\x8f\xa3\xb1\x0b\x3c\xf3\x23\x61\x73\x07\x9f\x5d\x72\x9d\x75\xd1\xc4\x54\x60\x57\xb1\x9c\x53\x49\x7b\x25\xed\x95\xb4\xd7\x43\xf4\xec\xb5\x97\x93\x07\xcd\x93\xfd\x69\xd5\x0f\x56\x84\x09\x2d\x7a\xf3\xb6\x57\x8f\x0c\xef\xb8\xb7\xbb\x76\xff\xbb\xd7\x95\x3d\x3c\xc1\xcf\xf5\xb9\x62\x58\x78\xb7\x2d\xa7\xde\x6a\x4d\x2d\x6c\x29\x4e\x0f\x8e\x4b\xb6\x30\x37\xb4\xa0\x2b\x5a\xb8\xe7\x10\x94\x84\x93\x85\xad\x0b\xef\xf5\x82\x71\x11\x74\x10\x12\xfb\x4a\x4a\x96\x0f\x9c\x27\xbe\x93\x67\x1c\x8c\xd8\x2a\x04\xc9\x91\x9d\x14\x45\x41\xa5\x82\x82\xdd\x50\x78\x4b\xab\x42\xac\x7d\x1b\x10\x12\x9e\xc3\x95\x26\xda\x88\xa9\x2b\xaa\x7d\x70\xca\x01\xa2\x00\x57\xe4\xb2\x2e\x8a\x4b\x51\xb0\xcc\x23\x6e\x35\x3c\xdc\xe7\x78\xaa\xab\xba\x28\xa0\x42\x86\x53\xf8\xc0\x7d\xce\xb6\x98\xc3\x69\x71\x4b\xd6\xea\x18\x2e\xe8\x8a\xca\x63\x38\x9f\x5f\x08\x7d\x69\x9d\x08\x3e\x06\x4f\x3f\x33\xd6\xb2\x06\x36\x87\xd7\xd8\x73\x4f\x83\x26\x3e\x42\x94\xf5\x1a\xc9\x1f\x9b\x33\xd7\x1f\xa4\x55\x40\xb7\x4c\x79\xe5\x96\xde\x5b\x0c\xcd\xef\xd2\xff\x16\x39\x19\xd5\x6b\xbf\xfe\xbb\x1e\xb4\x82\xcd\x69\xb6\xce\x8a\x50\xf9\x79\x9a\x61\x86\x43\xd7\x36\xae\x93\x18\x3e\x0e\x46\xdb\xc5\xde\x95\xb8\x45\xd7\x1d\xe3\x60\x5b\xb8\x2b\xcf\x0e\xdd\x9d\xb8\x69\xe7\x6c\x1d\xc0\xea\x49\x7d\x81\x9e\xf6\x6c\x98\x25\x5b\x09\xa5\xaf\x34\x91\x3a\x42\x8b\xf7\x83\xcb\x86\x19\x60\x6b\xdf\xa2\xf0\x36\x04\x58\x59\xd2\x9c\x11\x4d\x8b\x35\x90\xb9\xc6\x42\xc9\xa1\x05\x2d\xcc\x98\x24\xb5\x37\xd5\x75\x94\x5a\x12\x9e\x17\x54\xc2\x9c\xb0\xc2\x1b\x1d\xb6\xe5\xfe\xd7\x54\x96\x8c\x07\x14\x52\xb7\xb0\x5a\x8c\x22\xd0\x1c\x0b\x43\xcb\x1c\x8b\xc4\x09\xf0\x87\x31\x3b\x86\x9d\xd8\x47\xeb\x3b\xe8\x72\x42\x87\x59\xe8\x16\x60\x56\x88\xec\x46\x41\xcd\x35\xf3\xb5\xea\x71\x6b\x84\xb8\x81\x4c\x94\x55\x81\xc2\x33\xac\xd0\x24\xdc\x5f\x6c\x72\x97\x44\x6e\xff\x39\x69\x85\xc4\xc4\x8c\x49\x9d\xfc\xb6\xfb\x11\x7e\xc3\xef\x8d\x10\xfc\x86\x0d\x7f\xc1\xd2\x4f\x34\x8b\xd4\xf4\xe1\x03\xa7\x78\x6a\x05\x1f\x59\x5a\x7b\x48\x82\xb7\x89\x00\x73\x61\x8c\x56\x73\xea\x63\xf4\x91\x68\x8d\x80\x29\x9c\x7d\xa2\x59\x94\xce\x2a\x66\x94\x04\x95\x1d\xd6\x42\x26\x37\x01\x25\x2a\x9e\x51\x13\x73\xef\xd2\xa1\x7d\x1a\x1c\x8e\x37\x96\x63\x78\x83\x39\x2b\x68\x2c\xb3\x82\x71\x4f\xf5\xdf\x27\x57\x98\x14\x18\x57\xe6\x21\x32\x90\x64\x31\x7a\x51\x39\x57\x0a\xe4\x4c\x62\x07\x8f\x50\x10\x86\x2b\xb0\xd2\xae\x42\xf8\x9a\x4a\x21\x34\x1c\x1e\x9c\x1c\x1c\x6d\xa1\x01\x82\x3b\xca\xce\x59\x41\xad\x01\x67\xcb\x1d\xb9\x51\x07\x72\x35\x36\x3d\x2b\xab\x62\x8d\xbb\x77\x90\x1f\x03\x0b\x05\xa2\xb8\x9a\xaf\xb2\xe6\xcd\x49\x08\xed\x43\x8e\x05\x26\x8f\x41\x09\xd0\x92\x34\x8d\xab\x62\xf0\x34\x03\xd4\xb2\x76\x46\xf6\xe1\xc1\x2f\x07\xa1\xe7\x94\xea\xec\x08\x6e\x05\x3f\xd0\x78\x5c\xa7\x70\x1d\x7a\xab\x6a\x45\x9b\x12\xbf\xc7\x58\x9b\x9f\xd3\x70\x40\x8e\x00\xfa\xa9\x2a\x58\xc6\x74\xb1\x46\xe3\x12\x44\x1d\xba\xef\x58\xc3\x9e\xe8\xa6\x1a\xf1\xd9\xa7\xe0\x93\x64\x33\x9a\x8d\x12\x7b\x89\xa6\xa0\x35\x38\x03\x99\x12\x05\x05\x5b\xd1\x93\x25\x25\x85\x5e\xae\x21\xfc\x0e\x71\xc1\x27\xff\x4d\xa5\xc0\x7a\xc9\xdc\xf1\x8d\xd1\xe8\x2d\xbc\x3b\x5e\x94\xf6\x97\x11\x7c\xaf\xc6\x5e\xfc\x86\x7a\xbe\x8b\x60\x53\x07\xfe\xf9\xfa\xfa\xf2\x1b\xaa\xa3\x19\x1e\x66\x74\x4d\xea\x1d\x46\xb5\xa8\x9c\x0b\x59\x3e\xb1\x05\x12\x0e\x12\x9f\x40\x25\xe4\x53\x9b\x40\x4b\xa1\x02\xf6\x1d\xb6\xf6\x5e\x28\xed\x5b\x8f\xb4\x4f\x5a\x18\xdd\xcc\x69\x66\x76\x3c\x5a\x1a\x7a\xd7\x30\x07\xce\x2f\xa7\xf0\x17\x51\x9b\x55\x9c\x91\x59\x90\x25\x6f\xa8\xe9\xc8\xa2\xa8\x86\x17\x66\x11\x5e\x84\x04\x5a\x2d\x99\x73\xff\x67\x4a\x72\x2a\x15\x6a\x42\x4a\xa2\xf4\xa7\x0c\x86\xee\xf6\xc6\x15\xd3\x72\xae\x95\x16\x25\x2c\x2d\xe3\xf0\x8d\xee\x95\x5e\x76\xb2\x23\x14\xb9\x6f\xe4\x9a\x8d\x2f\x28\x90\xb4\x8a\xa1\xed\xdc\x6c\x7f\x45\xda\x68\x4b\x13\xd8\x93\x12\xc8\xb5\xe1\x3b\xa3\x0a\x08\x64\x78\x54\x82\x59\xda\xc5\x37\x67\xc5\x95\x4b\x0c\xe6\xc8\xb8\x3d\x24\x46\xa8\x04\xe7\x17\x44\xeb\x26\x1b\x27\xa1\x09\x42\x4a\x4d\x0f\x99\x20\x34\x37\x90\x4b\xac\xfc\x28\x88\x94\x49\x03\x3b\x00\x24\x11\x58\xb6\xa7\xd4\x06\x3b\x23\x2c\x3f\xc4\xcc\xe1\x80\xd0\xa2\xd6\x7d\x7a\xfc\xe5\x8b\x71\xf0\x20\xde\xfa\x55\xc1\xe5\x67\xb6\x8b\xcf\x68\x01\x24\xcb\xfc\x9a\x29\xf5\x49\x58\xd5\x89\xe2\x4c\x51\xb9\xf2\x4b\x98\xe8\x28\xd6\x92\x09\xdf\xf0\x4d\x43\x3b\x2a\xcf\x4b\xe0\x75\x39\x0b\x56\x52\x6d\x1d\x38\xa9\x63\x6f\x43\xaf\x79\xc4\x45\x8c\xa1\x36\x10\x96\xc6\x40\x22\x7c\x11\x7a\x2f\x5e\x99\x39\xff\xf1\x0f\x7f\xf8\xfd\x1f\xa6\x76\x59\xcd\x67\x04\xf2\x9c\x51\x20\x1c\xce\x4f\x2f\x4e\x7f\xbe\xfa\xfe\x0d\xd6\xe4\x0e\x3b\x85\x11\x92\xf9\x63\xa6\xf2\x47\x4c\xe4\x7f\xc4\x34\x7e\x2c\x58\x16\x28\xe1\x87\xb8\x2c\x64\x18\xee\xd1\xae\x95\x2d\xc3\xed\x5e\x8a\x36\x6c\x18\xc1\x93\x6d\xde\xc4\x83\xea\xe5\x11\x1e\x0e\x4f\x2e\x3d\x75\x56\x5d\x89\xec\x26\x9a\x97\xe7\xe0\xfa\xcd\xa5\x65\x18\xc5\xd1\x43\x78\x13\x60\x62\x7c\x25\x8a\x95\xd9\x4c\x02\xd7\x6f\x2e\x03\x95\xc5\xd4\xf0\xc0\x08\xab\xf5\x7b\xaf\x83\x32\x39\xdb\xd2\x4c\x0e\xda\xc9\xca\xaa\x08\x89\x28\x03\x76\x20\x90\x94\x14\x4c\x69\x96\xe1\x58\xdb\x18\x6c\x90\x57\x47\xdc\xf8\xe3\x39\x93\x7f\xac\xa3\xc8\xfe\xb1\x83\x0f\x91\xb2\x9e\x5b\x47\x5b\xcf\x55\x16\xec\x34\x39\x1e\x14\xfd\x09\xaf\x50\xe9\x1c\x6d\x61\x29\xe7\xcf\xd4\x72\x44\x33\xcc\xaf\xc1\x68\x9f\x78\xaf\xf7\x91\xb3\x1c\x43\x23\x28\x68\x77\x6e\x5b\x8e\x81\x6c\xdd\x84\x87\x96\x63\xa8\x5f\xc2\xd8\x9d\x5b\x96\x63\x24\xdb\x36\x59\x8e\xfb\xd1\x23\x58\x8e\x95\xa4\x57\x5a\x54\x51\x70\x76\x96\x55\x54\x94\xdd\x8c\xce\x85\xa4\x71\x60\x76\x1d\x00\x0e\xf2\x1a\x85\x31\xe1\x01\x95\x55\x9b\x30\x97\xe8\xc3\xd5\xbc\x53\xf6\x01\x4d\x96\x6c\xd9\x44\x55\x39\x55\xea\x04\xa1\x71\x75\x65\x9d\x94\x9e\x4c\xe7\x84\x15\xb5\xa4\xc7\x66\xa7\x69\x89\x7b\x75\x1c\x5a\xe4\xd1\x6c\x06\xe5\x96\x15\xd5\x99\x85\x51\x38\xd4\xa2\xff\xfe\x18\x9b\xcf\x1e\x1c\xdb\x27\x37\xbc\x59\x58\x26\x89\x5a\x52\x6c\x11\x4a\x3f\x31\xad\xec\x40\x25\x25\xca\xbb\x46\x34\x42\x5d\xdc\x41\x42\x13\x58\x41\x45\x94\xa2\xb9\xbf\x36\xe8\x41\x3e\xed\x00\x2f\x45\x7e\x70\xa0\xfa\x1f\xe3\xc9\x79\x21\x49\x46\xa1\xa2\x92\x89\x1c\xb0\xea\x7a\x2e\x6e\x39\xcc\xe8\x82\x71\xdf\x17\x80\xbb\x91\x66\xd0\xcd\x85\x37\x26\x2c\x0d\x00\x52\x35\x7d\x98\xa7\xf0\x71\xd0\x27\xd6\x5f\x6b\x89\x5a\x67\xa2\xd3\xd6\x6e\x75\x8f\x03\x38\x76\x48\x52\xac\xd6\x80\xd7\xbc\x26\x45\xb1\xee\xc4\x8a\x27\x67\x57\x98\x44\x3f\xd6\xc6\x7f\x66\x98\x5a\x73\x59\x43\x39\xf6\x2f\x68\x7f\x29\xfc\x65\x93\xa4\x24\x5b\x86\x25\x53\x24\xe8\xee\x03\x94\xa0\xbb\x09\xba\x7b\x27\x25\xe8\x6e\x82\xee\x26\xe8\x6e\x82\xee\x26\xe8\x6e\x82\xee\x8e\xa4\x04\xdd\x7d\x88\x12\x74\xf7\x4e\x7a\x96\xa1\x89\x04\xdd\x4d\xd0\xdd\xbd\x29\x41\x77\x13\x74\x77\x1c\xdf\x04\xdd\xf5\xa2\x04\xdd\xbd\x97\x12\x74\x37\x84\x12\x74\xd7\x97\x12\x74\x77\x34\x25\xe8\x6e\x82\xee\x06\x50\x02\x60\x78\x50\x82\xee\x46\x78\x38\x3c\xb9\xf4\x4c\xd0\xdd\x04\xdd\xdd\x93\x92\x7f\xac\xa3\x04\xdd\x0d\xa0\x04\xdd\x7d\x90\x12\x74\x37\x41\x77\x03\x78\x3d\x3f\xcb\xb1\x81\x88\x5e\x4a\x31\x0b\x2e\x2d\x7d\x89\xe0\x28\x96\x59\x8f\x9a\xb9\x27\x21\xc0\xcb\x66\x68\x53\x78\x33\xc4\xcc\x61\x7f\x2b\x57\x3e\xd2\x83\xaf\xc3\x84\xda\x31\x62\x69\xcc\xe9\x8e\x6a\xb7\x1e\x8c\x47\x42\xba\x9a\x82\xce\xea\xa4\x12\xf6\xff\x3a\x40\x57\x0f\xc9\x65\xbd\x93\xbe\xb5\x72\x9f\xa4\xea\xaa\x3f\x7c\xeb\x4e\xe8\x16\x08\xaf\x32\xce\xd0\x3d\xf4\x37\x61\x5b\x43\xf0\x95\x27\xef\x21\x64\x6b\x08\xbc\xf2\xb5\xfc\xbd\xe1\x5a\xcf\x00\xb8\x17\x0c\xd1\xba\x03\x9e\x15\xa8\xbd\x36\xa0\x59\x0d\xb8\x2a\x80\xe3\x4e\x58\x56\xe0\x28\xb7\x20\x59\x0d\xa8\x2a\xc2\xcc\x11\x7b\xda\x07\x54\x05\x46\xf9\x7b\x50\xac\x3e\x98\x2a\x80\x6b\x0f\x86\xb5\x0d\xa4\x0a\xd9\x29\xbd\x0b\x44\xe5\x30\x40\x21\x8f\xcb\x01\x80\x6a\x07\x04\x2a\x80\x37\x82\xa7\x22\xc3\x9f\x76\x42\x9f\xc2\xec\xd7\x1d\xb0\xa7\x06\xb8\x14\xb2\xb0\x1d\xe4\xa9\x0f\x5a\x0a\x39\x02\x2d\xdc\x69\x13\xb0\x14\xe4\x02\xc9\x63\x83\x95\x62\x84\x86\x83\xc3\xc2\x81\x96\xaa\x4b\x13\xba\x5e\x4a\xaa\x96\xa2\xf0\x54\x05\x03\x35\xf0\x9e\x71\x56\xd6\xa5\x91\x39\xca\xc8\x6d\xb6\x0a\xcc\x61\x52\x2d\x5a\xd5\x1a\x81\x18\x53\xf6\xd6\x78\x28\x51\x24\xcd\x91\xbb\x39\x62\x58\xd0\x7d\x49\x56\xfe\xa6\xbe\xaa\xb3\x8c\xd2\x9c\xe6\x03\xbf\x26\xfc\x7e\xda\xac\x85\x27\x5f\xdb\x20\x95\x29\x78\x15\x62\x61\x84\xbc\x88\xe6\x42\x96\x44\x23\x8f\xdf\xff\xce\x83\x43\x10\xf6\xed\x51\x70\x6f\xd1\x31\x6f\xc1\x66\x5c\x98\x2f\x2f\xc0\x8f\x17\x6e\x3f\x86\xf9\xef\x76\x63\xdb\xc2\x74\xdc\x2e\x5c\x5b\x18\xc7\x47\xc0\xb4\xed\xc4\xb3\xf5\x91\x5f\x61\x96\x6e\x18\x96\x2d\x12\xe2\x35\x18\xc3\xf6\x38\xf8\xb5\xdd\xd8\x35\x94\x2e\x21\xc6\xc5\x10\xb7\x16\x8e\x3c\x7b\x16\xa6\xc5\x63\xa0\xcd\xb6\x91\x66\x6e\xb1\xc2\xbc\xd8\x2d\xca\x2c\x1e\x4a\x2c\x12\x42\x2c\x06\x3a\x2c\x18\x19\x16\x8e\x0a\x8b\x85\x08\x8b\x81\x06\xdb\xea\x02\x1a\xe1\x04\x41\xd3\xb8\x31\x0a\xbe\x3a\x96\xf7\x38\x0a\xfa\xeb\x71\x97\x2b\x06\xea\x2b\xc2\x7a\x85\xa1\xbd\x1e\x07\xe9\x15\x13\xe5\x15\x63\x89\x82\x62\x74\x8f\x83\xec\xda\x89\xea\x02\xef\xfc\x77\xd8\x74\x77\x4d\xfb\x91\xb5\x00\xa6\x1b\x68\xae\x7e\x54\x2d\x80\x6b\x8b\xe4\x8a\x1b\x51\x0b\x8c\xa6\xc5\x8a\xa4\x45\x8a\xa2\x3d\x12\xf6\x2a\x14\x77\xb5\x1b\x73\x65\x6c\x90\x80\x03\xb1\x85\xb7\xea\x10\x53\x01\x5c\xfb\x3e\x89\x30\xb4\x54\xe0\x86\x32\xce\x34\x23\xc5\x5b\x5a\x90\xf5\x15\xcd\x04\xcf\x3d\xad\x89\x8d\x5e\xd5\x0e\x2d\x30\x07\x65\x99\x7a\xce\xcf\x7a\x82\x86\xb5\x2e\x96\x44\x81\x7f\xec\x12\xba\xc2\x29\x4d\x78\xd4\x19\xa6\x40\x30\xf8\x68\xd6\xc3\x33\x7c\x09\xcf\x2e\x84\x09\xcf\xc2\xe5\x64\x4b\x7e\xc4\x3b\x5e\x7f\x16\xb7\x20\xe6\x9a\x72\x38\x64\xbc\x39\x61\x47\xbe\xde\xa7\xd6\xd9\xd4\xf9\x33\x5b\xa7\xa1\x3f\xcf\x57\x2f\x9b\x81\xb5\x2e\xc7\x20\xc3\xec\x73\x76\x39\xa2\x33\x56\xa9\xe7\xe9\xd1\x76\x83\x7b\x2c\x97\xb6\x63\x3f\xaf\x0b\x2b\xcc\x7c\xfd\x37\xe8\x0c\x77\x0e\xf2\xa1\x4f\xdb\xf3\x58\x00\xbc\x77\x66\xce\x2b\x9c\x79\x2b\x0d\x09\xcf\xc1\x95\x3b\xf3\xe6\xdc\x3f\xf0\x9f\xf5\xd1\x0d\x44\x11\x3f\x16\x82\xf8\x4e\xf4\xb0\xc5\x00\x7b\x72\xdd\x42\x0e\x77\xf8\x5f\x5f\x8e\x43\xd4\x70\x1f\xfb\x1b\x30\xc6\xae\x2b\xb3\x3f\xee\x37\xc5\x08\xfc\xfe\xf6\x4e\x7c\x2f\x86\x0b\x02\x4c\xe2\x0d\x6c\x6f\xac\x34\xf8\x61\x0a\x7c\x28\x46\xfc\xd9\xbc\xf6\x1b\x34\x6e\xa8\x6f\x2c\xbd\xf6\xd3\x6b\xff\x01\x7a\x84\xd7\xbe\x66\x25\x15\xb5\x7e\xb6\x0f\xce\xdb\x25\xcb\x96\x7d\x5b\x90\x95\xde\xaa\x5a\xd4\x7a\xc3\x5e\x73\x43\x8c\x08\x45\x48\xaf\xce\x0d\xf2\x8b\x69\xec\x70\xa8\x86\x57\xbf\x6d\x11\xb2\x40\x14\x10\x78\x7b\x71\xf5\xf3\xbb\xd3\x7f\x3f\x7b\x37\x85\x33\x92\x2d\x83\x58\x33\x0e\x04\x35\x1b\x8a\xb0\x25\x59\x51\x20\x50\x73\xf6\xb7\x9a\xfa\xea\x85\xc3\x76\x7c\x47\x51\x30\xdd\x01\x12\xc8\xe8\x24\x0f\xd9\x30\xd8\xc4\x77\x4c\x69\xb3\x89\xc8\xcb\xd5\x19\x13\x5e\xfe\xc0\xb9\x14\xe5\xa6\x6a\x3b\x33\xcc\xac\xe9\xed\x69\xcd\x2d\xa9\xa4\xb0\x60\x2b\x87\x7c\xb6\x18\x50\x20\x79\x40\x55\x39\x23\x05\xcc\xc5\x31\x8f\x03\x32\x43\x40\xe1\x92\x02\xa7\xda\x5c\xfa\xd6\x95\xe9\x87\xae\xec\x15\xff\x86\x5a\x51\x75\x0c\xb3\x1a\xc1\xa1\x95\x64\x25\x91\xcc\x0b\x82\xd1\x1b\x30\x29\xa6\x70\x21\x9a\xe7\xd1\x1a\x97\xd6\xc7\xdf\x64\xac\x19\x5c\xda\xb7\x1f\xce\xae\xe0\xe2\xc3\x35\x54\x12\xeb\x04\xfb\x22\x2b\x91\x23\x1e\x81\x19\x35\xa3\xb2\xc7\x28\x9f\xc2\x29\x5f\xfb\xee\xbd\x55\x32\x4c\x81\x79\x0f\x51\x6e\xd8\xba\xf0\x54\xee\xed\x7c\x7a\xf1\x72\x8a\xff\x7b\x61\xce\x90\x34\xa6\x5c\x0b\xd7\x0d\x11\x34\x4d\xd2\x88\x35\x0f\xd9\xac\xa0\xdd\x7d\x70\x27\xcb\xc7\x5a\x8a\x26\x5f\xfc\x50\x19\xde\x68\x8c\x0d\x88\xbd\x5b\xd7\x4b\x73\x46\x24\xad\x24\x55\x94\x7b\xbe\x59\x48\x7b\x51\xf1\xc4\xa1\x80\x37\x12\xa6\x08\x4c\x6c\x0b\x7c\xed\x86\xbc\x75\x27\xdd\xc8\x2f\xfd\x2e\x4a\xe8\x83\x77\xf0\xf9\xbe\x66\xf9\xce\xe7\xd7\x3c\x2c\x63\xb7\xd5\x47\xcd\xc5\xaf\x44\x7e\xa0\xe0\xdc\x1f\xf7\xe4\x6e\xfd\x14\xae\x97\x4c\x75\x2f\x1b\x63\x2b\x32\xff\x72\x4f\x78\x16\x6d\x60\xf9\x18\x5e\xc2\x9f\xe0\x13\xfc\x09\x1f\x5f\x7f\xf4\x7d\x23\xc5\x78\xe0\x84\xba\xf6\xac\x1f\xe4\xfc\x32\xca\x89\xf8\x61\x49\x34\xf2\x83\xf3\xcb\x10\x70\xe3\x8c\xf1\x1c\x8f\x02\xfd\xa4\xa9\xe4\xa4\x68\x9e\xe6\x61\x2b\x1d\xf0\x04\x34\x93\x7a\xf6\x17\xc7\x56\xb0\x38\x9f\x7b\x73\x6c\xad\xf4\x63\xd0\x83\xab\xe3\xcd\x11\xaf\xdc\xce\xab\xe3\xcd\xd2\x5e\x39\x38\x9f\xa3\xaf\xed\xc2\x69\x0a\xa6\x7a\xa3\xf7\x5f\xd2\x76\xd6\x25\xd1\xd9\x72\xa8\xd6\xfc\x5d\x21\xef\xcd\x95\xe8\x4a\xef\x43\x2e\xd0\xb7\x1c\x54\x34\xd8\x0c\xf5\xf3\x16\x3c\x21\x90\xbb\xc1\x7d\x3a\x9f\x6f\x9e\x5c\xef\x55\xbd\xcb\x0d\x16\x54\x91\xd8\x3d\x46\x7b\x8d\x35\x2a\x91\xdb\x97\xaf\x37\x4f\xb3\x78\x79\xcf\x3e\x1a\x3c\x80\xfd\x35\x67\xff\xe1\xec\x2a\x3a\x85\x26\x0f\x5a\xd1\x6d\x34\x43\x46\xb8\x4d\xba\x9e\x53\x29\x43\x8e\xbe\x80\xd9\x1a\x91\x6b\x2c\xa3\x81\x97\x20\x40\x27\x54\x52\x68\x91\x09\xef\xa2\x1e\x43\x70\x9f\x63\x86\xcb\x1d\x12\xbe\xea\x22\x9a\xdf\xbd\xbd\x3c\x86\xeb\x37\x97\xc7\x20\x24\x5c\xbd\x09\xc1\xd7\xf4\x3d\x77\x2f\xae\xdf\x5c\xbe\x78\xb2\x45\x87\xe6\x5d\xf8\xda\xab\x4c\xd0\xc0\x8d\x6b\x9e\x9c\x93\x92\x54\x93\x1b\xba\xf6\xb0\xaa\x43\x6d\xfa\x49\x7b\x82\x22\x4c\xc3\x2e\x6c\x49\xaa\x91\xbc\x24\x25\x39\x7b\xa6\x95\x1b\xdc\x0d\xef\xc6\xb8\x59\xc2\xc1\x83\x27\xca\x9f\x52\xac\x68\x6e\x1f\xef\xcd\x67\x50\x9e\x57\x82\xf9\xbd\x58\x53\x25\x88\x87\x29\x55\x82\xd8\x8f\x52\x25\x88\x21\xa5\x4a\x10\x01\x3c\x53\x25\x88\x54\x09\xc2\x52\xaa\x04\x91\x2a\x41\x78\x52\xaa\x04\xf1\xf0\xe0\x52\x25\x88\xcf\x16\xdb\x9a\x2a\x41\x3c\x4c\x09\xe5\x99\x2a\x41\xa4\x4a\x10\x5b\x94\x2a\x41\x3c\xb5\x69\x91\x2a\x41\xa4\x4a\x10\x0d\xa5\x4a\x10\x23\x28\x55\x82\x18\x47\xa9\x12\xc4\x83\xf4\xcc\x72\x43\x52\x25\x88\x94\x1b\xb2\x2f\x9f\xe7\x97\x1b\x02\xa9\x12\x84\x1f\xa5\x4a\x10\xe3\x29\x55\x82\x18\x47\xa9\x12\xc4\x78\x9e\xa9\x12\x44\x47\xa9\x12\x44\xaa\x04\xf1\x99\x1e\xdd\x54\x09\x22\x55\x82\xd8\x4d\x29\x46\x90\x2a\x41\x8c\xa3\x54\x09\xc2\x9f\x69\x7a\xed\xfb\xf3\x79\x7e\xaf\xfd\x54\x09\x22\x55\x82\x78\x90\x42\x4c\x37\x49\x95\xa8\x65\xe6\xa3\x22\x87\xe7\xea\x8d\x28\xab\x5a\x53\xf8\xd8\x30\x6c\xf5\xbe\xc7\x9c\x66\x6b\x9b\x70\xd5\x93\x8e\x4f\x01\x9b\xce\x04\x9f\xb3\x45\x2d\x31\xf9\xfe\xa4\x24\x9c\x2c\xe8\x24\xb3\x13\x9d\xb4\x2b\x37\x69\x47\x79\xf2\x59\x41\xa7\x0b\x56\x32\x9f\x0a\x12\xb0\xb5\xf7\xef\x90\x53\x17\x1f\x0d\x80\xb7\x94\xe4\x13\x3e\x88\x48\x29\x6a\xae\x6d\x9e\x00\xae\xb7\x27\xcf\x76\x97\x6c\x9c\xdb\x3c\x09\xbb\x43\x10\x00\x11\x78\x06\x47\x07\x62\x18\xe7\x5d\x2d\x8d\xcb\x60\x6b\xb9\x22\x5a\x53\xc9\x5f\xc3\x7f\x1c\xfe\xf5\xcb\x5f\x26\x47\x5f\x1d\x1e\xfe\xf8\x72\xf2\x6f\x3f\x7d\x79\xf8\xd7\x29\xfe\xe3\x9f\x8f\xbe\x3a\xfa\xa5\xf9\xe2\xcb\xa3\xa3\xc3\xc3\x1f\xbf\x7d\xff\xcd\xf5\xe5\xd9\x4f\xec\xe8\x97\x1f\x79\x5d\xde\xd8\xaf\x7e\x39\xfc\x91\x9e\xfd\xb4\x27\x93\xa3\xa3\xaf\xbe\xf0\x7e\x1c\x06\x98\x1f\x71\x8c\x8f\x28\xa6\xc7\x23\x18\x1e\x0e\x5d\x12\x45\x3c\x7c\x74\xbc\xe2\x08\x08\xe7\x31\x89\x2f\x20\x1a\x7d\x85\x19\xc4\xcd\x98\xfd\x9d\x90\xa2\x64\x5a\xd3\x1c\x5d\x46\xbd\xf2\x22\xbe\x38\x70\xa6\x07\xcd\xb8\x9d\xc8\xc5\x04\x23\x6f\x08\x34\x53\x7d\x5c\x75\x2f\x53\x56\xe8\x25\x95\xb7\xcc\x3b\x1e\x64\x1e\x48\xbc\xf3\x66\xa0\x10\x9c\xe4\x74\xce\xb8\xb7\x83\x04\x8d\xb8\xd1\xf6\x5b\x12\xc3\x49\x0c\x8f\xe1\xf2\x9c\xc4\xb0\xa2\x59\x2d\x99\x5e\xbf\x11\x5c\xd3\x4f\x1e\x0e\x91\xa1\x14\xbe\x72\xec\x40\xe0\x77\x7c\xf3\x9c\x2a\x91\x37\x59\x6d\xb2\xe6\x98\xba\x1e\x68\x52\xed\x73\x8f\x2b\x51\xb0\x6c\x7d\xd2\x2c\x09\x5e\x58\xfa\x49\x9f\x3c\xda\x1b\x40\x13\x75\xd3\x89\x0f\x3a\x31\x2f\xbf\x4e\x4a\x6c\x8d\xe3\xb3\x32\xfc\xd1\x12\xbe\x94\x6c\xc5\x0a\xba\xa0\x67\x2a\x23\x05\xca\xc7\x18\xba\xfe\xf4\x0e\xde\xfe\xf1\x21\x2d\x45\xa1\xe0\x76\x49\x8d\x4e\x02\x62\xe6\x8e\xae\xb7\x8c\xf8\x32\x5d\x10\xc6\xa1\x34\xc7\xa0\x6a\x06\x6a\x6e\x83\xd1\x58\xde\x0a\xbf\x22\x92\x72\xdd\x0c\xce\x15\x18\x9a\x09\x51\xb8\x14\x3b\x6f\xcc\x75\xbb\x02\x2e\x97\x98\x8b\x9f\x39\xbd\xfd\xd9\x8c\xdc\x77\xac\xf3\x82\x2c\xda\x9a\x65\x8a\xea\x06\xec\x15\x92\x91\x0d\xf6\x54\xda\xc9\x47\x3e\x04\x98\x53\x55\x53\x20\xc5\x2d\x59\xe3\x51\x88\x33\x5e\xa6\x5e\xc3\xab\x23\x14\x63\x44\x41\x3b\xde\x1c\x7e\xe7\x1b\x22\x5f\x12\x05\x6f\x4e\x2f\x7f\xbe\xfa\xcb\xd5\xcf\xa7\x6f\xdf\x9f\x5f\x84\x98\x13\xe6\xf4\x50\xaf\x43\x9e\x91\x8a\xcc\x58\xc1\xfc\xad\x88\x2d\xdc\x65\x9f\x65\x80\x51\x98\xe7\x27\xb9\x14\x95\xdd\x43\x59\x73\x2c\xeb\xd7\xd5\xbf\xf1\xf5\x24\xf7\xbd\x86\xbd\x0a\x81\xe6\x70\xfb\x3a\x23\xe7\x83\x29\xc3\x42\x12\x6e\xac\x79\xf4\x4c\x05\x44\xbb\x1d\x34\x47\xd6\x5c\xb3\xf2\xf3\x4d\xbe\x26\x79\xac\xc4\xeb\xd3\x3c\xa7\x79\x8c\xe3\xf5\x1c\x13\x0f\xde\x34\xd3\x0a\xc9\xb8\x81\xae\x6a\x22\x5c\x7e\xb8\x3a\xff\xdf\x71\x56\x0b\xdc\x8a\x85\x04\xb0\x22\xd4\x6c\x91\xa2\x8a\x74\x92\x3e\xba\xea\x1d\xe9\x2c\xdd\x47\xbf\xd2\xb3\xd4\x5a\x72\x31\x30\x53\x1f\x6b\xde\x93\xd5\xde\x05\x0c\xba\x31\x41\x29\x72\x3a\x85\x4b\x6b\x20\x51\x15\x85\x67\xaf\x6c\x1c\x91\x14\x0c\x63\xae\x19\x29\xbc\x4d\x4d\xfa\xb7\x9a\xad\x48\x41\x6d\x82\x1f\x96\x70\xe8\xd7\x0f\x8c\xa0\x9b\xe7\xa4\x50\x41\x4a\xcf\xdf\x26\x32\xc6\xe9\x7b\x51\xf3\x18\xf8\xa4\x96\x17\xe4\x94\x0b\x1d\xe4\xcf\x34\xf3\xc2\x82\x8f\x52\x64\x60\x7d\x9a\x41\x50\xec\x06\x9b\xd7\x33\xaa\xd0\x80\xf3\x2f\x9a\x0c\xd6\x04\x77\xfb\x78\xd9\xce\xdd\xc6\x7e\x6b\x15\x34\xfd\x2d\x93\x28\x14\xca\x62\xe6\x2f\x29\xc9\xb1\x92\x4f\x45\xf4\xd2\xe2\xf4\x4a\xa2\x6e\xbc\x7d\x8f\xc8\xc6\xbd\xe9\x9c\x97\xd8\x16\xe0\x69\x17\xe3\xda\x5f\xf8\xcd\x29\xd1\xb5\xa4\xf6\x55\x66\x93\x01\x29\x27\xb3\xc2\x17\x59\x1d\x28\x48\xcd\xda\x7d\xe0\xc5\xfa\xa3\x10\xfa\xeb\xb6\xda\x4a\x84\x4b\xf3\x83\x7b\xc1\x0f\x03\xbb\x01\x0f\x2d\x84\xc8\xe5\x13\xdc\x68\x14\x56\xe1\xc5\x61\xdc\x19\x37\xc7\xfd\x09\x45\x95\xac\xf9\xa9\xfa\x46\x8a\xda\xd3\x32\xda\x7a\xbc\x7d\x73\xfe\x16\x25\x7a\xcd\x03\x1e\x2f\x94\x6b\xb9\xc6\x4a\x68\x31\xda\x3e\x40\xdf\x5f\xf0\x9d\x51\x89\x1b\xf7\xdf\x57\x50\xcd\xa1\xe6\x8a\xea\x29\xbc\x27\x6b\x20\x85\x12\x8d\x93\xc3\x5b\xe5\x5e\x22\x22\xbf\xef\x8a\x9d\x02\x56\x16\xf5\x7e\x5c\x32\x0e\x33\xa1\x97\xb0\xc1\x36\xa0\x94\xe8\xf6\x18\xb1\x42\x54\x10\x90\xbe\xeb\xcc\xc1\xf8\xe6\x50\x7d\x25\x3e\xb9\xa1\x0a\x2a\x49\x33\x9a\x53\x9e\x05\xdd\xaf\x48\x88\x99\x3f\xfe\x8b\xef\x0d\xbd\x10\xdc\x08\xc9\x08\x77\xf4\x9c\xe7\x2c\x23\xda\x7a\x21\x75\x14\x07\x03\x62\xf5\x9c\x67\x8b\x60\xf1\x20\x23\x22\x3d\xd9\xd6\x8a\x4a\x8c\x8a\x6a\x59\x53\x7b\xb0\xbe\xad\x67\xb4\xa0\xda\xb7\xd8\x22\x34\x15\xa0\x89\xb6\x95\xcd\x58\x49\x16\x14\x88\x6e\xc4\x80\xbf\x8f\x89\x72\x65\xd4\x29\xae\x24\xd3\x90\x0b\xda\x96\xe4\xf2\x75\x76\x28\xf8\xee\xfc\x2d\xbc\x84\x43\xb3\x86\x47\x68\x4f\xcc\x09\x2b\xfc\x6b\x73\x60\xd6\xc0\x86\xfd\xc3\xe6\xcd\x70\x7d\xb5\xd7\xb9\x93\x7d\x20\xa4\x55\x5f\xc7\xc0\x05\xa8\x3a\x5b\x36\x6b\xed\xef\x83\x6d\xdc\xc5\x2e\x03\x08\x71\x34\x4e\xc0\x7a\x72\x6c\xc5\xf2\x5d\x02\xd6\x77\x6d\x2d\xd3\x5d\x02\xd6\x3b\x3e\x99\xdf\x25\x60\x83\x10\x89\xcf\x5c\xc0\x06\x1a\x30\xdf\x29\x2a\x23\xd9\x2f\xdf\x3d\x73\xfb\xa5\xff\xc4\x35\xb2\xb2\xdb\x59\x7f\x03\xc1\x0a\xc4\x92\x6a\x92\x13\x4d\x9c\x5d\x13\x5a\x43\x74\xdb\x26\x4a\x97\xef\x79\x5e\xbe\xa7\xb4\x6e\x14\x7d\xc7\x78\xfd\xc9\x26\xac\xc4\x0a\x20\x5d\x9d\x21\x53\xc8\xc2\x96\x18\x8f\x2e\xa9\xaa\x82\x61\x45\xc9\x8d\x1c\x8a\x20\xc5\xd9\x6f\x14\x10\x2e\x1c\x9a\xe7\x0c\x2a\x4e\x52\x14\xc2\x18\x78\xe6\xcd\x4a\x78\x2e\x7c\x91\xec\x1b\x8b\x88\xce\x0e\x3a\x68\x93\x37\xc5\x4b\xee\x7b\xd7\x92\x68\xf8\x0c\x44\xc3\x93\x06\xfe\x0a\xba\xa2\xde\x7d\x0d\x36\xbb\x0f\x1a\x5e\xc0\x54\x73\xac\x03\xa2\x07\x38\x2c\x28\xc8\x8c\x16\xd6\xf2\xb7\x22\x22\x42\x3e\x5c\xb0\x70\x89\x12\x26\x93\xa2\x88\x55\xef\xe3\xa3\x28\x30\x19\x86\x44\x58\x76\x33\xac\x5f\xf1\xaa\x23\x8b\x38\xab\x7e\xbd\xae\xa2\xad\x3a\x86\x0c\x7e\xbd\xab\x5e\x7b\x3f\x1c\x60\x73\xd5\xcd\x1b\x24\xd6\xaa\xa3\x61\xff\xeb\x5c\x75\x45\xb3\x4c\x94\xd5\xa5\x14\x73\xe6\x2b\x67\xb6\x0c\x3e\xc7\xb4\x81\x9b\xfa\x1b\x7c\xb5\xa2\xbb\x12\xc2\x02\x0c\x91\xc1\xc0\x30\x78\x5a\x49\xb1\x62\xb9\xf7\x7b\x8d\x68\x6b\xd7\x34\x09\xd4\xff\x23\xd8\x7c\x44\x85\xb6\x61\x89\x06\x2e\xa5\x58\x51\x29\x9b\x4e\x02\x66\x94\x8e\xdd\x67\x5a\x3a\xd8\x1b\x6f\x10\xc1\x08\x12\x19\x29\xb0\xf1\x5f\xc8\x8d\x81\xcd\x5b\xb3\xc9\x36\x40\xb4\xb0\xd6\xa3\x8c\x80\x59\xc3\x0d\xc2\xf2\x2f\xa0\x69\xa8\x8d\xbc\x1c\x2e\x80\x8b\x9c\x3a\x34\x78\x00\x5b\x57\xfe\xd4\xc6\xa9\x9b\xd1\x86\xa7\xc1\x1b\x6b\xbb\xc1\x6f\xe7\x6e\xc4\x01\x1c\x71\xae\x5a\xb8\xfe\x08\xef\x83\x1b\x20\xda\xcd\xa7\x3c\x67\x7c\x81\x11\xe6\x63\x90\xb4\x20\x01\x05\x7a\xa0\xd3\x29\x37\xd6\x3d\x7f\x80\x12\xd3\x2d\x41\x00\xd7\x46\x64\x36\x9b\x83\xaf\x59\x26\x78\x48\x49\x01\x5c\x41\x0c\xde\x36\x2f\xce\x79\x28\x86\x88\x29\x78\xf1\xae\xb9\x44\xde\x9d\xc8\x9e\x9b\xe9\xf8\x02\xed\xbd\xf6\x46\x07\xac\x8f\x45\x6c\xdc\x30\x9e\xbb\xfc\xff\xfe\xa6\x86\xf0\x6d\xfa\x5f\x5b\xbf\xcc\x14\xbe\xc7\xe6\x9e\x61\xea\xca\x10\x91\xf4\x35\xfc\x95\x43\xbb\xa9\x30\xe9\x04\x5a\xd0\xcd\x43\x51\xb8\x25\xd0\x42\xc5\x43\xd7\xee\xc9\x0a\xb4\x8f\xd6\x09\x14\x56\x23\x0d\xac\xba\xdb\x05\x96\x09\x5b\x02\x84\x3a\x34\x57\xba\x1d\x7a\x98\x89\x9c\x4f\xe1\x3b\x8e\x32\xc7\xac\xef\x04\xb8\x88\xb0\x5d\xdd\xb2\x36\x27\xec\xc5\x53\xdd\xed\x5b\xc6\x73\x71\xab\xe2\xfa\x46\x7f\xb0\x4c\x1b\xc7\x93\x6f\xc5\x27\x45\xb5\x66\x7c\xa1\xfa\xfe\x51\x52\x14\x11\xf0\xf5\xbb\x1c\xa4\x61\xb7\xbb\xed\x8f\xbf\xed\xc0\x0b\x8c\x50\xda\x43\x68\xf1\x19\x8d\xc3\xd1\xd7\xdd\xba\x8d\xcf\xd8\xe5\x70\x0c\x80\xbf\x25\x87\xe3\x43\xb4\x28\x15\x79\x23\xcd\x24\x34\x23\xc5\x55\xe5\xdb\xee\x0f\x36\x2f\xde\x37\xef\xaf\x4e\x87\x8c\xc3\x2c\x8f\xdb\x25\x95\xf6\x6d\x65\x38\x03\xc9\x4b\xa6\x94\x7f\xc0\xdd\xd0\x2d\x9d\x2d\x85\xb8\x81\xc3\x26\x51\x71\xc1\xf4\xb2\x9e\x4d\x33\x51\xf6\x72\x16\x27\x8a\x2d\xd4\x89\x13\x4c\x13\xb3\x5e\xbe\xe9\x4b\x38\x13\x5e\x30\xee\xe0\x8d\x18\x66\xe0\x5a\x81\xf0\xef\x1c\x0e\xdd\x92\x64\xed\x6a\xe3\x89\x0f\x51\xb6\xd8\xe3\xd8\xe6\xe2\xec\xd8\xc8\x8b\xb0\x52\x5f\x58\x1c\xfe\x49\xad\xc7\xed\x43\x7f\x11\xd4\x7b\xe0\x81\x83\x1f\xb8\x5e\xb6\x67\xa2\xad\x4b\xe7\x42\xeb\xe6\x33\x02\x38\x6e\x9c\x14\xe7\x05\x7a\x5a\x0f\x7c\x83\x69\x88\xb8\x13\x88\x6d\x70\x2c\xc3\x9e\xe5\x8d\x05\xd1\xa1\x24\x7a\x78\x87\x00\xd6\x9b\x48\x89\x16\xf3\x10\xc0\x73\x33\x59\x2f\x0a\x62\x02\x1e\x11\x35\x01\x7b\x23\x27\x02\x3e\x60\x68\xb0\x44\xb2\x02\xe0\xee\x28\x69\xa0\x40\x7f\x34\xc3\x05\xa2\x19\x2f\x10\x76\xf1\x5d\x65\xdf\x28\xdd\xaf\xaf\x7a\xbc\x82\x5e\xf2\x0d\x3e\xd4\xec\xa8\xad\xef\xde\x56\x4d\x2e\xd6\x4d\x8d\x7a\xf6\xdf\x7e\x67\xdd\x1c\xc1\xce\xc6\xe7\xc2\x96\x81\xe9\x15\x7d\xf7\xe0\xe9\xda\xdf\xe6\x60\x1e\xac\x45\xe3\xc4\x2f\xab\xc2\x58\x2e\x83\xd1\x7b\x8e\x18\x39\xf6\x1a\x6c\x1f\xb7\xcb\x13\xd2\x07\xdc\x95\xcd\x3f\x86\xff\xaa\x95\x06\xd2\x66\xdf\x37\xb5\x9f\x71\x27\x3d\x98\x37\x65\xa9\x31\x95\x24\x23\xbc\x6d\xfd\xa4\x45\x13\x83\xf0\xe0\x9a\xb3\xf9\x9c\x36\xf5\x07\x66\x14\x2a\x22\x49\x49\x35\x66\x86\xf9\xc2\x89\x67\x74\xc1\x6c\x7a\xb6\x98\x03\x31\x0b\x7a\x70\xa0\xba\x82\xc2\x3e\xf2\x03\x93\xbe\x99\x86\x92\x2d\x96\x1a\x2f\x39\x10\x28\x04\x5f\x60\xd9\x48\x3f\x34\x6d\x21\x48\x0e\x28\xeb\x85\x84\x5b\x22\x4b\x20\x90\x91\x6c\x89\x30\x65\x2f\xf0\x62\x5e\x4b\xec\xdc\xad\x29\xc9\xd7\x13\xa5\x89\x36\x6f\x5d\x6a\x4b\x08\xd9\x9d\xf3\xe0\x9a\x6d\x95\x2f\xb4\x67\x00\x83\x93\x33\xaa\x7d\xfc\xc8\x4d\xe6\x90\x4b\x17\x6a\xec\xe1\xbe\xb0\x09\xe0\x3a\x2f\xc8\xe2\xb9\xd5\xcb\x4c\x8d\xe6\x1d\xa5\x46\xf3\xfb\x52\x6a\x34\xbf\x37\xa5\x46\xf3\xa9\xd1\x7c\x6a\x34\x9f\x1a\xcd\xa7\x46\xf3\x1b\x94\x1a\xcd\xa7\x46\xf3\xf7\x50\x6a\x34\xff\x30\xc3\xa7\x46\x8b\xfd\x3a\x9a\xc8\xa4\x46\xf3\xa9\xd1\xfc\x80\x52\xa3\xf9\xa7\x36\x2d\x52\xa3\xf9\xd4\x68\xbe\xa1\xd4\x68\x7e\x04\xa5\x46\xf3\xe3\x28\x35\x9a\x7f\x90\x9e\x59\xeb\xb9\xd4\x68\x3e\xb5\x9e\xdb\x97\xcf\xf3\x6b\x3d\x07\xa9\xd1\xbc\x1f\xa5\x46\xf3\xe3\x29\x35\x9a\x1f\x47\xa9\xd1\xfc\x78\x9e\xa9\xd1\x7c\x47\xa9\xd1\x7c\x6a\x34\xff\x99\x1e\xdd\xd4\x68\x3e\x35\x9a\xdf\x4d\x29\x46\x90\x1a\xcd\x8f\xa3\xd4\x68\xde\x9f\x69\x7a\xed\xfb\xf3\x79\x7e\xaf\xfd\xd4\x68\x3e\x35\x9a\x7f\x90\x42\x4c\x37\xa5\x73\xe6\xd1\x61\xf0\x71\x5a\x08\x38\xb4\x6c\xaf\x2c\xe3\xac\x9e\xcf\xa9\x44\xb3\x1b\x47\xea\xe5\xb8\xd9\x9d\xa4\x3f\x6d\xd2\x14\x7c\x78\x5a\xc3\x4f\x51\x7d\x8c\xdd\x0e\x94\x4d\x9c\xc6\x21\xfa\x01\x1e\x87\x43\x74\xd5\x29\xb1\xaf\x9e\xa4\xca\xef\x7d\xcd\x38\x9c\x7d\xf8\x7a\x1a\xa1\x7b\x42\x48\xe1\x61\x5c\x93\x0f\x3c\x0b\x4d\xd6\xe9\x0e\x59\x58\x11\xd0\xa6\x00\xa8\x3b\x6b\x59\x21\x94\xc5\xd6\xda\xcd\xcb\x96\x84\x73\xea\x93\xa0\x62\x05\x22\xd3\xe8\x76\x9b\x51\xca\x41\x54\x94\x5b\xfc\x3f\x01\xc5\xf8\xc2\xab\xd8\x02\xd1\x9a\x64\xcb\xa9\x99\x3f\x6f\x0e\x98\x6b\xbc\xd8\x8e\xda\xe7\xaa\x69\x49\x49\x69\x0f\x9a\xa4\x25\x61\x76\xb8\x40\x32\x29\x94\x82\xb2\x2e\x34\xab\x02\x06\x0c\x8a\x62\x9a\xb5\xb2\x39\xff\xcd\x21\x00\xaf\xeb\xa6\xa8\x05\x7b\x62\x99\xfb\x76\x0d\xdc\xf2\x7a\x99\x60\xdd\x55\xc3\x07\xfc\x31\xf6\xdc\x2e\x2b\xbd\xb6\x09\x51\x9e\x17\x78\xce\xa4\xd2\x90\x15\x0c\x5f\x70\xb8\x0e\x14\x35\x19\x8e\xd9\x07\x01\x4c\x78\x6e\x38\x73\xb7\x47\xca\x6d\x12\xcf\xd1\x00\xad\xbc\x0c\x7e\x4c\xcb\x69\xf2\xbe\x68\x33\xdc\x9c\x29\xf7\xa0\x50\x5e\x03\x6d\x1a\x0f\xd9\xcb\xd5\xec\x11\x5e\xaf\xdc\xb3\x83\x46\x33\x67\xc7\xa4\x37\xe4\x80\xfb\x8f\xbd\x82\x9c\x57\xbc\x55\x01\xb6\xcb\x4f\x23\x20\xbd\xe6\xbf\x9d\x8c\xdb\xf4\x8d\x40\x05\xe1\xc1\xb2\xa7\x52\xf0\x9a\x72\xba\x32\xda\x8b\x66\x94\xad\x8c\x11\xee\xc1\x72\xa7\x3e\xf8\xbb\xaa\x03\x4d\x65\xc9\x38\x26\x6d\xbd\xa7\x4a\x91\x05\xbd\xf4\x8a\x7e\xdf\xf5\xb6\xc6\x00\x78\x73\x18\xbd\xaf\x71\x61\x4b\x8a\xb5\xc6\x6d\x97\x82\x70\xe0\x95\x1e\xda\x4d\x1a\x4a\x3b\xeb\xb6\x2e\xca\xad\x64\x5a\x53\x2f\xc3\x46\xd9\xc6\x64\x08\x1c\xda\x2c\x5a\xe9\x37\xd0\x5e\x7a\x05\xbc\x6f\x06\x6a\x07\x68\x3e\xce\x18\xa9\xdc\xaf\x1c\xa3\x45\x39\xcd\x24\xa3\x73\x98\x33\xcc\x62\x40\xbc\xfd\xb1\x6d\x84\x41\x7c\x46\x4b\x38\x10\xa5\xa8\xc4\x75\x75\x78\xeb\x66\x7d\xa7\xf0\x83\x77\x9e\xa9\x96\x35\xcf\x48\xd7\x56\xd6\x16\x91\x62\x73\x58\x20\xb2\xdf\x47\xea\x60\x1b\xeb\x7f\x79\xf9\x6f\x7f\x84\xd9\xda\x3c\x34\x10\xcb\xa2\x85\x26\x45\x33\x60\x0f\xa6\x05\xe5\x0b\x73\xda\xad\xca\x1e\x96\x14\x0a\x48\xb3\x2d\x58\xc9\xb4\xcd\x7d\x7d\xf5\xbb\x9b\xd9\xe0\x4d\xe6\xc1\xf1\x24\xa7\xab\x93\xde\x0d\x98\x14\x62\x31\x85\x37\x4d\xe2\xa5\x07\xc7\x26\x55\xd3\x37\x51\xd1\xeb\x99\xbf\x43\x70\x61\xf3\xfb\x40\xd1\xd5\xf4\x18\x82\xa5\xb8\xb5\x8d\x07\xbb\xcf\xf1\x58\x9a\x46\xba\x74\x79\x87\x95\xa8\xea\xc2\x66\xb6\x7e\xed\x57\xee\x0b\x25\x55\xad\xe8\x66\xed\x99\x3b\x64\xb9\x9f\x70\x68\x86\xb9\xf1\x10\xb2\x42\x22\x60\x21\x84\x2b\xdc\xe0\xa2\x4b\x6d\x93\xa0\x5a\x7a\x65\x3e\x7e\x4d\x8a\x62\x46\xb2\x9b\x6b\xf1\x4e\x2c\xd4\x07\x7e\x26\xa5\x90\x83\x15\xf2\xb9\xc7\xc4\x58\x8d\xcb\x9a\xdf\x60\x7f\xeb\x76\xf2\x85\x58\x80\xa8\x75\x55\x7b\xbd\xfe\xe6\x9b\xc7\xa9\x5d\x13\xcf\xb2\x6f\xad\x89\xec\x8c\xd2\xde\x48\xe9\x27\xe6\x17\xfa\xb8\x65\x46\x80\x71\xa0\x66\x1d\xad\x54\xec\x66\xed\xf7\x58\xe8\x89\xaf\xdf\xbd\xfc\x97\x7f\xb5\x02\x17\x84\x84\x7f\x7d\x89\x49\x99\x5e\xe6\x2d\x9a\x02\x68\x7f\x31\x05\xaa\x24\x45\x41\x65\xa8\x60\x34\xd7\xb1\x27\x08\x5b\xb1\xf6\x77\x95\x6a\x3a\x54\x80\x3d\xa2\xf3\xe7\xfa\xfa\x2f\xe8\xf9\x61\x5a\xd1\x62\xee\x65\x95\x17\x4a\x74\xad\x41\x0f\xd0\x98\x3e\x70\xb6\x88\x79\x4d\xfa\x88\x80\xa7\x75\xa7\xac\x44\x51\x97\xf4\x2d\x5d\xb1\xcc\x27\xac\x35\xd8\xba\x01\x2f\xff\xcc\xe7\x82\x29\xec\xdd\x34\x2b\x44\x76\x03\xb9\x63\xd7\xc1\xda\x7d\xac\x90\x75\x68\x09\xf6\x90\x24\x04\xef\xe4\x83\x3b\x57\xb7\x4b\x1d\xf0\x72\xf0\x12\x28\x49\x55\xb5\x45\x3f\x24\xb9\x1d\x2c\xb6\x17\x4f\x23\x79\xb1\xce\x6a\x50\x9d\xfb\xc0\xe0\x70\x48\x68\x78\xe2\x66\xef\x69\x73\x78\xe7\x25\x84\x46\x95\xbb\x51\xfb\x06\xbe\x06\xc7\xac\x63\x17\x5a\xbb\xa0\x42\x1e\x36\x69\x3d\x52\x2b\xb6\x5e\x65\x24\x3b\xce\xf6\xd9\x6b\x0e\x74\x40\x55\x31\x2d\x7c\x83\x8e\xc1\x91\xbe\x90\x2c\x90\xc1\xce\xf1\x36\xa6\x5a\x12\xed\xe5\xac\xb0\xd4\x2f\xf2\x47\xa0\xa2\x52\x31\x65\x6c\xf4\xef\x51\x00\xbd\x29\x08\xf3\x0d\x9c\xb5\xc1\x93\x4a\xf8\x6e\x55\xc0\x72\x5b\x01\x8a\x7d\xbc\x43\x35\xdd\xa5\xc8\x1d\x3b\x54\x4c\xe8\x36\xf1\x8a\xa8\x6c\xb9\x59\x42\x4b\x52\x44\x33\xff\x9e\x52\xd5\x7d\xdf\xed\x54\xb8\xa6\x33\x5c\x5a\x55\x67\x39\x3b\x65\xe5\xc9\xf1\xf3\x55\x70\xb8\x16\x9f\x9b\x7e\x6b\x07\x1d\x45\x48\xa2\x62\x73\xb6\x4a\x88\x72\xeb\xde\xaa\x5d\xa4\x62\x49\x9d\x50\xf0\xe6\xda\xb9\x59\x9c\x27\x76\xea\xc0\xa2\xdc\xbb\xa9\x73\x3b\x54\x38\x78\x7d\xf0\x64\x4a\xce\x6e\xa2\x14\x15\x59\xa0\xef\x20\xca\x5e\x6e\x32\x0d\x40\x78\x59\xb7\x06\x55\xe8\x36\x43\xbe\xbe\x95\x10\x2d\x55\x6e\x54\x34\xef\x4a\xa0\x63\x63\x83\x80\xf4\xfb\xde\x91\x73\x0e\x13\x5b\xb8\xf1\x36\x20\x2f\x9a\x48\x51\xf3\xdc\x45\x83\x5b\x08\xc2\xfb\x8d\x85\xbd\xf0\xaf\x60\x86\x6e\x9e\xa6\xed\x8b\x79\xe2\x62\xa2\x24\x53\xbe\xc5\xf0\x1c\x4f\x0e\xaf\xa6\xaf\x5e\x7e\xfe\x36\x1b\xae\x49\x24\x9b\xed\xa2\xb5\xd9\xac\x96\x7b\xb2\xd5\x91\x94\xe4\x1f\x78\xe1\xe1\x09\xb2\x34\xcc\x37\x70\x21\x29\xc3\x74\x22\x78\x40\xad\x09\xd6\x34\xb6\x47\x56\xb7\x92\x69\x77\x83\x6e\x59\x40\xa2\xda\x21\x3a\x6d\x40\xc8\x7e\x09\xe2\xa3\xce\x97\x17\xf0\x24\xf1\xf5\x07\xb9\xbf\x0f\xec\xee\x0d\xa0\xea\xd9\xb3\xd3\xbb\x56\xc1\x5a\xa1\xba\x2b\x9e\xea\xbf\xde\x8e\xf3\xb6\x0a\xf6\xe6\xd8\xc7\x1e\xbe\x78\x01\x87\xf6\x13\x0e\x6c\x35\xbb\xa3\x27\xbb\x9e\x6e\x5b\xcf\x3e\x55\xde\xfd\x17\x07\x5b\x7b\xf6\xa9\x22\x3c\xa7\xb9\x7d\xf0\x07\x98\xd6\xd0\x14\x9d\xde\xb5\xc7\xe1\x6a\xf3\x40\x0d\xf7\xd8\x9b\x63\xdf\x3c\xfb\x77\xba\x24\x2b\x8a\x35\xff\x58\x41\x64\x80\x78\xd2\x02\xae\xec\xce\xc0\xac\xd6\x40\xf9\x8a\x49\xc1\x4b\x1a\x50\xd8\x7d\x45\x24\x23\xb3\x82\x82\xa4\x58\x38\x38\xa3\x0a\xbe\x38\xfc\xfe\xf4\x23\xc2\xac\xfd\xdb\x47\x10\x49\x81\x36\xbb\x5e\x2b\x4c\xcf\x8d\x74\x0b\x7b\xd3\x9e\x6e\x5c\x20\x7f\x11\xbd\x71\xf1\x9a\x75\x36\x37\xc0\x7f\x0d\x78\xde\xee\x97\x59\x8f\xb2\xd6\x35\x29\xb0\xec\x63\x56\xd4\x8a\xad\x9e\x42\xff\xba\x32\x9c\x6f\x99\xc7\xcd\xde\x28\x5f\xda\x5d\x9a\xad\xda\x9e\x9e\x25\xbc\xd1\xbc\x8c\xd7\x7d\xdd\x01\x2f\x0f\x54\xdb\xe3\xaa\xdf\x1a\xc8\x3b\x28\xe7\xca\x56\xcf\x68\xaf\xa5\x1e\x78\x2b\xad\xce\x66\xc7\x96\x05\x4f\x17\x9e\xcb\xb9\x7a\x83\xf3\x19\x73\x30\x86\x79\xfd\x83\x52\xc1\x6f\x2f\xae\x7a\xf5\xc7\x47\xcd\xc1\xba\x15\x45\x3e\x85\xcb\xae\x80\x79\xd7\x62\x00\xfb\xeb\x8c\x46\x9b\x18\x99\x4c\xe5\xc2\xc6\x69\xcd\x00\x17\x94\x53\x89\x0f\x30\x33\xd4\x66\x2f\xc7\xbf\x13\x67\x44\xd9\xb6\x92\x6f\x2f\xae\x2c\x42\x63\xcc\x8e\x79\xba\x7b\x7c\x7d\x26\xe6\x5d\x62\xab\xab\x8c\x76\xb6\x0c\xf6\xfa\xb4\x0d\xc2\x99\xc5\x43\x67\xb0\x65\x3b\xfa\xb0\x9e\x5f\x02\xc9\x73\x89\xf0\x45\xf7\x04\xec\xb5\x11\xf4\x43\x7f\xb9\x1d\x36\x3b\xd3\x9f\x71\xb7\xe5\xa3\x39\xa2\xa9\xd1\x6d\x30\xbc\xad\xab\x82\x59\xc8\x56\xef\x03\x46\xb3\x6d\x66\x2a\x69\x29\x56\xe3\xaf\xba\xbf\x23\xd6\xd3\x0d\xeb\xad\x79\x84\x5f\x9f\xbc\x7b\xce\x9c\xa4\x4a\x14\x3e\x07\xae\xe9\x76\x3c\x3c\x6b\x4e\x36\x18\xe3\x74\xfc\xaa\x34\x67\xad\xe9\x24\xdd\x89\x96\x8d\x73\x33\x9a\x75\xef\x9c\x51\xae\xa5\x11\xae\x81\x67\x06\xe0\xa3\x59\xb9\x1a\x01\x3a\xed\x80\xd9\x8a\x72\xa3\xc4\x3e\x78\x36\xf3\xc3\x41\xf5\x1a\x4b\xdb\x1c\x07\xdb\x1d\x9d\x12\xe9\x93\xa2\xd2\xae\xaa\xf7\xf2\xfd\xdd\xaf\xc7\x66\x08\xe8\xed\xc5\x95\xd5\xa9\x76\x59\x5d\xbb\x51\x1f\xdb\xb7\x7f\xe2\xdb\x5d\x6b\xf5\xa4\xe7\x3d\x7e\x92\xfe\x09\xfe\x9e\xb1\xc1\xea\x7e\x74\x71\x8e\x90\xea\x05\xde\x4f\xe4\x80\x4a\x73\xde\x9f\xac\x28\x91\xd9\x72\xfc\x9a\xdf\x23\x42\x2d\x4b\xc8\x05\x66\x3d\x8c\xd7\x89\x42\xa2\xcb\x7a\x82\xea\xbf\x10\xe2\xa6\xae\x86\x52\x75\x34\xcb\x46\xe3\x0f\x34\xb8\x1b\x66\x45\xf4\x72\xfc\x20\xef\x14\xc5\x3d\xd1\x3a\x9a\x69\x7f\x44\xff\x18\x3a\x3c\xe7\x6a\x3c\xfa\x78\xf8\x3a\xa0\xda\xbe\x09\x90\x4d\x57\xd1\x65\xac\xf8\x1a\x3c\xf9\xdf\x14\xb5\xd2\x54\x7e\xcd\xa4\xd2\x2f\x9a\x76\xd3\x78\x3b\xc7\x9d\x14\xf3\x3e\x3f\xe8\x33\xfb\x81\xe9\xe5\x9f\x85\xd2\x17\x54\x1f\x1c\x0f\x7f\x74\x30\xee\xe5\x78\xe0\x06\x7c\x00\x42\xc2\xc1\x85\xe0\xf4\x60\xba\xf1\x38\xb2\xea\x77\x14\x57\x86\xcf\x0d\xab\x5c\x76\xd9\x30\x6e\x6d\xcd\x52\x8f\x94\x32\x05\xcd\x74\xc3\xa4\x77\x5b\xae\x05\x2c\xc9\xca\x3e\xeb\x7c\x3a\xfe\x2a\xaa\x81\x60\x8f\x27\xe4\xbc\xb4\x6b\x7b\x2b\xe4\x8d\x6d\xd8\x80\xcc\x47\xc6\xbe\xec\x93\x70\xdd\x3f\x56\xbd\xae\x0d\x5a\xdc\xbd\xa5\xe3\x5f\x68\x23\xef\x8b\x6d\xc5\x74\x45\xe5\x8a\x65\xf4\x1d\xe3\x37\xa3\x2e\xea\x30\xd7\xe8\x6c\x8b\x97\x67\xeb\xb8\x5b\x87\x9c\x65\xdc\x26\x70\x1b\x93\x84\xcc\x44\xad\xf1\xed\x86\x20\x4a\x0f\xc7\x27\xd6\x7f\xf8\x2f\x7b\x6a\x10\xaf\x52\xd9\x16\x61\x3d\x47\x5d\xeb\x67\x1c\x09\x85\xc6\x90\x57\xe3\x3c\x54\x6b\xae\xc9\x27\xd4\x5d\x22\xbb\xa1\x12\x0a\xb3\x14\x53\x68\x53\xb1\xbc\xc5\x08\x02\x73\xc7\xe4\x76\xf8\x45\x4e\x68\xb5\xa4\x25\x95\xa4\x68\x7d\x67\xfe\x87\xe2\x9d\x53\xe3\x2d\xcf\x5e\x26\xce\xa8\x75\xb0\x7d\x63\x5c\xf7\x3c\x91\x4f\xe1\x2c\x94\x63\x49\xd6\xa8\x0e\x2d\x63\xc2\x81\x7e\x62\x0a\x01\x36\x95\xc8\x7b\x35\xdd\x46\x31\xad\x15\x95\x93\xb6\x02\xa0\xab\xb0\xa4\x9a\x54\x2e\xc8\xe9\xac\x5e\x2c\x18\x5f\x8c\xd3\x25\x68\xab\xa0\x45\xd4\xb5\x65\xeb\xfc\x4c\xd8\xa6\x2e\x93\x94\xe8\xb1\xb6\x1a\x5a\xe5\xc7\xe8\x01\x66\x7d\xde\xa5\xc8\x2d\xeb\xd9\xda\x7a\xf7\xc6\x32\x6e\xea\xe5\x98\x41\x4e\xe1\x9c\x83\x90\x39\x95\x58\x1e\x26\xcf\x71\xad\x9b\xdd\x1b\xc5\xb6\x73\x42\x1a\x4e\xc3\x1d\x3b\xf6\xca\x33\x31\x32\x40\x75\xa3\xe9\xa5\x89\xa9\x7a\x66\x1e\x32\xb5\x1c\xdb\xce\x73\x88\x0e\x20\x45\xb5\x24\x93\x82\xae\x68\x01\xae\xab\xd2\xe8\xd8\xef\x52\x70\x21\xed\x6e\x34\x1e\x22\x7c\xb3\x5a\xe1\x8d\x8b\x7d\xb6\x7d\x67\x47\x7d\x84\x6b\xa2\x37\x5e\xdf\x8c\x35\x08\x3d\x8c\xc1\xe1\xcb\x80\xef\x98\xeb\xf8\x7c\x98\x7e\x56\x32\xae\xa5\x93\x06\x24\x47\xab\x9e\x96\x95\x90\x44\xb2\xd1\x51\xb0\xed\x73\x89\x16\xe4\x50\x2c\x8c\x1d\x6b\xa6\xd9\x8a\x99\x77\xec\x0e\x39\xd2\xad\xc6\x48\xae\xbd\xa3\x8e\x36\x0d\x17\xd0\x9c\x77\x63\x01\xaa\x6c\x49\xf3\xba\x18\xff\xee\x5c\xd4\x44\x12\xae\x29\x55\xc7\x0d\xbc\x67\xed\xd2\xb4\xad\x70\x69\x93\xcc\xc7\x86\x84\x8c\x98\x43\x6e\xf4\x13\xd3\xd8\x3e\xd3\x7c\x07\x65\x98\x4d\x5e\xc7\x77\xcd\x48\xae\x42\x6e\x64\xbd\xf7\x85\x93\x77\x58\x27\x23\xb5\xc2\x6e\x08\x4e\x95\xd0\x4f\x19\x35\x66\x87\x56\xed\x22\x8f\x3d\x04\x36\xfb\x87\x09\x7e\xdc\x4a\x57\x77\x66\xe9\x8a\x65\x1e\xf1\x97\x5d\x0a\x14\x59\xba\x7d\xc2\xab\x30\x92\xe7\x6c\xed\x82\x6b\x45\xa7\x38\x36\x94\xc1\xf5\x92\x8e\xbd\x54\x6d\x79\x2d\xbc\x9c\x2b\x46\x1a\x96\xbb\x45\xf7\x48\xee\x3d\x41\xbf\x79\x62\x7d\x9d\x82\xfd\x19\x83\xe0\x99\x1b\x7a\xaf\x85\xea\x58\x8e\xa8\x46\xee\x6a\xa0\x1a\x2a\xfc\x37\x7a\xa8\x8e\xd3\xf4\xbe\x1e\x3a\x3f\x00\xb0\x07\x78\xd7\xdf\x0d\x48\xe4\x22\xd4\xb9\x7a\x70\x2a\x17\x75\x89\x79\xc1\xce\x55\xd4\xb5\xb9\xf7\x71\x09\x5e\x2f\x29\xe4\xf6\x59\x81\x71\x58\xf3\x80\x79\xf3\xfe\x6d\x83\x4d\xf4\xe0\xc8\x5c\xa1\x0f\x57\xb9\xc9\x35\x75\xce\xa7\xf0\xbd\x7b\x0b\xf9\x44\xb4\x77\xa2\x34\x06\x68\x0b\x0f\xae\xbb\xf0\x19\xc3\xf7\x9b\x67\x3c\x9f\x74\xf8\x92\xce\x06\x76\x5e\x6c\xaf\xf8\xbb\xed\x42\xe4\xd6\xa0\x49\x15\x61\xbc\x32\x2f\x58\x5f\x5f\x6e\x8b\x09\xe0\xd9\x92\xf0\x85\x95\x26\x34\x10\x05\xe3\xde\xaa\xae\xb1\x37\x55\x19\xa9\x1a\x9f\x0a\x81\x5c\xd4\x7e\xdb\xff\xc5\x17\xc7\xc0\xe8\x6b\xf8\xa2\x37\xb8\x29\x9c\x39\xee\xdd\xe1\xf0\x5d\x05\x5b\xef\x65\xd6\x1d\xa6\x63\x90\x74\x41\x64\x5e\xf8\xb5\xf6\x10\xf3\xd6\xe5\x80\xa8\xad\xe6\x30\xa0\x19\xa7\x40\xf8\x80\x3a\xb8\xd0\xbb\x30\x12\xbd\x32\x7b\x1e\x4c\xef\x29\xcc\xa7\x89\xba\x51\x27\xd6\xc1\x31\xc9\x89\x26\x13\x52\x59\xbf\x31\x13\xfc\xc4\x06\x74\x26\xae\xb5\xeb\x84\x38\xa1\x34\x69\x2f\xd2\xc9\x6f\x65\x8d\xdd\xd3\x27\xa4\xfd\x2d\xc6\x27\x64\x82\x8d\x40\x7d\xeb\x49\xfc\x9d\x53\x6f\x02\xa2\x25\xde\x3d\x93\x37\x5d\x60\x8d\x70\xb7\x73\x9f\xc2\x85\x57\xbe\x83\xeb\x8d\x9c\x77\xc9\xa8\xae\x21\x6b\x27\xff\x7d\x44\x7d\xa3\x31\xce\x2e\xae\x3f\xfe\xe5\xf2\xc3\xf9\xc5\x75\xa3\x38\x1a\x35\xe0\xc3\xf5\x2e\xc5\x11\x76\xd3\xef\x52\x1c\x9d\x1a\x08\x41\x31\x6d\x2a\x8e\xa1\x1a\xf0\xe1\xbc\xad\x38\x86\x6a\xc0\x67\x65\xb7\x15\xc7\x0e\x35\xe0\x69\x45\xf4\xd7\x77\xa7\x1a\xf0\x92\xce\x3d\xc5\xb1\x5b\x0d\x78\x70\xdd\x56\x1c\x43\x35\xe0\x75\xbf\xb6\x15\x47\x4f\x0d\x78\xaa\xfc\x6d\xc5\xd1\x57\x03\x1e\x4c\x77\x2b\x8e\xa4\x06\xf6\xf9\x50\x2f\x35\x40\xf9\x2a\x50\x05\xb4\x0e\xef\x5d\x51\x05\x9f\xc9\x0c\x5a\x5b\xf6\x8a\x62\xc7\x38\x54\x9f\xc7\x7e\x0e\x31\xfa\x7c\xf5\x3d\x91\x20\x69\x25\xa9\xc2\x77\x95\x67\x4e\xc8\xae\x0d\x02\xc7\xd4\xb7\x35\x3f\xe9\xe0\xc6\x9f\x5d\x4a\xed\x13\x25\xc5\x46\x4b\x40\x6b\x92\xc6\xec\x1b\x3b\x5e\xca\xc1\xb4\x6d\x72\x42\xe0\xcd\xcf\xe7\x6f\xcf\x2e\xae\xcf\xbf\x3e\x3f\xfb\xf8\x64\x59\x2f\x41\xed\x23\x87\xe6\x6a\x1c\x4b\xcd\xd2\xfd\xf6\x9a\x37\x5b\x5b\x41\x9d\xae\x98\xa8\x95\xc3\xa5\xe5\x51\xf7\x57\x6d\xc9\x56\x6f\x96\x58\x7d\x96\xaf\x9b\x28\x75\xdc\x61\x4e\x77\x7a\x2a\xbc\xf9\x46\x35\x54\x2d\xdd\x63\xae\x7a\xf3\x8c\xea\xed\xb0\x74\xb7\xcf\xc3\x7f\xe3\x63\x9b\xbc\x96\xee\x35\x7c\x43\x76\xfe\x0e\xf3\xd7\x9b\xe5\x3d\xde\x13\x6f\x9e\x8d\xf1\x3c\x4c\x9d\xf2\x6e\xbf\x12\x47\xec\x7e\x2d\x45\x19\x45\xf4\x5e\xd9\x40\x9b\x43\x97\x79\x2f\xd2\x2e\x23\xe6\x40\xd9\xb1\xfa\x9f\xbb\x9e\xdb\xca\xb9\x06\x9a\x46\x11\xde\x2c\x0d\x3f\xac\x91\x18\xa6\x36\x83\x1a\x77\xc7\xe8\x76\x6d\xd3\x6f\xde\x93\xea\x5b\xba\xfe\x48\x03\x3a\xb4\x6c\xa1\x0e\x0b\x9a\x19\x63\x16\x6e\x46\x87\xc7\x86\x84\x60\xeb\x37\xcd\x30\x43\x5a\xdb\x3c\xab\x5e\xe9\x61\xcb\x12\xab\xd1\xf9\x0d\xf5\xae\x05\xd0\xd0\x56\xe3\xee\xd0\x0d\x87\xe6\x95\x68\x4e\x50\xc8\x7e\x43\xcc\x26\xe7\xd1\x5b\xc2\x1f\x38\x03\x3f\x7c\xad\x3a\x63\x47\x5b\xb7\x4a\x30\xcb\xfd\xdb\xe6\x88\x95\xb1\x0d\xe9\xed\x89\xcb\x45\x9d\x18\xbb\x63\x62\xef\x98\x3a\xc1\x14\xad\x93\xdf\xe2\x7f\x82\x07\x65\x1b\xe7\x9d\xe6\xb9\xab\xae\x52\x2b\x3a\xaf\x7d\x2a\x5f\x0f\x09\x91\x4d\x6a\x0a\xa4\x62\xdf\x53\xa9\x98\xf0\x6a\xdf\x30\xa4\x1b\xc6\xf3\x63\xa8\x59\xfe\x95\x7f\x77\x35\x4b\xd1\xce\xaf\xf0\x42\x6b\x6e\xd3\x8e\xcc\xd3\xf0\xeb\xde\xb7\xb7\x5a\x51\x1f\xcc\xd5\x16\x94\x35\xf2\xa8\x41\x5c\x04\xb3\x74\x0f\xb6\x28\x9b\x1a\x52\x00\x04\x9a\x83\x1b\x53\x67\x1f\xb4\x4a\x3b\x68\x7e\x16\x2a\xd8\x76\xd1\xcb\x5f\x37\x2d\x33\xc3\x44\x40\x49\x35\xc9\x89\x26\x53\x23\x4d\x8e\x87\x5f\xaa\x8a\x64\x5e\xcd\x3c\x3a\xfa\xcf\x96\x61\x41\x66\xb4\x50\x3f\x1e\x1c\xfc\xe9\xdb\xb3\xbf\xfc\xaf\x83\x83\x9f\xfe\x33\x16\x67\x34\x43\xd1\x73\x1d\x91\x3d\xa2\x90\xb8\xc8\xe9\x05\xae\x0b\x7e\xe9\x1e\xec\xa7\x59\x26\x6a\xae\xf1\x07\x61\x9f\x81\xc5\xd9\xa7\x4b\xa1\xf4\xf9\xe5\x71\xf3\x65\x25\xf2\xf3\xcb\x28\x8c\x91\x93\x0a\x68\x45\xf9\xcc\x8c\x3b\xbc\x02\x9e\xe5\xfc\x1a\x8a\x65\xe2\x75\x7a\x2d\xaa\xe8\x77\x3c\xc3\x85\xb4\x95\x13\x2a\x5b\xd2\x92\x04\xbd\x1d\x1b\xfa\xba\x59\x7c\x60\x2a\xa0\xe9\xca\x90\x18\xc7\x02\xfb\x0a\xc4\x3c\x4a\x0f\x56\x4b\x5a\xc0\x8b\xd5\xab\x17\xcf\xc6\xc8\x6d\xcf\x6d\xd4\xa3\x82\x7b\x11\xc9\xd0\xb5\xca\xa5\x7d\x1e\x44\xd9\xd7\x65\x3f\xf9\xe0\xf4\xf2\x3c\x98\xe9\xca\xde\x8d\x67\xb1\xad\x0d\x14\xf4\xeb\x67\x6a\x2d\x74\x18\xed\x8d\x42\xd4\x61\x47\x50\xf0\x62\xdd\xf2\x56\xb6\x55\x44\xd8\x7d\x25\x3c\x47\xed\x40\x95\x56\x70\x68\x19\x4e\xb3\xaa\x0e\x53\x80\x8e\x4f\x49\x4b\x21\xd7\xc7\xcd\x97\x2d\x08\x78\xa2\xb4\x90\x64\x11\xa8\xbe\x9b\x61\xe3\x70\xbb\xaf\xec\x87\x46\x5b\x94\xed\x51\xfb\xfb\xb4\xc1\xe5\x86\x66\xb5\x34\xcf\xda\x62\xdd\xb5\x5d\xff\xf5\x58\x09\x9e\xc8\xf9\x3e\xc5\x32\x12\xda\x5b\x77\x11\xdd\xcd\xf1\x26\x38\x0c\xd5\x10\xba\x60\xda\xb5\x87\xb9\x17\x8e\x71\x48\xae\x54\xf8\x71\xfb\x3c\x0e\x77\x27\x08\x09\x94\xaf\x60\x45\xa4\x67\x9b\xe0\x8e\xa2\xe9\xf5\x9c\xad\x98\x12\x81\x22\xf5\xae\xaa\x53\x51\xf4\xba\xeb\x03\x64\xf3\x63\x63\x19\x95\xf4\x53\x85\xfd\x24\x5b\x3d\x10\xee\xd9\xc9\xfb\xd1\x9b\x57\xfe\x95\xef\x2c\x55\x44\x6b\x2a\xf9\x6b\xf8\x8f\xc3\xbf\x7e\xf9\xcb\xe4\xe8\xab\xc3\xc3\x1f\x5f\x4e\xfe\xed\xa7\x2f\x0f\xff\x3a\xc5\x7f\xfc\xf3\xd1\x57\x47\xbf\x34\x5f\x7c\x79\x74\x74\x78\xf8\xe3\xb7\xef\xbf\xb9\xbe\x3c\xfb\x89\x1d\xfd\xf2\x23\xaf\xcb\x1b\xfb\xd5\x2f\x87\x3f\xd2\xb3\x9f\xf6\x64\x72\x74\xf4\xd5\x17\x81\x03\x0f\x6c\xe7\x6e\x29\x56\x53\xf7\x21\xb7\x08\xd7\xe5\x51\x1a\xbc\x77\xd4\x1c\xc7\xb8\x72\xf6\x63\x04\x9d\x34\x1c\x5f\x67\x66\x3f\x0b\x41\xa6\x68\x26\xa9\x7e\xde\x71\x2a\x3b\xc6\x5e\x33\x8d\x80\x82\x9b\xd0\x94\x8d\xab\x48\x90\x8d\xf0\xac\x6c\x9e\x14\xf6\xba\x8f\x1a\x67\x88\x3d\x45\xf1\x5e\xb9\x73\x29\xca\xa6\x61\x01\x02\xbf\x56\xa4\x60\xa1\x5e\xec\xe6\x46\x9a\x99\x3f\x8b\xa7\x2e\xa4\x30\x5d\x0a\xd3\x8d\xa1\x14\xa6\x1b\x47\xfd\x30\xdd\x15\xde\xfd\x14\xa3\xdb\x45\x94\xaf\xfc\x80\x55\x3b\x91\xf7\x8d\x0f\xab\xd7\x3b\xd7\x63\x6e\x3b\xf1\xfb\xdb\x30\x7c\x0f\xce\x4e\xf9\x75\x68\xd6\x2e\xc7\xcb\xd7\xbd\x51\xee\x46\x28\xc3\x69\x51\x00\xe3\xbe\xca\x0b\x07\xd9\x55\x8d\xb3\xee\x24\x20\x0a\x4b\x24\xac\xfc\x40\xad\x4d\x11\x87\x7e\x3d\x69\x05\x58\x7f\x61\x74\x55\x1c\x4b\x3f\xd8\x22\x10\x37\xb6\x2e\x84\xd2\xb8\x49\x65\x5d\x68\x56\x15\x14\x02\x1e\xb2\x16\xcc\x58\xd4\x14\x88\x52\x22\xb3\x05\x7d\xda\x9a\x65\x05\x51\x3e\xf3\x77\x2f\x05\x5c\x55\x4d\x6e\x10\xdb\x9c\xd1\x9c\xf2\x8c\x62\x59\xb8\xb1\x05\xe1\x2c\x35\x27\x69\xb6\x36\x7b\x73\xc6\x57\x6d\x26\x56\x53\x3b\xd0\x6f\xfb\xef\x18\xe7\x3f\x6e\xea\x89\x11\x53\x0e\xba\xd9\x65\xa0\x78\x49\x4e\xb4\x5b\x5b\x4f\x3e\xc1\x24\x1f\x31\xef\xd0\x1c\x5e\xb9\x42\x61\x2f\x97\xd0\xd7\x42\x8b\x8d\x0c\x78\x70\x6e\x3d\x13\xda\x05\x09\x69\x38\x65\x9f\x05\x68\xd6\x7b\xf2\x78\x26\xf0\xd3\x50\x73\x7d\xa7\xa9\x1e\x1c\x45\x1e\x9a\xe9\xcf\xcf\xcc\x7e\x04\x13\x7b\x87\x79\x6d\xcd\xe3\x20\xae\xa1\xa6\x75\x14\xb3\x3a\x86\x49\xbd\xcb\x9c\x0e\x48\xae\xed\x68\x80\x78\x8b\x62\x02\x87\x9b\xbf\xe1\xf0\xb4\x4a\xd2\x39\xfb\x14\x45\x66\x9e\xf2\x76\x03\x81\xe5\x94\x6b\x36\x67\x21\x5d\x8a\x85\x19\x5c\x45\xb9\x2d\x63\x45\xb2\x25\xda\x05\x81\x7d\x91\x3a\x78\xfa\x73\x4b\xae\xb3\x2e\x9a\x98\x0a\xec\x2a\x96\x73\x2a\x69\xaf\xa4\xbd\x92\xf6\x7a\x88\x9e\xbd\xf6\x72\xf2\xa0\x79\xb2\x3f\xad\xfa\xc1\x8a\x30\xa1\x45\x6f\xde\xf6\xea\x91\xe1\x1d\xf7\x76\xd7\xee\x7f\xf7\xba\x6a\x7f\x27\xf8\xb9\x1e\xd8\x81\x80\xe3\x86\x1f\x79\x59\x17\xc5\xf8\x5a\xf3\x96\x86\x0b\x78\x8e\x2b\x57\xd5\x45\xe1\xca\x83\x4f\xe1\x83\x57\x9f\x5a\x31\x87\xd3\xe2\x96\xac\xd5\x31\x5c\xd0\x15\x95\xc7\x70\x3e\xbf\x10\xfa\xd2\x3e\x54\x7d\x94\x6a\x3f\xfb\xd2\xb2\x06\x36\x87\xd7\x05\xd1\x54\x69\xd0\xc4\xe7\xa2\x32\xd5\xef\x9e\x26\xe4\x60\x90\x5d\x23\xd3\x38\x4d\xe3\xc7\x0a\xf5\xad\x83\xf5\xdb\xa6\x8e\xe5\xe4\x09\x0e\x5a\xc1\xe6\x34\x5b\x67\x45\xe8\x1d\x7d\xd7\xf0\x69\xaa\x35\x91\xa2\x10\xb7\x5e\x62\x07\x01\x3b\x3b\x4a\x87\x7e\x56\xcd\x5d\x2a\xa1\xf4\x95\x26\x52\x47\xe8\xf0\x72\x70\xd9\x30\x33\x8b\x9b\x91\xa2\xf0\x16\xe7\xac\x2c\x69\xce\x88\xa6\xc5\x1a\xc8\x5c\x53\xd9\xaf\x53\xec\xcb\x53\xd9\xda\xe0\xae\xbc\x2d\xf6\xef\x26\x3c\x2f\xa8\x84\x39\x61\x85\x37\xc6\x67\xcb\x89\x6b\x3b\x8f\x7b\xf5\x29\xb1\x64\xc1\x91\xae\x16\x2f\x90\x2c\x13\x32\xc7\x52\x5f\x02\xfc\xc1\xa8\x8e\x61\x27\x58\xd1\x86\x2a\x09\x27\x0b\x1a\x50\x98\x61\x13\x7d\x0b\xb3\x42\x64\x37\x0a\x6a\xae\x99\xaf\x6d\x66\x5b\xab\x8b\x1b\xc8\x44\x59\x15\x28\x9e\xc2\xca\x05\xc2\xfd\x25\x03\x77\xc9\xbc\xf6\x9f\x93\x56\xf4\x4c\xcc\x98\xd4\xc9\x6f\xbb\x1f\xe1\x37\xfc\x2c\xbd\xe0\x97\x48\xf8\x3b\x84\x7e\xa2\x99\xbf\x75\x38\xb8\xfa\x1f\x38\xc5\x53\x1b\xd4\xcd\x1b\x40\xf0\x16\xce\x3d\x17\x46\x30\x9b\x53\x1f\xd8\xda\x17\x06\x3d\x02\xa6\x70\xf6\x89\x66\xed\xd7\x21\x0f\x12\x33\x4a\xdb\xd6\x00\x2b\xda\x92\x9b\x80\x42\x03\x51\xa0\x36\x71\x40\x2e\xde\x05\x20\xfb\xb4\xd1\x79\x16\x39\x86\x54\x4d\xb0\x64\x05\x8d\x65\x56\x30\x3e\xba\xfd\xcc\x36\xb9\xf2\x92\xc0\xb8\xb2\x6d\xf0\x7a\x92\x2c\x14\x26\x60\x98\x6d\x35\xda\x0d\xe4\xd9\x34\x61\x6a\x56\x21\x7c\x4d\xa5\x10\x1a\x0e\x0f\x4e\x0e\x8e\xb6\x62\xba\x81\x10\x34\xf3\xba\x2e\xa8\x5a\x2b\x4d\x4b\x5b\xb4\xc6\x8d\x3a\x90\x2b\xc3\xd6\xdc\x15\xf6\x65\xa6\xd9\x41\x7e\x0c\x2c\x14\x4e\xe0\x6c\x41\xdb\x01\x05\x4f\x42\x58\x6e\x0a\xd8\x2a\xa5\xc7\xa0\x04\x68\x49\x72\x16\x05\x23\x8e\x3c\xcd\x00\xb5\xac\x5d\x3b\x95\xc3\x83\x5f\x46\x76\xb7\xda\x26\xaa\xb3\x23\xb8\x15\xfc\x40\xe3\x71\x9d\xc2\x75\xe8\xad\xaa\x15\x6d\x0a\xb5\xda\x5e\x51\x9c\x86\xc3\x2a\x44\xbf\x55\x94\x31\x2e\x41\xd4\xa1\xfb\x8e\x95\xc8\x89\x6e\x6a\xca\x9e\x7d\x0a\x3e\x49\x36\x2f\xd5\x28\xb1\x97\x68\x0a\x5a\x83\x33\x90\x29\x51\x50\xb0\x15\x3d\x59\x52\x52\xe8\xe5\x1a\xc2\xef\x10\x17\x7c\xf2\xdf\x54\x0a\xac\x7a\xcb\x1d\xdf\x30\x2c\x5e\x48\x58\xba\x4f\xde\x21\xea\xed\xc1\x04\x79\xd0\x8c\xbd\xf8\x0d\xf5\x7c\x17\xc1\xa6\x0e\xfc\xf3\xf5\xf5\xe5\x37\x54\x47\x33\x3c\xcc\xe8\x9a\x04\xaa\x5e\x8b\xa6\x27\xb6\x40\xc2\xa1\xbe\x13\xa8\x84\x7c\x6a\x13\x68\x29\x54\xc0\xbe\xc3\xd6\xde\x0b\xa5\x7d\xab\x4a\xf6\x49\x0b\xa3\x9b\x39\xcd\xcc\x8e\x47\x4b\x26\x76\xdd\x18\x2a\x91\xc3\xf9\xe5\x14\xfe\x22\x6a\xb3\x8a\x33\x32\x0b\xb2\xe4\x0d\xdd\x12\xae\x9b\xb2\xad\x2f\xcc\x22\xbc\x08\x09\x97\x59\x32\xe7\xfe\xcf\x94\xe4\x54\x2a\xd4\x84\x94\x78\x36\x94\x6d\x28\x12\x00\xb3\x37\xae\x98\x96\x73\xad\xb4\x28\x61\x69\x19\x87\x6f\x74\xaf\x80\xae\x93\x1d\xa1\xf8\x6b\x23\xd7\xac\x0f\x4d\x81\xa4\x55\x0c\x6d\xe7\x66\xfb\x2b\xd2\x46\x5b\x9a\xc0\x9e\x94\x40\xae\x0d\xdf\x19\xf6\x57\xca\xf0\xa8\x04\xb3\xb4\x8b\x6f\xce\x8a\x2b\x7a\x17\xcc\x91\x71\x7b\x48\x8c\x50\x09\x46\x89\x47\x4a\x49\x81\x48\x69\x29\x10\x52\x30\x78\xc8\x04\x01\x96\x81\x5c\x62\x65\xb9\x40\xa4\x7c\x08\xd8\x01\x03\x88\xc0\xb2\x3d\xa5\xb6\xa6\x43\x84\xe5\x87\x98\x48\x7c\x08\x2d\x4d\xdc\xa7\xc7\x5f\xbe\x18\x07\x0f\xe2\xad\x5f\x15\x5c\x44\x64\xbb\x84\x88\x16\x40\xb2\xcc\xaf\x25\x4e\x9f\x84\x55\x9d\x28\xce\x6c\xff\xc9\x67\x61\x7b\x18\x8b\x39\xe2\x92\x59\x38\x89\x04\x5e\x97\xb3\x60\x25\xd5\x56\xf3\x92\x3a\xf6\x36\xf4\x5a\x00\x5c\xc4\x18\x6a\x03\x44\x68\x0c\x24\xc2\x17\xa1\xf7\xe2\x95\x99\xf3\x1f\xff\xf0\x87\xdf\xff\x61\x6a\x97\xd5\x7c\x46\x20\xcf\x19\x05\xc2\xe1\xfc\xf4\xe2\xf4\xe7\xab\xef\xdf\x60\x65\xe5\xb0\x53\x18\x21\x25\x3b\x66\x42\x76\xc4\x74\xec\x47\x4c\xc6\xc6\xb2\x53\x81\x12\x7e\x88\xae\x41\x86\xe1\x1e\xed\x5a\xd9\x62\xca\xee\xa5\x68\xc3\x86\x11\x3c\xd9\xe6\x4d\x3c\xa8\x41\x1d\xe1\xe1\xf0\xe4\xd2\x53\x67\xd5\x95\xc8\x6e\xa2\x79\x79\x0e\xae\xdf\x5c\x5a\x86\x51\x1c\x3d\x84\x37\x01\x26\xc6\x57\xa2\x58\x99\xcd\x24\x70\xfd\xe6\x32\x50\x59\x4c\x0d\x0f\x8c\xb0\x5a\xbf\xf7\x3a\x28\x1f\xaf\x2d\xb0\xe3\x00\x7a\xac\xac\x8a\x90\x88\x32\x60\x1d\x79\x49\x49\xc1\x94\x66\x19\x8e\xb5\x8d\xc1\x06\x79\x75\xc4\x8d\x3f\x2a\x2f\xf9\xc7\x3a\x8a\xec\x1f\x3b\xf8\x10\x29\x77\xb5\x75\xb4\xf5\x5c\x65\xc1\x4e\x93\xe3\x41\xe9\x96\xf0\x3a\x83\xce\xd1\x16\x96\x38\xfc\x4c\x2d\x47\x34\xc3\xfc\xda\x44\xf6\x89\xf7\x3a\xd8\x38\xcb\x31\x34\x82\x82\x76\xe7\xb6\xe5\x18\xc8\xd6\x4d\x78\x68\x39\x86\xfa\x25\x8c\xdd\xb9\x65\x39\x46\xb2\x6d\x93\xe5\xb8\x1f\x3d\x82\xe5\x58\x49\x7a\xa5\x45\x15\x05\x67\x67\x59\x45\x45\xd9\xcd\xe8\x5c\x48\x1a\x07\x66\xd7\x01\xe0\x20\xaf\x51\x18\x13\x1e\x50\x1f\xb3\x09\x73\x89\x3e\x5c\xcd\x3b\xf1\x1a\xd0\x64\xc9\x96\x4d\x54\x95\x53\xa5\x4e\x10\x1a\x57\x57\xd6\x49\xe9\xc9\x74\x4e\x58\x51\x4b\x7a\x6c\x76\x9a\x96\x95\xed\x50\x1f\x58\xaa\xcf\x6c\x06\xe5\x96\x15\xd5\xb6\x69\x7c\x83\x5a\xf4\xdf\x1f\x63\xf3\xd9\x83\x63\xbb\x9d\x86\xb7\x7c\xca\x24\x51\x4b\x8a\x8d\x1e\xe9\x27\xa6\x95\x1d\xa8\xa4\x44\x79\x57\xfa\x45\xa8\x8b\x3b\x48\x68\x02\x2b\xa8\x88\x52\x34\xf7\xd7\x06\x3d\xc8\xa7\x1d\xe0\xa5\xc8\x0f\x0e\x54\xff\x63\x3c\x39\x2f\x24\xc9\x28\x54\x54\x32\x91\x03\xd6\xce\xce\xc5\x2d\x87\x19\x5d\x30\xee\xfb\x02\x70\x37\xd2\x0c\xba\xb9\xf0\xc6\x84\xa5\x01\x40\xaa\xa6\x9b\xee\x14\x3e\x0e\xba\x7d\xfa\x6b\x2d\x51\xeb\x4c\x74\xda\xda\xad\xee\x71\x00\xc7\x0e\x49\x8a\x39\xf7\x78\xcd\x6b\x52\x14\xeb\x4e\xac\x78\x72\x76\xe5\x25\xf4\x63\x6d\xfc\x67\x86\xa9\x35\x97\x35\x94\x63\xff\x82\xf6\x97\xc2\x5f\x36\x49\x4a\xb2\x65\x58\xba\x42\x82\xee\x3e\x40\x09\xba\x9b\xa0\xbb\x77\x52\x82\xee\x26\xe8\x6e\x82\xee\x26\xe8\x6e\x82\xee\x26\xe8\xee\x48\x4a\xd0\xdd\x87\x28\x41\x77\xef\xa4\x67\x19\x9a\x48\xd0\xdd\x04\xdd\xdd\x9b\x12\x74\x37\x41\x77\xc7\xf1\x4d\xd0\x5d\x2f\x4a\xd0\xdd\x7b\x29\x41\x77\x43\x28\x41\x77\x7d\x29\x41\x77\x47\x53\x82\xee\x26\xe8\x6e\x00\x25\x00\x86\x07\x25\xe8\x6e\x84\x87\xc3\x93\x4b\xcf\x04\xdd\x4d\xd0\xdd\x3d\x29\xf9\xc7\x3a\x4a\xd0\xdd\x00\x4a\xd0\xdd\x07\x29\x41\x77\x13\x74\x37\x80\xd7\xf3\xb3\x1c\x1b\x88\xe8\xa5\x14\xb3\xd0\xe2\xa3\xc8\x43\x61\x7f\xea\x54\x7a\x34\x00\xc3\x74\x27\x7e\x09\x84\x57\xb5\x60\xe8\x5e\xbb\x9b\xd8\xa5\x21\x02\xc9\x93\xf7\x10\xb7\x34\x44\x1f\xf9\x9a\xbf\xde\x98\xa5\x67\x80\x5e\x0b\xc6\x29\xdd\x81\x51\x0a\x14\xe1\x1b\xf8\xa4\x06\x61\x14\xc0\x71\x27\x36\x29\x70\x94\x5b\xb8\xa4\x06\x59\x14\x61\xe6\x08\xc0\xec\xa3\x8a\x02\x43\xdd\x3d\x3c\x52\x1f\x51\x14\xc0\xb5\x87\x45\xda\x46\x13\x85\xec\x94\xde\x85\x24\x72\x40\x98\x90\x17\xd6\x00\x45\xb4\x03\x07\x14\xc0\x1b\x11\x44\x91\x31\x40\x3b\xf1\x3f\x61\x46\xdc\x0e\xec\x4f\x83\xde\x09\x59\xd8\x0e\xf7\xd3\x47\xee\x84\x1c\x81\x16\xf3\xb3\x89\xda\x09\xf2\x03\xe4\xb1\x11\x3b\x31\xe2\xa3\xc1\xb1\xd1\x40\x73\xcd\xe5\xca\x5c\x2f\x25\x55\x4b\x51\x78\xaa\x82\x81\x1a\x78\xcf\x38\x2b\xeb\xd2\xc8\x1c\x65\xe4\x36\x5b\x05\x26\xf2\xa8\x16\xb2\x89\xf1\x4f\x1b\x58\xf5\xd6\x78\x28\x51\x24\xcd\x91\xbb\x39\x62\x58\xd5\x7c\x49\x56\xfe\xf6\xae\xaa\xb3\x8c\xd2\x9c\xe6\x03\xe7\x1e\xfc\x7e\xda\xac\x85\x27\x5f\xdb\xeb\x91\x29\x78\x15\x62\x61\x84\x3c\x0b\xe6\x42\x96\x44\x23\x8f\xdf\xff\xce\x83\x43\x10\x00\xec\x51\xc0\x5f\xd1\x81\x5f\xc1\x66\x5c\x98\x43\x2b\xc0\x99\x15\x6e\x3f\x86\x39\xb1\x76\x03\xbc\xc2\x74\xdc\x2e\x70\x57\x18\xc7\x47\x00\x76\xed\x04\x75\xf5\xe1\x4f\x61\x96\x6e\x18\xa0\x2b\x12\xec\x33\x18\xc8\xf5\x38\x20\xae\xdd\x00\x2e\x94\x2e\x21\xc6\xc5\x10\xbc\x15\x0e\xbf\x7a\x16\xa6\xc5\x63\x40\xae\xb6\xe1\x56\x6e\xb1\xc2\x5c\xb9\x2d\xd4\x2a\x1e\x54\x2a\x12\x4c\x2a\x06\x44\x2a\x18\x1e\x15\x0e\x8d\x8a\x05\x8b\x8a\x01\x89\xda\x6a\x68\x18\xe1\x04\x41\xd3\x83\x2e\x0a\xc8\x38\x96\x0b\x35\x0a\x04\xea\x71\x97\x2b\x06\xf4\x29\xc2\x7a\x85\x41\x9e\x1e\x07\xee\x14\x13\xea\x14\x63\x89\x82\x02\x55\x8f\x03\x6f\xda\x09\x6d\x02\xef\x24\x70\xd8\x74\x77\x4d\xfb\xe1\xa5\x00\xa6\x1b\x90\xa6\x7e\x68\x29\x80\x6b\x0b\x67\x8a\x1b\x56\x0a\x0c\x29\xc5\x0a\x27\x45\x0a\x25\x3d\x12\x00\x29\x14\x7c\xb4\x1b\x78\x64\x6c\x90\x80\x03\xb1\x05\x3a\xea\x60\x43\x01\x5c\xfb\x3e\x89\x30\xc8\x50\xe0\x86\x32\xce\x34\x23\xc5\x5b\x5a\x90\xf5\x15\xcd\x04\xcf\x3d\xad\x89\x8d\xb6\xbb\x2e\x64\x3e\x07\x65\x99\x7a\xce\xcf\x7a\x82\x86\x05\x1f\x96\x44\x81\xeb\xff\xe6\xc9\xd5\x55\x0f\x69\xc2\x97\xce\x30\xc5\xd8\xa3\x5d\x0f\xed\x1f\xcf\x1a\x59\x9a\xe1\x56\xc8\x9b\x42\x90\x5c\x9d\x54\xc2\xfe\x5f\x57\x98\xa1\x57\x91\xc1\x8e\x30\xa4\x24\xc3\x53\xba\x9c\x6c\xdd\x8b\x78\xc7\xeb\xcf\xe2\x16\xc4\x5c\x53\x0e\x87\x8c\x37\x27\xec\xc8\xd7\xfb\xd4\x3a\x9b\x3a\x7f\x66\xeb\x34\xf4\xe7\xf9\xea\x65\x33\xb0\xd6\xe5\x18\x64\x98\x7d\xce\x2e\x47\x74\xc6\x2a\xf5\x3c\x3d\xda\x6e\x70\x8f\xe5\xd2\x76\xec\xe7\x75\x61\x85\x99\xaf\xff\x06\x9d\xe1\xce\x41\x3e\xf4\x69\x7b\x1e\x0b\x68\xbb\xea\xbf\xc2\x99\xb7\xd2\x90\xf0\x1c\x5c\xcd\x2f\x6f\xce\xfd\x03\xff\x59\x1f\xdd\x40\x28\xed\x63\xc1\x68\xef\x84\xd0\x5a\x20\xac\x27\xd7\x2d\xf8\x6c\x07\x82\xf5\xe5\x38\x84\xce\xf6\x01\xb0\x01\x63\x6c\x35\x64\x00\xf8\x35\xc5\x08\xfc\xfe\xf6\x4e\x90\x2b\x86\x0b\x02\x4c\xe2\x0d\x80\x6b\xac\x5c\xf0\x61\x1e\x78\x28\x50\xfa\xd9\xbc\xf6\x1b\x48\x6a\xa8\x6f\x2c\xbd\xf6\xd3\x6b\xff\x01\x7a\x84\xd7\xbe\x66\x25\x15\xb5\x7e\xb6\x0f\xce\xdb\x25\xcb\x96\x7d\x5b\x90\x95\xde\xaa\x5a\xd4\x7a\xc3\x5e\x73\x43\x8c\x08\x45\x48\xaf\xce\x0d\xf2\x8b\x69\xec\x70\xa8\x5a\xf1\xd8\xe2\x89\x3d\x26\xd2\x39\x2e\x5a\xac\x2c\x10\x05\x04\xde\x5e\x5c\xfd\xfc\xee\xf4\xdf\xcf\xde\xf9\x08\x9a\xeb\x25\x53\x56\x65\x36\xe2\xab\xe6\xec\x6f\x35\x05\x52\x0a\x63\x0b\x16\x41\x43\x55\xc7\xe8\x08\xe9\x7d\xc3\xb3\x38\x53\x4c\x20\xb6\x97\x18\x33\x8a\xcd\x43\xc0\x0c\xa3\x0f\x86\xc7\x33\x44\xa6\xfb\xc5\xa2\xbd\x63\xd0\x1b\xc0\x62\x37\x7a\xb3\x38\x20\x69\x25\xa9\xa2\xdc\xd3\x52\x23\xc0\xa9\x36\x32\xc9\xda\x21\x8c\x03\x01\xc5\xf8\xa2\x08\xcc\x69\x09\xb4\xf1\x43\x2c\xfc\x49\x37\xf2\x4b\x3f\x43\x3f\xd4\xcc\x1f\x7c\xbe\xaf\x31\xb2\xd3\xe8\x9c\x87\x25\xeb\xd9\x92\x77\x42\xd1\x26\x1a\x57\x89\xfc\x40\xc1\xb9\x3f\xda\x83\xe4\xb9\xa4\x0a\x0b\x6b\x33\xd5\xd9\x73\x46\x43\x32\xff\x4a\x2f\x78\x16\x6d\x38\xed\x18\x5e\xc2\x9f\xe0\x13\xfc\x09\x4d\xce\x3f\xfa\x5a\x86\x31\xcc\xba\x50\x87\x86\x7d\xfd\x9d\x5f\x46\x39\x11\x3f\x2c\x89\x46\x7e\x70\x7e\x19\x02\xe9\x9a\x31\x9e\x5b\x45\xfb\x49\x53\xc9\x49\xd1\x3c\x48\xc2\x56\x3a\xc0\xf0\x35\x93\x7a\xf6\x17\xc7\x26\xaf\x9f\xcf\xbd\x39\xb6\x16\xc9\x31\xe8\xc1\xd5\xf1\xe6\x88\x57\x6e\xe7\xd5\xf1\x66\x69\xaf\x1c\x9c\xcf\xd1\xc3\x70\xe1\x34\x05\x53\xbd\xd1\xfb\x2f\x69\x3b\xeb\x92\xe8\x6c\x39\x54\x6b\xfe\x0f\xc0\xf7\xe6\x4a\xf4\x8c\xa7\x5c\xa0\xe9\x10\x54\x2f\xd4\x0c\xf5\xf3\x16\x3c\x21\x40\xa3\xc1\x7d\x3a\x9f\x6f\x9e\x5c\xef\x55\xbd\xeb\xf1\x1f\x54\x8c\xd4\x99\xe2\xbd\x9a\xfa\x95\xc8\xa7\x70\x46\xb2\xa5\x37\x4f\xb3\x78\x79\xcf\x3e\xaa\x44\x6e\x07\xbf\x24\xde\xa1\x0f\x63\x79\xb9\xb1\x1a\xf6\xae\x98\x4b\x68\xca\x94\x15\xdd\x46\x33\x64\x84\x9b\xb5\x95\x74\x4e\xa5\x0c\x39\xfa\x02\x66\x6b\xc4\xeb\xb0\x8c\x06\x5e\x82\x00\x9d\x50\x49\xa1\x45\x26\xbc\xf3\xf9\x37\xf3\x5d\x91\x19\x2e\x77\x88\xd3\xbe\x8b\xe3\x7c\xf7\xf6\xf2\x18\xae\xdf\x5c\x1e\x83\x90\x70\xf5\x26\x04\x55\xd0\xf7\x57\xbc\xb8\x7e\x73\xf9\xe2\x09\x16\x5d\x52\x92\xb3\x94\x5e\xbc\x9b\x52\x7a\xf1\x7e\x94\xd2\x8b\x87\x94\xd2\x8b\x03\x78\xa6\xf4\xe2\x94\x5e\x6c\x29\xa5\x17\xa7\xf4\x62\x4f\x4a\xe9\xc5\x0f\x0f\x2e\xa5\x17\x7f\xb6\x80\xa9\x94\x5e\xfc\x30\x25\xe8\x50\x4a\x2f\x4e\xe9\xc5\x5b\x94\xd2\x8b\x9f\xda\xb4\x48\xe9\xc5\x29\xbd\xb8\xa1\x94\x5e\x3c\x82\x52\x7a\xf1\x38\x4a\xe9\xc5\x0f\xd2\x33\x03\x1c\xa7\xf4\xe2\x04\x38\xde\x97\xcf\xf3\x03\x1c\x43\x4a\x2f\xf6\xa3\x94\x5e\x3c\x9e\x52\x7a\xf1\x38\x4a\xe9\xc5\xe3\x79\xa6\xf4\xe2\x8e\x52\x7a\x71\x4a\x2f\xfe\x4c\x8f\x6e\x4a\x2f\x4e\xe9\xc5\xbb\x29\xc5\x08\x52\x7a\xf1\x38\x4a\xe9\xc5\xfe\x4c\xd3\x6b\xdf\x9f\xcf\xf3\x7b\xed\xa7\xf4\xe2\x94\x5e\xfc\x20\x85\x98\x6e\x92\x2a\x51\xcb\xcc\x47\x45\x0e\xce\xd5\xc7\x86\xcf\x63\x02\x93\xe1\x2c\x46\xf6\xb2\x42\x7c\x9a\xaa\xcc\x40\x65\x37\xec\x42\x52\x92\xfb\x44\x2c\xcd\x44\x33\x0c\x9d\x76\x2a\xf4\xb3\xc2\x50\x17\xac\x64\x3e\xa9\xc5\xb0\x25\x5c\xde\x21\xa7\x2e\x50\x1a\x80\x73\x29\xc9\x27\x7c\x19\x91\x52\xd4\x5c\x1b\x79\x95\x89\xb2\xf2\x47\xd2\xf6\x77\x1a\x0f\x66\x5f\x16\x04\x60\x05\x1e\x92\x20\x99\xe0\x73\xb6\xa8\x25\x31\x4b\x74\x52\x12\x4e\x16\x74\xe2\xa6\x32\x69\x07\x35\x69\x4f\xe7\xc9\x13\x59\xe9\x24\x6f\xf0\xa5\x97\xc1\x66\x73\x45\xb4\xa6\x92\xbf\x86\xff\x38\xfc\xeb\x97\xbf\x4c\x8e\xbe\x3a\x3c\xfc\xf1\xe5\xe4\xdf\x7e\xfa\xf2\xf0\xaf\x53\xfc\xc7\x3f\x1f\x7d\x75\xf4\x4b\xf3\xc5\x97\x47\x47\x87\x87\x3f\x7e\xfb\xfe\x9b\xeb\xcb\xb3\x9f\xd8\xd1\x2f\x3f\xf2\xba\xbc\xb1\x5f\xfd\x72\xf8\x23\x3d\xfb\x69\x4f\x26\x47\x47\x5f\x7d\xe1\xfd\x4a\x0c\xb0\x43\xe2\x58\x21\x51\x6c\x90\x47\xb0\x40\x1c\xcc\x24\x8a\x78\xf8\xe8\x78\xc5\x11\x10\xce\x75\x12\x5f\x40\x34\x0f\x56\xcc\xd4\x6c\xc6\xec\xef\x8d\x14\x25\xd3\x46\x3b\x18\xb5\x46\x7a\x10\x7e\x5f\x8e\x7a\xd0\xef\xd4\x89\x5c\x36\x0f\xc1\x42\x33\xd5\x07\x58\xf7\x32\x12\x85\x5e\x52\x79\xcb\xbc\x03\x43\xe6\xa5\xc4\x3b\xb7\x06\x0a\xc1\x49\x4e\xe7\x8c\x7b\x7b\x4a\xd0\x9a\x1b\x6d\xc8\x25\x31\x9c\xc4\xf0\x18\x2e\xcf\x49\x0c\x2b\x9a\xd5\x92\xe9\xf5\x1b\xc1\x35\xfd\xe4\xe1\x19\x19\xc6\x7b\x87\xdc\x5c\xc6\x8a\xa7\xdd\x7b\xeb\xe4\xda\x67\x9f\x47\x88\x93\xb9\x94\x6c\xc5\x0a\xba\xa0\x67\x2a\x23\x05\x8a\x8a\x18\x6a\xef\xf4\x0e\xde\xfe\x31\x13\x2d\x45\xa1\xe0\x76\x49\x8d\x78\x06\x62\xe6\x8e\xee\xa8\x8c\xf8\x32\x5d\x10\xc6\xa1\x34\x32\xb5\x6a\x06\xaa\x8c\x46\xe1\xc0\xbc\x75\x9f\x79\x61\x71\xdd\x0c\xce\xd5\x34\x99\x09\x51\xb8\xb4\x33\x6f\x1c\x72\xbb\x02\xcc\x3a\xe5\xb8\xf8\x99\xd3\xdb\x9f\xcd\xc8\x7d\xc7\x3a\x2f\xc8\x02\x6e\x59\x51\x60\xae\x26\xd5\x5b\x9d\xa8\x7d\xd7\xa0\x99\x7c\xe4\x43\x80\x79\x46\x35\x05\x52\xdc\x92\x35\x1e\x85\x38\xe3\x65\xea\x35\xbc\x3a\xc2\xfc\x35\xa2\xa0\x1d\x6f\x0e\xbf\xf3\x0d\x1b\x2f\x89\x82\x37\xa7\x97\x3f\x5f\xfd\xe5\xea\xe7\xd3\xb7\xef\xcf\x2f\x42\x34\xab\x39\x3d\xd4\xeb\x90\x67\xa4\x22\x33\x56\x30\x7f\x85\xba\x85\x45\xec\xb3\x0c\xb0\x8f\xf2\xfc\x24\x97\xa2\xb2\x7b\x28\x6b\xce\x19\x5f\x04\x89\x51\x4b\x6f\x87\x4d\xf1\x1b\xa3\xd1\x1c\x6e\x5f\x07\xdd\x7c\x30\x65\x58\x48\xc2\x8d\x61\x3b\x5b\x07\x64\x8e\x76\x70\x15\x59\x73\xcd\xca\xcf\x37\x21\x99\xe4\xb1\x92\x91\x4f\xf3\x9c\xe6\x31\x8e\xd7\x73\x04\xe3\xbf\x69\xa6\x15\x92\x85\x02\x5d\xa1\x36\xb8\xfc\x70\x75\xfe\xbf\xe3\xac\x16\xb8\x15\x0b\x09\xea\x84\x9b\x8f\x46\x1a\x44\x3a\x49\x1f\x69\x29\x56\xe9\x2c\x3d\x40\xbf\xd2\xb3\xd4\x5a\x72\x31\x70\x44\x1f\x6b\xde\x93\xd5\xde\x49\xfd\xdd\x98\xa0\x14\x39\x9d\xc2\xa5\x35\x90\xa8\x8a\xc2\xb3\x5f\xe6\x53\x52\x30\x8c\xb9\x66\xa4\xf0\x36\x35\xe9\xdf\x6a\xb6\x22\x05\xb5\x49\x6f\x58\xd6\xa0\x5f\xb2\x2c\x82\x6e\x9e\x93\x42\x05\x29\x3d\x7f\x9b\xc8\x18\xa7\xef\x45\xcd\x63\x60\x76\x5a\x5e\x90\x53\x2e\x74\x90\x6b\xcf\xcc\x0b\x6b\xcc\x49\x91\x81\x75\xef\x05\xc1\x93\x1b\xbc\x5a\x3f\x94\x74\xdd\x99\x44\xfe\x26\xb8\xdb\xc7\xcb\x76\xee\x36\x1e\x5a\xab\xa0\xe9\x6f\x99\x44\xa1\xf0\x0e\x33\x7f\x49\x49\x8e\xd5\x6d\x2a\xa2\x97\x16\xbb\x56\x12\x75\xe3\xed\x86\x43\x36\xee\x4d\xe7\x1c\xa6\xb6\x28\x4d\xbb\x18\xd7\xfe\xc2\x6f\x4e\x89\xae\x25\xb5\xaf\x32\x9b\x20\x47\x39\x99\x15\xbe\x68\xe3\x40\x41\x6a\xd6\xee\x03\x2f\xd6\x1f\x85\xd0\x5f\xb7\x15\x48\x22\x5c\x9a\x1f\xdc\x0b\x1e\x8b\xf7\x85\x3e\xdd\x96\x58\x8b\xd9\x8c\x75\x82\x1b\x8d\xc2\x2a\xbc\x60\x8a\x3b\xe3\xe6\xb8\x3f\xa1\xa8\x92\x35\x3f\x55\xdf\x48\x51\x7b\x5a\x46\x5b\x8f\xb7\x6f\xce\xdf\xa2\x44\xaf\x79\xc0\xe3\x85\x72\x2d\xd7\x95\x60\x36\xfe\x10\xd5\x5f\xf0\x9d\x51\x89\x1b\xf7\xdf\x57\x50\xcd\xa1\xe6\x8a\xea\x29\xbc\x27\x6b\x20\x85\x12\x8d\x93\xc3\x5b\xe5\x5e\x22\x4a\xbd\xef\x47\x9c\x02\x16\x33\xf4\x7e\x5c\x32\x0e\x33\xa1\x97\x5b\xee\x49\xff\xea\x85\xdb\x63\xc4\xaa\x49\x41\xe0\xf2\xae\xf0\x39\xe3\x9b\x43\xf5\x95\xf8\xe4\x86\x2a\xa8\x24\xcd\x68\x4e\x79\x16\x74\xbf\x22\xa1\x48\xfe\xf8\x2f\xbe\x37\xf4\x42\x70\x23\x24\x23\xdc\xd1\x73\x9e\xb3\x8c\x68\xeb\x85\xd4\x51\x1c\x0c\x88\x5f\x73\x9e\x2d\x82\x05\x75\x8c\x88\xf4\x64\x5b\x2b\x2a\x31\x40\xa8\x65\x4d\xed\xc1\xfa\xb6\x9e\xd1\x82\x6a\x74\x23\xfa\x07\xb7\x58\x4e\xb4\xad\xf6\xc5\x4a\xb2\xa0\x40\x74\x23\x06\xfc\x7d\x4c\x94\x2b\xa3\x4e\x71\x25\x99\x86\x5c\xd0\xb6\x4c\x95\xaf\xb3\x43\xc1\x77\xe7\x6f\xe1\x25\x1c\x9a\x35\x3c\x42\x7b\x62\x4e\x58\xe1\x5f\xaf\x02\x91\xf4\x1b\xf6\x0f\x9b\x37\xc3\xf5\xd5\x5e\xe7\x4e\xf6\x81\x90\x56\x7d\x1d\x03\x17\xa0\xea\x6c\xd9\xac\xb5\xbf\x0f\xb6\x71\x17\xbb\xac\x18\x84\x94\x38\x01\xeb\xc9\xb1\x15\xcb\x77\x09\x58\xdf\xb5\xb5\x4c\x77\x09\x58\xef\x50\x5d\x7e\x97\x80\x0d\x42\xe9\x3d\x73\x01\x1b\x68\xc0\x7c\xa7\xa8\x8c\x64\xbf\x7c\xf7\xcc\xed\x97\xfe\x13\xd7\xc8\xca\x6e\x67\xfd\x0d\x04\x2b\x10\x4b\xaa\x49\x4e\x34\x71\x76\x4d\x68\x5d\xcd\x6d\x9b\x28\x5d\xbe\xe7\x79\xf9\x9e\xd2\xba\x51\xf4\x1d\xe3\xf5\x27\x9b\xc4\x11\x2b\x80\x74\x75\x86\x4c\xf1\xd2\x05\x2c\x31\x1e\x5d\x52\x55\x05\xeb\x30\xa8\x41\xdd\x46\xa0\x55\x9c\xfd\xda\xe4\xe1\xc2\xa1\x79\xce\xa0\xe2\x6c\x60\xb3\xe6\xcd\x4a\x78\x2e\x7c\xd1\xdd\x1b\x8b\x68\xe1\x08\x24\x5b\xf6\x53\x2b\xcc\x25\xf7\xbd\x6b\x49\x34\x7c\x06\xa2\xe1\x49\x03\x7f\x05\x5d\x51\xef\x52\xea\x1b\x62\xe1\x9d\xe1\x05\x4c\x35\xc7\x3a\x20\x7a\x80\xc3\x82\x82\xcc\x68\x61\x2d\x7f\x2b\x22\x22\xe4\x88\x05\x0b\x97\x28\x61\x32\x29\x8a\x58\x35\x30\x3e\x8a\x02\x13\x44\x48\x84\x65\x37\xc3\xfa\x15\xaf\x3a\xb2\x88\xb3\xea\xd7\xeb\x2a\xda\xaa\x63\xc8\xe0\xd7\xbb\xea\xb5\xf7\xc3\x01\x36\x57\xdd\xbc\x41\x62\xad\x3a\x1a\xf6\xbf\xce\x55\x57\x34\xcb\x44\x59\x5d\x4a\x31\x67\xbe\x72\x66\xcb\xe0\x73\x4c\x41\x54\x21\x65\xbb\xed\x8b\xca\xc2\x6e\xfa\x71\x83\x80\x06\x4a\x1b\x03\xc3\xe0\x69\x25\xc5\x8a\xe5\xde\xef\x35\xa2\xad\x5d\xd3\x24\x15\xff\x8f\x60\xf3\x11\x15\xda\x86\x25\x1a\xb8\x94\x62\x45\xa5\x6c\xaa\xeb\x9b\x51\x3a\x76\x9f\x69\x39\x5d\x6f\xbc\x41\x04\x23\x48\x64\xa4\xc0\x5e\x63\x21\x37\x06\x36\x6f\xcd\x26\xdb\x00\xd1\xc2\x5a\x8f\x32\x02\x66\x0d\x37\x08\x4b\x45\xb0\x5c\x81\x60\x94\xad\xc1\x05\x70\x91\x53\xd7\xf7\x23\x80\xad\x2b\x09\x6a\xe3\xd4\xcd\x68\xc3\x53\xc3\x8d\xb5\xed\x32\x21\x68\xee\x46\x1c\xc0\x11\xe7\xaa\x85\xeb\x19\xf0\x3e\xb8\xe7\x9a\xdd\x7c\xca\x73\xc6\x17\x18\x61\x3e\x06\x49\x0b\x12\x50\xb4\x06\x3a\x9d\x72\x63\xdd\xf3\x07\x28\x31\xdd\x12\x04\x70\x6d\x44\x66\xb3\x39\xf8\x9a\x65\x82\x87\xa4\xd9\xe3\x0a\x62\xf0\xb6\x79\x71\xce\x43\x31\x44\x4c\xc1\x8b\x77\xcd\x25\xf2\x6e\x7e\xf4\xdc\x4c\xc7\x17\x68\xef\xb5\x37\x3a\x60\x7d\x2c\x62\xe3\x86\xf1\xdc\xe5\xc4\xf7\x37\x35\x84\xaf\x0b\x0e\x38\xbf\xcc\x14\xbe\xc7\x7e\x82\x61\xea\xca\x10\x91\xf4\x35\xfc\x95\x43\xbb\xa9\x30\xe9\x04\x5a\xd0\xcd\x43\x51\xb8\x25\xd0\x42\xc5\x43\xd7\x02\xc9\x0a\xb4\x8f\xd6\x09\x14\x56\x37\x0c\xac\xba\xdb\x05\x96\x09\x5b\x02\x84\x3a\x34\x57\xba\x1d\x7a\x98\x89\x9c\x4f\xe1\x3b\x8e\x32\xc7\xac\xef\x04\xb8\x88\xb0\x5d\xdd\xb2\x36\x27\xec\xc5\x53\xdd\xed\x5b\xc6\x73\x71\xab\xe2\xfa\x46\x7f\xb0\x4c\x1b\xc7\x93\x6f\x15\x24\x45\xb5\x66\x7c\xa1\xfa\xfe\x51\x52\x84\xa5\x29\x59\xda\xe5\x20\x0d\xbb\xdd\x73\x29\x6c\x69\xbd\x6d\x07\x5e\x60\x84\xd2\x1e\x42\x8b\xcf\x68\x1c\x8e\xbe\xee\xd6\x6d\x7c\xc6\x2e\x87\x63\x00\xfc\x2d\x39\x1c\x1f\xa2\x45\xa9\xc8\x1b\x69\x26\xa1\x19\x29\xae\x2a\xdf\x16\x78\xb0\x79\xf1\xbe\x79\x7f\x75\x3a\x64\x1c\x66\x79\xdc\x2e\xa9\xb4\x6f\x2b\xc3\x19\x48\x5e\x32\xa5\xfc\x03\xee\x86\x6e\xe9\x6c\x29\xc4\x0d\x1c\x36\x59\xbf\x0b\xa6\x97\xf5\x6c\x9a\x89\xb2\x97\x00\x3c\x51\x6c\xa1\x4e\x9c\x60\x9a\x98\xf5\xf2\x4d\x5f\xc2\x99\xf0\x82\x71\x07\x6f\xc4\x30\x03\xd7\x0a\x84\x7f\xb3\x62\xe8\x96\x24\x6b\x57\x1b\x4f\x7c\x88\xb2\xc5\xb6\xaa\x36\x17\x67\xc7\x46\x5e\x84\x95\xbf\xc2\x82\xe9\x4f\x6a\x3d\x6e\x1f\xfa\x8b\xa0\x7a\xfc\x0f\x1c\xfc\xc0\xf5\xb2\x7d\x04\x6d\xad\x36\x17\x5a\x37\x9f\x11\xc0\x71\xe3\xa4\x38\x2f\xd0\xd3\x7a\xe0\x1b\x4c\x43\xc4\x9d\x40\x6c\x83\x63\x19\xf6\x2c\x6f\x2c\x88\x0e\x25\xd1\xc3\x3b\x04\xb0\xde\x44\x4a\xb4\x98\x87\x00\x9e\x9b\xc9\x7a\x51\x10\x13\xf0\x88\xa8\x09\xd8\x1b\x39\x11\xf0\x01\x43\x83\x25\x92\x15\x00\x77\x47\x49\x03\x05\xfa\xa3\x19\x2e\x10\xcd\x78\x81\xb0\x8b\xef\xaa\xdd\xa6\x36\xc6\xdb\xf4\xff\xb3\xf7\x36\xde\x71\xdc\xc6\x9e\xe8\xbf\x82\xc3\x64\x1f\xc9\x84\x33\x94\xec\xdc\xdc\x44\x9b\x17\x1f\x46\xa2\x1c\x3e\x4b\x14\x9f\x28\xcb\x2f\xcf\xf2\x4d\x30\xdd\x98\x19\x5c\x76\x03\x1d\x00\x3d\xe4\x64\xbd\xff\xfb\x1e\x54\x01\xfd\x31\x33\xb2\xdc\x85\x96\x48\x39\x83\x3d\x67\x6d\x29\xd7\x35\x68\x7c\xd4\x17\x7e\xf5\xab\x7d\x1b\xe3\x9f\x37\xf6\x6d\x8c\xfb\x63\xdf\xc6\x38\x25\x18\xd8\xb7\x31\xde\xb7\x31\x86\xb1\x6f\x63\xbc\x6f\x63\x4c\x1c\xfb\x36\xc6\x1f\x9e\xdc\xbe\x8d\xf1\x67\xdb\x98\x61\xdf\xc6\xf8\xc3\x63\xdf\xa2\x60\xdf\xc6\x78\xdf\xc6\x78\x6b\xec\xdb\x18\xdf\xb7\x6b\xb1\x6f\x63\xbc\x6f\x63\x1c\xc7\xbe\x8d\xf1\x80\xb1\x6f\x63\x3c\x6c\xec\xdb\x18\x7f\x70\x3c\xb0\xc6\x46\xfb\x36\xc6\xfb\xc6\x46\x3f\x57\xce\xc3\x6b\x6c\xc4\xf6\x6d\x8c\x69\x63\xdf\xc6\x78\xf8\xd8\xb7\x31\x1e\x36\xf6\x6d\x8c\x87\xcb\xdc\xb7\x31\x6e\xc7\xbe\x8d\xf1\xbe\x8d\xf1\x67\x7a\x74\xf7\x6d\x8c\xf7\x6d\x8c\x77\x8f\xfd\x1b\xc1\xbe\x8d\xf1\xb0\xb1\x6f\x63\x4c\x17\xba\x8f\xf6\xe9\x72\x1e\x5e\xb4\xbf\x6f\x63\xbc\x6f\x63\xfc\xc1\x91\xe2\xba\x59\x97\x4b\x42\xaf\xae\x8f\x43\xc6\x1d\xd0\xb2\x1d\x82\xb3\x59\x3d\x9f\x0b\x03\x6e\x37\xcc\x94\x94\xb8\xd9\x5d\xee\x8a\x1c\xb4\x4b\x49\x39\xae\x01\xe5\x67\x85\x3b\x01\xde\x70\x8b\x25\x88\x30\x45\x1a\xe0\xb1\x3f\xc5\xc0\xf3\x06\x1d\xaa\x8c\xb0\xb4\xf8\x5a\x2a\x76\xfe\xea\xf9\x74\x04\x1e\xf2\x14\x0a\x4f\x58\x93\x57\x2a\x4b\x85\xbd\xb7\x87\x2c\x8d\x4e\x2f\x52\xe9\x85\xb3\x96\x15\xda\x22\xb6\x16\x37\x2f\x5b\x72\xa5\x04\x85\x85\x18\x15\xa2\x74\x90\x76\x9b\x09\xa1\x98\xae\x84\xc2\xca\x32\xce\xac\x54\x0b\x52\xd9\x32\x77\x8e\x67\xcb\xa9\xff\x7e\x15\x0f\x58\x68\x61\xd6\xcc\x9a\x72\xd5\x9c\x11\xbc\xc4\x83\x66\x44\xc9\x25\x4e\x97\xf1\xcc\x68\x6b\x59\x59\x17\x4e\x56\x09\x13\x66\x56\x40\xc1\xa2\xc5\xea\xd9\x78\x08\x18\xe9\xba\x59\x81\x60\x4f\x20\x8c\x6e\xd6\x20\x2c\x2f\xc9\x05\x6b\xaf\x1a\x04\xf0\x27\xd0\xc8\xb5\xac\xdc\x9a\xf9\xe3\x41\xd9\x7e\xc0\xfd\x4b\x63\x1d\xcb\x0a\x09\x11\x1c\xac\x83\x00\x4b\x06\x73\xa6\x20\x80\xb9\xca\xbd\x64\x15\xf6\xc8\x86\x4d\x52\x39\x38\xa0\x15\xc9\xe1\x87\x62\x26\xf8\x4c\xbc\x4c\x38\xdd\x5c\xda\x10\x50\x58\xd2\x44\x63\x0b\x0f\xbc\x5c\x71\x8f\xe0\x7a\xe5\x44\x2e\xfa\xf8\xcd\x41\x48\x67\xca\x09\xf7\x1f\xba\x6e\x84\xac\x78\x63\x02\xb0\x5f\x46\x54\x90\xa4\xef\xdf\x2e\x6b\x8b\x0c\xec\x60\x20\x08\x22\x3b\x26\x05\xae\xa9\x12\x2b\x6f\xbd\x44\x26\xe4\xca\x3b\xe1\x04\x91\x3b\xed\xc1\x27\x35\x07\x8e\x9b\x85\x70\x4f\xe3\x5a\xd1\xea\x1f\xfb\x7c\xf7\x73\xb4\xc3\x1b\x55\xa3\x49\x4a\x01\x96\xfe\x4a\xe7\xd7\x50\x2f\x8a\x34\xfa\x24\xcd\xb5\xa3\xbe\x2a\x2c\x01\x76\xd2\x19\x49\x64\xa4\x2b\xa0\xd1\xd2\x07\x0f\xc9\x2f\x9e\xad\x78\x26\x2c\x3b\xba\xb8\x7a\x7a\xc2\xae\x2e\x9e\x61\x65\x00\x41\xa6\x9e\xef\xe0\x58\x8b\x4e\x13\xa8\x34\xa2\x8e\xdd\xf5\xf9\xd2\x86\x82\x0b\x82\xcc\xdb\x25\x77\x70\xb1\x3a\x9f\xcf\x8d\xf7\x0f\xb8\xc1\x1e\xbd\xc4\x89\x56\x3a\x9f\xb2\x4b\xed\x44\xd3\x87\x61\x14\xbf\x05\x82\xf0\x90\x6d\x0c\xba\x0b\x7b\xfe\x50\xdd\x3a\x52\xd0\xeb\x84\x29\xa5\x02\xda\xa6\x97\xc2\x5a\xbe\x10\x57\x24\x10\xcb\xfb\x52\x64\x80\x63\x89\x36\x85\x6c\x8d\x0b\xe4\xd8\x6a\x62\xd4\xb6\x92\xe8\x90\x72\x99\x3b\x1f\xcd\x4a\xfc\xea\xe6\xe6\xdd\x1a\xe9\x1c\xe9\x50\x4b\x8b\x9d\xba\x00\xff\xb7\xc9\xe2\x48\x9b\x68\xa7\x4a\x8a\xbd\x8c\x13\xc5\x09\xfa\x9f\xf3\xb1\xa6\xa2\xf1\x13\x22\x58\x71\x66\xa4\x98\xb3\xb9\x84\x62\x24\x28\x9b\x39\xc1\xce\x10\x9c\x32\x5b\xae\x18\xb7\x56\x18\x58\xd7\x50\x36\x11\xd7\x77\xca\xbe\xa3\xf5\x04\x99\x09\xef\x2e\xaa\x8c\xb7\x7d\x56\x91\x55\x49\xce\xd9\x02\x0a\x74\x68\xf7\x9a\x2b\xf6\xbb\x47\x7f\xfc\x3d\x9b\xad\x9d\x08\xcd\xd0\x9c\x76\xbc\x88\x13\x26\x08\x2d\x84\x5a\xf8\xd3\x8e\x9e\x77\x9f\x63\x87\xda\x12\x65\x26\x58\x21\x4b\xe9\x90\xb7\xe7\xf1\x17\x37\xb3\x5e\x6a\x85\x20\xf1\x34\x17\xab\xd3\xce\x0d\x98\x14\x7a\x31\x65\x4f\xb9\xf2\x3a\x9d\xf4\xfe\x57\x57\x39\xe0\x07\x86\xa7\x4d\xc6\x55\x5c\xba\x90\xd9\x3a\xd5\x09\x09\x84\x6a\x6c\xa9\x6f\xb1\x13\x5f\xfb\x3b\x84\xa5\x89\xda\xa5\x2d\x1f\xae\x74\x55\x17\xb0\x5c\xec\x39\x8d\xff\x0a\x34\x55\x6d\xc5\x26\x19\xcb\x7b\x74\x39\x4d\x39\xc4\x69\x6e\xe4\x33\x50\x49\x24\x2c\x84\x0e\x4c\x06\xe1\x91\xb8\xe9\x9a\x43\xb2\x7b\x8c\x3d\xe7\x45\x31\xe3\xd9\xcd\x1b\xfd\x42\x2f\xec\x2b\x75\x6e\x8c\x36\xbd\x15\xa2\xdc\x63\xee\x83\xbf\x65\xad\x6e\xa0\xe1\x73\xf3\xf1\x85\x5e\x30\x5d\xbb\xaa\x26\x25\x71\xe6\x9b\xc7\xa9\x59\x13\x22\x0f\x5a\x13\xe9\x86\xd8\xb2\x33\x53\x71\x27\x69\x2f\x98\xb7\xd2\x2b\x30\xc5\x84\x5f\x47\xd4\x8a\xed\x57\xd3\x62\xfe\x8e\xfa\xfa\xe2\xd1\xef\xfe\x80\x0a\x97\x69\xc3\xfe\xf0\x08\x6a\xab\x49\x51\x2a\xb8\x02\xe0\xed\x49\xcb\x6c\xc9\x8b\xc2\x3b\xa6\x69\x8a\xd1\x5f\xc7\x8e\x22\x6c\xd4\xda\x27\xd5\x6a\x2e\x55\x81\x7d\xc4\x1c\xee\x9b\x37\x7f\x83\x04\xae\x74\x56\x14\x73\x52\x70\x5d\x58\xdd\xf6\xca\x3c\x84\x98\xf8\x30\xf8\x22\xce\xd4\x24\x15\x70\xbf\x59\xd1\x95\x2e\xea\x52\x3c\x13\x2b\x99\x51\x5e\xa7\x7b\x5b\xd7\x93\x45\x27\x30\x28\xa4\x85\x66\x46\xb3\x42\x67\x37\x2c\x0f\xe2\xda\xea\x14\x8a\x17\xb2\x4e\xe5\x24\x4f\xa9\x25\x22\xd7\x10\xbd\x77\x75\xdb\x0a\x20\xd2\x3b\x0d\x67\x25\xaf\x2a\xa9\x16\x7e\x99\x39\x33\xfc\xb6\xb7\xd8\x24\x99\x5e\xf3\x02\xf1\x68\x12\xf1\x7b\x22\xc6\x23\x05\xe1\x31\x09\x5f\x4f\xf4\x39\xc8\xe5\x45\xa9\xe0\x90\x76\xd6\xd4\xf7\xeb\xde\x31\x6b\xc5\xa5\x52\x90\x54\x20\x03\xb9\x27\x46\xea\x4d\xc6\xda\x14\x06\xce\xb3\x09\x7b\xfd\x81\x4e\xa0\xd9\x72\x9a\x8a\x1d\x48\x7e\xb0\x4f\x29\xe6\xea\xed\x9c\x6a\xa0\x11\x25\x77\xa4\x64\x05\x8e\x6e\xfe\x92\xb3\x4a\x18\x2b\xad\xf7\xd1\xdf\x82\x02\x7a\x5a\x70\x49\x7d\xff\x6e\x32\x7c\x95\xa6\x6e\x55\xc2\x72\xa3\x02\x85\xc6\xd6\xa9\x96\xee\x4a\xe7\x41\x1c\x18\x26\x48\x9b\x90\xf2\x9d\x5b\x69\x96\x54\x66\x99\xd1\xdc\xbf\xfb\x34\x75\x6f\xdb\x9d\x4a\xb7\x74\x5e\x4a\x63\xea\x50\x72\x30\x56\x44\x89\x9f\xaf\x81\x83\xb5\xf8\xdc\xec\x5b\x33\xe9\x51\x94\x24\x18\xb6\xe0\xab\xa4\x18\xb7\x36\x56\x6d\x1f\x1c\x97\x22\x28\x05\xb2\xd4\x36\xcd\x12\x32\xb1\xd3\x80\xf9\x56\xe4\x2e\xc7\xcd\x54\xd9\xe1\x93\xc3\x7b\x33\x72\xb8\x89\x46\x57\x7c\x01\xb9\x83\x51\xf6\x72\x53\x28\x79\x85\x72\x81\x69\x0d\x61\x21\x6d\x06\x72\xe1\xf1\x85\xee\xfb\x84\x59\x89\xbc\xe5\x04\x07\xa6\xff\x04\x16\x8d\xce\x91\x0b\x09\x13\x0d\x91\xf2\x6d\x02\xbd\x01\x37\xba\x56\x79\x00\x75\x34\x48\xa2\x97\x1b\x0b\x7b\x49\x27\x22\x84\x34\x4f\xec\x83\xe2\x43\x5c\xa8\x77\x96\x96\xcd\x84\xa3\x77\x19\x91\x8a\x3d\x9e\x3e\x7e\xf4\xf9\xfb\x6c\xb0\x26\x23\xf9\x6c\x97\x8d\xcf\x86\x56\xee\xde\x56\xc7\x08\x9e\xbf\x52\x05\x21\x13\x84\xa3\x5f\x36\x14\x9e\xa4\xbc\xd0\x89\x56\x09\x94\x31\x32\x76\x7a\x07\x51\xb7\x46\xba\x70\x83\x6e\x65\x42\xbd\xe9\x11\x24\x6d\x98\x36\x5d\x4e\xde\xe3\x36\x97\x97\x10\x92\x50\xf3\x41\xe1\xbf\x4f\x6c\x77\xcd\x98\xad\x67\x0f\xce\xee\xa2\x81\x45\xa5\xba\xeb\x3d\x95\xbe\xde\x41\xf2\xb6\x09\x26\x4b\xec\x42\x88\x0f\x0e\xd8\x11\xfe\xc2\x21\x92\x52\x1e\xdf\xdb\xf5\x0c\xdb\x7a\x7e\x57\x91\x1b\x12\xf6\xb6\xf6\xfc\xae\xe2\x2a\x17\x39\x06\xfc\x09\xae\x35\x8b\x2c\xcc\xbb\xf6\x38\xdd\x6c\x1e\xda\xfe\x1e\x93\x25\x76\xdd\xb3\xbf\x88\x25\x5f\x09\xa0\xee\x94\x05\x37\x09\xea\xc9\x69\x76\x8d\x3b\xc3\x66\xb5\x63\x42\xad\xa4\xd1\xaa\x14\x09\x4c\xe7\x2b\x6e\x24\x9f\x15\x82\x19\x31\x17\x46\xa8\x4c\x58\xf6\xeb\xa3\xb7\x67\xaf\xa1\x5a\x82\xde\x4f\x81\x1b\xc1\x44\xdc\xf5\xda\x42\x95\xfd\x48\xb7\xb0\xf3\xd9\xd3\x8d\x0b\x44\x57\xd1\x1b\x17\x2f\xae\xb3\xbf\x01\xf4\x35\x50\x79\xb3\x5f\x7e\x3d\xca\xda\xd5\xbc\x00\xf6\xd6\xac\xa8\xad\x5c\xdd\x87\xfd\x0d\x6c\xba\xcf\x24\xe1\x66\x6f\xb0\x10\xb7\x97\x66\x8b\xa2\x97\xf2\x61\x11\x73\x35\x5e\x3b\xf2\x80\x43\x3a\xb4\x4d\xd3\xa7\x6e\xaf\x1c\xf2\xa3\x1c\x2b\xe5\x62\x09\x09\x94\x4e\x9b\x3d\xb2\xd1\xea\x40\xc3\x4a\x40\x91\xdc\xd7\xf3\x9c\x0f\x3e\xce\x0a\xc9\xed\xb0\x30\x7c\x8b\x5d\x30\xc8\x80\xf6\xb3\x2a\x74\x4b\xe2\xc3\x80\x21\xf1\x7d\xc7\x4f\x09\x1f\xd0\x2f\xae\x02\x42\x35\xee\xa0\x54\xff\x2d\xb2\xa1\x2f\xc0\x4d\x36\xad\xd2\xf9\xa1\x0d\xe2\x01\x7b\x25\xe7\x54\xd6\x73\xf0\xcf\xa5\x45\x3a\xf6\x15\xf4\x7f\x9b\x6b\x03\x1c\xb8\x5e\xfe\xa5\x70\xfe\x76\x0c\x12\x59\xe9\x7c\x10\xa7\x1d\x2d\x1d\x47\x48\xc4\xed\xde\x6b\xb6\xd4\x45\x8e\x2c\xef\xe1\xd1\x68\xe0\x81\x9d\x09\x77\x2b\x84\x62\x17\x57\xb0\xd7\x7e\xd9\x00\xe1\xd8\xdb\xf1\x81\x32\xe3\xf9\x60\x1c\x8e\x21\x34\x05\xe9\xe4\x96\xe3\xee\x0f\x94\xea\xcf\xca\xb0\xe3\x41\xce\xe6\xd1\x93\x62\xcd\xfa\x25\x6a\xf8\xbf\x36\xfb\x10\x49\x14\xf8\x4c\x93\x28\x19\xfc\xc6\xe6\xb9\x21\xf5\x4f\xb9\x97\x5c\x73\x82\x81\x95\x55\x2a\x3e\xab\x59\xac\xf8\x26\xb6\xa4\x15\x61\x83\x62\x83\x83\xff\x09\x2d\xc8\xc5\xd5\x53\xb2\xf5\x38\xfc\x36\x40\xbe\xbc\xa0\xc3\x43\xcb\x64\x95\xb5\x58\xe7\x61\x1f\xd1\xe2\x73\x23\x7a\xa2\x89\x96\x87\x80\xf8\x68\x21\x72\x47\xf1\x27\x99\x52\xa6\x50\x88\xf7\xad\x02\x87\x2a\x01\xe7\x0d\x38\x19\x80\x78\xf7\xd6\xd7\x46\xe9\xd4\x25\x8e\x05\x29\x68\xe2\x01\xa6\x14\x8b\x1b\x2a\x6d\x9c\x1d\xce\x78\xdf\x75\xcf\x9a\x12\xee\xd6\x2e\x93\x08\x7c\x28\x49\x12\xfa\xae\x5f\x5d\x3c\x1b\xef\xf8\x57\x32\xff\x6c\x8f\xff\xd0\xfc\x67\x9f\xe7\xad\xd7\x3a\x26\x8a\xa3\x54\xcb\x5c\xe9\xfc\x3d\x81\x45\xeb\x04\x0c\x7e\xb5\x8a\xc7\x34\xd4\xfa\x71\x86\x8f\xb1\x93\xd8\x5d\x17\x8a\xb8\x87\x9f\xb7\x81\xda\x16\xc2\x85\xab\xba\x28\xae\x45\x66\xc4\xb0\x07\xeb\xfe\xb9\xbb\xd8\x90\x34\x86\xeb\xde\xc9\x27\x00\x17\x74\x10\x8c\x0e\x98\x1d\xba\xe2\xcd\x2d\x08\xdc\x7f\xe0\x91\x54\x75\x51\x00\x47\x8e\x5a\x53\x8e\x06\xac\x1f\xbe\x3c\x20\xfa\x4b\xda\x58\x47\x85\x85\xa0\xcd\x79\x19\xa8\x6d\x85\x15\xcd\x07\xc7\xa3\x52\x71\x6b\x11\x21\x2a\x55\x2e\x57\x32\xaf\x07\xae\xab\xff\x58\x88\x11\x03\xeb\x0e\xbc\xba\x34\x9e\x59\x49\xea\x14\xf8\x5c\x1b\x26\xee\xb8\x17\x79\xd2\xd4\x9e\x73\x0b\x17\x2d\xd7\xd9\x8d\x30\x27\x6c\x70\x3e\xfd\x19\xfc\x87\x4f\x21\x32\x86\x83\xdd\xac\x05\x37\xfe\x2e\x2b\x6d\x86\x86\x58\x03\x89\x10\xda\x92\x84\x53\xdc\xe3\x5f\xe1\x56\xae\xa5\x5a\x4c\xe0\x6f\xfc\x62\x86\x59\x4d\xb4\x9a\xf0\x89\x57\x06\x0f\x3e\xe0\x82\x66\xe0\xaf\x20\x92\x78\x1d\x6f\x57\x4c\x1f\x0c\x0d\x64\x84\xd2\xf5\x62\x09\x8b\x6a\x4a\x1e\x5a\x73\xb1\x42\x38\xe8\x81\x83\x78\xd8\x81\x22\x91\xe8\x3d\xcc\x2b\x0f\x21\x4f\xb7\x23\xd4\xe0\x5b\xcf\xa8\xd6\xef\x1e\x82\x2e\xda\x7b\xdf\x06\xdf\x49\xa7\x91\x68\x58\x49\x12\xed\xd7\xc0\xfb\xa2\x57\xc2\xac\xa4\xb8\x3d\x0d\xae\xe6\xe4\x56\xba\xe5\x04\x57\xcf\x9e\xc2\x16\x9c\xfe\x0a\xfe\x41\x98\x0b\x92\x85\x9d\xe5\x79\x78\x8a\xae\xad\x98\xd7\x05\x3e\xf2\xda\x29\xe3\x95\x7c\x2b\x8c\x95\x9a\x54\x72\x7e\x23\x55\x7e\xc2\x6a\x99\x7f\xf5\x89\x0a\x73\xa4\x92\x6d\x41\x70\x82\xc5\x7d\x11\xac\x64\x60\x6a\x95\xff\xc2\x2b\xd8\x6a\xae\x41\x9f\x33\x13\x85\x56\x8b\x0e\x93\x2d\x38\xfb\x17\x4a\x3a\xaa\x44\x4c\xdf\x43\x37\x38\x48\x6d\x6a\x93\x43\xb1\xb8\xf4\xe6\x46\xd3\xe7\x09\x7d\x06\x3b\x05\xed\xde\x74\xcb\xde\x3c\xa1\x54\x66\x60\xc1\x44\xe4\x02\xc3\x72\x80\x48\xd2\xe8\x34\x5b\xf2\x95\x68\xfa\x0f\x0d\xac\xeb\x97\x96\x2d\xb9\xca\xe1\x3f\xcd\x32\x6d\xf2\xb0\xbe\xd2\x35\x55\xf9\x58\x8e\x35\x34\x5d\x18\xa0\x93\xde\x72\x73\xb5\xf9\xf5\x90\x39\x34\xe5\x40\xe7\xa0\xfd\xef\x63\xd0\x54\x2b\xf9\xcf\x5a\x30\x5e\x6a\xef\x20\x25\xf4\xc2\xdf\x38\x45\xac\xe4\x6b\xf0\xa6\x61\x69\x5f\x44\x7e\xa1\x61\x87\x0b\x1b\xc1\x9d\xb0\xd7\x82\xe7\xb2\x43\xd6\x7b\xc2\x5e\xf4\xd9\x7b\x87\x1d\x03\x6d\xd8\x35\x52\x5c\x86\xff\x1c\xab\x7b\x8c\xb0\xba\x36\x99\x78\x8d\xc0\x38\xef\x3c\x0d\x3b\xb6\x7a\xbe\x63\xa3\xfc\x0d\x71\xfc\x46\x28\x4c\x2a\xfb\x23\x32\x14\xe1\x99\xd7\x06\xee\x43\xb6\x14\x79\x0d\x9e\xec\x6c\xcd\xe6\xde\x3f\x0c\xaf\x65\x4b\xb9\x58\x8a\x81\xa9\x9f\x90\x26\x38\x85\x9a\x24\xec\x9b\xca\xb3\x65\xb3\x08\xa0\xf6\x86\x2d\x6b\xc3\xeb\xd1\x3e\xe3\x95\xfc\xce\xaf\x0a\x98\x2a\xee\x08\x14\xb8\x21\x9f\x68\xeb\x32\xda\x3b\x3c\xf5\xdd\x63\xca\x5e\xf8\x4f\x18\xae\xb7\x78\x55\x15\x32\xfa\xda\xfd\xc3\x0b\xd5\x07\xe1\x1d\x76\x90\xdc\x39\xb7\x4b\xa9\xd5\x96\x52\x65\x19\x3e\xd6\x64\xb5\xf1\xc6\x7a\xa0\xab\x3c\x13\x8c\xe7\xb9\xf7\x95\x0c\x33\xa2\xd4\x2b\xaf\x15\x13\x9f\x7f\xd2\x48\xc3\xfc\x82\x4d\x3a\xfe\xf3\xc3\x77\x8a\xcf\x02\x5d\x11\x6e\x7b\xb6\x61\x47\x07\xbb\xb0\x1c\x1d\xe0\xd8\x39\xca\xd4\xaa\x2d\x5b\xf1\x56\xf5\xd3\xb8\xa1\x34\x0c\x2f\x01\x7f\x4b\xf7\x77\xb9\x59\xa4\xbe\x2f\x1c\x9e\x99\x45\x0d\xea\x38\xfa\x2d\x6d\xeb\x76\x8a\xdb\xeb\x95\x3d\x86\xad\x18\xdb\x1f\x1e\x5a\xf6\xf4\xe5\xb3\x08\x2f\x24\x48\x94\x21\xc3\x19\x38\xd4\x2a\xa3\x57\x12\xda\x0f\xbe\x0d\xb0\x09\xca\xa3\xf4\x4e\xa0\x45\x0f\x30\x41\x90\xba\x0b\x62\x71\x68\x7b\x58\x09\xda\x93\x3c\x6f\x21\x22\x59\xa3\x99\xbc\x35\x29\x56\xb4\x27\xf4\x5e\x98\x18\xb3\x0e\x52\x55\xb5\xa3\x23\x96\x9a\xbc\xb1\xca\x96\x5c\x2d\x10\x4a\x2a\x12\x81\x2c\x76\xad\x1c\xbf\xf3\x5f\xed\x45\x0b\x9b\xf1\x4a\xe4\xa1\x7c\x98\xe5\xba\xa6\x6d\xff\xaf\x7f\x7d\xc2\xa4\x78\xc2\x7e\xdd\x99\xdc\x94\x9d\x07\xe9\xed\xe1\xa0\xae\x02\x32\x2f\xcd\xda\xc3\x74\xc2\x8c\x58\x70\x93\x17\xb4\x26\x3b\x7a\xce\x6e\x3b\x74\x76\xcd\x61\x10\x77\xd2\x3a\xcb\x48\x94\x33\x4a\xbb\x5d\x76\xae\x63\xbb\x08\x42\x7f\xc2\xda\x39\x6e\x6f\xbc\x6d\xf3\x7a\x78\x92\x73\xc7\x27\x1d\x63\x71\x8a\x59\xdb\x49\x68\xb2\x3c\xe1\x41\x29\xb5\x66\xf0\xf4\x57\xa6\x56\xca\x07\xc6\xbc\xf9\xbf\x92\x6a\xc2\x27\xd0\x92\x97\x1a\x79\x7e\x3e\x2f\x9a\xe4\xee\xe5\x7d\x6d\x7f\xde\x28\x77\xfc\x76\x60\x1c\x22\x7c\x49\x13\x97\x36\x86\x39\xb4\x46\x6e\xf5\x3f\x45\xd5\x47\x8b\x71\x7e\xf9\xe6\xf5\xdf\xae\x5e\x5d\x5c\xbe\x89\x86\x23\x9a\x01\x8a\xd4\xf7\x19\x8e\xb4\x9b\xfe\x3e\xc3\xd1\x9a\x81\x14\x20\xd2\xa6\xe1\xe8\x9b\x01\x8a\xe4\x6d\xc3\xd1\x37\x03\x94\x95\xdd\x36\x1c\x3b\xcc\x00\xd1\x8b\xe8\xae\xef\x4e\x33\x40\xd2\xce\x1d\xc3\xb1\xdb\x0c\x10\xa4\x6e\x1b\x8e\xbe\x19\x20\xdd\xaf\x6d\xc3\xd1\x31\x03\x44\x93\xbf\x6d\x38\xba\x66\x80\x20\x74\xb7\xe1\xd8\x9b\x81\x9f\xf3\xa3\x24\x33\x20\xd4\x2a\xd1\x04\xc4\xac\x67\x47\xb9\x34\xe7\x82\x44\x72\xd6\x6b\x32\xdb\xa1\xef\x1b\xe3\x50\x7d\x1e\xfb\xd9\x87\xd9\xab\xd5\x5b\x6e\x98\x11\x95\x11\x16\xe2\x2a\x62\x59\xc7\xae\x0d\x62\x41\x28\x8d\xba\x90\x31\xde\x22\x86\x3f\xbb\xaa\xd8\x7b\xaa\x6b\x1d\xad\x86\xac\xfb\xb0\x34\x66\xd5\xc0\xb4\x69\x37\xc4\xd9\xd3\xbf\x5f\x3c\x3b\xbf\x7c\x73\xf1\xfc\xe2\xfc\xf5\xbd\x15\xae\x24\x35\x72\xed\xbb\xab\xe3\x78\x6a\x38\x7e\xda\x5f\x23\x8b\xc5\x5e\x06\x62\x25\x75\x0d\x10\x77\x00\x9f\x8c\xb9\xbf\x76\x4b\xb7\x92\x45\x02\x0f\xb4\x5a\x43\x83\x56\x99\x8d\x7b\x0c\xed\x74\x67\xa6\x82\x2c\x77\x54\x47\x15\xc7\x4f\xb8\xab\x64\x99\xa3\x66\x3b\x70\xbc\x3f\xe7\x41\xdf\xf8\xb1\x5d\x5e\x1c\x3f\xe9\xf8\xa6\xec\xfc\x7b\xdc\x5f\xb2\xc8\x9f\xc8\x9e\x90\x65\x46\xe7\xb9\x5f\xfd\x44\x6e\x84\x34\x8e\xda\x7d\x6e\x74\x39\x8a\xea\xbd\xc6\x97\xaa\x00\x6d\x22\x2f\xd2\x2e\x27\xe6\xd0\x0e\x07\xe7\xf5\x47\x27\x6d\x15\x52\x03\xb1\x65\x0b\x59\xa4\x97\x07\x34\x87\x69\x66\x33\xa9\x85\xfe\x18\x7d\xe7\xb1\x1a\xea\x25\xaf\xbe\x11\xeb\xd7\x22\xa1\x57\xd2\xe6\x79\x10\x85\xc8\xbc\x33\xcb\x6e\x04\xbd\x78\x92\x85\x97\x5c\xf6\x34\x4e\x33\xa5\xc9\xd4\x08\x4b\xce\x92\xfb\xcd\xe1\x98\x24\x2e\xcb\x18\x5b\xef\xc7\x8d\x20\x97\xf3\xc7\xb1\xd5\x42\x3f\x75\xc3\x59\x8c\x12\xfd\x09\x4a\xd9\x6f\x36\x4e\xb7\x38\x1c\x29\x7e\x7d\x1c\x3b\x91\x63\xe9\x6b\xd5\x45\x9e\x41\x5a\x25\x59\xe4\x03\xc1\xa1\xf5\xc7\x6e\x54\x5a\xb2\xd8\x71\x50\x6d\xfd\x91\x82\x71\xeb\x8f\xd1\xce\x6f\x04\x86\x8f\x7a\x86\x11\xf3\x9f\x7e\xdd\xbb\xfe\x56\xa3\xea\x93\xa5\x22\x27\xac\xd7\x47\x11\x62\x95\x2c\x32\x04\x6c\xa3\x6c\x6a\x0a\x87\x07\x8b\x07\x77\x4c\x9b\x7d\xd8\x18\xed\xa4\xef\x43\x2e\xa0\xa6\x9f\x65\xfe\x24\xb6\x93\x48\x53\x01\xa5\x70\x3c\xe7\x8e\x4f\xbd\x36\x39\xe9\xff\x11\xe0\xc6\x69\xd7\xf6\x1f\x8d\xc0\x82\xcf\x44\x61\xbf\x3f\x3c\xfc\xd3\x37\xe7\x7f\xfb\xf3\xe1\xe1\x0f\xff\x18\x4b\x32\xb8\xa1\x58\x04\x30\x9e\x78\x5b\x89\x6c\xaa\x74\x2e\x2e\x61\x5d\xe0\x8f\x21\x60\x3f\x43\x80\x1b\xfc\x0f\x69\xbf\x01\xfc\xea\x53\xac\x15\x3c\x89\x7f\xac\x74\x7e\x71\x35\x8a\x60\x90\x64\x13\x9a\xc2\x3e\x30\xe7\x0e\xae\x00\x91\x91\x2f\x8e\xb1\x5c\xbc\xd6\xae\x8d\xaa\xfa\x83\xcc\x74\x25\x8d\x7a\xc2\x66\x4b\x51\xf2\xa4\xd8\x31\x8e\xe7\x71\xf1\x99\xb4\x09\x7d\x53\xfa\x43\x2a\xe0\xc8\xb7\x4c\xcf\x47\xe9\x86\x8c\xc3\x69\x76\xb0\x7a\x7c\xf0\x60\x9c\xdc\xe6\xdc\x8e\x7a\x54\x60\x2f\x46\x72\x74\xd1\xb8\x34\xe1\xc1\x28\xfb\xba\xec\xd4\xab\xb2\xb3\xab\x8b\x64\xa1\x2b\xbc\x1b\x0f\x62\x5b\x23\x88\xf8\xf9\x03\xf5\x16\x1a\x90\xf3\x26\x97\x74\xda\x11\x04\x66\x8f\x28\xdb\x62\xb7\x87\xb4\xfb\xca\x55\x1e\x81\xda\x96\x1d\xa1\xc0\x69\x56\xd5\x69\x06\x30\xc8\x29\x45\xa9\xcd\xfa\x24\xfe\xb1\x69\x42\x36\xb1\x4e\x1b\xbe\x48\x34\xdf\x71\xda\x30\xdd\xf6\x4f\xf8\xa3\xa3\x2d\xca\xf6\xac\xe9\x39\x6d\x16\x70\xe1\x0d\x46\x3b\xfa\x90\xa4\x7e\x3e\xed\x78\x50\x5e\x42\x3c\x9e\x0f\xc0\x49\xc8\xd2\x1a\x26\xf6\x47\x5f\x4d\x3c\x4d\x7e\x86\x8a\x03\x52\x30\xcd\xda\x13\x5b\xe7\xf5\x47\x60\xfb\x3e\xa1\xd5\x4d\xef\x1a\x50\xbd\xa1\x56\x6c\xc5\x0d\xb1\x61\x77\x3b\x46\xb3\xeb\xb9\x5c\x49\xab\x13\x55\xea\xfb\xea\xfd\x47\xb1\xeb\xa1\x95\x0f\x56\xb6\x8e\xe5\x54\x8a\xbb\x0a\x3a\xbb\x36\x76\x20\x3d\xb3\x93\x77\x5f\x6f\x1e\xd3\xc9\xeb\x70\x54\xdc\x39\x61\xd4\x13\xf6\x5f\x47\xef\x7e\xfb\xe3\xe4\xf8\xab\xa3\xa3\xef\x1f\x4d\xfe\xf8\xc3\x6f\x8f\xde\x4d\xe1\x5f\x7e\x73\xfc\xd5\xf1\x8f\xf1\x0f\xbf\x3d\x3e\x3e\x3a\xfa\xfe\x9b\x97\x5f\xbf\xb9\x3a\xff\x41\x1e\xff\xf8\xbd\xaa\xcb\x1b\xfc\xd3\x8f\x47\xdf\x8b\xf3\x1f\x7e\xa6\x90\xe3\xe3\xaf\x7e\x9d\x38\x71\xae\xd6\xaf\x92\x5c\x09\x06\x1a\x30\xbd\x37\xfd\xb6\xb4\x11\xae\x0b\x63\x77\x93\x36\xe9\x39\x91\xca\x4d\xb4\x99\xa0\xe0\x27\xc0\x36\x3b\x8a\xcb\x33\xae\x9e\x7d\x3d\x82\x4d\xea\xcf\xaf\x75\xb3\x1f\x84\x22\xc3\xe2\xff\x87\xfd\x4e\x85\x73\xec\x71\x96\x25\xbf\x3a\x40\x72\xeb\x97\xe2\xf3\xec\x9f\xbd\x7e\x6a\xc4\x64\x08\x9e\xa2\xf1\xa2\xdc\xb9\xd1\x65\xec\x39\x00\xc0\x2f\xe0\x3c\x4c\x16\x1b\xe6\x79\x23\xc8\xaf\xe0\x71\xec\x9f\xe9\x28\x63\xff\x4c\x97\x36\xf6\xcf\x74\xc3\x46\xf7\x99\x0e\x69\xa7\xf6\x6f\x74\xbb\x86\x50\x2b\x1a\xb0\x6a\x27\xf2\x3e\xe6\xb0\x3a\xed\x6f\x09\xdf\xb6\x13\xbf\xbf\x0d\xc3\x27\x48\x0e\xc6\xaf\x45\xb3\xb6\x35\x5e\xd4\xf4\x46\xb9\x1b\xa1\xcc\xce\x8a\x82\x49\x45\x35\x5e\x30\xc9\x58\x6f\x64\x04\xa6\x93\x22\xd7\xec\x8a\x06\x6a\xbd\x5d\x8a\x8d\x25\x04\x4e\x45\xc7\x8d\x93\x6a\x41\x59\x4e\xe8\xd9\x02\xee\x68\x2c\xbb\x91\x8a\x95\x75\xe1\x64\x55\x08\x96\x10\xc8\x22\x98\xb1\xa8\x05\xe3\xd6\xea\x4c\xf2\x58\x8f\x07\xff\x4b\xc1\x49\x7c\xa5\x21\x52\x80\x55\x75\xfc\x06\xb0\xcd\x99\xc8\x85\xca\xc4\x94\xbd\xf5\xbf\x46\xb1\x28\xf1\x24\xcd\xd6\x7e\x6f\xce\xd5\xaa\xa9\xc4\xaa\xb1\xf8\x87\x72\xa8\xfc\x8a\xee\x9e\xe7\xbf\x6f\xe9\x89\x57\x53\x01\xba\xd9\x56\xa0\x90\x34\x27\xf8\xad\x4d\x26\x9f\x43\x91\x8f\x9e\xb7\x68\x0e\x52\xad\x50\x5a\xe4\x92\x1a\x2d\x34\xd8\xc8\x84\x80\x73\x2b\x4c\x68\x16\x24\xa5\x67\x14\x86\x05\xe0\xd6\x13\x65\x3c\x10\xf8\x69\xaa\xbb\xfe\x5e\x2e\xb6\xc4\x04\x4d\xd7\x4d\x7f\x78\x6e\xf6\x47\x70\xb1\x77\xb8\xd7\xe8\x1e\x27\x49\x4d\x75\xad\x47\x71\xab\xc7\x70\xa9\x77\xb9\xd3\x09\xc5\xb5\xed\xe8\x21\xde\x46\x71\x81\xd3\xdd\xdf\x74\x78\x5a\x65\xc4\x5c\xde\x8d\xa2\x33\xcf\x5a\x4e\x5b\x26\x73\xa1\x9c\x9c\xcb\x94\x46\xc3\xda\x4f\xae\x12\x0a\x40\x04\x40\xb3\xe5\xfd\x82\xc4\xd6\x46\x2d\x3c\xfd\xa1\x15\xd7\x61\x8a\x66\x4c\x03\x76\x3d\x56\x72\x6a\x6f\xbd\xf6\xd6\x6b\x6f\xbd\x3e\x34\x1e\xbc\xf5\x0a\xfa\x20\x86\xec\xf7\x6b\x7e\x80\x11\x26\x95\xf4\xe6\x59\x87\x8f\x0c\xee\x38\x39\x5d\x9b\xc0\x7f\x4d\x4a\xc4\x74\x3b\xb1\x36\x56\xd3\x69\xc6\x8b\x42\xdf\x12\x24\x02\x99\xa5\x61\x85\x58\x89\x22\x84\x43\xac\xe4\x8a\x2f\x80\x91\x93\x16\xc1\xc4\xb6\x5e\xda\x30\xaf\x70\x8c\xcc\xc5\x66\x3f\x2d\x12\x6b\x8f\x62\x91\x17\x11\xc4\x19\x5d\x14\xc2\x58\x56\xc8\x1b\xc1\x9e\x89\xaa\xd0\xeb\xe1\x2c\xa2\x38\xa0\x27\x9c\xe3\xce\xab\xa9\x6b\xe1\x28\x38\xe5\x94\xde\x34\x91\xe8\x1f\x99\x6b\x53\x0f\x37\xf4\x0d\x00\x66\x7a\x56\x21\x15\x2e\x7b\x45\x6a\x03\xac\xe7\xec\xac\xb8\xe5\x6b\x7b\xc2\x2e\xc5\x4a\x98\x13\x76\x31\xbf\xd4\xee\x0a\x93\x08\x14\x87\xa7\x5b\x19\x8b\xa2\x99\x9c\xb3\x27\x05\x77\xc2\x3a\xe6\x38\x45\x89\x4a\xdb\xed\x21\xa1\x4d\x6f\x92\x6d\x9f\xd8\x71\x7a\xf2\xa7\x93\xde\x83\xa4\x86\xf2\x9e\x00\x20\x4a\x38\x68\x45\x24\x06\x4e\x3c\x62\x67\x48\x15\x8c\xc4\x9c\xc8\x3c\x1b\x35\x06\x25\xc1\x08\x6d\x3a\x62\xff\x56\x48\xdd\x49\xc5\x8c\xb0\x95\x56\x56\xd0\x54\x50\xab\x6e\x9a\x6f\xc6\x04\xb0\xbd\xd7\x5c\x20\xd1\x9f\x4d\xf3\x64\x2b\x6d\x1d\x30\x30\xd3\x1c\x8c\xbe\x72\xb9\x8a\xc2\x80\xd6\x9b\x17\x05\xd9\x11\x90\x65\x29\x72\xc9\x9d\x28\xd6\x8c\xcf\x9d\x30\x8c\x27\x13\x5a\xf8\x39\x19\xc1\x23\x8f\x39\xb0\x35\x03\x5b\x38\x89\xc0\xbc\x1d\x5b\xe9\x7f\x6c\x3b\xcf\x87\x76\x3a\x6c\x07\xc2\x6a\x03\xe9\xfa\x16\x95\x39\x51\x68\x10\xd8\xaa\x7d\xf0\xbe\x93\x2e\x27\x6b\x31\x0b\xed\x02\xcc\x0a\x9d\xdd\x58\x56\x2b\x27\xa9\x5e\x3d\x76\x10\xd2\x37\x2c\xd3\x65\x55\x80\xf2\x4c\x23\x9a\x64\x3f\x4d\x36\xb9\x4b\x23\x37\xff\x3a\x69\x94\xc4\xc4\xcf\xc9\x9e\xfe\xaa\xfd\x9f\xe0\x2f\x68\x31\x42\x72\x0c\x9b\x1e\xc1\x8a\x3b\x91\xd1\xe3\x8a\xde\xd5\x7f\xa5\x04\x9c\xda\xa4\x56\xee\x8c\x69\xd5\x14\x02\xcc\xb5\x77\x5a\x81\x6c\x3d\xad\xaf\x33\xdb\x68\x48\x76\x7e\x27\xb2\xe6\xcf\x29\xa1\x2c\x74\x57\xcc\x62\x1f\x16\x6f\x9a\xe8\x30\x98\x51\x40\x5a\xe3\xc0\xa3\xc8\xd4\xa1\xdd\xb1\xd1\x76\x18\x24\xa6\xf0\x6d\xe0\x40\x45\x83\xc2\x0a\xa9\x88\xe6\xbf\x3b\x02\x31\x69\xb7\xe5\x4d\x73\xbb\x53\x01\x26\x5e\xd8\x56\x97\xe5\x44\x99\xb1\xab\x67\x5c\x85\xf4\x35\x35\x5a\x3b\x76\x74\x78\x7a\x78\xbc\x85\x06\x48\x04\x2f\x62\x37\x4b\x74\xe0\x90\xee\x28\xcc\x3a\x51\xaa\x84\xbe\xec\x15\x34\xe5\x16\xd9\x61\x7e\xc2\x64\x2a\x10\x25\x70\xbe\x9a\x5a\xc5\x93\x90\x56\xd5\xc4\x90\xdf\xf6\x84\x59\xcd\x9c\xe1\xb9\x1c\xa5\xba\x00\x64\xfa\x09\x3a\x53\x07\x27\xfb\xe8\xf0\xc7\xc3\xd4\x73\x2a\x5c\x76\xcc\x6e\xb5\x3a\x74\x70\x5c\xa7\xec\x4d\xea\xad\xaa\xad\x88\x14\xbf\x27\xc0\xcd\xaf\x44\x3a\x20\x47\x33\x71\x57\x15\x32\x93\xae\x58\x83\x73\xc9\x74\x9d\xba\xef\xc0\x61\xcf\x5d\x64\x23\x3e\xbf\x4b\x3e\x49\x58\xd1\xec\x8d\xd8\x23\x70\x05\xd1\xe1\x4c\x14\xca\x2d\x2b\xe4\x4a\x9c\x2e\x05\x2f\xdc\x72\x3d\xb8\x2f\xce\xf6\x50\x5a\x4d\xfe\x25\x8c\x06\xbe\x64\x15\xe4\xa6\xa1\x38\x53\x00\x0d\xdd\x41\x06\x37\x6c\x4f\x26\x29\xf7\xea\xfd\xc5\xaf\x05\x31\x2e\x62\x5b\xad\x61\xdf\xbc\xb9\xfa\x5a\xb8\xd1\x1c\x0f\x3f\xbb\x58\x7a\x07\xaf\x5a\xc2\xcc\xb5\x29\xef\xd9\x03\x49\x07\x89\x4f\xa0\x0f\xed\x3d\xbb\x40\x4b\x6d\x13\xf6\x9d\xed\x6e\x0b\x4c\xe3\x23\xed\x0e\xec\xe2\xa5\x44\xe6\x77\x7c\xb4\x32\xf4\xb6\xff\x18\xbb\xb8\x9a\xb2\xbf\xe9\x1a\x5a\x31\xf1\x59\x92\x27\xef\x47\xec\xc8\x62\x85\x63\x07\x7e\x11\x0e\x52\x1e\x5a\x71\xf8\x73\xff\x57\xc1\x73\x6c\x0d\x64\x9d\xe0\x24\xc6\xf0\x76\x8c\x04\xdd\xed\xcc\x6b\x4c\xcf\xb9\xb6\x4e\x97\x6c\x89\x82\xd3\x37\xba\x43\xbd\x1c\x74\x47\x2a\x72\xdf\xeb\x35\x7c\x5f\xb0\xcc\x88\x6a\x0c\x6b\x17\xbe\xf6\x17\x64\x8d\xb6\x2c\x01\x9e\x94\x44\xa9\x51\xee\x4c\x58\xc6\x59\x06\x47\x25\x59\x24\x2e\xbe\x3f\x2b\x81\x2e\x31\x59\xa2\x54\x78\x48\xb0\xbf\xdb\x28\x76\x3d\xb9\x98\x89\x8d\x54\xd0\xc4\x52\xa8\xa6\xfb\x42\x86\x37\x64\xdb\x1e\x63\xd5\x47\xb1\x91\x2a\x69\xd8\x0e\x00\xc9\x08\x22\x9b\x53\x8a\x8f\x9d\x23\x2c\x3f\x1b\xb3\x86\x83\xa5\x92\x5a\x77\xc7\xc7\x5f\xbe\x31\x0e\x1e\x1b\x6f\xfd\xaa\x64\xfa\x99\x6d\xf2\x19\x6c\xf6\x48\x6b\xa6\xd4\x1d\x1a\x4d\x27\xa8\x33\x2b\xcc\x8a\x56\x30\xd1\x8e\xb1\x96\x4c\x53\x9f\x6f\xe2\xd8\xc1\x3c\x6f\x98\xaa\xcb\x59\xb2\x91\x6a\x78\xe0\x8c\x1b\x7b\x1b\x3a\xcd\x23\x2e\xc7\x98\x6a\x84\xb0\x44\x07\x89\xab\x45\xea\xbd\x78\xec\xbf\xf9\xf7\xff\xf1\x1f\x5f\xfe\xc7\x14\x97\xd5\xff\x46\xa2\xcc\x99\x60\x5c\xb1\x8b\xb3\xcb\xb3\xbf\x5f\xbf\x7d\x0a\x9c\xdc\x69\xa7\x70\x84\x62\xfe\x31\x4b\xf9\x47\x2c\xe4\xff\x88\x65\xfc\x40\x58\x96\xa8\xe1\xfb\xb8\x2c\x10\x98\x9e\xd1\xae\x2d\xd2\x70\x87\x48\x11\x9f\x0d\x47\xc8\x64\xfb\x98\xb8\xc7\x5e\x3e\x42\xe0\x70\xef\xda\xd3\x65\xd5\xb5\xce\x6e\x46\xcb\xf2\x1c\xbe\x79\x7a\x85\x02\x47\x49\xf4\x70\x15\x1f\x98\xa4\x5a\xe9\x62\xe5\x37\x93\xb3\x37\x4f\xaf\x12\x8d\xc5\xd4\xcb\x80\x17\x56\xcc\x7b\xaf\x93\x2a\x39\x1b\x6a\xa6\x00\xed\x94\x65\x55\xa4\xbc\x28\x33\xe8\x40\x60\x04\x2f\xa4\x75\x32\x83\xb9\x16\xa4\xae\xd5\xfd\xe1\xbf\x97\x8e\xe7\xdc\xe7\xc7\xda\x31\x72\x7e\xec\xf0\xd5\x48\x55\xcf\x4d\xa2\xad\x93\x2a\x4b\x4e\x9a\x9c\xf4\x48\x7f\xd2\x19\x2a\x43\xa2\x2d\xad\xe4\xfc\x81\x7a\x8e\xe0\x86\xd1\x1a\x8c\x76\x87\xea\xf4\x3e\x0a\x9e\x63\xea\x0b\x0a\xf8\x9d\xdb\x9e\x63\xa2\xd8\xf0\xc1\x7d\xcf\x31\x35\x2f\xe1\xfd\xce\x2d\xcf\x71\x24\xdf\x76\xef\x39\xfe\xbc\xf1\x11\x3c\xc7\xca\x88\x6b\xa7\xab\x51\x70\x76\x28\x6a\x54\x94\xdd\x4c\xcc\xb5\x11\xe3\xc0\xec\x5a\x00\x1c\xcb\x6b\x50\xc6\x5c\x25\x30\xab\xc6\x67\x2e\xdd\x85\xab\x91\x4b\xf6\x19\xb8\x2c\xd9\x32\xbe\xaa\x2a\x61\xed\x29\x40\xe3\xea\x0a\x93\x94\x44\xa1\x73\x2e\x8b\xda\x88\x13\xbf\xd3\xa2\x84\xbd\x3a\x49\x25\x79\xf4\x9b\x21\x14\x8a\x12\x2e\x43\x18\x45\x40\x2d\xd2\xf7\xc7\xfb\x7c\x78\x70\xb0\x4f\x6e\x7a\xb3\xb0\xcc\x70\xbb\x14\xd0\x22\x54\xdc\x49\x67\x71\xa2\x46\x70\x4b\xe6\x88\x06\xa8\x4b\x38\x48\xe0\x02\x5b\x56\x71\x6b\x45\x4e\xb7\x06\x1d\xc8\x27\x4e\xf0\x4a\xe7\x87\x87\xb6\xfb\x33\x44\xc9\x0b\xc3\x33\xc1\x2a\x61\xa4\xce\x19\xb0\xae\xe7\xfa\x56\xb1\x99\x58\x48\x45\x8d\x00\xc2\x8d\xf4\x93\x8e\x17\xde\xbb\xb0\x22\x01\x48\x15\xfb\x30\x4f\xd9\xeb\x5e\x9f\x58\xba\xd5\xd2\xb5\xcb\x74\x6b\xad\xc3\xea\x9e\x24\x48\x6c\x91\xa4\xc0\xd6\x00\xd7\xbc\xe6\x45\xb1\x6e\xd5\x0a\x51\x72\x20\x26\x71\x1f\x6b\xe3\x3f\x33\x4c\xad\xbf\xac\xa9\x12\xbb\x17\xb4\xbb\x14\x74\xdd\x64\x04\xcf\x96\x69\xc5\x14\x7b\xe8\xee\x07\xc6\x1e\xba\xbb\x87\xee\xbe\x77\xec\xa1\xbb\x7b\xe8\xee\x1e\xba\xbb\x87\xee\xee\xa1\xbb\x7b\xe8\xee\xc0\xb1\x87\xee\x7e\x68\xec\xa1\xbb\xef\x1d\x0f\xf2\x69\x62\x0f\xdd\xdd\x43\x77\x7f\xf6\xd8\x43\x77\xf7\xd0\xdd\x61\x72\xf7\xd0\x5d\xd2\xd8\x43\x77\x7f\x72\xec\xa1\xbb\x29\x63\x0f\xdd\xa5\x8e\x3d\x74\x77\xf0\xd8\x43\x77\xf7\xd0\xdd\x84\xb1\x07\x60\x10\xc6\x1e\xba\x3b\x42\xe0\x70\xef\xda\x73\x0f\xdd\xdd\x43\x77\x7f\xe6\xd8\xe7\xc7\xda\xb1\x87\xee\x26\x8c\x3d\x74\xf7\x83\x63\x0f\xdd\xdd\x43\x77\x13\x64\x3d\x3c\xcf\x31\x42\x44\xaf\x8c\x9e\x25\x53\x4b\x5f\x01\x38\x4a\x66\x98\x51\xf3\xf7\x24\x05\x78\x19\xa7\x36\x65\x4f\xfb\x98\x39\xe8\x6f\x15\xe8\x23\x09\x72\x03\x26\x14\xe7\x08\xd4\x98\xd3\x1d\x6c\xb7\x04\xc1\x03\x21\x5d\x91\xd0\xd9\x9e\x56\x1a\xff\xbf\x16\xd0\xd5\x41\x72\x61\x76\x92\xca\x95\x7b\x2f\xac\xab\x74\xf8\xd6\x7b\xa1\x5b\x4c\x93\x68\x9c\x59\x1b\xe8\x6f\xc2\xb6\xfa\xe0\x2b\xa2\xec\x3e\x64\xab\x0f\xbc\xa2\x7a\xfe\x64\xb8\xd6\x03\x00\xee\x25\x43\xb4\xde\x03\xcf\x4a\xb4\x5e\x1b\xd0\xac\x08\xae\x4a\x90\xb8\x13\x96\x95\x38\xcb\x2d\x48\x56\x04\x55\x8d\xf0\xe5\x80\x3d\xed\x02\xaa\x12\x5f\xf9\x3b\x50\xac\x2e\x98\x2a\x41\x6a\x07\x86\xb5\x0d\xa4\x4a\xd9\x29\xb7\x0b\x44\x15\x30\x40\x29\xc1\x65\x0f\x40\xb5\x03\x02\x95\x20\x1b\xc0\x53\x23\xc3\x9f\x76\x42\x9f\xd2\xfc\xd7\x1d\xb0\xa7\x08\x5c\x4a\x59\xd8\x16\xf2\xd4\x05\x2d\xa5\x1c\x81\x06\xee\xb4\x09\x58\x4a\x4a\x81\xe4\x63\x83\x95\xc6\x78\x1a\x4e\x7e\x16\x4e\xf4\x54\x43\x99\xd0\x9b\xa5\x11\x76\xa9\x0b\xa2\x29\xe8\x99\x81\x97\x52\xc9\xb2\x2e\xbd\xce\xb1\x5e\x6f\xcb\x55\x62\x0d\x93\x6d\xd0\xaa\xe8\x04\xc2\x9b\x32\xd9\xe2\x81\x46\x31\x22\x07\xe9\xfe\x88\x01\xa1\xfb\x92\xaf\xe8\xae\xbe\xad\xb3\x4c\x88\x5c\xe4\xbd\xbc\x26\xfb\x72\x1a\xd7\x82\x28\x17\x1b\xa4\x4a\xcb\x1e\xa7\x78\x18\x29\x11\xd1\x5c\x9b\x92\x3b\x90\xf1\xe5\x17\x04\x09\x49\xd8\xb7\x8f\x82\x7b\x1b\x1d\xf3\x96\xec\xc6\xa5\xe5\xf2\x12\xf2\x78\xe9\xfe\x63\x5a\xfe\x6e\x37\xb6\x2d\xcd\xc6\xed\xc2\xb5\xa5\x49\xfc\x08\x98\xb6\x9d\x78\xb6\x2e\xf2\x2b\xcd\xd3\x4d\xc3\xb2\x8d\x84\x78\x4d\xc6\xb0\x7d\x1c\xfc\xda\x6e\xec\x1a\x68\x97\x14\xe7\xa2\x8f\x5b\x4b\x47\x9e\x3d\x08\xd7\xe2\x63\xa0\xcd\xb6\x91\x66\x61\xb1\xd2\xb2\xd8\x0d\xca\x6c\x3c\x94\xd8\x48\x08\xb1\x31\xd0\x61\xc9\xc8\xb0\x74\x54\xd8\x58\x88\xb0\x31\xd0\x60\x5b\x5d\x40\x47\x38\x41\x2c\x36\x6e\x1c\x05\x5f\x3d\x56\xf6\x78\x14\xf4\xd7\xc7\x5d\xae\x31\x50\x5f\x23\xac\x57\x1a\xda\xeb\xe3\x20\xbd\xc6\x44\x79\x8d\xb1\x44\x49\x6f\x74\x1f\x07\xd9\xb5\x13\xd5\xc5\xc8\xf5\xef\x6c\x33\xdd\x35\xed\xbe\xac\x25\x08\xdd\x40\x73\x75\x5f\xd5\x12\xa4\x36\x48\xae\x71\x5f\xd4\x12\x5f\xd3\xc6\x7a\x49\x1b\xe9\x15\xed\x23\x61\xaf\x52\x71\x57\xbb\x31\x57\xde\x07\x49\x38\x10\x5b\x78\xab\x16\x31\x95\x20\xb5\x9b\x93\x48\x43\x4b\x25\x6e\xa8\x54\xd2\x49\x5e\x3c\x13\x05\x5f\x5f\x8b\x4c\xab\x9c\xe8\x4d\x6c\xf4\xaa\x0e\x68\x81\x39\xb3\x28\x94\xf8\x7d\x98\x09\xea\x73\x5d\x2c\xb9\x65\xf4\xb7\x4b\xd6\x12\xa7\xc4\xe7\xd1\xe0\x98\x32\x0e\x8f\x8f\x7e\x3d\x88\xcf\x97\xec\xc1\x3d\x61\xb2\x07\x91\x72\x42\xca\x8f\xf1\x8e\xd7\x5f\xf5\x2d\xd3\x73\x27\x14\x3b\x92\x2a\x9e\xb0\x63\x6a\xf6\xa9\x49\x36\xb5\xf9\xcc\x26\x69\x48\x97\xf9\xf8\x51\x9c\x58\x93\x72\x4c\x72\xcc\x3e\xe7\x94\x23\x24\x63\xad\x7d\x98\x19\xed\x30\xb9\x8f\x95\xd2\x0e\xe2\xe7\x75\x81\xca\x8c\x9a\xbf\x81\x64\x78\x48\x90\xf7\x73\xda\xc4\x63\xc1\xd8\xcb\xe0\xe6\x3c\x86\x2f\x6f\xb4\x21\x57\x39\x0b\x74\x67\x64\xc9\xdd\x03\xff\x59\x1f\xdd\x44\x14\xf1\xc7\x42\x10\xbf\x17\x3d\x8c\x18\x60\xa2\xd4\x2d\xe4\x70\x8b\xff\xa5\x4a\xec\xa3\x86\xbb\xd8\xdf\x84\x39\xb6\x5d\x99\xe9\xb8\xdf\xfd\x1b\x01\xed\xbf\x7d\x2f\xbe\x17\x9e\x0b\x12\x5c\xe2\x0d\x6c\xef\x58\x65\xf0\xfd\x12\xf8\x54\x8c\xf8\x83\x89\xf6\x23\x1a\x37\x35\x37\xb6\x8f\xf6\xf7\xd1\xfe\x07\xc6\x47\x88\xf6\x9d\x2c\x85\xae\xdd\x83\x0d\x38\x6f\x97\x32\x5b\x76\x7d\x41\x59\x92\x4d\xb5\xae\xdd\x86\xbf\x16\xa6\x38\x22\x14\x61\x1f\x75\x6e\x0c\xda\x9b\xc6\x8e\x84\x6a\x3a\xfb\x6d\x83\x90\x65\xdc\x32\xce\x9e\x5d\x5e\xff\xfd\xc5\xd9\x5f\xce\x5f\x4c\xd9\x39\xcf\x96\x49\xa2\xa5\x62\x1c\x2c\x1b\xa8\xb0\x25\x5f\x09\xc6\x59\xad\xe4\x3f\x6b\x41\xb5\x0b\x47\xcd\xfc\x8e\x47\xc1\x74\x27\x68\x20\x6f\x93\x08\xba\xa1\xb7\x89\x2f\xa4\x75\x7e\x13\x41\x56\xe0\x19\xd3\xa4\x7c\xe0\xdc\xe8\x72\xd3\xb4\x9d\x7b\x61\xe8\x7a\x13\xbd\xb9\xa5\x30\x82\x2d\xe4\x2a\x20\x9f\x11\x03\xca\x78\x9e\xc0\x2a\xe7\xb5\x80\xbf\x38\x3e\x38\xe0\x33\x00\x14\x2e\x05\x53\xc2\xf9\x4b\xdf\xa4\x32\x69\xe8\xca\x0e\xf9\x37\xab\xad\xb0\x27\x6c\x56\x03\x38\xb4\x32\xb2\xe4\x46\x92\x20\x18\x9d\x09\xf3\x62\xca\x2e\x75\x0c\x8f\xd6\xb0\xb4\x94\x7c\x93\xf7\x66\x60\x69\x9f\xbd\x3a\xbf\x66\x97\xaf\xde\xb0\xca\x00\x4f\x30\x15\x59\x09\x12\xe1\x08\xcc\x84\x9f\x15\x1e\xa3\x7c\xca\xce\xd4\x9a\xba\xf7\x68\x64\xa4\x65\x3e\x1e\x12\xca\x8b\x0d\xcf\x53\x39\x39\xf9\x74\xf0\x68\x0a\xff\xef\xc0\x9f\x21\xe3\x5d\xb9\x06\xae\x9b\xa2\x68\x62\xd1\x08\xba\x87\x72\x56\x88\xf6\x3e\x84\x93\x45\xf1\x96\x46\xd3\x2f\x34\x54\x06\x19\x8d\xb1\x01\xb1\x0f\xeb\x7a\xe5\xcf\x88\x11\x95\x11\x56\x28\x62\xcc\xc2\x9b\x8b\x0a\x27\x0e\x14\xbc\xd7\x30\x45\x62\x61\x5b\x62\xb4\x9b\x12\xeb\x4e\xda\x99\x5f\xd1\x2e\x4a\x6a\xc0\xdb\xfb\x7d\xaa\x5b\xbe\x33\xfc\x9a\xa7\x55\xec\x36\xf6\x28\x5e\xfc\x4a\xe7\x87\x96\x5d\xd0\x71\x4f\xe1\xd6\x4f\xd9\x9b\xa5\xb4\x6d\x64\xe3\x7d\x45\x49\xa7\x7b\x82\xb3\x88\x0f\xcb\x27\xec\x11\xfb\x13\xbb\x63\x7f\x82\xe0\xeb\xf7\xd4\x18\x69\x8c\x00\x27\x35\xb5\x87\x79\x90\x8b\xab\x51\x4e\xc4\x77\x4b\xee\x40\x1e\xbb\xb8\x4a\x01\x37\xce\xa4\xca\xe1\x28\x88\x3b\x27\x8c\xe2\x45\x0c\xcd\xd3\x56\x3a\x21\x04\xf4\x1f\xf5\xe0\x2f\x0e\x32\x58\x5c\xcc\xc9\x12\x1b\x2f\xfd\x84\xb9\xde\xd5\x21\x4b\x84\x2b\xb7\xf3\xea\x90\x45\xe2\x95\x63\x17\x73\xc8\xb5\x5d\x06\x4b\x21\x6d\x67\xf6\xf4\x25\x6d\xbe\xba\xe4\x2e\x5b\xf6\xcd\x1a\x3d\x15\xf2\xd2\x5f\x89\x96\x7a\x9f\xe5\x1a\x72\xcb\x49\xa4\xc1\x7e\xaa\x9f\xb7\xe2\x49\x81\xdc\xf5\xee\xd3\xc5\x7c\xf3\xe4\x92\x57\xf5\x7d\x69\xb0\x24\x46\xe2\x10\x8c\x76\x1a\x6b\x54\x3a\xc7\xc8\x97\x2c\xd3\x2f\x5e\xde\xf1\x8f\x7a\x01\x30\xdd\x72\x76\x03\xe7\xc0\xe8\x94\x5a\x3c\x88\xaa\xdb\x5b\x86\x8c\x2b\x2c\xba\x9e\x0b\x63\x52\x8e\xbe\x66\xb3\x35\x20\xd7\x64\x26\x12\x2f\x41\x82\x4d\xa8\x8c\x76\x3a\xd3\x64\x52\x8f\x3e\xb8\x2f\x08\x83\xe5\x4e\x79\xbe\x6a\x5f\x34\xbf\x7d\x76\x75\xc2\xde\x3c\xbd\x3a\x61\xda\xb0\xeb\xa7\x29\xf8\x9a\x6e\xe6\xee\xe0\xcd\xd3\xab\x83\x7b\x5b\x74\x16\xe3\xc2\x27\x24\x9a\xa0\x5e\x1a\xd7\x87\x9c\x93\x92\x57\x93\x1b\xb1\x26\x78\xd5\xa9\x3e\xfd\xa4\x39\x41\x23\x7c\x06\x2e\x6c\xc9\xab\x81\xb2\x8c\xe0\xb9\x7c\xa0\xcc\x0d\xe1\x86\xb7\x73\xdc\xa4\x70\x20\xc8\x04\xfd\x53\xea\x95\xc8\x31\x78\x8f\xbf\x21\x54\x5e\x69\x49\x8b\x58\xf7\x4c\x10\x1f\x1e\x7b\x26\x88\x9f\x37\xf6\x4c\x10\xfd\xb1\x67\x82\x48\x90\xb9\x67\x82\xd8\x33\x41\xe0\xd8\x33\x41\xec\x99\x20\x88\x63\xcf\x04\xf1\xe1\xc9\xed\x99\x20\x3e\x5b\x6c\xeb\x9e\x09\xe2\xc3\x63\x8f\xf2\xdc\x33\x41\xec\x99\x20\xb6\xc6\x9e\x09\xe2\xbe\x5d\x8b\x3d\x13\xc4\x9e\x09\x22\x8e\x3d\x13\xc4\x80\xb1\x67\x82\x18\x36\xf6\x4c\x10\x1f\x1c\x0f\xac\x36\x64\xcf\x04\xb1\xaf\x0d\xf9\xb9\x72\x1e\x5e\x6d\x08\xdb\x33\x41\xd0\xc6\x9e\x09\x62\xf8\xd8\x33\x41\x0c\x1b\x7b\x26\x88\xe1\x32\xf7\x4c\x10\xed\xd8\x33\x41\xec\x99\x20\x3e\xd3\xa3\xbb\x67\x82\xd8\x33\x41\xec\x1e\xfb\x37\x82\x3d\x13\xc4\xb0\xb1\x67\x82\xa0\x0b\xdd\x47\xfb\x74\x39\x0f\x2f\xda\xdf\x33\x41\xec\x99\x20\x3e\x38\x52\x5c\x37\x23\xac\xae\x4d\x46\x31\x91\xfd\x73\xf5\x54\x97\x55\xed\x04\x7b\x1d\x05\x36\x76\x9f\xf0\x4d\xb3\x35\x16\x5c\x75\xb4\xe3\x7d\xc0\xa6\x33\xad\xe6\x72\x51\x1b\x28\xbe\x3f\x2d\xb9\xe2\x0b\x31\xc9\xf0\x43\x27\xcd\xca\x4d\x9a\x59\x9e\x7e\x56\xd0\xe9\x42\x96\x92\xc2\x20\xc1\xb6\xf6\xfe\x05\x48\x6a\xdf\x47\x13\xe0\x2d\x25\xbf\x83\x80\x88\x97\xba\x56\x0e\xeb\x04\x60\xbd\x89\x32\x9b\x5d\xc2\x77\x6e\x1f\x12\xb6\x87\x20\x01\x22\xf0\x00\x8e\x0e\x1b\xc3\x39\x6f\xb9\x34\xae\x92\xbd\xe5\x8a\x3b\x27\x8c\x7a\xc2\xfe\xeb\xe8\xdd\x6f\x7f\x9c\x1c\x7f\x75\x74\xf4\xfd\xa3\xc9\x1f\x7f\xf8\xed\xd1\xbb\x29\xfc\xcb\x6f\x8e\xbf\x3a\xfe\x31\xfe\xe1\xb7\xc7\xc7\x47\x47\xdf\x7f\xf3\xf2\xeb\x37\x57\xe7\x3f\xc8\xe3\x1f\xbf\x57\x75\x79\x83\x7f\xfa\xf1\xe8\x7b\x71\xfe\xc3\xcf\x14\x72\x7c\xfc\xd5\xaf\xc9\xc1\x61\x82\xfb\x31\x8e\xf3\x31\x8a\xeb\xf1\x11\x1c\x8f\x80\x2e\x19\x45\x3d\xbc\x0e\xb2\xc6\x51\x10\x21\x63\x32\xbe\x82\x88\xf6\x0a\x2a\x88\xe3\x9c\xe9\x49\x48\x5d\x4a\xe7\x44\x0e\x29\xa3\x0e\xbd\x08\x15\x07\x2e\x5d\xaf\x19\x77\x50\xb9\x50\x60\x44\x86\x40\x4b\xdb\xc5\x55\x77\x2a\x65\xb5\x5b\x0a\x73\x2b\xc9\xef\x41\x3e\x40\x52\x6d\x36\x03\x94\xe0\x24\x17\x73\xa9\xc8\x09\x12\x70\xe2\x06\xfb\x6f\x7b\x35\xbc\x57\xc3\x43\xa4\x3c\x24\x35\x6c\x45\x56\x1b\xe9\xd6\x4f\xb5\x72\xe2\x8e\x90\x10\xe9\x6b\xe1\xeb\x20\x8e\x69\xf8\x1b\x6a\x9d\x53\xa5\xf3\x58\xd5\x66\x6a\x05\xa5\xeb\x89\x2e\xd5\xcf\xb9\xc7\x95\x2e\x64\xb6\x3e\x8d\x4b\x02\x17\x56\xdc\xb9\xd3\x8f\x16\x03\x38\x6e\x6f\x5a\xf5\x21\x26\x3e\xf2\x6b\xb5\xc4\xd6\x3c\x3e\x2b\xc7\x1f\x3c\xe1\x2b\x23\x57\xb2\x10\x0b\x71\x6e\x33\x5e\x80\x7e\x1c\xc3\xd6\x9f\xbd\x47\x36\xfd\x7d\xc8\x19\x5d\x58\x76\xbb\x14\xde\x26\x31\xee\xbf\x1d\x52\x6f\x19\xa7\x0a\x5d\x70\xa9\x58\xe9\x8f\x41\x15\x27\xea\x6f\x83\xb7\x58\x64\x83\x5f\x71\x23\x94\x8b\x93\x0b\x04\x43\x33\xad\x8b\x50\x62\x47\xc6\x5c\x37\x2b\x10\x6a\x89\x95\xfe\xbb\x12\xb7\x7f\xf7\x33\xa7\xce\x75\x5e\xf0\x45\xc3\x59\x66\x85\x8b\x60\xaf\x94\x8a\x6c\x86\xa7\x12\x3f\x7e\xe4\x43\x00\x35\x55\xb5\x60\xbc\xb8\xe5\x6b\x38\x0a\xe3\xcc\x57\xda\x27\xec\xf1\x31\xa8\x31\x6e\x59\x33\xdf\x9c\x7d\x41\x7d\x22\x5f\x72\xcb\x9e\x9e\x5d\xfd\xfd\xfa\x6f\xd7\x7f\x3f\x7b\xf6\xf2\xe2\x32\xc5\x9d\xf0\xa7\x47\x90\x0e\x79\xc6\x2b\x3e\x93\x85\xa4\x7b\x11\x5b\xb8\xcb\xae\xc8\x04\xa7\x30\xcf\x4f\x73\xa3\x2b\xdc\x43\x53\x2b\xa0\xf5\x6b\xf9\x6f\xa8\x99\xe4\x6e\xd6\xb0\xc3\x10\xe8\x0f\x37\x35\x19\x39\xef\x7d\x32\x5b\x18\xae\xbc\x37\x0f\x99\xa9\x84\xd7\xee\x00\xcd\x31\xb5\x72\xb2\xfc\x7c\x8b\xaf\x79\x3e\x56\xe1\xf5\x59\x9e\x8b\x7c\x8c\xe3\xf5\x10\x0b\x0f\x9e\xc6\xcf\x4a\xa9\xb8\x61\x2d\x6b\x22\xbb\x7a\x75\x7d\xf1\xff\x8d\xb3\x5a\x2c\xac\x58\xca\x03\xd6\x08\x9c\x2d\x46\x57\x23\x9d\xa4\xd7\x81\xbd\x63\x7f\x96\x7e\x6a\xfc\x42\xcf\x52\xe3\xc9\x8d\x81\x99\x7a\x5d\xab\x8e\xae\x26\x13\x18\xb4\x73\x62\xa5\xce\xc5\x94\x5d\xa1\x83\x24\xec\x28\x32\x3b\xb4\x71\xdc\x08\xe6\x05\x2b\x27\x79\x41\x76\x35\xc5\x3f\x6b\xb9\xe2\x85\xc0\x02\x3f\xa0\x70\xe8\xf2\x07\x8e\x60\x9b\xe7\xbc\xb0\x49\x46\x8f\xee\x13\x79\xe7\xf4\xa5\xae\xd5\x18\xf8\xa4\x46\x16\xcb\x85\xd2\x2e\x29\x9f\xe9\xbf\x0b\x08\x1f\x8d\xce\x18\xe6\x34\x93\xa0\xd8\x11\x9b\xd7\x71\xaa\xc0\x81\xa3\x93\x26\x33\x74\xc1\xc3\x3e\x5e\x35\xdf\x8e\x6f\xbf\xb5\x4d\xfa\xfc\x2d\x97\x28\x15\xca\xe2\xbf\xdf\x08\x9e\x03\x93\x4f\xc5\xdd\x12\x71\x7a\x25\xb7\x37\xe4\xdc\x23\x88\x09\x31\x5d\xc8\x12\x23\x01\x4f\xb3\x18\x6f\xe8\xca\x6f\x2e\xb8\xab\x8d\xc0\xa8\x0c\x8b\x01\x85\xe2\xb3\x82\x8a\xac\x4e\x54\xa4\x7e\xed\x5e\xa9\x62\xfd\x5a\x6b\xf7\xbc\x61\x5b\x19\xe1\xd2\x7c\x17\x22\xf8\xfe\xc3\x6e\x42\xa0\x05\x10\xb9\x7c\x02\x1b\x0d\xca\x2a\x9d\x1c\x26\x9c\x71\x7f\xdc\xef\x51\x55\x99\x5a\x9d\xd9\xaf\x8d\xae\x89\x9e\xd1\x56\xf0\xf6\xf5\xc5\x33\xd0\xe8\xb5\x4a\x08\x5e\x84\x72\x66\x0d\x4c\x68\x63\xb4\x7d\x60\xdd\x7c\xc1\xb7\xde\x24\x6e\xdc\x7f\xaa\xa2\x9a\xb3\x5a\x59\xe1\xa6\xec\x25\x5f\x33\x5e\x58\x1d\x93\x1c\x64\x93\x7b\x05\x88\xfc\x6e\x2a\x76\xca\x80\x59\x94\x1c\x5c\x4a\xc5\x66\xda\x2d\xd9\x86\xd8\x04\x2a\xd1\xed\x39\x02\x43\x54\x12\x90\xbe\xed\xcc\x21\xd5\xe6\x54\xa9\x1a\x9f\xdf\x08\xcb\x2a\x23\x32\x91\x0b\x95\x25\xdd\xaf\x91\x10\x33\xbf\xff\x1d\xf5\x86\x5e\x6a\xe5\x95\xe4\x08\x77\xf4\x42\xe5\x32\xe3\x0e\xb3\x90\x6e\x94\x04\x03\x60\xf5\x42\x66\x8b\x03\x79\x90\x57\x91\x44\xb1\xb5\x15\x06\x5e\x45\x9d\xa9\x05\x1e\xac\x6f\xea\x99\x28\x84\xa3\x92\x2d\xb2\xc8\x00\xcd\x1d\x32\x9b\xc9\x92\x2f\x04\xe3\x2e\xaa\x01\x7a\x8e\x49\x28\xeb\xcd\x29\xac\xa4\x74\x2c\xd7\xa2\xa1\xe4\xa2\x26\x3b\x2c\xfb\xf6\xe2\x19\x7b\xc4\x8e\xfc\x1a\x1e\x83\x3f\x31\xe7\xb2\xa0\x73\x73\x40\xd5\xc0\x86\xff\x23\xe7\x71\xba\x54\xeb\x75\x11\x74\x1f\xd3\x06\xcd\xd7\x09\x53\x9a\xd9\x3a\x5b\xc6\xb5\xa6\xe7\x60\x63\xba\x38\x54\x00\x01\x8e\x26\x28\x58\xa2\xc4\x46\x2d\xbf\x4f\xc1\x52\xd7\x16\x85\xee\x52\xb0\xe4\xf7\xc9\xfc\x7d\x0a\x36\x09\x91\xf8\xc0\x15\x6c\xa2\x03\xf3\xad\x15\x66\x24\xff\xe5\xdb\x07\xee\xbf\x74\x43\x5c\xaf\x2b\xdb\x9d\xa5\x3b\x08\xa8\x10\x4b\xe1\x78\xce\x1d\x0f\x7e\x4d\x2a\x87\xe8\xb6\x4f\xb4\xbf\x7c\x0f\xf3\xf2\xdd\xa7\x77\x63\xc5\x0b\xa9\xea\x3b\x2c\x58\x19\xeb\x01\xe9\xfa\x1c\x84\xb2\x2c\x6d\x89\xe1\xe8\xf2\xaa\x2a\x24\x30\x4a\x6e\xd4\x50\x24\x19\xce\x6e\xa3\x80\x74\xe5\x10\xc3\x19\x30\x9c\xbc\x28\xb4\x77\xf0\x7c\xcc\xca\x55\xae\xa9\x48\xf6\x8d\x45\x84\x64\x87\xe8\xb5\xc9\x9b\xc2\x25\xa7\xde\xb5\xbd\x6a\xf8\x0c\x54\xc3\xbd\x3e\xfc\x15\x62\x25\xc8\x7d\x0d\x36\xbb\x0f\x7a\x59\x4c\xda\x78\xac\x13\x5e\x0f\x60\x5a\xac\xe0\x33\x51\xa0\xe7\x8f\x2a\x62\x84\x7a\xb8\x64\xe5\x32\xca\x33\x99\xd1\xc5\x58\x7c\x1f\xaf\x75\x01\xc5\x30\x7c\x84\x65\xf7\xd3\xfa\x05\xaf\x3a\x88\x18\x67\xd5\xdf\xac\xab\xd1\x56\x1d\x9e\x0c\x7e\xb9\xab\x5e\x93\x03\x07\xb6\xb9\xea\x3e\x06\x19\x6b\xd5\xc1\xb1\xff\x65\xae\xba\x15\x59\xa6\xcb\xea\xca\xe8\xb9\xa4\xea\x99\x2d\x87\x2f\x08\x8d\x70\x53\xba\xc3\x57\x5b\xb1\xab\x20\x2c\xc1\x11\xe9\x4d\x0c\x1e\x4f\x2b\xa3\x57\x32\x27\xc7\x6b\xdc\xa1\x5f\x13\x0b\xa8\xff\xaf\x64\xf7\x11\x0c\xda\x86\x27\x9a\xb8\x94\x7a\x25\x8c\x89\x9d\x04\xfc\x2c\x83\xb8\xcf\x94\x3a\x98\x8c\x37\x18\xc1\x09\xd2\x19\x2f\xa0\xf1\x5f\xca\x8d\x61\x9b\xb7\x66\x53\x6c\x82\x6a\x91\x4d\x46\x19\x00\xb3\x5e\x1a\x4b\xab\xbf\x60\xb1\xa1\x36\xc8\x0a\xb8\x00\xa5\x73\x11\xd0\xe0\x09\x62\x03\xfd\x29\xbe\x53\xc7\xd9\xa6\x97\xc1\x7b\x6f\x3b\xe2\xb7\xf3\x30\xe3\x04\x89\xf0\xad\x4e\x87\xfe\x08\x2f\x93\x1b\x20\xe2\xe6\x0b\x95\x4b\xb5\x80\x17\xe6\x13\x66\x44\xc1\x13\x08\x7a\x58\x6b\x53\x6e\x30\x3d\x7f\x08\x1a\x33\x2c\x41\x82\xd4\xa8\x32\xe3\xe6\x40\x34\x2b\xb5\x4a\xa1\x14\x80\x15\x84\xc7\xdb\x18\x71\xce\x53\x31\x44\xd2\xb2\x83\x17\xf1\x12\x91\x3b\x91\x3d\x34\xd7\xf1\x00\xfc\xbd\xe6\x46\x27\xac\x0f\x22\x36\x6e\xa4\xca\x43\xfd\x7f\x77\x53\x53\xe4\xc6\xfe\xd7\x98\x97\x99\xb2\xb7\xd0\xdc\x33\xcd\x5c\xf9\xc1\x8d\x78\xc2\xde\x29\xd6\x6c\x2a\x9b\xb4\x0a\x2d\xe9\xe6\x81\x2a\xdc\x52\x68\xa9\xea\xa1\x6d\xf7\x84\x0a\xed\x35\x26\x81\xd2\x38\xd2\x18\x9a\xbb\x5d\x60\x99\xb4\x25\x00\xa8\x43\xbc\xd2\xcd\xd4\xd3\x5c\xe4\x7c\xca\xbe\x55\xa0\x73\xfc\xfa\x4e\x98\xd2\x23\x6c\x57\xbb\xac\xf1\x84\x1d\xdc\xd7\xdd\xbe\x95\x2a\xd7\xb7\x76\xdc\xdc\xe8\x77\x28\x34\x26\x9e\xa8\x8c\x4f\x56\x38\x27\xd5\xc2\x76\xf3\xa3\xbc\x28\x46\xc0\xd7\xef\x4a\x90\xa6\xdd\xee\xa6\x3f\xfe\x76\x02\x2f\xf1\x85\x12\x0f\x21\xe2\x33\x62\xc2\x91\x9a\x6e\xdd\xc6\x67\xec\x4a\x38\x26\xc0\xdf\xf6\x09\xc7\x0f\x8d\x45\x69\xf9\x53\xe3\x3f\xc2\x49\x5e\x5c\x57\xd4\x76\x7f\x6c\xf3\xe2\x7d\xfd\xf2\xfa\xac\x2f\x38\xcd\xf3\xb8\x5d\x0a\x83\xb1\x95\x97\xcc\x78\x5e\x4a\x6b\xe9\x0f\xee\x7e\xdc\x8a\xd9\x52\xeb\x1b\x76\x14\x0b\x15\x17\xd2\x2d\xeb\xd9\x34\xd3\x65\xa7\x66\x71\x62\xe5\xc2\x9e\x06\xc5\x34\xf1\xeb\x45\x2d\x5f\x82\x2f\x51\x85\x54\x01\xde\x08\xcf\x0c\xca\x59\xa6\xe9\x9d\xc3\x59\xbb\x24\x59\xb3\xda\x70\xe2\x53\x8c\x2d\xf4\x38\xc6\x5a\x9c\x1d\x1b\x79\x99\x46\xf5\x05\xe4\xf0\xf7\xea\x3d\x6e\x1f\xfa\xcb\xa4\xde\x03\x1f\x38\xf8\x89\xeb\x85\x3d\x13\x91\x97\x2e\x3c\xad\xfb\xdf\x48\x90\xb8\x71\x52\x42\x16\xe8\x7e\x33\xf0\x11\xd3\x30\xe2\x4e\x00\xb6\x21\x88\x4c\x0b\xcb\xa3\x07\xd1\xa2\x24\x3a\x78\x87\x04\xd1\x9b\x48\x89\x06\xf3\x90\x20\x73\xb3\x58\x6f\x14\xc4\x04\xfb\x88\xa8\x09\xf6\xb3\x91\x13\x09\x3f\xd0\x77\x58\x46\xf2\x02\xd8\xfb\x5f\x49\x13\x15\xfa\x47\x73\x5c\xd8\x68\xce\x0b\x4b\xbb\xf8\x81\xd9\x77\x94\xee\xd7\xd7\x1d\x59\x49\x91\x7c\xc4\x87\xfa\x1d\x45\x7e\xf7\x86\x35\xb9\x58\x47\x8e\x7a\xf9\x2f\xda\x59\xf7\x47\xb0\xf5\xf1\x95\x46\x1a\x98\x0e\xe9\x3b\x41\x66\x68\x7f\x9b\x33\x1f\xb0\x16\x31\x89\x5f\x56\x85\xf7\x5c\x7a\xb3\x27\xce\x18\x24\x76\x1a\x6c\x9f\x34\xcb\x93\xd2\x07\x3c\xd0\xe6\x9f\xb0\xff\xae\xad\x63\xbc\xa9\xbe\x8f\xdc\xcf\xb0\x93\x04\xe1\x91\x96\x1a\x4a\x49\x32\xae\x9a\xd6\x4f\x4e\xc7\x37\x08\x82\xd4\x5c\xce\xe7\x22\xf2\x0f\xcc\x04\xab\xb8\xe1\xa5\x70\x50\x19\x46\x85\x13\xcf\xc4\x42\x62\x79\xb6\x9e\x33\xee\x17\xf4\xf0\xd0\xb6\x84\xc2\x14\xfd\x01\x45\xdf\xd2\xb1\x52\x2e\x96\x0e\x2e\x39\xe3\xac\xd0\x6a\x01\xb4\x91\x34\x34\x6d\xa1\x79\xce\x40\xd7\x6b\xc3\x6e\xb9\x29\x19\x67\x19\xcf\x96\x00\x53\x26\x81\x17\xf3\xda\x40\xe7\x6e\x27\x78\xbe\x9e\x58\xc7\x9d\x8f\x75\x05\x52\x08\xe1\xce\x11\xa4\x66\x5b\xf4\x85\x78\x06\xe0\x71\x72\x26\x1c\x25\x8f\x1c\x2b\x87\x42\xb9\x50\xf4\x87\xbb\xca\x26\x41\xea\xbc\xe0\x8b\x87\xc6\x97\xb9\x6f\x34\x1f\xc6\xbe\xd1\xfc\xcf\x1d\xfb\x46\xf3\x3f\x7b\xec\x1b\xcd\xef\x1b\xcd\xef\x1b\xcd\xef\x1b\xcd\xef\x1b\xcd\x6f\x8c\x7d\xa3\xf9\x7d\xa3\xf9\x9f\x18\xfb\x46\xf3\x1f\x16\x78\xdf\x68\xb1\x5f\x46\x13\x99\x7d\xa3\xf9\x7d\xa3\xf9\xde\xd8\x37\x9a\xbf\x6f\xd7\x62\xdf\x68\x7e\xdf\x68\x3e\x8e\x7d\xa3\xf9\x01\x63\xdf\x68\x7e\xd8\xd8\x37\x9a\xff\xe0\x78\x60\xad\xe7\xf6\x8d\xe6\xf7\xad\xe7\x7e\xae\x9c\x87\xd7\x7a\x8e\xed\x1b\xcd\xd3\xc6\xbe\xd1\xfc\xf0\xb1\x6f\x34\x3f\x6c\xec\x1b\xcd\x0f\x97\xb9\x6f\x34\xdf\x8e\x7d\xa3\xf9\x7d\xa3\xf9\xcf\xf4\xe8\xee\x1b\xcd\xef\x1b\xcd\xef\x1e\xfb\x37\x82\x7d\xa3\xf9\x61\x63\xdf\x68\x9e\x2e\x74\x1f\xed\xd3\xe5\x3c\xbc\x68\x7f\xdf\x68\x7e\xdf\x68\xfe\x83\x23\xc5\x75\xb3\x2e\x97\x84\x0e\x83\x1f\xa7\x85\x40\x40\xcb\x76\x68\x19\x67\xf5\x7c\x2e\x0c\xb8\xdd\x30\x53\x52\xe2\x66\x77\x91\xfe\x34\x96\x29\x50\x64\xa2\xe3\x67\x85\x3b\x81\x6e\x07\x16\x0b\xa7\x61\x8a\x34\xc0\x63\x7f\x8a\x81\x9d\x12\xfa\xea\x19\x61\x69\xf1\xb5\x54\xec\xfc\xd5\xf3\xe9\x08\xdd\x13\x52\x88\x87\x61\x4d\x5e\xa9\x2c\xb5\x58\xa7\x3d\x64\x69\x24\xa0\x91\x00\x34\x9c\xb5\xac\xd0\x16\xb1\xb5\xb8\x79\xd9\x92\x2b\x25\x28\x05\x2a\xa8\x10\xa5\x83\xb4\xdb\x4c\x08\xc5\x74\x25\x14\xe2\xff\x39\xb3\x52\x2d\x48\x64\x0b\xdc\x39\x9e\x2d\xa7\xfe\xfb\x55\x3c\x60\xa1\xf1\x62\x33\x6b\xca\x55\x73\x46\xf0\x12\x0f\x9a\x11\x25\x97\x38\x5d\xc6\x33\xa3\xad\x65\x65\x5d\x38\x59\x25\x4c\x98\x59\x01\x65\xd6\x16\x6b\xfe\xe3\x21\x60\xa4\xeb\x66\x05\x82\x3d\x81\xe6\xbe\x59\x83\xb0\xbc\x24\x17\xac\xbd\x6a\x10\xc0\x9f\x40\xcf\xed\xb2\x72\x6b\x2c\x88\x22\x5e\xe0\xb9\x34\xd6\xb1\xac\x90\x10\xc1\xc1\x3a\x08\xb0\x64\x30\x67\x0a\x02\x98\xab\xdc\x4b\x56\x61\x8f\x6c\xd8\x24\x95\x83\x03\x5a\x91\x1c\x7e\x28\xcb\x89\x75\x5f\x22\x4e\x37\x97\x36\x04\x14\x96\x34\xd1\xd8\x78\x08\x2f\x57\xdc\x23\xb8\x5e\x39\xb1\x83\x46\xfc\xe6\x20\xa4\x33\xe5\x84\xfb\x0f\xbd\x82\x42\x56\xbc\x31\x01\xd8\xe5\x27\x2a\x48\xd2\xf7\x6f\x17\xe3\xc6\xbe\x11\x60\x20\x08\x22\x3b\x26\x05\xae\xa9\x12\x2b\x6f\xbd\x44\x26\xe4\xca\x3b\xe1\x04\x91\x3b\xed\xc1\x27\x35\x07\x4e\x98\x52\x2a\x28\xda\x7a\x29\xac\xe5\x0b\x71\x45\x7a\xfd\x7e\x5f\x6c\x0d\x0f\xe0\xf1\x30\x92\xaf\x71\x81\x94\x62\x8d\x73\xdb\x96\x20\x1c\x92\xca\x43\xdb\x8f\x66\x25\x7e\x75\xc3\x8b\x72\x6b\xa4\x73\x82\xe4\xd8\x58\x6c\x4c\x06\xc0\xa1\x4d\xd2\x4a\xda\x44\x3b\xe5\x15\xec\x65\x9c\x28\x4e\xd0\xff\x9c\x77\x52\x15\x8d\x8e\x11\x51\x4e\x33\x23\xc5\x9c\xcd\x25\x54\x31\x00\xde\xfe\x04\x1b\x61\x70\xca\x6c\xb9\x62\xdc\x5a\x61\x60\x5d\x03\xde\x3a\xae\xef\x94\x7d\x47\xae\x33\x75\xa6\x56\x19\x6f\xdb\xca\x22\x89\x94\x9c\xb3\x05\x20\xfb\x29\x5a\x07\xda\x58\xff\xee\xd1\x1f\x7f\xcf\x66\x6b\x1f\x68\x00\x96\xc5\x69\xc7\x8b\x38\x61\x82\xd0\x42\xa8\x85\x3f\xed\x68\xb2\xfb\x94\x42\x09\x65\xb6\x85\x2c\xa5\xc3\xda\xd7\xc7\x5f\xdc\xcc\x7a\x31\x19\x41\xe2\x69\x2e\x56\xa7\x9d\x1b\x30\x29\xf4\x62\xca\x9e\xc6\xc2\x4b\x82\xc4\x58\xaa\x49\x2d\x54\x24\x85\xf9\x3b\x14\x17\x34\xbf\x4f\x54\x5d\xb1\xc7\x10\x5b\xea\x5b\x6c\x3c\xd8\xfe\x0e\x61\x69\xa2\x76\x69\xeb\x0e\x2b\x5d\xd5\x05\x56\xb6\x3e\xa7\xd1\x7d\x81\xa6\xaa\xad\xd8\xe4\x9e\x79\x8f\x2e\xa7\x29\x87\x38\xcd\x8d\x40\x08\x95\x44\xc2\x42\xe8\x40\xdc\x10\x5e\x97\x9a\x26\x41\xb5\x21\x55\x3e\x3e\xe7\x45\x31\xe3\xd9\xcd\x1b\xfd\x42\x2f\xec\x2b\x75\x6e\x8c\x36\xbd\x15\xa2\xdc\x63\xee\xbd\xc6\x65\xad\x6e\xa0\xbf\x75\xf3\xf1\x85\x5e\x30\x5d\xbb\xaa\x26\x45\x7f\xf3\xcd\xe3\xd4\xac\x09\x91\xf6\xad\x71\x91\x83\x53\xda\x99\xa9\xb8\x93\xb4\xa7\x8f\x5b\xe9\x15\x98\x62\xc2\xaf\x23\x6a\xc5\xf6\xab\x69\xc1\x42\x47\x7d\x7d\xf1\xe8\x77\x7f\x40\x85\xcb\xb4\x61\x7f\x78\x04\x45\x99\x24\xf7\x16\x5c\x01\xf0\xbf\xa4\x65\xb6\xe4\x45\x21\x4c\xaa\x62\xf4\xd7\xb1\xa3\x08\x1b\xb5\xf6\x49\xb5\x9a\x4b\x55\x60\x1f\x31\xf9\xf3\xe6\xcd\xdf\x20\xf3\x23\x9d\x15\xc5\x9c\xe4\x95\x17\x56\xb7\xad\x41\x0f\xc1\x99\x3e\x0c\xbe\x88\x8f\x26\x29\x2a\xe0\x7e\xd3\x29\x2b\x5d\xd4\xa5\x78\x26\x56\x32\xa3\x3c\x6b\xf5\xb6\xae\x27\x8b\x5e\xf9\x5c\x48\x0b\xbd\x9b\x66\x85\xce\x6e\x58\x1e\xc4\xb5\xb0\x76\x8a\x17\xb2\x4e\xa5\x60\x4f\x29\x42\x20\x17\x1f\xbc\x77\x75\xdb\xd2\x01\x52\x82\x97\xb3\x92\x57\x55\x43\xfa\x61\xf8\x6d\x6f\xb1\x49\x32\xbd\xe6\x05\x9e\xd5\x24\x9e\xfb\xc4\xc7\xe1\x94\xa7\xe1\x49\xf8\x7a\xa2\xcf\x41\xae\x4b\x48\x7d\x55\x6e\x67\x4d\x7d\xf8\xea\x1d\xb3\x56\x5c\x2a\x77\x41\x05\x32\xb0\x68\x7d\xa4\x56\x6c\x1d\x66\x24\x9c\x67\x13\xf6\xfa\x03\x9d\xc0\x2a\xe6\x34\xf5\xd1\x31\xf9\xa5\x2f\xa5\x0a\xa4\xb7\x73\xaa\x79\x53\x2d\xb9\x23\x25\x2b\x70\x74\x49\xfe\x38\xab\x84\xb1\xd2\x7a\x1f\xfd\x2d\x28\xa0\xa7\x05\x97\xd4\x87\xb3\xe6\xf1\xa4\xd2\xd4\xad\x4a\x58\x6e\x54\xa0\xd0\xc7\x3b\xd5\xd2\x5d\xe9\x3c\x88\x03\xc3\x04\x69\x13\xd2\x8b\xca\x56\x9a\x25\x95\x92\x62\x34\xf7\xef\x3e\x4d\xdd\xdb\x76\xa7\xd2\x2d\x9d\x97\xd2\x98\x3a\x94\x1c\x8c\x15\x51\xe2\xe7\x6b\xe0\x60\x2d\x3e\x37\xfb\xd6\x4c\x7a\x14\x25\x09\x86\x2d\xf8\x2a\x29\xc6\xad\x8d\x55\xdb\x97\x8a\xa5\x08\x4a\x81\x2c\xb5\x4d\xb3\x84\x4c\xec\x34\x80\x45\x15\xb9\xa9\x73\x33\x55\x76\xf8\xe4\xf0\xde\x8c\x1c\x6e\xa2\xd1\x15\x5f\x40\xee\x60\x94\xbd\xdc\x14\x9a\x80\xf0\xc2\xb4\x86\xb0\x90\x36\x03\xb9\x54\x26\x44\x1c\x55\x98\x95\xc8\x5b\x0a\x74\x68\x6c\x90\x50\x7e\xdf\x39\x72\x21\x61\x82\xc4\x8d\xb7\x09\x75\xd1\xdc\xe8\x5a\xe5\xe1\x35\xb8\x81\x20\xbc\xdc\x58\xd8\x4b\x3a\x83\x19\xa4\x79\x62\xdb\x17\x1f\xe2\x42\xa1\xa4\xb4\x54\x32\xbc\x20\x53\xb1\xc7\xd3\xc7\x8f\x3e\x7f\x9f\x0d\xd6\x64\x24\x9f\xed\xb2\xf1\xd9\xd0\xca\xdd\xdb\xea\x18\xc1\xf3\x57\xaa\x20\x64\x82\x70\xf4\xeb\x0d\xc2\x93\x94\x17\x3a\xd1\x2a\x81\x6b\x42\xc6\xc6\xf6\x20\xea\xd6\x48\x17\x6e\xd0\xad\x4c\x28\x54\x3b\x82\xa4\x0d\xd3\xa6\x4b\x41\x7c\xdc\xe6\xf2\x12\x42\x12\x6a\x3e\x28\xfc\xf7\x89\xdd\xbd\x19\xb3\xf5\xec\xc1\xd9\x5d\x34\xb0\xa8\x54\x77\xbd\xa7\xd2\xd7\x3b\x48\xde\x36\xc1\x64\x89\x5d\xec\xe1\xc1\x01\x3b\xc2\x5f\x38\x44\x36\xbb\xe3\x7b\xbb\x9e\x61\x5b\xcf\xef\x2a\x72\xff\xc5\xde\xd6\x9e\xdf\x55\x5c\xe5\x22\xc7\x80\x3f\xc1\xb5\x66\x91\x74\x7a\xd7\x1e\xa7\x9b\xcd\x43\xdb\xdf\x63\xb2\xc4\xae\x7b\xf6\x17\xb1\xe4\x2b\x01\x9c\x7f\xb2\xe0\x26\x41\x3d\x39\xcd\xae\x71\x67\xd8\xac\x76\x4c\xa8\x95\x34\x5a\x95\x22\x81\xd8\x7d\xc5\x8d\xe4\xb3\x42\x30\x23\x80\x38\x38\x13\x96\xfd\xfa\xe8\xed\xd9\x6b\x80\x59\xd3\xdb\x47\x70\x23\x98\x88\xbb\x5e\x5b\x28\xcf\x1d\xe9\x16\x76\x3e\x7b\xba\x71\x81\xe8\x2a\x7a\xe3\xe2\xc5\x75\xf6\x37\x80\xbe\x06\x2a\x6f\xf6\xcb\xaf\x47\x59\xbb\x9a\x17\x40\xfb\x98\x15\xb5\x95\xab\xfb\xb0\xbf\x81\x86\xf3\x99\x24\xdc\xec\x0d\xfa\xd2\xf6\xd2\x6c\x71\x7b\x12\x29\xbc\xc1\xbd\x1c\xaf\xfb\x7a\x00\x5e\x1e\xda\xa6\xc7\x55\xb7\x35\x10\xf9\x51\x2e\xd0\x56\xcf\x44\xa7\xa5\x1e\x23\x1b\xad\xd6\x67\x87\x96\x05\xf7\xf7\x3c\xa7\x74\x2e\x86\xb6\xb4\xe8\x17\xbe\x04\x01\x48\x65\xdd\x21\x8c\xb3\xd9\x52\xe4\xf5\xc0\x17\x60\xa4\x73\xd7\x39\xd3\xca\x69\xc6\x9b\x96\x58\x30\x4f\x80\xd1\xc9\xc1\xcf\xb5\x4a\xab\x09\x3c\x28\xe3\xd9\x8a\xf3\x32\x91\x8f\x35\xfe\xc5\x30\xa9\xfd\x99\x42\xfa\xd9\xcf\xf1\x84\x71\x6b\xeb\x12\x55\xdf\x40\xce\x50\xe9\xd8\x5c\x3a\xc0\x0d\xea\xda\x64\x22\x66\x75\xbc\xd2\x1b\xc4\x93\x45\x3e\x09\xd7\xa2\x80\xab\x4c\x3e\x0d\x87\x97\x1d\x29\x78\x24\x6c\xf8\xd3\xa0\xa5\x08\x57\x2e\x14\x02\x01\x0a\xb9\x29\x06\xd6\xf0\xe6\x3e\x97\xc3\x16\x57\x2b\xc6\xc3\x29\x6a\xe6\xd7\xf9\x15\x08\xb3\x06\xb6\xf3\xf4\xd2\x80\x15\x9f\xcf\x44\x61\x37\x27\x38\x6b\x8f\xda\x30\x97\x02\x28\x71\xc2\x71\x1a\x5c\x48\x12\x95\x13\xc4\xe7\xa7\xdc\x5a\xb9\x50\x93\x4a\xe7\x13\x2f\xed\x74\x08\x92\x89\x98\x91\xe4\x79\xe4\x0f\xbe\x22\x26\xf8\x48\xa7\x57\xaf\x84\x59\x0a\x3e\x28\x01\xba\x81\xed\x0c\x12\x98\x11\x95\x11\x16\xc0\x47\xc8\x7f\x87\xb7\x71\xd8\x1e\x46\x61\xdc\x5a\x9d\x01\x7f\x05\x62\x50\x4c\x8d\x5d\x15\xf8\xe0\xb7\x0e\x7f\xbc\x38\x5b\xc8\x95\x50\xb1\xb1\xe4\xd3\x82\x5b\xdb\x4b\xa0\x0c\x46\xe3\xcd\x04\xe3\xb5\xd3\x0d\x7a\x8b\x71\xd7\xf6\x2e\x43\x90\xf5\x6c\x98\xef\xea\xd7\xac\x3b\xbf\x8e\x38\x6f\xf5\x8c\x06\x4c\xcb\x20\x91\x17\xf3\x9f\x27\x75\x98\xb6\xb5\xb1\x73\xc2\x49\xbb\x5d\x65\x48\xaa\xb6\x7d\x7e\x06\xc9\xbc\xd2\x39\xcb\x00\xbc\x19\x2d\x61\x80\x60\x76\xa7\x3e\x48\xe2\xae\xcf\x8c\xd5\x14\xfe\x66\x76\x7e\x72\x90\xdc\x38\xbd\xa0\x03\x7d\xb0\x82\xa9\xc3\xe6\xe0\x16\x46\xf0\x7c\xd8\xd6\x5b\xe1\xc0\x46\xf7\x36\x4a\x76\x9b\x10\x0f\x46\xe8\xa3\xf5\x68\x5c\x2d\x68\x65\x54\x89\xec\x84\x35\xd7\x95\x72\xe4\x63\xa1\x47\xd3\xc9\xa8\xd3\x11\x16\xfd\x4f\x63\x84\xad\x34\x74\x67\x1e\x24\xbc\xfb\xe9\x27\x6d\x1a\xc9\xdb\xf6\x4e\x0d\xcc\x20\x91\xb5\xf2\xd3\x85\xdc\x6e\xcb\xf8\xfd\x2f\x61\x74\xd7\x38\x0c\x92\xd8\xe9\x27\x38\xbd\xf9\x03\x58\x11\xa1\x96\x5c\x65\xe8\x6a\x9c\xde\x88\xca\x9e\x5a\xb9\x40\xa3\xf1\xc5\xa3\xc7\x7f\x7c\xf4\xc5\x17\xbf\x07\x33\x12\xcf\xc7\xb4\x1c\xb6\x8f\xfd\x24\x2f\x2f\xaa\x25\x9f\x40\x93\x7b\xff\x31\x7a\xce\xbe\x69\x6c\xda\x20\xb1\xab\xc7\xd3\xc7\xbf\x3f\x61\x81\x60\x1f\xba\x6a\x2c\xb5\xd2\x06\x31\xd5\x48\x28\x37\xd4\xaf\xe3\x2e\x28\x86\x78\xe0\x9a\xa3\x16\x7a\xa3\x0c\x02\x04\xdf\x9b\x19\xad\xb8\x73\xc2\xa8\x27\xec\xbf\x8e\xde\xfd\xf6\xc7\xc9\xf1\x57\x47\x47\xdf\x3f\x9a\xfc\xf1\x87\xdf\x1e\xbd\x9b\xc2\xbf\xfc\xe6\xf8\xab\xe3\x1f\xe3\x1f\x7e\x7b\x7c\x7c\x74\xf4\xfd\x37\x2f\xbf\x7e\x73\x75\xfe\x83\x3c\xfe\xf1\x7b\x55\x97\x37\xf8\xa7\x1f\x8f\xbe\x17\xe7\x3f\xfc\x4c\x21\xc7\xc7\x5f\xfd\x7a\x98\x82\x1b\x5e\x9a\x9d\x52\x8e\x9d\x50\x82\x3d\x5a\xd9\x75\x65\x84\x8f\x47\xa4\x56\xc3\xa1\xdd\xfd\xe4\xe9\x86\xa0\xd8\x8a\x11\xff\x34\xd8\xbb\x88\xf3\x52\x0b\xef\x9c\x58\x74\x58\x0a\x7d\x0b\xa5\x46\x52\x1b\xe9\x06\x86\xf8\xaf\x14\x3c\x3c\x5c\x8a\x95\x30\x27\x71\xb6\x2f\xbc\xc0\xab\x28\x8f\x96\x0f\x77\x7a\xa7\xb4\xd0\xf0\xcf\x5b\xa1\xc1\x7d\x9a\x7a\x0f\x50\xa8\x9a\x4e\xd8\xa2\x5b\x9d\x71\xa9\xd5\x55\xb3\x42\xf1\x27\x87\xfd\x06\xea\x8f\x89\x17\xfb\xd1\xe3\xb9\xb8\x65\xe4\xd3\xf5\x06\xaa\xed\xc3\xca\x82\x99\x9c\xb2\xb7\xdc\x48\x3d\x10\x28\x8f\xa0\x15\x68\xfb\xa6\x15\xb8\xd5\x08\x61\x6f\x0c\x02\x44\x73\x03\xfd\x02\xd7\x9d\x5c\xc3\x99\x11\x5f\x2c\x49\xbb\x73\xd6\xb8\x5a\x4f\x5b\x57\xab\xeb\x25\x4a\xe7\xaf\xc8\xca\x7f\xc2\x30\x03\x6e\x85\x89\x95\xdb\xd8\xa3\xbb\xf3\xf5\xe8\x1f\xd2\xda\x05\x77\x5c\xc2\xe8\xc0\xdb\xee\xc2\xc2\x4f\xc6\xb5\x00\x97\xe4\x92\x0f\x7d\xff\x03\x32\x5c\xb9\x88\x25\xd1\x70\x0e\x30\x91\xd2\xf9\x5b\x8a\x7a\xa0\xea\x70\x1a\x0b\x41\xb5\xb9\x0a\xe4\x6b\xd1\x6f\x93\xd8\x74\x73\x1c\x9c\x08\xac\x74\x7e\x68\xdb\x95\x63\x07\x78\x4f\xc0\xe7\x9a\x64\x46\x3a\x99\xf1\x62\x58\x72\xdb\xbb\x41\x51\x4c\x56\xd4\xd6\x09\xd3\x4a\x82\x6c\xb4\xbb\x1d\x86\x33\x80\x2f\xe5\x05\xbb\x11\xeb\x5b\x6d\xf2\x18\x2e\xc4\xaf\x6e\xcf\xc1\x40\x2e\x99\xf0\xd9\x52\x04\x2b\x83\xdd\xcc\x4c\x29\x0c\x9b\x89\xf8\x6e\x90\x20\x78\x3d\x65\x67\x6a\x1d\x80\x10\xaa\x4b\x2a\x13\x3c\xfd\x61\x11\xc3\x1a\x43\x2c\x0c\xdc\x7b\x17\x2a\x78\x76\xf0\x15\xc3\xfd\x4c\x3f\xb3\xe9\x7b\x72\xe0\x95\xce\x9b\xaf\x19\x96\x3b\x0b\xe9\xee\x98\xfe\xd6\x86\x61\x43\x1f\xd0\x92\x46\x20\xab\xc4\x20\x91\x41\xd4\x47\xb7\x59\x3e\xe4\x94\x4a\x58\xfb\xb5\xbf\x52\xf4\x5c\x4e\xff\x8e\x72\x88\xbb\x82\xe4\x41\xdf\xbd\x80\x9b\x1d\x17\x54\x78\xe5\x87\xd8\x1d\xef\x2d\xe9\xbc\x95\x3a\x4c\xa7\x9e\xc1\x7f\x0c\x15\xe2\x3c\x5f\x63\x63\x4c\x3f\x49\xe9\x3a\xa5\x2d\x03\xf3\x04\x46\x04\x69\x67\x97\xcf\x62\x8d\x26\x86\x10\x96\xd8\x5d\xb9\xe9\xff\x10\xbe\x31\xac\x06\xa4\x0a\x42\x13\x2b\xf1\xcf\x9a\x0f\x0b\xbe\x9d\x66\x07\x6f\x4c\x2d\x0e\x76\x25\x36\x3f\x1c\x8f\x0a\x77\xab\xcd\xcd\xe9\xa3\x47\x8f\xfe\x13\xc2\x51\xf8\xe4\xff\xf1\xc5\x5f\xfe\xc7\x17\x7f\x99\x96\xf9\xf0\xb8\x6c\x28\x9a\x95\x80\x63\xdd\x04\x08\xbf\xee\x9e\xf1\xb8\xdd\x43\x1f\x46\x71\x63\xc2\xe3\x2d\xf0\x84\xc1\x91\x6a\xf6\x9c\x90\x70\x25\x60\x4f\x69\xa8\xd3\x49\x3b\xcd\x37\xeb\x6a\xa0\xd1\x24\x83\x46\x7b\xbf\x99\xfe\x0a\xda\xca\xc2\x7d\x20\x95\xeb\x6b\x44\x0d\xa3\xac\x0e\x06\xfe\xd0\x12\x77\x12\x07\x14\x4a\x81\x59\x85\x57\x0d\x30\xa7\xeb\x8a\x5c\x40\x36\x58\x87\x03\xeb\x45\x62\x68\x7b\xf8\x1a\xc5\xb0\x0a\x23\x5b\xc8\x7e\xf7\x2a\xcf\x07\xda\xc4\x88\x30\xc2\x28\x21\x44\xa6\x67\x40\x7d\x74\xc2\x5e\xa9\xe7\x58\xab\x3b\xec\x79\x18\x02\xdb\x96\xe8\xc2\xe9\x20\x70\x54\xfa\xaf\xd3\x5f\x85\x15\x9d\xe0\x52\x0c\x57\x72\x43\x37\xb0\x93\xc2\x4c\xf2\x94\x0f\x5f\x6f\x48\x0a\x57\x65\x28\xd8\x95\xf7\x13\xca\xc1\xe3\x0a\xdb\x09\xaf\x64\x68\x34\x86\x99\x76\xa3\xeb\xea\x24\xf8\xb3\x2d\xb8\x2b\x76\xe3\x36\xb5\x1a\x4e\xda\x05\x47\x0b\xdd\xb9\xfe\x94\x9b\x17\x5d\xb8\x90\x83\x5f\x9a\xb1\xee\x26\x67\x19\x66\x95\xa3\x77\x88\x6c\x2d\xf8\x58\x61\x6a\x35\xf8\x4d\x05\x13\xcb\xda\xb0\xce\xeb\xf8\x41\x21\x16\x3c\x5b\x1f\xd0\x5f\x2c\x7a\x68\x8b\x18\x2f\x58\xc6\x15\xb0\xce\xca\x4c\x3a\xfc\x8e\xc1\xf7\x17\xea\xb7\xa1\x30\x1c\x7c\x78\x54\x9a\xe0\x46\xd7\x96\x10\x7f\x45\xf7\x38\x12\x75\x2d\xb9\xca\xa1\xda\x9a\xe4\x98\xe8\x5c\x9c\x06\x49\x13\xf8\x3c\x52\x82\xbc\x69\x07\xde\xb4\xe1\x4e\xce\x8e\xff\x8e\x90\xad\x1e\xa8\x30\x1a\x44\xc5\x88\x71\x75\xf7\x8c\x0f\x7d\xdd\xc9\xa5\xad\xe0\x9e\xe1\x23\x40\x14\xda\xce\x73\xf0\x4d\x79\x4f\x78\xd6\x44\x5a\xcd\x0f\x0e\x0d\x2b\xe3\x21\x24\x4d\x8d\xb6\x59\x22\xab\x21\x7a\xd5\xca\x89\xbb\x41\xf4\xb7\x7d\xe5\x7e\xdd\x17\xc4\x96\xba\xc8\x01\x11\x83\xc9\xd3\x81\xaf\x7c\x28\x8b\x71\xe7\x8c\x9c\xd5\x3e\xce\xe0\x2a\x87\xe6\xc9\xe1\xe9\x73\x38\x1c\x2c\xe4\xda\xec\x94\xb5\xb4\x4d\x5d\xe4\x20\xe8\x92\x29\x63\xd7\x62\x20\x46\xc9\x3b\x7d\x9d\xb5\x00\xdf\x24\x6e\x24\xe4\xc7\xfc\x9d\x1d\x24\x52\xf0\x6c\x19\xd2\x81\x9f\xe0\x6d\x89\xea\x44\xcf\xed\xd7\xde\x68\x0e\x75\x9e\x7b\xc7\xe6\xe0\xac\xc9\x29\xd9\xba\x0a\x2c\xe4\x03\x63\x48\x16\xcd\x37\x6a\x7f\x5e\x55\x85\xc4\x82\xcb\x04\x0f\x91\x61\xc4\xcb\xd1\x88\x5f\xeb\xb2\xc1\x1b\xfb\x55\xb6\xd8\xbe\x70\xb8\x07\xbd\x14\xa0\xbc\x0b\x7c\x70\xce\x96\xc0\x95\x0c\x0f\xed\xb7\x7e\x8a\x4b\x59\x0d\x96\x09\xd9\x6e\xee\x9a\xe9\x01\xd4\xc8\x8b\x8b\x2f\x15\x83\x25\x56\x3a\x7f\xc2\xde\x29\xf6\x18\x93\xd1\xfa\x16\x20\x2a\x5f\x5f\x3c\x8b\x1a\x8e\xf4\xdd\xcf\xaf\xe1\xb8\xb0\x2f\x50\xaa\x15\x6e\x21\x73\x36\xc3\xe6\xe5\x56\x0c\x87\x2f\x1f\x29\x71\x8b\x65\xb0\x01\xf1\xd0\xbc\xd7\xaf\x62\xf9\x26\x81\x8b\xaa\xbb\x78\x61\xca\xc7\xec\x4b\x9c\x73\x25\x0c\x25\x2f\x0f\x62\x25\x96\x8a\xb1\x57\xaf\x0f\x23\xf6\xe7\x76\x62\x6e\x27\x93\xc9\xc4\xaf\xf5\xc5\x30\x0d\xc1\x22\x10\xe0\xa4\x77\xa6\x1a\x17\xb0\xd4\xb9\x9c\x0f\x07\x99\xf7\x4e\x22\xa8\xdc\xf6\x93\xc1\xf3\xe0\x6a\xb8\x50\xdc\x8d\xe9\x50\x60\x76\x0a\x41\x71\xe7\x51\xe0\xf7\xbf\xa3\x28\xb5\xa7\x70\x33\x69\x54\x5b\x7d\xbb\xb8\x43\x60\x48\x3a\x0f\x57\x48\x33\xb1\xe4\x2b\xa9\x81\x46\x1b\x74\x07\x14\x2c\x77\xf7\x6b\xf8\x5d\x6f\xf6\x37\x3e\x9b\x85\xcb\x13\x7a\x30\x41\xfa\x7d\xb0\x54\x71\x57\x69\xec\x2c\x0a\xb4\x0e\x57\x3a\x4f\x83\xa5\x31\xc0\x41\x16\x6b\x50\xee\x6b\xaf\xe3\x7a\xca\x38\x44\x6d\xd8\x0b\x63\xb0\xe0\xb0\x43\x6c\xc6\xfd\x94\x9b\xe5\x3c\xda\x38\xfe\x84\x4a\x9c\x8b\x70\x23\x21\x47\xaa\x34\x13\xf3\xb9\x0f\x55\xb5\x62\xa2\x5a\x8a\x52\x18\x82\xa5\xeb\x7d\x78\x20\x31\x7c\xe2\x3d\x26\xe3\x95\x01\x42\xab\x4a\x5e\x0d\x3f\x5c\xfe\x73\xc1\x07\xca\xa5\x99\xb2\xb7\xbc\x90\x79\x74\x5f\xbc\xde\x3a\x78\xa5\x5e\x6b\xed\x5e\x4a\x0b\x41\xeb\xf0\x32\x0b\x78\x8d\xc2\x84\xc8\xc1\xf6\x23\x07\xbd\x95\x84\xd3\xad\xd8\xa1\xd4\x7c\x64\xf0\x87\xa9\xd5\xd9\x08\xee\x8f\x37\x2a\xde\xae\x36\x19\x06\xc1\x84\x72\x66\x5d\x69\x49\xa8\xe7\xd9\x64\x4f\x89\x8c\xb0\x53\xf6\xad\x8f\x88\x43\x3c\x4a\xc8\x75\x06\xe6\xa9\x06\x4d\xf1\x92\xaf\x91\xe3\x0a\xb1\x73\x14\xc7\x6a\x23\x5c\xc0\x3c\x49\x68\x33\x3d\xd3\x04\xea\x81\xcd\xf8\xc3\x1f\xb7\x2b\x68\x6a\xd6\xfd\xeb\xe1\xf5\x1e\x2d\x28\xb0\x3d\xab\xdb\xf3\x1f\x2e\x96\xdf\x08\xcb\x2a\x23\x32\x91\x43\xd2\x1e\xe1\xe2\xdc\xd1\x79\x23\xee\xc7\x60\xc2\x4d\xb8\xd4\xa0\x1c\x92\xee\xc2\x45\xe7\xe9\x3c\x90\xf7\xd0\xeb\x7e\xe0\x79\xd7\x5f\x29\x6e\x01\xe7\xaf\x26\x46\x6b\xc8\x0c\x19\x64\x5f\x36\x35\x81\x6f\x79\xcb\xd5\x5a\x79\x2d\x19\x1f\xbe\xa1\x74\x67\xb8\x5a\x6c\x53\x4e\x3e\x08\x55\xb6\x36\x02\x57\x40\x3a\x96\x6b\x82\x97\xe0\xf5\x6a\xf8\xf4\x6f\x2f\x9e\xb1\x47\xec\x08\xea\xd9\x1a\x0e\x4a\x0a\xb9\x00\x26\xdf\xfb\xda\x45\xce\xe3\x14\xa7\x64\xf7\x95\x69\x13\xc8\xaf\xbd\x7d\x04\x73\x16\xd6\x94\xe2\x64\xc7\x04\x4c\xe8\x17\x28\xf2\xbd\xaa\xfa\x08\xaa\x8a\xa6\x97\x28\x15\xe6\xa0\x5b\xbe\xb5\x62\x70\x99\xe2\x96\x91\xfd\xf6\x13\x18\x59\x72\x29\x3f\xf6\xc0\x35\xfd\x5d\x03\x6d\xc2\x4a\xe1\x78\xce\x09\x14\x18\x68\xac\xa3\xc0\xad\x7b\x40\xe9\x16\xf2\xa1\x7b\x90\x7c\xd0\xde\x73\x0f\xda\x73\x3d\x5c\x6d\xfd\xc4\x3d\xc0\x73\x3d\x3c\x60\xfa\xfc\x4d\xb6\x15\x2f\xa4\xaa\xef\x30\x0d\x3a\xf8\xe5\x7c\xeb\x6e\x5d\x9f\x83\x38\xe4\x68\xbe\x23\x71\xd7\xcc\x44\x48\xdb\xe5\xdb\x69\xbb\x69\x78\x9b\x6a\xf2\xed\x24\xbd\xb8\xd5\x87\x27\x36\xbb\x41\xda\xd7\xe1\x67\x95\x19\xae\x72\x5d\x6e\x7d\xbd\x3f\x14\x82\x13\x38\x5a\x3a\x2d\xd9\x76\xdc\xd6\x9d\xb7\x6f\xf8\x7d\x78\xff\x6d\xfd\xdc\xac\xd0\x68\xb7\x8f\x44\xb2\x96\xc2\x56\x06\xef\x21\xc9\xe4\x77\x2f\xa0\x5a\x46\xda\xe6\x00\x0e\x7f\x66\x69\x26\xc4\x67\xa2\xd8\x4a\x9e\x27\x32\xe1\x26\x32\x90\x18\x5d\x90\xa8\x93\x7a\x6b\xf4\x5a\x17\xa1\x10\x3d\x2e\x92\x17\xfb\x8b\x59\x23\x47\x82\x2e\x6d\x6a\xf0\x75\xb5\xb1\x46\x6e\x28\x0a\x2b\x8e\x87\xb8\x46\x35\xc1\x7b\x64\x9b\x6b\xe4\x5d\xd0\xfe\x1a\x79\xb1\xbf\x88\x35\xb2\x22\xcb\x74\x59\x5d\x19\x3d\x97\xc3\x6f\xdc\x96\x2f\x10\xc4\x31\x8d\xbe\x05\xc5\x17\xa8\xad\xd8\x22\xe2\xb6\xf8\xb2\x83\x14\x0b\x9f\x50\xcd\x53\x79\x34\x27\x94\x4b\x94\x64\x53\x74\xc6\x8b\xa5\xb6\x8e\xb8\x91\x6c\x73\x33\x37\x05\xb6\x95\x0d\xa4\x63\xcf\xfd\xd7\x81\x9c\x4e\x69\x2d\xc7\x96\x47\x44\x46\xc6\xa6\x43\x4e\x1f\xad\x15\x5e\xea\xf0\xd7\x48\x82\x63\x69\x80\xf7\x35\xda\x4a\x65\xdd\xe2\xcb\x68\xd3\xd5\xc0\x90\x33\x6d\xba\xba\x73\x58\x70\x31\xbc\xa6\x38\x8e\x8a\xbb\xe5\x09\x33\xa2\xe0\x4e\xae\x44\x54\x23\x37\x98\x9f\x22\x72\x2b\x75\x3e\x38\x5e\xe5\xb8\x71\xe0\x28\x4b\x3d\x10\x57\x16\x07\x7c\x35\x3c\xe1\x44\x97\x76\x8e\xc8\x09\x69\xd9\xc1\x8b\x78\xd8\x0e\x3e\x4f\x1b\x7a\x80\x5f\xd2\x24\x30\xa9\x5d\xc0\x18\xbb\x91\x2a\x0f\x4d\x72\x7b\x8b\x4f\x7d\x78\xf7\x23\x44\x56\xf1\x4d\x27\xaa\x66\x6e\xc4\x13\xf6\x8e\x76\xf7\x9a\x0d\x63\x93\xed\xab\x4d\x92\xd8\x55\x07\x3b\xae\x36\x49\x26\xaa\x83\x80\x5c\x8c\xa8\xdc\xc9\x08\x0c\xf3\x31\x84\x8c\x2f\x23\x71\x01\x12\x08\xe3\x1a\xed\xf5\xad\x82\x3b\xe8\x55\xe4\x84\x29\x9d\xa4\xc9\x5a\xcd\x18\xcf\x00\x85\x1d\x8d\xee\x5b\x74\x10\x3d\xf0\x56\x96\x96\x6b\x38\x6b\x5a\x7e\x00\xda\xc7\xc6\x8f\xa2\xe4\xdb\xda\xb6\x99\x21\x7d\x07\xa9\x41\xa9\x10\x7a\xd5\x9c\x8e\xe1\xd1\xaf\x3f\xc7\xa1\x56\x7f\xcb\xb1\xc3\xfa\xbe\x92\x9b\xe1\x18\x8a\xaf\x2f\x9e\x4d\xd9\x66\x22\xc4\x1f\x8f\xb0\x14\x54\xa8\x0b\xcf\xf3\x90\x73\x51\xeb\xd4\x40\x9a\x42\x05\x4f\x24\x82\x4f\x6b\x5e\x9d\x90\x39\x5b\xdb\xcc\x15\x69\xc7\xf8\x1a\x65\x00\x40\x92\xf1\x78\xa6\x87\xbf\xf2\xf0\x52\xd8\x8a\x67\xde\x52\x07\x89\x00\x56\xef\xd0\x4e\x0d\x37\xa6\x57\x4d\x9d\x7f\xad\x02\x9c\xa2\x23\xff\x68\x20\xf5\x0f\x7b\x5f\xee\xed\x38\xb0\xe7\xcd\x39\xa1\xe7\xad\xd3\xac\xe0\xb5\xca\x96\x0f\xfe\x94\xee\xd8\xf6\x08\xfd\x61\x9c\xdd\x08\x43\xeb\xf8\x5c\x71\xc3\x4b\xe1\x84\x89\xb4\x62\x84\x67\xad\xa4\xfe\x02\xf4\xee\x02\xc4\xee\x00\x13\x62\xfa\x3f\xad\xa7\x00\x9d\xbd\xbb\xcf\x88\xd8\xf6\x48\xc1\xe9\x50\xb9\x5f\x9d\x26\x6d\x35\x4b\x27\x03\x86\xd5\x1f\x61\x29\xde\x42\x5a\xf8\x73\x5d\x8b\x5b\xa9\x72\x7d\x6b\xc7\x7a\x36\xf9\x0e\xc5\xb5\x9c\x96\x11\xa0\x3e\xfc\x2d\xe2\xe3\x3e\x9d\xc4\x80\x61\xbb\x75\xd7\xa1\x4d\x4e\xeb\x77\xcb\x83\xa6\xff\xe6\x0f\x8a\x9f\xc9\xfb\xc5\xa2\xb4\xfc\xa9\xf1\x53\x76\x92\x17\xd7\x95\xc8\x92\x03\xe8\xaf\x5f\x5e\x9f\xf5\x45\xd2\x82\x48\x1f\x7a\x0b\x83\x70\x1c\x2f\xb3\xc3\x97\x77\x2b\x66\x4b\xad\x6f\x48\x72\x8f\x3a\x85\x5f\xcb\x7a\x36\xcd\x74\xd9\xa9\xdf\x9c\x58\xb9\xb0\xa7\x41\x3b\x4c\xfc\xea\xd0\x28\xb3\xa5\x82\x3e\xa1\xdb\xfd\x6e\xc3\xc7\xd0\x12\x3a\xcd\xaa\xc2\xd9\x0d\x95\x83\x21\xbf\xba\xbd\xec\x97\xb4\xe6\x3d\x81\x2f\xe9\x93\x67\x6f\xb6\x8f\xe2\xd0\x9a\xb3\x38\x3e\x70\x1c\xc9\xeb\x12\x28\xb8\x62\xa3\xb4\xe6\x60\xb6\xfb\x42\x8b\xec\xfd\x5e\x22\x6e\xe4\xd3\x3f\xcd\x45\x54\xce\x28\x6b\x0d\xe8\x9c\x20\xcc\x2b\xd5\x60\x16\xa9\x39\xd6\x6d\x84\xcf\x38\x4d\x05\xb7\x50\x3e\x31\xba\x27\xbf\x04\xfd\x04\xda\x87\xc9\xe1\xf1\x20\x43\x48\xdd\xa8\x88\x1f\x86\x21\xe1\x16\xf4\xa0\x31\xd3\xb4\x54\xd7\xc7\x44\x1f\xb0\x8f\x87\x40\x60\x23\x60\xe1\x18\xbd\x4e\xd3\xac\x64\x26\xce\xb2\x4c\xd7\x2a\xa1\x4c\xf3\x99\xf0\x93\xe7\x4e\xe4\xd7\x3d\x89\x43\x59\xd4\x39\xcb\x41\x12\x72\x19\xf3\x42\x72\x64\xbc\xee\x4b\x1d\xce\x2f\xd6\xce\x0f\x9e\x5d\x37\xbe\x3b\x28\x09\xeb\x04\xa7\x94\x46\x26\xad\x79\x1a\xf7\xc1\xf6\xba\x50\xfa\xa6\x76\xcd\xc8\xc6\xfe\xa1\x31\x08\x2a\x70\x90\xd0\xe6\x5d\xf5\x67\xd2\x54\x38\x6e\x6f\x5a\x66\x71\x01\xc4\x3b\x8d\x72\xed\xfc\x7d\x58\xbe\x09\xc7\x19\x12\xd8\xc6\x07\xef\x97\xfb\xab\xb6\xce\x2f\xd2\x99\x7d\xfe\xff\x3e\xbb\x4c\x29\x3e\x07\x92\xf9\x96\x80\x65\x19\x04\x0f\x8c\x18\x31\xb8\xe9\x12\x1e\xdb\x8e\x50\x3f\xc7\x61\x2a\xce\xf0\xd0\xf5\x9c\xa3\x99\x2b\x04\x9f\xe3\xa9\x38\xc2\x6e\xb7\x60\x9c\x06\x96\x2a\x5d\x28\xd6\x62\xd8\x30\x72\x3c\xc1\x53\x51\x0a\xae\x6c\x0c\x4c\x07\x1e\x2a\x01\x9f\x17\x4b\x32\xe3\xfa\x85\x0a\x30\x3c\xc3\x83\x24\x62\xbe\x0c\xbf\x53\xe9\x5c\xf4\xa5\x59\x67\xea\xcc\xb1\xda\x59\xff\xf7\xc3\x17\x20\x46\xe3\x23\x2f\x81\x11\x0b\x69\x9d\x09\x84\x99\x7e\xa2\xed\x42\x60\xa2\x76\xd8\xf6\x47\x71\x37\x62\xcd\xfe\xfa\xcd\xf9\xdf\xfe\xfe\xe2\xd5\xd3\xb3\x17\x7f\x7f\x79\xf6\xf4\xaf\x17\x97\xe7\xef\xde\x5d\xff\xed\xfa\xcd\xf9\xcb\x77\xef\x9e\xd6\xc6\x08\xe5\x02\x73\xe5\xb5\x70\xef\xde\x05\x7d\x61\xdf\xbd\x7b\x93\x55\xb2\x7a\xf7\xee\x2a\xe6\x11\x07\x93\xad\xfa\x8d\x05\x2f\x00\x69\xa6\x72\x2d\x2c\x54\x1d\x40\x9d\xdb\xf0\x43\x0d\xeb\xbc\xe4\xb6\x2d\x91\xeb\x91\xe8\x0c\x6e\x6f\x46\x03\x9c\xdb\x25\x37\xe2\x0a\xdd\xbc\xcb\x98\x5c\x4f\x50\xf8\x5e\x1c\xe3\xcc\x4a\xb5\x28\x44\xf3\xcc\xd4\xa4\xed\x07\xad\xd0\x4c\xb8\x5b\x11\x58\xe1\x36\xdd\x59\xdb\xd6\xa9\x0f\x92\x09\xcc\xa8\x2e\xd0\x8c\x78\x77\xae\x23\x31\x2a\x2e\x3e\x1b\xda\xb0\x45\xb3\x95\x14\xb7\xe0\xce\x59\xb9\x50\xbc\x88\x5f\x2e\x02\xe5\x29\x70\x30\x0e\x92\xb9\x89\x02\x12\xcc\xfa\xfb\x53\xe9\xfc\xa4\x69\x71\x09\x6f\x79\x83\xa4\xc6\x0d\xd9\x7a\xf3\xeb\xf2\xe8\x0c\x73\x89\xa0\xbb\x86\xc8\xd9\xd5\xc5\x33\xf6\x78\xca\xbc\x2d\xf2\xff\x0a\x2d\xa0\x76\x1d\xae\x61\xab\x10\x3a\x02\x79\xe7\x19\x3d\xfa\x1d\x44\x16\x43\xf7\x0a\xaf\xd6\x70\xc3\x3c\xf8\x6e\xd5\xb3\x5c\x97\x5c\x0e\x6a\xe8\xfa\x01\x3a\x98\x79\x5d\x14\x6b\xf6\xcf\x9a\x17\xc3\xb9\x0c\xaf\x74\xde\x2a\xe2\x78\xd8\x0f\xfe\x14\xff\xea\xcf\xd3\x3f\x35\x33\xfe\xf3\xf4\x4f\x43\x5b\x73\x34\x77\xfc\xcf\x53\xbb\xca\xa6\x7f\x0a\xdc\xab\x2c\x08\x6c\xaa\x5f\x87\x3d\x3d\xbe\x87\x6f\xa6\xd1\xbb\x3c\xc8\x1f\xec\xa5\x70\xe7\xf5\xca\x47\x67\x9a\xc1\xde\xb9\x00\x21\xfa\xda\xf0\x4c\x5c\x09\x23\x21\xe0\xd3\x2a\xa7\x73\x7b\xc6\x2b\xc0\xf2\xd0\xe4\xc6\x5f\x68\x8b\x42\x07\x5b\x6b\xbf\xa8\x4a\x88\x1c\x83\xfb\x30\x5f\xc1\x16\x7e\xba\x70\xdc\x86\x69\x58\x1f\x81\x03\xf1\x6a\x66\x04\xc7\x72\x78\x96\x8b\x42\xb4\xed\x40\xa6\xf8\x24\x32\x48\x6a\x84\xa7\x29\xad\x26\x4a\x2c\x10\xfc\x15\x9e\xc2\x11\xfc\x36\x3c\xb5\x8d\x84\xb0\x0d\x7e\x29\x4c\x52\x96\xa5\xc8\x7d\x80\x57\xac\x07\x57\xf8\x81\x61\x41\xa7\x47\x5a\xa6\x64\x81\xc7\x36\x22\x66\x60\x49\x59\x05\x47\x80\xe4\x52\xd7\x81\x5e\x00\x22\x41\xf8\x6a\xb2\xc8\x90\xa2\xdb\x71\x80\x18\x9f\xbb\x86\xd2\x3a\x58\xb1\x61\xfe\x5a\x68\xef\xd3\x72\x0d\x42\x2d\xbd\x15\xca\x31\xde\xbd\x11\xc3\x54\x01\x1a\xd6\x68\xfb\xb0\x9a\x05\xad\x39\x75\xa2\x7e\x56\x73\x6d\x32\x39\x2b\xd6\x6c\xc9\x8b\xa6\x41\x11\x67\x37\x7e\xc5\xf1\x27\x87\x1d\xff\x6b\xe1\xba\xc7\xa0\xd0\x6a\xd1\x0d\x5d\xc4\x5d\x05\xad\x5c\x86\x59\x41\x6f\x76\xea\x0a\xbf\xd9\x7b\xd0\x6b\x5d\xa7\x96\xe0\x39\xcd\xbe\x7c\x14\xb7\xfc\x13\x53\x96\x0f\xc0\x9f\x38\x5d\x08\x3c\xa1\x74\x6d\xb9\x93\x54\xed\xd0\x76\x65\x0f\x5f\x80\x4f\x4d\x9a\xfb\x26\x36\x55\xf3\x67\xeb\x4d\x33\xf3\xa1\x19\x2c\x6f\xf8\x1c\x07\x5a\x38\xaf\xed\x51\x0e\x10\x8d\xad\x99\xf7\x04\xdd\xf0\x8e\x7d\x2c\x12\x3a\xe2\xbd\x34\xb2\x2a\x04\xfb\xd3\x8d\x58\x9f\x20\x4f\x3e\x06\x37\x7f\x1e\x28\xb3\xed\x9c\xda\xf0\xb7\xea\xca\x4f\x56\x1b\xf6\xa7\xf8\x6f\x7f\x1e\x76\x37\xc9\x4f\x87\xf4\x87\x43\xfc\xf8\x44\x14\xcd\x39\x32\xa8\xd0\x69\xf6\x71\xe0\xfe\x06\x3a\x16\xa7\x71\x61\xa7\xec\x1c\xe8\x24\x21\xe2\x27\x08\x0d\x3d\x03\x8b\xa2\x27\xde\x86\x1e\x14\x09\x8f\xf0\x0c\xd9\xc6\x44\x8f\x8f\xe5\x52\x5f\x07\x92\x40\x68\xa5\x32\x17\xa6\xfd\x1b\xca\x2f\xa8\x9c\x5d\xea\xf3\x3b\x91\xd5\xc3\x9a\x91\xe0\x48\x78\x50\xba\x11\x84\x0e\xf0\xbd\x43\xf1\x8d\x68\x5a\xdd\xe0\xca\xdf\x08\x0a\xae\xa4\xa1\x9d\x68\xb5\x61\xa7\x46\x87\x92\xe9\xef\x9c\xa7\xad\xd3\x71\x23\xd6\x03\x69\xe2\x71\x84\xe6\x77\x37\xf8\xcd\x81\xaa\xb5\xd1\x07\xde\x39\x24\x08\x9d\x09\x76\x7e\x27\xad\xb3\xff\x13\xb5\x6a\xa6\xcb\x59\xf0\x4c\xc8\xd7\x21\x5e\x2b\xf8\xe6\x78\x70\x55\x0e\x7f\xa4\x7d\x7c\xc2\x21\x8b\x0b\x94\x78\xd2\x5e\xc5\x75\xee\x34\x85\x1c\x5e\x9b\x0f\x67\xfe\xd0\x86\xd2\x0d\xad\x80\xbc\xab\xdb\x7f\x8e\x72\x2e\x22\xb8\x1f\x27\x88\x3a\x02\xf7\x14\x56\xfd\xdc\x07\xca\x14\xb9\xdd\xf7\x4e\x14\x12\xc5\x4a\x20\xfc\x97\x2b\x5e\xd0\x9a\x8f\x3b\xed\xbd\xf9\x3c\xe3\x06\x51\xab\xa1\x97\x8c\x0d\xed\x73\x29\xeb\x0a\xa4\xf7\xde\xbf\x0c\xd6\xbc\xbd\x6f\xc8\x5e\x47\x11\xc9\x8d\x93\x59\x5d\x70\xc3\xbc\xc5\x59\x90\x1a\x5b\x27\x9c\xdc\x56\x19\x11\x42\x65\x1c\x7d\xef\x69\x53\x5e\xe7\x2c\x93\x94\x66\x8c\xb9\x20\x31\x09\x34\x36\x3d\x15\x4a\x90\x79\xd4\x6f\xf7\xab\xe7\xd1\x52\x37\x06\x8a\x62\x43\xdb\xe6\x8b\xae\xd7\x7c\x50\x2e\xa0\x41\x20\x05\xb3\xd3\x3a\x8d\x8d\xed\x99\xb2\xbf\x34\x34\xbe\x94\x59\x22\x1d\x26\x50\xa3\x09\x17\xf9\xb2\xd1\x82\xc4\x5f\x23\xee\x12\x9a\x9d\xb9\x36\x62\x25\x0c\x3b\xca\x35\xfc\x8a\x58\xc9\x6c\xe8\x7b\x11\x8e\xff\x5f\x18\x0d\xaa\xa5\x49\x42\x04\x25\x4f\xaf\x55\xea\x34\xb4\x7c\xc4\x8e\x60\x6a\xdd\x24\x04\x65\x8b\x02\xd2\x09\xbb\x20\x51\x2f\xee\xa7\x2f\x34\x20\x63\x6e\x77\xe0\x6d\x7b\xae\x11\x0d\xf6\xc8\x36\xfd\xa2\x26\xce\xd1\xd3\xe0\x91\x50\x6e\x64\xb4\xa6\xd2\x06\x9b\x72\xd2\xc5\x6e\x50\x8b\xa9\x66\xa2\x71\x8b\x9a\x2b\xff\xdf\x5e\x97\x70\x66\xc4\xc2\x6b\x72\x82\x50\xd4\xdd\x9f\x48\xf3\x3b\x5d\xe9\x42\x2f\xd6\xd7\x95\x11\x3c\x7f\xaa\x95\x75\x06\x8c\x18\xbd\x79\xdf\xfb\x24\x86\xff\xb3\xd9\xc0\x7c\xd1\x52\xdf\x32\x1e\x58\x97\xf5\x1c\xfb\x43\xea\x7a\xb1\xc4\x56\xff\xf0\x23\x8c\x67\x46\x0f\xe4\xf5\x8f\x1f\x1e\x52\xd9\x76\xca\xae\x9b\xf6\xfc\xa0\x56\x2c\x25\xc2\x81\xd9\xc1\x23\xd9\x2d\x5f\x07\x95\xca\x67\x32\x17\xb6\x53\x68\x1e\x17\x64\x60\xeb\x26\xef\x5f\xbc\x77\x6d\xbd\x0f\x76\x76\xf9\x4c\x0c\x7a\x99\xbb\xa7\xa4\xca\x7b\x3e\x62\xe0\x81\x8f\x51\xae\x85\x13\xd2\x9e\x85\x26\x73\xe1\xf7\x62\x68\x9a\xa6\xd4\x21\xff\x81\xdd\xce\xe3\x7a\x7f\xa2\x8c\x07\xb5\xab\x51\xc9\xef\xae\x6f\xc4\x30\x8e\xf0\x49\xf3\x71\xdf\x0c\x0c\x61\x27\x90\x01\xfe\x56\x59\xee\xa4\x9d\xcb\xc1\x0f\xb7\xf4\xbc\x0e\x30\x5a\x5c\x43\x5f\xee\xe4\xf8\xea\x45\x57\x96\x37\x0b\xb5\x25\xd5\x13\x87\x16\xa2\xfd\x63\x37\xc5\xf2\x36\x42\x56\x8f\x35\xd9\x1d\x70\x1d\x91\xc3\xc3\xc6\x69\xfa\x5b\x0e\x08\x27\xea\x54\x73\x81\x2f\x01\xe8\x3a\xab\xba\x9c\x09\x13\xb5\x2a\xc5\x85\x84\xfc\xba\x34\xfd\xb6\xe5\xcd\xc9\x22\x48\x44\x6d\x4c\x35\x7e\xc4\x2a\xb3\xb4\xe2\x2d\xd8\xae\xf3\x3b\x1f\xd9\x58\x4a\xb9\x0e\x8e\xde\xe1\xdc\x14\x49\x92\xc8\x90\x47\x26\x56\x32\xf7\x8f\x12\x51\x62\xd0\x50\xd0\x83\x06\xdf\xc2\xba\x7f\x43\x14\x4a\xb2\x5d\xed\xa0\x17\x5b\xe2\x20\x96\x5c\xe2\xd8\x2c\x1b\x1f\x63\x91\x7b\xcb\x8c\x9b\x98\x2c\xb1\x4b\x5f\x16\x9e\xc9\xec\x09\x94\x86\xae\x69\xc8\x67\x16\x32\xb9\x5c\xb5\xce\x35\xfc\x08\xa4\x9a\x88\xdc\x2d\x2c\xb8\xff\x37\x62\x0d\xc2\x71\x9e\xb4\x63\x91\xa8\x13\x70\xd0\xeb\x4f\x71\x4c\x88\x09\x62\xfc\x6f\xe3\xc2\x12\x05\xa4\xa9\x35\x1c\xa4\x94\x79\x3b\x7a\xd7\xe3\xa6\x49\x9e\x27\x48\x8c\xbc\x56\x5e\x58\x93\x46\x4f\xbe\x1e\xac\xa9\x6d\xa4\x26\xe0\xe3\x48\xac\x7f\xc5\x41\xcf\x21\xb7\xa3\xb7\xf4\x7a\x3b\x9b\x9c\xb6\x56\xbb\xf3\xca\x89\x32\x81\xa5\x79\x1e\x6f\x3d\xe6\x99\x93\x44\xf6\x73\xd4\x17\xea\x84\x5d\x6a\x77\xa1\xe8\x1a\xcf\x8f\x4e\xaa\xfb\x99\x16\xf6\x52\x3b\xf8\x9b\x7b\x3f\x34\xb8\x6c\xa3\x1d\x99\x90\x62\x83\x06\x7a\x69\xfb\xea\x2d\x73\x00\x4e\x7b\xef\x30\x4d\xa9\xe3\x08\x4f\x53\xdd\xb4\xce\x45\xda\x2c\xb5\x09\x67\xa3\xcd\x0b\xd9\x04\xa7\x22\x8e\x2e\x84\x2a\xb4\xfd\x22\x90\xa9\x76\xc7\xe6\x77\xe3\x71\x4c\xfd\xf6\xee\x49\xee\x2e\xc1\x08\x3b\x1f\x97\x20\x7c\xfe\x9b\xa1\xbd\x2d\x77\x4b\x85\x1e\xd6\x55\x01\xac\x24\x79\x9d\x74\x71\x18\x2a\x1f\x67\xb8\x13\x0b\x99\xb1\x52\x98\x85\x60\xd0\x57\x2f\xfd\x52\xa7\x1e\xa1\x24\xef\xb4\x3b\x11\xb2\x76\x81\x60\x04\xc2\xe5\xd1\x42\x1b\x94\x06\xba\x85\xf8\x65\x25\x87\x6c\xe0\xff\x6a\x10\x2f\xff\x9b\x55\x5c\x1a\x3b\x65\xb4\xe2\x65\x16\xd1\xf3\x5d\x89\x01\x4b\xd7\x99\x72\xc2\x6c\x7b\x6f\x98\xc8\x83\xc4\x04\x72\x56\x11\xa5\xea\xf9\x56\xa0\x78\xc2\x6e\x97\xda\x8a\x04\xaf\xb3\x79\xac\x3a\xb8\x11\xeb\x83\x93\x9e\xba\xa1\x87\xa1\x07\x17\xea\xa0\x85\xd0\x8f\xa0\x5d\x9b\x50\x06\x88\xfe\x0e\x40\xe2\xc1\xc3\x8a\x48\x13\x02\x8f\xc8\xeb\xc5\x8b\xab\x64\x1f\x3e\xe1\xf6\x87\xbc\x62\x62\xa6\xed\xf0\x25\x8a\x69\xf3\xff\xc4\x10\x20\x17\x0b\x23\xa0\xee\x10\x13\xeb\x90\x6c\x2f\x11\xf9\x5c\x2b\xb1\x12\xaa\x20\xa5\x9c\xa4\x0d\xad\x3f\xf3\x00\xa0\xfa\xc7\x56\x82\xf3\xff\x7e\xa6\x2f\xb5\x8b\x2f\x04\xff\xa0\x3f\xb7\xa2\x3e\xb9\x93\x65\x5d\x62\xc7\x2f\xe7\xbc\x01\x93\xf3\xd0\x51\x9f\xf4\x08\x85\x15\x3b\xfd\x8c\x5e\x4a\x1a\x9c\x35\xa9\x3d\xe6\xb8\x59\x40\x07\xc9\xf0\x5a\x12\xaf\xf0\xa2\xd0\x33\x12\xa1\x40\x29\x95\xff\xf8\x29\x7b\xae\x0d\x13\x77\xbc\xac\x0a\x71\x82\x4f\x26\x5f\x4e\xfe\xa5\x15\x65\x05\x42\xd5\xc3\x09\x8b\x27\x2d\x94\x19\x39\xcd\x1e\x9f\x90\x7a\xd5\x85\x97\x1c\xc0\x25\x37\x65\x40\xbd\xf4\x33\xe5\x61\x2f\x3c\x56\x59\xf6\xf8\xf4\xf1\xe9\xa3\x27\xec\x47\xe6\x3f\xf8\x71\xf8\xe7\x17\x04\x91\xf8\x5f\x7e\xc9\x7e\x64\x3f\x32\xc6\xae\xe0\x6f\xda\x7f\xc2\xff\x05\x41\xea\x84\xc9\x79\x77\x2d\x1f\xfb\x0d\xca\x74\x19\x8e\x13\x65\x87\xb8\x6a\x29\x59\xc3\x2d\x02\x30\x2c\x4e\x9f\x14\x39\xce\x44\xa6\x4b\x01\x6b\xf9\xf8\x7f\x46\xa9\x00\x81\x77\x4c\x2b\x92\x48\xd8\x8e\x23\xd8\x8c\x63\x76\x0b\x8c\x96\x25\xbf\xc1\x64\xf9\x59\xe6\x6a\x5e\xf8\x25\x39\xfa\x62\xf2\x88\x02\x10\xd0\xaa\xff\x03\x2b\xa9\x0b\xee\x44\x5c\xe9\xa3\xc7\x24\x70\xc4\xe6\x66\x7d\x31\xca\x66\xf5\xf6\xc9\xaf\x26\x80\x95\xfd\xc4\x29\x73\x7c\x9f\x56\x8d\x0a\xf5\x4c\xad\x6f\xf9\x3a\x41\xad\xc6\xe6\xf9\x0b\xb9\x12\x6c\x29\x17\x4b\xe8\x96\x13\xa9\x13\x68\x6f\x25\x41\xe7\xc9\xd8\x26\x0c\x27\xbe\x66\xd2\x4d\xd9\x85\x3b\x24\xd1\x1e\xf3\x26\xa3\x18\x68\x6c\x9a\xea\x53\x2a\x5a\xc2\x5f\x4f\xd0\xca\x8f\x22\x9a\x27\x20\x78\x07\x77\x28\x1c\x11\x82\xf2\xe5\x50\x5d\xd6\x79\x8b\x4c\x06\x9d\x35\x92\xa2\xbd\xa5\x39\xc3\x7a\x8e\xc4\xc0\xa0\xf5\xed\x94\x5d\xea\x3c\x9e\x84\x25\x5f\x91\x80\xcf\x21\x75\x19\xac\x8a\xb4\x4d\x9e\x5b\x02\x41\x4f\x46\x32\xa8\x1d\xa0\x76\xa6\xa1\x09\xaa\xc1\xbb\x30\x13\xc1\x88\x53\x4c\x15\x87\x26\x71\xe1\xf5\x9b\x7d\xd7\xca\xa6\x75\x9c\x61\x58\x9b\x80\x93\xfd\x33\xb6\xca\x3b\x98\xd5\xd9\x8d\x70\x07\x54\x0b\xed\x0c\xb4\x67\xad\x6a\xc7\x66\xbc\xe0\x2a\x13\xf9\x18\x2f\x9a\x4e\x63\x95\x2e\xce\x0e\xae\xba\xed\xdc\x5b\x82\x4c\x22\x61\x55\x82\xe3\xbe\xa5\x69\x53\x5d\xf8\xef\x36\x05\x26\x91\xf4\x07\xc0\x46\x2e\x78\x11\x4b\xbf\x2a\x9d\x77\xba\xfc\xa9\xc3\x43\x4a\xe0\x14\x35\x34\x78\x6c\xe8\x6c\xb5\x70\x9b\x29\x9b\x10\x44\xf6\xfc\x7e\x76\x14\x59\x2f\x98\x13\x45\x41\x8d\x63\x6c\x03\x34\xf2\xea\xda\xe9\xe6\x2f\xc0\xb4\x50\x66\xd9\xb7\xa3\xed\xe4\xda\x9f\xa2\x99\xc0\x66\x62\xb1\xa4\xd0\xfb\xe9\x6a\xdd\x10\xf4\x9f\x78\x37\xac\xa6\x6c\xd5\x42\xae\xbc\x83\xb2\x65\xaa\xfb\x86\x97\x32\x6b\xaf\xa0\xd1\x75\x5b\x8a\xa2\x62\x46\xe4\x75\x86\x1f\xc0\x98\xbd\x11\xb7\x14\xff\xe5\xac\x73\x8e\x18\x14\x2d\x34\x8a\xf6\xa0\x77\x2d\x28\xa4\xe7\x73\x6d\x18\x57\x3d\xa7\xcd\x5f\x05\x6f\x17\x34\x2d\xa2\x95\x73\x26\x56\xc2\xac\x59\xa5\xad\x95\xfe\xb6\x82\x25\x03\xd6\x00\x62\xbe\xa9\x69\x81\x05\xd5\xe0\xb0\xbc\xd1\x7d\x3d\x08\xce\x27\xe5\xdb\xb5\x62\x56\xf7\x4c\xcd\x46\x58\x48\x32\xb3\x18\x48\xbe\x2f\x2c\xa4\x5d\x05\x0c\x24\x3f\x6e\x58\xf8\xa5\x0f\x65\xc6\x0e\x0b\xaf\xe0\xff\x6d\x85\x87\x04\xa9\x17\x73\xb6\xc3\x0e\x34\xa1\x76\x4f\x55\x92\x5c\xf9\xee\x0d\xd8\x19\x31\xd2\xb6\x0e\x56\x11\x82\xae\x2f\x8f\xd1\x31\x82\xc0\xf1\xcb\xd3\x2f\x4e\x1f\x1f\xf9\x35\xff\x82\x12\xcd\x71\xdb\x0f\x09\x1f\x1f\xc7\x00\x2f\xfe\x16\xd9\x82\xf9\x90\xa3\x13\x14\xb2\x0b\x85\xf8\x62\x76\xab\x4d\x6e\x29\x4b\x0b\xc8\xd3\xc0\x0d\xe1\x57\xd6\xba\x50\xdc\x2e\xcb\xe8\x3b\x51\xc4\xce\x6a\xd7\xb1\x66\xb7\xda\xdb\x6d\x8c\x98\xa5\x63\xbf\x29\xb5\x11\xbf\xa1\x9c\x83\x66\x4e\x21\xd0\xda\x0e\x9b\xa8\xb1\xcd\x60\x6f\xea\x6e\xd2\x61\x5f\x2d\xa4\x75\x93\x92\x57\x93\x1b\xb1\x1e\x94\x8f\xa5\x82\x2d\xd3\xa0\x96\xdb\x73\xc7\x45\x28\x79\xf5\xb3\xa5\xac\x74\x51\x97\xc3\x92\xcf\x7d\xcf\xf1\x45\x80\x9f\x05\x41\x01\x88\x04\x19\x86\x41\x7b\x58\x22\xec\x91\xcd\xd6\x5d\x96\x9e\x99\x28\xb4\x5a\x20\xe6\x70\xb0\x37\x36\x80\x88\x2e\xd3\x2a\x13\x95\xb3\xa7\xd6\x69\xc3\x17\xe2\x34\x7c\xce\x70\x3e\x9b\x4f\x8d\xb6\x7e\x0b\x13\xed\x55\x11\x22\x33\xef\xc0\x1b\x84\x1f\xdc\x10\x40\xe1\x3e\x86\xe4\x3b\xcf\x80\x07\x62\xa8\xc8\xd9\xba\xdf\x0b\xa4\xc3\x5d\xf1\xc0\x01\xd7\x83\x89\x6f\xe8\x50\x2c\x7e\x6b\xcf\x0b\x6e\x9d\xcc\xfe\x52\xe8\xec\xe6\xda\x69\x93\x1c\xcd\x9d\x7d\x77\xbd\x25\x93\xa0\xa7\xbb\x67\x4a\xb1\xb3\xef\xae\xd9\x33\x69\x6f\x98\x11\x56\xd7\x86\x96\x75\x83\x66\xf4\xb6\x47\x97\xc0\x9b\x3e\x63\xa4\x8c\x1b\xb4\x8e\x2a\x79\xb6\x94\x4a\xc4\xd7\x0b\xc5\xc4\x5d\xa5\x31\x65\x48\x34\xa6\x23\xe8\x8e\x5f\xf1\x5b\x2b\x70\x1b\x66\x7e\x1b\xfc\xff\x2c\xa8\x86\xed\x1e\xfa\x6b\xe0\x67\x5c\x3c\x1b\xfc\x9f\xa6\xe1\x12\xe7\xf6\x0d\xb1\x91\xda\xe6\x35\x78\x2e\x0b\x81\xd5\x7a\xf4\x46\xa4\x4d\x97\xf6\xa0\x1f\xe1\x04\xaf\x75\xcd\x6e\x39\xf9\x5d\xdf\x69\xb4\x76\x53\xf6\x46\x56\x4f\xd8\xb9\xb2\xb5\x11\x0d\xd8\x91\xfc\xae\xdf\xfb\x58\xf0\xdb\x63\xdb\x1d\xa2\xc8\x50\xd1\x04\x37\x0c\x21\x02\xde\x10\x53\xeb\x1f\x71\x9c\x63\xe8\x67\x9f\xb0\x03\x71\xe7\x7e\x77\x70\xc2\x0e\xee\xe6\xd6\xff\x43\xb9\xb9\x25\x35\xed\xf3\xe3\xa2\xac\x0a\x99\x49\x57\xac\xfd\x7d\x15\xa6\x4d\x91\xe2\xcf\x50\x91\x0d\x9b\xad\xef\xc7\x57\x08\xc4\x99\xbd\x79\xf5\xec\xd5\x13\x48\xb4\xe5\x9a\xdd\x42\x87\xc9\x95\x50\x8e\x09\x63\xf4\x40\x16\xce\xce\xe7\xaa\xc0\x80\xd8\x1c\x25\xe0\x59\xcc\x74\x59\x19\x5d\x4a\x4b\x07\x61\xe1\xb3\x38\x28\xe9\xe1\x1a\x90\xa5\x63\x9c\xa0\xf4\x1e\xd4\xc2\x08\x7a\x05\x58\x83\xa2\x40\x2a\x75\x39\x7b\xaf\x56\xa1\xe3\x6c\x83\x56\xb9\x98\x33\x8d\xc0\x83\x1e\x53\x1a\x1d\xdd\x13\x15\x96\xd7\x08\x61\xc6\x6a\x30\x1d\x77\x3b\x5a\x1d\xf0\x5c\x9b\x28\xf0\x34\x17\xab\x53\x9b\xf3\xc7\x54\xf0\xae\x5f\x3e\xbc\xaa\xa8\xb6\xda\x1d\xe2\xd4\xfb\x70\xf0\xf8\x60\xca\xae\x65\x29\x0b\x6e\x8a\xf5\x49\x77\xc7\x1a\xe9\x54\x75\xad\x4d\xf3\xc9\x00\xa0\x7a\x74\xc0\x8e\x90\x84\x8c\x8a\x98\xe2\x8a\x15\x82\xaf\x44\xe4\x6e\x83\xa6\x48\x88\xca\x3c\x26\x04\xd4\x2c\xf9\xc1\x90\x25\x3e\x1a\x32\x70\x60\x78\xfe\x4a\x15\xc4\x22\x85\x0d\x1e\xdd\x70\x3a\x0e\x9c\xa9\xc5\x01\xfd\x9a\xcd\xb5\xc9\xd0\xd7\x84\xcc\xd8\x52\xb0\xd7\x61\x96\xa9\xbd\xa8\xa4\x0a\xf1\xdc\x4b\x7f\xdd\xe0\xe2\xe1\x64\x13\x50\xc5\xbb\x54\x01\x9c\x38\x60\x6c\x25\x5b\xdc\x07\xe1\x1b\x33\x32\x8d\x6c\x3b\xa2\x9b\x3b\xc6\x09\xfb\x56\xc9\x7f\xd6\x82\x5d\x3c\xa3\xb0\x92\xb7\xa3\x12\xc6\x4a\xeb\xbc\x3d\xcf\xbb\x11\x17\xdd\xd6\xf8\xe0\xed\xe8\xac\xe4\xff\xd2\x8a\x9d\xff\xe5\x3a\x7c\xf4\x31\x7a\x34\xe4\xc3\xfa\x50\x36\x9f\xe4\x16\xf0\x7f\xd5\x46\xf8\x80\x36\x31\xda\x3e\x8b\x72\xd2\x6a\x6f\x7c\x84\xed\x25\xb1\x67\xdc\x71\x0c\xb4\xd1\xe6\x6a\xea\x1b\x3f\xf8\xed\x5e\x4b\xcd\xa0\x7e\x39\xb6\x76\x20\x77\xf4\xbc\xb7\x40\xd4\xdf\x01\x52\xd7\x24\xfc\x4f\xbf\x7d\x7d\xf1\x89\x43\xd8\x0c\x3c\xdd\xc5\x4b\x9d\x8f\x12\xc7\xfe\xd5\x6f\xe4\x53\x94\xc9\x4a\xb2\x50\xc6\x2e\xb5\x12\x27\x60\xac\x98\xb7\x56\xe1\x5f\xbf\x33\xd2\x0d\x63\xee\x6e\x47\xa2\x5b\x1e\x77\x76\x84\x55\xf2\x4e\xf9\x65\xa7\xa7\x49\xce\x1d\xb5\xf6\x00\x74\x6e\x88\x85\x66\x85\x9e\xb1\xa0\xbf\xee\x6b\x85\xbe\x7d\x7d\x31\xd2\x02\x7d\xfb\xfa\xe2\x97\xb4\x38\xa3\xa5\x8a\x36\x32\x45\xc9\x11\xd8\xcb\x50\x12\xc5\x3b\xb1\x34\x35\x4a\xf4\xf3\x69\x1b\x28\xef\xcc\xc9\x10\x45\x87\x4c\x0e\x3b\xbf\x9b\x7e\x8e\xd9\x98\xfb\x38\x71\x37\x52\x11\x6b\xc5\xfb\x2a\xfd\x3c\x30\x56\xa7\x55\xe1\x41\x2b\x88\xfc\x09\x2b\xeb\xc2\x01\x41\x30\x5c\x48\x7f\x43\xa9\x12\x2b\x61\xe2\x85\x66\xa1\xd9\x12\x63\xcf\x04\x42\xc1\xc8\x55\xf2\xa1\xf4\xaa\x99\x5d\xf7\x67\x88\x22\x9b\xc9\xbd\xe4\x8a\x2f\xfc\x22\x80\x3f\xc7\x4a\xfc\x23\x55\xb9\x79\xdf\x0b\x66\x78\x04\xd8\x04\xa9\xa2\x40\xc6\x57\x5c\x16\x7c\x26\x0b\x49\x8e\xee\xac\x70\xc7\xd3\x18\x82\x41\x70\x07\x8d\x62\xf2\x7b\x31\xbd\x23\x06\xd6\x5d\x5e\x4f\x08\x2a\x89\xeb\x73\xe4\xe7\x74\x7a\xeb\xdd\x91\xe3\x69\x1b\x53\x2f\x05\x39\x44\x01\xa2\x2f\x0c\xd7\x7b\x61\x3a\xa5\x07\x53\x3b\x36\xa2\xf4\x14\x45\x44\x0b\x5b\xe1\xa8\x7b\x9b\x35\x46\xe8\xe2\xe5\x8c\x14\xba\x80\xa8\xd0\x1c\x6a\x1f\xbd\xc0\x98\x30\x2b\x32\x23\x1c\x31\x7e\x01\x05\x41\xfa\x6f\xd3\x22\x98\xbd\x76\xf8\x7c\xb5\x03\x03\x53\x13\x0f\xdd\x08\x3b\xd8\xed\x3a\x8c\x82\xc9\x2f\x1e\x5d\x92\x22\xd4\x19\xd7\x49\x6e\x40\x6c\x59\x09\x91\x9f\xd7\x16\x43\xc9\xee\x9a\xa9\xa5\x59\xd3\xe6\x9e\x8e\xb0\xdc\xd8\xee\x8d\xdc\x26\x3a\xe1\x4b\x32\x51\x2d\xe7\xa9\xac\xd0\x4f\x45\xb5\x7c\x7e\xdd\x07\x24\xf9\xbf\x23\x7c\xcc\xf3\xeb\x9e\x15\x41\x9b\x80\xb5\x5a\x7e\x8d\x68\x05\x5a\xd8\xa6\xa4\x90\x73\xe1\x24\x61\x89\xef\xcd\x8e\x94\x5a\x49\x47\x79\xdb\x4d\x64\xbf\x0b\x3f\x3b\x46\xd4\xf3\x3a\x7e\x3e\x7b\x49\xfd\x18\x1c\xc0\x99\x96\xe9\xa2\x10\x19\xbc\xf0\xe9\x39\x1c\x31\xfa\x1a\xe1\xd8\xf1\xa6\x11\xa0\xea\x76\x7a\xf3\x07\x48\x6c\x87\x14\xf6\x29\x5e\x95\xd3\xd7\xe7\x67\xcf\x5e\x9e\x4f\xcb\xfc\x57\x4b\x7d\x3b\x71\x7a\x52\x5b\x31\x91\x2e\xc5\xa3\xbf\x27\xa2\xbb\xe4\x07\x76\xb7\x1c\xe3\x88\xb4\x7d\x08\xbf\xb5\x40\xdf\x9d\x02\x38\x08\x90\x52\xa3\xb5\x3b\xe9\xf6\xbb\x4d\x90\x39\xaf\x8b\x02\xcf\x9a\x33\x42\x9c\xa4\xbf\xad\x0f\xea\x65\xdc\x99\xcb\x83\x89\xfe\x0e\xb7\x5a\x47\x92\xf7\x2c\x38\x88\xef\x71\xf5\x88\x52\xbd\x83\xf8\x3e\x57\x8f\x1e\xc8\xbb\xd0\x8b\xad\xe7\xea\x8d\xf7\x9a\xf6\xe9\xd5\x4e\xaa\xaf\x49\x0b\x47\xd9\x4f\x9c\xa6\xeb\x46\x6e\x02\x72\x05\x80\x20\x6e\xe9\xcf\xd6\x8d\x58\x33\x20\x28\x9b\x93\x99\x6e\xbe\xb5\xc2\x9c\x74\x1f\xd1\x4f\x85\xcb\x60\x53\x4e\x6b\x2b\xcc\x34\xc9\x3b\x7e\x10\xd6\x87\xee\x01\xc3\xa7\xbf\x16\xf3\x8f\x71\x08\x5e\x0b\x2a\xfa\x01\x68\xc4\x02\xf7\x4a\xcc\x1f\xf0\xda\x2d\xb1\x1e\x3b\x01\xc0\x83\xdf\x0b\x38\x9e\xcd\x53\x41\x94\x18\xf8\xd3\x1e\xc4\x31\x48\xe0\x36\x4a\x67\x25\x55\xe4\x38\x8a\x6d\x9d\xa4\xce\x93\x20\x59\x22\x8b\x47\xc8\x0d\x46\x80\xea\x95\x30\x2b\x29\x6e\x4f\x6f\xb5\xb9\x91\x6a\x31\xb9\x95\x6e\x39\xc1\xd5\xb5\xa7\xd0\xdd\xf7\xf4\x57\xf0\x8f\x84\xd9\x21\x16\xf4\x2c\xcf\x43\x15\x59\x6d\xc5\xbc\x2e\xb0\x92\x2a\x89\x87\x91\x57\xf2\xad\x30\x16\x0a\x81\x6f\xa4\xca\x4f\x58\x2d\xf3\xaf\x68\xe7\x8a\xa5\xab\x18\xaf\x62\x47\xf7\x31\x0d\xfd\xc2\x42\x57\x7e\x9e\x6b\xa0\x27\x31\x70\x6c\x47\x70\x08\x79\x5e\x4a\xf5\x30\xb4\x00\x2d\x89\x20\x55\x4e\xd9\xa7\xfe\x1e\x3d\x05\x29\xa9\xcd\xd1\x70\x2e\x11\xb3\xd9\x54\x9d\xf0\x98\x51\x26\x3d\x14\x69\x15\x2b\x56\x6c\xaf\xfa\xa4\xab\x1c\x28\x09\xef\xf7\x6c\x73\xb9\xb6\xff\x2c\x26\xf8\x25\x93\x2a\x6f\xf7\x79\x5f\x4a\xf2\xa1\xf1\xd0\x4a\x49\xda\xc2\x8f\xcf\x0d\x20\xb0\xbb\x68\x83\x28\x36\x80\x0b\x76\xc1\x04\xe8\x0b\xdb\x80\x0b\x46\x81\x09\xfc\x2c\x6f\x7c\xc4\x9b\xc9\xf6\x21\xfd\x80\xf1\x8b\x08\xe9\x3f\xca\xe9\x49\x8d\xe2\x47\x8f\xdf\x2a\x2d\xe9\x34\xad\x50\x1d\x1a\x02\x2d\xb4\x5a\xf1\xf5\x88\xae\xd3\x2a\x6e\x78\x29\x9c\x30\x2d\xa9\x5c\xa6\x95\xc2\xee\xcd\x44\x99\xaf\x2a\xa1\xae\x1d\xcf\x6e\x92\x50\x94\xfb\x98\xab\x37\xf6\x31\xd7\x43\x88\xb9\xc6\xac\x8e\x88\x14\x03\x79\xbc\x79\x54\xbd\x0a\x6c\x7a\xa1\xcc\xab\xe5\x2d\x40\x55\xfa\x6f\x61\xef\x33\xad\xe6\x72\xf1\x92\x57\xa9\x6f\xb5\x51\x4e\x22\x00\xa8\x9d\x50\x7c\x9e\x05\x06\xa9\x4a\x57\x75\x41\x6d\x33\x2b\x6d\xd8\xdb\x4f\x1b\xe6\xa4\xa9\xd2\x10\xfd\x8f\x85\xfc\x6f\xed\x68\xa9\x73\xc1\x66\x92\x6c\x4a\xa3\xad\xb3\xc2\x21\x2f\x35\xf2\xc9\xfb\x60\x36\xc3\x56\xb9\x44\xc1\x10\xbf\xf8\xa8\x23\x7c\x7a\x27\xb6\xa1\xa6\x56\x75\xe6\x78\xe8\xf3\xde\x90\x5f\x3f\x7a\xf4\xe8\x11\x91\x47\xd2\x8f\x47\xff\xf9\x9f\xff\xc9\xb4\x61\x9c\xe5\x22\x93\xe5\xa6\x78\xaa\x54\xc8\x24\xfc\xc7\xe3\xc7\x53\xf6\xb7\xb3\x97\x2f\x80\x27\xa5\x72\x96\xcd\xb4\xa3\xc0\x1d\x58\xf3\xed\x5e\x6c\x6f\xa2\xf6\x84\xfd\x3f\xd7\xaf\x2e\x89\x42\x43\xe8\x6e\x37\x64\x26\x3c\x84\x34\xc7\x71\xda\xc3\x77\x3d\xfa\xfd\xef\x7e\x47\x55\xc0\xcf\xa4\x01\x86\x35\x29\x90\x80\x2d\x92\xc5\x70\xf2\x5a\x72\x23\x90\x30\x17\x5a\x7e\xc7\xd8\x18\x09\xcd\x1c\xa9\x05\x2f\x8e\x37\x5e\x46\x29\x17\x4b\x17\x38\x58\xbd\xf6\x2b\x64\xe6\x60\xde\xd4\x8d\x07\x37\x42\xc3\x85\x0f\x2c\x4a\x38\xef\x44\x4e\x08\xd8\xaa\x13\x56\xc8\x1b\xc1\xe6\xf6\x6b\xa3\xeb\x8a\x4a\xc8\xca\x62\xce\x53\xd8\xba\x88\x24\x4f\x61\xe2\xfe\x57\x88\x22\xfd\x31\xf2\x5b\xf2\xd9\xd6\x28\x27\xe0\x2e\x7a\xea\xfe\xa2\x97\xb8\x38\xa1\x32\xf1\x32\x6c\xeb\x36\x41\x0d\x57\x71\xd9\x10\x2f\x41\x69\x21\xb8\xa8\xd4\x43\x3a\x0f\x07\x20\xbc\xa8\xe5\xad\x07\x41\x94\x18\x3a\xbc\x7b\xb3\xfb\xdf\x78\x49\x81\xa1\xb7\xf5\xec\xa8\x77\xdf\x86\xdc\x5a\x68\x98\x02\xf8\xc5\xa4\xe6\x74\x91\xcb\xd9\x47\xa0\xa1\x6f\x63\xd3\xeb\x84\x5c\x28\x33\x67\x9d\xfd\xf6\xe2\x0a\x69\xfd\x22\xdc\x88\x35\xd5\xd2\xff\xc4\x8a\x36\xbf\x45\x8e\x9d\xdd\xd2\x22\x4f\x66\xad\x3a\x33\x85\xdf\xa4\x06\x9e\xda\xe1\x6c\xc1\xfb\x04\xf2\x0a\x1e\x3a\x09\x52\x53\x39\xf1\x2b\x43\x1b\x91\x40\x9b\x1e\x7e\x81\x9c\xcb\x81\x15\x6c\x8e\xfb\x49\xfa\x11\xb5\xc2\xd5\x15\x6e\x17\xb0\xb6\xf8\x35\x15\xd6\x22\xe3\x3d\xd5\x2e\x73\x73\x23\xf2\x60\x46\x78\x31\x65\x57\x7e\xcb\xa0\x45\x17\x55\x3b\x8b\xd0\x04\x70\x85\x00\xdb\x92\xaf\x61\x39\x43\x22\x26\xc1\x8c\x1c\x4e\xa7\x87\x08\xce\xd0\x86\x59\xc7\x4d\x92\xfd\xf4\xd2\x3e\xf7\xfe\xb2\x2f\x79\x65\xb1\x53\x99\x54\x8b\x84\x1e\x4f\x21\x73\x06\x6b\x1b\x5c\x29\x1e\xce\xea\xbf\x6d\xaf\xd5\x04\x3f\xf2\xa1\xf5\x59\x7d\x13\x3a\xe8\x26\xf6\xe3\x0c\x06\xe2\xde\xfb\x5a\xa6\x54\xb4\xb3\xf7\x87\xcc\x49\x6b\xd3\xc4\x37\xdd\xc0\x39\x6d\xb5\xfb\x41\x37\xc4\x21\xde\x3f\x49\xeb\x93\xd9\xc6\xda\xdd\xa8\x39\x49\xe4\x66\xc4\x0d\xb1\x73\x92\xc4\xd1\xe3\x6e\x1c\xef\x89\xbe\xd3\x3e\x5e\x7b\x73\xb4\x19\x83\x27\x89\xec\xc6\xef\x4d\x24\x9e\x24\x71\x3b\x8a\x4f\x09\xbf\x70\x60\x2c\x7f\x31\x07\xdb\xde\xfa\xa4\x49\x32\x3b\xe9\xd9\x4e\x5e\x2c\x49\x64\x74\x6e\xfd\xad\x9c\x76\x02\xf1\xc4\x13\xbf\x15\xc4\x63\x54\x9b\x76\xea\x47\x0d\xe5\x71\xbc\x2f\xa0\x4f\x12\x1a\x5b\xbe\xf5\xc2\xfa\xb4\x4f\x6f\x52\x02\xa9\xc1\x3d\x8e\xf4\x10\x1f\x47\x6a\xa0\x8f\x83\x5e\xea\x80\x63\xcb\x96\x47\xff\x3a\xcd\xbe\x80\x23\x3d\x6f\x08\x1c\x01\x6c\x42\x0e\xcb\x71\xb8\xc6\xd1\x98\xb2\x97\xc1\xef\x4f\x3c\x1a\x5c\x31\x3e\xb3\xba\xa8\x1d\xa6\xf6\x40\x70\x92\xc4\x4e\x30\xd2\xc2\xbd\xd3\x1a\xaf\xe2\x80\x88\xa2\xf9\xee\xe4\x00\x05\x07\x84\xe1\xe8\xdf\xd3\x23\x96\x20\x2a\xcd\xf9\xa2\xbf\xf8\xbe\xf7\xb5\xb7\x7d\xb3\x1d\xef\x11\xee\x5e\x5f\x7a\x3f\xca\x2b\xef\x98\x2f\xbc\x89\x67\x40\x27\x39\xcb\xfd\xaa\xd5\x40\xae\x78\xbb\x14\xa1\xce\x8a\xaa\x28\xda\x47\x49\x6d\x98\x37\x1f\x90\x62\x0a\x5d\xc6\xc9\x61\xf6\x5c\x2a\x62\xde\x2b\x05\x59\x93\x59\x99\xfa\x44\x7b\x7d\xc1\x8e\x9e\x36\x14\xfa\xf4\x72\xe9\x0b\xe5\x84\x99\xf3\x4c\x1c\x77\x51\xb5\xa2\x5a\x8a\x52\x18\x92\x8f\x1b\x89\x62\x22\xab\xfb\x92\xab\xbc\x08\x2d\x1c\x84\x21\x66\x87\xc4\x9d\x13\x46\xf1\x02\x3e\x3c\x37\x72\x25\x8c\x65\x47\x7f\x11\x8e\xb3\xb9\xe0\xae\x36\x82\xd0\x45\xf3\xfe\xa8\xeb\xe0\x03\x3e\xf5\x23\x34\xfc\xe8\x18\xd4\x0d\x20\x28\x66\xba\x07\x37\x45\x68\x47\x30\x0f\xed\x96\xc6\x3e\x8b\xfe\xc0\xd0\xe1\xf7\x0d\x44\x60\xea\x95\x06\x78\xaf\xe0\xbc\xaf\x75\x4d\x75\x13\x11\x7d\x8f\xdd\xb0\x04\xcb\xb4\x31\xde\x6f\x87\xd7\x03\x72\x2d\xaa\x11\x0b\x69\x1d\x74\x13\x0b\x3e\x4a\x68\xd5\x73\x2f\x14\x56\x0f\x96\x34\x6d\x7c\x1a\xb2\x79\x48\xfc\xeb\x95\xcc\xe3\x03\x0b\x54\x59\x25\xa5\x49\xa4\x65\x15\xb7\x21\x2d\x04\xf5\x64\xd6\xea\x4c\x26\x60\x28\x3a\xf7\x02\x9f\x2c\x20\xcc\xcd\x85\x13\xa6\x94\xa4\x8e\xd9\x2c\xb8\x9a\xb1\x28\xad\xdb\x1d\x40\x33\x5e\x55\xc5\xfa\x5e\x0e\x9f\xd2\xb9\xb8\xaa\x67\x85\xb4\xcb\xeb\x11\x01\xa7\x97\x3b\xc4\xd2\x77\x97\x6f\x97\x0c\x26\x15\x76\x6e\x41\x57\x99\x15\xca\xca\x84\x90\xcf\xbb\xc8\x3e\x94\x95\x5a\x41\x8b\x54\x6e\x6d\x9c\xe9\xd3\xeb\xe1\x6c\xa7\x38\xa2\x66\xd6\x40\xf8\x5f\x08\x27\x1a\xa5\xdd\x59\xdf\xb7\x49\xaf\xb2\x2a\x07\x59\xdf\xaa\xaa\x2b\x8d\x65\xbc\x28\xc8\xfe\xf4\x1b\x4c\xa5\x8a\x22\xf7\x9b\x17\x5d\x5a\x7c\xa6\x64\x25\x39\xba\x9c\x45\x5d\x21\xbd\x1a\x89\x30\x64\xa8\x27\x45\x7f\x20\x41\x2d\xb5\x47\x6a\xe3\x70\x90\xdf\xfd\x34\x76\x10\x51\x4c\xab\x28\xfa\x84\xf1\xa2\x48\x3b\xb9\xcd\x3d\xc0\xfe\xc3\xa8\xf6\x52\x14\xc7\x1e\xe3\xdc\x1b\x7b\x8c\xf3\x43\xc0\x38\x8f\x58\x39\x73\x1d\x32\xe7\x68\x44\x78\x3e\x21\x76\x78\x65\x0d\xc8\xb7\x36\xa8\xe6\xa3\x4b\x9a\xf6\x8c\xbb\x45\xc6\xd6\x2f\xcc\xf9\xe4\xf1\x31\x6b\x20\xe6\x67\xce\x19\x39\xab\x1d\xf5\x7a\xef\x68\x8a\xd7\x8a\xa4\x22\x34\x9c\x06\xd4\x24\x18\xc6\x49\x78\x15\xc9\x3a\x9a\x88\xec\x99\x71\xd7\x51\xa8\x1d\xd3\x1d\x7e\x8b\xba\xbd\x31\x0a\xf2\x01\x50\x10\x75\x68\x59\xae\xb3\xba\x14\xca\xa5\xd0\x1d\xf8\xe3\xd7\x16\x19\xe2\xcb\xd3\x3d\x19\x02\x9e\xe7\x12\x6d\xfc\x55\xb2\x49\x48\xd0\x1c\xb9\xbe\x55\xb7\xdc\xe4\x67\x57\x04\x76\xee\x7e\x98\xdd\x4a\x4a\xc3\xe1\xc7\x29\x31\x2f\x89\xcf\x74\xed\x9a\xc6\xde\xfe\xc8\x51\x52\x3c\x7d\x20\xff\x1e\x96\x3f\x32\x2c\xdf\x69\x6f\x55\x3b\x28\xfc\x6d\x3c\x3d\x35\x95\xde\x54\x18\xef\x8b\x08\xf6\x45\x04\xfb\x22\x82\x7d\x11\x41\xc2\xdd\xdc\x17\x11\x7c\x70\x3c\x98\x22\x02\x2f\x07\xb3\x58\x05\xb6\xe6\xa6\xa6\x83\xba\xce\x44\x80\xf1\xcc\xa9\x64\x6c\x0f\x07\x63\xdb\x71\xb6\x30\x4a\x48\x20\x98\xeb\xb5\x48\xee\xe7\xe4\xc8\x12\xd1\x90\xb6\x30\x8e\xe4\x82\xf7\xa6\x9f\x71\x52\xe5\xc7\x83\xc0\xff\xde\x33\x86\x17\xd6\x8f\x9c\xb0\xc6\xf1\x1e\x42\xdc\x24\x4c\xc9\xb5\x28\x44\xe6\xb0\xe0\x45\x14\x79\x7a\x5a\x0a\x5a\xe7\x3f\x61\xd0\x02\x83\x2b\xa5\x31\x72\xb4\x69\x30\xb3\x82\xcf\x44\x61\x4f\xc2\x5b\x9a\xca\xe1\x5f\x6c\xc5\x49\x8d\xc4\xdb\xe1\xed\x73\x13\x98\x8e\x80\x32\x4b\x3a\xe2\x6c\x84\x63\xce\xe0\xa8\xc3\x4e\x5e\xd1\xcf\x3b\x1b\xe9\xcc\xb3\x5e\xba\x2e\x4d\xce\x66\x92\x06\x65\x26\x8a\x6c\x1e\x97\x6d\xb6\x14\x25\x4f\x3e\xf9\x7e\x3c\x8f\x8b\xef\xed\xe8\xad\x91\xce\x25\x42\x95\x59\xa8\x20\x12\xa6\xb4\x4c\xcf\x1b\x96\xb8\x34\x1c\x30\xc3\x00\xf2\x60\xf5\x98\xfc\x44\xda\x88\x19\x03\xc8\xcf\xa2\x8e\xbc\x4a\x44\x48\xb2\xcd\xa3\x72\x85\xe0\xc6\xf4\xd5\x02\xab\xea\x75\x24\x44\xb1\x45\xda\x4d\xc7\x11\x42\x8c\xb6\xea\xec\xec\x8a\xfa\x02\xd7\x8e\x15\xde\x8d\x07\xb1\xad\xff\xde\xf5\x19\x69\x46\xaf\xdc\xd7\x67\xec\xeb\x33\xf6\xf5\x19\xfb\xfa\x8c\x84\xb1\xaf\xcf\x18\x36\x46\xad\xcf\x18\x29\x44\x8b\xce\x64\xd8\xc8\xb1\xea\x3d\x54\x07\x7b\x4f\xce\xcd\xc4\x81\x24\x9a\x21\x91\x1f\x32\xf0\x4a\x27\x5f\xdd\xa6\xdc\x43\x9b\xc4\xa2\xf1\x30\xcd\xa5\x60\x87\x87\xd3\xe9\xe1\x61\x2c\x20\xa1\x17\xb7\x37\x93\xac\xdd\x7c\xf2\x07\x26\x54\xa6\x73\x54\x5c\xa9\x7a\xc0\x58\x07\x49\xab\xb6\x32\x62\xac\x3d\x2f\xc3\xbe\x8c\x55\x91\x82\x6b\x99\x7e\xfd\x13\xbd\xcc\xd8\xe3\xfe\xf9\xe8\x49\x96\x26\x3d\x92\xb4\x4c\x4d\x0f\xfe\xb0\xa1\x59\x84\xe4\xa7\x29\x06\xc8\xb1\x44\xd9\x96\x15\xb2\xa4\x3f\xcf\xe1\xf0\xe6\xc2\xbb\x31\xc2\x3a\xcb\x8e\x50\xe0\x34\xab\xea\xc4\xec\x0d\xca\x29\x45\xa9\xcd\xfa\xa4\xf9\x01\x2f\x78\xb4\xd9\x06\xe9\xc7\x8c\x93\x29\x57\x71\x64\xb5\x31\x42\xb9\x62\xfd\x4b\xcc\x0c\xc5\xc3\xf2\x00\x12\x43\xcd\x1d\xa0\x77\xbe\x6b\xc7\x06\xff\x7b\x14\x9d\x1c\x4a\x03\xea\xaf\x59\xfb\x84\xe7\xca\x76\x04\xe6\xfd\x93\x06\x6c\x9a\x2c\xd1\xc7\x08\x42\xad\xd8\x8a\x1b\x9b\x72\x52\xd9\x98\xb9\x9c\x5c\xae\xa4\xd5\x89\x0a\xee\x7d\x00\xb9\x51\x72\x39\xba\x76\x55\xed\x82\xdf\x38\x56\x22\x51\xdc\x55\xda\x8a\xbc\xd5\xca\x69\x9a\x93\xb5\xf8\x13\x78\xde\x3e\x78\x4c\xed\x7f\x1e\x47\xc5\x9d\x13\x46\x3d\x61\xff\x75\xf4\xee\xb7\x3f\x4e\x8e\xbf\x3a\x3a\xfa\xfe\xd1\xe4\x8f\x3f\xfc\xf6\xe8\xdd\x14\xfe\xe5\x37\xc7\x5f\x1d\xff\x18\xff\xf0\xdb\xe3\xe3\xa3\xa3\xef\xbf\x79\xf9\xf5\x9b\xab\xf3\x1f\xe4\xf1\x8f\xdf\xab\xba\xbc\xc1\x3f\xfd\x78\xf4\xbd\x38\xff\xe1\x67\x0a\x39\x3e\xfe\xea\xd7\x89\x13\xe7\x6a\xfd\x2a\xc9\xb0\x33\xd0\x80\x63\x85\x1b\x5d\x69\x23\x5c\x17\xc6\xee\x26\x2d\x66\x77\x22\x95\x9b\x68\x33\x41\xc1\x4f\x98\x33\x89\x79\x9f\x78\x1c\xc7\xd5\xb3\xe3\x84\x37\xdd\xf9\xb5\xa9\xd5\x7b\x54\x64\x80\xdc\x7f\x26\x93\xdb\x90\x9c\x07\x39\xa9\xfc\xb8\x4e\x94\x95\x36\xdc\xac\x59\x1e\x10\x2a\xeb\x51\x1a\x99\x76\x3a\x99\x0e\xc6\x90\x87\xf2\xcd\xd8\x47\xe6\x57\xb0\x66\xb9\x34\x9f\xb8\xaf\x48\x62\x7b\x52\x91\xcb\xba\x1c\x03\xd4\xf7\x9d\xdf\x0e\x28\x64\xd3\xf3\x58\xda\x4a\x05\x36\xc1\xa4\x22\x78\x72\xc6\xb3\x1b\xcc\x27\x37\x7b\x4f\x07\x0d\x89\x6e\xf7\xb9\x83\x83\x50\x2f\x56\x0a\x4e\x2e\x1d\x09\x10\x44\xa8\xf0\xd4\xb9\xf0\x47\x2a\xfe\x04\x7e\x47\x32\x02\x51\x85\x42\x9a\xc0\x7b\x70\x14\xc4\x1f\x53\x41\x4e\x86\xbd\x84\x40\xe1\x1e\x4f\x3c\x1b\xa1\x61\x9e\xfc\x97\x78\xe1\xa3\xaa\x31\x0e\xef\x1b\x0d\x29\xf1\xd0\x2d\x99\xfa\x50\x56\xe8\x8c\x17\x4d\x59\x77\xd7\x65\x86\xf3\x4b\x94\xda\xe8\xd0\x58\xab\xeb\x4f\xb1\xff\x7a\x0c\x2a\x89\x52\xa5\x65\xbc\xb0\x58\xcb\x28\x33\x3e\x2b\x04\x26\xda\xe1\x64\x24\xdd\x5b\x9c\x60\xc9\xef\x64\x59\x97\xac\xb6\x7e\x2d\xc8\xcf\xd4\x38\x9f\xa8\x11\x9a\xa5\xb8\xf5\x9a\x81\x0a\x75\xc3\xcb\x5a\x4a\x05\x13\x1c\xe3\xc1\xc6\xcb\xbb\x8e\xe7\xb1\xf3\x94\x99\xd0\x5c\x3f\x66\xad\x6d\x0d\x39\xb0\xb0\x0e\x49\xf9\x0d\x3d\x87\x8a\xb6\x26\xea\xb4\x0c\x88\x0d\x2b\x4d\x2e\xc5\xdb\xd0\xa7\x4a\x16\x63\x28\x54\x30\x24\xcb\x70\xbc\xbd\xdc\x5a\x05\xfe\x89\x91\x78\x51\x76\xab\xb9\xda\x0a\x33\x59\xd4\x32\x1f\x4b\xc1\x7d\x66\x71\x46\x42\x74\x31\x46\x4c\x31\x42\x24\x31\x72\xfc\xd0\x70\x7b\x24\x7a\xc1\x07\xe7\x51\x50\xaa\x1b\x1c\x5e\x1b\x77\x10\x86\xf0\xc8\x89\x40\xb1\xa4\xc1\x60\x85\x02\xe6\xa3\xb3\xa2\x5a\xa6\xb0\x85\xa0\x5e\xc0\xb9\x06\x07\x3b\x5b\x67\x05\xf2\x47\x4b\x6a\xe7\x92\x6e\x25\x4e\xe0\xa3\x01\xae\xdf\x89\xff\xff\x88\x04\xca\xed\x7b\x0d\x9b\x89\x39\xd6\x00\xe3\xaf\xc0\xe3\x00\x29\x73\x81\xef\xea\x85\x70\x40\xa0\x2c\x54\x23\x12\x4a\x9f\x4b\xbd\xa2\xa9\xb1\x77\x8a\x7d\x6b\x43\x01\x91\x9c\x3f\x61\xfc\xb8\xd7\xbe\x85\x72\x9e\x20\x77\xae\x84\xc8\x91\xea\xb9\x68\xbf\xde\xd4\x34\xb4\xe2\xec\x38\x1e\x1b\xeb\xad\x8d\xd2\x06\xde\xf1\x51\x9b\xc2\x93\x2e\x41\xa8\x11\xfe\x80\x42\xe3\x69\xa3\x4b\x66\x15\xaf\xec\x52\x3b\x78\x0f\xe3\x15\xcf\xa4\xa3\xf8\x2b\xef\xfc\x91\x32\x3c\xbb\xf1\x82\xa1\x48\x01\x16\xe2\x84\x65\xc7\xc4\x67\xec\x8d\x6b\x24\x6d\xc7\x11\x70\x4b\xa3\xeb\x05\xe5\xa1\x89\x37\x72\xb3\x82\xdb\xc0\x1e\x9e\x1f\x07\x22\x34\x6a\x94\x15\xe6\x18\xd2\xfb\x96\xe5\x6b\xc5\x4b\x99\xc5\xe3\x04\x94\x1f\x56\x6a\x22\x6c\x3a\x7c\x2d\x4e\xff\x4a\x18\x2b\xad\x13\xca\x21\x5e\xfc\x69\xc1\x25\xa5\x57\xe3\x91\x15\x82\x35\x9a\x14\x65\x5d\x63\xc6\x04\x11\x22\x24\x57\xeb\xdd\x06\x1b\x84\x56\xf1\x75\x4a\x89\x8c\x58\xef\x19\x11\x46\x9d\x62\x3f\x0c\x8c\x51\x3b\x10\x24\xee\x5c\xc3\xe3\x69\x54\x0a\x63\x2d\xb1\x36\x40\x7f\x10\xf2\xb8\x2b\xa1\x72\xdd\x29\xdb\x3d\xbb\xba\xa0\x68\x19\xbf\x39\x51\x03\x80\xee\xae\x70\xb6\xf0\x3f\x14\x5a\xd1\xfc\x05\xe0\x6a\x40\x27\x31\x5a\x17\xef\xde\x2a\x26\x55\x2e\x57\x32\xaf\x49\x8f\x0a\xde\x15\x8e\x8b\xfa\xf4\xfa\x02\xa7\x28\x17\x4b\x37\xb9\x15\x44\x18\x0e\xc6\x84\x8d\x2b\xd1\x2c\x85\x9c\x27\xd0\x8d\xb4\x2a\xc6\x3b\xda\x2e\x40\x0f\x10\xca\x47\x2b\x54\xbd\xe5\x6b\x36\x61\xfe\x8a\x01\xed\x4d\xb7\xe2\x99\x8e\x87\x0f\xd3\x8c\xd7\xb3\x7b\xd1\xfc\x32\x13\x24\x9e\x81\x79\xca\xb8\x82\x9c\x0b\xa0\xd9\xfc\xcd\x02\x6b\x93\x42\xc5\x16\x77\xc5\x2b\xd7\xaa\xb9\x4d\xed\x5f\x53\x96\x14\x34\x34\xf7\x77\x5f\x96\x62\x3a\xfc\xd1\xe2\x1e\xb3\x82\x7b\x46\x87\x07\xc0\xe8\x00\x5a\xfc\x8d\x28\xab\x82\xbb\x31\xca\xae\x0f\xbe\xeb\x80\x0b\xe9\x25\x56\xa1\xc0\xca\xfb\x25\x5c\xe5\x13\x5e\x78\x93\x71\xf5\xf6\x29\x5d\x62\xe3\x6d\x74\xb7\x13\x62\x88\x4a\x53\x93\x3c\x52\x85\x4c\x04\x18\xe1\x9d\x6e\x03\x3d\x71\x26\xca\x99\xc8\xc1\x6b\x0e\x2b\x0a\x6f\xa9\xb7\xf4\xd7\xf6\x60\x71\xaf\xde\x3e\x3d\x61\x72\x2a\xa6\xf1\x4f\x29\x8d\x61\x66\xa2\x09\x43\x9c\x5e\x20\xa9\x28\x40\x3f\xe9\x20\x4d\x30\x8f\xb0\x31\x5d\xe0\x5c\xfa\x3c\xff\xf1\x27\xaf\xd5\xbd\xcc\x3f\x4f\xfe\x14\x1c\x26\xf8\xd3\x3f\x88\x32\x6f\xa1\xc3\xf1\x3f\xfa\xb2\xd2\xda\x17\xc1\x17\x43\x00\xe2\xbf\xf9\x1f\x57\x3a\xf7\x9a\x6d\x8a\x07\xca\x52\x27\x0a\x15\x9d\x4c\x28\x67\xd6\x53\x76\xa5\x81\x19\x44\xe6\x29\x44\x23\x70\x24\x8d\xf8\xef\x00\xc7\xc5\xc8\xb3\x81\x5c\x65\xdc\x09\x95\x40\x34\x10\xdb\x40\x29\xed\x70\xaa\xa0\x85\xb9\x3f\x03\x44\x89\x47\x00\xdd\xc0\x4e\xa1\x27\xcc\x69\x0d\x3e\xe1\x31\xd1\x3f\xf0\xe3\x4c\x31\x71\x27\x2d\xb4\xa3\xc6\xb3\x09\x87\x9e\xbb\x14\x06\xce\x98\x72\xf1\x1f\xee\x6f\x7a\xd3\x28\x9e\xae\xa2\x60\xa7\x7e\xa3\xb4\xfb\x4d\xa3\x94\xa3\x49\xa3\x0b\x75\x9a\xf1\x95\x86\x16\xb1\x10\xd8\x2a\x56\x2b\xc0\x4e\x92\xb7\x3c\xdc\xa1\xd9\x9a\x95\xd2\x3a\x7e\x23\xa6\xec\xda\x71\x93\xd0\x16\xbf\x93\x10\x71\x4b\xa1\xd8\xac\xd0\xd9\x8d\xc8\x59\xad\x9c\xa4\x6a\x11\x2f\xb3\xf9\x52\xd8\xf6\xb4\x74\x0b\x0b\xdd\xc5\xea\x6c\xc9\x38\xab\x8c\x98\xc4\x44\x11\xca\x26\x3f\x67\x6c\xb8\xeb\xed\x29\xa2\xa2\x64\xa2\x0a\x5e\x72\xf0\x61\xea\x2a\x87\x69\x26\xe0\x5a\xb9\x42\x63\xb6\x4d\xe3\x48\x3f\x97\x5a\x65\x6d\x7a\x09\xae\xa7\x9d\xb2\x4b\xc8\x0f\x91\xdd\x41\xa4\x91\xc0\x47\xe2\xd0\x06\x4d\x89\x4c\x58\xcb\xcd\x9a\xba\x9a\xb3\xda\x31\xe9\xa0\x4b\x17\x6e\xd1\xbc\x2e\x30\x8d\x57\x72\x55\x27\x4c\xd6\x88\x4c\x2b\xeb\x4c\x9d\x81\x62\xe2\x6c\x66\xf4\x8d\x50\x69\x54\xb6\x90\x16\xec\xf3\x37\x36\x3e\x76\x02\xbf\x84\xd2\x2c\x5b\x72\xb5\x10\xb6\xf1\x70\x4a\x9e\x83\x0e\xf8\xa6\x49\xb0\xd3\x15\x54\x3c\xb1\x7c\xee\x7c\x10\xeb\xe0\xe8\xce\xe8\xaf\x6f\x0d\xe4\xfe\x9d\x62\x11\x8f\x73\xd2\xe0\xbc\xe9\x6e\x89\x92\x05\x21\x6c\x63\x63\x00\x5e\xd3\xa0\xae\x13\xc8\x3c\xd2\xde\xac\x92\xa1\xad\xa5\x70\x3c\xe7\x8e\x8f\xc4\x14\xf9\x92\xaf\x9b\xf6\x14\x58\x02\x9f\x80\x8a\xf2\xe1\x7d\xa7\x20\x1f\xad\x7a\x82\xef\xca\xc2\x1b\x82\xae\x64\xb7\x4f\x24\x78\x1d\xcb\xa4\xf2\x3f\x38\xd3\x5e\x51\x48\xe7\xf5\x64\x28\x39\x42\xea\xc8\x94\x05\x30\x82\xf1\xa2\xd0\xb7\x22\x87\xc5\x08\xd7\x3b\x41\x22\xba\x9a\x22\x67\x79\x0d\x39\xfa\xd6\x81\xa5\x17\xdf\x8e\x80\x17\xf7\x17\x60\xa4\x13\xf8\xa6\xad\x4e\xce\x52\x3c\x73\x16\x92\xa1\x70\x42\x76\x65\x6c\x53\xaa\x95\xfd\x24\x85\x72\xd2\x88\x6e\x83\x55\x3c\x98\x09\x62\x6b\x85\x86\x60\xe3\x70\x13\x93\x8c\x71\x2c\x84\xb3\x2d\x61\x1b\xc6\x54\xde\x19\x0c\xb9\x8e\xd4\x75\x80\xa4\x1b\x5e\x15\xc6\x11\xe4\x90\x20\x71\xe7\x56\x25\x96\x58\x00\xf2\x06\xe3\x27\x1f\xa9\xde\xeb\x4d\x19\xab\x9c\x81\x67\xde\xf5\x7a\xa9\xf3\xd4\xaa\x88\x3e\x32\xeb\xac\x15\x9b\x24\xb5\xa9\xb6\xb0\x81\xd8\xdd\x7a\xfb\x9a\x28\x12\xbf\x19\x2a\x41\x6d\x7a\x43\xdb\x38\x82\x4b\xbb\xe4\xab\x1e\x28\x35\x51\xea\x10\x80\x5f\x9b\x02\x9f\x44\x28\x0c\x7e\xea\x04\x3e\x75\xf2\x38\x0d\x9a\x9c\xca\x66\x15\x47\x12\xab\x55\x7f\x32\xc9\xf8\x75\xef\xf2\x5c\x8f\x00\x30\xdf\xc0\x25\x36\xbe\x7d\xea\xe1\x47\x9e\xb8\x86\xed\x01\xbb\x0d\x25\x0a\x15\xd2\x7b\x25\x4f\xd8\x6f\xba\x39\x97\x44\x99\x21\x43\xdb\x3c\xf2\xa7\x16\x8d\x31\x78\x3a\x0e\xe2\xa6\xe1\x80\x4f\x6f\xfe\x00\xa7\xbf\xff\x63\x89\xbf\x32\x61\x7f\x11\x8e\x1f\x8f\xba\x1a\xde\xd8\x1e\xed\x7e\xfd\x4d\x94\xdc\x9b\x25\xcb\x6a\xeb\x34\xe5\xc9\xb8\x3b\x62\x05\xc3\x69\xe0\xe4\x4f\xf4\x12\xfc\x90\x65\x85\x9d\xe8\x2c\x5c\xb0\x48\xa4\x9b\x4e\x7b\x84\x20\xa7\x63\x76\xa1\x98\x36\x39\xb4\x6d\x48\x94\x58\x5b\xf1\x51\x0e\x2f\xbc\x6f\x62\xef\x15\x5e\x79\x53\x6d\x24\x77\xa9\x26\x26\xa0\x74\xd8\x82\x3b\x91\xd8\x1a\x2c\x0e\xa1\xf8\xac\x10\x39\x3b\xea\x2f\xc2\xb3\x46\x2f\x26\xca\xd7\x86\x9d\xa9\x35\x0a\x6f\x85\xa6\x5e\x83\xd0\x4c\xa2\x79\x82\x12\x86\x25\x17\x38\x72\xd5\x76\xe1\xf2\x4e\x87\xd1\x45\x91\x5c\x68\xe5\x15\x78\x80\xeb\xf4\xf9\x92\x12\xe5\xc2\xb5\xc2\x7b\x7b\x92\x80\xa4\xeb\x4d\x35\xbe\x10\x2a\x71\x3b\x8e\x47\x34\xe3\xde\x6e\xb5\xd8\x1c\x47\x44\x50\x76\x47\xa4\x3d\x6b\x30\x5a\x7e\x25\x52\x3d\x37\x58\xc7\x69\xd3\xa2\x64\xfc\x3d\x8a\x6f\x10\x4d\x61\x76\x6a\x71\x65\x07\x44\x08\xc9\x80\x54\xc6\x8a\x1e\xa8\x32\x82\xd8\xe7\x5c\x16\x75\x62\x51\x7a\x4b\x8e\x63\x44\xa0\xd1\x27\x77\x14\x8b\xc3\xdf\xd4\x15\xf4\x0f\xb9\xc0\xb3\x35\xaf\xbd\x5a\x4c\x5d\xd3\x5b\xc1\xaa\x82\x43\x6b\xa1\x78\x65\x89\xf0\xb4\xee\xe8\x9e\x02\x04\xbd\xd0\x33\xbc\x71\xf8\x6f\x9e\x89\x25\x5f\x49\x6d\xc6\xe0\xbd\x64\x3d\x4d\x5a\xf2\x75\x48\x24\x27\xd1\x07\x8c\x46\x20\x30\x0e\x85\x80\xf7\xf4\x6e\x64\xe2\xd2\x4f\x52\x1e\x23\x71\x8c\xc5\x42\x00\x04\x95\xc0\xb3\x94\x5e\xc4\xda\x8b\x5e\xce\xae\x2e\x40\x6c\xb2\x54\x16\x5b\x28\x2e\xbc\xb8\x51\x28\x08\x1a\x12\x6d\xbc\x4f\x33\x91\xee\xab\xb3\x6e\xc3\xa7\x1c\x8c\xc0\xb8\x2b\x30\x22\x75\x19\x8e\xbe\xfd\xfb\x26\xf5\x4c\xe3\x88\x94\x7d\xb1\x55\x63\xba\xe2\xf3\xe3\xec\xea\x02\x77\x7f\xca\x9e\x6b\xc3\xb8\x4a\x8d\x5d\x59\xc3\xe3\xe5\x96\xd2\xe4\x93\x8a\x1b\x12\x8e\x7c\x73\x04\x77\x7d\xdc\x9d\x4f\x6d\x99\xd6\x9f\xde\x48\xd5\xfa\x5e\x07\x8e\xac\x31\x46\x3a\x82\x41\x5b\xc4\x62\xe4\x11\x18\x5f\xe2\x00\x3d\xd1\xb9\xe5\x0f\x69\x3f\xd2\xda\xb3\xc5\xd1\xef\x0b\x99\x6a\xa3\x70\x74\x1a\xe0\xfe\x9b\xec\x47\xc3\x7d\x32\x66\x32\xf0\x75\x14\x9a\x9c\xa7\x69\x48\xf7\x3b\x85\xb0\x23\x25\x7f\x7e\xe9\x79\xf0\xe6\x3b\x1f\x88\x47\x3b\x9e\x17\x88\xb5\xc5\x23\x6b\x90\xc3\x17\xe9\x8c\x6c\x5d\xb1\xb3\x70\xc0\x42\x79\xf9\x08\x72\x9b\xa2\x7f\x68\xdb\x5a\x27\xa7\xd6\x58\xef\x32\x84\xc7\xf6\x74\xc3\xbd\x55\xc4\xfc\xa1\x33\xdc\x03\xcb\x9f\x96\x5c\xf1\x85\x98\x84\x4f\x9c\x34\x13\x9c\x34\xd5\xe0\xa7\xa9\x74\x33\x23\x1e\x6a\x36\x72\x9b\xba\xee\xf8\xcc\xaa\xb2\x37\x16\x65\x0c\x06\x28\x36\x3a\x0b\x14\x1b\x9b\x09\x8a\x7d\x6c\x36\x28\xd6\xb0\x26\x8e\xad\xf0\x5e\x07\xb9\xe3\xab\xbc\x51\xec\x34\xfb\xe8\x2a\x6f\xbc\x60\x05\xd2\xf3\x71\x3d\xa1\x39\x75\x29\x1d\x1d\xc9\xdc\x1d\x08\x5b\x6f\x94\xdf\x18\xd1\xb4\x74\x3d\x9e\xba\xd1\x0c\x1f\xa0\xf7\x11\x7d\x2e\xee\xaa\x42\x66\xd2\x91\x51\xa8\xdd\xd1\xa6\x12\x30\x10\xbe\x95\x76\x8c\x83\xe0\x34\x94\x61\xc6\x87\x3b\x30\x3f\x93\xc0\xdf\x31\x82\x78\xa0\x6b\x19\xd1\x1d\x64\x3f\xd3\x25\xdc\x9b\xd3\xdd\x63\x6f\x4e\xd9\xbf\xbd\x39\x45\xba\xc2\x54\xa6\xd3\x7e\xee\x18\xc1\xbe\xec\x9f\xb5\x20\xd3\x51\xc5\xa1\x57\xa2\x53\x82\xae\xbd\xd6\xb7\x32\x4f\xde\x25\x6f\x42\x66\x52\xe5\x09\x4d\x2c\x71\x3c\xc0\x58\xb0\xe4\x2e\x5b\x9e\xdf\x55\x46\x60\x4b\x97\x91\x9d\xa4\x4d\xf1\xe3\xe4\x98\x9a\x8e\x8d\x78\x76\xc6\x30\x91\xe1\x60\x47\x9f\x06\x90\x28\x63\xf8\x35\x6f\x96\xa2\x27\x73\x0c\x5d\x66\x04\x3b\xbb\x7c\x36\x5e\x92\x38\x1d\x9f\xc7\xc6\xc2\xe8\xb1\xf7\xa8\x87\x11\xc4\xee\xde\xe4\x51\x04\xc3\x91\x8c\xd2\x47\x91\x08\x7e\x60\xc4\xb1\x8e\x22\x31\x76\xef\xe1\xec\x46\x90\x8b\xa6\xfa\x03\x8b\x2c\x98\x57\x45\x7c\xd4\x0f\xc7\xea\xbe\x94\x22\xde\xfe\xb8\x11\x50\x24\x95\xd4\x8d\x7f\x63\x9a\x63\x7a\x6c\x63\xbd\x56\xe3\x98\xf8\xcf\x1d\x45\xce\x88\x1b\x3b\x9e\xc1\xc2\x71\x23\x88\x94\x15\xdb\xa3\xa7\x6e\xc6\x59\x3a\x1c\xe1\x31\x64\x3c\xfd\xc5\xc2\x51\x8e\xbc\x89\xa3\x09\x6d\x14\x23\x70\x84\x8e\x40\x39\x1f\x87\xd3\x63\x5c\x36\x36\xee\xf3\x19\x8e\x78\xb8\x3f\xca\x31\x1a\x55\x25\xb2\xde\x4b\xce\x68\x22\xc1\x10\x1c\xda\xd0\x70\x47\x2b\xbb\x94\x63\x3c\x62\xe3\x70\x1a\x2c\x62\x02\xc5\xee\xf6\x08\xda\x9b\xbd\xe5\x85\x1c\x23\xc1\x80\x23\x6e\xd5\x88\x0b\x6b\x04\xbb\x50\x27\xec\x52\xbb\x0b\x35\x8e\xa5\xf5\xe3\x1c\x6a\xa9\x47\x80\x82\xb5\xe3\x99\x16\xf6\x52\x3b\x90\xfc\x60\x2f\x2a\x6e\xfb\x47\xb9\xa6\x28\x7a\x4c\x85\xcf\xd5\x48\xde\x74\x1c\x40\xb1\x3e\xda\x5a\xb2\xce\x35\xba\x18\xef\x66\x02\x2b\xce\xd8\x2a\x4f\x5a\xc4\xec\x8f\x7d\x8f\xe0\xd5\x7a\xdc\x8d\x47\x72\x97\x32\xb5\xbd\x5a\x77\xcc\x04\x53\x5a\x4d\x80\x97\x78\xac\xab\xd9\x80\xe0\x3f\xc6\x5e\xa1\x7a\x1a\xef\xdc\x9b\x9e\x76\xfa\x37\xdc\xfe\x91\xb7\x1e\x0a\xcc\xc6\xd5\x4d\x80\x57\xab\x0a\x3e\x06\x1c\x27\x8e\x50\x5c\xce\xbd\xd6\xe3\x4e\x2c\x24\x8d\xdd\x60\xd7\x28\x85\x59\x08\x56\x71\x97\x2d\xc7\x35\x76\x63\xae\xea\x68\x59\x14\x1c\x23\x5a\x63\x48\xe5\xbd\x00\x62\x86\x8f\x91\x24\x7c\x91\x4a\xf9\x10\x07\x24\x63\x4a\x5e\x79\xd3\xf9\xbf\x6e\xc4\xfa\x04\x6e\xfb\xff\x1e\xe5\x05\x44\x1a\x3b\x65\x67\xcc\x4a\xb5\x48\xec\x21\x8a\xa3\x33\xbf\x00\xa3\x1d\x41\x68\x67\x39\xfd\x3a\x8c\xb3\xa4\xe2\x9f\xb5\x5c\xf1\x42\x00\xa9\xd1\x28\x0f\x32\x4c\xe0\xbb\x21\x34\x3d\xd8\x48\x13\x8f\xa1\xee\x6f\x97\xda\x0a\x88\x97\xc7\x28\xab\x65\xb8\x0c\x07\x37\x62\x7d\x70\x32\xb6\x11\xf5\x82\x2f\xd4\xc1\x49\x2c\xa3\x19\xeb\xf5\x34\x28\xfc\x31\x13\x89\x40\x38\x74\x00\xd2\x0f\xd2\xdb\xbf\xe2\xe8\xe6\xc7\x93\x5b\x5a\xe2\x18\x35\x3f\xfe\xc0\x1f\x66\x47\xd2\xf1\x01\x0a\xf9\xb4\xe0\xd6\xa6\xb7\xa9\xec\x43\x65\x2e\x11\x10\x9c\xf8\xb1\xd0\x7c\xa5\x33\xcb\x26\x6d\x9a\x28\x37\x50\xb3\x65\x40\xcd\xf2\x60\xf0\xa7\xc0\x02\x3f\x0e\x01\x43\xf2\xd9\xc0\x39\xbd\xd4\xf9\x98\xa7\xa2\x15\x9a\xb8\xd0\xb1\x47\xc4\x6d\xa7\x31\x59\xa2\xc8\xa6\xdb\x42\xdb\xdc\x69\x96\xea\xe2\x75\xce\xd8\x5b\x68\x45\x94\x3c\xcb\xe7\xb2\x10\x76\x6d\x9d\x28\xfd\x4c\x65\x59\x15\xe9\x25\xa8\x40\x81\xa7\xb4\x63\x52\x65\x45\x9d\x03\x21\x50\xa2\x48\xf8\x68\x40\x21\x8d\xf1\x7c\x3e\xd2\x61\x1e\x59\xc5\xbd\x6d\x84\x26\x2e\x56\x78\x35\x08\x78\x83\xb6\xe2\x21\xf5\xf0\xe9\x9d\x74\x54\xa9\x9a\x33\xb4\xd5\x00\x56\xa7\x2c\x95\xda\x2a\x69\x87\xe7\x04\x16\xb0\xde\x0e\x3e\x7f\xda\xad\x97\xe0\xec\xb9\x9c\x91\x5c\x91\xa7\x4b\xae\x94\x28\x3a\x6d\x3e\x03\xa6\x8f\x3b\xc7\xb3\x25\xe9\x82\x42\x3a\xdd\xdb\x91\x42\xb8\x43\xcb\x96\xda\x3a\x56\xf2\x6c\x29\x95\x20\x26\x84\x81\x8f\x35\x36\xf0\x6d\x49\x3f\x87\x6f\xdf\x3d\x92\xd7\xcf\xed\x1b\xff\xe3\xa4\x13\xd7\xf7\x4f\x3a\x8a\xd4\x7f\x0f\xf1\x0c\x3b\xcd\x00\x6f\x3b\x6d\x3b\x3a\xb2\x79\x23\x99\x2a\xd4\xdb\xb3\x86\x04\x20\xfa\x2a\x70\x02\x30\x02\xa1\x2b\x43\x9c\xd7\x94\x9d\xdf\x4d\xd9\x81\xb8\x73\xbf\x3b\x38\x61\x07\x77\x73\xeb\xff\xa1\xdc\xdc\x1e\x90\xf9\x74\xcb\x88\x5e\xf5\x8e\x94\x30\x06\xcf\xd8\x4c\x84\x9f\x21\x8a\x95\x73\x56\xab\x06\xcc\x3a\x65\x6f\x5e\x3d\x7b\xf5\x84\x2d\xf5\x2d\xcb\xa9\x21\xe9\xad\x60\x95\x01\x66\x00\x26\x8c\xd1\xd8\x29\x0f\xf8\x01\x52\xf7\x0d\xd8\xee\x32\x5d\x56\x46\x97\xd2\xa2\x92\x14\xf1\xd2\xde\x4b\x1f\xcd\xa2\x56\x63\xdc\x95\x57\xa1\x95\x3b\x68\x4c\xc7\xcd\x42\x50\x43\xa3\xa2\x56\x4c\xd5\xe5\x4c\x24\xf5\x15\x4d\x41\x62\x62\x97\x12\x90\xf1\xe5\x17\x04\x09\x23\xb6\xcf\xe8\xac\x6b\xec\x54\x41\x57\x43\x3b\xfa\x5b\xb0\xd7\x61\xae\x44\xa9\x40\xb4\x0f\xc4\x1c\x73\x6d\x02\xc5\x73\xa2\x48\x2b\x1c\x32\x9f\xaa\xe0\x3e\xbd\xf4\xda\xd3\x12\x29\x24\x52\x7b\x71\xe0\x51\xfe\xee\xbb\x4b\x62\x50\xfe\xb1\x6e\xc9\xad\x36\x45\x7e\x2b\x73\x2c\xab\xb5\xec\xc8\x4f\xf1\x38\x65\x8d\xe8\xf9\xea\xa4\xec\x74\xa2\xfa\xba\xbd\x95\xf9\xf8\x5b\x93\x54\xbf\x0a\x5b\xc3\x60\x6f\x64\x2e\x94\xf3\x76\xc9\x58\x76\x04\x53\xa5\x12\x56\x9d\x4b\xec\xe0\xe1\x65\x40\xeb\x3b\x5d\xce\xa4\x4a\xa1\x42\xd3\xf3\xce\xe1\x86\x1c\xa3\xd7\xbc\x69\x64\x60\x56\xb8\x13\xe0\x50\x07\x3e\x76\xed\x96\xcc\xca\xb2\x2e\x1c\x57\x42\xd7\xb6\x58\x27\x5d\xe2\xcf\xef\x80\xce\x0b\x71\x87\x3a\x2c\x35\x0a\x69\x04\xa5\xb6\x10\x5d\x08\x25\x4c\xdb\xe9\x6f\x33\x1c\x21\xc8\x6c\x19\x7f\xf2\xd3\x18\xcc\xb4\xed\x27\xc4\x1d\x89\x89\x1c\x19\xbf\xaa\xa2\x5e\x48\x02\x91\x74\x52\xf4\x41\x47\x5d\x4e\x42\xc7\xb3\x4f\x1c\xf0\xe0\x8f\x8e\xa0\x03\x9f\x35\x6d\xe5\x22\x5d\x43\x82\x6a\x59\x36\x9d\x30\x43\x87\xfc\xc4\x36\xe8\x29\x6d\xbe\x12\x6d\xcc\x68\x11\xe5\x46\x40\x49\x7f\x33\xdb\x07\x94\x6c\xa3\xfd\x78\xbb\x00\x2c\x17\x95\x50\x64\x9a\x7c\xad\xba\xda\x16\x37\xef\x5e\x4e\x9d\x86\x43\x33\xb2\x6f\x73\x7e\xe7\x0c\x95\xe5\x30\xd3\x65\xe9\xdd\x84\x30\x31\x1f\x78\x73\x95\x66\xd2\x13\xde\xd0\xc6\x7c\x37\x4b\xdc\xa9\x7d\xbc\xf7\xcb\x89\xf7\xac\xc8\x8c\x70\xaf\x05\xb1\x2c\xf4\x7d\x9b\x79\x1d\xc5\x52\x93\x5c\x76\xbb\x1b\x13\x4e\x35\xed\x1d\x3a\x60\x00\xfc\xfa\x5b\xa1\xac\x74\x72\xd5\xeb\xd3\x4a\x3f\x7c\x15\xb7\xb6\x49\x21\x83\x1f\x17\x94\x29\xb9\xd2\x06\xb0\x6a\xa1\x33\x13\xc0\xe0\xbc\x06\x52\x3a\xac\x03\x55\xdd\x23\x57\x75\xb7\x5b\x77\xe4\x6f\x25\x9f\xe7\xce\xb6\xb4\x5d\x07\x12\x18\x40\xa1\xd9\xb1\x56\x71\xc7\x4f\x18\x2f\x8a\xf0\xef\x54\xed\xc0\x8d\x80\x1d\xea\xa4\xf9\xfb\x7b\x74\x4f\x5a\x3d\xbd\x22\x28\x8d\x06\x6d\x27\x40\x21\x11\x7c\x13\x2e\xae\x9b\x0e\xa5\xf0\xd1\x2b\x61\x56\x52\xdc\x9e\xde\x6a\x73\x23\xd5\x62\x72\x2b\xdd\x72\x82\xab\x6b\x4f\x21\xef\x73\xfa\x2b\xf8\x47\xc2\xec\x30\x5d\x7e\x96\xe7\x81\x0e\x31\xf4\x3c\xc3\xfe\x29\x29\xef\x76\xbc\x92\x6f\x85\xf1\x81\xe1\x09\x70\x05\x9e\xb0\x5a\xe6\x5f\xd1\x81\x0b\x49\x71\xb8\xce\x6e\x28\x21\xd2\x46\x10\x0e\x52\x7a\xef\x81\x84\xaf\x89\x62\x42\x04\xde\x84\xcc\xfd\xd7\x3c\x82\xe0\xee\xfb\xdf\x14\xb5\x65\x70\x85\x03\x75\x76\xc2\x64\x03\x8f\x39\xb3\xfe\x44\x46\xc2\x54\x66\x6a\xa5\x28\x2e\xd3\x3d\xbe\x0e\xe6\xdc\x71\x2b\x1c\xfd\x9d\x7f\x8b\x20\xb1\x89\x76\x51\x32\xd5\x6a\x38\x6d\x80\xd2\xba\x69\xa0\xc6\x26\x7f\x0e\x94\x89\x64\x2b\xdc\xce\x0a\xa2\xef\xb8\x99\x48\xac\x47\x14\x0a\xfd\xce\x90\x40\x01\xe7\x9b\xfb\xeb\x90\x91\x3b\x8c\x26\xfa\xde\xe1\xfb\xbe\xfd\xf6\xe2\xd9\x08\xfb\xf9\x7f\xd8\x7b\xd7\xe6\x46\x72\x23\x5d\xf8\xfb\xfe\x0a\x84\xfc\x46\xa8\x7b\x2c\xb2\x7b\xd6\x63\x8f\xdf\x8e\x8d\x75\x68\x24\x8d\x57\x67\x5a\xdd\x5a\x49\xd3\x8e\x13\xb6\xcf\x2e\x54\x05\x92\x38\xaa\x02\x6a\x00\x14\xd5\xdc\xf5\xfe\xf7\x13\x48\x00\x75\x63\xb1\x58\x04\x20\x51\xb2\x89\x2f\x3d\x23\x89\x49\x5c\xf3\xfa\x64\xa6\x26\xd3\x39\xcf\x20\x6d\x85\x4a\x54\x32\xfa\x4b\xd9\xf4\x04\xfb\x03\x7c\x70\x75\x82\x21\x77\x2d\x60\xc3\xe7\x09\xa9\xa1\x22\xe7\x54\x3e\x04\x72\xd4\xe3\x3f\x9e\x5d\xb4\x09\x86\xba\x37\xff\x78\x76\x81\x2c\x9d\x27\xc2\x59\x3c\x2d\xd0\x22\x0c\x67\xb8\x0b\xb6\xd0\x01\x0a\xe7\x09\xa9\x61\x86\x29\x95\x0f\xbb\x4b\xe8\xbd\xb9\x5b\x8b\xd4\x0b\x5a\xf5\xf7\x85\x2f\xb1\xec\xca\xaa\x13\x70\xdd\x57\xbc\x44\x8f\xd8\xbb\x8c\x45\x8d\x58\xb9\xa3\xc5\x07\x74\xc1\x64\x29\x48\x68\x7e\xf9\xac\xe3\xfb\xd4\x16\x97\x73\x37\xfa\x8a\xa2\x3e\x27\xa5\x73\x37\xfa\xc6\xd9\x4c\x2b\x72\xf9\xe1\x55\x62\x5f\x76\x34\x30\xb6\xf2\x02\x5f\xd9\xd7\x80\xe0\xac\x83\x69\x7c\xd7\xda\x85\xe0\xac\x83\x69\x02\xf4\xa4\x7d\x42\x70\x0a\x2c\x14\xf8\x32\x63\x30\x95\x3b\x2d\x49\x1c\x41\x7f\x94\xee\x26\x96\x12\x1c\xb3\xb8\x9c\xb9\x32\x8e\x27\xb6\x13\x23\xb8\x39\xfd\xfd\x62\x8e\x5b\x69\x76\x60\x67\xac\xd5\xe6\x70\x06\xf0\x23\xaf\x8c\xb4\x77\x29\x59\xbe\x93\x29\xfe\xd6\x37\x05\x49\x6f\x9f\x6d\xba\x67\x64\x7d\x75\x42\xde\x4d\x6c\x8e\xbe\x3d\x9a\xa2\x5b\x9a\xd3\x0c\x8b\x6c\x75\xd2\x3c\xb1\x8a\xba\x2f\xaf\xe6\xa2\x5a\x32\xa4\x21\xbd\x3f\x42\x6f\xb8\xd0\xab\xf0\xf5\x33\x62\x86\x32\x82\x97\xc4\xb5\xdb\xd2\x02\x78\x65\xdc\x78\x6f\x7d\x8f\x2a\x36\xb7\x7b\xad\x78\x33\xa3\x06\xc5\x60\x1e\x3f\x1b\x63\x85\x05\xfb\xbd\xae\xcf\x6b\x0d\x9c\x32\xad\x96\x4f\xd1\xcf\x46\xd7\xf5\x7d\xe9\xc6\x80\x32\xcf\x47\x9f\x56\x45\xf7\xca\xdf\xb3\xfa\x42\x2e\xcf\x8b\x88\x3c\xb9\x30\x4e\x1d\xe3\xf1\xe7\x1e\x9d\xc8\x50\x23\xc6\xe3\x49\xb3\x15\x19\xaa\x42\x63\x55\x90\xeb\xef\x81\x83\xf8\xc5\xac\xe6\x54\xdd\x90\xc2\xc3\x5a\xec\x18\xe2\x86\x4c\xa8\x6f\x73\x4e\x15\xb4\x67\x93\x54\x71\xb1\x42\x58\x21\x6c\x84\x51\x52\x66\x58\x20\x41\x0c\x52\xc8\xe7\xb8\xce\x2f\xae\x6f\x2e\xce\x4e\xef\x2e\xce\x3f\x20\x37\x5b\xda\xf4\x3e\xf9\x10\xbd\xe3\x35\x7c\xa9\x59\x0f\x1a\x3d\x52\xb5\x08\xda\x81\x13\xab\x94\x60\x86\x2e\xb4\x90\x3b\xa7\x02\x7a\xa8\xfb\x78\x35\x18\xba\x64\x54\x9d\x55\x93\x33\x65\x00\x33\xce\xbc\x8b\xe1\xe9\x19\x5a\x8c\xd6\x9c\xaa\x13\xe3\x8e\x30\x13\xd6\xef\xd6\xcd\xd8\x83\x72\xdd\x27\x9e\xa7\xc7\xc7\xb2\xde\x52\x8f\x88\xd2\xde\xfc\x0a\xf5\x15\x7e\x6e\xef\x34\x15\x50\x72\x2d\x06\x43\xbf\x03\x70\x67\x4d\x32\x20\x9e\x66\x91\x46\x8c\x57\xf1\x4c\xc4\x05\x92\x0a\x0b\x6f\xf8\xb2\x7e\x5f\xc7\xd3\xe9\xf1\x14\xca\xcf\x1c\x4f\x8f\x9d\x43\x20\x0b\x68\x6e\xd6\x50\x81\xab\x65\xbb\xb6\x91\x01\x24\xdb\x5c\x6d\x8a\xd0\x67\x57\x2f\xdd\x77\xa2\x74\xd6\x2c\xbf\xde\xe9\xc1\x19\x16\xca\xef\x99\x71\x98\x15\x28\xcb\xfb\xe6\x66\xaa\x85\xfd\x86\x25\xf1\xa5\xea\x6f\x9e\x05\xab\x4b\x6e\x4b\x22\xbc\xaf\x9b\x7a\x7f\x7f\xbe\xf9\xb8\x9f\xe5\x18\xc9\x15\x61\x31\x67\x3c\xcf\xa9\x42\x0b\x2c\x17\x16\xa8\xe9\x0d\x7f\xa8\x1a\x0a\x86\x48\xfb\xb0\x30\x45\x56\x4a\x45\xc4\xcc\x83\x05\x77\xb4\x22\x47\x28\x38\x2c\x51\x11\xb2\xad\x37\x58\xed\xb9\xf4\x6c\x93\x2e\x17\x58\x10\xa9\xf5\x2b\x23\x68\x33\x3a\x23\x8a\xe6\xa1\xbd\x11\x9c\x1a\x4c\xac\x1b\xc4\xb5\xca\xb7\x2a\xef\xbb\x6a\x6f\xdf\xdd\x5c\x9c\x9e\x5f\x5d\x4c\xf3\xf4\x15\x09\x76\xc2\xd2\x82\x53\x9f\x53\x9c\xa0\x02\xab\xc5\x33\xab\x03\xd5\x74\x63\xd8\x77\x17\x8e\x18\x04\xad\xbd\x71\xd8\xfa\xde\xba\x79\x19\x47\x01\xa8\xa3\x29\x51\x98\x7a\x57\x6a\xaa\xdf\x87\xe2\x05\xcf\xf8\x7c\x15\xa1\xe2\x86\xc7\x55\xfe\x95\xe9\x5c\x3d\xc1\x13\xfd\xaa\xf6\xe3\x0b\x56\x8b\x18\xa7\x7d\x8d\xd5\xc2\x21\xf9\xab\xdd\xf5\xdc\xc8\xca\xab\xa8\x16\xbd\x21\x86\x57\xb5\xc1\x2f\xdc\x65\x52\xbf\x04\xe7\x7d\xf7\x75\x98\xdd\x13\x23\x6c\x48\x6a\xb4\x36\xbd\xf0\x09\x14\x6a\x2a\x88\xc8\xa9\x29\xa9\xe5\xeb\x38\x59\xf7\xc0\xbc\xee\xf7\xea\xe7\x7c\xd1\xf2\xfb\xda\xeb\xc1\xb6\xef\xd1\xbf\x59\x3a\xa1\x6a\x46\x21\xc8\x84\x7c\xa5\x12\x7c\x6d\x33\x9a\x11\x6d\xa6\x85\x18\x80\x4d\x3d\xc5\x01\x1e\x1c\xa0\xc2\xd0\xf5\x82\x7d\x77\x80\x0f\xb5\x8f\xc0\xa1\x66\x7c\x1c\x2f\x84\x11\x81\xb3\x6c\x85\x4a\x4d\x5a\x2b\xb1\x36\x4c\x88\xe7\x9e\x1b\xca\x85\xc5\x44\x16\x82\x2e\x69\x46\xe6\x7a\xca\x0b\xca\xe6\xd2\x57\x69\xc3\x82\xb8\x96\x90\x7a\xf1\x92\x90\xb5\xfd\xf5\x79\x91\x57\xfa\xf3\xd5\x2e\x4a\x63\xf2\x7e\xfa\x7c\x87\x18\x31\x53\xf6\x7a\xe7\x81\xce\x51\xbd\x28\x2f\x9d\x09\xa1\xc9\x64\x02\x31\xe4\x37\xff\x97\x33\x22\xd3\xec\x2d\xfa\x13\xb1\x6b\xe1\x48\x10\xcd\xfb\xbd\xf0\xc5\x8f\x0b\x0e\x91\xa8\x52\xda\x3d\xaf\x0d\x5b\x60\x95\x5e\xaf\x8e\xa5\x8e\xee\x3b\x4d\x9b\x71\x65\x95\xfc\xd6\x37\xf8\xd5\xcf\xc7\x12\xd5\xd9\x1b\xaf\xc9\x83\xb6\x07\x65\x39\xaa\xe6\xe4\x30\x80\x81\xce\xb3\x06\xff\x74\x59\x05\x30\x4f\x7f\xf5\x1b\x23\xb9\xca\x33\xca\x1e\x4e\x10\x55\x2e\x13\x47\x73\x94\x00\x93\x5d\x93\x73\xbc\x58\x10\x9c\x35\x34\xbd\x67\x8f\xab\x39\xae\xb1\x17\xdd\x50\x45\x02\x76\xdd\xad\x0a\x93\xef\xea\x04\x7b\x50\xd4\xab\xa5\x6c\x1d\x1d\xc5\x53\xb4\x5e\xc5\xb9\x50\x99\x48\x1a\xaa\x60\x5d\xde\x9e\xdd\x5e\xb6\x82\x5b\x3e\xbe\x4b\x43\xe5\x00\x2f\xdd\xa4\xa0\xc3\x51\xbd\x4a\xbf\x10\xfd\x65\xf7\xfb\x30\x41\x59\xe9\xf3\x29\x53\x74\xe3\x9a\x0b\x85\x77\x37\x17\xc3\x44\x64\xb2\xc0\xc5\x69\xa9\x16\xe7\x54\x26\x7c\x49\xa2\xb8\xc1\x1f\x17\x04\x74\x64\x0b\xe6\x44\x54\x3f\x12\x5f\xab\xd2\xcd\x0b\x9d\xfd\xdb\xe9\x35\xc2\xa5\xbe\xc7\x8a\x26\xfe\xa9\x88\xa1\xe9\xa0\x6e\xc7\x6e\x4d\x09\xea\x17\xb6\x5f\x76\x56\x2f\x66\xb7\x0e\xd0\x68\xaf\x71\x80\x46\xbf\x7c\x68\x34\xc8\x36\xcf\xa9\x1c\xe0\xd0\x3b\x0d\xca\xa8\xa2\x58\x71\x11\x09\xd5\x78\x56\x4a\xc5\x73\xc3\x68\x01\x49\x43\x03\x0a\xf4\x7f\x02\x38\xc4\xe5\xac\x3d\xcb\x56\xfe\x78\x08\x24\x02\xae\xd9\x25\x53\x44\xcc\x70\x42\x3a\xd5\xb3\x7c\xd1\x06\x8c\x3c\xda\xd5\xd3\x8a\xf2\xbf\x04\x55\x9f\x2b\x40\x7b\xf9\xd7\x0f\xff\xd2\x00\x5c\xff\x6b\x20\xd2\xc2\xb8\x72\x53\x17\x7e\x46\x09\x67\x8c\x24\x6a\x1f\x01\x64\x3d\xe8\x2f\x31\xa4\xbd\x05\xe1\x98\xdd\xff\xf7\x12\x67\x21\x37\xe4\xd3\xbe\x70\x13\xed\x5b\x19\x61\x5b\xdc\x5b\x74\xb7\x31\xa0\x42\x36\xc8\xde\x52\x12\xe8\xb2\x66\xe8\x2a\x81\x99\xd4\x57\x34\x46\x74\xe3\xd8\x26\x28\x1c\xa3\x37\x2a\x29\x3c\xb1\xea\x2f\xa2\x46\xab\xd9\x1c\x7b\x23\x3f\x7a\xd8\x2e\x66\x98\xda\xac\x21\xfb\xb0\x57\xac\x3c\x70\xae\x18\x01\xf5\xd6\x76\x7a\x9a\x73\x66\x7c\xa4\x52\x41\xd7\x14\x3b\x3b\xe8\xac\x63\xea\x3d\x7a\xa9\xe1\x7a\x5c\x5e\x23\x2e\x10\x2d\xfe\x03\xa7\xa9\xf8\x60\x2c\x0d\xeb\x7f\xe4\xde\xa8\x3d\x2a\x6d\x40\x04\x2a\x92\xb8\xd2\x5b\x6f\xd4\xaa\xa0\x09\xce\xbc\x2b\x00\xdd\x9d\x5d\xc3\xac\x24\xfa\xfd\xef\xde\x83\x43\xfd\x37\xff\xfc\xbb\xf7\x41\x4f\xed\xf5\xd5\x8a\x44\x71\x63\xd3\xff\x78\x68\xfe\x97\x54\xf9\x09\x0c\x72\x53\xf3\x09\xf4\x99\x10\x23\xdf\x28\x6a\xf0\x2c\x2a\x9d\x33\x9e\xb1\x7f\xa8\xd5\xd3\x1a\x87\x5a\x3d\xfb\xae\xd5\x83\xaa\x2b\x6f\x64\xea\xd3\x48\xea\x90\x92\x93\xd7\xeb\x42\xda\x88\x5b\x5f\xa9\xba\x41\x48\xfb\x07\x09\x5f\x89\x90\xf6\xba\x1f\x7e\x3c\xa3\xcd\x2b\x8c\xfc\x39\x3e\x96\x8d\xec\x06\x8f\x75\x40\xe5\xd5\xf3\x4f\xb7\xff\xf1\xf1\xf4\x87\x8b\x8f\xb0\x27\xb6\xda\x8b\x7e\xfc\x5e\xd2\xb1\x27\x50\x13\x99\xfd\xf8\x46\x65\xfc\x0e\x2b\x1c\x83\xfd\xe9\xc7\xdb\x76\xe0\x0e\x7d\xfa\xf1\xd6\x63\x67\xfb\x81\xd7\x15\x8c\xda\xcb\x94\x68\x01\xaf\x43\x3d\x8c\x6c\xe6\x7d\x36\xaf\x05\xe0\x31\x81\xfa\x61\xcf\x5e\x20\x3b\x2a\x32\xc4\x05\x7c\xc9\xd7\x18\x0e\x7a\x7d\xbb\xcd\x9e\x44\x04\x50\x3e\xf9\xad\x43\x2f\xca\xd4\x79\x0a\x18\xae\x3e\x17\x73\xc2\x36\x16\x61\xa1\xb4\x21\xbe\xdd\x57\x03\xc0\x7d\xc6\xfb\x13\x62\xae\x89\x38\x55\xef\x8f\x6f\x81\x92\x03\xcb\x6b\xd1\x10\x52\xfa\x5e\x68\x5d\x50\xeb\x73\x44\x4a\x17\x80\x6c\xbc\x72\x4f\xb2\xfb\x90\x2d\x28\xec\x95\x17\x9d\xa6\x82\x67\x19\xa6\x79\xa8\x36\xd0\xed\x54\x08\x44\xcd\x7f\xde\x02\x20\xc7\x8b\x15\x35\xfa\xfb\xb5\xaa\x2c\xe3\xb5\xce\x88\xf0\x7d\x5e\x31\x2d\x93\x4b\x89\x6d\xb0\x44\x16\x38\x89\x95\xaa\xe5\xd9\x49\xb6\xfe\x91\xf9\x09\x34\x6a\x7c\x4d\x2a\x08\x4c\x78\x0f\x05\xe0\xaa\xef\x8d\xc1\x7c\xce\x1c\x31\xcb\x7f\x02\x3c\x29\x9a\xdb\xc4\xbb\xb1\x68\xd3\xad\x45\x38\x64\xa2\x05\x77\xcd\x61\xa0\x3b\xa8\xed\xea\xf1\xbc\x58\xd3\x27\x7c\x0c\xe8\x45\x69\x46\x7f\x7a\x96\x42\xfd\x4e\x17\xf1\x55\xba\xf6\xe3\xf2\x2d\x16\x5c\x71\x16\xb5\x9c\xe9\x75\x0f\xc9\x50\x79\x64\x68\x9e\x99\xf2\xcb\x19\x11\x0d\xb1\xea\x41\x1a\xea\x26\x55\x15\xa7\x31\x4b\xab\x14\x31\xce\x1c\x04\x35\xb4\xf4\xf4\xeb\x11\x20\x45\x7a\x79\xfe\xcc\xb2\xe3\xd0\x4a\xe8\x65\xb6\x12\x7a\x1e\x10\xda\x3e\xc4\x89\xbe\xe4\x11\xee\xdb\xe5\xb9\xf5\x7c\xb8\x3a\xd6\xbe\xbe\x69\xc3\xd0\x50\x2c\x8e\x86\x2c\x57\x7b\x76\xeb\x86\x0b\xf5\xc8\x45\x9c\xf6\x7e\xd7\x2d\x62\xc1\x59\xa0\x96\xda\x5a\x87\x81\x06\xbf\xf7\x20\xdc\x90\x10\xaf\x94\xdf\x9b\xfd\x78\xc5\x3c\xff\x16\x12\x8b\x82\xae\x07\xb2\x41\x86\x2e\xe6\xd8\x01\x9b\x7d\xfd\x13\x3d\xe2\xa3\x23\x08\xc2\x1c\xa5\x91\x91\xcc\x1d\xf1\x31\x6d\x08\x00\x7f\x33\x64\x5d\x6c\xbc\x04\x01\x10\xd1\x9e\x58\x73\x3a\x7a\xee\x55\x7f\x4b\x32\x70\xdf\x7a\x3b\x58\x7b\x2d\x1d\x67\xb3\xf8\xdb\xbf\x2d\x4b\x67\x2f\x8e\x4e\xc7\xb5\x22\x9c\xdf\x17\x4b\xca\x86\x29\xfd\xef\x7a\xa5\x04\x68\x0b\xa5\x2d\x6e\x9e\x5d\x10\x0b\xae\x05\x89\x8f\x44\x68\x2b\x38\x8a\xe4\x12\xc0\x3a\x38\xcb\xf4\xc9\x73\x0f\xd1\x86\xaa\xc4\x40\xe9\x1a\x74\x9d\xa0\x84\xb3\x19\x9d\xe7\xb8\x90\x27\x9e\xe9\x7c\x29\x7f\x64\x8f\x58\xa4\xe8\xf4\x7a\x77\x14\xd1\xde\xc4\xad\xdd\x88\x67\x96\xb6\x16\xf0\x70\xc5\xd3\x18\x22\x57\x93\x41\xf7\x54\x49\x53\x55\xc2\xdb\xca\x92\x44\x35\xa3\x3e\x5a\x99\xaa\xf0\xee\x5a\x60\xfa\x0b\x47\xbb\xde\x86\x05\xc7\x10\x4f\xfc\xc1\xa8\x4b\x9c\x95\x04\xdd\x13\xf5\x48\x08\x43\xef\xdf\xbf\x37\x60\x8f\xf7\xdf\x7f\xff\xbd\x7f\x48\x04\xa3\x94\x24\x34\xc7\x59\x97\xbc\x27\x49\x3d\xa3\xdf\x7e\xfb\xed\x14\xfd\xef\xd3\xab\x8f\x08\x27\xe0\xdf\x33\x0d\xc7\x43\xd6\xae\xc9\xb6\x26\x2a\x4f\xd0\xff\xba\xfd\xfc\xc9\x3d\x03\xdf\x63\x6a\xd3\x04\x26\x93\xbb\x8b\xe5\x1d\x00\xac\x0b\x4b\x58\xb8\x49\x55\x5d\xc0\x77\xf5\x82\x40\xf5\x0a\x3c\x9b\x01\x43\x35\xaa\x17\x95\x4e\x88\x86\xf5\x6d\xa4\xf3\x05\x5c\x4f\xca\x80\x21\x66\x34\x51\x30\xef\x20\x88\x93\x6b\x45\x0b\xa6\xa9\x99\x77\x60\x1e\x1e\x1c\xcc\x09\xca\xe8\x03\x41\x33\xf9\x47\xc1\xcb\xc2\x97\x6b\x23\xab\x6a\x0b\x22\xcb\x4c\x41\xe1\x91\x7b\x62\x27\xae\xbf\xc5\xf7\xcd\x6b\x6e\xe4\xdd\x98\x6a\xff\x08\x7c\x2b\x16\x22\x30\xe7\x8c\x6a\x9b\x60\x56\xd5\x27\x33\x9a\x80\xbe\x10\x01\x5b\xb3\x27\xe4\x78\xdb\x1f\x50\xad\xc4\xb7\xd0\x90\x19\xb6\x59\x6a\xa5\x22\x21\x9c\x71\x36\x0f\x79\x76\xee\xe1\xd5\xee\x3d\x97\x5c\xbb\x2a\xbc\xd9\x63\x30\x12\x39\x06\x16\x19\x59\x3d\xed\x0a\x17\xfe\x24\xba\xc0\xd3\xe0\x46\xba\x66\xe0\x7b\x5e\x2a\x97\x14\x67\xe6\x08\x2d\xe0\x82\x88\x2a\xee\x2e\x46\x00\x99\x08\x47\x87\x22\x1d\x1f\x0a\x7d\x82\x6e\xb4\xcd\x82\x96\x01\xef\x9b\x81\x59\x0f\x82\x93\x05\x7a\x20\xab\x89\x51\x84\x0a\xec\x55\x65\xbd\x3d\xac\xe8\x3f\xc7\x0a\x1b\x2c\x78\x30\x45\x8b\x5b\xa9\xc0\x10\xe1\x14\xcf\xaa\x8b\x1b\x96\x25\x5a\x8f\x9a\xab\xb9\x9a\xf3\xc1\x24\x9d\xc3\x54\x5a\x3f\x16\x7a\x5c\x70\x6f\x27\x47\x3d\x58\x1d\xde\xd7\x47\x1f\xa0\x4e\xd4\x23\xe1\x4c\x11\xa6\x1c\x59\xb8\x4d\x21\x19\x00\x66\x5c\x76\xeb\x92\x07\x53\xd4\x32\x9a\xa4\x7a\xd9\xf2\x25\x9f\x7c\x5d\xb5\x5a\x2b\xd0\xde\x86\x7a\x7b\x94\xac\xbb\xfa\xf0\xab\xc4\x95\x91\xe8\xe0\x00\x9e\xa2\x4b\xdf\x5e\xa2\xf5\xc0\x70\x27\x23\x24\xb0\xd7\xe3\x71\x41\x13\xa8\x3e\xab\xa7\x6b\xe7\x1a\x8b\xcb\x55\x8c\x24\x9c\x17\x37\x6a\x83\x48\xa2\xca\x22\xce\x11\x41\x55\x07\x7d\xf6\x44\x4a\x44\x03\xb2\x38\xea\x91\x63\xf1\x40\x52\x6b\xed\xe0\x6c\x8a\xae\xf5\x25\x0d\x27\x6b\x3d\x06\x82\x64\x18\x1a\xff\xc7\xb8\xf4\x5a\xe7\x6c\x36\x8a\x88\xf1\x3a\x8f\xa7\xd3\x63\x53\x37\x2f\xb0\xed\x44\x3d\xea\x06\x14\x81\xa4\x42\xad\x86\x7a\x44\x51\x5e\xba\xfe\x2b\x5c\x84\xdf\x13\xa8\x3a\x08\xbe\x59\x60\x15\xde\x4e\xb0\x36\x45\x38\x4f\xeb\xb9\x08\xd3\x64\xcd\xb0\x50\xb2\x70\xae\x10\x47\xa5\x35\xc3\xdf\x7f\xda\x1d\x13\xbd\xf7\x11\xa8\x04\x38\x88\xea\x11\x4b\x5f\x37\xe3\x81\x78\x06\xa7\xba\xa3\x5d\x7a\x23\x02\xe3\x31\xc3\x5c\x7a\xa7\x76\x84\xdf\x30\x14\x1e\xd4\xeb\x8e\xdc\xdb\xdd\xdd\x1d\x6d\x78\xea\x67\x2b\x72\xe2\xd0\x46\xb5\xdb\x13\xfc\xe9\x91\x88\x42\x25\xe5\x96\x7f\x3d\x12\x61\xf0\xbf\x50\x09\xb6\x40\x9c\x63\x47\xb1\xdc\xf4\xdd\xd1\xf2\xab\x47\xa2\x19\xc3\xf9\xdf\x1d\xcd\x60\xc0\x4b\x5e\x7a\x3b\xc4\x10\x89\x6a\x33\x50\x11\x6b\x3f\xf5\x1d\x6a\x06\x2e\x62\x6e\xaa\x0d\x7f\x44\x22\xe9\x82\x28\x4f\x32\xd3\x2a\xa8\x12\x89\x2a\x84\x66\xb4\x3d\xcc\x78\xb8\x16\x60\x46\x64\xcb\xda\x0c\xd7\xee\xac\x8e\x7a\x46\x22\x6c\x8d\x75\xe0\xd3\xb1\x78\x5f\x2b\x12\x14\x89\x66\x23\x9e\x14\x6d\xe5\xda\xd0\x68\xc6\x97\x62\xc9\xa9\x3a\x4a\x15\x8d\x22\x69\x44\xad\x22\x11\x6d\xc5\xbe\x62\x71\x3e\x96\x36\x62\x61\x91\x88\x36\x23\x6a\xd1\xf5\x13\x49\x94\x47\xc1\xfd\xbe\x11\x1e\x72\xeb\x8e\xd0\x10\x5c\x77\xf8\x27\x48\x77\xc7\x13\x69\xe0\x95\x87\x22\x8a\xf5\x62\x86\xf5\x71\xeb\xe7\x13\x4f\x0f\xcd\x71\xe1\xdc\xbc\xd1\x88\x4e\xd1\x95\xf1\xa9\xc4\x12\x6d\xa0\x7c\xe2\x7b\xc9\xb3\x52\xc5\x5a\xbb\x6d\x19\x10\x75\xa2\x31\x5d\x48\x66\x80\xcf\x81\x64\x24\x8f\xe1\x90\x34\xc3\x34\x31\x8d\xbb\x70\x70\x71\x55\xbd\x36\xa3\x11\x05\x0f\x4e\x0c\x9f\x97\x19\xd1\x4c\xd8\xb0\x32\x50\x66\xf4\x16\x83\x8a\xe2\x21\x6e\x97\x84\x8a\xe0\xc6\x7e\x51\x25\xa5\xcc\xe8\x2f\x2c\x15\x4c\xd6\x16\xa6\x6a\x96\x97\x0a\xa6\x19\xa3\x3c\x95\x19\xd1\xee\x2f\x8f\xe4\x24\x69\xdd\xe1\x5b\xb0\x16\xc2\xa5\x88\xab\x37\xdf\x8a\x9d\x84\x07\x88\x05\xd2\x4a\x12\x04\xb6\x6c\x18\x21\x82\xe3\x7a\x46\x59\xb0\x53\x28\x14\x6e\x6d\xe7\x62\x11\xb7\xa7\xd7\x97\x2f\x18\x0d\xd2\x98\x65\x10\xc5\x14\x2b\x7c\xc0\x83\x6c\x1a\x3d\x30\xf1\x08\x31\x3d\x5c\xc1\xd7\xce\xeb\x53\xfc\xe2\x0f\xa1\x6f\x8e\x08\x3a\xed\xcb\x0e\x6b\xad\x6d\xd9\x8f\x71\xb4\xf8\x46\xea\x75\xac\xd7\x6a\x86\xe2\x16\xef\x1d\xd3\xe6\xb0\xfa\xb1\x29\xa6\x00\x75\xe3\x22\x10\x8d\x03\x20\x7a\xb1\x41\xb4\x17\x18\xfe\x82\x1d\xf7\xae\x3b\xdb\x1d\xdd\xd2\x58\xb1\xb6\xce\x8c\x5b\x92\x69\xed\x13\xc5\x02\x9a\x99\xc1\x5d\xd1\xcb\x68\xf3\x84\x32\x5b\x98\x31\xae\xe0\x05\xcb\x68\xbe\x31\x7c\x4f\x32\x79\x82\x02\x2a\x44\x75\x07\x66\x69\x5d\x5c\x25\x16\x4d\xd1\x48\xbc\x8c\xea\xc6\x8a\xf4\xa4\x51\xd4\x67\x8d\xe0\x69\xc3\x8d\x0c\xe8\xb6\xd7\x1e\x71\xdf\x38\x6a\x15\xd9\x8d\x45\xb1\x9b\xde\x67\xa8\x47\x23\x5e\x3d\x4c\x99\x2c\x48\x1e\x03\xa3\xe1\x86\x26\xfa\x63\xd4\xe3\x32\x83\x4a\xf4\x28\xa8\x52\xd1\xe2\x80\xc8\x02\xcf\x88\xc8\x63\x45\x01\x10\xec\xeb\x89\x0b\xd9\xc4\x24\xab\x38\x3a\x5a\x7e\xeb\x5d\x04\xa3\x87\x60\x5c\x94\x02\x72\xd2\xce\xaf\x69\xf6\xa6\xd1\xce\x9d\x88\x7b\xa3\x2a\x2f\x71\x3c\x69\x87\x1c\x64\x21\x8b\x17\x08\x42\x8d\x6a\x5d\xd1\x60\x9c\xf5\x38\xbd\xbe\x44\x4b\xc3\x5d\x5e\xec\xe5\x3a\x40\x60\x9e\x1a\x02\x13\x4b\x89\xca\x0f\x10\x98\x03\x04\xe6\x00\x81\x39\x40\x60\xe2\x10\x3d\x40\x60\x0e\x10\x98\x03\x04\xe6\x00\x81\x09\x1a\x4f\x04\x81\x89\xee\x80\x83\x1e\x04\x54\xa2\x88\xfc\xf3\x29\xc0\x35\x2c\x4a\x37\xa6\xe6\x80\x37\x6e\x6a\x6b\xd9\xca\x29\x51\x11\xd9\x26\xb1\x2e\xd6\x53\xb7\xd8\x1a\xff\x9e\x40\xdd\x11\x1f\x0a\x73\x7c\x3c\x9d\x1e\x9b\xac\xaa\xd8\xd0\xf6\x52\xcd\x26\xbf\x8f\x44\x93\xb0\x84\xa7\x24\x9d\x46\x04\x93\xcd\xa8\x90\x0a\xc2\x52\x31\x20\x22\x66\x18\xc6\x6e\xde\x51\x4c\xac\x52\x6e\xef\x66\x7c\x60\x91\x39\xff\x98\xec\x3d\x9a\x25\xef\x6a\x68\xfd\xf8\x84\x81\x11\x1b\xc8\x88\xf5\xe0\xab\x39\xc7\xbd\x52\xf6\xd9\xfb\xf6\xb9\x58\x1f\x10\x17\xa9\x6a\x94\x45\xd3\x96\x72\x0a\xad\x99\x52\x30\x70\x88\x8c\xb6\xaf\x6f\x0c\xe9\x69\x52\x94\xf1\x54\x3b\xa0\x98\x93\x9c\x0b\xef\x8e\xda\xdd\xe1\x96\xad\x27\x1a\x51\x5d\xac\xc8\x9a\xd9\xbe\x8d\x18\x1d\x4a\x4a\x21\x08\xf3\x2f\x77\xd9\x1d\xff\x70\xd1\x26\xf7\x88\x5e\x68\xb0\xa9\xe2\x1c\xfe\x8d\x2a\xfa\x46\xa7\x79\x85\xfb\x92\x88\xae\x66\x00\x83\x56\xa7\x15\x91\xf0\x8c\x0b\xeb\x2a\x88\x16\x0d\x46\x0d\xf0\x5f\xe4\x99\x12\xb6\x8c\x48\x71\x89\x85\x67\x33\x8b\xbe\xf1\x04\x51\xa1\x94\x2e\xa9\xe4\xd1\xc4\x5c\x2f\x96\xd2\xbf\x66\x79\xdf\xd0\xe2\x99\x97\xaa\x28\x63\x86\x70\x8c\x55\x1b\x4f\x87\x40\x76\xa2\xe4\x6b\xc1\xe3\x05\x1b\x50\xb3\xce\x69\xcc\xb7\xf4\x44\x21\xd1\x6f\x7d\xcb\xf7\xaf\x8f\x02\x2b\x45\x04\xfb\x80\xfe\xcf\x9b\xbf\xfc\xfa\x6f\x93\xb7\x7f\x78\xf3\xe6\xcf\xef\x27\xff\xff\x5f\x7f\xfd\xe6\x2f\x53\xf8\x8f\x6f\xde\xfe\xe1\xed\xdf\xdc\xff\xfc\xfa\xed\xdb\x37\x6f\xfe\xfc\xd3\xd5\x1f\xef\xae\x2f\xfe\x4a\xdf\xfe\xed\xcf\xac\xcc\x1f\xcc\xff\xfd\xed\xcd\x9f\xc9\xc5\x5f\x47\x12\x79\xfb\xf6\x0f\xff\x5f\xb4\x25\x60\xb6\xfa\x1c\x49\xa5\x46\x20\x09\xe3\x3b\x77\x9a\x74\xa3\xb2\x19\x84\xbe\x4e\x6a\xc8\xfd\x84\x32\x35\xe1\x62\x62\xbe\xe2\x03\x52\xa2\x8c\xe7\x53\x31\xcf\xe3\xa9\x24\x6f\x6c\xb7\x12\x6a\xcc\xf9\x29\xc2\xdc\x2f\x4c\xf8\x98\xda\xcc\x2f\x18\xd9\x6d\x26\x78\x28\xf2\xd7\x37\x0e\x45\xfe\x5e\x6a\x91\xbf\x5b\x73\x6b\x5d\xdc\xac\xaa\xd3\x16\x61\xf1\xa6\xce\x5b\x5d\xa1\x2f\x98\x64\xb3\xc2\x5f\x1c\x38\x67\xbb\xc2\x9f\xab\xd0\x17\x8b\xac\xa9\xf0\xd7\xae\xd0\x17\x4c\x5b\x13\x8e\x5e\xa3\xae\x55\x71\x56\x9f\x5c\x94\x69\x76\x2b\xf4\x85\x5f\x00\x68\xd7\xde\x58\x7d\x30\x45\xb8\xf7\x9d\x0a\x7d\xc1\x44\x2f\x67\xaf\xad\x42\x9f\xe1\x02\x71\x22\xfc\x87\xf2\x7c\x87\xf2\x7c\x41\xe3\x65\xe7\x31\x1d\xca\xf3\xed\x3c\x5e\x6c\x66\xd1\xa1\x3c\xdf\xb6\x71\x28\xcf\x17\x3e\x0e\xd8\xe4\x7a\x1c\xca\xf3\x1d\xb0\xc9\x07\x6c\xf2\x01\x9b\x1c\x87\xe4\x01\x9b\x7c\xc0\x26\x1f\xb0\xc9\x07\x6c\x72\xf8\x78\x25\xd8\xe4\x43\x79\xbe\x28\x44\x0f\xe5\xf9\x0e\xe5\xf9\xa2\x10\x3d\x94\xe7\xdb\x75\x1c\xca\xf3\x05\x8d\x43\x79\xbe\x9d\xc6\x93\x97\xe7\x33\x81\x93\xf0\xb8\x6e\x55\x9b\xef\xef\xb2\x34\x9f\xd4\xcf\x2e\x21\xa7\x49\xc2\x4b\xa6\xee\xf8\x03\x09\xaa\xa7\xf2\xe4\x40\x8e\xb5\xd9\x06\x51\x7e\x71\xa5\xfa\x62\xb8\xd0\x83\xdd\xde\xb1\x1c\xde\xb8\x4c\x29\x61\xe1\xb0\xad\xd6\xa5\x3a\xb5\x44\x63\x21\x01\xb4\xa9\xc2\x52\x92\x56\xb3\x8d\x85\x04\x51\xfa\x76\x4e\xd1\x29\x12\x24\xa1\x05\x8d\xa1\x84\xf1\x19\xc2\x86\xae\xe1\x45\x34\x25\x4c\xc5\xe0\x9b\x54\x49\x92\xcd\x8c\x12\x86\x99\xa3\x4b\x23\x58\x70\x35\xd0\xc0\xc6\xb3\x9f\x64\x9b\xe3\x74\x18\x04\x75\xe0\x91\x4a\x82\xe4\x82\x97\x59\x8a\x04\x89\x12\x17\x6b\xdc\x86\xbb\x98\x3b\xe0\x00\xbe\xc8\xc2\x79\x22\x1e\x9b\xdd\x5c\x5c\x50\xcd\x72\x89\x88\x13\x38\x8e\xa0\x7e\x90\xaf\x05\x15\x20\x52\x6e\x49\xc2\x59\x1a\x17\xba\x76\xd1\xa5\x1e\x8b\xcb\xd8\xdc\x23\x92\xa2\xb4\x14\x71\xca\x60\xf2\x19\x5a\xe2\x8c\xa6\x54\xad\x62\xe5\x06\x5b\xf1\x8a\xb0\x91\xaf\xf6\xd2\x06\x93\x3d\x95\xf5\x13\x40\xb8\x28\x04\xc7\xc9\x22\x82\x22\x5f\xdf\x85\x13\xe3\x87\x28\xef\x49\x16\x41\xe5\x73\x1d\xd0\xb3\x72\x4e\x59\x1c\x9c\x0c\xac\x59\xd1\x25\xc9\x56\x48\x70\x85\x23\xb8\x22\x1a\xfa\x90\x3b\xb0\x70\x9a\x35\x97\x8a\xb5\x99\xe0\x5a\x37\x36\xbe\x12\xab\x18\x01\x60\xc5\xed\x16\xd6\xb7\x2a\xfc\x99\x36\x84\x89\x7e\xb3\x3c\x4b\x23\x70\x51\xb5\xc0\x0c\xfd\xfe\x3d\x2a\x88\x48\x08\x8b\x92\x89\xa2\x6d\x11\x45\x73\x48\xde\xcf\xe8\x32\x4a\x52\xfc\x13\x2e\xfe\x9f\xbf\x43\x0b\x5e\x0a\x39\x3d\x8f\x95\x8c\xa2\x38\xfa\x16\x68\x82\x9b\x5d\xab\x41\x31\x20\x96\x58\xa1\x8c\x60\xa9\xd0\xb7\xef\x51\x4e\x59\xa9\x88\x8c\x23\xf2\xe2\x78\xc2\x1b\x3e\xf0\xdf\x7d\x17\x44\x2b\x86\xf7\x7b\xad\x42\x60\x0c\xd8\x1f\x94\xac\xd5\xb4\xa2\x25\xfe\x5b\xad\x28\x07\x51\x56\x70\x1a\x47\x01\xaf\xa2\x50\x51\xcc\x46\x3b\xd3\xfa\xf5\x31\xc5\xf7\xa8\x6b\xfd\x52\xf2\xfb\x95\xf2\x30\xd8\x5a\x57\xe2\xdf\x0d\x95\x66\xfd\x6f\x1f\xcc\x9b\x23\x63\x0e\x90\x1b\xf3\x61\xc1\xa5\x32\xb1\x45\xb9\xc0\xc2\x4b\x89\xc0\xa8\xe0\xe9\xb1\x44\x19\x9d\x11\xcd\x4a\x77\x26\x11\x64\xeb\xfb\x5b\xf8\x13\x24\xc8\x9c\x4a\x25\x76\xb7\xf7\x26\x56\xa7\xd9\xf9\x83\x61\xae\x80\xb9\xe0\x65\xe1\xc7\x6d\x5a\x17\x0a\xa2\xb3\x2e\xe2\xe4\xb9\x12\x33\x70\x92\x10\x09\x06\x93\x15\x48\x06\xb5\x6d\x66\xea\x45\x33\xd0\xb2\x11\x04\xa7\x9f\x59\xe6\x89\x09\x6c\xed\xd2\x8d\x25\x85\x16\x44\x90\x10\xb5\x75\xc6\x45\x62\x94\x2b\xf7\x04\xad\x46\xec\x0d\x86\xbd\xb7\xaf\x98\xa4\xc6\xc7\xa0\x57\x3d\x81\xea\x19\x0d\x1c\x9b\x2f\xdf\x3b\x6f\x98\xc1\x33\x9c\x49\x4f\xf4\x5a\xa8\x3f\xd5\x3d\xce\x28\x27\x69\x48\x35\x38\xa8\xef\x7d\x47\x92\xb2\x79\xa6\xd5\x44\x94\x97\x99\xa2\x45\x56\x9d\xaa\x27\xc9\x6a\x72\xd6\xf8\x08\x4f\xa4\xc0\xb2\xc6\x5c\x63\x09\x2c\xfe\x43\xc1\x85\x0a\x49\xf5\x7a\x53\xad\x96\x30\x25\x28\x91\xa6\x8a\x3b\x29\xb0\xc0\xfe\x39\x54\x70\x79\x13\x9e\xe7\x58\xbe\xb5\x59\x1f\x18\x0a\xf8\xcb\x00\xfb\x5b\x9b\x06\x02\x67\xd5\x05\x6a\xd6\x56\xd8\x07\x4b\x52\x84\x61\xe6\x99\xce\xd9\x86\x44\x00\x21\xc4\x1f\x5d\x53\x0d\xcf\x0d\x9a\xd3\x25\x61\x5d\x5e\x14\x14\x2a\xff\x01\x27\x0f\x84\xa5\xe8\x67\xe9\x38\x52\xba\x62\x38\xa7\x09\xce\xbc\x6b\xb8\x14\x82\x2f\xa9\x66\x64\x24\xed\xcc\xd5\x3b\xbd\xca\x80\x3d\x29\xe0\x73\xd0\xfd\xca\xe8\xc8\xe0\x95\xd8\xc7\xbd\x28\xa5\x6f\xe5\xa4\xd6\xad\xf8\x59\x12\xf1\x34\xb2\x5c\x1a\x70\xb4\xa0\xcb\x84\x84\x79\x44\xf4\x52\xf7\xb1\xc5\x66\x3f\x22\x6c\xf2\x17\xfb\x48\x6a\xce\xea\xb9\x13\xa0\x6a\x57\x49\xad\x12\xc0\x34\x99\x16\xdf\x2b\x57\x38\xd0\x93\x70\xe7\x39\xdf\xaf\x00\x19\x11\x22\xba\xbd\xd6\x29\xee\x3d\x34\xf1\x4e\xf5\x80\x1f\xce\x5b\xa6\x0e\xba\xc1\x29\xf7\xe1\xdc\x3f\x64\x3c\x79\x40\xe7\x04\x5c\x7a\xfd\x56\x8f\x07\x55\x63\x27\x59\xab\xa7\x61\xf6\x18\x88\x87\x81\x68\x78\x90\x75\xa0\x0e\xf2\x15\xe7\x45\x46\xe4\xf4\xe1\xf7\x00\xeb\xb0\x2c\xef\x9d\xb8\x4f\xdf\xdd\x5c\x9c\x9e\x5f\x5d\x4c\xf3\x74\x77\xf4\xc2\xde\x6c\x2c\x9a\xe3\xf9\xee\x1c\x69\x82\x72\xce\xa8\xe2\x62\xf7\x73\x0f\x33\xb1\x66\xf2\x4e\xef\x54\x38\xc7\x38\xfe\x91\x66\x44\xae\xa4\x22\x39\x6c\xbe\xe7\xb3\xb6\x1e\x12\x67\x30\x68\xee\xb1\xe2\x25\x7a\xc4\xde\xbc\x58\x8b\x0a\xfd\x16\xa6\xe8\x8e\x16\x1f\xd0\x05\x93\xa5\xb0\x94\xfd\x15\x80\x59\x7b\xb1\x20\x63\x5d\xcd\x35\x5f\x1b\x67\x55\x3f\x55\x7d\xa2\x58\x69\xad\xc7\x7c\x89\xaf\x69\x73\x61\x1f\xd7\x07\x74\x44\xbe\xaa\xef\x8e\x4e\xd0\xd1\xd7\x99\xd4\xff\x30\x35\x93\xde\xad\x49\x2e\xf3\x22\xa3\x09\x55\xd9\x4a\x3f\x7f\x22\x04\x49\x6d\x31\x58\xf3\x35\x9e\x64\x69\xab\xf0\x43\x93\xbf\x8c\x82\x80\x49\xc5\x05\x9e\x13\xc7\x41\x7e\x25\xee\x7d\x8f\xc2\x20\xbc\x16\xfc\x11\xa5\x1c\x3d\x42\xfa\xf8\x92\x30\x65\xb2\x95\x7d\x4d\x29\x1b\xbf\x6e\xdc\x9c\x99\xe0\xb9\xb6\x06\x0a\xc1\x73\x2a\x43\x64\x2c\x41\x39\x4e\x16\x94\x11\x3f\x98\x57\xa0\xd6\x01\x2c\x2f\x06\x0b\xb9\x5b\x10\x24\xb4\xf0\xf3\xe4\xa2\x66\x80\x1e\xd0\x77\x79\x46\x89\x9a\x5f\x2d\xf8\xe3\x44\xf1\x49\x29\xc9\x84\x7a\x56\xca\x09\xdc\xcf\x07\xb2\x82\x12\x48\x11\x76\xf4\x27\x43\xca\x85\x91\x03\x80\x3d\x8a\x03\x86\x0d\xa8\x69\x03\xf3\xe6\x87\x73\xad\x89\x4f\x9d\xf2\xec\xfb\x2a\x24\x7a\x47\x54\xf2\x2e\x21\xc5\xe2\x9d\x5d\x78\xa0\x66\x81\x76\xd5\x2e\x5e\xc0\x91\x3b\xe9\x1f\xe3\xcc\x4f\x51\xc2\xb3\x8c\x24\xfa\x7f\xfd\x43\x86\x67\xa4\x58\x54\xd3\x7a\x09\xcf\xc9\xbf\x6a\x40\x50\xad\x80\xc0\x83\x2d\x38\xf7\x84\xba\x6e\x62\x8d\x9a\x62\x80\xad\x83\x9a\x9e\x6b\x71\xdf\x2f\x66\x5f\xcb\xb3\x89\xe8\xfd\x3e\x7e\x02\xf7\x77\x45\x52\x12\x05\xda\x9c\xa7\xe3\x05\x59\x7b\xfc\x4a\xeb\xb1\x72\x1a\xcb\x63\x8d\x5e\xc0\xd1\xfb\xfb\xcb\x4d\x51\x36\xef\x82\xe4\xdd\x02\xe4\x96\x18\xc4\x73\xfc\xeb\x4f\x39\xdc\x5b\xa9\x16\x84\x29\x9a\x00\xba\xc8\x4e\xd5\xff\x3a\xd5\xc2\xf6\x72\x66\xfc\x84\x29\x49\x11\x5f\x12\x21\x68\xea\x0d\x84\xaa\xa4\x6d\x33\x94\x45\xb3\xa0\xd4\x8d\xbd\xde\xa5\x00\xf4\x74\x38\x64\x39\x2c\x2f\xa7\x37\x23\x27\x10\x93\xd7\xce\xc5\x79\x69\xb9\x34\xfd\x59\x34\x2e\x0b\x26\x80\x70\x23\x7f\x26\x4a\xfe\xcb\xcb\xf0\x7a\x37\x14\x00\x4d\x31\x96\x02\x80\xd3\x9c\xb2\x7f\x30\x7d\x5b\x26\x38\x23\x97\x9f\x03\xdd\xb6\xb7\x86\x4a\x28\x48\xc5\x91\x29\xf4\x95\x95\x8a\x30\x55\x55\x55\x54\x0a\x27\x0b\x2f\x77\x12\x20\xdb\x6c\xbc\x9c\x33\xf4\x53\xf5\xd6\x11\xe3\xa9\x0f\x32\x6d\x6f\xde\xd4\x39\x56\xe4\xd1\x43\xed\x9f\xd4\xea\x81\xcf\x67\xc1\x3f\xf3\x5a\x3d\xb1\x1d\x47\xac\x3f\xea\xc2\xba\x4d\xab\x22\x3c\x0d\xdf\x55\x80\x31\x55\x3b\x4a\xfb\x5d\x9e\x9e\xa4\xad\xa3\x14\x5d\x7c\x9d\xc6\x75\x76\x36\xb8\x25\xd0\x7b\xf6\x10\x93\x1e\xf6\x1d\xc4\x08\xaa\xbb\x0d\xc7\x69\x2a\x88\xf4\x15\xe1\x56\xd1\x75\xec\xeb\xf4\xfa\x12\xfd\xd1\xcc\x71\x2f\xfb\x53\x08\xae\x8c\xc7\xe3\x9c\xe7\x98\x7a\xe6\x20\xae\x6d\x54\xa3\x71\x9a\x5b\xaa\xe7\x7e\x5d\x57\x13\x44\x66\x86\xa0\xd7\xdb\xae\x42\x33\x3a\x2f\xfd\xdb\x6b\x58\xbf\xf7\x5e\xf6\x3d\xa2\x01\xbe\x66\xd4\xfa\x22\x77\xf4\x9c\xde\x3d\x0a\xaa\xc8\xdb\x69\x1b\xd4\xe6\x8d\xda\xc9\xb2\x01\xab\xde\x3f\x1e\xd0\xb2\xea\x5f\xbd\x11\x5d\xdb\xd0\x75\xbc\xdf\xdf\xd9\xdc\xa8\xbb\xae\x5f\x8a\x63\x34\xde\xc8\x0a\xa3\x15\x19\x5b\x43\x12\x26\x29\x94\x48\x69\xa4\x18\x7b\x07\xc3\x66\xa6\xee\x5d\x55\xbe\xd7\x98\xe7\x27\xe8\x23\xf7\x05\xda\x20\x27\x0d\x39\xb3\x97\x0f\xd3\x2c\xe4\x82\x1c\x2c\xe3\xd6\x38\x58\xc6\x2f\xc1\x32\x96\x32\xbb\x60\xf8\x3e\xf3\xcd\x56\x6f\x2b\xbd\x19\x9e\x6b\xb6\x41\x80\xe2\xbb\x94\x4a\xfd\xaf\xe7\xd2\x6e\x6f\x3f\x02\x4a\xb3\x64\xce\x83\x07\x18\x3f\xab\xe0\xf8\xa2\xf1\x6c\xba\x6d\x80\x70\x0b\xe6\xf6\x46\x53\xb8\xf2\xae\x7f\xda\xee\xd3\xc0\x52\xbd\x3d\x44\xba\xb2\x19\x01\xe1\x6b\x3b\x33\x60\xf5\xb8\xaa\x33\x0e\x59\xd4\xbe\x70\x0a\x82\xee\x16\x34\x79\xb8\x6e\xc0\x2a\xb9\xd0\x3f\x63\x8d\x1f\x45\x30\x0a\xa2\x50\x0c\x7d\x4a\x66\xfb\xae\xe3\x04\x9b\xee\x1a\x8a\xfd\xad\xa1\xec\xab\xf5\x72\x9e\x21\x2c\x25\x4f\x28\xae\xc0\xfb\x10\x88\xae\xd4\x61\xdf\xc7\x04\x4a\xf4\x7e\x36\x1b\x2c\xcd\x27\xb0\x30\x64\xd0\x5e\x5b\x93\x1f\xcb\x86\x45\xa1\x95\x4c\x7b\x92\x7b\xd9\x2a\xf3\x90\xfd\x9b\x1e\x6e\xdc\x2e\x1c\x08\xfd\x6d\x43\x50\xab\x5e\x09\x41\x26\x9e\xf3\xb9\x2c\xb0\x71\xad\xb6\xaf\xbd\x37\x73\xa4\xb2\xe2\x87\xd0\x10\xea\xd9\x0f\xd2\xb7\x3d\x53\x5f\x84\x2d\xd4\x5d\x6a\x2d\x02\x9b\xc0\x07\x45\x36\x0a\x5e\x94\x99\xc9\xe6\xf6\x4a\x23\xb5\xa5\xf0\x43\xd1\x66\x66\x66\xcf\x0c\x54\x0d\x53\xce\x1b\x75\x70\x63\x44\x28\xaa\xf2\xe7\x75\x61\x50\xcf\x4b\x5f\x4a\x03\x28\xec\x14\x2a\x47\x9c\x05\x82\xc6\xc1\x81\x89\xee\x57\x6e\xe9\x0d\xe7\xa6\xb7\xa5\x06\x35\xa5\x5b\x65\xb5\xab\x5a\xe0\x9e\x24\xdf\x7f\xff\xfd\xf7\xad\xda\xdf\x51\xaa\x76\x77\xaa\x74\xc7\xa8\xaf\xbd\x56\x4f\x3b\x46\x25\xec\x6e\xe5\xeb\x46\xcd\x6a\x6f\x3f\xb6\xbd\x8e\x6d\xe4\xc4\xfb\xdf\x7d\xf7\x9d\xb7\xfe\x47\x05\x49\x14\x87\xc4\x30\xdb\x96\x23\x10\x5f\x87\x05\x01\xff\x81\x29\x79\xec\x9c\xe3\x26\x77\x47\x51\x36\xf7\x9d\x69\xab\x8c\x74\xb3\x00\x74\x88\x54\x6a\x15\x7c\x6e\x96\x6a\x0e\x84\x54\x9b\xd2\xcc\xed\xa2\xca\x01\x0f\xa9\x2e\xa2\xdc\x2a\x7f\x1c\x52\xfa\x3c\xb0\xdc\x71\x78\x51\x87\xd0\x72\xc6\x01\x60\xb8\xa1\x2e\x7d\xd0\x65\xcf\x1f\x88\xd2\xe8\xcd\x17\xad\xb7\xde\x5a\x47\xbd\x66\x47\x3c\x7f\xab\xb2\xdd\x4d\xad\x91\xad\xe0\xfb\xf0\xe5\x7a\xf7\x3b\x8b\xd7\xf5\xdf\xcf\x66\xcf\xbb\x76\xcf\x3a\x7f\x2f\x67\xbb\x24\x3f\x0a\xef\xd5\xb6\xd6\x99\xb0\xde\xd1\xd0\x94\x60\xd3\x95\x6e\xbd\xab\x5c\xc8\xd9\x77\x7a\xc9\x35\x7b\xc1\xf9\x5a\x0c\x55\x71\xbb\x88\x1d\xe0\xd6\xfb\xbe\xb5\xfa\xb6\x85\x9c\xd5\x7a\xb7\x36\xdb\x6d\xcd\xdb\xcb\xdd\xea\xd1\xb6\xd6\x63\x2d\xc0\xd1\xdf\xd3\x59\x0d\xaa\x39\x07\xdc\xa7\xaa\x9f\x5a\x68\x3f\xb4\xbd\xe2\x99\xd7\x3a\x9e\xb5\xfa\x95\xf9\xfb\x82\x79\xb7\x4b\x59\x60\x8f\xb1\x08\x05\x51\x43\x8b\xa1\x86\x74\x11\x0b\x2a\xa2\x1a\xa3\x80\x6a\x60\x9f\xb0\x35\xcf\x4b\x84\x66\x76\x11\x7a\x82\x45\xa9\x03\x19\xda\xff\xeb\x29\xba\x7e\xb5\x7b\x7d\x59\xe3\x37\x6c\xb7\xdb\x86\x73\xa4\xde\x5c\xdd\x8e\x5c\x46\xab\x08\x22\xd9\xb5\x9a\xc3\x3b\x68\x45\xb7\x9d\xcd\xd8\x60\x41\x87\x2d\x9e\x6b\xc1\x12\xb5\x2f\x55\xd3\x06\xaf\xac\xe9\x20\x8a\xeb\x96\x78\x78\xf7\xa8\x66\xcf\xa8\x58\x4d\x94\x1b\xba\x4e\xac\x1e\x4f\xad\xce\x4e\x0d\x63\x3a\xf0\xc6\xaf\x19\xe2\x11\x1a\xf3\xc4\x35\xc7\xcd\xd8\x64\x94\x07\x11\x6d\xf7\x37\xb2\xa6\x79\xd8\xd2\x2b\xb3\x3e\x4e\x3f\xa2\x58\xb5\x17\xe3\xf4\x1e\x0a\xad\xb9\xb8\x26\xcb\xa3\x94\x48\x34\x2a\x71\xbb\xa0\x61\x8e\x7d\xed\x0b\x33\x54\xa5\x68\x54\x5d\x62\x42\xaf\x46\xa3\x7b\x4f\xdd\x77\x27\x88\x62\xd7\xac\x88\xd6\x27\xa7\xd5\x1d\xa7\x61\x6a\x04\x6f\x69\xa4\x6e\x36\x81\xca\x57\x58\xe7\x8f\xbe\x7e\x1f\xcd\x7e\x1d\xbe\x50\x0f\xe3\x12\xaa\xbb\x74\xd4\x56\x68\x48\x9b\x8d\x38\xb8\xbc\x48\x81\xd3\x26\x6a\x2a\x2c\x17\xcd\xdd\x78\x53\x09\x06\x80\x4e\x05\x4e\xe0\xe9\x97\x51\xb3\x10\x9f\x23\xf2\x86\x02\xc3\xa2\x66\x1a\xdc\xc3\x46\x6b\xdf\x65\x43\xe7\xf3\x6d\x58\xb5\x3e\xdc\x20\xd4\xc9\x20\xf1\xf4\xa0\xbf\x9c\x0c\x92\x43\x62\xc5\xb6\xf1\x1a\x13\x2b\x9e\xa7\x8a\xcc\x3e\x60\x2f\x07\x54\xfc\x01\x15\xbf\x8e\x8a\x77\x77\xd2\x1b\x14\x5f\x23\xe2\x8d\xbc\x05\x43\x9c\xdf\x6b\x45\x34\xac\x78\x50\x2d\x39\x4e\xaf\x2f\x51\x22\x08\x34\x82\xc1\x99\x9c\x22\x74\xe9\x5b\x40\xa4\x6d\xd7\x57\xe8\x57\xe3\x43\x08\x8c\x18\x61\xa5\x48\x5e\xa8\xb0\xe7\x7d\x00\xc5\xb7\xc6\x01\x14\xff\x12\x40\xf1\x51\x11\x93\x5f\x2a\x62\x61\x01\xe5\x45\x99\x63\x36\xd1\x12\x04\xdf\x67\x9d\xac\x38\xc7\x3a\x3c\x49\x3b\xf4\x9d\xab\x38\x0a\xf7\x04\xc0\x30\x9c\x79\x97\xd2\x2d\x19\xfd\xa5\x24\x75\x24\xaa\x32\x54\xf6\x0c\x82\x85\x39\x44\x3d\x57\x63\x7e\x45\x91\x2c\x09\x2f\x48\xa7\xfc\xa2\xd9\x40\x5f\xcb\xda\xdd\x0c\x10\x22\x88\xf1\xfa\x18\x7c\x75\x83\x46\xa9\x70\x3d\x4d\x63\x8c\x5e\xf3\xf4\xd8\x77\xe1\xb5\x05\xdb\xf6\xf3\x82\xa3\xd7\x37\xfa\x9c\x65\xfc\xd1\x20\x2e\x9a\x66\x93\x7e\x33\x7a\x8f\x03\x24\x35\xe8\xc6\x39\x15\x82\x0b\x0b\x2a\xa6\x2c\xf8\x01\x42\x1a\x2a\x9d\x2f\x14\x11\xc6\xe1\x69\xf2\xce\xa6\xe8\xd6\xdb\x4b\xd0\x60\x3b\x8a\x23\xcc\x4c\x69\x5e\xfd\xdf\xae\x64\x4d\xc0\x3d\x75\x7a\xc4\x3d\x59\xe0\x25\xe5\xa5\x80\x99\xfa\xdb\x62\x47\x96\xe0\x91\x36\x1c\x56\xbc\xac\x80\x78\x65\x40\x45\xc6\xea\x5e\xc9\xb5\x63\xf2\x95\x55\x9f\x6a\x92\xe0\xe0\x4f\xb9\xc3\x8a\x4c\xc8\x57\xea\xdd\xc5\xa8\x3b\xbd\xea\x21\x58\xa0\xed\xb3\x73\xcc\xa5\x2c\xb4\x51\xf2\xc5\xb3\x92\x75\x9b\x4f\x36\x69\x85\xba\x57\x96\xb7\x40\xac\xcf\xb9\xe2\x5c\x25\x3e\x4e\x51\xe6\x3a\xa5\x99\xc6\x05\xae\x90\xe7\xf3\x3a\x58\x42\x4a\x74\x98\xfd\xb8\xf6\x41\x3b\x1c\xfc\x3a\xdb\xc6\xc1\xaf\x53\x8d\x17\xe0\xd7\xa9\xd2\xec\x32\x9a\xac\x2e\xcf\x63\x78\x07\x6c\xde\xa3\x21\x89\x7e\xc0\xd2\x1b\x4c\x77\x85\x19\x9e\x43\x10\x0a\xbd\xb9\xbd\xfe\xe1\xea\xad\x7e\x5e\x10\x98\xbb\x3c\xf7\x55\x65\x7a\x32\xf7\x6e\x9b\x7b\xf0\x69\x1f\x25\xf7\x51\xf7\x24\x22\x59\x4b\xcf\x72\x16\x7b\x69\x52\x80\x2a\x2b\xe4\xda\x3b\x94\xbc\xde\xb4\xcf\x24\xba\xb9\x9e\xc1\xbe\xea\x72\x47\xac\x2e\xf3\xf4\xe1\xa9\xb6\xa7\x81\x88\xda\xbc\x07\x63\xc0\x99\x5b\x01\x98\x9d\x7b\x25\xb0\x22\xf3\xd5\x39\x29\x32\xbe\xd2\x97\xe2\xba\x01\xcd\x32\x7f\x7a\x4f\xb6\x9a\xe7\xe2\x1e\x27\x48\x94\x19\x34\xd1\x48\xd7\x7a\xed\x32\x42\xd2\x5a\x42\x50\x26\x15\x86\xc6\xa9\xe6\xbb\x07\x28\x8f\x54\x1c\xc6\xa8\x08\x13\x33\xbf\xc1\xbf\x68\xb7\xe0\xff\x34\x5c\x6a\x73\xac\x82\x00\x5f\xbb\xed\x5e\x8f\x87\xdd\x8e\x04\xd8\xb6\x9f\x04\x70\x8d\x9b\x32\xd3\xe2\x39\x4b\x65\xb3\xb4\x88\xd5\xd8\xed\x49\x8f\x79\x29\x18\x15\x86\x0b\xe9\x95\x9d\xa0\xfb\x52\x2b\xfc\x44\xb6\xb0\x07\x8d\x2f\x18\x43\xf1\x9e\x97\x0a\x3d\x2e\x0c\xbe\x5e\x93\x45\xb8\x28\x32\x4a\x20\xb4\xc0\x85\x85\xa0\xef\x62\xa3\xf7\x10\xda\xce\xda\x76\xd2\x53\xc7\xeb\xa5\x13\xb4\x24\xe2\x7e\xfb\xd6\xee\xa6\x72\xe2\x82\x02\xde\x69\xa4\x7e\xda\xba\x10\xa7\xd7\x97\xe6\xb3\x2e\xff\xa2\xe9\x36\x73\xbf\x1c\xc9\xea\xe0\xfe\xd8\x73\x77\x0d\xc1\x4d\x36\xb0\x71\xd1\xd7\xbd\xd9\x4e\xaf\x2f\x47\xd2\x9c\x9b\xc9\x41\x5b\xb3\xda\x4d\xaf\xad\x75\x6c\xea\x54\xd5\x3d\xc7\xf1\x5c\x7f\xef\x58\xb3\x82\xb3\x6a\x99\x84\x95\x39\x81\x86\x69\xf5\x84\x11\x65\xf0\x2d\xa7\xd7\x97\x3b\xb5\x4d\xac\x7c\xff\x59\xc6\x1f\xc7\x2a\x80\xbb\x42\xed\x77\x82\xd6\xef\x28\x91\x19\x67\x37\x76\x13\x7e\xbe\xf9\xe8\x73\xa5\x3e\xb5\x29\xd8\xf6\x4c\x44\xe9\xed\x2e\xb0\x50\x74\x34\x72\xb4\x14\x99\x03\x0a\x9a\x7a\xa2\x36\x99\x7a\x81\x97\xa4\x6e\x8c\x35\x45\xe8\x9b\xb1\x72\x5d\xdf\x23\x7b\x34\x86\x5f\x41\x7b\x46\xd3\xd8\x0e\xcd\xca\x2c\x3b\x41\x33\xca\xb0\x16\x49\x64\xec\x91\x37\x01\x56\xb7\x94\x25\x44\xef\xe1\xc4\xdd\x24\x04\x7b\x60\xdd\x35\x23\x29\x56\xec\x0d\x92\x98\x00\x11\x4d\xb2\x14\x9a\x56\xc3\x74\x35\x23\x4b\xc0\xc9\x3d\x3e\xdd\xf4\x2c\x2b\xa5\x22\xe2\x86\x6b\xd1\xdc\xc8\x36\x83\xf6\x1e\xb8\xf9\xeb\x1f\x28\x4b\x77\x48\xe5\xbc\x01\x61\x9f\x60\x86\x08\x85\xa0\x87\x9e\xde\x4a\xb3\x6b\xfd\x76\xea\x07\xf5\x46\x96\xa3\x73\xef\xb0\x44\x47\x05\x4f\xe5\x91\x66\xf9\x47\x26\x9c\x28\x8f\xde\xea\xff\xeb\xee\xed\x48\x8a\x90\x6a\x65\xe6\x00\xd4\xdf\xe1\x82\x1e\xbd\x3d\x41\x70\x09\x00\xc0\xc7\xd5\xe2\xf5\xbd\x56\xb7\x13\xe0\x77\xf3\x78\xab\x37\xcd\xcf\xc3\x4b\x65\x15\x02\x4e\xcb\xda\xd1\xfd\x33\x33\x2a\xe1\x81\x9b\xc8\x88\xeb\x5b\xb4\x26\x78\x11\x3a\x1d\xeb\xa9\x27\x79\xa1\x20\x4e\x8f\x72\x82\x1d\x60\x98\x2c\x89\x58\xa9\x85\x6d\x16\xf2\x6a\x99\x6c\xf5\x2a\x02\x8e\xcc\x32\x56\xb7\xf1\x15\xc9\xd1\xc2\x9a\xca\x9e\xe3\x71\xd4\x4f\xb3\x6c\x77\x57\x24\x86\x0f\x39\x91\xff\xea\x4e\x05\x74\x33\x8f\x13\xf9\xa2\x3f\xd7\x3e\x0d\xf3\x23\x23\xba\x34\x3b\x1c\x3b\x61\x8e\x4e\x3f\x7e\xb4\x48\x15\xb3\x8f\x3f\x51\x96\x1a\x5b\xea\x54\x29\x41\xef\x4b\x45\x6e\x88\x5e\x12\xa8\x3f\x63\x4f\xc6\x6a\x65\xae\x88\x8c\x3d\xfa\x29\x82\x89\x7a\x9f\xf5\x83\x9e\xdb\x6b\x3a\xe7\x75\xb3\x6e\x9c\x39\xb6\x91\xb4\xb3\x5c\xfb\xc9\x0c\x7c\xd8\x9a\xbe\x57\x3c\xed\x63\x02\x9d\x0a\x66\xf5\x9f\x5a\x25\x78\xd5\xf0\xb6\x5a\x4a\xd6\x84\x5b\x15\x3d\x1c\x60\x68\xf3\x37\x6e\xf4\xa6\x39\xd4\xfe\x36\x90\x16\x8d\xdf\xdc\xad\x0a\x13\x8d\x45\x18\xcd\x32\xdc\x7f\x14\xd5\x45\x03\x1e\x6e\x14\xf0\xb3\xdb\x2f\x6e\x41\x12\xd1\x3e\x2d\x69\x8b\x3d\x36\x64\x81\x4d\x06\x7b\xde\x4d\x36\xb5\x01\xdc\x66\x82\x55\x44\x37\xdd\xa0\xed\xf0\x2e\x35\x10\x18\xd8\xb4\xfb\x77\xb6\x8f\x1f\x6e\xdc\x00\x70\xbf\xf3\x99\xbb\x09\x1b\x6f\x34\x64\x9e\xcc\xb8\x80\xfd\x6e\x5e\x9b\xc1\x15\xf4\x5e\xdf\x07\xb2\x7a\xe4\x22\xed\xd9\x1b\xaf\xbb\x36\xf0\x4d\x19\xbe\x27\xd9\xb6\x27\x72\x85\x0b\xbd\x01\x75\x86\xb0\xe1\x98\x36\x13\xcc\xd8\xa5\xa6\xb4\x86\xcb\x5b\xe4\x62\x8e\x19\xfd\xaf\xbe\x93\x87\xa2\x04\xfa\x55\x73\x41\xff\x8b\xa0\x37\x06\x73\x60\xbc\x59\x19\x49\xd4\x5b\x7b\x0f\x7b\x38\xdf\xe0\x35\xc5\x69\x4a\x8d\x66\x75\x3d\x78\xb7\x86\x36\x83\xb2\x87\xb8\x7b\xbe\xf1\x49\x6d\xbb\xff\x43\xd0\xb0\xad\xfc\xb8\x14\x1b\xf3\x2b\x06\x3e\x9b\x63\x6a\xa4\x58\x5f\x07\xb2\x7d\xec\x01\xc9\x31\xf5\x59\x88\x19\x9e\x3b\x98\x63\x55\x0a\xaa\x7a\x44\xce\xd0\x87\x28\xfb\xa9\xbc\x27\x16\x43\xb6\xd3\x47\x19\x24\x61\x9d\x5e\x5f\xc6\xda\xf4\xd6\xcb\x05\xff\x92\x9d\x96\x56\x75\x50\xc9\x70\x7e\x4f\xe7\x25\x2f\x65\xb6\x6a\x38\xee\x11\x06\x75\x63\x8a\xd0\x65\xbf\x19\x9d\x72\x22\xd9\xb1\x42\x98\x71\xb6\xca\xed\xc7\x59\x92\x95\x29\x69\x7d\x0b\xa0\x3d\x96\x9c\xa6\x08\x97\x8a\xe7\x58\xd1\x04\x25\xdc\xfc\x6e\x3b\xf5\x52\x12\x84\x37\xd0\x4b\x4a\xa9\x78\x8e\x72\x2c\xe4\x02\x67\x59\xff\xb9\x07\x49\xb2\x4d\x9e\xa8\x09\xec\x4d\xef\x2f\x96\x66\x96\x1e\xb7\x1b\xbe\xcc\xfb\x76\xeb\x09\x79\x7f\x78\xb9\xe9\x9e\x6e\xfd\xbc\x2d\x6c\xdd\xd3\xcc\x66\x70\xe3\x87\xf7\x62\xf3\x4b\xdd\xb2\x92\x8d\x7c\x6e\xe0\x73\x82\x14\x19\xee\x35\x0d\x07\xea\x4c\x6a\x89\x0e\x6a\x3d\x67\xa4\xa2\x30\x45\xb7\xc6\x5f\x96\x63\x95\x2c\x36\x84\x6e\xfe\x33\x27\x0a\xa7\x58\xe1\xa9\x56\x87\xff\xd3\xba\x9a\xac\x67\x94\x67\xa9\x26\xbd\x49\xd0\xf5\xce\xdf\x08\x49\xde\x73\x02\xad\xf9\x7f\xd4\x72\xbd\xfa\x63\x50\x4b\x20\xe1\xb3\xe9\x84\xdd\x51\xc0\x0e\x1f\x22\x6c\xc2\xc5\x57\xad\x7d\x0e\x04\xd7\x5a\x73\xec\x7e\xa4\x6d\xe3\x65\xed\x15\xd8\x97\x9b\x93\x81\x84\x00\x93\xd6\x5a\xff\x1d\xf8\x05\x4f\x3f\x9d\x6f\xf2\x61\x6c\xb3\x9a\x06\xad\xa4\xb6\x9f\x7f\x60\xba\xce\x43\x6b\x7f\x33\xd8\x81\xbd\x72\xef\xbb\xfc\x7d\x28\x2e\x64\x6a\x18\x81\xef\x88\x08\xec\x88\xd8\x03\x95\x2e\x61\x76\x23\xd1\x5a\x57\xdb\xb4\x71\x23\xe2\x31\xdb\xa2\x30\x43\x75\x52\x26\xd5\xc4\x37\xfc\xc1\x98\x80\xcc\x96\x5a\x26\xad\xe3\x30\x05\x99\x4c\x85\x2a\x38\x17\xc8\x27\x76\x5e\xb3\xea\x28\xac\x6b\x66\xd0\x46\x1d\x0e\x67\x8d\x32\x8d\xdd\xe2\x47\x4f\xbf\x3a\xe6\x66\xa1\x54\xbd\x86\x63\x69\xd3\xb6\x39\x93\x0b\x5a\x6c\x03\x29\x55\x71\x01\x7b\xfa\xe8\x0b\xce\x68\x5a\x91\x37\xef\xe3\x92\x9d\xa0\x4f\x5c\xe9\x7f\x2e\xbe\x52\xb9\xc5\x43\xa1\xef\xd2\x39\x27\xf2\x13\x57\xf0\xd7\xc1\x9b\x63\xa6\x36\x7a\x6b\xac\xcd\x61\x5c\xa9\xf0\x72\x1b\x96\x89\x5b\xe6\xe5\xf6\x34\x88\x6a\x8b\xa9\x44\x97\x0c\x71\xe1\xf6\xa0\x2a\x92\x26\x2d\x79\x97\x09\xcc\x38\x9b\x80\xd3\x74\xd8\x23\x73\x69\x59\x7b\x83\xbe\xd9\x56\xfd\x1d\xcd\x9d\x6b\x7e\xd5\xf0\x96\xb7\xa6\x61\xa6\x60\x8a\x50\x98\xdf\x50\xe9\x44\x52\x8a\xd2\x12\x36\x02\x3b\xcf\x09\x4d\x06\x49\xe7\x44\xcc\x21\xb4\x92\x0c\x3a\xe7\xc7\x79\x97\x46\xf8\x94\xb6\xdc\x08\x10\x08\x1f\x37\x58\xa4\xa8\x57\x7c\x98\xbf\x36\x2c\x36\x37\x66\xea\x7f\x6b\x8e\x09\xfb\xfa\x3f\x50\x4b\x50\x4e\xd1\x29\x92\x94\xcd\x37\xb6\x02\x68\x7e\xc2\x86\x9b\x9a\xc4\x35\x5d\x2a\x91\x66\x80\x4b\x9c\x69\x8e\x0e\x88\xe6\x2d\xe9\xfe\x7c\xb6\x26\xe0\x4e\x6c\x75\x3f\xcd\x8d\xaa\x98\xd3\xd1\x03\x59\x1d\x9d\xb4\x2e\xcd\x06\x8a\xfa\x8f\x2f\xd9\xd1\x49\x55\x3b\xa3\x75\x4f\x2b\xd1\x01\x41\xac\x23\xf8\xdd\xd1\x74\x4d\x26\x6e\xa0\x3d\x4a\x52\x0e\x08\x88\xb1\xd6\x37\x1a\xbe\x05\x1b\x35\xd3\xd6\xc9\x7f\xb6\xfb\xe4\x4c\x04\x38\xfd\x47\x81\x8b\x82\x08\x84\x05\x2f\xc1\x99\x90\x2f\x89\x98\xba\x3f\x01\x60\x43\x9f\x87\xd1\xf9\xc5\x12\x2e\x04\x49\x94\x33\x2f\xf4\x2b\x52\xdc\x96\xf8\x61\x29\xd4\xd1\xd9\x49\x4f\x7b\x24\xf7\x0b\xce\x1f\xa0\x7e\x00\xec\xcc\x93\xd8\x77\x7f\x32\xdf\x72\x5e\xff\xcc\xa9\xe8\x12\xa5\x44\x61\x9a\x01\xb2\xe3\xf3\xc7\x2b\x8b\xfd\x70\x62\xbc\xf7\x68\xec\x9c\xfb\xee\x48\x90\x5d\x85\x53\x8b\x74\xba\x21\x4b\x4a\x1e\xed\x99\xf4\x7d\xcd\x04\xcd\x09\x03\xb0\xc0\x06\x50\xd0\x04\x49\x9a\x92\x0b\x28\x6c\xd3\x4f\xc0\xd3\xe1\xb8\x61\x8e\xc3\x77\x78\x88\x25\x6e\x61\x87\x5b\x85\xa3\x8b\x29\x88\x6b\x2e\x36\x16\x5e\x1f\x53\xa3\x66\x4c\xfd\x19\x9b\xff\xf0\x01\x7d\xf7\xdd\x6f\x36\xfc\x49\x8e\xbf\xd2\xbc\xcc\x3f\xa0\xdf\xfd\xf6\xb7\xbf\xf9\xed\xa6\x3f\xa2\xcc\xfc\xd1\xb7\x9b\xd6\x64\x5f\xf8\xd9\xcd\xf9\x1e\xf7\x36\xad\x50\x78\x43\x41\x8a\xad\x64\x66\x98\x66\xa5\xb0\x00\x54\x6f\x2a\xcd\x1b\xef\x4d\x04\x44\xcd\xf0\x44\x3a\x2e\xdd\xea\xef\xc1\xe7\x5d\x65\x8f\x81\x60\x71\x2e\x6f\x63\xd9\x1a\x14\x9a\xef\xcc\x0c\xcf\xb8\xdd\x68\xb6\xf6\x4c\x6e\xcd\x9a\x32\x86\x21\xfc\xec\x97\x92\x88\x15\xe4\x10\x55\xea\xed\xc6\x7b\xd0\xc0\x47\xdd\xd5\xa5\xa6\xdc\xba\xac\x74\x37\x85\x42\xdb\x82\x7a\xb3\x29\x55\x89\x49\x74\xca\x6c\x0c\xbd\x33\x57\xa0\x45\x20\x7a\x5e\x79\xb2\xd1\xe9\x46\x8a\xac\xcc\xb2\x4d\x24\x18\xdf\xec\x0b\x6f\xee\xfe\xa0\xe1\x36\xc6\xb6\x1a\x67\xbc\x9b\xe1\x6d\xc2\x0f\x6a\x86\x2d\xf3\x7e\x67\x43\xbe\xb9\x19\x11\xd4\x54\x4f\xd3\x7e\x90\x66\x17\xbf\xb7\x83\x81\xbf\x95\x2e\xa9\xaa\x3d\x0f\x9b\xf9\xcd\x6d\x1a\x01\xbe\x1c\x07\xbc\xdc\x5e\x20\x75\xab\xf9\x6f\xc6\x78\x54\xe6\xa8\xb2\xa6\x1e\x0e\x81\xad\x34\x91\x07\xca\x75\x14\x3e\x62\x8c\x8b\xa0\x67\x59\x63\x1d\x05\x23\x16\x06\xb5\x7b\x77\x72\x17\x8c\x20\x6a\x2d\xdf\x5d\x9c\x06\x76\x36\xe3\xb7\x6e\xbb\x03\xc1\x8c\x9d\xdd\x08\x23\xd6\xd7\x63\xec\x0f\x3a\x13\x46\x90\x5c\x77\x37\x0c\xba\x14\x46\x50\xdc\xe4\x74\xd8\xec\x58\x18\xf3\x0e\x46\xb8\x1e\xc6\xba\x17\xcc\xd8\x05\xc2\x32\x1a\xbe\x32\xea\x1e\x6d\x75\x3b\x98\xe1\xe9\x7c\x18\x9c\xa5\x73\x4c\xec\xec\x82\xd8\xe2\xb3\x6c\xb8\x27\xc6\x3a\x22\x06\x29\xf6\x38\x29\x46\xba\x23\x86\xbd\x70\x83\xae\x8a\x5d\xa4\xfe\x56\x71\xb6\x8b\x83\xa2\x49\x78\xe0\xee\x08\x42\xd9\x92\x9b\xe6\x90\x3b\xa8\xde\x37\x6b\x1f\xeb\x68\xe0\x8f\x20\x97\xac\x0a\x3e\xa8\x7c\x1b\xe1\x5f\x99\xae\x48\x5b\xef\xa8\x94\xdb\x1c\xfd\x43\x6b\x1a\x4a\xa2\x09\x36\xcc\xda\xfb\x50\x66\xe4\x4f\x54\x2d\x3e\xbb\x36\xb7\xf6\x25\xa9\xb2\xc8\x60\xe9\x8d\x5f\x0c\x17\xaf\xbb\xa9\xf5\xfc\x4b\x65\x98\x52\xc2\xf3\x9c\xb0\xd4\xa0\x51\x72\xfc\x40\x90\x2c\x05\xb1\x90\xc1\x2c\x33\x56\x8e\xfe\xa2\x01\xb2\xe4\x6b\x81\x99\x51\x6b\xf5\x4d\x5c\x6a\x69\xb8\xf9\x26\x8e\xba\x87\xe3\x74\x9c\x91\x19\x27\xc3\x99\x26\x55\x6a\x45\x27\x57\x64\x0b\xd7\xbc\x27\x19\x07\xdf\xd7\x14\x1d\x7f\x73\x6c\x61\xc0\x96\x10\x88\x22\xfb\x53\xab\x6f\x9c\x8c\xa8\x28\x93\x11\x36\xaf\xcb\xc4\xca\x8c\x26\xa4\x92\x3a\x9c\x91\x29\xba\xb1\x8a\xe6\x18\xbd\x75\xbb\x80\x18\x25\x1c\x46\x2a\x18\x75\x61\xa0\x1d\xcf\xc2\x7d\xaa\x79\x1a\x4b\xf7\xb3\xf0\xf3\x70\xa4\xfe\xf1\x4e\xa4\x6a\x8a\xbd\xcb\x81\xb4\x59\x4c\x2d\xc5\xaa\xd3\xa8\x58\xe8\x96\x49\x02\x83\x4d\xb0\xd0\x62\x0e\xfc\xa9\x13\x74\x76\x73\x71\x7a\x77\x71\x82\x7e\xbe\x3e\x87\x7f\xcf\x2f\x3e\x5e\xe8\x7f\xcf\x3e\x7f\xfa\x74\x71\x76\xb7\x5d\x47\xfb\xc6\x34\xbc\xcd\x32\x73\x1e\x5a\x2e\xf3\x16\xe7\x83\x4c\xa9\x59\xa9\x34\x03\x1b\x3b\xd1\xd6\xfa\x34\xcf\x83\xcf\xa6\x24\xdd\x74\x63\xec\x9d\xd8\x46\xf6\x15\xde\x98\x91\xd9\x00\xad\x0b\x73\xb4\x2d\x0d\xa0\x46\x79\x6f\x99\x64\x13\xfe\xff\x17\x86\x7e\xe4\x02\x91\xaf\x38\x2f\x32\xf2\x01\x1d\x17\x3c\x95\xc7\x36\x01\x43\xff\xf7\xd4\xfc\xe8\x5d\xc6\xe7\xdb\x8a\x8f\xb9\xac\x0d\x82\x32\x3e\x47\xb2\xbc\xaf\xb2\x76\x40\x69\x00\x5a\xdf\x38\xda\xad\xcc\x81\x6d\x86\x9b\x4b\xd9\x69\xd0\xac\x26\xd6\xa2\xd8\xfc\x83\xed\xf7\xc6\xcd\xe9\x9d\x4c\x70\x46\x5a\x74\xf4\x0f\xba\x5f\xf7\xcd\xbb\x6f\xc6\x6d\x41\x6b\x6d\x4e\x17\xa5\xa2\x43\xef\x2f\x4c\xdf\xfb\x47\x9a\xa5\x09\x16\xdb\x32\xfa\xbb\x4f\x03\x24\xbf\x41\x80\x43\x4a\x87\xe9\x83\xc4\x40\xa3\x18\xbb\x03\xb6\x54\x0f\x5f\x12\x91\xe1\xc2\xe0\xb8\x09\x4e\x6c\xcd\x7f\x98\xe0\x39\x29\x08\xe4\x86\x99\x56\x1d\xdb\x6e\x16\x61\x49\xc6\x25\xfc\x39\x28\x1d\x27\xad\x25\xdb\x76\x7f\xb6\x5f\xd5\xc8\x54\x9e\xea\x11\x0f\xd7\xe7\xd8\xc7\x2b\x06\x98\xf0\x0e\x2f\xd8\xc0\x8a\xdb\x6e\xed\x46\x79\xb3\x2a\x45\x03\x7c\x1c\xa3\x5c\x0c\xc0\x43\x8f\x6c\x26\xdf\xd1\x09\x3a\xaa\xaa\x31\xa5\xd6\x08\x3a\xfa\xe6\xa8\xfe\x83\x91\xef\x17\xdb\x24\xc9\xc4\x7c\x6c\x02\x73\x6c\x66\xca\xc2\x65\x03\x03\x6e\xab\x1f\xb0\x5a\x54\x5d\x15\x4e\xeb\x1d\xd6\x87\x0c\xf3\x6f\x7f\xcd\xb6\xfb\xd0\x5c\xe2\xda\x8c\xeb\x34\xca\xce\x6c\xb7\xad\xdc\xc2\xe5\xaa\xd9\xea\x6d\x6b\x10\x57\x50\x0a\xc2\xa4\x74\xda\x23\x13\x8d\x94\x9c\x6d\x73\xbe\x6d\x3d\x02\x07\xcd\x6b\x95\xb6\xa3\x02\x15\x58\x68\xdb\xd8\xfd\xe5\x36\xa2\x8d\x56\xef\x47\xdf\x6c\x29\x8a\xb3\xf5\x42\x37\x22\x98\xde\xf1\x1e\x85\xc5\x9c\xa8\xa1\xd0\x20\x66\xab\xcf\x1b\x6b\xd7\x4e\x46\x45\x0e\x27\x63\x1e\xe7\xd7\x49\x5d\x17\x74\x42\x99\x9a\x70\x31\x31\x1f\xf8\x80\x94\xd8\xd0\x16\x48\xd1\x9c\xf0\x52\xdd\x92\x84\xb3\xbe\x34\x07\xfb\x57\x51\xa2\x9b\xa3\xf3\x40\x6c\x30\xfd\xd4\xa9\x58\x2e\x19\xa4\x19\x11\xab\x6d\xed\x81\x60\xb9\x19\xad\x8a\x4d\x9f\x3f\x5e\xf9\x1e\x35\x82\x0c\xfa\xcd\x27\xf9\xc5\x4a\x27\x36\xaf\x66\x6e\x57\xb2\xf1\x23\x57\xa5\xda\xed\x03\x67\x55\xe0\x76\xe8\x2f\xed\x96\x0c\xd5\x97\xd9\xb0\x5a\xa9\xb0\x2a\x3b\xf7\xa0\x75\x36\x96\xab\xde\x9a\x0c\x33\x6b\x5d\xdd\xc2\xa7\x9a\xce\xef\x66\xbd\x0d\x50\xd0\x3b\xd3\x30\x8d\x30\xe0\x53\x00\xec\x2d\x78\x3a\x45\x96\x4c\x8e\x57\x48\x09\x4c\x8d\x73\x00\x27\xaa\x84\x44\x75\xac\x2c\x08\xd8\xd6\xca\xfa\xa7\xf5\xe5\xf4\x18\xfd\x9b\x0d\xfd\x84\x08\x25\x3f\x62\xa9\x7e\x2e\x52\xdc\x9b\xe0\xd4\x01\xf2\x4a\x05\xcf\xc5\x98\x2d\x8f\x8c\xa4\x9a\xa9\xdb\x8d\x30\xd4\xd0\xa3\xe6\x98\xa5\xa1\xb7\x46\x6e\xf0\x82\xb9\xe7\xa3\x3f\x3a\xd1\x5f\xd3\x37\xdb\x1b\xae\x77\xe1\xb4\x87\xd5\xb4\x31\xd3\xdb\x66\xa9\x25\x99\x00\x5a\x88\x91\xaf\xeb\x5e\x92\xb0\x99\x72\x96\x6e\x02\xda\xb4\x77\xd4\xea\xf2\xf5\x07\x4e\x10\x46\x0b\x2a\x15\x17\x36\x0c\x00\x9d\xe4\x05\x66\x92\xf6\x67\x81\x86\x03\x77\xce\xaa\x2f\xd7\x16\x02\xc1\x55\xc7\x5b\x7b\x3b\xa1\x21\xac\x20\x09\x17\x69\x35\xa5\x7e\xee\x56\x4f\xd3\xaa\x8d\xfd\x6f\xa5\xe7\xc3\x81\xe9\x39\x19\x96\xea\xae\xfa\x76\x7d\xf8\xa3\xb8\x6c\xfb\x42\xdb\xe5\xd6\xab\x70\x35\x13\x38\x73\xbf\xdc\xec\x71\xe3\x08\x33\xa3\x3e\xfb\xf3\xd6\x6d\xd7\xaa\x5e\xab\x79\xaf\x1e\xeb\x7c\xac\xde\x66\x63\xc9\x4f\x3d\xe3\x9c\x48\x89\xe7\xe3\xa6\x7a\x6a\x8a\x3b\xa3\xaa\xb8\xb3\xfd\x30\xa2\x2c\xa5\x09\x48\x8a\x0a\x4d\xd6\xc7\x55\xeb\xf1\xb8\x58\x6d\xbe\x82\x5a\x96\xba\xfc\xe8\xea\xf1\x79\x1f\x5d\xb1\xc0\x72\xdc\xf2\xaa\xb7\xe6\xdc\x17\x63\x1f\xc8\xa8\x79\x08\x82\xe5\xe6\x5c\x9a\xce\x3e\xdf\x0b\x4a\x66\xe8\x0c\xe7\x24\x3b\xc3\xf2\x39\x36\x1a\x38\xc7\x14\x91\xe9\x7c\x8a\x8e\x6f\x1a\xd1\x95\x4f\x5c\x5d\x6d\xee\x98\x33\x98\x32\xba\xfd\xdd\x87\xbd\xf8\x7e\x5c\xfb\xc6\xb7\x1e\x24\x36\xb6\xbd\xec\xa0\x37\x1d\x34\xb3\x8d\x2f\x38\xec\xed\xea\xab\xd3\x27\x0c\x02\x5f\xed\x50\xd2\x58\xff\x4b\x6d\xbf\xd1\x52\x80\x41\x96\xf8\xbd\xd5\xc1\x84\xaf\xfe\xf7\x19\xf8\x32\x43\xb6\x71\xe7\x37\x39\xb8\xbc\xea\xe3\xb7\x3d\x4a\xf4\xda\x4a\xef\x5a\x1a\x30\x78\xa0\x9a\x80\x26\xa8\x04\xae\xe7\x78\x76\xfb\x25\x8e\xda\xf3\xdc\x19\x99\xf6\xe0\x7a\x7f\xc7\x36\x82\x8a\x37\xc9\xe4\x90\x0c\xcf\x14\xfc\x79\xfa\x5c\x9f\x27\xa0\x7a\xee\xbe\xcf\x1a\x34\xd6\x74\xb5\xa7\x3d\xb3\x0d\x71\xed\xdf\x0c\x3a\xcc\xeb\xfb\xf0\x46\x71\x54\x08\xb2\x04\xb0\x1b\x03\x2c\xbb\x56\xde\xa5\x7e\x10\x6f\x37\x6b\x66\x63\x62\xa1\xdb\xe1\x65\x9b\xcf\xdf\xfd\x7e\xc3\x2d\x70\xbf\xde\xa2\x40\x0e\x1d\xae\x19\xe3\xe2\xb5\x83\xa9\xbc\x66\x8c\xf4\x72\x0e\xa5\xf5\xee\x44\x68\x8b\xfa\xb7\x13\xad\x3e\xe3\xbc\x3b\x3a\xc5\x4e\xf5\x07\x6e\x80\xf1\x9a\xf8\x49\xa2\xf9\x6a\x82\x25\xf8\x0a\xe1\xc7\x86\xd1\x6c\xf3\x71\x37\x6d\xf5\x9b\x2e\xa7\x83\x8c\xaa\xf6\x9d\x8f\xb1\xdc\xb2\xa4\x71\xce\x60\x4b\x9a\xf5\x48\x5a\x7b\xcc\x13\xdf\x72\x89\x9e\xaa\x04\x83\x19\xc3\xb7\xce\xf7\xbe\x6d\x63\x09\xa1\x37\x6d\x7b\x6d\x8e\x81\xdb\x15\x3d\x71\x5f\x12\xb1\x24\x69\xc3\x0f\x6b\x4b\x66\x37\x7f\xd2\x70\x97\x3b\xba\x76\xeb\xd1\x7f\xff\xcf\x3f\xfd\xbf\x00\x00\x00\xff\xff\xa9\x64\x25\x94\x00\xdd\x0a\x00") +var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\xfb\x73\xe3\x36\x96\x30\xfa\xfb\xfc\x15\xa8\x4e\xf6\x93\xbd\x91\xe4\xee\x99\xd9\xb9\x3b\xfe\xe6\x6e\xca\x6b\x3b\x19\xdf\x74\xbb\x55\xb6\xd3\xf9\x52\x49\x36\x03\x91\x47\x12\xd6\x24\xc0\x05\x40\xd9\x9a\xdb\xf7\x7f\xbf\x85\x83\x07\x49\x3d\x6c\x89\x64\xb7\x65\x37\x91\xaa\xb4\x25\x91\x20\x78\x70\x70\xde\x0f\x9a\xb1\x0f\x20\x15\x13\xfc\x98\xd0\x8c\xc1\xbd\x06\x6e\x3e\xa9\xe1\xed\xbf\xab\x21\x13\x47\xf3\x37\x7f\xb8\x65\x3c\x3e\x26\xa7\xb9\xd2\x22\xbd\x02\x25\x72\x19\xc1\x19\x4c\x18\x67\x9a\x09\xfe\x87\x14\x34\x8d\xa9\xa6\xc7\x7f\x20\x84\x72\x2e\x34\x35\x5f\x2b\xf3\x91\x90\x48\x70\x2d\x45\x92\x80\x1c\x4c\x81\x0f\x6f\xf3\x31\x8c\x73\x96\xc4\x20\x71\x72\xff\xe8\xf9\xeb\xe1\x9f\x87\x6f\xfe\x40\x48\x24\x01\x6f\xbf\x61\x29\x28\x4d\xd3\xec\x98\xf0\x3c\x49\xfe\x40\x08\xa7\x29\x1c\x93\x28\xc9\x95\x06\xa9\x40\xce\x59\x04\xee\x7e\x35\x14\x19\x48\xaa\x85\x54\xc3\x48\x48\x10\xe6\x9f\xf4\x0f\x2a\x83\xc8\xac\x62\x2a\x45\x9e\x1d\x93\xb5\xd7\xd8\x79\xfd\x62\xa9\x86\xa9\x90\xcc\x7f\x26\x64\x40\x44\x92\xe2\xdf\x0e\x08\xf6\xf1\xd7\xf6\xf1\x0e\x72\xf8\x7b\xc2\x94\xfe\x61\xf3\x35\x6f\x99\xd2\x78\x5d\x96\xe4\x92\x26\x9b\x5e\x04\x2f\x51\x33\x21\xf5\x65\xb1\x2c\xb3\x8c\x48\xcd\xcb\x7f\xbb\x0b\x19\x9f\xe6\x09\x95\x1b\x66\xfb\x03\x21\x2a\x12\x19\x1c\x13\x9c\x2c\xa3\x11\xc4\x7f\x20\xc4\x3f\xcb\x4e\x3e\x20\x34\x8e\x71\x23\x69\x32\x92\x8c\x6b\x90\xa7\x22\xc9\x53\x1e\x1e\x6e\xae\x89\x41\x45\x92\x65\x1a\x37\xeb\x66\x06\x08\x35\x22\x26\x44\xcf\x80\x9c\x5e\x7f\x08\x97\x12\xf2\xdf\x4a\xf0\x11\xd5\xb3\x63\x32\x34\x1b\x30\x8c\x99\xca\x12\xba\x30\x4b\x28\x5d\x65\x77\xf3\xcc\xfe\x56\xfa\x5e\x2f\xcc\x7a\x95\x96\x8c\x4f\x1f\x7a\xbe\x7b\x89\xed\x96\x30\x2f\xed\x53\xf9\xf1\x1f\x56\xbe\xdf\xf6\xf1\xfe\xf5\xa9\x79\x32\xd1\x33\xaa\x89\x9e\x31\x45\x04\x07\x22\x21\x4b\x68\x04\xea\x81\x05\xad\xb9\xc4\xae\xe8\x6a\xf5\x87\x0d\x4b\x2a\x4f\xa9\xa9\xce\xd5\x30\x9b\x51\xb5\x0a\xe2\xd1\xd2\xb7\x6b\xa6\xb3\x17\xce\xdf\xd0\x24\x9b\xd1\x37\xee\x4b\x15\xcd\x20\xa5\x05\x0e\x88\x0c\xf8\xc9\xe8\xe2\xc3\x9f\xae\x97\x7e\x20\x55\xe8\xac\xc5\x7e\xc2\x94\x01\x15\x52\x10\xe2\x49\x08\xee\xdd\x22\x03\xf2\x8f\xb5\xf7\x5c\x67\x10\xfd\x63\xb8\xb2\x72\x31\xfe\x6f\x88\x74\xe9\x6b\x09\xff\x93\x33\x09\x71\x79\x45\x06\x40\x9e\x2c\x2d\x7d\x6d\xe0\x5f\xfa\x2a\x93\x86\x2c\xe8\xd2\x91\xb7\xa3\x44\x17\x2b\xdf\x2f\xbd\x6d\xcf\x80\xc4\xbd\x63\x6c\x48\x22\x28\xc4\x47\x87\x71\x10\x3b\x38\x5a\x3c\x65\xca\x20\x87\x04\x05\xdc\x12\x49\x44\x21\xee\xde\x69\x48\x0c\x00\x40\x2a\x43\x00\xf2\x24\x36\xb4\x73\x0e\x52\x13\x09\x91\x98\x72\xf6\xcf\x30\x9b\x22\x5a\xe0\x63\x12\xaa\x41\x69\x82\xa7\x96\xd3\x84\xcc\x69\x92\x43\x9f\x50\x1e\x93\x94\x2e\x88\x04\x33\x2f\xc9\x79\x69\x06\xbc\x44\x0d\xc9\x3b\x21\x81\x30\x3e\x11\xc7\x64\xa6\x75\xa6\x8e\x8f\x8e\xa6\x4c\x7b\xaa\x1f\x89\x34\xcd\x39\xd3\x8b\x23\x24\xe0\x6c\x9c\x1b\xc2\x79\x14\xc3\x1c\x92\x23\xc5\xa6\x03\x2a\xa3\x19\xd3\x10\xe9\x5c\xc2\x11\xcd\xd8\x00\x17\xcb\x91\xf2\x0f\xd3\xf8\x2b\xe9\x36\x59\xf5\x96\xc0\xb7\x16\x9d\x89\x27\xb0\x0f\xc2\xda\x90\x57\x8b\x49\xf6\x76\xfb\x2e\x05\x48\xcd\x57\x06\x2a\x57\xe7\xd7\x37\xc4\x2f\xc0\x9d\x4b\x84\x70\x71\xa9\x2a\x80\x6d\x00\xc5\xf8\x04\xa4\xbd\x72\x22\x45\x8a\xb3\x00\x8f\x33\xc1\xb8\xc6\x0f\x51\xc2\x80\x6b\xa2\xf2\x71\xca\xb4\x42\x9c\x03\xa5\xcd\x3e\x0c\xc9\x29\x32\x3d\x32\x06\x92\x67\x31\xd5\x10\x0f\xc9\x05\x27\xa7\x34\x85\xe4\x94\x2a\xf8\xe4\xa0\x36\x10\x55\x03\x03\xbe\xed\x81\x5d\xe6\xd9\xab\x37\xac\x9c\x31\x42\x3c\x2f\xdd\xb8\x3b\x1b\xcf\x30\x89\x21\x4a\xa8\xb4\x42\x01\xd1\x90\x24\xe4\xfd\xdb\x77\x64\x26\xee\x0c\x16\x33\xae\x34\x4d\x12\x3c\x05\x8e\x3f\x5b\x72\x1a\x51\x4e\x52\xca\xe9\x14\x08\xcd\x32\x45\x26\x42\x12\x4a\xa6\x6c\x0e\xdc\x9f\xae\xe1\xb6\x8b\xdf\x44\x24\x88\x25\xee\x6b\x19\x94\xff\xd5\x2d\x70\xe9\x97\x4d\x64\xc3\x8c\x15\x19\xe8\x01\xa8\x9d\x14\xd7\x22\x66\x73\x92\x73\xa5\x65\x8e\x9b\x1d\x93\x5b\x58\x38\x24\x4f\x69\x46\x94\x16\xe6\xcb\x3b\xa6\x67\x84\x96\x11\x9c\x6a\xc4\xe2\x31\x10\x05\x9a\x8c\x17\xc4\x88\x71\x48\x10\xb4\x10\x09\x52\x0b\xbc\x17\x09\x83\x04\x2d\x19\xcc\x81\x50\x39\x66\x5a\x52\xb9\x08\xd8\xb0\x0c\xd0\x47\x80\x8a\x2f\x5b\x12\x1e\x36\x83\x84\x3c\x84\x8b\xc4\x92\x5b\x27\xbb\xc4\x41\xb0\xdc\x02\x7a\xa3\x0b\x87\x6f\x85\x38\xaa\x1c\xbe\x81\x22\x06\xaf\x9c\x7c\x10\xe4\x5a\x7c\x92\x43\xac\x98\x08\x19\x30\xc3\x80\xad\x8c\x84\x63\x30\xe4\x44\x52\x6e\x7e\x58\x8b\xdc\x35\xa0\xf5\x10\xda\x98\x21\xee\xf8\x3a\x1c\x2d\xcf\x4d\xa5\xac\x08\x4c\xe5\xc1\x34\xa4\x1b\x66\x7e\x10\x76\xe1\x6b\xb3\xc0\x39\x8b\xc1\x00\x51\x53\x66\x51\xc7\x9c\x56\x3a\x16\xb9\xb6\xb0\x73\x97\xc4\x64\xce\x28\xa1\xd3\xa9\x84\x29\x22\xf0\xc6\xc7\x3e\x02\x13\x3b\x36\x1f\xd0\x62\x0c\xac\x24\xff\xe0\x15\x86\x0c\x3e\x78\x01\x5f\x77\xcc\xcb\x17\xac\x0a\x8b\xd5\xf1\xd8\x1e\xda\x41\x23\x03\x13\x0f\x5a\x21\x1f\xbc\x78\x9b\xbd\xb5\xe3\x91\x1d\xb6\xa3\xba\xcf\x4b\x0b\x71\xbf\x8e\xcd\xf9\x28\x48\xb3\x21\x07\x78\x61\x41\x7c\xc7\x40\x32\x90\x13\x21\x53\x73\x50\x38\xa1\x24\xb2\xf2\x5b\x20\x3c\x48\x1a\x79\xf4\x10\x38\xc9\xb6\xfb\x6f\xc7\x36\x58\x60\xc7\x80\x64\x54\xcf\x1e\xb9\x6c\xbb\xad\xb2\xa3\x0c\xb4\x47\x2f\x7e\x84\x9a\xad\xcc\x5d\x70\x98\xd6\xe7\x36\x60\x68\x7d\x52\xe4\x39\xdb\xcc\x5a\x41\xb5\x2b\x7a\xf7\x0e\x94\x32\x2c\x1b\xa5\x34\x49\xef\x08\xf0\x48\x18\x62\xf1\xff\x5c\xbf\xbf\xb4\xd3\x0e\xc9\x85\x26\x2c\xcd\x12\x48\x8d\x20\x46\xde\x51\xa9\x66\x34\x01\x89\xdc\xe9\x47\x9e\x56\x3e\x3b\x4c\xcc\x15\xc4\x86\x16\xc5\x90\xd0\x85\x9d\x2c\x86\x48\xc4\x86\x46\x0b\x49\x32\x23\xe0\xa6\x59\xae\x81\x50\xfb\x2b\x3e\x97\xf1\xe9\x3a\x22\xdd\x08\x34\xc4\x48\x22\x29\xd5\xc7\x64\xbc\xd0\x8f\xa1\x3e\x21\xf7\x83\x78\x5b\x1a\x50\x5e\xcc\xe3\x94\xc0\x8e\xad\xe8\x41\x79\xe2\x47\xdf\xd2\x08\xa1\x94\x71\x90\x23\x21\xf5\x36\x44\xcb\x28\x1f\x53\x90\x0f\x5e\xe9\x41\xc6\xb8\xfe\xd3\x1f\x1f\xb8\x32\x86\x2c\x11\x0b\x83\x17\x8f\x9f\x95\x2d\xdf\x67\xeb\x73\xbd\xed\x7c\xdb\x9e\xe5\x2d\xe7\xb3\xc6\xa9\x36\x66\x5a\xa7\x40\xd5\x9a\x88\xb7\xf5\x6e\x41\x09\x7c\x32\xe6\x37\xba\xf0\xd6\x86\x2b\x98\x80\x04\x1e\x39\xda\xf4\x43\x3e\x06\xc9\x41\x83\x2a\x09\xd2\x8b\xcc\x51\x1a\x23\x0b\x2e\xb3\xbb\xa7\xe1\x72\x8f\xc8\x33\xfe\xb2\x47\xa4\x1a\x7f\xd9\x63\xb2\x8d\x1d\xbb\xb0\xcd\xc7\x91\xce\x8e\x9d\x68\xec\xe3\x08\x58\x63\xd2\xf9\x7a\x73\x4e\x83\x79\x8d\x4e\xbc\x07\x12\xde\x75\x65\x19\x15\xf9\x6e\xc2\x20\x89\x09\x33\xc2\x9b\x59\x2c\x19\x27\x22\xba\x75\x76\xcb\xab\x33\xa2\x84\x15\xf7\x8c\x84\x6f\x18\x6d\x24\xb8\xca\x53\x20\xec\x31\x0c\xee\x44\xba\x4e\xa4\xeb\x44\xba\xe7\x22\xd2\x59\xff\xc0\x3e\x50\xaa\xa5\x85\x6c\xa4\x55\x78\x5d\x47\xad\x1e\x1a\x1d\xb5\xc2\xd1\x51\xab\x47\xc6\xb3\xa3\x56\x5b\xc9\x69\x8f\xce\xf5\xd8\x41\xee\x8c\xa9\x9d\x31\xb5\x33\xa6\xba\xd1\xf1\x32\x37\x3a\x5e\xd6\xf1\xb2\xce\x98\xfa\xd0\x94\x9d\x31\x75\xc7\x89\x3a\x63\x6a\x67\x4c\xed\x8c\xa9\x9d\x31\xf5\xb1\x97\xe9\x44\xba\x4e\xa4\xeb\x44\xba\x6d\x17\xd3\x19\x53\x3b\x63\xea\x43\xa3\xa3\x56\xa5\xd1\x51\xab\x07\xc6\xcb\xa6\x56\xcd\x8d\xa9\x56\x70\xf7\x72\xfb\x2e\xd1\xb9\xaf\x36\x65\x8c\xad\x0f\xd1\x3d\xbd\x3a\x6b\x2b\x30\x97\xfc\xca\xc9\x45\x98\x95\xa0\x9d\x15\xc3\xfe\x0d\x45\x34\xdf\xbe\xbf\xe3\x10\x63\xca\x56\x9f\x30\x6d\x2e\x30\x28\xcc\x22\xa6\x93\x45\x78\xf0\xf0\xd5\x9a\x37\x7c\x3e\x01\xbe\xa7\x57\x67\xdb\x1b\xa3\xfd\x06\x7c\x0e\xbb\x73\x67\x55\xee\xac\xca\x61\x74\x4c\xbd\xe6\xa4\x1d\x53\x7f\x60\xbc\x6c\xa6\xbe\xef\x56\xd8\xce\x76\x4a\x3a\xdb\xe9\xc3\x97\x75\xb6\xd3\xce\x76\xda\x59\x23\x36\x8c\x4e\x70\xc1\xd1\x09\x2e\x8f\x8c\x67\x27\xb8\x74\xb6\xd3\x8e\x5a\x75\xd4\xaa\xa3\x56\xcf\x83\x5a\x3d\xc7\x40\xd4\xce\xe8\xd7\x19\xfd\x3a\xa3\x5f\xc7\x8d\x3a\x6e\xf4\xc8\x78\x76\xdc\xa8\x33\xfa\xed\x3a\x51\x67\xf4\x5b\x3b\x3a\xa3\xdf\x23\xa3\x33\xfa\x75\x46\xbf\x0d\xa3\x13\x5c\x6a\x4e\xda\x09\x2e\x0f\x8c\x97\x2d\xb8\x74\x46\xbf\x8e\x5a\x75\xd4\xaa\xa3\x56\xcf\x83\x5a\x35\x37\xfa\x3d\x72\x92\x1e\xbe\xf7\xe1\x93\xf2\xe0\xbd\x2c\x7a\xe8\x81\x9b\x20\xfa\x00\x04\x1f\x25\x5c\x8f\x91\xab\x01\x19\x53\x05\x7f\xf9\xf3\x4a\x15\xee\xf2\x25\x29\xc4\x8c\x9a\x47\xad\xbd\xe2\x71\x12\x56\x3c\x62\xf3\x9e\x6d\xb1\xf7\x61\x19\x35\x67\x71\x65\x82\x1f\x0d\x8a\x35\x5b\x1b\x5f\xd8\x8b\xaf\xb5\xa4\x1a\xa6\x8b\x52\x59\x6a\xb4\xc9\x16\x9c\x87\x6f\x28\xa7\x1e\x94\xc6\xbb\x19\x48\xc0\x9b\x7c\x21\x65\xe5\x27\x65\x0a\xa5\x6e\x36\x61\x10\xd7\x28\x55\xfb\xf0\xe6\x0e\xc2\x73\xd6\xfc\xfc\xd8\xa6\xad\xab\x25\xbd\x16\x58\x1e\x40\x67\xd6\x7a\x7d\x16\x12\x5a\x97\x21\x96\x51\x69\x28\xa4\xb7\x72\x23\xd3\x2e\x5d\xbd\x04\xef\x4d\x44\x71\x0b\x4e\xfd\x38\x87\x1e\x94\xf2\x6e\x37\x59\xd6\xb7\x61\xcc\xae\xa3\xc3\x08\x64\xca\x94\xda\x14\x70\x5d\x5d\xfa\x63\x64\x73\x0b\x72\xb9\x01\xfe\xfe\x8d\x4a\xcb\x09\xe2\x13\xee\x80\x1c\xd3\x88\xc8\x3c\x31\xc2\x14\x8f\x89\x2b\xe6\x4c\x68\x14\x89\x9c\x6b\xc2\x01\x62\x6b\xd9\x58\x87\xab\x5b\x10\xdb\x2d\xe4\xa7\x6d\xa5\xa7\x81\x5d\xe7\xa3\x57\xb9\x77\x38\xb1\xaf\xb0\xb6\x3c\x78\x79\x6c\x2f\x6d\xe1\xe3\x1f\xe7\x5a\xbb\xb0\xc2\xad\x19\x61\x65\x7f\x47\x22\x61\xd1\xe2\x2a\x4f\x80\xcc\x44\x12\x2b\x2c\x52\x6f\xb8\x7b\x70\x38\x94\x45\xe4\x0c\xaf\xc6\xd5\xf7\xc9\x38\xd7\x24\x16\xa0\x08\x17\xda\xa7\xb9\x57\x6e\xb7\x2e\xa6\xbb\x99\x6d\x54\x60\x6e\x22\x34\xcb\x12\x06\xe8\x84\x12\x92\xdc\xcd\x58\x34\xb3\xdd\x57\x32\x1a\xc1\xba\xcb\xb6\x97\x5e\xb6\x12\xaf\xc9\x4e\x22\x36\xf1\x36\xab\xf1\x63\xa8\x42\x76\x94\xb5\x89\x2d\x78\xfe\xbd\x14\x79\xb6\xe5\xe5\xab\x96\x45\x7b\xb7\xa1\xf2\x7a\xa9\x1d\x8b\xff\xd1\xb9\x8c\xec\xde\xd8\xcb\x82\x49\x74\x48\xc8\xc5\x84\xa4\x79\xa2\x59\x96\xe0\x2d\x36\x77\x5e\x11\x2a\xa1\xe0\x1b\x7d\x42\xf9\xc2\x7b\xa0\x5c\xd3\x03\x88\x09\x9d\x9a\x19\x35\x76\x3b\xf1\x05\xd6\x79\x9e\x82\x39\xcd\x71\xf1\x10\x54\xa7\xf8\xa2\x98\x9d\xdc\xb1\x24\x31\xf2\x2c\x4d\x12\x71\xb7\x9e\x2d\xad\x1b\xbb\x09\x85\x64\x37\xc1\x90\xec\x2e\x02\x13\xc2\x05\xf7\xa6\xdd\x1f\xaf\xde\xd6\xdb\xc4\xcb\xea\x1c\xae\xb3\x05\x68\x03\xd2\x8c\x4a\xcd\x68\x42\x72\x99\x28\xbb\x8f\xd4\x28\x01\xd2\xb7\x06\x99\x51\xf4\x0c\x46\xa0\x6c\x0f\x0a\xf2\xaf\x76\xe7\x1c\x60\xed\xf9\x14\x3c\x59\x10\x6a\x77\x7e\x92\x27\x49\x9f\x4c\x18\xa7\x86\xec\x42\xe6\x33\x61\x8c\xfe\x44\xae\x19\x8f\xc0\xbc\xd3\x20\x08\x16\xb8\x22\x33\xa3\x39\xdf\xe1\x90\xc6\x7d\xd7\x24\xc3\x6a\xcb\xca\x3d\xc2\x1c\xd8\x88\x8e\x13\xc0\x2e\x0d\x4e\x64\xb9\x12\x09\x9a\xb7\x9d\xe1\x3b\xb6\x9d\x35\x68\xf9\xe7\xff\x64\x1c\x95\x14\x72\x85\x8c\xc3\x28\x3b\xc0\xf4\xcc\xe8\x3e\x59\x96\x2c\x0c\xa1\x30\xb8\x53\x20\xd4\x81\xca\xa3\x99\x79\xa5\x57\x99\x88\xd5\x2b\x43\x46\x5e\x29\x88\x24\x68\xf5\xea\xd0\x7c\x5a\x7e\x07\x7c\xbf\xf2\x7d\x47\x34\x63\xaf\x0e\xfb\x04\x01\x84\x6d\x3b\x84\x9e\x3d\x5f\x3c\xf4\xef\x5a\xe9\x16\xf5\xd8\xa8\x6a\xad\xe5\x19\x5c\x0f\x0a\x91\xd9\x96\x0e\x86\x46\x6b\xc0\x3c\x29\x83\x94\x88\x06\xbe\xd9\xd1\x2a\xb1\x26\xe4\x84\x13\x48\x33\xbd\x40\x2c\x4e\x81\x72\x77\x35\xcc\x41\x2e\xf4\xcc\x68\xab\x4c\x3d\xff\xc3\xbf\xa5\x63\xa9\x18\x6b\x01\xee\x0e\xbc\x07\x6e\x81\xe4\xb6\x4f\xd0\x0a\x70\xfd\x7d\x27\x49\x52\x16\x7f\x29\x7e\xf4\x64\xfd\xd9\xc2\x14\xf9\x6c\x2d\x78\x7e\x30\x77\x56\x61\x69\xbf\xb2\x64\x33\x10\x92\xb7\x6f\x6d\x73\x20\x07\xab\x1f\x18\x8f\xad\xac\x7a\xa2\x6d\xd7\x1d\xb8\x02\xb3\xe0\xc8\xa6\x28\xfa\xd2\x3d\xb1\xa5\x94\x6e\x4b\x86\x04\x27\x5f\xb3\x07\xd8\x7f\xe7\x39\xc2\x7f\x55\xcc\xdd\x56\x34\x7d\x64\xfa\x92\x1e\xb4\x0f\xaa\x0b\xf6\x22\xaa\x48\x43\x86\x9e\xf5\xad\x6b\xca\xe0\x41\x42\xc7\x90\xd8\x46\x43\xe6\xd7\x62\xf9\xe4\xe4\xed\xbb\xd0\x93\x4b\x02\x7d\xc4\xee\xf5\x09\x14\x96\x2d\x1c\xac\x2b\x9d\xcd\x56\xc7\xf6\x32\x2a\x82\x62\x37\xa3\x31\xb9\x06\x6d\x4f\x61\x4a\x33\x73\x08\xed\x1c\x6b\x6d\x9e\x6f\x11\xd2\x8f\x1f\x96\x9d\x64\xfb\xed\x3b\x11\xad\x7b\xc8\x56\x47\x65\x3b\xcf\xf0\x2e\x67\xef\x01\x4b\x48\x31\x2a\x60\x5e\x42\x68\x27\xff\x3b\x89\x3d\x0a\x5d\xe5\x2c\x06\x2b\x9b\x40\x0d\x33\x3a\x67\x42\xfa\xef\x8b\x29\x5a\xde\x82\x5d\x94\x2b\xa3\x5f\x27\x10\x69\xf1\x70\xb1\x33\x7f\xb1\x86\x34\x4b\x1e\x3b\x79\x64\x67\x45\x2c\x65\xfc\x0a\x68\xbc\xb8\x86\x48\xf0\x78\x4b\x02\x5b\xd9\x8f\x77\x8c\xb3\x34\x4f\x09\xcf\xd3\x31\x20\x88\x95\x9d\x0b\x09\x89\x55\x72\x29\xe1\x70\x97\x2c\x1c\xf1\x88\x49\x26\x62\x4f\x4f\xc6\x46\x29\xa3\xf1\x02\xbb\x7a\x61\x59\x50\xbe\x30\x93\x30\x5d\xb0\x20\x49\x22\x49\x95\x11\x9f\xfa\x38\x29\xd3\x86\xa1\x8d\x01\x7d\x50\x2c\x06\xb3\xc7\x74\x4e\x59\x62\x44\xf0\x21\x39\x83\x09\xcd\x13\x6c\x4e\x47\x5e\x93\x03\xf3\x30\xaf\x77\xad\xbb\xc1\x88\xc5\x4a\x18\x8d\x5d\xb9\x5c\x78\x5c\xd0\xe1\x0e\x56\xf5\x6d\xaa\xd6\xf9\xb1\x6d\xf5\x3a\x3f\x32\x9a\xab\x6d\xd5\xf5\xca\xc6\x5c\xf0\xd8\x9c\x87\xb2\xc4\x5a\x22\xe9\x4c\xb9\x99\xb7\x63\xd9\xf6\x3d\xc7\x42\x24\x40\x1f\x0b\x60\x21\x16\x0b\xa7\x12\x94\x3a\x03\x1a\x27\x8c\x43\x7d\xfc\xba\x99\x01\x49\xe9\x3d\xe2\x98\x66\x29\x18\x71\xa4\x8c\x61\xb4\xfc\x56\x5a\x90\x94\xde\x42\x78\x3c\x19\xc3\x04\x9b\x0f\xe2\x0b\x97\x76\xdf\xe2\xcf\x84\xb2\x04\xe2\x21\x3e\xa3\x34\x4b\xd1\xb3\xd7\x22\x8e\xf9\xcc\x78\x0e\xe6\xae\x4c\x0a\x54\x3a\xed\xad\x65\x1e\x8f\x3c\x94\x9a\x8b\x2d\x1d\xf6\x7d\xea\x46\x4b\xa0\x38\xbf\x8f\xac\x31\x50\x02\x55\x78\x99\xc5\x4d\x95\xcb\x89\x51\x31\xbd\x66\x5a\x5a\x90\x6b\x70\x4a\x2e\x85\x76\xed\xee\xc2\x0b\xe2\xdd\xae\xfd\x22\x28\xcd\x52\x3c\x60\x71\x2e\x7d\x33\x48\x84\x19\x5d\xbf\xf5\x95\xa3\xf2\x97\xd7\xaf\xb7\x94\xdf\x3e\x3d\xd2\x4b\x40\x8d\xba\x0e\xbe\x5c\x06\x3a\xe4\xc9\xbf\x51\x95\xcd\x1e\x33\x27\x25\x63\x57\x4b\x90\xe8\x4f\x64\x4a\x33\x3e\xcd\x99\x9a\x91\x31\xe8\x3b\x00\x4e\xe0\xde\x56\xc2\x20\xff\x04\x29\x70\x53\x0d\x78\x0b\x57\x42\x05\x68\x6f\xf6\x07\x62\x73\xa6\x98\xe0\x7f\x67\x4a\x0b\xb9\x78\xcb\x52\xf6\x48\xc1\x4d\x3f\x56\x7b\xfb\x06\x08\x8a\x24\xc6\x8e\xbc\x2c\xa2\xd7\x60\x5f\x58\x02\x5a\x3a\xb5\xb0\x6a\x2c\x31\xe7\x64\x4c\xa3\xdb\x4f\x06\xe0\xd7\xfb\x02\x61\xcf\xae\x6b\x40\x15\xe5\xbd\x30\x01\x92\x2d\x8b\x94\xe7\xf7\x16\x3e\x15\x28\xdf\xcd\x84\x02\xbc\xc0\x1a\x23\xf1\x36\xef\x3c\x60\x2a\x10\x0c\x73\xba\x05\x07\x45\xe8\x64\x52\xbd\xa2\x38\xec\x28\x79\xa6\xb9\xd2\x24\xa5\x3a\x9a\x59\x93\x97\x88\x83\x38\xd1\x53\x4e\xec\xdf\x05\xca\x5b\x1b\x9b\x77\x37\x0b\x13\xbb\xce\xf3\x7b\xa3\x5b\x3e\xea\xf5\xa9\x8e\x0a\xc8\x97\xa7\xa9\x2a\xc8\x49\x75\x43\x9c\xdc\x96\xda\xc6\xb8\x37\x68\x28\x2e\xbe\xc1\x5d\x38\xb9\x3c\xdb\xde\x64\x53\x47\xc1\xdd\x59\xc5\x5d\x36\x89\x3f\xf0\x52\xde\xb4\xea\x7e\xa9\xda\xc5\x6d\x43\xe4\x3e\xa1\xe4\x16\x16\xb6\x77\xf2\x4a\x33\x5a\x09\x89\x93\x24\x00\x7b\xb2\x9a\x8b\x5c\x23\xe5\x1d\xd6\xbb\x33\xf6\xd8\xb1\x9b\xcb\xc2\x8f\x81\x59\xe8\x8e\x77\xf8\x97\xde\xe1\xb6\xdd\x11\xdc\x8e\x5b\x58\xec\x76\xc3\xd2\x76\x9b\x5d\x70\xba\x8f\xdd\x77\xf3\x45\x10\xf4\xc2\x56\xef\xe6\x4b\x2a\x8f\x9d\x2d\x58\x7e\x78\x20\x36\x7a\xbd\x80\x7e\x65\x2b\x93\x79\xc7\x9e\xb2\xc8\x68\xce\xf4\x8c\x65\xc8\x88\xbc\xd3\xc0\xb7\xf6\xfe\x40\x13\x16\x87\x29\xec\xf9\xbd\xe0\x7d\x23\x3e\x99\x7f\x90\xe8\x5a\x71\xed\x4c\x80\xba\x14\x1a\xbf\xf9\x6c\x00\xb2\xcb\x6c\x04\x1e\x3b\x85\xb3\x56\x23\x95\x41\xc5\xab\xd4\x15\x5c\x0d\x7d\x05\xb0\x00\x4a\xa6\xc8\x05\x27\x42\x7a\x38\x60\x9f\x76\x3b\x91\x9d\x02\xf9\xc4\xd8\x3a\x42\xd0\x8e\xbd\x76\x0e\x07\x3e\x21\x2b\xd0\x7b\x60\x3a\x37\x15\xca\x07\xf6\x17\xdb\x07\x3e\x41\x69\xd7\x89\xaa\xd4\x3b\xc3\x59\x44\x52\x90\x53\xf4\xcc\x44\x5b\x7b\x26\xaa\x9b\xb2\x1b\xdd\xb5\x63\x67\xea\x5b\x7e\xe0\x4e\x58\x80\xac\xc9\x9a\x80\x9a\x30\x37\x3b\x43\xc5\xe4\xf4\xff\x1a\x0a\x8e\x7b\xf0\xff\x91\x8c\x32\xa9\x86\xe4\x84\x28\xc6\xa7\x09\x54\x7e\x73\x1a\x46\x79\x1a\x33\x03\x53\xc4\x90\xda\x39\x4d\x9c\x2e\x45\x39\x01\x6b\xb3\x32\xb3\x2f\xb3\xd4\xbe\x93\x54\x0c\xe5\x09\x0e\xb1\x57\xb7\xb0\x78\xd5\x5f\x41\x9a\x57\x17\xfc\x95\xe5\x2d\x2b\x68\x12\x18\x11\xfa\xd2\x5e\xe1\x6f\xaf\xda\xe4\xc2\x3b\x32\x9c\xba\x76\xb4\xea\x43\xb7\xc6\x08\x1f\x03\x52\x53\x58\xaf\x68\x89\x2e\xf2\x49\x0b\x92\x2b\xb0\xd2\x3a\x9e\x32\x02\x5e\xce\x44\xa9\x12\x15\x53\x0e\x77\x28\x3d\xee\x8d\xe0\x67\x34\x09\xc6\xa7\x3f\x66\x31\xd5\x5b\x05\x9f\xda\x51\x81\x48\xef\xca\x4e\x42\x72\x9c\xc5\xe0\xd6\x84\x4d\x49\x46\x25\x4d\xd5\x90\x8c\x5c\x15\x44\xc4\x34\x36\x29\xdb\x12\x1d\xec\x6e\x16\x19\x90\xff\x9b\x5c\x95\xd7\x32\x24\x83\xc1\x80\xdc\xbc\x3f\x7b\x7f\x4c\xec\x37\x56\xca\xd6\x82\x4c\x04\x2a\x41\x22\x97\xe6\x51\x73\xe0\xa8\xf8\x1b\xf9\x5e\x70\x78\x3f\x31\x27\x84\x6a\x98\x83\x24\x77\x66\xab\x22\x16\x43\xb0\x5e\x0d\x7b\x9f\x16\x8f\xeb\x49\x26\x29\xbd\xbf\xce\xe5\x74\x87\x0d\x20\x2b\x9b\x50\x36\xd9\x14\xca\x24\xa2\x5e\x39\x8b\x57\x45\x33\x88\xf3\x04\x62\x42\xc7\x62\x0e\x15\x93\x6d\xf5\x36\x64\xe9\x39\xf8\x1b\x0d\xcf\x1b\x2b\x91\xe4\x3a\x28\xab\x07\x70\x7f\x4c\xfe\x0d\x5d\xe0\x94\x64\x20\x23\xe0\x9a\x4e\x61\xd9\x0c\x60\xaf\x7b\xf3\xfa\x5f\x0e\x1d\x3f\x32\x33\x3a\xeb\xc9\x6b\x83\x11\xef\xe8\xfd\x8f\xbc\x30\x0d\x32\x45\x5e\x0f\xc9\xc9\xd2\xc3\xf0\xbe\x24\xca\x13\xb4\xb5\xa0\x5b\xbf\xf4\xc8\xf1\x82\x48\x91\xa3\x63\x9f\xe4\x59\x55\x9b\xfd\xe3\xbf\xfd\x8b\x51\xfa\x68\x9a\x25\x70\x4c\xee\x66\xe0\x5c\x6b\x4c\xa1\x0c\xa3\x05\xf9\xd3\xeb\x7f\xb1\xd4\xd3\x9c\xcf\x42\x2b\x2c\x60\x46\x0d\xc0\xf2\x8c\xb0\xd4\x86\x6c\x42\xb2\xf0\x13\x81\x3f\x43\x1e\xfd\x95\xa6\x52\xab\x3e\x41\xef\x7f\x10\x0e\xb5\xd0\x34\x59\xd2\xf2\x51\x0b\x87\x3b\x0b\xa4\x58\x20\x4c\x00\x0d\x55\xe4\xcd\x9f\x5e\xff\xcb\xaa\x39\xe5\x3d\x8f\x00\xef\xc4\x3b\x30\x1c\x63\x6c\x94\xfb\x5b\x96\x24\x10\xf7\x1f\x5d\xfe\x24\x97\x7a\x06\xb2\x4f\x80\x2b\x6f\xac\x32\xeb\x5b\x5a\x1b\xce\x2e\x73\xce\x51\x46\xb0\xd6\x61\xb4\x68\x95\x2c\x5c\xee\x65\x0d\x23\xd4\x24\x15\x4a\xaf\x5f\xf2\xf6\xc7\xcd\x0c\xca\x17\xef\x27\xbb\x8a\x03\x83\x1a\x66\x88\xd5\xbb\x6b\x88\x94\xf7\x83\xdb\x90\x51\x39\x60\x5c\x0f\x84\x1c\xd8\x69\x8e\x89\x96\xf9\xe3\x5e\x83\x62\xa4\x95\x13\xf0\x19\xc8\x40\x5e\x3a\x6f\x2b\xbb\xfa\x49\x4e\x7e\xfd\xf3\x1c\x8b\x3b\xbe\x99\x72\x20\xe1\x74\x34\xa3\xe6\xa9\xaf\x5a\xdc\x96\x8e\x8d\x79\xba\xb9\xfa\xff\x5a\xc5\xee\x1d\xc8\x81\x3b\xbb\xe1\xb4\x1b\xb9\x0a\x3d\x1e\xfd\x2d\x9e\x1e\x8e\xad\xe5\x7c\xd6\xe6\x64\x2e\xb0\x8f\x59\x43\xb9\x56\x4e\xf8\x1a\x0a\x64\xd7\x51\x38\x64\x34\x46\x14\x98\x73\xae\x36\x1e\xf4\x04\xa8\xd2\xeb\x40\xd1\x1d\xf4\xc7\xc7\xc3\x81\xfe\xcb\xa3\x2a\x74\x1a\x09\x09\x41\x5e\xd8\x18\x4f\x2d\xa2\xbc\xba\x02\xeb\xe1\xb3\x81\x69\x15\x21\xea\x55\x38\x12\x66\xff\xaa\xf2\xd5\xa7\x8a\xaa\xf1\x46\xce\x3a\xa2\xb5\xbb\xb5\x14\x00\xec\x4c\xa7\x8e\x78\x05\x8f\xa2\x75\x69\xee\x8d\x14\x9d\x82\xa6\x0f\x27\x83\x2c\x8f\x2a\xd1\xbe\xd6\x94\xc7\x54\xc6\x6e\x95\xbd\x9e\x0a\x53\x0e\xc9\x3b\xf4\xa5\xf1\x89\x38\x26\x33\xad\x33\x75\x7c\x74\x34\x65\x7a\x78\xfb\xef\x6a\xc8\xc4\x51\x24\xd2\x34\xe7\x4c\x2f\x8e\xd0\x81\xc6\xc6\xb9\x16\x52\x1d\xc5\x30\x87\xe4\x48\xb1\xe9\x80\xca\x68\xc6\x34\x44\x3a\x97\x70\x44\x33\x36\x28\x64\x66\x35\x4c\xe3\xaf\xfc\x83\x3e\xb1\x60\x5c\x39\x43\x68\x5d\x92\x73\x18\xe4\xfc\x96\x8b\x3b\x3e\x40\x4d\x56\xed\x74\x9a\xb6\x8b\x62\xf0\x63\x09\xde\xbb\x04\x2e\x64\x22\xfe\xe4\x9b\x60\x5e\x66\x40\x79\x3c\xb0\x4e\xc7\x4f\xbc\x17\x75\x6c\xbb\x83\x22\x30\x60\x9b\xc8\x74\x3b\xea\x69\x43\x34\xd2\x6c\x0e\xb5\x9c\xd8\x7e\x54\xb6\xfb\xbd\x0f\x2c\x8d\x73\x69\x77\xbc\xe4\xcd\xf6\xbe\x99\x94\x2e\x50\xd6\xc1\x67\x13\x61\x59\x39\x17\x31\x38\xcb\xe7\x1c\x55\xfb\x6b\xc3\xcc\x6f\x8c\x28\xec\x7c\xdc\x68\xf7\x5d\x28\x0d\xa9\x25\x4e\xf6\xfe\x64\x41\xb4\x5c\x58\xc7\xb8\xbc\x35\xca\xa7\xf3\x5c\x1b\x89\xff\x16\xaf\x53\x4a\x44\x0c\x45\x9f\x02\xae\x5e\xee\xf2\x36\x3c\x4a\x32\xa1\x18\x3e\xdb\xf1\xbc\xdd\x2c\x73\xf5\xd9\x65\xc9\x4d\xf7\x97\x3f\xef\xb2\x75\x13\x6c\xb7\xb0\xa3\x95\xbd\x1a\x41\x31\x29\x67\x02\xb8\xed\xe9\x29\xaf\xb8\x1a\xb1\x24\x12\x5c\x69\x49\xd9\xe6\x5c\xa7\xf5\xa3\xa6\x2b\xa4\xbe\xbf\x81\x20\x06\x9d\xd4\x02\x0a\x59\x8d\xc1\xf2\x4c\x11\xd1\xd2\x83\xba\x0c\x18\x9b\x0a\xe5\x63\x09\x0d\xe1\xaa\x69\x5a\xad\x01\x23\xd2\x08\x4e\xf6\x6e\x98\x80\x94\x10\x9f\xa1\xf4\x79\x1d\xde\xeb\x62\xca\x45\xf8\xfa\xfc\x1e\xa2\x7c\xdb\x8c\xf1\xd5\xb1\x62\xcb\xf3\x06\x11\x17\x76\x62\x17\x61\x8e\xae\xff\xc1\xc9\x1f\x02\xc1\xee\x04\x11\x45\x35\x53\x13\x9b\x57\x16\x36\x02\x4a\x8e\xcf\x80\xc2\xc1\x3d\x8c\x2c\xce\xa6\x48\x30\x8d\xe4\x26\x9a\x09\xa1\xcc\x29\xc7\xfd\xc4\x79\xe7\x4c\x58\x9f\x1f\x26\xb9\x48\x92\x1a\x1a\xe3\x93\x5d\x8a\xe9\xad\xa1\xb6\xb8\x8d\x29\xab\x82\x07\x08\x7a\x2f\x95\x99\x06\x0d\x8f\xe6\xc3\x14\xa5\x26\xa5\x89\xca\x53\x33\xe9\x1d\xb0\xe9\x4c\xab\x3e\x61\x43\x18\x22\xd6\x00\x8d\x66\xa5\x69\x53\x00\x5d\xe9\x96\x52\x46\xb5\xb2\x95\xf8\x20\x64\x3f\xb8\x74\x9d\x7e\xe0\x31\xcb\x7b\xb9\x16\x5c\x7d\x02\x3a\x1a\x1e\xf6\x49\x91\x50\x6e\xd6\x38\x5e\x10\xa6\xc1\xd0\x6c\xd4\x45\xa4\xc8\xa7\xf6\x4d\xc0\xc7\x74\xe2\xba\x42\x6a\x08\x7a\x51\x63\xd4\x19\x5f\xd9\x97\x7b\x65\xf6\x0d\x57\x9e\xa7\x46\x5f\x0c\x44\x1d\xcd\xea\x4e\xbe\x8c\x84\x94\xa0\x32\x61\xb5\xcd\x65\x83\xfb\xff\x0e\x37\x1d\xa8\xc3\x02\x98\x33\x36\x9d\x79\x58\x52\xc7\x08\xaa\x7b\xb0\xfb\xd9\x23\x8d\x7c\x29\x76\xd4\xf4\xa8\xd8\x51\xf5\x6d\xfb\xbc\x8a\x02\xab\x4a\xfb\xaf\x41\xa6\x01\x8a\x88\x22\x48\x32\x9c\x9d\xdb\x37\xb6\x71\x38\x46\x5e\x93\x03\x44\x32\xa6\x7b\x0a\x11\x7e\x20\xb2\xc3\x21\x39\x21\x3c\x0f\x67\xee\xa1\x07\x70\x11\xe6\x77\x13\x99\x87\x2a\x51\xcc\x55\xf3\x8d\x1b\x91\x3b\x3b\xea\x79\xca\xcb\x63\xe0\x20\x00\x8f\x97\x4f\x7c\x68\x12\x0b\xeb\x9a\x13\x34\x23\xdd\x7e\x0e\xff\x16\xf5\xe7\x58\x09\xb0\xc0\xe3\x5a\x44\x51\x80\x4c\xfb\x65\xe9\x29\x1c\xc8\xea\x29\xb6\xb0\xa8\x8b\x15\xa4\x1d\xcc\x20\x2d\xc1\x95\x34\x8a\xd0\x59\x3f\x96\xc3\x58\x7c\xb6\x55\x05\xda\x15\x22\x3f\x5e\xe0\xaf\x3b\x06\x2f\x6d\x1e\x4d\x29\x5d\x31\x1a\xd1\xbc\x62\x3c\x88\x78\xfb\x17\xd8\xb3\x7e\xb4\x84\xb6\x76\x34\x27\x6d\xc5\xd8\x3d\x34\x68\xd3\x3c\x35\x02\x86\xd6\x8f\xb6\xce\xa6\x1d\x35\x82\x8b\xd6\x8f\x15\x11\xf5\xd3\xc4\x1a\xad\x1f\xb5\x8d\xa4\xeb\x47\xdd\xb8\xa4\xf5\x63\x29\xa5\xf1\x13\x05\x29\xf5\xab\x11\x4a\xe4\x7b\x6d\xcf\xf1\xdb\x46\xfc\xa4\x18\x2d\x83\xb8\x5e\x64\xd3\xfa\xb1\x2c\x00\x3e\x93\x28\xa7\x35\x53\x7d\xaf\xcd\x34\x6f\x37\xde\x6c\x73\xd9\x7d\x9c\x8e\x53\x28\xfa\x2e\x75\xc6\xdb\x99\x31\xa2\x3a\x93\x80\xe5\x07\x30\xec\xcb\xdb\x61\x3e\x4f\x60\xd5\xfa\xd1\x1e\xe3\xb4\xa3\x25\xf6\x69\x47\x6b\xc8\x8d\x02\xcf\x77\xd6\x2e\xfc\x84\xb2\x8e\xb5\x4c\x77\xb2\x4e\x27\xeb\xec\x30\x3a\x59\x67\xdb\xd1\xc9\x3a\x9b\x46\x27\xeb\xac\x19\x9d\xac\xd3\xc9\x3a\x8d\xc6\xfe\xc9\x3a\xd6\x52\xd5\x9a\xc1\xec\x27\x6b\x70\x5d\xb6\x90\xa1\x34\xe5\x43\x7a\xaa\xa6\x32\xc3\xfb\xaf\x1d\x89\xbd\x41\xf3\x9a\x8b\x54\x97\x94\x4f\x81\xbc\x19\xbc\x79\xbd\x65\x3a\xe0\xfa\xd1\x24\x68\xa7\x3c\x76\x4d\x1d\x5c\x1e\x9b\x3c\x12\x9f\xcc\xbb\xe4\x4e\x6a\x70\x78\x54\x24\xcc\x0d\x0e\xa2\x50\xfd\x2a\x05\x4d\xa8\xae\x18\xc4\x59\x0a\xc1\x21\x5a\x49\x41\x2e\x62\x7a\x05\x77\xfe\x0e\xb3\xa9\xc3\x7a\x2b\x88\x80\xda\x38\xf6\x31\x84\x55\x88\x14\x6c\x82\xa9\x3f\xf4\x66\x09\xe0\x61\x45\x0e\x60\x38\x1d\x92\xd8\x26\x6b\x53\xee\x62\xc6\x0e\xfb\x65\xf7\x78\x6a\x88\xab\xc4\x7f\xcc\xb2\x9d\x7f\x1c\xe6\xc0\x75\x4e\x93\x64\x41\x60\xce\x22\x1d\xde\x0f\x03\x02\x99\xb6\xce\xce\x26\xae\x94\x06\xe2\x61\x53\x91\x70\xb0\x72\xb6\x76\xf3\x57\xfb\xd1\x5c\x76\x5b\x59\x47\x7d\x7a\xb3\x24\x97\x58\x08\x0d\x37\xaa\x55\xda\x3c\xcd\xfa\x2b\xf1\x4f\x44\xf0\xf7\x57\x75\xdd\x63\xa4\x25\x9e\xd0\x98\x0f\x2c\x2b\x50\x79\x92\x18\xf4\xb6\x1e\xb3\x55\x10\xac\xf1\x64\xad\xc9\xb6\xb1\x6e\xd6\xb4\x94\x75\x83\xd7\xdc\x88\x4c\x24\x62\xba\x28\xef\xa0\xed\xdc\x52\x2a\x6f\x43\x89\xca\xc7\x4e\x04\x34\x87\xe8\x72\x69\xcb\x3b\x5f\xc8\xc6\xd1\xf9\x42\x56\x46\x67\x1f\x58\x1e\x9d\x7d\x60\x87\xd1\xd9\x07\xd6\x8c\xce\x3e\xb0\x3a\x3a\xfb\x40\x67\x1f\x68\x32\x5e\xbe\x7d\x80\x74\xbe\x90\x4d\xa3\x93\x75\x8a\xd1\xc9\x3a\xdb\x8f\x4e\xd6\x59\x1d\x9d\xac\xd3\xc9\x3a\x9d\xac\xd3\xc9\x3a\x75\x47\x03\xe4\xce\x44\xdc\x7a\x8a\x4c\x26\xe2\x07\x32\x64\xac\xbd\x3a\x12\x83\x44\x44\xa1\xb2\x88\xb9\xc5\x79\x3e\x14\x4d\xad\x09\xbd\x4f\xfe\x29\x38\xd8\xf4\x04\x5b\xb2\x36\x05\x22\xb0\x59\x44\x26\xe2\x03\x75\x58\x23\xf0\xbc\xcb\xb0\xe9\x32\x6c\xbe\x80\x0c\x9b\x19\x55\xae\xf0\x11\x92\xd6\xcd\x09\x37\xa5\xe3\x7f\x03\x32\xfd\x62\xf3\x6d\x0c\xc2\x39\x84\xc1\x5e\x72\x05\x52\x58\xd8\xc5\xce\xb7\x0b\xf1\xa8\x0a\x31\xa7\x97\xd9\x56\x3c\x71\x0c\x31\xc9\x40\x0e\x2c\x92\x09\x32\x61\xae\xfe\xd7\x12\xfe\x3a\x08\x3f\xf3\xbc\x99\x2a\x24\x9e\x75\xf2\x4c\xf5\x55\x5a\xf3\x4d\x95\x5d\x74\x15\xae\xf8\xec\x52\x69\xda\xd1\x4a\x07\x44\x3b\x77\xda\x0f\x8d\xf4\xd2\xb6\x94\x48\x54\xf2\xae\x77\x2a\x73\xbc\x79\xac\x2d\x4e\xfb\x3f\x39\xc8\x05\x11\x73\x90\x85\x62\x14\x9a\xf7\xf4\x43\xa7\x99\x88\xba\x02\xc8\xed\x18\x78\x5a\x31\x45\xb4\xa9\xa9\xb7\xed\x35\x24\x7b\x56\xfd\x78\xf3\x68\x57\x71\x68\x51\x6d\x78\x6e\xb5\x94\x37\x8f\x56\xcd\x6f\xa4\x65\x13\x1c\x69\xd1\x0c\x47\xda\x35\xc5\x91\xd6\xcd\x71\xa4\x4d\x93\x1c\xf9\xec\x15\xa0\x37\x8f\x96\xcd\x47\xa4\x75\x2b\x1d\x79\x86\xf5\xa4\x37\x8f\x4f\x00\xee\x36\x2d\x76\xa4\xab\x4e\xdd\x78\xb4\x6d\x50\x23\x6d\x1b\xd5\x48\xdb\x78\x58\xab\x0a\xf6\xe6\xd1\xd5\xc7\xfe\x04\x72\x5a\x6b\x42\x44\xd3\x9a\xda\x8f\x2d\xb4\x05\x9c\x0c\x3d\x7e\xdb\xf5\x6b\x17\xd3\x06\x33\xa1\x5a\x6e\xfd\x5d\x62\xe2\xd7\xab\x6c\x9b\x1c\x84\xda\x26\xb6\xed\xf4\xe1\xff\x5e\x8a\xf1\x44\xb9\xde\xb6\x9b\x7d\xe5\xed\xc7\x3d\x55\xcc\xff\xea\xa5\xb9\xc9\x5b\xdb\xf4\x92\xfe\xdd\xea\xae\xdf\x78\x2b\x7e\xd1\xe5\x2e\x98\xf8\x63\x72\xe0\x0d\x1f\xae\x65\xb3\xae\xfe\xc8\x35\x1b\x14\x57\x04\x53\x08\x5a\x30\x2b\xc9\x13\x55\x8c\xf1\x0e\x83\x60\x8c\x2e\xf0\xcb\x50\x22\x90\x95\x35\x60\x97\xa0\x09\xf6\x77\xa5\x45\x85\x65\xc1\xbd\x85\xda\x92\x2e\x24\x36\xde\xf6\x67\xa5\x4c\x5c\x0f\x8a\x9a\x05\xec\x4a\x26\x55\x8a\xa4\x90\x72\x17\x79\x2c\xb8\x6f\x01\x68\xdb\xfa\x15\xa2\x69\x28\x5c\x1b\x9e\x3e\x24\xe7\x88\xce\xe5\x89\x99\x6d\xb0\xbf\x63\xcb\xe4\x8d\xdb\xbd\x87\x59\x32\x77\x3b\x67\xc9\x2c\x99\xe7\xba\x24\x99\x2e\x49\xa6\x51\x92\x0c\xfe\x68\x0f\x77\xeb\xd9\x32\xe4\x27\x57\x8b\x5a\x02\x82\x2a\xcd\x13\xcd\xb2\xc2\xdd\xad\xec\xa3\x12\x2b\xb4\x4f\x9c\xdb\xad\x8a\xef\xe6\x69\x34\x9a\x2d\xe3\x3d\xce\x87\xee\x71\x85\xe4\xc4\xb9\xb6\xb0\x72\x34\xa6\x77\x78\x09\xdf\xfa\xef\xd8\xf3\x77\xcb\x9c\x21\xc1\x56\x85\x82\x6a\x0b\x9b\x1b\x3a\x9f\x18\x94\x30\x14\xfb\x01\x06\x51\xae\x1e\x8a\x2e\x42\x36\x07\x5e\x70\x89\x03\x75\x78\xe8\xed\x07\xad\x72\xaf\x4f\xc2\x7d\xfe\x56\xe2\x12\xff\xb1\x0d\xff\xc1\x17\x0a\x1c\xa8\x00\x5f\xc1\x7f\x9e\xb7\xff\xa9\xb9\x2b\xa1\x0d\xe3\x57\x6b\x2e\x84\x27\x77\x1f\x7c\x49\x89\x46\x7b\xe9\x2e\xd8\x3b\xad\xe3\x65\xb8\x08\xba\xe8\xdc\xed\xc7\x73\x88\xce\x7d\x22\x37\xc0\xf3\x09\xd2\x7d\xb6\xa6\xff\xe7\x12\xa4\xdb\x99\xfb\x77\x1a\x2f\x35\x76\xb6\x3a\x5a\x34\xef\x77\xa6\xfd\x96\x65\xaa\x56\x98\xff\xa7\x31\xe9\xb7\x82\x7f\xed\x98\xf2\x5f\x94\x19\xbf\x1d\xa2\xd3\x02\xa9\x69\x65\x83\x5b\x32\xdb\x77\x26\xfb\xfd\x36\xd9\x37\x4c\xe4\xe0\x9a\x7d\x9a\x64\x8e\xf2\x6e\x6f\xca\xe8\xa0\x73\xc1\x62\x92\xe5\xda\xc5\xb3\x77\x59\x1d\xfb\x9c\xd5\x51\xd9\xd1\x2e\xb5\x63\xab\xd4\x8e\x4d\x30\xeb\xf2\x3b\x36\x8c\xfd\x71\x24\x74\xf9\x1d\xbb\x8e\x2e\xbf\x63\xfd\xe8\xf2\x3b\x1e\x18\x5d\x7e\x47\x97\xdf\xd1\xe5\x77\x34\x18\x5d\x7e\xc7\x9a\xd1\xe5\x77\xd4\x1f\x5d\x7e\xc7\x56\xa3\xcb\xef\xe8\xf2\x3b\xaa\xa3\x73\xf8\x34\x1b\x5d\x7e\x47\xc3\xd1\x39\x81\xba\xfc\x8e\x2e\xbf\xa3\xcb\xef\xd8\x71\xa2\x2e\xbf\xe3\x4b\x71\x16\x91\x2e\xbf\x63\xbb\xf1\xc5\xe7\x77\x54\x1c\x17\x4f\x97\xe4\xb1\xfb\x32\xba\x4c\x8f\x2e\xd3\xa3\xcb\xf4\xe8\x32\x3d\xba\x4c\x8f\x2e\xd3\x63\xfb\xb1\xff\x8e\x83\xbd\xd3\x3f\x5e\x86\xb3\xa0\xcb\xf4\xd8\x7e\x74\x99\x1e\x1b\x47\x97\xe9\xd1\x65\x7a\x74\x86\xff\x3a\xa3\xcb\xf4\xd8\x71\x74\x46\xfe\x2e\xd3\x63\xa7\xd1\x65\x7a\xac\x8c\x2e\xd3\x63\xcd\xe8\x8c\xf7\xfb\x6d\xbc\xaf\x89\x2b\x34\xd7\x22\x15\x39\xd7\xd7\x20\xe7\x2c\x82\x93\x28\x32\x9f\x6e\xc4\x2d\xec\x68\x30\xae\x6a\x7c\x0f\x4c\x4b\x18\x8f\x59\x84\x3a\xdb\xdd\x0c\x30\x51\xc3\x88\x92\x78\x1d\xa1\xf6\x42\xa2\xf1\xca\x02\xbd\x70\x9d\x54\xb3\x08\xad\xa8\x38\xf5\xae\xf0\xb2\x10\x1a\x0b\x91\x00\xe5\x3b\xdc\xe9\x18\x0f\xc8\x1d\x4f\x73\x05\x20\x6f\x9d\x7d\xa0\x98\x8c\x8c\x21\x11\x7c\xea\x8c\xb6\xee\x04\x0c\xc9\x69\x71\x41\x44\x39\x1e\x9e\x5c\x4a\xe0\x3a\x59\x20\x1c\x30\x64\x1c\x05\xf4\x54\xcc\x5d\x4f\x61\xb4\x15\x5b\x91\x8d\x6a\x92\x00\x35\xcf\xe2\x50\x3c\xcc\x1c\x1e\x4a\x46\x38\xbf\x9d\x74\x0c\xce\x7e\x5d\x0b\x88\xbb\xd3\xc6\x5a\xd4\x70\xc9\x88\xe0\x24\x14\x64\x13\x11\xaa\x22\xa5\x37\xc4\xa3\xb9\x10\x39\xb9\xa3\x56\x28\x91\x39\xc7\xc3\x8c\xaf\x6e\x40\xbb\xe3\xc3\x1b\xb0\xff\xfa\x9a\xfe\x00\xa9\xda\xae\x99\x5a\x0d\x64\x0a\x2a\xa7\xb5\x98\x54\x65\x6b\x7a\x27\x72\x9a\x5b\xe9\xcb\xa1\x32\x70\x2d\x17\xe8\x54\xb1\x12\x5a\x2c\xa2\x5b\x83\x86\x29\x9d\x42\xaf\xa7\xc8\xe9\xbb\x33\x43\xfb\x72\x65\x48\xb5\x4b\x5a\x71\xb4\x30\x93\x62\xce\x62\x83\xd9\x1f\xa8\x64\x74\x9c\x18\xf9\x6e\x02\x12\xb8\x91\x1a\xbe\x3e\xf8\x70\x72\xf5\xfb\xe5\xc9\xbb\xf3\x43\x94\xf4\xe0\x3e\xa3\xdc\x1c\x89\x5c\x15\xae\x40\x87\x13\xe6\x41\xc0\xe7\x4c\x0a\x6e\x16\x87\x3a\x11\x25\x73\x3f\x6b\x14\x4e\x82\x04\x25\x92\x39\xc4\x56\x1e\x0d\x4f\xf3\x2c\x87\xf1\x2c\xd7\x5e\x47\xf3\x5d\xa5\x72\x1e\xcd\x28\x9f\xfa\xae\xde\xe5\x75\xa9\x05\xd7\xf4\xde\xcc\x8f\x4a\x94\x8a\x68\xe6\x7d\x96\x94\xc4\x22\x37\x0f\xff\xfa\xeb\x3e\x61\x70\x4c\xbe\x2e\xdd\x38\x24\xe7\xee\xda\xd2\x0b\x5b\x87\x18\xcc\x41\xe2\x64\xee\x75\xfb\x44\xc2\x94\xca\x38\x01\x85\xae\x20\x4f\x48\xad\xd4\xec\x5e\x10\x82\xbe\xc7\x85\x5e\x77\xf2\xc9\x3b\x81\x6e\xa1\x89\x38\x26\x33\xad\x33\x75\x7c\x74\x74\x9b\x8f\x41\x72\xd0\xa0\x86\x4c\x1c\xc5\x22\x52\x47\x9a\xaa\x5b\x75\xc4\xb8\x39\x09\x83\x98\x6a\x3a\x28\x1d\xc1\x23\xcb\x66\x07\x91\x48\x53\xca\xe3\x01\x75\xa8\x30\x08\xdb\x70\xf4\x95\x63\x80\x03\x1a\xae\x62\x7c\x40\x07\x6a\x06\x49\xd2\xab\x81\x7c\xcd\x04\xb4\x06\x82\x59\x23\x81\xcc\xbd\x7b\xf3\xd3\x76\x1e\x0e\x97\x85\xc1\x90\x5c\x0a\xed\x3c\x96\x0e\xd1\x90\xe8\x21\x7c\xd7\x9f\xbf\xf3\xcb\x9b\xab\x9f\x47\xef\x2f\x2e\x6f\xba\x63\xd8\x1d\xc3\x2f\xea\x18\x02\x9f\x37\x3e\x82\x5e\x9a\x2b\xa1\x75\xd8\x6f\xe4\x81\x0a\xb4\x47\xdb\xb0\x01\x8d\x65\x2f\x3b\x9e\x0c\xea\x15\x08\x9c\xf3\xf9\x07\x5a\x35\x13\xf3\xb5\xe0\x20\xee\x02\x2b\x82\x06\xe9\xb6\x49\x78\x41\x03\x93\x4c\x53\x1f\x4c\x2d\xf9\xcc\x8e\xe6\xfe\x11\xf3\xe8\xfa\x2a\x7c\x65\xfb\x2e\x69\x5a\x64\x53\xaf\xd9\xb5\x21\x79\xe7\x15\x0a\x72\xfa\xfb\xc5\xd9\xf9\xe5\xcd\xc5\x77\x17\xe7\x57\xf5\x35\xd4\x16\x6c\x19\xa8\xad\xb7\x04\x80\x5e\x4d\xae\x96\x49\x98\x33\x91\x17\xd6\x85\xf5\x24\x60\xf9\xec\x3b\xd7\xe5\x22\xe8\xb9\x6b\x6f\xfb\xd2\x59\xe3\x19\x4c\x68\x9e\x58\x2d\xe2\xd5\xab\x61\x1d\x9e\x64\x47\x5b\xc8\xf6\x9d\x14\x0d\x72\x7b\x2b\x08\x77\x6d\xab\x02\x4c\x84\xdc\x78\xe8\x7a\xce\xe1\x5d\x61\x14\x4e\x34\xb3\x96\x2a\x27\x9b\x59\xbf\x4c\x43\xe8\x34\x34\x6c\xb7\xe3\xee\x8d\x04\x9f\xb0\xe9\x3b\x9a\xfd\x00\x8b\x2b\x98\x34\x33\x97\x56\xe1\x8d\x56\x38\xe7\xbd\x44\x9b\x9d\x61\x3e\xf6\x61\xcd\x3c\x03\xad\xf9\x05\xda\x0a\x08\x68\x1e\x0c\xd0\x9e\xef\xbe\x15\xbf\xfd\x4a\xa5\x05\x6b\x8f\x75\x96\xd5\xb6\xc2\x3a\x5a\x71\x16\x37\xe3\xc9\x7e\x54\x59\x53\x99\x39\x3b\x3a\xab\xb7\x55\x12\x22\xc1\x23\xc8\xb4\x3a\x12\x73\xc3\x69\xe0\xee\xe8\x4e\xc8\x5b\x23\xf5\x1b\xea\x3e\xb0\x58\xab\x8e\xd0\x76\x7e\xf4\x15\xfe\x43\x6e\xde\x9f\xbd\x3f\x26\x27\x71\xec\xca\xe6\xe4\x0a\x26\x79\xe2\x0a\x55\x0c\x09\xcd\xd8\x07\x90\x8a\x09\xde\x27\xb7\x8c\xc7\x7d\x92\xb3\xf8\xdb\xfa\xc4\xd9\x8f\x16\x77\x41\x64\xd6\xbb\xd6\xf2\x4e\x5c\xa3\xaf\x61\x51\xe1\x5d\x81\x88\x18\xae\xc5\xb4\x42\xdc\xf4\xd6\x57\x27\x14\xb4\x04\x9a\xdd\x4d\xd5\xcb\x03\xb7\xb0\x5d\xba\xda\x2b\x08\xab\x75\xe6\x3a\x44\xcd\x44\x7c\x4c\x54\x9e\x65\x42\x6a\x45\x52\xd0\xd4\xa8\xa8\x43\x83\x61\xfd\xea\x47\xf4\xd9\xf4\xc9\x3f\xc2\x97\xe8\x78\x51\xbf\xf4\x7a\x7f\xfb\xe1\xfc\xe7\xff\xe8\xf5\x7e\xfb\x47\xf9\x57\x64\x85\x36\xf0\xa4\x7a\x89\xca\x20\x1a\x72\x11\xc3\x25\x3e\x03\x3f\xaa\x8a\xbb\xc1\xfd\xa0\xa9\xce\xd5\x70\x26\x94\xbe\x18\x85\x8f\x99\x88\x97\x3f\xa9\x06\x12\x07\xd9\x4f\xc6\x80\x5b\x34\xa2\x7a\xb6\x27\xec\xa1\xa0\x25\x2d\x1f\x55\x37\x6b\xb9\x3c\x53\x4a\xf1\xcf\xef\x3c\x08\x8c\xf4\x74\x27\x99\xd6\xe8\x82\x72\x71\xef\x62\xd2\x37\xa7\xb6\x10\x3b\xe7\x6f\x5e\xed\x15\x83\x09\x3b\xd8\x32\xc0\x10\x22\x0e\x5a\xf6\x20\x07\x06\xbb\xea\x6a\x3d\x19\x5d\x90\xb9\x85\xf0\xde\x00\xc7\xc7\x32\x7f\xf7\x49\x69\x5c\x28\xe7\xe5\x40\x15\x34\xba\x63\x1b\x87\x12\x22\xaa\x49\xc2\x52\xe6\xc2\xdb\x5c\xe9\x2f\x45\x0e\xec\x97\xc3\x28\xcb\xfb\xee\x82\x61\x0a\xa9\x90\x8b\xf0\x11\xb2\x19\xa4\x20\x69\x32\x50\x5a\x48\x3a\x85\x7e\xb8\xdd\xde\x16\x3e\xd9\x1b\x2b\x0f\x58\xbd\xdb\x2a\xae\x85\xcb\xd0\x51\x64\x88\x5f\x1e\x6d\xf3\xa0\xdf\x13\xd2\x16\x30\xe3\xf2\x13\x88\x84\xc1\x6e\x66\x05\xce\x00\x45\xd4\x27\xe7\x22\xc9\x53\x50\xfd\x20\x06\xd9\x0a\x76\x7c\x6e\x34\x4b\xb5\x57\x82\x5a\xcc\xe6\x4c\xb5\x11\xb9\xba\x46\x4e\x63\x2e\xa8\x48\xe4\x3a\xcb\xb5\x4b\xae\x2b\x95\x0c\x14\x0a\xed\x16\x21\x03\xa2\x42\xf6\xdf\x34\xcd\x00\x26\x24\xa3\x5a\x83\xe4\xc7\xe4\xbf\x0e\x7e\xfd\xe6\xe3\xe0\xf0\xdb\x83\x83\x5f\x5e\x0f\xfe\xfa\xdb\x37\x07\xbf\x0e\xf1\x8f\x7f\x3d\xfc\xf6\xf0\xa3\xff\xf0\xcd\xe1\xe1\xc1\xc1\x2f\x3f\xbc\xfb\xfe\x66\x74\xfe\x1b\x3b\xfc\xf8\x0b\xcf\xd3\x5b\xfb\xe9\xe3\xc1\x2f\x70\xfe\xdb\x96\x93\x1c\x1e\x7e\xfb\x75\xe3\xa5\x53\xbe\x78\xdf\x90\x80\xda\x31\x68\x2d\x37\x72\x79\xc6\x96\x42\x7b\xef\x07\x85\xd2\x34\x60\x5c\x0f\x84\x1c\xd8\xa9\x8f\x89\x96\x79\x33\x62\x52\x30\xa5\xb6\xcf\xbf\xaf\x0b\x77\x5c\x30\xa4\xc0\xae\xf7\xe6\x80\x2b\x88\x24\xe8\xcf\x61\xc9\xb1\x4f\xf2\x72\xca\x52\xe8\xdf\x4b\xe3\x73\x5f\x82\x71\x27\x84\xce\xe1\xbe\x16\x92\xe8\x44\x8a\x74\x48\x4a\xce\x88\x39\xe6\x18\xb8\xeb\x6e\xa1\x81\x15\xd4\x8f\xce\x18\xd4\x19\x83\x36\x8c\x47\x8d\x41\xd7\x16\x0f\xf7\xd6\x12\x04\x7c\x5e\xd7\x85\xb1\xd6\xdf\xed\x75\x1d\x2d\x48\x26\xb2\x3c\xa1\x7a\x83\x27\x6b\x8d\xf3\xdb\x1d\xf5\xc2\x73\x56\xc4\xa9\x58\x86\x96\xae\xf7\x38\x92\x93\x24\x21\x8c\xdb\x83\x8f\x13\x78\x07\x97\x04\xab\xda\x10\x6a\xbd\xcf\x73\xb3\x84\x3b\x97\x43\x5f\x0e\x7e\x54\x44\x69\x2a\x35\xc6\xe0\x62\x8e\xbd\x65\x25\xce\xfb\xc4\x78\x91\x69\x1f\x84\xc3\x90\x7e\xb0\xb6\xe6\x6a\x42\x95\xf6\xcb\xc6\xd5\x68\x7a\x8b\xbe\xc1\x08\x62\xe0\x11\x60\x2e\x54\x0e\xc5\xbb\x8e\x8d\xde\x46\xce\xf9\x3c\x38\xd9\x72\x1b\xba\x61\xc9\xdf\xfa\x39\x5e\x56\xb8\x80\x41\xc4\x6b\x5f\x1a\x3b\x44\x0d\x20\xd5\x0f\x1a\x76\x48\x29\x0b\x56\x56\xf5\x34\x71\x02\xcd\x79\x66\xf0\x6c\x35\x12\x86\x56\x98\x65\x61\x7e\xae\x32\xc9\x97\xe0\x0c\x6c\xce\x3e\xbf\x38\xd6\xd9\x12\xdb\x6c\x87\x65\xee\xe0\x3b\x69\x93\x4d\xb6\xe1\x2c\xc9\x24\x4c\xd8\x7d\x4b\xe7\xf4\x84\x17\x96\x18\x16\x03\xd7\x6c\xc2\x6c\x37\x85\x4c\x42\x06\x3c\x0e\x55\x5a\x30\x1f\x99\x57\x61\xb3\x97\xa1\x37\x56\xe0\x6e\x97\x94\x5d\xaf\x13\xf6\x3b\x3a\x46\x3a\x3a\x56\x7b\x7c\x26\x3a\xe6\x30\x77\x7f\x88\x18\xc6\x75\x37\x0f\x2c\x3f\x2b\x45\x89\x23\x16\xef\x8c\x65\x45\x7a\xd3\x11\xce\xa2\x6c\xaa\x60\x48\xfb\x0d\x74\x51\x0b\x9b\xf4\x66\x5b\x85\x48\x92\xc0\x1c\x12\x27\x34\x91\x94\x72\x3a\xb5\xf9\xc4\x5a\x78\x3b\xad\xd1\xb2\x0c\x12\x4b\x16\x57\x84\x7b\xfb\x18\xc6\x89\x41\xec\x44\xd0\x18\x7f\x94\x22\x49\x40\x2a\x92\xb0\x5b\x20\x67\x90\x25\x62\xe1\xd2\x83\x79\x4c\xae\x35\xd5\x06\xa5\xaf\x41\xd7\xf3\xf9\x36\x42\x57\x5c\xf1\x28\x4f\x92\x91\x48\x58\x54\xcb\xa2\x52\xdd\xb6\x0b\xdc\xaf\x2c\x4f\x12\x92\xe1\x94\x43\xf2\x9e\x23\xc5\x38\x49\xee\xe8\x42\xf5\xc9\x25\xcc\x41\xf6\xc9\xc5\xe4\x52\xe8\x91\x15\xbd\xab\xd1\x76\xf6\x42\xc2\x26\xe4\x38\xb1\x9d\x71\x34\x9d\xa2\xe2\xe4\x7d\x80\x7d\x03\xff\xf2\x04\x96\x38\xdc\x31\xb5\x56\x53\x69\x8c\x38\x5f\xe1\x4c\x86\x50\xd9\xcf\x9f\x7d\x9b\x12\x36\x81\x68\x11\x25\xcd\xcf\xd5\x49\x84\xd1\x0b\x45\xa1\x91\x12\x7e\xbb\xba\x71\x2e\xd1\x11\x55\x40\xc6\x89\x2d\xe8\x66\x2b\xd5\x15\xa8\x1e\x56\x64\x55\x5d\xd5\xaa\x86\x58\x9b\x73\x36\xe5\x99\x99\x50\xfa\xda\xa8\xe7\xad\x94\x7d\xeb\x8d\xfc\x74\x04\x8b\x5b\x25\x09\xc4\x84\xa5\x29\xc4\x46\x85\x4f\x16\x84\x4e\x34\x26\x9c\x56\xcc\x03\x11\xf6\x83\x8a\x43\xd5\x8c\x19\xe5\x71\x02\x92\x4c\x28\x4b\x9c\x31\xa0\x72\xbd\x06\x99\x32\x8e\x36\x01\xeb\x8e\x45\xfb\x82\xf9\x14\x45\x42\xfa\x42\x7c\x4c\x2b\xff\x53\x71\x30\x91\x89\x94\x10\x60\xd9\xaf\x4c\xc6\x89\x88\x6e\x15\xc9\xb9\x66\x89\x5d\x8c\x10\xb7\xd8\x09\x2a\xc1\xa3\xd3\xe0\x64\x85\x3f\x07\x01\x95\x06\x66\x76\x75\xf4\x55\xf1\x13\x7e\x51\x97\x9b\xb7\x20\x85\xb5\x21\x83\xc1\x3d\x44\xad\x25\xbb\x1b\x5a\x6a\x76\x19\xfd\xfd\x82\x07\x51\x6c\x22\x0c\x03\x33\x7b\x5d\xa4\x29\x07\x72\x39\x24\xe7\xf7\x10\x95\xea\x1f\x60\xc1\x4a\x24\x04\x98\x23\x49\x6f\xe1\x05\x15\x5c\x6b\x90\xda\x56\x1e\x15\xb0\x9f\xda\x39\x7d\xbd\x26\xf7\x08\x92\x30\x8e\x64\xd1\xa5\xbb\x11\xc6\x15\x8b\xa1\x7a\x86\xec\x89\x75\x82\x2e\x89\x99\xc4\x0a\x02\x8b\x10\x7c\xed\xe7\xc2\xe4\x7c\x21\x34\x39\xe8\x1d\xf5\x0e\x57\x6c\x96\x3d\x23\xb8\x24\x60\x49\xb4\x35\x60\x46\xc5\xa2\x14\x4b\xb3\x64\x81\xeb\xe8\xc5\x7d\xc2\xb4\x8f\xce\x96\x39\xf7\xab\x72\x39\x78\x7d\xa2\x04\xd1\x92\xfa\x22\x20\xf6\x5b\x73\x91\x96\xb9\x63\x0e\x07\xbd\x8f\x3d\xec\xfb\x76\x48\xee\x04\xef\x69\x5c\xfe\x90\xdc\x08\x23\x7e\x17\x13\x2d\x44\x4e\x38\x80\x55\x21\xef\xb3\x84\x45\x4c\x27\x0b\x24\x74\x44\xe4\xda\xe6\xdf\x52\xed\x73\xff\xce\xef\x99\x76\x31\x6e\x06\x6d\x5f\x23\x34\x2d\xb1\x23\xd4\x48\x47\x73\x38\x9a\x01\x4d\xf4\xcc\x06\x96\x70\xc1\x07\xff\x04\x29\x30\x2b\x90\xbb\x5f\x5e\x5c\x71\xba\x56\xb4\x0d\x43\x7b\xbf\x87\xf6\xaa\x1c\xff\xfd\xe6\x66\xf4\x3d\xe8\x25\x92\x61\x9e\xe2\xc3\x7d\xd0\x82\x00\x72\x22\x64\xba\x07\xb4\xa3\xad\x06\x5f\x99\x90\xfb\x40\xc2\x66\x42\x35\xda\x4b\xb2\xb2\x9f\x42\x69\x54\xa2\x9c\x10\xc7\x21\x32\x3b\x58\x8d\x3b\xf1\x85\x80\x2f\x46\x43\xf2\xb3\xc8\xcd\xdb\x8c\xe9\x38\x59\x84\x2a\x06\x0a\x34\x79\x65\xa6\x7a\x65\xc8\x93\xc1\x86\xbf\x03\x8d\x8d\x66\x63\xa8\x07\xd0\xfd\x28\xf8\x4d\xdc\x79\x70\x6b\x6b\x97\x0f\xe4\x4a\x8b\x94\xcc\xdc\x6b\x57\x93\x2b\xdd\xc9\x18\xe2\xe9\xb1\x1a\x25\x56\x28\xb3\x14\xce\xdd\xf3\xe2\xe8\xd7\x0a\xdd\xb0\x70\x77\xdf\x8f\xb1\xea\x71\x54\x06\x9b\xab\x78\x6d\x93\x89\xb8\x05\x96\x41\x35\xa8\xe7\x5e\x29\x8f\x3d\x2e\x91\x59\x3b\x55\x73\x79\x22\x74\x04\x36\x8f\x0f\x6b\xb5\x40\x66\x3b\xb1\x06\x64\x9d\x61\xd6\xe1\x8c\x35\xda\xb4\x04\xc4\x4f\x53\xa1\xf1\x73\x00\xa0\x9d\xcd\x27\x6d\x42\x20\x6b\x21\x1c\x7c\x35\x18\x5c\x0b\xa3\xbe\x62\xba\xa6\x25\xae\x48\x26\x14\xc8\x79\xdd\x74\xed\x62\xb4\xf7\xea\xa2\xbe\xa1\xc0\x8f\x35\x99\xd0\x92\xf0\x3c\x1d\x83\x2c\xb2\x59\xa4\x5e\x05\x48\x29\x9a\xe1\xd2\x5e\xee\x4d\xc0\xd5\xfe\x12\xe6\xce\xbf\xfc\xdb\xbf\xfd\xe9\xdf\x86\x76\xfa\x10\xd9\xc0\xc9\xc5\xc9\xe5\xc9\xef\xd7\x1f\x4e\x31\x9f\xb6\x29\x54\x5b\x0a\xdb\x6c\x3b\x68\xb3\xd5\x90\xcd\x4f\x1a\xb0\x89\x69\x22\x8d\xa9\x48\xd5\x5f\x80\x53\x1a\x0c\x30\x7a\x9b\xd1\x38\x9d\xec\x57\x2a\xf4\x65\x64\xcd\xaa\xfd\xd5\x1c\xb5\xbd\x38\x63\x3a\xca\xae\x45\x74\xdb\xa2\x5e\xd3\xbb\x39\x1d\xd9\x29\x4b\xaa\x0d\xe5\xde\x18\xc2\xf8\x5c\x24\x73\x5b\x48\xf6\xe6\x74\x84\x27\x6f\x88\x7f\xa1\x21\x0a\x35\xea\x85\xb9\xd7\x27\x32\x38\xf7\x94\xd1\xbe\xad\x05\x8d\x12\x09\x34\x61\x4a\xb3\x08\xef\x2b\xcc\xa4\x66\x86\x26\x7e\xa9\x4e\x53\x5a\x37\x5a\xd7\x94\x7a\xef\xbd\xdb\x6e\x67\xa5\xa9\x69\xe0\xe1\x1e\xf3\x25\xc7\x8f\x6c\xc6\x47\xc7\x97\xbe\x08\xbe\x94\x49\xb8\xd6\x22\x6b\xc9\x13\x62\x27\xdb\xe0\x07\x19\xc3\x44\x48\x58\x76\x84\x94\x1c\x1b\xbe\xe3\x11\xc7\xec\x3f\x6f\x82\x12\x15\xe7\x85\x0d\xb9\x54\x79\x34\xf3\xd6\x44\x0e\x4a\x1d\xa1\xcb\x23\xcf\xac\x8a\x89\x4e\x94\x5c\x42\xdf\xbc\x1d\xa4\xb8\xba\x7e\x91\xc6\x60\x1e\x0f\xdc\x7e\x09\x3a\xb2\x66\x56\xef\x7f\x71\x16\x55\xbf\xfc\x65\x57\x49\x24\xa9\x9a\x01\xd6\x0f\x81\x7b\x56\x74\xd8\xa0\x4a\x70\x6b\xec\x75\xaf\x83\x8c\x46\x91\x8c\x2a\x65\x4d\xa7\x25\x27\x8f\xbd\x69\x24\xe2\x5e\x4f\x55\x6e\x98\x4a\x1a\x01\xc9\x40\x32\x11\x13\xcc\x27\x8e\xc5\x1d\x27\x63\x98\x32\xae\x3c\xfc\xcc\x44\x1e\xd0\x86\xdd\xd8\xd2\xb3\xbe\x16\xdb\x90\x5c\x55\x8a\xa0\xb8\xf4\xa4\x48\x14\x27\xda\xad\x62\xd9\xc9\x84\x11\xa1\xa5\xbe\x51\x61\x63\x7c\xd8\xac\x7e\x7c\xd1\x2d\x78\x9b\x0c\x68\x8b\xdf\x36\x42\x07\xcb\xc2\xd3\x68\xd6\xcc\xf1\xdb\xb9\xa7\xb6\x1c\x9d\x7b\x6a\xb7\xd1\xb9\xa7\x3a\xf7\xd4\xe6\xb1\x77\xe6\xdd\xce\x3d\xd5\x29\x5d\xcb\xa3\x73\x4f\x75\xee\xa9\x0d\x63\xef\xe8\x57\xe7\x9e\xda\x62\x74\xee\xa9\x2d\x47\xe7\x9e\xea\xdc\x53\x9d\x7b\xaa\x73\x4f\x7d\x41\x66\x40\x3f\x3a\xf7\xd4\xca\x24\x9d\x7b\xaa\x04\x8c\x4e\x53\x5a\x33\x3a\xf7\xd4\x9a\xd1\xb9\xa7\x4a\xa3\xe3\x4b\x35\xf8\x92\x77\xee\x8c\x8c\x5e\xd6\x3c\x67\x6d\x84\x8e\x03\x16\x39\x1f\x51\xb9\x33\x5a\x78\x54\xa9\x19\x5a\xa9\xe6\x87\x4f\xb5\x71\xde\xa0\xc2\xc7\xb4\x36\x1f\x6a\x57\x77\x84\x4f\x22\x54\x47\x99\xb0\xff\x2b\x9c\x11\x25\x2f\x84\xd5\x4e\xeb\xe7\xa4\x3d\x59\xb6\x55\x13\xd7\xc3\x5e\xbb\x1d\xf6\xc4\xb5\xd3\x82\xab\xa1\x73\x33\xbc\x38\x37\xc3\xcb\xe9\x28\xeb\x9c\xf9\x37\x33\x09\x6a\x26\x92\xda\x88\x5e\x41\xf2\x77\x8c\xb3\x34\x4f\x0d\xce\x29\x83\xcf\x6c\x1e\xa2\x06\x54\x40\x57\x4b\xe8\xad\xa5\xd0\x5c\xc8\x62\xc0\x02\xa8\x94\x25\x66\x1b\x31\xad\x73\x46\x51\x54\x57\x79\x14\x01\x60\xf3\xb2\xb2\x16\xf3\xa7\x61\x78\x52\x68\xa7\xf1\xa6\x19\xbd\x69\xc6\xfb\x6d\x89\x52\x9c\xe5\x4f\x7f\xac\x35\x47\x43\x2f\xcf\xe7\xf7\xf0\xb4\x40\xa6\x9b\xeb\x2b\x8d\x74\x95\x36\xb8\x44\x53\x1d\xe5\xb9\x79\x72\x5a\xf3\x68\xb6\xe0\xc1\xd9\x23\xef\xcd\xde\xb0\x85\x7d\xf1\xd8\xec\x61\xf5\xd5\x16\x1c\x0c\x6d\x78\x68\xda\xf3\xce\x7c\x82\x22\xa5\x9f\xc6\x2b\xd3\xa2\x36\xdc\x92\x37\xe6\x73\x78\x62\x5a\x79\xeb\xa6\x1e\x98\xcf\xe7\x7d\x69\xe7\x75\x1b\x5a\xb7\x5e\x84\xc7\xa5\x05\xab\x56\x9b\x16\xad\xd6\xac\x59\x9f\xcc\xc3\xd2\xdc\xbb\xb2\x07\x9e\x95\xc6\x40\x66\x9c\x69\x46\x93\x33\x48\xe8\xe2\x1a\x22\xc1\xe3\xda\x1c\x66\xa9\x6a\x5d\x38\x3f\xca\x4e\xeb\x74\xb4\x6a\xfc\xf1\x8c\xba\xe2\xbc\x10\xfb\x90\x6a\x6f\xfe\x73\x02\x05\x36\x34\xb1\xab\xdc\x4b\x83\x1e\xd9\x1b\x65\xd0\x06\x63\xb7\xb9\x89\x7f\x17\x77\x44\x4c\x34\x70\x72\xc0\xb8\xdf\xc7\xc3\x92\x1a\x58\x68\xe6\x01\xad\xcd\xaf\x6f\x5e\xfb\x8b\x5f\x9e\xca\x8d\xc6\x05\xa5\x3e\xbd\x05\xc4\x3d\xe8\x71\x13\x88\xbb\x70\x92\x27\x55\x33\x88\x35\x8d\x54\xe9\xcd\x9b\xa2\xbc\xe8\x1b\x9c\x37\x9c\x36\xca\x63\xe2\x12\x37\x5e\xde\xa6\x35\xf6\x1b\xbf\x04\x9f\x71\x67\x7b\x21\x6d\xdb\x5e\x9e\xc8\x37\xbc\x87\x52\xf3\x33\xf5\x07\x77\x52\xf3\x0e\x43\xb3\x14\x44\xae\x3f\x8b\x98\x78\x37\x63\xd1\xac\xcc\xf5\x58\x0a\x8a\x88\x7c\x49\x7e\x7e\xe3\x6e\x5b\xcb\xb2\x3a\x59\x71\xed\xa8\x6b\x01\x5a\xa3\x26\x2f\xa7\x13\x16\x2d\x23\xa9\x22\x94\x9c\x5d\x5e\xff\xfe\xf6\xe4\x3f\xcf\xdf\x0e\xc9\x39\x8d\x66\xe5\x5c\x53\x4e\x28\x52\x42\x3c\xd4\x33\x3a\x07\x42\x49\xce\xd9\xff\xe4\xb6\xf2\x30\x39\x08\xf7\x1e\xb6\x5a\xe7\xb4\xe6\xc9\xc2\xb6\xb6\xad\xf5\x51\xb1\x4d\x72\xad\xf3\x52\x18\x6d\x51\x8a\x74\x99\x34\x9e\x9b\x9f\xac\x10\x81\x64\x74\x06\x12\xc8\x94\xcd\x9d\x5f\xc6\x15\x8e\xa5\x71\x70\xa7\x1a\x3c\x37\x68\x61\x44\x10\x3a\x46\x37\xe8\x0c\x08\x07\x6d\xd0\x3a\x28\xa3\x82\xab\x4a\xd2\x6f\xae\x40\xf5\xc9\x38\x47\xc7\x6d\x26\x59\x4a\x25\x4b\x16\xe5\xc9\x68\x32\x24\x97\xc2\x8b\x3a\x8b\xe5\x25\x9d\xbd\x3f\xbf\x26\x97\xef\x6f\x48\x26\x6d\x3a\x30\x7a\x5e\xf1\x77\x7c\xad\x31\x98\x3b\x5c\xff\xbd\x21\x39\xe1\x0b\xfb\xa3\x3d\xe0\x4c\x11\x23\xe7\x00\x37\x17\x39\xfe\xe0\x0b\x3e\xbf\x7a\x3d\xc4\xff\x5e\x99\xb7\x94\x86\x81\x04\x87\x72\xb4\x12\x18\x62\x59\x0c\x1b\x27\x25\x68\xba\x77\x7f\x51\x9d\x54\x42\x48\xcc\xc8\x00\xb1\xd4\x49\x85\x86\xad\x46\xf0\xda\xce\x3a\x8c\x4f\x93\x32\x56\xd5\x23\xfb\x4d\xe5\xc6\xa6\x52\xe3\xa0\x78\x83\x51\x5d\xe1\xb1\x95\x8e\x2e\xc5\x1a\x5a\xea\x83\x50\x70\x3f\x2f\x2a\x39\x8a\x20\xca\xad\xed\x2e\x46\xfe\x04\x0c\x6d\x3d\xf5\x74\xa9\x1f\x1a\xde\x6c\x0d\x96\x7d\xf2\x9a\xfc\x8d\xdc\x93\xbf\xa1\xe8\xf4\x97\xa6\x5d\x23\x9a\x0a\x35\xcd\x55\x37\x2b\xb1\x5f\x8c\x5a\x82\xf8\x4f\x86\x3a\x99\x19\x0d\x54\x8d\x2a\xcd\x78\xec\x3a\x84\x6a\x90\x86\x8e\xba\x9d\x78\xd2\x7e\x1b\x66\x81\x9f\x11\xcd\xac\x5d\xf2\x62\x52\x2e\xf7\xae\x77\x44\x34\x73\xbb\xd1\x81\x2e\x1d\x15\xaa\x16\x8f\x2f\x66\x4b\xa9\x8e\x66\x55\x32\x66\x04\x35\xa5\x8b\x03\xa6\x48\x2c\x50\x4b\xb6\x31\x3e\x33\xd6\xc0\xcb\xba\x3f\x68\xdc\xcc\xf1\x56\xd9\xcf\x87\x76\x6a\x49\x39\x42\xbb\x8e\x13\xac\x4a\xa5\x23\x32\x11\x3b\x99\xcc\x2c\x2b\x2e\xf1\x8c\x07\x84\x32\xa7\x87\x05\x73\x14\xe2\x92\x39\x4f\x11\xe5\x36\x38\x73\x02\x52\xda\xb0\xac\xf1\x82\xb8\x66\xfc\x8d\x37\xaf\xd1\x49\xca\xa4\xd0\x22\x12\x0d\x5a\x82\x54\x9d\x61\x6e\x3a\x04\x82\x35\xec\x78\x7b\xda\x8f\x67\xa3\x3e\xb9\x39\x1d\x61\xa7\x84\xeb\xd3\x9b\x51\x55\x53\x79\x75\x73\x3a\x6a\xd0\x5a\xbe\x15\xbd\xd0\x49\x56\xc7\x66\x99\x35\x26\xa9\x28\x95\x46\x6c\x1b\xa4\x34\x1b\xdc\xc2\xa2\x26\x4f\x6d\x83\xaf\x0f\xc2\x0e\xb7\xf2\x42\x16\xcc\x29\xcd\x76\x9e\x4d\x02\x8d\xd9\x67\x8a\x90\x76\x27\xab\x78\xe6\xfa\x50\xe9\x54\xcc\x21\xb6\xe2\xb0\xbf\x03\x78\x9c\x09\x66\xe4\xc5\x2e\x7e\x7a\xf7\xbb\xbb\xf8\xe9\x87\x46\x17\x3f\xdd\xc5\x4f\x77\xf1\xd3\x0f\x8f\x2e\x7e\xda\x8d\xa7\x37\x83\x92\x2e\x7e\xba\xe6\x78\x59\x3e\xbc\x2e\x7e\x7a\xa7\xd1\xc5\x4f\xaf\x8e\x2e\x7e\x7a\xc3\xe8\xe2\xa7\x37\x8c\x2e\x7e\xba\x8b\x9f\xee\xe2\xa7\xbb\x48\x90\x47\xe7\xda\xcf\x48\x10\xd2\xc5\x4f\xbb\xd1\xc5\x4f\xbf\x88\x98\x18\xd2\xc5\x4f\x6f\x35\xba\xf8\xe9\x2e\x7e\xba\xce\xe8\xe2\xa7\x71\x74\xb6\x97\x2e\x7e\xda\x8f\x2e\x7e\xda\x8e\x2f\x47\x6a\xee\xe2\xa7\x5f\x84\xac\xe8\x7b\xd7\x34\x8f\x07\xee\x9d\x8a\x34\xcb\x35\x90\x2b\x3f\x65\xe0\x10\x64\xbc\xb0\x81\x3d\xa5\xd3\xde\xdc\x3d\x1f\x09\x3e\x61\xd3\x5c\x62\x60\xef\x91\x6d\x0c\x33\x88\xec\x22\x06\xe1\xbd\x06\xe1\x99\x47\xcf\xd0\x45\x9f\xb0\x94\xd5\x8b\xd5\x26\x2b\xfb\xf3\x16\xe7\x2a\xd9\x71\xcd\x81\x4a\xe9\x3d\x9e\x14\x9a\x8a\xdc\xf6\xd4\x71\x10\x2c\x30\xc3\x5a\xbb\xf7\x75\x83\x48\x3b\xc2\x4c\x11\x7b\x3e\x6a\x41\xae\xc8\xa8\xd6\x20\xf9\x31\xf9\xaf\x83\x5f\xbf\xf9\x38\x38\xfc\xf6\xe0\xe0\x97\xd7\x83\xbf\xfe\xf6\xcd\xc1\xaf\x43\xfc\xe3\x5f\x0f\xbf\x3d\xfc\xe8\x3f\x7c\x73\x78\x78\x70\xf0\xcb\x0f\xef\xbe\xbf\x19\x9d\xff\xc6\x0e\x3f\xfe\xc2\xf3\xf4\xd6\x7e\xfa\x78\xf0\x0b\x9c\xff\xb6\xe5\x24\x87\x87\xdf\x7e\x5d\x7b\xc9\x8d\x99\x5f\x7b\xac\xaf\x25\xc6\xf7\x49\xd8\x9e\xf3\x03\xb5\x74\x24\xaf\xdc\x6c\xcb\x87\xd2\xb1\xaf\x87\x0e\xa5\xa7\xad\x18\xab\x1a\xe6\x61\x8a\x88\x94\x69\xa3\x47\x18\x85\x8e\x96\x23\x40\x98\xae\x88\x9f\x8e\x1c\x60\xe8\x14\xd5\xb6\xd3\x57\x88\x9e\x28\x45\x64\x0a\x3d\x03\x79\xc7\x94\xef\xa0\x16\x34\x13\x3c\xd6\x83\x18\x26\x8c\x83\xb3\x78\x77\x24\x62\xeb\xd1\x91\x88\x97\x48\x22\x14\x44\xb9\x64\x7a\x71\x2a\xb8\x86\xfb\x5a\x2a\x55\x95\x42\x5c\xbb\x09\x89\xc8\x6c\x54\x94\xd7\x1a\x5d\x44\x9d\xcc\x39\x86\x42\xef\x7c\xf2\x32\x91\xb0\x68\x71\xe4\x17\x8c\x47\x0c\xee\xf5\xd1\x96\xf3\x68\xaa\x6e\x8b\xe3\x0b\x03\x23\x1f\x17\xa7\x74\x65\xd6\x67\x28\x7a\xa1\xd4\x33\x92\x6c\xce\x12\x98\xc2\xb9\x8a\x68\x82\x54\xaa\x1d\xca\x7f\xb2\x61\x76\x24\xd8\x52\x24\x8a\xdc\xcd\x00\x3b\x1e\x52\xf3\x26\xa8\x32\x47\x94\x93\x29\x65\x9c\xa4\x66\x8b\x32\x7f\xb3\xc1\x09\x43\x97\xb5\x22\x19\x95\xc0\xb5\xbf\xc1\x25\xd8\x8c\x85\x48\x5c\xc8\x5f\xb2\x28\xe6\x77\x31\xb3\x5c\xfc\xce\xe1\xee\x77\x33\x9b\x22\x93\x84\x4e\x43\xcc\xad\x02\xbd\xa2\xa5\x17\x53\x6f\x7c\x01\x8c\xa7\xcb\x81\xd0\xe4\x8e\x2e\xf0\x35\x96\xe7\x60\xea\x98\xbc\x39\x44\xd4\xa5\x8a\x84\x39\x62\xf2\xc7\x43\xf4\x01\x9c\x9e\x8c\x7e\xbf\xfe\xf9\xfa\xf7\x93\xb3\x77\x17\x97\xcd\x08\xbe\x79\x77\xa0\xbc\xd6\x1c\x11\xcd\xe8\x98\x25\xac\x09\x9d\x5f\xf1\x12\x97\x27\x45\x86\x1a\xc7\x47\xb1\x14\x99\x85\x93\xcc\x39\x26\x0f\x16\xd9\x23\x55\x0d\xb7\x9c\x51\x88\xdb\x33\xa9\x4e\x38\x95\x94\x6b\xaf\x6f\x95\x41\x2e\x73\x6e\x94\xe6\x67\x1e\x50\x4b\xe3\xf6\x82\x69\x4f\xe2\x18\xe2\x0a\xf4\x5e\x5c\xf0\xce\xa9\x7f\xb9\x45\x91\x5b\x49\x46\xef\xaf\x2f\xfe\xcf\x12\x1a\x2e\xb2\x66\xb1\x0a\xed\xe4\x73\xc8\xfa\xcd\x82\xc9\xf2\xab\x5f\xb9\x7c\x81\x6e\x7f\xf7\x62\x7f\x03\xaf\x6a\xc7\x43\x76\x95\xf3\x6a\xfa\x7d\x31\x3f\x49\x45\x0c\x43\x32\xb2\x6c\x0a\xd4\xd2\xaf\xa5\xb4\x3c\x2a\x81\x98\x4b\xb8\x66\xd8\x95\xd8\xe8\x53\x73\x9a\x80\x0d\x81\xc4\x20\xf8\x4a\x46\x61\x99\x0e\x4f\x68\xa2\x1a\x12\xd3\x26\x9c\xc9\x30\xe1\x77\x46\x35\x6c\x05\x9a\x61\x36\x12\x03\x17\xda\xe9\xa0\x66\x95\x98\x64\x29\x45\x44\xac\x1e\x5a\x0a\x67\xa8\x70\x17\xd7\xab\xda\x33\x26\xa6\x3c\xac\x46\x61\x66\x6b\xc1\xcd\x15\xa8\xf5\x8c\xa9\xd0\x4c\xcd\xec\x12\x68\x8c\xb9\x24\x19\xd5\x33\xeb\x8d\x4c\xa9\xba\x85\xd8\x7e\xe1\xe4\x1a\xa7\x01\x2b\xd7\xb7\xda\x3d\xea\xc6\xac\x7b\x02\x54\xe7\x12\xac\x3c\x63\x7d\xa4\xc0\xe9\x38\xa9\x97\x2c\x4f\xda\x38\x02\xe6\x9d\xde\xf3\x64\x71\x25\x84\xfe\x2e\xe4\x50\xb4\xb2\x81\x3f\x39\x49\xb1\x6a\x62\x45\x51\x0a\x9d\x87\xf1\x00\x81\x89\x28\x5d\x4e\xdf\x38\x2b\x36\xec\x89\x11\x5a\xe6\xfc\x44\x7d\x2f\x45\xde\x4e\xbb\x78\x83\x8d\xdf\x5f\x9c\xe1\x39\xce\xed\x19\x06\xae\xe5\x02\xb3\xc5\x56\x0b\x7d\x04\x99\xf6\x47\x83\x9f\x4b\x18\x69\xe4\xe4\x9c\x2b\xd0\x43\xf2\x8e\x2e\x08\x4d\x94\xf0\xc2\x31\xe3\x64\x84\x31\x16\x65\x95\x6f\x48\x30\xa3\xd5\xfe\x3c\x16\x7a\x46\x96\x2e\x40\x74\x5e\xbd\xcf\x66\xe8\x58\x87\x45\x51\x79\x84\xf1\x95\xdb\x35\xbd\x05\x45\x32\x09\x11\xc4\xc0\xa3\x86\xbb\xd6\x9a\xef\xe1\x2f\x7f\xae\xbf\xf3\x97\x82\x9b\x63\xd1\xca\xde\x5f\xf0\x98\x45\xd4\x52\x31\xaa\x97\x76\x1a\xbd\x86\x4e\xef\xa0\x98\xda\x83\x87\x22\x57\x20\xd1\x8e\x66\x14\x17\xbb\x11\x3f\xe4\x63\x48\x40\x5b\x65\x08\xf3\xc5\xa9\xb6\x39\x55\x2c\xa5\x53\x20\x54\x07\x44\xd1\x82\x00\x57\x39\x36\xd0\xa7\x1a\xcd\x6c\x02\x8a\xc4\x27\xaa\xc8\x8f\x17\x67\xe4\x35\x39\x30\xcf\x3a\xc4\xed\x9f\x50\x96\x60\x80\xb9\xa6\x72\x79\x8d\x6c\xe2\xa7\xc0\x25\x21\xee\x11\x21\xed\x11\xed\x13\x2e\x88\xca\xa3\x99\x5f\x93\xd1\xb8\xbc\xc2\xe6\xe2\x70\xd0\x52\xff\x02\x51\xb5\x31\x81\xf9\x51\x81\x6c\x8d\xbe\xfc\x58\x83\xbe\x94\x45\x08\x83\x73\x55\xe8\x59\xc4\x4a\x41\xd3\x98\x6a\xea\xe8\x4e\x91\x2d\xf9\x12\xb7\xf4\xa9\xa9\x8f\x82\xb7\x8c\xe7\xf7\x36\x70\xa3\x3d\x25\xff\xfa\x1c\xa7\x25\x91\x07\x1a\x6e\x1a\xcd\xb2\x84\xd9\x3c\xc5\xa5\xc8\x87\x8b\xca\x56\xf7\x37\x88\x48\x78\xcc\x69\x92\x08\x43\xde\x0c\x67\xa7\x3c\x16\xe9\xca\xc3\x8c\x00\x05\x95\x02\x55\x43\xf2\x22\x91\xe7\xc9\xcd\x11\x09\xcc\xa1\x41\x2d\x86\xe5\x7a\x5a\x66\x36\x23\x8b\xf9\x0d\xc5\xe9\x49\x42\xc7\x90\x58\xce\x62\x11\x48\xad\x22\xd0\x53\x47\x0f\x49\x91\xb4\x17\x3b\x7d\x25\x12\x0c\xd9\xa0\x01\x10\x66\xfa\x67\x01\x07\x9c\xa4\x2d\x38\xa0\x22\x53\x81\x03\xaa\x64\xcf\x01\x0e\x79\x03\x46\x4b\x96\xe1\x60\xb8\x76\x15\x0e\xc8\x3a\xf7\x1d\x0e\x0a\xa2\x48\xa4\xd9\x48\x0a\xa3\x72\xb5\xc6\x5a\xdc\xb4\x85\x3b\xc8\xea\xe4\x6b\x02\x6c\x90\x94\x57\x2f\xa6\xe8\x36\x10\x73\x16\x43\x6c\x24\x58\xa4\xf1\xde\xa1\xf4\xbf\xca\x5d\x0b\x0d\xe9\x59\xe6\x43\x7e\x16\x31\x07\x29\x7d\x85\x01\x73\xa7\xfb\xe1\x99\xa7\x01\x37\xb0\x92\xb5\xc2\x4c\x44\x44\x13\x2c\x95\xd5\x0c\x63\xc8\x32\xd6\x2c\x4f\x4c\x58\xd0\x90\xd0\xb5\x84\xdf\x79\x2f\x3e\x56\x4d\xc2\x6f\x9c\xed\x8b\x8b\x18\x4a\xd5\x3b\x72\xac\x7b\x78\x63\x23\xf1\xf0\x3a\x1f\x88\x69\xb8\xba\xf7\x06\xc6\x95\xbb\xb5\x70\x95\x1b\xde\x85\x02\x5c\x66\x81\xc0\x63\xc6\xa7\x68\xd1\xe9\x13\x09\x09\xc5\x40\x77\x77\x86\x6f\xad\xfa\xd5\x43\x8c\xf6\x93\x7a\x74\xf6\x8f\x46\x49\x88\x09\xee\x66\x46\x23\x87\x97\x6f\x26\x96\x5a\x32\x45\x5e\xbd\xf5\x00\x68\x50\xb1\x68\x1f\x19\xc4\x2b\xfb\x86\x61\x37\xad\x8d\xed\x96\xf1\xd8\x45\x50\x56\x80\x15\x6a\x4b\x5a\x29\x74\x48\x3e\x60\x11\xb4\x12\x69\x38\x26\xbf\x72\x12\x80\x45\x06\xb5\xd1\xe3\xca\x0a\xac\xde\xbc\x34\x78\xd8\xe4\x17\x1e\xb2\x3c\xcd\x8f\x1c\xf7\xde\x3c\x77\x60\xd4\xde\xd5\xeb\xfc\xbb\xbc\x7a\xca\x7d\xbd\x63\x3c\x16\x77\xaa\x6d\x1d\xe2\x27\x3b\xad\x17\xa8\x23\x83\xd6\x9a\xf1\xa9\x2a\xeb\x11\x34\x49\x2a\x66\xd8\x75\x8a\x84\xdf\xe1\x50\x49\x74\x55\x80\x0f\xc8\x61\x01\xdf\x29\x01\x3b\x8c\x69\xaa\xe8\xa9\x34\xaf\xa2\x19\x4d\xae\xb3\xfa\x25\x95\xc8\x32\x1a\x7c\xff\xee\xfa\xa4\x3a\xb5\xa1\x67\x77\x58\xa9\xd6\x00\xdb\xfc\x4e\x68\x9c\x32\xa5\xd0\x0c\x04\xe3\x99\x10\xb7\xe4\xc0\x87\x6d\x4c\x99\x9e\xe5\xe3\x61\x24\xd2\x52\x04\xc7\x40\xb1\xa9\x3a\x72\x48\x3b\x30\xab\x3f\x24\x8c\x27\x8c\x97\x4c\xf3\x58\x83\xd5\x99\x31\xf0\x21\x51\x58\x05\xee\xad\xab\xb3\xe7\xbc\xcc\xab\xcb\xb4\x95\xf5\x18\x24\x4f\x5f\x28\x62\x75\x7b\x2e\x1b\xe6\xbc\x3f\xb2\x45\xf8\xee\xae\x42\x53\x39\xfd\x61\x2d\x1c\xad\xf4\xf6\xe4\x40\x0a\xd6\xb1\x56\x61\x83\x56\x32\x37\xa9\x21\x04\x9e\xa2\x35\xb1\x9a\x99\x4b\x3e\x95\xe5\xec\x79\x90\x3d\xd2\x74\xd3\x5d\x5e\x5f\x4b\x95\xfd\xae\x4b\xb3\x95\x64\x91\x60\x7b\x1f\x89\xd8\xe6\xf5\x86\xbc\x44\x2c\xc8\x8d\x79\xc6\xec\x9f\x9e\xdb\x14\x1c\x8b\x0b\x1b\x70\x5a\x4e\xf8\x75\x85\xcd\x62\x62\x04\x87\xc4\x2b\x3a\x69\x96\x18\x7a\x56\x99\xd9\x1a\xf1\x67\x4c\x95\x4b\x01\xf6\xc3\x42\x56\x1a\xaf\xf7\xc9\x7f\x1b\xc9\x91\x86\x68\xa8\x4a\x67\xf8\x90\x34\x89\xee\x46\x57\x17\x14\xcb\x9c\x68\xe1\xf5\x28\x12\xb3\xc9\x04\x7c\xd4\x95\x91\x83\xa9\xa4\x29\x68\xf4\x30\x5b\x10\x8c\x61\xca\x6c\x58\x8f\x98\x10\x6a\x16\xd2\xeb\xa9\x22\x8d\xaf\x6f\x43\x7f\x98\x26\x29\x9b\xce\x2c\xa2\x10\x4a\x12\xc1\xa7\xc4\xfb\x17\x12\x41\x63\x82\xb8\x2d\x24\xb9\xa3\x32\x25\x94\x44\x34\x9a\xa1\xb3\x82\x72\x12\xe7\x12\x6b\x5d\x69\xa0\xf1\x62\xa0\x34\xd5\x86\xef\x83\x74\xe2\xb1\x5f\x7f\x57\x0f\xf1\xc1\xd1\xd5\x43\xdc\x3c\xba\x7a\x88\x5d\x3d\xc4\xae\x1e\xe2\xc3\xa3\xab\x87\xe8\xc6\xd3\xa7\x35\x92\xae\x1e\x62\xcd\xf1\xb2\x72\xf2\xbb\x7a\x88\x3b\x8d\xae\x1e\xe2\xea\xe8\xea\x21\x6e\x18\x5d\x3d\xc4\x0d\xa3\xab\x87\xd8\xd5\x43\xec\xea\x21\x76\x95\x5d\x1e\x9d\x6b\x3f\x2b\xbb\x90\xae\x1e\xa2\x1b\x5d\x3d\xc4\x17\x51\xe3\x86\x74\xf5\x10\xb7\x1a\x5d\x3d\xc4\xae\x1e\x62\x9d\xd1\xd5\x43\xc4\xd1\xd9\x5e\xba\x7a\x88\x7e\x74\xf5\x10\xed\xf8\x72\xa4\xe6\xae\x1e\xe2\x8b\x90\x15\x95\x8e\x59\xad\x12\x2f\xdb\x64\xe4\x3a\xaf\x6f\x29\x87\x67\x9c\x4f\x26\x20\x51\xd8\xc0\x27\xaf\x78\x18\x43\xe5\x8e\x10\xd9\xe0\x7c\x88\x0a\x74\x1f\x93\x7b\x5d\x64\xdf\x86\xdb\x5d\xd2\x10\x96\x62\x91\xa0\x30\xa1\x95\x93\xf3\xf7\xdf\xb5\x93\xfe\xdb\x2c\x33\x0f\xd7\xfc\x9e\x47\xcd\xe3\x50\x0a\x80\xaf\x8b\x34\x75\x70\x8f\x12\xa1\xac\x1f\xd8\x02\x2b\x9a\x51\xce\xc1\x0b\x86\x4c\xa3\xc2\x35\x06\xe0\x44\x64\xc0\x6d\x80\x5b\xe8\x3b\x4e\xb5\xa6\xd1\x6c\x68\x9e\xc4\x3d\xb0\x5d\xa5\x9b\x62\x46\xa5\x25\xd0\xd4\x02\x5d\x42\x4a\x99\x9d\x8a\xd0\x48\x0a\xa5\x48\x9a\x27\x9a\x65\x61\x32\xa2\x00\x23\xf7\x6c\xe0\x66\x00\x06\xba\x8e\xc1\x3a\x6a\x31\x1f\x35\x3c\xcd\x2d\x4b\x94\xab\x1f\xa0\x58\xda\xc7\xf2\x6d\x69\xa6\x17\x21\x46\x06\xc8\x84\x49\xa5\x49\x94\x30\x94\x9a\xf0\x89\x36\x49\x02\xe7\xeb\xa3\x50\xab\xb1\xea\x0c\xae\x54\xb9\xa5\xf2\x18\x59\x52\xa6\x95\x8d\x38\x29\x26\x74\x53\xc5\x4c\x39\x16\xae\xfa\x84\xfa\xdc\x7e\x0b\x68\xbf\x52\x04\x75\x8c\x93\xf9\xd9\xdd\x57\xa5\xe9\x4a\x05\x81\x8a\x90\x9c\x02\xd1\x31\x79\xdf\x23\x67\xbf\xd2\x28\x3f\x0b\xe5\x1d\xd0\x95\xbd\x72\x0c\x70\x03\x38\xcc\x0d\x0e\x40\x04\x46\x63\xa0\x1b\xb0\xfe\xb3\x23\xbd\x06\x99\x32\x8e\x91\x39\xef\x40\x29\x3a\x85\x51\x4d\x8b\xe4\x26\x69\x0b\x8d\x92\xc5\xc6\x20\x2a\x24\x36\x0e\x3f\x7c\x53\x84\x30\xf4\x54\x79\x49\x24\xb5\x6b\x0a\xb1\x52\x77\x92\x69\xa3\xe4\x32\x65\xab\x40\xa0\x53\x63\x39\xd3\xa6\xb7\x14\x08\xf1\xce\x4f\x52\xdc\x6c\x88\x3a\x8f\x5d\x3f\x65\x20\x63\xc9\x60\x42\x26\x0c\x63\x1d\x30\xfa\xa0\x6f\xf3\x9a\xa9\xd5\x16\x94\x32\xb2\xac\xe0\xde\xd7\xed\xd7\x35\x24\x3f\xb9\x85\x69\x99\xf3\x88\x96\xaa\x1d\x61\x2c\x3a\x9b\x90\x29\x46\x2f\x48\x1b\x19\xf5\xe7\xd7\x7f\xfd\x0b\x19\x2f\x0c\x4b\x43\xab\xb4\x16\x9a\x26\xe1\x25\x13\xe0\x53\x03\x2b\x7b\x3c\xab\xd1\xd4\x01\x02\x58\x83\xd5\x2e\xfc\xcd\x1f\x6f\xc7\x55\x1e\x7b\x14\xc3\xfc\xa8\x04\xbf\x41\x22\xa6\xeb\x8a\xdb\xd6\x0f\x87\xaa\x29\xee\xac\x41\x33\xac\xf8\xd6\x18\xd1\x7c\x82\x3d\x99\x89\x3b\x5b\x29\x64\x0d\xf6\x14\xf1\x4d\x99\xc8\xf2\xc4\x5a\xa7\xbe\x0b\x79\x08\xb9\x82\xd5\x60\xe3\xb5\xe7\x02\xed\x29\x6e\x8a\x25\xaa\xe1\x82\x56\xfc\x23\x85\x8b\xdb\x74\x1a\x7f\xc8\xb3\xcf\x25\x0c\xc9\x77\x34\x49\xc6\x34\xba\xbd\x11\x6f\xc5\x54\xbd\xe7\xe7\x52\x0a\x59\x5d\x4b\x42\x0d\xb5\x9c\xe5\xfc\xb6\xda\x9f\x38\x11\x53\x23\x5a\x65\xb9\xf6\x41\x82\xeb\x5e\xd8\x66\xd6\x78\x22\xec\x48\x6b\x69\x16\xb8\x47\x1c\xba\x63\x06\xdd\x38\x01\xf3\x7c\x8b\x91\xe5\xf9\x55\x19\xd9\xfe\xf8\xfa\xcf\xff\x6e\x51\xd7\xa8\x0e\xff\xfe\x1a\x03\x9b\x54\xdf\x1e\x62\xa4\x6d\x86\x51\xa4\x34\x49\x8c\xb6\x50\x46\x4a\x03\xe8\x75\x48\xf8\xd9\x71\x50\x37\x47\xb7\xad\x45\xa9\x9b\x9b\x9f\x51\x8e\x62\x5a\x41\x32\xe9\xdb\x88\xdf\x50\x23\xa6\x87\x8c\xa1\xe7\xa8\x8f\xe1\xab\xfb\x20\x00\xcd\x45\x92\xa7\x70\x06\xd8\x5a\xbe\x31\xa8\x2a\xb3\xf9\xa8\xb8\x84\x29\x0c\xae\x1e\x27\x22\xba\x25\xb1\xfb\xb1\xe4\xa2\x5e\xae\x15\x57\x1f\x0a\x75\x9d\xf5\x0d\x9c\xf4\x1b\xdf\xbf\xe2\x9e\x4f\x69\x96\x85\xf8\x5b\x49\xef\x2a\xc0\xc0\x33\x89\x89\x4d\x0d\x13\x47\x1b\x9b\x90\x9a\x1a\x90\x06\xee\x8d\x0c\xdd\xac\x3d\x45\x6d\xf7\x74\x73\xfb\x53\xb1\xfa\xfa\x46\x87\x0a\x42\x14\x13\xfa\xd3\x90\xe1\xdf\x36\xf4\x72\x25\xe3\x20\x04\xad\x07\xc4\xb0\x02\x80\x41\x1f\x24\xc9\xf5\x8d\x29\x2d\x58\x2e\x9a\xc5\x26\x54\xe0\xc2\x83\xc5\x28\xa5\xda\x09\x84\xde\x34\x45\x49\x06\x52\x31\x65\xf8\xf2\x07\x3c\x50\xa7\x09\x65\xa9\xd7\x2c\x33\x11\x3f\x0d\x10\xec\xe1\xc6\x12\x5f\xcd\x29\xe5\x48\xc4\x6e\x42\x24\x85\xb6\xbc\xd9\x1a\xb1\xb6\x2a\xd5\xb6\xc8\x50\x9f\x9a\x54\x7e\x28\xa0\x59\xa5\x94\xe6\x9b\x40\x2a\xed\x55\x2f\x89\x40\xe2\xfb\x3d\x57\xfa\x18\x16\xdf\x12\x19\x40\xc2\xe8\x36\xb7\x4a\x09\x2b\xca\xa3\x3d\x28\x25\x91\xde\xe9\x81\x43\x62\xdd\x65\xe6\x4c\xb8\x5b\x49\xef\xb8\xf7\xa4\x44\xd2\x82\x48\x8a\x8c\x4e\x1b\x15\x6b\x5e\x82\xd4\xf2\xb4\x24\x06\xab\x04\x80\x42\x35\x08\x7f\x0f\xf5\x15\xf0\x2a\x88\x8b\x8c\x5b\xcc\xa7\xb6\x9e\x0f\x0f\x60\xa7\x20\xd8\x5c\xa7\x3b\xba\x20\x54\x8a\x9c\xc7\xce\xbe\x14\x0c\x7c\xef\x96\x1e\x7c\x29\x38\xaa\x19\x3e\x0f\xdf\x88\xae\x18\x60\xc5\x14\x19\x83\xa6\x86\x4c\xbf\x19\xbe\x79\xfd\x52\x38\x15\xbe\xe1\x12\xa7\xba\x0c\x9c\xca\xd2\xa7\x27\x7d\x57\x5f\xd6\xb1\xa5\xf7\x7d\xe7\x4c\x2c\x45\xd5\x46\xe6\xab\xd2\xe1\x57\x77\x92\x69\x28\xb5\x64\x38\x40\xc5\xc5\xe8\x87\xa5\x8c\xc7\xc3\x16\x8b\x95\xb6\x51\x7c\x8d\x10\x95\x8f\x3f\x21\xdd\x72\x04\x0a\x8f\xdb\x3a\x0b\x97\x7a\x80\x84\x95\x01\xf5\xea\x15\x39\xb0\x57\xf6\x6c\xd6\xcf\xe1\x93\xa2\x96\x03\xda\xf9\x7d\xd6\xa0\x98\x4e\x05\x70\xe7\xf7\x19\x45\x1b\x5c\xd6\x22\x04\xff\x13\x66\x74\x0e\x98\xed\xc4\x12\x2a\x93\x85\x01\xe5\xb5\x5d\x3b\x19\xe7\x9a\x00\x9f\x33\x29\x38\x3a\xef\xe7\x54\x32\x3a\x4e\x80\x48\xc0\xac\x49\xa3\x8b\x7e\x7d\xf0\xe1\xe4\x0a\x9d\x95\x87\x2e\xdd\xd3\xad\x32\x57\x18\x1e\xb6\xb4\x92\xd2\x74\x8f\x6e\x9f\x5f\x87\x81\x21\xd2\x5c\xbf\x2e\xf3\x9c\x34\xd7\xb9\xad\xfc\x7b\x1f\x25\xb9\x62\xf3\xa7\xa2\x24\x2e\x0d\xed\x8c\xd5\xda\xe7\xa5\x94\xb8\x02\x50\x2b\xd9\x6d\x68\x5a\x47\xd6\xf2\x48\xa9\xb9\x9e\x0a\xc5\x39\xca\x95\x21\x9c\xe9\xc9\xe5\xa9\xda\x38\x1b\x5f\x9b\x65\x45\x84\xc0\x9c\xec\xa7\x35\x42\xc5\x5c\x9d\xe2\x0a\x77\x03\x6b\x35\x72\xb1\x92\xf0\x73\x76\x79\x5d\x4e\xf0\xb5\xea\x92\x88\x87\x64\x54\x7c\x59\x64\x81\x63\xa1\x86\xa0\x44\x82\x9c\x16\xc5\xff\xa6\xc0\x41\xa2\x90\x60\xa6\xac\x74\xc1\x21\x63\xaa\xac\x93\xe7\xec\xf2\xda\xda\x6c\x77\x83\x59\x6d\x31\xbb\xbe\x84\x6a\x38\xbe\x8d\x77\xae\x21\xdc\x56\xcb\xf2\x07\x83\x95\x01\x0c\x2a\xa5\x76\x62\x72\x31\x22\x34\x8e\x25\xba\x7d\x9c\xe8\x53\xaa\x69\x13\x7c\x0b\x98\x71\x4d\x15\x94\xd7\x54\x02\x37\x92\xb8\x02\xb0\xe4\x2c\xcf\x12\x66\xdd\x08\xe5\x1b\x8a\x4c\x71\xac\x23\xbf\x3b\xd2\x36\x51\xf3\x6a\x2b\x79\x0d\xa8\x90\xa8\x5b\xbe\xe6\x81\xdd\x93\xa0\x44\x32\x2f\x2a\x87\x2d\xed\x9a\x3b\x11\x68\x12\x0f\xbb\xe6\xab\xd5\x6c\xb5\x63\xc0\xb5\x34\x47\x73\x79\xb7\xb0\x05\x61\x92\xe3\x69\x0a\x13\xb2\x39\xa0\x7f\xdc\x15\xea\xb1\x37\x95\x6a\x99\x59\xdf\xb0\x2d\x27\x07\x54\x7a\x8a\x86\xab\xaa\x79\x12\xc9\x53\x21\xc2\xb2\xb1\xe3\xec\xf2\xda\x52\x42\xfb\xf2\xae\x9e\x93\x5a\xbb\x4b\x05\x55\xab\x8d\x81\x4f\x96\xc1\xdf\x44\xf3\x58\xea\x1f\xe1\xba\xab\x35\x0a\x64\x69\x20\xfe\x35\xca\xca\x69\xf0\x74\x05\x54\x46\xb3\x3a\xf0\x7f\x80\x10\xd8\x49\x49\x2c\x6c\x24\xc0\x44\x48\x54\x89\x07\x48\xde\x13\x21\x6e\xf3\x6c\x1b\x8a\xee\xa6\xb1\x4d\x01\xb6\x22\x10\x95\x3b\xbe\x28\x9a\x1e\x73\x55\xc7\xdf\x5b\x95\x7d\x40\x5b\x89\x07\x27\x2a\x22\xad\xc5\xb2\xde\x74\x9a\xe4\x4a\x83\xfc\x8e\x49\xa5\x5f\xf9\xca\x72\x88\xc1\xd6\x26\xd2\x2b\x5f\xf0\x13\xd3\xb3\xbf\x0b\xa5\x2f\x41\xf7\xfa\xd5\x9f\xcc\x67\x37\x71\xcf\xe8\xb4\xbd\x4b\xc1\xa1\x37\x5c\x16\xbb\x02\x29\x0f\x64\x6d\x23\x4f\x71\x4b\x57\x90\x40\x14\xfc\xaf\x25\x5c\xb9\x11\xc4\x68\x2f\xf8\x04\x4f\xff\x14\x68\x42\xb1\xfc\x0a\x5e\x3d\xb3\x6b\x35\xd2\xb4\x2d\xae\x80\x37\x68\xe1\x04\xbd\x45\x19\x44\xa5\x7a\x0b\x5a\x6c\x7e\xed\x3a\xf2\xdc\xce\x18\x60\x1b\x5e\x5c\x83\x9c\xb3\x08\xde\x32\x7e\xbb\x23\xfa\x55\xa3\x4b\xce\x57\x66\xab\x54\x1e\xb4\x3e\x5a\xc6\x6d\xf0\x9d\x61\x31\x74\x2c\x72\x8d\xb2\x1b\x3a\x1c\x0b\xc5\x91\xf1\xff\xb6\x7b\x81\xf6\xf6\xcc\x56\xc3\x59\xa7\x23\xaa\xbe\x35\xfa\x78\x25\x50\x2d\xb8\xa6\xf7\x48\x53\x44\x74\x0b\x92\x24\x66\x19\x43\x52\x04\xbe\x54\x2a\x45\xc9\x1c\x76\x8c\xba\xa8\x6b\xe9\x80\x6c\x06\x29\x48\x9a\x04\xed\xab\x09\xa8\xdf\x3a\xc2\x19\x66\x2d\xc7\xa4\xd8\xca\x21\xae\xc4\x91\x39\x87\xe7\xeb\xae\x4a\x29\x16\xc2\x74\x17\x53\x4e\xe0\x9e\x29\x34\xeb\x67\x22\x2e\x67\xa8\xe4\x0a\xe4\x20\xe4\x0f\xb9\x18\x7d\x15\x02\x71\x62\x18\xe7\xd3\x29\xe3\x53\x47\x9d\x91\xa6\x17\x75\x84\x0a\x4d\x07\x2b\x18\x45\x12\xa8\xb6\x91\xfd\x99\x88\x6d\x7c\x19\x2b\x5f\x9f\x8a\xd8\x5e\x3e\x5e\x58\x6d\xd0\xef\x2c\xf6\x33\xcc\x20\x1a\x92\x0b\x4e\x84\x74\x39\xd4\x34\x8e\x71\xed\xab\x6f\xe8\x3a\x91\x96\xdf\xaa\x1f\xe2\x38\x0c\x46\xa9\xe2\xae\x12\x58\x54\x3e\xf6\x2d\x45\x97\x6d\xa7\x34\xc9\x66\x74\x60\x2b\x6e\xbb\xea\x2d\x68\x7d\x9b\x09\x2e\x5c\x03\x6b\xaf\x1a\xa0\x8c\x68\x0f\x17\x3e\xef\x7c\x75\xf7\x7d\xff\x99\x3a\xe7\x7c\x77\xf6\x52\x8b\xb5\x54\xb9\x35\x5f\xf3\x16\xb6\xe6\xf2\x92\x77\xd4\x61\x16\xc5\xe6\x69\x1a\xd2\x4c\x48\x2a\x99\x25\x77\xcb\x78\x66\xf8\xc5\x1a\x04\x9b\xdb\xa6\x54\x6b\x70\x6c\x2d\x2e\x23\xb5\xe5\x22\x74\xbe\x35\x7c\x41\x45\x33\x88\xf3\xc4\x3c\x68\x9a\x53\xec\x79\x67\xa8\x85\x33\xaa\x2f\x5c\xf8\x9f\x45\xba\x10\x58\x18\x3a\x11\x2e\x30\x18\x07\x2b\x69\x99\x6f\x10\x5b\x6d\x08\xa2\xed\x19\x86\x0d\x88\xca\xd1\x88\x1b\x90\x30\xa2\xd8\xcf\x88\xfa\x43\x05\xf7\x11\x18\xb2\xa6\x55\xb1\x58\x17\x9f\xc2\x04\xef\x07\x4c\x77\x30\x84\x39\x8b\xf0\x09\x1b\x8f\xb0\x7b\x03\x0b\xec\xf1\xa2\xe8\xe1\xb8\xe1\xf0\xdc\x98\x77\x0b\x89\x00\x78\xd7\x9c\xd1\xed\x0f\xc5\x32\x04\xab\x8a\x90\x7f\x0e\x11\x3c\x72\xd3\xbb\x53\xc4\x6c\xc8\x9e\x39\x42\xa1\xf3\x92\x6b\xb7\xe4\xa3\x4b\x1e\x38\x24\x18\xe7\xb9\xab\x30\xd6\x40\xcf\xa8\xef\x44\xac\xe5\xfc\x6b\xa2\xd2\x50\x39\x6d\xa1\x2f\xff\x89\x9c\xe6\x29\x46\xd9\x39\x61\xba\xa8\xba\xe8\x1a\x77\x59\x76\x8a\x16\x3b\xc3\x8c\x4f\xdf\x9d\x79\x1f\x93\x0d\x79\x2b\xa2\xce\x7d\xf5\x70\x23\xe4\x35\xb4\xe4\x2e\x9b\x72\xcd\x41\x2b\xec\xc3\x05\xd7\x70\xfa\xa9\xb3\x55\x86\xa7\x79\xb4\x64\x3c\x33\x72\x06\x4a\x47\x85\xb5\x92\x47\x33\xca\xa7\xbe\x56\x75\x79\x5d\x4e\x8a\x70\xd5\xfc\x40\x45\x34\x0b\x71\x79\x24\x16\xb9\x79\xf8\xd7\x5f\xf7\x09\x83\x63\xf2\x75\xe9\xc6\x21\x39\x77\xd7\x96\x5e\xb8\x14\x67\x3c\x2e\x5e\xb7\x4f\x24\x4c\xa9\x8c\x13\xcc\xeb\x99\x04\xf1\xc8\x56\x8a\x74\x2f\x88\xa4\x12\x23\xfb\xb8\xd0\xeb\xec\xa4\x3b\x35\xe2\xb5\x42\xd5\x20\xa6\x9a\x0e\xb0\x3e\xb0\x25\x3a\x47\x56\xd1\x1f\xb8\xa2\x64\x03\xea\x50\xa1\xd4\xaa\xf7\x2b\xd7\x73\x74\x40\xc3\x55\x8c\x0f\xe8\x00\xcb\x83\xd5\x8f\x5a\x7d\x82\x00\x87\x46\x3a\x77\x83\xda\x74\xcb\x82\x72\x28\x69\x8a\x30\x18\x92\x4b\xa1\x8b\x12\x96\x21\x96\xc2\x95\x5f\x5b\x77\xfe\xce\x2f\x6f\xae\x7e\x1e\xbd\xbf\xb8\xbc\xe9\x8e\x61\x77\x0c\xbf\xa8\x63\x08\x7c\xde\xf8\x08\x06\x05\x6a\x9d\x4e\xb9\x54\xc6\xaa\x94\x6e\xf9\x82\xa2\xbb\xce\xf9\xfc\x03\x95\x45\x53\x58\x94\xcf\xd6\xba\x61\x7d\xd7\x58\x24\x49\xa7\xcf\x3e\xbc\xeb\x09\x83\xb3\x5a\x0c\x7a\xb9\x2c\x65\x09\xaf\xdb\xb5\x72\x27\x8d\xd3\xdf\x2f\xce\xce\x2f\x6f\x2e\xbe\xbb\x38\xbf\x7a\xd2\x68\x85\x86\x65\xa4\xaa\x4c\xb4\x26\x57\xcb\x24\xcc\x99\xc8\x55\xe8\x57\xb1\x9e\x04\xac\x86\xbb\xf1\x98\x50\xbe\xf0\xd6\xaa\xf5\xb7\x7d\xe9\xac\xb1\x1a\x6a\xd1\x20\x45\xbf\x2d\x64\xfb\x4e\x8a\xda\xfd\x73\x97\x2d\xdd\x56\x5b\xf7\x16\xee\x75\xfb\xdf\x53\xf6\xa9\x15\x46\xe1\x44\xb3\x90\x56\x6d\xbe\xc7\x0c\xa0\xa6\x47\xb1\x61\x99\xbf\x76\x2a\xe2\xd9\xb0\x84\x77\x34\xfb\x01\x16\x57\xd0\xb0\x12\xc0\x92\x67\x21\x81\xc8\xb0\x25\x72\x0b\x0b\xeb\x70\x3c\xf5\x0f\x6b\x52\xb1\x60\x2f\xab\x24\xde\x42\x93\x0a\x96\x6d\x96\x37\xbc\x85\x06\x71\x8a\x7e\xac\x14\xfa\x33\x5b\x88\x52\x95\xd9\xd3\x66\xbb\x47\xda\x2d\x6d\xf8\x09\xca\x39\xf6\xca\xcc\xd9\xd1\x59\xbd\x73\x31\x05\x31\x37\x9c\x06\xee\x8e\x5c\x8c\xd6\xc0\x50\xf7\x81\xc5\x5a\x75\x84\x81\x28\x47\x5f\xe1\x3f\xae\xfc\xcd\x49\x1c\xbb\x58\xe1\x5c\xc1\x24\x4f\xac\xe5\x5a\x0d\x09\xcd\xd8\x07\x90\x0a\x0d\x8c\xb7\x8c\xc7\x7d\x92\xb3\xf8\xdb\x26\xf5\x53\xec\x68\x71\x17\x84\xf7\xcf\xb4\xbb\x13\xd7\xce\xfd\x56\xe6\x5d\x81\x88\x10\x9b\x08\x88\xb8\xe9\x2d\xa2\x4e\x28\x68\x09\x34\xcd\x02\x62\xcd\xc0\x2d\x6c\x97\xae\xf6\x0a\xc2\x6a\x5d\x1b\xa1\xd6\x4c\x7c\xec\x4b\x2a\xa9\xd0\x28\x65\x68\x30\xac\x5f\xfd\xa8\x32\x1a\x41\x9f\xfc\x23\x7c\x89\x7d\x16\xd5\x2f\xbd\xde\xdf\x7e\x38\xff\xf9\x3f\x7a\xbd\xdf\xfe\x51\xfe\x15\x59\x21\xea\xb8\x4b\x97\xa0\x45\x9a\x8b\x18\x2e\xf1\x19\xf8\xd1\x89\x57\x27\x51\x24\x72\xae\xdd\x0f\x98\xc4\x3b\x9c\x09\xa5\x2f\x46\xe1\x63\x26\xe2\xe5\x4f\xaa\x51\x51\xa0\xbd\x64\x0c\xb8\x45\x0d\x92\x51\xec\x68\x8f\x3d\x14\xb4\xa4\xe5\xa3\xea\x66\xf5\xd8\x88\xc5\x25\xad\x5f\xe2\x3b\x0f\x02\xec\x6c\xe5\xab\x05\x70\x4c\xb1\x36\x92\x69\xb5\x42\xd4\xab\xf9\x9b\x46\x3d\xfc\xec\x68\x91\xb4\x85\x1d\x6c\x19\x60\x08\x11\xdf\x34\x04\x0f\x72\x60\xb0\x5e\xab\x28\x9c\xaf\x27\xa3\x0b\x32\xb7\x10\xde\x1b\xe0\x78\x97\xd2\x77\x9f\x94\xc6\x15\x3e\xc1\xa5\x54\xce\x63\xeb\xbd\xf5\xbf\xbb\xb4\x7a\xe5\xea\x91\x60\xe5\x72\x45\x0e\xec\x97\xc3\x28\xcb\xfb\xee\x82\x61\x0a\xa9\x90\x8b\xf0\x31\x38\xcc\x06\x4a\x0b\x49\xa7\x98\x86\x61\x6f\xb7\xb7\x85\x4f\xf6\xc6\xca\x03\x56\xef\xb6\x8a\x6b\x94\x4b\x23\x34\x24\x8b\xa2\xc8\xdd\xcb\xa3\x6d\x1e\xf4\x7b\x42\xda\x02\x66\x34\xed\x70\x66\x47\x15\x21\x0b\x97\x39\x0a\x9c\x01\x8a\xa8\x4f\xba\x34\xd3\x7e\x10\x83\x6c\x83\x76\x3e\x37\x9a\x65\xed\x42\x59\xc5\x68\x91\x9a\xc5\x6c\xce\x94\x68\xd4\xb9\xd9\x4d\xb4\x39\x82\xde\x55\xba\xb0\x71\x42\xc1\xc8\x75\x9f\x61\x6d\xa0\x70\x5e\x97\xc8\xfe\x9b\x26\x0d\x3e\xed\xc8\xa8\xd6\x20\xf9\x31\xf9\xaf\x83\x5f\xbf\xf9\x38\x38\xfc\xf6\xe0\xe0\x97\xd7\x83\xbf\xfe\xf6\xcd\xc1\xaf\x43\xfc\xe3\x5f\x0f\xbf\x3d\xfc\xe8\x3f\x7c\x73\x78\x78\x70\xf0\xcb\x0f\xef\xbe\xbf\x19\x9d\xff\xc6\x0e\x3f\xfe\xc2\xf3\xf4\xd6\x7e\xfa\x78\xf0\x0b\x9c\xff\xb6\xe5\x24\x87\x87\xdf\x7e\xdd\x78\xe9\x2d\x94\xe1\xb3\xa3\xcd\x62\x7c\xd5\x19\x5b\x41\xbf\x4f\x58\xce\xda\x0e\x8f\x5e\x6d\x9f\x7f\x1f\x2c\x7c\x5c\x30\xa4\xc0\xae\xf7\xe6\x80\x2b\x88\x24\xe8\xcf\x61\xc9\xb1\x4f\x2a\x85\x8d\xf4\x14\x09\xaa\xc5\x4b\xe3\x73\x5f\x82\x71\xc7\x8b\xed\x76\x5f\x0b\x49\x74\x22\x45\xea\x93\xc0\xd1\x19\x31\xc7\xc0\x5f\x77\xdd\x2d\x34\x6a\x0b\x66\x47\x67\x0c\xea\x8c\x41\x1b\xc6\xa3\xc6\xa0\x6b\x8b\x87\x7b\x6b\x09\x02\x3e\xaf\xeb\xc2\x58\xeb\xef\xf6\xba\x4e\xb9\x62\xda\x76\x0e\xb0\xa1\x3f\xea\x85\xe7\xac\x88\x53\xb1\x0c\x2d\x5d\xef\x71\x24\x27\xd8\xa5\xd0\x1e\x7c\x9c\xa0\xc8\xb2\x70\xf5\xbb\x6d\x41\x3f\x98\x9b\x25\xf8\x10\xcc\x6a\xed\x47\x8c\xb5\xc4\x08\xd0\x9f\x6c\x40\xe6\xad\x8d\xd1\x34\x4a\x1a\xe3\x45\xd5\xcc\x20\x1c\x16\x2d\x77\xa9\x52\x22\xb2\xb1\xa5\x21\xe6\x1f\x0b\xb9\xb9\x65\xe3\x6a\xb0\xa3\x6a\xa9\xf3\x2e\xf9\x60\x53\x13\xfc\xbb\x8e\x17\x58\x1d\x92\xcf\x83\x93\xcd\x67\x90\xe0\x4a\xd6\xcf\xf1\xb2\xc2\x05\x0c\x22\x3a\x27\x58\x29\x6a\x00\xa9\x7e\xd0\xb0\x29\x06\x4e\x88\x49\x61\x65\xad\xd7\xd0\xaa\x31\x17\x6f\xce\x33\x83\x67\xab\x91\x30\xb4\xc2\x2c\x0b\xf3\x73\x95\x49\xbe\x04\x67\x60\x73\xf6\xf9\xc5\xb1\xce\x96\xd8\x66\x3b\x2c\x73\x07\xdf\x49\x9b\x6c\xb2\x0d\x67\x49\x26\x61\xc2\xee\x5b\x3a\xa7\x27\xbc\xb0\xc4\x30\x6c\xc6\x3f\x61\x36\xa3\x24\x93\x90\x01\xb7\xa1\xfc\x34\x9a\x21\xed\x77\x9c\xb2\x70\x4e\xef\x63\xe8\x8d\x15\xb8\xdb\x25\x65\xd7\xeb\x84\xfd\x8e\x8e\x91\x8e\x8e\xd5\x1e\x9f\x89\x8e\x39\xcc\xdd\x1f\x22\x86\x71\xdd\xcd\x03\xcb\xcf\x4a\x51\xe2\x88\xc5\x3b\x63\x59\x91\xf5\x73\x84\xb3\x34\xe8\xd1\x5f\x13\x19\xf0\xb1\xa3\x3c\x49\x5a\xaa\x45\xdd\xbb\x40\x68\x64\x79\x92\xb8\x14\xdc\x21\x36\xdf\x17\x13\x72\x82\x3d\x0f\xfa\xe4\x12\xe6\x20\xfb\xe4\x62\x72\x29\xf4\xc8\x0a\xb6\xd5\x58\x36\x7b\x21\x61\x13\x72\x6c\x54\x26\xa5\x89\xb6\x75\xe7\x4b\x55\x72\x84\xac\x4c\x50\x14\xe0\x6a\x10\x31\xbe\x79\x5b\xbe\xf2\xf9\x5d\x83\x27\xda\xa6\xd0\xd8\xa3\x05\xdd\xd4\x37\x67\x72\xd1\x71\xd8\x29\xd8\xb9\x46\xd6\x65\xb8\x3e\xc3\xa2\x13\x99\x50\xfa\xda\xa8\xb0\xed\x34\x7d\x19\xf9\xe9\xb0\x8f\x02\x4d\x12\x88\x09\x4b\x53\x88\x8d\x9a\x9b\x2c\x5c\xb7\x0a\x5a\x55\xa1\x23\xdb\xb1\xdf\x35\x4f\x00\x32\xa3\x3c\x4e\x40\x62\x01\x74\xb5\x5c\xe5\x89\x15\x15\xff\x43\x8f\x06\x9f\x24\x49\xa3\x48\xc8\xd8\xb5\x65\x74\xa9\x8c\xb8\x98\x70\xbc\x90\xd0\xa6\x94\xd3\xa9\xed\xc7\xb5\x52\x46\x17\x8b\x2b\xab\x52\xa3\x87\x99\x10\xb7\x24\x12\x69\x96\xe0\x01\x68\x70\x3e\x8a\x3e\x33\x01\x45\x07\xd8\x37\xec\xa8\xd4\x82\x06\xbf\x78\xc2\x3e\x60\x6d\xc8\x29\x70\x0f\x51\x6b\xfd\xa7\x0c\x45\x34\xbb\x8c\x3e\x71\xc1\x83\xb8\x32\x11\xe6\x30\x9a\xbd\x2e\xb2\xf3\x03\xd1\x1b\x92\xf3\x7b\x88\x96\x1a\xde\xbb\x26\x6e\x5a\xa0\x3d\xa4\x79\x6f\xce\xc6\xa6\xfc\xb6\xcc\xe7\x0d\xd2\xbf\xca\x63\xa9\x16\x1b\xce\xe9\x4b\x4f\xbb\x47\x60\x15\x7f\x9b\x2e\x8c\x29\x61\xbe\x1a\x75\xe5\x0c\xd9\x13\xbb\x52\xc0\x2d\x04\x28\xfb\xb9\x30\x6d\x59\x08\x4d\x0e\x7a\x47\xbd\xc3\x15\xbb\xde\x52\xfd\xe2\x9b\xd2\x9d\x0c\x0b\xf6\x65\x58\xfd\x0e\xa2\x5e\xdc\x27\x4c\x7b\x1a\x6d\xeb\x06\xe0\xaa\x5c\x9e\x5a\x9f\x28\x41\xb4\xa4\x31\x73\x9a\x13\x7e\x8b\xdd\xef\x65\xee\x8a\x06\x1c\xf4\x3e\xf6\xfa\x04\x74\x74\x48\xee\x04\xef\x69\x5c\x3e\x56\xd8\xc8\x55\x69\xa2\x85\xc8\x09\x07\x70\x19\xd3\xa1\x5c\x86\x21\x74\x44\xe4\xb6\xeb\xcd\x8c\x6a\x9f\x1f\x77\x7e\xcf\xb4\xef\xf4\x20\x26\xe4\xb5\x6d\xba\x63\xbb\xcc\x53\x85\x1d\x1a\x8f\x66\x40\x13\x3d\xb3\xc1\x17\x5c\xf0\xc1\x3f\x41\x0a\xcc\x9c\xe3\xee\x97\xa6\x7e\x88\x76\x7a\xd1\x93\x76\xfa\xd1\x93\xb6\x24\x72\x43\x7b\xbf\xaf\xdf\xf5\x91\xac\xeb\x8d\xff\x7d\xa5\xed\x23\x12\x7f\xad\x33\x1f\x12\x53\x2a\x3d\xb1\x07\xb4\xa3\x1d\x27\x60\xa3\x9e\x8d\xa4\x45\x12\xd6\xb4\x77\x23\x59\x6d\x70\xbb\x5b\xd3\x46\xf2\xb3\xc8\xb1\x21\x1d\x1d\x27\x0b\x72\x47\xb9\xf6\xc9\x76\xaf\xcc\x54\xaf\x0c\x79\x32\xd8\xf0\x77\x6c\x0c\xaf\x90\x7a\x00\xad\x5d\x62\xcb\x8f\xd6\x9c\x53\xa5\xb5\xb5\xcb\x07\x72\xa5\x45\xea\xfa\xe1\x2f\x27\x20\xba\x93\x31\xb4\x3d\xe3\x51\x3a\x36\x32\x57\x66\x29\x9c\xbb\xe7\xc5\xd1\xaf\x15\xba\x61\xe1\x5e\x29\x45\x1f\x95\xc1\x56\x6e\x58\xc2\xb8\x05\x96\x6d\x35\xd8\x12\x2d\x6d\x21\xa8\x80\xb4\x18\x58\x40\x9a\xa5\x33\x2e\x4f\x84\xce\xb2\xe6\x31\x54\xad\xc5\x2a\x90\xd6\xfc\xf1\x64\x9d\xf1\xd2\xe1\x8c\x8d\x9c\x6d\x09\x88\xad\x7a\xc1\x49\xf3\x84\xc9\xf2\x78\x18\x00\xed\x6c\x3e\x69\x13\x02\x59\x0b\x21\xd3\xab\x01\xd3\x2b\xcd\x74\x91\x4c\xd8\xba\x4d\x7b\xc3\x65\x9a\x76\x16\x26\xeb\xb3\x85\x25\xe1\xa1\x59\xec\xf3\xe8\x2e\x4c\xda\x0b\x6d\x6c\x3b\xb0\xb1\xd5\xb0\xc6\x4f\x1a\xd4\x88\xa9\x14\x8d\xa9\x48\xd5\xa6\x8e\x53\x1a\x0c\x30\x7a\x9b\xd1\x38\x9d\xec\xe7\x8c\x42\xbe\xa1\x45\xd5\x8a\x6a\x8e\xda\x5e\x9c\xb1\xc6\xdd\xec\xc9\x0b\xe9\x68\x4f\x3a\x4d\x69\xc3\x68\x5d\x53\x7a\xa2\x4e\xf7\x64\xbf\xf9\xd2\x33\xed\x7a\x4f\x3a\xbe\x54\x9f\x2f\x65\x12\xae\xb5\xc8\x5a\xf2\x84\xd8\xc9\x36\xf8\x41\xc6\x30\x11\x12\x96\x1d\x21\x25\xc7\x46\x9c\x83\x2b\x4b\x79\x32\xba\x08\x26\x28\x51\x71\x5e\xd8\xb0\x44\x5f\x8b\x32\x61\x73\xe0\xa0\xd4\x11\xba\x3c\xf2\xcc\xb5\xd7\x77\x5d\x64\xfb\xe6\xed\x20\xcd\x6c\x35\xc7\x10\xea\xef\x7a\xd8\xe2\x97\xa0\x6d\x19\xc6\xe0\x7f\x71\x16\x55\xbf\xfc\x65\x57\x49\x24\xa9\x9a\xd9\xfe\xae\x70\xcf\xb4\xeb\x51\x2c\x81\x2a\xc1\xad\xb1\xb7\xd4\x6a\x96\x29\x92\x51\xa5\x8a\xa2\xd8\xee\x21\xf6\xa6\x91\x2d\xa4\x5b\xbe\x61\x2a\x69\x04\x24\x03\xc9\x44\x4c\x30\xe7\x36\x16\x77\x9c\x8c\x61\xca\xb8\xf2\xf0\x33\x13\x79\x40\x1b\x76\x03\x68\x1b\xf6\xf5\xca\x86\xe4\xaa\x52\x28\xc4\xa5\xf0\x44\xa2\x38\xd1\x6e\x15\xcb\x4e\x26\x8c\x9a\x44\xf0\xda\x26\x2b\x61\x63\xca\x7d\x67\x1e\x59\x74\x0b\xde\x26\xdb\x1a\xc9\xff\xb6\x11\x3a\x58\xfe\x93\x46\xb3\x66\xee\xdb\xce\x3d\xb5\xe5\xe8\xdc\x53\xbb\x8d\xce\x3d\xd5\xb9\xa7\x36\x8f\xbd\x33\xef\x76\xee\xa9\x4e\xe9\x5a\x1e\x9d\x7b\xaa\x73\x4f\x6d\x18\x7b\x47\xbf\x3a\xf7\xd4\x16\xa3\x73\x4f\x6d\x39\x3a\xf7\x54\xe7\x9e\xea\xdc\x53\x9d\x7b\xea\x0b\x32\x03\xfa\xd1\xb9\xa7\x56\x26\xe9\xdc\x53\x25\x60\x74\x9a\xd2\x9a\xd1\xb9\xa7\xd6\x8c\xce\x3d\x55\x1a\x1d\x5f\xaa\xc1\x97\xbc\x73\x67\x64\xf4\xb2\xe6\x4d\x75\x51\xbb\xc3\x7a\x7e\x2f\x34\xad\xa9\x89\x8d\x7f\xaf\xed\xfb\x7b\xe2\x43\x69\xc1\xa6\xdf\xd9\xf3\x5f\x9c\x3d\xbf\x1d\x5b\x58\x0b\x76\xb0\xc6\xa4\xdc\x79\xcd\x6f\x66\x12\xd4\x4c\x24\xb5\x11\xbd\x82\xe4\xef\x18\x67\x69\x9e\x1a\x9c\x53\x06\x9f\xd9\x3c\xb8\xe7\x55\xd1\xa0\x18\xbd\xf6\xd6\x24\x67\x2e\x64\x31\x60\x35\x4e\xca\x12\xb3\x8d\x98\x3f\x39\xa3\x28\x13\xab\x3c\x8a\x00\xb0\x93\x56\x59\x5d\xf8\xd3\x30\x3c\x29\xf4\x76\x78\xd3\x8c\xde\x34\x63\xb2\xb6\x5e\x26\xce\xf2\xa7\x3f\xd6\x9a\xa3\xa1\x3b\xe5\xf3\xbb\x52\x5a\x20\xd3\xcd\x15\x83\x46\x4a\x41\x1b\x5c\xa2\xa9\x32\xf0\xdc\x5c\x26\xad\xb9\x0e\x5b\x70\x95\xec\x91\x9b\x64\x6f\xd8\xc2\xbe\xb8\x46\xf6\xb0\x14\x68\x0b\x96\xfc\x36\x5c\x21\xed\xb9\x41\x3e\x41\xc5\xcc\x4f\xe3\xfe\x68\x51\xed\x6c\xc9\xed\xf1\x39\x5c\x1e\xad\xbc\x75\x53\x57\xc7\xe7\x73\x73\xb4\xf3\xba\x0d\xcd\x48\x2f\xc2\xb5\xd1\x82\xf9\xa8\x4d\xd3\x51\x6b\x66\xa3\x4f\xe6\xca\x68\xee\xc6\xd8\x03\x17\x46\x63\x20\xdb\x36\xfe\xc9\x19\x24\x74\x71\x0d\x91\xe0\x71\x6d\x0e\xb3\x54\x42\x2d\x9c\x1f\x65\xa7\x75\x3a\x5a\x35\xd0\x77\x46\x5d\xa5\x58\x88\x7d\xec\xb2\x37\xe9\x39\x81\x02\xad\x71\x76\x95\x75\xea\x30\xdd\x09\x79\x9b\x08\x1a\xab\xa3\x4c\xd8\xff\x15\x61\xbc\xa5\xf8\x5d\xfb\xac\x66\x01\xbc\x4f\xad\x0c\xda\xa8\xe7\x36\x37\xf1\xef\xe2\x8e\x88\x89\x06\x4e\x0e\x18\xf7\xfb\x78\x58\x52\x03\x0b\xcd\x3c\xa0\xb5\xf9\xf5\xcd\x6b\x7f\xf1\xcb\x53\xb9\xd1\xb8\xa0\xd4\xa7\xb7\x80\xb8\x07\x3d\x6e\x02\x71\x17\x4e\xf2\xa4\x6a\x06\xb1\xa6\x91\x2a\xbd\x79\x53\xd4\xba\x7c\x83\xf3\x86\xd3\x46\x79\x4c\x5c\x86\xc4\xcb\xdb\xb4\xc6\x0e\xda\x97\xe0\x9c\xed\x6c\x2f\xa4\x6d\xdb\xcb\x13\x39\x61\xf7\x50\x6a\x7e\xa6\x8e\xd7\x4e\x6a\xde\x61\x68\x96\x82\xc8\xf5\x67\x11\x13\xef\x66\x2c\x9a\x95\xb9\x1e\x4b\x41\x11\x91\x2f\xc9\xcf\x6f\xdc\x6d\x6b\x59\x56\x27\x2b\xae\x1d\x75\x2d\x40\x9b\xdb\xd9\xaf\xfa\xc6\x4b\x9d\x0c\xa9\x22\x94\x9c\x5d\x5e\xff\xfe\xf6\xe4\x3f\xcf\xdf\x0e\xc9\xcd\x8c\xd9\xd6\x41\xe1\x40\xe7\x9c\xfd\x4f\x0e\x84\xa6\xc2\xf0\xcc\xa4\xec\x62\xef\xa3\xe8\x5f\xfa\x02\xe5\x94\x76\x9d\xf1\x35\x0f\x1b\xb6\x5d\x6d\x1e\x72\x80\xcd\x5b\x3f\x7d\xc4\xc1\x53\xb7\xa3\x08\xed\xf4\xcc\x0b\x97\xdb\x51\x50\xc2\x41\x9b\x93\x67\xb9\x85\x6d\x4f\xc2\xf8\x34\x29\x33\x8a\x7a\xe4\xaa\xa9\xbc\xd3\x54\xda\x19\x14\x6f\x30\xaa\x2b\xf4\xb4\xd2\x16\xa3\x58\x43\x4b\xc5\xe4\x0b\xaa\xed\x59\xbc\xed\xf6\xe7\x59\xbc\xed\x0f\x76\x31\x22\x34\x8e\x25\x28\xe5\x4e\x7d\xba\xd4\x54\x0a\x6f\xb6\x86\xb6\x3e\x79\x4d\xfe\x46\xee\xc9\xdf\x90\xe5\xff\xa5\x69\xe9\xfd\xa6\xcc\xb8\xb9\xca\x61\x25\xcd\x8b\x51\x4b\x10\xff\x69\x46\x35\xce\x68\xa0\x6a\x54\x40\xc6\x63\xd7\x66\x51\x83\xe4\x34\xf1\x3b\xf1\xa4\x4d\x0b\xcc\x02\x3f\x23\x9a\x59\x7b\xda\xc5\xa4\x5c\xd5\x5b\xef\x88\x68\xe6\x76\x23\xbb\x5f\x3a\x2a\x54\xad\x11\x5e\xcc\x96\x52\x1d\xcd\xaa\x64\xcc\x08\x18\xaa\xc2\x9c\x62\x81\x64\xdc\xc6\xa6\xcc\x58\x03\xef\xe0\xfe\xa0\x71\x33\x87\x51\x65\x3f\x1f\xda\xa9\x25\xa1\x1e\xf9\xbc\x13\x0c\x4a\xb5\x05\x32\x11\x0f\xc9\x39\x8d\x66\xb8\xac\xb8\xc4\x33\x8c\x5a\x85\x93\xcd\xe8\xdc\x6c\xbc\xbb\xd7\xd6\xd4\x47\x69\x25\x98\x51\x10\x97\xcc\x79\x8a\x28\xb7\x5d\xad\x26\x20\xa5\x0d\x27\x1a\x2f\x88\xeb\x68\xde\x78\xf3\x1a\x9d\xa4\x4c\x0a\x2d\x22\xd1\xa0\xaf\xc2\x72\x64\x23\x4e\x87\x40\xb0\x06\x09\x6f\x07\xfa\xf1\x6c\xd4\x27\x37\xa7\x23\x2c\x88\x7f\x7d\x7a\x33\xaa\x4a\xd8\xaf\x6e\x4e\x47\x0d\xfa\x73\xb7\xa2\xcf\x38\x15\xfa\xd8\x2c\x73\xe7\x49\x24\xd0\x98\x75\x31\xa2\xdb\x8f\x2e\x46\x74\xf3\xe8\x62\x44\xbb\x18\xd1\x2e\x46\xf4\xe1\xd1\xc5\x88\xba\xf1\xf4\xa6\x1e\xd2\xc5\x88\xd6\x1c\x2f\xcb\x4f\xd1\xc5\x88\xee\x34\xba\x18\xd1\xd5\xd1\xc5\x88\x6e\x18\x5d\x8c\xe8\x86\xd1\xc5\x88\x76\x31\xa2\x5d\x8c\x68\xe7\xed\x7e\x74\xae\xfd\xf4\x76\x93\x2e\x46\xd4\x8d\x2e\x46\xf4\x45\xf8\xfd\x49\x17\x23\xba\xd5\xe8\x62\x44\xbb\x18\xd1\x3a\xa3\x8b\x11\xc5\xd1\xd9\x5e\xba\x18\x51\x3f\xba\x18\x51\x3b\xbe\x1c\xa9\xb9\x8b\x11\x7d\x11\xb2\xa2\x6f\x84\xd1\x3c\xc0\xf1\xca\xcf\xb4\xbd\xcb\x9c\x9c\xaf\xf9\x16\x55\x26\x95\x99\x49\x64\x31\x65\x22\x81\xc6\x0b\x9c\x32\x42\x93\x6b\x41\x40\x9f\xa1\xe7\x3d\x61\x29\xab\x17\x53\x4a\x56\x0e\xcd\x5b\x9c\xab\x64\x9e\x35\x60\x49\xe9\x3d\x1e\x00\x9a\x8a\xdc\xf6\xdd\x88\x44\x9a\xe5\xba\x0a\x53\xdc\x9e\x3a\x2d\x33\x26\x6c\x9a\x4b\x6c\xc4\x71\x64\xbb\x7b\x0c\xdc\xf4\x83\x30\xfd\x20\xec\xe8\xd1\x13\xca\x28\x34\xf6\x1e\xe6\x51\x0b\xe2\x42\x46\xb5\x06\xc9\x8f\xc9\x7f\x1d\xfc\xfa\xcd\xc7\xc1\xe1\xb7\x07\x07\xbf\xbc\x1e\xfc\xf5\xb7\x6f\x0e\x7e\x1d\xe2\x1f\xff\x7a\xf8\xed\xe1\x47\xff\xe1\x9b\xc3\xc3\x83\x83\x5f\x7e\x78\xf7\xfd\xcd\xe8\xfc\x37\x76\xf8\xf1\x17\x9e\xa7\xb7\xf6\xd3\xc7\x83\x5f\xe0\xfc\xb7\x2d\x27\x39\x3c\xfc\xf6\xeb\xda\x4b\x6e\xcc\xd3\xda\xe3\x68\x2d\xf1\xb3\x4f\xc2\xcd\x9c\x7b\xa7\xa5\x23\x79\xe5\x66\x5b\x3e\x94\x8e\x2b\x3d\x74\x28\xbd\x50\x8d\xe1\x8a\x61\x1e\xa6\x88\x48\x99\xd6\x8e\x98\xd2\x72\x60\x07\xd3\x15\xa9\xd2\x91\x03\x6c\x56\x44\xb5\xed\x06\x14\x82\x22\x4a\x41\x79\x42\xcf\x40\xde\x31\xe5\xbb\x2c\x05\x85\x03\x8f\xf5\x20\x86\x09\xe3\xe0\x0c\xd9\x1d\x89\xd8\x7a\x74\x24\xe2\x25\x92\x08\x05\x51\x2e\x99\x5e\x9c\x0a\xae\xe1\xbe\x96\xa6\x54\xb5\x0f\x57\xe7\xf3\x71\x52\x2f\x30\xc6\x10\x5f\x69\x24\xd9\x9c\x25\x30\x85\x73\x15\xd1\x04\x89\x42\x3b\x84\xf6\x64\xc3\xec\x08\x33\x29\x12\x45\xee\x66\x80\x4d\xc8\xa8\x79\x13\x54\x3c\x23\xca\xc9\x94\x32\x4e\x52\x43\xd3\x32\x7f\xb3\x21\xd1\x86\x0c\x6a\x45\x8c\xec\xc9\xb5\xbf\xc1\xa5\x34\x8c\x85\x48\x5c\xe0\x5c\xb2\x28\xe6\x77\x4d\xe1\xb8\xf8\x9d\xc3\xdd\xef\x66\x36\x45\x26\x09\x9d\xda\x0e\x6a\x63\xc0\x18\x82\x65\x5d\xb7\x98\x7a\xe3\x0b\x60\x54\x5a\x0e\x84\x26\x77\x74\x81\xaf\xb1\x3c\x07\x53\xc7\xe4\xcd\x21\xc6\xd6\x51\x45\xc2\x1c\x31\xf9\xe3\x21\x5a\xd2\x4f\x4f\x46\xbf\x5f\xff\x7c\xfd\xfb\xc9\xd9\xbb\x8b\xcb\x66\xf4\xd5\xbc\x3b\x50\x5e\x6b\x8e\x88\x66\x74\xcc\x12\xd6\x84\xac\xae\xf8\x5a\xcb\x93\x22\xff\x8a\xe3\xa3\x58\x8a\xcc\xc2\x49\xe6\x9c\x33\x3e\xad\x68\x1a\x67\x4b\x86\x17\xc7\x32\xed\xf6\x4c\xaa\x13\x4e\x25\xe5\xe8\x83\x58\x2c\x81\x5c\xe6\xdc\xa8\x9e\xcf\x3c\x2c\x95\xc6\xed\x85\xa4\x9e\xc4\x31\xc4\x15\xe8\xbd\xb8\x10\x98\x53\xff\x72\x8b\x22\x9b\x8d\x8c\xde\x5f\x5f\xfc\x9f\x25\x34\x5c\x64\xcd\x3c\xfe\xed\x44\xd0\xcb\xfa\xfd\x3b\xc9\xaa\x4a\x9f\x8a\x79\xb7\xbf\xfb\xb2\xbf\x81\x57\xb5\xe3\x67\xba\xca\x79\x99\x9d\xf0\xd2\xfc\x24\x15\x31\x0c\xc9\xc8\xb2\x29\x50\x4b\xbf\x96\xb3\x74\x25\x10\x73\x09\xd7\x0c\x1b\x85\x1a\xf5\x65\x4e\x13\xb0\x81\x84\x18\x4a\x5e\xc9\xe1\x2a\xd3\xe1\x09\x4d\x54\x43\x62\xda\x84\x33\x19\x26\xfc\xce\x68\x62\xad\x40\x33\xcc\x46\x62\xe0\x42\x3b\x95\xcf\xac\x12\xd3\xda\xa4\x88\x88\x55\xfb\x4a\x41\x01\x15\xee\xe2\xda\xc7\x7a\xc6\xc4\x94\x87\xd5\x28\xcc\x6c\xed\xa0\xb9\x02\xb5\x9e\x31\x15\x8a\xa0\x99\x5d\x02\x8d\x31\x23\x23\xa3\x7a\x66\x7d\x7a\x29\x55\xb7\x10\xdb\x2f\x9c\x5c\xe3\x14\x4e\xe5\x5a\xc9\xba\x47\xdd\x98\x75\x4f\x80\xea\x5c\x82\x95\x67\xac\xa7\x11\x38\x1d\x27\x50\x3b\xfe\xb3\xf1\x11\x30\xef\xf4\x9e\x27\x8b\x2b\x21\xf4\x77\x21\x13\xa1\x95\x0d\xfc\xc9\x49\x8a\x98\xad\x56\x0d\x4a\x40\x17\x5c\x3c\x40\x60\x22\x4a\x97\x93\x20\xce\x8a\x0d\x7b\x62\x84\x96\x39\x3f\x51\xdf\x4b\x91\xb7\xd3\xc1\xd9\x60\xe3\xf7\x17\x67\x78\x8e\x73\x7b\x86\x81\x6b\xb9\xc8\x04\x5b\xd7\xca\x37\xc8\xb4\x3f\x1a\xfc\x5c\xc2\x48\x23\x27\xe7\x5c\x81\x1e\x92\x77\x74\x41\x68\xa2\x84\x17\x8e\x19\x27\x23\x8c\x54\x28\x6b\x44\x43\x82\x39\x84\xf6\xe7\xb1\xd0\xb3\x15\x95\xc9\xa0\xf3\xea\x7d\x36\xcf\xc5\x9a\xfd\x8b\xca\x04\x8c\xaf\xdc\xae\xe9\x2d\x28\x92\x49\x88\x20\x06\x1e\x35\xdc\xb5\xd6\x2c\xf8\x7f\xf9\x73\xfd\x9d\xbf\x14\xdc\x1c\x8b\x56\xf6\xfe\x82\xc7\x2c\xa2\x96\x8a\x51\xbd\xb4\xd3\xe8\x7b\x73\x7a\x07\xc5\x04\x19\x3c\x14\xb9\x02\x89\x66\x2b\xa3\xb8\xd8\x8d\xf8\x21\x1f\x43\x02\xda\x2a\x43\x98\xa1\x4b\xb5\xcd\x4c\x62\x29\x9d\x02\xa1\x3a\x20\x8a\x16\x04\xb8\xca\xb1\xa7\x35\xd5\x68\xd5\x12\x50\xa4\x0f\x51\x45\x7e\xbc\x38\x23\xaf\xc9\x81\x79\xd6\x21\x6e\xff\x84\xb2\x04\xc3\xb4\x35\x95\xcb\x6b\x64\x13\x3f\x05\x2e\x09\x71\x8f\x08\x69\x8f\x68\x9f\x70\x61\xdb\x86\xbb\x35\x19\x8d\xcb\x2b\x6c\x2e\x9a\x05\x0d\xe3\x2f\x10\x55\x1b\x13\x98\x1f\x15\xc8\xd6\xe8\xcb\x8f\x35\xe8\x4b\x59\x84\x30\x38\x57\x85\x9e\x45\xac\x14\x34\x8d\xa9\xa6\x8e\xee\x14\x39\x87\x2f\x71\x4b\x9f\x9a\xfa\x28\x78\xcb\x78\x7e\x6f\xc3\x1f\xda\x53\xf2\xaf\xcf\x71\x5a\xdb\xa2\xff\x5e\x3b\x09\x84\x66\x59\xc2\x0a\xff\x5f\x29\x7e\xe0\xa2\xb2\xd5\xcb\x1d\xed\x3d\x9d\xc1\x63\xee\xdd\x88\x86\xb3\x53\x1e\x8b\x74\xe5\x61\x68\x82\xa3\xd1\xac\xfc\x80\x17\x89\x3c\x4f\x6e\x8e\x48\x60\x0e\x0d\xb2\xdf\x97\x10\xe7\xad\x99\xcd\xc8\x62\x7e\x43\x71\x7a\x92\xd0\x31\x24\x96\xb3\x58\x04\x52\xab\x08\xf4\xd4\x31\x38\x52\x24\xed\x45\x20\x5f\x89\x04\x03\x1f\x68\x00\x84\x99\xfe\x59\xc0\x01\x27\x69\x0b\x0e\xa8\xc8\x54\xe0\x80\x2a\xd9\x73\x80\x43\xde\x80\xd1\x92\x65\x38\x18\xae\x5d\x85\x03\xb2\xce\x7d\x87\x83\x82\x28\x12\x69\x36\x92\xc2\xa8\x5c\xad\xb1\x16\x37\x2d\x11\x96\x65\x79\x9d\x1c\x0d\xbe\x65\xed\xcf\xd6\x9c\x59\xba\x98\xa2\xdb\x40\xcc\x59\x0c\xb1\x91\x60\x91\xc6\xfb\x60\xbe\xff\x55\x62\x39\x48\x7a\x96\xf9\x90\x9f\x45\xcc\x41\x4a\x9f\xa7\x6f\xee\x74\x3f\x3c\xf3\x64\xda\x06\x56\xb2\x56\x98\x89\x88\x68\x82\xc5\x89\x9a\x61\x0c\x59\xc6\x9a\xe5\x89\x09\x0b\x1a\x12\xba\x96\xf0\x3b\xef\x34\xc7\x3a\x35\xf8\x8d\xb3\x7d\x71\x11\x43\xa9\x06\x46\xae\x8c\x28\x7a\x63\xe3\xd9\xf0\x3a\x1f\xce\x68\xb8\xba\xf3\x9d\x43\x5c\xb9\x5b\x0b\x57\xff\xe0\x5d\x28\x79\x64\x16\x08\x3c\x66\x7c\x8a\x16\x9d\x3e\x91\x90\x50\x0c\x17\x77\x67\xf8\xd6\xaa\x5f\x3d\xc4\x68\x3f\xa9\x47\x67\xff\x68\x94\x84\x98\xe0\x6e\x66\x34\x72\x78\xf9\x66\x62\xa9\x25\x53\xe4\xd5\x5b\x0f\x80\x06\x35\x62\xf6\x91\x41\xbc\xb2\x6f\x18\x76\xd3\xda\xd8\x6e\x19\x8f\x5d\x1c\x62\x05\x58\x5e\x49\x74\x52\xe8\x90\x7c\xc0\xb2\x53\x25\xd2\x70\x4c\x7e\xe5\x24\x00\x8b\x0c\x6a\xa3\xc7\x95\x15\x58\xbd\x79\x69\xf0\xb0\xc9\x2f\x3c\x64\x79\x9a\x1f\x39\xee\xbd\x79\xee\xc0\xa8\xbd\xab\xd7\xf9\x77\x79\xf5\x94\xfb\x7a\xc7\x78\x2c\xee\x54\xdb\x3a\xc4\x4f\x76\x5a\x2f\x50\x47\x06\xad\x35\xe3\x53\x55\xd6\x23\xaa\x95\x28\xd7\x2b\x12\x7e\x87\x27\x52\xd8\x44\x97\x55\x01\x3e\x20\x87\x05\x7c\xa7\x04\xec\x30\xa6\xa9\xa2\xa7\xd2\xbc\x8a\x66\x34\xb9\xce\xea\x17\x26\x22\xcb\x68\xf0\xfd\xbb\xeb\x93\xea\xd4\x86\x9e\xdd\xcd\x40\x5a\xde\x6b\x7e\x27\x34\x4e\x99\x52\x68\x06\x82\xf1\x4c\x88\x5b\x72\xe0\xe3\x9c\xa6\x4c\xcf\xf2\xf1\x30\x12\x69\x29\xe4\x69\xa0\xd8\x54\x1d\x39\xa4\x1d\x98\xd5\x1f\x12\xc6\x13\xc6\x4b\xa6\x79\xac\x7a\xe9\xcc\x18\xf8\x90\x28\xac\x02\xf7\xd6\x55\x36\x73\x5e\xe6\xd5\x65\xda\x5a\x66\x0c\x92\xa7\x2f\xb7\xb0\xba\x3d\x97\x0d\x33\xc7\x1f\xd9\x22\x7c\x77\x57\xe7\xa8\x9c\x44\xb0\x16\x8e\x56\x7a\x7b\x72\x20\x05\xeb\x58\xab\xb0\x41\x2b\x99\x9b\xd4\x10\x02\x4f\xd1\x9a\x58\xcd\xcc\x25\x9f\xca\x72\xf6\x3c\xc8\x1e\x69\xba\xe9\x2e\x3b\xae\x2b\x35\xb7\xdd\xe8\x4a\xcd\x6d\x1e\x5d\xa9\xb9\xae\xd4\x5c\x57\x6a\xee\xe1\xd1\x95\x9a\x73\xe3\xe9\x33\xc6\x48\x57\x6a\xae\xe6\x78\x59\xe9\xce\x5d\xa9\xb9\x9d\x46\x57\x6a\x6e\x75\x74\xa5\xe6\x36\x8c\xae\xd4\xdc\x86\xd1\x95\x9a\xeb\x4a\xcd\x75\xa5\xe6\xba\xa2\x19\x8f\xce\xb5\x9f\x45\x33\x48\x57\x6a\xce\x8d\xae\xd4\xdc\x8b\x28\x1f\x42\xba\x52\x73\x5b\x8d\xae\xd4\x5c\x57\x6a\xae\xce\xe8\x4a\xcd\xe1\xe8\x6c\x2f\x5d\xa9\x39\x3f\xba\x52\x73\x76\x7c\x39\x52\x73\x57\x6a\xee\x45\xc8\x8a\x4a\xc7\xac\x56\xdd\x8f\x6d\xd2\x34\x9d\xd7\xb7\x94\xd8\x31\xce\x27\x13\x90\x28\x6c\xe0\x93\x57\x3c\x8c\xa1\x9c\x03\xe6\xac\x99\xe9\x9c\x0f\x51\x81\xee\x63\xc6\xa7\x0b\xf7\xda\x70\xbb\xcb\x24\xc1\xfa\x1c\x12\x14\x66\x39\x72\x72\xfe\xfe\xbb\x76\x72\x42\x9b\xa5\x6b\xe1\x9a\xdf\xf3\xa8\x79\x70\x42\x01\xf0\x75\xe1\x87\x0e\xee\x51\x22\x94\xf5\x03\x5b\x60\x45\x33\xca\x39\x78\xc1\x90\x69\x54\xb8\xc6\x00\x9c\x88\x0c\xb8\x8d\x7a\x0a\xed\x7f\xa9\xd6\x34\x9a\x0d\xcd\x93\xb8\x07\xb6\x2b\x7f\x52\xcc\xa8\xb4\x04\x9a\x5a\xa0\x4b\x48\x29\xb3\x53\x11\x1a\x49\xa1\x14\x49\xf3\x44\xb3\x2c\x4c\x46\x14\x60\x38\x97\x8d\xe6\x0b\xc0\x40\xd7\x31\x58\x47\x2d\x26\x29\x86\xa7\xb9\x65\x89\x72\x4a\x3c\x8a\xa5\x7d\x2c\xa1\x95\x66\x7a\x41\xcc\x2b\x27\x36\xda\x80\x49\xa5\x49\x94\x30\x94\x9a\xf0\x89\x36\x72\x1e\xe7\xeb\xa3\x50\xab\xb1\x14\x09\xae\x54\xb9\xa5\xf2\x18\x59\x52\xa6\x15\xc1\x10\x9b\x62\x42\x37\x55\xcc\x94\x63\xe1\xaa\x4f\xa8\x4f\xf8\xb6\x80\xf6\x2b\x45\x50\xc7\x38\x99\x9f\xdd\x7d\x55\x9a\xae\x54\x25\xc6\xe0\xa6\xd5\x74\x0b\x44\xc7\x8c\x6e\x8f\x9c\xfd\x72\x3d\x31\x1f\x30\xe4\x33\x3f\x57\x8e\x01\x6e\x00\x87\xb9\xc1\x01\x88\xc0\x68\x0c\x74\x03\xd6\x7f\x76\xa4\xd7\x54\x4e\x41\x87\xd6\xad\x75\xe3\xb0\x56\x5a\x99\x82\x0b\x50\x2a\xcb\x18\x05\xc4\x10\x38\x23\x11\x63\x68\xa1\x4b\x97\x35\x38\xb3\xa6\x59\xba\x5d\xa0\xcb\xf4\x5f\x77\x81\x0f\x21\xb5\x61\x0c\xe1\xa1\x2a\xa3\x11\x28\x72\x70\x31\x3a\xed\x93\xd1\xc5\x99\x8b\x55\x10\x93\x75\xf9\x0a\x8e\x84\x59\x04\xdc\xd4\xb6\x9d\x29\xff\x8c\xbb\x19\xd5\xb8\x9d\xa5\x07\x51\x69\x4e\x36\x95\x2e\x08\x29\x34\x64\xbd\x14\x1a\xd6\x65\x04\x7b\x6a\x80\xa2\x92\xd3\x2f\x1c\xa6\xd9\x1a\x02\x9f\xbd\x69\xbb\x06\x99\x32\x8e\x81\xed\xef\x40\x29\x3a\x85\x51\x4d\xe3\xf4\x26\xc1\x1b\xed\xd3\xc5\x19\x45\xaa\x90\xd8\x38\xfd\xf0\x4d\x11\xcd\xd2\x53\xe5\x25\x91\xd4\xae\x29\xec\xf7\x9d\x64\x5a\x03\x9e\x6f\xac\x12\x81\xfe\xad\xe5\x4c\x9c\xde\x52\x4c\xcc\x3b\x3f\x49\x71\xb3\xe1\xef\x3c\x76\x1d\x6e\x81\x8c\x25\x83\x09\x99\x30\x0c\x7b\xc1\x40\x94\xbe\xcd\x7b\xa6\x56\x71\x54\xca\xa8\x35\x82\xfb\xb0\x07\xbf\xae\x21\xf9\xc9\x2d\x4c\xcb\x9c\xdb\x82\xab\x2e\x4e\x15\x63\xd5\xd9\x84\x4c\x31\x90\x45\xda\xaa\x59\x7f\x7e\xfd\xd7\xbf\x90\xf1\xc2\x48\x37\x88\xda\x5a\x68\x9a\x84\x97\x4c\x80\x4f\x0d\xac\x2c\xa5\xae\x46\x5b\x07\x08\x60\x49\x54\xbb\xf0\x37\x7f\xbc\x1d\x57\xc5\xad\xa3\x18\xe6\x47\x25\xf8\x0d\x12\x31\x1d\x92\x53\xca\x0d\xae\x8f\x81\xe4\x59\x8c\x56\xba\x3a\xc2\x51\xdb\x68\x26\x12\x16\x2d\x9a\x93\x1d\x97\x90\x40\x66\xe2\xce\x56\x12\x59\x83\x3d\x45\xa8\x5b\x26\xb2\x3c\xb1\x86\xca\xef\x42\x9e\x42\xae\x60\x35\x18\x79\xed\xb9\x40\xd3\x9a\x9b\x62\xe9\x68\xbb\xf8\x25\xff\x48\xe1\xe2\x3a\x9d\xf1\x27\xe4\xe1\x9b\x33\x4e\xbe\xa3\x49\x32\xa6\xd1\xed\x8d\x78\x2b\xa6\xea\x3d\x3f\x97\x52\xc8\xea\x5a\x12\x6a\x18\xe7\x2c\xe7\xb7\xb6\xfe\x65\xc8\x95\x12\x53\x23\x65\x67\xb9\xf6\x25\xd5\xd6\xbd\xb0\xcd\xbc\xf1\xfc\xd8\x71\xd9\xd2\x2c\x70\x8f\x38\x74\xc7\x0c\xba\x71\x02\xe6\xf9\x16\x23\xcb\xf3\xab\x32\xb2\xfd\xf1\xf5\x9f\xff\xdd\xa2\xae\xd1\x22\xff\xfd\x35\xc6\xb8\xa9\xbe\x3d\xc4\x48\x17\x8d\xcc\x90\xd2\x24\x31\xe4\xb5\x8c\x94\x06\xd0\xeb\x90\xf0\xb3\xe3\xa0\x6e\x8e\x6e\x5b\x4b\xd5\x37\x37\x3f\x23\x4b\x60\x5a\x41\x32\xe9\xdb\x88\xe0\x50\x43\xa6\x87\x32\x42\xcf\x51\x1f\x23\x62\xed\x83\x2c\x3c\x17\x49\x9e\xc2\x19\x60\xb3\xef\xc6\xa0\xaa\xcc\xe6\x03\x24\x13\xa6\x30\xf8\x7a\x9c\x88\xe8\x96\xc4\xee\xc7\x52\xb4\xc2\x72\x2d\xb9\xfa\x50\xa8\x1b\xb7\xd1\x20\x5e\x63\xe3\xfb\x57\x22\x35\x52\x9a\x65\x8c\x4f\x0d\x18\x28\x91\xf4\xae\x02\x0c\xdf\xdb\x9d\x36\x4d\x2c\x6d\x6c\x4d\x6c\x6a\x4b\x1c\xb8\x37\x32\x74\xb3\xf6\x14\xb5\x23\x15\x9a\x9b\x22\x8b\xd5\xb7\xd4\x72\xbe\x98\xd0\x9f\x86\x0c\xff\xb6\x51\xb8\x2b\xe2\x72\x10\x1f\x03\x62\x58\x01\xc0\xa0\x0f\x92\xe4\x27\xed\x41\xdf\x2c\x4c\xa5\x02\x17\x1e\x8c\x87\x29\xd5\x4e\x20\xf4\x1a\x04\x25\x19\x48\xc5\x94\xe1\xcb\x1f\xf0\x40\x9d\x26\x94\xa5\x5e\xe6\xcf\x44\xfc\x34\x40\xb0\x87\x1b\x4b\x80\x35\xa7\x94\x23\x11\xbb\x09\x91\x14\xda\xf2\x67\x6b\xc4\xda\xaa\x54\xdb\x22\x43\x7d\x6a\x52\xf9\xa1\x80\x66\x95\x52\x9a\x6f\x02\xa9\xb4\x57\xbd\x24\x02\x89\xef\xf7\x5c\xe9\x63\x58\x7c\x4b\x64\x00\x09\xa3\xdb\xdc\x2a\x25\xac\x28\x8f\xf6\xa0\x94\x44\x7a\xa7\x07\x0e\x89\xf5\x9c\x9a\x33\xe1\x6e\x25\xbd\xe3\xde\x93\x12\x49\x0b\x22\x29\x32\x3a\x6d\x54\xcc\x79\x09\x52\xcb\xd3\x92\x18\xac\x12\x00\x0a\xd5\x20\xfc\x3d\xd4\x5f\xc0\xab\x20\x2e\x32\x72\x31\xdf\xda\x3a\xc1\x3c\x80\x9d\x82\x80\xb5\xee\xc9\x1d\x5d\x10\x2a\x45\xce\x63\x67\x6a\x0c\xb6\xde\x77\x4b\x0f\xbe\x14\x1c\xd5\x0c\x9f\xa7\x6f\x44\x57\x8c\xb5\x63\x8a\x8c\x41\x53\x43\xa6\xdf\x0c\xdf\xbc\x7e\x29\x9c\x0a\xdf\x70\x89\x53\x5d\x06\x4e\x65\xe9\xd3\x93\xbe\xab\x2f\xfb\xd8\xd2\xfb\xbe\x73\x26\x96\xa2\xaa\x23\xf3\x55\xeb\xf0\xab\x3b\xc9\x34\x94\x3a\x24\x1c\xa0\xe2\x62\xf4\xc3\x52\x46\xe4\x61\x8b\xc5\x4c\xdb\x28\xce\x46\x88\xca\xc7\x9f\x90\x6e\x39\x02\x85\xc7\x6d\x9d\x85\x4b\x3d\x40\xc2\xca\x80\x7a\xf5\x8a\x1c\xd8\x2b\x7b\x36\x01\xec\xf0\x49\x51\xcb\x01\xed\xfc\x3e\x6b\x50\x6c\xa7\x02\xb8\xf3\xfb\x8c\xa2\x0d\x2e\x6b\x11\x82\xff\x09\x33\x3a\x07\x4c\x7c\x63\x09\x95\xc9\xc2\x80\xf2\xda\xae\x9d\x8c\x73\x4d\x80\xcf\x99\x14\x1c\xe3\x38\xe6\x54\x32\x3a\x4e\x80\x48\x98\x80\x04\x6e\x74\xd1\xaf\x0f\x3e\x9c\x5c\xa1\xdf\xfa\xd0\x16\xed\xf5\xab\xcc\x15\x46\x0a\x2e\xad\xa4\x34\xdd\xa3\xdb\xe7\xd7\x61\x60\x88\x34\xd7\xaf\xcb\x3c\x27\xcd\x75\x6e\x2b\x03\xdf\x47\x49\xae\xd8\xfc\xa9\x28\x89\xcb\x48\x3c\x63\xb5\xf6\x79\x29\x3b\xb2\x00\xd4\x4a\xa2\x63\x61\x83\x7f\xa4\x14\x5d\x4f\x85\xe2\x1d\xe5\xca\x11\xce\xf4\x44\x52\x36\x9d\x69\x17\x72\xe5\x6b\xb7\xac\x88\x10\x98\xb3\xfd\xb4\x46\x28\xc3\x76\x4f\x12\x46\xd5\xae\x22\xd7\x4a\x36\x91\x9b\x05\xcb\x54\x71\x57\x71\x83\x26\xc1\xb6\x62\x1e\x64\x0d\x8e\x17\x23\xe7\x9d\xf2\x70\x63\xdc\x48\xbb\x65\xa3\x79\x26\xe2\x9e\x72\xb7\x58\xab\xe1\xa4\x9c\x0f\x7c\xe3\xdc\xbd\x48\xfc\xb1\x08\x28\x5a\xb5\xb8\xe0\x03\x73\xcf\x25\x68\xb3\xaf\x66\x96\x1d\x33\x6d\xea\x2a\x1e\xb5\x54\x8e\xf5\x10\x24\x33\x91\xc4\xbe\x0d\x98\x35\xc9\x8c\x41\xdf\x01\x70\x72\x31\x42\xf8\x99\x57\x44\x6f\xcf\x06\x28\x5a\xef\x00\x96\x15\x28\x69\xa4\x15\x78\xee\x8a\x60\x0d\xb4\x92\x26\x22\x7d\x78\xd3\xc6\x67\xfe\xef\x01\x66\xde\x23\x46\xc7\x62\x0e\x08\xd2\x38\x96\xa0\x1a\xa4\xe5\x3f\x81\x9e\xda\x88\x94\xb2\x5a\x05\xa6\xab\xfe\x8d\x00\x36\x6f\x21\x42\xf1\x1d\x8f\x2a\x22\xde\x67\xa6\x60\x17\xa3\xd3\x06\xd4\xab\xf7\xa3\x73\x6f\x98\xa9\x7a\x3d\x45\x58\x16\x15\xfe\xd4\x21\x29\xbc\x86\xa5\x68\x65\x2b\x31\xee\xe6\xb2\xaa\x2b\x26\x96\x88\x5a\x43\x22\x4d\xb8\x9d\xc6\x90\x15\x97\xa9\x18\xbc\xc4\x4c\x59\x37\x71\x05\x1a\xca\xdf\x51\x06\x88\x0f\x44\xb0\x44\xde\x85\x65\xf4\x43\xf0\xde\x12\x61\x42\x0b\xba\x0f\xc3\x2b\x51\xf1\x15\x60\x7e\x36\x58\x8e\x2e\xce\xda\x44\x97\x8c\xc5\x7b\x87\x2e\xbb\xeb\x97\xd5\xbc\x94\x6a\x3a\xb7\x9b\xd0\x1f\xf6\x91\x88\x37\x88\x49\x05\xa3\xc1\xeb\xcb\x6d\x94\xb4\x20\x94\x58\x33\xe1\x52\x7f\xba\x1a\x40\xd9\x99\x4a\xa0\xa8\x35\xca\x93\xe4\x1a\x22\x09\xbb\x9a\x47\xab\xfb\x7f\xb1\x34\xd7\x26\x91\xa7\x24\xbf\x63\x8e\xb0\xbb\xd8\xb2\x64\x65\xe0\x13\xb0\xa6\x9c\x01\x94\xe5\x49\x82\x71\xe0\x7c\xe1\x01\x8e\xab\x57\x25\x5f\x14\x53\x3e\x66\xc5\x86\x48\x55\x76\x41\x41\x78\x58\x28\x8b\x4e\x95\xb2\x1e\x53\xc6\x63\x36\x67\x71\x4e\x13\x7c\x10\x4a\xa1\xe5\xde\x81\x81\x43\xa6\xbe\x32\x13\xf9\x4e\x48\x02\xf7\xd4\x5c\xd6\x0f\x42\x2c\x55\x88\x0e\xb1\x88\x6e\x41\xf6\xad\x28\x76\x86\x1f\x4e\x51\xe2\xb5\xb5\x07\xfd\x3a\x8c\x2e\x31\x13\x5c\xc8\x7a\x1d\x4b\x5d\xb8\xc1\x91\x85\xc3\x57\xf6\x75\x17\x8c\x4f\x07\xf8\x8d\x79\x11\xf7\xa4\x81\xe0\x03\x3a\x30\x68\xf8\x4c\x04\x3f\x2c\x36\xf8\x1e\x25\xab\x2b\x8f\x2f\x5e\x45\x30\x8a\x9c\xc8\xa7\x33\x04\x96\x4c\xa9\x2f\x79\x93\x80\xc6\x6a\x26\xce\xaf\x6b\xd3\xce\xdd\xbd\xb1\x13\xd3\xca\xd5\x5d\xaa\xb8\xf6\x4c\x84\xbf\xba\x16\xb2\xa5\x48\xe1\x12\xd9\x72\x30\xd2\x3b\x63\xa0\x98\x83\x9c\x33\xb8\x3b\x72\xac\x73\x70\xc7\xf4\x6c\x60\x21\xa2\x8e\x10\xb0\x47\x5f\x59\xf1\xd2\x26\x65\x9c\xc4\xb1\x33\x5b\xe6\x0a\x26\x79\x62\x0d\x90\x6a\x48\x68\xc6\x3e\x80\x54\x4c\xf0\x3e\x56\xa9\xec\x93\x9c\xc5\xdf\x7e\xc6\xc0\x17\xc6\x59\x11\x62\xd7\x88\x0a\xbe\x75\x54\xce\xe5\x02\xb2\x7f\x16\xbd\xfb\x5c\x70\xd0\x18\x12\xc1\xa7\xa5\x4c\x46\x14\x2f\x2e\x38\xd3\x2b\x3d\x88\x6c\x45\x22\x54\x91\x85\x8c\x31\x90\x91\x09\x59\xb1\x07\x9b\xf9\xb0\x4e\x4b\x29\x1c\xd2\x90\x48\x56\x99\x0f\xc3\x59\x54\x60\x46\xc4\x06\x44\xf8\xa4\x27\x2d\xc8\x8c\xba\x3a\x31\x2e\x0a\x93\x29\x32\xa3\x3c\xc6\x8f\x51\x24\x64\xec\xd6\xcb\x74\x88\xbd\xb4\x41\x41\x36\x12\x05\xd9\x1a\x76\x71\xe5\xcb\x4f\x46\x0d\x54\xa6\x95\x40\x3d\x2f\xf6\xe4\x9c\xfd\x4f\x0e\x84\xa6\xc2\x10\xf6\xe5\x8a\x95\x4b\x10\x49\xe9\x02\x79\x2b\x2e\xf5\x6d\xc8\xe2\xb1\x89\x42\xaa\x4f\xae\x80\xc6\xac\x94\xec\xd8\x27\x6f\xab\xd9\x8f\x7d\xb3\x96\x6b\x9b\x96\xe5\xbe\xb2\xab\xf7\xcd\x5b\xaf\xac\x93\x28\xf5\x71\x45\xab\x2f\x63\x76\x45\xd3\x5b\xe0\x56\x29\x37\xa0\x41\x3f\x58\x2e\x71\x0f\xa2\x19\xc4\x39\x72\xa9\xf1\x82\x4c\x98\x2d\x63\x8b\xa2\x02\x9b\xce\x40\x69\x2f\x5c\x1e\x61\xac\x4e\x51\x8f\xdf\x2f\x00\xd1\xb7\x14\x69\x5b\x98\xb1\x52\x7a\x6f\x56\x24\x5c\x07\x5c\x1b\x98\xef\x74\x36\x95\xa7\xfe\x2c\x2f\x43\x5a\x0d\x7d\xef\x5c\xb3\xf2\x52\x79\x50\xb6\x04\x5c\x74\xd2\x39\x3b\x1c\x99\x50\x35\xc3\xe2\xb9\xcb\x5b\x10\x59\x93\x4c\x94\x4b\x43\x30\x6c\x4d\x5d\x8a\xdd\xf2\xb0\x35\x13\x36\x56\x5b\x67\xb8\x69\x98\x3c\x60\x16\x3b\x28\xf1\xbb\xe7\xc2\xc4\x4e\x42\x30\xb8\x01\x7c\xb4\x44\x09\xec\x4e\x1a\x86\xe5\xeb\xc6\xc8\x9c\x17\x1e\xd3\x1a\x4d\xe0\x1b\xb0\xa4\xfa\xfe\xd1\x5a\x7e\xcd\x26\x1c\x90\xca\x69\x73\xcb\x47\xef\x44\x4e\x73\x7b\xd0\x1d\x15\x2e\x0a\x4e\xba\x9e\x65\x28\xb5\x59\x19\xd3\xa8\x33\xa7\xef\xce\xbc\xfb\xcc\x46\xf3\x15\xb9\x15\xbe\x70\xfa\x90\x7c\x68\x6a\xa4\x5e\xb6\x52\x1b\x6a\x5e\x98\xbe\xa3\x70\xb2\x0c\xc5\x48\xe6\x5e\xbf\x08\x4f\xf3\x72\x28\xe3\x59\xae\x1d\x1b\x2c\x34\x4e\x1e\xcd\x28\x9f\xfa\x32\xdd\xe5\x75\xa9\x05\xd7\xf4\x1e\xdb\xc8\x8e\x81\x80\x8a\x68\x16\x42\x0e\x49\x2c\x72\xf3\xf0\xaf\xbf\xee\x13\x06\xc7\xe4\xeb\xd2\x8d\x43\x72\xee\xae\x2d\xbd\x70\x29\x9a\x7e\x5c\xbc\x6e\x9f\x48\x98\x52\x19\x27\xce\x3c\x72\x57\x4a\xc1\x08\x2f\x08\xf7\x4c\x69\x65\x79\x86\x6e\x40\x49\x34\x55\xb7\x86\x6e\x98\x93\x30\x88\xa9\xa6\x83\xd2\x11\x3c\xb2\x7a\xd6\xc0\x95\xde\x1b\x50\x87\x0a\xa5\xd6\xdd\x5f\xb9\x76\xab\x03\x1a\xae\x62\x46\x82\xc6\x22\x78\xf5\xe5\x92\xe7\x66\x13\x6b\x50\x81\xb1\x7a\xda\xce\x8b\x6a\xae\x08\x03\x8c\xba\x2f\xe4\x9b\x40\xf4\x5c\x91\xc1\x75\xe7\xef\xfc\xf2\xe6\xea\xe7\xd1\xfb\x8b\xcb\x9b\xee\x18\x76\xc7\xf0\x8b\x3a\x86\xc0\xe7\x8d\x8f\xa0\xd7\x4b\xd6\xb9\x54\x97\x8b\xb5\x95\x52\x6f\x5e\x50\xe0\xda\x39\x9f\x7f\xa0\xb2\xe8\x87\xeb\xfc\x41\x6b\x3c\xcc\xbe\x61\x2e\x92\xa4\xd3\x67\x1f\xb9\xf6\x84\x71\x67\x2d\xc6\xf3\x94\x4d\x16\xeb\x76\xad\xdc\x44\xe4\xf4\xf7\x8b\xb3\xf3\xcb\x9b\x8b\xef\x2e\xce\xaf\x9e\x34\x10\xa3\x61\xb1\xb4\x2a\x13\xad\xc9\xd5\x32\x09\x73\x26\x72\x15\x5a\x75\xac\x27\x01\xab\x91\x7c\x3c\x46\x4b\x82\x02\x89\x31\xcd\x6b\x6f\xfb\xd2\x59\x63\x35\x8a\xa4\x41\x21\x8a\xb6\x90\xed\x3b\x29\x6a\xb7\x0e\x5e\xf6\x76\x58\x9b\x84\x77\x0d\xaf\xdb\xff\x9e\x72\xce\x8a\x32\xa3\x70\xa2\x59\x28\x1e\x60\xbe\xc7\xe4\xa6\xa6\x47\xb1\x61\x31\xcb\x76\xea\x3e\xda\xc8\x95\x77\x34\xfb\x01\x16\x57\xd0\xb0\xde\x45\x15\xde\x90\x40\x64\xd8\x12\xb9\x85\x85\x0d\x53\x3c\xf5\x0f\x6b\x52\x97\x63\x2f\x6b\x81\xde\x42\x93\x3a\xad\x6d\x16\xf1\xbc\x85\x06\x21\x98\x7e\xac\x94\xb3\x34\x5b\x88\x52\x95\xd9\xd3\x66\xbb\x47\xda\x2d\xe0\xf9\x09\x8a\x96\xbe\x5c\x7f\x42\x75\xb4\xb8\x0b\xde\x2d\xda\xf2\x4e\x58\x0f\xf5\xa2\xc2\xbb\x02\x11\x21\x36\xc7\x11\x71\xd3\x9b\xe0\x9d\x50\xd0\x12\x68\x9a\xc5\xfa\x9a\x81\x5b\xd8\x2e\x5d\xed\x15\x84\xd5\x46\xbc\x87\x8a\x4a\xf1\xb1\x4f\xec\x57\xa1\x47\xcc\xd0\x60\x58\xbf\xfa\x11\x1d\x84\x7d\xf2\x8f\xf0\x25\xb6\x98\x54\xbf\xf4\x7a\x7f\xfb\xe1\xfc\xe7\xff\xe8\xf5\x7e\xfb\x47\xf9\x57\x64\x85\xd6\x6d\x5c\xbd\x44\x65\x10\x0d\xb9\x88\xe1\x12\x9f\x81\x1f\x9d\x78\x75\x62\x5d\x09\xee\x07\xcc\x4f\x1e\xda\x18\x9e\xf0\x31\x13\xf1\xf2\x27\xd5\xa8\xf4\xd5\x5e\x32\x06\xdc\xa2\x06\x79\x36\x76\xb4\xc7\x1e\x0a\x5a\xd2\xf2\x51\x75\xb3\x7a\x6c\xc4\x12\xaa\x14\xff\xfc\xce\x83\x00\x9b\x7a\xf9\x42\x08\x1c\xb3\xc7\x8d\x64\x5a\xad\x83\xf6\x6a\xfe\xa6\x51\xfb\x42\x3b\x5a\x24\x6d\x61\x07\x5b\x06\x18\x42\xc4\xb7\xc6\xc1\x83\x1c\x18\x6c\x08\x1f\x09\x7d\x96\x4e\x46\x17\x64\x6e\x21\xbc\x37\xc0\xf1\x6e\xbe\xef\x3e\x29\x8d\x0b\xce\xc4\xe5\x2c\xd5\x63\x1b\x8e\xe2\x7f\x77\x15\x03\x94\xab\xba\x83\x8e\x49\x45\x0e\xec\x97\xc3\x28\xcb\xfb\xee\x82\x61\x0a\xa9\x90\x8b\xf0\x31\x94\x5e\x19\x28\x2d\x24\x9d\x62\x86\x89\xbd\xdd\xde\x16\x3e\xd9\x1b\x2b\x0f\x58\xbd\xdb\x2a\xae\x85\x4f\x31\x94\x72\x7c\x79\xb4\xcd\x83\x7e\x4f\x48\x5b\xd4\xb4\xa8\x50\x75\x54\x11\x32\xd8\xcd\xac\xc0\x19\xa0\x88\xfa\xa4\xcb\xa0\xed\x17\xd1\x61\xe8\x0b\xe7\x73\xa3\x59\xd6\x2e\x07\x57\x8c\x16\xa9\x59\xcc\xe6\x4c\x89\x46\x4d\xab\xdd\x44\x9b\x23\x09\x5d\x11\x0f\x1b\xcd\x14\x8c\x5c\xf7\x19\x56\xc0\x0a\xe7\x75\x89\xec\xbf\x69\xd2\xdb\xd4\x8e\x8c\x6a\x0d\x92\x1f\x93\xff\x3a\xf8\xf5\x9b\x8f\x83\xc3\x6f\x0f\x0e\x7e\x79\x3d\xf8\xeb\x6f\xdf\x1c\xfc\x3a\xc4\x3f\xfe\xf5\xf0\xdb\xc3\x8f\xfe\xc3\x37\x87\x87\x07\x07\xbf\xfc\xf0\xee\xfb\x9b\xd1\xf9\x6f\xec\xf0\xe3\x2f\x3c\x4f\x6f\xed\xa7\x8f\x07\xbf\xc0\xf9\x6f\x5b\x4e\x72\x78\xf8\xed\xd7\x8d\x97\xde\x42\xb1\x49\x3b\xda\x2c\x39\x59\x9d\xb1\x15\xf4\xfb\x84\x45\xdb\xed\xf0\xe8\xd5\xf6\xf9\xbf\xf2\x54\xb3\x14\xdd\xe2\xd9\xf5\xde\x1c\x70\x1b\x1e\xf9\x39\x2c\x39\xf6\x49\xd5\xcc\x93\xa0\x5a\xbc\x34\x3e\xf7\x25\x18\x77\xbc\xd8\x6e\xf7\xb5\x90\x44\x27\x52\xa4\x3e\xbf\x1d\x9d\x11\x36\x13\xcb\x5d\x77\x0b\x8d\x9a\xdf\xd9\xd1\x19\x83\x3a\x63\xd0\x86\xf1\xa8\x31\xc8\x06\xe7\xef\xaf\x25\x08\xf8\xbc\xae\x0b\x63\xad\xbf\xdb\xeb\x3a\xe5\x62\x70\xdb\x39\xc0\x86\xfe\xa8\x17\x9e\xb3\x22\x4e\xc5\x32\xb4\x74\xbd\xc7\x91\x9c\x60\x2f\x4e\x7b\xf0\x71\x82\x50\x02\x13\x5c\x95\x7a\x97\x8d\x38\x37\x4b\xb8\xf3\x35\x2d\x2b\x95\x2c\x31\xc6\x96\xf1\xa9\xab\xeb\x60\x59\x89\xf3\x3e\x31\x5e\xd4\x86\x0d\xc2\x61\xd1\x6d\x98\x2a\x25\x22\x6c\xf1\x61\x1d\x64\xa1\x46\x9d\x5b\x36\xae\x46\xd3\x5b\x28\x37\x1d\x26\x1f\xcc\xbd\xc5\xbb\x8e\x17\x58\x03\x95\xcf\x83\x93\x2d\xb7\xa1\x1b\x96\xfc\xad\x9f\xe3\x65\x85\x0b\x18\x44\x74\x4e\xb0\x52\xd4\x00\x52\xfd\xa0\x61\x53\x0c\x9c\x10\x93\xc2\xca\x5a\xaf\x6d\x5b\x63\x2e\xde\x9c\x67\x06\xcf\x56\x23\x61\x68\x85\x59\x16\xe6\xe7\x2a\x93\x7c\x09\xce\xc0\xe6\xec\xf3\x8b\x63\x9d\x2d\xb1\xcd\x76\x58\xe6\x0e\xbe\x93\x36\xd9\x64\x1b\xce\x92\x4c\xc2\x84\xdd\xb7\x74\x4e\x4f\x4a\x79\x7a\x2c\x06\xae\xd9\x84\xd9\xce\x94\x99\x84\x0c\xb8\xed\x0e\x4d\xa3\x19\xd2\x7e\xc7\x29\x0b\xe7\xf4\x3e\x86\xde\x58\x81\xbb\x5d\x52\x76\xbd\x4e\xd8\xef\xe8\x18\xe9\xe8\x58\xed\xf1\x99\xe8\x98\xc3\xdc\xfd\x21\x62\x18\xd7\xdd\x3c\xb0\xfc\xac\x14\x25\x8e\x58\xdc\x3c\x8f\x76\xa9\x36\x5a\xa0\x8b\x5a\xd8\xbe\xc5\x36\x99\x4b\x92\x04\xe6\x90\x38\xa1\x89\xa4\x94\xd3\xa9\x6d\x38\xa5\x45\x28\x81\x23\x24\x31\x48\x2c\x59\xbc\x52\xdf\x06\x85\x78\x9f\xe7\x84\x3f\x4a\x91\x24\x20\x15\x49\xd8\x2d\x90\x33\xc8\x12\xb1\x48\x5d\x98\x6a\x4c\xae\x35\xd5\x06\xa5\xaf\x41\xd7\xf3\xf9\x36\xab\x8d\xe1\x53\xbb\x5b\x2a\x04\x6e\x73\xc5\x31\xd3\x9a\x64\x2e\x8d\xf0\x3d\x47\x8a\x71\x82\xbd\x47\xfa\xe4\x12\xe6\x20\xfb\xe4\x62\x72\x29\xf4\xc8\x8a\xde\xd5\x68\x3b\x7b\x21\x61\x13\x72\x6c\x94\x3a\xa5\x89\xb6\xfd\x1f\x4a\x59\xdf\x42\x56\x26\x28\xaa\x9f\xb5\x91\xa4\xb6\x9a\x80\x8d\x33\x85\xf4\xeb\x5a\x6e\x8c\x46\xdb\x14\x1a\xec\x34\xde\xa0\x13\x9b\x54\x59\xd4\xb5\x2d\xe1\xb7\x2d\x56\xe0\xeb\x79\xa1\x0a\xc8\x38\x91\xa0\x32\xc1\x15\x54\x8b\x15\x16\xcd\xd6\x50\xd5\x55\xad\x6a\x88\xb5\x39\x67\x53\x9e\x99\x09\xa5\x31\x8f\xb4\x9d\xb6\x4d\x23\x3f\x1d\xa6\xe5\xd2\x24\x81\x98\xb0\x34\x85\xd8\xa8\xf0\xc9\xc2\xf5\x9b\xa1\x55\xf3\x40\x84\xad\x0a\x7c\xfb\x13\x70\xd9\xba\x95\x44\xdf\xca\xf5\xbe\xf2\x7c\xe8\xb2\xe2\x3b\x85\x6e\x4a\xef\x2d\x0e\x26\x32\x91\x12\x02\xac\x54\x3f\xc6\x9a\xd8\xaa\xd4\xaa\x65\x26\xc4\x2d\x89\x44\x9a\x25\x78\x74\x1a\x9c\xac\xa2\x53\x54\x40\xa5\x01\x76\xfe\x3b\x2a\x35\x91\xc2\x2f\x9e\xb0\x93\x5f\x1b\x32\x18\xdc\x43\xd4\x5a\x07\x39\x43\x4b\xcd\x2e\xa3\xbf\x5f\xf0\x20\x8a\x4d\x84\x61\x60\x98\xaa\x1c\xaa\xf1\x95\x4a\xcf\x9c\xdf\x43\x54\xea\xc2\x88\xf5\xa0\x22\x5f\x5d\xc1\x1c\xf4\xe6\xdd\x75\x1b\xbb\x29\xda\x72\x0d\x34\x48\x6d\x2b\x8f\xa5\x12\x7a\x38\xa7\xaf\x18\xee\x1e\x81\xcd\x17\x50\x7f\xb2\xe9\x6e\xe5\x12\x14\x01\x87\xed\x89\x5d\xa9\xbb\x17\x82\xaf\xfd\x5c\xd8\xe3\x46\x08\x4d\x0e\x7a\x47\xbd\xc3\x15\x9b\xe5\x52\xd9\xe9\x9b\xd2\x9d\x0c\xeb\x2c\x66\x58\xb4\x10\xa2\x5e\xdc\x27\x4c\xfb\xe8\x6c\xdb\x35\x07\x57\xe5\x72\xf0\xfa\x44\x09\xa2\x25\x8d\x99\x93\x7e\xf0\x5b\x73\x91\x96\xb9\x63\x0e\x07\xbd\x8f\x3d\xd7\xb4\xe7\x4e\xf0\x9e\xc6\xe5\x0f\xc9\x8d\xad\xd9\x12\x26\x5a\x88\x9c\x70\xb0\x69\xe7\x70\x9f\x25\x2c\x62\x3a\x59\x20\xa1\x23\x22\xb7\x7d\xab\x0c\x9b\x71\xb9\x7f\xe7\xf7\x4c\xfb\x06\x1d\x62\x42\x5e\xdb\xb6\x59\x40\x9d\xd5\x34\x61\x73\x38\x9a\x01\x4d\xf4\xcc\x06\x96\x70\xc1\x07\xff\x04\x29\x30\x2b\x90\xbb\x5f\x9a\xfa\x58\x9a\x99\x20\xcb\xa3\x81\x39\x72\x75\x41\x0d\xb5\x0d\x43\x7b\xbf\xaf\xdf\xb7\x95\xac\x94\xce\xba\xb9\x19\x7d\x5f\x69\xdc\x8a\xc4\x5f\xeb\xcc\x87\xfb\x94\xda\x1b\xef\x01\xed\x68\xc7\xc1\xd9\xa8\xeb\x2a\x69\x91\x84\x35\xed\xbe\x4a\xd6\x97\x42\xdb\xbe\xed\xea\xff\xcf\xde\xff\x77\x37\x6e\x5b\xfb\xc2\xf8\xff\xf7\x55\x60\xb9\xe7\x7e\x6d\xa7\x92\x66\x26\xc9\x49\x7b\xe6\xe6\xdb\x2e\xc7\xf6\xa4\xbe\x99\xf1\xf8\x58\x9e\xe4\xe9\x93\xe9\x69\x21\x12\x92\x50\x93\x00\x03\x80\xf2\xa8\x27\xe7\xbd\x3f\x0b\x7b\x03\x20\x28\xc9\xb6\x4c\xd2\x23\xd9\x11\xbb\x56\x33\x96\x28\x10\xdc\xd8\xd8\xd8\x3f\x3f\x9b\xfc\x55\x96\x00\xa4\x41\x47\xd9\x3c\xa0\x18\x68\x66\xc8\x9e\x1d\x6a\xcf\x8a\x27\xcb\x0d\x7f\x61\x34\x45\x90\x09\x6d\x18\x6d\xa4\xf1\xc5\x57\x67\x81\xb7\x68\x6e\xdd\x9e\x03\xa5\x36\x32\x27\x53\xf7\xda\xf5\xe2\x4a\xb7\x33\x06\xb0\x7b\xd0\xa2\xb4\x3a\x57\x81\x12\xce\xfd\xe6\xd9\xc9\xaf\x25\xb9\x81\x74\xaf\x75\x10\x48\x62\xb2\xc5\x7d\x66\xb8\x40\x62\x21\x66\x4b\x47\xb2\xb4\x83\x84\x09\xd2\x61\xd2\x04\x69\x57\xaa\xb9\x38\x10\x04\x02\xdb\xe7\x87\x75\x96\x87\x41\x3a\xcb\x35\x20\xab\x1c\xb3\x8e\x67\xd0\x69\xd3\x11\x11\x3b\x8d\xf0\x93\xf6\xc5\xa0\xf1\x75\x37\x01\xba\x59\x7c\xd2\x25\x05\x8a\x0e\xd2\xc1\x97\x93\xc1\x97\xda\x61\x83\x98\xd0\x4c\xcd\x9a\x96\x6b\x57\x57\x77\xaf\xde\xb2\x37\x38\x59\x5d\x09\xad\x88\x08\xed\x9e\xcd\x93\xe8\x0f\x4e\xba\x4b\xdb\xec\x3a\x69\xb3\xd3\x94\xcd\x47\x4d\xd8\x84\x32\x91\xd6\x52\xa4\x1e\x2f\x80\x21\x63\xac\x4d\xa7\xfb\x45\x18\x75\x56\xd7\xac\xfb\x5f\xed\x56\xdb\x8a\x3d\x66\x92\x62\x28\x93\xeb\x0e\xed\x9a\xfd\xab\xe3\x0b\x1c\x32\x32\x6d\xa8\xf0\xce\x10\x2e\x66\x32\x9b\x01\x16\x29\xb9\x3a\xbe\x80\x9d\x37\x80\x7f\x81\x23\x0a\x2c\xea\x39\x33\x55\x21\x83\x0b\x4f\x05\x44\x51\x28\xd2\xa0\x19\xd7\x86\x27\xf0\xbb\xca\x4d\x6a\x47\x68\x13\x97\xda\x59\x4a\xab\xae\xce\x2d\xa5\xa8\x65\xee\x43\x8d\xa6\xb6\x89\x87\x5b\x7c\x2e\xb9\xf3\x48\xd5\x7a\x4a\xef\xce\xa5\x0e\xc6\xdb\xde\x73\xa9\x50\x6c\x68\x64\x23\xec\x7c\xb2\x1c\x09\xc1\xc1\x6e\x89\x83\x8c\xd8\x58\x2a\xb6\x18\x08\x89\x02\x1b\x69\x09\x9b\x90\x0a\xa8\xfe\xf3\x2e\x28\x59\x0b\x5e\x60\xca\xa5\xef\x17\x9d\x39\x84\xd0\x17\x3a\x86\x05\xf5\xcd\x7f\x7b\xf6\xed\x58\x0e\xb3\xeb\x55\x65\x0c\xae\xf5\x30\x7c\xc8\x4c\x82\x6e\x56\x1f\x7f\x71\x1e\x55\x3f\xfd\xc5\x50\x49\xa2\xa8\x9e\x62\x5b\x5e\xf6\x89\x9b\x00\x40\x4a\xb5\x14\xe8\xec\x8d\x3a\x04\x73\x1d\x21\x54\x47\x41\x1e\xfc\xd1\x85\x4c\x17\x3b\x70\x4f\x14\x4d\x18\x29\x98\xe2\x32\x25\x50\x4f\x9c\xca\x1b\x41\x46\x6c\xc2\x85\xf6\xf4\x03\xa8\x72\x47\x68\x7b\xdc\x30\xf0\x0d\x7b\x2c\xb6\x01\xb9\xac\x81\xa0\xb8\xf2\xa4\x44\x56\x3b\xda\xcd\x62\x31\xc8\x04\x19\xa1\x40\x5e\xec\x8d\x13\x16\x26\x6e\x17\x74\xcf\xa4\x3b\x88\x36\x61\x47\x2b\xff\xdd\xad\xd4\xe1\xda\x52\x3d\x99\xb6\x0b\xfc\xee\xc2\x53\x6b\x5e\xbb\xf0\xd4\xc3\xae\x5d\x78\x6a\x17\x9e\xba\xfd\xda\x3a\xf7\xee\x2e\x3c\xb5\x33\xba\x16\xaf\x5d\x78\x6a\x17\x9e\xba\xe5\xda\x3a\xf9\xb5\x0b\x4f\xad\x71\xed\xc2\x53\x6b\x5e\xbb\xf0\xd4\x2e\x3c\xb5\x0b\x4f\xed\xc2\x53\xbf\x21\x37\xa0\xbf\x76\xe1\xa9\xa5\x41\x76\xe1\xa9\x88\x18\x3b\x4b\x69\xc5\xb5\x0b\x4f\xad\xb8\x76\xe1\xa9\xe8\xda\x9d\x4b\x0d\xce\x25\x1f\xdc\xb9\xb0\x76\x59\xfb\x9a\xb5\x0b\x08\x1c\xf0\xc4\xc5\x88\xe4\xb8\x56\xe7\x84\x8f\x1a\x54\xed\x22\x22\xcc\x0f\x5f\x6a\xe3\xa2\x41\x55\x8c\x69\x65\x3d\x54\xcb\x66\x69\x85\x4c\xab\x60\x44\x14\x85\x40\xeb\xb4\x79\x4d\xda\xc6\xaa\xad\xda\x84\x1e\xb6\x3a\xec\xb0\x25\xa1\x9d\x0e\x42\x0d\xbb\x30\xc3\xb3\x0b\x33\x74\xe3\xa2\xeb\xc0\x3d\xd7\xfa\x84\x71\xc1\xfc\xab\xa9\x62\x7a\x2a\xb3\xc6\x8c\x5e\x63\xf2\x77\x5c\xf0\xbc\xcc\xa1\x8b\xaa\xe5\x67\x3e\x0b\x59\x03\xa1\x55\xb4\x13\xf4\xe8\x29\x8c\xda\xad\xfa\x36\xab\x50\xd6\x39\xa5\xa0\xaa\xeb\x32\x49\x18\x4b\xa3\x06\xf0\xa0\x98\x7d\x35\x08\x4f\x0a\xed\x34\x5e\xb5\x93\x37\xed\xce\x7e\x84\x28\x85\x51\xbe\xfa\xb2\xd1\x18\x2d\xa3\x3c\x9f\x3f\xc2\xd3\x81\x98\x6e\x6f\xaf\xb4\xb2\x55\xba\x38\x25\xda\xda\x28\x4f\x2d\x92\xd3\x59\x44\xb3\x83\x08\xce\x16\x45\x6f\xb6\xe6\x58\xd8\x96\x88\xcd\x16\xa2\xaf\x76\x10\x60\xe8\x22\x42\xd3\x5d\x74\xe6\x11\x40\x4a\x1f\x27\x2a\xd3\xa1\x35\xdc\x51\x34\xe6\x73\x44\x62\x3a\x79\xeb\xb6\x11\x98\xcf\x17\x7d\xe9\xe6\x75\x5b\x7a\xb7\x9e\x45\xc4\xa5\x03\xaf\x56\x97\x1e\xad\xce\xbc\x59\x8f\x16\x61\x69\x1f\x5d\xd9\x82\xc8\x4a\x6b\x22\x73\xc1\x0d\xa7\xd9\x09\xcb\xe8\x7c\xc8\x12\x29\xd2\xc6\x27\xcc\x02\x6a\x5d\xd8\x3f\x1a\x87\x75\x36\x5a\x3d\xff\x78\x4a\x1d\x38\x2f\x4b\x7d\x4a\xb5\x77\xff\x39\x85\x02\x1a\x9a\xe0\x2c\xb7\xd2\xa1\x47\xb6\xc6\x18\xc4\x64\xec\x2e\x17\xf1\x2f\xf2\x86\xc8\xb1\x61\x82\x1c\x70\xe1\xd7\xf1\x30\x32\x03\x2b\xcb\x3c\xb0\xb5\xfd\xf6\xd5\x4b\x7f\xf3\xf3\x33\xb9\xc1\xb9\xa0\xf5\xe3\x7b\x40\xdc\x83\xee\x77\x81\xb8\x1b\xc7\x65\x56\x77\x83\xa0\x6b\xa4\x2e\x6f\x5e\x55\xf0\xa2\xaf\x60\xdc\xb0\xdb\xa8\x48\x89\x2b\xdc\x78\x7e\x8b\xd6\x3a\x6e\xfc\x1c\x62\xc6\x3b\xdf\x0b\xe9\xda\xf7\xb2\xa1\xd8\xf0\x16\x6a\xcd\x4f\x34\x1e\xbc\xd3\x9a\x1f\x70\x19\x9e\x33\x59\x9a\xcf\xa2\x26\xde\x4c\x79\x32\x8d\x4f\x3d\x9e\x33\x4d\x64\xb9\xa0\x3f\xbf\x72\x3f\x5b\x79\x64\xed\x74\xc5\x95\x57\x53\x0f\xd0\x0a\x33\x79\xb1\x9c\xb0\x6a\x19\x49\x35\xa1\xe4\xe4\x7c\xf8\xf7\xb7\x47\xdf\x9d\xbe\x1d\x90\x53\x9a\x4c\xe3\x5a\x53\x41\x28\x48\x42\xd8\xd4\x53\x3a\x63\x84\x92\x52\xf0\x5f\x4a\x44\x1e\x26\x07\xe1\xb7\x87\x9d\xe2\x9c\x36\xdc\x59\xd0\xd6\xb6\xb3\x3e\x2a\xd8\x24\x17\x83\x97\xd2\x5a\x8b\x4a\xe6\x8b\xa2\xf1\xd4\x7e\x85\x4a\x04\x88\xd1\x29\x53\x8c\x4c\xf8\xcc\xc5\x65\x1c\x70\x2c\x4d\x43\x38\xd5\xf2\xb9\x65\x0b\xab\x82\xd0\x11\x84\x41\xa7\x8c\x08\x66\x2c\x5b\x07\x63\x54\x0a\x5d\x2b\xfa\x2d\x35\xd3\x3d\x32\x2a\x21\x70\x5b\x28\x9e\x53\xc5\xb3\x79\x3c\x18\xcd\x06\xe4\x5c\x7a\x55\x67\xbe\x38\xa5\x93\xf7\xa7\x43\x72\xfe\xfe\x8a\x14\x0a\xcb\x81\x21\xf2\x0a\xdf\xc3\x6b\x8d\x98\xfd\x85\xeb\xbf\x37\x20\x47\x62\x8e\x5f\xe2\x06\xe7\x9a\x58\x3d\x87\x09\x7b\x93\x3b\x1f\x3c\xe0\xf3\xde\xcb\x01\xfc\x6f\xcf\xbe\xa5\xb2\x07\x48\x08\x28\x27\x4b\x89\x21\x78\xc4\xf0\x51\x16\x51\xd3\xbd\xfb\xb3\xea\xa4\x12\x52\x62\x2e\x2c\x11\xa3\x4e\x2a\x34\x2c\x35\x90\x17\x3b\xeb\x70\x31\xc9\x62\xae\x6a\x26\xf6\xdb\xea\x8d\x6d\xb5\xc6\x7e\xf5\x06\x17\x4d\x95\xc7\x4e\x3a\xba\x54\x73\xe8\xa8\x0f\x42\x75\xfa\x79\x55\xc9\x49\x04\x19\xb7\xb6\x3b\xbb\xf0\x3b\x60\x80\x78\xea\xf9\x42\x3f\x34\xf8\x31\x3a\x2c\x7b\xe4\x25\xf9\x96\x7c\x22\xdf\x82\xea\xf4\x4d\xdb\xae\x11\x6d\x95\x9a\xf6\xa6\x1b\x6a\xec\x67\x17\x1d\x51\xfc\x27\x2b\x9d\xec\x88\x96\xaa\xd6\x94\xe6\x22\x75\x1d\x42\x0d\x53\x56\x8e\xba\x95\xd8\x68\xbf\x0d\x3b\xc1\xcf\xc8\x66\xe8\x97\x3c\x1b\xc7\x70\xef\xe6\x81\x8c\x66\x7f\x6e\x6d\xa0\x73\x27\x85\xea\xe0\xf1\xd5\x68\x39\x35\xc9\xb4\x2e\xc6\xac\xa2\xa6\x4d\xb5\xc1\x34\x49\x25\x58\xc9\x98\xe3\x33\xe5\x2d\xa2\xac\xdb\xc3\xc6\xed\x02\x6f\xb5\xf5\xbc\x6b\xa5\x16\x8c\x23\xf0\xeb\x38\xc5\x2a\x82\x8e\x28\x64\xea\x74\x32\x3b\xad\x34\x3a\x33\xee\x50\xca\x9c\x1d\x16\xdc\x51\xc0\x4b\x76\x3f\x25\x54\x60\x72\xe6\x98\x29\x85\x69\x59\xa3\x39\x71\xcd\xf8\x5b\x2f\x5e\xab\x9d\x54\x28\x69\x64\x22\x5b\xb4\x04\xa9\x07\xc3\xdc\x70\x40\x04\x74\xec\x78\x7f\xda\x87\x93\x8b\x1e\xb9\x3a\xbe\x80\x4e\x09\xc3\xe3\xab\x8b\xba\xa5\xb2\x77\x75\x7c\xd1\xa2\xb5\x7c\x27\x76\xa1\xd3\xac\x5e\xdb\x69\x36\x18\xa4\x66\x54\x5a\xb5\xad\x9f\xd3\xa2\x7f\xcd\xe6\x0d\xcf\xd4\x2e\xce\xf5\x7e\x58\xe1\x4e\x5e\x08\xc9\x9c\xd3\xe2\xc1\xa3\x29\x46\x53\xfe\x99\x32\xa4\xdd\xce\xaa\x9e\xb9\x3a\x55\x3a\x97\x33\x96\xa2\x3a\xec\x7f\xc1\x44\x5a\x48\x6e\xf5\xc5\x5d\xfe\xf4\xc3\x7f\xbd\xcb\x9f\xbe\xeb\xda\xe5\x4f\xef\xf2\xa7\x77\xf9\xd3\x77\x5f\xbb\xfc\x69\x77\x6d\xde\x0d\x4a\x76\xf9\xd3\x0d\xaf\xe7\x15\xc3\xdb\xe5\x4f\x3f\xe8\xda\xe5\x4f\x2f\x5f\xbb\xfc\xe9\x5b\xae\x5d\xfe\xf4\x2d\xd7\x2e\x7f\x7a\x97\x3f\xbd\xcb\x9f\xde\x65\x82\xdc\x3b\xd6\x76\x66\x82\x90\x5d\xfe\xb4\xbb\x76\xf9\xd3\xcf\x22\x27\x86\xec\xf2\xa7\xd7\xba\x76\xf9\xd3\xbb\xfc\xe9\x26\xd7\x2e\x7f\x1a\xae\x9d\xef\x65\x97\x3f\xed\xaf\x5d\xfe\x34\x5e\xbf\x1d\xad\x79\x97\x3f\xfd\x2c\x74\x45\xdf\xbb\xa6\x7d\x3e\xf0\xfe\xb1\xcc\x8b\xd2\x30\x72\xe9\x87\x0c\x27\x04\x19\xcd\x31\xb1\x27\xda\xed\xed\xc3\xf3\x89\x14\x63\x3e\x29\x15\x24\xf6\xbe\xc0\xc6\x30\xfd\x04\x27\xd1\x0f\xef\xd5\x0f\xcf\x7c\xf1\x04\x43\xf4\x19\xcf\x79\xb3\x5c\x6d\xb2\xb4\x3e\x6f\x61\xac\xc8\x8f\x6b\x37\x54\x4e\x3f\xc1\x4e\xa1\xb9\x2c\xb1\xa7\x8e\xa3\x60\xc5\x19\xe8\xed\xde\xd6\x05\x22\xdd\x28\x33\x55\xee\xf9\x45\x07\x7a\x45\x41\x8d\x61\x4a\xbc\x26\xff\x75\xf0\xf1\xf7\xbf\xf6\x0f\xff\x7c\x70\xf0\xf3\xcb\xfe\x7f\xfc\xed\xf7\x07\x1f\x07\xf0\x8f\x2f\x0e\xff\x7c\xf8\xab\xff\xe3\xf7\x87\x87\x07\x07\x3f\xff\xf0\xee\xfb\xab\x8b\xd3\xbf\xf1\xc3\x5f\x7f\x16\x65\x7e\x8d\x7f\xfd\x7a\xf0\x33\x3b\xfd\xdb\x9a\x83\x1c\x1e\xfe\xf9\xdf\x1a\x4f\xb9\xf5\xe1\xd7\xdd\xd1\xd7\xd1\xc1\xf7\x28\xc7\x9e\x8b\x03\x75\xb4\x25\x2f\xdd\x68\x8b\x9b\xd2\x1d\x5f\x77\x6d\x4a\x2f\x5b\x21\x57\x35\x8c\xc3\x35\x91\x39\x37\xd6\x8e\xb0\x06\x1d\x8d\x33\x40\xb8\xa9\xa9\x9f\x4e\x1c\x40\xea\x14\x35\xd8\xe9\x2b\x64\x4f\x44\x19\x99\xd2\x4c\x99\xba\xe1\xda\x77\x50\x0b\x96\x09\x6c\xeb\x7e\xca\xc6\x5c\x30\xe7\xf1\xde\x89\x88\xb5\xaf\x9d\x88\x78\x8e\x22\x42\xb3\xa4\x54\xdc\xcc\x8f\xa5\x30\xec\x53\x23\x93\xaa\x2e\x21\x86\x6e\x40\x22\x0b\xcc\x8a\xf2\x56\xa3\xcb\xa8\x53\xa5\x80\x54\xe8\x07\xef\xbc\x42\x66\x3c\x99\xbf\xf0\x13\x86\x2d\xc6\x3e\x99\x17\x6b\x8e\x63\xa8\xbe\xae\xb6\x2f\xeb\x5b\xfd\xb8\xda\xa5\x4b\xa3\x3e\x41\xd5\x0b\xb4\x9e\x0b\xc5\x67\x3c\x63\x13\x76\xaa\x13\x9a\x81\x94\xea\x46\xf2\x1f\xdd\x32\x3a\x08\x6c\x25\x33\x4d\x6e\xa6\x0c\x3a\x1e\x52\xfb\x26\x60\x32\x27\x54\x90\x09\xe5\x82\xe4\x76\x89\x0a\xff\x63\xcb\x13\x56\x2e\x1b\x4d\x0a\xaa\x98\x30\xfe\x07\xae\xc0\x66\x24\x65\xe6\x52\xfe\xb2\x79\x35\xbe\xcb\x99\x15\xf2\xef\x82\xdd\xfc\xdd\x8e\xa6\xc9\x38\xa3\x93\x90\x73\xab\x99\x59\xb2\xd2\xab\xa1\x6f\x7d\x01\xc8\xa7\x2b\x19\xa1\xd9\x0d\x9d\xc3\x6b\x2c\x8e\xc1\xf5\x6b\xf2\xea\x10\x58\x97\x6a\x12\xc6\x48\xc9\x97\x87\x10\x03\x38\x3e\xba\xf8\xfb\xf0\xaf\xc3\xbf\x1f\x9d\xbc\x3b\x3b\x6f\x27\xf0\xed\xbb\x33\x2a\x1a\x8d\x91\xd0\x82\x8e\x78\xc6\xdb\xc8\xf9\xa5\x28\x71\x3c\x28\x1c\xa8\x69\xfa\x22\x55\xb2\x40\x3a\xa9\x52\x40\xf1\x60\x55\x3d\x52\xb7\x70\xe3\x8a\x42\x58\x9e\x71\x7d\xc0\x89\xa2\xc2\x78\x7b\x2b\x26\xb9\x2a\x85\x35\x9a\x9f\x78\x42\x2d\x4d\xbb\x4b\xa6\x3d\x4a\x53\x96\xd6\xa8\xf7\xec\x92\x77\x8e\xfd\xcb\xcd\xab\xda\x4a\x72\xf1\x7e\x78\xf6\xff\x2c\xb0\xe1\xbc\x68\x97\xab\xd0\x4d\x3d\x87\x6a\xde\x2c\x98\x2c\xbe\xfa\xa5\xab\x17\xd8\xad\xef\x56\xac\x6f\x38\xab\xba\x89\x90\x5d\x96\xa2\x5e\x7e\x5f\x8d\x4f\x72\x99\xb2\x01\xb9\xc0\x63\x8a\xe9\x85\x6f\xa3\xb2\x3c\xaa\x18\xb1\xb7\x08\xc3\xa1\x2b\xb1\xb5\xa7\x66\x34\x63\x98\x02\x09\x49\xf0\xb5\x8a\xc2\x58\x0e\x8f\x69\xa6\x5b\x0a\xd3\x36\x27\x93\x3d\x84\xdf\x59\xd3\xb0\x13\x6a\x86\xd1\x48\xca\x84\x34\xce\x06\xb5\xb3\x84\x22\x4b\x25\x13\x82\x76\x68\x94\xce\x50\x3b\x5d\x5c\xaf\x6a\x7f\x30\x71\xed\x69\x75\x11\x46\x46\x0f\x6e\xa9\x99\x5e\x7d\x30\x55\x96\xa9\x1d\x5d\x31\x9a\x42\x2d\x49\x41\xcd\x14\xa3\x91\x39\xd5\xd7\x2c\xc5\x0f\x9c\x5e\xe3\x2c\x60\xed\xfa\x56\xbb\x47\x5d\xd9\x79\x8f\x19\x35\xa5\x62\xa8\xcf\x60\x8c\x94\x09\x3a\xca\x9a\x15\xcb\x93\x2e\xb6\x80\x7d\xa7\xf7\x22\x9b\x5f\x4a\x69\xde\x84\x1a\x8a\x4e\x16\xf0\x27\xa7\x29\xd6\x5d\xac\xa0\x4a\x41\xf0\x30\xed\x03\x31\x81\xa5\xe3\xf2\x8d\x93\x6a\xc1\x36\xcc\xd0\xaa\x14\x47\xfa\x7b\x25\xcb\x6e\xda\xc5\x5b\x6e\xfc\xfe\xec\x04\xf6\x71\x89\x7b\x98\x09\xa3\xe6\x50\x2d\xb6\x0c\xf4\x11\x74\xda\x0f\x96\x3f\x17\x38\xd2\xea\xc9\xa5\xd0\xcc\x0c\xc8\x3b\x3a\x27\x34\xd3\xd2\x2b\xc7\x5c\x90\x0b\xc8\xb1\x88\x4d\xbe\x01\x81\x8a\x56\xfc\x7a\x24\xcd\x94\x2c\xdc\x00\xec\xbc\xfc\x3b\xac\xd0\xc1\x80\x45\x85\x3c\xc2\xc5\xd2\xcf\x0d\xbd\x66\x9a\x14\x8a\x25\x2c\x65\x22\x69\xb9\x6a\x9d\xc5\x1e\xbe\xf9\xba\xf9\xca\x9f\x4b\x61\xb7\x45\x27\x6b\x7f\x26\x52\x9e\x50\x94\x62\xd4\x2c\xac\x34\x44\x0d\x9d\xdd\x41\xa1\xb4\x07\x36\x45\xa9\x99\x02\x3f\x9a\x35\x5c\x70\x21\x7e\x28\x47\x2c\x63\x06\x8d\x21\xa8\x17\xa7\x06\x6b\xaa\x78\x4e\x27\x8c\x50\x13\x18\xc5\x48\xc2\x84\x2e\xa1\x81\x3e\x35\xe0\x66\x93\xac\x2a\x7c\xa2\x9a\x7c\x38\x3b\x21\x2f\xc9\x81\x7d\xd6\x21\x2c\xff\x98\xf2\x0c\x12\xcc\x0d\x55\x8b\x73\xe4\x63\x3f\x04\x4c\x09\x78\x8f\x48\x85\x5b\xb4\x47\x84\x24\xba\x4c\xa6\x7e\x4e\xd6\xe2\xf2\x06\x9b\xcb\xc3\x01\x4f\xfd\x33\x64\xd5\xd6\x02\xe6\x83\x66\xaa\x33\xf9\xf2\xa1\x81\x7c\x89\x55\x08\xcb\x73\x75\xea\x21\x63\xe5\xcc\xd0\x94\x1a\xea\xe4\x4e\x55\x2d\xf9\x1c\x97\x74\xd3\xd2\x47\xb3\xb7\x5c\x94\x9f\x30\x71\xa3\x3b\x23\x7f\x78\x0a\xc3\x92\xc4\x13\x0d\x16\x8d\x16\x45\xc6\xb1\x4e\x71\x21\xf3\xe1\xac\xb6\xd4\xbd\x5b\x54\x24\xd8\xe6\x34\xcb\xa4\x15\x6f\xf6\x64\xa7\x22\x95\xf9\xd2\xc3\xac\x02\xc5\x6a\x00\x55\x03\xf2\x2c\x99\x67\xe3\xee\x88\x8c\xcd\x58\x0b\x2c\x86\x45\x3c\x2d\x3b\x9a\xd5\xc5\xfc\x82\xc2\xf0\x24\xa3\x23\x96\xe1\xc9\x82\x0c\xa4\x97\x19\x68\xd3\xd9\x43\x4a\x66\xdd\xe5\x4e\x5f\xca\x0c\x52\x36\x68\x20\x84\x1d\xfe\x49\xd0\x01\x06\xe9\x8a\x0e\x60\xc8\xd4\xe8\x00\x26\xd9\x53\xa0\x43\xd9\xe2\xa0\x25\x8b\x74\xb0\xa7\x76\x9d\x0e\x70\x74\x6e\x3b\x1d\x34\x4b\x12\x99\x17\x17\x4a\x5a\x93\xab\xb3\xa3\xc5\x0d\x5b\x85\x83\xd0\x26\x5f\x91\x60\x03\xa2\xbc\x7e\x33\x85\xb0\x81\x9c\xf1\x94\xa5\x56\x83\x05\x19\xef\x03\x4a\xff\xbf\xb8\x6b\xa1\x15\x3d\x8b\xe7\x90\x1f\x45\xce\x98\x52\x1e\x61\xc0\xfe\xd2\x7d\xf1\xc4\xcb\x80\x5b\x78\xc9\x3a\x39\x4c\x64\x42\x33\x80\xca\x6a\xc7\x31\x64\x91\x6b\x16\x07\x26\x3c\x58\x48\x10\x5a\x82\xcf\x7c\x14\x1f\x50\x93\xe0\x13\xe7\xfb\x12\x32\x65\x11\x7a\x47\x09\xb8\x87\x57\x98\x89\x07\xf7\xf9\x44\x4c\x7b\xaa\xfb\x68\x60\x5a\xfb\xb5\x91\x0e\xb9\xe1\x5d\x00\xe0\xb2\x13\x64\x22\xe5\x62\x02\x1e\x9d\x1e\x51\x2c\xa3\x90\xe8\xee\xf6\xf0\x35\x9a\x5f\xfb\xc0\xd1\x7e\x50\xcf\xce\xfe\xd1\xa0\x09\x71\x29\xdc\xc8\xe0\xe4\xf0\xfa\xcd\x18\xa5\x25\xd7\x64\xef\xad\x27\x40\x0b\xc4\xa2\x6d\x3c\x20\xf6\xf0\x0d\xc3\x6a\xa2\x8f\xed\x9a\x8b\xd4\x65\x50\xd6\x88\x15\xb0\x25\x51\x0b\x1d\x90\x1f\x01\x04\x2d\x12\x0d\xaf\xc9\x47\x41\x02\xb1\x48\xbf\x31\x7b\x5c\xa2\xc2\xea\xdd\x4b\xfd\xbb\x5d\x7e\xe1\x21\x8b\xc3\x7c\x10\xb0\xf6\xf6\xb9\x7d\x6b\xf6\x2e\xdf\xe7\xdf\x65\x6f\x93\xeb\x7a\xc3\x45\x2a\x6f\x74\xd7\x36\xc4\x4f\x38\xac\x57\xa8\x13\xcb\xd6\x86\x8b\x89\x8e\xed\x08\x9a\x65\x35\x37\xec\x2a\x43\xc2\xaf\x70\x40\x12\x5d\x56\xe0\x03\x73\x20\xe1\x77\x46\xc0\x03\xae\x49\xae\xe9\xb1\xb2\xaf\x62\x38\xcd\x86\x45\x73\x48\x25\xb2\xc8\x06\xdf\xbf\x1b\x1e\xd5\x87\xb6\xf2\xec\x06\x90\x6a\x2d\xb1\xed\xf7\x84\xa6\x39\xd7\x1a\xdc\x40\x6c\x34\x95\xf2\x9a\x1c\xf8\xb4\x8d\x09\x37\xd3\x72\x34\x48\x64\x1e\x65\x70\xf4\x35\x9f\xe8\x17\x8e\x69\xfb\x76\xf6\x87\x84\x8b\x8c\x8b\xc8\x35\x0f\x18\xac\xce\x8d\x01\x0f\x49\xc2\x2c\x60\x6d\x1d\xce\x9e\x8b\x32\x2f\x4f\x13\x91\xf5\x38\xcb\x36\x0f\x14\xb1\xbc\x3c\xe7\x2d\x6b\xde\xef\x59\x22\x78\x77\x87\xd0\x14\x97\x3f\xac\xa4\x23\x6a\x6f\x1b\x27\x52\xf0\x8e\x75\x4a\x1b\xf0\x92\xb9\x41\xad\x20\xf0\x12\xad\x8d\xd7\xcc\xde\xf2\x58\x9e\xb3\xa7\x21\xf6\x48\xdb\x45\x77\x75\x7d\x1d\x21\xfb\x0d\xa3\xd1\x22\x5d\x24\xf8\xde\x2f\x64\x8a\x75\xbd\xa1\x2e\x11\x00\xb9\xa1\xce\x98\xff\xcb\x9f\x36\xd5\x89\x25\x24\x26\x9c\xc6\x05\xbf\x0e\xd8\x2c\x25\x56\x71\xc8\xbc\xa1\x93\x17\x99\x95\x67\xb5\x91\xd1\x89\x3f\xe5\x3a\x86\x02\xec\x85\x89\x2c\x35\x5e\xef\x91\x7f\x5a\xcd\x91\x86\x6c\xa8\x5a\x67\xf8\x50\x34\x09\xe1\x46\x87\x0b\x0a\x30\x27\x46\x7a\x3b\x8a\xa4\x7c\x3c\x66\x3e\xeb\xca\xea\xc1\x54\xd1\x9c\x19\x88\x30\x23\x09\x46\x6c\xc2\x31\xad\x47\x8e\x09\xb5\x13\xd9\xdf\xd7\x55\x19\x5f\x0f\x53\x7f\xb8\x21\x39\x9f\x4c\x91\x51\x08\x25\x99\x14\x13\xe2\xe3\x0b\x99\xa4\x29\x01\xde\x96\x8a\xdc\x50\x95\x13\x4a\x12\x9a\x4c\x21\x58\x41\x05\x49\x4b\x05\x58\x57\x86\xd1\x74\xde\xd7\x86\x1a\x7b\xee\x33\xe5\xd4\x63\x3f\xff\x1d\x1e\xe2\x9d\xd7\x0e\x0f\xf1\xf6\x6b\x87\x87\xb8\xc3\x43\xdc\xe1\x21\xde\x7d\xed\xf0\x10\xdd\xb5\xf9\xb2\x46\xb2\xc3\x43\x6c\x78\x3d\xaf\x9a\xfc\x1d\x1e\xe2\x83\xae\x1d\x1e\xe2\xf2\xb5\xc3\x43\xbc\xe5\xda\xe1\x21\xde\x72\xed\xf0\x10\x77\x78\x88\x3b\x3c\xc4\x1d\xb2\xcb\xbd\x63\x6d\x27\xb2\x0b\xd9\xe1\x21\xba\x6b\x87\x87\xf8\x2c\x30\x6e\xc8\x0e\x0f\x71\xad\x6b\x87\x87\xb8\xc3\x43\x6c\x72\xed\xf0\x10\xe1\xda\xf9\x5e\x76\x78\x88\xfe\xda\xe1\x21\xe2\xf5\xdb\xd1\x9a\x77\x78\x88\xcf\x42\x57\xd4\x26\xe5\x8d\x20\x5e\xd6\xa9\xc8\x75\x51\xdf\xa8\x86\x67\x54\x8e\xc7\x4c\x81\xb2\x01\x4f\x5e\x8a\x30\x06\xe4\x8e\x90\xd9\xe0\x62\x88\x9a\x99\x1e\x14\xf7\xba\xcc\xbe\x5b\x7e\xee\x8a\x86\x00\x8a\x45\x31\x0d\x05\xad\x82\x9c\xbe\x7f\xd3\x4d\xf9\x6f\xbb\xca\x3c\x98\xf3\x7b\x91\xb4\xcf\x43\xa9\x08\xbe\x2a\xd3\xd4\xd1\x3d\xc9\xa4\xc6\x38\x30\x12\x2b\x99\x52\x21\x98\x57\x0c\xb9\x01\x83\x6b\xc4\x98\x20\xb2\x60\x02\x13\xdc\x42\xdf\x71\x6a\x0c\x4d\xa6\x03\xfb\x24\xe1\x89\xed\x90\x6e\xaa\x11\xb5\x51\x8c\xe6\x48\x74\xc5\x72\xca\x71\x28\x42\x13\x25\xb5\x26\x79\x99\x19\x5e\x84\xc1\x88\x66\x90\xb9\x87\x89\x9b\x81\x18\x10\x3a\x66\x18\xa8\x85\x7a\xd4\xf0\x34\x37\x2d\x19\xa3\x1f\x80\x5a\xda\x03\xf8\xb6\xbc\x30\xf3\x90\x23\xc3\xc8\x98\x2b\x6d\x48\x92\x71\xd0\x9a\xe0\x89\x58\x24\x01\xe3\xf5\x40\xa9\x35\x80\x3a\x03\x33\xd5\x6e\xaa\x22\x85\x23\xa9\x30\x1a\x33\x4e\xaa\x01\xdd\x50\x29\xd7\xee\x08\xd7\x3d\x42\x7d\x6d\x3f\x12\xda\xcf\x14\x48\x9d\xc2\x60\x7e\x74\xf7\x51\x34\x5c\x04\x08\x54\xa5\xe4\x54\x8c\x0e\xc5\xfb\x9e\x39\x7b\xb5\x46\xf9\x45\x80\x77\x80\x50\xf6\xd2\x36\x80\x05\x10\x6c\x66\x79\x80\x25\xcc\x5a\x0c\xf4\x16\xae\xff\xec\x4c\x6f\x98\xca\xb9\x80\xcc\x9c\x77\x4c\x6b\x3a\x61\x17\x0d\x3d\x92\xb7\x69\x5b\xe0\x94\xac\x16\x06\x58\x21\xc3\x3c\xfc\xf0\x49\x95\xc2\xb0\xaf\xe3\x29\x91\x1c\xe7\x14\x72\xa5\x6e\x14\x37\xd6\xc8\xe5\x1a\x51\x20\x20\xa8\xb1\x58\x69\xb3\xbf\x90\x08\xf1\xce\x0f\x52\xfd\xd8\x0a\x75\x91\xba\x7e\xca\x8c\x8c\x14\x67\x63\x32\xe6\x90\xeb\x00\xd9\x07\x3d\xac\x6b\xa6\x68\x2d\x68\x6d\x75\x59\x29\x7c\xac\xdb\xcf\x6b\x40\x7e\x72\x13\x33\xaa\x14\x09\x8d\xd0\x8e\x20\x17\x9d\x8f\xc9\x04\xb2\x17\x14\x66\x46\x7d\xfd\xf2\x3f\xbe\x21\xa3\xb9\x3d\xd2\xc0\x2b\x6d\xa4\xa1\x59\x78\xc9\x8c\x89\x89\xa5\x15\x6e\xcf\x7a\x36\x75\xa0\x00\x60\xb0\xe2\xc4\x5f\x7d\x79\x3d\xaa\x9f\xb1\x2f\x52\x36\x7b\x11\xd1\xaf\x9f\xc9\xc9\x2a\x70\xdb\xe6\xe9\x50\x0d\xd5\x9d\x15\x6c\x06\x88\x6f\xad\x19\xcd\x17\xd8\x93\xa9\xbc\x41\xa4\x90\x15\xdc\x53\xe5\x37\x15\xb2\x28\x33\xf4\x4e\xbd\x09\x75\x08\xa5\x66\xcb\xc9\xc6\x2b\xf7\x05\xf8\x53\xdc\x10\x0b\x52\xc3\x25\xad\xf8\x47\x4a\x97\xb7\xe9\x2c\xfe\x50\x67\x5f\x2a\x36\x20\x6f\x68\x96\x8d\x68\x72\x7d\x25\xdf\xca\x89\x7e\x2f\x4e\x95\x92\xaa\x3e\x97\x8c\x5a\x69\x39\x2d\xc5\x75\xbd\x3f\x71\x26\x27\x56\xb5\x2a\x4a\xe3\x93\x04\x57\xbd\x30\x56\xd6\x78\x21\xec\x44\x6b\x34\x0a\xfb\x04\x3c\x74\xc3\x2d\xbb\x09\xc2\xec\xf3\x91\x23\xe3\xf1\x75\xcc\x6c\x5f\xbe\xfc\xfa\x8f\xc8\xba\xd6\x74\xf8\xe3\x4b\x48\x6c\xd2\x3d\xdc\xc4\x20\xdb\xec\x41\x91\xd3\x2c\xb3\xd6\x42\xcc\x94\x96\xd0\xab\x98\xf0\xb3\xf3\xa0\x69\xcf\x6e\x6b\xab\x52\x57\x57\x7f\x05\x3d\x8a\x1b\xcd\xb2\x71\x0f\x33\x7e\x03\x46\xcc\x3e\x1c\x0c\xfb\x4e\xfa\xd8\x73\x75\x1b\x14\xa0\x99\xcc\xca\x9c\x9d\x30\x68\x2d\xdf\x9a\x54\xb5\xd1\x7c\x56\x5c\xc6\x35\x24\x57\x8f\x32\x99\x5c\x93\xd4\x7d\x19\x85\xa8\x17\xb1\xe2\x9a\x53\xa1\x69\xb0\xbe\x45\x90\xfe\xd6\xf7\xaf\x85\xe7\x73\x5a\x14\x21\xff\x56\xd1\x9b\x1a\x31\x60\x4f\x42\x61\x53\xcb\xc2\xd1\xd6\x2e\xa4\xb6\x0e\xa4\xbe\x7b\x23\x2b\x37\x1b\x0f\xd1\x38\x3c\xdd\xde\xff\x54\xcd\xbe\xb9\xd3\xa1\xc6\x10\xd5\x80\x7e\x37\x14\xf0\x6f\x4c\xbd\x5c\xaa\x38\x08\x49\xeb\x81\x31\x50\x01\xb0\xec\x03\x22\xb9\xb9\x33\xa5\x03\xcf\x45\xbb\xdc\x84\x1a\x5d\x44\xf0\x18\xe5\xd4\x38\x85\xd0\xbb\xa6\x28\x29\x98\xd2\x5c\xdb\x73\xf9\x47\xd8\x50\xc7\x19\xe5\xb9\xb7\x2c\x0b\x99\x6e\x86\x08\xb8\xb9\x01\xe2\xab\xbd\xa4\xbc\x90\xa9\x1b\x10\x44\x21\xc2\x9b\xad\x50\x6b\xeb\x5a\x6d\x87\x07\xea\xa6\x45\xe5\x8f\x15\x35\xeb\x92\xd2\x7e\x12\x44\x25\xde\xf5\x9c\x04\x24\xbc\xdf\x53\x95\x8f\x61\xf2\x1d\x89\x01\x10\x8c\x6e\x71\xeb\x92\xb0\x66\x3c\xe2\x46\x89\x54\x7a\x67\x07\x0e\x08\x86\xcb\xec\x9e\x70\x3f\x25\xfb\xaf\xf7\x37\x2a\x24\x91\x44\x4a\x16\x74\xd2\x0a\xac\x79\x81\x52\x8b\xc3\x92\x94\xa1\x11\xc0\x34\x98\x41\xf0\x7d\xc0\x57\x80\xbb\x58\x5a\x55\xdc\x42\x3d\x35\x46\x3e\x3c\x81\x9d\x81\x80\xb5\x4e\x37\x74\x4e\xa8\x92\xa5\x48\x9d\x7f\x29\x38\xf8\xde\x2d\x3c\xf8\x5c\x0a\x30\x33\x7c\x1d\xbe\x55\x5d\x21\xc1\x8a\x6b\x32\x62\x86\x5a\x31\xfd\x6a\xf0\xea\xe5\x73\x39\xa9\xe0\x0d\x17\x4e\xaa\xf3\x70\x52\xa1\x7c\xda\xe8\xbb\x7a\x58\xc7\x8e\xde\xf7\x9d\x73\xb1\x54\xa8\x8d\xdc\xa3\xd2\xc1\x47\x37\x8a\x1b\x16\xb5\x64\x38\x00\xc3\xc5\xda\x87\x51\xc5\xe3\x61\x87\x60\xa5\x5d\x80\xaf\x11\xa2\xcb\xd1\x23\xca\x2d\x27\xa0\x60\xbb\xad\xf2\x70\xe9\x3b\x44\x58\x4c\xa8\xbd\x3d\x72\x80\x77\xee\x63\xd5\xcf\xe1\x46\x59\xcb\x11\xed\xf4\x53\xd1\x02\x4c\xa7\x46\xb8\xd3\x4f\x05\x05\x1f\x5c\xd1\x21\x05\xbf\x63\x53\x3a\x63\x50\xed\xc4\x33\xaa\xb2\xb9\x25\xe5\x10\xe7\x4e\x46\xa5\x21\x4c\xcc\xb8\x92\x02\x82\xf7\x33\xaa\x38\x1d\x65\x8c\x28\x06\x55\x93\xd6\x16\xfd\xb7\x83\x1f\x8f\x2e\x21\x58\x79\xe8\xca\x3d\xdd\x2c\x4b\x0d\xe9\x61\x0b\x33\x89\x86\xbb\x77\xf9\xfc\x3c\x2c\x0d\x41\xe6\xfa\x79\xd9\xe7\xe4\xa5\x29\x11\xf9\xf7\x53\x92\x95\x9a\xcf\x36\x25\x49\x5c\x19\xda\x09\x6f\xb4\xce\x0b\x25\x71\x15\xa1\x96\xaa\xdb\xc0\xb5\x0e\x47\xcb\x3d\x50\x73\xfb\x3a\x80\x73\xc4\xc8\x10\xce\xf5\xe4\xea\x54\x31\xcf\xc6\x63\xb3\x2c\xa9\x10\x50\x93\xbd\x59\x27\x94\x90\x29\x7b\x78\x45\x7b\x3d\x74\xef\x86\x40\x00\xaa\xa8\xd4\x47\x27\x53\x96\x96\x19\x73\xd5\xc6\x32\x25\xd2\x9a\x0f\xb4\xc2\xeb\x10\x00\x44\x7d\x36\x0e\x75\x7f\xa2\x0f\xce\x41\xa4\xb9\xff\xbd\xf2\x55\x82\xfe\x03\xbd\x30\x22\x18\xa5\x76\xac\x1e\xa1\x5a\x97\x39\x6e\x09\xc4\x19\x1d\x73\xa3\x43\x4b\x20\xaf\x1d\xdb\x8d\xf1\xc0\xca\x8b\x16\xf4\x1d\xb2\x0c\x98\xab\x05\x8d\xf7\xcf\xa3\x71\x90\xd0\xda\xff\xe5\x18\xce\x25\x37\x40\xb4\x2d\x24\x7c\x49\xf0\x92\x8e\x39\xe0\x74\x53\x47\xef\xe1\x8a\x5f\xa2\xea\x80\x77\x40\xe9\x35\x1d\xb1\x4c\x2f\x0e\x34\xaa\x16\xc5\xe1\x17\x39\xc2\xb7\x6c\x6a\x44\xb5\xe6\x13\x01\x0d\x52\xec\x68\x0f\x6c\x85\xd2\xd8\x66\xea\xa2\x5b\x51\x43\xbe\x90\x33\xa6\xa6\x8c\x3e\xd0\x4c\x5b\x88\x66\xb9\x31\x2a\x64\x7b\xed\xea\x8e\x1c\xb7\xfb\x87\xd8\x5d\x21\x13\xc8\x7f\x45\xef\xba\xef\xa1\x41\x61\x61\xb1\x0b\xd6\x84\xcf\x98\xf0\xb8\x44\xc7\x19\x0d\xbd\x51\x50\x79\x0e\xd8\x48\xa5\x91\x21\x5e\x61\x8d\xa0\x0a\x5c\x05\xc2\x9b\xce\x55\x1a\x8f\x13\xdd\xe2\x3a\xab\x64\x1e\x4b\x78\x9d\x3b\x21\x64\x80\xc8\xe4\xbd\xea\x95\x72\x6f\x56\xd5\x00\x2b\x48\x02\x81\xad\xd0\x82\x0c\xc3\x07\xf7\x3f\xc2\x45\xa3\x2d\x07\xad\x1a\xc6\xed\x14\x7b\x88\xa3\x49\x12\x08\x9b\x59\x95\x73\x4e\x00\xfb\xfa\x6c\x5c\x7f\x12\xaf\x21\x73\x41\x7e\x24\xec\xbc\xea\x28\xb8\x90\xe9\xb0\x60\x49\x8f\x84\xa5\x8c\x1b\xcb\x38\x57\x0b\x26\xa4\x44\xf0\x52\x78\x88\x28\xc5\x74\x21\x11\x20\x2c\x7e\x6c\xdc\x8d\x8c\x9b\x5a\x9c\x1d\x71\x92\xc1\xae\xaa\xaa\x97\xff\xc5\x94\x5c\xb9\x7d\x27\xdc\x0c\xae\xff\x08\x7b\x97\x89\x29\x15\x09\x8a\xcd\x17\xd7\xac\xd0\x2f\x34\x9f\xe0\x56\xfd\xf2\xe5\xab\xff\x78\xf9\xe5\x97\xdf\xc0\xe6\xf5\x74\x19\xe4\xe9\x82\xe1\x45\xb3\x62\x4a\xfb\x08\xd7\x49\x21\x96\xf5\x43\x90\x0e\x64\xf6\x6a\xf0\xea\x1b\x0c\xb6\x73\x8d\x88\x00\x53\x29\xa4\xeb\x8a\x89\x45\x22\x2e\x8c\x8d\x8c\xe0\x89\x17\xc8\xe6\xc0\xec\x1f\x18\x42\xdc\xa8\xe0\x78\x32\xcd\xcd\x1a\xa6\xb8\xb5\x4d\x6b\x6b\x95\xca\xd6\x61\xfa\x5a\xa1\x98\xd5\x49\xb8\x14\x4d\x82\xc3\x75\xa3\x6c\x61\x28\xef\x71\x77\x7f\x59\x39\xec\x9f\x26\x26\x56\x34\x6b\x14\xd7\x99\xbc\x81\x84\x0e\x2e\x15\x37\xf3\x01\x60\x67\xc8\x31\x39\x67\x33\xa6\x7a\x7e\xd4\xb7\xf6\xa6\x8b\x70\x4f\xac\xf5\xaf\xba\x23\xc2\xec\x5f\x76\x91\xf4\x1d\xb8\xe5\x24\xce\x1d\x38\x97\xe2\x22\xcc\x2e\x0c\xe3\x76\x5e\xdf\xde\xfa\x59\x34\x2a\x4f\x86\x16\xeb\x80\xd8\x8c\xee\x05\x5c\x53\xc6\x1f\xa9\xe2\xb2\xd4\x04\x1d\xd9\x80\x9d\x23\x05\x1c\xa9\x18\xfc\x0e\x24\x02\x7d\xca\xb9\xa6\xc2\x20\x21\x5f\xd5\x7b\xa7\x02\x7d\x8e\xc2\x71\x73\xbc\xfa\x44\xe3\xc6\x2e\xfa\xcc\x3f\x4a\xf9\x24\x1d\x84\xb2\x8b\x9e\x8c\x67\xd9\xca\xe3\xcb\x1f\xc8\x3a\x9e\x28\x0c\xe3\xe7\x01\x47\x83\xd5\xd2\x71\x94\x29\x9f\xf8\x54\x30\x78\x7f\x54\xb8\xa3\x4f\x03\xb3\x35\x58\xd2\x26\x3b\xbe\x69\x46\x62\xb1\xf8\x7e\x2d\xd8\xa2\x8e\xb2\x14\x03\x35\xc1\xca\xee\xeb\x68\x0b\xee\x21\x9f\xc0\x19\xd8\x4f\x14\x37\x3c\xa1\xd9\x1e\x1c\x61\xfe\x2b\x6b\x30\x1b\xa6\xe2\x6f\x15\x23\xe6\x46\xe2\x53\x68\x46\xae\xd9\xfc\x46\xaa\xd4\xab\x17\xfe\x89\xd5\x5a\x68\xe3\x1f\xc9\x99\x93\x05\x88\x91\xa3\x72\xa6\xc8\x88\x79\xdb\x7f\xe1\xe6\xf9\x80\x1c\x89\xb9\x73\x9c\x8a\x38\xf5\xd9\x6b\x11\xa3\x39\xaa\x38\xa8\x04\xd6\x98\xc4\x9d\x87\xfe\x69\x14\x93\xd2\x6f\xb3\x8b\xad\xfe\x18\x76\x81\x57\x5e\xbc\x61\x2c\x15\x41\x18\x14\xd8\x1d\x8a\xa1\x8d\xe7\xbf\xfe\x2c\xd2\xc2\xaa\x67\x5c\x30\xad\xbf\xb7\x4b\xd9\x46\xdb\xae\x73\x07\x05\xad\xca\x8d\x0d\x72\xb2\x4a\x86\x62\x76\x4b\x51\xdf\x5f\xd6\x52\x28\xdc\x39\x20\x47\xf0\x01\x64\xf3\x59\xc5\x11\x70\xad\xec\x60\xd6\x4c\x5d\xe8\xbc\x84\x77\x1c\x9d\x9f\xf8\xac\x2b\x54\x3a\x74\x1d\x44\x0d\x35\xfe\xfa\x4c\x40\x51\x75\xb9\x3f\xec\x97\x92\x42\x23\x8d\xbd\x2b\x55\xb2\xbd\x66\x9a\x1e\x33\x37\x52\x5d\xbf\x78\xf9\xf2\xe5\x1f\x40\xd1\x83\xa9\xfd\xef\x2f\xbf\xfb\xdf\x5f\x7e\x37\xc8\xd3\x26\x5a\xd7\xc3\xa3\x7b\x8d\xe2\x7a\x8b\x21\xcd\xcb\x98\x1f\x3c\xc1\xbd\xd9\xe4\xdc\x6d\x50\x71\x00\xcb\x14\x68\xde\xc8\x28\x6c\x14\xc5\x6b\x1e\xbf\xeb\x57\xd3\xbd\x7a\x38\x4e\x73\x9b\xd0\x5b\xed\xb9\x5d\xf8\xe7\xaa\xd1\x70\x55\xb0\x0d\x64\xf5\x9c\x28\xd2\x8e\xf0\xc7\xee\x63\x48\xe4\x01\xc1\x05\xfe\x0c\x10\x8f\xf3\xa2\x45\xd2\x52\x03\x79\x03\x39\xba\xad\x55\xc5\xfd\x4b\x1c\x88\x14\x95\x6e\xb8\x94\x7b\x19\x7c\xd3\xa0\x77\x38\xad\xf0\x08\x12\xd9\x7b\xe4\xbd\x78\x83\x99\x7d\x3d\x54\x14\x6b\x05\x96\x78\x53\xa7\x05\x0e\x2f\x7e\xe7\xde\xbd\x8f\x53\x6e\x22\x14\x1e\x4e\xee\xc8\xf0\x6d\x79\xfa\xef\x5f\x2e\x8c\x55\x63\xbd\x9a\x61\xef\x4e\x48\x5e\xe1\x3b\x3b\xf1\x49\x26\x4a\x96\x85\xf7\x01\xd7\xc1\x9a\x2b\x4c\x4f\x74\x5d\x62\x27\x11\x21\xeb\x43\x07\xdf\x0d\x30\x30\xab\x30\x52\x53\x92\xa0\x75\xef\x4f\x5d\xcc\xdf\x46\x07\x88\x2a\x45\xbd\x11\x52\xe4\x45\xdd\xcb\xd8\x84\x26\xf3\xbd\xfa\x73\x56\xf9\xac\xb9\xf6\xbd\xcb\x79\xc2\x0d\x3e\xaf\xca\xc6\x84\xa4\x4d\xd0\x1f\x70\xaf\x81\x6a\x10\xba\xd5\xf9\x23\xdf\x97\x13\x4c\xa9\x48\xc1\xcb\xd3\xd8\xb1\xe0\x46\xea\xc3\x34\x82\x43\x01\x5c\x9f\x10\xc5\xf5\xfd\xeb\x56\x7a\x13\xbe\x6e\xe4\x09\x78\x30\xfb\x05\x0f\x75\xa7\x9a\x67\x6d\x85\xad\x3a\xc5\x75\x01\xdc\x80\xee\x90\x70\xf8\x87\xa7\xdf\xa5\x9c\xad\x1e\x24\x34\xc8\x0d\x43\x7c\x16\x72\xb5\xe9\xfc\xbd\xba\xe7\xb7\x87\x8e\x9d\xca\x2c\x85\x6d\xe5\x7c\x4c\xfe\x51\x84\x1a\xa3\xf8\xa8\x04\x28\x7f\x91\x02\xf4\x60\xbd\x36\xc4\x41\x86\x0f\x48\x55\x1c\x10\xdb\xce\xc0\xf7\x03\x42\x86\xcc\xf5\x7b\x8c\xe6\x01\x52\xd9\x93\x12\xec\x28\xe0\x45\xe8\x2c\x84\x26\xdb\x67\xf2\x47\x35\x3f\xbc\xc7\x4d\x5b\x0a\xd6\x61\xf6\x8f\x82\x4d\xa3\xcb\xc2\x55\x21\xd3\x0c\xc5\xe1\x52\x03\x92\x85\x73\x0c\xd2\xa6\x40\x20\x0e\x65\x1e\xe2\xac\x96\x16\x1a\x41\xb3\x80\x97\x7d\xb3\x39\x23\xa1\x26\x69\xe2\x1c\xb1\x37\x76\x88\x29\x2f\xd0\x02\xa7\x26\xfc\x1c\x82\x15\xf6\xeb\xe0\xbf\x28\x64\x0a\xf0\xfd\xaf\xd0\x04\x96\x37\xe0\x02\xff\xfe\xec\x24\xec\x11\x7b\xd7\x9b\x21\x10\x84\x7c\x39\x70\xbd\x44\xcc\x84\xa7\x64\x84\x01\x2a\x2b\x5d\x0f\x04\xbb\xc1\x94\x37\xe7\x25\x0e\x5a\xf8\xcc\xa7\x82\xe1\x68\xe1\xe1\x6e\xc8\x43\xf2\x95\x6b\x0b\xc1\x94\xb7\xe1\x47\xdc\xa5\xc4\xbc\xbf\xdc\xf7\xbe\xf9\x9b\xbe\xba\xe9\xf7\xfb\x7d\x3b\x57\x2f\xd3\x57\x34\xdc\xb3\xfb\x3d\x97\x29\x1f\xcf\x17\x28\x61\xd9\xbc\x7a\x04\x70\x24\x15\x73\x37\xbb\x06\x7d\x00\xda\xb9\xf1\xda\x34\x20\x73\xcc\x79\x0c\xeb\xdd\xb4\x34\xa3\x2e\x37\x56\x0c\xe9\x8c\x62\x4d\x46\x6c\x4a\x67\x5c\x42\x31\x29\xf0\x18\x24\xf9\xdd\x42\x57\xef\xf2\x71\x8b\xee\xb0\x47\xd0\x24\x67\x9f\x0a\x89\xc8\x66\x90\x44\x7b\x21\xd3\xe5\x50\x0a\x78\xb9\xed\xa6\x80\x5c\x80\x1a\xd3\x3b\xed\x01\xab\xfb\x3d\x11\xc8\x88\xda\x21\xc3\x74\x0e\x16\x96\xf9\x70\x40\xce\x1c\x67\x80\xf5\x27\x24\x61\xe3\xb1\x55\x53\xa4\x20\xac\x98\xb2\x9c\x29\x9a\xd5\x1f\xe4\x8a\x89\x5e\x5b\x69\xa9\x2c\x93\x61\xb8\x22\xa7\x05\x0a\x4b\x90\x7d\x29\x57\xbe\x11\x86\x13\x71\x96\x5f\xf7\xde\x43\x3b\xca\x77\x5c\x83\xa2\xe2\x3c\x1f\xa8\x56\xee\xad\x3a\x8f\xfc\x77\x21\x33\xeb\xe1\xd5\x3e\x2d\xfc\xc1\x6d\x9a\xa7\x6e\xa8\x6d\xea\xa6\x1b\xcf\xb9\xd8\x2f\x35\x6d\x52\x5a\x37\x27\x3b\xda\x35\x4d\xdd\xb5\x4b\x5d\xa7\x5d\xea\xa6\x59\xb4\x29\x3f\x36\x4b\xd4\x6b\xd1\x1f\x75\x2b\x3b\xa3\x6e\x7a\xf5\x9e\xb8\x80\x69\xdb\x17\xf5\xe1\x1d\x51\xd7\xe9\x64\xf4\xe8\x2d\x51\x9f\x11\xd7\x34\xac\xb2\x68\x57\xa4\xd0\xa2\x21\xea\x46\x5b\xa1\xb6\x4c\xd6\x6d\xde\xfe\x74\xa3\x8d\x4f\x5b\xbe\x75\xf3\x5e\x76\x1b\x6d\x73\xda\xf2\xad\x9b\xb7\x36\xdd\x68\x53\xd3\x16\x6f\xdd\xb6\x91\xe9\x83\x5a\x98\xb2\x05\xe7\x49\x70\x28\x7f\x5e\x31\xd8\xa6\xd0\xac\x61\x27\xd1\x96\x92\xb7\x93\xee\xa1\xbb\xbe\xa1\x5d\xf6\x0d\xdd\x0e\xf9\xba\xeb\x12\xda\xae\x4b\x68\x1b\xc9\x19\xb9\x8b\xc1\x3f\xd3\x56\x93\x3e\x0a\x68\x0e\xe0\x7c\xae\xb5\x02\xad\x10\x9f\x9c\x51\xe5\xba\x0c\x2d\x28\xbe\x3d\x58\x1d\x97\xe2\xb9\x74\xb8\x60\x1a\x50\x4e\xd5\x9c\x7c\x7f\x76\x82\xfa\x6f\x4d\x0d\x17\xd2\x3f\x3a\x70\x4a\xea\x40\x7d\xa8\x98\xb7\x57\x5b\x9b\xd5\x45\x37\xae\x8a\x6e\x8b\x37\xd7\xca\xc6\x9a\xeb\xc4\x64\x6d\x59\x62\x88\xa3\x40\x8c\x88\xd0\xc0\x1f\x82\xe6\x4c\x17\x34\xb1\xd2\xcf\xdd\x01\x71\xda\xa8\xe6\x61\x60\x2d\x17\x17\x03\x2d\x45\x85\xb7\xea\xef\x3f\x58\x3c\x90\xfd\x96\x3c\x74\x05\x40\xde\x2b\x93\xd1\x52\x24\xd3\x27\xb2\xe2\x2b\x88\x17\x7c\xe4\x94\x5c\x33\x25\x58\x56\xf5\xf0\xf3\x75\x21\xac\x49\xbd\x7a\xcb\x72\xf7\x76\xc5\xee\x2d\x0a\xd5\x9b\xb7\xe4\x68\x5b\xe2\xde\xa6\x70\x78\x45\x9f\x82\x31\x9e\x4d\x76\x4a\x73\xd7\xbe\xa6\xe1\xe0\xad\xab\x39\x5b\x35\xd9\xa8\x23\x37\x80\x5b\x61\x3b\xde\xad\x6d\xeb\xeb\xc7\x6f\x7a\xbd\x0c\x5d\xb1\xaf\x97\xdc\x30\x4f\xab\xfb\xf5\x06\xfd\x3b\x5d\xf5\xba\xde\x75\xb9\x26\xed\x85\x4a\x97\x9d\xad\xb7\xa5\xa7\x75\x5b\x47\x5c\xfb\x3e\xd6\xbb\x0e\xd6\x8f\xdc\xc1\xba\x71\x7a\x95\x9a\xf1\x84\x1d\x25\x89\x2c\x45\xab\xec\xaa\x13\x66\x5f\x81\x1a\x96\x0e\x6b\x63\xa2\x3b\x2e\x85\x6f\xb1\x9c\x94\x66\x9c\x62\x99\x70\xfd\x4e\x2c\x35\xa9\xc6\x01\x77\xde\xc2\x0c\x1d\xcb\x60\x77\xc0\xcf\x93\xaf\xb7\xf4\xfc\x76\x39\x68\xcb\x6f\xb3\x2c\x00\x16\x28\xe8\x3c\x79\x4b\xc9\xa0\xeb\x65\xe2\x1a\xaa\xaf\xab\xe2\x69\x06\xb9\xf8\x61\x33\x45\x9f\xbb\x17\xed\x53\x7c\x6a\xa3\x82\xea\x06\xd4\x35\x7f\x91\xda\xd8\x97\x3f\xd2\x6f\xfe\xf3\xe4\xbc\x5d\x46\x64\xc0\x8d\xc6\x2c\xef\xa9\x1b\x3a\xa8\x22\x71\x6d\x6d\x5c\xa4\x63\x9f\xdc\x23\x8a\x3a\x48\x4c\x8a\x42\x28\x63\x14\x4d\x3e\x72\x10\xe5\xab\x1e\x0e\xc8\x99\x20\x55\x24\x0c\xf5\xa5\x1e\xae\x4b\xce\xa8\xd0\x51\x21\x16\x83\xa1\x7d\xb6\x57\x98\x0f\x26\xf5\xb8\xd5\x76\xd6\xd1\x81\x77\xe9\xd4\xef\xc0\x4e\xc5\xa4\x34\xda\x7e\x8e\x0f\xf7\x02\x73\x8d\xc7\x2b\x36\xe1\xda\x28\x57\xb3\x66\x07\xac\x26\xe1\x8c\xd6\x70\xcb\x35\x9b\x93\xbf\xfc\x70\xfa\xd7\xbf\xbf\x7d\x7f\x7c\xf4\xf6\xef\xef\x8e\x8e\xff\x72\x76\x7e\xfa\xf1\xe3\xf0\xaf\xc3\xab\xd3\x77\x1f\x3f\x1e\x97\x4a\x31\x61\x5c\x51\xda\x90\x99\x8f\x1f\x1d\xa7\xea\x8f\x1f\xaf\x92\x82\x17\x1f\x3f\x5e\x54\x7d\xda\x8d\x84\x97\x07\xf9\x89\xb5\x11\x21\x23\x01\xd2\x8d\x90\xe8\x30\xef\x29\xd5\x55\xf6\x51\x2d\xeb\xbc\x01\xca\x4e\xd3\x80\xbd\x9e\x52\xc5\x2e\xf0\x70\x39\xf7\x86\x7e\xab\xcd\x6e\x07\xac\xa0\xce\xbd\x03\x29\x38\x11\xc8\x88\x99\x1b\xe6\x8a\x79\x16\x8f\xb9\x38\xc9\x11\xca\x03\x3d\x4a\xbd\x3d\x8a\x56\xc0\x29\x63\x8d\xb3\x24\x33\xce\x6e\xb0\x70\x9c\x4f\x04\xcd\x22\x4c\x6f\x28\xee\xc3\x02\xaf\xc5\x68\x00\x23\xda\x72\x44\x21\xd3\x80\x5f\xbe\xe0\xf5\x5a\xf2\x78\xd5\x92\xc9\x11\x8c\x81\xa5\xe4\xe2\xec\x84\xbc\x1a\x40\x63\x12\xfb\x4f\xc0\x86\x59\x45\xd6\xd0\x36\xdf\x1e\xa8\x78\xfa\xae\xc8\xa6\xad\x18\xa0\x89\x30\x6a\xc0\x01\xe5\x28\x95\x39\x7d\x68\xa7\x82\x7b\xf2\xb2\xc7\x65\x96\xcd\xc9\x2f\x25\xcd\x50\x07\xb8\x90\xe9\xb2\x64\xda\xfb\xd6\x7f\xf4\xa7\xc1\xb7\x61\x1e\x7f\x1a\x7c\x6b\xf7\x4d\xe0\x98\x3f\x0d\xf4\x2c\x19\x7c\xeb\xca\x04\x89\xbb\x69\x65\xf2\xdc\x52\xce\x3f\xec\x39\xea\x7e\x03\xcf\xa6\xc6\x72\xde\x67\x49\xe3\x8e\xb0\x9d\xbf\x57\x34\x61\x17\xcd\xfb\x86\xd5\xa8\xed\x59\x86\xa4\x0e\x17\x84\x54\x4d\xc3\x02\x09\x04\x63\x29\x2a\x89\x6e\x16\x8c\x4c\xec\x24\x60\x61\x50\x0b\x84\x0a\xc4\x44\x31\xea\xba\xcb\xa6\x2c\x63\x26\x6a\xc7\x8b\xee\x01\x1f\x5c\x11\x52\xf4\x05\x9b\x60\x88\xc4\xb9\x39\x31\x0c\x83\x52\x16\x2b\x18\x43\x6c\xc0\x0d\xc6\xf3\x9c\xa5\x56\x05\xca\xe6\x15\x1a\x7f\x68\x1d\x22\x78\xd6\xab\x95\x45\xc0\x14\x5d\x83\xb5\x9a\x2d\x1d\xf4\x1f\x78\x62\xed\x36\xa7\x4b\xac\x22\x46\xd5\x09\xaf\x92\x08\x1e\xd3\xa3\x2a\x09\x82\x44\x4d\x8d\xfd\xa0\x62\x3c\x6e\x27\x4c\xbc\x6c\xc0\x2c\x11\x94\x4a\xf1\x80\xf6\xd7\x63\xa9\x12\x3e\xca\xe6\x64\x4a\xb3\x0a\x9b\x9b\x5c\xdb\x37\xc0\x61\x06\x64\xc8\x4c\xfc\xfa\x99\x14\x93\xf8\xe0\x65\x9f\x0a\xc4\xbc\x48\xec\x06\x2e\x0b\x7c\x9e\x3d\xaf\xe6\xb2\xbc\xc5\x00\xf8\xaa\xea\xff\xf6\xf9\xeb\x8f\x1f\xe4\xa5\x36\x32\x63\xb8\x3e\x6d\x38\x7f\x65\xfd\xc7\xbe\x8e\x47\x6f\x42\x88\x4d\xd4\x58\x5e\x79\xb4\x20\xcb\x11\x57\x61\xfe\x60\x39\x60\x7f\x0d\x0c\xc5\xe0\x37\x50\x95\x31\x27\xf6\x14\x32\x18\xd3\x8f\xeb\x9e\x8c\x82\x4e\x20\xdf\x5e\xb3\x79\x0f\xcb\xd4\x51\xa9\xf8\x53\x04\x7b\x16\x0a\xfd\x64\x61\x07\x94\x8a\x7c\xeb\xff\xf5\xa7\x87\x5a\x5f\x2d\xdc\x46\x6d\x9c\x46\xf8\x52\xad\x3d\xf5\xa7\x98\xee\x5d\xaf\x5b\x47\xca\xba\x4c\x70\x23\x91\x5c\x03\x72\x0a\xd5\x5c\xa8\x61\x3a\xe8\xa7\x2c\xab\xdd\xac\x7d\x1b\x97\x5a\xcd\xb3\xbc\x61\xb5\x34\xf0\x73\x39\x74\x15\x44\x80\x43\x31\x66\xaa\xfa\x04\x04\xcc\xb9\x3c\xfd\xc4\x92\xf2\xa1\xd8\x10\x78\xb5\x72\x75\x5c\xb3\xf6\xc0\xfa\x3f\xb0\x80\xd1\x81\xb4\xb1\x5a\x75\x48\x02\xae\x76\x67\x94\x89\x72\x37\x6d\xaf\xd9\x5c\x07\xe4\xa3\x6b\x1c\xdd\xd5\xea\x05\xfe\xf5\x07\xd3\xe9\x27\xae\x8d\xfe\x3f\x1e\xd5\x3f\x1f\x55\xfd\x14\x28\xa6\x84\x54\xa3\xfb\x25\x11\x00\xf7\x8f\x8f\xf9\xdc\x04\xf7\x2f\xd0\x9a\xea\xef\x3d\x25\x22\x5c\x2b\x6a\xdf\x69\x5f\xbb\x64\x06\x29\xa0\x22\x23\x06\x48\xaa\xc2\xf0\xf8\x63\xe4\x4f\xa4\x21\xd0\xe5\xd4\x2a\x6d\xf5\x63\xc6\x7d\xe4\x6e\xe2\x50\x2b\xcf\x67\x34\x63\x68\xa7\xdf\xf0\x2c\x4d\xa8\xc2\x88\xa0\x83\xc9\xd0\x0e\x6d\xce\xd5\x87\xdb\x33\xce\x49\xb2\x6a\x95\xb5\x0b\x3d\x50\x65\x78\x52\x66\x54\x11\xbb\x1f\x27\x52\x3d\x10\x4d\x03\xaf\x76\xdd\x25\x02\x8b\xb6\x68\xba\x56\x97\xef\x8b\x23\x2e\xa2\x8f\x39\xed\xc5\x9a\x40\x90\xca\x5e\xdf\x28\x07\x75\xb4\x3a\x39\xf6\xb2\x29\x08\x8a\x18\xbf\xca\xd4\x90\x69\xf8\x04\x30\xa1\x0e\xa3\xc3\x23\xec\xcc\x01\xf9\x2e\x54\x35\xf6\x02\x9c\xa0\x43\x08\x76\xcf\x74\xdb\xc6\x2d\x57\xb5\xa9\xc7\x52\x41\xab\x90\x83\x54\xc2\x6f\xd8\x8c\x27\xe6\x70\x40\xfe\x5f\xab\xf9\x59\xd6\x09\xea\xa1\xdb\x66\xa1\x5e\xac\x42\xd1\x7a\x49\x0e\xe0\x67\xb1\x62\x78\xe8\xfd\xe2\x0e\x1c\xfd\x89\x05\xdf\x5b\x44\xe4\x56\x44\xe3\x6a\x62\x14\x35\xc5\x05\xd6\x08\x27\xbf\x0c\x12\x32\xc8\x44\xae\xdd\x2e\xad\x79\x62\x43\xfa\x8a\x17\xa1\x81\x71\xfe\x69\xf9\x8b\x12\xc5\x26\xb0\xff\x70\xf7\x7c\xc6\xdd\x67\x64\x21\x33\x39\x99\x0f\x0b\xc5\x68\x7a\x2c\x85\x36\x0a\x44\x43\x1b\xd4\xa2\xdb\xc6\x8c\xd0\xe9\xa7\xf2\x86\x50\x57\x76\x29\xc7\x08\x21\x25\xcb\xc9\x14\xf1\x38\xe1\x87\xbe\x93\x93\x9f\xa2\x33\x22\xf5\x80\x0c\x03\xde\x26\x30\x78\x80\xef\x84\x51\xc0\x81\x71\x43\xe7\x6e\x33\xd1\x11\x4f\x99\x8e\x12\x12\xfd\x64\x06\xe4\xc8\xca\xc1\x5b\xe7\x6a\xa5\xf2\xd1\xf9\xc9\x43\x41\x4e\x37\xa8\xd0\xde\xf2\x2a\x51\xeb\x5e\xe8\xf2\x14\xe8\x1b\x34\x52\xa0\x1b\xcd\xa5\xd3\x54\x11\x60\xd1\x53\xe6\x33\xea\xa6\x6d\x20\x45\x72\xfa\x69\x78\xcd\x6e\x1a\xfc\xd2\xbf\xe8\x0f\xec\xe1\xa9\x2b\x7d\xb0\x47\x3f\x08\x4d\x0d\xd7\x63\x40\x43\xfe\x8c\xfa\x38\x64\x18\x37\x03\x6d\xc5\xab\x9e\xa8\x1f\x8f\xe6\xab\x1f\x03\x8a\x58\x8d\x59\x5c\xba\x51\x65\x07\xe1\x01\x88\x19\xcf\x01\xef\xd5\xee\xa0\xc4\x61\xa0\x1b\x59\xc1\xec\x63\xe4\x21\xb4\x43\xf5\xbb\xd6\x4c\x19\x57\x0b\x78\x91\x0b\x7b\xbf\xb9\x60\x6c\x9c\xb9\xd3\x36\x0d\x06\xc8\x73\xfa\xc9\x6a\x1e\xba\x59\x62\x05\x5e\xf5\x16\x06\x0b\x83\x62\xb8\xcb\xe7\x8b\x2d\x2c\x43\x0d\x4a\x18\xcc\xde\xf8\x93\xa6\x72\xae\xba\xda\x35\x41\x21\xed\x1a\xa1\x90\x15\x69\x95\xb7\xbe\xfe\x02\x1e\x71\x5c\x9c\xe3\x9c\x42\xba\x87\x0a\x3c\x3a\xa4\xa9\xa8\x0e\x76\xd7\x9b\x32\x0b\xda\x9c\x35\x8a\xec\x4d\xf8\xbb\xb6\x68\xe3\xad\x9a\x95\x77\xd1\xae\xdc\xca\xb2\xeb\x06\x12\x30\xfe\xbd\x27\x56\xe3\x41\xba\x68\x7b\xde\xd8\xa0\xae\xae\x1a\x43\x5d\x57\xa6\x35\x72\x56\xcd\xb4\xae\x84\x5d\x65\x58\xb7\x7a\x76\x47\x6d\xb1\xdb\xd8\xb8\xd5\x55\x23\x84\x7c\x80\xb5\x4b\x21\x60\x24\xc7\x7e\x77\xac\xb4\x79\xcf\x44\x8f\x9c\x4b\x63\xff\x13\x99\xbf\x27\x92\xe9\x73\x69\xe0\x93\xad\x20\x25\xbe\x42\x87\x84\x74\xc6\x19\xa2\x18\x81\xdc\x74\x21\x57\x7b\xe2\x79\x82\xad\x30\x2c\xce\x04\x91\xca\x53\x2c\x58\x17\xda\x0d\x11\x87\x09\x1c\x16\xcc\xad\xc6\x89\x1d\x27\xa6\xf3\x1d\xc3\xb9\xa1\x00\x15\x02\xbf\x01\x48\xc0\x22\x83\x7c\xe4\xb4\x54\x88\xcc\x68\x75\x4d\xc3\x26\x3c\x21\x39\x53\x13\xe8\xcd\xd6\x24\x8d\x38\xbe\xda\x9f\x2b\x78\xb5\x3c\x5d\xe2\xc9\xb4\xe0\x25\x38\xb2\x41\xc5\xea\x50\x05\xc0\xf1\xf0\x58\xcb\x29\x58\x52\xff\x1d\x7c\xd0\xff\x43\x0a\xca\x15\x20\x39\xba\x58\x70\xfc\x9d\x8b\xbe\xc4\xc3\xd8\x11\x96\x7c\x4b\x54\x10\x86\x75\x0f\x76\xf4\x45\xc5\xa3\x47\x6e\xa6\x52\xe3\x61\x18\xdc\x1f\x7b\xd7\x6c\xbe\xd7\x5b\x62\xbd\xbd\x33\xb1\x57\x05\x7a\x6b\xcc\x16\x0e\x61\x28\xdf\xd9\x83\xef\xf6\x1e\x4f\x57\x69\x75\xd8\x76\x01\xa9\xbd\x38\xa1\x86\x7c\xe5\x6c\x9e\xf6\xed\xa6\xdf\xe1\x40\x91\x7d\x8e\x31\xc1\x89\x62\x51\xab\x69\x50\xd4\x73\x8c\x5b\x96\x82\xcd\x98\x5d\xac\x94\x6b\x87\x5b\xe5\x53\x06\xfe\xb1\x64\x12\xfd\xff\x4f\xe4\xb9\x34\xde\x6a\xff\x87\x77\x7b\x21\xff\x7d\xe2\x79\x99\x23\x40\x8c\xb1\x96\x42\xca\xc7\x1e\xde\xd2\x67\x2a\xd4\xed\x85\xba\xd9\xea\xf8\xd8\x50\x35\x01\xd0\x25\x67\x2f\x78\x36\x9b\x64\x72\x44\x33\x92\x73\x61\x1f\x33\x20\x6f\xa4\x22\xec\x13\xcd\x8b\x8c\x61\xf5\x0c\xf9\xaa\xff\x2f\x29\x18\x71\xd1\xed\x1e\xf1\xb4\xa8\x1a\xb7\xbf\x42\xae\xad\x60\xae\x43\xea\x42\xcd\x00\x0b\x6e\x0b\x4d\x5e\xbd\x78\xf5\xe2\xe5\x6b\xf2\x2b\xb1\x43\xbf\x72\xff\xfd\xd2\xfd\xf7\x2b\xf2\x2b\xf9\x95\x10\x72\x41\x48\xed\xbf\x04\xfe\xdb\x27\x7c\x1c\xcf\xe1\x95\x9d\x66\x22\x73\xf7\xc2\xe0\xc9\x0d\x45\x6e\xa1\xc5\x85\x91\x6e\x68\xa8\x71\x48\x64\xce\x60\x0e\xaf\xfe\x8f\xbf\x07\x02\xae\x06\xbb\x90\xc0\xa4\x0e\x60\x4a\x87\xe4\x06\x5c\x53\x39\xbd\x46\xb3\xec\x28\x31\x25\xcd\xec\xc3\x0f\xbe\xec\xbf\x3c\x24\x52\xd4\x6f\x9f\x71\x09\xdd\x9b\xdd\x0c\x0f\x5e\x1d\x0e\x96\xa6\xfc\xe5\x8a\x29\x2f\x34\xe4\x70\x25\x46\x76\xd0\xdb\xb9\xc6\x33\xcc\x91\x98\xdf\xd0\x79\x60\x1b\x6f\x96\x4e\xf8\x2c\x20\x41\x47\x65\xf7\x10\xb3\x03\x2e\xe0\x1e\x08\x05\x07\x9d\x13\x6e\x06\xe4\xcc\xec\xef\xfb\xf6\x2f\x56\x63\xf6\x90\xd5\x27\x31\x3a\x1a\x10\x1e\x16\xfd\xa5\xf7\xcf\xba\x98\x52\x8b\xde\xdf\x9d\x38\x47\x1f\x84\x39\xed\x9e\x5e\xf9\x37\x3a\x70\xaa\x87\xb1\xfc\x0e\xb6\xa2\x5f\x8e\xb1\x2c\x10\x9b\xb1\x0c\xa0\xd3\x8e\xa3\xbd\x4b\x00\x41\xd5\xd9\xed\x1e\xae\x83\xf5\xc4\x21\xdd\x38\xa1\x59\x1c\xac\x4b\x24\xe0\x51\xa9\xd0\x60\x3e\x4e\x17\x0a\x7e\x29\xf2\x53\x75\x27\xa6\x09\x41\xfc\x15\x07\xfa\x13\xc2\xdc\xec\x8d\xca\xe4\x9a\x19\x7f\xee\x28\x28\xaf\x28\x4a\x43\x46\x34\xa3\xc2\x6a\x30\x4b\x7e\x08\x23\x71\x30\xfc\x25\x30\xcc\x0a\x7e\xf9\xdc\xf1\x91\xa5\xdd\xd1\x5e\xe8\xff\xb4\x38\x64\x14\x91\x75\x8e\xc2\x94\xd1\xcc\xa7\x52\x00\x1a\x74\xc0\xe7\x11\xfb\xfb\xd5\xbe\x82\xb5\x41\xe1\x57\x39\x58\xad\x5c\xa8\xc9\x7d\x72\xe0\x73\x19\x89\x61\x59\x86\xdc\x53\xb5\x4e\xb2\x9b\x2c\xee\xc5\xc4\x61\x84\xba\x0c\x58\xf9\xc3\x7a\x03\x27\x0c\xea\x5b\xc9\x2e\xe6\xa1\x38\xb8\x47\x08\x74\x2f\x9b\xf0\x99\x15\x4a\x6b\x09\x0d\x14\x8c\x53\x96\x15\x44\xb1\xb4\x4c\x70\x70\x42\xf4\x35\xbb\xb1\x3a\x55\xf5\xa6\xae\x7f\x8a\x67\xd9\xbd\x1a\x51\xf7\x10\x11\x57\xd4\x45\x22\x1f\x03\x43\xfa\xa6\x80\x6c\xc6\xd4\x9c\x14\x52\x6b\x6e\xd7\x01\xf6\x12\x64\xb7\x81\xde\x15\x80\x44\x20\xb3\x0a\xa6\xe5\xc5\xf0\x9e\x13\xbb\x7b\x56\x50\x6b\x59\xdb\x1e\x9f\xe7\xa8\xfb\xca\x1e\x33\x77\x1f\x75\x17\xf0\xbf\xe5\x23\xef\x6c\x4c\x56\xf0\x60\x98\x4b\x8d\x79\x1e\x72\x0a\x7e\x09\x87\xd5\x57\x87\xd1\x61\xf8\xd5\x8b\x2f\x5f\xbc\x3a\xb0\x73\xfd\xf2\xd0\xce\xba\x76\xcc\xbd\x0a\xc7\x5c\xf8\xa5\x9b\x11\xd3\xb5\x83\xce\x1a\x60\xd8\xe3\x53\xaa\xd4\x45\x78\x7c\x56\x9c\x9d\x91\x36\x2e\xde\xc6\x73\x2f\x5f\x7a\xc0\x77\x15\xb3\xde\x48\xd8\x39\x70\xde\x72\x43\xbe\xc8\xa5\x62\x5f\x44\xf7\xdf\x7a\x40\x35\x3f\x77\x1a\x48\x9c\x5a\x57\x92\x8c\x6b\xd3\xcf\x69\xd1\xbf\x66\xf3\x07\x6b\xba\x6d\xdc\xeb\x6d\x9d\xeb\xcb\x6f\x81\x04\xc9\x69\xf1\x80\x71\x5c\x6b\xe9\x36\x29\xb9\x6f\x9d\x63\x36\x74\xa9\x06\xc7\x23\x6a\x45\xae\xf5\x22\x34\x3a\xa8\xf2\x63\x47\x2c\x93\x08\xeb\xe8\x52\x07\x1e\x90\x7a\x1f\x40\xb0\xb5\x91\x8a\x4e\xd8\x0b\xf7\xd8\xa7\x02\x7e\xef\x1a\x55\xd7\xbc\x4c\x58\xbd\xe5\x30\x21\x7d\x8a\xb2\x8f\x3f\x80\x14\xa0\x09\x64\x03\x02\x21\x6b\xd5\xeb\x51\x9e\xe1\x13\x09\x65\x35\x28\xf6\x6d\xe3\x38\xa5\x37\xfa\x34\xa3\xda\xf0\xe4\xbb\x4c\x26\xd7\x43\x23\x55\x07\xda\xc5\xd1\x4f\xc3\xa5\x51\x6b\x6b\x2a\xc8\xd1\x4f\x43\x72\xc2\xf5\x75\x85\x25\x8e\x20\x82\xf5\x04\x3c\x1a\x70\x40\x5c\x6d\x05\xc9\xa9\xb5\xff\x98\xb7\xf1\x44\x80\x31\xed\x6e\xaf\xfc\x8e\xde\x68\x86\xd3\x1f\xd9\xe9\xdb\xaf\x59\x73\x11\xbc\xb1\xba\x71\x7c\x9d\xb3\x93\x0d\x04\xbe\xc6\xba\x69\x93\x05\xb2\xc4\x4c\x6f\x42\xe3\x7e\x44\x74\xa9\x43\xda\x02\xd7\xcc\x65\x49\x6e\x28\xfa\xac\x40\xa6\x0e\xc8\x15\x2f\x5e\x93\xd3\x08\x9e\x12\x0b\x0c\xea\x43\x59\x7d\x23\xc0\x25\xb8\x2c\x01\xe0\x32\x74\x5d\x59\x11\xec\xb2\x62\xc8\x29\x2a\x53\xfa\x35\xd9\x63\x9f\xcc\xd7\x7b\x3d\xb2\xf7\x69\xac\xed\x7f\x84\x19\x03\x98\xac\x43\xa4\xb7\x4a\x9d\x18\x33\x55\x19\x30\xf8\x83\xe5\x52\xc0\xee\x99\x94\x5c\xbd\x3f\x79\xff\x1a\x14\xf8\x54\x92\x1b\xe6\x7b\x36\x11\xa6\x94\xac\x2a\x2f\x22\x32\x40\x85\x46\x22\xf3\x42\xc9\x9c\x47\xe9\xaa\xb0\xc9\x9a\xf0\x3c\xe9\xc2\x5f\x0a\x49\x69\x6d\xba\xbe\xd7\x39\x08\xb2\x7d\xfd\x90\x0b\x38\xd8\xb7\xf1\xcf\xd9\x98\x48\x74\x4a\xd5\x73\xe4\xb9\x0e\x37\x59\x8e\x71\xa3\x60\xf3\xa1\x8a\x47\xac\xfa\xed\xbe\x7a\x91\xb2\xd9\x0b\x9d\xd2\x57\x3d\x78\x0c\x32\x80\xc3\xfa\x0e\x73\xa2\x9a\xec\xbd\xda\x1b\x90\xa1\x6f\xbd\xdc\x8b\xe7\x58\xdd\x67\xad\x01\x3f\x20\xb8\x55\x5f\xee\x91\x03\x4c\x52\x07\x9d\x22\x63\xbe\xf9\x63\x80\x14\x00\x1f\xfe\x61\x23\x15\x92\x74\xe0\xbe\x20\xad\x5d\x18\xa4\x83\xe6\xec\x0b\x55\x52\x6e\x0d\xf6\x0c\xf4\x1a\x32\x12\x2a\x08\x98\x6b\x7e\x89\xa2\xe2\xd2\x3d\xb1\x22\x24\x17\x4e\x3b\x81\xd6\xee\xd8\xa8\x1a\x06\xb8\x93\x59\xf6\xa0\x9a\x68\x6f\x6b\xce\x24\xd2\x49\x23\x78\x7f\xb4\x74\xb3\x1e\x1f\x04\xff\xa5\x64\xe4\xec\x24\x74\xa8\x63\x4a\x73\x6d\xac\xe4\x4a\x6b\x3a\x02\x47\xc5\xe1\xe0\x28\xa7\xff\x92\x82\x9c\x7e\x37\x74\x53\x39\xdc\x42\x02\x37\x14\x80\xf4\x5f\xa5\x62\x56\x35\x6a\xad\x87\x1d\xf9\x91\x16\x75\x2f\xfb\x39\x39\xa1\x86\xa2\x0a\x86\xd2\x4c\x56\x15\xa3\xb0\x13\x46\x90\xf9\xe3\xcb\x81\x1b\x6a\xd1\x64\xf3\x6a\x90\xe5\xa0\xf3\xe6\x10\x3a\xf6\xe7\x1f\x2e\xcf\x36\xa0\x44\x25\x70\x0a\x4f\xde\xc9\xb4\x23\x4d\xea\x2f\x76\x69\x8f\x71\x54\x92\xdb\x61\xc9\xb9\x14\xac\x07\xc2\x8e\x58\x69\xe7\xfe\xf9\x93\xe2\xe6\xa1\x15\x90\xd5\xd5\xfa\xf8\xf7\x2b\xd6\xc9\x5b\xdb\xc3\xff\x3c\xaa\x74\x07\x58\x06\x90\x2a\x4e\x11\x18\x65\x72\x44\x9c\x34\xd8\xe4\x1b\x7f\xb8\x3c\xeb\xec\x85\x3f\x5c\x9e\x6d\xef\xcb\x76\x68\x1c\x2c\xda\x06\x95\xfe\x56\x41\x4d\x2e\x2a\xfd\xeb\x6b\xfc\x83\xae\x74\xfd\x4d\x51\xfa\x9a\x8b\xc6\x59\x61\x75\xd1\x71\xea\xeb\x23\x5d\xa4\x06\x4a\xac\xd3\xd7\x24\x2f\x33\x03\xe5\x6f\xc0\x58\x96\xd3\xb4\x3d\xbd\x3d\x8b\x11\x07\xed\x40\xc8\x09\xc3\xf0\x42\xfa\xda\x27\x24\x84\x5f\xac\xfe\xc1\x3b\x2a\xe8\xc4\xde\x0e\xe7\x21\xc9\xf1\xcf\x88\xa3\x0f\xd0\x81\x2e\xc2\x57\x74\x46\x79\x46\x47\x3c\xe3\x06\x7a\x9d\x1f\x0e\xbc\x22\x06\xca\x1a\x14\xdb\x3f\xb0\x0b\x64\x75\xb5\x5e\x8b\x4e\x55\xd8\xb8\x3e\x08\x14\x4c\x72\x60\xc7\x7f\x71\x63\x05\xf7\xe1\xa0\xd2\x5e\x01\x7c\x09\x12\xe5\x51\xc5\xad\xa9\xb6\x1e\xb5\x61\x41\xb3\x6d\xc7\xae\x4d\xd5\x4a\x58\xe6\x37\x0d\x11\x6f\x97\xd5\x1e\x3b\xd2\x4a\xb5\x07\xbe\x70\x20\x12\xcf\x5c\xf3\xc1\x86\x39\x2d\x74\x1f\xd8\x32\x0d\x7f\xdf\x56\xfb\xd9\xed\x97\xfb\xaf\x6a\x81\x3b\xa1\x52\x0c\x0a\x84\x43\x2f\xa4\x49\xe3\x0e\x1a\x3a\x51\xed\xc1\x82\x40\xbb\xb2\xfb\xa6\x49\x11\x05\x5e\xad\xa5\x6b\xe0\xd4\x4e\x08\x81\x30\x2a\x8d\x37\x4e\xcb\xf7\x49\x58\x31\x1d\xb7\xaf\x81\x3c\x66\xc5\xf4\xcd\xb0\x1e\x4a\xb1\x9f\x91\x37\xc3\x15\x72\x0f\x73\x65\xec\x7b\x6b\x0c\xb0\xec\x6b\x92\xf1\x31\x33\xbc\x11\x11\x36\x2c\xf9\x72\x29\xb8\x91\x4a\x6f\xa2\xe6\xc3\x3d\xba\x1b\xbd\xeb\xd2\x13\x82\xbc\x73\xe3\x62\xc2\x67\x22\xb3\x8c\x25\xc6\xb5\x78\x83\x65\xf5\x0f\x5e\xe5\x08\x71\xa9\x00\xda\x77\x34\x75\x4e\x8f\x17\xc8\x6a\x2f\x2e\x4f\x8f\x4e\xde\x9d\x0e\xf2\xf4\x77\x53\x79\xd3\x37\xb2\x5f\x6a\xd6\xe7\xa6\x9d\xae\xb4\xc1\xa2\x90\x0e\x1c\xd0\x66\xda\xcd\x02\x56\x08\x43\x1f\x74\x85\x01\xe6\x03\xbf\x4a\x4a\xb3\x8c\x02\x36\x2e\xb3\x0c\xd7\xd4\x28\xc6\x7a\xb1\x3b\xf1\x81\x18\x69\xd5\xb5\x5d\xfa\xeb\xfe\xea\x36\xa6\xdd\x1f\xcd\xdb\xb2\x19\xda\x9f\xf2\x4d\x55\x63\x72\x07\xed\x87\x61\x64\x9f\xd0\x67\x19\xdf\xae\xc4\x35\x9b\x13\xc8\xee\x1f\x4b\x05\xc8\x99\x75\x2e\x64\x26\x01\x72\xbd\x80\x0e\x72\x4e\x57\xd8\x12\x52\xb7\xd1\x22\xe0\x45\x2e\xd9\xf8\x71\x08\x7d\xc9\xc6\x58\x40\x11\xb5\xf0\xb7\x44\xa7\xa5\x99\x62\x26\x24\x22\x1f\x21\x39\x57\x52\xde\x55\x64\x6c\x09\xa9\x5b\xe5\xd2\x77\x51\xef\xd5\x06\x67\x9c\x2c\xad\x57\xec\x26\x74\x8b\x64\x1e\x1c\x57\x90\x33\x6b\x5b\xb2\x1b\x68\x43\xcf\xc5\xa4\x7f\xc3\xcd\xb4\x8f\x94\xd2\x2f\x00\x57\xed\xc5\xef\xe0\x3f\x2e\x5a\x7b\x94\xa6\x2e\xb3\xac\xd4\x6c\x5c\x66\x98\xf3\xa5\x07\x84\x16\xfc\x47\xa6\x34\xa4\x30\x5e\x73\x91\xf6\x48\xc9\xd3\x3f\x37\x5d\x31\xd2\xc5\x06\x69\xde\x34\xe9\xce\x73\x51\x79\xf1\xa3\x68\x2a\x35\xa2\xea\x5a\x12\xd5\x58\x9f\xa6\x39\x17\xdb\xc2\xf9\x4d\x55\x7b\x2e\xd2\x66\x14\xac\x53\xef\x18\xc6\xa9\xeb\xf6\x38\xb6\x8f\x19\x87\x2c\x1a\xea\x7d\x19\xd8\x94\xc7\xe5\xd3\xd4\xb3\x69\xd6\x12\x28\xf9\x5c\xff\x92\xf5\xf1\x29\xfd\x22\xad\xe8\xba\x4b\x8d\x79\xc8\xf5\x98\xa9\x31\xdd\xba\xbf\x3f\x43\xc2\xcb\xa3\xf2\x18\xd9\xa9\xbd\x1b\xa0\x75\x7b\x4d\xf7\x11\xf4\x2f\xc0\x75\xd7\xbe\x38\x19\xd4\x2b\x94\x3d\xde\xb7\x85\x8d\xc8\x02\x90\xb0\x2f\x33\x4a\xa4\x10\x0e\x93\xee\x7d\xc1\xc4\xd0\xd0\xe4\xba\x65\x5c\x74\xa7\x33\xfd\xc6\x74\xa6\x6e\x73\x65\x7c\x1a\x74\x1a\x78\x14\xab\xa8\x5c\x4a\x59\x95\x25\x8d\x1b\xfb\x09\x4a\x5d\x44\x4c\x7f\x47\x1b\x34\xc1\x5f\xf4\x80\xfa\x91\x16\x14\xa5\xf0\xb1\x73\x7a\x42\x55\x4d\x21\x8b\x32\x43\xc8\x35\xae\x1d\x1d\x3f\xbf\x62\xd3\x76\x83\x3b\x7d\xb9\xbb\x9c\x91\x4a\x86\xe6\x32\x65\x64\xc4\x4d\x25\x1d\x35\x33\x58\xbb\xeb\x80\x68\xa4\x20\x89\x03\x9b\x03\xad\xc3\x6a\x18\x6e\x42\x91\x46\x22\x88\x4c\x8c\xaf\xf9\x0b\x65\xbe\x2f\x5f\xbe\x7c\x89\x45\x97\x7f\xf8\xc3\x1f\x88\x54\xd0\xc1\x21\xe1\xf9\xf2\x8d\x70\xd7\xbf\xbf\x7a\x35\x20\x7f\x3d\x7a\xf7\x16\x72\xff\x0b\xa3\x11\xd7\x1b\x47\xb6\x37\xd4\x7e\xac\x7b\xe4\xff\x0e\xdf\x9f\x7b\xb5\x51\x2f\x7c\x0b\xa6\x76\x78\xbd\x3a\xfa\xe2\xcb\x6f\xbe\xfe\x7a\x40\x4e\xb8\x82\xda\x27\xce\x42\x27\xa2\xe0\x2d\xa1\x8a\x61\x91\x28\x40\x04\x7a\xbd\x8a\x07\x50\x7c\x87\x9f\x80\xad\xd6\xb0\x9e\xd1\x72\x60\xc6\x13\x83\x65\x56\x28\xc8\x42\x13\x55\x00\x6e\x74\x50\xa8\x2e\x59\x17\x26\xd7\x23\x19\xbf\x66\x64\xac\xa1\x03\x61\x55\x4c\xaf\x98\xb6\x16\x92\x2b\x29\xc1\xc1\xaa\xb5\xd2\xcc\x3c\xf1\xdc\xcf\x56\xbe\xe0\x45\x00\xe3\x5a\x7f\x29\x28\xf5\xbc\x66\xf3\x3e\x72\x58\x41\x79\x28\x18\x81\xe4\xb8\x5a\xcf\x84\xe0\xb5\x49\x23\xb9\xe2\x31\x16\x0b\x25\xff\x89\x8b\x0f\x35\xa4\x91\x24\x86\x4a\x54\xec\xc8\x09\x60\x09\x22\x6a\xc0\xe1\xeb\x60\x5d\x0f\x23\xff\xb1\x43\x0a\x5d\x86\x5b\xce\xb8\xb6\x8f\xb8\x66\x73\x7d\xd7\x93\xab\xde\x2f\x96\x3f\x35\x72\x4a\x29\x96\x7e\xed\x90\xf4\x9d\x64\x74\x4d\x13\x1c\xe2\x4d\x35\x06\x96\xff\xbb\x42\x68\x77\xaf\xa7\x52\x20\x44\x2d\x5d\x59\x33\x53\x3a\xd2\x40\xde\xb9\x7d\x36\x00\xfa\xc3\x1b\xe6\x54\x5d\x33\xdf\x88\x94\x66\x03\x72\x61\x27\x19\x20\x47\x42\x1f\x58\xb0\x5b\xe9\x1c\x1e\xeb\x94\x34\x78\xc8\xfe\x60\xb0\x8f\x1b\x4f\x2a\xa2\x0d\x55\x6e\x17\xd9\xcf\x9f\x07\x8a\xd5\x3b\x5a\x68\x44\x55\xb1\x5a\x29\x20\x0e\x49\x40\x6a\x35\xd3\xaa\x0d\x1a\xd2\x7a\x87\x3c\x45\xfa\x40\x98\xc6\x03\x6c\x23\xea\xd4\x95\x93\x0d\x46\xfa\xed\xbd\x15\x58\x48\x79\x0b\xa5\x02\xaf\x56\xaa\x85\x83\xd9\xcd\xd8\x93\xd2\x25\x56\xb7\xc9\x70\x92\x32\xd2\xd6\x16\x7a\x17\x3e\x55\x95\x01\xaf\x2e\x14\x07\xbc\xda\xab\x0f\x78\xb5\x09\xe8\xe2\xb5\xb4\x43\xc3\x49\x85\x87\xd1\xb8\x22\x3d\x80\x9e\x17\xe1\x88\x37\x12\x3b\x7e\xf8\xce\x35\x82\xd0\x91\x96\x59\x69\xf0\xa7\xd5\x97\xf1\x31\x07\x83\x7a\xf0\x25\x38\xdb\xc2\x6d\xd1\xa1\x07\xc7\x3d\x9e\x13\x6d\xce\x3f\xbc\x5a\x8b\x89\xce\xba\xbe\x3e\x6f\xaf\x42\x6b\x3a\x7b\xdd\xa9\x9b\x5c\x27\x57\x0c\x75\x33\x65\x2e\x0b\x21\xd2\xeb\xac\xf0\xb4\x22\x01\x94\x46\xaf\xa2\xb9\xee\xf0\x1b\xf1\x12\x26\x9a\xb7\x77\x0b\x0c\xcf\xc8\xc1\x71\x28\x11\xf7\xe9\x6c\x67\xc2\x30\x35\xa6\x09\x3b\x8c\xdd\x05\xac\x98\xb2\x9c\x29\x9a\x85\x0c\x65\x5f\xa7\x3c\xa5\x22\xcd\x5c\xf1\x3e\x53\xb0\x71\xd9\x27\xc3\x94\xa0\x19\x3c\x22\x55\x7c\xc6\x94\x26\x07\xdf\x31\x6b\x4b\x30\x6a\x4a\xc5\x0e\x9f\x60\x1a\x29\xbe\xc8\x26\x9c\x19\xf0\xe0\x6e\x12\x40\x61\xa8\x55\x9d\x0f\xab\xa5\xf2\x98\x45\x76\x59\x75\xec\x06\x1a\xd8\x0d\x01\x27\x26\x08\x5d\xe8\x08\x84\xd1\x48\xdf\xd0\x0e\x80\x8b\x13\x83\x03\x53\xed\x1a\xdc\x01\x22\x8c\x93\xe7\x0e\x2a\x64\x63\xa5\x00\x9f\xa5\xe8\xe2\xae\x92\x89\xb1\x33\x20\xe5\x8c\xa7\x5e\x0d\x82\x6c\x86\x0a\x75\xab\xa0\x3a\xaa\xe4\xa7\x5a\x4b\xd7\xbf\x33\x5a\x23\x34\x47\x41\x59\xaa\x63\x4a\xfb\x48\x71\x1c\xef\x92\x80\xcc\xda\xa8\xa1\x05\xe9\xe4\x40\x94\x29\xbb\x28\x47\x19\xd7\xd3\x61\xa7\xa1\x8d\xf3\x15\x03\x63\x62\xe0\x52\x72\xc9\xad\xe1\x0e\xcd\x84\xe6\xae\x9f\x18\xaa\x59\xdc\x6a\xd9\x12\x96\xc1\xff\x3a\xde\x1d\x12\x0a\xc5\xa1\xb1\x98\xff\x2a\x9a\x87\x43\xee\xc0\x76\x3a\x29\xfb\x20\x8a\xda\xe7\x09\xcd\x32\xed\xf4\xda\x00\x16\xe9\x0f\x32\xd4\x4c\x3d\x9a\x07\x72\x05\xb7\x0c\xe3\x67\x0f\x59\x33\x28\xc5\x02\xb2\xe9\xca\x17\xd3\x24\x97\x58\xf1\x2f\x88\x14\xfe\x26\xe8\x0a\xe4\x7f\x10\x28\x84\x78\x63\xc8\x74\x1b\xc4\x94\xdc\xc5\x74\x9e\x5e\x4c\xa7\xd3\xa8\xf0\x30\xb4\x68\xa0\x30\x70\x1f\x0a\x9b\x7c\xe3\x58\x1a\x0a\xff\x2b\xc3\x71\x70\x5f\xf8\x78\x63\x11\x5c\x9c\xdf\x91\x71\xb0\xa0\xdd\xf8\x6d\x7f\x5c\x18\x14\x54\x31\x6b\x79\x83\x60\xea\x3b\xdb\x3a\x89\x76\x92\x33\x89\xc3\xf6\x5e\x16\x67\xd5\x99\x0e\xc7\x39\x7e\xb8\xaf\x49\x2a\x93\xd2\xda\x5c\x15\xd9\xab\x84\x89\x76\x68\xef\xcf\x0b\x7e\x36\x95\x37\xe2\x86\xaa\xf4\xe8\xa2\x51\xd5\x6a\x5d\x39\xab\xc6\x8a\x55\x6f\xff\x08\x62\x3f\xa7\x23\x59\x9a\x00\xf1\xb7\x0b\xdc\xad\x1c\xe2\x3e\xef\x9a\x6b\xeb\xbd\x5e\x9c\x8e\xec\x42\x7f\xbb\xd0\xdf\xb3\x09\xfd\xd9\x91\xea\x9d\x52\x6a\xe2\xc5\x39\x64\x2d\xc5\x9f\x45\x0c\x29\x12\xa9\x78\x7a\x2e\xd6\xc3\x2e\xe8\xfc\xb8\x79\x2b\xae\x8b\xec\x04\x2f\x73\x41\x1d\x7b\x0e\xf1\xa6\x2d\x88\x17\x01\x2d\x5b\x18\x83\x78\xdd\x56\x2a\x86\x48\xad\x18\x78\x8e\x22\xd8\x85\x4c\x5f\x23\x70\x2a\x74\x42\xc7\x9e\x1d\x3d\x87\xdb\xdc\x73\xbe\x0b\x11\xf5\xfe\xc6\xd6\xcc\x5e\xfd\xe9\x24\x26\xd0\x92\x01\x48\x47\x4c\x40\x80\x11\x80\x3a\x17\x6d\xb8\x81\x74\xc6\x11\xf6\xaa\x0c\x9d\xb6\x23\x2d\x2a\xd0\x38\xaa\x67\x04\x9d\x4c\x59\x4e\xe1\x9f\x6f\x3c\x09\xac\x6c\xb4\xc6\x83\x61\x88\x90\xc6\x54\xae\x89\x1c\xf7\x6a\x10\x0a\x7b\xb3\x57\x7b\xed\x62\x0c\xa4\xbb\x70\x24\xf1\xfb\xe8\xa2\x75\x6c\x87\x2c\x12\xec\xa2\x16\xd2\xb1\x7b\x08\x74\x9e\x0c\x5b\x17\x2f\x64\x59\xc0\xf9\x81\x14\xde\x1a\xe2\x6c\x4b\xac\xb6\x17\xa2\x06\x4f\x40\xf9\xdb\xc5\x6a\x9f\x63\xac\x36\x3a\x18\xbd\xa0\x73\x84\x8d\xe3\xb7\x71\x48\xc0\x07\x71\x47\xcc\x1b\x35\xce\x86\xf1\x11\x5c\x1f\xbe\x95\xaa\x9e\x9a\xb4\x3f\x18\xec\xef\xfb\xa0\xae\xe3\xfb\xd2\x8c\xfb\x7f\x24\x4c\x24\x32\x45\x66\xb1\xe3\x2b\x6d\x40\xdd\xab\xbc\x6c\xf1\x5c\x72\xff\xac\x38\xbd\x09\xc6\xee\x62\xa9\x5b\xcb\x16\x8f\xc6\xf7\xe6\x11\x94\x98\x4a\x75\x09\x98\x7f\x8e\x44\x01\xd3\xd9\xe9\x30\xfe\x7b\x4d\x32\x9e\x73\xd7\x3f\xcc\x6e\x74\xa6\x8d\x26\x07\xf8\xe1\x20\x29\xca\x9e\xbb\x61\x90\xb3\x5c\xaa\x79\x2f\xdc\x64\xbf\xac\xfd\xca\xdd\x71\x88\x7d\x28\x4a\xa5\x98\x30\xd9\xfc\x39\x6b\x40\x9e\x88\x5b\xa2\x00\x85\x35\x6e\x83\xe4\x51\x5d\x0b\x35\x73\x21\xe2\x0b\xde\xf2\x08\x63\x3f\x80\xb5\xea\x5e\x08\x49\xc0\xa7\x4c\xcc\xc8\x8c\xaa\x07\xa2\xa7\xaf\xba\x3a\xd4\x79\x52\x3e\xe3\xba\x6d\x73\x3f\x72\xbb\x13\x1a\x5a\x77\x95\xa6\x28\x8d\x93\xe8\x7e\x07\x7a\xa4\xed\xb0\xf3\x16\x94\xc3\x57\x7b\xad\xa7\x54\x50\x63\x98\x12\xaf\xc9\x7f\x1d\x7c\xfc\xfd\xaf\xfd\xc3\x3f\x1f\x1c\xfc\xfc\xb2\xff\x1f\x7f\xfb\xfd\xc1\xc7\x01\xfc\xe3\x8b\xc3\x3f\x1f\xfe\xea\xff\xf8\xfd\xe1\xe1\xc1\xc1\xcf\x3f\xbc\xfb\xfe\xea\xe2\xf4\x6f\xfc\xf0\xd7\x9f\x45\x99\x5f\xe3\x5f\xbf\x1e\xfc\xcc\x4e\xff\xb6\xe6\x20\x87\x87\x7f\xfe\xb7\xd6\x53\xa7\x62\xfe\xbe\xa5\x28\xc4\xab\xdf\xe1\x91\x5c\x1f\xb1\x13\xf6\x5b\x68\xad\xc0\x85\xe9\x4b\xd5\xc7\xa1\x5f\x13\xa3\xca\x76\xc2\xa4\x3a\x5e\xba\xde\xff\x95\x1a\x50\x41\xce\x7b\xa5\x7e\xc3\x1b\x1c\x22\x9e\x27\xbc\x83\xc2\xe0\x53\x37\x52\xbd\xe2\xc5\xb0\xbc\x90\x8a\xaa\x39\x49\x9d\x37\x73\xbe\x02\xf0\x27\x42\xfc\x69\x8d\xa6\x0b\x6f\x94\x72\xb5\x81\xda\xe0\xd6\x00\x3e\x2c\xe5\x65\xde\x8d\x13\xfe\x27\x40\x9e\x77\xa8\xf5\x3e\x81\x08\x1f\xe0\xc3\x17\x23\x9a\x5c\xa3\xbd\x14\xd6\x06\xb5\xc4\x18\x44\x7a\xcf\xe5\x3d\xe4\x8c\x8a\xe0\xc6\x87\x4c\x16\x99\x32\xbb\x70\xfe\x66\x1c\xbb\xe6\x72\xc7\x70\xba\xcb\x12\xac\xda\x30\x49\x45\xde\x81\xba\xb3\xd1\xb5\x26\x9d\xc0\x76\xf0\x7f\xb1\xb7\x56\xc7\xeb\x08\x2e\x5e\x82\x31\xe9\x30\xb2\xc6\xd0\x48\xaa\x4a\xff\xaa\xa9\x0d\xb0\x6e\x61\xcf\xf9\xe0\xac\x5d\x3d\x3b\x27\x54\x3c\xc1\xeb\x9c\x69\xcc\x45\xe1\x09\x34\x3a\x02\xc3\x13\xa8\x1f\x56\xec\x2a\x6a\x88\x58\x6a\xfb\x24\x29\xea\xf7\x54\x0f\xc2\x3e\x50\x23\x64\x01\xd7\xde\x70\xc1\x5c\xb6\xdf\x0c\x3d\x5d\x22\x67\x05\x94\x13\x7b\xdb\x52\x97\x60\x81\xb8\xa7\x38\x3d\x5a\x8e\x21\x5b\x22\x6a\x48\xe3\x7b\xae\x2c\xf1\xa5\xe0\x59\x9d\x31\x7d\xa3\x85\xf0\xe2\xa5\x70\xd9\x82\x4b\x5c\xb6\x9a\xc9\x4a\xcd\x54\x7f\x52\xf2\xb4\x3b\xf6\x7a\x72\x3a\x45\x4b\x4d\xa2\x2b\xfd\xa1\x13\xad\xa1\x73\x5d\x21\xe4\x63\xb6\x3e\x2b\xf7\x4e\x43\x6a\x67\xed\xb0\x8c\x1b\x43\xd4\xd3\x3c\x69\x68\xf8\xe5\x85\x81\x4b\x8d\x3a\x38\xca\x8a\x69\x94\xe3\x09\xfb\x04\xc7\x71\x87\x6a\x32\x4f\x1c\xc8\x12\xaf\xf5\xaa\xc1\xc7\xe0\x1e\x81\x0a\xa9\xbe\xfd\x3f\xef\x5f\xf2\x21\xd5\x11\x1b\x63\x56\x13\xfe\x06\xdc\x02\xae\xae\x2b\x65\x19\x33\x50\xa6\xc5\x44\xd5\x01\x4f\x13\xc5\x72\x39\xb3\xdb\xee\xa3\x20\x1f\xb4\x0b\x8e\xf3\xf1\x6b\x42\x0f\x6b\x85\xc2\xae\xed\xae\x60\x2c\xc5\x62\xaf\xa8\x91\x9e\x2a\x85\xee\x91\xd1\xa1\x7f\x31\x8d\xbd\x1e\x15\x78\xd0\x5c\x3b\x2b\x70\x5a\x29\x66\x09\x02\x70\x51\x4a\xe6\x44\x0b\x5a\xe8\xa9\x34\xe0\x1f\xa1\x05\x4d\xb8\x99\x5b\xf2\x1b\x45\x93\x6b\x68\x19\xad\x98\x7b\x62\x8f\x24\x87\x2e\x8b\xbd\x46\xd1\x5a\x09\x9a\x99\x2a\x59\x4e\xa6\x50\x13\x85\x77\x25\x19\xd5\x9e\x00\x2b\x7f\xef\x6c\x76\x4d\xd2\xb9\xa0\x39\x4f\x42\x2b\x0d\x25\x67\x5c\x73\xe9\x22\x5b\x38\xae\xdd\x73\xe4\x22\xf4\x1c\xc0\x80\xd9\x71\x46\x79\x4e\x0e\x34\x63\x24\x30\x0a\x7e\x33\x44\xe5\x11\x9d\x87\x8a\xd9\x9f\xc7\xd1\x34\x87\xaa\xe8\xa0\x03\xec\x27\x95\x4c\x0e\x09\x0a\xa8\x14\xc0\x66\x4f\x57\x3f\xfa\x30\x2c\xdd\xea\x99\x49\x05\x09\x6e\xbe\x1b\x0e\x13\xa9\x8c\x52\x61\x8e\x2e\xce\x74\x6c\xd8\xba\x1e\x82\x38\x12\x7c\x91\x49\x31\x89\x41\xe7\x2a\x2e\xb5\x07\x80\x80\x7e\x90\x33\x9e\x96\x34\x43\xd1\xef\x26\x73\x3c\x3c\xc3\x9f\xf3\xc9\xd4\xf4\x6f\x18\xb8\x3d\xf1\x84\xac\x52\xa5\xfd\x43\xf9\x52\x8a\x2d\xd7\x70\x54\x18\xe7\x5e\x43\x17\x32\x74\x5c\xa4\x73\x40\xac\x75\xc9\x9c\xb5\x2c\x1c\x8f\xdc\x8e\x43\x04\xba\x47\x44\x87\xe9\x1d\x85\xee\x80\x56\x3b\x02\xbf\xb0\xa5\x32\x70\xed\xf2\xdc\xa0\xd5\x61\xd5\x67\x22\x7c\x6c\xa2\x6e\xa3\x56\x13\x6e\x62\xd4\x6e\x58\x83\xdd\x65\xa7\xdd\x72\xcd\xaa\xfd\x73\xc5\xf2\x22\xa3\xa6\x9b\x64\x9b\xbd\x9f\xa2\x80\x40\x14\x4e\xb7\x02\x8b\x8a\xb4\x4f\x33\xbb\x55\x2f\x7e\x3c\x76\x25\x7d\x28\x82\x6a\x24\xbb\xaa\x9a\x97\xa2\x46\x85\xaa\xe5\x4a\xc9\x03\x38\x70\x23\x96\x82\xc4\x76\x4f\x06\xaf\xcd\x8d\xc0\x6e\xb6\xf6\x8f\x8b\x1f\x8f\x7b\x84\x0f\xd8\xc0\xff\x15\x6e\xf5\x47\x86\x91\x13\x2c\xf9\x08\xa5\x44\xb0\xd1\x61\x2a\xb1\x3b\x3c\xfe\xed\x3f\xbe\xb5\x93\xb4\xdf\xfe\xa9\xff\x6d\xd4\xfc\xe8\x4f\xff\xb0\x27\x90\xb2\x37\xd4\x3f\x8d\x33\xee\xe1\x70\xb0\x7f\xfd\xe3\x42\xa6\x96\xaf\x06\xf8\x5a\xfa\x1f\xae\x15\x3c\x13\xc6\xda\x23\x17\x12\x72\xed\x78\x8a\xdc\x05\xcf\x56\xec\x9f\x3e\x64\xe2\x7a\xa8\x3a\x21\x9b\x50\xc3\x04\x9c\x92\xbe\xb4\x5a\x48\x83\x3f\xc7\xee\xab\x30\xff\x83\x71\xdc\x10\xd5\x48\x09\xf2\x0f\x65\xec\x91\x20\xec\x13\xd7\x00\xa4\x83\xef\x0a\xe4\xa0\x2e\x9d\xdf\x2b\x02\x76\x58\x4b\xe1\x00\x9c\x04\x1d\x59\xed\xdc\xbe\x10\xd2\x7c\x11\x96\xdf\x6f\x06\x38\xdd\x25\xa1\x33\x09\x60\x1d\x70\xee\x09\x52\x0a\xf0\xf5\x57\x0d\x0d\x47\x73\x92\x73\x6d\xe8\x35\x1b\x90\xa1\x3d\xd8\xe3\x9c\x0b\xa4\x9e\x20\xd0\x92\x86\xa5\xa4\x14\x86\x67\xf0\x6d\x35\x8e\x9d\x72\x7c\xe0\x9f\x8d\x89\x2e\x13\xe8\xda\xab\x58\xdf\xab\x10\xee\xae\x25\xe1\x5b\xbd\x4b\x2f\x2c\xf6\x94\xa2\x8d\x59\xa4\xf0\x53\xec\x01\x2c\x1c\x7b\x2d\x25\x98\xdb\x79\x4a\x91\x54\x6a\x03\x10\x13\x1a\x41\x5b\x4d\x21\xf3\x29\x51\x68\xee\xba\x10\x8a\x60\x09\xd3\x9a\xaa\x39\xf6\x48\xe5\xa1\x95\xa3\xcb\xfd\x05\x75\x26\xa7\xa2\x84\x01\x14\xc3\x86\xbb\x65\x02\xd4\xa1\x64\xa4\xe4\x35\x13\xa1\xa8\xc2\xae\x62\x3d\xb3\xbc\x92\x54\x90\xd1\x20\x49\x32\xa5\x62\xc2\xaa\xba\xf9\x9c\xa6\x40\xfb\x1f\x82\x7a\xea\xdf\xc7\x52\x80\x8e\xad\x96\xc7\x0d\x90\x62\x64\xcf\xee\x10\x08\xfa\x28\x88\xf7\x24\xf5\xaa\x48\x8d\x7d\x25\x9e\x35\x3a\x2c\x48\x37\xa1\x81\xf6\x41\x81\x3e\xa8\x5c\x1b\xcc\x62\xcf\x99\xa1\x29\x35\xb4\xb3\x4c\xf6\x77\x34\xf4\x02\x75\x69\x2e\xc0\x0e\x51\xfa\x8b\x53\x3e\xbc\xbe\x2d\x0b\x1e\x23\x29\x80\x34\x98\xfa\xd5\xc7\x36\xfa\x96\xaf\x5d\x18\x16\x13\xd4\x41\x9b\x75\x1d\xe2\x61\x78\x3f\x1a\x8a\x2c\x96\x92\xb4\x04\xdd\xb8\x12\x69\x6d\xd2\x04\x3a\x89\x22\xd9\x85\xee\x8c\xca\x57\x55\x36\x44\x52\xd7\x07\x56\x6a\xae\x78\xd6\x31\x61\x38\x76\x7b\xf7\xd0\x17\x8e\xf8\xa5\xc0\xad\xba\xb0\x0c\xb0\x4e\x13\x66\x74\x95\x67\x8a\xa7\x89\x15\x91\xee\x2c\x77\x9e\x17\x38\x6a\xdc\xd2\x38\xe7\xc5\x6a\x15\x1a\x17\x4e\x4b\x77\x5a\xd8\xf3\x6b\xe3\x2b\xd3\x5d\x38\x0d\x9b\xe2\xbe\x93\x69\xfb\xb8\xdc\x42\x77\xd7\x6a\xe0\xaa\xec\x06\x4b\xb0\x34\x78\xc6\xf0\xc9\x90\xa5\xa0\x6b\xc0\x20\x78\x04\x4c\xe9\xac\xb9\x83\xb9\x52\xd9\xfb\xa1\x73\x1b\x3c\xae\x0f\x8f\xeb\xbf\x6a\xeb\xca\x6f\x9f\xc7\xe9\xaf\x96\xf9\x9c\xf5\x09\x75\x10\xbb\xb1\xa2\x75\xd8\x49\x68\x65\xb1\xbd\x66\x38\x79\x5d\x96\x4a\xc8\x0c\x72\xb5\xc5\x8c\x5b\x79\xf9\x9a\x7c\x51\xd3\xb5\x9c\x4e\x1b\x9c\x05\x58\xc8\x75\xe0\xbd\x07\x03\xb7\xe4\x1e\xa5\xac\x7e\xfb\xe1\xc2\x60\xa0\xe4\xad\x36\xa4\x17\xee\x4c\x4a\x6d\x64\xbe\xd8\x77\xd8\x2a\x86\x39\x96\x1d\x50\x43\x7d\x51\x81\x15\x66\xe8\xdc\x39\x84\x06\xf0\x2a\xc5\x42\x38\x6b\x60\x2e\x8d\x03\xb6\x66\x7d\xb4\xc5\xc1\x50\xc7\x3a\x12\x73\x9c\xdf\x49\x58\x11\xef\x62\x21\x13\x6b\x37\xf8\x9c\x29\x26\xe8\x28\x8b\x4a\xde\x82\xe9\x60\xd5\x7c\x05\xce\x7d\x5f\x71\x6c\x37\xa2\x92\x59\xe6\xbb\xd1\xa3\xff\x63\x21\x53\x0d\x66\x83\xd3\xed\x05\x3f\x53\xb0\x55\x04\xbb\x09\x4a\x29\xd5\x08\x17\xeb\x33\x2f\x80\x32\x3e\x7d\x70\xd5\x78\x2d\x73\x23\x3a\xcc\x8e\xe8\x2e\x3f\x02\xc0\x69\xb8\x68\x9e\xf4\x5c\x0d\xd3\xa0\xad\xf7\xe2\xd5\x5d\x9a\x05\x64\x9a\x42\x9a\x59\x17\xf1\xea\x7a\xef\xa5\x8b\x33\x18\xd8\xdb\x7d\x13\xf8\xc3\xeb\x03\x61\xaf\x8c\x98\xdd\x89\x15\xa4\x16\x70\x78\xfc\xdb\x15\x79\x78\x15\xdb\xfd\x00\xfd\x99\xdc\x1e\xf1\xf5\xd5\xf6\x38\x39\xba\x38\xc3\x27\x0e\xa0\x03\x2f\x15\x73\xa7\xa9\x99\x29\x57\x69\xbf\xa0\xca\xcc\x71\x9f\xf6\x6a\x4f\x0b\xb5\xa5\x1d\x90\xa3\xd3\x50\x7b\x9b\x06\x6e\xf1\x55\x5b\x23\x20\x9f\x5b\x1f\x1f\x9b\xbc\x75\x65\xb6\x8d\x22\x6d\x2b\x5d\xfd\x55\x2f\xa7\x8e\x40\xd9\xbc\xe7\xe3\x49\x50\x24\xa4\xe2\x74\x7b\xa2\x5f\x86\xdc\xba\x28\x32\x12\xc7\x1a\xab\xe4\xbb\xc7\x57\xef\xc2\xb3\xb6\xe8\x84\xe9\x52\x16\x63\xd8\xb5\x73\x9e\xde\x7f\x8b\xe1\x5c\xfc\x70\xe4\x96\xca\x47\x98\xab\xe8\x76\x22\xf3\xa2\x34\x2c\x5a\x52\x67\xcb\x3e\x78\x0d\x6b\x3e\xe1\x17\xd8\x95\xb1\xef\x86\xef\x87\xe1\xfb\x21\xb0\xdc\xb8\x97\x4d\x7c\x75\xb8\xa8\xa4\xf3\x0a\xdb\xf8\x7a\x72\x61\xe8\xfa\xd5\x59\x7a\x1b\x79\x94\x14\x37\xd2\x7d\x9a\x1b\x79\xfc\x54\x37\x12\x52\x8f\xbb\xdf\xfe\x97\x3e\x15\x7a\x41\x00\x38\x09\x7e\x97\x00\xa8\x41\x6d\x84\x71\xb8\xf6\x4d\xee\x9d\x5f\x3d\x6c\x64\xb0\x25\xe2\x54\x50\x27\x7a\xc0\x49\x8f\xce\x73\xf6\x29\x34\x0b\x88\xd4\x3a\x50\xce\x6e\xb8\x06\x5f\x32\x15\x95\xdd\x04\x22\xa4\xef\x52\x47\x3c\x20\xea\x4e\x1c\xed\xc4\x91\xbf\x76\xe2\xa8\x73\x71\x84\x99\xb0\xed\x13\xcb\xeb\xf6\x20\xfa\xdd\xc9\x2f\x25\x53\x73\x22\x67\x2c\xca\x48\x80\xf6\x0a\x9a\xa7\x2e\xa6\x3f\xe2\x22\xe5\x62\xd2\xd6\x06\xdb\x52\x2d\x2f\xa7\x26\x99\x9e\x7e\xb2\xda\x34\x54\xc9\x75\x2e\xf0\x17\x1f\x50\x2f\x76\xc7\x55\xf0\x4b\xec\x25\x3c\x38\xbc\x06\x0e\xcd\xb2\xfa\x04\x1c\xe3\x47\xe7\x27\x5d\x1a\xc4\x5d\x38\x54\x49\x77\x4e\x55\x72\x1b\xa3\xae\x22\x11\x92\x32\x7c\x53\xef\x89\xeb\x0b\x0d\x01\x3a\xbb\xe7\xe2\x4b\xae\x9f\x8e\xbf\x19\x43\xb5\x75\xd0\xef\x76\x60\x32\xf5\xab\xe3\x53\xa7\x4b\x0f\x1a\x5e\x6d\x41\x9e\xeb\x63\x79\xe2\x76\x73\x10\x76\x7c\xb0\x76\x00\x06\x1d\x5f\x35\x26\x75\xe0\xec\x90\xae\x05\xdc\x0a\xf0\xb2\x3e\xe9\x36\x30\x28\x24\x1a\x83\x84\xed\x86\xbd\x48\xd7\x4e\x1c\xbc\xfc\x32\x3e\x12\xb1\xc2\x16\xac\x65\x77\x5e\xb3\xf9\xbe\x76\xf5\x96\x52\xe8\x29\x2f\x7c\x57\x20\x90\x93\x6e\x57\x92\x1f\x21\x22\xe8\x87\x40\x89\x78\x26\x7a\xe4\x5c\x1a\xfb\x9f\x53\x48\x71\x80\x7d\x7c\x22\x99\x3e\x97\x06\x3e\xd9\x6a\x72\xe3\xab\x3d\x12\xb1\x5d\x41\x35\x87\x46\xfb\x98\xcc\x03\x15\x0f\x3e\xf0\x0d\x44\x75\x51\x8c\xb0\x30\x5c\x63\x50\xc5\x53\x35\x34\x3f\xd0\x6e\x08\xef\xe3\x15\x52\xf4\x5d\xe7\xcb\x15\x63\xb8\xc5\x90\xaa\xb6\x16\x77\x0c\xe7\x86\x82\xb8\x15\x7e\x03\x3e\xe0\x22\xa3\x49\x15\xad\x07\x00\x7e\x6a\xd8\x84\x27\x24\x67\x6a\x02\xb5\xb9\xc9\xb4\xeb\x25\xee\xea\x5c\xc4\xab\xc3\xd3\x11\xaf\x4e\xf9\x10\x54\x94\xb7\x90\x87\xf1\x38\xea\x0f\x8e\x8d\xc7\x75\x4e\x0b\xcb\x82\xff\x6d\x4f\x65\xe0\x82\xff\x81\x06\x1f\x7a\x40\x8e\x88\xe6\x62\x92\xb1\xda\x77\x2e\x8c\x10\x0f\x63\x47\xb0\xa6\xeb\x2f\x25\x9f\xd1\x8c\x61\xde\x14\x15\x01\x95\x5b\x8e\x97\x94\xae\x9e\xeb\xf2\x61\xe5\x72\xc8\x45\xda\xbb\x66\xf3\xbd\xde\x12\xdb\xee\x9d\x89\xbd\xaa\xcc\xbf\xc6\xa8\x41\xb9\x80\x0c\xa6\x3d\xf8\x6e\xef\xf3\xe8\x69\x4f\xc0\x74\xed\x8c\x27\x9d\xd3\xf9\x38\xa3\x5a\x77\x51\x71\x7c\x3b\x8a\xe6\x30\x7a\x52\x55\x41\xe4\x72\xef\x12\xcc\x8a\xe9\xce\x63\x0e\xd9\xf1\x5d\x65\x42\x74\x40\xe7\x99\x6b\x4d\xd8\x16\x92\x64\xf1\xcc\x09\xc3\x86\x02\x8a\x9b\xb8\xde\xae\x2a\x71\xb8\x85\xe2\x3f\x42\xc5\x94\x1c\xc7\x88\xc6\x5c\x83\x17\x8a\xfb\x92\x0a\x21\x0d\xe1\x22\xc9\xca\x14\xb1\x9c\xe1\xa7\xe0\xc3\xea\xc6\x50\xed\x8c\xbc\x9d\x33\xf0\x8f\x61\x58\xaf\x73\x3a\x0b\x7d\x39\x05\x74\x31\xef\x02\x8a\x1a\x31\x8f\x95\x6b\x47\xed\x4d\x52\x6b\xdc\x28\xd9\xad\x0e\x7a\x7d\x5c\xd7\x23\xdf\xf0\x91\x62\xe4\x78\x4a\x85\x60\xd9\x62\x32\x89\xae\xda\xef\x82\x72\xe9\x9a\xee\xee\xd7\xbb\xee\x7a\xd9\x2f\x42\x65\x7d\x95\x51\xbb\x01\x98\xf8\xdf\x4e\x63\xdb\xdb\x41\xca\x1f\xda\xd2\x16\x91\x8b\xa7\xf2\x86\xa4\x92\xdc\x40\x2f\xad\x99\x55\x0d\xa0\xef\x95\xf6\x4a\x45\x34\x53\x48\x5a\x4c\x64\x5e\x28\x99\x73\xed\x53\xbd\x1d\x43\x6c\xac\x80\x36\x2b\x1b\x23\x8e\xdd\x06\x13\xf5\xe6\x98\x18\xaa\x26\xcc\xd8\xc1\x89\x28\xf3\x11\x6b\x59\x20\xbc\x69\x30\xca\xa7\xd9\x09\x78\x73\xcd\x7c\x71\xf9\x7f\xfa\xe9\xbc\x1b\x04\xcf\x95\xbc\x75\x23\x55\x96\xde\xf0\x14\xd3\x36\x34\x39\xb0\x8f\x3b\x6c\xf7\xce\x1b\x84\xf0\x6c\xbd\x91\x6f\x6e\x78\xfa\x18\xe4\x76\xaa\x14\x90\x9b\x00\xbd\x5d\xd7\x59\x0e\x1d\x4e\xe0\xb1\x87\xe4\x94\x63\x39\x91\xfd\x0b\xb1\xb1\xf2\x11\x17\x55\x0d\x5f\x60\x08\x38\xf9\xac\x5c\xf0\x16\xb9\x66\x06\x0b\x41\xa0\x96\x42\x9a\x29\xd1\x3c\x2f\x33\x43\x05\x93\xa5\xce\xe6\x2d\xd9\xf8\xa9\x2e\xe9\x38\x63\x9f\x70\x37\xb7\xd7\x5f\xc2\x50\x75\x3d\x66\xc2\x04\x53\x55\x7d\xec\x92\x22\x53\xa5\x9c\xa6\x2f\x82\x52\x13\xaa\x99\xd8\x27\x96\xb8\x64\xd1\x22\x2b\x27\xbc\x51\x65\xc3\xae\xbd\x4d\xa3\x5f\xaf\xd7\xde\xa6\x6a\xde\x51\x6a\x56\x61\x56\xb4\x6b\x1f\xf9\x34\xba\xd1\x3c\xaa\xaa\x78\xb5\xba\xe5\x4c\xca\x0a\x26\x52\xc0\xc0\x8c\x76\x1c\x4e\x77\x63\xd4\x76\xd8\x93\x5d\x9f\x0b\xa7\x9f\x8c\xa2\x56\xc8\xe7\x56\x9c\x7b\x80\x4b\x3e\x26\x54\xb4\x15\xd8\xcf\xa5\x4b\x02\xd9\xe9\x8d\x0f\xbe\x74\xa7\x9d\x92\x22\x82\xd5\x3a\x25\x75\xdc\x27\x09\x4f\x3f\xb7\xd1\x7d\x9f\xa3\xdb\xfb\x19\xb9\xa7\xc4\x28\x17\x6d\xfb\x1a\xe9\x15\xed\x4e\x16\x66\xb5\xc1\x3d\xb9\x6b\x72\xf4\xb4\x9a\x1c\x8d\xa1\xe0\xbc\x3d\x20\xdd\x1b\x1c\x67\xc1\x77\xe6\x3e\xf4\x2d\xd2\xd7\xf0\x95\xb9\x1d\x15\x1d\xaf\x80\x5e\xee\x06\x72\xc5\x4f\x44\xdb\xd5\xa8\x52\xf6\x4b\x21\x9a\x09\xed\x4d\xf7\x82\xa1\x86\x6a\x66\xda\x78\x74\x97\xcb\x1b\xbc\x3e\x88\x63\x63\x0b\xa5\x94\x50\x1d\xaa\xae\x49\xff\x4f\x4e\x73\x14\xb5\x3b\xad\xce\xe8\x09\xed\x31\xeb\x58\x48\xdd\xc2\x31\x52\xbb\xbc\x09\x35\x2d\xbb\x82\xb6\x38\x65\xdd\x6c\x3f\x7c\x38\x3b\xe9\x84\x66\x76\xa0\x05\x9a\x39\x1e\x04\x54\x33\xfe\x4b\x19\xdb\xc0\x80\x99\x13\xa8\xe4\xee\xdf\x04\x29\x26\x09\xab\x9c\xf1\x27\x5c\x5f\xb7\x87\x94\xfc\xfe\xf8\xb4\x3e\x64\x7d\x33\x7f\x7f\x7c\x4a\xdc\xa7\x6b\xf9\xc0\x1f\xe2\x04\x6f\x8b\x4c\x38\x49\x58\x15\x1e\x4b\xb9\xbe\xde\x00\x1c\x65\x5b\xf3\xb4\x48\xcf\x9b\xd5\x0e\x6e\xb3\x3f\xdf\xa3\x56\x45\x50\x6b\x73\x59\x92\x1b\x07\x4e\xe2\x0c\xb8\x2b\x5e\xbc\x26\xa7\x42\x97\x8a\x55\x59\x4e\x8b\xb6\x9c\xd5\xa1\xd6\x36\xe7\x00\xff\x45\xbf\xee\xcc\xff\xdf\x35\x7f\x3e\x97\x80\x42\x41\x95\x01\x1b\xac\x23\x44\x4e\x68\xb8\xe5\x86\xf4\x44\xb8\x87\x79\xce\xc6\xbe\x5c\xa1\x47\x4c\x1d\xb6\xd2\xdf\x64\xd9\x25\x42\x2b\x8a\x19\xe4\x4d\x80\x4e\x23\x2f\x52\x36\x7b\xa1\x53\xfa\xaa\x07\x8f\xf1\x35\xed\xa6\x36\x27\xaa\xc9\xde\xab\xbd\x01\x19\xf2\x9c\x67\x54\x65\xf3\x5a\xef\x88\xea\x3e\x7b\x98\xfa\x01\x21\x09\xe4\xe5\x1e\x39\x90\x0a\x46\x4e\xa8\x20\x19\xa3\x33\xe6\x6b\xbd\xed\xf6\x9d\xa3\xf9\x70\xb8\x1d\xb2\x90\x6c\x4d\x34\x06\xc5\x62\x37\xec\xf5\x01\x8f\xf3\x1a\xe6\xd5\x49\x75\x9e\x71\x61\x0f\xb9\x01\xf9\xe0\x4e\x27\x77\xec\x23\x0b\xc0\xae\xf5\x77\x6c\xd7\x12\x6d\x8d\xcf\xa2\x9d\x27\x62\xd9\xd1\xb1\x6d\x84\x6e\xea\xed\x98\x70\x73\xc9\x0a\xd9\x81\x8a\x86\x03\x2d\x78\xf6\xb9\xb1\x1f\x48\xcd\x01\xef\x9b\x1a\x42\x51\x10\x25\x65\x46\xad\x45\x86\x7e\xfd\x01\x39\x39\xbd\xb8\x3c\x3d\x3e\xba\x3a\x3d\x79\x4d\xfc\x48\x3c\xd6\xe9\x07\xe4\x2a\x86\xad\x8b\x2a\xbf\x1c\x36\x58\x78\x56\xcf\x09\x56\x2a\x2a\xb0\x62\x80\xf1\xa1\x82\x9c\x09\x6e\xaa\x1e\x0c\x98\x44\x9f\x49\xe1\xd2\xe2\xed\xaf\x5d\x5c\x61\xc2\x31\x79\x53\xb8\xc1\xec\xd7\xf5\xd1\x60\x87\x22\x62\x79\x98\x4a\x23\xef\xc6\x86\x75\xbb\x6a\x79\x36\x61\x65\x7a\xb8\xf1\x4e\x36\xf9\x15\x06\x64\x2b\x7c\x79\x3c\x51\x43\xdb\x1c\x0f\xc3\x25\x55\xad\xab\xcd\x60\xb0\x3f\x20\xf6\xac\xde\x1f\xec\x7b\x55\x2e\x5b\x6a\xbd\x14\x06\x8d\xd1\x0e\xeb\xfc\x3d\x20\xe4\xbd\xaf\x26\xec\x59\x3d\x6d\x75\x17\x27\x44\x3c\x89\x7a\xf6\x2c\xec\x12\xdf\xdc\xab\x1c\xc5\x0f\x75\xf0\x88\x13\x3e\x63\x02\x5f\x6c\x73\x82\xd9\x4f\xb5\x93\x55\xbb\xac\xde\xfc\xc3\xe5\xdb\xcd\xbd\x14\x4a\x96\x4e\x5e\xe9\x58\xe6\x39\x02\xf7\x4d\x03\xee\x48\x05\x1d\x12\xa4\xde\x46\x8c\x73\x84\x2b\x1c\x37\xda\xb0\x0b\x12\xdf\x0f\xb5\x60\x8c\x87\x8f\x5d\x79\xaf\xa8\xec\xa1\x87\x37\x7c\x70\x78\x99\xda\x23\x30\xb9\xe3\xf3\x45\x78\x8f\x17\x97\xa7\x47\x27\xef\x4e\x07\x79\xfa\x04\x85\x2f\x13\x69\x21\xb9\x30\xba\xa9\x61\xde\xac\x71\x64\x5b\xb1\x1d\xa6\xdd\x8d\x6e\x76\xea\x87\x8b\x13\x3d\xfd\x33\x22\x00\xd4\x94\x19\xca\x33\x1d\x71\x98\x91\x85\xcc\xe4\x64\x75\xff\x88\x07\xb0\xce\xef\x10\x80\xaa\x4f\xfb\x96\x27\x37\x67\xb1\x36\x6f\x3a\x57\xa7\xa8\x6f\x32\x67\x09\x59\x51\x2b\x58\x82\xd0\x1b\xee\x19\x10\xec\x33\x9a\x08\x4b\x54\x44\x9f\x0c\x88\x38\x8f\x4f\x5b\x01\xbe\x46\xad\x28\xd7\xb5\x1d\x36\x43\xfc\xa6\x66\x83\x95\xe6\x4d\x7b\x9e\xd6\xa9\xfe\x17\x37\x52\xfd\x10\x29\x14\xeb\x07\xb4\x3c\xe8\x85\x28\x55\xa4\x83\xc5\x67\x8a\x77\xe2\x7a\x97\x2f\xde\x95\xcd\x17\x9d\xb9\x95\x96\x1e\x7c\xe8\x90\x78\x04\xe8\xbe\x01\x35\xd9\xb9\xb4\xe8\x04\xd1\xe6\x94\x8b\x94\x15\x8a\xcf\x78\xc6\x26\x00\x15\xcf\xc5\xc4\x37\xd1\x8c\x60\x57\xa1\x91\x13\x5b\x9a\x97\x5d\x6c\x6d\xe2\x56\x26\xc0\x59\xe7\xef\xaf\xa0\xfd\x00\xa4\xc2\xb4\x36\x26\xed\x03\xa1\x6d\x63\xbf\xdf\x07\xff\xdd\xc1\x3f\xad\x55\x93\x66\x87\xe4\x27\xe6\x9e\x23\xa1\x45\x82\x82\x9e\xa0\x53\x19\x30\xea\x61\xae\x15\x65\x81\xa1\x31\x39\xce\xdd\xf5\xc2\xde\x69\xd5\x67\x3c\xce\x6b\xf7\x03\x24\x3b\x22\x1d\x63\xcc\xff\x29\x5a\x40\x1b\x3a\x44\x3b\x96\xf6\x3e\x4e\xb4\x6a\x8f\x54\xe0\x8d\xee\x5c\xa0\x44\xcf\xf3\x8c\x8b\xeb\x0a\x82\x71\x2c\x2d\x1f\xbb\x36\x0c\xe2\xda\xef\x1a\xc5\x68\x76\xfb\x89\xd1\x84\x47\x37\x76\x5a\x98\xce\x42\x09\x57\xf3\x02\xf3\xd8\x82\xf0\x72\x49\x56\xb1\xa8\xdf\xdb\x7b\xd2\x14\xe3\x3a\xd1\xbc\xbd\x78\x3f\x1b\x1e\x0f\xcf\x6a\xb2\x5d\x10\xfc\xec\x73\x06\xec\x6e\x3b\x5c\xe1\x25\x9f\xb4\x05\xc1\x7f\x69\x96\xe1\xd4\x27\x59\xd9\xf4\x97\x98\x44\x7d\x21\x95\xa1\xd9\x06\x04\x67\x32\xa5\xc5\x51\x69\xa6\x27\x5c\x27\x72\xc6\x3a\x72\x43\xdc\x4c\xb1\x11\x85\x47\xad\xe5\x9e\x49\xf1\x19\xe4\xf8\x2f\x47\x17\x84\x96\x96\xeb\x8c\xc3\x18\xdf\x58\x7a\x9a\xa7\xc0\x10\x4b\x7e\x1f\xf1\xfd\xdd\x13\xb6\xea\xed\x77\x41\xe1\x47\x0f\x0a\x83\x5c\x7c\x2e\x81\x60\x2e\xb8\xe1\xd4\xc8\x56\x1d\x9d\xeb\xfe\x3d\x84\xdd\xc6\x2d\x72\xe6\x87\x87\x1c\x27\x50\xb5\x6a\x4f\xac\xf7\x11\x03\x43\x11\xc8\x7b\x26\xac\x59\x47\x13\xb6\x50\x67\xd2\x03\x10\x6c\x1c\x9b\x87\x7b\xbe\x75\xd5\x46\x05\x48\xdd\x3f\xbd\xae\xb5\xb8\x59\x6a\xd6\xe6\x9d\x8e\x55\x03\xb0\x8d\x79\x8b\xf9\x2f\xdd\xc8\x27\xe7\xdc\x47\xba\xfc\x67\x49\x33\xa4\xe7\xf9\x26\x3d\xe1\xf5\x75\xec\xe4\x35\x3d\x4f\xf9\x75\x3f\x0f\xde\xaf\x52\x43\xc7\x30\x77\x87\x51\x54\x68\xcb\x0c\x75\xff\xc2\xbe\x4b\x31\xd8\x27\x07\x26\x29\x5a\xb6\xb9\xda\x82\x6a\x4e\x7c\x59\xb7\xf6\x6f\x43\x15\x67\xbb\xf7\xda\x78\xde\x00\xec\xe1\x6e\x9c\xa7\x35\x02\xa1\x4a\x46\xde\x72\x6d\x7c\x37\x2f\xf8\x80\x6b\xd7\xfe\x00\xb4\xef\x0b\x22\x15\xe1\xc5\xdf\x69\x9a\xaa\xd7\x78\xd6\x3b\xeb\x10\xfe\xad\x03\x5e\x39\x15\x21\x63\xe5\xc0\xcc\x0b\x9e\x80\xab\xe4\xea\xf8\x82\x60\x5f\xc3\x3f\x7e\xf3\x12\x34\xf1\xaf\xbe\xfc\xe6\x65\x4b\x56\x7b\xaa\xd5\x71\xa4\x6b\x2f\x64\xe7\x79\x0a\xcf\xa4\x86\x02\x14\x50\xac\x9e\x80\xd3\xcd\x49\x41\xe4\x7b\xcb\x84\xe1\xcc\xed\x52\x4d\xdd\xd5\x1b\xfc\x86\xea\x0d\x48\x28\x18\x47\x39\xfa\x58\xf2\x19\x45\xf3\xc5\x53\x11\xcd\x0d\xa9\xd9\x94\x73\xeb\x1c\x8b\xd2\x6d\x7f\x5f\xc7\xb9\x1c\x50\x4f\x79\x72\x3e\xfc\xfb\xdb\xa3\xef\x4e\xdf\xc2\x7b\xba\x6c\x78\xcb\x8a\x5c\x34\xce\xdd\x5e\x9f\xb5\x9b\x7b\x8a\x9a\x92\xb3\x8b\x88\xfd\xf9\x9b\xe1\x82\x2b\xce\x7e\xf2\xc0\x30\x7d\x5b\xdb\x52\x8c\x5b\x50\xef\xa9\x05\x09\xa0\xa3\x21\x53\x9b\x29\xee\xee\x38\xc2\x10\xe1\xa8\xd7\x9c\x1a\x96\x87\xf0\x1d\x5b\xfb\x1d\x1a\xf2\x06\xd9\x3a\x35\xee\xee\x60\xb2\xa5\x18\x52\xb1\xf3\x30\xf2\x67\xa5\x76\x3b\xf5\x50\x75\x85\x3c\xb0\x3f\x84\xb1\x7c\xc2\x83\x15\x61\x98\x47\xad\xec\x89\x6a\xcf\x52\xa6\x43\xe7\xb0\x67\xc0\xad\xc5\xaa\x16\x73\xed\x4f\x87\x95\x9d\xeb\x6a\x4d\x9f\x6b\x21\xfa\x5a\xf5\xf2\x6d\xed\x2d\x7d\x2e\x23\x75\xae\x2a\x5d\xd0\xa4\xd3\xce\x3c\xd5\x47\xf8\x09\x00\xbd\x3d\xc5\x03\x06\x26\xbe\xa1\x32\xab\xf0\xec\x6e\xb6\xe3\xb1\x1f\x6e\x11\x0c\xe4\x41\x5c\x42\xa8\x0e\xed\x9c\x4b\x1d\x90\xfc\x7c\xb3\xf2\x6d\x64\x21\xb2\x75\xe7\xd0\x4f\x0d\x1d\x08\x9b\x74\x1e\x14\x53\x69\xa4\xe8\xb8\x84\xf4\x62\xc5\xa0\x75\x79\x86\x77\x1c\x57\x3d\x2c\x2b\xbe\xc0\x0a\x9b\x10\x9a\xb6\x06\x87\x3f\xb1\xa5\xf0\x41\xea\x7a\x88\xfa\xe9\x09\xa0\x22\x3d\x3b\xd9\x80\xec\x79\xfa\x30\x3c\x0f\x0d\xce\x6d\x2c\xbd\x34\xed\xa8\x2e\xfd\xec\xc4\xd9\x02\xbe\xf6\x5c\xbb\xcd\x43\x6e\xdf\x3d\x1b\xd1\x93\xa4\x32\x37\x52\x75\x05\x5f\x76\x51\x1b\x6e\x21\x5f\xd1\x7d\xb7\x84\x27\xf1\x3c\x65\x05\xbe\xe5\x93\x97\x17\x43\x48\xe4\x5a\xe8\x2f\xb9\x28\x21\x42\xa5\xee\x23\x08\x91\xa7\x23\x3c\x3a\xd5\x4a\x1e\x17\x36\x6a\x63\x26\xad\xdf\x15\x9d\xd0\xe8\x47\x37\x98\x73\x6d\x5a\xfe\xa8\xc4\x2d\x0d\xc2\xc8\x3d\x74\x23\xe2\x55\x49\x2b\x7e\x9a\x49\x91\xfa\x81\x62\x58\xae\xb1\xa3\x5f\x96\xd9\xf5\x94\x22\xee\x05\xe8\xc0\xa5\x7a\x04\xdb\xe9\xe5\xb4\xd0\xd8\xb4\x20\x95\x37\xe2\x86\xaa\x94\x1c\x5d\x9c\x7d\x7e\x21\xda\xba\xf8\x11\x77\x41\x1b\x4c\xfa\x1a\x15\x01\x85\x7e\xc4\x8d\xae\x7a\xdf\x33\x13\xfb\x90\xec\x01\x14\x32\x44\xac\x08\xb3\xe2\xca\xcd\x22\xd2\x91\x04\x91\x89\xa1\x19\xb6\x83\x20\x23\x66\x6e\x18\x13\xe4\xe5\xcb\x97\x18\x52\x78\xf9\x87\x3f\xfc\x01\x3a\xbf\x93\x94\x25\x3c\x5f\xbe\x11\xee\xfa\xf7\x57\xaf\x06\xe4\xaf\x47\xef\xde\x12\x9a\x80\x05\x86\x90\xaa\x38\x32\xac\x5d\xfc\x63\xdd\x23\xff\x77\xf8\xfe\xdc\x9f\x4b\x7a\xe1\x5b\x60\x8d\xdc\xbf\xde\x80\x9c\x44\xe9\xe7\xb1\xcb\x9f\x9a\x29\xa4\xe4\x0b\x69\x08\x1d\x8f\x81\x39\x51\x24\x73\xed\xc5\x85\xc7\x45\xe3\x93\xa9\xef\xdd\x6d\xd9\x2a\x83\xbc\x78\x6e\xa7\x08\x21\x16\x0f\x25\x88\x69\xfe\x30\x56\x38\x1d\x60\x2a\x3d\x92\xf1\x6b\x46\xc6\x1a\x3a\x78\x57\x4d\x34\x14\xd3\xd6\x7e\x4a\xa8\xb0\xa3\xe3\x60\x61\xea\x76\x12\x4f\x3b\x77\xa1\x65\xaf\xe7\x1a\xc3\xfa\xc6\x70\xbe\x2e\x09\xe5\x89\x25\xfb\x53\xcd\x25\xa8\xeb\x8b\xe1\x7d\x90\x8b\x1c\x14\x5f\x10\x9b\x84\x66\x52\x4c\x62\xa6\xab\xf4\x08\x9f\x80\x38\x2f\x58\x53\x62\x74\xd4\x4d\xa5\x9b\xde\x64\x28\xb9\xdf\xd1\x96\xdd\xfe\xeb\xa1\xd5\x08\x0a\x91\x8e\x64\x69\x7c\xca\x1b\x3e\x09\x20\xb0\x00\x23\x11\x09\xde\xea\xc1\x9d\x35\xa6\xe9\xae\xd5\x5b\x47\x7d\x96\xea\x07\x71\x4d\xd9\xec\x11\x46\x93\x29\xb9\x66\xf3\x3e\x8a\xf8\x82\x02\xfa\x01\xd0\xf9\xc4\x52\x17\xfb\x0b\xd5\x33\x0a\x12\x96\x5a\x3b\xd0\x2d\x82\xcf\x4c\xac\xb8\x3e\xa0\x27\x78\x53\x49\x3b\x8d\xda\xf5\x2d\x12\x91\xe3\xd0\x37\x2a\x4c\xa4\x30\xae\x09\x62\x68\x54\x04\x99\x96\x0b\x15\xf6\x56\xa2\xb0\xd4\xfe\x4c\xdf\xf5\xe4\x2a\x1d\xd3\x1e\x19\x4e\x99\x28\xc5\xd2\xaf\x01\x09\x1c\xf2\x5e\x35\x73\x78\x3e\xd4\x37\xc0\x8b\x52\x3a\xa7\x3c\x81\xaa\x1a\x7b\xbb\xbb\xd7\x53\x29\x10\xa2\x86\x00\xa0\x99\x29\x1d\x69\x20\x97\xd6\x3e\x9b\x69\x4d\x38\xbc\x61\x4e\xd5\x35\xf3\x60\xb6\x34\x1b\x90\x0b\x3b\xc9\x80\x53\x8e\x7d\xe3\x66\x58\x04\x61\x65\x4a\x0c\x6d\x60\x1f\xb2\x3f\x18\xec\xe3\x59\xb8\x02\xe8\xa0\x35\xbf\x74\xd9\x32\xac\xb3\x56\x61\x75\x3d\x88\x16\x1a\x5b\xa7\x59\xeb\x00\xda\x13\x4a\xc0\x1d\x31\x53\xaf\x2d\xd0\x96\xe0\xd3\xf1\xd5\x71\xcf\xaa\x6e\xdb\x5e\x76\xd7\xf4\xb2\x45\x08\xbc\x7e\x75\xdd\xec\xb2\xc3\x56\x97\xf5\x84\x63\x27\x7f\xaa\x13\xa4\xab\xbe\x7b\x9d\x37\x56\xcc\x3b\x68\x6b\xe5\xaf\xdb\x90\x8b\xf3\x75\xac\x0b\x50\xb4\xad\x2c\x7f\x52\xe6\xc4\xd9\x18\x64\xe8\x6a\xb4\x96\xc8\x4a\x0b\x47\x8a\xa5\xc0\xe6\xed\x88\x2e\x7a\xc5\x93\x8e\x0c\x8b\xc5\xab\xbd\xa1\xb1\x78\xb5\x49\x66\x59\xbc\x96\xf6\x79\x38\x53\x8b\xa8\x94\x16\x96\xc8\x48\xe8\xc1\x68\x82\x30\x18\x90\x77\xee\xcc\x45\xe6\xa6\x23\x2d\xb3\xd2\x04\x58\x85\x15\x07\x32\x0c\xea\x3b\x36\x22\xdc\x90\xbf\x2d\x3a\x9e\x41\x31\xc1\x33\xab\x9b\x93\x1a\xaf\x0e\x85\x4d\xdb\x64\x54\xbc\x7e\x63\x29\xa9\x78\x75\xb8\x0a\x5e\x2f\xec\x78\x25\x86\x0e\x53\xd2\xd7\x01\xd6\xb4\x57\x48\x4b\x35\x1a\x55\x63\xaf\x88\x62\xc3\xc3\xa6\x68\xcb\xd5\xd5\xde\xf1\xea\x5e\xc7\x79\x03\x8f\x2e\xce\x1e\xdd\xca\x8c\x9e\xb5\xb3\x33\xd7\xba\x56\x38\x7c\x01\x88\xc0\x3b\x81\x4e\x2a\x8a\xba\x00\x9b\x95\xbf\xbf\x01\x73\x65\xe9\xc5\xdf\xd8\x73\x27\x0a\x4a\x2d\xb4\x7c\x40\x0f\x6e\x75\x42\x45\x6d\x22\x7c\xba\x0c\x48\xb3\xe7\x6f\xda\x6c\xa9\x41\x02\xd4\x6f\x51\xf7\xb2\x78\x2d\x26\x96\x3a\x22\x92\x21\xf4\xda\x47\xef\x49\xe4\x86\x29\x64\xfa\x1a\x9b\x36\x53\x21\xa4\xc1\x1e\xf3\x3d\x6c\xd6\xaf\x7b\xe8\x5e\xb1\x4a\x66\x94\x68\xa5\xa2\x10\x66\xc7\x6a\x65\x67\xcc\x43\x3a\x67\x20\x02\x4c\x04\xb4\xbb\xe8\x86\x93\xc8\x23\x70\x93\xbd\x2a\xad\xa4\xcb\xbe\xea\xf5\x70\x23\x8e\xef\x99\x48\x27\x53\x96\x53\x6c\x70\xe1\x09\x64\xe5\xf5\x8d\xe2\xc6\x30\xc4\xbf\x66\x2a\xd7\x44\x8e\x7b\xde\x44\x42\xd4\x93\xd9\xab\xbd\xee\xfa\xd3\x3f\x82\xad\x4c\xfc\x0e\x6d\x0a\x5f\x75\xdb\x55\xf7\xfd\xd7\xec\x08\xbb\x3b\xc1\x60\xce\xa0\xe3\x8e\x58\x70\x42\x5a\x25\x62\x86\xf4\xdf\x6a\xd2\x6d\x9f\x9b\xa1\x17\x94\xd1\x9d\x9b\x61\xe7\x66\xe8\x62\xc4\x47\x73\x33\x44\x07\xb7\x17\xa6\x6e\x01\x62\xd7\x43\x8c\xff\xee\xfd\x0f\x15\xae\x43\x84\x65\x6c\x59\xde\x7b\x1e\xa4\xaa\xfb\xff\xf7\x07\x83\xfd\x7d\xef\x8f\x70\xfb\xa3\x34\xe3\xfe\x1f\x09\x13\x89\x4c\x91\xa9\xec\xf8\x4a\x1b\x50\x6a\x2b\x03\x3c\x9e\x4b\xee\x9f\x15\xc7\x10\x60\xec\x6e\x59\xa2\x43\x09\xe5\x73\x46\xde\x3c\xaa\x0a\x56\x29\x5e\x01\xbe\xca\x11\x30\xa0\xfc\x39\x0d\xac\xca\x61\xc9\x78\xce\x1d\xae\x9e\x15\x17\x4c\x1b\x4d\x0e\xf0\xc3\x41\x52\x94\x3d\x77\xc3\x20\x67\xb9\x54\xf3\x5e\xb8\xc9\x7e\x59\xfb\x95\xbb\xe3\x10\xb4\xb6\xa4\x54\x8a\x09\x93\xcd\x7f\xbb\xfa\x9b\x27\xf1\x16\xab\x6f\x81\x2b\xda\x94\x58\xac\xba\x16\xca\x2e\x02\xb0\x3d\x38\xea\x02\xb5\xe1\x1c\x72\xc5\x0e\xbd\xe0\x3e\x82\x4f\x99\x98\x91\x19\x55\x8d\x8b\x1d\x56\x5d\x8f\xa2\xb1\xa5\x7c\xc6\xb5\x6c\x5c\x2e\xb6\x72\xc8\x65\xef\x17\x77\x8d\x00\x64\x69\x8a\xd2\xb8\xd3\xc5\xef\x6d\x0f\x35\x17\xf6\xf4\x82\xe2\xfb\x6a\xaf\xc3\xc9\x15\xd4\x18\xa6\xc4\x6b\xf2\x5f\x07\x1f\x7f\xff\x6b\xff\xf0\xcf\x07\x07\x3f\xbf\xec\xff\xc7\xdf\x7e\x7f\xf0\x71\x00\xff\xf8\xe2\xf0\xcf\x87\xbf\xfa\x3f\x7e\x7f\x78\x78\x70\xf0\xf3\x0f\xef\xbe\xbf\xba\x38\xfd\x1b\x3f\xfc\xf5\x67\x51\xe6\xd7\xf8\xd7\xaf\x07\x3f\xb3\xd3\xbf\xad\x39\xc8\xe1\xe1\x9f\xff\xad\xc3\x97\xa0\x62\xfe\xbe\x33\x11\x8c\x57\xff\x51\xd4\x88\xfa\xd8\x1d\xb3\x2e\x21\x9f\xfa\x95\xf3\xba\xcf\x85\xe9\x4b\xd5\xc7\x87\xbc\x26\x46\x95\x5d\x89\xae\xea\xf8\x7b\x3c\x19\x53\x29\x31\x15\x72\xa3\x37\x6c\xb6\x50\x88\x60\xe6\xe8\xa3\x7b\x83\x5d\xbb\xd4\x9d\x23\x78\x9d\xeb\x51\x12\x8e\x1c\x32\xcc\x6f\x3c\xdb\x68\xe8\x3a\xf2\xee\x52\x8d\x96\xae\x5d\xaa\xd1\xf2\xb5\x4b\x35\x7a\xe0\xb5\x4b\x35\xda\x42\x1f\xe0\x2e\xd5\x68\xe7\x03\x7c\x22\x3e\xc0\x5d\xaa\xd1\xba\xd7\x2e\xd5\xa8\xf1\xf5\x34\x53\x8d\x9c\x02\x5f\xe5\x19\x6d\x6d\x9a\x91\x6b\xf0\x7f\x94\x24\xb2\x14\xe6\x4a\x5e\xb3\x96\x51\xd9\xb5\x0c\xcc\xa5\x67\x6e\xa7\xb5\xd9\x95\x4a\xd9\x81\x0a\xd8\x9d\xf2\x47\xcb\x94\x5b\x33\xb3\xe3\x6d\x70\xe4\x86\xf5\x76\xa6\x3d\x16\x45\xca\xd2\xf0\x3c\x2f\xac\x8c\x5d\xef\x01\x39\x22\x8a\x25\xbc\xe0\x56\xb4\x03\x98\x0e\x7c\x8e\xfb\x24\xf4\x03\xe6\x46\xb3\x6c\xec\x7a\xa2\x8a\xaa\x66\x58\x45\x26\xa4\x3b\x2b\x56\x3e\x06\xb5\x02\xe9\xdb\x58\x12\x3d\x95\x65\x96\x12\xc5\xfe\xe9\xd5\x09\x37\x9b\xab\x78\x84\xd8\x11\x0a\xaf\x52\x3d\xd6\x0d\x4e\x0b\xee\x50\xb7\xb6\x49\xc0\xb1\x4f\x05\x57\xb0\xd9\x86\x2c\x91\x22\xed\xda\xbd\x71\xba\x38\xbe\x5f\x6b\x17\xcd\x61\x29\x49\x4b\xbc\x01\x0a\x21\x69\xc6\x53\x6e\xe6\x21\x0b\x03\xb7\xbd\x55\x44\xb1\x0b\xad\x63\x04\x5d\x2d\x04\xa1\x45\xa1\x24\x4d\xa6\x4c\x47\x6f\x83\x6a\xa5\x03\x9b\x08\xf5\x95\x59\x39\xe1\x02\x35\x4b\xf8\x8d\x55\x43\xb2\x39\x51\xd2\xf8\x84\xb2\x5b\x1e\x78\x15\x0d\x06\x3f\x47\x5d\xc2\xa8\x39\x64\x9d\xc9\x78\x08\x9c\x15\x1f\xc7\x7f\x68\x22\xb3\xd4\xe3\x96\xfe\xf1\xa5\x55\xe5\x13\xc7\xc5\x56\xda\x03\xaa\xa4\x91\x24\xb3\x6a\x91\x3d\x01\x6e\xff\xf1\x97\x5f\x93\xa9\x2c\x95\x1e\xc4\x10\x02\xaf\xe0\x33\x74\x52\x78\x53\xc0\x90\x8c\x51\x6d\xc8\xab\x97\x24\xe7\xa2\xb4\x67\x79\x47\x8c\xd7\x95\xf6\x1a\xe9\xad\xdf\x7c\xdd\x72\xb4\x6e\x34\xd6\xe5\x0c\x16\xc7\xad\x05\xf6\x67\x73\x8a\xab\xdb\xe3\x08\x8a\x81\x3d\x1a\x17\xd4\x58\x77\x24\xc5\xab\x28\x8c\xdc\xf0\xce\xff\xa5\x94\xa3\xb9\x69\x0f\x03\xf3\x9f\x38\x4e\x1d\xff\xc5\x7f\xb8\x0e\x96\x6a\x05\xa5\xda\x60\x2a\x1b\xef\x16\x3d\xe1\xda\x34\xea\x15\x5d\xe1\xc6\x34\xf8\x71\xdb\xc3\x7c\x62\x2d\xde\x4e\x8a\xd6\xc1\x76\xf6\xb6\x9a\x77\x2a\x27\x09\xd3\x20\x8a\x3c\x7c\x1a\xf8\x67\xf1\xa9\x0d\x1f\xba\x5d\x88\x2d\x77\x22\xb2\x78\xe6\xef\xa0\x33\x66\x2b\x62\xb5\xd1\xed\x3d\x63\x77\x44\x2d\x1c\xac\x2e\x23\x34\x17\x13\x6c\x64\x99\x97\x99\xe1\x45\x56\x51\x2e\xfc\xc0\x1d\xc0\xb1\xc3\x9f\x46\x1e\x66\x8a\xc0\x51\x08\x0d\x0e\xc1\x91\x83\x30\x16\x13\x06\xfb\x31\x2a\x7b\x8e\x17\x54\xd1\x40\xfe\x44\xe6\x39\xd5\x87\x2e\x76\x40\x21\x77\x05\x25\xbb\x3d\x86\x15\xcd\xc2\xeb\xc7\xb9\x02\x9b\x62\x5c\xc3\x04\x15\x8d\x83\x76\x75\x87\x0b\x0c\x45\xe4\x4d\x48\x8f\xc7\xfe\xe9\x0b\x1c\xeb\x14\xe2\xef\x68\x72\xcd\x44\x4a\x3e\x68\x4f\xb8\x74\x2e\x68\xee\xc0\xd5\x0b\x25\xb1\x6f\x37\x4b\x17\x7e\xaf\x7b\xce\x91\x88\x28\x23\x1e\x04\x0a\xf5\xad\x4d\x51\xb1\xd4\x1d\xa1\xeb\x7e\xd0\x56\xf9\xba\x5b\xde\x69\x74\xd2\x2a\x3e\x4b\x98\xd7\x1d\xed\x04\x36\xf5\xf2\xb3\xc6\x88\x6f\x64\x35\x0e\x93\x6b\x9a\x89\xbb\x10\x8e\xf4\x10\x7c\x04\x1c\x75\x9a\x59\x11\x37\x0f\xf0\x3a\x0b\x0c\x36\x9a\x6f\xae\x65\xbf\x1a\xb5\x07\x68\xda\xbf\xfc\xee\xa4\x2e\xcc\x2e\x69\x2a\x35\xf9\x2e\x93\xc9\x35\x39\x61\x60\x34\x3c\x66\xbb\x77\x35\x4a\x9f\x76\x9b\xc6\x9c\x4e\x9a\xe5\x79\xf4\x49\x2e\x05\x37\x52\x35\x91\xc7\x5b\x04\xb6\xb7\x6b\xb5\xb7\x1a\x44\x5c\x8d\xd2\x67\xd3\x68\xcf\x32\x79\x47\x1d\x76\xa7\x8c\x28\x10\x31\x30\xa8\xef\xfe\xd1\x50\x60\xfc\x6e\x2a\x6f\xfa\x46\xf6\x4b\xcd\xfa\xbc\x71\x9e\x52\x6b\xfa\x5c\xb3\x39\x24\x7d\x75\x42\xa1\x1f\x70\xb0\x9a\x89\x6e\x24\x78\xce\xe1\x73\xab\xc8\x5d\x7e\x77\x62\x4f\xef\x41\x6c\x96\xbc\x60\x26\x79\x91\xb0\x62\xfa\xc2\x4d\xe7\xc9\x93\xd5\xcb\xc7\x6e\xe8\x7a\x44\x12\x99\x65\x0e\xb7\x4b\x8e\xc9\x31\x2b\xa6\xe1\x11\xdb\x41\xab\xa7\xdc\x2c\xad\x90\xb2\x9b\xc6\x4a\x91\x88\xb0\x63\x3a\x09\x11\x31\xba\x1a\x3d\xac\x17\xf4\x36\xb2\xf6\x67\xec\x49\xd2\xa4\xb7\xdc\x56\x90\x77\x7b\x7a\xd4\xed\x0f\xfd\x70\xe0\xff\x89\xc2\xcd\xf5\x96\x74\x3e\x5f\xb4\x26\xa2\xcf\xc6\x68\x61\xa6\x2c\x25\x72\xc6\x94\xe2\x29\xd3\x24\xc8\xe8\xd8\xb1\xc4\xb3\xed\xa0\xfc\xae\x3b\xde\xd3\xca\x0f\xd8\x1e\x9f\x42\x24\xbc\xed\x98\xcb\xc2\x9b\xa6\x39\x17\xdb\xc1\xe5\x0d\xe9\xa5\x13\x9a\xb1\xb3\xf7\xad\x4d\xef\x21\x8e\x53\xb7\xbe\xfd\x87\x11\xc8\xfe\x3d\xc0\xf3\x3f\x04\x9e\x25\x42\xa6\xcd\xa2\x61\x1b\xb6\xa1\x27\xd4\xb0\x9b\x86\x8a\x4f\xbf\x12\xf5\x4d\x7f\x0f\x96\xd7\xd3\xb6\xc1\x37\xd4\x20\x23\xda\xd7\x88\x7a\xbf\x29\x75\xca\x71\x50\x37\xae\x65\x4f\x8a\x85\xfe\x62\x7e\x6b\x1e\x5d\x9c\x91\xef\xf1\x79\x9b\xeb\xf8\xa1\xa4\x41\x4b\xe6\x44\xe6\x94\x77\xd4\x88\x3d\x6a\xe8\x14\xbf\xf0\x45\x78\x18\xc1\xa7\xc5\x5d\xe8\xc7\x7c\x52\x2a\x96\x12\xe7\xfd\xd8\xb5\x31\xd8\xe2\x36\x06\xdd\x2a\xc5\x95\x4e\x1c\x79\xcc\x7d\x65\x4c\xa5\x07\x7b\x2e\x02\x75\x20\xa4\x20\x11\xcd\x84\xe6\x90\x75\x10\x25\xc6\x81\xb2\x0c\xf9\xdf\xa1\x0c\x06\x15\xe7\x1e\x79\x2b\x27\x5c\x78\xe9\x24\x5d\xb2\xcb\x98\xf2\xac\x1d\x39\x77\x9a\xee\x6f\x4c\xd3\xd5\x3a\x3b\x15\x74\x94\x35\xcf\x64\xac\x1f\xbc\x19\x85\x3c\x29\x06\x63\xbe\x48\xb9\xb6\xff\x25\xc3\xe1\x5b\x88\xcd\x96\xc2\x5b\x86\x10\x75\x74\xc7\x46\xa8\x2f\x46\xe1\xb2\x39\x79\x80\x32\xbb\xb3\x3e\x15\x67\x22\xb5\xaf\xcb\x74\x2d\x01\xd8\x3d\x05\xbb\x80\x84\xea\x35\xcc\x3e\x1c\x31\x72\x35\xe5\xc9\xf5\x45\x14\x82\x95\xca\x7e\x26\xa2\x8f\x6a\x8a\xc6\xe2\x77\x9b\x3a\x70\xdc\x6b\x5d\x74\xe5\xf6\xba\x8a\x4e\xdc\xa1\x23\x99\x1d\x9c\x50\xad\x65\xc2\xab\x98\x3f\x38\x85\xab\x23\x39\x85\x23\x79\x73\x64\x00\x2d\xf1\x51\xf4\x0f\xcf\x38\x4e\x69\xa5\x3a\xd6\x37\xb8\xf0\xd4\xda\xd8\xab\x23\x2b\x77\xd6\x5d\xf3\xaa\xd6\x4f\xd3\x5b\x7d\x0b\xe1\x67\x5f\x0f\xea\x18\xc5\xeb\xf3\xae\x81\xf3\x32\xab\x84\xbe\x9a\xae\xbf\xc7\x46\x88\xd5\xbc\x58\x7b\x95\x17\x6e\x21\xf7\x06\x3f\x73\x01\x69\x10\x2a\x85\x2c\xca\x0c\xb3\x56\xdb\xb7\x15\xf5\xd1\x3c\x7c\xce\x06\x02\xd4\xdb\xd6\x8c\xe8\xa1\xe5\x7c\xcf\xa3\x2f\x51\x64\x10\xbc\xfc\xe6\xeb\xaf\x9f\x7a\xa7\xa2\x76\x8e\xb3\x4d\xb7\x2a\x6a\x15\xea\xda\xa1\x14\xec\x50\x0a\xee\xba\x36\x1e\x89\xfd\xfc\x38\x04\x9d\x14\x89\x75\x51\x20\xd6\x16\x69\xa0\x65\x71\x59\x37\x85\x65\xad\xb1\x04\x1e\x15\x41\xa0\xa3\x1a\xab\xf6\x68\x01\x3b\x8c\x80\xdf\x06\x46\x40\x77\xb5\x55\x5d\xe1\x01\xb4\xaf\xa9\x7a\xfe\xb5\xff\xad\xc5\x44\xdb\x0a\xf3\x87\xd7\x95\x77\xd5\xbf\xa2\x2b\x3f\x7b\x67\x8e\x81\x9a\x57\xd7\xd9\xbb\x9e\x33\x30\xf3\xba\x42\x7c\x37\xd2\x0a\x8d\x0d\x5a\xbb\xa4\xb5\xb3\x00\xa7\x22\x1b\x9d\xc1\x75\xae\xc1\x91\xde\x0f\x17\x42\xec\xe1\xe3\xed\x8f\xac\xef\x42\xcc\xbb\x36\xea\xbb\xf8\x63\xb8\x6e\x89\x3f\xea\x1a\xc6\xab\xf7\x08\x82\x24\x04\x15\x4c\x8e\xe2\x3e\x2a\xd5\xfe\x3f\xba\x38\x23\x89\x62\x00\x69\x40\x33\x3d\x20\x2b\x34\x34\x1f\xa9\x71\x1a\x9d\xd7\xcc\xa8\x31\x2c\x2f\x4c\x5b\x86\xdb\x85\x1f\x7f\x63\xe1\xc7\x8e\x63\x06\x3f\x86\xe1\xbc\xb7\x68\x5a\xe6\x54\xf4\xad\xb4\x80\x40\x64\x2d\x9f\x63\xe1\xe0\x1b\x10\x5f\x03\x87\xd4\xa4\x8a\x21\xb8\x79\x29\xf8\x2f\x25\xab\xfc\x0b\x41\xbd\xd8\x82\x50\x0b\xcc\xa3\x63\xda\xa1\xea\xb4\x20\x45\x12\xb9\x54\xca\xe4\x08\x12\xe8\xe8\x05\x46\xa4\x7f\xd5\x7c\x65\x66\xca\x50\x4d\xbb\x00\x70\x80\xea\xae\xba\x7d\x87\x06\x1e\xcd\x32\x79\x83\xcf\x8e\x15\x0f\xbb\x7e\x76\x2e\x0e\x8f\x63\xc4\x48\xce\x95\x92\xca\x85\x78\xe2\xe9\x60\x5a\x8e\xb5\x13\x99\x42\x83\x4b\xb9\xac\x8a\x21\x33\x31\xab\x18\x49\xa8\xc0\xc2\x45\xfb\x6f\x9f\x94\x8c\xfd\xcf\x9c\xbc\x1b\xb1\x29\x9d\x71\x59\x2a\xfc\xb5\x91\x64\xcf\x7d\x05\x47\xee\x5c\x96\xc1\xcd\x5d\x42\x9d\x52\x78\x3b\xbd\x82\x4e\xe7\xd5\x97\x60\xa0\xa6\xd2\xfb\x0f\xfb\xec\x13\xd7\x66\xf9\x5d\x3c\x89\x7c\x83\x84\x4d\x70\xde\x4c\x17\xf6\x80\xfd\xb1\x71\xcd\x69\x9d\xdf\xe2\xd1\xea\x2a\xe9\x6c\x08\x5f\xdd\xa7\x90\x3a\xa4\x16\x2c\x15\xf7\x45\x61\x4f\x2f\xdd\x13\xdf\xb2\x61\x67\xa6\x9d\x46\xfc\x54\x34\xe2\x90\x20\x91\xf1\x64\x7e\x76\xd2\x8d\xce\x17\x12\x23\xec\xa0\xe4\x3b\xaa\x59\x4a\xde\x51\x41\x27\xe8\x1c\x39\x18\x5e\x7c\xf7\xee\xd0\x32\x09\x38\x5f\xce\x4e\x56\x66\x4f\x0c\xe3\x99\x9d\x6f\xaa\x7c\x9b\x2c\xd2\xa8\x33\xad\xe0\x81\x54\xda\x58\x01\x3b\x09\x27\x7b\x9b\x96\x5d\xcb\xe0\x46\x98\x0e\xe1\x91\xca\xf4\xa2\x78\x9d\xe5\xe9\xf5\x63\xbe\x6e\xe4\xab\xbe\xeb\x9d\xd6\x0b\x34\xad\x11\x4c\x5a\x58\x7b\x45\x0d\x9b\xcc\x4f\x58\x91\xc9\xb9\x5d\xee\x8b\xc8\x75\x8e\xb7\x8e\xf0\xa8\x57\x23\x9a\x10\x55\x66\x0c\xbb\xd7\x2c\x42\x84\x09\xc6\xd2\x4a\x4e\x71\xa1\x0d\x05\x80\x30\x1c\xff\xce\x19\xad\x7d\xc0\xac\x7b\x94\xf4\x71\x9e\xf7\xde\x55\x87\x53\xb4\x1b\xea\xce\x9f\xac\x7f\x98\xc0\xe3\xef\xe7\xd0\x87\x04\x0f\xd7\x0e\x13\xd6\x19\x1c\xf6\xf4\x65\x99\xd9\xa3\x23\x4b\x17\x9a\x88\x82\x6e\xe5\xd6\x18\x91\x19\x40\x02\xd8\xd9\xf7\xc8\xa8\xb4\x8a\x17\xd3\x35\xff\xf2\x32\x2c\xe5\xcd\x14\xe3\xc6\xf6\x47\x84\x16\x45\xc6\x31\xaf\x57\x2a\x17\xfc\x8d\xbc\x8d\xcb\xb7\xad\x23\x48\x1e\xa8\x7f\x3c\x4c\xdf\xe8\x93\x19\x53\xa3\x75\x30\x15\x1e\xaa\x4a\xd0\x82\x43\xec\x64\x6d\xcd\xa3\x0e\x0a\x79\x71\x86\xbf\xf6\x96\x5a\x6c\x9a\xf9\x2f\x71\x05\xdd\xda\x78\x40\x41\xd7\x95\x06\xad\x8d\x80\x0a\x74\x74\x71\x86\x30\x54\x0e\x18\xa8\x72\x59\x58\xdd\x9e\x62\x72\x60\x85\x46\x48\x27\x76\x44\x43\xa4\x08\x0f\x65\xa2\xcc\x19\x82\x09\x55\xed\xac\xac\xc1\x27\xe6\xd5\xe8\x95\xc7\xc3\xda\x27\xeb\xab\x13\x0f\x0f\xa3\x3f\x30\x6c\xfe\xe0\x93\x47\x48\x71\xe9\x5e\xf3\xc3\xe5\xdb\x66\x8b\x78\x5e\x1f\xc3\x81\xc7\x30\xc0\xc9\x2b\xa8\x32\x9c\x66\xa4\x54\x99\x0f\xc3\x61\xd2\xbb\x4b\x4b\x9b\xd2\x59\x04\xb0\x33\x20\xe4\x0b\x5c\x39\x47\x58\xdc\x9f\xd8\xde\x15\x57\x7e\x5c\x66\x59\x8f\x8c\xb9\xa0\x56\xec\xb2\x82\xc4\xe1\xa0\x21\x17\x89\x35\xbf\xac\xad\xef\xfa\xb5\xc0\x8c\xbc\x51\x16\x36\x29\x44\x19\x21\x5a\xca\xb2\x14\x40\x17\xe1\x11\x76\xc3\x26\xe0\x22\xb0\x56\xe3\x71\x56\x6a\xc3\xd4\xa5\xb4\x87\x41\x94\xd7\x02\x70\x14\x34\xfe\xfa\x3b\x2e\x52\x48\x61\xba\x84\x83\x23\xa1\x82\x30\x0e\xce\x17\x3b\x24\xc4\xa9\x2d\xef\x54\x0c\x75\xa0\xcb\x64\x6a\x5f\x69\xaf\x90\xa9\xde\xb3\x62\x64\x0f\x5d\x74\x7a\xef\xd0\xfe\xb5\xf8\x0e\x98\xa6\x12\xfd\xee\x05\x2d\xf8\xde\x61\x8f\x00\x81\x20\x70\x26\xcd\xf4\xe9\xf2\xa1\x7f\x57\xb0\x89\x1b\x71\xe1\x65\x3c\x02\xf0\xa0\xa8\xba\x7f\xdd\x4c\xb9\x61\xa1\xf9\x36\x7a\x76\x02\xbe\xca\xa2\xb0\x26\xe4\x48\x10\x96\x17\x06\xbc\xc5\x24\x67\xd4\x87\x90\xd9\x8c\xa9\xb9\xb5\xc9\x01\x88\xe2\xc9\x6f\xfe\xc0\x8f\xad\x08\xbe\xd0\xd9\xbc\x62\x72\xd8\x61\xcb\xc4\xf5\xbf\x3b\xca\xb2\x9a\xc1\x0f\x7f\x7a\xb1\xfe\x64\x69\x0a\xe7\x6c\x23\x7a\xfe\x68\x7f\x59\xa7\x25\x7e\x84\x62\x33\x08\x92\xb7\x6f\x5d\x44\x03\x69\xf5\x03\x17\x29\xea\xaa\x47\xc6\x28\x3e\x2a\x0d\xbb\x64\x76\xc2\x09\xe6\x3e\xf8\x76\x7c\x2e\x4d\xda\x2d\xc9\x80\xc0\xe0\x2b\xd6\xe0\xda\x8e\xf7\x14\xe9\xbf\xac\xe6\xae\xab\x9a\xde\x31\xbc\xd7\xec\x6f\x1b\xea\xce\x01\x9c\x79\xf0\x4e\xa6\xab\xb7\xd8\x42\x9d\x48\x75\xb3\x53\x5c\xa2\x3e\x97\x7e\x2c\xa7\xd2\xce\x8b\x95\x7a\xff\xdd\xcb\x71\x07\xe9\x6f\x9b\x49\xe5\x29\x00\x79\x1a\x7d\x73\x35\x2f\x98\xc3\xdd\x26\xe3\x8c\x4e\x2a\x36\x02\xe9\x88\xca\xd4\xf1\xf0\x47\xff\x0a\x9a\xf0\xd5\x6a\xed\xbd\x7a\xef\x7d\x9a\x6e\xbf\xa2\xd2\xad\x77\xd8\x87\xac\xfc\xf2\x7e\x75\x37\x0c\x7e\x3b\x37\xad\x13\x04\x34\x77\x3a\xd8\x6e\xa3\xff\x95\xc3\xfb\xa2\x11\x27\x78\x38\x31\x6f\x7c\x42\x5e\x12\xe8\x2b\xc3\x1f\x6b\x6c\x72\xcf\x7c\x6f\x61\xda\x6b\x36\xbf\x91\x6a\x35\x36\x78\x63\xfe\xba\xf3\x89\xd8\xab\xff\xde\x0d\xf2\x8e\x16\xf6\xb5\xab\xac\x4f\x94\x7a\x2e\x06\x89\x36\x02\xe6\x6b\xf9\x1c\x39\xa9\x26\x54\xf0\x7f\x61\xaa\x6c\x62\xf7\xb1\x54\xf6\xcf\x03\x8c\x63\xa0\x7d\x9f\xb1\xc4\x1c\x3a\xfe\x5b\x29\xf7\xee\x61\x50\x9a\xa6\x1c\xb5\x8c\x8b\x7b\x78\xe9\x6e\x22\x70\x71\xfd\x18\x34\xbf\x63\x63\xdd\xcf\xfb\x77\x07\x42\xd7\x90\xcd\xa5\xba\x23\xd7\xe9\xce\xdf\xe7\x94\xbb\xfe\xae\x5b\x47\x15\x96\x53\xde\xf4\xb5\xf0\x6a\x41\xd7\x9c\x9a\x52\x71\xb3\xf2\x40\xba\xfb\x87\x5c\xfc\x50\x8e\x98\x8b\xfd\x3e\xf8\xe7\x02\x52\xf9\x8e\x2e\xce\xba\x5d\x8e\x65\xb0\x69\x37\x41\xab\xd6\x90\x52\xd0\x7c\xc4\x27\xa5\x2c\x75\x36\x8f\x9d\x97\x14\xd4\x14\x6b\xfc\xa3\xf7\x46\xec\x1b\x42\x85\x14\xf3\xdc\xdd\x2a\x92\xac\x4c\x59\x6d\x44\x88\xf0\xcd\x24\x4f\x09\x2d\x8d\xcc\xa9\xe1\x09\x49\x24\x7e\x57\x1f\xa9\xd4\x8c\xd0\x5b\x7e\x9b\x94\xda\xc8\x9c\xe4\x54\xe9\x29\xcd\xb2\xdb\xd6\xb8\x83\x53\xed\x2e\x38\xed\x3e\xbc\xff\xad\x5f\xce\x70\xd6\x0d\xf9\xfb\x1e\xf4\xf0\x35\xf8\xdb\x4e\xae\xd5\x00\xb3\xdb\xb9\x74\x8d\x31\x5c\x81\xfc\x4a\xf0\x9e\x7b\x16\xe6\x3e\xea\xdc\xb5\x73\xef\x7d\xaf\x3b\xa4\xe1\x9d\xbf\x55\xac\xc8\xe8\x2d\x66\xda\x1d\xd5\x92\x56\x1f\x00\x85\x5f\x0a\x16\xc6\x18\x90\x21\x7a\x5e\x72\x6a\x12\x8c\xfc\xfc\x23\x67\x86\xa6\xd4\xd0\x81\x55\x9a\xff\x51\xaf\xe7\x91\x59\x6a\x07\xba\xfd\x60\xbc\x65\xce\x78\xb0\xae\xee\x61\x5d\x9b\xf3\x5b\x7b\xfa\x87\xdb\x41\x91\x81\xc4\xe1\xd8\x01\xd7\xe0\x58\xbe\x6f\x21\xe1\xf5\x4f\x3f\x59\x9d\xf5\xce\xa0\x44\x6d\xae\x8b\x3f\xaa\x5b\x6b\x59\xfd\x4d\xdc\x0e\xcf\x19\xc0\xc9\x5d\xb9\x36\x28\xfe\x13\xf0\x49\x1d\x9d\x9f\xdc\xee\x3f\xb8\xdf\xb6\xba\xc7\x96\xaa\x7b\x5a\xef\x98\x9e\xf7\xd8\xb9\x6f\xea\xee\x56\x9f\xd3\x0f\x65\x4f\x98\x21\x4f\x3d\xe6\x84\xbf\x19\x17\xac\x5e\xb0\x85\xbf\xbb\xdd\x90\x5c\xcb\xdf\xbd\x8e\x97\xfb\xbe\xfa\x98\x7e\x98\xec\xad\x37\xad\xe7\xf4\xbe\xb7\x86\xa5\x46\x70\x57\x24\x06\x35\x69\x40\x79\xc8\x74\xf7\x3e\xa7\x40\xec\x75\x83\x04\x6b\x1a\xc2\xfe\x55\x1f\x30\xd1\xb0\x94\xb5\xec\x8b\x6b\x36\xdf\xd7\x2e\x85\x5f\x0a\x3d\xe5\x05\x16\x59\x39\xbf\xae\x5b\x5d\xf2\x23\xcd\x78\x1a\x86\x40\xae\x3e\x13\x3d\x72\x2e\x8d\xfd\xcf\xe9\x27\xae\x0d\xea\xe9\x27\x92\xe9\x73\x69\xe0\x93\x4e\x5e\x15\xa7\xf0\x80\x17\x75\x96\x02\xba\x06\x61\x5f\x45\xf6\x84\x7f\xa1\x33\x27\xf6\x3c\x51\xb8\x26\x67\x82\x48\xe5\xdf\x28\x14\x1f\x6a\x37\x84\xcf\xaf\x17\x52\xf4\xc1\x69\xb8\x72\x0c\x47\x08\xa9\x6a\x74\xb8\x63\x38\x37\x14\x66\x41\xc1\x37\x5c\x7b\x21\x0e\x6d\x94\xa0\x41\x82\xf7\x4f\xf0\x84\xe4\x4c\x4d\xc0\x0d\x9e\xdc\xe3\x06\x5e\xd7\x67\xb3\x96\xa7\xe6\xde\xb5\x02\x91\xf9\xf6\x56\x0b\x6f\x69\x91\xa2\xfb\x51\x2c\xe5\x68\xf6\xfd\xb7\x95\x3e\x40\xa9\xff\x81\x0a\x54\x3d\x20\x47\xbe\xc7\x44\xfc\x9d\x0b\x07\xc4\xc3\xd8\x11\xb8\x26\x56\x94\xcc\x68\xc6\x10\x70\x9b\x8a\x50\x3c\x22\xc7\x4b\x82\xbd\xe7\x2a\x51\xed\x9e\x0d\x31\x82\xbd\x6b\x36\xdf\xeb\x2d\x2d\xed\xde\x99\xd8\xab\x2a\x87\x6a\x8b\x19\x84\x28\x84\x17\xf6\xe0\xbb\xbd\xe6\x67\xc1\x9d\xc2\x72\x7d\x3b\xf4\xde\x75\xbb\x43\xfb\xaa\xad\xd5\x7b\x47\x05\xaf\x24\xc3\x7a\xdd\x28\x5a\x14\x4c\x11\xaa\x64\x09\x06\x76\x3e\x63\x6a\xe0\x6f\xc1\x60\x69\xf0\x09\x25\x52\x29\x96\x18\xaf\x4e\xbb\x7c\x3e\x2c\x35\x13\x29\xd4\x91\x3d\x58\xf3\xb8\x61\xa3\xa9\x94\xd7\x50\xef\x02\x14\x79\x44\x8b\xe5\x27\x7c\xd6\x49\xf5\x99\x57\x3e\x35\x49\x99\xa1\x3c\x83\x28\xf1\xfb\xb7\xef\x5c\x1c\xd9\x1f\x68\x7e\x96\xab\x43\xb2\x1d\x58\x0f\x34\x75\xf9\x0d\x97\x6c\xc6\xd9\x8d\xa3\xff\x6d\x11\xe0\x3e\x99\x30\x01\x61\xcf\x3b\xd2\x03\xfa\x44\xf3\x94\x9d\x42\x19\xdd\xed\x03\xb5\x70\xb5\xdd\x32\xe7\xfb\xb8\xf8\x6e\x51\x76\xaf\x18\x5b\xe3\xb8\xf1\x3e\x74\x75\x21\xd5\x1d\x90\x1d\xeb\x55\xf5\xad\x57\xb1\xe7\xf2\x4a\x5f\x93\xaf\xbf\xfe\xea\xd6\x9b\x72\xfa\x89\xe7\x65\xfe\x9a\x7c\xf3\xef\xff\xfe\xd5\xbf\xdf\x7e\x1b\x17\x78\xdb\xab\xdb\xdf\xcf\xed\xf9\xe3\xcb\x93\x2d\xa0\x77\x1a\xf2\x74\xee\x76\xe3\xaf\x31\xd4\x98\xf2\xac\x54\x2e\x99\xac\xd5\x48\xf1\x0e\x69\x35\x10\x1c\x36\xf7\x4d\x68\xc1\xf5\x19\x7e\x01\x1e\xe1\x7a\x56\xb6\x77\x08\xa3\x45\x87\xd9\x2d\x6d\xe6\x87\x72\x67\x78\x87\x01\xb7\x62\x8a\x4b\xf6\x05\x9a\x46\xf0\xd9\x2f\x25\x53\x73\xc8\xa8\xae\x14\xc8\x28\x83\xe3\xaa\x2a\xb8\xf5\x6f\xe1\x4e\x6e\x84\x38\x58\xb0\xb9\xaa\xc3\xb2\x8a\xd3\x2e\x3c\x1b\x7e\xc3\x30\x9e\xe5\x3d\xbb\xe4\x88\x88\x32\xcb\x6e\xbb\x55\xc8\xbb\x7c\xc0\x31\xed\xee\x31\x59\xd6\xb3\x25\xd6\x35\x3f\x57\x50\xfa\xb3\x1a\xa1\xf1\x8b\x77\xa4\x32\x6e\xb7\x59\x1a\xbf\xf0\x5a\xc9\x58\xeb\x27\x62\xad\x07\xe4\xb0\x86\xb9\x8a\xd7\x43\x32\xb5\xd6\x84\x5f\x78\x4c\x03\x16\xaf\x07\xc5\xd3\xd7\x33\x66\x57\x4c\x7d\xeb\x4c\xda\x06\x2f\xbf\x8e\x79\xbb\xe2\xd5\x77\x46\xee\x12\xc1\xd7\x4d\x4f\x78\x40\x6a\xc2\x9a\x2b\xb9\x86\xf1\x8b\xd7\xce\x04\x7e\xd0\x49\xb4\x86\x60\x7e\x98\x39\xbc\xf6\xaa\x2a\xc6\xc5\x4c\x22\x7c\xe9\x83\x54\xb8\xcb\xa5\x1f\x2e\x68\x72\x37\x20\x59\x9d\x2a\xe7\x52\x94\xa1\x99\x86\x37\x8a\x88\xb5\x17\x49\xa9\xef\x77\xaa\xde\xfd\x06\x77\x27\x6d\x77\xa2\xe2\xd7\xdf\xbc\xcc\xd8\x4f\xdc\x4c\xdf\x7b\x98\x62\xc7\xd5\xa6\x2c\x32\x78\xd9\xe8\x0b\xcb\x42\x97\x95\x66\x78\x86\xad\x6d\x58\x22\xf3\x1c\x9b\xc5\x03\x72\xc8\x35\x23\x55\x87\x34\xab\xe3\x81\x16\x0c\xc3\xb1\x4f\x05\x15\x95\x9e\x08\x2d\xc6\xef\xe2\xa8\x35\xf9\x69\xdd\xb3\x76\xed\x6c\xe8\xbb\xb3\xa0\xa3\x34\xe6\x5a\xb6\x33\x19\xb1\x4c\x82\x8f\x64\x40\xf6\xbf\xd8\x77\x49\x88\xee\x56\x10\xc9\xee\x53\x77\xea\x39\x48\x34\x26\x26\x15\x00\x8b\xce\xa0\x7b\xa1\x93\xc0\x52\xb0\x01\xb9\x74\x2a\xcc\x7a\x5a\xd1\x3a\xe2\x74\x4d\x51\xba\xf6\x81\x58\x15\x2d\x3f\x98\xb2\xfe\x77\x31\x6d\x67\xfe\xb3\x75\xa8\xeb\x6f\x7e\xce\xf4\x0d\x10\xe2\x0f\x23\x6f\x7d\x4b\x57\xa7\x42\xa0\xed\x82\xf0\x4a\xb0\x37\x26\x78\xc2\xfa\xe4\xf8\xf2\xf4\xe8\xea\xb4\x47\x3e\x5c\x9c\xc0\x7f\x4f\x4e\xdf\x9e\xda\xff\x1e\xbf\x3f\x3f\x3f\x3d\xbe\xb2\x7a\xc4\x17\x08\x90\x6c\xcd\x38\x4b\x5d\x7b\x1e\xc9\xba\xb4\xa0\x62\x4e\xc6\xa5\xb1\xe2\xa0\x7a\x58\x6d\x16\x56\x46\xc0\xb7\xa9\x35\x19\x9f\xef\x1a\xae\x9d\xcd\x5b\x5b\xc2\xbd\x86\x69\xbc\x1f\x05\x79\x23\x15\x71\xfd\x69\x5e\x93\xfd\x42\xa6\x7a\xdf\x25\x4b\xdb\x7f\x0f\xf0\xa3\x17\x99\x9c\xec\x87\x1c\x6a\x46\x32\x39\x21\xba\x1c\x85\xdc\x76\x38\xec\xe0\xee\x2f\xfc\x6d\xb5\x4c\xe0\x5e\x48\x70\x8f\x7e\x15\x06\xaf\xfd\x26\xbe\x21\x1e\xf7\x05\x34\xa7\xa9\xdd\x69\x3f\x58\x1c\xf0\x8b\x17\xab\x67\xe0\xf5\x1a\xae\x16\x7e\xf1\x51\x58\x6e\xba\xe1\x59\x9a\x50\x95\x2e\xb1\x14\x9c\x3d\x98\xaf\x09\xd4\x43\xbc\x47\xec\xed\x59\x0d\xee\x8a\xbe\xe5\x8c\xa9\x8c\x16\x98\x51\x09\x80\x9b\x00\xde\x00\x0f\x39\x61\x05\x83\xfa\x02\xdf\x6d\x96\x89\x24\x93\x50\x5f\x8e\x07\x57\xaf\xfe\xea\x88\x8a\xe6\xc1\xb4\x5c\x92\x7a\xc5\xc0\x7b\x5b\xcb\xc1\x90\x96\xf7\x20\xee\xc5\x44\xbe\x5b\x41\x0a\x42\xb2\x33\xda\x74\x41\x31\x65\x64\xcf\x55\x6f\xec\xf5\xc8\x5e\xa8\xc3\x4f\x9d\x12\xbb\xf7\xc5\x5e\x75\x43\x9c\xff\x0f\x3a\x6c\x82\x5f\xf4\xe1\x39\x71\x95\x10\x2c\xb0\x4f\xab\x08\x8f\xae\xb0\x14\xec\xc9\xe3\x7c\x4c\x30\x87\xfa\x40\x83\xda\x44\x96\x9e\x5a\x95\xae\xdc\xfb\x44\x3b\xfd\xe8\xe7\x06\xca\x3c\xb1\x04\xc6\x11\x47\x45\x09\xe2\x03\x32\xac\x31\x4f\x48\x0b\x89\xc1\x1e\xb8\x22\x05\x55\xd6\x52\xf0\x77\xd6\xfb\xdc\x7c\x71\x6f\x97\x9b\x35\x98\x20\x8a\x2e\xb4\xf2\xaf\x1a\xaa\x26\xcc\xdc\xed\xaa\xa7\x62\xfe\xfe\x4e\xc4\x9d\xfe\xda\x18\x7d\xfd\xf5\x18\xfc\x53\xbf\xc2\x77\xe9\x73\x61\xfa\x52\xf5\xf1\x27\xaf\x89\x51\xe5\x6d\x41\x17\xc3\x73\x26\x4b\x33\x64\x89\x14\xab\x93\x72\xdd\x7d\x9d\xc5\x1e\x1e\x90\xa9\xec\xc2\x5f\x47\xfe\xe0\xf5\xe9\xca\xb1\x57\xba\x3a\x95\x7d\xc8\xab\x5e\xef\xff\xfe\xed\xbb\x36\x8b\x4d\xa0\x62\xef\xee\x95\xfc\xd1\x49\x62\x31\x09\x33\x75\x33\xbf\xf3\x67\xef\x4a\xf3\xf0\x1f\x1d\x87\x50\xca\xdd\x77\x3b\x62\xdc\x5d\xe3\x7d\xeb\xfb\x6b\x43\x4d\xb9\xc4\x0d\xb5\xb5\x71\xf2\x6b\x88\x55\x11\x4e\x0b\x1e\xc2\xef\x62\xb7\xd8\x72\xa9\x2b\x42\x26\xc2\x7d\x90\x46\x56\xc8\x74\x40\xdc\x0f\x73\x3a\x27\x46\x51\x8e\x26\x17\x4d\x4c\x09\x65\x78\xd4\xb8\x94\x33\x87\xd4\xf0\xbf\x56\xbd\xc6\x4a\x23\xeb\x2e\xc3\x2a\x61\xca\xe8\xb7\x54\x9b\x0f\x45\x4a\x6f\x49\xc0\x5f\x48\x25\xd3\x06\x36\x0c\xaa\xa2\x37\x82\xa5\x56\xe8\x3a\x12\xe0\x78\xe4\xc6\x4a\xc3\x12\x47\x7c\x68\x68\xb9\xda\x40\xf6\xe7\x7d\xfb\xa8\xd5\xb3\xbe\x94\x96\x26\x47\x2b\x05\x50\x3d\x63\xef\xbe\xd9\x5a\x09\xaf\x60\x34\x22\xd8\xa7\x55\x36\x6a\xfb\x19\x4b\x91\xde\x1e\x28\xaf\x53\xd8\x69\x87\xd5\x4f\x7a\x84\x92\x29\xd7\x46\x2a\xe7\x68\x84\x1e\x03\x8a\x42\x23\xa3\xd5\x01\xe7\x6e\x42\xef\xc7\x61\x0a\x56\x2f\x65\x34\x60\x92\x3b\xde\x05\x50\x71\xc5\x12\xa9\xd2\x95\x13\xf3\xca\xd4\xca\x7d\xd2\x2c\x2a\x7f\xbf\x97\x20\xa3\xda\x5c\x85\x39\xd8\xc5\x5f\x53\xd2\xd6\x59\xdb\xbd\x62\xf5\x36\xbe\x2a\x55\x8a\xea\x4b\x49\xa8\x40\x25\xb2\x9d\x7c\xbd\x9f\x81\xaa\x77\xc3\x9d\xda\xe8\xbd\x6e\xc2\xae\x8c\x5e\xf1\xf3\xcc\x3c\x67\x5a\xdf\xd9\xcb\x7d\x21\x64\x05\x70\x62\x24\xc0\x89\xb9\x9f\x13\x8e\x9d\x7e\xac\x5e\xee\x73\x3f\x3c\x78\xc0\xfc\x76\x56\xb3\xe7\xa5\xaf\xcc\x0b\xdb\xaa\xd5\x92\x15\x53\xaa\xd7\x7d\x99\xb0\x8b\xbc\xe9\xbb\xfe\x76\x58\x73\x36\x8a\x51\x7d\x57\x26\xf7\x02\x6d\x47\x8a\xb3\x31\x39\xa6\x39\xcb\x8e\xa9\xee\x92\xb8\x20\x01\x06\x84\x0d\x26\x03\xb2\x7f\x19\xf9\x9e\xcf\xa5\x79\x77\x17\xae\xeb\x3d\xc5\x4b\xeb\xec\xe8\x47\xdd\xcb\xad\x0f\x80\xfb\x77\x6e\xcb\x3d\xdb\x7a\x86\x77\xec\xd0\xad\xd8\x9b\x77\x97\x23\xdc\xb6\x1f\xeb\x3b\xb1\x54\x60\x60\x25\x4d\x77\xe4\x3d\x25\x04\xb7\xed\xc2\x6d\xde\x7f\xf7\xbc\x52\x18\x62\xb8\x52\x1d\x5e\x7a\xbb\xab\x9a\x66\x0b\x5e\x96\x38\xdd\x00\x1b\x78\x72\x4d\x8e\x87\x3f\x76\xa9\xb6\x6c\xb6\x16\xc8\x2d\xe0\xad\xdf\x8b\x3b\x13\xfe\xee\x3a\x85\xdb\xd6\x19\xa5\xe0\xd7\xb2\x1c\xf0\x39\xc3\x51\x27\xfe\xa9\xce\xa4\x71\xe6\xaa\xe3\x8b\xb1\x6b\x86\xe0\xee\xa9\xf1\xc7\x01\xb4\x9b\x60\x33\x6c\xee\x02\xd9\xa5\x56\x29\xd7\x76\x53\x1c\xb6\x8f\x31\xad\x97\x48\x72\x37\x2f\xf8\x7b\xee\xe0\x08\x7f\xcb\x3d\x0a\x16\xb9\x77\x81\xf1\x5a\x37\x32\x76\x4f\x51\x19\x5e\x6b\x7b\x0a\xef\x2e\x30\x7b\xe0\x60\xf7\xaa\x7f\x0f\x1c\x6f\xb5\x71\xbe\x78\x2d\x00\x94\xd9\x9f\x5c\x82\x90\x46\x3f\x7c\x62\x25\x70\x02\x20\x75\x28\xbb\x43\x7f\xe1\xd8\x36\xbf\x5c\x94\x81\x90\x7c\x51\xe7\xf0\xae\x5e\xab\x2c\x79\x77\x34\xbf\xb7\xc0\x6f\xed\xf1\xb6\xa0\x5a\xf1\x5e\x06\x7a\xdc\x92\x60\xbc\xee\xe3\xba\xcd\xf3\xdb\x3a\xf5\xe2\x77\xf2\xd8\x23\x15\x8e\x6a\xa6\x66\x2c\xad\x79\x61\x1d\x04\x65\xfd\xb3\xc8\x4d\x5e\x8d\xef\xc8\x4e\xfe\xfb\x7f\xfe\xd7\xff\x17\x00\x00\xff\xff\x0e\xdb\x1b\x21\x55\x02\x07\x00") func operatorsCoreosCom_clusterserviceversionsYamlBytes() ([]byte, error) { return bindataRead( @@ -119,12 +119,12 @@ func operatorsCoreosCom_clusterserviceversionsYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "operators.coreos.com_clusterserviceversions.yaml", size: 711936, mode: os.FileMode(436), modTime: time.Unix(1606762434, 0)} + info := bindataFileInfo{name: "operators.coreos.com_clusterserviceversions.yaml", size: 459349, mode: os.FileMode(436), modTime: time.Unix(1607977323, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _operatorsCoreosCom_installplansYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x5b\x4b\x73\xdc\x36\xf2\xbf\xeb\x53\x74\x29\x07\x25\x55\x9a\x99\xd8\xb9\xfc\x6b\x6e\xfa\xcb\x9b\x2d\xed\x3a\xb6\x4a\x23\xeb\xe2\xf5\x01\x43\xf6\x0c\x11\x81\x00\x82\xc7\xc8\xb3\xa9\x7c\xf7\xad\x06\x48\x0e\xc9\xe1\x4b\xaf\xc4\xc1\xc5\x1e\x12\x68\xf4\xbb\xfb\x07\x50\x4c\xf3\x3b\x34\x96\x2b\xb9\x04\xa6\x39\x7e\x75\x28\xe9\x97\x9d\xdf\xff\x9f\x9d\x73\xb5\xd8\xbd\x39\xb9\xe7\x32\x5d\xc2\xa5\xb7\x4e\xe5\x37\x68\x95\x37\x09\xbe\xc3\x0d\x97\xdc\x71\x25\x4f\x72\x74\x2c\x65\x8e\x2d\x4f\x00\x98\x94\xca\x31\x7a\x6c\xe9\x27\x40\xa2\xa4\x33\x4a\x08\x34\xb3\x2d\xca\xf9\xbd\x5f\xe3\xda\x73\x91\xa2\x09\xc4\xcb\xad\x77\x3f\xce\x7f\x9a\xff\x78\x02\x90\x18\x0c\xcb\x6f\x79\x8e\xd6\xb1\x5c\x2f\x41\x7a\x21\x4e\x00\x24\xcb\x71\x09\x5c\x5a\xc7\x84\xd0\x82\x49\x3b\x57\x1a\x0d\x73\xca\xd8\x79\xa2\x0c\x2a\xfa\x27\x3f\xb1\x1a\x13\xda\x7b\x6b\x94\xd7\x4b\xe8\x9c\x13\xa9\x95\x2c\x32\x87\x5b\x65\x78\xf9\x7b\x06\x4a\xe4\xe1\x7f\x51\xf0\xab\xb8\xe5\xb5\x60\x32\x3c\x15\xdc\xba\x7f\xb7\xdf\xbc\xe7\xd6\x85\xb7\x5a\x78\xc3\x44\x93\xd1\xf0\xc2\x66\xca\xb8\x0f\x87\x6d\x67\xc0\x75\x7c\xc1\xe5\xd6\x0b\x66\x1a\x6b\x4e\x00\x6c\xa2\x34\x2e\x21\x2c\xd1\x2c\xc1\xf4\x04\xa0\x50\x58\x20\x31\x03\x96\xa6\xc1\x04\x4c\x5c\x1b\x2e\x1d\x9a\x4b\x25\x7c\x2e\xab\x0d\x52\xb4\x89\xe1\xda\x05\x15\xdf\x66\x08\x1b\x6e\xac\x83\xcb\xd5\x1d\x70\x09\x2e\xc3\x20\x0b\xa8\x0d\x24\xc2\x5b\x87\x66\x85\x66\xc7\x13\x2c\x3c\x22\xec\x1c\x48\x01\xfc\x6a\x95\xbc\x66\x2e\x5b\xc2\x9c\x14\x3c\xef\x5f\xf0\xf9\xc7\x2f\xc5\x9a\x68\xb1\xcb\xd5\x5d\xf1\xdb\xed\x49\x1e\xeb\x0c\x97\xdb\x3e\x0e\x99\xd6\x46\xed\x98\x80\x5c\xa5\xd8\xb3\x77\x39\xa7\xb1\xcd\x45\xf3\x61\xc7\x5e\xdd\x64\x82\x5a\xdb\x64\xaa\x87\x91\xcc\x5a\x29\x81\x85\xf5\xe3\xb4\xdd\x1b\x26\x74\xc6\xde\x44\x03\x26\x19\xe6\x6c\x59\x2c\x51\x1a\xe5\xc5\xf5\xd5\xdd\x4f\xab\xc6\x63\x68\xca\x5a\x73\x1d\x48\x29\x96\xd0\x06\x83\x14\x2e\x10\x62\x80\x0c\xc3\xc0\x62\xb0\xd0\xc1\x8f\x2b\x82\x91\x39\xb5\xfe\x15\x13\x57\x3d\x34\xf8\x9b\xe7\x06\xd3\xc3\xbe\x33\x28\x23\xb4\xf6\x88\x34\x50\xfd\xd4\x86\xa8\xbb\x2a\x02\xe2\xa8\xa5\x86\xda\xd3\x96\x1c\x67\x24\x6a\x9c\xd5\x90\xa3\x70\x54\x4c\x0b\xed\x90\x08\x2e\xe3\x16\x0c\x6a\x83\x16\x65\xcc\x12\x0d\xc2\x10\x04\x96\x85\x44\x73\x20\xe7\x42\x63\x29\x72\xbc\x48\x29\x95\xec\xd0\x38\x30\x98\xa8\xad\xe4\xff\xad\x68\x5b\x70\x2a\x7a\x33\x73\x68\x5d\x8b\x66\x08\x0c\xc9\x04\xec\x98\xf0\x78\x0e\x4c\xa6\x90\xb3\x3d\x18\xa4\x5d\xc0\xcb\x1a\xbd\x30\xc5\xce\xe1\x17\x65\xc8\x14\x1b\xb5\x84\xcc\x39\x6d\x97\x8b\xc5\x96\xbb\x32\x25\x26\x2a\xcf\xbd\xe4\x6e\xbf\x08\xd9\x8d\xaf\x3d\xd9\x65\x91\xe2\x0e\xc5\xc2\xf2\xed\x8c\x99\x24\xe3\x0e\x13\xe7\x0d\x2e\x98\xe6\xb3\xc0\xba\x0c\x69\x71\x9e\xa7\xdf\x99\x22\x89\xda\xb3\x06\xaf\x47\x3e\x1b\x47\xc8\x42\x03\x16\xa0\x5c\x04\xdc\x92\xab\x84\xa5\x51\x8a\x83\xa2\xe9\x11\x69\xe7\xe6\x1f\xab\x5b\x28\xb7\x0e\xc6\x68\x6b\x3f\xe8\xfd\xb0\xd0\x1e\x4c\x40\x0a\xe3\x72\x83\x26\x1a\x71\x63\x54\x1e\x68\xa2\x4c\xb5\xe2\xd2\x85\x1f\x89\xe0\x28\xdb\xea\xb7\x7e\x9d\x73\x67\x83\x5f\xa2\x75\x64\xab\x39\x5c\x86\x3a\x01\x6b\x04\xaf\x53\xe6\x30\x9d\xc3\x95\x84\x4b\x96\xa3\xb8\x64\x16\x5f\xdd\x00\xa4\x69\x3b\x23\xc5\x4e\x33\x41\xbd\xc4\xb5\x27\xb7\xe2\x0f\xa0\x2c\x40\x3d\xf6\xaa\x45\xfe\x4a\x63\x52\x45\x4d\x15\xe9\x17\x5a\x0b\x9e\xc4\x0c\x50\x79\x0a\x38\xd5\x52\xec\xba\x4a\x16\x55\xb6\x1a\x64\xab\x2b\x35\x40\xc8\x05\xad\x7c\xda\x7c\xdc\x22\x3e\x1b\x2f\x15\x71\x74\xe7\x14\x08\x79\x25\x6e\xd7\x7e\xde\xd2\x53\x99\xd0\xc9\xb5\xc9\xbb\xbc\x45\x73\x28\x0f\x5a\x09\x9e\xec\x61\xa3\x0c\x65\x8c\x9a\x4e\xe7\x47\x54\x01\xae\x1c\xe4\xde\x06\x7f\x53\x12\x49\xc7\xa7\x17\xde\xa9\x9c\x39\x9e\x9c\x82\x32\x70\xfa\x0b\x93\x9e\x89\xd3\xe3\xc5\x3d\x0e\x71\x90\xa3\xad\x4e\xe8\xac\x1a\x87\xd1\xaf\xbe\x3e\x3a\xcc\x18\xb6\x3f\x7a\xc7\x1d\xe6\x1d\x4b\x06\x39\xde\xa2\xa4\x22\x72\x94\xd1\x0f\xcb\x28\x59\x6e\xd1\xb4\x63\x38\xf8\x60\xdf\x9a\xce\xad\xe2\x92\xaa\x77\x99\xbc\xd6\x3a\xe6\xbc\x1d\x08\x9f\xd3\x7a\xfc\x84\xc9\xb5\x84\x55\x94\xd0\x8d\x32\x79\x8c\x1f\xb6\x56\x3e\x26\xa7\x48\xf8\xb8\xde\x58\x87\xda\x56\xa1\x41\x95\x24\x51\xb9\x16\xe8\x9a\xb5\x78\x0e\xff\x91\x50\xec\x47\xc9\xd0\x19\xc6\x05\x11\x6e\x3b\x45\xe2\x3c\x13\x61\x37\x2c\xea\xf7\xde\x3a\xcc\xe7\xa7\xcf\x8b\xd1\x84\x39\x26\xd4\x76\x15\xb3\x41\xeb\xa5\xce\x98\xc5\xa9\xd1\xe7\x1c\x4a\x4f\x39\xb7\x70\xc1\x8b\x24\x51\x5e\xba\x1b\xdc\x8c\x05\x64\xff\x4a\x30\xb8\x41\x83\x32\x29\xaa\xbf\x8d\x13\x80\xc5\x19\x5d\x5e\x9a\x31\x47\x91\xed\x6d\x54\x7a\xaa\x62\xbf\x9b\x56\x8d\x4e\xa9\xfe\xbe\x98\xec\x50\xde\xb0\xe4\x30\xd0\xd3\x74\x0b\x7c\x7d\x55\xf6\x31\xb1\x7d\xc1\x52\x4e\xd7\x95\x65\x06\xe3\x81\xc6\x86\xa3\x48\x43\x07\x3a\xbe\xf7\xd9\x55\xa1\xd4\x50\xd1\x9d\x02\x06\x9a\x63\x82\x8d\x16\x29\xa8\x08\x59\x0a\x6a\xd3\x49\x91\xf0\x18\x50\xd9\x33\x58\xac\x38\x8f\xf5\xbb\x68\x14\x0e\x8d\x95\x63\x5c\x02\xa3\xce\x81\xa7\xf0\xaf\xd5\xc7\x0f\x8b\x7f\xb6\xeb\x4d\x43\x0a\xb2\x2c\x5a\x1b\xfd\x3c\x47\xe9\xce\xc1\xfa\x24\x03\x66\x49\x0c\x72\x60\x8a\x15\x9c\xe7\x4c\xf2\x0d\x5a\x37\x2f\xf6\x40\x63\x3f\xbf\xfd\xd2\xad\x3d\x80\x9f\x95\x01\xfc\xca\x28\xfc\xce\x81\x47\x8d\x57\x4d\x49\xe1\x60\xa1\x1c\x90\x3a\x2a\x8a\xf0\xc0\x5d\xc6\xdb\x79\xb6\xd2\x00\x68\x95\x16\x62\x3f\x04\x71\x1d\xbb\xa7\x3a\x10\xc5\xf5\x84\x81\xee\x71\x09\xa7\x11\xd6\x54\x6c\xfe\x4e\x8d\xfe\x1f\xa7\x3d\x54\xbf\x7f\xc8\xd0\x20\x9c\xd2\xa4\xd3\xc8\x5c\xd5\x85\xd2\xb3\xd2\x5f\x0e\x4c\x06\x87\x77\x86\x6f\xb7\x68\x5a\x35\xf5\x30\x42\x4b\x45\x8d\xca\x0f\x54\x95\xf8\x06\xa4\xaa\x91\x08\x84\xc9\x7a\x1a\x13\xbe\xe1\x98\x1e\x31\xfd\xf9\xed\x97\x5e\x8e\x9b\xfa\x02\x2e\x53\xfc\x0a\x6f\x23\x10\xe4\x96\xb4\xf4\xc3\x1c\x6e\x83\x77\xec\xa5\x63\x5f\x69\xa7\x24\x53\x16\xfb\x34\xab\xa4\xd8\x93\xcc\x19\xdb\x21\x58\x95\x23\x3c\xa0\x10\xb3\xd8\xcf\xa4\xf0\xc0\xf6\xa4\x85\xd2\x70\xe4\x6f\x0c\x34\x33\x6e\xd0\x5b\xcb\xde\xff\xf6\xe3\xbb\x8f\xcb\xc8\x19\x39\xd4\x56\x12\x3b\xd4\x33\x6e\x38\xf5\xf2\xd4\xc4\xc7\x4e\x34\x78\xe3\x51\x2b\x5b\x0e\xeb\xa3\xfb\x50\x5a\xcf\x98\xdc\x62\x09\x7c\x37\x9e\x7a\xc3\xf9\xd9\x53\xe2\xf8\xb8\x21\x2f\x47\x47\x63\xde\x4e\x1c\x7f\x59\x6b\x3b\x51\xb8\x80\x6f\x27\x08\xf7\xa1\xe6\xe5\x83\xc2\xdd\xfb\x35\x1a\x89\x0e\x83\x7c\xa9\x4a\x2c\x89\x96\xa0\x76\x76\xa1\x76\x54\x28\xf0\x61\xf1\xa0\xcc\x3d\x97\xdb\x19\xb9\xe6\x2c\xfa\x80\x5d\x84\x33\x9a\xc5\x77\xe1\x9f\x27\xcb\xd2\xd3\x7e\x74\x0b\x14\x26\xff\x19\x52\xd1\x3e\x76\xf1\x24\xa1\x4a\x48\x30\xbd\x8e\x9d\xad\x62\xc2\x48\xda\x6b\x29\x2c\x1e\x32\x9e\x64\x25\x34\x2f\x72\x6c\x4f\x30\x71\x6a\x7d\xd2\x98\x9a\x99\xdc\xbf\xba\x2b\x93\x42\xbd\x21\x8e\xf6\xb3\xe2\x1c\x71\xc6\x64\x4a\xff\xb7\xdc\x3a\x7a\xfe\x24\x0d\x7a\x3e\x29\x7c\x3f\x5d\xbd\xfb\x73\x1c\xdc\xf3\x27\xc4\xea\xda\xcb\x54\xe0\x7b\xa5\xee\xbd\xee\x68\x75\x1a\xa2\xfc\x7f\x7d\x6e\x89\xa7\x0a\xb4\xc9\xe5\x4c\x1b\xb5\x35\x54\xcd\x6b\x18\x1d\x74\x3c\x75\x6d\x0f\x4a\xbc\x5e\x6a\x96\xdc\xb3\x2d\x16\x4c\x84\x12\x85\xd2\x95\x05\xb0\x80\x38\x7d\x8d\xdb\x23\xf1\x4c\xaf\x24\xf1\xcc\xa3\xe0\xb9\x64\xb9\xc5\xe0\x71\x83\x1e\x47\xc9\x71\xe8\xd0\x0b\x29\xc6\xb8\x1f\x69\x3c\xfb\x7a\xf7\x38\x5a\x1d\xfc\x0d\x76\xd5\xc0\x19\xf0\x94\xfc\x7f\xc3\x8f\x20\x58\x7c\xad\x99\xcb\x3a\x5f\x18\xd4\x82\xb5\x81\x41\x1c\xc3\x0d\x31\x1c\xf1\xd5\x3d\xab\x65\x87\xcb\xd6\xa2\xd2\x16\x65\x93\x56\xe8\xb2\x31\xad\x87\x6e\xec\x7a\x0a\x1b\x90\x80\xf0\xc0\x6c\xc8\x54\x62\x87\x69\x38\x6a\xea\xeb\x17\x47\xec\x31\x45\x7a\x98\x00\x0a\x3a\xe4\x7f\x34\x34\xa8\x33\xdc\x9b\x98\xe2\x18\x81\x09\x1d\xdc\x3c\x0a\x2c\x0c\x10\x2d\x0f\x60\x1f\x0d\x19\x06\x69\x16\x70\xe2\x35\x81\x43\x1c\x4f\x83\x0f\x83\x24\x23\xb4\x78\x25\x10\x11\xc7\xd3\xa0\xc4\x20\xc9\x0a\x66\x3c\x16\x50\x0c\x52\xed\x02\x1b\xd3\x60\xc5\x20\xd9\x4e\xc8\x31\x01\x5c\x8c\xf9\x71\x27\xf0\x18\x84\x18\x83\x14\x87\xe1\x47\x2f\xd0\x18\xa4\x39\x08\x42\xe2\x98\x94\x31\xfa\x01\x49\x1c\x7f\x07\x58\xf2\x08\x71\xfb\x21\x4a\x97\xb8\xdf\x04\x50\x79\xa4\x74\x03\xa0\xa5\x4f\xc4\x6f\x02\xba\x3c\x42\xcc\x49\x30\xa6\x4b\xd8\x17\x02\x33\x71\xfc\x6d\x20\xcd\x23\x34\xdb\x0b\x6f\xba\xb4\xf9\x0d\x80\x9c\x89\xa2\x25\x4a\xc6\xaf\x1d\x7a\x3b\xb9\x66\x87\x5a\x4d\x6f\xdf\x0f\x10\xbb\x4c\x34\xce\xe8\xeb\xb0\x62\xb8\xd9\xec\x06\x2f\x71\xf4\x42\x98\x3a\x81\xc1\x6e\x75\x18\x43\xc4\x31\xeb\xbe\xca\xa8\x4f\xa0\x9d\x7a\x5f\x4f\xe9\x88\x01\x04\xb3\xee\xd6\x30\x69\x79\xf9\x35\xce\xd0\xec\x96\xee\xdf\x33\x02\x64\x3c\xc7\xb2\x71\x89\x96\x00\x57\x11\x2c\x1a\xfb\x41\x92\x10\x2e\xeb\xa2\xb0\xa1\x67\x93\xca\x65\xdd\xc0\xec\x30\x26\x45\x08\x8d\x78\x47\xb4\x84\x94\x39\x9c\x11\xaf\x23\xca\xf8\x14\x2e\xaa\x5f\x48\x11\x84\x70\xb4\x51\x6b\x4c\xff\x02\x69\x72\xb4\x96\x6d\x1f\x23\xc6\x05\x64\x3e\x67\x12\x0c\xb2\x94\xad\x05\x96\x24\xa8\xdb\x0b\x37\xd5\x72\x0b\x29\x3a\xc6\x45\xbf\x57\xc6\x71\xb8\x8f\x3b\xf8\xc2\x8b\xa8\xc0\x20\xb3\xc3\x55\x04\x8e\x3f\x36\x8a\x8b\xc2\x25\x72\xc3\x3e\x67\x36\x98\xfc\xa5\x79\xec\xba\xdb\x1c\xe4\xb1\xb8\x6f\x3c\x00\x80\xc8\xde\x79\x79\x8b\x7d\x6b\x3c\x9e\xc3\xcf\x4c\x58\x3c\x1f\x51\xfc\x27\x79\x2f\xd5\xc3\xcb\xc8\x11\xa6\x3d\x42\xd3\x7b\x1d\xb8\xad\xf8\x7f\x26\x13\x87\x33\x92\x49\x85\xe0\xaa\x9a\x5e\x9e\x7c\x15\x27\x1e\x33\x2f\xf9\x6f\xbe\x09\xb2\xca\xcb\xc7\x5e\x0e\xbf\x6f\xc3\xb2\xcb\xd5\x5d\x70\xa0\x78\x80\x61\xe3\x3d\x4f\x09\x8f\x2f\x57\x77\xf6\x87\xc1\x7a\x32\x20\xa7\x1e\x38\x02\x68\x48\x78\xcd\x5c\xd6\x02\x8e\x42\x25\xb5\x4f\xc8\x0e\x07\x5c\xda\x77\x5d\xa8\x96\xe3\xca\x9d\x59\xe2\x8b\x27\x4c\x88\x3d\x61\x25\x9e\x53\x98\x57\xbd\xd4\x70\x6d\x1c\x92\x65\xb4\xe8\x1c\x05\x27\x6e\x36\x98\x38\xbe\xc3\xda\xe2\x52\xe9\xf1\x80\x0f\xd3\x42\xb2\x27\xb3\x55\x1e\x9b\x4d\x62\xea\xa6\x98\x5c\xba\x51\xdd\x0b\x0e\x1a\x2e\x48\x06\x34\x3c\x78\xe2\x45\x31\xbc\x51\x5e\xa6\xc0\x5c\x30\xe1\x13\xa4\x68\x7e\x15\xf0\xfa\x1f\x90\x0c\xf5\x60\xcf\x3f\xdc\xad\x7d\xd9\x51\x75\x6f\x43\xcd\x5b\x4f\x0f\x54\x98\x04\xbf\x62\xe2\xab\x18\x18\xfd\x46\x68\xa4\x3b\x1b\x73\xe0\xe9\xfd\xd2\x84\x24\x3b\xad\x9a\x4f\xeb\x4a\x5e\x6c\xbb\x91\xb6\x61\x42\xac\x0d\x55\xe8\xee\xde\xfd\x26\x16\xe8\x70\xb8\x9c\xb0\x1c\x45\xc2\x2c\xa6\xad\xba\xdd\x1b\x65\xb1\xc1\x1f\x2f\xe2\xa3\xac\x0f\x17\xee\xd1\xe5\x43\xf5\x72\x34\x00\x42\xf5\x8c\xb3\xd6\xe5\xd7\x35\x05\x70\xe9\x3f\xd0\x6e\x78\x3b\xe5\x17\x06\x09\x9a\x50\x92\xe2\xe7\x9a\x8c\x34\xfa\x90\xa9\x27\xe5\xce\xf0\xb9\xd1\xc8\x95\x53\x6d\xff\x6b\x9a\x5e\xd5\xde\x80\x7e\x5d\xd9\xd6\x87\xf2\xd4\xfe\xc0\xbe\x25\xcc\x00\xab\x43\x4c\x0a\xd6\xfb\x95\xdb\x73\x92\xd4\xca\xa1\x6e\x27\xa5\x9a\x30\x32\xf4\xc4\x3b\x9e\xc6\xaf\xc0\x50\x43\xcf\x97\x29\xcf\xce\x48\xc3\xb7\x4d\xf1\xfe\xa4\xdb\x23\x67\xd5\xd1\x49\xe7\xcb\xde\xd4\x3a\x96\x03\xab\x3d\x9f\x91\x23\xfa\x3e\x35\x8c\xe3\xc8\x12\xe5\x9f\xa3\x0c\x58\x64\x48\xd8\x82\x2d\x05\xeb\x90\x27\x62\x4b\xb1\x9f\x60\x1b\x98\x86\xe7\xc7\xd0\xfc\x2c\xfe\x95\x4a\xef\xdb\x7b\x2e\xfb\xce\xe4\x67\xa1\xff\xe8\x7d\x79\xf8\xfe\x72\xc2\x94\x70\xa6\xd7\x3b\xaf\xb8\xe7\xea\x79\x3f\xe5\x38\x21\xfe\x29\xce\x6b\x9f\x72\x4f\x22\x52\xde\x2b\x3d\x9b\xd0\xd8\x21\xf4\x24\x22\x07\x13\xbc\x20\xa9\xd1\xc3\xe3\x49\xf4\x76\xe3\xe7\xb2\xcf\xac\x9b\x47\xc1\x5c\xc0\xdd\x81\x4a\xa1\x99\x71\x3c\xf1\x82\xf5\x03\xb4\xea\x0f\x1c\x42\x2a\x1e\xa9\x2d\x9d\x52\x58\x34\x3b\x4c\x97\xe0\x8c\x8f\x41\x61\x9d\x32\xd4\xf9\xd4\x9e\xf8\x75\xf5\x65\x7e\x29\x5e\x21\x2c\xfc\xfe\xc7\xc9\xff\x02\x00\x00\xff\xff\x56\x5f\x54\x65\x55\x37\x00\x00") +var _operatorsCoreosCom_installplansYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x5f\x73\xdb\xb8\x11\x7f\xf7\xa7\xd8\xf1\x3d\x38\x99\xb1\xa8\x4b\xda\x87\x8e\xde\x5c\xa7\xd7\x71\x9b\x4b\x3c\x96\xe3\x97\x34\x0f\x2b\x72\x25\xe1\x0c\x02\x3c\xfc\x91\xa3\xde\xdc\x77\xef\x2c\x40\x52\xa4\x44\x52\xb4\xe3\xe4\x32\x9d\xe3\x4b\x22\x72\x01\xec\xff\xfd\x2d\x00\x63\x21\xee\xc8\x58\xa1\xd5\x0c\xb0\x10\xf4\xd9\x91\xe2\x5f\x36\xb9\xff\x9b\x4d\x84\x9e\x6e\x5e\x9d\xdc\x0b\x95\xcd\xe0\xd2\x5b\xa7\xf3\x1b\xb2\xda\x9b\x94\xde\xd0\x52\x28\xe1\x84\x56\x27\x39\x39\xcc\xd0\xe1\xec\x04\x00\x95\xd2\x0e\xf9\xb5\xe5\x9f\x00\xa9\x56\xce\x68\x29\xc9\x4c\x56\xa4\x92\x7b\xbf\xa0\x85\x17\x32\x23\x13\x26\xaf\x96\xde\xfc\x98\xfc\x35\x79\x75\x02\x90\x1a\x0a\xc3\x6f\x45\x4e\xd6\x61\x5e\xcc\x40\x79\x29\x4f\x00\x14\xe6\x34\x03\xa1\xac\x43\x29\x0b\x89\xca\x26\xba\x20\x83\x4e\x1b\x9b\xa4\xda\x90\xe6\x7f\xf2\x13\x5b\x50\xca\x6b\xaf\x8c\xf6\xc5\x0c\x3a\x69\xe2\x6c\x15\x8b\xe8\x68\xa5\x8d\xa8\x7e\x03\x4c\x40\xcb\x3c\xfc\x3f\x8a\x7e\x15\x17\xbd\x96\xa8\xc2\x5b\x29\xac\xfb\xf7\xfe\x97\xb7\xc2\xba\xf0\xb5\x90\xde\xa0\x6c\xb3\x1a\x3e\xd8\xb5\x36\xee\xdd\x6e\x61\x5e\x48\x14\xf1\x93\x50\x2b\x2f\xd1\xb4\x46\x9d\x00\xd8\x54\x17\x34\x83\x30\xa8\xc0\x94\xb2\x13\x80\x52\x69\xe5\x24\x13\xc0\x2c\x0b\x86\x40\x79\x6d\x84\x72\x64\x2e\xb5\xf4\xb9\xaa\x17\x61\x9a\x8c\x6c\x6a\x44\xe1\x82\xb2\x6f\xd7\x04\x4b\x61\xac\x83\xcb\xf9\x1d\x08\x05\x6e\x4d\x41\x26\xd0\x4b\x48\xa5\xb7\x8e\xcc\x9c\xcc\x46\xa4\x54\xfa\x46\x58\xbf\x9e\x0e\xe0\x17\xab\xd5\x35\xba\xf5\x0c\x12\x56\x77\xd2\x3f\xe8\xe3\x8f\x9f\x1a\xe3\xa2\x0d\x2f\xe7\x77\x8d\x77\x6e\xcb\x12\x5a\x67\x84\x5a\x0d\x71\x8c\x45\x61\xf4\x06\x25\xe4\x3a\xa3\x01\x5e\x2a\xba\x83\x65\x2f\x0e\x3f\xf4\xac\xdd\x3d\x65\x50\x7e\xd7\x94\xad\x0f\x71\xca\x85\xd6\x92\x4a\x6f\xa9\x88\x37\xaf\x50\x16\x6b\x7c\x55\xbe\xb4\xe9\x9a\x72\xdc\x19\x49\x17\xa4\x2e\xae\xaf\xee\xfe\x32\xdf\xfb\x00\x6d\x5d\x34\x5c\x0e\x32\x8e\x42\xb2\xc1\x80\xa5\xe3\x84\xe8\x61\x43\x22\x58\x0a\x16\xdd\x45\xc0\x01\x9b\x7a\xf1\x0b\xa5\xae\xf1\xda\xd0\xaf\x5e\x18\xca\x9a\xab\xb3\x46\xaa\x18\xdf\x7b\xcd\xda\x69\xbc\x2a\x0c\xaf\xe5\x1a\x91\x14\x9f\x46\x92\x69\xbd\xdf\x93\xec\x8c\xc5\x8f\x74\x2d\xc9\x4a\x87\xa7\xac\xd4\x19\x0b\xe5\xd6\xc2\x82\xa1\xc2\x90\x25\xe5\x76\x42\xab\x52\xa6\x04\xd8\x19\xc9\x58\x8e\x3a\x2f\x33\x4e\x44\x1b\x32\x0e\x0c\xa5\x7a\xa5\xc4\x7f\xeb\xd9\x2c\x38\x1d\x23\x00\x1d\x59\x07\x21\x84\x14\x4a\xd8\xa0\xf4\x74\x0e\xa8\x32\xc8\x71\x0b\x86\x78\x5e\xf0\xaa\x31\x43\x20\xb1\x09\xfc\xac\x0d\x1b\x60\xa9\x67\xb0\x76\xae\xb0\xb3\xe9\x74\x25\x5c\x95\x42\x53\x9d\xe7\x5e\x09\xb7\x9d\x86\x6c\x28\x16\x9e\xad\x31\xcd\x68\x43\x72\x6a\xc5\x6a\x82\x26\x5d\x0b\x47\xa9\xf3\x86\xa6\x58\x88\x49\x60\x56\x85\x34\x9a\xe4\xd9\x0f\xa6\x4c\xba\xf6\x6c\x4f\x7d\x9d\xfe\x0b\x55\xde\x1a\xd4\x35\xe7\x2f\x10\x96\xdd\x24\x0c\x8f\xb2\xec\x54\xca\xaf\x58\x2b\x37\xff\x98\xdf\x42\xc5\x40\x54\x7b\xd4\xf0\x8e\xd4\xee\x94\xcd\x8a\x12\x6a\x49\x26\x52\x2e\x8d\xce\xc3\x2c\xa4\xb2\x42\x0b\xe5\xc2\x8f\x54\x0a\x52\x0e\xac\x5f\xe4\xc2\xd9\xe0\x73\x64\x1d\xdb\x21\x81\xcb\x50\x41\x60\x41\xe0\x8b\x0c\x1d\x65\x09\x5c\x29\xb8\xc4\x9c\xe4\x25\x5a\xfa\xea\xaa\x66\x8d\xda\x09\xab\x6f\xbc\xb2\x9b\x05\xf0\x70\xc0\x41\x8c\x01\x54\x25\xaa\xd7\x3a\x8d\x18\x9f\x17\x94\xd6\xd1\x50\xc7\xf4\x45\x51\x48\x91\x46\xb7\xaf\xbd\x83\x1d\x79\x51\x27\x82\x56\x56\x1a\x64\xa7\x2f\xec\x21\x96\x97\xc3\xb4\xd9\xfe\x74\xb0\x10\x7f\x1a\x55\x46\x60\x20\x67\x40\xc8\x1b\x71\xe9\xc3\x2f\x7b\xfa\xaa\x52\x3b\x3b\x34\x7b\x98\xb7\x64\x76\x05\xa3\xd0\x52\xa4\x5b\x58\x6a\xc3\xf9\xa1\xa1\xdb\x04\xae\x1c\xe4\xde\x06\x7f\xd3\x8a\x58\xb3\xa7\x17\xde\xe9\x1c\x9d\x48\x4f\x41\x1b\x38\xfd\x19\x95\x47\x79\x9a\x74\xb0\xd0\xeb\x10\x3b\xde\xbb\x54\xda\x5d\x23\x76\x4f\xbf\xea\xfa\xe7\x42\x63\x70\xdb\xf1\x55\x38\xca\x3b\x87\x1d\xe1\x7e\x45\x8a\x8b\x46\x47\xc6\xde\x0d\xe5\x44\xb9\x22\x73\xf0\x3d\x7a\x63\xff\xb8\x9e\x25\xe3\xb0\x1a\xe9\x3c\x6a\xbc\x75\xe8\xfc\x81\x9c\x2d\x17\x39\x6d\xc6\x54\x20\x6f\x24\xb0\xb2\x80\x2e\xb5\xc9\x63\x4c\xe1\x42\xfb\x98\xac\xe2\xd4\xec\x19\xd6\x51\x61\xeb\x50\xe1\x60\x4b\x75\x5e\x48\x72\xed\xda\x9b\xc0\x7f\x14\x94\x2b\x70\x3a\x74\x06\x85\x0c\x53\x61\xea\x3c\xca\x30\x23\x95\x15\x7a\x6b\x1d\xe5\xc9\xe9\xf3\x44\x6a\x8a\x0e\xa5\x5e\xcd\x63\x36\xe8\x20\x28\xd6\x68\xe9\x31\xf1\xe7\x1c\x29\xcf\x59\xb8\x74\xc6\x8b\x34\xd5\x5e\xb9\x1b\x5a\x1e\x0f\xc9\xfe\xb1\x60\x68\x49\x86\x54\x5a\xd6\x77\x1b\x09\x00\x23\x05\xb8\x35\x3a\x8e\x64\x6f\xa3\x9a\x33\x1d\x71\x70\x56\x43\x99\x4a\xe1\xfd\x51\xd9\xa9\xbc\x63\xf2\xc2\x20\x56\xe9\x16\xf3\xfa\xaa\xc2\x27\x11\x96\x50\x25\x9d\xeb\x62\x0e\x8e\x45\x01\x3f\x4b\x41\x32\x0b\xf8\x73\x0c\x07\x67\x57\xa5\x42\x43\x15\x77\x1a\x10\x0a\x41\x29\xb5\xe0\x50\x50\x18\x61\x56\xbe\xe4\x82\x67\xa8\xfc\x76\x1e\x6b\x75\x09\x03\x76\x70\xc9\xa1\x50\x80\x8c\x0b\x44\x06\xff\x9a\xbf\x7f\x37\xfd\xa7\x8e\xbc\xb1\xa5\xc8\xda\xe8\xc9\x39\x29\x77\x0e\xd6\xa7\x6b\x40\xcb\xac\xb1\x7b\xb2\xff\x53\x92\xa3\x12\x4b\xb2\x2e\x29\x67\x23\x63\x3f\xbe\xfe\x94\xc0\x4f\xda\x00\x7d\x46\x0e\x9e\x73\x10\x51\x6b\x35\xa8\x28\x5d\x23\xa4\x72\x16\xa6\x1e\x0b\x0f\xc2\xad\x03\x4b\x85\xce\x4a\xa6\x1f\x02\xb3\x0e\xef\x39\x7f\x47\x66\x3d\xf7\x32\xf7\x34\x83\xd3\xd8\x9a\xd4\x4b\xff\xc6\x30\xfc\xf7\x53\x78\xf1\xb0\x26\x43\x70\xca\x3f\x4f\xe3\x82\x35\x06\xe4\x77\x95\x1d\x77\x0b\x07\x87\x74\x46\xac\x56\x14\x22\x9f\x01\x0d\x83\x86\x97\x5c\x21\xc4\x12\x94\x6e\x10\x87\x29\x58\x9f\x05\xa5\x62\x29\x28\x3b\x60\xe4\xe3\xeb\x4f\xa7\xf0\xa2\x2d\x17\x08\x95\xd1\x67\x78\x1d\xdb\x31\x61\x59\xc6\x97\x09\xdc\x06\xcb\x6c\x95\xc3\xcf\x3c\x67\xba\xd6\x96\x14\x68\x25\xb7\xcc\xf1\x1a\x37\x04\x56\xe7\x04\x0f\x24\xe5\x24\xa2\x84\x0c\x1e\x70\xcb\x32\x54\xaa\x64\xab\x22\x14\x68\xdc\x1e\x42\xbe\x7d\xff\xe6\xfd\x2c\xae\xc6\x66\x5b\x29\x5e\x82\xd1\xd7\x52\x30\xfe\x65\xe0\x1b\x51\x5c\xb0\x39\x33\xe2\xa3\x91\x38\xf5\xad\x51\xad\xa8\x6a\x1e\x97\x9e\xf1\x54\xb2\x8f\x98\x46\x7b\x7c\x17\x5c\xed\x76\xf6\x00\x5b\xf7\x03\xed\x0f\x04\x85\xa3\x45\x0c\x3d\xe0\x28\x11\xdf\x35\x7c\x70\x50\xc4\x7b\xbf\x20\xa3\xc8\x51\x90\x32\xd3\xa9\x65\x01\x53\x2a\x9c\x9d\xea\x0d\x27\x55\x7a\x98\x3e\x68\x73\x2f\xd4\x6a\xc2\x4e\x36\x89\x96\xb7\xd3\xb0\xfb\x31\xfd\x21\xfc\xf3\x45\x12\xf5\x96\xea\x6e\xb1\x02\xf9\xb7\x90\x8d\xd7\xb1\xd3\x27\x8b\x56\x41\xea\xc7\x54\x82\xb3\x79\x0c\xf8\x74\x7f\x34\x87\xcb\xc3\x5a\xa4\xeb\xaa\x69\x6d\x64\xb8\x1c\xb3\x98\x02\x51\x6d\xbf\xba\x1b\xb3\x02\xbd\xe1\xb5\xb7\x93\x72\x5f\x6e\x82\x2a\xe3\xff\x5b\x61\x1d\xbf\x7f\xb2\xc6\xbc\x18\x19\xc0\x1f\xae\xde\x7c\x1b\xe7\xf6\xe2\x89\xd1\xba\xf0\x2a\x93\xf4\x56\xeb\x7b\x5f\x74\x82\x84\x96\x40\x7f\x6f\x52\x57\xfd\x47\xd9\xa5\x09\x35\x29\x8c\x5e\x19\xae\x95\x8d\x2e\x17\x0a\x2f\x63\x7a\xf5\xaa\xc0\xf4\x1e\x57\x54\x2e\x1a\xca\x08\xf7\xc6\x65\x39\x2a\x5b\x81\x7e\x98\xf3\x04\xdc\xdf\xcb\x7d\xdc\x0d\x28\xf9\xec\x61\xb3\xaa\x8b\xcc\x63\x40\xb0\x25\xdf\xc7\xf9\x3d\x0a\xcc\x86\xb0\x6d\x7c\xf6\x10\xee\x0d\x2d\x7b\x09\x45\xc6\x7e\xbf\x14\x1d\xed\x49\x45\x52\xa0\x5b\xf7\x7e\x34\x54\x48\xec\x02\xd1\x30\x02\x42\xc2\x01\x9f\x7d\x74\x7b\xd6\xb8\xdc\x1b\x56\x59\xa4\x4a\x18\xa5\x96\x5b\x64\xe1\x4d\x69\x05\x16\x09\x1e\xd0\x86\x0c\x24\x37\x94\x85\x0d\x98\x3e\x1c\x3a\xc2\x22\xe3\xa4\x85\x51\xb0\xb9\x43\xde\x27\x80\xe7\x26\xe3\x03\xe9\x28\x3e\x47\x81\x74\x07\x4f\x7f\xc2\xe9\x3f\xe1\xf4\x77\x0e\xa7\x1f\x15\x03\x43\xd0\xba\xcb\xfd\xbf\x57\x80\xfd\x28\xa1\x87\xc0\x76\x97\xd0\xdf\x09\xe4\x7e\xb4\x8c\x83\xf0\xbb\x4f\xd0\xef\x04\x84\x3f\x4a\xd8\x91\x80\xbc\x4b\xe4\xff\x67\x58\xfe\x28\x1d\x0e\x40\xf4\x2e\xbd\x7d\x17\x40\x7d\xb4\x80\xa9\x56\xf1\x14\x7c\x00\xa5\xb4\xb1\x56\x3d\x60\x7f\x1f\x98\x99\x46\xd9\xda\xa7\x6d\xc2\xe4\x63\x70\xaa\x0f\x92\xc7\x67\x00\x98\x37\x27\x39\x82\xc9\x8e\x63\xe5\xf8\x4c\xca\xed\xeb\x23\x44\xbc\xe6\x00\xc9\x38\x04\x08\x20\xd1\xba\x5b\x83\xca\x8a\xea\x06\xc7\x30\xfd\x9e\x45\xde\x22\xb7\x1d\x22\xaf\xbb\x8c\x68\x1f\x70\xf5\x94\x25\xa0\x0d\x47\x35\xe5\xbe\x3c\x63\x1a\xa5\xdd\xba\xaf\xe9\xd8\x3d\x23\xa3\x84\x9f\x78\x0e\x30\x83\x0c\x1d\x4d\x98\xa3\xa3\x62\x7f\x08\x87\x95\xcf\x26\x32\x63\xf8\xc2\xe8\x05\x65\x7f\x98\x54\x39\x59\x8b\xab\xc7\x89\x73\x01\x6b\x9f\xa3\x02\x43\x98\xe1\x42\x52\x35\x09\xa3\xb1\x70\x5a\xa9\x56\x90\x91\x43\x21\x6d\xe3\x84\x65\x67\xdf\x67\x13\xd6\x10\xda\x63\x55\x02\x0e\xaf\x98\xc4\x61\xe1\xa0\xb0\x65\x8f\x33\x1b\x8c\xfc\x35\x38\xed\x3e\xb9\x1a\xe4\x74\x5e\x9f\x48\xb5\x98\x3c\xaf\x4e\x30\x6f\x8d\xa7\x73\xf8\x09\xa5\xa5\x73\xf8\xa0\xee\x95\x7e\x78\x3e\x7e\x03\xe1\xa3\xf4\xba\x2d\x02\x57\x35\x9f\xcf\xc0\xca\xae\xbb\x1f\x99\xec\xaf\xea\x01\xd5\x0e\x4d\xd9\xa1\x4f\xbc\x12\xbf\xfa\x76\xa3\x52\x1f\x32\xbd\xd8\x6f\x61\x2e\xe7\x77\xc1\x39\x62\xbb\x6d\x63\x23\x53\xb5\x76\x97\xf3\x3b\xfb\xf2\x48\x6d\x18\x94\xaa\x18\x6c\x54\x5b\xf2\x70\x4f\xbb\xd7\x6a\x49\x9d\x36\xae\xfe\xec\xb6\x65\x0a\x2f\x65\x02\x57\xee\xcc\x32\x0f\x22\x45\x29\xb7\xdc\xb5\x88\x9c\x03\xb3\x46\x3d\xc7\xaa\xda\x30\xe7\x23\x0a\xc4\x41\xb0\xd1\x72\x49\xa9\x13\x1b\x6a\x0c\xaf\x14\x1d\x37\x9c\x28\x2b\xe5\xf8\x22\xe6\xaa\xad\x9c\x91\xac\xdd\x94\xe4\x95\xa3\x34\xed\xbf\xd3\x6a\x39\x69\xec\x35\x83\xd3\x28\x82\xa5\xf6\x2a\x03\x74\xc1\x3c\x4f\xe4\xb9\x7d\x86\xfb\xed\x0e\xfc\x87\xf1\xd3\xf3\x6c\x36\x36\x4e\xe0\x6b\xf4\x35\x04\xbe\x76\x49\x8e\x3e\x53\xea\x1b\x77\xbc\x9a\x77\x38\x9e\xb6\xd7\x78\xdc\x65\x1f\x83\x66\x46\xa5\xcf\xb1\xf5\x77\x2c\x9e\x78\xd6\x45\x8f\x96\xfb\x51\x91\x36\x5c\x75\xbb\xf1\xf7\x4d\x2c\xba\x61\xab\x33\xc5\x9c\x64\x8a\x96\xb2\xfd\x5a\x1c\xc1\xf8\x98\x02\x3c\x82\xd1\x63\x45\x77\xc4\x14\xc3\x75\xf0\xa8\xdb\x87\xaa\x18\xa9\x16\xd5\x2d\x88\xba\xdd\x68\xf9\x37\xe7\x13\x84\x94\x4c\x28\x32\xf1\x12\x1d\xb2\xae\x1e\xd6\xfa\xc9\x99\x31\x5c\x04\x39\x7a\xb4\xd1\xe0\xe2\x9a\x07\xd4\xb5\x33\x74\xab\xae\x11\xa3\xd8\xe6\x78\x90\xbd\x61\xc6\x24\x0e\xdc\x38\xfa\xd2\x04\x34\x77\x54\xec\x27\x9c\x86\x10\x2a\xe0\xd4\x8d\xc8\xe2\x2d\x1d\x2a\x40\xa8\xe7\xc9\x36\xc7\x4f\x36\xe2\x8e\x7d\xbf\xbf\x4d\xea\xed\x8b\x5e\x82\x81\x56\xef\x78\xb6\xab\xd7\xff\xc2\x0c\xd0\x7f\xf9\x2b\x3e\x07\xf6\xa8\xfe\xa0\x60\xc0\x2e\x8d\xeb\xa7\xe1\x82\xa3\x33\x25\x38\xd8\x8e\xb2\x0e\x8c\xed\xaa\xc7\xf4\xd4\x93\xf8\x77\x05\x83\x14\xf7\x42\x1d\x5e\x89\x6c\x12\x30\xa6\x18\x24\xd8\xdd\x85\x1b\x49\x16\xf6\xda\x06\x69\xcb\x73\x96\x2f\x3c\xe6\x89\x7f\x54\xf1\x6d\xf6\xa5\x47\x4e\x54\x9d\x8a\x3c\xcb\x64\xc7\x37\x8e\x47\x4e\xb4\x33\xcd\x33\x4f\x37\x62\xcb\x77\xe4\x9c\x9b\x31\x7b\xa9\xcf\x50\x4d\x0f\x42\xbe\x6c\x60\x07\xaa\x49\x81\xc6\x89\xd4\x4b\x34\xbb\xd8\x0f\xe9\xf9\xe0\x4f\x71\x46\xf2\x6c\xc9\x6c\x28\x9b\x81\x33\xbe\x0a\x13\xeb\xb4\x61\xc4\xd3\x7a\xe7\x17\xf5\x6d\xea\x9d\x40\xa5\x80\xf0\xdb\xef\x27\xff\x0b\x00\x00\xff\xff\x9c\x07\x2b\xc2\x2f\x35\x00\x00") func operatorsCoreosCom_installplansYamlBytes() ([]byte, error) { return bindataRead( @@ -139,12 +139,12 @@ func operatorsCoreosCom_installplansYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "operators.coreos.com_installplans.yaml", size: 14165, mode: os.FileMode(436), modTime: time.Unix(1606762434, 0)} + info := bindataFileInfo{name: "operators.coreos.com_installplans.yaml", size: 13615, mode: os.FileMode(436), modTime: time.Unix(1607977323, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _operatorsCoreosCom_operatorconditionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\x5b\x6f\x1b\xc7\xf5\x7f\xd7\xa7\x38\xe0\xff\x0f\x58\x72\xc9\xa5\x65\x17\x6e\x42\xc0\x30\x0c\xa7\x2e\x0c\x5b\x89\x61\xa9\x79\xa8\xa8\xd6\x67\x77\x0e\x97\x13\xed\xce\x6c\xe6\x42\x89\x09\xf2\xdd\x8b\x33\xb3\x17\x5e\x76\x29\xb5\x4e\xd0\x17\xce\x8b\xc4\x99\xd9\x33\xe7\xfa\x3b\x17\xac\xe4\x8f\x64\xac\xd4\x6a\x06\x58\x49\xba\x77\xa4\xf8\x97\x4d\x6e\xbf\xb1\x89\xd4\xd3\xd5\xf9\xc9\xad\x54\x62\x06\x6f\xbd\x75\xba\xfc\x4c\x56\x7b\x93\xd1\x77\xb4\x90\x4a\x3a\xa9\xd5\x49\x49\x0e\x05\x3a\x9c\x9d\x00\xa0\x52\xda\x21\x6f\x5b\xfe\x09\x90\x69\xe5\x8c\x2e\x0a\x32\x93\x9c\x54\x72\xeb\x53\x4a\xbd\x2c\x04\x99\x40\xbc\x79\x7a\xf5\x2c\x79\x91\x3c\x3b\x01\xc8\x0c\x85\xcf\xaf\x64\x49\xd6\x61\x59\xcd\x40\xf9\xa2\x38\x01\x50\x58\xd2\x0c\x74\x45\x06\x9d\x36\x99\x56\x22\x3c\x6f\x93\x66\xcb\x26\x99\x36\xa4\xf9\x4f\x79\x62\x2b\xca\x98\x83\xdc\x68\x5f\x75\x9f\x6d\xdd\x89\x34\x6b\x46\xa3\x90\x3f\xd4\xf7\xde\x36\xe4\xc3\x59\x21\xad\xfb\xd0\x7f\xfe\x51\x5a\x17\xee\x54\x85\x37\x58\xf4\x31\x18\x8e\xad\x54\xb9\x2f\xd0\xf4\x5c\x38\x01\xb0\x99\xae\x68\x06\xdf\x33\x3b\x15\x66\x24\x4e\x00\x6a\xdd\x04\xf6\x26\xb5\xf4\xab\xf3\x48\x2c\x5b\x52\x89\x91\x6f\x60\x82\xea\xcd\xa7\xf7\x3f\xbe\xb8\xdc\xda\x06\x10\x64\x33\x23\x2b\x17\x34\xbc\xc7\x39\x48\x0b\x58\x5b\x15\x1a\xb3\x82\x5e\x80\x5b\x57\x04\x5f\xf6\xee\x7f\x69\xe9\x02\xdc\x2d\x65\xb6\x64\x02\xde\x92\x00\xa7\xd9\xcc\x2b\x5a\x83\x54\x0b\x6d\xca\x60\x40\xde\xfd\xe1\xe3\x05\x60\xaa\xbd\x03\xb7\x24\xb0\x0e\x5d\x78\x00\x55\xab\x84\xa4\x25\xca\xaf\xce\x40\xa7\x3f\x51\xe6\xda\x4d\x43\x3f\x7b\x69\x48\x74\x32\x4d\xa0\x71\xb7\x76\xab\x32\x4c\xcd\xc9\xc6\x92\x71\x6d\x38\xf6\xc6\xee\x8e\x52\x9e\xb0\xde\xe2\x2d\x10\xec\xd1\x64\x03\xab\xb5\xee\x49\xd4\xaa\x0e\x6a\x59\x4a\x0b\x86\x2a\x43\x96\x54\xf4\xf1\x2d\xc2\xd0\x88\x16\x44\x48\xe0\x92\x0c\x93\x01\xbb\xd4\xbe\x10\x51\x43\xc6\x81\xa1\x4c\xe7\x4a\xfe\xd2\xd2\xb6\xac\x29\x7e\xb4\x40\x47\xd6\xed\xd0\x94\xca\x91\x51\x58\xc0\x0a\x0b\x4f\x63\x40\x25\xa0\xc4\x35\x18\xe2\x57\xc0\xab\x0d\x7a\xe1\x8a\x4d\xe0\x42\x1b\x0a\xa6\x98\xc1\xd2\xb9\xca\xce\xa6\xd3\x5c\xba\x26\xa0\x33\x5d\x96\x5e\x49\xb7\x9e\x86\xd8\x94\xa9\xe7\xb8\x98\x0a\x5a\x51\x31\xb5\x32\x9f\xa0\xc9\x96\xd2\x51\xe6\xbc\xa1\x29\x56\x72\x12\x58\x57\x31\xd8\x4a\xf1\x7f\xa6\xf6\x15\xfb\x64\x8b\xd7\x68\x40\xeb\x8c\x54\xf9\xc6\x41\x88\xab\x03\x16\xe0\xb8\x8a\xae\x18\x3f\x8d\x52\x74\x8a\xe6\x2d\xd6\xce\xe7\xbf\x5e\x5e\x41\xf3\x74\x30\xc6\xae\xf6\x83\xde\xbb\x0f\x6d\x67\x02\x56\x98\x54\x0b\x32\xd1\x88\x0b\xa3\xcb\x40\x93\x94\xa8\xb4\x54\xd1\x3d\xb3\x42\x92\xda\x55\xbf\xf5\x69\x29\x9d\x0d\x8e\x48\xd6\xb1\xad\x12\x78\x1b\x50\x0e\x52\x02\x5f\x09\x74\x24\x12\x78\xaf\xe0\x2d\x96\x54\xbc\x45\x4b\x7f\xb8\x01\x58\xd3\x76\xc2\x8a\x7d\x9c\x09\x36\x01\x7a\xf7\xf2\x4e\xc0\x01\x34\xc0\x39\x60\xaf\x3d\x58\xb8\xac\x28\x03\x2c\x0a\x7d\xc7\x36\xcc\x0a\x6f\x1d\x19\x40\x51\x4a\xd5\x0f\x0c\x3b\x1a\x3e\x8c\x0f\x35\x8a\x8c\xa1\xd2\x8e\x35\x80\x45\xb1\x06\xbd\x22\x63\xa4\x60\xcf\x08\xdf\xec\x50\x34\x54\x69\xe3\x48\x40\xba\x0e\x74\xf7\xb1\xe6\x80\xf8\x43\x70\x12\x15\x51\x15\x7a\x5d\xb2\x6f\xed\x1e\x35\xf4\xd0\x18\x5c\xef\x9d\x49\x47\x65\xcf\x27\x83\x06\xe3\x55\x0b\xb9\xcf\xc5\x7f\xf9\xd4\x96\x15\x47\x5d\x16\x60\x1f\x44\xa9\x2c\x08\x72\x28\x0b\x0b\x0b\x6d\x40\x2b\x02\x64\x4f\x70\x11\xf9\x08\x32\x6f\xcc\x7e\x78\xc4\xd5\x1a\x2e\x44\xd7\x9b\x4f\xef\xdb\x74\x92\xc0\x64\x32\x81\x2b\xde\xb6\xce\xf8\xcc\x71\xa4\x33\xa4\x29\x41\x22\xbc\x24\xa4\xd9\x35\x40\xb3\xbc\x65\x26\xd8\x1b\x82\xa8\x80\xd1\x4d\x16\x92\x0a\x01\x15\xba\x25\x24\xfc\xb2\xe7\x64\xde\x16\x03\x00\xef\xb4\x01\xba\xc7\xb2\x2a\x68\xdc\x4b\x37\xe4\xb7\x77\x5a\x5f\x86\x8f\x6b\xc6\x7e\x0d\x47\xd3\x29\x7c\x6e\xf1\x23\x3a\x4f\x6a\xc9\xac\x62\x45\x13\x7c\xb3\x97\xe4\x42\xeb\x27\xb6\xd1\x51\xd4\x47\xd2\x10\xfc\xa0\xf4\x9d\xea\x63\x35\xf0\x81\x86\xfa\xac\x05\x30\x1f\xbd\x59\xa1\x2c\x30\x2d\x68\x3e\x1a\xc3\x7c\xf4\xc9\xe8\xdc\x90\xe5\x42\x82\x37\x38\x11\xcc\x47\xdf\x51\x6e\x50\x90\x98\x8f\x9a\xe7\xfe\x54\xa1\xcb\x96\x17\x64\x72\xfa\x40\xeb\x57\xfc\x48\x3f\xfd\xad\xfb\x97\xce\xa0\xa3\x7c\xfd\xaa\xe4\x0f\x5b\x5a\x5c\xf8\x5c\xad\x2b\x7a\x55\x62\xb5\xb5\x79\x81\xd5\xc3\xd4\x5b\x27\xb3\x70\x7d\xc3\x20\xb4\x3a\x4f\x3a\xc7\xfb\xf2\x93\xd5\x6a\x36\x1f\x75\x1a\x19\xeb\x92\xdd\xb7\x72\xeb\xf9\xa8\x97\xea\x16\xab\xb3\xf9\x28\x30\x3b\x1f\xc1\x96\xc8\xb3\xf9\x88\xd9\xe2\x6d\xa3\x9d\x4e\xfd\x62\x36\x1f\xa5\x6b\x47\x76\x7c\x3e\x36\x54\x8d\xb9\x94\x7a\xd5\xbd\x3a\x1f\x7d\xe9\x17\x41\x35\x12\x6b\xb7\x24\x13\xfd\xce\xc2\x6f\x7d\xac\x0d\x82\x49\x5c\xfb\x65\x4c\xb7\x26\x50\xa0\x75\x57\x06\x95\x95\x4d\xe1\xdb\x7b\xad\x24\x6b\x31\xef\x3f\x33\x84\x76\x0f\x59\xe3\x51\xf4\xbb\xde\xa3\x01\xeb\x0d\x03\x60\x5c\xfb\xfc\xf6\xdf\xdb\xc1\x9c\xfd\xcf\x18\x0c\x62\xe1\x63\x1d\x38\xde\x08\x48\xb3\x55\x7a\xf7\x2d\xd7\x52\x61\x10\xe1\x64\xce\x78\x15\x05\xe5\x84\x81\x2a\x58\x2c\xa9\x81\x27\xd6\x5f\x29\xc1\xdd\x92\x0e\x10\x5d\x12\x78\x25\xc8\x14\x6b\x4e\x2c\x59\x07\x90\x4b\x54\x39\xe7\x78\x78\xcf\x08\x87\x01\xc3\x38\xff\xdf\x72\x60\x8f\xf9\xc3\x61\xaa\xde\x36\xf5\x4b\x90\x8f\x39\x08\xbf\x18\x24\x23\x90\xd5\xe4\x43\x09\x94\x65\x54\x39\x8e\xf8\x64\x80\xe0\x81\x7c\xd1\xac\x98\x67\x67\xc0\x85\xc9\xc4\xf5\x3b\x13\x34\xce\xf4\x28\xc3\xd5\x77\x63\x91\xb6\xf4\x25\x2a\xf6\x37\xc1\x7c\x76\x67\x4a\xc8\x0c\xdd\x30\x5b\xd0\xe6\x97\x2e\xe1\x77\x76\xac\x4d\xc5\x75\x5a\x4a\x8c\xf8\x01\x05\x6a\x41\xbf\x42\x19\x25\xde\x7f\x24\x95\xbb\xe5\x0c\x5e\x3c\xff\xcb\xcb\x6f\x7a\xaf\x45\x88\x27\xf1\x37\x52\x5c\x28\xec\x75\x0c\x03\x6a\xd9\xff\x6c\xa3\xf6\x0c\xf2\x25\x4d\xe1\x95\xe4\xed\x9d\x03\xfe\x57\xe7\xb7\xce\xf3\xee\xd0\x82\x25\x07\x29\x72\x97\xe5\x2b\xd6\x13\x67\x37\xa9\xac\x43\x95\xd1\x18\xe4\xe2\x3f\x7b\x44\xb6\x49\xaa\x58\xc3\xf9\xf3\x31\xa4\xb5\x29\xf6\xd3\xd3\xf5\xfd\x4d\xb2\x2f\xe2\x21\xca\xdf\x8e\x77\xf8\x97\x16\xd8\xd4\x7a\x11\x9c\x11\xee\xa4\x5b\x72\x05\x1f\xca\x8a\xba\xe7\x39\x54\x56\xc0\x76\x69\x41\xad\xdc\x87\x1d\x82\xcb\x8b\x9c\xcc\x03\xe1\x21\x95\x7b\xf9\xe7\x21\xaf\x91\x4a\x96\xbe\x9c\xc1\xb3\xde\x0b\x11\x6c\x1f\xe5\x23\xf1\x6a\x57\x63\x21\x83\x6b\x6e\xb0\xe4\x52\x38\x03\x29\xb8\xa6\x5d\x48\x32\x8f\x09\x20\x56\x41\x4d\x90\x2b\xa7\x2d\x5d\x3f\xb1\x35\x8a\x6e\x84\xd4\x27\xa3\x85\xcf\xc8\xf4\x81\x7f\x5c\x7a\x11\xca\x7d\xb9\x90\xd9\x86\xd9\x42\x7b\x11\x62\x31\xb6\xc4\x40\xf7\x6c\xb2\xb6\xc1\xe4\xd2\x63\x90\x64\x49\xa8\xa4\xca\x6d\xcd\x22\x77\x5b\x0c\x73\xb1\x5e\xb9\x5b\x52\x48\xa5\xa1\xc5\xae\x69\x99\x20\x85\x95\x82\x0c\x0d\x93\x45\xc8\x3d\x1a\x54\x8e\x48\x30\x78\x32\x60\xd4\x34\x36\x00\x1e\xbb\x26\xec\x01\xec\x80\x08\x38\x11\x82\x59\xd4\xba\xa1\x0b\xb8\xf3\xfb\x00\xce\xf9\xb3\xe7\x07\x1c\xac\xbd\x35\x70\xa5\x42\xc7\x8d\xff\x0c\xfe\x79\xfd\x66\xf2\x0f\x9c\xfc\x72\x73\x5a\xff\xf3\x6c\xf2\xed\xbf\xc6\xb3\x9b\xa7\x1b\x3f\x6f\xce\x5e\xff\xff\x60\x65\xee\x07\xd2\xf8\x8e\xab\xd6\xe9\xb3\x29\xf7\x1b\x6f\x18\x87\xdc\xaa\x17\x70\x65\x3c\x8d\xe1\x1d\x16\x96\xc6\xf0\x77\x15\x92\xdf\x57\x28\x8a\x94\x2f\x87\xf8\x9a\xc0\x88\x5f\xeb\xaf\x01\xc3\x71\x60\x63\xf8\xbc\x66\x6f\xb0\xfa\x7f\x94\x42\x42\x79\xae\x17\x9b\x78\xb6\xd1\xe4\x43\xc0\x61\x2e\xfc\x93\xba\xd9\x48\x32\x5d\x4e\xbb\x21\xc0\xa0\xe3\x71\x47\x74\x81\x6a\x0d\x1d\xd8\xc6\x56\x60\x37\x22\x2c\x77\xbc\x80\x99\xd1\xd6\xb6\x93\x8f\xe1\x60\x2e\xe4\x2d\x41\xdb\x33\x44\x68\x4f\x29\xc3\xd0\x46\x99\x54\x3a\x83\x66\xdd\x49\x63\x21\x43\x15\x66\x18\x96\x16\xbe\x18\x24\x7b\x6a\x89\x20\x51\x5a\xd0\x7e\x8e\x38\x8b\x88\x8f\xa9\x2c\xa4\x5b\x33\xa6\x0b\xca\xb4\x5a\x14\x32\x74\x7a\xc3\xc9\xa2\xe4\x0e\x1d\x95\x8b\x61\x6c\x28\xa7\x7b\x90\x0e\x4a\xae\xe3\xc9\x72\xe2\x38\x15\xca\x9e\x9f\x3f\x7f\x71\xe9\x53\xa1\x4b\x94\xea\x5d\xe9\xa6\x67\xaf\x4f\x7f\xf6\x58\x30\x62\x8a\xef\xb1\xa4\x77\xa5\x3b\xfb\x7d\x8a\x83\xf3\x97\x0f\xc6\xe1\xe9\x75\x8c\xb6\x9b\xd3\xeb\x49\xfd\xdf\xd3\x66\xeb\xec\xf5\xe9\x3c\x39\x78\x7e\xf6\x94\xb9\xdf\x88\xe1\x9b\xeb\x49\x17\xc0\xc9\xcd\xd3\xb3\xd7\x1b\x67\x67\xbb\xe1\xcc\x79\x58\x66\xf4\x26\xcb\xb4\xff\xc3\xc7\x0f\x7d\xa8\xf1\xc0\x10\x28\x82\x47\x33\x06\xda\x9e\xdf\x3c\x38\x02\x92\xce\xd6\x89\x3e\x4e\x7b\xa2\x57\xd4\x80\xc4\xe0\xec\x0c\xca\x22\xba\x5a\xe6\x3c\x16\x1b\xa3\x22\xb0\x6b\xeb\xa8\xfc\xea\xd9\x4e\xe7\xd4\xc7\x79\xcb\x71\xde\x72\x9c\xb7\x84\x75\x9c\xb7\x1c\xe7\x2d\xc7\x79\xcb\x71\xde\xf2\x68\x65\x1c\xe7\x2d\xdb\xeb\x38\x6f\x39\xce\x5b\x36\xd6\x71\xde\x72\x9c\xb7\x1c\xe7\x2d\xdd\x3a\xce\x5b\xf6\xd7\x71\xde\xf2\xbf\x9b\xb7\xc4\xec\x3b\x03\x67\x7c\x2c\xe3\xac\xd3\x86\xcb\xb6\x8d\x1d\x9f\xb6\xae\xd1\xb8\x75\x1d\xf5\xf0\xeb\x6f\x27\xff\x0e\x00\x00\xff\xff\x36\x76\x0d\x55\x4f\x29\x00\x00") +var _operatorsCoreosCom_operatorconditionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\x5f\x6f\x1b\x37\x12\x7f\xf7\xa7\x18\xe8\x0e\x88\x9d\x93\x56\x51\x5a\xe4\xda\x05\x82\x20\x48\xcf\x87\x20\x71\x1b\xc4\xbe\x3e\x9c\xe5\xbb\xcc\x2e\x47\x2b\xd6\xbb\xe4\x96\x7f\x64\xab\x45\xbf\xfb\x61\x48\xae\x56\xb2\xfe\xc4\x40\x72\x7d\xd2\xbe\xc4\x22\x87\xc3\xe1\xcc\xfc\x7e\x33\x13\x6c\xe5\xcf\x64\xac\xd4\x2a\x07\x6c\x25\xdd\x3b\x52\xfc\xcb\x66\xb7\xdf\xd9\x4c\xea\xf1\x62\x72\x72\x2b\x95\xc8\xe1\x8d\xb7\x4e\x37\x1f\xc9\x6a\x6f\x4a\xfa\x81\x66\x52\x49\x27\xb5\x3a\x69\xc8\xa1\x40\x87\xf9\x09\x00\x2a\xa5\x1d\xf2\xb2\xe5\x9f\x00\xa5\x56\xce\xe8\xba\x26\x33\xaa\x48\x65\xb7\xbe\xa0\xc2\xcb\x5a\x90\x09\xca\xbb\xab\x17\xcf\xb2\x6f\xb3\xc9\x09\x40\x69\x28\x1c\xbf\x92\x0d\x59\x87\x4d\x9b\x83\xf2\x75\x7d\x02\xa0\xb0\xa1\x1c\x74\x4b\x06\x9d\x36\xa5\x56\x22\x5c\x6f\xb3\x6e\xc9\x66\xa5\x36\xa4\xf9\x9f\xe6\xc4\xb6\x54\xb2\x05\x95\xd1\xbe\xed\x8f\x6d\xc8\x44\x9d\xc9\xd0\xf8\xc8\x9f\x92\xdc\x9b\x4e\x7d\xd8\xab\xa5\x75\xef\x76\xef\xbf\x97\xd6\x05\x99\xb6\xf6\x06\xeb\x5d\x06\x86\x6d\x2b\x55\xe5\x6b\x34\x3b\x04\x4e\x00\x6c\xa9\x5b\xca\xe1\x47\x36\xa7\xc5\x92\xc4\x09\x40\xf2\x4d\x32\x6f\x94\xde\xbf\x98\x84\x9f\x7c\x64\x4e\x0d\xe6\xe9\x17\xb0\x5a\xf5\xfa\xc3\xdb\x9f\xbf\xb9\x7c\xb0\x01\x20\xc8\x96\x46\xb6\x2e\x78\x7a\xeb\x05\x20\x2d\x60\x8a\x2e\x74\xe1\x05\x3d\x03\xb7\x6c\x09\x3e\x6d\xc9\x7f\x82\xbb\xb9\x2c\xe7\x7c\xcc\x5b\x12\xe0\x34\x07\x79\x41\x4b\x90\x6a\xa6\x4d\x13\xc2\xc7\xab\x3f\xbd\xbf\x00\x2c\xb4\x77\xe0\xe6\x04\xd6\xa1\x0b\x6a\x51\xad\x5c\x90\xad\x19\xc9\xb7\xe5\xa0\x8b\x5f\xa8\x74\x6b\xcb\x86\x7e\xf5\xd2\x90\x58\x7f\x0f\x7b\xa3\x4b\xba\xb5\xe5\xd6\xb0\x5e\x27\xbb\x88\x76\xdf\x5a\x8a\x6f\xac\x3f\x70\xcc\x13\xf6\x5e\x94\x03\xc1\xd9\x4d\x36\x18\x9e\xe2\x40\x22\xb9\x3c\xb8\x66\x2e\x2d\x18\x6a\x0d\x59\x52\x31\xdf\xbb\xa7\x85\x07\x64\x70\x49\x86\x0f\x82\x9d\x6b\x5f\x8b\xe8\x21\xe3\xc0\x50\xa9\x2b\x25\x7f\x5b\x69\xb3\xec\x29\xbe\xa6\x46\x47\xd6\x81\x54\x8e\x8c\xc2\x1a\x16\x58\x7b\x1a\x02\x2a\x01\x0d\x2e\xc1\x10\xeb\x05\xaf\xd6\x34\x04\x11\x9b\xc1\x85\x36\x14\x9c\x9f\xc3\xdc\xb9\xd6\xe6\xe3\x71\x25\x5d\x07\xe0\x52\x37\x8d\x57\xd2\x2d\xc7\x01\x8b\xb2\xf0\x8c\x83\xb1\xa0\x05\xd5\x63\x2b\xab\x11\x9a\x72\x2e\x1d\x95\xce\x1b\x1a\x63\x2b\x47\xc1\x58\x15\xc1\xd5\x88\xbf\x98\x94\x13\xf6\xc9\x03\xf7\xc5\x90\x59\x67\xa4\xaa\x36\xb6\x02\x96\x0e\xfa\x9a\xd1\x14\x13\x2f\x1e\x8f\x6f\xe9\x5d\xca\x4b\xec\x95\x8f\xff\xb8\xbc\x82\xce\x80\xe8\xf6\xe8\xe1\x5e\xd4\xf6\xce\x66\x47\x49\x35\x23\x13\x25\x67\x46\x37\x41\x0b\x29\xd1\x6a\xa9\x62\x22\x96\xb5\x24\xe5\xc0\xfa\xa2\x91\xce\x86\x04\x23\xeb\x38\x0e\x19\xbc\x09\xfc\x05\x05\x81\x6f\x05\x3a\x12\x19\xbc\x55\xf0\x06\x1b\xaa\xdf\xa0\xa5\xff\xbb\xab\xd9\xa3\x76\xc4\xee\x7b\xbc\xb3\xd7\xe9\x77\xfb\xc0\x16\xa0\x00\x3a\x6a\xdc\x1b\x9d\x2d\xc8\x5f\xb6\x54\x02\xd6\xb5\xbe\xe3\x88\x95\xb5\xb7\x8e\x0c\xa0\x68\xa4\xda\x03\xff\xc3\xb8\x4f\xec\x30\x84\x56\x3b\x7e\x3d\xd6\xf5\x12\xf4\x82\x8c\x91\x82\x23\x1f\xcf\x18\x6a\xb5\x71\x24\xa0\x58\x06\x4d\xbb\x58\xe3\xe0\x43\xf7\x53\x42\x7c\x72\x5b\xeb\x65\xc3\x19\xb4\xbd\xd9\x69\x45\x63\x70\xb9\x63\x57\x3a\x6a\x76\x1e\x3b\x10\x28\xfe\xd2\x23\x77\xd9\xf3\x05\x57\x6e\x44\x6f\xd0\x33\x3b\x67\x21\x4a\x65\x41\x90\x43\x59\x5b\x98\x69\x03\x5a\x11\x20\xe7\x80\x8b\x4c\x46\x50\x7a\x63\x02\x24\xba\x50\x05\xf4\xbc\xfe\xf0\x76\x55\x0e\x32\x18\x8d\x46\x70\xc5\xcb\xd6\x19\x5f\x3a\xc6\x2e\x53\x95\x12\x24\x82\x56\x21\x4d\xe0\x27\xcb\xca\x39\xd6\xe1\x19\x80\x31\x09\x66\x92\x6a\x01\x2d\xba\x39\x64\x7c\x8b\xe7\x02\xbc\x2a\xe0\x00\xe7\xda\x00\xdd\x63\xd3\xd6\x34\x8c\x75\xe7\x5c\xeb\xcb\x20\x98\x2e\xfc\x3d\x3c\x74\x3c\x86\x8f\x2b\xdc\xc7\xa4\x28\x2c\x99\x45\xec\x38\x42\x96\xc1\x4c\xeb\x27\x76\xf3\x4d\x59\x77\xf8\x9d\xd2\x77\x6a\x97\x09\xe1\x4e\x34\x94\xc3\x74\xf0\x7a\x81\xb2\xc6\xa2\xa6\xe9\x60\x08\xd3\xc1\x07\xa3\x2b\x43\x96\x0b\x38\x2f\x30\x21\x4f\x07\x3f\x50\x65\x50\x90\x98\x0e\x3a\xd5\x7f\x6b\xd1\x95\xf3\x0b\x32\x15\xbd\xa3\xe5\xcb\xa0\x70\x63\xeb\xd2\x19\x74\x54\x2d\x5f\x36\x2c\xb3\xda\xe3\xde\xe2\x6a\xd9\xd2\xcb\x06\xdb\x8d\xc5\x0b\x6c\x37\x14\xad\xc2\x6a\xe1\xfa\x86\x41\xbf\x98\x64\x7d\xa8\x3f\xfd\x62\xb5\xca\xa7\x83\xfe\x4d\x43\xdd\x70\xca\xb4\x6e\x39\x1d\xc0\x86\x05\xf9\x74\x10\x6c\xe8\xd6\x3b\xa3\xf3\xe9\x80\x6f\xe3\x65\xa3\x9d\x2e\xfc\x2c\x9f\x0e\x8a\xa5\x23\x3b\x9c\x0c\x0d\xb5\x43\x6e\x41\x5e\xf6\x37\x4c\x07\x9f\x60\xaa\x3a\xa3\xb5\x9b\x93\x89\x91\xb6\xf0\xc7\xe0\x00\x36\x76\x42\x35\x7e\xbb\xcb\x7d\xff\x71\xe1\xb7\x16\x2b\xda\xbb\x6f\x08\x6d\x6a\xdb\x76\x6d\xc7\xd0\xef\xdd\x66\x03\x77\x6e\x1e\x62\x92\xf8\xd5\x68\xdd\x95\x41\x65\x65\xd7\xbf\xee\x93\x7c\x00\xd8\xed\x83\x8c\xae\xd8\x13\x58\x07\x8e\x17\x02\x4c\x57\xc1\x76\x2b\x69\x46\x1f\x57\x39\x06\x75\x7c\x1a\x73\x2b\xaa\x10\x8c\x2c\x21\x36\xb6\x20\x05\xc1\xdd\x9c\x54\x50\xe5\x95\x20\x53\x2f\x99\x6b\x7b\xad\xe5\x1c\x55\xc5\x25\x0f\xde\x32\x05\x60\x00\x39\x97\xc3\x5b\x46\xcd\x90\x0f\x2a\xf0\xb6\x2b\xcd\xc1\xae\x95\x46\x66\x8b\x88\xf2\xa4\x26\x54\xf7\xb2\xa4\xd6\x31\x94\x1e\x72\x76\xff\x1d\xa4\xcb\xee\x8b\x85\x25\x07\xae\xc9\x23\xbe\x78\x8f\x64\x4a\x8e\x47\x3a\x3e\x49\xc7\x3e\x64\xee\x1b\x54\x9c\x3d\x82\xed\xed\xf7\x94\x90\x25\x86\x7e\xa4\x23\xd1\xbe\xb6\xf5\x71\x48\xae\xe6\x06\xa4\x20\xa6\xbf\x00\xbc\xf4\xac\x2f\x7c\x7c\x83\xf7\xef\x49\x55\x6e\x9e\xc3\x37\xcf\xff\xfe\xe2\xbb\x3d\x82\x91\x09\x49\xfc\x93\x14\xd7\xc9\x1d\xed\xee\x1e\x37\x6c\x1f\x5c\x6b\xae\xc2\x3b\xb3\xae\xc7\xc8\xaa\x5e\x26\x64\xc8\x66\x5e\xde\xa1\x05\x4b\x0e\x0a\xe4\xc1\xc0\xb7\xec\x17\xa6\x76\xa9\xac\x43\x55\xd2\x10\xe4\x6c\xb7\x32\xb9\x62\xec\x7a\x09\x93\xe7\x43\x28\x92\x8b\xb7\xb9\xfa\xfa\xfe\x26\xdb\x61\xb2\xb4\xf0\xfd\xf0\x81\x3d\xdc\x2d\xfa\x50\xe6\x38\x71\xe0\x4e\xba\x39\x37\x93\xa1\xf6\xa5\xb6\x7b\x47\xed\xa3\x95\xbd\x9f\x0b\x1c\x57\xc0\x8a\xcc\x67\xd3\x56\x2a\xf7\xe2\xdb\xfd\xf1\x95\x4a\x36\xbe\xc9\xe1\xd9\x1e\x91\x48\x69\x8f\x8c\x66\x14\xee\x4b\x3f\x32\x75\x55\x06\x1b\xee\xcc\x4a\x90\x82\x1b\xae\x99\x24\xb3\x9e\xda\xfc\xe8\x74\x90\x8b\xf9\x86\x17\x9f\xd8\xc4\x43\x6b\xc9\xfe\xc1\x68\xe1\x4b\x6e\xb9\xf5\x2c\xf4\x93\x72\x26\xcb\x75\x82\xe2\x3e\x36\xa0\x21\x4e\x52\x40\xf7\xec\xf4\xd5\xcc\x12\xc7\x1a\x42\x25\x55\x65\xd3\x95\xdc\xb0\x33\x81\xc4\x12\x7b\x37\xa7\x50\x4f\xc2\x04\x96\xce\x98\x60\x95\x95\x82\x0c\x09\x40\xa8\x3c\x1a\x54\x8e\x48\x30\xfd\x30\x04\x93\xec\x1a\xe5\x61\xdf\xbd\x77\x68\x8c\x50\x8d\x64\xc5\x26\xa6\x8e\x3f\x20\xf6\xeb\x41\x75\xf2\xec\xf9\xc1\x90\xaf\xe4\xf6\x0a\xb5\xe8\x78\x16\xcc\xe1\x3f\xd7\xaf\x47\xff\xc6\xd1\x6f\x37\xa7\xe9\x8f\x67\xa3\xef\xff\x3b\xcc\x6f\x9e\xae\xfd\xbc\x39\x7b\xf5\xd7\x3d\x9a\x22\x82\x1e\x99\x3e\xa9\x88\x74\x9d\x61\x17\xd1\x61\xa8\x30\x7a\x06\x57\x86\xa7\xd2\x73\xac\x2d\x0d\xe1\x5f\x2a\x94\x86\x2f\x74\x1a\x29\xdf\xec\xb7\x8e\xab\xf2\x80\x6f\xdd\xdd\x51\xac\x44\x82\x49\x87\x65\x92\xb9\x7b\x64\x82\xad\x8f\x73\x52\xe8\xc9\xf4\x6c\x9d\x69\xd6\xa6\x44\x08\x8c\xc7\x7d\x68\x96\x7a\xda\xac\xd4\xcd\x78\x6d\x8a\xe4\x66\xfa\x02\xd5\x12\x7a\x5a\x8b\x1d\xe8\xc3\x4c\xb7\x3c\x1e\x01\x96\x46\x5b\xbb\x1a\x83\x2d\xd4\xf2\x96\x60\xd5\xa6\x46\xb2\x2c\xa8\xc4\xd0\x7d\x9b\x42\x3a\x83\x66\xd9\x5b\x67\xa1\x44\x15\x86\x5a\x4b\x33\x5f\xc3\xa9\x25\x82\x4c\x69\x41\xdb\xec\x7a\x16\x39\x14\x0b\x59\x4b\xb7\x64\x96\x14\x54\x6a\x35\xab\x65\x6a\xfa\x1b\x1e\xca\x50\xb9\x08\x37\x43\x15\xdd\x83\x74\xd0\x70\x23\x49\x96\x45\x4e\x85\xb2\x93\xc9\xf3\x6f\x2e\x7d\x21\x74\x83\x52\x9d\x37\x6e\x7c\xf6\xea\xf4\x57\x8f\x35\x33\x8f\xf8\x11\x1b\x3a\x6f\xdc\xd9\xd7\x2b\x8b\x93\x17\x8f\x40\xd1\xe9\x75\xc4\xca\xcd\xe9\xf5\x28\xfd\xf5\xb4\x5b\x3a\x7b\x75\x3a\xcd\x0e\xee\x9f\x3d\xe5\x37\xac\x21\xf0\xe6\x7a\xd4\xc3\x2f\xbb\x79\x7a\xf6\x6a\x6d\xef\x6c\x1b\x8c\x5c\xb1\x64\x49\xaf\xcb\x52\xfb\x3f\x6d\xe6\xdc\x8d\xfd\xcf\x4c\xfb\x91\x02\xba\x79\x7f\x73\x6c\xdf\x31\xeb\x4b\x67\x53\xf9\x8c\x63\x7d\xcc\x8c\x44\x24\x4c\xb0\xce\xa0\xac\x63\x5a\x95\xce\x63\xbd\xf6\x7f\x02\x60\x97\xd6\x51\xf3\x95\x46\xfa\x3e\x8d\x8f\xe3\xf5\x71\xbc\x3e\x8e\xd7\x5b\xdf\xe7\xc7\xeb\xed\x61\xf4\x38\x89\x1f\x27\xf1\xfe\x3b\x4e\xe2\xc7\x49\xfc\x38\x89\x3f\x2a\x9a\xc7\x49\xfc\x38\x89\x6f\x7e\xc7\x49\x3c\xc9\x1c\x27\xf1\xe3\x24\xfe\x67\x4f\xe2\xb1\x4e\xe5\xe0\x8c\xef\x9a\x16\xeb\xb4\xe1\x26\x65\x63\xcd\x17\xab\xf0\xf6\x49\x98\x90\x0b\xbf\xff\x71\xf2\xbf\x00\x00\x00\xff\xff\x62\xf8\xf1\x09\x32\x25\x00\x00") func operatorsCoreosCom_operatorconditionsYamlBytes() ([]byte, error) { return bindataRead( @@ -159,12 +159,12 @@ func operatorsCoreosCom_operatorconditionsYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "operators.coreos.com_operatorconditions.yaml", size: 10575, mode: os.FileMode(436), modTime: time.Unix(1606762435, 0)} + info := bindataFileInfo{name: "operators.coreos.com_operatorconditions.yaml", size: 9522, mode: os.FileMode(436), modTime: time.Unix(1607977324, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _operatorsCoreosCom_operatorgroupsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x59\x5f\x73\xdb\x36\x12\x7f\xf7\xa7\xd8\x71\x1f\xdc\xcc\x98\x52\x9b\xbe\xdc\xe8\xcd\x93\xe4\x3a\xbe\x4b\x1d\x8f\xed\xe6\xa5\xd3\x87\x15\xb9\x12\x71\x02\x01\x1e\x00\x4a\xd6\x65\xf2\xdd\x6f\x16\xe0\x7f\x91\xb4\x92\xbb\x36\x7d\x20\x5f\x6c\x91\xc0\x62\xff\xfe\x76\x17\x8b\xb9\xf8\x48\xc6\x0a\xad\x56\x80\xb9\xa0\x67\x47\x8a\x7f\xd9\xc5\xee\x6f\x76\x21\xf4\x72\xff\xe3\xc5\x4e\xa8\x64\x05\x6f\x0a\xeb\x74\xf6\x40\x56\x17\x26\xa6\xb7\xb4\x11\x4a\x38\xa1\xd5\x45\x46\x0e\x13\x74\xb8\xba\x00\x40\xa5\xb4\x43\x7e\x6d\xf9\x27\x40\xac\x95\x33\x5a\x4a\x32\xd1\x96\xd4\x62\x57\xac\x69\x5d\x08\x99\x90\xf1\xc4\xab\xa3\xf7\x3f\x2c\x7e\x5a\xfc\x70\x01\x10\x1b\xf2\xdb\x9f\x44\x46\xd6\x61\x96\xaf\x40\x15\x52\x5e\x00\x28\xcc\x68\x05\x3a\x27\x83\x4e\x9b\xad\xd1\x45\x6e\x17\xd5\x4f\xbb\x88\xb5\x21\xcd\x7f\xb2\x0b\x9b\x53\xcc\xa7\xfb\x35\xcd\x96\xce\x9a\x40\xaf\x62\x12\x1d\x6d\xb5\x11\xd5\xef\x08\xb4\xcc\xfc\x7f\x41\xf4\x0f\x25\x85\x9f\x99\xa0\x7f\x2f\x85\x75\xff\x3c\xfd\xf6\x5e\x58\xe7\xbf\xe7\xb2\x30\x28\xfb\xec\xfa\x4f\x36\xd5\xc6\xdd\x35\x87\x47\xa0\xb7\xe1\x83\x50\xdb\x42\xa2\xe9\xed\xba\x00\xb0\xb1\xce\x69\x05\x7e\x53\x8e\x31\x25\x17\x00\xa5\xea\x3c\x91\xa8\x54\xce\xfe\xc7\x40\x28\x4e\x29\xc3\x40\x1d\x98\x98\xba\xb9\xbf\xfd\xf8\xd3\x63\xe7\x35\x40\x42\x36\x36\x22\x77\xde\x00\x1d\x31\x40\x58\x70\x29\x41\xa1\x84\x03\xbd\x81\xac\x90\x4e\x38\x52\xa8\xe2\x23\x6c\xb4\x81\x0f\xef\x7f\x81\x0c\x15\x6e\x29\x69\xa9\xb7\xa6\x0c\x70\xeb\xd8\xf2\xd6\x19\x14\x2a\xd0\x12\xca\x3a\x94\xd2\x1b\x97\x69\xd6\xdb\x40\x28\x10\xce\x06\x7b\xb0\x74\xe0\x34\x20\xb0\x11\xc5\x46\x78\x59\xab\xc7\x92\x67\xc7\xa1\xd9\x92\x6b\x36\xb4\x4e\x76\x47\x56\x94\x5e\xff\x8b\x62\x57\xbf\x34\xf4\xef\x42\x18\x4a\x1a\xd1\x23\xa8\x9c\xb6\x7e\x95\x1b\xe6\xc8\xd5\x3e\x10\x9e\x56\x78\xb4\xde\xf6\x74\x77\xc5\xea\x0d\xab\x20\xe1\xb8\xa0\x20\x72\x69\x22\x4a\x4a\x8b\x78\xde\x53\x61\xc1\x50\x6e\xc8\x92\x0a\x91\xd2\x21\x0c\xbc\x08\x55\x29\xc2\x02\x1e\xc9\x30\x19\xf6\x9a\x42\x26\xac\xd4\x3d\x19\x07\x86\x62\xbd\x55\xe2\x3f\x35\x6d\xcb\x5a\xe3\x43\x25\x3a\xb2\xae\x47\x53\x28\x47\x46\xa1\x84\x3d\xca\x82\xae\x01\x55\x02\x19\x1e\xc1\x10\x9f\x02\x85\x6a\xd1\xf3\x4b\xec\x02\x7e\xd1\x86\xad\xb6\xd1\x2b\x48\x9d\xcb\xed\x6a\xb9\xdc\x0a\x57\xc1\x42\xac\xb3\x8c\xdd\xe3\xb8\xf4\x11\x2e\xd6\x05\xdb\x72\x99\xd0\x9e\xe4\xd2\x8a\x6d\x84\x26\x4e\x85\xa3\xd8\x15\x86\x96\x98\x8b\xc8\xb3\xae\x3c\x34\x2c\xb2\xe4\x3b\x53\x02\x89\xbd\xea\xf0\x1a\x0c\x68\x9d\x11\x6a\xdb\xfa\xe0\xe3\x70\xc2\x02\x1c\x8b\xec\xb5\x58\x6e\x0d\x52\x34\x8a\xe6\x57\xac\x9d\x87\x77\x8f\x4f\x50\x1d\xed\x8d\xd1\xd7\xbe\xd7\x7b\xb3\xd1\x36\x26\x60\x85\x09\xb5\x21\x13\x8c\xb8\x31\x3a\xf3\x34\x49\x25\xb9\x16\xca\xf9\x1f\xb1\x14\xa4\xfa\xea\xb7\xc5\x3a\x63\x17\x67\x47\x24\xeb\xd8\x56\x0b\x78\xe3\xb1\x12\xd6\x04\x45\x9e\xa0\xa3\x64\x01\xb7\x0a\xde\x60\x46\xf2\x0d\x5a\xfa\xc3\x0d\xc0\x9a\xb6\x11\x2b\xf6\x3c\x13\xb4\x61\xbe\xbf\xb8\x17\x70\x00\x15\x04\x8f\xd8\xab\x83\x36\x8f\x39\xc5\x15\xe2\xf0\x3e\x8f\x30\xa8\x7a\x90\x54\x19\x6d\x71\xce\xf1\x63\xe1\xec\x59\x23\x49\xb1\xd3\xa6\xff\xbe\xc7\xe2\x63\xb9\xac\x5c\x1f\xd8\xeb\xb0\x74\x65\xa7\x90\xe8\x45\x0e\xa7\xb9\xf4\x1a\x47\x17\xa7\xef\x9e\xd9\x13\x6d\x93\x51\x27\xb9\xee\x6f\x09\x31\xc1\xd9\x8a\x71\x45\xe2\x9a\x64\xad\x80\x0a\x17\x33\xef\xe6\x83\xb4\x01\x9e\x52\xea\xac\x03\x34\x04\x37\x77\x6f\x29\x19\xde\x11\xc4\x45\x63\xf0\x38\xf8\x5d\x38\xca\x46\x04\xe9\x89\x72\x33\xc1\x6e\x19\xea\xd5\x17\x97\xe2\xa9\x6e\xab\x87\xc3\xc3\x67\xa1\x00\x6c\xd7\x80\xb0\xa3\x63\xc0\x40\x06\xda\xd2\xa4\x9e\x08\x18\xf2\xf8\xe9\x8d\xbd\xa3\x61\x11\xf8\xe1\xcd\x25\x50\x8e\xac\x99\xb4\x7b\x78\x4e\xf3\x52\xf7\x89\x26\x58\x88\x6a\xc6\x47\x16\x4c\xbb\x56\x78\x76\x74\x1c\xff\xd8\x33\xc7\x8e\x8e\x55\x90\x06\xbb\xf0\x0b\xaf\x33\x1f\xb7\x95\x29\x30\xcf\xa5\xa0\x3e\xaa\x76\x1f\xa7\xc7\x94\x06\xe3\xf0\xd3\x7d\x2a\xe1\xcf\x66\xbf\x36\x73\x83\xec\xc1\x11\xae\x6c\x30\x3a\x47\x4b\x2a\x72\x70\x7a\x92\x77\xac\x8a\x90\x2a\x4d\x7e\x44\x29\x5a\x45\x90\x8f\x8f\x5b\x75\x0d\x77\xda\xf1\x9f\x77\xcf\xc2\xba\x69\x75\xb0\x2f\xbd\xd5\x64\xef\xb4\xf3\xab\xff\x67\xe5\x04\xd6\xce\x56\x4d\x58\xee\x43\x4a\x85\xc8\x65\xf9\xda\x79\xd4\x2e\xe0\x96\x4b\x17\x9a\x94\xa3\x56\xb1\xb0\x9c\xc9\xb4\xa9\x74\xe0\x6b\xa1\x70\x48\x20\x9f\x15\xd6\x27\x3e\xa5\x55\x44\x59\xee\x8e\x53\x22\x43\x79\x76\x87\x7e\x50\x2b\x9f\xd1\xd6\x5c\xfb\xa8\x69\x95\x77\xd8\x08\x2c\xc0\x13\x67\xf5\xf0\x25\xd4\x68\x92\x4b\x6d\x48\x0a\xaf\x08\x5f\x59\x70\x9f\x20\xe2\x49\xd2\x19\x99\x2d\x41\xce\x38\xfc\xb2\x21\xc7\x71\x32\x3c\x93\x68\xd9\x26\x34\xea\x11\x3e\x21\xbc\xe7\x80\x3d\x3b\x7d\x84\xd5\x01\x62\x33\xcc\xd9\x19\x3e\x31\x62\x7a\xbd\x7e\x86\x1c\x85\xb1\x0b\xb8\xf1\xfd\x8a\x1c\x73\x89\xf6\x0e\xa1\xbc\x5d\xda\xc4\x99\xae\xb0\xc0\x00\xb8\x47\xc9\x88\xce\x45\xbf\x02\x92\x1e\xdf\x47\x88\x72\x2b\xd2\x4b\x70\xd7\x70\x48\xb5\xf5\x60\x0d\x1b\x41\xd2\x57\x81\x97\x3b\x3a\x5e\x5e\x77\x9c\x66\x84\x22\x2f\xbe\x55\x97\x21\x1b\x9c\xf8\x69\x9d\x3a\xb4\x92\x47\xb8\xf4\xdf\x2e\x17\x27\x39\x71\x84\xf6\x59\x99\x72\x22\x41\x60\x92\xf8\x06\x1b\xe5\xfd\x8b\x58\x3e\xe1\x05\x96\xcc\x5e\xc4\x74\x13\xc7\xba\x50\xbe\xf1\x7c\xb1\xf2\xe9\x6f\xa8\x80\x1f\x93\x4c\xa8\xa6\x33\xab\x48\x03\x86\xa5\x03\xbc\x1d\x52\x11\xa7\x70\x10\x52\xfa\x42\xd7\x52\xc2\x86\x4e\x28\x97\xfa\x58\xdb\xe6\x7b\xfb\x2a\xf8\x88\xb0\x4d\x90\xfb\xde\x77\xac\x9c\x1a\x16\x94\xdb\xa9\xf8\xde\xe8\xbd\x48\x28\xb9\xb9\xbf\x1d\xd0\x56\x57\x50\xbf\x01\x1c\x49\x69\x7d\x4b\xcb\xf5\xb8\xd3\x65\x3d\x3e\x58\xf0\xe5\x2d\xea\x03\xe2\x36\xd7\x1f\x23\x8c\xaf\xb5\x96\x84\xfd\xaf\xa1\x8c\xac\xdb\xfb\x97\xf8\x7e\xea\x2d\x2f\xa1\x9b\x9e\x73\x29\x62\xe1\xaa\x0c\xd5\x54\xa5\xc3\x49\x2d\x9c\xea\xa1\x5d\xf8\x8a\xca\x92\xbb\x6e\xea\x5e\x61\x41\x6c\x95\x36\x43\xfe\x3b\x85\x5e\xa3\x98\x35\x89\x54\xcf\xd1\xae\x58\x93\x51\xe4\xc8\x46\x5c\xaf\x46\xe5\x72\xea\xb4\x15\x0e\x5d\x61\xcf\x6e\x2c\xfc\xea\xba\xb5\x08\xbf\x86\x9a\x8b\x87\x2f\xeb\x2d\x86\xeb\xb6\x08\x24\x5a\xf7\x6b\xe8\xe5\xce\xec\x45\x5a\x3b\x5e\xb0\xf9\xfb\x66\x65\x40\x66\x57\x5d\x90\x85\x5b\x05\xf2\xb4\xfc\xdb\x21\xc7\x1d\x30\x47\xa9\x8f\x03\x5a\x28\x09\x7f\x51\xb4\x01\x6b\x32\x43\xb7\x02\xde\x1b\xf1\xc1\xbd\x15\xea\x5c\x7f\xee\x7a\x72\x28\x27\x87\x2f\x7a\xbc\xf5\x4e\xc4\xfb\xeb\xf8\x27\x9c\xe0\xed\x03\x6d\xbe\x08\x6e\x1f\x68\x03\x86\x36\x64\x48\xc5\x54\x29\xa3\x83\xb2\xe3\x29\xa3\x06\xe6\xff\x6b\x17\x3a\x76\x05\x36\x28\xcc\xcd\xfd\x6d\x75\xed\x55\xf9\x65\x29\xcd\x48\x59\xfb\x42\xf9\xe2\x53\xfa\x3d\xba\xf4\x8c\xb3\xaf\x6e\x4b\xd5\xf9\x7a\xcd\x5f\x22\xe6\x82\x62\xea\xdc\xa8\xf9\x7b\x48\xc2\x04\xf4\x66\x2c\x6d\x2b\x20\xe5\x84\xa1\x72\xc7\x75\x48\x4c\x65\x3d\xdc\xdc\xc3\x71\x65\x00\xc8\x05\x83\x48\xe0\x1f\x8f\x1f\xee\x96\x3f\x8f\xb5\x0e\xa1\x30\xc1\x38\x26\x6b\x7d\xdc\xf9\xba\xe1\x1a\x6c\x11\xa7\x80\x96\xc5\x60\x3c\x61\xbc\xa2\x45\x86\x4a\x6c\xc8\xba\x45\x79\x06\x19\xfb\xdb\xeb\xdf\xc7\x6a\xc9\xbf\x6b\x03\xf4\x8c\x59\x2e\xe9\x1a\x44\x59\x28\x57\x77\x58\xa5\x1b\xf9\xa8\x62\x75\xd4\x14\xe1\x20\x5c\x2a\x4e\x93\x54\xa9\x01\xc8\x75\x52\x8a\x7d\xf0\xe2\x3a\xdc\x11\xe8\x52\xdc\x82\x40\x8a\x1d\xad\xe0\x92\x1d\xae\xc5\xe6\x27\x0e\xd4\xcf\x97\x23\x54\xbf\x3f\xa4\x64\x08\x2e\x79\xd1\x65\x60\xae\xbe\xb4\xe4\x77\x95\xbf\x34\x4c\x86\xee\xd2\x88\xed\x96\x4c\x0f\x52\x9b\xc7\xdf\xc0\xed\x49\xb9\x57\xdc\x0d\x88\x0d\x28\xdd\x22\xa1\xca\xea\xa5\xa9\x59\xfa\x4c\xff\xf6\xfa\xf7\x51\x8e\xbb\xfa\x02\xa1\x12\x7a\x86\xd7\x75\xad\x92\xeb\xe4\x55\xd9\x36\xd8\xa3\x72\xf8\xcc\x27\xc5\x5c\x8e\x8e\x69\xd6\xd7\x91\x4e\x43\x8a\x7b\x02\xab\x33\x82\x03\x49\x19\x85\x4b\xe3\x04\x0e\xa1\xf5\xaa\x0c\x17\xda\x8e\x1c\x8d\x9b\xf4\xd6\xea\xaa\xf8\xe9\xc3\xdb\x0f\xab\xc0\x19\x3b\xd4\x56\x31\x3b\x5c\xd2\x6c\x84\x42\x59\x56\xb8\xc2\xd6\x65\xf2\x08\x45\x5b\x04\xf7\x71\x1a\xe2\x14\xd5\x96\xaa\xfa\x7d\x53\xb8\xc2\xd0\xe2\xea\x6b\xe2\xf8\xf4\xfe\xb6\x7a\x06\xee\x71\xfb\xc0\xf1\xcd\x6e\x42\xcf\x14\x4e\x0d\xd6\xd4\xa7\xc2\xdd\xb5\xbc\x7c\x52\xb8\x26\xd5\xb0\x7c\x89\x8e\x2d\x8b\x16\x53\xee\xec\x52\xef\x39\x1d\xd0\x61\x79\xd0\x66\x27\xd4\x36\x62\xd7\x8c\x82\x0f\xd8\xa5\x4f\x95\xcb\xef\xfc\x9f\xaf\x96\xc5\xe7\xda\x73\x05\x0a\x23\x9b\x3f\x41\x2a\x5f\x00\x2c\xbf\x4a\xa8\xea\xee\xf8\xfc\x3c\x76\xf5\x18\x00\x23\xee\xef\xe5\xb0\x08\x4d\x4d\x39\xc9\x29\x31\x76\xbc\xbf\xcc\x30\x09\xd0\x8c\xea\xf8\x87\xbb\x32\x2b\xb4\x30\xcc\xd1\x31\x2a\x47\xaf\x11\xaa\x84\xff\xb7\xc2\x3a\x7e\xff\x55\x1a\x2c\xc4\x59\xe1\xfb\xeb\xed\xdb\x3f\xc7\xc1\x0b\x71\x76\xac\x72\xf9\x44\xc9\x0a\x9c\x29\x82\x95\xac\xd3\x06\xb7\xd4\x7e\x53\xac\xeb\x71\x54\x25\x66\xd9\x6a\xc0\xa7\xcf\x9d\x01\x2b\xca\x3c\xc5\xd7\x61\xd7\x3c\x66\x9d\xc7\xac\x9d\x67\x1e\xb3\xce\x63\xd6\x79\xcc\x5a\xb2\x36\x8f\x59\xe7\x31\xeb\x3c\x66\x85\x79\xcc\x3a\x8f\x59\xe7\x31\xeb\x3c\x66\x9d\xc7\xac\xf3\x98\x75\x1e\xb3\xce\x63\xd6\x6f\x35\x66\x9d\x47\xa7\xf3\xe8\xf4\x5b\x8c\x4e\xe7\x71\xe8\x3c\x0e\x1d\x92\x62\x1e\x87\xce\xe3\xd0\x79\x1c\x7a\xf2\xcc\xe3\xd0\x79\x1c\x3a\x8f\x43\xe7\x71\xe8\x37\x18\x87\x6e\x50\xda\xb3\xe6\xa1\xff\x0d\x00\x00\xff\xff\xcf\x0d\x29\x66\x34\x3c\x00\x00") +var _operatorsCoreosCom_operatorgroupsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x59\x4d\x73\x1b\xb9\xd1\xbe\xeb\x57\x74\x71\x0f\xb2\xab\x44\xf2\xb5\xdf\x1c\x52\xbc\xa9\x6c\x67\x4b\x89\x57\x56\x59\x5a\x5f\xb6\xf6\xd0\x9c\x69\x72\x10\x62\x80\x09\x80\x21\xc5\xb8\xfc\xdf\x53\xdd\xc0\x90\xc3\xe1\x87\x28\x25\xde\xf5\x61\xe6\x22\x11\x1f\x8d\xfe\xc2\x83\x07\x68\xac\xd4\x17\x72\x5e\x59\x33\x01\xac\x14\x3d\x06\x32\xfc\xcb\x8f\x16\x7f\xf5\x23\x65\xc7\xcb\x37\x17\x0b\x65\xf2\x09\xbc\xab\x7d\xb0\xe5\x67\xf2\xb6\x76\x19\xbd\xa7\x99\x32\x2a\x28\x6b\x2e\x4a\x0a\x98\x63\xc0\xc9\x05\x00\x1a\x63\x03\x72\xb3\xe7\x9f\x00\x99\x35\xc1\x59\xad\xc9\x0d\xe7\x64\x46\x8b\x7a\x4a\xd3\x5a\xe9\x9c\x9c\x08\x6f\x96\x5e\xfe\xdf\xe8\x2f\xa3\x37\x17\x00\x99\x23\x99\xfe\xa0\x4a\xf2\x01\xcb\x6a\x02\xa6\xd6\xfa\x02\xc0\x60\x49\x13\xb0\x15\x39\x0c\xd6\xcd\x9d\xad\x2b\x3f\x6a\x7e\xfa\x51\x66\x1d\x59\xfe\x53\x5e\xf8\x8a\x32\x5e\x5d\xc6\x6c\xa7\xec\x8c\x89\xf2\x1a\x25\x31\xd0\xdc\x3a\xd5\xfc\x06\x18\x82\xd5\xa5\xfc\x1f\x8d\xff\x94\x64\xfc\xcc\x22\xa5\x5d\x2b\x1f\xfe\xb1\xdf\xf7\x51\xf9\x20\xfd\x95\xae\x1d\xea\xae\xc2\xd2\xe5\x0b\xeb\xc2\xed\x76\x79\x59\x6e\x1e\xbb\x94\x99\xd7\x1a\x5d\x67\xde\x05\x80\xcf\x6c\x45\x13\x90\x69\x15\x66\x94\x5f\x00\x24\xf7\x25\x31\xc3\xe4\xa2\xe5\x9b\x24\xd5\x67\x05\x95\xd8\xac\x01\x2c\xd2\x5c\xdf\xdd\x7c\xf9\xff\xfb\x4e\x07\x40\x4e\x3e\x73\xaa\x0a\x12\x8c\x1d\x83\x40\x79\x08\x05\x41\x6d\x54\x00\x3b\x83\xb2\xd6\x41\x05\x32\x68\xb2\x35\xcc\xac\x83\x4f\x1f\x7f\x81\x12\x0d\xce\x29\x6f\xb9\x1a\x6e\x02\xc7\xde\x07\x87\xca\x44\x09\xca\xf8\x80\x5a\x4b\x78\x59\xd2\x66\x30\x28\x03\x2a\xf8\x18\x11\xb6\x0d\x82\x05\x04\x0e\xa3\x9a\x29\xca\xc1\x93\x2c\x1d\xd0\xcd\x29\x6c\x87\xf9\x51\xcb\x82\xb0\x66\xf7\xd8\xe9\x3f\x29\x0b\xad\x66\x47\xff\xaa\x95\xa3\xbc\x6d\x2c\xbb\xaa\x49\xda\x56\x73\xe5\x58\xa3\xd0\xca\x82\xf8\xb5\xb6\xc8\x4e\x7b\xc7\x6b\x97\xec\xda\x38\x0e\x72\xde\x1d\x14\xcd\x4e\x41\x62\x33\xc4\xed\x62\x49\xa1\x3c\x38\xaa\x1c\x79\x32\x61\xe3\x11\x34\xc9\x80\x11\xdc\x93\xe3\x89\x9c\x2b\xb5\xce\xd9\x95\x4b\x72\x01\x1c\x65\x76\x6e\xd4\xbf\x37\xd2\x3c\xfb\x8a\x97\xd1\x18\xc8\x07\x50\x26\x90\x33\xa8\x61\x89\xba\xa6\x2b\x40\x93\x43\x89\x6b\x70\xc4\x72\xa1\x36\x2d\x09\x32\xc4\x8f\xe0\x17\xeb\x38\x3a\x33\x3b\x81\x22\x84\xca\x4f\xc6\xe3\xb9\x0a\x0d\x00\x64\xb6\x2c\x39\xf8\xeb\xb1\xec\x65\x35\xad\x39\x66\xe3\x9c\x96\xa4\xc7\x5e\xcd\x87\xe8\xb2\x42\x05\xca\x42\xed\x68\x8c\x95\x1a\x8a\xb2\x46\x40\x60\x54\xe6\x3f\xb9\x04\x19\xfe\xb2\xe3\xbe\x18\x32\x1f\x9c\x32\xf3\x9d\x2e\xd9\x73\x27\x7d\xcd\x3b\x8f\x33\x13\xd3\xf4\x68\xcb\xd6\xa5\xdc\xc4\x5e\xf9\xfc\xe1\xfe\x01\x1a\x05\xa2\xdb\xa3\x87\xb7\x43\xfd\xd6\xd9\xec\x28\x65\x66\xe4\xe2\xc8\x99\xb3\xa5\x48\x21\x93\x57\x56\x99\x20\x3f\x32\xad\xc8\x04\xf0\xf5\xb4\xe4\xa4\xe5\x04\x23\x1f\x38\x0e\x23\x78\x27\xf8\x07\x53\x82\xba\xca\x31\x50\x3e\x82\x1b\x03\xef\xb0\x24\xfd\x0e\x3d\x7d\x77\x57\xb3\x47\xfd\x90\xdd\x77\xbe\xb3\xdb\xf0\xbd\x3f\x61\x6f\x43\x01\x34\xf0\x7a\x34\x3a\x3b\xf8\x71\x5f\x51\xd6\x60\x08\xcf\x14\xcc\x40\xd3\x01\x99\x26\x44\xa3\x73\x95\x38\xbe\x5d\x45\x45\xd2\x94\x05\xeb\xf6\x7b\x3a\xaa\xde\xa7\x81\x69\x46\x54\x73\x47\xb5\x4b\x7f\x1a\x77\xce\xd0\xf4\x29\x6d\x25\x0a\x18\xb2\xe2\xc3\x23\xe7\x64\x0b\xd2\x9f\xd0\xbe\x3b\x29\xee\x08\x3e\x99\x18\x4d\x34\x4e\x49\x6f\x5c\xd1\x20\x61\x19\x53\xfe\xa1\xa0\x9d\x16\x40\x47\x70\x7d\xfb\x9e\xf2\x43\xc6\x6d\x0d\x44\xe7\x70\x7d\x64\x84\x0a\x54\x1e\x55\xbc\xa3\xfa\xf5\x09\xf5\xd2\xc6\x6e\x7a\x42\x81\x72\x96\x04\x39\x49\x22\x68\x5d\x01\xc2\x82\xd6\x11\xdf\x18\x36\x53\xc8\xe2\x60\x47\x82\x86\x12\xcc\x05\xad\x65\x50\x02\xbb\xa3\xda\x3d\x11\xbf\xf8\x1d\x3e\x4d\x76\xbf\x21\x2f\x79\xb2\xbf\x51\xf6\xe8\xa0\xa7\x92\x25\x7e\x0b\x5a\x9f\xea\xee\x38\x9c\xfd\x90\xb6\x61\xf4\x3c\x37\x88\xb7\x64\x67\x36\xce\xc6\xaa\xd2\x8a\x04\xcd\x4e\xca\x3e\x0a\x27\xbb\x5f\x63\xea\x33\x14\xdd\x84\x72\x8b\xd0\x31\xd8\x97\x3e\x06\x96\x33\xbd\x50\x55\x22\x09\x91\x1a\x34\x47\xd9\x17\xd4\xaa\x45\x43\x24\xab\x6f\xcc\x15\xdc\xda\xc0\x7f\x3e\x3c\x2a\x86\x6a\xce\x87\xf7\x96\xfc\xad\x0d\xd2\xf2\x3f\x31\x35\xaa\xf0\x0c\x43\xe3\x04\x49\x76\x13\xf7\x15\x5b\xd2\x3e\xcf\x98\x46\xcd\x24\x3e\x1b\xa7\x28\xcf\x27\x8a\x75\x8d\x45\xc2\x30\xa2\xa0\x28\xa2\xac\xbd\x1c\x40\xc6\x9a\x21\x95\x55\x58\x1f\x94\x91\x1c\x61\xdd\x8e\x1f\x4e\x88\x4b\xa2\x1e\xf8\x5c\x8c\x3d\x91\xc1\x68\xa6\xa2\x90\xd7\xa2\xb4\x9c\xc6\xcc\xa5\x55\x06\x25\xb9\x39\x41\xc5\x08\x75\x8e\x7b\x4f\xe1\x4a\xfc\x9e\x40\x97\x33\x63\x25\x90\xf9\x91\x37\xc0\x33\x20\x36\x8e\x8f\xb0\x54\x62\xc5\x61\xfa\xca\xe8\x23\x9e\xfa\x06\x15\x2a\x66\xbc\xd7\xc2\xde\x35\xed\xf4\x29\x23\x3e\x6d\x8b\x61\x09\xca\x03\x43\xc9\x12\x35\xe3\x1d\x67\xb2\x01\xd2\x11\xfd\x98\x64\x77\x80\xfd\x0a\x56\x85\xf5\x11\xcc\x66\x8a\xb4\x70\x9f\xc1\x82\xd6\x83\xab\xbd\xd0\x0e\x6e\xcc\x20\xe2\xe2\x5e\x30\x37\x20\x6a\x8d\x5e\xc3\x40\xfa\x06\x2f\x3f\x0b\x4e\x82\x25\xe6\xb9\x5c\x0f\x51\xdf\x9d\x81\x66\x27\xe3\xe6\xc9\x2d\x55\x46\xd7\x59\x66\x6b\x23\x17\xa7\x33\xce\xf5\xee\x94\x06\xfc\x30\x2f\x95\xd9\xb9\x5b\xc8\x48\xc0\x38\x14\x56\x85\xca\x0a\x58\x29\xad\x85\xc6\x79\xca\x39\x3c\x39\x55\xda\xae\x37\x7e\x7e\xe5\x5f\xc7\xc8\x32\x9f\x6c\x7c\x2f\x37\xb5\xe3\xd4\xe0\x98\x71\x4c\xff\xb3\x3b\x67\x97\x2a\xa7\xfc\xfa\xee\xe6\xa0\x97\x76\x8d\x93\x29\x10\x48\x6b\x2f\xd7\x2f\xe6\x9c\xc1\x26\xce\x79\x90\xc2\x54\x2d\xf9\xad\x4b\xfa\x51\x65\xa7\xd6\x6a\xc2\xfd\xfe\x48\x85\x36\x97\xd0\xa7\x75\x7d\xe8\x4c\x48\x70\x47\x8f\x95\x56\x99\x0a\x0d\x7e\x6f\xb9\x95\xdc\x67\x64\x92\x00\x97\x12\x36\xe0\x29\x5c\x6d\xb9\x9a\xf2\xa0\xe6\xc6\xba\xc3\xf9\x79\x1a\x4f\x4e\xa0\xc8\x13\xd8\xf1\x38\x5c\xd4\x53\x72\x86\x02\xf9\x21\x73\xac\x61\x9a\x40\x1d\x7a\x1c\x30\xd4\x7b\x4b\x9c\x20\xc8\x32\x7e\x43\x91\xe3\xaf\x43\x24\xf9\xf3\xf3\x39\xf2\x71\xbe\x32\x04\x8d\x3e\xfc\x1a\x6f\x29\xcf\x60\xd6\xad\x59\x4f\xc6\xfe\xe3\x76\x6c\xc4\xce\xd0\x3c\xea\xc4\x3b\x30\x89\x34\x69\x3d\x98\xb4\xc9\x17\x2b\xf4\x90\xc4\x3c\x7b\x77\x01\x7b\xb2\xc4\x30\x01\x9e\x3f\xe4\xa5\xf6\xc6\x98\xf3\xb3\x79\x37\x8f\x23\x71\x3a\xfc\x34\x21\x11\xdc\x33\xea\x47\xcc\x57\xd8\x43\xd8\xcf\x34\x7b\x26\xc0\x7e\xa6\x19\x38\x9a\x91\x23\x93\x51\xe3\x98\x5d\x5c\x4d\xd7\xee\x0d\xf0\x7e\x87\x3b\xd4\xf1\x87\x9a\x83\x26\x5c\xdf\xdd\x34\x8f\x33\x4d\x3e\x26\x1b\x8e\x12\xc2\x27\xe9\x85\x1c\xce\x77\x18\x8a\xb3\x34\xb8\xbc\x49\x6e\x13\xf6\x24\x7c\xb6\x52\x94\xd1\xce\x5b\x90\xbc\x9b\x11\xe6\xa9\x91\x6f\xfb\x8e\x52\xdf\x55\x3c\x82\x12\x67\xdc\xbe\x15\xf1\x29\x0f\xc8\x87\xbf\xca\xe1\xef\xf7\x9f\x6e\xc7\x3f\xdb\x44\x1c\x30\xcb\xc8\xc7\xbd\x25\xa7\xfd\x15\xf8\x3a\x2b\x00\x3d\xab\xc6\x58\xc1\x78\x44\xa3\x12\x8d\x9a\x91\x0f\xa3\x24\x8d\x9c\xff\xed\xed\xef\x23\xf8\x9b\x75\x40\x8f\x58\x56\x9a\xae\x40\x25\x62\xd9\xbc\xa8\xa4\x04\x90\xbd\xc1\xc6\x6c\xe6\xc2\x4a\x85\x42\x54\xaa\x6c\x9e\x94\x5e\x89\xb2\x01\x17\x04\x36\x29\x5b\x13\x68\xb5\xa0\x09\x0c\x38\x4d\x5a\x4b\x7f\xe5\x8d\xf5\x6d\x00\xaf\x56\x05\x39\x82\x01\xff\x1c\xc4\x05\x37\x0f\x60\xdc\xd6\xc4\x71\xbb\x70\xbc\xe1\x38\x35\x9f\x93\xa3\x48\x89\x68\x49\x26\xbc\x66\xee\xab\x66\x60\x6c\x6b\xb0\x49\x3c\x61\xcb\x0e\xba\x8a\xfc\xf6\xf6\xf7\x01\xbc\xda\xb5\x0b\x94\xc9\xe9\x11\xde\x6e\x18\x41\x65\xf3\xd7\x89\x2a\xfb\xb5\x09\xf8\xc8\x32\x33\x26\x70\x26\x32\xaf\x60\xa1\xc0\x25\x81\xb7\x25\xc1\x8a\xb4\x1e\xc6\x07\xc3\x1c\x56\xf1\x12\xd0\xb8\x32\x92\xea\x0a\x5d\xe8\x3c\x0f\x3e\x7c\x7a\xff\x69\x12\x57\xe3\xb0\xcd\x0d\x2f\xc1\x34\x60\xa6\x0c\xea\xc4\xfe\x94\xdf\x92\x45\x5f\xc7\x20\x05\x0b\x59\x81\x66\x4e\x0d\x33\x9d\xd5\xa1\x76\x34\xea\x3e\x17\x9d\x9d\xf1\x87\xde\xea\x0e\x27\xbb\xbc\xd9\x75\x37\xda\x9f\xf8\x22\x76\xb6\x89\xe6\x08\xe3\xdc\x37\xf1\xb6\x95\x83\x27\x4d\xdc\x42\x33\x5b\x99\xdb\xcc\xb3\x81\x19\x55\xc1\x8f\xed\x92\xa1\x93\x56\xe3\x95\x75\x0b\x65\xe6\x43\x4e\xb2\x61\x8c\xbc\x1f\xcb\x11\x33\xfe\x49\xfe\xfc\x57\x16\xc9\x39\x75\xbe\x59\xf1\x61\xfe\x0f\xb0\x4d\x8e\xcf\xf1\x8b\x4d\x6b\x5e\x12\x9f\x73\x12\x5c\xde\xc7\x0d\x9f\x75\x67\xf3\x76\x89\x17\x82\xf4\x62\xdf\x42\xb8\x12\xf3\x08\x81\x68\xd6\xdf\x3d\x8d\xd9\x81\xb5\xe3\xb5\xd7\xc3\x54\x52\x1b\xa2\xc9\xf9\x7f\xaf\x7c\xe0\xf6\x17\x7b\xac\x56\x67\x6e\xe0\x5f\x6f\xde\xff\x31\xc9\x5d\xab\x67\xed\x56\xa6\x1a\x94\x4f\x20\xb8\xba\x61\x77\x3e\x58\x87\x73\xda\x6d\xab\xa7\x9b\x52\xc4\xd6\xe0\x44\xd7\xe1\xeb\xb7\x4e\x11\x0d\x75\x55\xe0\xdb\xbe\x94\xb6\xf9\xfa\x52\x5a\x5f\x4a\xeb\x4b\x69\x7d\x29\xed\x88\xaa\x7d\x29\xad\x2f\xa5\xb5\xcd\xeb\x4b\x69\x7d\x29\xed\x85\xa6\xf6\xa5\xb4\xbe\x94\xd6\x97\xd2\x36\x5f\x5f\x4a\x3b\xd3\xb8\xbe\x94\xf6\xa3\x97\xd2\xfa\xe2\x58\x5f\x1c\xfb\xf3\x8b\x63\x7d\xb9\xab\x2f\x77\xf5\xe5\xae\xbe\xdc\xf5\x82\x8c\xef\xcb\x5d\x7d\xb9\xab\x2f\x77\xf5\xe5\xae\x1f\xb4\xdc\x35\x43\xed\xcf\xae\x77\xfd\x27\x00\x00\xff\xff\x7a\x78\xa8\xab\xfc\x37\x00\x00") func operatorsCoreosCom_operatorgroupsYamlBytes() ([]byte, error) { return bindataRead( @@ -179,12 +179,12 @@ func operatorsCoreosCom_operatorgroupsYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "operators.coreos.com_operatorgroups.yaml", size: 15412, mode: os.FileMode(436), modTime: time.Unix(1606762435, 0)} + info := bindataFileInfo{name: "operators.coreos.com_operatorgroups.yaml", size: 14332, mode: os.FileMode(436), modTime: time.Unix(1607977324, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _operatorsCoreosCom_operatorsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5a\x4b\x73\xdb\x38\x12\xbe\xfb\x57\x74\x69\x0e\x9e\xa9\xd2\x63\x1e\x97\x2d\xdd\x5c\x4e\x66\x4b\xbb\xb3\x4e\x2a\x76\x72\x99\x9a\x43\x8b\x6c\x89\x58\x91\x00\x07\x0d\x4a\xd6\xa6\xf2\xdf\xb7\x1a\x20\x29\x92\x92\x48\x7a\xe3\xcc\xe2\x62\x09\x02\x1a\xfd\xf5\xbb\x01\x63\xae\x3e\x91\x65\x65\xf4\x12\x30\x57\xf4\xec\x48\xcb\x37\x9e\xef\xfe\xc6\x73\x65\x16\xfb\x9f\x6e\x76\x4a\xc7\x4b\xb8\x2f\xd8\x99\xec\x03\xb1\x29\x6c\x44\x6f\x68\xa3\xb4\x72\xca\xe8\x9b\x8c\x1c\xc6\xe8\x70\x79\x03\x80\x5a\x1b\x87\x32\xcd\xf2\x15\x20\x32\xda\x59\x93\xa6\x64\x67\x5b\xd2\xf3\x5d\xb1\xa6\x75\xa1\xd2\x98\xac\x27\x5e\x1d\xbd\xff\x71\xfe\xcb\xfc\xc7\x1b\x80\xc8\x92\xdf\xfe\xa4\x32\x62\x87\x59\xbe\x04\x5d\xa4\xe9\x0d\x80\xc6\x8c\x96\x60\x72\xb2\xe8\x8c\xe5\xf9\xe9\x53\x64\x2c\x19\xf9\x93\xdd\x70\x4e\x91\x1c\xbc\xb5\xa6\xc8\x9b\xab\x1b\x6b\x02\xa9\x8a\x3f\x74\xb4\x35\x56\x55\xdf\x67\x60\xd2\xcc\x7f\x0a\xa8\xdf\x95\x14\xfc\x54\xaa\xd8\xfd\xb3\x35\xfd\x9b\x62\xe7\x7f\xca\xd3\xc2\x62\xda\x38\xd1\xcf\xb2\xd2\xdb\x22\x45\x7b\x9a\xbf\x01\xe0\xc8\xe4\xb4\x84\xfb\xb4\x60\x47\x32\x51\x4a\xc1\x73\x30\x2b\x71\xee\x7f\x0a\x04\xa2\x84\x32\x0c\xac\x81\x10\xd1\x77\xef\x57\x9f\x7e\x79\x6c\x4d\x03\xc4\xc4\x91\x55\xb9\xf3\xb2\xac\x78\x03\x4b\xb9\x25\x26\xed\x18\x10\xa2\x70\x5c\xcd\xc8\xbc\xde\xec\x8e\xc2\x8e\x59\xff\x9b\x22\x57\x4f\xe6\x56\x16\xba\x5a\x2e\x61\x34\xac\xa5\x31\xdb\x39\xff\x56\x58\x0c\xab\x20\x16\x33\x21\x06\x97\x50\x05\x93\xe2\x12\x15\x98\x0d\xb8\x44\xf1\x89\x4f\xaf\xf9\x16\x61\x90\x45\xa8\x4b\xee\xe6\xf0\x48\x56\xc8\x00\x27\xa6\x48\x63\xb1\xae\x3d\x59\x07\x96\x22\xb3\xd5\xea\x3f\x35\x6d\x06\x67\xfc\xa1\x29\x3a\x62\xd7\xa1\xa9\xb4\x23\xab\x31\x85\x3d\xa6\x05\x4d\x01\x75\x0c\x19\x1e\xc1\x92\x9c\x02\x85\x6e\xd0\xf3\x4b\x78\x0e\xff\x32\x96\x40\xe9\x8d\x59\x42\xe2\x5c\xce\xcb\xc5\x62\xab\x5c\xe5\x25\x91\xc9\xb2\x42\x2b\x77\x5c\x78\x83\x57\xeb\x42\x6c\x60\x11\xd3\x9e\xd2\x05\xab\xed\x0c\x6d\x94\x28\x47\x91\x2b\x2c\x2d\x30\x57\x33\xcf\xba\xf6\x9e\x32\xcf\xe2\xef\x6c\xe9\x57\x7c\xdb\xe2\x35\xe8\x86\x9d\x55\x7a\xdb\xf8\xc1\xdb\x66\x8f\x06\xc4\x48\x41\x89\xda\xc3\xd6\x80\xe2\x24\x68\x99\x12\xe9\x7c\x78\xfb\xf8\x04\xd5\xd1\x5e\x19\x5d\xe9\x7b\xb9\x37\x2c\xe9\xa4\x02\x11\x98\xd2\x1b\xb2\x41\x89\x1b\x6b\x32\x4f\x93\x74\x9c\x1b\xa5\x9d\xff\x12\xa5\x8a\x74\x57\xfc\x5c\xac\x33\xe5\x44\xef\x7f\x16\xc4\x4e\x74\x35\x87\x7b\x1f\x3a\x60\x4d\x50\xe4\x31\x3a\x8a\xe7\xb0\xd2\x70\x8f\x19\xa5\xf7\xc8\xf4\xcd\x15\x20\x92\xe6\x99\x08\x76\x9c\x0a\x9a\x51\xaf\xbb\xb8\xe3\x4b\x00\x55\x58\xba\xa2\xaf\xca\x63\x1f\x73\x8a\x5a\x2e\x13\x13\x2b\x2b\x46\xed\xd0\x91\xb8\x42\x2b\x1c\x0d\x1d\xea\xd0\x15\x3c\xe6\x58\xbf\xb0\x75\xb0\x59\xb3\xa8\xb9\x71\x32\xea\xcb\x87\x83\xf7\x1e\x51\x67\x64\xb2\xdc\x68\x31\x92\x31\xdc\x5d\x0b\x31\xe0\x93\x46\x45\xa9\xfb\x4b\x07\xc1\x7d\xbd\xb0\x9c\x5f\x13\xd7\xf6\x2c\x48\xd0\x05\x62\x4c\x01\xd6\x59\xf0\x1b\xe4\x52\x86\x18\xaa\xe8\xe1\x9c\x9b\x19\xa4\xb8\xa6\xf4\x91\x52\x8a\xce\x25\xd3\x87\x51\x46\x6b\xef\xa5\x05\x1d\xb8\xbf\x35\xd7\x07\xff\xf6\x24\xe0\xcf\x82\xec\x11\xcc\x9e\xac\xb8\x3c\x39\x51\x58\x2d\x86\x8b\x74\x01\x0a\xa6\x58\xa2\x24\x7b\x7a\x2d\xf1\xdc\x5e\x55\xe6\x28\x71\x0d\x03\x97\x91\xa1\x8b\x92\xb7\xcf\x12\x58\xf8\x54\x2f\x0c\xca\xa0\xbb\xad\x14\x83\x62\x0f\x3a\x88\x83\xaf\xa9\xe3\x34\x4a\x95\x66\x21\xa6\x3d\x25\xd4\x9a\x01\xb4\x04\x77\x0f\x6f\x28\x3e\xb7\x94\xb6\x08\xd0\x5a\x3c\x5e\x5d\xa3\x1c\x65\x3d\xc0\x3a\xd0\xee\x3a\xec\x37\x59\x2a\xa3\xf9\x30\x30\xa8\xac\x5e\x3b\x54\x9a\xcb\xfc\x35\x05\x84\x1d\x1d\x43\xaa\x93\x7c\x5a\xd5\x08\x7e\xb1\x25\x9f\x26\x07\xa8\x92\x50\xf0\x04\xca\x9c\xd8\xb3\x7e\xd0\x3e\xc2\xb8\xee\x58\xa7\x31\x93\x63\x7b\x7f\x37\x97\xe3\x52\x73\x0c\x9b\x63\x18\x3b\x3a\xf6\x2f\xe8\xa8\x4c\x24\xa2\xb8\xac\x34\x44\x77\x32\xe1\x65\x2a\x53\xa3\xd4\x05\xbe\xae\xca\x53\x45\x3e\x11\x0e\xac\xbd\x92\x8d\xce\x47\x25\x94\x17\xc1\x31\x17\x4b\xc7\x1d\x1d\x6f\x39\x18\x89\x78\x5c\xa2\xf2\x41\x40\xce\x9c\x02\x51\x55\x41\x7d\xc2\x54\xc5\xa7\x02\xd9\xfb\xd8\x4a\x4f\xe1\xc1\xb8\x95\x9e\x0e\x92\x7c\xfb\xac\xa4\x56\x10\xfb\x7b\x63\x88\x1f\x8c\xf3\x33\xaf\x26\xb0\xc0\xe6\x8b\xc4\x15\xb6\x78\xd7\xd4\x21\x12\x08\xde\x66\xc9\xc5\x73\x58\x6d\x86\xa5\xd5\x88\xbd\x42\x6d\xa5\xc1\xd8\x52\x2e\xa1\x74\x0e\x07\x85\x23\xb2\xe2\xac\xa0\x3d\x1f\x6b\x02\x6d\xf4\x8c\xb2\xdc\x1d\x85\x87\xb3\x33\x4a\x71\x1a\xdb\x92\xe6\xb0\x1a\x2e\xb2\x23\xc7\x95\x47\x3d\x49\x31\x18\x7e\x09\xa5\x7d\x8a\x11\xc5\x83\x64\xe3\xc2\x0b\xcd\x17\xac\xd2\x92\xa9\x08\x32\xb2\x5b\x82\x5c\xe2\xfd\x38\x25\xf7\xc7\xe2\x30\x06\x23\x72\x93\x60\xaf\xd5\xf8\x44\xe4\x33\xf2\x8b\x52\x57\xd8\x11\xc2\x79\x86\xb9\x18\xcc\x67\x89\xcc\x5e\xa6\x5f\x20\x47\x65\x79\x0e\x77\x3d\x1c\x4a\x53\x99\x52\x6b\x97\xd2\x5e\x2f\xcd\x03\x84\xb6\x62\x90\x00\xbb\xc7\xf4\xbc\x08\x6f\xa1\x35\x62\xc0\x94\x86\x4c\x63\x36\x67\x49\x76\x0a\x87\x44\x6a\x28\x89\x6e\x1b\x45\xa9\x6f\x2e\x26\x3b\x3a\x4e\xfa\x0c\xa6\x6b\x72\x93\x95\x9e\x84\x0c\x74\x66\x44\x75\xba\x32\x3a\xed\x53\xe1\xc4\xef\x9a\x7c\x4d\xc6\x1e\x48\x4a\x18\xc7\xfe\x5a\x03\xd3\xf7\xa3\x72\xc6\x80\xa5\x58\xda\x5c\xd9\xde\x32\x8d\x0f\xb4\x09\x10\x1a\xe5\xdb\x86\x2c\x69\x5f\xc6\x9a\xab\xd5\xd9\x15\xc6\xea\xda\x6f\x5a\xe6\x20\x8a\xe1\xa0\x5c\xd2\xae\x20\x2f\x4b\x6a\xc8\x97\x7a\x3d\xa8\x0d\x4a\x45\xc9\x87\x0a\x46\xb0\xf8\x1a\x55\xc8\x10\x15\x9f\x53\x20\x6d\x55\x94\xf4\x04\x0a\xcf\xbe\xb4\x19\xa1\xad\x11\x8b\x09\x8a\xba\x5a\x87\x8c\x50\xf7\x98\xb2\xe0\xda\x9d\x47\x0f\xf0\xbb\xf7\xab\xea\xb6\x23\x5c\x72\x50\x05\xbc\x37\x5d\x8d\x4a\x55\x27\xdc\xa3\xd9\xb9\xaf\xb7\x34\xf3\xfa\xe9\x76\xe4\xd4\xe4\xb9\x84\x7a\x43\x63\x6d\x77\xc3\x30\x86\x82\xf1\x88\x40\x7c\x19\xc4\x09\x43\x13\x02\xee\x51\xa5\xb8\x4e\xfb\xf9\x87\xb2\xb1\x0d\x85\x4c\xd9\xd6\xd6\xa0\x6e\x83\x71\x51\x7f\xb6\x19\x59\xda\x8e\x2b\x6e\xa5\x7c\x0d\x06\x3d\xb0\x48\x4e\xed\x5d\x32\xb6\xc2\x95\xae\x93\xdd\x93\x45\xcd\xaa\xba\x68\x1d\xce\x87\x9d\x36\x94\x1d\x38\x95\x85\x9e\xba\x36\x48\x70\x35\xd1\x11\x09\x1f\xc2\x8d\x91\xd1\x54\x79\xb4\xcf\x42\xc6\x25\x74\x25\x30\x35\xc7\xe8\xaa\xce\x1f\x64\x6c\x86\x6e\x09\x31\x3a\x9a\x09\xdf\x23\x04\xf4\xd1\x5f\x42\xbd\xa2\x70\x0e\xc8\xa2\xa3\xf5\x08\xd1\x7c\x53\x70\x19\x31\xe3\xf6\xa5\xa8\xee\x20\x29\x32\x14\xdf\xc3\x58\xbc\xac\x22\x03\x4a\xc7\x2a\x42\x7f\xa1\x18\x93\x43\x95\xf6\x1b\x72\x18\xb8\x36\x45\xf0\xde\x93\xc9\xbc\xaa\xce\x2d\x21\xf7\xc7\xeb\x0b\x18\x43\x49\x21\x1b\x45\xa8\x6d\xf5\xdd\xb2\xb7\x8a\x6f\xc5\xef\xa5\xab\xba\x41\x7e\xcb\x6b\xbb\x32\xc1\xd4\xac\x4e\xbd\x4f\x99\x0d\x3c\xd9\x82\x86\xeb\x79\x80\x5f\x31\x65\x9a\xc2\x47\xbd\xd3\xe6\xf0\xba\xb8\xfc\xd2\x17\x6a\xe1\x98\x7b\xee\x6b\x3c\xaf\xc4\x90\x2f\x5b\xdf\xa3\x4b\x46\xa7\xcd\xdb\x55\x59\x85\xf9\xce\xc4\xd7\x2b\xb9\xa2\x88\x5a\x4f\x12\xa0\x34\x3b\xc2\x7e\xa7\x0e\x1b\x48\x3b\x65\xa9\xdc\x37\x0d\xb7\xe6\x65\xaf\x78\x7a\xce\x90\x2a\x18\x50\x8a\x63\xd5\x4f\xf3\x1f\x8f\xef\x1e\x16\x7f\x37\x65\x39\x8e\x51\x44\x5c\xa6\x2f\xa9\x87\xa7\xc0\x45\x94\x00\x72\x75\x85\xfc\xe8\x13\x5b\x86\x5a\x6d\x88\xdd\xbc\x3c\x89\x2c\xff\xfe\xf3\x1f\xfd\x12\xfe\xd5\x58\xa0\x67\xcc\xf2\x94\xa6\xa0\xca\x46\xb2\x7a\x16\x68\x14\x77\x5e\x40\x35\xdd\x5e\x92\x52\xcb\x79\x98\xb9\x89\x4b\x41\x1c\xbc\x00\x1c\xee\x08\x4c\x29\x80\x82\x20\x55\x3b\x5a\xc2\x84\x73\x8a\x1a\x2c\x7f\xd6\x98\xd1\x97\x49\xef\x11\xdf\x1f\x12\xb2\x04\x13\x59\x3a\x09\x8c\xd6\x85\xb4\xcc\x35\xdc\x26\x50\xf5\xb7\x36\xfd\x89\xdf\xaa\xed\x96\x2c\x85\xf6\x85\xf6\xa4\xdd\x0f\xd2\x3f\xab\x0d\x68\xd3\x20\xe4\xc9\x8b\x6e\x73\x8a\xd4\x46\x0d\x04\xfc\x2e\xb8\xdf\x7f\xfe\x63\x02\xdf\x9f\xa8\x85\xba\x57\xc7\xf4\x0c\x3f\x87\x3e\x4f\xb1\xc8\xed\x87\x7e\xad\xf9\x36\x9c\x8f\xda\xe1\xb3\xf0\x12\x49\xfb\xa6\x7d\x77\x25\x52\x48\x70\x4f\xc0\x26\x23\x38\x50\x9a\xce\xc2\xcd\x7f\x0c\x87\x81\xf6\xb9\xd1\x96\x84\x66\x3d\x47\xeb\x3a\x2f\x74\x4f\xef\xde\xbc\x5b\x06\x2e\xc5\xf4\xb6\xdd\xf7\xbc\xf6\x50\x0c\xda\x38\xd8\x28\x8d\x69\xd9\x19\x2a\x3e\xb5\x98\x5c\x04\x43\x73\x06\xa2\x04\xb5\xcf\x37\x83\x45\xea\xa6\x70\x85\xa5\xf9\xed\xd7\x56\xda\xe7\x8f\x6c\xed\x71\xe1\xc9\xad\x5b\xec\xff\xdf\x1e\xad\xfe\x07\xb8\xfe\xdd\x79\x34\xdc\x87\x86\x0f\xf5\xc2\xdd\x15\x6b\xb2\x9a\x1c\x79\xc4\xb1\x89\x58\xc0\x46\x94\x3b\x5e\x98\x3d\xd9\xbd\xa2\xc3\xe2\x60\xec\x4e\xe9\xed\x4c\x8c\x7d\x16\x2c\x89\x17\xfe\x95\x7e\xf1\x9d\xff\xf3\x2a\xe8\x38\xc7\xe8\x85\x10\xfd\x96\xbf\x02\xa7\x9c\xc3\x8b\xaf\x86\x59\x35\xd4\x2f\xed\x58\x6f\x1f\x43\xb0\x8a\xba\x14\xc4\xf5\x0e\x89\x8a\x92\xea\xa9\xbe\x8c\xf8\x43\x5e\x9d\x61\x1c\xd2\x05\xea\xe3\x37\x77\x03\x11\x74\x61\x85\xaf\xe3\xac\xfc\x87\x93\x19\xea\x58\x3e\xb3\x62\x27\xf3\x5f\x2d\xd9\x42\xbd\x20\x18\x7c\x5c\xbd\xf9\x6b\x9c\xa3\x50\x2f\xf4\xfc\xf0\xac\xbb\x04\x67\x8b\xa0\x43\x76\xc6\x4a\x3f\xd0\x98\x29\xd6\xf5\xfd\x51\x05\xb9\x2c\x50\xe1\xf3\x97\x9b\xff\x06\x00\x00\xff\xff\xb3\x7c\xa9\x02\x32\x24\x00\x00") +var _operatorsCoreosCom_operatorsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x59\x5f\x73\xdb\xb8\x11\x7f\xf7\xa7\xd8\xd1\x3d\xf8\x6e\x46\x7f\x9a\xb4\x0f\x1d\xbd\x79\xec\x5c\xc7\xed\xd5\xc9\xc4\x4e\x5e\x6e\xee\x61\x45\xae\x44\x54\x20\xc0\xc3\x82\x92\xd5\x4c\xbe\x7b\x67\x01\x50\x22\x25\x59\xa2\x52\xe7\x5a\xbc\x48\x04\x81\xc5\xfe\xfd\xed\x2e\x88\x95\xfa\x4c\x8e\x95\x35\x53\xc0\x4a\xd1\xb3\x27\x23\x4f\x3c\x5e\xfe\x95\xc7\xca\x4e\x56\x6f\xae\x96\xca\xe4\x53\xb8\xad\xd9\xdb\xf2\x23\xb1\xad\x5d\x46\x77\x34\x57\x46\x79\x65\xcd\x55\x49\x1e\x73\xf4\x38\xbd\x02\x40\x63\xac\x47\x99\x66\x79\x04\xc8\xac\xf1\xce\x6a\x4d\x6e\xb4\x20\x33\x5e\xd6\x33\x9a\xd5\x4a\xe7\xe4\x02\xf1\xe6\xe8\xd5\x9f\xc6\x7f\x19\xbf\xb9\x02\xc8\x1c\x85\xed\x4f\xaa\x24\xf6\x58\x56\x53\x30\xb5\xd6\x57\x00\x06\x4b\x9a\x82\xad\xc8\xa1\xb7\x8e\xc7\xbb\x7f\x99\x75\x64\xe5\xa7\xbc\xe2\x8a\x32\x39\x78\xe1\x6c\x5d\xb5\x57\xb7\xd6\x44\x52\x0d\x7f\xe8\x69\x61\x9d\x6a\x9e\x01\x46\x60\x75\x19\xfe\x47\xb9\xdf\x27\x1a\x61\x4a\x2b\xf6\xff\xe8\x4c\xff\xa2\xd8\x87\x57\x95\xae\x1d\xea\xd6\x99\x61\x96\x95\x59\xd4\x1a\xdd\x6e\xfe\x0a\x80\x33\x5b\xd1\x14\x6e\x75\xcd\x9e\x64\x22\xe9\x21\xf1\x30\x4a\xb2\xae\xde\x24\x96\x38\x2b\xa8\xc4\x86\x41\x10\x52\xe6\xe6\xc3\xfd\xe7\x3f\x3f\xee\xbd\x00\xc8\x89\x33\xa7\x2a\x1f\xb4\xda\xf0\x08\x8e\x2a\x47\x4c\xc6\x33\x20\x64\xf1\xd8\x2d\x43\xe3\xd6\x76\xbf\x11\xc6\xec\xec\x5f\x94\xf9\xd6\x74\xe5\x64\xb1\x6f\x69\x29\x8e\x96\xf7\x74\xe6\xf7\xf8\xb8\x16\x66\xe3\x3a\xc8\xc5\x71\x88\xc1\x17\xd4\x88\x4d\x79\x92\x10\xec\x1c\x7c\xa1\x78\xc7\x6f\xf0\x05\x99\x46\x93\xb8\x1a\xc3\x23\x39\xd9\x08\x5c\xd8\x5a\xe7\xe2\x61\x2b\x72\x1e\x1c\x65\x76\x61\xd4\xbf\xb7\xd4\x18\xbc\x0d\xc7\x68\xf4\xc4\x1e\x94\xf1\xe4\x0c\x6a\x58\xa1\xae\x69\x08\x68\x72\x28\x71\x03\x8e\x84\x2e\xd4\xa6\x45\x21\x2c\xe1\x31\xfc\xd3\x3a\x02\x65\xe6\x76\x0a\x85\xf7\x15\x4f\x27\x93\x85\xf2\x4d\x6c\x64\xb6\x2c\x6b\xa3\xfc\x66\x12\xdc\x5c\xcd\x6a\xb1\xfb\x24\xa7\x15\xe9\x09\xab\xc5\x08\x5d\x56\x28\x4f\x99\xaf\x1d\x4d\xb0\x52\xa3\xc0\xac\x09\xf1\x31\x2e\xf3\x1f\x5c\x8a\x26\xbe\xde\x53\x5f\xb4\x03\x7b\xa7\xcc\xa2\xf3\x2a\xf8\xe4\x49\x5d\x8b\x7b\x82\x12\x43\xc7\xed\x51\x96\x9d\x4a\x65\x4a\xb4\xf2\xf1\xdd\xe3\x13\x34\x0c\x44\xb5\x47\x0d\xb7\xbc\x65\xa7\x6c\x51\x94\x32\x73\x72\x71\xe5\xdc\xd9\x32\x50\x21\x93\x57\x56\x19\x1f\x1e\x32\xad\xc8\x78\xe0\x7a\x56\x2a\x2f\x56\xfc\xbd\x26\xf6\x62\x87\x31\xdc\x06\x68\x80\x19\x41\x5d\xe5\xe8\x29\x1f\xc3\xbd\x81\x5b\x2c\x49\xdf\x22\xd3\x77\x57\xb5\x68\x94\x47\xa2\xbe\xfe\xca\x6e\x23\xdb\xe1\x86\x83\x28\x01\x68\xe0\xe7\x45\xeb\x34\x11\xf9\x58\x51\xd6\x09\x85\x9c\x58\x39\x71\x5d\x8f\x9e\xc4\xe1\x3b\xb0\xd3\xe7\x68\x8f\xbe\xe6\x7e\x87\x87\xa5\x9d\xe3\xed\x8c\xc5\xd0\xad\xf3\xd1\xec\xe0\x43\x22\x45\x0c\x9a\xd9\xb2\xb2\x46\x1c\xa3\x2f\x57\x2f\x43\x07\x84\xe4\xd0\xd0\x3b\x7c\xb7\xc7\xfb\xed\x76\x69\x9a\x9f\x11\x6f\xbd\x57\x64\x40\x1f\xc9\x31\x45\x81\x8e\x80\x5b\x0f\x6e\x65\x88\xdb\x8a\x2d\x8e\xf1\x24\xe0\xac\x71\x46\xfa\x91\x34\x65\x87\xe6\x39\x27\xb1\x8c\xce\xfe\xe3\x4b\xf6\x84\xff\xa5\xbd\x23\xc6\x76\x20\x02\xbf\xd7\xe4\x36\x60\x57\xe4\x24\xdc\xc9\x8b\xe1\x76\x4a\xa9\x99\x72\xc1\x40\x0e\x3b\x3b\x6a\xb9\x3e\x61\xcc\x9e\x6a\xea\x23\xaa\x8c\x12\x7d\x56\xbc\x7b\x16\x48\x69\xe5\xb8\x1e\x52\xef\x6f\x4c\x82\x2b\x0e\x62\x46\x05\x70\xa3\x94\x64\xb4\x32\xa2\xd6\x53\x41\x9d\x19\x40\x47\x70\xf3\x70\x47\xf9\x31\x7f\xe8\x0a\x8c\xce\xe1\xe6\xc4\x2a\xe5\xa9\x3c\x29\xc4\x9e\x18\x37\x27\x58\x4d\x38\xdd\xbc\x49\x5e\x6c\x3c\x2a\xc3\x29\x07\x0d\x01\x61\x49\x9b\x98\xae\x24\x0b\x36\x41\x19\x16\x3b\x0a\xc9\x2d\xd8\x76\x49\x9b\xb0\x28\xe5\xae\x93\x1c\xf6\xb0\x6d\x1c\xa7\x83\x61\x37\x46\x72\xfc\xd9\x35\xf6\x38\xa8\x75\x47\x1f\xa7\x8a\x63\x49\x9b\x73\x4b\xf6\x8c\x21\x3a\x52\x9c\xaa\x02\xb1\x8a\x4c\x04\x4d\xca\xd4\xd6\x10\x58\x55\x5a\x51\x48\x5c\x67\xe9\xbf\x98\x3d\x0e\x47\x23\xfe\x85\x4c\xdb\xa3\x65\xdc\x92\x36\xd7\x1c\x1d\x40\xa2\xa3\x50\x95\xc4\xfa\x16\x06\x9a\x0a\xe6\x33\x6a\x95\xef\x8a\xd2\x10\x09\xf7\x66\x08\x0f\xd6\xcb\xcf\xbb\x67\x25\x19\x5a\xfc\xe6\xce\x12\x3f\x58\x1f\x66\x5e\x55\xec\xc8\xca\x85\x42\xc7\x4d\x21\x40\x4c\x8c\x49\x91\xaa\x5d\xd2\xf0\x18\xee\xe7\x1d\x54\x93\xd5\xf7\x06\xac\x6b\xa4\x0b\x45\x66\x24\x14\x49\x94\x35\x87\x1a\xc4\x58\x33\xa2\xb2\xf2\x9b\xa3\x34\x92\x52\xac\xeb\xe8\xe4\x04\xb9\x44\xea\x49\x4a\xa3\xf8\x26\x16\xb1\x1a\x33\xca\x21\xaf\x03\xd3\xa1\x20\x93\x76\x43\x65\x50\x92\x5b\x10\x54\x82\x70\x7d\x55\x7d\x0e\x97\xe2\xe8\x81\x4e\x6d\xa2\x67\xec\x17\x20\x38\x64\x9f\x0b\x61\x3b\xee\x89\xf0\x56\x62\x25\xa6\xfb\x22\x28\x16\xb4\xf7\x15\x2a\x54\x8e\xc7\x70\x13\xda\x23\x4d\x9d\x77\xca\x04\x3d\xb7\xc9\x08\x05\xc5\x20\x50\xb4\x42\x2d\xb8\x29\x9e\x6e\x80\x74\x44\x51\x3b\x3f\x48\x16\x43\x58\x17\x52\x0b\x48\x7c\xcf\x15\xe9\x50\x12\x0f\x96\xb4\x19\x0c\x0f\xcc\x3d\xb8\x37\x83\x88\xaf\x07\x06\xde\x82\xb1\x35\x7a\x03\x83\xf0\x6e\xf0\xdf\xe5\x97\xb3\xa0\x8b\x79\x1e\x1a\x6b\xd4\x1f\x7a\x22\xe1\x59\x5b\x3a\x9a\xbf\x48\xa2\x63\xbc\x8f\x34\x8f\xc2\xb4\xca\x89\x39\x39\x32\xa1\xc8\xb2\x2f\xd6\x10\xbb\xaa\x63\x98\x50\x94\x72\x58\x2b\x5f\x74\x6b\x97\x97\xb4\x73\xde\xc3\xcf\xf8\x75\x57\x08\x95\x15\x1f\x1b\xb6\xa3\x0f\x6e\xa5\x88\x18\xd9\x70\x3b\x04\x32\x4e\x65\x45\xc3\xac\x14\xb9\xb1\x90\x16\xcb\x47\x33\x9c\xc8\xa4\xbd\x0c\xda\x2f\x9d\xbd\xdc\x49\x9f\x10\xf4\xe6\xc3\x7d\xd3\x43\xc7\xd6\x99\x1a\x41\xcf\x00\x78\x4f\xf0\xde\xe9\xe0\x02\xa6\x6e\xb7\x9b\xda\xf9\xaa\xd5\x87\x6f\x5b\x8c\xd0\x32\x36\x1e\xd4\x87\xe1\xf3\x10\xd8\x0b\xfe\x8e\xb3\xbb\xe3\xb6\xcd\x2c\xae\x50\x69\x9c\xe9\xa6\x45\x8a\xc9\x36\x35\x48\x5b\xe6\xaf\xa3\xdb\xd0\x39\x2c\xef\x5d\x76\xf5\x2f\xbc\xa4\xac\x8a\x2e\xdb\x63\xa1\x9c\x7f\x66\x59\xff\xea\x4b\x3a\x19\xf6\x4f\x0e\x0d\xab\xe6\xca\xae\x4f\xe6\xd9\x6b\x6d\xd8\x83\x57\x25\x25\x6f\x68\x8c\xe1\xb7\x64\x29\x8f\xb7\x0d\xd6\x50\x13\x9b\x01\xfd\xad\x2f\xe8\x45\x40\x69\x8f\x0b\x2a\x15\x19\x73\xeb\x4a\xf4\x53\xc8\xd1\xd3\x48\x38\xeb\xa5\x86\x4f\xe1\x52\xe3\x55\x55\xb0\x46\x16\x6b\xcc\x28\xff\x7f\x10\xb2\x24\x66\x5c\x5c\x2e\xdd\x0d\x14\x75\x89\x12\x5d\x98\x87\x38\x4a\x84\x40\x99\x5c\x65\x18\xae\xa3\x72\xf2\xa8\x34\x03\xce\x6c\x1d\xa3\x6f\x67\xfe\x57\xb7\xb0\x23\xe4\x73\x28\x7b\x44\x8e\x98\xf2\x65\xab\x28\xaf\x6b\xaa\x6b\x0e\x3e\xf0\x3d\xb9\x3e\x7e\xbd\x73\x96\xeb\x74\xd5\xb3\x05\xdb\xc4\xf0\x30\x44\x93\x9d\xc3\x93\xab\x69\x08\x3f\xa3\x66\x1a\xc2\x27\xb3\x34\x76\xfd\xfa\xbc\x87\xc5\x17\xeb\x7b\x53\x05\x0e\xb7\x3c\xbf\x22\x5b\xa1\x20\xfc\x80\xbe\xb8\x20\xad\x5d\xdf\xa7\x5a\x28\xd4\xf2\xa1\x8a\xa8\x14\x65\xd4\xb9\x9c\x06\x65\xd8\x13\xe6\x69\x92\x8c\x57\x8e\xd2\xbb\x61\xbc\x39\x4d\x1d\xcc\xee\xf2\x5a\xea\x4b\x40\x29\x3b\x55\x0e\x7f\x7f\x7c\xff\x30\xf9\x9b\x4d\x25\x2b\x66\x19\x71\x4a\x2d\x52\x67\x0e\x81\xeb\xac\x00\xe4\xe6\xba\xf0\x31\x24\x9d\x12\x8d\x9a\x13\xfb\x71\xa2\x46\x8e\x7f\x7d\xfb\xdb\x18\x7e\xb6\x0e\xe8\x19\xcb\x4a\xd3\x10\x54\x6a\x73\x9a\x2b\xde\x56\x79\x14\x84\xd9\xee\x0d\x95\x50\x60\xa9\xb2\x79\x62\x7a\x1d\x98\xf5\xb8\x24\xb0\x89\xd9\x9a\x40\xab\x25\x4d\x61\xc0\x15\x65\xad\xa3\xbf\x18\x2c\xe9\xeb\x00\x7e\x5c\x17\xe4\x08\x06\xf2\x38\x88\x07\x6e\x4b\x48\x99\x6b\x39\x65\x3a\x38\xf6\xe1\x4e\x2d\x16\xe4\x28\x16\xe3\xb4\x22\xe3\x7f\x92\x4e\x4c\xcd\xc1\xd8\xd6\xe2\x40\x42\xf4\x59\x51\xa6\xe6\x8a\xf2\x03\x46\x7e\x7d\xfb\xdb\x00\x7e\xec\xca\x25\xa8\x43\xcf\xf0\x36\x76\x19\x8a\x45\xc6\x9f\x52\xe3\xc6\x1b\xe3\xf1\x59\x68\x66\xd2\x3a\x98\x58\xf3\x7b\x0b\x05\xae\x08\xd8\x96\x04\x6b\xd2\x7a\x14\xef\x4d\x73\x58\xc7\x96\xb4\x51\x65\x6c\xf1\x2a\x74\x7e\xef\x7b\xc5\xd3\xfb\xbb\xf7\xd3\x78\x9a\x98\x6d\x61\xe4\x08\x63\x3d\xcc\x95\x41\x9d\xfa\x0e\xc5\xbb\x36\x85\xeb\x68\x24\x6f\x21\x2b\xd0\x04\xac\x0c\xda\x98\xd7\xbe\x76\x34\xde\xbf\xbf\xfe\xa6\x18\x38\xf6\x21\xe1\x94\xfb\x87\xcf\x0a\xfb\x45\xe6\xff\xf0\xd2\xfe\x9b\x84\x0e\xdf\xd5\x2e\x10\xfa\xa1\xe5\xa7\x27\x85\x5e\xd6\x33\x72\x86\x3c\x05\xb9\x73\x9b\xb1\x88\x9c\x51\xe5\x79\x62\x57\xe4\x56\x8a\xd6\x93\xb5\x75\x4b\x65\x16\x23\x71\xc4\x51\xf4\x0e\x9e\x84\x6f\x91\x93\x1f\xc2\xcf\xab\xc9\xc8\x15\x66\x17\x0b\x1a\x36\xfd\x11\xd2\xca\x39\x3c\x79\x15\x61\x9b\x46\xee\xf2\xde\xe9\xfa\x31\x02\x47\xb6\x4f\x43\xc2\x6e\x5d\xa8\xac\x68\x3e\x45\xb6\x90\xb2\xc4\x3c\x42\x29\x9a\xcd\x77\x77\x7e\x51\x69\xed\xe4\xec\xcd\x28\x7d\x46\x1f\xa1\xc9\xe5\x3f\x2b\xf6\x32\xff\x2a\x3a\xac\xd5\x45\x40\xf0\xe9\xfe\xee\x8f\x09\x89\x5a\x7d\x43\xd4\xc7\xcf\x58\x53\xf0\xae\x6e\x6a\x5a\xf6\xd6\x49\xe5\xda\x99\xab\x67\xdb\x1b\x8b\x9d\xf0\xa9\xc8\x82\x2f\x5f\xaf\xfe\x13\x00\x00\xff\xff\x90\x55\x76\xc2\x18\x21\x00\x00") func operatorsCoreosCom_operatorsYamlBytes() ([]byte, error) { return bindataRead( @@ -199,12 +199,12 @@ func operatorsCoreosCom_operatorsYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "operators.coreos.com_operators.yaml", size: 9266, mode: os.FileMode(436), modTime: time.Unix(1606762435, 0)} + info := bindataFileInfo{name: "operators.coreos.com_operators.yaml", size: 8472, mode: os.FileMode(436), modTime: time.Unix(1607977325, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x73\xdc\xb8\x95\x28\xfe\xff\x7c\x0a\x94\x92\x2a\x49\x89\xba\x65\x67\x73\x93\x5c\xdf\x54\x52\x1a\x49\x4e\xb4\x63\x7b\x74\x2d\xd9\x53\xfb\x9b\xcc\xdd\xa0\x49\x74\x37\x22\x12\xe0\x10\x60\xcb\xbd\x9b\xfd\xee\xbf\xc2\x39\x00\x48\xf6\x83\x00\x5a\x2d\xd9\x93\x11\xfe\x48\xc6\x2d\xf2\x10\x8f\x83\xf3\x7e\xd0\x8a\x7f\x64\xb5\xe2\x52\xbc\x22\xb4\xe2\xec\x93\x66\xc2\xfc\x4b\x8d\xef\xfe\xa0\xc6\x5c\x9e\x2e\x5e\x7e\x75\xc7\x45\xfe\x8a\x9c\x37\x4a\xcb\xf2\x3d\x53\xb2\xa9\x33\x76\xc1\xa6\x5c\x70\xcd\xa5\xf8\xaa\x64\x9a\xe6\x54\xd3\x57\x5f\x11\x42\x85\x90\x9a\x9a\x9f\x95\xf9\x27\x21\x99\x14\xba\x96\x45\xc1\xea\xd1\x8c\x89\xf1\x5d\x33\x61\x93\x86\x17\x39\xab\x01\xb8\xfb\xf4\xe2\xc5\xf8\xdf\xc6\x2f\xbe\x22\x24\xab\x19\xbc\x7e\xcb\x4b\xa6\x34\x2d\xab\x57\x44\x34\x45\xf1\x15\x21\x82\x96\xec\x15\x51\xcd\x44\x65\x35\xaf\xe0\x13\x63\x59\xb1\x9a\x6a\x59\xab\x71\x26\x6b\x26\xcd\xff\x95\x5f\xa9\x8a\x65\xe6\xe3\xb3\x5a\x36\xd5\x2b\xb2\xf1\x19\x04\xe7\xe6\x48\x35\x9b\xc9\x9a\xbb\x7f\x8f\x88\x2c\x4a\xf8\x2f\x5c\xf9\x4d\xe7\x9b\xf0\x73\xc1\x95\xfe\x66\xed\x4f\x6f\xb8\xd2\xf0\xe7\xaa\x68\x6a\x5a\xac\xcc\x15\xfe\xa2\xe6\xb2\xd6\xef\xda\x2f\x8f\xcc\x33\xed\x7f\xd9\x87\xb8\x98\x35\x05\xad\xfb\x00\xbe\x22\x44\x65\xb2\x62\xaf\x08\xbc\x5f\xd1\x8c\xe5\x5f\x11\x62\x77\x10\xe0\x8d\x08\xcd\x73\x38\x13\x5a\x5c\xd7\x5c\x68\x56\x9f\xcb\xa2\x29\x85\xff\x5a\xce\x3c\xbc\x57\xe4\x76\xce\x48\x45\xb3\x3b\x3a\x63\xee\x4b\x13\x96\x13\x2d\xe1\x61\x42\xfe\xa1\xa4\xb8\xa6\x7a\xfe\x8a\x8c\xcd\x96\x8e\xcd\x8e\xd9\x3f\xe1\x59\x5c\xe3\xcb\xf6\x37\xbd\x34\x93\x53\xba\xe6\x62\xb6\xed\x73\x19\xd5\xb4\x90\x33\x82\x38\x44\xa6\xb2\x26\x7a\xce\x88\x01\xcf\xa7\x9c\xe5\x6e\x3e\x5b\x66\x80\xaf\xf5\xe6\x70\xd3\xfd\x29\x6a\x0a\x73\x2a\x04\x2b\x88\x9c\x92\xa6\xca\xa9\x66\x8a\x68\xd9\xae\x7f\xfb\xf2\xed\x8b\xbd\xaf\x9f\xf7\x7e\x5b\xfb\x3c\x3e\xb4\x78\x49\x8b\x6a\x4e\x5f\xe2\xe1\x66\x73\x56\xd2\x57\xf6\x0d\x59\x31\x71\x76\x7d\xf5\xf1\xdf\x6e\x7a\x3f\x93\xfe\xb4\xbb\x48\x46\xee\x18\xab\x54\x8b\xd4\xa4\xa9\xcc\xfc\xcd\x42\xc8\x64\x49\x74\x4d\xb3\x3b\x2e\x66\xb0\xcc\x19\xac\xcd\xc3\x24\xe4\x1c\xb7\x5f\x8d\xfd\x6f\x38\x65\x39\xf9\x07\xcb\xb4\xff\xb1\x66\x3f\x36\xbc\x66\x79\x3b\x9d\x11\x71\x97\xbc\xf3\x93\xd9\x15\xff\xcf\xaa\x36\x53\xd2\xfe\x0e\xe1\xe8\x50\x97\xce\xaf\x2b\xcb\x3b\x34\x3b\x80\x4f\x91\xdc\x90\x15\x33\xed\x39\x73\xa8\xcd\x72\xbb\x69\xe6\xc8\xf4\x9c\x2b\x52\xb3\xaa\x66\x8a\x09\x24\x34\x3d\xc0\xc4\x3c\x44\x85\x5d\xd1\x98\xdc\xb0\xda\x80\x31\x17\xaf\x29\x72\x43\x8d\x16\xac\xd6\xa4\x66\x99\x9c\x09\xfe\x5f\x1e\x36\x20\x81\xf9\x68\x61\x30\x42\xaf\xc0\x84\xab\x24\x68\x41\x16\xb4\x68\xd8\x09\xa1\x22\x27\x25\x5d\x92\x9a\x99\xaf\x90\x46\x74\xe0\xc1\x23\x6a\x4c\xde\xca\x9a\x11\x2e\xa6\xf2\x15\x99\x6b\x5d\xa9\x57\xa7\xa7\x33\xae\x1d\x55\xcd\x64\x59\x36\x82\xeb\xe5\x29\x10\x48\x3e\x69\xcc\x61\x9e\xe6\x6c\xc1\x8a\x53\xc5\x67\x23\x5a\x67\x73\xae\x59\xa6\x9b\x9a\x9d\xd2\x8a\x8f\x60\xea\x02\xc9\x5e\x99\xff\xa2\xb6\x74\x58\x1d\xf6\xe6\xba\x86\x82\x38\x80\x8e\x0d\x9c\x80\x21\x66\x84\x2b\x42\xed\xab\xb8\x8a\x76\xa3\xcd\x4f\x66\x77\xde\x5f\xde\xdc\x12\xf7\x69\x38\x8c\xd5\xdd\x87\x7d\x6f\x5f\x54\xed\x11\x98\x0d\xe3\x62\xca\x6a\x3c\xc4\x69\x2d\x4b\x80\xc9\x44\x5e\x49\x2e\x34\xfc\x23\x2b\x38\x13\xab\xdb\xaf\x9a\x49\xc9\xb5\x02\xbc\x64\x4a\x9b\xb3\x1a\x93\x73\x60\x35\x64\xc2\xec\x35\xce\xc7\xe4\x4a\x90\x73\x5a\xb2\xe2\x9c\x2a\xf6\xe8\x07\x60\x76\x5a\x8d\xcc\xc6\xc6\x1d\x41\x97\x4b\xae\x3e\xbc\x72\xff\x08\x71\x2c\x6c\xcb\x79\x75\x09\xc2\x4d\xc5\x32\x7f\x6d\xa8\x20\x67\x55\x55\xf0\x0c\x6e\x06\xd1\x73\xaa\x49\x46\x85\xd9\x25\x2e\x94\xa6\x45\x01\x4c\x23\xf8\xfd\x4d\x34\x80\xc0\xa5\xef\x30\x01\xf7\x53\x8f\x2a\xf7\x7f\xf4\xac\xaa\xf7\xd7\xcd\xb4\xc2\x0c\x4b\x63\x57\x7f\xde\xba\xa9\x04\x25\x8c\x29\x9f\xad\xbf\xb2\x75\xc7\xce\xe1\x05\x90\x4c\x28\x17\xca\x02\x68\x6a\xdc\xb3\x96\x17\x4d\x65\xbd\x06\x94\x98\x2b\xd2\x81\x35\xde\x32\xd3\x0d\x3b\x3a\xbc\x72\x33\x98\x58\x6c\xfa\x79\x65\x29\x97\x62\x81\x57\xd5\x48\x21\x86\xdc\x31\xb1\xe0\xb5\x14\x25\x13\x9a\x2c\x68\xcd\xe9\xa4\xb0\x4c\x8d\x69\xc2\x57\xe9\xa3\x9f\xa7\xb9\x6d\xb8\x05\xac\xde\x74\x9d\x36\xbe\x87\xab\xa3\x75\x4d\x97\x1b\xff\xce\x35\x2b\x37\xae\x6d\xd3\x32\x3e\xd2\xba\x43\x29\x0c\xf2\x6e\x5a\x0a\xb1\x0f\x6c\x01\x6a\xa8\x33\xa1\xe4\xdc\x2f\x65\xdb\x7a\x87\xce\x05\xc7\x66\x9c\x6f\xc7\x06\xec\x6f\xc7\xf0\xd1\xe2\x00\x79\x60\xeb\x5f\x57\x36\xc8\xdc\x1d\x64\x79\x6c\xe3\xbe\x8c\xc9\xdb\x46\xc1\x89\xd1\x01\x90\x84\x9c\xff\xe7\xd5\xc5\xe5\xbb\xdb\xab\xd7\x57\x97\xef\xb7\x6d\x0e\x19\xbe\x62\xed\x00\xbe\x10\xbd\x84\xc3\x8f\xee\x0c\x6b\x36\x65\x35\x13\x19\x53\xe4\x97\x47\x1f\xcf\xde\xff\xe7\xbb\xb3\xb7\x97\xc7\x84\xd6\x8c\xb0\x4f\x15\x15\xf9\x0a\x5d\x5a\x1d\x8d\x72\x2c\xa8\xaa\xd9\x82\xcb\x46\x59\x9a\x97\x6f\x41\x7f\x6e\xa8\xdf\xb6\xb3\xc2\xe1\xb1\x1f\xf8\x39\x15\x4b\xa2\x58\xbd\xe0\xd9\xe6\xed\x56\x63\x72\x35\x0d\x6c\xb5\x47\xd9\xcc\xdf\x26\xc3\x2c\x8b\x05\xcb\x4f\x60\xf2\x7e\x1b\xec\xfc\x08\x17\x55\xb3\x1d\xb3\xcd\xb0\x0c\xf9\x9e\x17\x05\xdc\x4e\x81\x92\x5d\x3e\x06\x69\xb6\xbb\x99\x6a\x29\x34\xfd\x64\xe9\xfd\x20\x4c\xa6\x32\x5a\xb1\x9c\xdc\x73\x3d\x27\x94\xe4\xb2\x31\x93\xfe\xe5\x2f\x4f\x08\x67\xaf\xc8\x2f\x3b\x40\xc7\xe4\xd2\x3e\xdb\x9e\xe0\x20\x68\x98\xa7\x60\x0b\x56\x9b\xd9\xba\xb3\x3d\x21\x35\x9b\xd1\x3a\x2f\x98\x52\x06\xa7\xef\xe7\x4c\xcf\x19\x0a\xff\x6e\xd3\x86\x67\xfc\x89\x1b\xc6\x2f\x6b\x22\xa4\x1e\x93\x0b\x36\xa5\x4d\x01\x92\x00\x39\x38\x18\x1f\xee\x05\xad\x5f\xd7\xb2\x8c\x46\xed\x9b\xbe\x06\xb3\x09\x63\x0e\x15\xc2\x1d\xba\x74\xa4\x4b\x78\x15\xcb\x09\x9f\x5a\xd9\x8b\x2b\xb3\x54\xc2\xca\x4a\x2f\xc3\xd7\x76\x90\xae\x91\x48\xf2\x44\x3c\x37\x7d\x4b\xab\x6f\xd8\xf2\x3d\x9b\x0e\x3f\xbc\xba\x27\xac\x60\x99\x21\xe4\xe4\x8e\x2d\x41\x10\x27\xe7\x0e\xdc\xf0\x26\x44\x2f\x83\x44\x90\x69\x37\x46\x66\x1a\x81\x67\x62\xb7\xc5\x8c\x3b\xb6\x0c\x3f\x44\xd6\x35\x4e\xb3\x19\xc0\x8d\xcd\xee\x84\xf6\x81\xc4\xa2\xac\x1b\x21\x9e\xb2\x71\x5a\x87\x5d\xe6\x62\x6f\xb6\xde\x28\x32\xdf\x35\x13\x56\x0b\xa6\x19\x48\xcd\xb9\xcc\x94\x11\x98\x33\x56\x69\x75\x2a\x17\x86\x5e\xb2\xfb\xd3\x7b\x59\x1b\xa5\x73\x64\xe8\xc9\x08\xcf\x50\x9d\x82\x81\xe5\xf4\x17\xf0\x7f\x11\xf3\x23\xe4\xf6\xdb\x8b\x6f\x5f\x91\xb3\x3c\x27\x12\x88\x43\xa3\xd8\xb4\x29\xc8\x94\xb3\x22\x57\xe3\x8e\x2e\x79\x02\xfa\xcc\x49\x14\xd0\x86\xe7\x7f\x1e\x22\x0f\x6e\x24\xed\xb9\xac\xd0\xc8\x92\xbc\xef\x37\x20\x5c\x2e\x7b\xf4\xcf\x5f\x11\x43\xdd\xb8\x8e\xdb\x2b\x83\x53\xa5\x65\xff\x96\x11\x46\x2f\x72\x22\x65\xc1\xe8\x36\xb9\x10\x07\x6c\x7a\xea\xfd\x3f\x6c\x09\x00\xbc\xef\x10\xac\x92\xf9\x2b\xa2\x9a\xaa\x92\xb5\x56\x5e\x11\x02\x7b\x52\xf8\x10\x7b\x8f\x83\x2e\x71\x42\xfe\xee\x7f\x2c\xe8\x84\x15\xea\xfb\xc3\xc3\x3f\x7e\x73\xf9\x1f\x7f\x3a\x3c\xfc\xe1\xef\x61\x88\xed\xdb\x1d\x6b\x65\x0f\x04\x41\x7b\x97\xcc\x41\x81\x09\x43\x44\xe3\x14\x0a\x0f\x67\x59\x26\x1b\x01\x46\xbe\x13\xa2\x34\xd5\x8d\x1a\xcf\xa5\xd2\x57\xd7\xfe\x9f\x95\xcc\xaf\xae\x23\xa0\x76\x9e\x56\x83\x3c\x8e\x3c\x16\x01\x85\x63\xbc\xa6\x7a\xbe\x47\x32\xba\xcd\x26\xb4\x79\xf4\x10\xcc\x59\x89\x2c\x5e\x59\xb3\x90\xf9\xcf\xd7\x91\x13\xc5\xc1\x15\xb9\xaf\xb9\xd6\x4c\x80\x1c\xc6\xea\xd2\x48\x25\x27\xe6\x26\xb5\x62\xc5\xe2\xe5\xc1\xde\x89\xb5\xdf\xcf\xe4\xa5\x9b\x97\xdc\xba\xf1\x72\x79\x96\x12\x23\xeb\xba\xd1\x6a\xb7\x67\xd7\x57\xce\xc2\xb6\xd7\x65\x3a\xeb\xd0\xeb\x07\x52\x10\x6f\x65\xb2\x8b\xf6\xd2\xfa\x2b\x22\x45\x11\xe2\xeb\xed\x3c\x14\x29\x38\x58\x8f\x8c\x90\xef\x2d\x48\x47\xf8\xe3\x38\xab\x9a\x13\xfb\xc0\xb8\x64\xa5\xac\x97\xe1\x7b\x69\x1f\x67\xd5\x9c\x95\xac\xa6\xc5\x48\x69\x59\xd3\x19\x3b\xf1\xe0\x11\xac\xff\x17\x02\x0e\x5f\x8c\xce\x04\xd7\xa1\xa3\xb2\x94\x35\xb5\x61\xd5\xc5\xd2\xd1\x53\x96\x7f\x1e\xca\xe0\xb6\x77\x8f\x84\xc1\x9f\xf0\xbb\x9d\x44\x1a\x6f\x01\xb0\x66\x77\xb7\x16\x90\xd1\x17\xb2\x68\x4a\xa6\xe2\x64\x06\xc7\xde\xe1\x4d\x26\x16\x46\xa2\x57\x7b\x17\x22\x72\xbe\xe0\x4a\xd6\x3b\xca\x10\xdc\x1a\xc9\x65\xa3\xab\x46\x9b\x99\x96\x54\xdb\xbb\x12\xb5\x48\xf6\xa9\x92\x0a\xf4\x3a\x7b\x4f\x56\xc8\xdf\xcb\x83\x08\x30\x15\xd5\x9a\xd5\xe2\x15\xf9\x7f\x47\x7f\xfb\xf5\x3f\x47\xc7\x7f\x3e\x3a\xfa\xfe\xc5\xe8\x7f\xff\xf0\xeb\xa3\xbf\x8d\xe1\x3f\x7e\x75\xfc\xe7\xe3\x7f\xba\x7f\xfc\xfa\xf8\xf8\xe8\xe8\xfb\x6f\xde\xfe\xe5\xf6\xfa\xf2\x07\x7e\xfc\xcf\xef\x45\x53\xde\xe1\xbf\xfe\x79\xf4\x3d\xbb\xfc\x21\x12\xc8\xf1\xf1\x9f\x7f\x19\x31\x39\x2a\x96\xdf\x06\xc9\x0f\x01\x6c\xc6\x83\xe3\x42\xb3\x19\xdb\x64\xf4\xdb\xf6\x46\xe4\x51\x13\xf2\x69\xd4\x0a\xd2\x23\x2e\xf4\x48\xd6\x23\x7c\xf9\x15\xd1\x75\x13\x3e\x32\x77\x4c\xe9\xf7\xe2\xbd\xbb\xd3\x1d\xc3\xbd\x63\x1d\x7b\x45\x6a\xc5\xb2\x9a\xe9\xfd\xe8\x8d\x08\xcb\x59\x49\x2a\x99\x1f\x86\xe5\x62\xb1\xd1\xd8\xbc\x6d\x41\xff\xb2\xaa\xa6\x13\x8e\x70\x07\x5b\x29\x61\x5a\xcb\x72\x4c\xc0\x68\x18\x45\x20\x26\x8c\x50\xb2\xa0\x05\xcf\x1d\xac\x3b\x36\x68\x89\x70\xe3\x59\x7d\xfd\x39\xa9\xaf\x37\x88\x1b\xa8\xbb\x46\x5c\x03\x1c\xfb\xd7\x5d\x99\x58\x6c\x37\xe0\xad\x7a\x1e\xcc\x93\x7d\x27\x8a\x13\x16\xb5\x24\x95\xac\x9a\x82\xea\x9e\x51\x6f\xcb\x04\x57\xed\xcd\x5d\x8f\x8a\xbd\x8f\xad\xa1\xda\xa0\x17\xf8\x2a\x06\x25\x27\xb7\x33\xb4\x6f\xb8\x27\x67\x45\x41\xb8\xc0\xfb\x08\x60\x9d\x45\xb8\x66\x28\x07\x12\xba\x0d\x4f\xa9\x20\x6c\xc1\x84\x36\xe7\xb6\x32\x4d\xb3\x09\x4a\xd3\x5a\x73\x31\x1b\x93\xef\xcc\xdf\x91\x0a\x5b\x83\xeb\x56\xf7\x51\xd9\x14\x9a\x57\x05\x23\x5e\x7a\x40\x5b\x6e\xd1\x30\x42\x95\x92\x19\xa7\xda\x59\x98\xd1\xaf\xae\xf4\xf0\xc2\x61\x3d\x9a\xde\x81\x89\x3f\x63\x39\x13\x19\x1b\x93\x8f\xe0\x4e\xf7\x7b\x38\x59\x9a\xd5\x5c\x8a\x85\xb7\x5d\x37\xe8\xee\xdc\x06\xd5\xac\x65\x33\xe4\xab\xb2\x6c\x34\x38\x52\x1e\xdf\xd3\x65\xf0\xcd\x5a\x8c\x3b\x0e\x2f\x20\xd3\x5e\xc9\xa1\xe0\xaf\x93\xd3\xad\x77\xc1\x1b\x8a\xb6\x9d\x73\x04\x63\x8b\x61\x42\xde\x04\x1c\xe0\xe3\x6b\xdc\xa7\xb5\x64\xf5\xb9\xce\xd3\x59\xaf\x63\xb8\xc9\x97\xcd\x49\x52\xb9\x48\x14\x87\x88\xe6\x0e\xb1\x9c\x21\xc1\xa8\x99\x46\xe9\xe3\x2c\x94\x55\xcd\xa6\xfc\x53\x34\x6e\x9e\x89\x56\xa5\xe3\x39\x13\xda\xa8\x4f\x35\x90\xfa\x9a\x55\x4c\x80\x2d\x85\xd1\x6c\x1e\x64\x5f\x96\xca\xb7\x5e\x8d\xd6\x07\xbb\x5f\x3f\x2b\x4a\x5c\xa9\x17\xf0\x66\x93\xcc\xf7\x7c\xfb\x7e\x76\xb7\xcf\xe2\xc1\x7e\xaf\x9e\x90\x39\x43\x4d\x6d\x9b\xd1\x62\xe5\x6c\x3b\xcf\xdb\xd8\x32\xf7\xaf\xfb\x39\xcf\xe6\x7e\x7a\x46\xff\xdd\x12\x6c\x43\x6c\xa0\x4a\x25\xe1\x8e\x4e\xb9\x26\xd2\x48\x28\x66\x2e\x63\x72\xb3\x01\x5e\x49\x75\x36\xb7\x4f\x1c\x6e\x55\x1a\xd1\x6d\xe0\xbd\xb7\x16\xfc\x04\x4d\xca\x79\x53\xb0\x9c\xb8\xf0\x29\xfc\x54\x8b\x92\x5b\x20\xc6\x20\x6a\x2f\xd0\xe8\x94\x2a\xc5\x67\x62\x54\xc9\x7c\x64\xbe\x71\xba\x19\x8d\x82\x57\xb4\x1b\xf2\x1b\xba\xa6\x01\x4c\xf4\xa6\xa0\x98\xe3\x7d\xef\xed\xab\x1d\x89\x26\x93\x65\xd5\x68\xd6\x31\xbe\x3a\x0d\x7a\xcb\x8c\x26\x4b\x8c\x06\xec\xc8\xcd\xad\x5c\x96\x4a\x08\xfa\xfb\x5b\x52\x41\x67\x6c\x64\xa7\x34\xf2\x53\x1a\xf9\x6f\xed\xba\xe5\x61\x7a\x88\x26\xe2\xed\xf7\xb8\xbf\x95\x6f\xd0\x40\x8d\x3f\x4e\xac\x61\xaf\xa4\x9f\x78\xd9\x94\x84\x96\xb2\x11\xa0\xa2\xd8\x95\x0c\x5c\xe3\x76\xdb\x69\x51\xc8\x7b\x96\x7f\xae\x2d\x8c\xda\x46\x92\x88\xbd\xe4\x4b\x35\x38\x06\x0d\x8d\xf1\x06\xc6\x68\xc3\xe2\x8e\x06\x45\xe7\x5f\x88\x45\xcd\xf7\xce\x61\xb2\x82\x9c\x5c\x3c\x00\x39\x1d\x4d\x80\x88\x2a\xff\x05\xae\x88\x2c\xb9\xd6\xd6\x62\x4f\x5b\x9a\x30\x64\x2a\xe1\xba\x67\xb6\xb6\x57\x89\x4f\x91\x78\x73\x45\xd8\x27\xa3\x20\x72\x70\x99\x38\xe7\xd7\x09\xb2\xf7\x7b\xae\x86\x26\xac\xa5\xd1\x35\x79\x59\x15\xac\x74\xc1\xe6\x23\xa7\x88\x62\x64\xcf\xf3\xf5\x7a\xbe\x5e\x6e\xa8\x78\xd9\xa8\x2b\x16\xa1\x71\x64\xc2\x8a\x56\x3c\x32\xe8\x5f\xc9\x5c\x59\x99\xc4\x21\xcd\xb6\x98\x5c\x42\x2e\x3f\x71\x05\x31\xfa\xef\x19\x58\x43\x6e\x98\x56\xe4\x7e\x2e\x15\x43\x38\xb4\x66\x16\x3a\x9a\x50\x80\xe5\x5a\xfb\xd1\x80\xd4\x25\x21\xa4\x7c\x3a\xed\xbf\x97\xb3\xaa\x90\xcb\x12\x24\xf5\x2b\xdd\x95\xba\xac\x28\xb5\x0d\x22\x2b\xab\x82\x6a\x76\xa8\xac\xf8\x35\x64\x77\x79\x10\xf7\x85\xd9\x5c\x7e\x32\x52\x89\x6a\x33\xd1\x36\x8d\xde\xa9\xac\xbe\xd6\x37\x10\xf6\xcf\x68\x90\xce\x01\x75\x2b\x31\xfb\xe1\x16\x34\x9b\xf6\x17\x38\x8b\xb3\x77\x17\xdb\x0f\x33\x6c\x7a\x22\x21\xf3\xd3\xda\xd2\xce\x56\x51\xac\x33\xa5\xbe\x6c\x3e\xa8\x24\x60\x3e\x81\x8b\x9b\xc7\x4c\x97\x13\x34\x18\x9e\xd8\x20\x5a\x9f\x99\x84\x0f\xd7\x0c\x12\x6a\x02\x50\xd1\x71\x61\x00\xd8\xec\x99\x87\xeb\xac\x31\x9e\x9b\x90\xd7\x66\xe4\x17\xb3\x07\xe5\x38\xc2\xa5\xd3\x3b\x32\xb3\x23\x3d\xf2\x00\x61\x84\x66\x4f\xd1\xbb\x13\x71\x5c\x04\xa2\x6d\xaa\x02\x7c\xc5\x32\x2e\x02\x33\x4a\x4d\xc5\x4d\x49\x5a\x8e\x47\x8b\x6e\xc0\xbf\x59\xd3\xa1\x42\x24\x31\x37\x6e\xce\xab\xe0\x82\x0c\x57\xb6\x96\x52\x9f\x6b\xf5\x11\xac\xe2\x6d\x4e\x9c\xb9\x63\x57\xe2\x84\xbc\x93\xfa\x4a\x84\x1d\x2d\x97\x68\xeb\x36\xf8\x77\x21\x99\x7a\x27\x35\xfc\xb2\xb7\x0d\xc3\x69\x26\x6d\x17\xbe\x02\x57\x53\x20\x25\x00\x27\x45\x27\x39\x0b\xe2\xd1\xc3\xbb\x65\xc8\xb8\xdb\x7a\xae\xc8\x95\x20\xb2\xb6\xfb\xd2\x5a\xec\x95\xfd\x44\x19\xe3\x1b\x9c\x30\x22\xa4\x18\x61\x60\xb2\x91\xe0\x56\xbf\x71\xe9\x63\xb5\xbb\xbb\x19\x3e\x86\x8d\xd3\x81\x28\x72\xfc\xd4\xad\xe1\x3e\xf8\x17\x4c\x02\x2c\x6c\x0e\x6c\x60\x5f\x1b\xd8\x34\x48\x6d\xa3\x9a\xcd\x78\x46\x4a\x56\xcf\x98\x11\x76\xb2\x79\xdc\x21\x0f\xd3\x62\x1c\x41\x8a\xdc\x05\x38\x88\x35\xc0\x88\xde\x00\x8f\x4c\x61\x5d\xf8\x06\x92\xf3\x92\x56\x06\x61\xfe\xdb\x50\x66\xd8\xd3\xff\x21\x15\xe5\xb5\x1a\x93\xb3\x81\x19\x2a\x2e\x66\x05\xeb\xbd\x65\x2d\x9e\xdd\x0f\x18\xd8\x46\xb0\xfe\xb1\xe1\x0b\x5a\x0c\x65\xe6\x38\x19\x9a\xa1\x04\x6d\x66\xb4\xca\x64\x4f\xac\x9c\x62\xa8\x1b\xc6\xb5\x71\x45\x0e\xee\xd8\xf2\x60\x08\x61\x56\x51\xee\xe0\x4a\x1c\x20\x07\x5a\x43\x22\xcf\xae\x02\x51\x63\x07\xf0\xd6\xc1\x43\x38\xf6\x9e\x85\xf1\x00\xa6\x68\x59\xb0\xba\x9b\x6a\xbf\x3a\xfa\xe6\xe1\xf6\x69\x58\x90\x0f\xab\xe8\xc2\x79\x6c\x4f\xd8\xad\xb3\xb5\x99\x9b\xdc\xce\x08\x50\x56\x6b\x9a\xcd\x21\xfd\xdc\xcd\x68\x40\x6c\xa0\x62\x49\xcc\xa9\x6a\xe4\x88\x80\x54\x56\x35\xd5\x35\xb8\x25\xff\xe8\x71\xf8\x84\x81\x04\xfb\x27\xcc\x21\xda\x7e\x84\x0e\xcb\x0d\xb1\xf0\xb8\xf5\x47\xf7\x5f\x7f\x7a\x40\x5e\x59\x8c\x88\x80\x93\x8c\x16\xe8\x2e\xe1\x71\xc2\x45\x0e\xce\x4f\xbb\x74\xd8\x11\x84\x64\xf6\xb1\x0c\x13\xb8\x4b\x43\x5a\x49\xc9\xa8\x50\xce\x74\x0a\xbe\xd2\x16\x90\xb2\x6e\xe1\x8e\xf2\x6c\x8d\x4b\x11\x3c\x0f\x50\xed\x9d\xbc\xb1\x56\xd5\x13\x72\x0d\x56\xfe\xf6\x17\xb8\xb3\xef\xe4\xe5\x27\x96\x35\x7a\x30\x53\x26\x8a\xdb\x06\x84\xac\xde\x16\x7e\xd3\x0a\x58\xb8\xde\x9e\x80\xd5\xde\x0a\x27\x42\x0d\xcb\xb0\x72\x3c\xb8\x97\x77\x6c\xa9\x3c\xb3\xb4\xa2\x1d\xb0\xb5\x61\xb6\xe8\xf1\xd0\xb1\x42\xe4\xad\xff\xc7\x19\x4d\xcb\x09\x17\x38\x49\xfc\xac\x3b\xf4\x41\xa0\x66\x56\xee\x78\x8c\xcc\x5e\x14\x38\xbd\x87\x6e\x7e\x8c\x5c\xd8\x3b\x81\x6f\x23\x65\xc2\x7e\x11\x83\x0d\xb3\x73\x34\x7f\xb3\x24\xd8\x11\xef\x2e\x7f\x6c\x68\xd1\xa6\x8f\x05\x8e\xd4\x3d\x6e\x01\xf4\x78\x9e\xf9\xf3\x3d\x2f\xf2\x8c\xd6\x36\xc2\x14\x68\xcd\x20\x44\x25\x11\xbf\x28\x10\xc1\x8c\x0a\x4f\xe9\x5a\x4c\x51\x18\x0a\x50\xd1\x5a\xf3\xac\x29\xe8\xb0\x84\x6f\x2b\x97\x44\x24\x88\x05\xce\xae\x45\xf7\x1b\x96\x49\x91\xc7\xab\x96\xb7\xab\x6f\xae\x46\x38\x54\xac\xe6\x32\x1f\x0a\x6c\x80\x09\xf0\x92\xad\x5e\xbc\xa3\xbe\x9f\x48\x4e\x1d\x6d\xf3\x04\x23\x70\x7b\x9c\x91\xcf\x56\x1c\x70\xe2\x05\x9f\x09\x59\xb3\xfc\xb8\x65\x34\x2d\x15\x18\x26\x97\x5f\x2f\x9d\xb5\xf1\x84\x70\xed\x72\xf4\x14\xd3\x27\xce\x07\x65\xaf\xa1\x3d\x56\x0f\x76\x10\xea\x54\xd6\x90\x30\x79\x94\x4b\xcc\xf9\x5b\xf0\x4c\x1f\x8f\xc9\xff\xc7\x6a\x09\x68\x2b\xd8\x8c\x6a\xbe\xf0\x92\xcd\x3d\x2f\x8a\x41\x88\xe0\x55\x63\x14\xa3\x82\xc8\x0b\x72\x04\x20\x09\x2f\x4b\x96\x73\xaa\x59\xb1\x3c\x46\x7b\x0e\x23\x6a\xa9\x34\x2b\xc3\x08\x14\x36\xae\x61\x0c\x32\x3c\xf9\xbb\xdf\x6e\x7d\x2e\x2d\x83\xf8\xa3\xcb\x85\x6c\xc9\x34\xc6\x18\xad\xa0\x8a\x95\x00\x82\x34\x7a\xab\xba\xd2\x8d\x5f\xb2\xc5\x42\x9c\xe6\x11\x8b\x64\xff\x30\x78\x4a\x49\xcd\xa0\x7a\x8f\xbd\x71\x0f\xb8\x99\x18\xb3\xfe\x56\x36\x62\x9b\xbd\xbe\xb7\x55\x6f\xac\xa1\xea\x63\xe7\xb5\xb6\x0a\xc0\x4a\x74\xda\x23\x0b\x7a\x9d\x39\x74\x3c\x07\x94\x80\xbb\x00\x04\x2c\x43\xe4\xf0\x29\x1b\x17\xb7\x5d\xd6\x0b\x4d\x7b\x4f\xb9\xfd\x30\xb7\x81\x14\xa2\x07\x67\xff\xfb\x0f\x44\x63\x3f\x24\xfd\xd8\xb0\xc1\x7e\xd8\x1e\xd5\x96\xe0\x00\xd6\xc2\x3e\x0e\xb3\x1e\x8f\xd2\x30\x0b\x96\xdb\x48\x60\xa0\x37\x16\x2c\x39\x7c\x75\xf8\x60\x46\x82\x8b\xac\x65\x45\x67\x70\x33\xa3\xd7\xba\xfa\x22\xc9\x99\x66\x75\x09\x65\x4d\xe6\xf2\x1e\xff\x0e\x0c\x7d\x70\xa1\x95\x85\xc0\xf2\xb6\xc2\xcc\x5c\x2a\xe0\xd7\xfd\x84\x7f\xa0\x03\x10\x32\x71\x1f\xd0\xed\x69\x2d\x1b\x91\x5b\x39\xd8\x13\xfc\xb7\x2b\x13\x7e\x27\x05\x50\xaa\x46\x61\x72\xfe\x5a\x6d\x9c\xfe\xf0\xdc\x68\xc2\x34\x35\x17\xf4\xe5\xf8\xe5\x8b\x07\x6f\x7f\x52\x85\x09\x30\xa8\xac\xd8\xef\x5d\x44\x8e\xbb\x9d\x0f\x9e\x51\xcd\x68\xfe\xad\x28\xe2\xe5\xf2\xb7\x88\xa0\xf0\xe2\xc8\x28\xed\xe0\xcd\xab\x1b\xc8\xaf\xa2\xf9\xe8\xbe\xe6\x9a\x45\x39\xf0\x08\x39\x9a\xd2\x42\x31\x22\x6b\xd2\x08\xaf\xc0\x1c\xf7\xeb\x07\xc0\x23\xe1\x65\x86\x62\xd2\x54\x33\x79\xd0\xdd\xc6\x4b\x8c\x48\xdb\x5e\x6d\x8f\xb2\x81\xfc\x07\xfb\xf6\x86\x6b\xde\x2f\x95\x40\x8e\xf0\x49\x23\x61\x4b\xa9\x8f\x1f\x1e\xa8\x86\xcb\xbe\xfc\x54\xc5\xcb\xfd\x97\xb6\x2a\x04\xa9\x42\x7b\x10\x14\xfb\x3b\xfb\x33\xb0\x07\x5f\xb3\x39\x5d\x30\x45\x14\x2f\x79\x41\xeb\x40\xf6\xa0\x96\xe4\x06\x57\x45\x26\x8d\xde\x5c\x93\x66\x73\x3d\x93\x00\x15\x69\xeb\x61\x74\xea\x99\x74\x57\xd0\xf9\x54\xbc\x92\xb2\xe1\x50\xdd\xfc\xcd\xa9\x00\xad\x73\xeb\x31\x73\x28\x1b\xdd\xd0\x22\xb0\x07\xec\x53\x56\x34\x8a\x2f\x1e\x72\xff\x6d\xce\x5d\xb2\xe8\xb2\x2a\xb5\x54\x32\xbf\xa9\x58\xf6\x34\x32\x4b\x5f\x17\x35\xe4\x34\x77\x88\x05\xb1\xfb\x68\xbe\xa2\xdb\x05\xfa\x92\x2e\x21\x1e\x34\xcb\x98\x52\x2e\x62\x7d\xd9\x8d\xb8\xf7\xab\xfa\x92\x4b\x15\xd1\x7b\x75\x59\x50\xa5\x79\xf6\x75\x21\xb3\xbb\x1b\x2d\xeb\x84\xba\x3f\x67\xdf\xdd\xac\xbd\xbd\x52\xea\xe9\xec\xbb\x1b\x72\xc1\xd5\xdd\x20\x1a\x76\x4a\xcd\x61\x34\x47\xd7\x4c\x48\xc9\x5d\x33\x61\x05\xd3\x87\x87\x0a\x79\x7c\x49\xb3\x39\x17\xc3\x2c\xc1\xb2\x7e\xe1\x13\x20\x6d\xe1\x3f\x73\x1e\xa9\xe1\x1c\x36\x35\xf7\xd4\x62\xfa\x2f\xe8\xbd\x62\xb8\xec\x89\x59\xb6\xf9\x33\x0b\xd7\xa6\xd9\x93\x2f\x13\x27\x71\x75\xb1\x07\x5f\xe5\x54\xdd\x9a\x99\xa5\x38\xac\x0e\x5f\xf3\x82\xa1\x2e\x09\xcb\x72\x51\xbd\xf6\xee\xc0\xf9\x2d\x65\x13\x74\x8f\xdc\x53\xb4\xad\x00\xed\x1e\x93\x5b\x5e\xbd\x22\x97\x42\x35\x35\x6b\x6d\x73\xd3\xfe\xa7\x82\x30\xb9\x6a\xb3\xa5\x9d\xda\x0b\xf8\x82\x6a\xa0\xa1\xc4\x56\x0b\x26\x97\x9f\x68\x59\x15\x31\x29\x7a\x07\xec\x93\xfe\xed\xc1\x09\x39\xf8\x34\x55\xe6\xff\x84\x9e\xaa\x83\x31\xb9\x2a\x7d\xb8\x11\x14\x3b\xac\x99\x0b\x2d\xc5\x17\xc2\x93\x9d\x76\x65\x95\x47\x41\xc9\xe0\x1c\x30\x0c\xda\x48\xdd\xb9\x24\xf7\x58\x73\xcb\xb0\x3f\x56\xd7\xb2\xf6\xb9\x4e\x9d\x63\x08\xc4\x99\xe3\xc8\x64\x59\xd5\xb2\xe4\x9e\xf5\xd9\xeb\xba\xb7\xf8\x69\x30\x9a\x85\x94\x0e\xb2\x86\xb9\x58\x07\xd7\xbe\x4a\xfa\xa2\x88\xc3\x5b\xc0\xcb\xb0\x6f\xcf\xe3\xed\xd5\xd4\x05\xb3\xa1\x61\xc1\x5a\x8d\xc0\x92\x61\x1f\x32\x98\x18\xa1\xb9\x11\x2b\xd5\x77\x70\x93\xbc\xf6\x19\xed\xe4\x34\x67\x8b\x53\x95\xd3\x97\x27\x30\x4d\x44\x9c\x70\x0e\x9e\xee\xad\x99\x2a\x72\xf0\xf2\x60\x4c\x6e\x9c\x7c\x74\xd2\xdd\x03\xff\x5c\x10\xea\x54\xd6\x7e\x42\xe0\x96\x7b\x71\x40\x8e\x64\x0d\x33\xcb\xa8\x20\x05\xa3\x0b\xeb\x7a\x42\x4a\x14\x9e\x28\x58\x60\x8e\x23\x6b\x1c\xc4\x25\x70\x77\xec\x54\xff\xf6\x9b\x00\xfb\x09\xeb\x2e\x64\xbd\x86\x85\x8d\xc8\x3f\x30\x4a\xcb\x01\xa8\x18\xd2\xf0\x30\xc3\x79\x8c\x58\x03\x85\x54\x2d\xe4\xe0\xfa\xdd\x46\x19\xbc\x5c\xb5\xec\xe0\x07\xd6\x90\x2d\x08\xb3\x83\x8c\x07\xa0\xfd\x1c\x3c\x39\xe7\x23\x49\xd5\x88\x1c\x6b\x4b\x3b\x87\x0f\x82\xff\xd8\x30\x72\x75\xe1\xeb\x10\xb1\x5a\x71\xa5\x0d\x25\xcb\xb9\xba\x8b\xad\x61\x01\x69\x3f\x46\x5c\x39\x3a\x2b\xe9\x7f\x49\x41\x2e\xbf\xbe\xb1\x53\x3a\xfe\x8c\x1b\x17\x20\x88\xf4\xbf\x9a\x9a\x19\x01\x2b\x3e\x48\xcc\xbd\xb1\x2a\xa9\x99\xdf\xc9\x05\xd5\x14\x04\x36\xa4\x5e\xc3\x36\x51\xd1\xf2\x58\x83\xf5\x13\x2e\x72\x4b\xf4\x3a\xd2\xd6\x53\x09\x46\xe6\xac\xdf\x6d\x97\x86\xdb\x87\x3e\xbc\xbf\xda\x83\xf0\x94\x01\x57\x9b\xbd\x95\x79\xa2\x04\xf5\x57\xb3\x5d\xe7\xf8\x36\x29\xcd\xeb\xe4\x9d\x14\xec\x04\x88\x05\x31\xd4\x02\xff\x33\x88\xae\xdf\xd5\x5c\xb3\x48\x92\x19\xc1\x56\xdd\xfe\x25\xad\xe6\xb6\x63\x4b\x02\x06\x68\xd0\x07\x6e\x9d\x65\xb0\x93\x42\x4e\x88\xbd\x0d\xfb\x9c\xe9\x87\xf7\x57\xc9\x13\xfd\xf0\xfe\xea\xe9\x26\xb9\x83\x70\xbd\x2a\x5b\xb7\x72\x46\x9b\x7e\xd8\x4a\x63\x61\xe6\x6f\x60\xc4\x4b\xc4\x63\x27\xeb\x86\x65\xe2\x34\x59\x98\xf0\x70\x00\x5b\x57\x16\xde\xd7\x09\xac\x57\x43\x5f\x1f\xfd\xab\x79\xf9\xa9\xc2\x20\x68\xeb\x80\xbb\x99\x53\xa8\xa8\xe2\xb3\xe0\x0d\xa2\x84\xf9\x2e\x57\x77\xca\x70\x21\x87\x52\x84\x62\xb1\x38\x42\x2e\x18\x06\x72\xe4\xaf\x5c\x10\x56\x34\xc4\xcd\x00\xdf\x42\x6e\x41\xfe\x0a\xf9\x00\xc1\x54\x83\x9c\xf4\x4a\xf8\x0f\x42\x3d\x42\xd3\xab\xf0\xaf\xd2\x05\xe5\x05\x9d\xf0\x82\xeb\xa5\x91\x63\x8e\xc7\x3e\xf3\x22\x46\x30\x56\xb0\x65\x7b\x23\x4a\x3b\x89\x66\x6b\x66\x5f\x72\x64\xe0\x9c\x82\x49\xf9\x78\x1c\x2f\x95\xcd\x59\xcd\x30\x80\x1e\x45\xbb\xae\x48\x67\xf6\x06\x6e\xd0\x8a\xc4\x16\x87\xbe\x21\x71\x08\x8e\xd3\xd0\x83\x34\xb6\x6e\xde\xd8\xc8\xd6\xe1\x0f\x37\x58\xba\x70\x70\x82\x36\xd3\xe7\x8b\xe2\xec\x98\x25\x1d\xe4\xed\x80\x7a\x81\xa7\x62\xb9\xfb\xcf\x15\xef\x88\x4f\x4a\x4f\x16\x05\xcc\x24\x85\x15\x05\x5c\x55\xa2\x5e\x22\x01\x60\x62\x70\xed\x37\x96\xc4\xd9\x02\x9b\x28\x5d\x18\x1c\xfc\x26\x58\x73\x26\xbe\x84\x95\xc3\x94\xb4\x14\xec\x39\x84\xb9\x0d\x23\x58\xf4\x3c\x32\x56\xcd\xa7\xf1\xf1\x37\xe7\xac\x9a\xbf\xbe\xe9\x9b\xad\xcd\x6f\xe4\xf5\xcd\xfa\x9d\x0d\xf8\x53\xa8\xc6\x1d\x50\x68\xe8\x3e\x54\xa4\xe0\x53\xa6\xf9\xe0\xc2\xf6\x7a\xa3\x4b\x29\xb8\x96\xf5\x10\x47\x89\xbd\xa9\x0e\x54\x1a\xa7\x6f\xab\xa5\xbd\xb5\xef\x63\x40\x75\x26\x8b\x82\x65\x1a\xab\x8f\x06\x71\x15\x0e\xc0\x4d\x60\x93\x8a\xc8\xac\x2d\xc7\x77\xd9\x42\x75\xf0\x14\x0f\xff\xf4\xfd\xe5\xd9\xc5\xdb\xcb\x71\x99\xff\x62\x2e\xef\x47\x5a\x8e\x1a\xc5\x46\x3c\x58\xae\xed\x73\x04\xab\xe3\xa8\x22\x6a\x9a\xf6\x37\xfa\x5b\x57\xec\x80\x7c\x50\x18\xa6\x04\x26\x41\xe7\xfc\x95\x52\x9f\x90\x9a\xea\x79\x44\x3d\x3e\x3d\xa7\xd6\x22\xd9\x14\x05\xee\xbd\xae\x19\x3b\xe9\x1a\x3a\x06\x32\x29\x13\x97\xba\x9b\x51\xa8\x5d\x6e\x80\x19\x04\x57\xeb\xe9\xfd\x63\x30\x03\xf2\xd4\xc8\x1a\xcf\x77\x42\x42\x0f\x19\xd8\xf3\x1b\x0f\xc1\xc5\x92\x81\xeb\x59\xcb\xa8\x82\x65\x90\x3f\x32\x95\xb5\xc1\xd4\xba\x8f\x55\x4c\x67\xb0\x0d\xa7\x8d\x62\xf5\xd8\x72\xb7\xb7\x31\x36\xf6\xa7\xdb\xe2\xe8\xd2\x8d\xc9\xd5\x7a\x57\x37\xf8\x3d\x9b\x62\x6a\x8e\xeb\x72\x81\x32\x61\x70\x2f\x68\xa3\xe7\x4c\x68\xd7\xb6\xc8\x6e\xe3\xc6\x1d\x0f\xf6\x43\xc0\xf1\xc4\x58\x1c\x55\x4c\x32\xa5\x00\xe4\x73\x59\xc4\xc1\xb1\xf7\xb2\x88\xe6\xfa\x3e\x80\x7f\xf9\x4c\xee\x9a\xe6\x12\x42\xc0\xb0\x0a\x71\x78\x35\x1d\xd4\xa6\x79\xc9\xc5\x53\x63\x6e\x48\x18\xe5\x22\x1f\xde\x99\x95\x22\xcc\xf0\x7c\x5f\x1a\x45\x18\xce\x9b\xe4\x3c\xf8\x83\xb3\xa3\x4e\xab\xc4\x42\x3c\xd6\xcf\xdf\xf7\xf2\x6f\x44\xec\xd5\xad\x2a\x97\xea\xc7\x62\x84\x33\x18\x55\x79\xbb\x57\x3f\x57\xb7\xfc\xd3\x9a\x0e\x7f\x02\xce\xf4\xbd\x60\x0c\x79\x16\x20\xfd\x78\xfc\x3d\x8e\x97\x19\x1f\x20\xd1\x40\x4f\x4a\xe5\xd2\xcd\xb1\xc6\x2d\x36\xb7\xb4\x76\x8b\x98\x4a\xbb\x15\xad\x69\xc9\x34\xab\x31\x2c\xd8\x06\x21\x0b\x9b\x9f\xf7\x6d\xc5\xc4\x8d\xa6\xd9\xdd\x3e\x4b\xf8\x3f\x4b\x19\x5f\xae\x94\xb1\x9b\x1f\xdb\x85\x1f\xe6\x1e\x87\x6c\x11\xcb\x65\x6c\xf4\x3f\x41\x1f\x36\x5e\xb8\x2f\x80\x0a\xfa\x0a\xb3\xf1\x56\x2e\x5f\x4f\xb4\x2f\x5a\xb4\x15\x67\xd1\x78\x25\x9b\x62\x58\xb2\xf0\xc5\x9d\x21\x25\x2c\xb8\x77\x7b\xae\x90\x69\xa5\xbd\x74\xdf\x70\x4b\x97\x4a\x99\x33\x32\xe1\xba\xa5\x28\x8a\x69\x52\xb1\xba\xe4\x98\x51\x1f\xc4\x04\x29\xb0\xcb\x3a\xcb\x91\xf3\x1b\x2e\x6e\x27\xd6\x91\x0a\x04\x91\x99\x76\x2d\x8f\x83\x30\x27\x4c\xdf\x33\x26\xc8\x8b\x17\x2f\x5e\x80\xf4\xf6\xe2\xf7\xbf\xff\x3d\x81\x32\x5e\x39\xcb\x78\xe9\x00\xb5\x0f\x86\x95\x42\x91\x93\xff\xf5\xf2\xe5\x98\xfc\xc7\xd9\xdb\x37\x10\x4f\x5b\x69\x45\x26\x52\xcf\xed\xcc\xcc\x03\x3d\xe0\x11\xed\x3d\xfe\xfd\xe6\xdb\x77\x4e\x70\x53\x2b\x6f\x83\xc2\xe9\xb7\x37\x32\x00\x9b\xa0\x77\xeb\xc5\xef\x7e\xfb\xdb\x31\xb9\xe0\x35\x54\x65\xe1\x90\xa3\xe7\xc3\xda\x2b\x17\x7a\x2d\xa4\xf6\xf5\x94\xc2\x5b\x6a\xeb\x2d\x59\x46\x6c\xeb\x5f\x94\x7c\x36\xd7\xd8\xcf\x17\xb0\xbf\xe0\x99\xc6\x5a\xd8\x32\xca\x56\x86\x35\x46\x95\x4d\x44\xb5\xa9\xe2\x36\x98\x0f\x16\x7f\x42\x0a\x7e\xc7\xc8\x54\xfd\xa5\x96\x4d\x05\x45\x15\x22\x0c\x70\x50\xf2\xd1\xe8\x31\xb6\xdb\x30\x52\xe1\x16\x57\x15\xd3\x9f\x29\x86\x2b\xca\xd2\xd9\xbb\x6c\x57\x3d\xa1\xf1\xc4\x57\x06\x1e\x21\x06\x57\x94\xd7\xdb\xeb\xa2\x77\x96\x33\xb7\x41\x33\xbd\x5e\x68\xde\x36\x92\x77\x68\xda\x70\x29\xae\x76\x54\xb5\xfc\x07\xfa\xa1\xb9\xb0\xee\x36\xa7\x55\x29\x2b\xc7\xdb\x72\x1a\xe0\x6f\x09\x64\x20\x91\x95\xda\x4b\x46\xae\xb1\xf5\xa0\x3a\x19\xd5\x57\xd3\x6e\xea\x7f\x8c\x35\xa7\xe0\xca\x4c\xb1\x57\xa4\x7e\xc3\xcc\xbb\x4d\xff\xf5\x3c\xe2\xee\x9a\x39\x36\x62\x0d\xba\xed\x9e\x69\xb9\x02\x76\x69\xb5\x29\xf6\x41\x90\xed\x1c\x30\xe5\xc6\x26\xf4\x5a\x58\x6b\xe5\x9e\xe3\xd6\xef\xf2\x50\x98\x6e\xec\xd1\x42\xdc\xac\x99\x3b\x53\xca\xe6\x0d\x97\xb4\xbe\x33\xca\xad\xa5\xeb\x61\xb1\xfa\xda\x6c\x92\xcf\x85\xc6\xf4\xf8\x05\xf3\xad\xe8\xbb\x79\x7c\x66\xce\x87\xe3\xe0\x7d\x43\xab\xbd\x21\xd2\xd0\x01\x00\xa9\x88\x79\xef\xc9\x6b\xe2\xf4\xf3\xbf\x68\xd5\x69\x44\x6f\x9b\x67\xd2\x5e\xae\x50\x38\x84\xc1\x9d\x42\x78\x5f\x13\x44\xeb\xf8\x7e\x30\x71\x1d\x61\xcc\x53\x55\x4c\xcf\xba\x14\x99\x3e\xba\x79\xcc\xf6\x4e\xa5\xf6\xb2\xc6\xf4\x7a\x49\xec\x3c\x42\x30\xae\x2d\x7d\x76\x21\x01\x28\x0a\x22\xe9\x8a\x49\xe8\x16\x85\xb2\x00\xbd\x5e\xda\x69\x72\x0f\x8e\x54\xe9\x27\x12\xec\x8b\x24\x19\x28\x12\xa8\xab\xda\x17\x25\x09\xc5\xae\x1f\xe4\xa5\xab\x29\x26\xc7\xf6\xb8\x85\xa3\x86\x1d\xc9\x37\x12\xa8\xef\x78\xed\xf3\x69\xb7\x0b\x3f\x91\x20\x51\x2a\x89\x14\x81\x22\x61\x76\x05\xa5\xb0\x20\x14\x09\x34\x46\x5c\xc2\x91\xda\xb9\x2c\x45\x74\xc2\x11\xe3\xda\xc5\xb1\x46\x4f\x3c\x97\xaa\x7a\xdd\x2b\x0b\x16\xaa\xe8\xd2\x8e\x12\x74\x3b\x47\x9a\xc6\xe4\xad\xe5\x75\x78\x55\xe9\x44\xc9\xa2\xd1\xf8\x81\x38\x7a\x45\x3c\x88\x2e\xbb\x84\x09\xba\x32\x65\xc0\x03\xdd\x63\xb1\x27\xd6\xb2\x50\x10\x6e\x90\x7b\xc5\x70\x53\x1c\xd1\x64\xf4\xb9\xc9\xc2\xc3\xf6\xef\x11\x5a\x9c\xb4\xbd\xaf\xc2\x8b\x7f\x8c\x76\x28\x99\xe2\xf1\x86\x94\x9b\x2b\x72\xd4\xb6\xca\x74\x41\x55\x57\x42\xb3\x7a\x4a\x33\x76\xdc\x31\xb0\x0c\x4e\xce\x37\x28\xf5\xb1\xa7\x2e\x47\x73\x4e\x45\x5e\xa0\x73\x20\x63\x35\x5c\x31\xf6\x49\xb3\x5a\x04\x78\x94\x99\x5a\x5e\xf3\x05\xab\x15\x39\xfa\x9a\x19\xcd\x89\x51\xdd\xd4\xc3\x36\xed\xfd\xa6\x0a\xc0\xe7\xf7\x61\xe8\x01\x40\x69\x41\x82\xf0\x8a\xd3\xbe\x44\xe7\xd2\xb6\x1b\x33\x9c\x7a\xec\x06\x1e\x80\xea\x9a\xb8\xc6\x06\x5d\x81\x2f\x01\x89\x5a\xca\xa6\xb6\xfe\x46\xdb\x03\x23\x08\x34\x93\x75\x6d\x38\x25\x4c\x8c\x2a\x52\xb3\x99\xd1\xc4\x6a\x50\xe9\x30\x93\xbd\x68\xcc\x0f\x7b\x0b\xd3\xde\x6b\xa0\x7c\x27\x8c\xdd\x7a\x99\xc2\x4e\x29\xe7\x85\x9a\x5a\xa5\x50\x2e\x78\xee\xc4\x1a\x88\x43\xb0\x52\x1d\x57\xa4\xa2\x4a\x45\xd8\x74\xac\xea\xdb\x69\x90\xd6\x39\x5b\x54\x41\x41\xec\xf1\xb5\x4f\xa2\x14\x78\xe7\x43\xee\xe6\xc5\x4a\x28\x5b\x17\x8c\x94\x88\x67\x3b\x32\x67\xd7\xcd\xa4\xe0\x6a\x7e\xb3\x93\x6b\xe5\xdd\x06\x00\x18\x5a\xd7\x0d\x17\x89\x5a\xef\x36\x77\x0c\x51\x4c\x28\x0e\x02\x87\x61\x6c\x46\xcc\x89\xc9\x5a\x34\x1a\x0f\x55\xca\x1d\x4e\xf7\xb6\x49\x48\x5a\x2d\x98\x2d\xe5\x65\xfe\xd4\x59\xc7\xc7\x38\xcb\x3b\x96\x38\xcc\xd9\x07\x51\x75\xdf\x23\x19\x2d\x0a\x65\x25\x5b\x5f\x0d\xc6\xb1\xa7\x38\x73\x88\xab\x36\x80\xd8\xc8\x0d\xa2\xfa\xd6\xa9\x2b\x7d\x16\x62\xee\xf8\xc6\x8d\x55\xa4\x94\x98\x7d\x2d\x88\x14\x6e\xf7\xa1\x0a\xa4\xfd\xef\x08\xb5\xd9\x57\xcb\xa0\x35\xb3\x97\x25\x0e\x35\x9f\x7d\x5e\x5b\xc7\x4f\xc3\xe7\xb5\x93\xb7\xbb\xed\x71\x4d\x3b\x75\x80\x7a\xdd\x33\x06\x3a\x46\x75\x66\xe9\x15\xd0\x0d\x35\x7f\x92\xdc\xe6\xa9\xc9\xaa\x67\x5a\xd7\x7c\xd2\xe8\xc4\xba\xdf\x1f\x57\x5e\x06\xe1\xca\xe8\xe7\x40\x90\x46\x56\xb7\xce\x12\x2c\x46\x56\xcd\xf5\xd7\x6e\x9d\xcc\x79\xd9\x20\x08\x15\xc4\x06\x7c\xe9\x50\x91\x5c\x66\x8d\x6f\x8c\x02\x72\x44\x1b\x18\x12\xae\xe3\x4f\xd2\xae\x78\x6a\xf1\xe4\xee\x07\x02\x58\x9a\xcb\x7b\x71\x4f\xeb\xfc\xec\x7a\x30\x73\xb0\x2f\xac\xb5\xef\x74\x3d\x92\x0e\x14\x31\xbf\xd3\x89\x6c\x74\x90\xee\xba\x82\x32\xae\x6e\xd1\xbf\x90\x83\x52\x4b\x43\x93\x3a\xfe\xc6\xe0\x79\x0d\xf8\x23\xc9\x36\x0b\x60\x0c\x7f\x5f\x71\x91\x86\x5d\xa0\x11\x0e\xcf\x15\x53\x61\x84\x11\x30\xec\x39\xe8\x03\x8a\x32\xff\x45\x18\xd7\x7b\x2e\xd2\x3d\x19\xfe\xfa\x2e\xd2\x28\x17\x68\x58\xa2\x59\x71\x91\x86\x5d\xa0\x11\x5a\xcb\x9a\x8b\x34\xc2\xfe\x17\xe1\xe2\x5a\x71\x91\xee\xc1\xf2\xf7\x93\x72\x91\x9a\x37\xfa\xfd\x71\x7a\xa4\x2f\x32\x26\xc5\xec\xf8\x67\xf5\x35\x75\xc8\x38\x72\xde\xd5\x3c\xc9\x14\x3d\x02\x28\x0d\x92\x95\x16\x9f\x3a\xda\x89\xeb\x34\x09\x02\xda\xe7\xf3\x4b\x3d\x82\xc7\x09\x56\x14\xa1\x10\xe2\xd8\x96\x70\x85\x5d\xb1\xd0\x91\xdd\x7a\xcc\x63\x3d\x3b\x32\x7f\x05\x2d\x1e\x08\x15\x42\xa2\x4c\xa2\x4e\x6c\xa7\xa9\x13\x6b\xb5\x10\x39\xfc\x87\xaa\x68\x44\xd1\x0f\x1c\xd0\x3a\xcb\x89\x35\x49\x36\xf9\xc8\xa3\x23\x49\xc7\x47\xe0\x08\x61\x7f\x06\x4a\xd5\xf6\x47\xda\x59\x12\x68\x1a\xe4\x54\x87\xd8\x37\x56\xc5\x58\x7c\xdb\x69\x4c\x2a\x9b\xb3\x92\xc2\x7f\xbe\x4e\x9a\x3a\x0e\xae\x88\x11\xd2\x35\xc3\xea\x4c\xac\x2e\x15\x91\xd3\x93\x5e\xe3\xbf\x83\xc5\xcb\x83\x58\x07\x40\xb2\xd3\x92\x38\x1c\x0f\x55\xf8\xec\x8f\xf5\x7a\x9f\xde\x05\x62\xf0\xbb\x6d\xd3\x1c\xc1\xc8\x3a\x73\xef\xc5\x4e\x00\xb5\xc5\xdd\x7e\xb4\xe5\x7f\x99\x3e\xdb\x13\x6f\x4b\x7f\xf6\xd9\x3e\xfb\x6c\x9f\x7d\xb6\xdd\xb1\xa3\xcf\xb6\xc3\x8c\x81\x5c\x71\xe5\x62\xfb\xd0\x8f\x1b\x7b\x63\xcd\xbb\x5d\x07\x86\x75\xf9\x42\x33\x4b\x54\xbb\xc6\xbe\xfa\x78\xf4\x75\x6d\x9d\xbd\xb2\xee\x87\x3a\x1d\x8e\xc7\x87\x87\xe8\x02\x8e\x53\xde\x3c\xc8\x46\x4f\x47\x7f\x20\x4c\x64\x32\x47\x84\x35\x73\xad\x95\x06\x61\xb2\xb5\xf7\xa5\xaf\xbe\x74\xb5\xd5\xbb\xa1\x55\x30\xcf\x14\x14\x89\xa6\xd0\xae\x92\xd9\xeb\x07\x08\x62\xad\xf8\xe5\xab\xae\xda\x0d\xf0\xb5\x6b\x63\x59\x1f\xc8\x61\x6d\xbf\x5f\xec\x86\x0d\x97\xcd\xf5\x1f\x26\x47\xf8\xe3\x38\xab\x9a\x38\xc3\xa4\x6b\xaa\x3d\x2e\x59\x29\xeb\xe5\x89\x07\x65\x40\xf4\x60\xdb\x27\x86\xab\x31\xb7\xc3\x48\x78\x59\x53\xd7\x4c\x40\x8f\xe0\x2f\x4d\xd6\x8b\x2e\x52\x47\x76\x12\xf5\xfc\xd9\xc6\x54\xbd\x68\xc7\x4a\xd6\x9f\xf7\x27\x83\x75\xdd\xaf\x31\xca\x46\xdb\x0e\x9b\xd7\x78\xe2\x9d\x20\xc0\xd3\x98\x58\x90\x05\xad\x55\xdc\x79\x90\xdd\xa4\xbb\x9c\x2f\xb8\x0a\xb7\xb4\xec\xbc\xb0\xd9\x5c\x0d\x4d\x05\x1a\x5d\x35\xda\xd2\xec\x98\x6a\x11\x9d\x99\xcf\x99\xaf\x4b\xec\xef\xcf\x8a\xa0\xfb\x32\x9c\xf6\xe6\xc6\x17\xd9\xce\xb9\x3f\x82\xcd\x9d\xfb\x23\xbe\xd5\xf3\xe6\xf7\x92\x90\x62\xe7\x2e\xeb\xab\xc3\x1d\xe5\xae\xf7\xab\x65\xcb\x6d\x41\x6c\xa7\x3c\xec\xf9\x5a\x80\x27\xf1\x82\x27\xa4\xfc\x5e\xda\x37\xfa\x99\x39\x9a\x95\x95\xac\x69\xbd\x24\xb9\xb5\x08\x06\x8a\xee\xaf\x15\x9f\xe9\x54\x9f\x79\x70\x95\x4d\x58\x55\xce\xeb\x3d\x64\xfd\x46\x97\x9f\x61\x39\x6f\xca\x34\x23\xfa\x77\x50\xe1\xda\x56\xcf\x76\x61\x35\x08\xc8\xb7\x35\xa0\xd9\x70\xc9\x74\xdc\x4c\xae\xda\x7d\x47\xb9\xa6\x5b\xf4\xf5\x60\xa5\x5b\x95\x91\xd7\xa3\x7c\x69\x42\xe6\xcc\x1c\x8c\x03\x86\x73\xeb\x45\xcf\xa2\x2b\x3a\xf2\x9e\x1d\x59\x40\xc7\x46\xa6\x7b\x0b\x6c\xfb\x49\xce\x9a\x24\x15\xc7\xe0\xff\xc5\xde\x18\xd9\x23\xb1\xac\xb4\x04\x65\xcf\xd6\x60\x9a\x92\x42\x66\x9d\x60\x29\xc7\x22\xc3\x36\x52\x88\xcf\xe1\x8a\xf8\x7b\xe6\x1c\x9a\xe6\x54\xcd\xdc\x50\x30\x02\x6b\x6c\xa1\x30\xee\x83\x67\x74\x12\x34\xad\x22\x6c\x14\x96\xfc\x49\xde\x42\x5d\xee\x4f\xbc\x6c\x4a\xd2\x28\x33\x53\x68\x2e\xd8\x79\x26\x08\xd5\x4f\xf4\xde\x35\xe2\x80\xca\x3e\x5c\x00\xd0\xbe\x8f\xc3\xfc\xe5\xc6\xed\x6f\xd8\x44\xee\xcd\x1e\x90\xba\xec\xb4\x37\xd5\x80\xac\x6e\x67\x69\xa5\x4d\x39\x25\x34\xd0\x25\x8d\x74\xe5\x1f\xe5\xfb\x3b\xac\xdd\x17\xc1\x8b\xee\x85\x89\xb8\x29\xb6\x50\xbd\x3f\x98\x46\xd8\x78\xbf\x35\xec\xde\x8c\xdc\x8d\x62\xf5\x68\xd6\xf0\x3c\x1d\xad\xbf\x58\x9e\x1f\xc5\xe9\xd3\xf8\x7b\x12\x57\xdf\x99\x97\xfb\x48\xc7\x68\x9e\x78\x70\xe9\x83\x23\x7b\x4c\xb1\x5b\x54\xbe\x0d\x94\x1c\x9c\xf7\x64\x49\xa8\x8b\xac\xf3\xc4\xc3\x86\x27\x1d\x9d\x15\xd5\xbc\x13\x25\x09\x78\xeb\x5a\xc1\x0c\x42\x35\x8c\x35\x5b\x66\xb6\x1c\x12\xef\x75\xc1\xc0\xe9\x21\xbe\x42\xb6\xd2\xc8\xfc\x4f\x4c\xcb\x41\xe7\x52\x9d\xb0\xa9\x6c\x5b\x0c\xa3\x0a\xac\x4e\xac\xdd\xab\x60\x1a\xd2\xad\xf0\xf2\x07\x5d\xe3\x10\xc6\x54\xca\x85\xb9\x3a\x7f\x13\xe4\x83\x6b\xe6\xc8\xa7\xaf\x08\x3d\xee\x5a\xab\x78\xb0\xc5\x33\x21\x82\xb1\x1c\x93\xbd\x8a\x76\x7e\x75\x23\xd4\x09\x99\x1c\xbb\x8d\x04\xda\x21\x8c\xf4\x5e\x38\x95\x24\xb0\x99\x77\x60\x41\xd2\x12\x0b\x45\xd5\xb2\x24\x4a\xd0\x4a\xcd\xa5\x06\x5b\x05\xad\x68\xc6\xf5\xd2\x3c\xab\x6b\x9a\xdd\x41\x3b\xf2\x40\x89\x28\x9c\xe9\x09\xc9\x8e\x6d\x3c\x79\xef\xe4\xb9\xea\xd0\x42\x3d\xaf\x65\x33\x9b\x43\xce\x54\xb8\x52\x71\x56\x50\xe5\x0e\x63\x23\x6c\xab\x01\x2b\x92\x2f\x05\x2d\x79\x16\xe3\xcc\x83\xd8\x48\xc5\xa5\xf5\x73\xe1\x7c\xa0\x77\xdf\xb5\xaf\xb9\x8e\x0e\xb6\xf3\x82\xf2\x92\x1c\x29\xc6\x88\xbf\x24\xf8\x97\x9b\xb0\x9a\x8b\x26\xce\x9a\x11\x5b\x3f\xcb\x7a\xe6\x5c\x85\x43\x5b\x5a\xc1\xfc\xd2\xf2\x97\x40\x16\xa0\xbb\x92\x46\xe8\xb2\x41\x75\x1b\xa7\x7c\xec\xd1\x6f\xe3\x9f\x07\xbf\x21\x6b\x08\x9c\x73\x1d\x51\x98\xc8\x65\x1b\xca\x43\xce\xae\xaf\xd0\x78\xbb\x70\xdd\x8f\xcc\xfd\xb3\xb5\xea\x83\xdb\x51\x48\x31\xc3\xb8\x60\x61\x59\x8e\xbb\xd9\x86\x01\x0a\xe8\x10\xbd\xe0\x79\x43\x0b\x64\x6d\x7f\x1b\x36\x64\x9b\x05\x9e\xdf\x5c\x21\x68\x3e\x9b\xeb\xd1\x3d\x03\x03\x2e\x4a\x2f\x6d\xd0\xb7\x9b\x2c\x0f\x3b\xe9\x3a\x01\x95\x5c\x01\x0b\xd5\xd6\x18\x88\xce\x00\xb3\xdc\x7b\xba\x84\x7a\xae\x78\x2b\x7b\x91\x45\xc3\x5b\x6b\xab\x8b\x23\x78\x8f\x1f\x1d\xe4\x80\x73\x3b\xf3\x1d\x77\x1b\xc5\xc0\x16\x3f\xac\x8c\x2c\x2b\xa4\x02\xeb\xeb\x35\x08\xd2\xe9\x23\xe0\x7f\x0e\x07\xfa\x28\x6a\xf0\xcc\x68\x33\x43\x0a\xfc\x9e\xb5\x90\x9f\x69\xf4\x1d\xdc\xc9\x5b\x56\x56\x05\xd5\x69\x81\x4c\x07\xdf\x75\x5c\x18\x1d\x87\xbe\x21\xae\x54\xe4\x23\x5a\x98\xab\x7c\xfd\xf1\x3c\xbc\x7a\xd9\x92\xc5\xde\x56\xb8\x2e\xf8\x5c\xf8\x46\x7f\x46\xbc\x4f\xa6\x86\x04\x5d\xa3\xac\x9c\xb0\x1c\xb8\x9a\x9d\x39\xd8\xa0\xee\x05\xab\xdd\xed\xb8\xfe\x78\x7e\x42\xf8\x98\x8d\xa3\xfc\xe9\xd7\x1f\xcf\x3d\x28\xc7\xae\xb5\x9c\x61\xe2\x8b\x4f\x70\x02\x62\x02\x4b\x19\x68\x34\xd6\x8e\x76\x26\x1e\xf6\xdf\xff\x68\x36\xc1\xbc\xfd\xa7\xd1\x1f\x2d\x19\x86\x7f\xfd\xdd\x48\x07\x11\x15\x14\xff\xbe\xf2\x56\x37\x73\xc2\xf7\xfe\xfc\xfb\xb5\xed\x1e\x67\x7b\xcb\xfd\x3d\x08\x16\x62\x4d\x08\x13\xda\xe8\xa2\xd7\x12\x62\x19\x79\x8e\x58\x0f\x73\xaf\xd9\x3f\x9c\xfb\x09\x8e\x31\x6c\xe0\xb3\xcc\x29\xa3\x9a\x09\x90\x90\x6c\x7a\x3e\x78\x08\x00\x3c\x90\x2e\x0a\xfb\x73\x14\x73\xb5\x6c\xbd\x96\x13\xa2\xa5\x04\x1e\x80\xfc\xe9\x4c\x10\xf6\x89\x2b\x28\xdc\x84\x7b\x0d\xc7\x45\x75\xdc\x29\x39\xc1\xd4\x4c\xcb\x60\x90\x2f\xf0\x65\xd6\x09\x6b\xff\x95\x90\xfa\x57\xfe\x7a\xc4\x12\x01\x90\x2a\x25\xa1\x0b\xc9\x5d\xeb\x43\x43\x8a\x05\x78\x56\xda\x06\x7b\x93\x25\x29\xb9\xd2\xf4\x2e\x22\x6d\xfb\xc6\x08\x95\xdd\xa8\x1a\x3c\x7d\x41\xa0\x8d\x0a\xcb\x49\x23\x34\x2f\xe0\xaf\xfe\x3b\x51\xa8\xdf\x15\x38\xaf\xa6\x44\x35\x99\x91\xac\xaa\x9a\x8d\x9c\x78\x6b\x9f\x02\x46\x16\x43\x05\xdc\x6e\xb5\x7b\x79\xe2\x2f\xc3\x9c\xa2\xfd\xa5\xca\x01\x74\x94\x5f\x94\x0a\x7b\xbd\x57\xeb\x6c\xc2\x3e\x48\x91\xb5\xa2\x2d\x20\x43\x44\xcd\xae\x77\x20\xed\x16\x2e\xdc\x0e\x4d\x4d\x36\xcd\x52\xb0\x8c\x29\x45\xeb\xe5\x09\xb4\xc3\xe4\x9a\x94\xc1\x58\x2c\x62\x17\x3d\x6d\x0a\x14\xf5\x4b\x2a\xa0\xe9\x24\xa9\x59\x26\x85\xd2\x75\x93\xc1\xe9\x51\x32\xa9\xe5\x1d\x13\xb1\xc9\x43\xc4\x60\x79\x3f\x63\xa2\xe5\x50\x10\xdf\x23\x49\x36\xa7\x62\xc6\x54\x74\x55\x8d\x92\xe6\x80\x7b\xdf\x78\xf5\xd0\xed\xa7\x39\x21\x3a\x35\x9a\x17\xd7\x70\x54\x13\x23\x53\x3a\x17\x66\xcc\x54\x9d\xe5\xf6\xa4\xf5\x08\x9a\x2d\xe5\xc5\xa0\x10\x40\xd2\x1c\x4b\xb1\x2e\xa5\x11\x28\x0d\x21\xfb\x41\x82\x0b\xa9\x64\x9a\xe6\x54\xd3\xe4\x7c\x8a\xb7\xd4\x77\xc4\xb4\x21\x5a\x70\x78\x9d\xd0\xad\x38\xe7\x1b\x88\x8e\x96\x9f\x64\xb2\xe2\xdd\xfa\x22\x40\xff\xe6\xee\xbc\x62\xad\xfe\x5c\x8f\xc9\x3b\x69\x43\x00\x30\x95\x02\x3c\x84\xb4\x28\xe4\x3d\xcb\x61\x9a\xee\x8b\xc8\x08\x22\xe8\x0a\xac\xbf\x01\xed\xb0\x65\x26\x31\xe1\x3a\x49\xde\x45\x73\xb8\xc9\x27\x71\xdb\x46\x13\x65\x6d\x20\x3f\xec\xdf\x26\x3d\x27\x2e\xc6\xc8\x00\x65\x42\xf3\x9a\x75\x8b\xca\xd8\x03\x6a\x04\x5e\xd0\xf6\xa8\xa2\x60\x9a\xe3\x84\xf3\x9e\x31\xad\xda\xe8\x6d\xe4\xf3\x86\xf8\x5b\x69\x0f\xe4\xab\x28\x88\x20\x90\xbb\x23\xb6\xe6\xbf\xcd\xea\x6a\x48\x59\x77\x03\xec\xaf\xc8\xcf\x8d\x04\xb3\xf7\x13\x4e\x77\xf0\x62\x1b\xda\xb7\x32\x8f\xf7\x08\xaf\x74\x72\x6d\x01\xb4\x09\x61\x98\x74\xa8\xa2\xec\xd7\xfd\x99\x40\x54\x8d\xea\x9a\x6d\x2c\xb3\x99\xd3\x85\x75\xf3\x44\x43\x4c\x77\x11\xb4\x8a\xdb\xc8\xf7\x5f\x83\x69\x8d\x60\x5a\xa3\x97\xb1\xce\xb4\xf8\xa8\x64\x3f\xd9\xb8\xe8\xe4\xfe\x07\x12\xbc\x95\x86\x0c\xdf\x24\x39\x19\x57\x9b\x60\x7a\x9e\x6a\xa3\xa0\x7c\xa4\x5e\x64\x4b\x49\x37\x18\x37\xb4\xf3\x15\xf9\x55\x4f\x1a\xb5\x5a\x8d\x37\x8b\xc5\x07\x4c\x98\x71\xe4\xec\x69\x63\x7b\x94\xae\x4e\xe1\x0a\xd8\x51\x34\xc4\xaf\x99\xa6\xc7\x2b\x73\x04\xe9\x7b\xb3\xf5\x27\x1a\x6e\x1f\x62\xd6\x28\x2d\x4b\xef\xb5\x3d\xb5\x99\x95\x51\x59\xdc\x6e\x70\x23\xe8\x97\x98\x5e\x44\x35\x75\x09\x42\x86\x54\xa3\x01\xf8\x98\x5c\x09\x22\xeb\x3c\xc1\x1d\x6e\x33\x73\x36\x1e\x0a\x5a\x3f\x50\x44\xa5\x95\x21\x38\x35\xa7\x3a\xfe\x5a\x5a\x2b\x2a\x99\x19\xb5\xd9\x85\x68\x32\x41\x27\x05\xcb\xc9\x51\xff\x93\x17\x1e\x6b\xa3\xc1\xcb\x9a\x9c\x89\x25\x82\x69\x5f\x3f\xb6\x29\xae\xad\xca\x9d\xb0\x1b\x46\xf5\x6a\x6b\x14\x00\x99\xab\x65\x51\xb0\x1a\xae\x82\xb5\x87\x26\xc4\xa2\x77\x1d\x55\x70\x64\x78\xfa\x27\xce\x8e\xde\xda\x14\x04\xbb\x8f\x86\xe9\x94\x24\xaa\xb0\x28\xb6\x8b\xcc\x02\xcc\x70\x81\xd6\xee\xbb\xf1\x81\x06\xed\xfc\x5c\x9a\xf0\xe6\xd9\xc7\xe3\x2b\xea\x8f\x3e\x90\xaa\x17\x52\xda\xad\xd8\x16\x9b\x14\xe6\x86\x73\xf7\x4d\x29\x2f\x1a\x57\xb9\x18\xc4\x30\x9b\x74\x48\xa1\xaf\x15\xb4\x2a\x8e\x8f\x85\xbe\x72\xad\x43\x0c\xd2\x9e\x40\xb7\xe3\x82\x0a\x20\x7c\xf6\xe0\xc1\xa2\x18\xd5\x38\xcd\x0d\x17\xa3\x01\x66\x44\x37\xed\x09\x9b\xd3\x05\x97\xde\x2a\xb3\x0b\xa6\x96\x46\x6e\x06\xe9\x29\x32\x3c\x6d\x87\x00\xb5\xd4\x10\x35\xa8\x75\xc6\x23\x12\xd1\xdc\xc3\x51\xa6\x08\x1c\xe9\xf1\x6c\x90\xbc\x00\xd1\xbd\xf1\x6f\xac\x36\x4c\xbb\xbe\x02\x00\xce\xa0\x34\x83\x7f\xc4\xd6\xc9\xe8\x0e\x1f\xad\x33\x61\x86\x1b\xb4\xb5\x1f\xe1\xaa\xb9\xef\x24\x81\x74\xb7\xab\x1f\xb0\xdd\xde\xd8\x6f\xa0\x21\x5b\x7c\x10\x2c\x0e\x0c\xcf\x46\x8a\x52\x33\x48\x2a\x80\x55\x8f\xa1\xd5\x34\x15\xcb\xc8\xea\xa2\xdd\xa1\xe7\xbc\xce\x47\x15\xad\xf5\xd2\xb1\x94\xee\xce\xfa\xe2\x04\x09\x40\x77\x8a\xe1\x8a\xe9\xf6\xd8\x1d\x3d\x5c\x80\xed\xb4\x78\xe0\x02\x73\x92\x22\x32\xdd\x58\xc5\x80\xc7\x5e\x75\x6c\x99\x03\x37\xfa\xb5\x3a\xac\x79\xb2\x5b\x88\xe6\x8b\x5f\xb5\x8f\x97\xdc\x4d\x00\x7e\xef\xc3\x95\x3b\x2e\xfb\x4e\xe0\x4a\xf4\xd4\xdb\xb8\xe7\x21\x2d\x07\xb5\x97\x68\xa0\x0f\xd4\x72\xfc\x9c\x1e\x91\x6b\xec\x42\xab\x31\x56\x67\x67\x3c\x3d\x7c\x83\xb1\x3e\xf8\xe3\xc4\x6e\xb9\x0d\x5f\x4a\x42\xd4\x36\x4c\x2b\x93\x65\xd5\x68\xd6\x39\x46\x6b\xfa\x49\xd4\x4e\x49\x92\x86\xda\x73\xae\x9d\x62\xcb\xd5\x91\x9d\xca\xc8\x4f\x65\xe4\xa3\x95\x82\xed\xcc\xba\x63\x87\xc3\x24\x3b\x97\x5c\xe8\x8e\x2f\x36\x16\x69\x65\xa1\x69\x31\xc8\xe4\x01\x71\xc8\x64\xf7\x58\x64\xb2\xbf\x78\x64\xe2\x73\x25\x76\xbf\x7a\xef\x5d\x26\xc7\xca\xe5\x4b\xa4\x96\x24\x70\xf9\x76\x11\x13\x88\x91\xae\xfc\xfc\xb8\x22\xb2\xe4\x5a\x33\xe7\x64\xf3\x97\x28\x36\xf1\x04\x07\xd7\xbd\x38\x7c\x4b\x7a\x20\xfe\x01\xbd\x66\xec\x93\xeb\x56\x93\x04\xb7\x23\xca\x81\x90\x75\xcf\x15\x38\x74\xa8\x68\x55\x7f\x20\x0b\xa3\xb8\x9a\x81\xfd\x61\xab\x78\x27\xc6\xd4\x3e\x93\xa3\x67\x72\x14\x31\xf6\x42\x8e\x30\x8d\x21\x3e\xf7\xa6\xaf\xab\xa1\xfb\x88\xfc\xd8\xb0\x7a\x49\xe4\x82\x75\xc2\xa8\xa0\xd7\x8e\xe2\x29\x76\x31\x43\x20\x26\x5c\xe4\x5c\xcc\x62\x09\xce\x13\x49\x4a\x25\xd5\xd9\xfc\xf2\x93\x91\x4c\x21\x15\x7a\x67\xc2\xbd\x0a\xa8\xad\xe2\x91\x74\xf4\x72\x6a\x77\xde\x1d\x9f\xa3\xd4\x60\xa9\x1c\xdb\xf2\xbf\xed\x2f\x69\x37\xc0\xe8\xa0\xef\x2e\x76\x51\x0e\x53\x6c\xf2\x24\xdd\x2e\x4f\xb6\x21\xe0\xa6\x6d\x48\x82\x4a\xf0\x20\x3c\x9c\x7e\x8b\xec\xd8\xfe\x26\xfd\x01\x7d\x10\x4e\xac\x6b\xd5\x36\x68\x73\xa0\x31\x26\x22\xed\x5c\xfa\xfd\x22\xe2\x6a\x7c\xad\xbc\xbf\x1b\xed\x4f\xb7\x49\xe1\x88\xab\xc2\xdf\x7f\xc3\x6d\x53\x1a\x6b\xd9\x91\x25\x25\x54\xeb\xef\x8e\x1e\x0a\x62\xaf\x0b\x8c\xfe\x04\x5c\x4c\x5d\x33\x0e\x9f\xb5\xe0\x51\x10\x32\x49\x80\x92\xa6\x1d\x32\xd9\xd5\x68\x81\xc3\x1d\xc0\x03\xb7\xc5\xa3\x7b\x37\x04\x7f\x87\x7d\xb9\x63\xcb\x43\x65\x93\xc0\xa5\x50\x73\x5e\xb9\xa6\x70\x20\xb2\xee\x72\x0b\x70\x7c\x04\x47\xb1\x9b\x26\x86\x19\x5c\x89\x13\xf2\x4e\x6a\xf3\x7f\x97\x10\xbb\xb3\x03\x5c\x73\x37\x2f\x24\x53\xef\xa4\x06\x18\x4f\x7a\x78\xb8\x1d\x0f\x3c\x3a\x5b\xd1\x82\x83\x3d\x1f\xe3\xf1\x92\xd2\x68\xdd\xb0\x55\xd8\xed\x11\x39\xf7\x86\x47\x8c\x88\x06\x31\xeb\x03\x7c\x6d\xee\x8c\x7c\x9f\x1c\x65\xa7\x99\x6c\x79\xc5\x31\x61\x44\x48\x31\xc2\xe6\xc6\xfb\x99\x27\xa2\x8f\x99\x6b\x17\x17\xba\x53\xde\x05\xb5\xfc\x22\x7d\xd5\x59\x5b\xe6\x23\x95\xef\xba\x01\x96\xe0\xaa\xa0\x19\xcb\x5d\x88\x0c\xf4\x7e\xa1\x9a\xcd\x78\x46\x4a\x56\x07\xf2\x19\x36\x8f\xca\x48\x39\xbb\x22\xfe\x6e\x6b\xd9\x41\x92\xe8\x7e\x34\xf1\xb6\x81\x18\xf7\x06\x42\xa7\x1e\x26\x0a\x22\x0c\x14\x3e\x4a\x5a\x19\x92\xf6\xdf\x46\x6a\x00\x1c\xf9\x9f\x44\xfd\x8a\xd7\x6a\x4c\xce\x88\xe2\x62\x56\xb0\x2e\x1c\xe7\x5e\xe8\x7c\x32\x09\xb4\x99\x99\x51\xb1\x7f\x6c\xf8\x82\x16\x0c\x33\x08\xa8\xf0\x2d\x1b\xe4\x74\x4d\xb0\x4d\x13\x96\xb0\x6d\x96\x61\xa5\x3e\xb0\xf0\xe0\x8e\x2d\x0f\x4e\x7a\x57\x31\xd5\x55\x73\x70\x25\x0e\xda\x2a\x33\x3d\x4a\xe1\x44\xbb\x34\xa9\x5b\x14\x4b\x72\x00\x70\x0e\xd6\x65\xec\x87\xc8\xcd\x9f\x41\x1d\x4f\xc6\x7b\x6b\xe0\x3e\x2f\xa8\x52\x29\xe5\x2a\xb6\x97\x72\xbe\xe9\x40\x8c\x4f\xc9\x75\xc3\x06\xf4\x66\x10\x18\xb7\x6b\xda\xf2\x06\x6b\x3d\xa4\x68\xa5\x06\x23\x25\xec\xe3\xc2\xf6\xf3\x8d\xad\xea\xb5\xca\x9d\xfd\xeb\x3e\x4b\xf0\xbe\x93\xb8\x9e\x1a\xd0\xd0\xf1\x05\xae\xec\xe8\x47\x48\x15\x4e\x80\xd8\x29\xff\xcf\x15\x58\xcf\xb8\xcb\x35\x14\x52\x13\x2e\xb2\xa2\xc9\x21\xf0\x30\x1a\x24\x4c\x05\x6c\x74\x69\x06\x81\xe4\xe3\xd8\x19\xa1\x3f\xfa\xd7\x9d\x16\x60\x2d\x18\xad\xdf\x2d\x25\x2e\x68\x53\xe8\x27\x54\x1d\xc0\x60\x7b\xae\xec\xe9\xec\x73\x37\xa6\x83\x71\xab\xfd\x0e\x0f\xe7\xfd\x94\xda\xd7\x7c\x52\x33\x72\x3e\xa7\x42\xb0\xa2\x53\x1e\x23\x14\x61\x65\xf8\x9d\xed\x44\x8f\xe2\xbc\xed\x31\x7f\xd8\x6f\x32\xef\x68\xb7\x70\x65\x59\x06\x81\xb6\x61\xf8\x7b\xe8\x58\xf2\xaf\xdb\x15\xde\x77\xe2\x08\x02\x4e\xec\x07\x1f\x93\x8b\xd3\xeb\x07\x8f\x25\xf4\xe7\xf2\x9e\xe4\x12\x42\x7f\x6a\x88\x1e\xc2\x86\x8d\xca\x0a\x2d\x41\x90\x9d\xbe\x1b\x10\x8f\x9c\xc9\xb2\xaa\x65\xc9\x95\xcb\x4f\xb1\xc8\xb4\xb7\x8a\x14\x45\x13\x2c\xcc\xb9\xad\x12\xe3\xeb\x73\xa2\x69\x3d\x63\xda\x00\x21\xa2\x29\x27\x2c\xb2\x52\xc6\xbe\xab\x0e\xff\xb4\xdb\xe0\xef\xaf\x53\x3d\x1e\xc7\x77\xdf\xbd\x4b\x2b\xc1\xbc\xf1\x4c\xef\x65\x5d\xe4\xf7\x3c\xc7\xb0\x0d\x45\x8e\x0c\xd8\xe3\xb8\xb9\xee\xb1\xc6\x72\x34\x22\xdf\xdf\xf3\xfc\x21\xcb\x76\x51\x85\x66\xd9\x04\xd6\x6d\x5b\xa3\x73\x56\x87\x25\xeb\x23\xf8\xfc\x31\xb9\xe4\x98\xdb\x68\xfe\x85\xc5\x05\xcb\x09\x17\x36\xb5\x7c\xda\x39\xa0\x20\x44\xc3\x2d\xcc\xbd\x72\x1a\xb2\x62\x1a\xb3\xa6\x20\xe4\x51\xea\x39\x51\xbc\x6c\x0a\x4d\x05\x93\x8d\x2a\x96\x91\x68\xf4\xd4\x47\x33\x2d\xd8\x27\xc4\xf6\x78\xbe\xec\x5f\xe9\xf3\xe7\x19\x13\xac\xf6\x45\x04\xe2\xa2\x88\x9c\x43\xb5\x8d\x90\xcc\x4f\x3d\xb3\xf6\xe9\x83\xec\x13\xcb\x6c\x34\x6c\x55\x34\x33\x3e\x98\x50\xf3\x33\xe8\x12\xd6\xf6\x2c\x8a\xa9\xe6\xe4\xcb\x0a\xc5\xf5\xc9\xfd\x3c\x4d\xbb\xbe\x68\x61\xe4\x76\x73\xe7\xad\x9c\x55\x4c\xe4\x50\xaa\xb8\xbd\x13\x41\xd8\xb8\x1d\x7b\x3b\x05\x5b\x2e\x77\x57\xca\x7a\xf9\x49\xd7\xd4\x90\xc1\xd2\x10\x34\x57\x7b\x97\x4f\x09\x15\xb1\x24\xeb\x73\x37\x75\x21\xcf\x12\x86\x1f\x6a\xa7\x86\x6d\x9d\x8d\xe8\x35\x6c\x5b\xcd\x3a\x0e\xe3\x76\x52\xbb\xb6\x98\x26\x70\xdd\x76\x6d\x48\xfb\xed\x05\x72\xed\xd4\xd6\xdb\xa2\x25\xce\xb2\x5b\x60\xa7\xcd\x8b\xd8\xd8\x1e\x2d\x08\x39\xd4\x3e\x4d\xad\x77\x67\x0a\xef\x40\x7f\xd5\x7b\xbc\x93\xcf\xbd\xd4\xbe\xcc\x5e\x6a\x53\xa8\x6b\x10\x5f\x97\xf3\x35\x3e\xbf\x62\x2d\xb1\x3f\x5a\x69\xcc\x09\x55\x21\xa3\xc6\x36\xeb\x88\xbd\x6d\x1d\x96\x07\x2d\x1e\xf0\x23\x83\x40\x6d\x8e\x15\x51\xe6\x14\xdb\x04\x89\x46\x88\x61\xa2\xbe\xef\x76\x57\x54\x53\xc5\x74\x8c\xed\x6d\x3d\x40\xde\xc9\x5d\x08\x03\x3b\xb5\x41\x12\x92\x4b\x8b\x0f\x1e\xfd\xe8\x4f\x56\x82\x13\x3d\x48\x46\x36\x73\x27\xe5\xca\x7e\x32\x1f\xcc\x14\x61\xa0\xa6\x70\x26\x35\xcb\x22\xf2\xab\xa2\xb9\xa9\x9d\xdd\x87\x0f\x57\x17\x49\x7b\x65\x5e\x58\xd9\x2b\x8b\x37\x50\x18\x91\xff\xd8\x74\xb5\xb6\xe0\xda\xe4\xb4\x83\xc7\x16\xde\x3e\x96\x38\xcb\x58\x6b\xf6\xbc\xe0\xea\x2e\xbe\x02\xee\x5f\xce\x2f\xfb\xaf\xf6\x2f\xdd\x5f\xce\x2f\x89\xfd\x35\x41\xf9\xd9\x6c\x9d\xdc\x66\x9e\x1c\x04\xe9\x2a\x4a\x77\xcc\x93\x0f\x2d\xb2\x3a\xcb\x58\xeb\xb8\xc8\xb9\xba\xdb\x43\x65\xdd\x38\xe5\xab\xca\xdf\x0d\xe7\x8f\x3d\xa5\xdd\xd4\x95\x74\xeb\xd4\x75\x5c\xca\x26\x88\xc3\xf7\xb6\x04\x9a\x55\x73\x6e\x79\xf5\x8a\x5c\x0a\xd5\xd4\xac\x8d\xc2\x99\xf6\x3f\x15\x84\x69\x24\x96\x68\xa5\x07\x8a\x07\x45\x30\xf8\x7e\xc7\xe4\x68\x3b\x6c\x78\xb2\xd3\xbe\x1d\x76\xdf\xd8\x18\x9c\x40\x94\xe1\x77\xd5\xb0\x1b\x84\xfa\xe8\x86\xdf\x8a\xd6\x1a\x34\xa6\xc4\x52\xc4\xd0\x81\xcf\xbe\xea\x16\xb7\x82\xb4\x80\x94\x61\xdd\xcb\x23\xed\xd5\xd4\x85\xd5\x9f\x10\xdd\xaf\x97\xeb\x1e\x32\x68\x18\xd9\x09\xce\xb0\xc1\x0e\x62\x42\xda\xa1\x9d\xe0\x69\xce\x16\xa7\x2a\xa7\x2f\x4f\x60\x9a\xb1\xe5\x08\x74\x6f\xcd\x54\x91\x83\x97\x07\x63\x72\xc3\x4b\x5e\xd0\xba\x58\xf6\xb2\x92\xfd\x73\x51\x66\x13\x37\x21\x70\xf0\xbf\x38\x20\x47\xb2\x86\x99\x65\x54\x90\x82\xd1\x05\x73\xe9\xbd\x86\x0c\x85\x27\x0a\x4a\xca\xf1\xd3\x52\x64\xf2\x68\x56\x7d\x24\xcf\x69\xe8\xf9\x01\x85\x80\xae\x31\xeb\xfa\xa2\xf5\xe5\x71\x61\x58\x68\x58\xdd\xfe\x60\x79\x9c\x15\x26\x90\x04\x9a\x9d\x70\x10\x3e\xd3\x16\x3f\x9a\xa5\x22\xca\xbe\x10\xa1\xf8\x6e\xb6\x3f\xac\x9b\x3f\x92\x32\x17\x9f\x70\x83\x43\x36\x90\x19\xd7\xef\x59\x35\x38\xe7\x15\x81\x0e\x5f\x58\xb1\x64\x73\x0d\xa5\x06\x14\xd7\xb2\x5e\x12\xaa\x09\x45\xc2\x91\x35\x05\x1d\xbe\x40\x35\x43\x3b\xf6\x98\x5c\x5c\x5e\xbf\xbf\x3c\x3f\xbb\xbd\xbc\x78\x45\xdc\x57\x78\x57\x5a\x1f\x93\xdb\x4e\xdd\xc8\x41\xa8\x9d\x4c\x26\x2c\xf4\xd7\xce\xf1\xc4\x12\x60\x2a\xda\x6a\xec\x50\x6d\x29\x60\x29\xba\x12\x5c\xb7\xcd\x5c\x30\x04\xbd\x90\xc2\xe6\x76\x19\xc8\xd6\xfe\x3e\xe3\x18\x4a\x28\xf0\x43\x01\x89\x96\xad\xcc\x02\x6e\x38\xb6\x78\xf0\x4b\x18\xb4\x61\xec\x55\x82\x6c\x0f\x71\x1f\x1a\xa4\xeb\xb2\x90\x74\x75\x6f\xd1\x5d\xe7\x5f\xb6\xfc\xcf\xf5\xc4\x72\xbb\x12\x56\x86\xea\x5e\x83\xa9\xf1\xf8\x70\x0c\xc9\x6f\x87\xe3\x43\x27\x10\x16\x2b\x5d\xdd\x82\x30\xdb\x49\x75\x0b\x8a\xf6\xb1\x7f\x4c\xc8\xb7\x2e\x57\x2d\x6c\x0b\xe1\xd3\x2d\x0d\xe6\xb0\x18\x4a\xa7\x95\x57\xff\x2b\x61\xc0\xc2\xd6\xff\x9f\x74\x27\x6d\x2b\x94\xce\xf8\x82\x09\xdc\xd8\xfd\x91\x69\x37\xb5\xa4\xd3\x7e\xdf\x52\x8d\x0f\xef\xdf\xec\x6f\x32\x48\x23\x92\xa6\x72\x2e\xcb\x12\x6b\x19\xce\x7d\xa1\xb7\xb6\x78\x84\xa7\x53\x7b\x51\xa8\xb1\xa2\xe3\x74\xf0\x02\xad\xd0\x5d\xf7\xca\x8a\x02\xed\x7f\xb6\x89\xa2\x01\x87\xba\xd3\x7c\xd2\x7b\xca\xd8\xb2\xaa\xca\x95\x97\xb2\x8c\xe9\xd4\xaf\xe5\xf4\xfd\xe5\xd9\xc5\xdb\xcb\x71\x99\x3f\x19\xb9\x62\x22\xaf\x24\x1f\x4e\xa1\x0a\x76\xf5\x8d\x25\x67\xfe\x63\x69\x92\xc8\xa5\x7b\xad\x1b\x86\xe6\x60\xa1\x60\x17\x55\xf3\x2a\x67\x9a\xf2\x42\x75\x4e\x5c\xcb\x4a\x16\x72\xb6\xb9\x2d\x4c\xc2\x71\xfd\x02\xab\x0d\x8d\xe8\xc8\xe0\xc1\xfe\xf4\xb1\x70\x9f\xc5\xfe\x4e\xb9\xbe\x8a\x66\x83\xda\x55\x7a\x3d\x04\x5a\x18\xc6\x94\x19\xf8\xc2\x36\xe2\x11\x04\x58\xbf\x3b\xc1\xbd\x70\x9a\x2c\x58\x20\x80\x44\xd8\x52\xba\x9d\xda\xb0\x9d\x2e\xb2\xad\x64\x1b\xa3\xee\xae\x49\xbe\x4f\xb4\xe9\x21\xa1\xd6\x50\xb8\x50\x3b\xe2\xfe\x6e\xff\xd5\xbe\xd1\x27\xae\x55\xcd\x46\xbe\x5e\x1d\x34\xea\x0c\x84\xb9\xb7\xac\xd6\x9a\xad\x7b\x06\x49\x67\xbe\xc4\xa7\x8a\x65\x4a\xdc\x64\x2b\x0b\x7a\xfb\x30\x84\x8f\x40\xe1\x60\x57\x70\xda\x5a\xb1\x08\x9d\x05\xd3\x4a\x65\x6d\xbd\x39\x55\xcd\x17\xbc\x60\x33\xe8\x36\xc0\xc5\xcc\xf5\x91\xed\xd4\x75\x85\x7e\x6a\x2c\xe8\x7b\xeb\x7b\x3f\xde\x9a\x7f\x75\x3a\x08\x01\x06\xbf\xfb\xf6\x16\xba\x77\x40\x78\x45\xc4\x6d\xde\x5d\x1f\x35\x93\x09\x76\x73\x1f\x8d\x46\x60\xed\x3a\xfa\x87\x91\xe3\xf3\xe2\x98\x7c\xc7\xec\xfc\x24\x74\x2d\xa9\xa1\x21\xef\x5c\xfa\xf6\x08\x06\x6c\x24\x06\xc0\x65\xc3\x12\x67\x16\xc2\xa9\x81\x62\x44\x58\x64\xd5\xb0\x5f\xee\x79\x1e\x70\xc6\x51\x2c\xe6\x8c\xfe\xf5\xa7\xd3\x07\xf6\xc4\x3a\x77\xe4\x05\xce\x33\xb2\xe9\x56\x8d\xc9\x55\x5c\x71\xf9\xca\x72\x15\x4a\xd4\xb2\x2c\xb8\xb8\x6b\x6b\x0d\x4e\xa5\xc1\x70\xdb\x1b\x44\xdc\xc5\xb8\xd7\x51\xd7\xa3\x45\x87\x1f\xed\x01\x4b\xf7\xc6\x6b\x74\xb2\xd9\xfe\x76\x59\x31\xa0\x1d\x9e\x04\xda\x50\xb5\xae\x89\xe3\x20\x6c\xb6\xfe\x92\x76\x82\xab\x4c\xf1\x78\xe2\x7f\x75\x73\x7e\x73\xd5\xa3\xfc\x82\xe0\x6f\x3d\xd7\xd4\x03\x02\xe7\xf7\x15\x39\x9f\xc2\x6a\x61\x13\x3e\x83\x4c\xce\x7f\x1c\x52\x41\x46\xa4\x68\x86\xff\x8e\x21\xa5\xd7\xb2\xd6\x83\x3d\xe0\x63\x49\x4f\x36\xa7\xd5\x59\xa3\xe7\x17\x5c\x65\x72\xc1\x12\xd5\xd3\xfb\x39\xf6\xf6\x70\xf5\x2e\xb9\x43\x0b\x84\x45\xce\xff\x7a\x76\x4d\x68\x63\xce\x52\xdb\x22\xe1\x7b\x91\x60\xba\x33\xbf\xc1\xa4\xbd\x3d\xcc\xdb\x42\x7a\xd4\x59\x3f\xbb\x0e\xff\x65\x5c\x87\x40\x41\xfe\x55\xdd\x85\x5c\x70\xcd\xa9\x96\x51\xcd\xbd\xfb\x76\x22\x2c\x5c\x8d\x57\xea\xca\x81\x81\xb8\x17\x70\xfd\xf5\x20\x47\x21\x98\x37\x32\x81\x62\x06\xdb\x7e\x25\x8c\x9a\x44\x33\xb6\x12\x15\x7f\x12\x55\x17\x19\xe7\xc6\x3d\x8c\x3f\xda\x1c\x88\x0a\xa8\xea\x9f\x5e\xf5\xba\x03\x85\xfb\x17\x92\x7e\x0f\x43\x67\x1c\x6b\x7b\xca\xed\xcd\x8a\xc8\x7f\x4c\xa3\x73\xd6\x58\x8c\xeb\xfd\xbf\x0d\x2d\x70\x1f\xdf\xed\xd3\xb2\xd9\x3f\x8f\xa4\xe9\x39\x1c\x71\xe7\xf0\xce\x59\x7b\x8c\x32\x01\x72\x06\x3c\x11\x96\x3a\x6b\x2a\x94\x39\xbc\xbe\xe7\xe9\xd0\x3a\x96\x0f\xc9\x91\xce\xaa\xc8\x4e\x61\x8f\x90\x43\x85\xcb\xb4\x67\xf1\xc6\xe7\x4e\xc5\xcd\x67\xef\x5e\x56\xc0\xf1\x34\x23\x5d\x6f\x01\x28\x7a\x90\x37\x5c\x69\xd7\x90\x0c\x7e\x88\x28\x35\x81\xf5\xfd\x41\x7e\xbc\x36\x2a\x36\xaf\xfe\x93\xe6\x79\xfd\x0a\x79\xb0\xad\x6d\x0d\xff\xad\x22\xab\x06\x43\x6c\xac\x8b\x1f\x38\xd2\xcb\x8a\x67\xa0\xf2\xdf\x9e\x5f\x13\x6c\x45\xf9\x87\xdf\xbd\x00\x79\xf2\xdf\x7e\xf3\xbb\x17\x91\x28\xf0\x39\xd2\x99\x76\xb2\x82\x25\x45\x89\xc7\xb8\x44\x42\x5e\xdc\xbd\x89\x41\xbb\xc5\x95\x83\x60\x86\x11\xe5\x40\x65\x11\x2f\x2d\xf1\x36\x87\xec\x79\x4b\x70\xb1\x3b\x88\x77\xcf\x31\xd0\x5b\xc7\x97\x1f\x03\x4d\x7c\xba\x24\xd2\xaf\x87\xd2\x3f\x24\x7d\xd7\x8e\xf4\x59\xd2\x16\x46\xbb\x68\xd2\xd7\x23\x6d\x41\xb8\xfb\x22\x7d\x81\x5d\x0c\x61\x6c\x1f\x53\x91\x9a\x18\xed\xbe\xe3\xa3\x86\x9c\xac\x8b\x77\x37\xff\xf9\xe6\xec\xeb\xcb\x37\x30\x3f\x8c\xe4\x1d\x9c\x9f\x41\x4f\x2b\x2a\xef\x12\x83\x1a\x8f\xee\x61\x3b\x40\x68\x8b\x52\xbc\x96\xef\x5e\xdf\xac\x18\x56\xcc\x2f\xce\x55\xd9\x77\x47\x0e\xd3\xd3\x2d\xae\xca\x87\xea\x38\x62\x1a\xb1\x23\x4f\x63\x4c\x1d\x41\xc4\xff\x5e\x92\x27\x77\xb4\xb7\x76\xaa\xf5\xf6\x14\x5e\x73\x66\x38\xb7\x70\xa4\xd9\xe3\x9e\x07\xf9\xcc\x8e\x37\xb3\x13\xb8\x3b\x31\xfe\xb1\x27\x75\xb9\x3d\xca\x2e\xc7\x89\x3a\x75\x6a\xa6\xee\xe1\x0d\xbc\xe3\x9c\xbd\x86\x04\x60\x84\x63\x6d\xb8\x87\xe1\x1b\x4c\xa9\x98\xea\x36\x2b\xd8\xf9\xa5\x60\x5f\xb5\xa9\x51\x56\x3c\xd5\xdc\xd8\x67\xab\xdb\xfb\xb8\x43\x53\x87\xbd\x46\xfd\x8c\xc4\x6d\x3d\xfc\x5c\xac\x10\xb5\x26\x01\x55\xd1\x2c\x20\x0b\xef\xaf\xa2\x53\xfb\x13\xfe\x02\x25\x74\x9e\x8e\x28\xc3\xe7\xf6\x94\x36\xe1\x61\xa5\x5d\x86\x73\xf7\xda\x6a\xea\xfa\x96\xf3\x8a\x51\x74\xd6\xcf\x93\x50\xe5\x7b\xdf\x36\xca\x57\x2c\x8a\xcb\x71\xff\xbc\x07\x4e\x1e\x9d\xea\x7f\x97\x98\x80\x1c\xdc\xae\x0b\x97\xfd\xbe\x3f\xb5\xb2\x9a\x4b\x2d\xc5\x8e\x89\x58\xd7\x1b\x5e\xee\x07\x3b\xe0\x13\xe7\xbe\xc1\xdb\xb0\x80\xd1\xb6\xf9\x87\x28\x72\xef\xf6\x32\xe2\xae\xe3\x79\x52\x38\x07\x98\x0a\x3b\xce\xad\x7d\xf7\xc9\x64\xb1\xfc\xea\x62\x0f\x37\xfe\xe7\x53\xd2\x61\xdf\xf5\xa5\xf6\x75\xdd\xcd\x41\x26\xed\xff\xd5\x85\x95\x73\x5d\x5e\xa5\xb2\xa8\x4f\x5a\xdc\xef\xe0\x77\x70\x51\x11\x39\x55\x71\x32\x83\xac\xf5\xbd\xac\x53\x8b\xcb\x5c\xf7\x5e\x5b\x89\x5f\xb2\x7f\x8b\x09\x6f\x8e\xba\xc1\x4f\x7d\x4b\x71\xde\x9f\xed\xa6\xde\x40\x70\xc4\x4a\xcf\xab\xe9\xda\xfd\x0d\xa2\x08\xea\xbb\x9b\xae\xf7\xc0\xf5\x0d\x42\x1d\xbc\xde\x78\x7d\x37\x5e\xdb\x48\xcd\xc5\x5f\xeb\x47\xb9\xb6\x3b\x71\xe9\x40\xd1\x91\xf8\xbc\x9e\x9d\x8a\x8e\xec\x4d\x61\x72\x58\x9d\xb4\xf6\x8f\xf6\x25\x6b\x4c\x32\xe7\xd9\x12\x30\xea\xc9\x40\x70\xe9\x51\x99\x0e\x71\x04\xab\x96\xd8\xe3\x3d\x9a\x56\x5d\x69\x56\x2a\xec\x34\x54\x14\x66\x7f\xa5\xe8\xf6\x33\xb2\x25\x3f\x4e\x08\xb6\xd8\x29\x69\x15\x28\x54\x6c\x48\x55\x2e\xef\xc5\x3d\xad\x73\x72\x76\x3d\xe4\x47\xdb\x2b\x59\xb2\x13\xde\x03\x55\xb2\xe6\xcf\x98\x7a\xb3\xbd\x9d\x84\x0a\xb3\x13\xae\x55\xdb\x8a\x9a\xe9\xae\x55\xc1\x90\xee\xd8\x26\xb2\x40\x8e\x0c\xe9\xb1\xb3\xe9\x48\x22\x82\xc8\x4c\xd3\x02\xcb\x33\x93\x09\xd3\xf7\x8c\x09\xf2\xe2\xc5\x8b\x17\x11\x96\xe0\x9c\xbc\xf8\xfd\xef\x7f\x0f\x2d\x84\x49\xce\x32\x5e\xae\x03\x82\xa7\xfe\xd7\xcb\x97\x63\xf2\x1f\x67\x6f\x43\xe9\x1f\xd8\x28\xbd\xd2\x0a\xcb\xc5\xe1\xcc\x00\x07\xba\xc0\xd5\x09\xf9\xf7\x9b\x6f\xdf\xb9\xa3\x0c\x5b\x55\xfa\x6f\x03\x7a\x96\x6e\x7b\xc7\xe4\xa2\x0d\xd0\xec\x18\x69\x83\x40\x21\xea\x90\xd6\x0c\xe2\x3d\xe9\x74\x0a\x17\x05\xc9\x3b\x57\x8e\xc4\xb8\x8a\x3c\x7c\x36\x0f\x93\x7b\xec\x43\x6a\xae\x46\x01\x51\xa9\xdc\x6c\x01\x18\xd2\x5d\x11\x2a\x0c\xdc\x85\x6f\x45\xd7\xe6\x84\xa5\x9e\x90\x82\xdf\x31\x32\x55\xd0\x81\xb4\x2d\xca\x5d\x33\x65\x74\x18\xdb\xf4\x3c\xce\x61\xe9\xb7\xce\x2c\xf2\xf3\x78\x80\x23\x7b\x5d\xf6\x2e\x54\xc1\x15\xb6\xac\xb0\xd9\x06\x48\xdb\xcc\xb6\x3e\xb5\x47\xb5\x2f\xdd\xf9\x79\xe0\xe9\xda\xe2\x4d\x9e\xf4\x12\x5a\xc8\xa8\x52\xca\x1d\x74\x69\xa5\x0d\x17\x60\xb5\xac\x22\xae\x49\x52\x2d\xf4\xb4\x9e\x2f\x48\xef\xdf\xd2\xc8\xbe\xc4\x7d\xd7\x55\xa7\x3c\x16\x9d\xc8\x46\xbb\xd0\x14\x84\x98\xd2\x9c\x5a\x4b\xb7\xb1\x51\x2f\x24\x17\x87\x4f\x6f\x84\x93\xd8\x37\xa1\xcf\x6c\x7b\x82\xdb\x09\x61\x34\x9b\x93\x3b\xb6\x1c\x01\x9d\x8b\x86\x89\xad\x0b\x9c\x49\xe9\x82\x6a\x6a\xbb\x00\xf4\x3d\xb4\x69\x0d\x6c\xcf\xfd\xf1\xb8\x3c\xca\x16\xa3\x7d\x16\x6c\x64\x4e\x66\x3b\xa8\xb2\xb2\xb5\xed\x58\x20\x3a\x26\x35\xd7\x98\xc9\x76\x85\x4f\x80\x6a\x01\xd8\x66\x81\x57\x6b\xf9\x9a\x86\x72\xb0\xdc\x7c\x20\xa5\x5f\xc1\xc0\xba\xdb\x70\x30\xc3\x44\x92\x7a\x35\xa0\xb3\xb1\x33\xa3\x5e\x53\x79\xab\xc6\x44\x45\xce\x77\x60\xba\x26\x4a\x9d\x30\xb5\x39\xcf\xe6\xae\xdd\xb6\x85\x9a\xb2\xa3\x88\x4b\x1e\x09\x7a\x79\xaf\x8a\xe9\xa6\x8a\x0b\x49\x6b\x07\xc4\x1a\x9a\x95\x33\xa5\x08\x07\x1f\x56\x49\xeb\x3b\xe6\x0a\x34\xd2\x62\x4c\xae\xcd\x66\x26\xc0\x74\x75\x6a\xb1\xbb\xd1\x02\x83\xb6\x0d\xfd\xed\x24\x21\x27\x76\x3d\x3f\x1c\x8f\x0f\x51\x32\xd8\x90\x9c\x1c\x0d\x67\x97\x46\x2c\xc9\x0d\x58\xfa\xd2\x26\xad\x14\xb6\x9e\x31\x7a\x91\x41\x07\x70\x26\x04\xf3\x6b\x56\x87\x95\x9f\x68\xb4\xd1\xb9\x1d\x3b\x76\xe2\xd8\xa5\x35\x5a\x6a\x63\xb4\xa0\x63\x77\x75\xec\xda\x10\x6d\x87\x76\x68\xfd\x60\x49\x4b\x07\x5b\x3e\x97\xda\x05\x68\xe7\xe6\x57\x65\x42\x43\x8d\x8d\x73\xef\x54\xdc\x2c\x7b\xba\x4f\x22\x50\xb2\x45\x57\x02\xb1\xdc\xf0\x0e\x54\x7e\x92\xa1\x0e\x2b\x4b\x86\x76\x24\x83\x0c\x2a\x4f\xc9\x10\x7b\xca\xd6\x16\x65\x2a\x19\xe8\xa0\xf2\xe5\xfe\x9a\x0c\x75\xb3\x32\x76\x35\x05\xea\xdb\x72\xe0\xf4\xd3\x6f\x39\x4d\x47\xf7\xf6\xec\xd8\x60\x54\x7a\x6b\xac\x56\x8b\xdb\xae\xa5\x25\x03\xdd\xa2\xd5\x75\xb4\xb6\x64\x90\x11\x5a\x5e\xfa\x34\x41\xa7\xe8\x6b\x7d\x29\x1d\x8f\x49\xa2\x1a\xb8\x3a\xe2\xd5\xc2\xd5\x11\x13\x24\xb3\x3a\xd6\xe8\xa9\x97\x0e\xaa\x36\x61\x31\x79\x0f\xe1\x48\xb5\x84\x4e\x5e\xda\x13\xe9\x31\x79\x6b\xa5\x8d\x1d\x8e\x85\x1a\x6d\x48\xc9\xa2\xd1\x3e\x75\xbe\x2f\xba\xec\x74\x73\x60\x91\xae\xaf\x18\x96\x54\x71\x60\x41\x9c\x49\x06\xea\x2b\x92\x58\xd9\x22\x4d\x12\xb2\x13\x4b\x67\x4a\xb1\x81\xa9\x38\xd2\xc2\x53\x13\x66\xff\x19\x02\x59\x71\xc4\x87\xb3\x26\x00\x85\xc0\xd7\xe8\xa0\x56\x1c\x3b\x9c\x9d\x93\xe8\x77\x3c\xbf\x1b\xac\x91\xe7\x33\xe4\x7a\x9a\x48\xc2\x6a\x65\x4d\x0c\xb9\x03\x25\xcb\xa9\x0a\xa9\x4d\xe8\xe3\x5d\x06\x76\x21\xd6\xd6\x7d\x76\x7d\xb5\x37\x4b\x49\x07\x66\xe4\xbc\x73\xaa\xe9\xbf\x9a\xad\x04\x1c\x13\xbe\xdb\xb7\xb9\xde\x17\xed\xbe\x44\xf6\x29\x68\x87\xa1\xe7\x5f\xb0\x3a\xb7\xb6\xb4\xd7\x86\xff\x44\x86\x94\xad\x4d\xa5\x57\x9e\xde\xfa\x1c\x5a\x41\xa5\x2d\x69\x9f\x04\xd5\x05\x2a\x01\x45\xfa\x52\xd5\xc4\x27\x52\xfb\x60\x0f\x22\x32\x49\x56\xc7\x6a\x58\xab\x5d\x22\xb9\x81\x1e\xd6\x68\x2b\x4b\xdb\x5d\x1c\xd2\x05\xf3\xe7\xaf\xb0\xe9\x26\x15\x42\x6a\xec\x00\x7d\x82\x6d\xb6\x93\xbb\xb1\x23\x4b\x06\x91\xb4\x13\xb0\x56\x77\x5c\xe3\x3b\x0a\x95\x3b\xb4\x53\xdf\xb5\xa1\xba\x41\x09\xd8\xd1\xeb\x54\xbb\xc8\x43\x7a\xa4\x93\x0e\xb7\xde\xa5\xc3\x6e\xdf\xc9\x8c\x70\xdc\x11\xab\x6c\xce\xca\x5d\xfa\x82\xe3\x05\x7e\xed\x36\xc3\x50\xd6\xfb\x9a\x6b\xcd\xb0\xc2\x2e\xab\xcb\x5d\x3a\x2c\x1b\xd4\x3b\x71\x6a\x1b\xd6\xa5\x58\xbc\x3c\xd8\xa5\xbd\xf8\x03\x9a\x78\x93\xf6\x8c\x1f\xbc\xdd\xdd\x22\x27\x68\x54\x8f\x08\x26\xd9\x34\xb0\x2d\xbd\x8f\xfb\xf4\x86\xda\xb3\xeb\x2b\xb2\xc0\x33\x7d\xd2\x6d\xfa\xe9\x98\x7b\x4e\x76\x6b\x4b\xfe\x6c\xee\x79\x36\xf7\x3c\x9b\x7b\x7e\x5e\xe6\x9e\x8e\x08\xe5\x98\xda\x4e\xd6\x9e\xbe\xc9\xa8\x5b\xd9\xdb\xda\x81\x76\xa1\x46\x36\xd6\xa7\x53\x27\xd7\x90\x28\x67\x01\x4a\xec\xce\x4e\x6c\x17\x1a\x57\x7a\xf6\xf0\x70\x3c\x3e\x3c\x74\x76\x24\xab\xec\x36\x7a\x3a\xfa\x43\x32\x58\x26\x32\x99\x43\x29\x67\x58\x6f\xad\x34\x28\x33\xad\x41\x05\xf7\x26\x19\x2e\xec\x65\xe9\xd6\xde\xf5\xad\xc1\xdc\x77\x43\xd1\x1d\x38\x9f\x8b\x66\x7b\xbd\x17\xa1\xbd\x15\xd5\x7d\x11\xaa\x84\x96\xdf\x6e\xf4\xea\x07\x5a\x99\xbd\x8d\xba\x2b\x78\xc9\x13\x75\x3e\x62\x99\x8b\x21\xfb\x4c\x69\x45\x8e\x10\xc8\x38\xab\x9a\x13\x0b\x70\x5c\xb2\x52\xd6\xcb\x74\xaa\xe5\x80\x1a\x60\xbd\xaf\x58\x88\xc7\xe9\x53\xad\x19\xc9\x9a\xba\x66\x42\x17\xcb\x9f\x9a\x46\x11\xd5\x18\x67\x7d\x3c\x44\xa1\xf0\xb8\x92\xd2\x77\xbd\x3b\x56\xd2\x9b\x7c\xd1\x74\x30\xbb\xfa\xbd\xd8\x49\xd2\x9d\xfa\xe6\x17\xea\xc4\x9b\x02\xe1\x57\x26\x16\x3b\x41\x5c\xd0\x3a\x98\x7c\xb4\x69\x3c\x48\x87\xc8\xf9\x82\x2b\x19\x4c\x9a\xdc\xf8\xea\xba\x35\x93\xdb\x22\xf4\xb2\xd1\x55\x93\x2e\xcc\x12\xcf\x57\x1d\x19\x76\x5d\x91\x3c\x95\x48\xbf\xc6\xa4\x8d\x6e\x45\x55\xed\x65\xb8\x7e\xd5\xfa\xa8\xa8\xd6\xac\x16\xaf\xc8\xff\x3b\xfa\xdb\xaf\xff\x39\x3a\xfe\xf3\xd1\xd1\xf7\x2f\x46\xff\xfb\x87\x5f\x1f\xfd\x6d\x0c\xff\xf1\xab\xe3\x3f\x1f\xff\xd3\xfd\xe3\xd7\xc7\xc7\x47\x47\xdf\x7f\xf3\xf6\x2f\xb7\xd7\x97\x3f\xf0\xe3\x7f\x7e\x2f\x9a\xf2\x0e\xff\xf5\xcf\xa3\xef\xd9\xe5\x0f\x91\x40\x8e\x8f\xff\xfc\xcb\x1d\x26\x4b\xc5\xf2\xdb\x64\x82\x4f\xb0\xe8\xdd\x03\x44\xa2\x2e\x84\x1d\xd1\x91\x90\x4f\xa3\xd6\x09\x31\xe2\x42\x8f\x64\x3d\x42\x60\xaf\x88\xae\x93\xe2\xc5\x70\x38\xd4\x79\x38\xfd\x68\xc5\xae\x1d\x69\x21\x0e\x50\x04\x0d\x3b\x7d\x82\xcb\x8e\x91\xec\x7b\xb3\xd1\xdb\xe6\x9a\xcf\xa1\x8c\x5f\x60\x28\xa3\xad\xd6\xf3\x1c\xc7\xf8\xb3\x8d\x63\xbc\xb1\x5d\x6b\x37\x06\x31\x62\x68\x62\x02\xd0\x88\x20\xc6\x54\x93\x55\x44\x10\x23\x38\xde\x93\x2e\xd2\x73\x10\xe3\x73\x10\xe3\x73\x10\x63\xda\xdc\x9f\x83\x18\x9f\xad\xda\xcf\x56\xed\x67\xab\xf6\xda\x78\x0e\x62\xdc\x38\x9e\x83\x18\x87\xc6\x73\x10\xe3\x73\x10\x63\x27\x88\xd1\x2a\xa2\x49\xca\x86\x8d\x60\x7c\xb2\x00\x46\x65\xd0\x20\x63\x67\x59\x26\x1b\xa1\x6f\xe5\x1d\x8b\x8c\x59\x89\x32\x92\xac\xc1\x8e\x5c\xc7\x93\x04\x34\xa6\x09\xf1\x09\xe2\x78\xba\x20\x4e\x9b\x9c\x33\x91\x62\x9a\xeb\x6d\xff\x99\x7d\xdd\x59\x14\x0c\xcb\x13\x39\xcb\x3d\xdc\x04\x04\xb4\x24\x48\x9b\xd3\x1a\x93\x33\x52\xb3\x8c\x57\xdc\x10\x66\x28\x7f\x06\xbf\xa7\xaa\xbb\xbe\xc7\x31\xd7\x8a\x15\x53\xdb\xff\x55\xb4\xf5\x32\xea\x56\xf6\x4a\xd7\xf6\xdd\x22\x7b\x53\x47\x39\x44\xba\xb6\x9f\x09\x50\xd5\x5c\x36\x45\x4e\x6a\xf6\x0f\x27\x1a\xd9\xbd\xb8\xed\x7e\x2b\x8f\xad\x10\xd9\x0e\x6b\x84\xe9\x2c\xda\x4e\x98\x56\x3c\xb6\x96\xa7\x87\x95\x4e\xe0\xd8\xa7\x8a\xd7\x70\x45\x6f\x58\x26\x45\xbe\xab\xe9\xef\x72\x15\x8e\xc3\x3a\xeb\x15\x4c\x3a\xc2\xbc\x41\x50\x90\xe8\x4f\x0b\x9e\x73\xbd\xf4\xb1\x6e\x48\x3e\x8c\x42\x11\xec\xda\xdb\x1f\x0e\x79\x55\x7b\x7c\x84\x56\x55\x2d\x69\x36\x67\xaa\xb3\x13\x29\x7c\x08\x24\x28\x2c\xbd\xe4\x6b\x12\x14\xcd\x8c\x0b\x94\xf2\x01\xba\x11\xd9\x22\x8a\xdd\xb4\xa3\x96\xda\x05\xe7\xae\x2c\xb7\x8b\x75\xf6\xb3\xa9\x46\x40\x34\x05\xe9\x7a\x09\xa5\x05\x65\xf7\x63\xb8\x27\x11\x05\xc2\xfa\xeb\xb7\xaf\x29\x22\x8b\xdc\xd5\x8b\xfe\xc3\x0b\xa3\xf4\x66\x96\x42\xa4\x39\xae\xa1\x5e\xb0\x96\xa4\x30\xa2\xae\xac\x5d\x55\xea\x0d\x9f\x49\x00\xfa\x9b\xdf\x92\xb9\x6c\x6a\x35\xee\x16\x27\x7a\x09\xbf\xa1\xb1\x0d\x59\x6b\x8a\xa1\x52\x93\x82\x51\xa5\xc9\xcb\x17\xa4\xe4\xa2\x31\x12\x55\xe2\x55\x4d\xd5\x42\x3a\xfa\xc7\xef\x7e\x1b\xf9\x56\x9a\xe6\xb1\x1e\xf7\x68\xef\x71\x85\x5d\x17\xad\x02\x92\x14\xfc\x02\x6d\x61\x00\x7b\xb1\x97\x6a\x3f\x8a\xc6\xb1\xf3\x44\x65\xc6\x62\x83\xd0\x72\xcf\xf4\xf1\xc7\x46\x4e\x96\x3a\xbe\xb0\xdb\xff\xc5\xe7\xfb\x15\xdd\xdc\x8f\x6b\x15\xb4\x07\xe7\xba\xde\xec\xb7\x2d\xa0\x3d\xf0\xe2\x9e\x3b\x8b\xcf\xb8\xd2\x83\x8d\xab\x47\x61\x57\x49\xac\xb0\x33\xab\x65\x13\xac\x26\xd2\xdb\x6e\xb0\x27\x38\xfd\xd5\x52\x5c\x9a\x65\x4c\xc1\x85\x76\xe5\x3c\x23\x7a\x80\x08\x89\x5f\x0f\x3c\xf8\x19\x1b\x67\x38\x24\x8a\x74\x4c\x3d\x66\x21\xeb\xa8\x4d\x8a\xd1\x2f\x1c\x7a\x25\xee\x12\xbe\xd4\xbf\x63\x8a\x8b\x19\xb4\x7a\x25\x65\x53\x68\x5e\x45\xe4\xf2\xb8\x1d\xf5\x00\x2d\x7b\xed\x3a\x9b\x68\xc7\xfb\x40\xc3\x5b\x64\x2e\x35\x36\x4f\x00\xa7\xe5\x91\x9b\x0b\x61\x42\x43\x31\x2a\xc8\x8e\x60\x15\xad\xa9\x3b\x96\x20\xcc\x4c\x96\x25\x55\xc7\xd6\xef\x45\x21\xb2\x0c\xa9\xb0\x61\xa8\x35\x2d\xfc\x36\x76\xe3\x6c\xf6\x85\xc8\x9a\x09\x2a\x82\x4e\xf1\xbe\x71\x0a\x5e\x21\xf2\x5e\xb8\x36\x60\xd8\xb9\x3e\x11\x83\xad\xe8\xfe\x35\xcd\xee\x98\xc8\xc9\x07\xe5\xf0\x38\x5f\x0a\x5a\xda\xb6\x12\x55\x2d\xb1\xc3\x3b\xcb\x1d\xfc\x20\x60\x1f\x89\x84\x46\x6d\xac\xec\xe5\x8a\x38\xa2\xbc\xb6\xaf\xdd\x6b\x54\x62\x8d\xf5\x0f\xca\x08\x33\xc3\xf4\x4c\xc5\x30\x5c\xc5\x6a\xbe\xc8\x98\x93\x14\xcd\x44\xf6\xb5\xa8\x45\xb0\xd6\xe9\xda\xb2\x6c\x9d\x53\xde\xb9\x4d\xc0\xde\xbc\xf3\x1e\xba\x4c\xd0\xc2\x90\xa8\xb0\x6c\xec\x5a\x9a\xf5\x11\xca\x9c\xa0\xd8\x57\x0b\xb1\x7a\x12\x5f\x20\xf1\xf0\xfd\xd7\x17\x7d\x62\xf4\x9e\xe6\x52\x91\xaf\x0b\x99\xdd\x91\x0b\x06\x22\x7b\x19\xd4\x4f\x56\x3b\x6b\x44\x35\xfa\x1f\x84\x18\x6a\x36\x5a\x4f\xf2\xcf\xd1\x6a\xb4\xa4\xb3\xa1\x4b\x3a\x22\xa5\x14\x5c\xcb\x7a\x1f\xa5\x1a\x9f\x1b\x5b\xfe\xcb\x34\xb6\xac\x27\x61\xab\xc1\x4f\xb5\xad\xa5\xb9\x12\x89\x1d\xa0\xe7\x8c\xd4\x40\x66\xe0\x65\xd7\xcb\x28\xbe\xd3\x70\xef\xf2\xff\x62\x2e\xef\x47\x5a\x8e\x1a\xc5\x46\x3c\x18\x6b\x17\xbd\xae\x3b\xb6\x84\x60\xc4\xa4\x95\x7d\x83\x2f\xf5\x54\x4d\x2d\xc1\xe2\x0d\xbf\x1b\x21\xe7\xfd\xd7\x17\x86\x53\xc6\x57\xf4\xe7\x8a\x9c\x32\x9d\x9d\x66\xac\x9a\x9f\xda\x69\x7d\x71\xdb\xe5\xe8\x5e\xda\x7e\x9d\x91\x4c\x16\x85\xad\x37\x29\xa7\xe4\x9c\x55\x73\x0f\x2a\xc9\x3d\xf4\xe8\x7b\xf0\x39\x5a\x18\x56\x52\xa6\xb5\x55\xeb\x5c\x2d\xf3\xae\xbd\x59\x1d\x44\xaa\x27\x96\x98\x45\x88\xb0\x5f\x0a\x6a\x3d\x42\x57\xa5\xe8\xba\xdd\xdb\x4a\x73\x6f\xe8\xe4\xf8\x45\x61\xeb\xe3\x75\x8c\x3c\xbc\x71\xaf\x41\x1c\x63\xc7\xad\x9b\xd4\x00\xd2\x7d\xbe\x47\x12\xc9\xd5\x14\xb5\xa2\x9c\xe5\x44\x2e\x58\x5d\xf3\x9c\x29\x47\x8a\x93\x28\xa6\xe0\xc5\xd3\xd2\xc8\xe7\x5e\x96\x5b\xc7\x4f\xa3\x97\x65\xb2\xbe\xdb\x21\xb6\xe6\xdd\x75\x62\x4b\xf3\x92\x47\xa4\xc1\x7f\x41\x9c\x5c\x65\xb4\x60\x57\xdf\x46\xab\x8f\x37\xf8\x7c\x5f\x83\x74\x3f\x76\x5a\xf6\x3c\xa0\x1d\xc8\x37\x1e\x4f\x89\x90\xf9\xb0\x67\x62\xaf\xba\xde\x8c\x6a\x76\x3f\xc8\xf2\x47\x2d\x09\x1d\x7e\x2a\xd4\x58\xe7\xb9\xf9\xcf\xaa\x02\xd7\xb9\x45\xd8\x57\x64\x5f\xc2\x84\x3d\xd5\x34\xa3\xa0\x5b\x62\xdb\x27\x10\x03\x60\x2c\xa2\x9f\x5d\x5f\x91\xbf\x20\xdc\xfd\x75\x19\xaa\xa5\x46\xb9\xf8\x42\x96\x94\x27\x36\xa9\xef\xb4\x74\xeb\x4e\xf4\xda\x03\x25\x08\x35\x78\x2c\x9d\xce\xfb\x53\x3e\x6b\x8c\x1e\x6d\x75\xdb\xe7\xc6\x2c\x81\xa5\x3f\x9e\x08\xd6\x4a\x60\x1d\x1b\xa4\xcb\x81\xf1\x52\x55\x70\xe9\x0e\x2b\x80\x79\xf9\x70\x12\xa2\x98\x50\x1c\x7c\xa3\x9d\xb0\x27\x10\xcd\xf4\x3c\xc2\x1b\xe5\x93\x5b\x50\x8c\x3b\x21\x6f\xe4\x8c\x0b\x47\x1d\xa4\x0d\x27\x98\x52\x5e\xc4\x6d\xe3\xb3\x5c\xb5\x75\xfc\x34\xe4\x2a\xa5\x8a\x4b\x41\x27\x45\x38\x12\xad\xcf\xb8\x0a\x0a\x51\x1d\x0c\xde\x3d\xcd\xb9\x32\xff\x4f\x6e\x6e\xde\x80\x57\xa9\x11\xb1\x7a\x06\xf8\x5d\x2c\x79\xf6\xc5\x9c\x90\x68\xec\xef\x1e\x23\x4d\x4c\xee\xaa\x73\x25\x72\xb3\x0c\xa6\x7a\x81\x95\x16\x1a\xf6\x2d\x8a\x75\x39\xd9\xb8\xae\x09\x23\xb7\x73\x9e\xdd\x5d\x77\x9c\x4b\xb2\x36\xbf\x89\xce\x4f\x9e\xc1\xc6\x5c\xe7\xd5\x77\xf7\x45\xf8\xed\x32\xaf\x53\x8d\x1c\xb7\x1d\x8e\x76\x63\xb7\xca\x00\x21\x54\x29\x99\xf1\x78\xef\x24\x98\xe8\x5a\x96\x98\x03\x4b\xdc\xdf\xf2\x40\x0a\x7a\x10\xdf\x76\x88\x60\x05\x38\xaa\x3a\x7c\x38\xc6\x07\x69\x77\x69\x6f\x4b\x42\x54\x4c\xee\x37\x7b\xdb\xeb\x30\xeb\x5c\x83\xe8\x30\xf3\x0e\xb1\x08\x61\xa4\x2b\xca\x38\x99\xd6\x36\x10\x5f\x39\xfa\x6e\xa7\xd9\xf0\xcd\x81\x14\xef\xbd\x6c\x52\x38\x0d\x7b\x93\x2d\x65\x25\x1a\x00\x7f\xb3\x6e\x34\xb8\xd4\x95\xac\x9a\x82\x06\xdc\xc3\xdd\xe6\xba\x0f\xf5\x57\xe0\x1c\xf6\xe0\x56\x7b\xec\xb6\x64\x5b\x13\xdc\x36\x24\xac\x05\x11\xa1\xed\x60\x16\xdd\xa1\x2c\x08\x73\x35\x9f\x6d\x0f\xf9\x69\x31\xf9\x68\xab\xf9\x65\x41\xa0\x1b\xf3\xcf\xb6\x75\x28\x4b\x88\xba\x79\xf1\xbb\xdf\xfe\x76\x5b\x4f\xb3\xcd\x3d\xcb\xc2\x5b\xba\xbd\xa7\xd9\x03\x12\xc9\xc2\x89\x63\xeb\x89\x60\x51\x14\x6b\x43\x4f\xb3\xc4\xc4\xaf\xc7\x69\x5a\x16\xe5\xac\x48\xa8\x8a\xe0\x6a\x1d\x44\x6d\xca\x50\x2d\x84\xad\x15\x0e\x22\x58\x5e\xaf\x02\x42\x4c\x5d\x83\x08\x07\x2a\xd4\x3d\xd8\x6b\x35\x83\x84\x1a\x06\xbd\xca\x04\x41\xc0\x43\x95\x0b\xb6\xd6\x23\x88\x57\xe9\x00\x56\x54\x15\x82\x20\xcc\xe8\x06\x4a\xd1\xf1\xcc\x51\x15\x07\xfa\x75\x04\xe2\x74\x87\x98\xec\xba\xc7\x6d\xca\x37\x50\x49\xc0\x57\x07\x88\x50\xd9\x62\xeb\x07\x24\xa5\x1a\xc5\xa7\x19\xc5\x55\x08\x88\x4c\x44\x4a\x4b\x42\x8a\xae\x01\xb0\x97\xcc\xff\xc4\xec\x95\xf8\x2c\xff\x24\xd1\x27\x0a\x22\x09\x64\xf4\xef\x20\xf1\xe0\x48\x95\x7b\x22\xc1\xbe\x48\x92\x7e\x22\x81\x0e\xe6\xe0\xaf\xca\x40\xb1\xeb\xdf\x9c\x79\xbf\x25\x93\x3e\x12\x68\x2f\xdf\x3e\x20\xf6\x44\x82\x1c\x6c\xe8\xba\x2a\xfc\x44\xc2\x8c\x69\xeb\xda\xe2\x6c\x24\xd0\xf8\x0c\xf9\xf4\x8c\x94\xd4\x6c\xf8\xf8\x4c\x94\xa8\xcc\xf7\xc4\x32\xac\xdb\xf3\xdd\xd7\xf3\xd7\x23\x41\xbe\xdd\xc0\x2e\xb7\x67\xad\xc7\x9e\x58\x5b\xaa\x67\xa7\x5c\xf5\x68\x32\x1a\x9b\xdb\x1c\x9f\xd1\xec\x3b\xad\x04\x27\x9a\x96\xc8\x9c\xea\x19\x48\x36\xb5\xf4\xec\xd4\xd6\x92\xe0\xce\x13\x23\x71\x7d\xb7\x83\x18\xed\xad\x51\x4f\x61\x4b\x20\xd1\xe6\x15\x04\x2d\x07\x79\x7e\xff\x94\xf1\x8d\x6f\x6f\x56\x5c\xd4\xfe\x67\xa7\x29\x58\xef\xf3\xb0\x8b\xfa\xd1\x3d\xd3\xcf\x8e\xe0\xd4\x48\xde\x98\x24\xcf\x6e\x24\xef\xb3\xd7\x72\x78\xe9\x4f\xe1\xb5\x54\xbd\x1a\xb2\xce\xde\x09\xd4\x26\xca\x71\x29\x27\xb6\xc3\x0f\x12\x6d\x7f\x97\xcf\xae\xaf\x48\x56\x33\x48\x40\xa7\x85\x1a\x93\x1d\x2a\x1f\x39\xff\x90\x95\xfa\x9c\xc4\x45\xb5\x66\x65\xa5\x63\x11\xe8\xd9\x69\xb9\x75\xfc\x34\x9c\x96\x3b\x7a\x3a\x3e\xfa\xd7\x9c\xbd\x68\xde\x94\x54\x8c\xcc\x2d\x07\xf7\xa5\x75\x83\xc4\xb9\x3a\x56\x98\xd4\x98\xb8\x5c\x24\xd8\x6d\x30\x9c\x42\x4a\x64\x23\xf8\x8f\x11\x8a\x99\xaf\x23\xe8\x45\x80\x47\x70\x0c\x01\xdc\x1d\xf7\x0c\x9b\x30\xad\x50\x87\x4c\x56\xd1\x3b\x66\x99\xb9\x5d\xa8\xdf\x3f\x47\x08\x3a\x9d\x9e\xba\x56\xb0\x18\xd0\x28\x42\x5d\x43\x22\x73\x0b\xa5\xaf\x8f\xa1\x42\x46\x8b\x42\xde\x47\x98\xc6\xe7\xac\x27\x40\x18\xbc\x30\x6b\xb5\xb5\x0c\x26\x8c\x94\xbc\xae\x65\x6d\x1d\x5a\x11\x66\xd5\x16\x5d\x20\x68\xc7\xe8\x85\xac\x46\x35\xa8\xb6\x31\x1c\x37\x4c\x77\xb6\x3b\x46\x00\xa4\x02\x13\xd3\xcc\x7f\xbb\x80\x5c\xec\xe2\x67\xe9\xe4\x84\xcd\xe9\x82\xcb\xa6\x06\xe8\x31\x20\x0f\xec\xab\x86\x75\x93\xa5\x6c\xbc\x03\xa0\x81\x1c\x15\xbf\xbb\x2a\x79\xe1\x63\xf2\xae\x7d\x19\x54\xd9\x5c\x3a\xcb\xe5\x88\x7d\xe2\x4a\xa7\xef\xa5\x3b\x62\xd7\xee\x62\x1f\x37\x66\xa1\x2a\xc3\xc0\x3f\x06\x73\x11\xfb\xf7\xa4\xfb\x56\x5f\x9c\x5d\xdc\xc0\x9f\x1e\x22\xcc\xda\x1a\x1c\x0a\x45\x38\x9b\x24\xf4\x70\x81\x36\x2e\xd4\x12\xe7\x1d\xe8\x62\xf6\x2c\x1b\xff\x54\x64\x63\x1f\xd8\x51\xf0\x6c\x79\x75\x91\x26\x25\xfa\x80\x0e\xf3\x32\xf9\x9a\x2a\x96\x93\xb7\x54\xd0\x19\x1a\x22\x8e\x6e\xae\xbf\x7e\x1b\xee\xc8\x51\xd5\x12\x8c\x2a\x57\x17\x1b\x42\x03\x3c\x6b\xc5\x8f\xbc\xdb\x57\xe2\xed\xda\xda\x93\xe5\x87\x3d\xaf\x7e\x6f\x29\xc5\xc4\xf3\xf8\x98\x36\x74\xeb\xa5\x57\x30\x4c\xc3\x55\x86\x52\xab\x04\x6b\x51\xe6\x77\xbb\x4f\x93\x0b\xa5\x69\x51\x5c\x17\x54\x9c\x55\x55\x2d\x17\x9b\x2c\x41\xfd\x82\x62\xf6\x31\x27\xa4\x61\x04\xa4\xfb\xb1\xc2\xcd\x87\xe8\x2b\x41\xae\x5a\xe8\x9b\xb6\xf2\x4a\x7b\x13\x90\x14\x20\x6c\x1f\x9c\x35\x5a\x96\x54\xf3\xec\x80\xc8\x9a\x1c\xbc\xa5\xa2\xa1\xc5\x86\x08\xe6\x81\x25\x6d\x16\xf7\x07\x5e\xd8\xd6\xfa\x20\xf8\xca\x80\xcc\x36\xf4\xae\xa6\xb5\xa1\x62\xe7\x37\x1f\xa3\xdf\x53\x9a\xea\x66\x85\x76\x6f\xe5\x22\x9b\xf9\xc6\x88\x14\x54\xe9\x0f\x55\x4e\x57\x9d\xa1\xdb\x99\x43\x46\x35\x2d\xe4\xec\xaf\x8c\x16\x9b\x30\xb7\x87\x17\xe7\xdd\x67\x9d\x31\x14\x51\xe4\xa6\x99\xf8\x07\x0f\x15\x31\x0a\xd1\xf6\x7a\x50\x35\x2b\xd8\x82\x0a\xed\x00\xde\x60\x4f\x93\x43\xbb\x07\x63\x83\x35\xbc\x75\xd6\xe4\x4c\xb3\xba\xe4\xa2\xff\x95\x1b\x78\xf6\x5c\x8a\x9c\xeb\x2d\xe1\x2b\x60\x4c\x46\x18\xfd\x2f\x6d\x43\xb6\xcd\x0e\xca\xad\x2e\xc9\x3e\x6d\xea\xcc\xad\xbf\x51\xf8\xd8\xc4\x4a\xec\x73\xfc\x51\x4e\xb7\xf8\x24\x7b\x33\x5d\xdb\x5b\x72\x27\xe4\xbd\xc2\x2a\x8b\x9b\xee\x5b\x40\xee\x18\x92\x37\x46\x0e\x17\xf0\xd3\x9b\xb3\x36\x46\x76\xfe\x9b\x6c\x30\xdb\xd1\x0f\x47\x48\x42\x59\xfd\xfc\x36\x3a\xba\x09\x27\xfd\x4b\x58\x88\xc2\x47\x4b\xa0\x27\xb8\xf7\xd0\x36\x8a\x1f\x21\xb2\xc5\xc8\x58\x71\xdd\x5f\xfb\xf4\xb6\xed\x0a\xba\x66\x8e\x08\xca\x98\x01\xd6\x14\xd5\x1c\xb5\x6f\x16\xb9\xb2\x81\xf3\xb5\x55\xb6\x28\xa9\x38\xc3\x02\x8b\x54\xd8\x0d\x02\xae\xc2\xe8\xb0\x0c\x8d\x2f\x18\xae\x66\x54\x71\x78\xef\xc4\xc6\x26\xa1\xb3\xc3\xc6\xef\x39\xb7\x0a\xc5\x22\x80\x83\x30\xff\xfd\xe6\xdb\x77\xa7\x7f\x91\x36\x38\xc6\x16\x50\x31\x74\x03\x24\x80\x13\xa2\x9a\x6c\x4e\xa8\x32\x4b\x32\x88\x6e\xa8\x04\x1b\x97\x54\xf0\x29\x53\x7a\xec\x3b\x69\xa9\xef\x7f\xf3\xc3\x30\xeb\x7f\x2d\x6b\x62\xf3\xcc\x4e\x5c\x65\x3a\xbb\xf6\x16\xbb\xb8\xc2\x0d\xf2\x70\x07\x41\x7a\x0b\x43\x25\x73\xbb\x11\xf7\xb0\x01\x9a\xde\x19\xfe\x88\x1b\xd0\x30\x70\x26\xbe\x22\x07\x46\xf4\xec\x4c\xf9\xbf\x0d\xdb\xfb\x9f\xe1\xe2\x0c\x47\xf7\x20\x38\x1c\x98\x47\x0f\x70\xa2\x3e\xf7\xa1\x1b\x3a\xeb\xa1\x82\xec\x31\x08\x52\xd7\x7c\x36\x63\x20\x3c\xcf\x19\x81\xa2\x0b\xc7\xb6\x5a\x9f\x90\x1d\x40\x2e\x7a\x28\xce\x70\xb0\xba\xb8\xef\x7f\xf3\xc3\x01\x39\x6a\xa1\x81\x2c\xca\x45\xce\x3e\x91\xdf\xa0\x8b\x86\x2b\xb3\x6f\xc7\xc3\xa7\x06\x36\x06\xb5\x14\x9a\x7e\x32\x73\xc9\xe6\x52\x31\x81\x66\x20\x2d\xc9\x9c\x2e\x18\x51\xb2\x64\xe4\x9e\x15\xc5\xc8\x3a\xa5\xc8\x70\x1a\x1b\xe0\xb1\x3b\x72\x28\x16\x45\x2a\x5a\xeb\xde\x75\x18\x5b\xbb\x1d\xcc\xd2\xa0\xde\x6c\x58\x89\xb6\x21\x43\x53\x2e\xac\x47\xde\xc6\x15\x18\x9c\x86\x42\x20\x88\x68\x5a\x92\x6c\x4e\xc5\x8c\x59\x27\xd5\xb0\x62\xd7\xe8\xa6\x66\x83\x4e\xe0\x28\x8a\x71\xc7\x45\x42\x81\x9c\x6f\xb8\x58\x8d\x51\xdb\x6c\x43\x9d\x71\xed\xd2\x35\x6d\x82\x82\x5e\x9e\x9a\xf3\xae\xf9\xa4\xd1\xb2\x56\xa7\x39\x5b\xb0\xe2\x54\xf1\xd9\x88\xd6\xd9\x9c\x6b\x96\x99\x05\x9d\xd2\x8a\x8f\x32\x29\x0c\xde\x41\x55\xb3\x32\xff\x85\x59\x87\x1a\x99\x89\x0e\x76\x8a\x8b\x5a\x6e\xc8\x74\xfc\x59\x4d\xc6\x7b\x59\x5d\xd0\xe6\xb8\xbe\x44\xb4\xdf\x3d\xc1\x3a\xc1\x18\x75\xfa\xe0\x65\xba\x46\x64\xa9\x9c\xf7\xd0\xf6\xeb\xcb\x56\x21\x98\xab\x87\x55\xd9\xe0\x66\x7a\x8a\x1f\xba\xd5\x25\xcd\x91\x5d\x50\xb1\x7c\xf4\x6b\x60\x36\x1a\xda\x68\x66\xcb\x11\x80\x90\xc5\x88\x8a\xdc\xfc\x37\x66\x16\x67\xcb\x07\xef\x6c\xc3\x13\x88\xc1\x87\xab\x8b\xa7\xb9\x1c\x0d\x7f\xe0\xcd\xb7\x52\x6c\x94\x88\x89\x62\x3c\x84\x86\xea\xba\x61\x4e\x18\xe8\x0b\xea\x5c\x39\x98\xff\x67\xbb\x2c\x06\x3e\x4d\x5f\x95\x7a\x58\x10\x1d\xf2\x34\x76\xe4\xec\xa8\x15\xbc\x69\x9f\xef\x5a\x46\x21\x2e\x97\x2a\x6d\x0b\xf1\xba\xca\x55\xbd\x85\xe1\xe2\xb7\x2e\x09\xd9\xd3\x36\x56\x1f\x81\x61\x2e\xb6\xc8\x4c\x6e\xb4\xa1\xfe\x69\xe6\x15\xbc\x90\x72\xea\x1f\x44\x15\xa0\xe0\xca\x57\xa0\x35\x6a\xa0\xd2\x84\x2e\x28\x2f\xc0\xcf\x24\x27\x8a\xd5\x0b\xba\x4d\x71\xc4\x22\xf6\x74\x55\xab\xb5\x3d\x6b\x51\xdc\x7c\x74\x1d\xd2\xad\x67\xfd\xc4\xfa\x8b\xd9\xb8\xb1\xdd\x05\x62\x5e\xd1\xca\x5a\xb6\xac\xe1\x81\x1a\x24\x2a\xf0\x1b\xff\xb4\xa5\x08\x5a\x48\xa5\x32\xf8\xf9\x57\x46\x6b\x3d\x61\x54\xdf\xf2\xed\xbc\x7a\x0d\xe1\x7b\x6f\x39\x53\x56\x8b\xee\xf7\x8c\xcc\xa4\x36\x22\x5c\x03\x37\x63\x2b\x8a\x83\x5c\x8e\x65\x2e\x3d\x32\x3e\x1e\xbe\xb7\xab\xbe\xad\x29\x64\x1a\x4b\x91\xb4\xec\xfe\x6b\xeb\xeb\xb6\xd2\xff\xe0\x3a\x8c\xd0\x0f\x50\xa0\x88\x1a\x58\xee\xf0\x64\xd1\xe7\x35\x94\x31\xb2\xb7\x2d\x28\x99\x52\x03\xa5\xd3\xfa\x01\xe0\xf8\x2c\x5e\xfc\x15\x97\x72\xe9\xfe\x86\xb9\xa4\x43\xbc\x2e\x67\x9a\xf2\xc2\x5a\x57\xec\x96\xf9\xdd\x1c\xa6\xd6\x03\x0b\xae\x19\x55\xdb\x45\x92\xd5\x2a\xc1\x4a\x0a\x5c\x86\x14\x6c\x74\x2f\xeb\x9c\x9c\xd3\x92\x15\xe7\x54\x31\x0b\xa9\x5b\x74\x00\x4f\xf1\x70\xbb\x3f\x75\x5f\x8b\xd8\x64\x9d\xdc\xb2\x08\x34\xcc\x39\xc4\xb3\x78\xd3\xaa\x9d\x38\xe5\x13\x67\x0e\xbe\xad\x9b\x81\x9e\x53\xaf\x0d\xc7\x3c\x21\x1f\xc4\x9d\x90\xf7\xbb\xcf\x5e\x0f\x78\xbc\xfa\x21\xa8\xcb\xca\x5f\x19\x57\x20\xb2\x67\x7e\xf3\x0b\xd8\x61\x2e\x96\x7d\x6c\x34\x0a\xf7\x59\x99\x7f\xd0\xcd\xc5\xfc\xe7\x9a\x29\xd0\x28\xc4\xb5\x9c\xd5\x4c\xa9\xcd\x0b\xdf\x54\x32\x3d\xce\x51\xf0\x17\x26\x6c\x3d\x82\xc0\x54\xaf\x36\xbd\xe3\x66\xed\xf8\xe5\xac\xfd\xcb\xd6\x5e\x56\xf6\xe3\x55\xb1\x41\xe4\x19\x8a\x58\xee\x4c\x7a\xa3\xc9\x70\xdb\x6c\x37\x9b\x0a\x3b\xfc\xb5\xf3\xec\xa6\xad\x35\xc2\xd2\x90\x05\xdc\xad\xfd\xfc\xe6\xe3\xb6\x43\xd8\xc2\x63\x87\x39\x62\xc8\xbc\xf8\x30\xc3\x62\xe0\x26\x05\x8c\x89\xbb\x9b\x11\xb7\x47\xb0\xec\x62\x40\x74\x46\xc2\x6d\xfc\xe7\xf1\x4c\x87\xbb\x19\x0d\x87\xc3\x2e\x1e\xc7\x5c\xb8\x9b\xa1\xb0\x35\x06\x6e\x23\x7f\x69\x26\xc2\x8d\x66\xc0\x6d\x33\x8e\x31\x0e\x6e\x36\x00\x6e\x81\x18\x36\x0b\x6e\x35\xfd\x6d\xc7\xd6\xad\x06\xc1\x80\xd1\x6f\x0b\xc4\x6d\xa6\xc0\x61\x73\x5f\xe0\x1e\x6f\x37\xf1\xfd\x14\x8c\x7b\x81\xc5\x6d\x37\xe8\x7d\x81\xa6\xbc\x88\xb5\x0c\x98\xef\xbe\x50\xc3\x5d\x60\x51\x51\xc6\xba\x47\x31\xd3\xfd\x64\x0c\x74\x81\x1d\xdc\x6a\x94\xfb\xe2\xcc\x71\x61\x71\x93\xe5\x61\x81\xf8\xaa\xf3\x68\x57\x24\xb6\x42\x16\x04\x78\xd9\x27\x5c\x38\x59\x57\x1c\xdb\x45\x0a\x36\x82\x68\x60\x56\x87\x76\x5a\xd1\x72\xa4\x13\x84\x37\x72\x4f\xa7\xd5\xf5\x26\x4e\x2e\x2e\xaf\xdf\x5f\x9e\x9f\xdd\x5e\x5e\xac\x4a\xaf\xeb\xfb\x3d\x28\x55\x6e\xb7\xdb\x8c\x3a\x32\xe5\x86\x3f\x1a\x42\xbc\xe1\x67\xb1\x29\x42\x76\x44\x9a\x66\x83\xff\xf6\x61\x12\xed\xce\xbc\x6c\x67\x3e\x11\xba\x7d\x71\xd7\xcf\xdc\x3e\xc0\x0c\x8c\x99\x34\xd2\xd3\x5c\x16\xb9\xb2\xf1\xe8\xe4\xea\xc2\x67\xd6\x72\x91\x15\x4d\xbe\xdd\x34\xf1\xe1\xc3\xd5\x85\x1a\x13\xf2\x35\xcb\x68\xa3\xc0\x76\x95\x4b\x71\xa8\xc9\xb7\xef\xde\xfc\x07\xe4\x85\xc0\x13\x56\x48\xe4\xb6\xe3\x06\xa7\x03\xed\x44\x70\x75\x00\x13\x05\x1b\x98\x65\x46\x2b\x43\xcb\x14\xf6\x90\xd4\x20\xa5\xcc\x59\x51\x19\xba\x79\xc7\x88\xef\x70\xb0\x6d\x9e\x57\x17\x0a\xde\xc1\x08\x7c\x1b\x5e\x3c\x63\x1a\x73\x6f\xb7\x47\x08\x0f\xec\xf8\xa0\xad\xfb\x01\x56\xee\xee\x3d\xdb\x30\x27\x6b\xb7\xb8\xa7\xca\xda\x07\x37\xcc\x7c\x10\x4f\x42\x56\xae\x6d\x66\xa1\x2d\x06\x21\x24\xe2\xf0\xaf\x35\x43\x80\x99\x64\x6b\xe3\xd9\x48\x5d\xb4\x84\x9c\xcd\x28\x0b\xf6\xb6\x90\xb6\x4d\xbd\xd2\xd6\x2c\x3f\x6c\x75\xeb\x7b\x9f\xf4\x15\x37\x87\x36\x7f\x6d\x16\xd0\x1e\x33\x7f\x05\xde\x17\xfc\x01\xe3\x40\xbb\xbf\x34\x13\x27\x1a\x78\x22\x63\x6d\x56\xe4\xbf\xff\xe7\xab\xff\x3f\x00\x00\xff\xff\xb6\x57\x7d\x80\x3a\xfc\x01\x00") +var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\xe3\xb8\xb1\xe8\xf7\xfd\x15\x28\x27\x55\xb6\x73\x24\x79\x26\x67\x4f\x92\xeb\x93\x4a\xca\x63\x7b\x12\x9d\x9d\xf1\xf8\x8c\x3c\xb3\x95\xbb\xc9\x4d\x20\x12\x92\xb0\x26\x01\x2e\x00\xca\xa3\x3c\xfe\xfb\x2d\x74\x03\x20\x48\xbd\x48\x59\x7e\xec\xc6\xfc\xb0\x3b\xa6\x00\x10\x68\x34\xba\x1b\xfd\xa4\x05\xff\xcc\x94\xe6\x52\x9c\x12\x5a\x70\xf6\xc5\x30\x61\xff\xd2\x83\xdb\xdf\xe8\x01\x97\x27\xf3\xd7\x5f\xdd\x72\x91\x9e\x92\xf3\x52\x1b\x99\x7f\x64\x5a\x96\x2a\x61\x17\x6c\xc2\x05\x37\x5c\x8a\xaf\x72\x66\x68\x4a\x0d\x3d\xfd\x8a\x10\x2a\x84\x34\xd4\xbe\xd6\xf6\x4f\x42\x12\x29\x8c\x92\x59\xc6\x54\x7f\xca\xc4\xe0\xb6\x1c\xb3\x71\xc9\xb3\x94\x29\x18\xdc\x7f\x7a\xfe\x6a\xf0\xf5\xe0\xf5\x57\x84\x24\x8a\x41\xf7\x1b\x9e\x33\x6d\x68\x5e\x9c\x12\x51\x66\xd9\x57\x84\x08\x9a\xb3\x53\xa2\xcb\xb1\x4e\x14\x2f\xe0\x13\x03\x59\x30\x45\x8d\x54\x7a\x90\x48\xc5\xa4\xfd\x5f\xfe\x95\x2e\x58\x62\x3f\x3e\x55\xb2\x2c\x4e\xc9\xca\x36\x38\x9c\x9f\x23\x35\x6c\x2a\x15\xf7\x7f\x13\xd2\x27\x32\xcb\xe1\xdf\xb8\xf6\x51\xf4\x55\x78\x9d\x71\x6d\xbe\x59\xfa\xe9\x1d\xd7\x06\x7e\x2e\xb2\x52\xd1\xac\x31\x5b\xf8\x45\xcf\xa4\x32\x57\xd5\xb7\xed\xb7\x74\x39\x8e\xff\xed\x1a\x72\x31\x2d\x33\xaa\xea\x83\x7c\x45\x88\x4e\x64\xc1\x4e\x09\x8c\x51\xd0\x84\xa5\x5f\x11\xe2\xe0\xe8\xc6\xec\x13\x9a\xa6\xb0\x37\x34\xbb\x56\x5c\x18\xa6\xce\x65\x56\xe6\x22\x7c\xd3\xb6\x49\x59\x18\xf5\x94\xdc\xcc\x18\x29\x68\x72\x4b\xa7\xcc\x7f\x6f\xcc\x52\x62\x64\xe8\x40\xc8\xf7\x5a\x8a\x6b\x6a\x66\xa7\x64\x60\x41\x3c\xb0\x10\x8c\x7e\xc6\xfd\xb9\xc6\x41\xa2\xf7\x66\x61\xa7\xab\x8d\xe2\x62\xba\xe9\xf3\x09\x35\x34\x93\x53\x82\xf8\x45\x26\x52\x11\x33\x63\xc4\x7e\x8a\x4f\x38\x4b\xfd\xfc\x36\xcc\x08\xbb\x2e\xcd\x69\xd4\x7c\xdd\x7a\x4a\x33\x2a\x04\xcb\x88\x9c\x90\xb2\x48\xa9\x61\x9a\x18\x59\xc1\x67\x33\x78\x5c\xe7\xa5\xd9\x9c\x2f\xbd\x5f\x31\x1d\x6c\x3a\x7f\x4d\xb3\x62\x46\x5f\xbb\x97\x3a\x99\xb1\x9c\x56\x7b\x28\x0b\x26\xce\xae\x87\x9f\xff\x73\xd4\xf8\x81\xd4\x97\x12\xa3\x28\xb9\x65\xac\xd0\xd5\xa1\x20\x65\x61\xd7\x64\x17\x47\xc6\x0b\x62\x14\x4d\x6e\xb9\x98\xc2\xd2\xa7\xb8\xde\x73\xdc\x18\x3d\x58\x9a\xb2\x1c\x7f\xcf\x12\x13\xbd\x56\xec\x87\x92\x2b\x96\xc6\x53\xb1\x90\xf5\x24\xa2\xf1\xda\xc2\x29\x7a\x55\x28\x3b\x2d\x13\x9d\x43\x7c\x22\x1a\x55\x7b\xdf\x58\xe6\xa1\x85\x05\xb6\x23\xa9\x25\x4f\x76\xfa\x33\xe6\x0f\x07\x4b\x1d\x00\xed\x76\x9a\x19\xd7\x44\xb1\x42\x31\xcd\x04\x12\x2c\xfb\x9a\x0a\xb7\xa6\x01\x19\x31\x65\x3b\xda\x03\x5b\x66\xa9\xa5\x63\x73\xa6\x0c\x51\x2c\x91\x53\xc1\xff\x1e\x46\x03\x10\xd9\xcf\x64\x16\x3f\x0c\x81\xe3\x26\x68\x46\xe6\x34\x2b\x59\x8f\x50\x91\x92\x9c\x2e\x88\x62\x76\x5c\x52\x8a\x68\x04\x68\xa2\x07\xe4\xbd\x54\x8c\x70\x31\x91\xa7\x64\x66\x4c\xa1\x4f\x4f\x4e\xa6\xdc\x78\x0a\x9c\xc8\x3c\x2f\x05\x37\x8b\x13\x20\xa6\x7c\x5c\xda\x8d\x3b\x49\xd9\x9c\x65\x27\x9a\x4f\xfb\x54\x25\x33\x6e\x58\x62\x4a\xc5\x4e\x68\xc1\xfb\x30\x59\x81\x24\x32\x4f\x7f\xa6\x1c\xcd\xd6\x87\x0d\xf0\xad\x3c\x07\xc4\x53\xbd\x8d\xb0\xb6\xc4\x8f\x70\x4d\xa8\xeb\x8e\x6b\xa9\x40\x6a\x5f\x59\xa8\x7c\xbc\x1c\xdd\x10\x3f\x01\x04\x3b\x42\xb8\x6a\xaa\x2b\x60\x5b\x40\x71\x31\x61\x0a\x5b\x4e\x94\xcc\x61\x14\x26\xd2\x42\x72\x61\xe0\x8f\x24\xe3\x4c\x18\x7b\x0c\x73\x6e\x34\xe0\x1c\xd3\xc6\xee\xc3\x80\x9c\x03\x03\x22\x63\xe6\x0e\x6c\x3a\x20\x43\x41\xce\x69\xce\xb2\x73\xaa\xd9\x83\x83\xda\x42\x54\xf7\x2d\xf8\xda\x03\x3b\xe6\x9f\xcb\x1d\x96\xce\x18\x21\x9e\xc1\xad\xdd\x9d\xf8\xc0\x8f\x0a\x96\x84\xe3\x40\x05\x39\x2b\x8a\x8c\x27\x88\xf1\x66\x46\x0d\x49\xa8\xb0\xf0\xe2\x42\x1b\x9a\x65\xc0\x4e\x5a\xcd\x62\xdd\x69\x27\x70\xb4\x1b\xcc\xc1\xbf\x5e\xa2\xd0\xf5\x1f\x02\x53\x6b\xb4\x58\x47\x19\xec\xe3\xe8\xec\xf2\x0f\x1b\x40\x4e\x50\x32\x99\xf0\xe9\xaa\x6e\x6b\x61\x79\x0e\x5d\x40\xa6\xa1\x5c\x68\x37\x44\xa9\x10\x9a\x15\xa7\xb2\xbc\x8b\xd6\xf8\xf6\x60\xed\xec\x56\x42\x76\xdb\x9a\xed\xc3\xc4\x7c\xf5\x0f\x8d\x05\x5c\x8a\x39\x1e\x54\x2b\xb3\x58\x22\xc7\xc4\x9c\x2b\x29\x72\x7b\x88\xe6\x54\x71\x3a\xce\x1c\x63\x63\x96\x7c\xe1\x19\xc3\x25\x32\xb5\xea\x48\xad\xf9\x2a\xae\x87\x2a\x45\x17\x6b\x5a\x70\xc3\xf2\x35\xab\x59\x35\xed\xcf\x54\x45\x54\xc2\x22\xef\xaa\xa9\x13\xd7\xc0\x4e\x9d\x92\xf3\x30\xf1\xb5\x9f\xd9\x02\x77\x7c\xd6\xe3\x76\xf5\xac\xc1\x72\xff\x6c\xdb\x40\x7c\x80\xd3\x6f\xf8\xbd\x01\x16\x7b\x42\x90\x81\xb1\x95\xd0\x18\x90\xf7\xa5\x86\xdd\xa2\xe4\xfc\xaf\xc3\x8b\xcb\xab\x9b\xe1\xdb\xe1\xe5\xc7\xf5\xe0\x20\xdb\x0e\x4a\xf5\x00\x8d\xef\x30\xd9\xc3\xcf\x7e\x8f\x14\x9b\x30\xc5\x44\xc2\x34\xf9\xf9\xd1\xe7\xb3\x8f\x7f\xbd\x3a\x7b\x7f\x79\x4c\xa8\x62\x84\x7d\x29\xa8\x48\x59\x4a\x4a\xed\x99\x46\xa1\xd8\x9c\xcb\x52\x3b\xba\x95\xae\x41\xd9\x26\xae\x02\xaf\xa5\x62\x41\x34\x53\x73\x9e\xac\x06\x90\x1e\x90\xe1\x84\xd0\x0a\x7d\x92\x80\xdf\x96\x4d\x65\x73\x96\xf6\x60\xd8\x30\x65\xff\x1d\x2e\x8a\xd2\x78\x76\x77\xc7\xb3\x0c\xce\x84\x40\x49\x29\x1d\x80\xc4\x18\x2f\x4e\x2f\x84\xa1\x5f\x3c\x7d\x65\x3a\xa1\x05\x4b\xc9\x1d\x37\x33\x42\x49\x2a\x4b\xfb\xf1\x9f\xff\xbc\x47\x38\x3b\x25\x3f\x8f\x3a\x0e\xc8\xa5\x6b\x1b\x41\x0d\xbe\x27\xd8\x9c\x29\x18\xcc\xc1\xac\x47\x14\x9b\x52\x95\x66\x4c\x6b\x8b\x15\x77\x33\x66\x66\x0c\x05\xe7\xb0\x40\xf6\x85\x5b\xf6\x28\x15\x11\xd2\x0c\xc8\x05\x9b\xd0\x32\x03\x7e\x49\x0e\x0e\x06\x4d\x36\xb5\x3b\x62\xbc\x55\x32\xef\x80\x1c\xa3\xba\x9c\xbf\x6a\xaf\x0e\x35\x8e\x5c\x23\x42\x9a\xa5\x84\x4f\x9c\xbc\xc1\xb5\x5d\x14\x61\x79\x61\x16\x6d\x50\x7c\xcb\xa9\x27\xad\x8f\x2d\x09\x1c\xe4\x3d\x2d\xbe\x61\x8b\x8f\x6c\xb2\xad\x79\x73\xfd\x2c\x63\x89\x25\x6b\xe4\x96\x2d\x40\xf8\x24\xe7\x7e\xc0\xcd\x4b\xe9\xb4\x1c\xd2\x92\x98\xf9\xa7\x6f\xa7\xb3\xb5\x5d\x7b\x20\xd9\xe7\x96\x2d\xda\x34\x23\xcb\x37\x30\x0b\x1a\xe0\x4c\x16\x56\xdb\xa1\x42\xda\xa3\xac\x7f\xb6\xd3\xdf\x95\x93\x3b\x8c\x09\xb1\x3b\xa7\x66\xa5\x78\x79\x5b\x8e\x99\x12\xcc\x30\x90\x30\x53\x99\x68\x2b\x5c\x26\xac\x30\xfa\x44\xce\x2d\xa5\x62\x77\x27\x77\x52\xd9\x6b\x57\xdf\x52\x87\x3e\xee\xaa\x3e\x01\x15\xc5\xc9\xcf\xe0\x7f\xe4\xe6\xc3\xc5\x87\x53\x72\x96\xa6\x44\xc2\x11\x2f\x35\x9b\x94\x19\x99\x70\x96\xa5\x7a\x10\xdd\x91\x7a\x20\xbd\xf7\x48\xc9\xd3\xdf\x6f\x3e\xdc\x3b\x42\x4c\x16\xa8\x5a\xd8\x01\x6a\x23\x10\x91\x16\x35\x3a\x15\x90\xde\x52\x28\x2b\xd0\xdb\x3d\xcf\x1d\x13\x73\x0c\xa0\xc3\x32\xc6\x52\x66\x8c\x8a\x2d\x3d\x00\x6c\xdd\xcf\xec\x61\x75\x68\x61\x04\x8f\x00\x85\x4c\x4f\x89\x2e\x8b\x42\x2a\xa3\x83\x40\x0f\x1a\x92\x5e\xfd\x4f\x90\x6e\x7b\xe4\x6f\xe1\x65\x46\xc7\x2c\xd3\xdf\x1d\x1e\xfe\xf6\x9b\xcb\x3f\xfd\xee\xf0\xf0\x2f\x7f\x8b\x7f\x8d\xf4\x69\xf5\x26\xa8\x81\x91\x29\x88\xcc\xee\x4f\xc7\xf6\xce\x92\x44\x96\xc2\xb8\x1f\x0c\x35\xa5\x1e\xcc\xa4\x36\xc3\xeb\xf0\x67\x21\xd3\xe6\x5f\x7a\x0b\x27\x20\x0f\x4b\x74\x00\x9c\xd7\xd4\xcc\xf6\x4c\x7a\xd6\xeb\x0e\x56\x3f\xb5\xed\xf6\xda\x04\xb7\xcb\x4e\x7d\x60\xff\xf9\xd6\x4f\xd7\x72\xa0\x3b\xc5\x8d\x61\x02\xe4\x04\xa6\x72\xcb\x89\x7b\x16\x73\x2b\x36\x3b\x7f\x7d\xf0\x20\xc4\x2b\x40\x6d\x87\xc5\xc1\xec\xdd\xca\x10\x99\x03\xa1\xf5\x12\x4f\x75\xa3\x39\xbb\x1e\x7a\x3d\xca\xde\x17\xe2\xb5\x03\x6f\xef\x7d\x26\x83\x9e\xc1\x2d\x2b\x48\x86\xa7\x44\x8a\x6c\x11\x7e\xd7\x24\xe3\xa0\x3b\xb0\x02\x63\xd0\x1f\x1c\xe1\xcb\x41\x52\x94\x3d\xd7\x60\x90\xb3\x5c\xaa\x45\xf8\x93\x15\x33\x96\x33\x45\xb3\xbe\x36\x52\xd1\x29\xeb\x85\xee\xd8\x2d\xfc\x85\x1d\x6b\x1f\x58\xee\x8d\x02\x70\x52\x2a\xcb\x3c\xb2\x85\xa7\x20\x2c\x7d\xda\xb3\xe8\xc1\xb4\xe7\xa3\x18\x76\xe3\x6a\x47\x96\x1b\xee\x76\x4e\x3d\xea\x57\x05\x32\xe4\x5c\x66\x65\xce\x74\x2f\xb0\x27\x78\xcb\xc4\xdc\x4a\x93\x4b\xca\x98\xd5\x4f\xc7\xd3\x97\xf2\x39\xd7\x52\xed\xcc\x07\xb9\x53\x50\xca\xd2\xd8\x9b\xc5\x44\xaa\x9c\x9a\x70\xb9\xfb\x52\x48\x0d\x77\x00\x87\xb3\x0d\x92\xf2\xfa\xa0\xd5\x67\x0b\x6a\x0c\x53\xe2\x94\xfc\xbf\xa3\x3f\xff\xc7\x3f\xfb\xc7\xbf\x3f\x3a\xfa\xee\x55\xff\xff\xfc\xe5\x3f\x8e\xfe\x3c\x80\x7f\xfc\xe2\xf8\xf7\xc7\xff\xf4\x7f\xfc\xc7\xf1\xf1\xd1\xd1\x77\xdf\xbc\xff\xc3\xcd\xf5\xe5\x5f\xf8\xf1\x3f\xbf\x13\x65\x7e\x8b\x7f\xfd\xf3\xe8\x3b\x76\xf9\x97\x96\x83\x1c\x1f\xff\xfe\xe7\xad\xa6\x47\xc5\xe2\x43\x8b\x03\x8f\x4f\xdf\x6d\x10\x17\x86\x4d\x99\xea\xd8\xab\xf5\xb6\x12\xf2\xa5\x5f\x09\x6d\x7d\x2e\x4c\x5f\xaa\x3e\x76\x3f\x25\x46\x95\xdb\x0f\x46\x45\xd4\x76\xc1\xf3\x8f\xfe\xb4\x46\x8a\x53\x4f\x9a\xf7\x8e\xc8\x9a\x25\x8a\x99\x7d\xdd\x60\x70\x34\xcf\x3f\x0a\x99\x1e\x6a\x22\xd6\x28\xf5\xd6\x4d\xfb\xdf\xe2\x52\xe3\x45\x0a\x84\x57\xc5\x79\x27\x4a\xe6\x03\x12\x29\x71\xe6\x34\xe3\xa9\x6f\x77\xcb\xb6\xdc\x72\xfd\xf3\x72\x09\xfa\x71\x5d\x82\x46\xb8\xbf\x0f\x7e\x03\x62\x62\xbe\x49\x4d\xd3\xd4\xc0\xda\xb6\x75\xe5\xb1\x17\xa0\x8c\x24\x85\x2c\xca\x8c\x9a\x35\x6a\xb6\x15\x9a\x64\x87\xfb\x95\x5a\xcf\x6e\x34\x68\x6d\x1d\x95\xcb\x57\xab\x2e\xc9\x59\x96\x11\x2e\xf0\x24\xc0\x00\x5e\xfb\xa6\x18\xca\x4b\x84\xa2\x7a\x78\x6e\xa7\x70\x37\x63\x4d\xc5\x20\xd7\xf6\xae\xa3\x0c\x17\xd3\x01\xf9\xd6\xfe\x8e\x34\xcb\xa9\xc6\xb8\x20\x79\x99\x19\x5e\x64\x8c\x04\x6e\x8b\x3a\xb4\xac\x64\x84\x6a\x2d\x13\x4e\x8d\xd7\xde\xa1\xb5\x4f\x1b\x3f\x6d\x98\x8d\xa1\xb7\xa0\xb8\x4c\x58\xca\x44\xc2\x06\xe4\x33\x18\xf7\xc2\x5a\xc7\x56\x18\x04\x65\xbc\xd7\x00\x96\x68\x88\x41\x7a\xb0\x7a\x8c\x61\x9e\x97\x06\xd4\xba\x8f\xa5\x73\xb7\x3b\xee\x34\x73\x91\xea\x1d\x48\x55\x10\xad\x29\x58\x0a\xe4\xa4\xba\xba\xeb\xfb\x29\xdb\xdb\x11\xde\xa0\x6e\xdb\xca\xa9\x96\x28\x6e\xa5\x63\xa8\x53\xda\xc7\xd6\x18\xb6\xa3\xb3\x3f\x49\x1a\xdb\x81\xbe\xb6\xa7\xad\x1d\x94\x4b\x5d\xe9\x69\x5b\x6d\x52\xa1\xd8\x84\x7f\xe9\x80\x8f\x67\xa2\xba\xa2\xf0\x94\x09\x63\x2f\x02\x0a\x08\xaa\x62\x05\x13\x70\x0f\x67\x34\x99\x01\x5d\x70\x54\xb4\xd2\x0c\x3f\xa4\x7d\x07\xa5\x8c\xee\xc7\x6b\xb4\x4a\x8a\x79\x39\x5b\x3f\xf1\xb3\xe5\x76\x7d\xff\x07\x4b\xc8\x94\xe1\xdd\x62\xfd\xe5\xba\xb1\x8f\x51\x0f\xe7\x95\xe2\xff\xba\x9b\xf1\x64\x16\x26\x69\x6f\x6f\xc1\xe4\x54\x48\x38\x6b\x13\x6e\x88\xb4\x12\x81\xfd\xee\x80\x8c\x56\xf4\xcc\xa9\x49\x66\xae\xc5\xe1\xa1\x26\xa8\xb4\x6d\x0e\x34\x46\x15\x61\x5a\x66\x2c\x25\xde\xbd\x02\x07\xed\x88\x52\x35\xc7\x82\x13\xaa\x35\x9f\x8a\x7e\x21\xd3\xbe\x1d\xed\x64\x1d\x42\xb4\x38\x54\xb1\x63\xe0\xf6\x83\xb5\x15\xaf\x82\x72\xa2\xdd\x36\x7d\x0c\xfa\xb7\x48\xb6\x48\x64\x5e\x94\x86\x45\xca\xb9\xa0\xd7\x19\x2f\xd0\x0f\x28\x92\x21\x2b\x89\xe8\x7e\x30\xcd\xa9\xa0\x53\xd6\x77\x1f\xef\x87\x8f\xf7\xc3\xb7\xee\x03\xe6\x36\x54\x0b\x55\x8a\x9b\xce\x61\x1d\x78\xef\x50\x65\x89\x2f\xc7\x4e\x75\x94\xd3\x2f\x3c\x2f\x73\x42\x73\x59\x0a\x90\xc9\x96\xc1\x49\xb3\x4c\xde\xb1\xf4\xe9\x00\xd6\x12\x68\xa4\x33\x7e\x92\xe7\xab\xe0\x6a\xa5\xd8\xea\xa6\xd0\xea\xa0\xc8\xda\x59\x81\xe5\x75\xd5\xed\xd1\xf2\xa3\x57\x9f\x37\x10\x93\x8b\xad\x88\xe9\xcf\x39\x78\x64\x84\x71\xb8\x26\x32\xe7\xc6\x04\x3f\xaa\x80\x60\x3d\xc2\x4d\x4d\x09\xea\x8e\x04\x9f\x20\xa9\xe5\x9a\xb0\x2f\xf6\x52\xc5\x41\x99\xee\x8d\x17\x3d\x64\xb6\x77\x5c\x83\x1e\x8d\x0a\xc2\xf3\x22\x63\xb9\x77\xfc\xec\xfb\x2b\x9a\xf3\x35\x78\x39\x26\x2f\xc7\x64\xc3\x31\xd1\x5d\x24\x93\x58\x28\x41\xb5\xc1\x98\x65\x95\x70\x62\x11\xbc\x90\xa9\x76\xd2\x83\x47\x25\x7b\x24\x2e\xbf\x70\x0d\x5e\xb4\x1f\x19\xe8\x09\x46\xcc\x68\x72\x37\x93\x9a\x61\x0f\xaa\x98\x1b\x27\x62\x94\x5e\x2f\x02\x56\x05\x70\xf8\x9c\x4c\xea\x2d\x52\x56\x64\x72\x91\x83\x9c\x3b\x34\xb1\x74\x13\x04\x19\x96\x17\x19\x35\x2c\x88\x39\x9b\x75\x0f\xf7\xe6\x83\xf0\xf5\xcb\x2f\x56\x1e\x88\x62\x18\x5a\xc0\xb6\xd9\xb1\xae\xa8\x6a\x40\xda\xd1\x9a\x1c\xfd\x8d\x6f\x40\xde\xaf\xde\x00\x34\xcf\xae\x2e\xd6\x3b\x37\x92\x56\xca\x16\xb2\x5d\xe1\xb2\xb4\x8c\xb3\x0d\x53\x6d\xc8\xb2\xe8\xaf\xeb\xbd\x4f\xd1\x7b\xbc\x87\xaa\xac\x9e\x73\x7e\x0b\x9e\xfd\xd8\x58\xb1\x0c\xc3\x16\x9c\xda\xd9\x36\x72\x5e\xe7\xfb\xb9\x9f\xb5\xd5\xc2\xb7\xd1\xc0\xf7\xc3\xe4\xf7\x74\x25\x6c\xa5\xa2\xaf\x6d\x06\x5c\xb9\xe3\xa3\x0a\x0e\x48\x16\x92\xa8\xad\x77\x1b\x41\x8b\x22\x03\xeb\x9d\x6c\xeb\xa9\xd5\xf2\x72\x86\xcb\xef\x38\xe9\xb0\xe5\xb1\xb3\xac\x9d\xf9\xa1\x46\x04\xb0\xa7\x63\xc6\x41\xf9\x15\x74\x77\x3e\xf6\xe0\x33\x68\x55\xab\x78\x10\x7b\x12\x86\xa2\x47\xae\xa4\xb1\xff\xbb\x44\x0d\xa9\xc5\x9b\x0b\xc9\xf4\x95\x34\xf0\x66\xaf\xcb\xc6\xa9\x74\x5c\x34\x76\x82\x03\x22\xf0\x4c\x82\x7a\x3a\x0a\x46\x40\x4f\x4f\x20\x85\x1e\x40\x5c\x93\xa1\x20\x52\xf9\xd5\x05\x1d\xaf\x76\x43\xf8\x7b\xa2\x90\xa2\x8f\x4e\x85\xab\xc6\xb8\x0c\x1e\x95\x31\x4c\x36\x0c\xe7\x86\xba\xb1\x14\x18\x7f\xc1\xf0\x93\x8c\x26\x2c\x25\x69\x09\x93\x86\x50\x0a\x6a\xd8\x94\x27\x24\x67\x6a\xca\x2c\xd3\x4e\x66\x6d\x41\xbd\x8d\x2e\xe1\xd3\x82\x3a\xc5\x83\x6e\xd9\x3f\x20\xc1\xef\x80\x4b\x74\x23\xdb\xd8\x07\xc9\x5b\x4e\x0b\xbb\x75\xff\xb0\x54\x0c\xa0\xf7\x2f\x52\x50\xae\xf4\x80\x9c\x41\x14\x5c\xc6\x6a\xbf\x39\x8d\x58\x3c\x8c\x1d\xc1\x0a\x7f\x3f\x94\x7c\x4e\x33\x4b\x37\x51\xce\x63\x28\xe5\xd9\xd1\x9b\xcc\xa2\xe7\x78\xa9\x3d\xdf\xe8\xfd\xc2\x35\x39\xb8\x65\x8b\x83\xde\xd2\x76\x1f\x0c\xc5\x01\xd2\xd7\xa5\x0d\x0e\xc4\x18\xfc\x4b\x0e\xe0\xb7\x83\xfb\xf1\x97\x07\x10\xfe\xb6\xee\xa5\x91\x19\x53\x71\xd8\xe6\x96\x3d\xbc\xa9\xda\xc3\xd2\x2a\x63\x6f\x34\xd2\xe3\xd8\x2c\x6e\xbc\xd8\x62\xcf\x56\x35\x2f\x40\x2d\x63\x68\x32\x83\x30\x46\x3f\x2f\x88\x81\x59\x10\xbb\x67\x06\xe9\x3a\x20\x86\xe3\x90\x46\x81\x09\xe8\xb7\x01\xdb\x7a\x0c\xe4\xa7\xdf\x45\xbe\xe9\xd0\xde\xfe\x11\x30\xe4\xb7\xfe\x5f\xbf\xbb\x67\xcc\x41\x3b\xc6\x86\x53\xea\x20\x60\x5c\x42\x07\xc2\x45\x0a\xe6\x26\xb7\x54\x80\x00\x8e\x65\xe1\x03\xcb\x1a\x90\x4b\x4b\xa8\x48\xce\xa8\xd0\x5e\xe9\x05\x76\xa9\xaa\xb1\x76\x06\xb4\xe8\x7a\xe5\x14\x0c\xd5\xc9\x60\xe4\x4a\x8e\x9c\x26\xac\x47\xae\x41\xb3\x5a\xbd\x81\x93\x74\x25\x2f\xbf\xb0\xa4\x34\x6b\x2d\x5b\x31\xdc\xb6\x72\x91\xad\x8c\xbe\x06\x90\x6f\x2a\x26\x8f\x2b\xab\x31\xf9\x0a\x83\x63\x36\xbf\x11\x32\xb7\x6c\x51\x31\x1b\x27\x42\x00\xc9\xef\x55\x58\xe2\x59\x01\xf2\x8e\xff\xf6\x8a\xad\x7c\xcc\x05\x7e\x0c\x87\xf6\x5b\x01\xa3\x7b\x80\x5a\xc9\x2e\xcb\xf0\x33\xfb\x00\x57\x3b\x39\xa3\x06\xb3\x0f\x1d\x64\x8c\x40\x25\x57\x4b\x17\x91\x48\x71\xf9\x43\x49\xb3\x7a\x48\x82\x7b\xe5\x1a\x2d\x51\xf5\x3b\x9e\xa5\x09\x55\xce\xe7\x0b\x43\x2c\xb5\xc4\xdd\xa3\x40\x08\x12\x2a\xc2\x69\xaf\xf6\x48\xa3\xe1\xb2\xa0\xca\xf0\xa4\xcc\xa8\xf2\x51\xdf\xad\xc2\x06\xb6\x42\xb4\x42\x9a\x11\x4b\xa4\x48\xbb\x5c\x00\x6e\x9a\x7d\x9b\x96\xd7\x82\x29\x2e\xd1\xd7\x98\xe7\xac\x89\xa4\x47\x75\x0d\xb7\x9c\xf8\x53\x1d\x8e\x58\x4d\x01\x02\x71\x95\x9e\xe1\xf1\xa9\x90\x8a\xa5\xc7\x11\x79\x0c\xa7\x62\x40\xde\x2c\xbc\xb6\x05\x34\x2f\x2e\xd6\x42\x33\xd3\xf3\xba\x71\x87\xb2\x0e\xd8\xd5\x81\x9a\x48\x05\xa1\x2a\x47\xa9\xc4\xf8\x8c\x39\x4f\xcc\xf1\x80\xfc\x5f\xa6\x24\x6c\xbc\x60\x53\x6a\xf8\x3c\x70\xd3\x70\x71\x55\x8c\x3a\x7b\xfe\x2b\x72\x04\xdd\x08\xcf\x73\x96\x72\x6a\x58\xb6\x38\xc6\x7b\x2c\x23\x7a\xa1\x0d\xcb\xdb\x6c\x5d\x1b\xa5\x01\x7a\xde\x41\xdb\x5f\x7d\xbd\xa1\x65\xd7\xf8\xa7\xcf\x3e\x46\xa5\x82\x0c\x7a\x14\x34\xb6\x30\xf0\x20\xb9\x41\xdc\x8c\x3d\x12\x5c\x50\xb2\x97\x2c\xe3\x0d\xfe\xde\xe2\x01\x25\x8a\x41\xf6\x00\x87\xb9\xf7\xc4\x71\xf4\xad\x7c\x2f\x4b\xb1\x5e\x33\x58\x5b\xf8\x3b\x77\x09\xff\x1c\x75\x5c\x1b\x61\xf8\x28\x62\x42\x34\x93\x48\x53\x49\x09\xa8\x27\x81\x9d\x5b\xf2\x80\xad\x2a\xbf\x94\xad\x93\xdc\x6b\x34\x21\xcc\x65\x8b\x0f\xfc\x5e\x62\x0e\xc3\x87\x3a\xe0\x32\xb8\x8b\x3b\xc0\x34\xa2\xee\x8c\x23\x07\x80\x9f\x08\xc1\x0a\x41\xe1\x5b\x2c\xf5\x3e\x6d\x96\x1a\xb8\xae\xe4\xf0\xf4\x70\x2f\xc4\x17\x97\xa3\x64\x41\xa7\x70\x9e\x3a\xac\xaa\xd9\x95\xa4\xcc\x30\x95\x43\xb0\xf4\x4c\xde\xe1\xef\xc8\xb6\x0a\xd7\x8a\xa5\x55\x5c\xfa\x4c\x6a\xe0\x4a\xf5\x10\x44\x38\xbf\x60\x26\xbd\xa3\x0b\x42\x95\x2c\x45\xea\xa4\xa6\x40\x40\xdf\x37\x3e\x7c\x25\x05\x50\x8a\x52\x63\x28\x61\x4c\xa5\xc7\xcc\x50\x7b\x6c\x5e\x0f\x5e\xbf\xda\x0b\xc0\x3a\xc6\x9c\xc2\x6c\x1a\x9a\x42\x6f\x39\xf7\x67\x66\x2f\xf3\x52\x8c\xa6\x1f\x44\xd6\x45\x96\x7b\x8f\xe8\x05\x5d\xfb\x70\x09\xe3\x13\xd0\xdd\xf6\xf0\xd5\x9d\xe2\x86\x45\xe4\xf1\x68\x42\x33\xcd\xec\xd5\xbd\x14\x41\x84\x3d\xae\x8b\x20\xd0\xa4\xcd\x82\xb6\x7b\x87\xe8\x72\x7c\xcf\x73\xe6\x0e\x14\xa0\x5c\x75\xcc\x02\xc2\x1d\xea\x0d\x47\xae\x1e\xea\x49\x8e\xb0\xa5\x95\xd8\xa4\x34\xc7\xfb\x71\x19\xc1\x05\xda\x9b\x75\x97\x2b\x89\x8f\xf9\x2d\xf6\xb8\xda\x37\x6c\x46\xe7\x4c\x13\xcd\x73\x9e\x51\x95\x41\xe4\xe0\x08\xe7\x47\xc6\xa5\x59\x1d\x3d\xde\x2d\x32\x39\x9e\x49\x34\xdc\x56\x50\xfb\x79\x58\x38\x01\x8d\xf0\xf3\xb2\xdf\xc9\x4b\x53\xd2\x2c\x5b\x10\xf6\x25\xc9\x4a\xcd\xe7\xf7\x3d\x4d\x2e\x16\x62\x07\x56\xdd\xe4\xd2\x85\x4c\x47\x05\x4b\x1e\x93\x47\xd7\x6f\x18\x96\x54\xa5\x7e\xd3\x81\x27\xe3\x65\x1f\x6e\xee\x0b\xf0\x83\x4a\x12\xa6\xb5\xf7\xb0\x5c\xc4\x5e\x9f\x61\x0d\x3f\x96\x64\x00\xf4\x4e\x5f\x66\x54\x1b\x9e\xbc\xc9\x64\x72\x3b\x32\x52\x75\x8a\xb7\x3f\xfb\x76\xb4\xd4\xbf\x91\x42\xe1\xec\xdb\x11\xb9\xe0\xfa\x36\x4e\xca\x82\xb6\xd3\x58\x5d\x42\xc9\x6d\x39\x66\x19\x33\x87\x87\x1a\xb9\x5c\x4e\x93\x19\x17\xcc\x33\x38\x11\x02\x54\xdc\x85\xcf\x42\xb9\xab\xe9\xd4\x85\x41\x9d\x38\x7c\xfd\x19\xbd\xd3\x0c\xa7\x3f\xb6\xd3\xb7\x3f\xb3\x36\xf1\xe9\x7b\xb5\x53\xe0\x64\x86\x17\x7b\xb2\x41\x4c\xf4\x8d\x9d\x63\x37\xe5\xf6\xe1\x5b\x9e\x31\xbc\xe3\xc0\x12\xbd\x8f\x9a\x3b\x07\xb0\x63\x0b\x59\x92\x3b\x8a\xb7\x62\xa0\x81\x03\x72\xc3\x8b\x53\x72\x29\x74\xa9\x58\xa5\xcf\x98\x34\x86\xe2\xba\x8a\x33\xf3\xd7\x29\xd8\x61\xbc\x72\x58\x4a\xe7\x6e\x57\xe4\xf2\x0b\xcd\x8b\x8c\xe9\x53\x72\xc0\xbe\x98\xaf\x0f\x7a\xe4\xe0\xcb\x44\xdb\xff\x09\x33\xd1\x07\x03\x32\xcc\x83\xb9\x1d\xd2\xf6\x28\xe6\x1d\xa1\xb0\x83\x65\xc6\x11\x9f\x7d\x10\x04\x71\x4e\x75\x56\x5a\x4b\x25\xb9\xc3\xec\x11\x96\xc4\x33\xa5\xa4\x0a\x7e\xe8\x11\x18\x80\xbb\x24\x32\x2f\x94\xcc\x79\xa4\xd8\x03\x04\xdf\xab\xb7\x1d\xa8\x1b\xb6\x8b\xa4\xcb\xfb\x8f\xf9\xd8\x5c\x67\x52\x67\x8e\xeb\x76\x7f\x38\xf1\x8e\x13\x78\x55\x74\x77\x77\xb8\x7f\xba\x46\x76\xbf\xdd\x28\x96\x5a\xc5\x3b\xfc\x36\xc4\xd0\x91\x93\x94\xcd\x4f\x74\x4a\x5f\xf7\xe0\x33\xda\xf9\xfe\x99\xda\x9c\xa8\x26\x07\xaf\x0f\x06\x64\xe4\xb9\x6d\x2f\x9e\x63\xd5\x6e\x22\x55\x18\x10\x94\xe9\xaf\x0e\xc8\x91\x54\x30\x72\x42\x05\xc9\x18\x9d\x3b\x05\x32\x9e\xa9\x05\xde\x69\x8f\x5b\xc7\x40\xb6\x0d\x07\x8b\x6e\xf9\xff\xf9\xcb\x2d\xad\xdb\x49\xa2\xcb\xfb\xe6\xfd\x24\x0f\xac\x08\x7a\x00\xc2\xa4\xb4\x34\xd6\x52\x4d\xcb\x56\x21\x25\x96\x1b\xbb\x5a\x30\x17\x4b\x37\x65\x1c\x60\xe3\xa6\x1e\x80\x9c\x7a\xf0\x04\x54\x97\x74\x8c\xb6\xf7\x24\xb5\x2b\x34\x3f\x09\xfe\x43\xc9\xc8\xf0\x22\xc4\xd9\x33\xa5\xb9\x36\xf6\x74\xa7\x35\x1e\xc6\x91\xb1\x1d\x9d\xe5\xf4\xef\x52\x90\xcb\x37\x23\xf7\xd1\xe3\x27\x05\xcf\x56\x22\x41\xff\x5e\x2a\x66\xd9\x71\x17\x87\x01\xdf\xa7\xc9\xd9\xed\x7b\x72\x41\x0d\x45\x06\xef\x3c\xaf\x44\x45\xe1\x2d\x16\x8e\xb9\x48\xdd\x4f\x11\xe7\x7e\x6c\x26\x6b\x77\xef\x6a\x93\xbc\x14\x37\xfc\xf4\x71\xb8\x27\x66\x9c\x00\x8d\x9f\xbe\x97\x69\x67\x8e\xfc\x47\x0b\xc0\x73\xec\x4f\x72\x3b\x00\xb1\x77\xf6\x1e\x1c\x67\x62\xcf\xb3\xfb\xe7\xb7\xf6\xc6\xd9\x9a\x78\xb5\x62\x23\x1e\x5a\x1d\xe7\x7c\x13\xdd\xd3\x81\x76\x58\xd4\x80\x73\xe3\x18\xca\x38\x93\x63\xe2\xf0\x7d\xdf\xf3\xfd\xf4\x71\xb8\xc3\x74\x3f\x7d\x1c\x3e\xee\x54\x77\x12\xcf\x9a\xd2\x59\xc5\x83\xab\xe0\x8c\xa6\xd8\xd5\x5e\xe6\x1a\xec\x4b\xda\xda\x27\x9c\x56\x65\x84\xdc\x02\xa5\xc3\xcb\x2f\x05\x3a\x9f\x39\x25\xff\x68\x46\x21\xaa\x39\xc4\xda\xc1\xa6\xda\x5d\xd6\x96\xb2\xfb\xed\xb5\x37\x3a\xa0\x4f\xe4\x82\xa1\xc9\x32\x3d\xf5\x8e\x00\xa1\xc7\xea\x0e\xef\xc1\xfb\x32\x3d\x45\xba\x4a\xd0\x19\x33\x8d\xb0\xe9\x08\x55\x44\x22\xfc\x44\xe7\x94\x67\x74\xcc\x33\x6e\x16\x96\x43\x1f\x0f\x6a\x1e\xa6\x1a\xa6\xbc\xd7\xc3\xbc\xa3\x68\xb1\xa4\xa0\x22\x47\x76\xa4\x13\x50\x70\x1d\x0f\x2a\xa9\x62\xc6\x94\x0b\x49\x44\xd1\xa3\x26\x72\x68\x66\x00\xdb\x1a\x12\x47\x5b\x54\xd9\xce\xee\x01\xf0\xf6\x7c\x74\x65\x68\xb6\xcf\x4a\x86\x06\x3f\x8c\x5c\x46\xb7\xe7\xcc\xd3\x30\x7a\xaa\x15\x57\x03\xb4\xda\xda\xb2\x3d\x5f\xfb\x69\xe3\x14\x09\xa1\x69\x3b\x30\x41\x3b\x55\xe1\x98\xa0\x8f\xb6\xaf\xb9\x51\x22\x96\x8d\x1c\x29\x71\xc9\x93\x90\x6f\x5a\xdc\xfa\xa6\x45\xe2\x80\x2e\xe9\x16\xfc\xce\x77\x0d\xc0\x9a\x81\x5b\xc5\x76\xe4\x6a\x3d\x9b\x84\x15\xb3\x49\x17\x3b\xf5\x39\x2b\x66\x6f\x47\x75\xf5\x9c\x7d\x47\xde\x8e\x56\x9c\x4b\x00\x32\xac\x56\xa3\xd2\xee\x50\x93\x8c\x4f\x98\xe1\x5b\x96\xf0\x00\x27\x33\x97\x82\x1b\xa9\xd6\x47\x29\x93\x4e\xa7\xcd\x0f\xd7\x95\x1f\x56\x79\x3d\xde\xbb\x11\xd0\x01\x2e\x91\x59\xc6\x12\x9f\x83\x1a\x40\xea\x3f\xb1\xea\xf2\xc2\xdc\x9d\x3d\x64\xe8\xc7\x8b\xca\x09\x6e\xe8\xc9\xc7\xcb\xb3\x8b\xf7\x97\x83\x3c\xfd\xd9\x4c\xde\xf5\x8d\xec\x97\x9a\xf5\x79\x8b\xc4\x21\x4f\xe7\x46\x88\x4f\xd1\x2a\x8f\x55\x1d\xa4\x1f\x7c\x38\x23\xf9\xa4\xd1\x6d\x00\x54\x39\xde\x28\x24\xa5\xe9\x11\x45\x5d\xc8\x22\x75\x9a\xa0\x32\xcb\x10\xca\x46\x31\xd6\x8b\xaf\xd4\x1b\x63\x33\x3a\x2f\x68\x57\x25\x42\xb5\xa8\x87\x25\xd0\x8f\x8f\x5c\x5d\x68\xfd\x76\x21\x62\x13\xe4\x46\x61\x0c\xef\x7f\x01\xa6\x26\x23\xc1\x3f\x0b\xfc\x6d\x27\x52\x59\xac\x51\x75\x0c\x60\x26\x81\xc5\x9e\x94\x9a\xa9\x81\xe3\x18\x8f\x0e\xa8\x0e\xa9\x7b\x76\xc8\x98\xd6\x04\xd3\x47\x36\x41\x87\x64\x9f\xf1\xd6\x49\x51\xb4\x34\x33\x26\x8c\x4f\x17\xee\x80\xb1\x12\x6e\xce\xc3\xf9\xd1\x01\xd5\x32\x59\x50\xb7\xd4\x3e\x2f\xe9\x70\xba\xa0\xa1\x3d\x28\xf7\xa2\xdb\x21\x3a\x4a\xd1\x54\x82\x0b\x04\x66\x78\xab\x21\x18\x4d\x73\x2e\x9e\xe1\x41\x4c\xb8\x48\xb7\xad\xbf\x91\xc6\x0e\x7a\xd4\xe5\x28\x1c\xc5\x6b\xcf\x83\x25\x8e\xfa\x7b\x0d\x06\x94\x3b\x9b\x5c\xdd\x22\xd7\xea\xd0\xe5\x0b\xfd\x43\xd6\xc7\xaf\xf4\x8b\xb4\x82\xca\x8b\x79\x6d\xff\x0a\x9c\x47\x30\x9a\xed\x69\x7f\xc9\xbf\x9f\x40\x73\x6f\x48\x75\x91\x61\xee\xc5\x9b\xa1\xe2\x89\xf6\x41\x5b\x98\x1f\x0c\x4b\xa7\xb8\xbb\xab\x05\x41\x41\x15\xcd\x99\x61\x0a\x5d\xc7\x9c\x33\x9a\x70\x5e\xfd\x1f\x0a\x26\x46\x86\x26\xb7\xfb\x4e\x28\xfa\xc2\x4f\x1f\x8e\x9f\xee\x6a\x2d\xf3\x4e\x32\x69\xc0\x04\x97\x5e\x68\x11\x5b\x66\xb9\x70\xcc\xe6\x99\xd0\x95\x90\xd5\xab\x8b\x26\x22\x64\x75\xaa\x33\xd1\x2a\xcb\x17\x2a\x1f\xc0\x45\x2c\xa4\xa9\x03\xd7\x77\x84\xc2\x7e\x98\x5e\xfb\x43\xe0\xe4\x98\x5d\xec\x4e\x15\x3d\xc8\x65\xca\xc8\x98\x9b\xea\xa4\x6b\x66\x48\xc1\x54\xce\x5d\x00\xb4\x14\x58\x3f\x8f\xa5\xc8\xbd\x2c\xa7\x72\x9f\x8e\x38\x9b\x20\x32\x31\xbe\x40\x15\x19\x33\x73\xc7\x98\x20\xaf\x5e\xbd\x7a\x05\xf2\xc6\xab\x5f\xff\xfa\xd7\x04\x12\x2f\xa4\x2c\xe1\xf9\x72\x43\x68\xf5\x5f\xaf\x5f\x0f\xc8\x9f\xce\xde\xbf\x03\xff\xab\xc2\x68\x32\x96\x66\xe6\x46\xb6\x0d\x6a\x9d\x75\x8f\xfc\xcf\xe8\xc3\x95\x17\x13\x74\xe3\x57\xb8\x52\x84\xe5\xd5\x9d\xe9\x5e\xfd\xea\xeb\xaf\x07\xe4\x82\x2b\x88\xbc\xe5\x10\x2b\x10\xdc\x05\x0b\xef\x42\x27\xa4\x59\x8e\x75\x77\x6c\xc2\xb9\xd3\xe6\x7c\x3a\x33\x58\xe9\x08\x30\x25\xe3\x89\xc1\x5c\x7c\x78\xd8\x31\x33\x92\x76\xa1\x24\x2e\x30\xca\x39\x8e\xc0\xe4\x7a\x24\xe3\xb7\x8c\x4c\xf4\x1f\x94\x2c\x8b\x2a\x20\x50\x31\x6d\x65\x54\x57\xe7\x03\x07\xab\xf6\x4a\x33\xf3\xa4\x9e\x0c\x2d\x35\x35\x35\xa4\x1b\xd6\x04\x90\x5e\xc8\x46\xd6\x47\x4c\x28\x28\x0f\xce\x75\x60\x6e\xae\xe5\xc2\x0f\xb7\xc8\x34\x3a\xa7\x3e\xbe\xa3\x50\xf2\x7b\xdc\x24\x2e\x7c\xa4\x90\x93\x79\xb5\x93\xb9\x5c\x60\x26\xe8\x6c\x79\x3d\x72\xdd\xf2\x3d\x17\x15\x1f\xc5\x18\x0d\x27\x71\x30\x1a\x84\x6e\x73\x6d\x3f\x51\x4b\x15\xb9\xe2\xcb\x71\x69\x41\x33\xd3\xb8\xa3\xa5\x58\xea\xed\x2a\x8f\x38\x4a\xe3\xea\xc7\xb8\x30\xaf\x6a\x0c\x74\x57\x75\x41\x32\x51\x4d\xa2\x5a\xfa\xb6\x9a\x93\x8c\x66\xa6\x74\xa0\x01\x5f\x25\xfb\x6d\xa6\xb5\x8b\xb5\xc9\xa9\xba\xb5\x62\xbf\x3b\xff\x03\xf0\x0c\xd6\x21\xce\x07\x83\xae\xe6\x2c\x14\x98\x8b\x3d\xeb\xed\x47\x0e\x07\x83\x43\x3c\x20\x52\x61\xf6\x4b\xc4\x76\xfb\xfe\x89\x62\x8a\xeb\x9e\xdb\xb4\x88\xca\xc7\xb9\x42\x1f\xb4\xe6\x11\x4c\x1d\xa4\xda\xe4\xbc\xed\x24\xbe\x74\xcb\x1e\xdc\x36\x7f\x30\xb6\x2c\xda\x14\x31\xe8\x2a\x41\x75\x48\x37\xbc\xbe\x8a\x8a\x3b\x02\xed\x32\x08\x77\xce\x88\x4b\xd0\x2b\x62\x97\x39\x76\x65\x72\x2e\x88\xad\x56\xed\xea\xf9\x73\xb5\xe1\x04\xc3\x3f\xea\xb4\xca\xd1\x82\x48\x42\xa8\x6a\x4b\x55\xb1\x20\xcf\x9a\x79\xc5\xe8\xd2\x2d\x37\x7b\x17\x46\x86\x4f\x3b\x23\x01\x3e\x4b\xe7\x20\xd0\xcc\xa2\x56\xfb\x22\x43\x05\x00\xc8\x8d\xfe\xb0\x0c\xc8\x7b\x47\x53\x11\xb9\xe8\x58\xcb\xac\x34\xd8\xb5\xfa\x31\x26\xb8\x30\xa8\x4f\x39\x00\x54\x36\x34\x8b\xc8\x2f\x30\x1e\xa4\x79\xed\x28\x31\x3e\x1d\x0e\xe3\x4b\x22\xcc\x27\x4b\x32\x5b\xe5\xef\xd6\x0f\x96\x70\x36\xd1\xbc\xcb\x55\x69\x34\x24\x47\x55\xe1\x0c\x6f\xe6\x1e\x0a\xc3\xd4\x84\x26\xec\x38\xbe\x42\x85\x02\x25\xc1\xb3\xc6\xc7\x06\xcc\xa8\x48\x33\x14\xad\x13\xa6\x00\xe5\xd9\x17\x57\xe8\xd6\x7e\x22\x55\x1c\x0a\xb8\x1e\xbd\x61\x56\x1e\x64\xd4\x94\x8a\xb5\x8a\x30\xda\xaf\x5b\x21\x4c\x63\x5f\x97\x36\x18\xac\xab\x4b\x05\x74\xf2\x12\xaa\x88\x8e\x55\x05\x26\x84\x2a\x82\x54\xc7\xd7\xd2\x81\x45\x25\xa0\xc7\x40\x2a\x16\xb2\x54\x4e\xef\xed\x33\x8d\x26\x52\xd9\x8b\x10\x0e\x4c\x35\x51\x6c\x6a\xa5\x55\x05\x62\x2d\xb6\xc8\x4a\xfb\x62\xaf\xce\x5f\x7b\x76\x92\xdb\xe4\xe2\x36\x71\xe2\xb3\x9c\xf3\xd4\xb3\x48\xb0\x2d\x55\x05\xff\x0a\xaa\xa3\xb8\x93\x28\x39\x7b\x04\x61\x14\xc6\x81\x91\x86\x88\xce\x9a\xff\x74\xac\xdd\x95\x90\xe8\xa1\x45\x65\x85\x2e\x44\x58\xa6\xec\xba\x1c\x67\x5c\xcf\x46\x3b\xaa\x02\xaf\x56\x0c\x81\x0e\x03\x4b\x86\xba\xb5\xea\x41\xcd\x84\xe6\xc0\xf2\x2c\x19\xb7\xcc\x16\xea\xfe\x4a\x00\xa2\xef\x1d\x63\xa6\x84\xc0\x88\x8c\xb9\x70\x7e\xfb\x53\x34\x0f\x17\xa1\x85\x09\x3c\x52\xf6\x49\x14\xb5\xf7\x09\xcd\x32\xdd\x8c\x5e\xf5\x84\x16\x65\x0e\x1f\xb5\x85\x7b\xca\xed\x76\x87\xa2\x21\x8d\x8c\x90\x6b\x17\xa6\x49\x2e\x31\xc2\x45\x10\x29\x7c\x23\xc8\x43\xe2\x3b\x44\x51\x7d\x10\xbb\x0b\x28\xb3\xe7\xaa\x8a\x2f\x3a\xd0\x87\xd3\x81\xee\x68\x69\xa8\xea\x2a\xd1\x28\x22\xb8\x5e\xa6\xd9\x93\x52\x4f\x72\xb7\x98\x24\xf6\x6a\x15\xc0\x6f\x9e\x19\x2c\x2d\xde\x39\xe7\xd9\xe7\x46\x77\x60\xd3\xf6\xde\x01\x87\xb7\xef\x6e\x16\x49\x84\x99\xee\x42\x10\x8e\xc0\xf2\x91\xaf\x78\x0e\xb0\x1b\x7c\x79\xa8\x49\x2a\x93\x32\xa4\x48\x05\xa0\x55\x06\xb0\x36\x19\x04\x49\xd7\xe3\xd4\x3d\xad\x55\xfc\x91\xad\x58\x95\xca\x3b\x71\x47\x55\x7a\x76\xbd\xc5\x2f\xbd\xce\xce\xab\x5e\xb1\xa0\xe4\x07\x83\xba\x78\x74\x2c\x4b\x53\xa5\xcf\xfc\x69\xab\x9e\x8d\xb4\x14\xa1\xa5\xa6\x99\xbc\x28\xaf\x5f\x94\xd7\xcd\xe7\xc1\x95\xd7\xb6\x4f\x3d\x17\x6c\xed\xb8\xfa\x14\x03\x3c\x6b\xeb\x4a\xfb\x90\x5a\xd0\x88\xc0\x20\x75\x6f\xfa\xc1\x37\xe4\x36\x3c\x22\xd5\xde\x46\xb2\x9e\xa7\x40\xc0\xaa\x9f\x5e\x63\xfa\x40\x7a\xd0\xf6\x95\x7b\xf1\x59\xe7\x82\xbb\xa9\x92\x2f\x48\x0d\x51\xe9\xdd\x9e\xcb\x84\xdc\x73\xf7\x2e\x91\x56\x45\xed\x30\x11\x73\x87\xc2\x9d\xf8\x74\x04\x3e\xe9\xbc\x01\xa4\x63\x59\x5d\x7c\xba\xee\x06\xd9\xa1\xc4\x2e\x3e\x4f\x5c\x68\x17\x9f\xce\x2a\x6e\xd2\xbd\xe8\xee\x8a\xe5\x3e\x6c\xe9\xdd\x1d\x97\xf6\xf8\xda\xfb\x5e\x55\xf0\xed\xf9\xb3\xf5\x17\xed\xfd\xd2\xf3\x88\xda\xfb\x88\x70\x7b\x62\xe0\x00\x10\x6b\xf4\x63\x75\x9b\x57\xeb\x8f\x99\x17\x2b\x07\x55\x06\x32\x8b\x72\x5e\xa1\x2f\x55\xdd\x6c\x7a\x38\x18\x1c\x1e\x7a\x35\xbf\xc3\xcf\xd2\x4c\xfa\xbf\x21\x4c\x24\x32\xc5\x4d\xb5\xe3\x2b\x6d\x80\xe9\x57\xb7\xf3\x78\x2e\xb9\xff\x56\x6c\x7a\x85\xb1\xbb\x6d\x49\x87\x13\xdc\xbd\x90\xf6\x2a\x48\x3f\x46\x39\xed\xb8\x68\x76\xbd\x46\x36\xb6\xb8\x4f\x61\xec\x18\x78\x0f\xce\x5f\x5b\x97\xca\xc6\x67\x17\xf6\xba\x43\xd9\x6c\x7c\x1e\xb9\x78\x36\x3e\x3b\x71\xd4\x4e\x85\xb4\x57\x2c\xee\xf1\xca\x69\xe3\xf3\x4c\x8b\xa9\xd4\x9f\x4e\xa5\xb5\xf1\xd9\xad\xc0\x76\xbd\x6f\xc7\xad\xdf\x4b\xb1\x6d\x7c\xba\x95\xdc\xc6\x67\xdf\x85\xb7\xf1\x69\x09\x09\xd0\x81\x5f\xf0\x4e\xc1\x03\x97\xae\x4f\xdd\xf3\xd1\xb0\xbc\x90\x8a\xaa\x05\x49\x9d\xae\x61\xb1\x22\x00\x33\x8a\xc0\xbc\x77\x56\x14\x98\x7b\xca\xd5\x9e\xe2\x07\x3a\x04\x5f\xb2\x94\x97\x6b\x0b\x18\xaf\x03\xdb\xb7\x90\x0d\xcb\x65\xd2\xf2\xc6\x4d\x1c\x2a\xa4\x12\xa4\xc9\xad\xab\x91\xe3\x61\x88\x9c\x3e\x4e\xb9\x73\xd0\xc8\x7c\x0c\xca\x30\xb0\xf4\xb9\xca\x80\xbe\x31\x8e\x5d\x53\x5c\xa1\xc9\xc3\xd9\xfe\x8f\x5c\xc3\x63\x2b\x7f\xbc\x07\xa6\xf7\x48\x7b\x42\x3a\x06\x99\xf1\xbf\x33\xa8\xb3\xd5\x39\x85\x95\x04\xb1\x3b\xd4\xff\xca\x64\x12\x19\x96\x6b\xec\x07\xa0\x1e\x30\xdb\x2b\xe6\x2d\xec\xed\xd7\x51\x78\x00\x8d\x4e\xa6\xd1\x56\xc7\x13\xc8\xdd\x08\x22\x3a\xc0\x2e\xc0\xfb\x26\x2a\x8a\x57\x6a\xfb\x25\x48\xad\x1e\xb5\xa9\x3e\x74\xe7\x53\x48\x9a\xa8\x60\x59\xfd\x62\x61\x7f\x19\x79\x08\x44\x97\x32\x08\x4f\xf0\x52\xb8\x2e\x41\x06\x74\x5f\x71\xb2\x90\x9c\x80\x3d\x2a\x70\x6f\x1d\xb2\x17\x2e\x61\x95\xe0\x59\x1d\xad\x7c\xea\xb6\xb0\xf0\x52\x38\x2f\x82\x25\x1c\x59\x8d\x22\xa5\x66\xaa\x3f\x2d\x79\xba\x0b\x72\x3c\x63\xee\xd6\x9a\xa7\x75\xe7\x64\x1d\xf9\xd7\x3d\xb8\x56\xf0\xb2\xe8\x40\xf7\x0f\x2e\x83\x6b\x46\x8d\xf0\xc7\x29\xe1\xea\x6e\x1a\xd4\x7b\x02\x84\x23\xe7\x4c\xbc\x47\x67\x59\x31\x8b\x7c\x34\x00\x1b\x43\xba\x52\xcb\x20\x92\x45\xe2\xc2\x66\x79\x2d\xbf\x23\x7e\x06\x31\x11\xbc\x54\xfb\xf6\x3f\xfe\xbe\xeb\x95\xf7\x63\x36\x91\x55\x49\x10\xbc\xfe\x38\xdf\xda\x94\x65\x0c\xaa\xa8\xfb\x0a\xed\xb6\x01\x98\x7d\x73\x39\xb7\xc8\xfd\x67\x41\x3e\xf9\x24\xf5\x7c\x72\x4a\xe8\x71\x2d\x74\xc1\x95\x59\x11\x8c\xa5\xe8\x70\x9b\x55\xdf\x51\xa5\xd0\x3d\x32\x3e\xf6\x0b\x83\x13\x28\xac\x0c\x98\x79\xf1\x16\x2f\xd1\x8a\x59\x80\x40\x00\xb0\x92\x39\xd1\x82\x16\x7a\x26\xa1\xf6\x7e\x42\x0b\x9a\x70\xb3\xb0\xe0\x37\x8a\x26\xb7\x50\x96\x47\x31\xf7\xc5\x1e\x49\x8e\x9d\xff\x56\x0d\xa2\x35\x37\x60\x33\x53\xb2\x9c\xce\xc0\xb3\x15\x5b\x25\x19\xd5\x1e\x00\x2b\xfb\xbb\xdb\x8d\x26\xe9\x42\xd0\x9c\x27\x21\x89\x9e\x92\x73\xae\xb9\x74\xda\x5d\x1c\xd7\x9e\x02\x72\x1d\xf2\xa0\xa1\xd2\xf8\x3c\xa3\x3c\x27\x47\x9a\x31\x12\x10\x05\x7f\x71\xb5\xdc\x51\x99\xa1\x98\xed\x1e\x6b\x94\x65\x48\xe6\x2d\x5c\x06\x82\x8a\xf2\x05\x93\x15\x32\x4e\x38\x7e\xe9\xea\x4f\x1f\x87\xad\x5b\x3d\x33\xa9\xc0\x50\xef\xb3\x58\x32\x91\xca\xc8\x5c\x79\x76\x3d\xd4\xf1\x35\x04\xf1\xcc\xe5\x7a\x83\x1f\x32\x29\xa6\x71\x08\x7f\x85\xa5\x96\xcc\x0a\xa8\x6d\x32\xe7\x69\x49\x33\x24\xb0\x6e\x32\xe7\xa3\x21\x76\xe7\xd3\x99\xe9\xdf\x31\x50\xc3\x20\x1f\xaa\x5c\x9d\xfc\x47\xf9\x92\x9b\x0e\xd7\x40\x90\x8d\x53\x23\xa0\x4a\xcb\x4e\xed\x8e\x2e\x20\xdf\x8b\x73\x29\xa9\x59\x4a\x7d\xae\x2d\x1c\x22\xc0\x3d\x02\x3a\x4c\xef\x2c\xd4\xaa\xb0\x12\x04\xe8\xa9\x2c\x94\x01\x6b\x97\xe7\x66\x01\x1f\xe5\xbe\x0b\xaf\x5d\x59\x32\x6a\xf7\xc8\x4a\x75\x9b\x2f\x31\x0f\x20\x8d\xfd\xa4\xed\xf4\x80\xbb\x37\xae\x1c\x62\xc7\x15\x1e\x7c\x1b\xa9\x01\x23\xc3\x8d\x25\x0b\x54\xa4\x7d\x9a\xd9\x03\x71\xfd\xf9\xdc\x39\x66\xe3\x41\xaf\x2d\xd8\x57\x36\xe2\x22\xa4\xc2\xb6\x62\xd2\xca\xf3\x0d\x11\xf8\x63\x96\x02\x5d\x8c\x8b\x40\xde\xd9\x1b\xbf\xc3\xc9\xeb\xcf\xe7\x3d\xc2\x07\x6c\xe0\xff\x0a\x4d\x3d\x61\x36\x72\x8a\x6e\x8d\xc1\x55\x15\x8e\x13\x4c\x25\x56\xae\xc5\x7d\xff\xf6\x5b\x3b\x49\xfb\xeb\xef\xfa\xbf\x8d\x92\x8b\xfe\xee\x6f\x96\xce\x2b\xdb\xa0\xfe\x36\xf6\x8d\x0b\x99\xf4\xff\x76\xed\x32\x4d\xbb\x3c\xd4\x7f\x73\x05\xb6\x98\x30\x56\x32\xbe\x96\xe0\x75\xc0\x53\xc4\x0d\xf8\xb6\x62\xdf\x7b\x45\x29\x80\x29\x28\xa9\x12\x6a\x98\x00\x5e\xe4\x83\x48\x84\x34\xd8\xdd\x95\x94\xb5\xf3\x3f\x02\x15\x07\xc6\xbb\xf5\x88\x91\x12\xa8\x0c\x52\xb2\x33\x41\x98\xaf\xbf\x89\x6b\x05\x70\x50\xe7\x78\xe7\xd9\xad\x1d\xd6\x42\x38\x84\x04\xdb\x79\xc0\xdc\x7e\x21\xa4\xf9\x45\xd8\xfe\x46\x9d\x70\x3a\x97\xdc\x27\x15\xb7\x04\x40\x60\x95\xc6\x90\xe6\x7a\xbc\x20\x39\xd7\x86\xde\xb2\x01\x19\x59\xf6\x19\x5b\xf7\x10\x7a\x82\x40\x32\x4a\x96\x92\x52\x18\x9e\xc1\xaf\xd5\x38\x76\xca\x31\x5b\x1d\x4e\x88\x2e\xa1\x80\x79\xa1\x58\xdf\x33\x6a\xd7\x6a\x89\xc4\x55\x6b\xe9\x85\xcd\x9e\x51\xbc\xed\x14\x29\x74\x05\x78\x50\xe1\xd0\x6b\xc9\x1d\xcd\xce\x53\x8a\xa4\x62\xce\x00\x4c\x3d\x20\x57\xc0\x8f\x33\x6f\xe2\xc6\x8b\x97\x53\xc8\x0a\x96\x30\xad\xa9\x5a\xf4\x20\x59\x3b\x0f\x09\xbe\x9d\x07\x12\x08\x0d\x39\x15\x98\x2a\x5d\xb1\x44\x0a\x6d\x54\x99\x18\xac\x9d\x37\x56\xf2\x96\x89\xe0\xfe\x68\x77\xb1\xee\x87\x56\xd1\x19\xb0\xdf\x49\x92\xcc\xa8\x98\x46\xb5\x67\x72\x9a\x02\xec\xbf\x09\x82\x9d\x5f\x8f\x85\x00\x9d\x58\x59\x8a\x1b\x00\xc5\xd8\x72\xc8\xa0\x56\xfe\xb3\x20\x5e\x73\xd0\xab\xf4\xbe\x76\x49\x3c\xdb\x42\x92\x49\x57\x55\x65\x17\x25\x65\x1f\xc4\x92\x3d\xfb\xb1\xe5\xcc\xd0\x94\x1a\xba\x83\x2f\xdb\xfb\xaa\x60\x9e\xaf\xa0\x8f\x45\x4b\x83\xa1\xd5\xb1\x57\x2f\x51\xca\x82\xc7\xf1\x5a\x70\x12\x67\x1e\xf2\x10\x00\x6e\x2c\x4e\x39\xc3\x07\xba\xa8\x81\xbc\xe6\x2b\x92\xd9\xe1\xfd\x68\x48\x2e\xaa\x72\x8b\x15\x39\x69\x67\x56\xeb\xa8\x51\xb6\xa0\xdf\x01\x46\x37\x95\xed\x2f\xa9\xf3\xc1\x95\x92\x15\x72\x09\x26\x0c\x57\x2c\x0e\x8f\x73\xa0\x2b\x05\x22\x79\x03\x88\x00\xe5\x29\x33\xba\xf2\xb8\x41\x3a\x6c\x89\x8b\xe3\x77\xee\xfe\x0d\x44\xda\x01\xd6\x5d\x61\x57\x8b\x78\x08\x76\x2d\x1d\x9d\xb5\x94\xff\x41\xe0\xba\x8b\x12\x1d\x4b\x04\xbc\x97\x69\x17\xbd\x7b\x23\xb3\x7e\x35\x44\xe5\x86\x8a\x0e\xc5\x1a\xf4\x18\xf8\x0d\xb0\xbe\xe9\x5a\x90\x1f\x12\xb9\x19\x9d\xef\xae\x74\xab\x44\xbf\x7e\xc8\x4a\x0c\x9f\xeb\xc3\xe7\xfa\xaf\xdb\x2b\x27\xbb\x78\xb4\xf8\xa7\xb5\x67\x4b\xfd\x23\x9d\x34\xc1\x96\xa4\x8c\x3a\xaa\x6f\x9b\x29\xd3\x03\xb5\x77\xf6\xd0\x60\x83\x76\x31\x1b\x8c\x5b\x3a\x71\x4a\x7e\x51\xe3\xef\x4e\x8e\x0a\xd7\x40\x74\x35\x3e\xf2\xf7\xc2\x81\xdb\x04\x1f\x11\x5f\x6f\x7e\xdc\x18\x0c\x04\x8b\xd5\x57\xa4\x46\xcb\xa4\xd4\x46\xe6\xcd\x2a\x0c\xbe\x30\xbd\xc6\x9c\xa5\xce\x81\x10\xca\xbc\xc1\xb5\xfd\x18\xeb\xd7\xa6\xe8\xaa\x6d\xaf\x0e\x4b\xe3\xc0\x2d\xa2\x3e\x5a\x73\x30\xe4\xeb\x67\x62\x81\xf3\xbb\x08\xb0\xf7\x97\x67\x32\xb5\xb2\x6a\xa8\x5e\x2b\xe8\x38\x8b\x9c\xb2\x83\xb8\x6a\x45\x4b\x05\xaa\x4d\x1f\x0b\x62\x8f\x86\x92\x59\xc6\x14\x6c\x82\xbb\xd9\x36\x3c\x1a\x60\x36\x38\xdd\x5e\xd0\x20\x04\xf9\x58\xb0\xbb\x20\x08\x51\x8d\x89\x6f\xbc\xf5\x91\xb9\x42\x7e\x6b\xc7\x6b\x6d\x1f\xdc\xc9\x42\xb8\x8b\x8d\x10\x82\x47\xb9\x68\xe3\x90\x55\x75\xd8\x58\x4a\xa4\xf9\xec\x62\x54\x04\xaf\x1d\x70\x26\xe8\x66\x21\xaa\xe7\x6d\xbd\x1e\xc2\x10\x5e\xa2\x9f\xc2\x1f\x9e\x5f\x05\x8c\x1c\x33\x8b\xef\x55\x58\x38\xe0\x51\xdc\x77\x85\x5f\x45\xb5\xb9\xdf\x40\x6e\x57\x87\x89\xa1\xf6\x98\x62\xe0\x17\x03\x5f\x1c\x40\xed\x02\x2a\x16\x4e\x0e\x30\x33\xae\xd2\x7e\x41\x95\x59\xe0\x69\xe8\xd5\xbe\x16\x62\x0c\x3a\x2d\x7c\x47\xe3\x56\xbb\xb4\xc9\x6b\x21\x0c\x8b\xf7\xf5\x03\x9d\xf5\x62\x2d\x5c\x1f\x63\x3d\xed\xa3\x18\x56\xae\xe7\x2a\x0a\xea\xf7\xf7\xc9\x27\x5b\x4f\x30\x05\xef\xca\x71\x3e\x06\xff\x87\x46\xc1\x4e\x6f\x4b\xa8\x1c\x24\x1e\x5e\x20\x08\xdf\x7a\x60\x0a\xb8\x1b\xb5\x41\xa3\xc8\x3d\x30\xe7\xf0\x1d\x9a\x55\xaa\xda\x8d\x26\xb2\xf4\x54\x56\xa6\x44\xe6\x45\x69\x58\x04\x7a\x77\x17\xe8\x0c\xeb\x9a\x36\xea\x04\xf3\x85\xf7\xdd\xf0\xfd\x30\x7c\x3f\x18\x78\x5a\xe4\x0e\x8d\x9f\x9d\x80\x4f\xee\x11\x27\x11\x3f\xcf\xd8\xc4\xd3\x58\x6c\x77\x27\x06\x72\x4f\x47\x06\x72\x1f\x67\x06\xb2\x4f\x87\x06\x12\xdc\xa2\xee\x73\x70\x3e\x7a\x87\xac\xc6\xd1\x71\x34\x6a\xd3\xd1\xa9\x85\xe3\x85\x71\xb8\xf6\x25\x69\x9c\x36\x2d\x1c\x01\x90\xe6\x62\xb7\x1a\x77\x68\x41\x35\x87\x2a\x33\xf6\x25\x24\xbf\x8b\x58\x7e\x54\x9f\x18\x0a\xf7\x07\xc9\x15\x0e\x5f\xdf\x19\x3f\x7d\xc2\x97\x97\x83\x1c\x9e\x97\x83\xdc\xae\xff\x53\x1e\x64\xf4\x1f\xea\xe2\xde\x56\x97\xb2\x51\x57\x46\x7e\x28\x99\x5a\x10\x39\x67\x91\x9d\x0c\x92\xfd\x69\x9e\x3a\x4b\xd3\x98\x8b\x74\x6b\xb5\xe7\xf8\x79\x44\x09\x00\x4a\xc7\x5e\x7e\xb1\x72\x12\x78\x82\xdf\x83\xa4\x35\x87\xaa\x07\xfb\x20\xb4\x3c\xd0\x3d\x0d\x83\x4b\xf5\xc0\x65\x01\xa9\xde\x80\xda\xea\xec\xea\x62\xb7\xeb\x40\x37\x35\x0a\xd9\x45\x95\xb2\xb4\xf8\xb3\x0d\x0b\x44\x40\x84\x5f\xea\x75\x0e\xbc\xd3\x3b\xa4\xae\xea\x39\xcd\x6b\x55\x67\x1c\x1a\xa3\x01\xa1\x9e\x74\xab\x6d\xb0\xe7\x2a\x00\xed\x40\x15\x77\xbb\x63\xe3\xd3\x3e\x4d\x53\xbd\x97\x07\x42\x57\xe2\xbb\x33\xd9\xee\x94\xce\x29\x7e\x6a\xa8\xe0\x52\x90\x81\x41\x1c\x70\x02\x52\xd7\x78\xe7\xa1\x80\x06\xe0\x30\x85\xd5\xe5\x77\xf8\xe2\x3d\xe8\x27\x09\x80\xbd\xf7\x52\x03\x9a\xd6\xbc\x5f\x6e\xd9\xe2\x50\x3b\xbf\x7b\x29\xf4\x8c\x17\x3e\x5b\x2a\x50\x02\x87\xb9\xe4\x33\x68\xa4\xfd\x10\x78\xe6\x87\xa2\x47\xae\xa4\xb1\xff\xc3\xf2\xfa\x80\xeb\x17\x92\xe9\x2b\x69\xe0\xcd\xa3\x03\x0b\xa7\x7b\x6f\x50\xb9\xf0\x15\x0e\x25\x74\xd0\x88\x0a\x3e\x8f\xde\xe8\x01\x20\x71\x9a\xbc\x00\x56\xae\x51\xb1\xe8\x61\x12\xd2\xeb\x69\x37\x84\xd7\xc0\x08\x29\xfa\x2e\xd7\xfb\x8a\x31\x1c\x28\xa5\xaa\x41\x72\xc3\x70\x6e\x28\xd0\xdd\xe2\x2f\xa0\xa1\x29\x32\x9a\x54\x96\x1a\x48\x12\x47\x0d\x9b\xf2\x84\xe4\x4c\x4d\x21\xc2\x22\x99\xed\xbe\x41\xdd\xe9\x36\x3e\x3b\x51\xef\xf8\xc3\x9d\x31\x03\x58\xdd\x3b\xb0\x95\xdd\x97\x61\xe2\x28\xc8\x22\x72\x5a\x58\xa4\xf8\x87\xe5\x04\xb0\x2f\xff\x82\xa4\x8e\x7a\x40\xce\x7c\xa5\xad\xf8\x37\xa7\x76\x8b\x87\xb1\x23\x58\x71\xfe\x87\x92\xcf\x69\xc6\xd0\x82\x4c\x45\xc8\x7f\x25\x27\x4b\x6c\xba\xe7\x32\x3b\x5a\x2a\x15\xac\xb2\x07\xb7\x6c\x71\xd0\x5b\x42\xa4\x83\xa1\x38\xa8\xc2\x9c\x6a\xa8\x13\x18\x1a\xd8\x72\x0f\xe0\xb7\x83\x7d\x73\xf6\x27\x12\xe7\x77\xc0\x12\xa7\x12\x3a\xcf\xa8\xd6\xdd\x22\x44\xd6\xe7\x19\x19\x45\x63\x56\x9e\xba\xce\x2f\x20\x41\xbb\xe3\xfe\x34\x57\xe0\x1f\xd7\xdd\x86\xd5\x09\x4a\x73\x97\x26\xbc\x7d\x88\x63\x93\xaa\x86\x01\x82\x03\xe4\x5d\xec\x53\x5e\xb9\x28\xae\x81\xd7\x67\xf0\x2b\x96\x93\x38\x2f\x12\xd7\x70\xd3\xe5\xde\x25\x52\x48\x43\xb8\x48\xb2\x32\xc5\x7c\x4e\xd0\x15\xee\xc9\x5d\x45\xfa\x1d\x80\x73\x0f\xe4\xf9\x1c\x06\xf0\xf2\x88\xbb\x89\x2c\xbb\x86\x34\x6d\x63\xe0\x76\x8f\xfe\x2d\x5c\x3b\x58\xed\x7b\xad\x93\x2d\x86\xf8\x7a\xda\xaa\xf3\xba\x8c\xf1\x96\x8f\x15\x23\xe7\x33\x2a\x04\xcb\xda\x16\x4d\xef\x50\x33\xfd\xb1\x3d\xf6\x9e\x63\xc1\x84\xbd\x55\xbc\x7c\xce\xb5\xc0\xb3\xb2\x73\x15\xf0\x2a\xb0\xfa\xed\x39\x31\x54\x4d\x99\xb1\xc3\x10\x51\xe6\x63\xd6\x3a\xcc\xe3\x39\xd5\xc7\x7e\xac\x4a\x10\xfb\x2d\xe6\x80\xa0\xff\xf6\xdb\xab\xce\x25\xdf\x56\xed\xe0\x9d\x54\x59\x7a\xc7\x53\x34\x81\x69\x72\x64\x07\x3e\x7e\xfe\xf5\xd9\xee\xee\x78\x7a\x3f\x00\x38\x26\x09\x00\x20\x00\x01\x57\xa1\x80\x43\xee\x48\xf8\xc0\x31\xb9\xe4\xe8\x82\x6a\xff\xc2\xe8\xec\x7c\xcc\x45\xe5\x5d\x1d\x36\x03\xe8\xaa\x3d\x0f\xfe\x36\xa1\x99\x41\xe7\x41\xf0\xbf\x93\x66\x46\x34\xcf\xcb\xcc\x50\xc1\x64\xa9\xb3\x45\x6b\xb4\x78\x1a\x20\x4f\x32\xf6\x05\xb1\xb8\x0b\xbf\x0a\x9d\xea\x7c\x6b\xca\x04\x53\x55\x2c\xc1\x12\xe3\xaa\x9c\x38\xd2\x93\xc0\xc4\x82\x4f\x2a\xfb\xc2\x12\xe7\x7e\x51\x64\xe5\x94\x6f\xf1\x91\xfb\x37\x4b\xe5\x59\x25\x4b\x2c\x35\xab\x22\xd8\xda\x26\x2b\xff\x89\x96\xa7\xbe\x59\x9d\x5e\x33\x65\x05\x13\x29\x64\xfe\x88\x70\x15\xa7\xbb\x57\x58\xb9\x2c\x1a\xbb\x53\xa8\xcb\x2f\x46\x51\x4b\x6e\x72\x4b\x58\x7c\x52\x0e\x3e\x21\x54\xb4\x27\x1d\xcf\x23\xdb\x1d\xf9\xb7\xe3\xd1\x0f\x5e\x0c\xf1\x7e\x39\x56\x91\x8a\x3a\xb4\xf7\x39\x52\xd7\xe7\x42\x75\x5f\x89\x23\xcb\xee\x9b\x13\x55\xaf\x48\x03\xd9\x98\xd5\x4b\x91\xa8\x1f\x45\x82\xd4\x09\x84\x7e\x74\x49\x1b\xf0\x16\x7b\x34\x6e\xb6\xee\x65\xb3\xe8\xe0\x86\x9b\xac\xc3\xdb\x88\xa4\x43\x8e\x2e\x37\x90\x73\xfe\x24\xda\x15\x6b\x77\x0e\x5d\xa5\x10\xdb\x88\xd5\x43\xe4\xbd\xa4\x86\xea\x9d\x2a\x86\xc7\x08\xe5\x46\xc1\x44\xab\x50\x5f\xd8\xc7\x3f\x90\xfe\xef\x9c\x4c\x20\x6a\x2d\xad\x34\xe0\x01\xe2\x33\x0b\xb0\x60\xa6\xc5\x31\x52\xbb\x0d\x09\x35\xad\xb3\xc2\xb7\xa2\xf7\x6e\x06\x9f\x3e\x75\x2e\x1d\x66\xbb\x34\x56\xec\x76\x1a\x62\xcf\xf9\x0f\x65\x2c\xa9\x43\xcc\x65\x58\xa3\x6b\xbf\xaf\x85\x4c\x13\x56\xa9\x88\x2e\xb8\xbe\xed\x92\x1c\xe3\x0f\xe7\x97\xf5\xce\x75\x84\xff\xc3\xf9\x25\x71\x6f\x5b\x69\x71\xba\xa8\x71\xee\x9b\xbb\x61\x9a\xb0\x4a\x35\x9a\x72\x7d\xfb\xe8\x85\x39\x8b\x74\x6b\x75\xf9\xc7\xd6\x32\xf9\x78\xe1\x28\xc8\x7d\x21\x4b\x72\xe7\x02\xd6\x9c\x50\x7b\xc3\x8b\x53\x72\x29\x74\xa9\x58\x65\xfd\x6c\xca\xb7\x96\x93\x3e\xa7\x02\x9e\xf7\xc2\x8d\xe7\xac\xe6\x2a\xa8\x32\x20\xd9\x76\xce\x17\x02\x29\x71\x5d\x67\xbf\x84\x2d\x5b\x3f\x9c\x78\x57\xb4\x1e\x31\xf5\xa4\x1a\xbe\x91\xdd\xec\x28\xfe\x34\xde\xde\xb7\x21\xe4\x9c\x9c\xa4\x6c\x7e\xa2\x53\xfa\xba\x07\x9f\xf1\x11\x23\xa6\x36\x27\xaa\xc9\xc1\xeb\x83\x01\x19\xf1\x9c\x67\x54\x65\x8b\x5a\x0e\xc0\xaa\x9d\x65\x01\x7e\x40\x30\x66\xbd\x3a\x20\x47\x52\xc1\xc8\x09\x15\x24\x63\x74\xce\x7c\x24\x85\x3d\x50\x0b\x14\x01\x8f\x1f\x9b\x8a\x90\x07\xd5\x11\x22\x41\xe9\x8a\x06\x9f\x90\xdd\xd4\xa2\x8d\x2f\x2a\x8a\xcd\x85\x25\xe3\x03\x2c\xf7\xdf\x2c\x71\x09\x67\xc3\xb7\x78\x2a\x50\x3e\xe8\xdd\xec\x9e\xf5\x71\x97\x2e\x74\x4f\x07\xa6\xed\xb7\xba\x29\x37\x1f\x59\x21\x3b\x09\x00\xd8\xa5\xa1\x09\xe3\xc6\xbe\x90\x9a\x43\x5e\x2c\x6a\xa0\xca\x9c\x32\x3c\x29\x33\x6a\x65\x62\xd4\x83\x0d\xc8\xc5\xe5\xf5\xc7\xcb\xf3\xb3\x9b\xcb\x8b\x53\xe2\x47\xe2\xb1\xb4\x36\x20\x37\x71\xb0\x7e\xe4\xf9\xea\x22\xa2\xc3\xb7\x7a\x8e\xf8\x50\x51\xa5\x1b\x82\x10\x4c\x2a\xc8\x50\x70\x53\x65\xe3\x43\x27\xad\x4c\x0a\xe7\x76\x65\x7b\x3b\x3d\xdc\x94\xa3\xeb\x84\x70\x83\xd9\x9f\xeb\xa3\xc1\xe9\xc0\xcc\x5e\x61\x2a\x5b\x6e\x71\x0f\x20\x39\x54\xc0\xdd\x97\xec\xee\x13\x70\x75\x3c\x1e\x37\xa8\x60\xaf\x72\xa0\x21\xc5\x0f\x69\x3f\x7d\xf0\xf1\x8a\x82\x88\xc4\xf2\x92\xc3\xc1\xa1\x17\x14\xb2\xa5\x14\xaf\x61\xd0\x38\xbf\x42\x1d\xb7\x06\x84\x7c\xf0\x9e\xcc\x3d\x2b\x05\xac\xce\x16\x8b\xf1\x6e\x51\xce\xd1\x06\x86\xfa\x14\xc0\xe5\x38\xfe\xa8\x4b\xc8\x30\xe5\x73\x26\x70\x61\xfb\x25\x48\xfe\xf3\x1d\x61\xfe\xb1\x9a\xf7\xa7\x8f\xef\xf6\x3b\x25\x3c\x67\x1d\x27\x74\x2e\xf3\x1c\xc3\xf4\x67\x21\x16\xad\x0a\x27\x0b\xa7\x7d\x6f\x17\x16\x4c\x38\x30\xd9\x82\xd4\x0d\x3a\xe5\x3b\x35\x2e\x28\xe1\xb5\x73\xca\x17\x95\x9c\xda\x3d\x9d\x5f\xb3\x96\xb3\x23\xd9\x27\x61\xc6\x6d\xab\x39\x3f\x00\xc9\x60\x22\xc5\xf2\xe6\xdb\xaf\x25\xdb\x92\x97\xb7\x27\x2b\xe1\xa3\x5d\xb9\xee\xa5\xef\x18\xbb\x38\xf8\xd1\xa2\x94\x20\x29\x33\x94\x67\x3a\xda\x47\x23\x0b\x99\xc9\xe9\xea\xdc\x7e\x1d\x36\xe8\x67\x18\x1e\xdb\xa7\x7d\xbb\xf3\xfb\x95\xd7\xdb\xa4\x64\xae\xc3\xc3\xa7\x60\xb6\x60\xa8\xd6\x1a\xe4\x60\xc8\x9c\xfc\x4c\x97\xfb\x20\x82\xd7\x12\x0c\xf0\x36\x08\x87\xd8\x67\x4b\xa9\xd2\x8f\x44\xe9\xd0\xdb\x4a\x64\x0f\x0d\xba\xed\xc2\x98\xa5\x41\xdb\x73\xde\xd7\x61\xf6\x47\xd7\xa7\x4e\xe4\x0a\xc5\xfa\x21\x0a\x1e\xb2\x74\x4b\x15\x71\xd7\x98\xe6\x79\xc5\x8b\x57\xd3\x60\xab\x6c\xd1\x54\xc0\x54\xb2\x4f\xd0\x5a\x81\xf9\x13\x32\xc5\x84\x0c\x3c\xee\x2a\x4c\xa7\x18\x45\xae\x9c\xfe\xb6\x50\x7c\xce\x33\x36\x85\xe4\x5e\x5c\x4c\xa3\x9a\x49\x3e\x8d\x08\x24\x81\x65\x4b\xf3\xb2\x5b\xa5\x4d\x9c\xe2\x11\xf0\xe2\xea\xc3\x0d\x24\x8c\x03\xa3\xe0\xbd\x05\x6c\xfb\x41\x48\x28\xde\xef\xf7\xe1\xde\x7f\xf4\xbd\x95\x15\xd3\xec\x98\x7c\xcb\xdc\x77\x24\x24\xb5\x53\x90\x55\x7e\x26\x43\x56\x31\x98\x6b\x05\x59\x40\x47\x34\x9a\xbb\x56\x27\xb6\xa5\x15\x8c\x90\xdd\xd4\xda\x43\x72\x2e\xcc\x9a\x83\xf6\x9e\xc7\x97\x2b\xf7\x48\xfa\x77\xa6\x72\x5e\x2b\xba\x0a\x3f\xab\x84\x08\x8e\x1e\x52\xa2\x17\x79\xc6\xc5\x6d\x95\xd6\x60\x22\x2d\x0e\xb9\xa4\x75\xe2\xd6\x63\xac\x62\x34\x5b\x4f\x29\x77\xc1\x8f\xbd\x52\x49\xb3\x83\xf2\xee\x66\x51\xa0\x2d\x3c\x1c\x7b\x67\xea\x8d\x49\xdc\xc1\xc1\xb3\x5b\x2f\xd7\xdd\x2a\xaa\x1e\x0e\x47\xe7\xa3\x5a\x35\x30\x7b\xa7\x83\x77\x8f\xa9\x5c\x5e\xc7\x12\x60\x39\x4f\x28\xd9\xf1\x1f\xb6\x59\x6a\xfb\x24\x2b\xb7\xb7\x41\x37\x9f\x6b\xa9\x0c\xcd\xf6\x44\x04\x92\x19\x2d\xce\x4a\x33\xbb\xe0\x3a\x91\x73\xd6\xf9\xaa\xe3\x6b\xfe\xfa\xac\x26\xdc\x6f\x3a\x8e\x46\xce\xff\x78\x76\x4d\x68\x69\x77\xd1\xb8\xec\x4d\x7b\x35\x71\xfb\xf9\x8f\xd0\xa1\x7e\x2f\xb3\x77\x63\x3d\xf8\xdc\x5f\x0c\x02\x7b\x34\x08\xc0\x19\x7f\xce\x46\x00\x2e\xb8\xe1\xd4\xc8\x96\x35\x2b\xea\xf7\x77\x4c\x68\x84\xe8\x39\xf4\x03\x81\x55\x16\x18\x6e\x6d\xec\x7a\xee\x5d\x10\xb4\x01\x38\xa1\xbe\x75\xc3\x03\xb0\x07\xe9\x85\x70\x6c\x1e\xda\xfc\xd6\x79\x66\x16\x40\x6d\x7e\x77\x5a\x4b\x58\xb9\x94\xe0\xb8\xaa\xc5\xec\x93\xe6\xee\x55\x13\xc3\x7f\xe8\x7a\xb2\x9d\xda\x0b\x57\xf5\xbf\x25\xcd\x10\x1a\x57\xfb\xd6\x11\xd5\x21\xdb\x71\x92\x7e\x3f\x3d\xcc\xaf\xc2\xad\xb9\xd4\x90\xe1\xd6\xb5\x30\x8a\x0a\x6d\x37\xa2\x7e\x37\x3a\x74\xa6\x9d\x43\x72\x64\x92\xa2\x75\xba\xd7\x07\xf2\xcc\xc6\xa9\x3a\xb8\xbf\x0b\x1e\xd9\x6d\x67\xf5\x20\xd6\x16\xc0\xdd\xae\xaa\x8d\xda\x42\x90\xd9\x92\x77\x5c\x1b\x9f\x7d\x16\x5e\x70\xed\x52\xa7\x81\xa4\x73\x0d\x55\xee\x8b\xbf\xd2\x34\x55\xa7\xc8\x49\x7c\xe9\x3c\x05\xf2\x8e\xcf\xc2\x44\x45\xb0\xc7\x1d\x99\x45\xc1\x13\xb8\x8e\xdd\x9c\x5f\x13\xcc\x76\xfd\x9b\x5f\x61\xd9\xae\xff\xfc\xe5\xaf\x5e\xb5\xde\xd0\xa7\x73\x7f\xde\x51\x73\xb0\x77\x8b\xcd\xb3\xf0\x9a\x03\x71\x01\xfd\xe5\x80\x1e\xba\xb3\x8b\x78\x64\x37\x35\x50\xe9\xdd\x84\x8a\x17\x0f\xb3\x27\x2f\xc1\x1d\x0b\xe0\xf7\xa7\x2a\x48\x50\xae\x9f\x1f\x41\xd9\x0a\x8b\xed\x58\x53\xc7\x16\x3c\xbf\xf6\x7e\x17\x59\x9f\xc0\xe7\xfa\xe2\x6a\xf4\xd7\x77\x67\x6f\x2e\xdf\xc1\x2c\x9d\x5f\x55\x5c\x10\x78\x07\x3f\xa2\xf6\x68\xd5\xe6\x26\xb8\x1d\x18\xdd\xec\x1c\x57\x6f\x47\x8d\x8b\xb2\x7d\xd3\xd1\xb8\x71\x5f\x69\x59\x4c\x5a\xad\xfd\x71\x55\x57\x90\x9d\x99\xa9\xfd\x85\x38\xec\xac\xe1\x8a\x32\x33\xd5\x2e\x43\x76\xa7\x70\x86\xf7\xbe\xaf\x6c\xdd\x01\xf2\x0c\x94\xf8\x76\xbd\x08\x83\xbd\xab\xef\x1f\x08\x56\x6d\x59\xbc\xea\x1e\xfb\x72\x38\x82\x5e\xde\xc8\x63\x0f\x29\x7a\xe4\x28\x4b\xaf\x2d\xa5\x66\x3a\x64\x62\x7d\xa6\x98\x52\xac\x4a\xc3\xdb\x85\x7a\xad\xcc\xe3\x5b\x2b\xbb\x50\x33\x6c\xd4\x22\x06\xd6\xa5\xc9\xf6\xb6\x7d\xea\xae\x97\x50\x43\x7a\x9f\xd1\xf4\xd5\x2b\x7c\x03\x21\xd5\x8f\x4f\x00\xe1\xb3\x7b\x74\x28\x0d\xe3\x75\x45\xe4\x73\xdf\xb1\x19\xc8\xd5\x69\x87\x08\xd5\xa1\x98\x41\xa9\x43\xbc\xba\x2f\xd5\xf1\xb4\xdb\x47\x1e\x85\x7a\x7e\xbb\xe3\xd5\x65\xdf\xd7\x96\x62\x26\x8d\x14\x3b\x3b\x89\x5f\xaf\xe8\x5e\x3f\xc7\xd8\xe2\xbc\xca\x64\x1d\x55\xde\x01\x0f\xc3\xa0\xd0\xb7\x62\x9c\xe7\x12\x52\x78\xd5\x7e\x5d\xb1\xff\xe8\x92\x47\x3a\xbc\xd8\xd3\x99\xfb\x31\x05\x1f\x76\x55\xc1\xee\xd5\x85\x22\xed\x1c\x71\x31\xbc\x70\x72\x97\x8f\xaa\xd0\x0e\xed\xc8\x7a\xbc\xdb\x1b\x5f\x94\xca\xdc\x49\xd5\x3d\xd4\xf8\xba\xd6\xb1\x61\xd5\x77\xbf\x2d\x45\x13\x3d\xc7\x33\x82\x73\x7c\xe2\x73\x32\x02\x83\x69\x23\x73\x74\xf3\x64\x04\x2f\xf6\x07\x38\x3c\x4f\x7b\x68\x76\xe4\x42\x0f\x1b\x92\xba\x57\xc1\xdb\x63\x59\xc7\x15\x7e\x76\xdd\x9c\x82\xc0\xee\x4d\x45\x24\x68\x38\x84\x6e\xf8\xbd\x11\x05\x25\xb1\x3c\x4e\x07\x7a\x30\x34\x2c\xc7\xc2\x7d\x34\xcb\x2c\x2c\xa5\x88\xb3\x07\xbb\xb0\xd3\x9e\xab\xeb\x96\xd3\xc2\x57\x41\x94\x77\xe2\x8e\xaa\x94\x9c\x5d\x0f\xf7\x73\xf4\x3b\xb8\x16\x23\xfe\xb4\xcb\x04\x55\xaf\x5e\x24\x53\x46\xc6\xdc\xe8\xaa\xae\x08\x33\xf1\x6d\xd0\x92\xb7\x60\x23\xb2\x87\xd4\x1e\x48\xf7\xbd\x5a\x21\x60\x99\x18\x9a\x35\x0a\xcd\xbe\x7a\xf5\x0a\x95\x57\xaf\x7e\xfd\xeb\x5f\x43\x55\x0d\x92\xb2\x84\xe7\xcb\x0d\xa1\xd5\x7f\xbd\x7e\x3d\x20\x7f\x3a\x7b\xff\x0e\xea\xce\x14\x46\x63\xba\x0b\x1c\x19\x4b\x6d\x46\x9d\x75\x8f\xfc\xcf\xe8\xc3\x95\xa7\x90\xba\xf1\xab\xab\x52\xe8\x96\x37\x20\x17\x91\x0b\x50\xac\x9e\xa2\x66\x86\xd5\x30\xa5\x21\x74\x32\xc1\x6a\x4a\x63\x5f\xcc\x0b\x8f\x94\x8f\x6c\x86\x52\x8b\x58\xb1\xc1\x6e\x7f\x06\xbe\x49\xf6\x22\x8d\xca\x3c\x1f\x5c\x8f\xae\x56\x30\x56\xa0\x7f\x30\x95\x1e\x16\xeb\x9c\x68\xa8\xdb\x50\xa5\x82\x53\x4c\x5b\x99\xd2\x55\x78\xc1\xc1\xc2\xd4\xed\x24\x9e\xd2\x06\xd3\xba\x9e\x40\x0d\xb1\x7c\xe2\xda\xaa\xea\xe7\xf7\x68\x56\xdc\xe6\x1c\xfb\x40\x36\x91\x3a\xcf\x0f\xb3\xc1\xbd\x72\x21\xeb\x81\x5c\x10\x9a\x49\x31\x8d\xb7\xb6\xe2\x47\x51\xf5\xd0\xed\x4b\xe9\x9c\x79\xaf\x6b\xf6\x55\xa4\x42\xef\x69\xeb\x8a\x27\x75\x95\x76\x14\xda\x4f\xc7\xb2\x34\xde\x04\x8c\x63\x62\x0d\x1a\x2c\xe5\xd8\x21\x73\xe0\x0e\xc9\x06\x77\x49\x3a\xdb\x39\x6f\x65\x9d\xcc\xd7\x84\x80\x1e\x61\x34\x99\x91\x5b\xb6\xe8\x23\x61\x2a\x28\x44\xa3\x00\x3c\x2e\x2c\x14\x30\xb7\x63\xdd\x5e\x92\xb0\xd4\x4a\xb6\x0e\x58\xde\xa2\x5e\x61\x51\x88\x66\xf1\xe2\xa3\x76\x92\x8e\xcb\x19\x29\xa2\x0b\xbc\x4f\x4c\x1c\x95\x3b\x0b\x49\x22\xb1\xd6\x61\x3d\xea\xc2\x9e\x2f\x96\xda\x6e\x7a\xd3\x97\x2b\x37\x02\x4b\xe8\x1c\xab\x2a\xc5\x52\x6f\x57\xdb\xcf\x89\x6d\xf0\x41\xea\x53\xf1\x46\xae\x08\x50\xb1\xd3\x15\xb7\x71\x6d\x3d\x94\x02\x20\x6a\x51\x21\x9a\x99\xd2\x81\x06\x3c\x38\xec\xb7\x99\x86\x3a\xcb\x90\x2a\x42\xdd\x32\x9f\x94\x84\x66\x03\x72\x6d\x27\x19\x32\x1f\x61\x0e\xdc\x39\xba\x91\xd9\x33\x1a\x87\xbb\xd8\x8f\x1c\x0e\x06\x87\x48\xc1\x57\x04\xbf\x74\xc0\x8c\xdd\x12\xa8\xee\x90\x38\xb5\x51\x39\xb0\xd0\x98\x06\xd6\x4a\x6d\x90\xe6\x58\x42\x14\x97\x99\x79\x0e\x45\x5b\xa7\xdf\x59\x5e\xce\x0e\xd9\x3e\x77\x4d\x52\xbd\x4b\x8a\xea\x56\xe6\x84\xfa\xb3\x7b\x6a\xea\x9d\x12\x53\x2f\x95\x30\x74\x5b\xe4\x8e\x59\xf7\x4c\xbd\xf7\x48\xa4\x9c\x77\x4a\xf2\xe9\x9f\x75\x39\x61\xf2\x36\x52\x9f\xc1\xd2\x73\x19\xfb\x51\x89\x79\xc3\xc9\xaa\xca\x5b\x3e\xdc\xad\x92\x93\x03\xd1\xb4\x10\x78\x7a\xf9\xae\x5b\x75\x0e\xd2\x59\xe0\x6b\x3e\x5d\x04\xc0\xe6\xd3\xce\x28\xd7\x7c\x96\x4e\x53\xa0\xee\x45\xe4\x92\x0e\xa0\x34\x12\x32\x31\x9b\x70\xe4\x06\x50\x65\xd5\xf1\x28\x6a\x65\x15\x2d\xb3\xd2\x84\xb0\x9c\x15\xac\x01\x06\xf5\x79\x9b\x31\x18\xd2\x37\x8b\x18\x05\xb0\x48\xa4\xbf\x5d\x79\x06\x3e\x3b\x1d\xe9\xae\xf5\xc6\x7e\xb2\x8e\x1b\xf7\x80\xa1\x97\x19\x76\x86\xe3\xc8\x65\x43\xf0\x1e\xc4\x35\x19\x06\x9c\x37\x8c\x46\x01\xc9\x8b\x23\xae\x60\x4f\xe7\x95\xb5\x53\xac\xb8\x29\x3a\x2d\xc2\xd9\xf5\x70\x8f\x12\x7d\x34\xea\x4f\x5a\xa6\x07\xd5\x4d\xad\x6e\xca\x45\xb5\x72\xa7\xe0\xb5\x14\xe6\xd9\x8b\x86\x4b\xd3\x7e\x6b\xe9\x62\xa4\x56\x6d\x24\x65\x73\x75\x46\x03\x05\x8d\x12\xb9\x79\x03\x1f\x9c\xd7\xe7\x2e\x46\x3e\xa2\x48\x08\xf0\x68\xe5\x23\xd8\x7c\x96\x2b\x91\xc1\x62\xc9\x08\x6a\x93\xe0\x1d\x2f\xba\x2c\x16\x32\x3d\x25\xae\x44\x7b\xa8\x09\xde\x73\xb5\xc2\x7b\x78\x09\x84\xe2\xed\x95\x59\x56\x45\x0a\xf0\x9d\x45\x83\x9d\xca\xd4\xdc\xa7\x50\x8d\xdd\x40\x58\xf9\x75\xd7\x5d\x24\xf7\xac\x3b\x43\x22\x2e\xb4\x5b\x25\x8b\xba\xb2\x1a\x47\x0a\x35\x79\x93\x19\xcb\x29\x26\x85\xf3\xcb\xb3\x54\xe6\x4e\x71\x63\x18\x66\xf5\x61\x2a\xd7\x44\x4e\x7a\xb5\x42\x71\x07\xf3\xd7\x07\xbb\xd4\xf3\xb8\x67\xc9\x15\x52\xed\xc2\x1e\x80\x71\x5d\x93\xce\x2c\x5e\xc3\x75\x21\x83\x4c\x8e\xa2\xa1\x64\xb0\x0c\x66\x8e\xd0\x7b\xf4\x85\x3f\xe5\x15\xa9\x17\x84\x84\x97\x2b\xd2\xcb\x15\x69\x2f\x57\xa4\x88\xb1\x78\x82\xe3\x00\x15\x5f\x9b\xe2\x8c\x52\xfe\xee\x54\x45\xf5\x44\x59\x62\x2c\x6a\xfa\x5b\x93\x54\x75\x2d\x9a\xbd\xfa\x1c\xfa\xbb\x94\xc3\xe3\xd2\x4c\xfa\xbf\x21\x4c\x24\x32\xc5\xcd\xb7\xe3\x2b\x6d\x40\xb4\xa9\xae\x1f\xf1\x5c\x72\xff\xad\x58\x13\x07\x63\xef\xba\x75\x3b\xd1\x01\x6f\xab\x7b\xbb\x27\x06\x5f\xb1\xf5\x10\x04\xeb\x96\x1f\x62\xe4\x1d\x7f\xaf\xac\x84\x58\x19\x18\x90\xdb\x57\x3b\x25\x47\xf8\x72\x90\x14\x65\xcf\x35\x18\xe4\x2c\x97\x6a\xd1\x0b\x8d\xec\x8f\xb5\x5e\xae\xc5\x31\xc8\x04\x49\xa9\xec\x65\x2f\x5b\xfc\x58\xa5\x03\x0f\xa0\x47\x16\x0e\xc2\x3e\x75\xab\x06\x13\x3f\x0d\xf7\xbb\x90\xe8\x0a\xae\xf2\x55\x75\x9c\x49\x48\xbe\xa7\x7b\xe1\x8a\x0a\x6f\x99\x98\x93\x39\x55\x1d\x0a\x59\xc7\xcf\x3d\xe5\x81\x94\xcf\xb9\xde\xad\x60\xdd\xca\x5b\x33\x77\x69\xbd\x64\x69\x8a\xd2\x38\x4a\xe9\x4f\x85\x0f\xf5\x0e\xa7\xa1\x21\x14\xbd\x3e\xd8\x69\x1a\x3f\x9a\xa2\xb0\xf8\xec\x58\x1a\x16\x9f\xfb\x16\x88\xad\x8f\xb2\x33\xda\xec\xb5\xea\xb3\x7f\x3c\x5a\xec\xe3\x1c\x56\x2c\xb2\xca\x4f\xe0\x85\xd3\x47\x3a\x68\xe8\x0f\xb2\x47\x5d\x8d\x4b\x84\xfe\x53\x56\xd3\xec\xc9\xf4\xea\x22\xf5\xfe\xcd\xed\xae\x23\x97\x13\xff\xc5\xe8\xda\x0a\xf9\x5e\x8c\xae\x2f\x46\xd7\xb6\xcf\x8b\xd1\xf5\x45\xa3\x50\x7f\x7e\xd4\x1a\x85\x17\xa3\xeb\x8b\xd1\xf5\x7e\x30\x7c\x10\xa3\xab\x13\xe3\x2a\x8b\xeb\xa3\x1a\x5c\x5d\x59\x97\xb3\x24\x91\xa5\x30\x37\xf2\x96\xb5\xb6\x20\xb4\x12\xe6\x97\x46\x7f\x3c\xc9\xbe\xbb\x60\xd1\x49\x3c\xd8\x45\x30\xa0\x65\xca\xad\xf0\xbe\x33\x02\x9d\xb9\x01\xbc\x9c\x6e\x49\xb1\x48\x59\x1a\x46\xf6\x87\xd4\x58\x58\x0f\xc8\x19\x51\x2c\xe1\x05\x77\xd5\xbb\x29\xbe\x47\x0c\x0b\x59\xf6\xb9\xd1\x2c\x9b\xb8\x6c\xe7\x22\x2e\x0a\x53\x89\xe0\x8e\xc2\xad\xfc\x0c\xf2\x1c\xe9\x93\x64\xfb\x0a\x39\x8a\x7d\xef\x99\x95\x9b\xcd\x4d\x3c\x42\xac\x14\x81\xa5\xd4\x6a\xd1\xc0\xc7\x0a\xee\x22\x90\x1f\xfa\x60\xb3\x2f\x05\x57\x80\xbc\x23\x96\x48\xd1\xa6\x22\xe6\x9a\x0d\xba\x6c\x8e\xe4\x77\xca\x69\x34\xb1\x00\x7e\xa8\x7b\x39\xa7\x19\x4f\xb9\x59\x04\x5b\x9b\xab\xb2\x44\xf1\xc4\x84\x6d\xd4\x15\x18\x09\x2d\x0a\x25\x69\x32\x63\x3a\x9a\x37\x8a\x1c\x2e\x10\x2b\x78\x9d\x63\x25\x30\x90\x3a\xa0\x8f\x65\x7d\xd9\x82\x28\x69\xbc\xb9\x7c\xcd\x07\x6f\xa2\xc1\xa0\x3b\xf2\x2f\xa3\x16\x60\x53\x97\xf1\x10\x38\x2b\x3e\x89\xff\xd0\x44\x66\xa9\xcf\xef\xf1\x9b\x57\x56\xcc\x4b\x1c\x0e\x5a\x2a\x07\x19\x20\x8c\x24\x99\x65\xc5\x96\xf2\xad\xef\xfc\xcb\xaf\xc9\x4c\x96\x4a\x0f\xe2\x20\xa1\xd7\xf0\x0e\xaf\x68\x5e\x4c\x34\x24\x63\x54\x1b\xf2\xfa\x15\xc9\xb9\x28\x2d\x07\xea\x8c\x36\xdd\x25\x9b\x48\xa6\xf9\xd5\xd7\xad\xfb\x75\x95\x66\x96\x2d\x92\x0e\xab\x0a\xcc\xc4\xeb\x84\x1a\x77\x92\x30\xb8\x0c\xf3\x58\x37\x44\x1c\x47\x74\x63\x68\x0b\x23\x1f\xe0\x7c\xfd\x50\xca\xf1\xc2\x74\x09\x44\xfc\x5f\xec\x51\x8f\x40\xf4\x2f\xdb\x64\x17\xa9\x92\x8b\x6c\xfc\xe8\x83\xd4\x4a\x98\x72\x6d\xb6\x54\x4a\xa8\x62\x14\x37\x36\x6b\xcf\x56\xa6\x56\xde\xef\x18\x96\x02\x77\x04\x2f\xeb\x7a\xf5\x50\x92\x30\xac\x69\x78\x51\x55\xda\x11\x12\xc7\xdf\x3a\xfc\x13\x27\xdb\xf2\x08\xb2\x87\x1c\xdd\x2d\x97\xda\x4e\xba\xf2\x28\xd1\x79\xad\xd8\xad\x7e\x0a\x34\x17\x53\x4c\xa9\x9d\x97\x99\xe1\x45\x56\xad\x3b\x74\x70\x84\x3c\x56\x9b\xd1\x48\xd3\x43\x31\x38\x17\x53\x31\x81\x8a\xf1\x28\x8c\xc5\x84\xc1\xcc\xd0\xca\xf2\x83\x82\x2a\x1a\x80\x07\x75\x53\xf5\xb1\xd3\xc0\x51\xb0\x03\x22\xe5\xb1\xe4\x5c\xd1\x2c\x2c\x34\xb6\xfd\xec\x13\x69\x0c\x13\x54\xb4\x50\x30\xd7\xaf\x7a\xd0\x89\xc8\xbb\xe0\x02\x86\x15\x36\x1a\xd8\xe2\x84\x9a\x37\x34\xb9\x65\x22\xc5\xf2\x43\xb0\xec\x74\x21\x68\xee\x52\x51\x45\x35\x95\x1b\xfd\x75\xcf\xa9\x1a\x30\x52\xce\x87\xea\x22\xd7\xdd\x27\x0c\x4a\xdd\x39\xd7\xcb\x27\x8d\xb5\x8c\x37\x9d\x73\x8d\x4a\x18\xc5\xe7\x09\xf3\xfc\xdf\x7e\x6a\x9f\x53\x9f\xb7\x88\x47\x5f\x9a\xbc\x73\x55\xe4\x11\xfe\x02\xb9\x0f\xca\x6f\xc8\x3a\x45\x33\x7b\xb4\x17\x21\x3c\xb3\xb1\xb9\xe3\xc5\x7e\x0b\xaa\xa8\x71\x97\x30\xda\xc3\x8f\x6f\x2e\xea\x87\xf8\x23\x4d\xa5\x26\x6f\x32\x99\xdc\x92\x0b\x06\x42\xd7\x43\x16\x04\x51\xe3\xf4\x29\x13\x46\xe7\x74\xba\xcd\x3a\xd6\x27\xb9\x14\xdc\x48\xb5\x99\x5e\xbc\xd4\x27\x7c\x92\x74\xc4\x6a\x9c\x3e\xeb\x64\xc4\x16\xc1\x76\xa9\x46\xa8\xe0\x18\x42\x77\x9f\xcb\x6f\xc7\x43\xf5\xb3\x99\xbc\xeb\x1b\xd9\x2f\x35\xeb\xf3\x16\xf6\xd6\x0e\xab\xbb\x65\x0b\x30\x32\x77\x5c\xdf\x37\xd8\xad\x76\x39\x30\x12\x74\x4a\xf0\xde\xb2\xe8\x8f\x6f\x2e\x2c\x6f\x18\xc4\xc2\xde\x09\x33\xc9\x49\xc2\x8a\xd9\x89\xfb\xf0\xb3\x04\x8a\xa7\x16\x5d\xa1\x72\x46\x12\x99\x65\x2e\xde\x59\x4e\xc8\x39\x2b\x66\x61\xb0\xc7\x5e\xe9\xd3\xa5\xba\x2d\xa4\xec\x9a\xf2\x33\x3a\x30\xb6\xb7\x3b\x2f\x11\xe2\xa8\x71\xb7\x3a\x06\x8f\x85\x2a\xcf\xba\x12\xe3\x03\x02\xe7\x81\xab\xea\xd7\x6a\xe9\xc7\xae\x97\xf5\x74\xc0\xde\x87\xa3\x46\x6e\x86\x13\x94\xa4\x53\x96\x12\x39\x67\x4a\xf1\x94\x69\x12\xe8\x4d\x7c\xf5\xe4\xd9\x63\xc3\xed\x25\x33\xf1\x93\x67\x26\xde\xe1\x8e\x13\x91\x27\xdb\x7b\x99\x3c\xd1\x34\xe7\xe2\xd9\x11\x28\x9d\xd0\x8c\x0d\x3f\x74\xb8\x4c\x8c\xb0\x47\xfd\x3e\xe1\x5f\x46\x09\xc5\xb6\xa4\xe9\xfa\x26\xe0\x0b\x11\x32\xdd\xa6\x1f\x7d\x80\x5b\xc1\x94\x1a\x76\xb7\x95\xfd\xf5\x2b\x02\xb5\xbd\x25\xc8\x9d\x4f\x79\x7f\x78\xa2\xd4\x78\x11\x96\x63\xde\xaf\x7d\xb2\x4f\xb7\x4f\x5d\x95\x2e\x7e\x21\x8d\x4c\xb2\x1e\x51\xcf\xae\x87\xe4\x0f\x38\xf2\x7e\x33\xf5\x29\x69\x50\xba\xbb\x90\x39\xe5\x9d\x0b\x6d\xcc\xea\x85\xa9\xfd\x74\xaf\xc3\xb0\x04\xc7\x8d\x6b\x84\x4c\xf8\xb4\xb4\x37\x30\x77\x6b\x7a\x49\xa2\xf6\x28\x02\x48\x25\x7f\x44\x9a\x20\xef\x71\x58\xc9\x1c\x7e\x07\x81\x29\x04\xd3\x24\xd1\x4c\x68\x0e\x76\x92\xc8\x58\xed\xca\xbd\x61\x7d\x41\x74\x2f\x44\x21\xa5\x47\xde\xc9\x29\x17\xfe\x54\x4a\x67\x46\x9b\x50\x9e\xb5\x05\xc6\x8b\x54\xf1\xe4\x52\x85\xd6\xd9\xa5\xa0\xe3\xac\x8d\x17\x40\x9d\xac\x67\x14\xec\x9c\x0c\x7a\x9f\xa4\x5c\xdb\xff\x93\xd1\xe8\x1d\xe8\xc4\x4b\xe1\x65\x5d\xd0\x17\x3b\xb2\x16\x3c\xfd\xf1\x00\xee\xf7\xcc\x20\xa5\xd9\x21\xc7\xdd\x50\xa4\x76\xb2\x4c\xd7\xdc\x4e\xdc\x78\x98\xe9\x2f\x78\xce\xa2\xe5\x7e\xcc\xc8\xcd\x8c\x27\xb7\xd7\x91\xea\x5b\x2a\xfb\x4e\x44\xaf\x6a\x4c\xa8\xf9\xdb\x3e\x09\xa2\x9b\xea\x75\xf7\x0b\xec\x4d\x44\xcf\x47\x6e\xc1\x76\x18\x42\xb5\x96\x09\xaf\xec\x1c\xa0\x2e\xa9\x08\x7e\x0a\x04\x7f\xbf\x8b\x00\x9e\x7e\x4f\xde\xe4\x37\xcd\x57\x3d\xd5\x31\x2f\xe2\xc2\xaf\x75\xaf\x13\x47\xd4\xd8\x21\x4b\xf7\x4d\x2d\x2f\xb7\x97\x4d\x1b\x4a\x7b\xef\xc5\xed\x36\xc9\x4b\x49\xbe\xca\xe2\xd2\x36\x85\xfc\xdc\x2e\x2f\xdf\xde\x96\xda\x26\x90\x61\xd5\x6d\xb8\x61\xa9\xc3\x77\x4e\x8d\x0f\x87\xa9\x90\x45\x99\xa1\xaf\xc4\xfd\x93\x8b\x7b\xed\x2c\x7e\x67\x4f\x6a\xfd\xc7\x48\xb4\xd9\xd5\x11\xf8\xa7\x91\x73\x33\x12\xc9\x5e\xfd\xea\xeb\xaf\x7f\xec\x59\x38\xdb\x5e\x81\x1f\x22\x0d\x67\x4b\x95\xe8\x4b\xa4\xcd\x4b\xa4\x4d\x8c\x8a\x0f\x99\x46\x75\xcf\xb1\x34\x1d\x5d\x5c\xbb\xb9\xb7\xb6\x8f\x96\x69\xed\x04\xdb\xd5\x01\xb6\x43\x3c\xcc\x9e\xa2\x60\x3a\xfb\x82\x76\x89\x78\x79\x89\x73\xf9\xa9\xc5\xb9\xec\xe2\x03\xda\x3d\xa6\xa5\x8b\xef\xe7\x4f\x29\x7e\xa5\xc3\x61\x6c\x1f\x67\xd1\x3d\xba\xa2\x7b\x3e\xbb\xee\x9a\xad\x5d\x4a\x1a\xc5\xfa\x19\x77\x8b\xa8\x2a\x08\xfa\xc2\x83\x98\x1f\xcb\x48\x7b\xb0\x1e\xe5\x0e\x41\x3a\x5c\xa0\x70\x78\xd9\xa5\x96\xa0\xbb\x93\x7f\x18\x35\x4c\x1b\xe1\xf5\xd3\x58\x34\x7e\x9a\x26\x83\x97\xc2\x20\xcf\x5b\xa7\xad\x6b\xb9\x45\xbc\x26\x01\xce\x3a\x30\x62\x39\x8e\x73\x1a\x56\x67\xe4\xec\x7a\x68\xaf\xcb\x10\x3e\x43\x33\x3d\x20\x2b\xf8\xb4\xd7\x4b\x3a\xbe\xee\xf9\x33\x35\x86\xe5\x85\x69\xbf\xd9\x2f\x2a\xed\x27\x57\x69\xef\xac\x8f\xfb\x1c\x3a\x86\x0a\x90\x65\x4e\x45\xdf\x9e\x28\x50\x6e\xd7\xac\x60\x0d\x12\x3c\x20\xde\x2b\x17\x61\x41\x15\xc3\xa4\x4f\xf5\x8a\xb7\x34\xaa\x7f\xf8\x30\x4a\x48\x18\x7b\xe7\x95\x23\x03\x6d\x9c\xb4\x44\x2e\xb9\x7d\xba\xe5\x04\x28\xf8\x43\x15\x71\xe1\xda\xbd\xd9\xcc\x18\x32\xeb\x6b\x08\x44\xa9\x5a\xd5\x25\x61\x14\x85\x69\x96\xc9\x3b\xfc\x76\xcc\xc0\x2c\xf4\xed\x5c\x5c\x84\xd5\x98\x91\x9c\xdb\x4b\xb5\x53\x7e\xc6\xd3\x41\x53\xa4\x95\xa8\x99\x42\x81\x55\x39\x6b\xd6\x88\x99\x78\xa3\xed\x85\x54\xa0\x23\xb4\xfd\xb7\x77\xbc\xc1\xac\xb8\x8e\x26\x8c\xd9\x8c\xce\xb9\x2c\x15\xf6\x36\x92\x1c\xb8\x9f\x80\x25\x2c\x64\x19\x54\x53\x58\x25\x31\xac\x4e\xaf\x80\xd3\x55\xf5\x23\x88\xf2\xa9\xf4\xba\x84\x3e\xfb\xc2\xb5\x59\x5e\x8b\x07\x91\x4f\xda\xb6\x2f\xbc\x99\xeb\xc2\xb2\x85\xce\x15\xd1\x3e\xc7\xfd\xea\x82\xc9\x7c\x04\x3f\xfd\x88\xea\xa1\x6d\xcd\x45\xfa\x22\xeb\xec\x5b\xd6\x09\xe6\xaa\x8c\x27\x8b\xce\x95\xc2\x2a\x33\x95\xed\x4e\xde\x50\xcd\x52\xf2\x9e\x0a\x3a\xc5\x6b\xd9\xd1\xe8\xfa\xcd\xfb\x63\xbb\x6d\x70\xed\x1b\x5e\xac\xb4\x65\x8d\xe2\x39\x5c\xed\x33\x0c\x62\x69\x85\x3b\x70\xa2\x8e\x6b\xdc\x6b\x18\x07\x09\xdc\xa4\x5d\x82\xd8\xe5\xd0\xcb\x66\x8d\xc7\x06\x51\x98\xe7\xe9\x3d\xab\x3a\x72\xa1\x0d\xcd\xb2\xeb\x8c\x8a\xb3\xa2\x50\x72\xbe\xfa\x26\x5c\x0f\x0c\x77\x0d\x3d\x6b\x47\xdf\x07\xff\xb2\x40\x40\x83\xad\x57\x90\x61\x35\xfe\x80\x0c\x4d\xb8\x10\x4b\x01\x6c\xf0\xe0\xac\x34\x32\xa7\x86\x27\x07\xf6\xde\x7c\xf0\x9e\x8a\x92\x66\x2b\x3d\x8c\x36\x2e\x63\x9d\x58\xb7\xb1\xd3\xfa\xe4\x68\x2d\xba\x6d\x94\x0f\x36\xf7\x37\x54\x59\xda\x72\x3e\xfa\xdc\xa9\xaf\x36\xd4\x94\x4b\x94\x73\x03\x35\x5f\x4f\xbf\xfb\x24\xa3\xda\x7c\x2a\x52\x7b\x92\x1b\xbf\x6e\x22\xd2\x09\x35\x34\x93\xd3\x3f\x32\x9a\xad\xc6\xe7\x1a\x9e\x9c\xc7\xad\xbd\xf2\x07\x51\x66\x54\x8e\x43\xc3\x43\x4d\xac\x50\xec\xe3\xb5\x15\xcb\xd8\x9c\x0a\xe3\xbb\x63\xa5\x6c\x7d\xe8\xd6\x0f\x58\xc4\x2b\x85\x67\xca\x0c\x53\x39\x17\xf5\x31\x47\xd0\xf6\x5c\x8a\x94\xa3\xaa\x0f\x94\x59\xd8\xa3\x3e\xee\x7a\x54\x5b\xa7\xce\xdf\xa0\xc0\xaf\x53\x9e\x68\x3e\x75\x50\x60\xb3\xb1\x93\x09\x67\xf8\x12\x2c\xd7\xb5\xb9\x2d\x41\x8a\xdc\x0a\x2b\xcc\x41\xce\x8b\xd5\x44\x6a\x2b\x6f\xdf\xc6\xd3\xfb\x7e\x8f\x71\x0a\xeb\xfd\x22\xfb\x6e\xde\xeb\x14\xfd\x9b\x50\x0c\x9f\xed\xd2\x40\x73\x2a\xeb\x29\xe8\x2a\xbc\x0b\xdd\x30\xb8\xaf\x51\x5d\xbd\xd6\x68\x3d\xc5\x6f\x25\x2c\xb5\x93\x6b\xda\xe6\x4d\xaf\xd3\xda\x2a\xcb\xf7\xd2\xf5\xb3\x85\x94\xb7\x95\x45\xb5\x4c\x5f\x5e\xbf\x0c\x0f\x9d\x53\x9c\x72\xd7\x07\x4a\x0a\xce\x30\x51\x07\x15\x0e\x58\xc0\x59\x18\x4d\xdd\x4b\xcb\xc1\xec\x35\x0e\x7e\xeb\x39\x5b\x33\x2a\x76\x9d\xef\x82\x57\x0e\x53\x4c\x54\x01\xc6\x82\x93\x3f\x48\x67\x28\x75\x01\xa5\x96\x06\x00\xdf\xee\x11\x5d\x26\x33\x42\xb5\x9d\x9a\x45\x68\x7b\xe2\xd9\x20\xa7\x82\x4f\x98\x36\x83\x90\x87\x56\x7f\xf7\xcb\xbf\x0c\xc8\x5b\xa9\x88\xf3\xc3\xee\xf9\x0c\x10\x6e\x9e\x15\x5e\x70\x8d\x8b\x09\x7d\xab\x9b\x66\x21\x53\x37\xe9\x3b\x98\xac\xa1\xb7\x96\x87\xe1\x64\x4b\x06\xe6\x82\x53\x72\x60\x85\xbc\xe8\xd3\xff\xb0\x6c\xe9\x5f\x07\xe4\xe8\x0e\x98\xf6\x81\xfd\xf3\x00\x3f\x18\x7c\x09\xe3\x8b\x70\xf5\x61\x0c\xf3\x53\x7c\x3a\x65\x0a\xaf\x7c\x04\xc2\xe1\x8e\x5d\x06\x0b\x21\xa3\xc6\xde\xf2\x5b\x5d\x11\x9b\x13\xf9\xee\x97\x7f\x39\x20\x47\xf5\x75\x11\x2e\x52\xf6\x85\xfc\x12\x55\xbf\x5c\xdb\x35\x1e\x3b\x03\x8a\x5e\x08\x43\xbf\xd8\x31\x93\x99\xd4\x4c\xe0\xf5\xdb\x48\x32\xa3\x73\x46\xb4\xb4\xb7\x56\x96\x65\x7d\xa7\xd6\x26\x77\x14\xb2\x8a\x78\x50\x42\x10\x38\x29\xa8\x32\x35\x94\x18\x38\xad\x06\x7c\xcd\x6e\xdb\x54\x78\xf3\xef\x84\x0b\x67\x33\x72\xd6\x2a\xbb\xe7\x10\xd2\x88\x9b\x64\x24\x49\x66\x54\x4c\x43\x1c\xf5\xa4\x34\xa5\x62\x5b\xcc\x2d\x2d\xcf\xc0\x2d\x17\x9d\xc2\x6d\xbf\xe1\xa2\x69\xb9\x5f\xad\x0b\x9a\x72\xe3\x9d\xfe\x9d\x23\x9f\x59\x9c\xd8\x5d\x50\x7c\x5c\x1a\xa9\xf4\x49\xca\xe6\x2c\x3b\xd1\x7c\xda\xa7\x2a\x99\x71\xc3\x12\xbb\xac\x13\x5a\xf0\x7e\x22\x85\xdd\x71\xc8\x20\x90\xa7\x3f\x83\x22\x98\x7d\x3b\xd5\x2d\x79\x8d\x5b\x2e\x7a\xbb\x22\xec\x49\x15\x60\x7b\x5b\x63\x0b\x1d\xce\xf2\x42\x51\x9f\xf2\x08\xab\x05\xe5\xc5\xc9\x5e\x16\xeb\xd3\xf2\x76\xe7\x31\x87\x2e\xd3\x74\xd2\x1c\xc3\x1e\x3b\xf4\xd2\x80\x53\x59\xa3\x94\x39\x4d\x91\x94\x52\xb1\x78\x70\xe4\xb7\x20\x85\x84\xec\xc9\xa2\x9f\x60\x7d\xfb\x3e\x15\xa9\xfd\x37\xc6\xa3\x24\x8b\xbd\xc0\xb0\xe4\x9d\x08\xc1\xa7\xe1\xc5\xe3\x1c\x89\x92\xef\xe1\xd4\x3b\x79\xad\xa5\x10\x85\xa2\x2a\xb8\xec\x18\x55\x32\xcf\x34\xeb\x02\x2a\xd7\x7e\xd4\xff\x76\x36\x93\x90\x99\x6b\x9b\x48\xb5\xd9\xd2\x11\xc9\x8e\x2d\xe7\xfb\xae\xea\xd1\xac\x89\x6f\x07\x73\x69\xa0\x7c\xf4\x7c\x6d\x19\xfe\x82\x02\x0c\x66\xbd\x8d\xb6\x15\x0e\x79\x1b\xbd\x9d\x48\x7f\x65\x7e\xa0\x24\x5c\x4a\xb6\x5f\xa0\xaa\xfb\x4b\xad\xd2\x16\x2e\xca\x30\x6d\x08\x9d\x53\x9e\x81\x46\x5d\x8e\x35\x53\x73\x2c\x79\xe4\xd2\xe2\xd1\xe6\x3d\xcb\x55\x35\x40\x31\xea\x91\x6e\x3e\x7e\x0d\xcb\xbb\xb2\x69\x01\x70\x1b\x6a\xcc\x7e\xed\xac\xf7\x72\xef\xc1\xeb\xe5\xda\x9f\xed\x17\x76\xbc\xc6\x58\xfc\xfb\x23\xa3\xca\x8c\x19\x35\x37\x7c\x13\xdf\x5d\x42\xe9\x5a\x3f\xaf\x70\xa9\x10\xfa\x8e\x91\xa9\x34\x56\xc4\x2a\x01\xf7\x51\x26\xc5\x04\x34\x01\xd1\x1e\x1a\xa3\xab\x55\xde\x28\x0a\x71\x2f\x52\x74\x5c\x66\xbd\xe3\xf2\x3a\x9d\x74\xec\x30\xc9\x60\x6b\x4c\x01\x21\x05\x73\x7b\x87\x16\x08\xa0\x40\x8f\xb3\xe4\x9c\x69\xbd\x31\x35\x44\xdd\x85\x0f\x5b\xe3\x51\x6e\x98\xc3\x72\xff\x1b\xc6\x4f\x58\x01\x3a\x65\x86\xf2\xcc\x1f\x65\x04\x45\x80\xd2\x36\xea\xba\x71\x81\x8a\x51\xbd\x49\x40\x68\x66\xc4\xd2\x52\xe0\xa4\xa5\x60\xfd\x3b\xa9\x52\x72\x4e\x73\x96\x9d\x53\xcd\xdc\x58\x71\xb8\x1a\xee\xd1\xa1\xde\xeb\x94\x57\xeb\xbe\xd6\x4c\x19\x95\x3f\x1e\x89\x1c\x6e\x54\x57\x2c\x9c\x60\xcf\xab\x20\x6f\x54\xc9\x7a\xe4\xad\xe5\x5e\x3d\xf2\x49\xdc\x0a\x79\x77\xbf\xb9\x9a\x8d\x96\x8b\xba\x9b\x95\xcb\xdc\x02\x29\xf2\x5c\x42\x98\x9a\xc2\x27\x4c\x77\xc7\x19\x39\x82\xbf\x46\xd5\x58\x67\x36\xa1\xa9\x9f\x91\xfd\xe7\x92\x0a\xca\x5e\x14\x95\x9c\x2a\xa6\x31\xe7\xca\xca\x84\x7e\x6d\x55\xce\x7f\x60\xc2\x45\xbc\x6d\x9d\xde\x70\x55\x2f\x3f\x53\xcf\xd7\xa6\xd5\x2f\x6e\xbf\xdd\xc7\x8a\x6c\xa5\xa8\xb1\xd9\x0b\x2f\x9a\xe8\x1a\xe5\xd3\xba\x19\xae\x56\x3a\x45\x5c\x2f\x6a\x8b\x42\xc9\x26\xed\xa8\x5f\xdd\xf9\xe8\xf3\x7a\x60\xaf\xe5\x7d\xdb\xf8\xd3\x76\xb5\xd4\x7d\x15\x52\x5b\xcf\xcc\x56\x25\xd4\x8b\xfa\xe9\x45\xfd\xf4\x63\x52\x3f\x6d\xc5\xf8\x4d\x2a\xa7\x1f\x87\xb2\x69\xeb\x12\x37\x29\x98\x9e\xa5\x6a\xa9\xd5\x8a\x36\xaa\x93\x9e\xad\x22\x69\xeb\xd2\x5a\x2a\x8f\xfe\x7d\xd4\x46\x5b\x21\xb6\x41\x55\xf4\x0c\x95\x44\x6d\x04\x32\x96\xb6\x11\x13\x87\x51\xe3\x58\x50\xac\x0a\x26\x86\xe1\xbc\x4b\x4d\x2c\xce\xec\x2a\x2d\x5a\x01\x6e\xeb\xdc\x0e\xdd\xe4\xda\xcb\x5e\x4e\x60\x74\xe5\x04\x97\x26\x4b\x2e\x2e\xaf\x3f\x5e\x9e\x9f\xdd\x5c\x5e\x34\xe5\xbb\x55\x90\xde\x22\x89\x6d\xd6\x41\xf4\x23\x49\x6c\x4d\x03\x4b\x90\xd7\xfc\x64\x71\x60\xcd\x4f\x65\xc9\x57\xf5\xba\xbf\x5c\x78\x2f\x2e\x77\x2f\xfe\xb1\xfd\x74\xb6\x3d\x9e\xf6\x74\x02\xb6\xa0\xc7\x98\x95\x7b\x66\x32\x4b\xb5\xf7\x35\x1d\x5e\x84\xe8\x25\x2e\x92\xac\x4c\xad\x70\xf1\xe9\xd3\xf0\x42\x0f\x08\x79\xc3\x12\x5a\x6a\xd0\xc2\xa4\x52\x1c\x1a\xf2\xe1\xea\xdd\x9f\xc0\x87\x1a\x5a\xf4\x42\xb2\x0f\xc8\x20\xcb\x29\x26\xc1\x35\x98\x85\x8c\xbc\x61\x28\xa8\xc0\x97\x13\x5a\x58\x2a\xa6\xb1\xca\x82\x01\x59\x64\xc6\xb2\xc2\x52\xcc\x5b\x46\xaa\xdc\x9f\x76\xe0\xaa\x86\xb9\x77\x79\x9c\x32\x83\x91\x4e\x9b\xbc\x1a\x37\x42\x6d\x8b\xc6\xf5\x1e\xba\xd6\xda\xf5\xd1\xdd\xc6\xef\xa8\x76\x1a\xab\x95\xb3\xdd\xb2\xbf\xdb\xf5\x33\xeb\x55\x1c\x6b\x94\x1b\x48\x9e\xe1\xaf\xa5\x39\xdb\xc9\x56\x7a\x0c\x74\x22\xe1\xa6\xb5\x36\x75\xbd\x1b\xd0\xea\x9c\xf5\x4b\xba\x0c\xd6\x04\x72\xed\xc3\xc1\x8b\x3a\x9a\x72\xbb\xb9\x40\xc1\x8b\xb4\x56\x5d\xd2\x79\xdb\xd5\xdf\x95\xe3\x50\x5f\xb4\x9a\xaf\xd3\xc8\x90\x7f\xfc\xeb\xab\xff\x1f\x00\x00\xff\xff\xa3\x83\x53\x06\x03\xa4\x01\x00") func operatorsCoreosCom_subscriptionsYamlBytes() ([]byte, error) { return bindataRead( @@ -219,7 +219,7 @@ func operatorsCoreosCom_subscriptionsYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "operators.coreos.com_subscriptions.yaml", size: 130106, mode: os.FileMode(436), modTime: time.Unix(1606762436, 0)} + info := bindataFileInfo{name: "operators.coreos.com_subscriptions.yaml", size: 107523, mode: os.FileMode(436), modTime: time.Unix(1607977325, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/vendor/github.com/operator-framework/api/pkg/lib/version/version.go b/vendor/github.com/operator-framework/api/pkg/lib/version/version.go index 713c5779bb..a0ffb9fcbe 100644 --- a/vendor/github.com/operator-framework/api/pkg/lib/version/version.go +++ b/vendor/github.com/operator-framework/api/pkg/lib/version/version.go @@ -3,7 +3,7 @@ package version import ( "encoding/json" - "github.com/blang/semver" + semver "github.com/blang/semver/v4" ) // +k8s:openapi-gen=true diff --git a/vendor/github.com/operator-framework/api/pkg/validation/internal/crd.go b/vendor/github.com/operator-framework/api/pkg/validation/internal/crd.go index 220c0166c6..8f0e4fd012 100644 --- a/vendor/github.com/operator-framework/api/pkg/validation/internal/crd.go +++ b/vendor/github.com/operator-framework/api/pkg/validation/internal/crd.go @@ -11,7 +11,6 @@ import ( "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation" - "k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) @@ -40,7 +39,7 @@ func validateV1Beta1CRD(crd *v1beta1.CustomResourceDefinition) (result errors.Ma internalCRD := &apiextensions.CustomResourceDefinition{} v1beta1.SetDefaults_CustomResourceDefinition(crd) v1beta1.SetDefaults_CustomResourceDefinitionSpec(&crd.Spec) - err := scheme.Converter().Convert(crd, internalCRD, conversion.SourceToDest, nil) + err := scheme.Converter().Convert(crd, internalCRD, nil) if err != nil { result.Add(errors.ErrInvalidParse("error converting crd", err)) return result @@ -55,7 +54,7 @@ func validateV1CRD(crd *v1.CustomResourceDefinition) (result errors.ManifestResu internalCRD := &apiextensions.CustomResourceDefinition{} v1.SetDefaults_CustomResourceDefinition(crd) v1.SetDefaults_CustomResourceDefinitionSpec(&crd.Spec) - err := scheme.Converter().Convert(crd, internalCRD, conversion.SourceToDest, nil) + err := scheme.Converter().Convert(crd, internalCRD, nil) if err != nil { result.Add(errors.ErrInvalidParse("error converting crd", err)) return result diff --git a/vendor/github.com/operator-framework/api/pkg/validation/internal/operatorhub.go b/vendor/github.com/operator-framework/api/pkg/validation/internal/operatorhub.go index 8558ce6737..83c8fad8dd 100644 --- a/vendor/github.com/operator-framework/api/pkg/validation/internal/operatorhub.go +++ b/vendor/github.com/operator-framework/api/pkg/validation/internal/operatorhub.go @@ -10,7 +10,7 @@ import ( "path/filepath" "strings" - "github.com/blang/semver" + semver "github.com/blang/semver/v4" "github.com/operator-framework/api/pkg/manifests" "github.com/operator-framework/api/pkg/operators/v1alpha1" "github.com/operator-framework/api/pkg/validation/errors" diff --git a/vendor/github.com/prometheus/procfs/CODE_OF_CONDUCT.md b/vendor/github.com/prometheus/procfs/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..9a1aff4127 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/CODE_OF_CONDUCT.md @@ -0,0 +1,3 @@ +## Prometheus Community Code of Conduct + +Prometheus follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md). diff --git a/vendor/github.com/prometheus/procfs/cpuinfo.go b/vendor/github.com/prometheus/procfs/cpuinfo.go index 31d42f7124..b9fb589aa1 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo.go @@ -407,6 +407,50 @@ func parseCPUInfoPPC(info []byte) ([]CPUInfo, error) { return cpuinfo, nil } +func parseCPUInfoRISCV(info []byte) ([]CPUInfo, error) { + scanner := bufio.NewScanner(bytes.NewReader(info)) + + firstLine := firstNonEmptyLine(scanner) + if !strings.HasPrefix(firstLine, "processor") || !strings.Contains(firstLine, ":") { + return nil, errors.New("invalid cpuinfo file: " + firstLine) + } + field := strings.SplitN(firstLine, ": ", 2) + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + firstcpu := CPUInfo{Processor: uint(v)} + cpuinfo := []CPUInfo{firstcpu} + i := 0 + + for scanner.Scan() { + line := scanner.Text() + if !strings.Contains(line, ":") { + continue + } + field := strings.SplitN(line, ": ", 2) + switch strings.TrimSpace(field[0]) { + case "processor": + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + i = int(v) + cpuinfo = append(cpuinfo, CPUInfo{}) // start of the next processor + cpuinfo[i].Processor = uint(v) + case "hart": + cpuinfo[i].CoreID = field[1] + case "isa": + cpuinfo[i].ModelName = field[1] + } + } + return cpuinfo, nil +} + +func parseCPUInfoDummy(_ []byte) ([]CPUInfo, error) { // nolint:unused,deadcode + return nil, errors.New("not implemented") +} + // firstNonEmptyLine advances the scanner to the first non-empty line // and returns the contents of that line func firstNonEmptyLine(scanner *bufio.Scanner) string { diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_arm64.go b/vendor/github.com/prometheus/procfs/cpuinfo_armx.go similarity index 97% rename from vendor/github.com/prometheus/procfs/cpuinfo_arm64.go rename to vendor/github.com/prometheus/procfs/cpuinfo_armx.go index 4f5d172a35..44b590ed38 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo_arm64.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo_armx.go @@ -12,7 +12,7 @@ // limitations under the License. // +build linux -// +build arm64 +// +build arm arm64 package procfs diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_mips64le.go b/vendor/github.com/prometheus/procfs/cpuinfo_mips64le.go deleted file mode 100644 index 22d93f8ef0..0000000000 --- a/vendor/github.com/prometheus/procfs/cpuinfo_mips64le.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2020 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build linux - -package procfs - -var parseCPUInfo = parseCPUInfoMips diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_mipsle.go b/vendor/github.com/prometheus/procfs/cpuinfo_mipsle.go deleted file mode 100644 index 22d93f8ef0..0000000000 --- a/vendor/github.com/prometheus/procfs/cpuinfo_mipsle.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2020 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build linux - -package procfs - -var parseCPUInfo = parseCPUInfoMips diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_mips.go b/vendor/github.com/prometheus/procfs/cpuinfo_mipsx.go similarity index 94% rename from vendor/github.com/prometheus/procfs/cpuinfo_mips.go rename to vendor/github.com/prometheus/procfs/cpuinfo_mipsx.go index 22d93f8ef0..91e272573a 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo_mips.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo_mipsx.go @@ -12,6 +12,7 @@ // limitations under the License. // +build linux +// +build mips mipsle mips64 mips64le package procfs diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_arm.go b/vendor/github.com/prometheus/procfs/cpuinfo_others.go similarity index 82% rename from vendor/github.com/prometheus/procfs/cpuinfo_arm.go rename to vendor/github.com/prometheus/procfs/cpuinfo_others.go index 8355507706..95b5b4ec44 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo_arm.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo_others.go @@ -12,7 +12,8 @@ // limitations under the License. // +build linux +// +build !386,!amd64,!arm,!arm64,!mips,!mips64,!mips64le,!mipsle,!ppc64,!ppc64le,!riscv64,!s390x package procfs -var parseCPUInfo = parseCPUInfoARM +var parseCPUInfo = parseCPUInfoDummy diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_ppc64.go b/vendor/github.com/prometheus/procfs/cpuinfo_ppcx.go similarity index 96% rename from vendor/github.com/prometheus/procfs/cpuinfo_ppc64.go rename to vendor/github.com/prometheus/procfs/cpuinfo_ppcx.go index 64aee9c63c..6068bd571c 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo_ppc64.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo_ppcx.go @@ -12,6 +12,7 @@ // limitations under the License. // +build linux +// +build ppc64 ppc64le package procfs diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_default.go b/vendor/github.com/prometheus/procfs/cpuinfo_x86.go similarity index 100% rename from vendor/github.com/prometheus/procfs/cpuinfo_default.go rename to vendor/github.com/prometheus/procfs/cpuinfo_x86.go diff --git a/vendor/github.com/prometheus/procfs/fixtures.ttar b/vendor/github.com/prometheus/procfs/fixtures.ttar index 868c8573d9..12494d7424 100644 --- a/vendor/github.com/prometheus/procfs/fixtures.ttar +++ b/vendor/github.com/prometheus/procfs/fixtures.ttar @@ -467,7 +467,7 @@ Pid: 26231 PPid: 1 TracerPid: 0 Uid: 1000 1000 1000 0 -Gid: 0 0 0 0 +Gid: 1001 1001 1001 0 FDSize: 128 Groups: NStgid: 1 @@ -1966,7 +1966,7 @@ Lines: 1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/proc/mdstat -Lines: 56 +Lines: 60 Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md3 : active raid6 sda1[8] sdh1[7] sdg1[6] sdf1[5] sde1[11] sdd1[3] sdc1[10] sdb1[9] sdd1[10](S) sdd2[11](S) @@ -1989,6 +1989,10 @@ md8 : active raid1 sdb1[1] sda1[0] sdc[2](S) sde[3](S) 195310144 blocks [2/2] [UU] [=>...................] resync = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec +md201 : active raid1 sda3[0] sdb3[1] + 1993728 blocks super 1.2 [2/2] [UU] + [=>...................] check = 5.7% (114176/1993728) finish=0.2min speed=114176K/sec + md7 : active raid6 sdb1[0] sde1[3] sdd1[2] sdc1[1](F) 7813735424 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/3] [U_UU] bitmap: 0/30 pages [0KB], 65536KB chunk @@ -3754,6 +3758,73 @@ Path: fixtures/sys/class/powercap/intel-rapl:0:0/uevent Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/powercap/intel-rapl:a +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:a/constraint_0_max_power_uw +Lines: 1 +95000000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:a/constraint_0_name +Lines: 1 +long_term +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:a/constraint_0_power_limit_uw +Lines: 1 +4090000000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:a/constraint_0_time_window_us +Lines: 1 +999424 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:a/constraint_1_max_power_uw +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:a/constraint_1_name +Lines: 1 +short_term +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:a/constraint_1_power_limit_uw +Lines: 1 +4090000000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:a/constraint_1_time_window_us +Lines: 1 +2440 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:a/enabled +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:a/energy_uj +Lines: 1 +240422366267 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:a/max_energy_range_uj +Lines: 1 +262143328850 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:a/name +Lines: 1 +package-10 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:a/uevent +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/thermal Mode: 775 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/github.com/prometheus/procfs/kernel_random.go b/vendor/github.com/prometheus/procfs/kernel_random.go index beefdf02e9..da3a941d60 100644 --- a/vendor/github.com/prometheus/procfs/kernel_random.go +++ b/vendor/github.com/prometheus/procfs/kernel_random.go @@ -25,7 +25,7 @@ import ( type KernelRandom struct { // EntropyAvaliable gives the available entropy, in bits. EntropyAvaliable *uint64 - // PoolSize gives the size of the entropy pool, in bytes. + // PoolSize gives the size of the entropy pool, in bits. PoolSize *uint64 // URandomMinReseedSeconds is the number of seconds after which the DRNG will be reseeded. URandomMinReseedSeconds *uint64 diff --git a/vendor/github.com/prometheus/procfs/mdstat.go b/vendor/github.com/prometheus/procfs/mdstat.go index 3e9362a94d..98e37aa8ca 100644 --- a/vendor/github.com/prometheus/procfs/mdstat.go +++ b/vendor/github.com/prometheus/procfs/mdstat.go @@ -107,11 +107,14 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { syncedBlocks := size recovering := strings.Contains(lines[syncLineIdx], "recovery") resyncing := strings.Contains(lines[syncLineIdx], "resync") + checking := strings.Contains(lines[syncLineIdx], "check") // Append recovery and resyncing state info. - if recovering || resyncing { + if recovering || resyncing || checking { if recovering { state = "recovering" + } else if checking { + state = "checking" } else { state = "resyncing" } diff --git a/vendor/github.com/prometheus/procfs/proc_status.go b/vendor/github.com/prometheus/procfs/proc_status.go index c58346d910..6edd8333b3 100644 --- a/vendor/github.com/prometheus/procfs/proc_status.go +++ b/vendor/github.com/prometheus/procfs/proc_status.go @@ -72,8 +72,10 @@ type ProcStatus struct { // Number of involuntary context switches. NonVoluntaryCtxtSwitches uint64 - // UIDs of the process (Real, effective, saved set, and filesystem UIDs (GIDs)) + // UIDs of the process (Real, effective, saved set, and filesystem UIDs) UIDs [4]string + // GIDs of the process (Real, effective, saved set, and filesystem GIDs) + GIDs [4]string } // NewStatus returns the current status information of the process. @@ -119,6 +121,8 @@ func (s *ProcStatus) fillStatus(k string, vString string, vUint uint64, vUintByt s.Name = vString case "Uid": copy(s.UIDs[:], strings.Split(vString, "\t")) + case "Gid": + copy(s.GIDs[:], strings.Split(vString, "\t")) case "VmPeak": s.VmPeak = vUintBytes case "VmSize": diff --git a/vendor/github.com/shopspring/decimal/.gitignore b/vendor/github.com/shopspring/decimal/.gitignore new file mode 100644 index 0000000000..8a43ce9d7b --- /dev/null +++ b/vendor/github.com/shopspring/decimal/.gitignore @@ -0,0 +1,6 @@ +.git +*.swp + +# IntelliJ +.idea/ +*.iml diff --git a/vendor/github.com/shopspring/decimal/.travis.yml b/vendor/github.com/shopspring/decimal/.travis.yml new file mode 100644 index 0000000000..55d42b289d --- /dev/null +++ b/vendor/github.com/shopspring/decimal/.travis.yml @@ -0,0 +1,13 @@ +language: go + +go: + - 1.7.x + - 1.12.x + - 1.13.x + - tip + +install: + - go build . + +script: + - go test -v diff --git a/vendor/github.com/shopspring/decimal/CHANGELOG.md b/vendor/github.com/shopspring/decimal/CHANGELOG.md new file mode 100644 index 0000000000..01ba02feb2 --- /dev/null +++ b/vendor/github.com/shopspring/decimal/CHANGELOG.md @@ -0,0 +1,19 @@ +## Decimal v1.2.0 + +#### BREAKING +- Drop support for Go version older than 1.7 [#172](https://github.com/shopspring/decimal/pull/172) + +#### FEATURES +- Add NewFromInt and NewFromInt32 initializers [#72](https://github.com/shopspring/decimal/pull/72) +- Add support for Go modules [#157](https://github.com/shopspring/decimal/pull/157) +- Add BigInt, BigFloat helper methods [#171](https://github.com/shopspring/decimal/pull/171) + +#### ENHANCEMENTS +- Memory usage optimization [#160](https://github.com/shopspring/decimal/pull/160) +- Updated travis CI golang versions [#156](https://github.com/shopspring/decimal/pull/156) +- Update documentation [#173](https://github.com/shopspring/decimal/pull/173) +- Improve code quality [#174](https://github.com/shopspring/decimal/pull/174) + +#### BUGFIXES +- Revert remove insignificant digits [#159](https://github.com/shopspring/decimal/pull/159) +- Remove 15 interval for RoundCash [#166](https://github.com/shopspring/decimal/pull/166) diff --git a/vendor/github.com/shopspring/decimal/LICENSE b/vendor/github.com/shopspring/decimal/LICENSE new file mode 100644 index 0000000000..ad2148aaf9 --- /dev/null +++ b/vendor/github.com/shopspring/decimal/LICENSE @@ -0,0 +1,45 @@ +The MIT License (MIT) + +Copyright (c) 2015 Spring, Inc. + +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. + +- Based on https://github.com/oguzbilgic/fpd, which has the following license: +""" +The MIT License (MIT) + +Copyright (c) 2013 Oguz Bilgic + +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/shopspring/decimal/README.md b/vendor/github.com/shopspring/decimal/README.md new file mode 100644 index 0000000000..b70f901593 --- /dev/null +++ b/vendor/github.com/shopspring/decimal/README.md @@ -0,0 +1,130 @@ +# decimal + +[![Build Status](https://travis-ci.org/shopspring/decimal.png?branch=master)](https://travis-ci.org/shopspring/decimal) [![GoDoc](https://godoc.org/github.com/shopspring/decimal?status.svg)](https://godoc.org/github.com/shopspring/decimal) [![Go Report Card](https://goreportcard.com/badge/github.com/shopspring/decimal)](https://goreportcard.com/report/github.com/shopspring/decimal) + +Arbitrary-precision fixed-point decimal numbers in go. + +_Note:_ Decimal library can "only" represent numbers with a maximum of 2^31 digits after the decimal point. + +## Features + + * The zero-value is 0, and is safe to use without initialization + * Addition, subtraction, multiplication with no loss of precision + * Division with specified precision + * Database/sql serialization/deserialization + * JSON and XML serialization/deserialization + +## Install + +Run `go get github.com/shopspring/decimal` + +## Requirements + +Decimal library requires Go version `>=1.7` + +## Usage + +```go +package main + +import ( + "fmt" + "github.com/shopspring/decimal" +) + +func main() { + price, err := decimal.NewFromString("136.02") + if err != nil { + panic(err) + } + + quantity := decimal.NewFromInt(3) + + fee, _ := decimal.NewFromString(".035") + taxRate, _ := decimal.NewFromString(".08875") + + subtotal := price.Mul(quantity) + + preTax := subtotal.Mul(fee.Add(decimal.NewFromFloat(1))) + + total := preTax.Mul(taxRate.Add(decimal.NewFromFloat(1))) + + fmt.Println("Subtotal:", subtotal) // Subtotal: 408.06 + fmt.Println("Pre-tax:", preTax) // Pre-tax: 422.3421 + fmt.Println("Taxes:", total.Sub(preTax)) // Taxes: 37.482861375 + fmt.Println("Total:", total) // Total: 459.824961375 + fmt.Println("Tax rate:", total.Sub(preTax).Div(preTax)) // Tax rate: 0.08875 +} +``` + +## Documentation + +http://godoc.org/github.com/shopspring/decimal + +## Production Usage + +* [Spring](https://shopspring.com/), since August 14, 2014. +* If you are using this in production, please let us know! + +## FAQ + +#### Why don't you just use float64? + +Because float64 (or any binary floating point type, actually) can't represent +numbers such as `0.1` exactly. + +Consider this code: http://play.golang.org/p/TQBd4yJe6B You might expect that +it prints out `10`, but it actually prints `9.999999999999831`. Over time, +these small errors can really add up! + +#### Why don't you just use big.Rat? + +big.Rat is fine for representing rational numbers, but Decimal is better for +representing money. Why? Here's a (contrived) example: + +Let's say you use big.Rat, and you have two numbers, x and y, both +representing 1/3, and you have `z = 1 - x - y = 1/3`. If you print each one +out, the string output has to stop somewhere (let's say it stops at 3 decimal +digits, for simplicity), so you'll get 0.333, 0.333, and 0.333. But where did +the other 0.001 go? + +Here's the above example as code: http://play.golang.org/p/lCZZs0w9KE + +With Decimal, the strings being printed out represent the number exactly. So, +if you have `x = y = 1/3` (with precision 3), they will actually be equal to +0.333, and when you do `z = 1 - x - y`, `z` will be equal to .334. No money is +unaccounted for! + +You still have to be careful. If you want to split a number `N` 3 ways, you +can't just send `N/3` to three different people. You have to pick one to send +`N - (2/3*N)` to. That person will receive the fraction of a penny remainder. + +But, it is much easier to be careful with Decimal than with big.Rat. + +#### Why isn't the API similar to big.Int's? + +big.Int's API is built to reduce the number of memory allocations for maximal +performance. This makes sense for its use-case, but the trade-off is that the +API is awkward and easy to misuse. + +For example, to add two big.Ints, you do: `z := new(big.Int).Add(x, y)`. A +developer unfamiliar with this API might try to do `z := a.Add(a, b)`. This +modifies `a` and sets `z` as an alias for `a`, which they might not expect. It +also modifies any other aliases to `a`. + +Here's an example of the subtle bugs you can introduce with big.Int's API: +https://play.golang.org/p/x2R_78pa8r + +In contrast, it's difficult to make such mistakes with decimal. Decimals +behave like other go numbers types: even though `a = b` will not deep copy +`b` into `a`, it is impossible to modify a Decimal, since all Decimal methods +return new Decimals and do not modify the originals. The downside is that +this causes extra allocations, so Decimal is less performant. My assumption +is that if you're using Decimals, you probably care more about correctness +than performance. + +## License + +The MIT License (MIT) + +This is a heavily modified fork of [fpd.Decimal](https://github.com/oguzbilgic/fpd), which was also released under the MIT License. diff --git a/vendor/github.com/shopspring/decimal/decimal-go.go b/vendor/github.com/shopspring/decimal/decimal-go.go new file mode 100644 index 0000000000..9958d69020 --- /dev/null +++ b/vendor/github.com/shopspring/decimal/decimal-go.go @@ -0,0 +1,415 @@ +// Copyright 2009 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. + +// Multiprecision decimal numbers. +// For floating-point formatting only; not general purpose. +// Only operations are assign and (binary) left/right shift. +// Can do binary floating point in multiprecision decimal precisely +// because 2 divides 10; cannot do decimal floating point +// in multiprecision binary precisely. + +package decimal + +type decimal struct { + d [800]byte // digits, big-endian representation + nd int // number of digits used + dp int // decimal point + neg bool // negative flag + trunc bool // discarded nonzero digits beyond d[:nd] +} + +func (a *decimal) String() string { + n := 10 + a.nd + if a.dp > 0 { + n += a.dp + } + if a.dp < 0 { + n += -a.dp + } + + buf := make([]byte, n) + w := 0 + switch { + case a.nd == 0: + return "0" + + case a.dp <= 0: + // zeros fill space between decimal point and digits + buf[w] = '0' + w++ + buf[w] = '.' + w++ + w += digitZero(buf[w : w+-a.dp]) + w += copy(buf[w:], a.d[0:a.nd]) + + case a.dp < a.nd: + // decimal point in middle of digits + w += copy(buf[w:], a.d[0:a.dp]) + buf[w] = '.' + w++ + w += copy(buf[w:], a.d[a.dp:a.nd]) + + default: + // zeros fill space between digits and decimal point + w += copy(buf[w:], a.d[0:a.nd]) + w += digitZero(buf[w : w+a.dp-a.nd]) + } + return string(buf[0:w]) +} + +func digitZero(dst []byte) int { + for i := range dst { + dst[i] = '0' + } + return len(dst) +} + +// trim trailing zeros from number. +// (They are meaningless; the decimal point is tracked +// independent of the number of digits.) +func trim(a *decimal) { + for a.nd > 0 && a.d[a.nd-1] == '0' { + a.nd-- + } + if a.nd == 0 { + a.dp = 0 + } +} + +// Assign v to a. +func (a *decimal) Assign(v uint64) { + var buf [24]byte + + // Write reversed decimal in buf. + n := 0 + for v > 0 { + v1 := v / 10 + v -= 10 * v1 + buf[n] = byte(v + '0') + n++ + v = v1 + } + + // Reverse again to produce forward decimal in a.d. + a.nd = 0 + for n--; n >= 0; n-- { + a.d[a.nd] = buf[n] + a.nd++ + } + a.dp = a.nd + trim(a) +} + +// Maximum shift that we can do in one pass without overflow. +// A uint has 32 or 64 bits, and we have to be able to accommodate 9<> 63) +const maxShift = uintSize - 4 + +// Binary shift right (/ 2) by k bits. k <= maxShift to avoid overflow. +func rightShift(a *decimal, k uint) { + r := 0 // read pointer + w := 0 // write pointer + + // Pick up enough leading digits to cover first shift. + var n uint + for ; n>>k == 0; r++ { + if r >= a.nd { + if n == 0 { + // a == 0; shouldn't get here, but handle anyway. + a.nd = 0 + return + } + for n>>k == 0 { + n = n * 10 + r++ + } + break + } + c := uint(a.d[r]) + n = n*10 + c - '0' + } + a.dp -= r - 1 + + var mask uint = (1 << k) - 1 + + // Pick up a digit, put down a digit. + for ; r < a.nd; r++ { + c := uint(a.d[r]) + dig := n >> k + n &= mask + a.d[w] = byte(dig + '0') + w++ + n = n*10 + c - '0' + } + + // Put down extra digits. + for n > 0 { + dig := n >> k + n &= mask + if w < len(a.d) { + a.d[w] = byte(dig + '0') + w++ + } else if dig > 0 { + a.trunc = true + } + n = n * 10 + } + + a.nd = w + trim(a) +} + +// Cheat sheet for left shift: table indexed by shift count giving +// number of new digits that will be introduced by that shift. +// +// For example, leftcheats[4] = {2, "625"}. That means that +// if we are shifting by 4 (multiplying by 16), it will add 2 digits +// when the string prefix is "625" through "999", and one fewer digit +// if the string prefix is "000" through "624". +// +// Credit for this trick goes to Ken. + +type leftCheat struct { + delta int // number of new digits + cutoff string // minus one digit if original < a. +} + +var leftcheats = []leftCheat{ + // Leading digits of 1/2^i = 5^i. + // 5^23 is not an exact 64-bit floating point number, + // so have to use bc for the math. + // Go up to 60 to be large enough for 32bit and 64bit platforms. + /* + seq 60 | sed 's/^/5^/' | bc | + awk 'BEGIN{ print "\t{ 0, \"\" }," } + { + log2 = log(2)/log(10) + printf("\t{ %d, \"%s\" },\t// * %d\n", + int(log2*NR+1), $0, 2**NR) + }' + */ + {0, ""}, + {1, "5"}, // * 2 + {1, "25"}, // * 4 + {1, "125"}, // * 8 + {2, "625"}, // * 16 + {2, "3125"}, // * 32 + {2, "15625"}, // * 64 + {3, "78125"}, // * 128 + {3, "390625"}, // * 256 + {3, "1953125"}, // * 512 + {4, "9765625"}, // * 1024 + {4, "48828125"}, // * 2048 + {4, "244140625"}, // * 4096 + {4, "1220703125"}, // * 8192 + {5, "6103515625"}, // * 16384 + {5, "30517578125"}, // * 32768 + {5, "152587890625"}, // * 65536 + {6, "762939453125"}, // * 131072 + {6, "3814697265625"}, // * 262144 + {6, "19073486328125"}, // * 524288 + {7, "95367431640625"}, // * 1048576 + {7, "476837158203125"}, // * 2097152 + {7, "2384185791015625"}, // * 4194304 + {7, "11920928955078125"}, // * 8388608 + {8, "59604644775390625"}, // * 16777216 + {8, "298023223876953125"}, // * 33554432 + {8, "1490116119384765625"}, // * 67108864 + {9, "7450580596923828125"}, // * 134217728 + {9, "37252902984619140625"}, // * 268435456 + {9, "186264514923095703125"}, // * 536870912 + {10, "931322574615478515625"}, // * 1073741824 + {10, "4656612873077392578125"}, // * 2147483648 + {10, "23283064365386962890625"}, // * 4294967296 + {10, "116415321826934814453125"}, // * 8589934592 + {11, "582076609134674072265625"}, // * 17179869184 + {11, "2910383045673370361328125"}, // * 34359738368 + {11, "14551915228366851806640625"}, // * 68719476736 + {12, "72759576141834259033203125"}, // * 137438953472 + {12, "363797880709171295166015625"}, // * 274877906944 + {12, "1818989403545856475830078125"}, // * 549755813888 + {13, "9094947017729282379150390625"}, // * 1099511627776 + {13, "45474735088646411895751953125"}, // * 2199023255552 + {13, "227373675443232059478759765625"}, // * 4398046511104 + {13, "1136868377216160297393798828125"}, // * 8796093022208 + {14, "5684341886080801486968994140625"}, // * 17592186044416 + {14, "28421709430404007434844970703125"}, // * 35184372088832 + {14, "142108547152020037174224853515625"}, // * 70368744177664 + {15, "710542735760100185871124267578125"}, // * 140737488355328 + {15, "3552713678800500929355621337890625"}, // * 281474976710656 + {15, "17763568394002504646778106689453125"}, // * 562949953421312 + {16, "88817841970012523233890533447265625"}, // * 1125899906842624 + {16, "444089209850062616169452667236328125"}, // * 2251799813685248 + {16, "2220446049250313080847263336181640625"}, // * 4503599627370496 + {16, "11102230246251565404236316680908203125"}, // * 9007199254740992 + {17, "55511151231257827021181583404541015625"}, // * 18014398509481984 + {17, "277555756156289135105907917022705078125"}, // * 36028797018963968 + {17, "1387778780781445675529539585113525390625"}, // * 72057594037927936 + {18, "6938893903907228377647697925567626953125"}, // * 144115188075855872 + {18, "34694469519536141888238489627838134765625"}, // * 288230376151711744 + {18, "173472347597680709441192448139190673828125"}, // * 576460752303423488 + {19, "867361737988403547205962240695953369140625"}, // * 1152921504606846976 +} + +// Is the leading prefix of b lexicographically less than s? +func prefixIsLessThan(b []byte, s string) bool { + for i := 0; i < len(s); i++ { + if i >= len(b) { + return true + } + if b[i] != s[i] { + return b[i] < s[i] + } + } + return false +} + +// Binary shift left (* 2) by k bits. k <= maxShift to avoid overflow. +func leftShift(a *decimal, k uint) { + delta := leftcheats[k].delta + if prefixIsLessThan(a.d[0:a.nd], leftcheats[k].cutoff) { + delta-- + } + + r := a.nd // read index + w := a.nd + delta // write index + + // Pick up a digit, put down a digit. + var n uint + for r--; r >= 0; r-- { + n += (uint(a.d[r]) - '0') << k + quo := n / 10 + rem := n - 10*quo + w-- + if w < len(a.d) { + a.d[w] = byte(rem + '0') + } else if rem != 0 { + a.trunc = true + } + n = quo + } + + // Put down extra digits. + for n > 0 { + quo := n / 10 + rem := n - 10*quo + w-- + if w < len(a.d) { + a.d[w] = byte(rem + '0') + } else if rem != 0 { + a.trunc = true + } + n = quo + } + + a.nd += delta + if a.nd >= len(a.d) { + a.nd = len(a.d) + } + a.dp += delta + trim(a) +} + +// Binary shift left (k > 0) or right (k < 0). +func (a *decimal) Shift(k int) { + switch { + case a.nd == 0: + // nothing to do: a == 0 + case k > 0: + for k > maxShift { + leftShift(a, maxShift) + k -= maxShift + } + leftShift(a, uint(k)) + case k < 0: + for k < -maxShift { + rightShift(a, maxShift) + k += maxShift + } + rightShift(a, uint(-k)) + } +} + +// If we chop a at nd digits, should we round up? +func shouldRoundUp(a *decimal, nd int) bool { + if nd < 0 || nd >= a.nd { + return false + } + if a.d[nd] == '5' && nd+1 == a.nd { // exactly halfway - round to even + // if we truncated, a little higher than what's recorded - always round up + if a.trunc { + return true + } + return nd > 0 && (a.d[nd-1]-'0')%2 != 0 + } + // not halfway - digit tells all + return a.d[nd] >= '5' +} + +// Round a to nd digits (or fewer). +// If nd is zero, it means we're rounding +// just to the left of the digits, as in +// 0.09 -> 0.1. +func (a *decimal) Round(nd int) { + if nd < 0 || nd >= a.nd { + return + } + if shouldRoundUp(a, nd) { + a.RoundUp(nd) + } else { + a.RoundDown(nd) + } +} + +// Round a down to nd digits (or fewer). +func (a *decimal) RoundDown(nd int) { + if nd < 0 || nd >= a.nd { + return + } + a.nd = nd + trim(a) +} + +// Round a up to nd digits (or fewer). +func (a *decimal) RoundUp(nd int) { + if nd < 0 || nd >= a.nd { + return + } + + // round up + for i := nd - 1; i >= 0; i-- { + c := a.d[i] + if c < '9' { // can stop after this digit + a.d[i]++ + a.nd = i + 1 + return + } + } + + // Number is all 9s. + // Change to single 1 with adjusted decimal point. + a.d[0] = '1' + a.nd = 1 + a.dp++ +} + +// Extract integer part, rounded appropriately. +// No guarantees about overflow. +func (a *decimal) RoundedInteger() uint64 { + if a.dp > 20 { + return 0xFFFFFFFFFFFFFFFF + } + var i int + n := uint64(0) + for i = 0; i < a.dp && i < a.nd; i++ { + n = n*10 + uint64(a.d[i]-'0') + } + for ; i < a.dp; i++ { + n *= 10 + } + if shouldRoundUp(a, a.dp) { + n++ + } + return n +} diff --git a/vendor/github.com/shopspring/decimal/decimal.go b/vendor/github.com/shopspring/decimal/decimal.go new file mode 100644 index 0000000000..801c1a0457 --- /dev/null +++ b/vendor/github.com/shopspring/decimal/decimal.go @@ -0,0 +1,1477 @@ +// Package decimal implements an arbitrary precision fixed-point decimal. +// +// The zero-value of a Decimal is 0, as you would expect. +// +// The best way to create a new Decimal is to use decimal.NewFromString, ex: +// +// n, err := decimal.NewFromString("-123.4567") +// n.String() // output: "-123.4567" +// +// To use Decimal as part of a struct: +// +// type Struct struct { +// Number Decimal +// } +// +// Note: This can "only" represent numbers with a maximum of 2^31 digits after the decimal point. +package decimal + +import ( + "database/sql/driver" + "encoding/binary" + "fmt" + "math" + "math/big" + "strconv" + "strings" +) + +// DivisionPrecision is the number of decimal places in the result when it +// doesn't divide exactly. +// +// Example: +// +// d1 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(3)) +// d1.String() // output: "0.6666666666666667" +// d2 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(30000)) +// d2.String() // output: "0.0000666666666667" +// d3 := decimal.NewFromFloat(20000).Div(decimal.NewFromFloat(3)) +// d3.String() // output: "6666.6666666666666667" +// decimal.DivisionPrecision = 3 +// d4 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(3)) +// d4.String() // output: "0.667" +// +var DivisionPrecision = 16 + +// MarshalJSONWithoutQuotes should be set to true if you want the decimal to +// be JSON marshaled as a number, instead of as a string. +// WARNING: this is dangerous for decimals with many digits, since many JSON +// unmarshallers (ex: Javascript's) will unmarshal JSON numbers to IEEE 754 +// double-precision floating point numbers, which means you can potentially +// silently lose precision. +var MarshalJSONWithoutQuotes = false + +// Zero constant, to make computations faster. +// Zero should never be compared with == or != directly, please use decimal.Equal or decimal.Cmp instead. +var Zero = New(0, 1) + +var zeroInt = big.NewInt(0) +var oneInt = big.NewInt(1) +var twoInt = big.NewInt(2) +var fourInt = big.NewInt(4) +var fiveInt = big.NewInt(5) +var tenInt = big.NewInt(10) +var twentyInt = big.NewInt(20) + +// Decimal represents a fixed-point decimal. It is immutable. +// number = value * 10 ^ exp +type Decimal struct { + value *big.Int + + // NOTE(vadim): this must be an int32, because we cast it to float64 during + // calculations. If exp is 64 bit, we might lose precision. + // If we cared about being able to represent every possible decimal, we + // could make exp a *big.Int but it would hurt performance and numbers + // like that are unrealistic. + exp int32 +} + +// New returns a new fixed-point decimal, value * 10 ^ exp. +func New(value int64, exp int32) Decimal { + return Decimal{ + value: big.NewInt(value), + exp: exp, + } +} + +// NewFromInt converts a int64 to Decimal. +// +// Example: +// +// NewFromInt(123).String() // output: "123" +// NewFromInt(-10).String() // output: "-10" +func NewFromInt(value int64) Decimal { + return Decimal{ + value: big.NewInt(value), + exp: 0, + } +} + +// NewFromInt32 converts a int32 to Decimal. +// +// Example: +// +// NewFromInt(123).String() // output: "123" +// NewFromInt(-10).String() // output: "-10" +func NewFromInt32(value int32) Decimal { + return Decimal{ + value: big.NewInt(int64(value)), + exp: 0, + } +} + +// NewFromBigInt returns a new Decimal from a big.Int, value * 10 ^ exp +func NewFromBigInt(value *big.Int, exp int32) Decimal { + return Decimal{ + value: big.NewInt(0).Set(value), + exp: exp, + } +} + +// NewFromString returns a new Decimal from a string representation. +// Trailing zeroes are not trimmed. +// +// Example: +// +// d, err := NewFromString("-123.45") +// d2, err := NewFromString(".0001") +// d3, err := NewFromString("1.47000") +// +func NewFromString(value string) (Decimal, error) { + originalInput := value + var intString string + var exp int64 + + // Check if number is using scientific notation + eIndex := strings.IndexAny(value, "Ee") + if eIndex != -1 { + expInt, err := strconv.ParseInt(value[eIndex+1:], 10, 32) + if err != nil { + if e, ok := err.(*strconv.NumError); ok && e.Err == strconv.ErrRange { + return Decimal{}, fmt.Errorf("can't convert %s to decimal: fractional part too long", value) + } + return Decimal{}, fmt.Errorf("can't convert %s to decimal: exponent is not numeric", value) + } + value = value[:eIndex] + exp = expInt + } + + parts := strings.Split(value, ".") + if len(parts) == 1 { + // There is no decimal point, we can just parse the original string as + // an int + intString = value + } else if len(parts) == 2 { + intString = parts[0] + parts[1] + expInt := -len(parts[1]) + exp += int64(expInt) + } else { + return Decimal{}, fmt.Errorf("can't convert %s to decimal: too many .s", value) + } + + dValue := new(big.Int) + _, ok := dValue.SetString(intString, 10) + if !ok { + return Decimal{}, fmt.Errorf("can't convert %s to decimal", value) + } + + if exp < math.MinInt32 || exp > math.MaxInt32 { + // NOTE(vadim): I doubt a string could realistically be this long + return Decimal{}, fmt.Errorf("can't convert %s to decimal: fractional part too long", originalInput) + } + + return Decimal{ + value: dValue, + exp: int32(exp), + }, nil +} + +// RequireFromString returns a new Decimal from a string representation +// or panics if NewFromString would have returned an error. +// +// Example: +// +// d := RequireFromString("-123.45") +// d2 := RequireFromString(".0001") +// +func RequireFromString(value string) Decimal { + dec, err := NewFromString(value) + if err != nil { + panic(err) + } + return dec +} + +// NewFromFloat converts a float64 to Decimal. +// +// The converted number will contain the number of significant digits that can be +// represented in a float with reliable roundtrip. +// This is typically 15 digits, but may be more in some cases. +// See https://www.exploringbinary.com/decimal-precision-of-binary-floating-point-numbers/ for more information. +// +// For slightly faster conversion, use NewFromFloatWithExponent where you can specify the precision in absolute terms. +// +// NOTE: this will panic on NaN, +/-inf +func NewFromFloat(value float64) Decimal { + if value == 0 { + return New(0, 0) + } + return newFromFloat(value, math.Float64bits(value), &float64info) +} + +// NewFromFloat32 converts a float32 to Decimal. +// +// The converted number will contain the number of significant digits that can be +// represented in a float with reliable roundtrip. +// This is typically 6-8 digits depending on the input. +// See https://www.exploringbinary.com/decimal-precision-of-binary-floating-point-numbers/ for more information. +// +// For slightly faster conversion, use NewFromFloatWithExponent where you can specify the precision in absolute terms. +// +// NOTE: this will panic on NaN, +/-inf +func NewFromFloat32(value float32) Decimal { + if value == 0 { + return New(0, 0) + } + // XOR is workaround for https://github.com/golang/go/issues/26285 + a := math.Float32bits(value) ^ 0x80808080 + return newFromFloat(float64(value), uint64(a)^0x80808080, &float32info) +} + +func newFromFloat(val float64, bits uint64, flt *floatInfo) Decimal { + if math.IsNaN(val) || math.IsInf(val, 0) { + panic(fmt.Sprintf("Cannot create a Decimal from %v", val)) + } + exp := int(bits>>flt.mantbits) & (1<>(flt.expbits+flt.mantbits) != 0 + + roundShortest(&d, mant, exp, flt) + // If less than 19 digits, we can do calculation in an int64. + if d.nd < 19 { + tmp := int64(0) + m := int64(1) + for i := d.nd - 1; i >= 0; i-- { + tmp += m * int64(d.d[i]-'0') + m *= 10 + } + if d.neg { + tmp *= -1 + } + return Decimal{value: big.NewInt(tmp), exp: int32(d.dp) - int32(d.nd)} + } + dValue := new(big.Int) + dValue, ok := dValue.SetString(string(d.d[:d.nd]), 10) + if ok { + return Decimal{value: dValue, exp: int32(d.dp) - int32(d.nd)} + } + + return NewFromFloatWithExponent(val, int32(d.dp)-int32(d.nd)) +} + +// NewFromFloatWithExponent converts a float64 to Decimal, with an arbitrary +// number of fractional digits. +// +// Example: +// +// NewFromFloatWithExponent(123.456, -2).String() // output: "123.46" +// +func NewFromFloatWithExponent(value float64, exp int32) Decimal { + if math.IsNaN(value) || math.IsInf(value, 0) { + panic(fmt.Sprintf("Cannot create a Decimal from %v", value)) + } + + bits := math.Float64bits(value) + mant := bits & (1<<52 - 1) + exp2 := int32((bits >> 52) & (1<<11 - 1)) + sign := bits >> 63 + + if exp2 == 0 { + // specials + if mant == 0 { + return Decimal{} + } + // subnormal + exp2++ + } else { + // normal + mant |= 1 << 52 + } + + exp2 -= 1023 + 52 + + // normalizing base-2 values + for mant&1 == 0 { + mant = mant >> 1 + exp2++ + } + + // maximum number of fractional base-10 digits to represent 2^N exactly cannot be more than -N if N<0 + if exp < 0 && exp < exp2 { + if exp2 < 0 { + exp = exp2 + } else { + exp = 0 + } + } + + // representing 10^M * 2^N as 5^M * 2^(M+N) + exp2 -= exp + + temp := big.NewInt(1) + dMant := big.NewInt(int64(mant)) + + // applying 5^M + if exp > 0 { + temp = temp.SetInt64(int64(exp)) + temp = temp.Exp(fiveInt, temp, nil) + } else if exp < 0 { + temp = temp.SetInt64(-int64(exp)) + temp = temp.Exp(fiveInt, temp, nil) + dMant = dMant.Mul(dMant, temp) + temp = temp.SetUint64(1) + } + + // applying 2^(M+N) + if exp2 > 0 { + dMant = dMant.Lsh(dMant, uint(exp2)) + } else if exp2 < 0 { + temp = temp.Lsh(temp, uint(-exp2)) + } + + // rounding and downscaling + if exp > 0 || exp2 < 0 { + halfDown := new(big.Int).Rsh(temp, 1) + dMant = dMant.Add(dMant, halfDown) + dMant = dMant.Quo(dMant, temp) + } + + if sign == 1 { + dMant = dMant.Neg(dMant) + } + + return Decimal{ + value: dMant, + exp: exp, + } +} + +// rescale returns a rescaled version of the decimal. Returned +// decimal may be less precise if the given exponent is bigger +// than the initial exponent of the Decimal. +// NOTE: this will truncate, NOT round +// +// Example: +// +// d := New(12345, -4) +// d2 := d.rescale(-1) +// d3 := d2.rescale(-4) +// println(d1) +// println(d2) +// println(d3) +// +// Output: +// +// 1.2345 +// 1.2 +// 1.2000 +// +func (d Decimal) rescale(exp int32) Decimal { + d.ensureInitialized() + + if d.exp == exp { + return Decimal{ + new(big.Int).Set(d.value), + d.exp, + } + } + + // NOTE(vadim): must convert exps to float64 before - to prevent overflow + diff := math.Abs(float64(exp) - float64(d.exp)) + value := new(big.Int).Set(d.value) + + expScale := new(big.Int).Exp(tenInt, big.NewInt(int64(diff)), nil) + if exp > d.exp { + value = value.Quo(value, expScale) + } else if exp < d.exp { + value = value.Mul(value, expScale) + } + + return Decimal{ + value: value, + exp: exp, + } +} + +// Abs returns the absolute value of the decimal. +func (d Decimal) Abs() Decimal { + d.ensureInitialized() + d2Value := new(big.Int).Abs(d.value) + return Decimal{ + value: d2Value, + exp: d.exp, + } +} + +// Add returns d + d2. +func (d Decimal) Add(d2 Decimal) Decimal { + rd, rd2 := RescalePair(d, d2) + + d3Value := new(big.Int).Add(rd.value, rd2.value) + return Decimal{ + value: d3Value, + exp: rd.exp, + } +} + +// Sub returns d - d2. +func (d Decimal) Sub(d2 Decimal) Decimal { + rd, rd2 := RescalePair(d, d2) + + d3Value := new(big.Int).Sub(rd.value, rd2.value) + return Decimal{ + value: d3Value, + exp: rd.exp, + } +} + +// Neg returns -d. +func (d Decimal) Neg() Decimal { + d.ensureInitialized() + val := new(big.Int).Neg(d.value) + return Decimal{ + value: val, + exp: d.exp, + } +} + +// Mul returns d * d2. +func (d Decimal) Mul(d2 Decimal) Decimal { + d.ensureInitialized() + d2.ensureInitialized() + + expInt64 := int64(d.exp) + int64(d2.exp) + if expInt64 > math.MaxInt32 || expInt64 < math.MinInt32 { + // NOTE(vadim): better to panic than give incorrect results, as + // Decimals are usually used for money + panic(fmt.Sprintf("exponent %v overflows an int32!", expInt64)) + } + + d3Value := new(big.Int).Mul(d.value, d2.value) + return Decimal{ + value: d3Value, + exp: int32(expInt64), + } +} + +// Shift shifts the decimal in base 10. +// It shifts left when shift is positive and right if shift is negative. +// In simpler terms, the given value for shift is added to the exponent +// of the decimal. +func (d Decimal) Shift(shift int32) Decimal { + d.ensureInitialized() + return Decimal{ + value: new(big.Int).Set(d.value), + exp: d.exp + shift, + } +} + +// Div returns d / d2. If it doesn't divide exactly, the result will have +// DivisionPrecision digits after the decimal point. +func (d Decimal) Div(d2 Decimal) Decimal { + return d.DivRound(d2, int32(DivisionPrecision)) +} + +// QuoRem does divsion with remainder +// d.QuoRem(d2,precision) returns quotient q and remainder r such that +// d = d2 * q + r, q an integer multiple of 10^(-precision) +// 0 <= r < abs(d2) * 10 ^(-precision) if d>=0 +// 0 >= r > -abs(d2) * 10 ^(-precision) if d<0 +// Note that precision<0 is allowed as input. +func (d Decimal) QuoRem(d2 Decimal, precision int32) (Decimal, Decimal) { + d.ensureInitialized() + d2.ensureInitialized() + if d2.value.Sign() == 0 { + panic("decimal division by 0") + } + scale := -precision + e := int64(d.exp - d2.exp - scale) + if e > math.MaxInt32 || e < math.MinInt32 { + panic("overflow in decimal QuoRem") + } + var aa, bb, expo big.Int + var scalerest int32 + // d = a 10^ea + // d2 = b 10^eb + if e < 0 { + aa = *d.value + expo.SetInt64(-e) + bb.Exp(tenInt, &expo, nil) + bb.Mul(d2.value, &bb) + scalerest = d.exp + // now aa = a + // bb = b 10^(scale + eb - ea) + } else { + expo.SetInt64(e) + aa.Exp(tenInt, &expo, nil) + aa.Mul(d.value, &aa) + bb = *d2.value + scalerest = scale + d2.exp + // now aa = a ^ (ea - eb - scale) + // bb = b + } + var q, r big.Int + q.QuoRem(&aa, &bb, &r) + dq := Decimal{value: &q, exp: scale} + dr := Decimal{value: &r, exp: scalerest} + return dq, dr +} + +// DivRound divides and rounds to a given precision +// i.e. to an integer multiple of 10^(-precision) +// for a positive quotient digit 5 is rounded up, away from 0 +// if the quotient is negative then digit 5 is rounded down, away from 0 +// Note that precision<0 is allowed as input. +func (d Decimal) DivRound(d2 Decimal, precision int32) Decimal { + // QuoRem already checks initialization + q, r := d.QuoRem(d2, precision) + // the actual rounding decision is based on comparing r*10^precision and d2/2 + // instead compare 2 r 10 ^precision and d2 + var rv2 big.Int + rv2.Abs(r.value) + rv2.Lsh(&rv2, 1) + // now rv2 = abs(r.value) * 2 + r2 := Decimal{value: &rv2, exp: r.exp + precision} + // r2 is now 2 * r * 10 ^ precision + var c = r2.Cmp(d2.Abs()) + + if c < 0 { + return q + } + + if d.value.Sign()*d2.value.Sign() < 0 { + return q.Sub(New(1, -precision)) + } + + return q.Add(New(1, -precision)) +} + +// Mod returns d % d2. +func (d Decimal) Mod(d2 Decimal) Decimal { + quo := d.Div(d2).Truncate(0) + return d.Sub(d2.Mul(quo)) +} + +// Pow returns d to the power d2 +func (d Decimal) Pow(d2 Decimal) Decimal { + var temp Decimal + if d2.IntPart() == 0 { + return NewFromFloat(1) + } + temp = d.Pow(d2.Div(NewFromFloat(2))) + if d2.IntPart()%2 == 0 { + return temp.Mul(temp) + } + if d2.IntPart() > 0 { + return temp.Mul(temp).Mul(d) + } + return temp.Mul(temp).Div(d) +} + +// Cmp compares the numbers represented by d and d2 and returns: +// +// -1 if d < d2 +// 0 if d == d2 +// +1 if d > d2 +// +func (d Decimal) Cmp(d2 Decimal) int { + d.ensureInitialized() + d2.ensureInitialized() + + if d.exp == d2.exp { + return d.value.Cmp(d2.value) + } + + rd, rd2 := RescalePair(d, d2) + + return rd.value.Cmp(rd2.value) +} + +// Equal returns whether the numbers represented by d and d2 are equal. +func (d Decimal) Equal(d2 Decimal) bool { + return d.Cmp(d2) == 0 +} + +// Equals is deprecated, please use Equal method instead +func (d Decimal) Equals(d2 Decimal) bool { + return d.Equal(d2) +} + +// GreaterThan (GT) returns true when d is greater than d2. +func (d Decimal) GreaterThan(d2 Decimal) bool { + return d.Cmp(d2) == 1 +} + +// GreaterThanOrEqual (GTE) returns true when d is greater than or equal to d2. +func (d Decimal) GreaterThanOrEqual(d2 Decimal) bool { + cmp := d.Cmp(d2) + return cmp == 1 || cmp == 0 +} + +// LessThan (LT) returns true when d is less than d2. +func (d Decimal) LessThan(d2 Decimal) bool { + return d.Cmp(d2) == -1 +} + +// LessThanOrEqual (LTE) returns true when d is less than or equal to d2. +func (d Decimal) LessThanOrEqual(d2 Decimal) bool { + cmp := d.Cmp(d2) + return cmp == -1 || cmp == 0 +} + +// Sign returns: +// +// -1 if d < 0 +// 0 if d == 0 +// +1 if d > 0 +// +func (d Decimal) Sign() int { + if d.value == nil { + return 0 + } + return d.value.Sign() +} + +// IsPositive return +// +// true if d > 0 +// false if d == 0 +// false if d < 0 +func (d Decimal) IsPositive() bool { + return d.Sign() == 1 +} + +// IsNegative return +// +// true if d < 0 +// false if d == 0 +// false if d > 0 +func (d Decimal) IsNegative() bool { + return d.Sign() == -1 +} + +// IsZero return +// +// true if d == 0 +// false if d > 0 +// false if d < 0 +func (d Decimal) IsZero() bool { + return d.Sign() == 0 +} + +// Exponent returns the exponent, or scale component of the decimal. +func (d Decimal) Exponent() int32 { + return d.exp +} + +// Coefficient returns the coefficient of the decimal. It is scaled by 10^Exponent() +func (d Decimal) Coefficient() *big.Int { + d.ensureInitialized() + // we copy the coefficient so that mutating the result does not mutate the + // Decimal. + return big.NewInt(0).Set(d.value) +} + +// IntPart returns the integer component of the decimal. +func (d Decimal) IntPart() int64 { + scaledD := d.rescale(0) + return scaledD.value.Int64() +} + +// BigInt returns integer component of the decimal as a BigInt. +func (d Decimal) BigInt() *big.Int { + scaledD := d.rescale(0) + i := &big.Int{} + i.SetString(scaledD.String(), 10) + return i +} + +// BigFloat returns decimal as BigFloat. +// Be aware that casting decimal to BigFloat might cause a loss of precision. +func (d Decimal) BigFloat() *big.Float { + f := &big.Float{} + f.SetString(d.String()) + return f +} + +// Rat returns a rational number representation of the decimal. +func (d Decimal) Rat() *big.Rat { + d.ensureInitialized() + if d.exp <= 0 { + // NOTE(vadim): must negate after casting to prevent int32 overflow + denom := new(big.Int).Exp(tenInt, big.NewInt(-int64(d.exp)), nil) + return new(big.Rat).SetFrac(d.value, denom) + } + + mul := new(big.Int).Exp(tenInt, big.NewInt(int64(d.exp)), nil) + num := new(big.Int).Mul(d.value, mul) + return new(big.Rat).SetFrac(num, oneInt) +} + +// Float64 returns the nearest float64 value for d and a bool indicating +// whether f represents d exactly. +// For more details, see the documentation for big.Rat.Float64 +func (d Decimal) Float64() (f float64, exact bool) { + return d.Rat().Float64() +} + +// String returns the string representation of the decimal +// with the fixed point. +// +// Example: +// +// d := New(-12345, -3) +// println(d.String()) +// +// Output: +// +// -12.345 +// +func (d Decimal) String() string { + return d.string(true) +} + +// StringFixed returns a rounded fixed-point string with places digits after +// the decimal point. +// +// Example: +// +// NewFromFloat(0).StringFixed(2) // output: "0.00" +// NewFromFloat(0).StringFixed(0) // output: "0" +// NewFromFloat(5.45).StringFixed(0) // output: "5" +// NewFromFloat(5.45).StringFixed(1) // output: "5.5" +// NewFromFloat(5.45).StringFixed(2) // output: "5.45" +// NewFromFloat(5.45).StringFixed(3) // output: "5.450" +// NewFromFloat(545).StringFixed(-1) // output: "550" +// +func (d Decimal) StringFixed(places int32) string { + rounded := d.Round(places) + return rounded.string(false) +} + +// StringFixedBank returns a banker rounded fixed-point string with places digits +// after the decimal point. +// +// Example: +// +// NewFromFloat(0).StringFixedBank(2) // output: "0.00" +// NewFromFloat(0).StringFixedBank(0) // output: "0" +// NewFromFloat(5.45).StringFixedBank(0) // output: "5" +// NewFromFloat(5.45).StringFixedBank(1) // output: "5.4" +// NewFromFloat(5.45).StringFixedBank(2) // output: "5.45" +// NewFromFloat(5.45).StringFixedBank(3) // output: "5.450" +// NewFromFloat(545).StringFixedBank(-1) // output: "540" +// +func (d Decimal) StringFixedBank(places int32) string { + rounded := d.RoundBank(places) + return rounded.string(false) +} + +// StringFixedCash returns a Swedish/Cash rounded fixed-point string. For +// more details see the documentation at function RoundCash. +func (d Decimal) StringFixedCash(interval uint8) string { + rounded := d.RoundCash(interval) + return rounded.string(false) +} + +// Round rounds the decimal to places decimal places. +// If places < 0, it will round the integer part to the nearest 10^(-places). +// +// Example: +// +// NewFromFloat(5.45).Round(1).String() // output: "5.5" +// NewFromFloat(545).Round(-1).String() // output: "550" +// +func (d Decimal) Round(places int32) Decimal { + // truncate to places + 1 + ret := d.rescale(-places - 1) + + // add sign(d) * 0.5 + if ret.value.Sign() < 0 { + ret.value.Sub(ret.value, fiveInt) + } else { + ret.value.Add(ret.value, fiveInt) + } + + // floor for positive numbers, ceil for negative numbers + _, m := ret.value.DivMod(ret.value, tenInt, new(big.Int)) + ret.exp++ + if ret.value.Sign() < 0 && m.Cmp(zeroInt) != 0 { + ret.value.Add(ret.value, oneInt) + } + + return ret +} + +// RoundBank rounds the decimal to places decimal places. +// If the final digit to round is equidistant from the nearest two integers the +// rounded value is taken as the even number +// +// If places < 0, it will round the integer part to the nearest 10^(-places). +// +// Examples: +// +// NewFromFloat(5.45).Round(1).String() // output: "5.4" +// NewFromFloat(545).Round(-1).String() // output: "540" +// NewFromFloat(5.46).Round(1).String() // output: "5.5" +// NewFromFloat(546).Round(-1).String() // output: "550" +// NewFromFloat(5.55).Round(1).String() // output: "5.6" +// NewFromFloat(555).Round(-1).String() // output: "560" +// +func (d Decimal) RoundBank(places int32) Decimal { + + round := d.Round(places) + remainder := d.Sub(round).Abs() + + half := New(5, -places-1) + if remainder.Cmp(half) == 0 && round.value.Bit(0) != 0 { + if round.value.Sign() < 0 { + round.value.Add(round.value, oneInt) + } else { + round.value.Sub(round.value, oneInt) + } + } + + return round +} + +// RoundCash aka Cash/Penny/öre rounding rounds decimal to a specific +// interval. The amount payable for a cash transaction is rounded to the nearest +// multiple of the minimum currency unit available. The following intervals are +// available: 5, 10, 25, 50 and 100; any other number throws a panic. +// 5: 5 cent rounding 3.43 => 3.45 +// 10: 10 cent rounding 3.45 => 3.50 (5 gets rounded up) +// 25: 25 cent rounding 3.41 => 3.50 +// 50: 50 cent rounding 3.75 => 4.00 +// 100: 100 cent rounding 3.50 => 4.00 +// For more details: https://en.wikipedia.org/wiki/Cash_rounding +func (d Decimal) RoundCash(interval uint8) Decimal { + var iVal *big.Int + switch interval { + case 5: + iVal = twentyInt + case 10: + iVal = tenInt + case 25: + iVal = fourInt + case 50: + iVal = twoInt + case 100: + iVal = oneInt + default: + panic(fmt.Sprintf("Decimal does not support this Cash rounding interval `%d`. Supported: 5, 10, 25, 50, 100", interval)) + } + dVal := Decimal{ + value: iVal, + } + + // TODO: optimize those calculations to reduce the high allocations (~29 allocs). + return d.Mul(dVal).Round(0).Div(dVal).Truncate(2) +} + +// Floor returns the nearest integer value less than or equal to d. +func (d Decimal) Floor() Decimal { + d.ensureInitialized() + + if d.exp >= 0 { + return d + } + + exp := big.NewInt(10) + + // NOTE(vadim): must negate after casting to prevent int32 overflow + exp.Exp(exp, big.NewInt(-int64(d.exp)), nil) + + z := new(big.Int).Div(d.value, exp) + return Decimal{value: z, exp: 0} +} + +// Ceil returns the nearest integer value greater than or equal to d. +func (d Decimal) Ceil() Decimal { + d.ensureInitialized() + + if d.exp >= 0 { + return d + } + + exp := big.NewInt(10) + + // NOTE(vadim): must negate after casting to prevent int32 overflow + exp.Exp(exp, big.NewInt(-int64(d.exp)), nil) + + z, m := new(big.Int).DivMod(d.value, exp, new(big.Int)) + if m.Cmp(zeroInt) != 0 { + z.Add(z, oneInt) + } + return Decimal{value: z, exp: 0} +} + +// Truncate truncates off digits from the number, without rounding. +// +// NOTE: precision is the last digit that will not be truncated (must be >= 0). +// +// Example: +// +// decimal.NewFromString("123.456").Truncate(2).String() // "123.45" +// +func (d Decimal) Truncate(precision int32) Decimal { + d.ensureInitialized() + if precision >= 0 && -precision > d.exp { + return d.rescale(-precision) + } + return d +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (d *Decimal) UnmarshalJSON(decimalBytes []byte) error { + if string(decimalBytes) == "null" { + return nil + } + + str, err := unquoteIfQuoted(decimalBytes) + if err != nil { + return fmt.Errorf("error decoding string '%s': %s", decimalBytes, err) + } + + decimal, err := NewFromString(str) + *d = decimal + if err != nil { + return fmt.Errorf("error decoding string '%s': %s", str, err) + } + return nil +} + +// MarshalJSON implements the json.Marshaler interface. +func (d Decimal) MarshalJSON() ([]byte, error) { + var str string + if MarshalJSONWithoutQuotes { + str = d.String() + } else { + str = "\"" + d.String() + "\"" + } + return []byte(str), nil +} + +// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. As a string representation +// is already used when encoding to text, this method stores that string as []byte +func (d *Decimal) UnmarshalBinary(data []byte) error { + // Extract the exponent + d.exp = int32(binary.BigEndian.Uint32(data[:4])) + + // Extract the value + d.value = new(big.Int) + return d.value.GobDecode(data[4:]) +} + +// MarshalBinary implements the encoding.BinaryMarshaler interface. +func (d Decimal) MarshalBinary() (data []byte, err error) { + // Write the exponent first since it's a fixed size + v1 := make([]byte, 4) + binary.BigEndian.PutUint32(v1, uint32(d.exp)) + + // Add the value + var v2 []byte + if v2, err = d.value.GobEncode(); err != nil { + return + } + + // Return the byte array + data = append(v1, v2...) + return +} + +// Scan implements the sql.Scanner interface for database deserialization. +func (d *Decimal) Scan(value interface{}) error { + // first try to see if the data is stored in database as a Numeric datatype + switch v := value.(type) { + + case float32: + *d = NewFromFloat(float64(v)) + return nil + + case float64: + // numeric in sqlite3 sends us float64 + *d = NewFromFloat(v) + return nil + + case int64: + // at least in sqlite3 when the value is 0 in db, the data is sent + // to us as an int64 instead of a float64 ... + *d = New(v, 0) + return nil + + default: + // default is trying to interpret value stored as string + str, err := unquoteIfQuoted(v) + if err != nil { + return err + } + *d, err = NewFromString(str) + return err + } +} + +// Value implements the driver.Valuer interface for database serialization. +func (d Decimal) Value() (driver.Value, error) { + return d.String(), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface for XML +// deserialization. +func (d *Decimal) UnmarshalText(text []byte) error { + str := string(text) + + dec, err := NewFromString(str) + *d = dec + if err != nil { + return fmt.Errorf("error decoding string '%s': %s", str, err) + } + + return nil +} + +// MarshalText implements the encoding.TextMarshaler interface for XML +// serialization. +func (d Decimal) MarshalText() (text []byte, err error) { + return []byte(d.String()), nil +} + +// GobEncode implements the gob.GobEncoder interface for gob serialization. +func (d Decimal) GobEncode() ([]byte, error) { + return d.MarshalBinary() +} + +// GobDecode implements the gob.GobDecoder interface for gob serialization. +func (d *Decimal) GobDecode(data []byte) error { + return d.UnmarshalBinary(data) +} + +// StringScaled first scales the decimal then calls .String() on it. +// NOTE: buggy, unintuitive, and DEPRECATED! Use StringFixed instead. +func (d Decimal) StringScaled(exp int32) string { + return d.rescale(exp).String() +} + +func (d Decimal) string(trimTrailingZeros bool) string { + if d.exp >= 0 { + return d.rescale(0).value.String() + } + + abs := new(big.Int).Abs(d.value) + str := abs.String() + + var intPart, fractionalPart string + + // NOTE(vadim): this cast to int will cause bugs if d.exp == INT_MIN + // and you are on a 32-bit machine. Won't fix this super-edge case. + dExpInt := int(d.exp) + if len(str) > -dExpInt { + intPart = str[:len(str)+dExpInt] + fractionalPart = str[len(str)+dExpInt:] + } else { + intPart = "0" + + num0s := -dExpInt - len(str) + fractionalPart = strings.Repeat("0", num0s) + str + } + + if trimTrailingZeros { + i := len(fractionalPart) - 1 + for ; i >= 0; i-- { + if fractionalPart[i] != '0' { + break + } + } + fractionalPart = fractionalPart[:i+1] + } + + number := intPart + if len(fractionalPart) > 0 { + number += "." + fractionalPart + } + + if d.value.Sign() < 0 { + return "-" + number + } + + return number +} + +func (d *Decimal) ensureInitialized() { + if d.value == nil { + d.value = new(big.Int) + } +} + +// Min returns the smallest Decimal that was passed in the arguments. +// +// To call this function with an array, you must do: +// +// Min(arr[0], arr[1:]...) +// +// This makes it harder to accidentally call Min with 0 arguments. +func Min(first Decimal, rest ...Decimal) Decimal { + ans := first + for _, item := range rest { + if item.Cmp(ans) < 0 { + ans = item + } + } + return ans +} + +// Max returns the largest Decimal that was passed in the arguments. +// +// To call this function with an array, you must do: +// +// Max(arr[0], arr[1:]...) +// +// This makes it harder to accidentally call Max with 0 arguments. +func Max(first Decimal, rest ...Decimal) Decimal { + ans := first + for _, item := range rest { + if item.Cmp(ans) > 0 { + ans = item + } + } + return ans +} + +// Sum returns the combined total of the provided first and rest Decimals +func Sum(first Decimal, rest ...Decimal) Decimal { + total := first + for _, item := range rest { + total = total.Add(item) + } + + return total +} + +// Avg returns the average value of the provided first and rest Decimals +func Avg(first Decimal, rest ...Decimal) Decimal { + count := New(int64(len(rest)+1), 0) + sum := Sum(first, rest...) + return sum.Div(count) +} + +// RescalePair rescales two decimals to common exponential value (minimal exp of both decimals) +func RescalePair(d1 Decimal, d2 Decimal) (Decimal, Decimal) { + d1.ensureInitialized() + d2.ensureInitialized() + + if d1.exp == d2.exp { + return d1, d2 + } + + baseScale := min(d1.exp, d2.exp) + if baseScale != d1.exp { + return d1.rescale(baseScale), d2 + } + return d1, d2.rescale(baseScale) +} + +func min(x, y int32) int32 { + if x >= y { + return y + } + return x +} + +func unquoteIfQuoted(value interface{}) (string, error) { + var bytes []byte + + switch v := value.(type) { + case string: + bytes = []byte(v) + case []byte: + bytes = v + default: + return "", fmt.Errorf("could not convert value '%+v' to byte array of type '%T'", + value, value) + } + + // If the amount is quoted, strip the quotes + if len(bytes) > 2 && bytes[0] == '"' && bytes[len(bytes)-1] == '"' { + bytes = bytes[1 : len(bytes)-1] + } + return string(bytes), nil +} + +// NullDecimal represents a nullable decimal with compatibility for +// scanning null values from the database. +type NullDecimal struct { + Decimal Decimal + Valid bool +} + +// Scan implements the sql.Scanner interface for database deserialization. +func (d *NullDecimal) Scan(value interface{}) error { + if value == nil { + d.Valid = false + return nil + } + d.Valid = true + return d.Decimal.Scan(value) +} + +// Value implements the driver.Valuer interface for database serialization. +func (d NullDecimal) Value() (driver.Value, error) { + if !d.Valid { + return nil, nil + } + return d.Decimal.Value() +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (d *NullDecimal) UnmarshalJSON(decimalBytes []byte) error { + if string(decimalBytes) == "null" { + d.Valid = false + return nil + } + d.Valid = true + return d.Decimal.UnmarshalJSON(decimalBytes) +} + +// MarshalJSON implements the json.Marshaler interface. +func (d NullDecimal) MarshalJSON() ([]byte, error) { + if !d.Valid { + return []byte("null"), nil + } + return d.Decimal.MarshalJSON() +} + +// Trig functions + +// Atan returns the arctangent, in radians, of x. +func (d Decimal) Atan() Decimal { + if d.Equal(NewFromFloat(0.0)) { + return d + } + if d.GreaterThan(NewFromFloat(0.0)) { + return d.satan() + } + return d.Neg().satan().Neg() +} + +func (d Decimal) xatan() Decimal { + P0 := NewFromFloat(-8.750608600031904122785e-01) + P1 := NewFromFloat(-1.615753718733365076637e+01) + P2 := NewFromFloat(-7.500855792314704667340e+01) + P3 := NewFromFloat(-1.228866684490136173410e+02) + P4 := NewFromFloat(-6.485021904942025371773e+01) + Q0 := NewFromFloat(2.485846490142306297962e+01) + Q1 := NewFromFloat(1.650270098316988542046e+02) + Q2 := NewFromFloat(4.328810604912902668951e+02) + Q3 := NewFromFloat(4.853903996359136964868e+02) + Q4 := NewFromFloat(1.945506571482613964425e+02) + z := d.Mul(d) + b1 := P0.Mul(z).Add(P1).Mul(z).Add(P2).Mul(z).Add(P3).Mul(z).Add(P4).Mul(z) + b2 := z.Add(Q0).Mul(z).Add(Q1).Mul(z).Add(Q2).Mul(z).Add(Q3).Mul(z).Add(Q4) + z = b1.Div(b2) + z = d.Mul(z).Add(d) + return z +} + +// satan reduces its argument (known to be positive) +// to the range [0, 0.66] and calls xatan. +func (d Decimal) satan() Decimal { + Morebits := NewFromFloat(6.123233995736765886130e-17) // pi/2 = PIO2 + Morebits + Tan3pio8 := NewFromFloat(2.41421356237309504880) // tan(3*pi/8) + pi := NewFromFloat(3.14159265358979323846264338327950288419716939937510582097494459) + + if d.LessThanOrEqual(NewFromFloat(0.66)) { + return d.xatan() + } + if d.GreaterThan(Tan3pio8) { + return pi.Div(NewFromFloat(2.0)).Sub(NewFromFloat(1.0).Div(d).xatan()).Add(Morebits) + } + return pi.Div(NewFromFloat(4.0)).Add((d.Sub(NewFromFloat(1.0)).Div(d.Add(NewFromFloat(1.0)))).xatan()).Add(NewFromFloat(0.5).Mul(Morebits)) +} + +// sin coefficients +var _sin = [...]Decimal{ + NewFromFloat(1.58962301576546568060e-10), // 0x3de5d8fd1fd19ccd + NewFromFloat(-2.50507477628578072866e-8), // 0xbe5ae5e5a9291f5d + NewFromFloat(2.75573136213857245213e-6), // 0x3ec71de3567d48a1 + NewFromFloat(-1.98412698295895385996e-4), // 0xbf2a01a019bfdf03 + NewFromFloat(8.33333333332211858878e-3), // 0x3f8111111110f7d0 + NewFromFloat(-1.66666666666666307295e-1), // 0xbfc5555555555548 +} + +// Sin returns the sine of the radian argument x. +func (d Decimal) Sin() Decimal { + PI4A := NewFromFloat(7.85398125648498535156e-1) // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B := NewFromFloat(3.77489470793079817668e-8) // 0x3e64442d00000000, + PI4C := NewFromFloat(2.69515142907905952645e-15) // 0x3ce8469898cc5170, + M4PI := NewFromFloat(1.273239544735162542821171882678754627704620361328125) // 4/pi + + if d.Equal(NewFromFloat(0.0)) { + return d + } + // make argument positive but save the sign + sign := false + if d.LessThan(NewFromFloat(0.0)) { + d = d.Neg() + sign = true + } + + j := d.Mul(M4PI).IntPart() // integer part of x/(Pi/4), as integer for tests on the phase angle + y := NewFromFloat(float64(j)) // integer part of x/(Pi/4), as float + + // map zeros to origin + if j&1 == 1 { + j++ + y = y.Add(NewFromFloat(1.0)) + } + j &= 7 // octant modulo 2Pi radians (360 degrees) + // reflect in x axis + if j > 3 { + sign = !sign + j -= 4 + } + z := d.Sub(y.Mul(PI4A)).Sub(y.Mul(PI4B)).Sub(y.Mul(PI4C)) // Extended precision modular arithmetic + zz := z.Mul(z) + + if j == 1 || j == 2 { + w := zz.Mul(zz).Mul(_cos[0].Mul(zz).Add(_cos[1]).Mul(zz).Add(_cos[2]).Mul(zz).Add(_cos[3]).Mul(zz).Add(_cos[4]).Mul(zz).Add(_cos[5])) + y = NewFromFloat(1.0).Sub(NewFromFloat(0.5).Mul(zz)).Add(w) + } else { + y = z.Add(z.Mul(zz).Mul(_sin[0].Mul(zz).Add(_sin[1]).Mul(zz).Add(_sin[2]).Mul(zz).Add(_sin[3]).Mul(zz).Add(_sin[4]).Mul(zz).Add(_sin[5]))) + } + if sign { + y = y.Neg() + } + return y +} + +// cos coefficients +var _cos = [...]Decimal{ + NewFromFloat(-1.13585365213876817300e-11), // 0xbda8fa49a0861a9b + NewFromFloat(2.08757008419747316778e-9), // 0x3e21ee9d7b4e3f05 + NewFromFloat(-2.75573141792967388112e-7), // 0xbe927e4f7eac4bc6 + NewFromFloat(2.48015872888517045348e-5), // 0x3efa01a019c844f5 + NewFromFloat(-1.38888888888730564116e-3), // 0xbf56c16c16c14f91 + NewFromFloat(4.16666666666665929218e-2), // 0x3fa555555555554b +} + +// Cos returns the cosine of the radian argument x. +func (d Decimal) Cos() Decimal { + + PI4A := NewFromFloat(7.85398125648498535156e-1) // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B := NewFromFloat(3.77489470793079817668e-8) // 0x3e64442d00000000, + PI4C := NewFromFloat(2.69515142907905952645e-15) // 0x3ce8469898cc5170, + M4PI := NewFromFloat(1.273239544735162542821171882678754627704620361328125) // 4/pi + + // make argument positive + sign := false + if d.LessThan(NewFromFloat(0.0)) { + d = d.Neg() + } + + j := d.Mul(M4PI).IntPart() // integer part of x/(Pi/4), as integer for tests on the phase angle + y := NewFromFloat(float64(j)) // integer part of x/(Pi/4), as float + + // map zeros to origin + if j&1 == 1 { + j++ + y = y.Add(NewFromFloat(1.0)) + } + j &= 7 // octant modulo 2Pi radians (360 degrees) + // reflect in x axis + if j > 3 { + sign = !sign + j -= 4 + } + if j > 1 { + sign = !sign + } + + z := d.Sub(y.Mul(PI4A)).Sub(y.Mul(PI4B)).Sub(y.Mul(PI4C)) // Extended precision modular arithmetic + zz := z.Mul(z) + + if j == 1 || j == 2 { + y = z.Add(z.Mul(zz).Mul(_sin[0].Mul(zz).Add(_sin[1]).Mul(zz).Add(_sin[2]).Mul(zz).Add(_sin[3]).Mul(zz).Add(_sin[4]).Mul(zz).Add(_sin[5]))) + } else { + w := zz.Mul(zz).Mul(_cos[0].Mul(zz).Add(_cos[1]).Mul(zz).Add(_cos[2]).Mul(zz).Add(_cos[3]).Mul(zz).Add(_cos[4]).Mul(zz).Add(_cos[5])) + y = NewFromFloat(1.0).Sub(NewFromFloat(0.5).Mul(zz)).Add(w) + } + if sign { + y = y.Neg() + } + return y +} + +var _tanP = [...]Decimal{ + NewFromFloat(-1.30936939181383777646e+4), // 0xc0c992d8d24f3f38 + NewFromFloat(1.15351664838587416140e+6), // 0x413199eca5fc9ddd + NewFromFloat(-1.79565251976484877988e+7), // 0xc1711fead3299176 +} +var _tanQ = [...]Decimal{ + NewFromFloat(1.00000000000000000000e+0), + NewFromFloat(1.36812963470692954678e+4), //0x40cab8a5eeb36572 + NewFromFloat(-1.32089234440210967447e+6), //0xc13427bc582abc96 + NewFromFloat(2.50083801823357915839e+7), //0x4177d98fc2ead8ef + NewFromFloat(-5.38695755929454629881e+7), //0xc189afe03cbe5a31 +} + +// Tan returns the tangent of the radian argument x. +func (d Decimal) Tan() Decimal { + + PI4A := NewFromFloat(7.85398125648498535156e-1) // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B := NewFromFloat(3.77489470793079817668e-8) // 0x3e64442d00000000, + PI4C := NewFromFloat(2.69515142907905952645e-15) // 0x3ce8469898cc5170, + M4PI := NewFromFloat(1.273239544735162542821171882678754627704620361328125) // 4/pi + + if d.Equal(NewFromFloat(0.0)) { + return d + } + + // make argument positive but save the sign + sign := false + if d.LessThan(NewFromFloat(0.0)) { + d = d.Neg() + sign = true + } + + j := d.Mul(M4PI).IntPart() // integer part of x/(Pi/4), as integer for tests on the phase angle + y := NewFromFloat(float64(j)) // integer part of x/(Pi/4), as float + + // map zeros to origin + if j&1 == 1 { + j++ + y = y.Add(NewFromFloat(1.0)) + } + + z := d.Sub(y.Mul(PI4A)).Sub(y.Mul(PI4B)).Sub(y.Mul(PI4C)) // Extended precision modular arithmetic + zz := z.Mul(z) + + if zz.GreaterThan(NewFromFloat(1e-14)) { + w := zz.Mul(_tanP[0].Mul(zz).Add(_tanP[1]).Mul(zz).Add(_tanP[2])) + x := zz.Add(_tanQ[1]).Mul(zz).Add(_tanQ[2]).Mul(zz).Add(_tanQ[3]).Mul(zz).Add(_tanQ[4]) + y = z.Add(z.Mul(w.Div(x))) + } else { + y = z + } + if j&2 == 2 { + y = NewFromFloat(-1.0).Div(y) + } + if sign { + y = y.Neg() + } + return y +} diff --git a/vendor/github.com/shopspring/decimal/go.mod b/vendor/github.com/shopspring/decimal/go.mod new file mode 100644 index 0000000000..ae1b7aa3c7 --- /dev/null +++ b/vendor/github.com/shopspring/decimal/go.mod @@ -0,0 +1,3 @@ +module github.com/shopspring/decimal + +go 1.13 diff --git a/vendor/github.com/shopspring/decimal/rounding.go b/vendor/github.com/shopspring/decimal/rounding.go new file mode 100644 index 0000000000..8008f55cb9 --- /dev/null +++ b/vendor/github.com/shopspring/decimal/rounding.go @@ -0,0 +1,119 @@ +// Copyright 2009 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. + +// Multiprecision decimal numbers. +// For floating-point formatting only; not general purpose. +// Only operations are assign and (binary) left/right shift. +// Can do binary floating point in multiprecision decimal precisely +// because 2 divides 10; cannot do decimal floating point +// in multiprecision binary precisely. + +package decimal + +type floatInfo struct { + mantbits uint + expbits uint + bias int +} + +var float32info = floatInfo{23, 8, -127} +var float64info = floatInfo{52, 11, -1023} + +// roundShortest rounds d (= mant * 2^exp) to the shortest number of digits +// that will let the original floating point value be precisely reconstructed. +func roundShortest(d *decimal, mant uint64, exp int, flt *floatInfo) { + // If mantissa is zero, the number is zero; stop now. + if mant == 0 { + d.nd = 0 + return + } + + // Compute upper and lower such that any decimal number + // between upper and lower (possibly inclusive) + // will round to the original floating point number. + + // We may see at once that the number is already shortest. + // + // Suppose d is not denormal, so that 2^exp <= d < 10^dp. + // The closest shorter number is at least 10^(dp-nd) away. + // The lower/upper bounds computed below are at distance + // at most 2^(exp-mantbits). + // + // So the number is already shortest if 10^(dp-nd) > 2^(exp-mantbits), + // or equivalently log2(10)*(dp-nd) > exp-mantbits. + // It is true if 332/100*(dp-nd) >= exp-mantbits (log2(10) > 3.32). + minexp := flt.bias + 1 // minimum possible exponent + if exp > minexp && 332*(d.dp-d.nd) >= 100*(exp-int(flt.mantbits)) { + // The number is already shortest. + return + } + + // d = mant << (exp - mantbits) + // Next highest floating point number is mant+1 << exp-mantbits. + // Our upper bound is halfway between, mant*2+1 << exp-mantbits-1. + upper := new(decimal) + upper.Assign(mant*2 + 1) + upper.Shift(exp - int(flt.mantbits) - 1) + + // d = mant << (exp - mantbits) + // Next lowest floating point number is mant-1 << exp-mantbits, + // unless mant-1 drops the significant bit and exp is not the minimum exp, + // in which case the next lowest is mant*2-1 << exp-mantbits-1. + // Either way, call it mantlo << explo-mantbits. + // Our lower bound is halfway between, mantlo*2+1 << explo-mantbits-1. + var mantlo uint64 + var explo int + if mant > 1< +[cobra-slack]: https://gophers.slack.com/archives/CD3LP1199 diff --git a/vendor/github.com/spf13/cobra/README.md b/vendor/github.com/spf13/cobra/README.md index 9d79934260..3cf1b25d8e 100644 --- a/vendor/github.com/spf13/cobra/README.md +++ b/vendor/github.com/spf13/cobra/README.md @@ -2,35 +2,14 @@ Cobra is both a library for creating powerful modern CLI applications as well as a program to generate applications and command files. -Many of the most widely used Go projects are built using Cobra, such as: -[Kubernetes](http://kubernetes.io/), -[Hugo](http://gohugo.io), -[rkt](https://github.com/coreos/rkt), -[etcd](https://github.com/coreos/etcd), -[Moby (former Docker)](https://github.com/moby/moby), -[Docker (distribution)](https://github.com/docker/distribution), -[OpenShift](https://www.openshift.com/), -[Delve](https://github.com/derekparker/delve), -[GopherJS](http://www.gopherjs.org/), -[CockroachDB](http://www.cockroachlabs.com/), -[Bleve](http://www.blevesearch.com/), -[ProjectAtomic (enterprise)](http://www.projectatomic.io/), -[Giant Swarm's gsctl](https://github.com/giantswarm/gsctl), -[Nanobox](https://github.com/nanobox-io/nanobox)/[Nanopack](https://github.com/nanopack), -[rclone](http://rclone.org/), -[nehm](https://github.com/bogem/nehm), -[Pouch](https://github.com/alibaba/pouch), -[Istio](https://istio.io), -[Prototool](https://github.com/uber/prototool), -[mattermost-server](https://github.com/mattermost/mattermost-server), -[Gardener](https://github.com/gardener/gardenctl), -[Linkerd](https://linkerd.io/), -[Github CLI](https://github.com/cli/cli) -etc. +Cobra is used in many Go projects such as [Kubernetes](http://kubernetes.io/), +[Hugo](https://gohugo.io), and [Github CLI](https://github.com/cli/cli) to +name a few. [This list](./projects_using_cobra.md) contains a more extensive list of projects using Cobra. [![Build Status](https://travis-ci.org/spf13/cobra.svg "Travis CI status")](https://travis-ci.org/spf13/cobra) [![GoDoc](https://godoc.org/github.com/spf13/cobra?status.svg)](https://godoc.org/github.com/spf13/cobra) [![Go Report Card](https://goreportcard.com/badge/github.com/spf13/cobra)](https://goreportcard.com/report/github.com/spf13/cobra) +[![Slack](https://img.shields.io/badge/Slack-cobra-brightgreen)](https://gophers.slack.com/archives/CD3LP1199) # Table of Contents @@ -50,9 +29,8 @@ etc. * [PreRun and PostRun Hooks](#prerun-and-postrun-hooks) * [Suggestions when "unknown command" happens](#suggestions-when-unknown-command-happens) * [Generating documentation for your command](#generating-documentation-for-your-command) - * [Generating bash completions](#generating-bash-completions) - * [Generating zsh completions](#generating-zsh-completions) -- [Contributing](#contributing) + * [Generating shell completions](#generating-shell-completions) +- [Contributing](CONTRIBUTING.md) - [License](#license) # Overview @@ -72,7 +50,7 @@ Cobra provides: * Intelligent suggestions (`app srver`... did you mean `app server`?) * Automatic help generation for commands and flags * Automatic help flag recognition of `-h`, `--help`, etc. -* Automatically generated bash autocomplete for your application +* Automatically generated shell autocomplete for your application (bash, zsh, fish, powershell) * Automatically generated man pages for your application * Command aliases so you can change things without breaking them * The flexibility to define your own help, usage, etc. @@ -130,7 +108,7 @@ Using Cobra is easy. First, use `go get` to install the latest version of the library. This command will install the `cobra` generator executable along with the library and its dependencies: - go get -u github.com/spf13/cobra/cobra + go get -u github.com/spf13/cobra Next, include Cobra in your application: @@ -199,7 +177,7 @@ var rootCmd = &cobra.Command{ func Execute() { if err := rootCmd.Execute(); err != nil { - fmt.Println(err) + fmt.Fprintln(os.Stderr, err) os.Exit(1) } } @@ -335,6 +313,37 @@ var versionCmd = &cobra.Command{ } ``` +### Returning and handling errors + +If you wish to return an error to the caller of a command, `RunE` can be used. + +```go +package cmd + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +func init() { + rootCmd.AddCommand(tryCmd) +} + +var tryCmd = &cobra.Command{ + Use: "try", + Short: "Try and possibly fail at something", + RunE: func(cmd *cobra.Command, args []string) error { + if err := someFunc(); err != nil { + return err + } + return nil + }, +} +``` + +The error can then be caught at the execute function call. + ## Working with Flags Flags provide modifiers to control how the action command operates. @@ -410,6 +419,12 @@ rootCmd.Flags().StringVarP(&Region, "region", "r", "", "AWS region (required)") rootCmd.MarkFlagRequired("region") ``` +Or, for persistent flags: +```go +rootCmd.PersistentFlags().StringVarP(&Region, "region", "r", "", "AWS region (required)") +rootCmd.MarkPersistentFlagRequired("region") +``` + ## Positional and Custom Arguments Validation of positional arguments can be specified using the `Args` field @@ -740,30 +755,11 @@ Run 'kubectl help' for usage. ## Generating documentation for your command -Cobra can generate documentation based on subcommands, flags, etc. in the following formats: - -- [Markdown](doc/md_docs.md) -- [ReStructured Text](doc/rest_docs.md) -- [Man Page](doc/man_docs.md) - -## Generating bash completions - -Cobra can generate a bash-completion file. If you add more information to your command, these completions can be amazingly powerful and flexible. Read more about it in [Bash Completions](bash_completions.md). - -## Generating zsh completions - -Cobra can generate zsh-completion file. Read more about it in -[Zsh Completions](zsh_completions.md). +Cobra can generate documentation based on subcommands, flags, etc. Read more about it in the [docs generation documentation](doc/README.md). -# Contributing +## Generating shell completions -1. Fork it -2. Download your fork to your PC (`git clone https://github.com/your_username/cobra && cd cobra`) -3. Create your feature branch (`git checkout -b my-new-feature`) -4. Make changes and add them (`git add .`) -5. Commit your changes (`git commit -m 'Add some feature'`) -6. Push to the branch (`git push origin my-new-feature`) -7. Create new pull request +Cobra can generate a shell-completion file for the following shells: Bash, Zsh, Fish, Powershell. If you add more information to your commands, these completions can be amazingly powerful and flexible. Read more about it in [Shell Completions](shell_completions.md). # License diff --git a/vendor/github.com/spf13/cobra/bash_completions.go b/vendor/github.com/spf13/cobra/bash_completions.go index 1e27188c3d..846636d75b 100644 --- a/vendor/github.com/spf13/cobra/bash_completions.go +++ b/vendor/github.com/spf13/cobra/bash_completions.go @@ -62,6 +62,12 @@ __%[1]s_handle_go_custom_completion() { __%[1]s_debug "${FUNCNAME[0]}: cur is ${cur}, words[*] is ${words[*]}, #words[@] is ${#words[@]}" + local shellCompDirectiveError=%[3]d + local shellCompDirectiveNoSpace=%[4]d + local shellCompDirectiveNoFileComp=%[5]d + local shellCompDirectiveFilterFileExt=%[6]d + local shellCompDirectiveFilterDirs=%[7]d + local out requestComp lastParam lastChar comp directive args # Prepare the command to request completions for the program. @@ -95,24 +101,50 @@ __%[1]s_handle_go_custom_completion() __%[1]s_debug "${FUNCNAME[0]}: the completion directive is: ${directive}" __%[1]s_debug "${FUNCNAME[0]}: the completions are: ${out[*]}" - if [ $((directive & %[3]d)) -ne 0 ]; then + if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then # Error code. No completion. __%[1]s_debug "${FUNCNAME[0]}: received error from custom completion go code" return else - if [ $((directive & %[4]d)) -ne 0 ]; then + if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then if [[ $(type -t compopt) = "builtin" ]]; then __%[1]s_debug "${FUNCNAME[0]}: activating no space" compopt -o nospace fi fi - if [ $((directive & %[5]d)) -ne 0 ]; then + if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then if [[ $(type -t compopt) = "builtin" ]]; then __%[1]s_debug "${FUNCNAME[0]}: activating no file completion" compopt +o default fi fi + fi + if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then + # File extension filtering + local fullFilter filter filteringCmd + # Do not use quotes around the $out variable or else newline + # characters will be kept. + for filter in ${out[*]}; do + fullFilter+="$filter|" + done + + filteringCmd="_filedir $fullFilter" + __%[1]s_debug "File filtering command: $filteringCmd" + $filteringCmd + elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then + # File completion for directories only + local subDir + # Use printf to strip any trailing newline + subdir=$(printf "%%s" "${out[0]}") + if [ -n "$subdir" ]; then + __%[1]s_debug "Listing directories in $subdir" + __%[1]s_handle_subdirs_in_dir_flag "$subdir" + else + __%[1]s_debug "Listing directories in ." + _filedir -d + fi + else while IFS='' read -r comp; do COMPREPLY+=("$comp") done < <(compgen -W "${out[*]}" -- "$cur") @@ -181,10 +213,9 @@ __%[1]s_handle_reply() local completions completions=("${commands[@]}") if [[ ${#must_have_one_noun[@]} -ne 0 ]]; then - completions=("${must_have_one_noun[@]}") + completions+=("${must_have_one_noun[@]}") elif [[ -n "${has_completion_function}" ]]; then # if a go completion function is provided, defer to that function - completions=() __%[1]s_handle_go_custom_completion fi if [[ ${#must_have_one_flag[@]} -ne 0 ]]; then @@ -344,7 +375,9 @@ __%[1]s_handle_word() __%[1]s_handle_word } -`, name, ShellCompNoDescRequestCmd, ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp)) +`, name, ShellCompNoDescRequestCmd, + ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp, + ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs)) } func writePostscript(buf *bytes.Buffer, name string) { @@ -390,7 +423,7 @@ fi func writeCommands(buf *bytes.Buffer, cmd *Command) { buf.WriteString(" commands=()\n") for _, c := range cmd.Commands() { - if !c.IsAvailableCommand() || c == cmd.helpCommand { + if !c.IsAvailableCommand() && c != cmd.helpCommand { continue } buf.WriteString(fmt.Sprintf(" commands+=(%q)\n", c.Name())) @@ -462,12 +495,14 @@ func writeFlag(buf *bytes.Buffer, flag *pflag.Flag, cmd *Command) { func writeLocalNonPersistentFlag(buf *bytes.Buffer, flag *pflag.Flag) { name := flag.Name - format := " local_nonpersistent_flags+=(\"--%s" + format := " local_nonpersistent_flags+=(\"--%[1]s\")\n" if len(flag.NoOptDefVal) == 0 { - format += "=" + format += " local_nonpersistent_flags+=(\"--%[1]s=\")\n" } - format += "\")\n" buf.WriteString(fmt.Sprintf(format, name)) + if len(flag.Shorthand) > 0 { + buf.WriteString(fmt.Sprintf(" local_nonpersistent_flags+=(\"-%s\")\n", flag.Shorthand)) + } } // Setup annotations for go completions for registered flags @@ -502,7 +537,9 @@ func writeFlags(buf *bytes.Buffer, cmd *Command) { if len(flag.Shorthand) > 0 { writeShortFlag(buf, flag, cmd) } - if localNonPersistentFlags.Lookup(flag.Name) != nil { + // localNonPersistentFlags are used to stop the completion of subcommands when one is set + // if TraverseChildren is true we should allow to complete subcommands + if localNonPersistentFlags.Lookup(flag.Name) != nil && !cmd.Root().TraverseChildren { writeLocalNonPersistentFlag(buf, flag) } }) @@ -583,7 +620,7 @@ func writeArgAliases(buf *bytes.Buffer, cmd *Command) { func gen(buf *bytes.Buffer, cmd *Command) { for _, c := range cmd.Commands() { - if !c.IsAvailableCommand() || c == cmd.helpCommand { + if !c.IsAvailableCommand() && c != cmd.helpCommand { continue } gen(buf, c) diff --git a/vendor/github.com/spf13/cobra/bash_completions.md b/vendor/github.com/spf13/cobra/bash_completions.md index e61a3a6546..a82d5bb8b4 100644 --- a/vendor/github.com/spf13/cobra/bash_completions.md +++ b/vendor/github.com/spf13/cobra/bash_completions.md @@ -1,206 +1,14 @@ -# Generating Bash Completions For Your Own cobra.Command +# Generating Bash Completions For Your cobra.Command -If you are using the generator you can create a completion command by running +Please refer to [Shell Completions](shell_completions.md) for details. -```bash -cobra add completion -``` - -Update the help text show how to install the bash_completion Linux show here [Kubectl docs show mac options](https://kubernetes.io/docs/tasks/tools/install-kubectl/#enabling-shell-autocompletion) - -Writing the shell script to stdout allows the most flexible use. - -```go -// completionCmd represents the completion command -var completionCmd = &cobra.Command{ - Use: "completion", - Short: "Generates bash completion scripts", - Long: `To load completion run - -. <(bitbucket completion) - -To configure your bash shell to load completions for each session add to your bashrc - -# ~/.bashrc or ~/.profile -. <(bitbucket completion) -`, - Run: func(cmd *cobra.Command, args []string) { - rootCmd.GenBashCompletion(os.Stdout); - }, -} -``` - -**Note:** The cobra generator may include messages printed to stdout for example if the config file is loaded, this will break the auto complete script - - -## Example from kubectl - -Generating bash completions from a cobra command is incredibly easy. An actual program which does so for the kubernetes kubectl binary is as follows: - -```go -package main - -import ( - "io/ioutil" - "os" - - "k8s.io/kubernetes/pkg/kubectl/cmd" - "k8s.io/kubernetes/pkg/kubectl/cmd/util" -) - -func main() { - kubectl := cmd.NewKubectlCommand(util.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard) - kubectl.GenBashCompletionFile("out.sh") -} -``` - -`out.sh` will get you completions of subcommands and flags. Copy it to `/etc/bash_completion.d/` as described [here](https://debian-administration.org/article/316/An_introduction_to_bash_completion_part_1) and reset your terminal to use autocompletion. If you make additional annotations to your code, you can get even more intelligent and flexible behavior. - -## Have the completions code complete your 'nouns' - -### Static completion of nouns - -This method allows you to provide a pre-defined list of completion choices for your nouns using the `validArgs` field. -For example, if you want `kubectl get [tab][tab]` to show a list of valid "nouns" you have to set them. Simplified code from `kubectl get` looks like: - -```go -validArgs []string = { "pod", "node", "service", "replicationcontroller" } - -cmd := &cobra.Command{ - Use: "get [(-o|--output=)json|yaml|template|...] (RESOURCE [NAME] | RESOURCE/NAME ...)", - Short: "Display one or many resources", - Long: get_long, - Example: get_example, - Run: func(cmd *cobra.Command, args []string) { - err := RunGet(f, out, cmd, args) - util.CheckErr(err) - }, - ValidArgs: validArgs, -} -``` - -Notice we put the "ValidArgs" on the "get" subcommand. Doing so will give results like - -```bash -# kubectl get [tab][tab] -node pod replicationcontroller service -``` - -### Plural form and shortcuts for nouns - -If your nouns have a number of aliases, you can define them alongside `ValidArgs` using `ArgAliases`: - -```go -argAliases []string = { "pods", "nodes", "services", "svc", "replicationcontrollers", "rc" } - -cmd := &cobra.Command{ - ... - ValidArgs: validArgs, - ArgAliases: argAliases -} -``` - -The aliases are not shown to the user on tab completion, but they are accepted as valid nouns by -the completion algorithm if entered manually, e.g. in: - -```bash -# kubectl get rc [tab][tab] -backend frontend database -``` - -Note that without declaring `rc` as an alias, the completion algorithm would show the list of nouns -in this example again instead of the replication controllers. - -### Dynamic completion of nouns - -In some cases it is not possible to provide a list of possible completions in advance. Instead, the list of completions must be determined at execution-time. Cobra provides two ways of defining such dynamic completion of nouns. Note that both these methods can be used along-side each other as long as they are not both used for the same command. +## Bash legacy dynamic completions -**Note**: *Custom Completions written in Go* will automatically work for other shell-completion scripts (e.g., Fish shell), while *Custom Completions written in Bash* will only work for Bash shell-completion. It is therefore recommended to use *Custom Completions written in Go*. - -#### 1. Custom completions of nouns written in Go - -In a similar fashion as for static completions, you can use the `ValidArgsFunction` field to provide a Go function that Cobra will execute when it needs the list of completion choices for the nouns of a command. Note that either `ValidArgs` or `ValidArgsFunction` can be used for a single cobra command, but not both. -Simplified code from `helm status` looks like: - -```go -cmd := &cobra.Command{ - Use: "status RELEASE_NAME", - Short: "Display the status of the named release", - Long: status_long, - RunE: func(cmd *cobra.Command, args []string) { - RunGet(args[0]) - }, - ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - if len(args) != 0 { - return nil, cobra.ShellCompDirectiveNoFileComp - } - return getReleasesFromCluster(toComplete), cobra.ShellCompDirectiveNoFileComp - }, -} -``` -Where `getReleasesFromCluster()` is a Go function that obtains the list of current Helm releases running on the Kubernetes cluster. -Notice we put the `ValidArgsFunction` on the `status` subcommand. Let's assume the Helm releases on the cluster are: `harbor`, `notary`, `rook` and `thanos` then this dynamic completion will give results like - -```bash -# helm status [tab][tab] -harbor notary rook thanos -``` -You may have noticed the use of `cobra.ShellCompDirective`. These directives are bit fields allowing to control some shell completion behaviors for your particular completion. You can combine them with the bit-or operator such as `cobra.ShellCompDirectiveNoSpace | cobra.ShellCompDirectiveNoFileComp` -```go -// Indicates an error occurred and completions should be ignored. -ShellCompDirectiveError -// Indicates that the shell should not add a space after the completion, -// even if there is a single completion provided. -ShellCompDirectiveNoSpace -// Indicates that the shell should not provide file completion even when -// no completion is provided. -// This currently does not work for zsh or bash < 4 -ShellCompDirectiveNoFileComp -// Indicates that the shell will perform its default behavior after completions -// have been provided (this implies !ShellCompDirectiveNoSpace && !ShellCompDirectiveNoFileComp). -ShellCompDirectiveDefault -``` +For backwards-compatibility, Cobra still supports its legacy dynamic completion solution (described below). Unlike the `ValidArgsFunction` solution, the legacy solution will only work for Bash shell-completion and not for other shells. This legacy solution can be used along-side `ValidArgsFunction` and `RegisterFlagCompletionFunc()`, as long as both solutions are not used for the same command. This provides a path to gradually migrate from the legacy solution to the new solution. -When using the `ValidArgsFunction`, Cobra will call your registered function after having parsed all flags and arguments provided in the command-line. You therefore don't need to do this parsing yourself. For example, when a user calls `helm status --namespace my-rook-ns [tab][tab]`, Cobra will call your registered `ValidArgsFunction` after having parsed the `--namespace` flag, as it would have done when calling the `RunE` function. +The legacy solution allows you to inject bash functions into the bash completion script. Those bash functions are responsible for providing the completion choices for your own completions. -##### Debugging - -Cobra achieves dynamic completions written in Go through the use of a hidden command called by the completion script. To debug your Go completion code, you can call this hidden command directly: -```bash -# helm __complete status har -harbor -:4 -Completion ended with directive: ShellCompDirectiveNoFileComp # This is on stderr -``` -***Important:*** If the noun to complete is empty, you must pass an empty parameter to the `__complete` command: -```bash -# helm __complete status "" -harbor -notary -rook -thanos -:4 -Completion ended with directive: ShellCompDirectiveNoFileComp # This is on stderr -``` -Calling the `__complete` command directly allows you to run the Go debugger to troubleshoot your code. You can also add printouts to your code; Cobra provides the following functions to use for printouts in Go completion code: -```go -// Prints to the completion script debug file (if BASH_COMP_DEBUG_FILE -// is set to a file path) and optionally prints to stderr. -cobra.CompDebug(msg string, printToStdErr bool) { -cobra.CompDebugln(msg string, printToStdErr bool) - -// Prints to the completion script debug file (if BASH_COMP_DEBUG_FILE -// is set to a file path) and to stderr. -cobra.CompError(msg string) -cobra.CompErrorln(msg string) -``` -***Important:*** You should **not** leave traces that print to stdout in your completion code as they will be interpreted as completion choices by the completion script. Instead, use the cobra-provided debugging traces functions mentioned above. - -#### 2. Custom completions of nouns written in Bash - -This method allows you to inject bash functions into the completion script. Those bash functions are responsible for providing the completion choices for your own completions. - -Some more actual code that works in kubernetes: +Some code that works in kubernetes: ```bash const ( @@ -253,93 +61,7 @@ Find more information at https://github.com/GoogleCloudPlatform/kubernetes.`, The `BashCompletionFunction` option is really only valid/useful on the root command. Doing the above will cause `__kubectl_custom_func()` (`___custom_func()`) to be called when the built in processor was unable to find a solution. In the case of kubernetes a valid command might look something like `kubectl get pod [mypod]`. If you type `kubectl get pod [tab][tab]` the `__kubectl_customc_func()` will run because the cobra.Command only understood "kubectl" and "get." `__kubectl_custom_func()` will see that the cobra.Command is "kubectl_get" and will thus call another helper `__kubectl_get_resource()`. `__kubectl_get_resource` will look at the 'nouns' collected. In our example the only noun will be `pod`. So it will call `__kubectl_parse_get pod`. `__kubectl_parse_get` will actually call out to kubernetes and get any pods. It will then set `COMPREPLY` to valid pods! -## Mark flags as required - -Most of the time completions will only show subcommands. But if a flag is required to make a subcommand work, you probably want it to show up when the user types [tab][tab]. Marking a flag as 'Required' is incredibly easy. - -```go -cmd.MarkFlagRequired("pod") -cmd.MarkFlagRequired("container") -``` - -and you'll get something like - -```bash -# kubectl exec [tab][tab][tab] --c --container= -p --pod= -``` - -# Specify valid filename extensions for flags that take a filename - -In this example we use --filename= and expect to get a json or yaml file as the argument. To make this easier we annotate the --filename flag with valid filename extensions. - -```go - annotations := []string{"json", "yaml", "yml"} - annotation := make(map[string][]string) - annotation[cobra.BashCompFilenameExt] = annotations - - flag := &pflag.Flag{ - Name: "filename", - Shorthand: "f", - Usage: usage, - Value: value, - DefValue: value.String(), - Annotations: annotation, - } - cmd.Flags().AddFlag(flag) -``` - -Now when you run a command with this filename flag you'll get something like - -```bash -# kubectl create -f -test/ example/ rpmbuild/ -hello.yml test.json -``` - -So while there are many other files in the CWD it only shows me subdirs and those with valid extensions. - -# Specify custom flag completion - -As for nouns, Cobra provides two ways of defining dynamic completion of flags. Note that both these methods can be used along-side each other as long as they are not both used for the same flag. - -**Note**: *Custom Completions written in Go* will automatically work for other shell-completion scripts (e.g., Fish shell), while *Custom Completions written in Bash* will only work for Bash shell-completion. It is therefore recommended to use *Custom Completions written in Go*. - -## 1. Custom completions of flags written in Go - -To provide a Go function that Cobra will execute when it needs the list of completion choices for a flag, you must register the function in the following manner: - -```go -flagName := "output" -cmd.RegisterFlagCompletionFunc(flagName, func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - return []string{"json", "table", "yaml"}, cobra.ShellCompDirectiveDefault -}) -``` -Notice that calling `RegisterFlagCompletionFunc()` is done through the `command` with which the flag is associated. In our example this dynamic completion will give results like so: - -```bash -# helm status --output [tab][tab] -json table yaml -``` - -### Debugging - -You can also easily debug your Go completion code for flags: -```bash -# helm __complete status --output "" -json -table -yaml -:4 -Completion ended with directive: ShellCompDirectiveNoFileComp # This is on stderr -``` -***Important:*** You should **not** leave traces that print to stdout in your completion code as they will be interpreted as completion choices by the completion script. Instead, use the cobra-provided debugging traces functions mentioned in the above section. - -## 2. Custom completions of flags written in Bash - -Alternatively, you can use bash code for flag custom completion. Similar to the filename -completion and filtering using `cobra.BashCompFilenameExt`, you can specify -a custom flag completion bash function with `cobra.BashCompCustom`: +Similarly, for flags: ```go annotation := make(map[string][]string) @@ -367,17 +89,3 @@ __kubectl_get_namespaces() fi } ``` -# Using bash aliases for commands - -You can also configure the `bash aliases` for the commands and they will also support completions. - -```bash -alias aliasname=origcommand -complete -o default -F __start_origcommand aliasname - -# and now when you run `aliasname` completion will make -# suggestions as it did for `origcommand`. - -$) aliasname -completion firstcommand secondcommand -``` diff --git a/vendor/github.com/spf13/cobra/command.go b/vendor/github.com/spf13/cobra/command.go index 88e6ed77d0..77b399e02e 100644 --- a/vendor/github.com/spf13/cobra/command.go +++ b/vendor/github.com/spf13/cobra/command.go @@ -37,6 +37,14 @@ type FParseErrWhitelist flag.ParseErrorsWhitelist // definition to ensure usability. type Command struct { // Use is the one-line usage message. + // Recommended syntax is as follow: + // [ ] identifies an optional argument. Arguments that are not enclosed in brackets are required. + // ... indicates that you can specify multiple values for the previous argument. + // | indicates mutually exclusive information. You can use the argument to the left of the separator or the + // argument to the right of the separator. You cannot use both arguments in a single use of the command. + // { } delimits a set of mutually exclusive arguments when one of the arguments is required. If the arguments are + // optional, they are enclosed in brackets ([ ]). + // Example: add [-F file | -D dir]... [-f format] profile Use string // Aliases is an array of aliases that can be used instead of the first word in Use. @@ -359,7 +367,7 @@ func (c *Command) UsageFunc() (f func(*Command) error) { c.mergePersistentFlags() err := tmpl(c.OutOrStderr(), c.UsageTemplate(), c) if err != nil { - c.Println(err) + c.PrintErrln(err) } return err } @@ -387,7 +395,7 @@ func (c *Command) HelpFunc() func(*Command, []string) { // See https://github.com/spf13/cobra/issues/1002 err := tmpl(c.OutOrStdout(), c.HelpTemplate(), c) if err != nil { - c.Println(err) + c.PrintErrln(err) } } } @@ -930,8 +938,8 @@ func (c *Command) ExecuteC() (cmd *Command, err error) { c = cmd } if !c.SilenceErrors { - c.Println("Error:", err.Error()) - c.Printf("Run '%v --help' for usage.\n", c.CommandPath()) + c.PrintErrln("Error:", err.Error()) + c.PrintErrf("Run '%v --help' for usage.\n", c.CommandPath()) } return c, err } @@ -959,7 +967,7 @@ func (c *Command) ExecuteC() (cmd *Command, err error) { // If root command has SilentErrors flagged, // all subcommands should respect it if !cmd.SilenceErrors && !c.SilenceErrors { - c.Println("Error:", err.Error()) + c.PrintErrln("Error:", err.Error()) } // If root command has SilentUsage flagged, @@ -979,6 +987,10 @@ func (c *Command) ValidateArgs(args []string) error { } func (c *Command) validateRequiredFlags() error { + if c.DisableFlagParsing { + return nil + } + flags := c.Flags() missingFlagNames := []string{} flags.VisitAll(func(pflag *flag.Flag) { @@ -1052,7 +1064,25 @@ func (c *Command) InitDefaultHelpCmd() { Short: "Help about any command", Long: `Help provides help for any command in the application. Simply type ` + c.Name() + ` help [path to command] for full details.`, - + ValidArgsFunction: func(c *Command, args []string, toComplete string) ([]string, ShellCompDirective) { + var completions []string + cmd, _, e := c.Root().Find(args) + if e != nil { + return nil, ShellCompDirectiveNoFileComp + } + if cmd == nil { + // Root help command. + cmd = c.Root() + } + for _, subCmd := range cmd.Commands() { + if subCmd.IsAvailableCommand() || subCmd == cmd.helpCommand { + if strings.HasPrefix(subCmd.Name(), toComplete) { + completions = append(completions, fmt.Sprintf("%s\t%s", subCmd.Name(), subCmd.Short)) + } + } + } + return completions, ShellCompDirectiveNoFileComp + }, Run: func(c *Command, args []string) { cmd, _, e := c.Root().Find(args) if cmd == nil || e != nil { @@ -1179,12 +1209,12 @@ func (c *Command) PrintErr(i ...interface{}) { // PrintErrln is a convenience method to Println to the defined Err output, fallback to Stderr if not set. func (c *Command) PrintErrln(i ...interface{}) { - c.Print(fmt.Sprintln(i...)) + c.PrintErr(fmt.Sprintln(i...)) } // PrintErrf is a convenience method to Printf to the defined Err output, fallback to Stderr if not set. func (c *Command) PrintErrf(format string, i ...interface{}) { - c.Print(fmt.Sprintf(format, i...)) + c.PrintErr(fmt.Sprintf(format, i...)) } // CommandPath returns the full path to this command. diff --git a/vendor/github.com/spf13/cobra/custom_completions.go b/vendor/github.com/spf13/cobra/custom_completions.go index ba57327c15..f9e88e081f 100644 --- a/vendor/github.com/spf13/cobra/custom_completions.go +++ b/vendor/github.com/spf13/cobra/custom_completions.go @@ -1,7 +1,6 @@ package cobra import ( - "errors" "fmt" "os" "strings" @@ -38,8 +37,29 @@ const ( // This currently does not work for zsh or bash < 4 ShellCompDirectiveNoFileComp + // ShellCompDirectiveFilterFileExt indicates that the provided completions + // should be used as file extension filters. + // For flags, using Command.MarkFlagFilename() and Command.MarkPersistentFlagFilename() + // is a shortcut to using this directive explicitly. The BashCompFilenameExt + // annotation can also be used to obtain the same behavior for flags. + ShellCompDirectiveFilterFileExt + + // ShellCompDirectiveFilterDirs indicates that only directory names should + // be provided in file completion. To request directory names within another + // directory, the returned completions should specify the directory within + // which to search. The BashCompSubdirsInDir annotation can be used to + // obtain the same behavior but only for flags. + ShellCompDirectiveFilterDirs + + // =========================================================================== + + // All directives using iota should be above this one. + // For internal use. + shellCompDirectiveMaxValue + // ShellCompDirectiveDefault indicates to let the shell perform its default // behavior after completions have been provided. + // This one must be last to avoid messing up the iota count. ShellCompDirectiveDefault ShellCompDirective = 0 ) @@ -68,11 +88,17 @@ func (d ShellCompDirective) string() string { if d&ShellCompDirectiveNoFileComp != 0 { directives = append(directives, "ShellCompDirectiveNoFileComp") } + if d&ShellCompDirectiveFilterFileExt != 0 { + directives = append(directives, "ShellCompDirectiveFilterFileExt") + } + if d&ShellCompDirectiveFilterDirs != 0 { + directives = append(directives, "ShellCompDirectiveFilterDirs") + } if len(directives) == 0 { directives = append(directives, "ShellCompDirectiveDefault") } - if d > ShellCompDirectiveError+ShellCompDirectiveNoSpace+ShellCompDirectiveNoFileComp { + if d >= shellCompDirectiveMaxValue { return fmt.Sprintf("ERROR: unexpected ShellCompDirective value: %d", d) } return strings.Join(directives, ", ") @@ -105,11 +131,25 @@ func (c *Command) initCompleteCmd(args []string) { // Remove any description that may be included following a tab character. comp = strings.Split(comp, "\t")[0] } + + // Make sure we only write the first line to the output. + // This is needed if a description contains a linebreak. + // Otherwise the shell scripts will interpret the other lines as new flags + // and could therefore provide a wrong completion. + comp = strings.Split(comp, "\n")[0] + + // Finally trim the completion. This is especially important to get rid + // of a trailing tab when there are no description following it. + // For example, a sub-command without a description should not be completed + // with a tab at the end (or else zsh will show a -- following it + // although there is no description). + comp = strings.TrimSpace(comp) + // Print each possible completion to stdout for the completion script to consume. fmt.Fprintln(finalCmd.OutOrStdout(), comp) } - if directive > ShellCompDirectiveError+ShellCompDirectiveNoSpace+ShellCompDirectiveNoFileComp { + if directive >= shellCompDirectiveMaxValue { directive = ShellCompDirectiveDefault } @@ -136,90 +176,179 @@ func (c *Command) initCompleteCmd(args []string) { } func (c *Command) getCompletions(args []string) (*Command, []string, ShellCompDirective, error) { - var completions []string - // The last argument, which is not completely typed by the user, // should not be part of the list of arguments toComplete := args[len(args)-1] trimmedArgs := args[:len(args)-1] + var finalCmd *Command + var finalArgs []string + var err error // Find the real command for which completion must be performed - finalCmd, finalArgs, err := c.Root().Find(trimmedArgs) + // check if we need to traverse here to parse local flags on parent commands + if c.Root().TraverseChildren { + finalCmd, finalArgs, err = c.Root().Traverse(trimmedArgs) + } else { + finalCmd, finalArgs, err = c.Root().Find(trimmedArgs) + } if err != nil { // Unable to find the real command. E.g., someInvalidCmd - return c, completions, ShellCompDirectiveDefault, fmt.Errorf("Unable to find a command for arguments: %v", trimmedArgs) + return c, []string{}, ShellCompDirectiveDefault, fmt.Errorf("Unable to find a command for arguments: %v", trimmedArgs) + } + + // Check if we are doing flag value completion before parsing the flags. + // This is important because if we are completing a flag value, we need to also + // remove the flag name argument from the list of finalArgs or else the parsing + // could fail due to an invalid value (incomplete) for the flag. + flag, finalArgs, toComplete, err := checkIfFlagCompletion(finalCmd, finalArgs, toComplete) + if err != nil { + // Error while attempting to parse flags + return finalCmd, []string{}, ShellCompDirectiveDefault, err + } + + // Parse the flags early so we can check if required flags are set + if err = finalCmd.ParseFlags(finalArgs); err != nil { + return finalCmd, []string{}, ShellCompDirectiveDefault, fmt.Errorf("Error while parsing flags from args %v: %s", finalArgs, err.Error()) + } + + if flag != nil { + // Check if we are completing a flag value subject to annotations + if validExts, present := flag.Annotations[BashCompFilenameExt]; present { + if len(validExts) != 0 { + // File completion filtered by extensions + return finalCmd, validExts, ShellCompDirectiveFilterFileExt, nil + } + + // The annotation requests simple file completion. There is no reason to do + // that since it is the default behavior anyway. Let's ignore this annotation + // in case the program also registered a completion function for this flag. + // Even though it is a mistake on the program's side, let's be nice when we can. + } + + if subDir, present := flag.Annotations[BashCompSubdirsInDir]; present { + if len(subDir) == 1 { + // Directory completion from within a directory + return finalCmd, subDir, ShellCompDirectiveFilterDirs, nil + } + // Directory completion + return finalCmd, []string{}, ShellCompDirectiveFilterDirs, nil + } } // When doing completion of a flag name, as soon as an argument starts with // a '-' we know it is a flag. We cannot use isFlagArg() here as it requires - // the flag to be complete - if len(toComplete) > 0 && toComplete[0] == '-' && !strings.Contains(toComplete, "=") { - // We are completing a flag name - finalCmd.NonInheritedFlags().VisitAll(func(flag *pflag.Flag) { - completions = append(completions, getFlagNameCompletions(flag, toComplete)...) - }) - finalCmd.InheritedFlags().VisitAll(func(flag *pflag.Flag) { - completions = append(completions, getFlagNameCompletions(flag, toComplete)...) - }) - - directive := ShellCompDirectiveDefault - if len(completions) > 0 { - if strings.HasSuffix(completions[0], "=") { - directive = ShellCompDirectiveNoSpace + // the flag name to be complete + if flag == nil && len(toComplete) > 0 && toComplete[0] == '-' && !strings.Contains(toComplete, "=") { + var completions []string + + // First check for required flags + completions = completeRequireFlags(finalCmd, toComplete) + + // If we have not found any required flags, only then can we show regular flags + if len(completions) == 0 { + doCompleteFlags := func(flag *pflag.Flag) { + if !flag.Changed || + strings.Contains(flag.Value.Type(), "Slice") || + strings.Contains(flag.Value.Type(), "Array") { + // If the flag is not already present, or if it can be specified multiple times (Array or Slice) + // we suggest it as a completion + completions = append(completions, getFlagNameCompletions(flag, toComplete)...) + } } + + // We cannot use finalCmd.Flags() because we may not have called ParsedFlags() for commands + // that have set DisableFlagParsing; it is ParseFlags() that merges the inherited and + // non-inherited flags. + finalCmd.InheritedFlags().VisitAll(func(flag *pflag.Flag) { + doCompleteFlags(flag) + }) + finalCmd.NonInheritedFlags().VisitAll(func(flag *pflag.Flag) { + doCompleteFlags(flag) + }) + } + + directive := ShellCompDirectiveNoFileComp + if len(completions) == 1 && strings.HasSuffix(completions[0], "=") { + // If there is a single completion, the shell usually adds a space + // after the completion. We don't want that if the flag ends with an = + directive = ShellCompDirectiveNoSpace } return finalCmd, completions, directive, nil } - var flag *pflag.Flag + // We only remove the flags from the arguments if DisableFlagParsing is not set. + // This is important for commands which have requested to do their own flag completion. if !finalCmd.DisableFlagParsing { - // We only do flag completion if we are allowed to parse flags - // This is important for commands which have requested to do their own flag completion. - flag, finalArgs, toComplete, err = checkIfFlagCompletion(finalCmd, finalArgs, toComplete) - if err != nil { - // Error while attempting to parse flags - return finalCmd, completions, ShellCompDirectiveDefault, err - } + finalArgs = finalCmd.Flags().Args() } + var completions []string + directive := ShellCompDirectiveDefault if flag == nil { - // Complete subcommand names - for _, subCmd := range finalCmd.Commands() { - if subCmd.IsAvailableCommand() && strings.HasPrefix(subCmd.Name(), toComplete) { - completions = append(completions, fmt.Sprintf("%s\t%s", subCmd.Name(), subCmd.Short)) + foundLocalNonPersistentFlag := false + // If TraverseChildren is true on the root command we don't check for + // local flags because we can use a local flag on a parent command + if !finalCmd.Root().TraverseChildren { + // Check if there are any local, non-persistent flags on the command-line + localNonPersistentFlags := finalCmd.LocalNonPersistentFlags() + finalCmd.NonInheritedFlags().VisitAll(func(flag *pflag.Flag) { + if localNonPersistentFlags.Lookup(flag.Name) != nil && flag.Changed { + foundLocalNonPersistentFlag = true + } + }) + } + + // Complete subcommand names, including the help command + if len(finalArgs) == 0 && !foundLocalNonPersistentFlag { + // We only complete sub-commands if: + // - there are no arguments on the command-line and + // - there are no local, non-peristent flag on the command-line or TraverseChildren is true + for _, subCmd := range finalCmd.Commands() { + if subCmd.IsAvailableCommand() || subCmd == finalCmd.helpCommand { + if strings.HasPrefix(subCmd.Name(), toComplete) { + completions = append(completions, fmt.Sprintf("%s\t%s", subCmd.Name(), subCmd.Short)) + } + directive = ShellCompDirectiveNoFileComp + } } } + // Complete required flags even without the '-' prefix + completions = append(completions, completeRequireFlags(finalCmd, toComplete)...) + + // Always complete ValidArgs, even if we are completing a subcommand name. + // This is for commands that have both subcommands and ValidArgs. if len(finalCmd.ValidArgs) > 0 { - // Always complete ValidArgs, even if we are completing a subcommand name. - // This is for commands that have both subcommands and ValidArgs. - for _, validArg := range finalCmd.ValidArgs { - if strings.HasPrefix(validArg, toComplete) { - completions = append(completions, validArg) + if len(finalArgs) == 0 { + // ValidArgs are only for the first argument + for _, validArg := range finalCmd.ValidArgs { + if strings.HasPrefix(validArg, toComplete) { + completions = append(completions, validArg) + } + } + directive = ShellCompDirectiveNoFileComp + + // If no completions were found within commands or ValidArgs, + // see if there are any ArgAliases that should be completed. + if len(completions) == 0 { + for _, argAlias := range finalCmd.ArgAliases { + if strings.HasPrefix(argAlias, toComplete) { + completions = append(completions, argAlias) + } + } } } // If there are ValidArgs specified (even if they don't match), we stop completion. // Only one of ValidArgs or ValidArgsFunction can be used for a single command. - return finalCmd, completions, ShellCompDirectiveNoFileComp, nil + return finalCmd, completions, directive, nil } - // Always let the logic continue so as to add any ValidArgsFunction completions, + // Let the logic continue so as to add any ValidArgsFunction completions, // even if we already found sub-commands. // This is for commands that have subcommands but also specify a ValidArgsFunction. } - // Parse the flags and extract the arguments to prepare for calling the completion function - if err = finalCmd.ParseFlags(finalArgs); err != nil { - return finalCmd, completions, ShellCompDirectiveDefault, fmt.Errorf("Error while parsing flags from args %v: %s", finalArgs, err.Error()) - } - - // We only remove the flags from the arguments if DisableFlagParsing is not set. - // This is important for commands which have requested to do their own flag completion. - if !finalCmd.DisableFlagParsing { - finalArgs = finalCmd.Flags().Args() - } - // Find the completion function for the flag or command var completionFn func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective) if flag != nil { @@ -227,14 +356,14 @@ func (c *Command) getCompletions(args []string) (*Command, []string, ShellCompDi } else { completionFn = finalCmd.ValidArgsFunction } - if completionFn == nil { - // Go custom completion not supported/needed for this flag or command - return finalCmd, completions, ShellCompDirectiveDefault, nil + if completionFn != nil { + // Go custom completion defined for this flag or command. + // Call the registered completion function to get the completions. + var comps []string + comps, directive = completionFn(finalCmd, finalArgs, toComplete) + completions = append(completions, comps...) } - // Call the registered completion function to get the completions - comps, directive := completionFn(finalCmd, finalArgs, toComplete) - completions = append(completions, comps...) return finalCmd, completions, directive, nil } @@ -249,11 +378,18 @@ func getFlagNameCompletions(flag *pflag.Flag, toComplete string) []string { // Flag without the = completions = append(completions, fmt.Sprintf("%s\t%s", flagName, flag.Usage)) - if len(flag.NoOptDefVal) == 0 { - // Flag requires a value, so it can be suffixed with = - flagName += "=" - completions = append(completions, fmt.Sprintf("%s\t%s", flagName, flag.Usage)) - } + // Why suggest both long forms: --flag and --flag= ? + // This forces the user to *always* have to type either an = or a space after the flag name. + // Let's be nice and avoid making users have to do that. + // Since boolean flags and shortname flags don't show the = form, let's go that route and never show it. + // The = form will still work, we just won't suggest it. + // This also makes the list of suggested flags shorter as we avoid all the = forms. + // + // if len(flag.NoOptDefVal) == 0 { + // // Flag requires a value, so it can be suffixed with = + // flagName += "=" + // completions = append(completions, fmt.Sprintf("%s\t%s", flagName, flag.Usage)) + // } } flagName = "-" + flag.Shorthand @@ -264,17 +400,54 @@ func getFlagNameCompletions(flag *pflag.Flag, toComplete string) []string { return completions } +func completeRequireFlags(finalCmd *Command, toComplete string) []string { + var completions []string + + doCompleteRequiredFlags := func(flag *pflag.Flag) { + if _, present := flag.Annotations[BashCompOneRequiredFlag]; present { + if !flag.Changed { + // If the flag is not already present, we suggest it as a completion + completions = append(completions, getFlagNameCompletions(flag, toComplete)...) + } + } + } + + // We cannot use finalCmd.Flags() because we may not have called ParsedFlags() for commands + // that have set DisableFlagParsing; it is ParseFlags() that merges the inherited and + // non-inherited flags. + finalCmd.InheritedFlags().VisitAll(func(flag *pflag.Flag) { + doCompleteRequiredFlags(flag) + }) + finalCmd.NonInheritedFlags().VisitAll(func(flag *pflag.Flag) { + doCompleteRequiredFlags(flag) + }) + + return completions +} + func checkIfFlagCompletion(finalCmd *Command, args []string, lastArg string) (*pflag.Flag, []string, string, error) { + if finalCmd.DisableFlagParsing { + // We only do flag completion if we are allowed to parse flags + // This is important for commands which have requested to do their own flag completion. + return nil, args, lastArg, nil + } + var flagName string trimmedArgs := args flagWithEqual := false - if isFlagArg(lastArg) { + + // When doing completion of a flag name, as soon as an argument starts with + // a '-' we know it is a flag. We cannot use isFlagArg() here as that function + // requires the flag name to be complete + if len(lastArg) > 0 && lastArg[0] == '-' { if index := strings.Index(lastArg, "="); index >= 0 { + // Flag with an = flagName = strings.TrimLeft(lastArg[:index], "-") lastArg = lastArg[index+1:] flagWithEqual = true } else { - return nil, nil, "", errors.New("Unexpected completion request for flag") + // Normal flag completion + return nil, args, lastArg, nil } } diff --git a/vendor/github.com/spf13/cobra/doc/README.md b/vendor/github.com/spf13/cobra/doc/README.md new file mode 100644 index 0000000000..6ea4eb6623 --- /dev/null +++ b/vendor/github.com/spf13/cobra/doc/README.md @@ -0,0 +1,12 @@ +# Documentation generation + +- [Man page docs](./man_docs.md) +- [Markdown docs](./md_docs.md) +- [Rest docs](./rest_docs.md) +- [Yaml docs](./yaml_docs.md) + +## Options +### `DisableAutoGenTag` +You may set `cmd.DisableAutoGenTag = true` +to _entirely_ remove the auto generated string "Auto generated by spf13/cobra..." +from any documentation source. diff --git a/vendor/github.com/spf13/cobra/doc/man_docs.go b/vendor/github.com/spf13/cobra/doc/man_docs.go index 8c7fba44a8..b67ac1f1c0 100644 --- a/vendor/github.com/spf13/cobra/doc/man_docs.go +++ b/vendor/github.com/spf13/cobra/doc/man_docs.go @@ -105,7 +105,7 @@ func GenMan(cmd *cobra.Command, header *GenManHeader, w io.Writer) error { if header == nil { header = &GenManHeader{} } - if err := fillHeader(header, cmd.CommandPath()); err != nil { + if err := fillHeader(header, cmd.CommandPath(), cmd.DisableAutoGenTag); err != nil { return err } @@ -114,7 +114,7 @@ func GenMan(cmd *cobra.Command, header *GenManHeader, w io.Writer) error { return err } -func fillHeader(header *GenManHeader, name string) error { +func fillHeader(header *GenManHeader, name string, disableAutoGen bool) error { if header.Title == "" { header.Title = strings.ToUpper(strings.Replace(name, " ", "\\-", -1)) } @@ -133,7 +133,7 @@ func fillHeader(header *GenManHeader, name string) error { header.Date = &now } header.date = (*header.Date).Format("Jan 2006") - if header.Source == "" { + if header.Source == "" && !disableAutoGen { header.Source = "Auto generated by spf13/cobra" } return nil @@ -145,9 +145,7 @@ func manPreamble(buf *bytes.Buffer, header *GenManHeader, cmd *cobra.Command, da description = cmd.Short } - buf.WriteString(fmt.Sprintf(`%% %s(%s)%s -%% %s -%% %s + buf.WriteString(fmt.Sprintf(`%% "%s" "%s" "%s" "%s" "%s" # NAME `, header.Title, header.Section, header.date, header.Source, header.Manual)) buf.WriteString(fmt.Sprintf("%s \\- %s\n\n", dashedName, cmd.Short)) diff --git a/vendor/github.com/spf13/cobra/doc/md_docs.go b/vendor/github.com/spf13/cobra/doc/md_docs.go index d76f6d5ecb..5181af8dc2 100644 --- a/vendor/github.com/spf13/cobra/doc/md_docs.go +++ b/vendor/github.com/spf13/cobra/doc/md_docs.go @@ -58,16 +58,12 @@ func GenMarkdownCustom(cmd *cobra.Command, w io.Writer, linkHandler func(string) buf := new(bytes.Buffer) name := cmd.CommandPath() - short := cmd.Short - long := cmd.Long - if len(long) == 0 { - long = short - } - buf.WriteString("## " + name + "\n\n") - buf.WriteString(short + "\n\n") - buf.WriteString("### Synopsis\n\n") - buf.WriteString(long + "\n\n") + buf.WriteString(cmd.Short + "\n\n") + if len(cmd.Long) > 0 { + buf.WriteString("### Synopsis\n\n") + buf.WriteString(cmd.Long + "\n\n") + } if cmd.Runnable() { buf.WriteString(fmt.Sprintf("```\n%s\n```\n\n", cmd.UseLine())) diff --git a/vendor/github.com/spf13/cobra/doc/util.go b/vendor/github.com/spf13/cobra/doc/util.go index 8d3dbecec8..bffde94d50 100644 --- a/vendor/github.com/spf13/cobra/doc/util.go +++ b/vendor/github.com/spf13/cobra/doc/util.go @@ -20,7 +20,7 @@ import ( ) // Test to see if we have a reason to print See Also information in docs -// Basically this is a test for a parent commend or a subcommand which is +// Basically this is a test for a parent command or a subcommand which is // both not deprecated and not the autogenerated help command. func hasSeeAlso(cmd *cobra.Command) bool { if cmd.HasParent() { diff --git a/vendor/github.com/spf13/cobra/doc/yaml_docs.go b/vendor/github.com/spf13/cobra/doc/yaml_docs.go index ea00af07e8..96e6ad721e 100644 --- a/vendor/github.com/spf13/cobra/doc/yaml_docs.go +++ b/vendor/github.com/spf13/cobra/doc/yaml_docs.go @@ -37,6 +37,7 @@ type cmdDoc struct { Name string Synopsis string `yaml:",omitempty"` Description string `yaml:",omitempty"` + Usage string `yaml:",omitempty"` Options []cmdOption `yaml:",omitempty"` InheritedOptions []cmdOption `yaml:"inherited_options,omitempty"` Example string `yaml:",omitempty"` @@ -98,6 +99,10 @@ func GenYamlCustom(cmd *cobra.Command, w io.Writer, linkHandler func(string) str yamlDoc.Synopsis = forceMultiLine(cmd.Short) yamlDoc.Description = forceMultiLine(cmd.Long) + if cmd.Runnable() { + yamlDoc.Usage = cmd.UseLine() + } + if len(cmd.Example) > 0 { yamlDoc.Example = cmd.Example } diff --git a/vendor/github.com/spf13/cobra/fish_completions.go b/vendor/github.com/spf13/cobra/fish_completions.go index c83609c83b..eaae9bca86 100644 --- a/vendor/github.com/spf13/cobra/fish_completions.go +++ b/vendor/github.com/spf13/cobra/fish_completions.go @@ -5,9 +5,15 @@ import ( "fmt" "io" "os" + "strings" ) func genFishComp(buf *bytes.Buffer, name string, includeDesc bool) { + // Variables should not contain a '-' or ':' character + nameForVar := name + nameForVar = strings.Replace(nameForVar, "-", "_", -1) + nameForVar = strings.Replace(nameForVar, ":", "_", -1) + compCmd := ShellCompRequestCmd if !includeDesc { compCmd = ShellCompNoDescRequestCmd @@ -37,7 +43,13 @@ function __%[1]s_perform_completion end __%[1]s_debug "emptyArg: $emptyArg" - set requestComp "$args[1] %[2]s $args[2..-1] $emptyArg" + if not type -q "$args[1]" + # This can happen when "complete --do-complete %[2]s" is called when running this script. + __%[1]s_debug "Cannot find $args[1]. No completions." + return + end + + set requestComp "$args[1] %[3]s $args[2..-1] $emptyArg" __%[1]s_debug "Calling $requestComp" set results (eval $requestComp 2> /dev/null) @@ -71,7 +83,8 @@ function __%[1]s_prepare_completions # Check if the command-line is already provided. This is useful for testing. if not set --query __%[1]s_comp_commandLine - set __%[1]s_comp_commandLine (commandline) + # Use the -c flag to allow for completion in the middle of the line + set __%[1]s_comp_commandLine (commandline -c) end __%[1]s_debug "commandLine is: $__%[1]s_comp_commandLine" @@ -83,7 +96,7 @@ function __%[1]s_prepare_completions __%[1]s_debug "No completion, probably due to a failure" # Might as well do file completion, in case it helps set --global __%[1]s_comp_do_file_comp 1 - return 0 + return 1 end set directive (string sub --start 2 $results[-1]) @@ -92,20 +105,35 @@ function __%[1]s_prepare_completions __%[1]s_debug "Completions are: $__%[1]s_comp_results" __%[1]s_debug "Directive is: $directive" + set shellCompDirectiveError %[4]d + set shellCompDirectiveNoSpace %[5]d + set shellCompDirectiveNoFileComp %[6]d + set shellCompDirectiveFilterFileExt %[7]d + set shellCompDirectiveFilterDirs %[8]d + if test -z "$directive" set directive 0 end - set compErr (math (math --scale 0 $directive / %[3]d) %% 2) + set compErr (math (math --scale 0 $directive / $shellCompDirectiveError) %% 2) if test $compErr -eq 1 __%[1]s_debug "Received error directive: aborting." # Might as well do file completion, in case it helps set --global __%[1]s_comp_do_file_comp 1 - return 0 + return 1 end - set nospace (math (math --scale 0 $directive / %[4]d) %% 2) - set nofiles (math (math --scale 0 $directive / %[5]d) %% 2) + set filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) %% 2) + set dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) %% 2) + if test $filefilter -eq 1; or test $dirfilter -eq 1 + __%[1]s_debug "File extension filtering or directory filtering not supported" + # Do full file completion instead + set --global __%[1]s_comp_do_file_comp 1 + return 1 + end + + set nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) %% 2) + set nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) %% 2) __%[1]s_debug "nospace: $nospace, nofiles: $nofiles" @@ -132,24 +160,31 @@ function __%[1]s_prepare_completions return (not set --query __%[1]s_comp_do_file_comp) end -# Remove any pre-existing completions for the program since we will be handling all of them -# TODO this cleanup is not sufficient. Fish completions are only loaded once the user triggers -# them, so the below deletion will not work as it is run too early. What else can we do? -complete -c %[1]s -e +# Since Fish completions are only loaded once the user triggers them, we trigger them ourselves +# so we can properly delete any completions provided by another script. +# The space after the the program name is essential to trigger completion for the program +# and not completion of the program name itself. +complete --do-complete "%[2]s " > /dev/null 2>&1 +# Using '> /dev/null 2>&1' since '&>' is not supported in older versions of fish. + +# Remove any pre-existing completions for the program since we will be handling all of them. +complete -c %[2]s -e # The order in which the below two lines are defined is very important so that __%[1]s_prepare_completions # is called first. It is __%[1]s_prepare_completions that sets up the __%[1]s_comp_do_file_comp variable. # # This completion will be run second as complete commands are added FILO. # It triggers file completion choices when __%[1]s_comp_do_file_comp is set. -complete -c %[1]s -n 'set --query __%[1]s_comp_do_file_comp' +complete -c %[2]s -n 'set --query __%[1]s_comp_do_file_comp' # This completion will be run first as complete commands are added FILO. -# The call to __%[1]s_prepare_completions will setup both __%[1]s_comp_results abd __%[1]s_comp_do_file_comp. +# The call to __%[1]s_prepare_completions will setup both __%[1]s_comp_results and __%[1]s_comp_do_file_comp. # It provides the program's completion choices. -complete -c %[1]s -n '__%[1]s_prepare_completions' -f -a '$__%[1]s_comp_results' +complete -c %[2]s -n '__%[1]s_prepare_completions' -f -a '$__%[1]s_comp_results' -`, name, compCmd, ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp)) +`, nameForVar, name, compCmd, + ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp, + ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs)) } // GenFishCompletion generates fish completion file and writes to the passed writer. diff --git a/vendor/github.com/spf13/cobra/fish_completions.md b/vendor/github.com/spf13/cobra/fish_completions.md index 6bfe5f88ef..19b2ed1293 100644 --- a/vendor/github.com/spf13/cobra/fish_completions.md +++ b/vendor/github.com/spf13/cobra/fish_completions.md @@ -1,7 +1,4 @@ -## Generating Fish Completions for your own cobra.Command +## Generating Fish Completions For Your cobra.Command -Cobra supports native Fish completions generated from the root `cobra.Command`. You can use the `command.GenFishCompletion()` or `command.GenFishCompletionFile()` functions. You must provide these functions with a parameter indicating if the completions should be annotated with a description; Cobra will provide the description automatically based on usage information. You can choose to make this option configurable by your users. +Please refer to [Shell Completions](shell_completions.md) for details. -### Limitations - -* Custom completions implemented using the `ValidArgsFunction` and `RegisterFlagCompletionFunc()` are supported automatically but the ones implemented in Bash scripting are not. diff --git a/vendor/github.com/spf13/cobra/go.mod b/vendor/github.com/spf13/cobra/go.mod index dea1030ba4..57e3244d5e 100644 --- a/vendor/github.com/spf13/cobra/go.mod +++ b/vendor/github.com/spf13/cobra/go.mod @@ -6,7 +6,7 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.0 github.com/inconshreveable/mousetrap v1.0.0 github.com/mitchellh/go-homedir v1.1.0 - github.com/spf13/pflag v1.0.3 - github.com/spf13/viper v1.4.0 - gopkg.in/yaml.v2 v2.2.2 + github.com/spf13/pflag v1.0.5 + github.com/spf13/viper v1.7.0 + gopkg.in/yaml.v2 v2.2.8 ) diff --git a/vendor/github.com/spf13/cobra/go.sum b/vendor/github.com/spf13/cobra/go.sum index 3aaa2ac0fd..0aae738631 100644 --- a/vendor/github.com/spf13/cobra/go.sum +++ b/vendor/github.com/spf13/cobra/go.sum @@ -1,28 +1,48 @@ 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.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/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +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/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= 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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= 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/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/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 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/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 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= @@ -32,19 +52,55 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= 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= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +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/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +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.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/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= 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/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +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/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -55,20 +111,34 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +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 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -79,11 +149,18 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= @@ -92,58 +169,145 @@ github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +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.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +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/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 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-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +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= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +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= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +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= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 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/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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +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= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/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-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0 h1:HyfiK1WMnHj5FXFXatD+Qs1A/xC2Run6RzeW1SyHxpc= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +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/tools v0.0.0-20180221164845-07fd8470d635/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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +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-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-20190606124116-d0a3d012864b/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-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +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= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/vendor/github.com/spf13/cobra/powershell_completions.md b/vendor/github.com/spf13/cobra/powershell_completions.md index afed802408..55f154a68f 100644 --- a/vendor/github.com/spf13/cobra/powershell_completions.md +++ b/vendor/github.com/spf13/cobra/powershell_completions.md @@ -2,6 +2,8 @@ Cobra can generate PowerShell completion scripts. Users need PowerShell version 5.0 or above, which comes with Windows 10 and can be downloaded separately for Windows 7 or 8.1. They can then write the completions to a file and source this file from their PowerShell profile, which is referenced by the `$Profile` environment variable. See `Get-Help about_Profiles` for more info about PowerShell profiles. +*Note*: PowerShell completions have not (yet?) been aligned to Cobra's generic shell completion support. This implies the PowerShell completions are not as rich as for other shells (see [What's not yet supported](#whats-not-yet-supported)), and may behave slightly differently. They are still very useful for PowerShell users. + # What's supported - Completion for subcommands using their `.Short` description diff --git a/vendor/github.com/spf13/cobra/projects_using_cobra.md b/vendor/github.com/spf13/cobra/projects_using_cobra.md new file mode 100644 index 0000000000..31c272036a --- /dev/null +++ b/vendor/github.com/spf13/cobra/projects_using_cobra.md @@ -0,0 +1,35 @@ +## Projects using Cobra + +- [Arduino CLI](https://github.com/arduino/arduino-cli) +- [Bleve](http://www.blevesearch.com/) +- [CockroachDB](http://www.cockroachlabs.com/) +- [Cosmos SDK](https://github.com/cosmos/cosmos-sdk) +- [Delve](https://github.com/derekparker/delve) +- [Docker (distribution)](https://github.com/docker/distribution) +- [Etcd](https://etcd.io/) +- [Gardener](https://github.com/gardener/gardenctl) +- [Giant Swarm's gsctl](https://github.com/giantswarm/gsctl) +- [Git Bump](https://github.com/erdaltsksn/git-bump) +- [Github CLI](https://github.com/cli/cli) +- [GitHub Labeler](https://github.com/erdaltsksn/gh-label) +- [Golangci-lint](https://golangci-lint.run) +- [GopherJS](http://www.gopherjs.org/) +- [Helm](https://helm.sh) +- [Hugo](https://gohugo.io) +- [Istio](https://istio.io) +- [Kool](https://github.com/kool-dev/kool) +- [Kubernetes](http://kubernetes.io/) +- [Linkerd](https://linkerd.io/) +- [Mattermost-server](https://github.com/mattermost/mattermost-server) +- [Metal Stack CLI](https://github.com/metal-stack/metalctl) +- [Moby (former Docker)](https://github.com/moby/moby) +- [Nanobox](https://github.com/nanobox-io/nanobox)/[Nanopack](https://github.com/nanopack) +- [OpenShift](https://www.openshift.com/) +- [Pouch](https://github.com/alibaba/pouch) +- [ProjectAtomic (enterprise)](http://www.projectatomic.io/) +- [Prototool](https://github.com/uber/prototool) +- [Random](https://github.com/erdaltsksn/random) +- [Rclone](https://rclone.org/) +- [Skaffold](https://skaffold.dev/) +- [Tendermint](https://github.com/tendermint/tendermint) +- [Werf](https://werf.io/) diff --git a/vendor/github.com/spf13/cobra/shell_completions.go b/vendor/github.com/spf13/cobra/shell_completions.go index ba0af9cb55..d99bf91e5f 100644 --- a/vendor/github.com/spf13/cobra/shell_completions.go +++ b/vendor/github.com/spf13/cobra/shell_completions.go @@ -4,82 +4,81 @@ import ( "github.com/spf13/pflag" ) -// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag if it exists, +// MarkFlagRequired instructs the various shell completion implementations to +// prioritize the named flag when performing completion, // and causes your command to report an error if invoked without the flag. func (c *Command) MarkFlagRequired(name string) error { return MarkFlagRequired(c.Flags(), name) } -// MarkPersistentFlagRequired adds the BashCompOneRequiredFlag annotation to the named persistent flag if it exists, +// MarkPersistentFlagRequired instructs the various shell completion implementations to +// prioritize the named persistent flag when performing completion, // and causes your command to report an error if invoked without the flag. func (c *Command) MarkPersistentFlagRequired(name string) error { return MarkFlagRequired(c.PersistentFlags(), name) } -// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag if it exists, +// MarkFlagRequired instructs the various shell completion implementations to +// prioritize the named flag when performing completion, // and causes your command to report an error if invoked without the flag. func MarkFlagRequired(flags *pflag.FlagSet, name string) error { return flags.SetAnnotation(name, BashCompOneRequiredFlag, []string{"true"}) } -// MarkFlagFilename adds the BashCompFilenameExt annotation to the named flag, if it exists. -// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided. +// MarkFlagFilename instructs the various shell completion implementations to +// limit completions for the named flag to the specified file extensions. func (c *Command) MarkFlagFilename(name string, extensions ...string) error { return MarkFlagFilename(c.Flags(), name, extensions...) } // MarkFlagCustom adds the BashCompCustom annotation to the named flag, if it exists. -// Generated bash autocompletion will call the bash function f for the flag. +// The bash completion script will call the bash function f for the flag. +// +// This will only work for bash completion. +// It is recommended to instead use c.RegisterFlagCompletionFunc(...) which allows +// to register a Go function which will work across all shells. func (c *Command) MarkFlagCustom(name string, f string) error { return MarkFlagCustom(c.Flags(), name, f) } // MarkPersistentFlagFilename instructs the various shell completion -// implementations to limit completions for this persistent flag to the -// specified extensions (patterns). -// -// Shell Completion compatibility matrix: bash, zsh +// implementations to limit completions for the named persistent flag to the +// specified file extensions. func (c *Command) MarkPersistentFlagFilename(name string, extensions ...string) error { return MarkFlagFilename(c.PersistentFlags(), name, extensions...) } // MarkFlagFilename instructs the various shell completion implementations to -// limit completions for this flag to the specified extensions (patterns). -// -// Shell Completion compatibility matrix: bash, zsh +// limit completions for the named flag to the specified file extensions. func MarkFlagFilename(flags *pflag.FlagSet, name string, extensions ...string) error { return flags.SetAnnotation(name, BashCompFilenameExt, extensions) } -// MarkFlagCustom instructs the various shell completion implementations to -// limit completions for this flag to the specified extensions (patterns). +// MarkFlagCustom adds the BashCompCustom annotation to the named flag, if it exists. +// The bash completion script will call the bash function f for the flag. // -// Shell Completion compatibility matrix: bash, zsh +// This will only work for bash completion. +// It is recommended to instead use c.RegisterFlagCompletionFunc(...) which allows +// to register a Go function which will work across all shells. func MarkFlagCustom(flags *pflag.FlagSet, name string, f string) error { return flags.SetAnnotation(name, BashCompCustom, []string{f}) } // MarkFlagDirname instructs the various shell completion implementations to -// complete only directories with this named flag. -// -// Shell Completion compatibility matrix: zsh +// limit completions for the named flag to directory names. func (c *Command) MarkFlagDirname(name string) error { return MarkFlagDirname(c.Flags(), name) } // MarkPersistentFlagDirname instructs the various shell completion -// implementations to complete only directories with this persistent named flag. -// -// Shell Completion compatibility matrix: zsh +// implementations to limit completions for the named persistent flag to +// directory names. func (c *Command) MarkPersistentFlagDirname(name string) error { return MarkFlagDirname(c.PersistentFlags(), name) } // MarkFlagDirname instructs the various shell completion implementations to -// complete only directories with this specified flag. -// -// Shell Completion compatibility matrix: zsh +// limit completions for the named flag to directory names. func MarkFlagDirname(flags *pflag.FlagSet, name string) error { - zshPattern := "-(/)" - return flags.SetAnnotation(name, zshCompDirname, []string{zshPattern}) + return flags.SetAnnotation(name, BashCompSubdirsInDir, []string{}) } diff --git a/vendor/github.com/spf13/cobra/shell_completions.md b/vendor/github.com/spf13/cobra/shell_completions.md new file mode 100644 index 0000000000..d8416ab1dc --- /dev/null +++ b/vendor/github.com/spf13/cobra/shell_completions.md @@ -0,0 +1,434 @@ +# Generating shell completions + +Cobra can generate shell completions for multiple shells. +The currently supported shells are: +- Bash +- Zsh +- Fish +- PowerShell + +If you are using the generator you can create a completion command by running + +```bash +cobra add completion +``` +and then modifying the generated `cmd/completion.go` file to look something like this +(writing the shell script to stdout allows the most flexible use): + +```go +var completionCmd = &cobra.Command{ + Use: "completion [bash|zsh|fish|powershell]", + Short: "Generate completion script", + Long: `To load completions: + +Bash: + +$ source <(yourprogram completion bash) + +# To load completions for each session, execute once: +Linux: + $ yourprogram completion bash > /etc/bash_completion.d/yourprogram +MacOS: + $ yourprogram completion bash > /usr/local/etc/bash_completion.d/yourprogram + +Zsh: + +# If shell completion is not already enabled in your environment you will need +# to enable it. You can execute the following once: + +$ echo "autoload -U compinit; compinit" >> ~/.zshrc + +# To load completions for each session, execute once: +$ yourprogram completion zsh > "${fpath[1]}/_yourprogram" + +# You will need to start a new shell for this setup to take effect. + +Fish: + +$ yourprogram completion fish | source + +# To load completions for each session, execute once: +$ yourprogram completion fish > ~/.config/fish/completions/yourprogram.fish +`, + DisableFlagsInUseLine: true, + ValidArgs: []string{"bash", "zsh", "fish", "powershell"}, + Args: cobra.ExactValidArgs(1), + Run: func(cmd *cobra.Command, args []string) { + switch args[0] { + case "bash": + cmd.Root().GenBashCompletion(os.Stdout) + case "zsh": + cmd.Root().GenZshCompletion(os.Stdout) + case "fish": + cmd.Root().GenFishCompletion(os.Stdout, true) + case "powershell": + cmd.Root().GenPowerShellCompletion(os.Stdout) + } + }, +} +``` + +**Note:** The cobra generator may include messages printed to stdout for example if the config file is loaded, this will break the auto complete script so must be removed. + +# Customizing completions + +The generated completion scripts will automatically handle completing commands and flags. However, you can make your completions much more powerful by providing information to complete your program's nouns and flag values. + +## Completion of nouns + +### Static completion of nouns + +Cobra allows you to provide a pre-defined list of completion choices for your nouns using the `ValidArgs` field. +For example, if you want `kubectl get [tab][tab]` to show a list of valid "nouns" you have to set them. +Some simplified code from `kubectl get` looks like: + +```go +validArgs []string = { "pod", "node", "service", "replicationcontroller" } + +cmd := &cobra.Command{ + Use: "get [(-o|--output=)json|yaml|template|...] (RESOURCE [NAME] | RESOURCE/NAME ...)", + Short: "Display one or many resources", + Long: get_long, + Example: get_example, + Run: func(cmd *cobra.Command, args []string) { + err := RunGet(f, out, cmd, args) + util.CheckErr(err) + }, + ValidArgs: validArgs, +} +``` + +Notice we put the `ValidArgs` field on the `get` sub-command. Doing so will give results like: + +```bash +$ kubectl get [tab][tab] +node pod replicationcontroller service +``` + +#### Aliases for nouns + +If your nouns have aliases, you can define them alongside `ValidArgs` using `ArgAliases`: + +```go +argAliases []string = { "pods", "nodes", "services", "svc", "replicationcontrollers", "rc" } + +cmd := &cobra.Command{ + ... + ValidArgs: validArgs, + ArgAliases: argAliases +} +``` + +The aliases are not shown to the user on tab completion, but they are accepted as valid nouns by +the completion algorithm if entered manually, e.g. in: + +```bash +$ kubectl get rc [tab][tab] +backend frontend database +``` + +Note that without declaring `rc` as an alias, the completion algorithm would not know to show the list of +replication controllers following `rc`. + +### Dynamic completion of nouns + +In some cases it is not possible to provide a list of completions in advance. Instead, the list of completions must be determined at execution-time. In a similar fashion as for static completions, you can use the `ValidArgsFunction` field to provide a Go function that Cobra will execute when it needs the list of completion choices for the nouns of a command. Note that either `ValidArgs` or `ValidArgsFunction` can be used for a single cobra command, but not both. +Simplified code from `helm status` looks like: + +```go +cmd := &cobra.Command{ + Use: "status RELEASE_NAME", + Short: "Display the status of the named release", + Long: status_long, + RunE: func(cmd *cobra.Command, args []string) { + RunGet(args[0]) + }, + ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + if len(args) != 0 { + return nil, cobra.ShellCompDirectiveNoFileComp + } + return getReleasesFromCluster(toComplete), cobra.ShellCompDirectiveNoFileComp + }, +} +``` +Where `getReleasesFromCluster()` is a Go function that obtains the list of current Helm releases running on the Kubernetes cluster. +Notice we put the `ValidArgsFunction` on the `status` sub-command. Let's assume the Helm releases on the cluster are: `harbor`, `notary`, `rook` and `thanos` then this dynamic completion will give results like: + +```bash +$ helm status [tab][tab] +harbor notary rook thanos +``` +You may have noticed the use of `cobra.ShellCompDirective`. These directives are bit fields allowing to control some shell completion behaviors for your particular completion. You can combine them with the bit-or operator such as `cobra.ShellCompDirectiveNoSpace | cobra.ShellCompDirectiveNoFileComp` +```go +// Indicates that the shell will perform its default behavior after completions +// have been provided (this implies none of the other directives). +ShellCompDirectiveDefault + +// Indicates an error occurred and completions should be ignored. +ShellCompDirectiveError + +// Indicates that the shell should not add a space after the completion, +// even if there is a single completion provided. +ShellCompDirectiveNoSpace + +// Indicates that the shell should not provide file completion even when +// no completion is provided. +ShellCompDirectiveNoFileComp + +// Indicates that the returned completions should be used as file extension filters. +// For example, to complete only files of the form *.json or *.yaml: +// return []string{"yaml", "json"}, ShellCompDirectiveFilterFileExt +// For flags, using MarkFlagFilename() and MarkPersistentFlagFilename() +// is a shortcut to using this directive explicitly. +// +ShellCompDirectiveFilterFileExt + +// Indicates that only directory names should be provided in file completion. +// For example: +// return nil, ShellCompDirectiveFilterDirs +// For flags, using MarkFlagDirname() is a shortcut to using this directive explicitly. +// +// To request directory names within another directory, the returned completions +// should specify a single directory name within which to search. For example, +// to complete directories within "themes/": +// return []string{"themes"}, ShellCompDirectiveFilterDirs +// +ShellCompDirectiveFilterDirs +``` + +***Note***: When using the `ValidArgsFunction`, Cobra will call your registered function after having parsed all flags and arguments provided in the command-line. You therefore don't need to do this parsing yourself. For example, when a user calls `helm status --namespace my-rook-ns [tab][tab]`, Cobra will call your registered `ValidArgsFunction` after having parsed the `--namespace` flag, as it would have done when calling the `RunE` function. + +#### Debugging + +Cobra achieves dynamic completion through the use of a hidden command called by the completion script. To debug your Go completion code, you can call this hidden command directly: +```bash +$ helm __complete status har +harbor +:4 +Completion ended with directive: ShellCompDirectiveNoFileComp # This is on stderr +``` +***Important:*** If the noun to complete is empty (when the user has not yet typed any letters of that noun), you must pass an empty parameter to the `__complete` command: +```bash +$ helm __complete status "" +harbor +notary +rook +thanos +:4 +Completion ended with directive: ShellCompDirectiveNoFileComp # This is on stderr +``` +Calling the `__complete` command directly allows you to run the Go debugger to troubleshoot your code. You can also add printouts to your code; Cobra provides the following functions to use for printouts in Go completion code: +```go +// Prints to the completion script debug file (if BASH_COMP_DEBUG_FILE +// is set to a file path) and optionally prints to stderr. +cobra.CompDebug(msg string, printToStdErr bool) { +cobra.CompDebugln(msg string, printToStdErr bool) + +// Prints to the completion script debug file (if BASH_COMP_DEBUG_FILE +// is set to a file path) and to stderr. +cobra.CompError(msg string) +cobra.CompErrorln(msg string) +``` +***Important:*** You should **not** leave traces that print directly to stdout in your completion code as they will be interpreted as completion choices by the completion script. Instead, use the cobra-provided debugging traces functions mentioned above. + +## Completions for flags + +### Mark flags as required + +Most of the time completions will only show sub-commands. But if a flag is required to make a sub-command work, you probably want it to show up when the user types [tab][tab]. You can mark a flag as 'Required' like so: + +```go +cmd.MarkFlagRequired("pod") +cmd.MarkFlagRequired("container") +``` + +and you'll get something like + +```bash +$ kubectl exec [tab][tab] +-c --container= -p --pod= +``` + +### Specify dynamic flag completion + +As for nouns, Cobra provides a way of defining dynamic completion of flags. To provide a Go function that Cobra will execute when it needs the list of completion choices for a flag, you must register the function using the `command.RegisterFlagCompletionFunc()` function. + +```go +flagName := "output" +cmd.RegisterFlagCompletionFunc(flagName, func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + return []string{"json", "table", "yaml"}, cobra.ShellCompDirectiveDefault +}) +``` +Notice that calling `RegisterFlagCompletionFunc()` is done through the `command` with which the flag is associated. In our example this dynamic completion will give results like so: + +```bash +$ helm status --output [tab][tab] +json table yaml +``` + +#### Debugging + +You can also easily debug your Go completion code for flags: +```bash +$ helm __complete status --output "" +json +table +yaml +:4 +Completion ended with directive: ShellCompDirectiveNoFileComp # This is on stderr +``` +***Important:*** You should **not** leave traces that print to stdout in your completion code as they will be interpreted as completion choices by the completion script. Instead, use the cobra-provided debugging traces functions mentioned further above. + +### Specify valid filename extensions for flags that take a filename + +To limit completions of flag values to file names with certain extensions you can either use the different `MarkFlagFilename()` functions or a combination of `RegisterFlagCompletionFunc()` and `ShellCompDirectiveFilterFileExt`, like so: +```go +flagName := "output" +cmd.MarkFlagFilename(flagName, "yaml", "json") +``` +or +```go +flagName := "output" +cmd.RegisterFlagCompletionFunc(flagName, func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + return []string{"yaml", "json"}, ShellCompDirectiveFilterFileExt}) +``` + +### Limit flag completions to directory names + +To limit completions of flag values to directory names you can either use the `MarkFlagDirname()` functions or a combination of `RegisterFlagCompletionFunc()` and `ShellCompDirectiveFilterDirs`, like so: +```go +flagName := "output" +cmd.MarkFlagDirname(flagName) +``` +or +```go +flagName := "output" +cmd.RegisterFlagCompletionFunc(flagName, func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + return nil, cobra.ShellCompDirectiveFilterDirs +}) +``` +To limit completions of flag values to directory names *within another directory* you can use a combination of `RegisterFlagCompletionFunc()` and `ShellCompDirectiveFilterDirs` like so: +```go +flagName := "output" +cmd.RegisterFlagCompletionFunc(flagName, func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + return []string{"themes"}, cobra.ShellCompDirectiveFilterDirs +}) +``` +### Descriptions for completions + +Both `zsh` and `fish` allow for descriptions to annotate completion choices. For commands and flags, Cobra will provide the descriptions automatically, based on usage information. For example, using zsh: +``` +$ helm s[tab] +search -- search for a keyword in charts +show -- show information of a chart +status -- displays the status of the named release +``` +while using fish: +``` +$ helm s[tab] +search (search for a keyword in charts) show (show information of a chart) status (displays the status of the named release) +``` + +Cobra allows you to add annotations to your own completions. Simply add the annotation text after each completion, following a `\t` separator. This technique applies to completions returned by `ValidArgs`, `ValidArgsFunction` and `RegisterFlagCompletionFunc()`. For example: +```go +ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + return []string{"harbor\tAn image registry", "thanos\tLong-term metrics"}, cobra.ShellCompDirectiveNoFileComp +}} +``` +or +```go +ValidArgs: []string{"bash\tCompletions for bash", "zsh\tCompletions for zsh"} +``` +## Bash completions + +### Dependencies + +The bash completion script generated by Cobra requires the `bash_completion` package. You should update the help text of your completion command to show how to install the `bash_completion` package ([Kubectl docs](https://kubernetes.io/docs/tasks/tools/install-kubectl/#enabling-shell-autocompletion)) + +### Aliases + +You can also configure `bash` aliases for your program and they will also support completions. + +```bash +alias aliasname=origcommand +complete -o default -F __start_origcommand aliasname + +# and now when you run `aliasname` completion will make +# suggestions as it did for `origcommand`. + +$ aliasname +completion firstcommand secondcommand +``` +### Bash legacy dynamic completions + +For backwards-compatibility, Cobra still supports its bash legacy dynamic completion solution. +Please refer to [Bash Completions](bash_completions.md) for details. + +## Zsh completions + +Cobra supports native Zsh completion generated from the root `cobra.Command`. +The generated completion script should be put somewhere in your `$fpath` and be named +`_`. You will need to start a new shell for the completions to become available. + +Zsh supports descriptions for completions. Cobra will provide the description automatically, +based on usage information. Cobra provides a way to completely disable such descriptions by +using `GenZshCompletionNoDesc()` or `GenZshCompletionFileNoDesc()`. You can choose to make +this a configurable option to your users. +``` +# With descriptions +$ helm s[tab] +search -- search for a keyword in charts +show -- show information of a chart +status -- displays the status of the named release + +# Without descriptions +$ helm s[tab] +search show status +``` +*Note*: Because of backwards-compatibility requirements, we were forced to have a different API to disable completion descriptions between `Zsh` and `Fish`. + +### Limitations + +* Custom completions implemented in Bash scripting (legacy) are not supported and will be ignored for `zsh` (including the use of the `BashCompCustom` flag annotation). + * You should instead use `ValidArgsFunction` and `RegisterFlagCompletionFunc()` which are portable to the different shells (`bash`, `zsh`, `fish`). +* The function `MarkFlagCustom()` is not supported and will be ignored for `zsh`. + * You should instead use `RegisterFlagCompletionFunc()`. + +### Zsh completions standardization + +Cobra 1.1 standardized its zsh completion support to align it with its other shell completions. Although the API was kept backwards-compatible, some small changes in behavior were introduced. +Please refer to [Zsh Completions](zsh_completions.md) for details. + +## Fish completions + +Cobra supports native Fish completions generated from the root `cobra.Command`. You can use the `command.GenFishCompletion()` or `command.GenFishCompletionFile()` functions. You must provide these functions with a parameter indicating if the completions should be annotated with a description; Cobra will provide the description automatically based on usage information. You can choose to make this option configurable by your users. +``` +# With descriptions +$ helm s[tab] +search (search for a keyword in charts) show (show information of a chart) status (displays the status of the named release) + +# Without descriptions +$ helm s[tab] +search show status +``` +*Note*: Because of backwards-compatibility requirements, we were forced to have a different API to disable completion descriptions between `Zsh` and `Fish`. + +### Limitations + +* Custom completions implemented in Bash scripting (legacy) are not supported and will be ignored for `fish` (including the use of the `BashCompCustom` flag annotation). + * You should instead use `ValidArgsFunction` and `RegisterFlagCompletionFunc()` which are portable to the different shells (`bash`, `zsh`, `fish`). +* The function `MarkFlagCustom()` is not supported and will be ignored for `fish`. + * You should instead use `RegisterFlagCompletionFunc()`. +* The following flag completion annotations are not supported and will be ignored for `fish`: + * `BashCompFilenameExt` (filtering by file extension) + * `BashCompSubdirsInDir` (filtering by directory) +* The functions corresponding to the above annotations are consequently not supported and will be ignored for `fish`: + * `MarkFlagFilename()` and `MarkPersistentFlagFilename()` (filtering by file extension) + * `MarkFlagDirname()` and `MarkPersistentFlagDirname()` (filtering by directory) +* Similarly, the following completion directives are not supported and will be ignored for `fish`: + * `ShellCompDirectiveFilterFileExt` (filtering by file extension) + * `ShellCompDirectiveFilterDirs` (filtering by directory) + +## PowerShell completions + +Please refer to [PowerShell Completions](powershell_completions.md) for details. diff --git a/vendor/github.com/spf13/cobra/zsh_completions.go b/vendor/github.com/spf13/cobra/zsh_completions.go index 12755482f0..92a70394a9 100644 --- a/vendor/github.com/spf13/cobra/zsh_completions.go +++ b/vendor/github.com/spf13/cobra/zsh_completions.go @@ -1,336 +1,240 @@ package cobra import ( - "encoding/json" + "bytes" "fmt" "io" "os" - "sort" - "strings" - "text/template" - - "github.com/spf13/pflag" -) - -const ( - zshCompArgumentAnnotation = "cobra_annotations_zsh_completion_argument_annotation" - zshCompArgumentFilenameComp = "cobra_annotations_zsh_completion_argument_file_completion" - zshCompArgumentWordComp = "cobra_annotations_zsh_completion_argument_word_completion" - zshCompDirname = "cobra_annotations_zsh_dirname" ) -var ( - zshCompFuncMap = template.FuncMap{ - "genZshFuncName": zshCompGenFuncName, - "extractFlags": zshCompExtractFlag, - "genFlagEntryForZshArguments": zshCompGenFlagEntryForArguments, - "extractArgsCompletions": zshCompExtractArgumentCompletionHintsForRendering, - } - zshCompletionText = ` -{{/* should accept Command (that contains subcommands) as parameter */}} -{{define "argumentsC" -}} -{{ $cmdPath := genZshFuncName .}} -function {{$cmdPath}} { - local -a commands - - _arguments -C \{{- range extractFlags .}} - {{genFlagEntryForZshArguments .}} \{{- end}} - "1: :->cmnds" \ - "*::arg:->args" - - case $state in - cmnds) - commands=({{range .Commands}}{{if not .Hidden}} - "{{.Name}}:{{.Short}}"{{end}}{{end}} - ) - _describe "command" commands - ;; - esac - - case "$words[1]" in {{- range .Commands}}{{if not .Hidden}} - {{.Name}}) - {{$cmdPath}}_{{.Name}} - ;;{{end}}{{end}} - esac -} -{{range .Commands}}{{if not .Hidden}} -{{template "selectCmdTemplate" .}} -{{- end}}{{end}} -{{- end}} - -{{/* should accept Command without subcommands as parameter */}} -{{define "arguments" -}} -function {{genZshFuncName .}} { -{{" _arguments"}}{{range extractFlags .}} \ - {{genFlagEntryForZshArguments . -}} -{{end}}{{range extractArgsCompletions .}} \ - {{.}}{{end}} -} -{{end}} - -{{/* dispatcher for commands with or without subcommands */}} -{{define "selectCmdTemplate" -}} -{{if .Hidden}}{{/* ignore hidden*/}}{{else -}} -{{if .Commands}}{{template "argumentsC" .}}{{else}}{{template "arguments" .}}{{end}} -{{- end}} -{{- end}} - -{{/* template entry point */}} -{{define "Main" -}} -#compdef _{{.Name}} {{.Name}} - -{{template "selectCmdTemplate" .}} -{{end}} -` -) - -// zshCompArgsAnnotation is used to encode/decode zsh completion for -// arguments to/from Command.Annotations. -type zshCompArgsAnnotation map[int]zshCompArgHint - -type zshCompArgHint struct { - // Indicates the type of the completion to use. One of: - // zshCompArgumentFilenameComp or zshCompArgumentWordComp - Tipe string `json:"type"` - - // A value for the type above (globs for file completion or words) - Options []string `json:"options"` -} - -// GenZshCompletionFile generates zsh completion file. +// GenZshCompletionFile generates zsh completion file including descriptions. func (c *Command) GenZshCompletionFile(filename string) error { - outFile, err := os.Create(filename) - if err != nil { - return err - } - defer outFile.Close() - - return c.GenZshCompletion(outFile) + return c.genZshCompletionFile(filename, true) } -// GenZshCompletion generates a zsh completion file and writes to the passed -// writer. The completion always run on the root command regardless of the -// command it was called from. +// GenZshCompletion generates zsh completion file including descriptions +// and writes it to the passed writer. func (c *Command) GenZshCompletion(w io.Writer) error { - tmpl, err := template.New("Main").Funcs(zshCompFuncMap).Parse(zshCompletionText) - if err != nil { - return fmt.Errorf("error creating zsh completion template: %v", err) - } - return tmpl.Execute(w, c.Root()) -} - -// MarkZshCompPositionalArgumentFile marks the specified argument (first -// argument is 1) as completed by file selection. patterns (e.g. "*.txt") are -// optional - if not provided the completion will search for all files. -func (c *Command) MarkZshCompPositionalArgumentFile(argPosition int, patterns ...string) error { - if argPosition < 1 { - return fmt.Errorf("Invalid argument position (%d)", argPosition) - } - annotation, err := c.zshCompGetArgsAnnotations() - if err != nil { - return err - } - if c.zshcompArgsAnnotationnIsDuplicatePosition(annotation, argPosition) { - return fmt.Errorf("Duplicate annotation for positional argument at index %d", argPosition) - } - annotation[argPosition] = zshCompArgHint{ - Tipe: zshCompArgumentFilenameComp, - Options: patterns, - } - return c.zshCompSetArgsAnnotations(annotation) -} - -// MarkZshCompPositionalArgumentWords marks the specified positional argument -// (first argument is 1) as completed by the provided words. At east one word -// must be provided, spaces within words will be offered completion with -// "word\ word". -func (c *Command) MarkZshCompPositionalArgumentWords(argPosition int, words ...string) error { - if argPosition < 1 { - return fmt.Errorf("Invalid argument position (%d)", argPosition) - } - if len(words) == 0 { - return fmt.Errorf("Trying to set empty word list for positional argument %d", argPosition) - } - annotation, err := c.zshCompGetArgsAnnotations() - if err != nil { - return err - } - if c.zshcompArgsAnnotationnIsDuplicatePosition(annotation, argPosition) { - return fmt.Errorf("Duplicate annotation for positional argument at index %d", argPosition) - } - annotation[argPosition] = zshCompArgHint{ - Tipe: zshCompArgumentWordComp, - Options: words, - } - return c.zshCompSetArgsAnnotations(annotation) -} - -func zshCompExtractArgumentCompletionHintsForRendering(c *Command) ([]string, error) { - var result []string - annotation, err := c.zshCompGetArgsAnnotations() - if err != nil { - return nil, err - } - for k, v := range annotation { - s, err := zshCompRenderZshCompArgHint(k, v) - if err != nil { - return nil, err - } - result = append(result, s) - } - if len(c.ValidArgs) > 0 { - if _, positionOneExists := annotation[1]; !positionOneExists { - s, err := zshCompRenderZshCompArgHint(1, zshCompArgHint{ - Tipe: zshCompArgumentWordComp, - Options: c.ValidArgs, - }) - if err != nil { - return nil, err - } - result = append(result, s) - } - } - sort.Strings(result) - return result, nil + return c.genZshCompletion(w, true) } -func zshCompRenderZshCompArgHint(i int, z zshCompArgHint) (string, error) { - switch t := z.Tipe; t { - case zshCompArgumentFilenameComp: - var globs []string - for _, g := range z.Options { - globs = append(globs, fmt.Sprintf(`-g "%s"`, g)) - } - return fmt.Sprintf(`'%d: :_files %s'`, i, strings.Join(globs, " ")), nil - case zshCompArgumentWordComp: - var words []string - for _, w := range z.Options { - words = append(words, fmt.Sprintf("%q", w)) - } - return fmt.Sprintf(`'%d: :(%s)'`, i, strings.Join(words, " ")), nil - default: - return "", fmt.Errorf("Invalid zsh argument completion annotation: %s", t) - } +// GenZshCompletionFileNoDesc generates zsh completion file without descriptions. +func (c *Command) GenZshCompletionFileNoDesc(filename string) error { + return c.genZshCompletionFile(filename, false) } -func (c *Command) zshcompArgsAnnotationnIsDuplicatePosition(annotation zshCompArgsAnnotation, position int) bool { - _, dup := annotation[position] - return dup +// GenZshCompletionNoDesc generates zsh completion file without descriptions +// and writes it to the passed writer. +func (c *Command) GenZshCompletionNoDesc(w io.Writer) error { + return c.genZshCompletion(w, false) } -func (c *Command) zshCompGetArgsAnnotations() (zshCompArgsAnnotation, error) { - annotation := make(zshCompArgsAnnotation) - annotationString, ok := c.Annotations[zshCompArgumentAnnotation] - if !ok { - return annotation, nil - } - err := json.Unmarshal([]byte(annotationString), &annotation) - if err != nil { - return annotation, fmt.Errorf("Error unmarshaling zsh argument annotation: %v", err) - } - return annotation, nil -} - -func (c *Command) zshCompSetArgsAnnotations(annotation zshCompArgsAnnotation) error { - jsn, err := json.Marshal(annotation) - if err != nil { - return fmt.Errorf("Error marshaling zsh argument annotation: %v", err) - } - if c.Annotations == nil { - c.Annotations = make(map[string]string) - } - c.Annotations[zshCompArgumentAnnotation] = string(jsn) +// MarkZshCompPositionalArgumentFile only worked for zsh and its behavior was +// not consistent with Bash completion. It has therefore been disabled. +// Instead, when no other completion is specified, file completion is done by +// default for every argument. One can disable file completion on a per-argument +// basis by using ValidArgsFunction and ShellCompDirectiveNoFileComp. +// To achieve file extension filtering, one can use ValidArgsFunction and +// ShellCompDirectiveFilterFileExt. +// +// Deprecated +func (c *Command) MarkZshCompPositionalArgumentFile(argPosition int, patterns ...string) error { return nil } -func zshCompGenFuncName(c *Command) string { - if c.HasParent() { - return zshCompGenFuncName(c.Parent()) + "_" + c.Name() - } - return "_" + c.Name() -} - -func zshCompExtractFlag(c *Command) []*pflag.Flag { - var flags []*pflag.Flag - c.LocalFlags().VisitAll(func(f *pflag.Flag) { - if !f.Hidden { - flags = append(flags, f) - } - }) - c.InheritedFlags().VisitAll(func(f *pflag.Flag) { - if !f.Hidden { - flags = append(flags, f) - } - }) - return flags -} - -// zshCompGenFlagEntryForArguments returns an entry that matches _arguments -// zsh-completion parameters. It's too complicated to generate in a template. -func zshCompGenFlagEntryForArguments(f *pflag.Flag) string { - if f.Name == "" || f.Shorthand == "" { - return zshCompGenFlagEntryForSingleOptionFlag(f) - } - return zshCompGenFlagEntryForMultiOptionFlag(f) -} - -func zshCompGenFlagEntryForSingleOptionFlag(f *pflag.Flag) string { - var option, multiMark, extras string - - if zshCompFlagCouldBeSpecifiedMoreThenOnce(f) { - multiMark = "*" - } - - option = "--" + f.Name - if option == "--" { - option = "-" + f.Shorthand - } - extras = zshCompGenFlagEntryExtras(f) - - return fmt.Sprintf(`'%s%s[%s]%s'`, multiMark, option, zshCompQuoteFlagDescription(f.Usage), extras) -} - -func zshCompGenFlagEntryForMultiOptionFlag(f *pflag.Flag) string { - var options, parenMultiMark, curlyMultiMark, extras string - - if zshCompFlagCouldBeSpecifiedMoreThenOnce(f) { - parenMultiMark = "*" - curlyMultiMark = "\\*" - } - - options = fmt.Sprintf(`'(%s-%s %s--%s)'{%s-%s,%s--%s}`, - parenMultiMark, f.Shorthand, parenMultiMark, f.Name, curlyMultiMark, f.Shorthand, curlyMultiMark, f.Name) - extras = zshCompGenFlagEntryExtras(f) - - return fmt.Sprintf(`%s'[%s]%s'`, options, zshCompQuoteFlagDescription(f.Usage), extras) +// MarkZshCompPositionalArgumentWords only worked for zsh. It has therefore +// been disabled. +// To achieve the same behavior across all shells, one can use +// ValidArgs (for the first argument only) or ValidArgsFunction for +// any argument (can include the first one also). +// +// Deprecated +func (c *Command) MarkZshCompPositionalArgumentWords(argPosition int, words ...string) error { + return nil } -func zshCompGenFlagEntryExtras(f *pflag.Flag) string { - if f.NoOptDefVal != "" { - return "" - } - - extras := ":" // allow options for flag (even without assistance) - for key, values := range f.Annotations { - switch key { - case zshCompDirname: - extras = fmt.Sprintf(":filename:_files -g %q", values[0]) - case BashCompFilenameExt: - extras = ":filename:_files" - for _, pattern := range values { - extras = extras + fmt.Sprintf(` -g "%s"`, pattern) - } - } +func (c *Command) genZshCompletionFile(filename string, includeDesc bool) error { + outFile, err := os.Create(filename) + if err != nil { + return err } + defer outFile.Close() - return extras -} - -func zshCompFlagCouldBeSpecifiedMoreThenOnce(f *pflag.Flag) bool { - return strings.Contains(f.Value.Type(), "Slice") || - strings.Contains(f.Value.Type(), "Array") -} - -func zshCompQuoteFlagDescription(s string) string { - return strings.Replace(s, "'", `'\''`, -1) + return c.genZshCompletion(outFile, includeDesc) +} + +func (c *Command) genZshCompletion(w io.Writer, includeDesc bool) error { + buf := new(bytes.Buffer) + genZshComp(buf, c.Name(), includeDesc) + _, err := buf.WriteTo(w) + return err +} + +func genZshComp(buf *bytes.Buffer, name string, includeDesc bool) { + compCmd := ShellCompRequestCmd + if !includeDesc { + compCmd = ShellCompNoDescRequestCmd + } + buf.WriteString(fmt.Sprintf(`#compdef _%[1]s %[1]s + +# zsh completion for %-36[1]s -*- shell-script -*- + +__%[1]s_debug() +{ + local file="$BASH_COMP_DEBUG_FILE" + if [[ -n ${file} ]]; then + echo "$*" >> "${file}" + fi +} + +_%[1]s() +{ + local shellCompDirectiveError=%[3]d + local shellCompDirectiveNoSpace=%[4]d + local shellCompDirectiveNoFileComp=%[5]d + local shellCompDirectiveFilterFileExt=%[6]d + local shellCompDirectiveFilterDirs=%[7]d + + local lastParam lastChar flagPrefix requestComp out directive compCount comp lastComp + local -a completions + + __%[1]s_debug "\n========= starting completion logic ==========" + __%[1]s_debug "CURRENT: ${CURRENT}, words[*]: ${words[*]}" + + # The user could have moved the cursor backwards on the command-line. + # We need to trigger completion from the $CURRENT location, so we need + # to truncate the command-line ($words) up to the $CURRENT location. + # (We cannot use $CURSOR as its value does not work when a command is an alias.) + words=("${=words[1,CURRENT]}") + __%[1]s_debug "Truncated words[*]: ${words[*]}," + + lastParam=${words[-1]} + lastChar=${lastParam[-1]} + __%[1]s_debug "lastParam: ${lastParam}, lastChar: ${lastChar}" + + # For zsh, when completing a flag with an = (e.g., %[1]s -n=) + # completions must be prefixed with the flag + setopt local_options BASH_REMATCH + if [[ "${lastParam}" =~ '-.*=' ]]; then + # We are dealing with a flag with an = + flagPrefix="-P ${BASH_REMATCH}" + fi + + # Prepare the command to obtain completions + requestComp="${words[1]} %[2]s ${words[2,-1]}" + if [ "${lastChar}" = "" ]; then + # If the last parameter is complete (there is a space following it) + # We add an extra empty parameter so we can indicate this to the go completion code. + __%[1]s_debug "Adding extra empty parameter" + requestComp="${requestComp} \"\"" + fi + + __%[1]s_debug "About to call: eval ${requestComp}" + + # Use eval to handle any environment variables and such + out=$(eval ${requestComp} 2>/dev/null) + __%[1]s_debug "completion output: ${out}" + + # Extract the directive integer following a : from the last line + local lastLine + while IFS='\n' read -r line; do + lastLine=${line} + done < <(printf "%%s\n" "${out[@]}") + __%[1]s_debug "last line: ${lastLine}" + + if [ "${lastLine[1]}" = : ]; then + directive=${lastLine[2,-1]} + # Remove the directive including the : and the newline + local suffix + (( suffix=${#lastLine}+2)) + out=${out[1,-$suffix]} + else + # There is no directive specified. Leave $out as is. + __%[1]s_debug "No directive found. Setting do default" + directive=0 + fi + + __%[1]s_debug "directive: ${directive}" + __%[1]s_debug "completions: ${out}" + __%[1]s_debug "flagPrefix: ${flagPrefix}" + + if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then + __%[1]s_debug "Completion received error. Ignoring completions." + return + fi + + compCount=0 + while IFS='\n' read -r comp; do + if [ -n "$comp" ]; then + # If requested, completions are returned with a description. + # The description is preceded by a TAB character. + # For zsh's _describe, we need to use a : instead of a TAB. + # We first need to escape any : as part of the completion itself. + comp=${comp//:/\\:} + + local tab=$(printf '\t') + comp=${comp//$tab/:} + + ((compCount++)) + __%[1]s_debug "Adding completion: ${comp}" + completions+=${comp} + lastComp=$comp + fi + done < <(printf "%%s\n" "${out[@]}") + + if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then + # File extension filtering + local filteringCmd + filteringCmd='_files' + for filter in ${completions[@]}; do + if [ ${filter[1]} != '*' ]; then + # zsh requires a glob pattern to do file filtering + filter="\*.$filter" + fi + filteringCmd+=" -g $filter" + done + filteringCmd+=" ${flagPrefix}" + + __%[1]s_debug "File filtering command: $filteringCmd" + _arguments '*:filename:'"$filteringCmd" + elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then + # File completion for directories only + local subDir + subdir="${completions[1]}" + if [ -n "$subdir" ]; then + __%[1]s_debug "Listing directories in $subdir" + pushd "${subdir}" >/dev/null 2>&1 + else + __%[1]s_debug "Listing directories in ." + fi + + _arguments '*:dirname:_files -/'" ${flagPrefix}" + if [ -n "$subdir" ]; then + popd >/dev/null 2>&1 + fi + elif [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ] && [ ${compCount} -eq 1 ]; then + __%[1]s_debug "Activating nospace." + # We can use compadd here as there is no description when + # there is only one completion. + compadd -S '' "${lastComp}" + elif [ ${compCount} -eq 0 ]; then + if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then + __%[1]s_debug "deactivating file completion" + else + # Perform file completion + __%[1]s_debug "activating file completion" + _arguments '*:filename:_files'" ${flagPrefix}" + fi + else + _describe "completions" completions $(echo $flagPrefix) + fi +} + +# don't run the completion function when being source-ed or eval-ed +if [ "$funcstack[1]" = "_%[1]s" ]; then + _%[1]s +fi +`, name, compCmd, + ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp, + ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs)) } diff --git a/vendor/github.com/spf13/cobra/zsh_completions.md b/vendor/github.com/spf13/cobra/zsh_completions.md index df9c2eac93..7cff61787f 100644 --- a/vendor/github.com/spf13/cobra/zsh_completions.md +++ b/vendor/github.com/spf13/cobra/zsh_completions.md @@ -1,39 +1,48 @@ -## Generating Zsh Completion for your cobra.Command - -Cobra supports native Zsh completion generated from the root `cobra.Command`. -The generated completion script should be put somewhere in your `$fpath` named -`_`. - -### What's Supported - -* Completion for all non-hidden subcommands using their `.Short` description. -* Completion for all non-hidden flags using the following rules: - * Filename completion works by marking the flag with `cmd.MarkFlagFilename...` - family of commands. - * The requirement for argument to the flag is decided by the `.NoOptDefVal` - flag value - if it's empty then completion will expect an argument. - * Flags of one of the various `*Array` and `*Slice` types supports multiple - specifications (with or without argument depending on the specific type). -* Completion of positional arguments using the following rules: - * Argument position for all options below starts at `1`. If argument position - `0` is requested it will raise an error. - * Use `command.MarkZshCompPositionalArgumentFile` to complete filenames. Glob - patterns (e.g. `"*.log"`) are optional - if not specified it will offer to - complete all file types. - * Use `command.MarkZshCompPositionalArgumentWords` to offer specific words for - completion. At least one word is required. - * It's possible to specify completion for some arguments and leave some - unspecified (e.g. offer words for second argument but nothing for first - argument). This will cause no completion for first argument but words - completion for second argument. - * If no argument completion was specified for 1st argument (but optionally was - specified for 2nd) and the command has `ValidArgs` it will be used as - completion options for 1st argument. - * Argument completions only offered for commands with no subcommands. - -### What's not yet Supported - -* Custom completion scripts are not supported yet (We should probably create zsh - specific one, doesn't make sense to re-use the bash one as the functions will - be different). -* Whatever other feature you're looking for and doesn't exist :) +## Generating Zsh Completion For Your cobra.Command + +Please refer to [Shell Completions](shell_completions.md) for details. + +## Zsh completions standardization + +Cobra 1.1 standardized its zsh completion support to align it with its other shell completions. Although the API was kept backwards-compatible, some small changes in behavior were introduced. + +### Deprecation summary + +See further below for more details on these deprecations. + +* `cmd.MarkZshCompPositionalArgumentFile(pos, []string{})` is no longer needed. It is therefore **deprecated** and silently ignored. +* `cmd.MarkZshCompPositionalArgumentFile(pos, glob[])` is **deprecated** and silently ignored. + * Instead use `ValidArgsFunction` with `ShellCompDirectiveFilterFileExt`. +* `cmd.MarkZshCompPositionalArgumentWords()` is **deprecated** and silently ignored. + * Instead use `ValidArgsFunction`. + +### Behavioral changes + +**Noun completion** +|Old behavior|New behavior| +|---|---| +|No file completion by default (opposite of bash)|File completion by default; use `ValidArgsFunction` with `ShellCompDirectiveNoFileComp` to turn off file completion on a per-argument basis| +|Completion of flag names without the `-` prefix having been typed|Flag names are only completed if the user has typed the first `-`| +`cmd.MarkZshCompPositionalArgumentFile(pos, []string{})` used to turn on file completion on a per-argument position basis|File completion for all arguments by default; `cmd.MarkZshCompPositionalArgumentFile()` is **deprecated** and silently ignored| +|`cmd.MarkZshCompPositionalArgumentFile(pos, glob[])` used to turn on file completion **with glob filtering** on a per-argument position basis (zsh-specific)|`cmd.MarkZshCompPositionalArgumentFile()` is **deprecated** and silently ignored; use `ValidArgsFunction` with `ShellCompDirectiveFilterFileExt` for file **extension** filtering (not full glob filtering)| +|`cmd.MarkZshCompPositionalArgumentWords(pos, words[])` used to provide completion choices on a per-argument position basis (zsh-specific)|`cmd.MarkZshCompPositionalArgumentWords()` is **deprecated** and silently ignored; use `ValidArgsFunction` to achieve the same behavior| + +**Flag-value completion** + +|Old behavior|New behavior| +|---|---| +|No file completion by default (opposite of bash)|File completion by default; use `RegisterFlagCompletionFunc()` with `ShellCompDirectiveNoFileComp` to turn off file completion| +|`cmd.MarkFlagFilename(flag, []string{})` and similar used to turn on file completion|File completion by default; `cmd.MarkFlagFilename(flag, []string{})` no longer needed in this context and silently ignored| +|`cmd.MarkFlagFilename(flag, glob[])` used to turn on file completion **with glob filtering** (syntax of `[]string{"*.yaml", "*.yml"}` incompatible with bash)|Will continue to work, however, support for bash syntax is added and should be used instead so as to work for all shells (`[]string{"yaml", "yml"}`)| +|`cmd.MarkFlagDirname(flag)` only completes directories (zsh-specific)|Has been added for all shells| +|Completion of a flag name does not repeat, unless flag is of type `*Array` or `*Slice` (not supported by bash)|Retained for `zsh` and added to `fish`| +|Completion of a flag name does not provide the `=` form (unlike bash)|Retained for `zsh` and added to `fish`| + +**Improvements** + +* Custom completion support (`ValidArgsFunction` and `RegisterFlagCompletionFunc()`) +* File completion by default if no other completions found +* Handling of required flags +* File extension filtering no longer mutually exclusive with bash usage +* Completion of directory names *within* another directory +* Support for `=` form of flags diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bson.go b/vendor/go.mongodb.org/mongo-driver/bson/bson.go deleted file mode 100644 index 37bf9811f3..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bson.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 -// -// Based on gopkg.in/mgo.v2/bson by Gustavo Niemeyer -// See THIRD-PARTY-NOTICES for original license terms. - -// +build go1.9 - -package bson // import "go.mongodb.org/mongo-driver/bson" - -import ( - "go.mongodb.org/mongo-driver/bson/primitive" -) - -// Zeroer allows custom struct types to implement a report of zero -// state. All struct types that don't implement Zeroer or where IsZero -// returns false are considered to be not zero. -type Zeroer interface { - IsZero() bool -} - -// D represents a BSON Document. This type can be used to represent BSON in a concise and readable -// manner. It should generally be used when serializing to BSON. For deserializing, the Raw or -// Document types should be used. -// -// Example usage: -// -// bson.D{{"foo", "bar"}, {"hello", "world"}, {"pi", 3.14159}} -// -// This type should be used in situations where order matters, such as MongoDB commands. If the -// order is not important, a map is more comfortable and concise. -type D = primitive.D - -// E represents a BSON element for a D. It is usually used inside a D. -type E = primitive.E - -// M is an unordered, concise representation of a BSON Document. It should generally be used to -// serialize BSON when the order of the elements of a BSON document do not matter. If the element -// order matters, use a D instead. -// -// Example usage: -// -// bson.M{"foo": "bar", "hello": "world", "pi": 3.14159} -// -// This type is handled in the encoders as a regular map[string]interface{}. The elements will be -// serialized in an undefined, random order, and the order will be different each time. -type M = primitive.M - -// An A represents a BSON array. This type can be used to represent a BSON array in a concise and -// readable manner. It should generally be used when serializing to BSON. For deserializing, the -// RawArray or Array types should be used. -// -// Example usage: -// -// bson.A{"bar", "world", 3.14159, bson.D{{"qux", 12345}}} -// -type A = primitive.A diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bson_1_8.go b/vendor/go.mongodb.org/mongo-driver/bson/bson_1_8.go deleted file mode 100644 index caf5f50a71..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bson_1_8.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 - -// +build !go1.9 - -package bson // import "go.mongodb.org/mongo-driver/bson" - -import ( - "math" - "strconv" - "strings" -) - -// Zeroer allows custom struct types to implement a report of zero -// state. All struct types that don't implement Zeroer or where IsZero -// returns false are considered to be not zero. -type Zeroer interface { - IsZero() bool -} - -// D represents a BSON Document. This type can be used to represent BSON in a concise and readable -// manner. It should generally be used when serializing to BSON. For deserializing, the Raw or -// Document types should be used. -// -// Example usage: -// -// primitive.D{{"foo", "bar"}, {"hello", "world"}, {"pi", 3.14159}} -// -// This type should be used in situations where order matters, such as MongoDB commands. If the -// order is not important, a map is more comfortable and concise. -type D []E - -// Map creates a map from the elements of the D. -func (d D) Map() M { - m := make(M, len(d)) - for _, e := range d { - m[e.Key] = e.Value - } - return m -} - -// E represents a BSON element for a D. It is usually used inside a D. -type E struct { - Key string - Value interface{} -} - -// M is an unordered, concise representation of a BSON Document. It should generally be used to -// serialize BSON when the order of the elements of a BSON document do not matter. If the element -// order matters, use a D instead. -// -// Example usage: -// -// primitive.M{"foo": "bar", "hello": "world", "pi": 3.14159} -// -// This type is handled in the encoders as a regular map[string]interface{}. The elements will be -// serialized in an undefined, random order, and the order will be different each time. -type M map[string]interface{} - -// An A represents a BSON array. This type can be used to represent a BSON array in a concise and -// readable manner. It should generally be used when serializing to BSON. For deserializing, the -// RawArray or Array types should be used. -// -// Example usage: -// -// primitive.A{"bar", "world", 3.14159, primitive.D{{"qux", 12345}}} -// -type A []interface{} - -func formatDouble(f float64) string { - var s string - if math.IsInf(f, 1) { - s = "Infinity" - } else if math.IsInf(f, -1) { - s = "-Infinity" - } else if math.IsNaN(f) { - s = "NaN" - } else { - // Print exactly one decimalType place for integers; otherwise, print as many are necessary to - // perfectly represent it. - s = strconv.FormatFloat(f, 'G', -1, 64) - if !strings.ContainsRune(s, '.') { - s += ".0" - } - } - - return s -} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/bsoncodec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/bsoncodec.go deleted file mode 100644 index 0ebc9a1564..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/bsoncodec.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 - -package bsoncodec // import "go.mongodb.org/mongo-driver/bson/bsoncodec" - -import ( - "fmt" - "reflect" - "strings" - - "go.mongodb.org/mongo-driver/bson/bsonrw" - "go.mongodb.org/mongo-driver/bson/bsontype" -) - -// Marshaler is an interface implemented by types that can marshal themselves -// into a BSON document represented as bytes. The bytes returned must be a valid -// BSON document if the error is nil. -type Marshaler interface { - MarshalBSON() ([]byte, error) -} - -// ValueMarshaler is an interface implemented by types that can marshal -// themselves into a BSON value as bytes. The type must be the valid type for -// the bytes returned. The bytes and byte type together must be valid if the -// error is nil. -type ValueMarshaler interface { - MarshalBSONValue() (bsontype.Type, []byte, error) -} - -// Unmarshaler is an interface implemented by types that can unmarshal a BSON -// document representation of themselves. The BSON bytes can be assumed to be -// valid. UnmarshalBSON must copy the BSON bytes if it wishes to retain the data -// after returning. -type Unmarshaler interface { - UnmarshalBSON([]byte) error -} - -// ValueUnmarshaler is an interface implemented by types that can unmarshal a -// BSON value representaiton of themselves. The BSON bytes and type can be -// assumed to be valid. UnmarshalBSONValue must copy the BSON value bytes if it -// wishes to retain the data after returning. -type ValueUnmarshaler interface { - UnmarshalBSONValue(bsontype.Type, []byte) error -} - -// ValueEncoderError is an error returned from a ValueEncoder when the provided value can't be -// encoded by the ValueEncoder. -type ValueEncoderError struct { - Name string - Types []reflect.Type - Kinds []reflect.Kind - Received reflect.Value -} - -func (vee ValueEncoderError) Error() string { - typeKinds := make([]string, 0, len(vee.Types)+len(vee.Kinds)) - for _, t := range vee.Types { - typeKinds = append(typeKinds, t.String()) - } - for _, k := range vee.Kinds { - if k == reflect.Map { - typeKinds = append(typeKinds, "map[string]*") - continue - } - typeKinds = append(typeKinds, k.String()) - } - received := vee.Received.Kind().String() - if vee.Received.IsValid() { - received = vee.Received.Type().String() - } - return fmt.Sprintf("%s can only encode valid %s, but got %s", vee.Name, strings.Join(typeKinds, ", "), received) -} - -// ValueDecoderError is an error returned from a ValueDecoder when the provided value can't be -// decoded by the ValueDecoder. -type ValueDecoderError struct { - Name string - Types []reflect.Type - Kinds []reflect.Kind - Received reflect.Value -} - -func (vde ValueDecoderError) Error() string { - typeKinds := make([]string, 0, len(vde.Types)+len(vde.Kinds)) - for _, t := range vde.Types { - typeKinds = append(typeKinds, t.String()) - } - for _, k := range vde.Kinds { - if k == reflect.Map { - typeKinds = append(typeKinds, "map[string]*") - continue - } - typeKinds = append(typeKinds, k.String()) - } - received := vde.Received.Kind().String() - if vde.Received.IsValid() { - received = vde.Received.Type().String() - } - return fmt.Sprintf("%s can only decode valid and settable %s, but got %s", vde.Name, strings.Join(typeKinds, ", "), received) -} - -// EncodeContext is the contextual information required for a Codec to encode a -// value. -type EncodeContext struct { - *Registry - MinSize bool -} - -// DecodeContext is the contextual information required for a Codec to decode a -// value. -type DecodeContext struct { - *Registry - Truncate bool - // Ancestor is the type of a containing document. This is mainly used to determine what type - // should be used when decoding an embedded document into an empty interface. For example, if - // Ancestor is a bson.M, BSON embedded document values being decoded into an empty interface - // will be decoded into a bson.M. - Ancestor reflect.Type -} - -// ValueCodec is the interface that groups the methods to encode and decode -// values. -type ValueCodec interface { - ValueEncoder - ValueDecoder -} - -// ValueEncoder is the interface implemented by types that can handle the encoding of a value. -type ValueEncoder interface { - EncodeValue(EncodeContext, bsonrw.ValueWriter, reflect.Value) error -} - -// ValueEncoderFunc is an adapter function that allows a function with the correct signature to be -// used as a ValueEncoder. -type ValueEncoderFunc func(EncodeContext, bsonrw.ValueWriter, reflect.Value) error - -// EncodeValue implements the ValueEncoder interface. -func (fn ValueEncoderFunc) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - return fn(ec, vw, val) -} - -// ValueDecoder is the interface implemented by types that can handle the decoding of a value. -type ValueDecoder interface { - DecodeValue(DecodeContext, bsonrw.ValueReader, reflect.Value) error -} - -// ValueDecoderFunc is an adapter function that allows a function with the correct signature to be -// used as a ValueDecoder. -type ValueDecoderFunc func(DecodeContext, bsonrw.ValueReader, reflect.Value) error - -// DecodeValue implements the ValueDecoder interface. -func (fn ValueDecoderFunc) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - return fn(dc, vr, val) -} - -// CodecZeroer is the interface implemented by Codecs that can also determine if -// a value of the type that would be encoded is zero. -type CodecZeroer interface { - IsTypeZero(interface{}) bool -} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_decoders.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_decoders.go deleted file mode 100644 index 65cd1c0a55..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_decoders.go +++ /dev/null @@ -1,1014 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 - -package bsoncodec - -import ( - "encoding/json" - "errors" - "fmt" - "math" - "net/url" - "reflect" - "strconv" - "time" - - "go.mongodb.org/mongo-driver/bson/bsonrw" - "go.mongodb.org/mongo-driver/bson/bsontype" - "go.mongodb.org/mongo-driver/bson/primitive" - "go.mongodb.org/mongo-driver/x/bsonx/bsoncore" -) - -var defaultValueDecoders DefaultValueDecoders - -// DefaultValueDecoders is a namespace type for the default ValueDecoders used -// when creating a registry. -type DefaultValueDecoders struct{} - -// RegisterDefaultDecoders will register the decoder methods attached to DefaultValueDecoders with -// the provided RegistryBuilder. -// -// There is no support for decoding map[string]interface{} becuase there is no decoder for -// interface{}, so users must either register this decoder themselves or use the -// EmptyInterfaceDecoder avaialble in the bson package. -func (dvd DefaultValueDecoders) RegisterDefaultDecoders(rb *RegistryBuilder) { - if rb == nil { - panic(errors.New("argument to RegisterDefaultDecoders must not be nil")) - } - - rb. - RegisterDecoder(tBinary, ValueDecoderFunc(dvd.BinaryDecodeValue)). - RegisterDecoder(tUndefined, ValueDecoderFunc(dvd.UndefinedDecodeValue)). - RegisterDecoder(tDateTime, ValueDecoderFunc(dvd.DateTimeDecodeValue)). - RegisterDecoder(tNull, ValueDecoderFunc(dvd.NullDecodeValue)). - RegisterDecoder(tRegex, ValueDecoderFunc(dvd.RegexDecodeValue)). - RegisterDecoder(tDBPointer, ValueDecoderFunc(dvd.DBPointerDecodeValue)). - RegisterDecoder(tTimestamp, ValueDecoderFunc(dvd.TimestampDecodeValue)). - RegisterDecoder(tMinKey, ValueDecoderFunc(dvd.MinKeyDecodeValue)). - RegisterDecoder(tMaxKey, ValueDecoderFunc(dvd.MaxKeyDecodeValue)). - RegisterDecoder(tJavaScript, ValueDecoderFunc(dvd.JavaScriptDecodeValue)). - RegisterDecoder(tSymbol, ValueDecoderFunc(dvd.SymbolDecodeValue)). - RegisterDecoder(tByteSlice, ValueDecoderFunc(dvd.ByteSliceDecodeValue)). - RegisterDecoder(tTime, ValueDecoderFunc(dvd.TimeDecodeValue)). - RegisterDecoder(tEmpty, ValueDecoderFunc(dvd.EmptyInterfaceDecodeValue)). - RegisterDecoder(tOID, ValueDecoderFunc(dvd.ObjectIDDecodeValue)). - RegisterDecoder(tDecimal, ValueDecoderFunc(dvd.Decimal128DecodeValue)). - RegisterDecoder(tJSONNumber, ValueDecoderFunc(dvd.JSONNumberDecodeValue)). - RegisterDecoder(tURL, ValueDecoderFunc(dvd.URLDecodeValue)). - RegisterDecoder(tValueUnmarshaler, ValueDecoderFunc(dvd.ValueUnmarshalerDecodeValue)). - RegisterDecoder(tUnmarshaler, ValueDecoderFunc(dvd.UnmarshalerDecodeValue)). - RegisterDecoder(tCoreDocument, ValueDecoderFunc(dvd.CoreDocumentDecodeValue)). - RegisterDecoder(tCodeWithScope, ValueDecoderFunc(dvd.CodeWithScopeDecodeValue)). - RegisterDefaultDecoder(reflect.Bool, ValueDecoderFunc(dvd.BooleanDecodeValue)). - RegisterDefaultDecoder(reflect.Int, ValueDecoderFunc(dvd.IntDecodeValue)). - RegisterDefaultDecoder(reflect.Int8, ValueDecoderFunc(dvd.IntDecodeValue)). - RegisterDefaultDecoder(reflect.Int16, ValueDecoderFunc(dvd.IntDecodeValue)). - RegisterDefaultDecoder(reflect.Int32, ValueDecoderFunc(dvd.IntDecodeValue)). - RegisterDefaultDecoder(reflect.Int64, ValueDecoderFunc(dvd.IntDecodeValue)). - RegisterDefaultDecoder(reflect.Uint, ValueDecoderFunc(dvd.UintDecodeValue)). - RegisterDefaultDecoder(reflect.Uint8, ValueDecoderFunc(dvd.UintDecodeValue)). - RegisterDefaultDecoder(reflect.Uint16, ValueDecoderFunc(dvd.UintDecodeValue)). - RegisterDefaultDecoder(reflect.Uint32, ValueDecoderFunc(dvd.UintDecodeValue)). - RegisterDefaultDecoder(reflect.Uint64, ValueDecoderFunc(dvd.UintDecodeValue)). - RegisterDefaultDecoder(reflect.Float32, ValueDecoderFunc(dvd.FloatDecodeValue)). - RegisterDefaultDecoder(reflect.Float64, ValueDecoderFunc(dvd.FloatDecodeValue)). - RegisterDefaultDecoder(reflect.Array, ValueDecoderFunc(dvd.ArrayDecodeValue)). - RegisterDefaultDecoder(reflect.Map, ValueDecoderFunc(dvd.MapDecodeValue)). - RegisterDefaultDecoder(reflect.Slice, ValueDecoderFunc(dvd.SliceDecodeValue)). - RegisterDefaultDecoder(reflect.String, ValueDecoderFunc(dvd.StringDecodeValue)). - RegisterDefaultDecoder(reflect.Struct, &StructCodec{cache: make(map[reflect.Type]*structDescription), parser: DefaultStructTagParser}). - RegisterDefaultDecoder(reflect.Ptr, NewPointerCodec()). - RegisterTypeMapEntry(bsontype.Double, tFloat64). - RegisterTypeMapEntry(bsontype.String, tString). - RegisterTypeMapEntry(bsontype.Array, tA). - RegisterTypeMapEntry(bsontype.Binary, tBinary). - RegisterTypeMapEntry(bsontype.Undefined, tUndefined). - RegisterTypeMapEntry(bsontype.ObjectID, tOID). - RegisterTypeMapEntry(bsontype.Boolean, tBool). - RegisterTypeMapEntry(bsontype.DateTime, tDateTime). - RegisterTypeMapEntry(bsontype.Regex, tRegex). - RegisterTypeMapEntry(bsontype.DBPointer, tDBPointer). - RegisterTypeMapEntry(bsontype.JavaScript, tJavaScript). - RegisterTypeMapEntry(bsontype.Symbol, tSymbol). - RegisterTypeMapEntry(bsontype.CodeWithScope, tCodeWithScope). - RegisterTypeMapEntry(bsontype.Int32, tInt32). - RegisterTypeMapEntry(bsontype.Int64, tInt64). - RegisterTypeMapEntry(bsontype.Timestamp, tTimestamp). - RegisterTypeMapEntry(bsontype.Decimal128, tDecimal). - RegisterTypeMapEntry(bsontype.MinKey, tMinKey). - RegisterTypeMapEntry(bsontype.MaxKey, tMaxKey). - RegisterTypeMapEntry(bsontype.Type(0), tD) -} - -// BooleanDecodeValue is the ValueDecoderFunc for bool types. -func (dvd DefaultValueDecoders) BooleanDecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if vr.Type() != bsontype.Boolean { - return fmt.Errorf("cannot decode %v into a boolean", vr.Type()) - } - if !val.IsValid() || !val.CanSet() || val.Kind() != reflect.Bool { - return ValueDecoderError{Name: "BooleanDecodeValue", Kinds: []reflect.Kind{reflect.Bool}, Received: val} - } - - b, err := vr.ReadBoolean() - val.SetBool(b) - return err -} - -// IntDecodeValue is the ValueDecoderFunc for bool types. -func (dvd DefaultValueDecoders) IntDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - var i64 int64 - var err error - switch vr.Type() { - case bsontype.Int32: - i32, err := vr.ReadInt32() - if err != nil { - return err - } - i64 = int64(i32) - case bsontype.Int64: - i64, err = vr.ReadInt64() - if err != nil { - return err - } - case bsontype.Double: - f64, err := vr.ReadDouble() - if err != nil { - return err - } - if !dc.Truncate && math.Floor(f64) != f64 { - return errors.New("IntDecodeValue can only truncate float64 to an integer type when truncation is enabled") - } - if f64 > float64(math.MaxInt64) { - return fmt.Errorf("%g overflows int64", f64) - } - i64 = int64(f64) - default: - return fmt.Errorf("cannot decode %v into an integer type", vr.Type()) - } - - if !val.CanSet() { - return ValueDecoderError{ - Name: "IntDecodeValue", - Kinds: []reflect.Kind{reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int}, - Received: val, - } - } - - switch val.Kind() { - case reflect.Int8: - if i64 < math.MinInt8 || i64 > math.MaxInt8 { - return fmt.Errorf("%d overflows int8", i64) - } - case reflect.Int16: - if i64 < math.MinInt16 || i64 > math.MaxInt16 { - return fmt.Errorf("%d overflows int16", i64) - } - case reflect.Int32: - if i64 < math.MinInt32 || i64 > math.MaxInt32 { - return fmt.Errorf("%d overflows int32", i64) - } - case reflect.Int64: - case reflect.Int: - if int64(int(i64)) != i64 { // Can we fit this inside of an int - return fmt.Errorf("%d overflows int", i64) - } - default: - return ValueDecoderError{ - Name: "IntDecodeValue", - Kinds: []reflect.Kind{reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int}, - Received: val, - } - } - - val.SetInt(i64) - return nil -} - -// UintDecodeValue is the ValueDecoderFunc for uint types. -func (dvd DefaultValueDecoders) UintDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - var i64 int64 - var err error - switch vr.Type() { - case bsontype.Int32: - i32, err := vr.ReadInt32() - if err != nil { - return err - } - i64 = int64(i32) - case bsontype.Int64: - i64, err = vr.ReadInt64() - if err != nil { - return err - } - case bsontype.Double: - f64, err := vr.ReadDouble() - if err != nil { - return err - } - if !dc.Truncate && math.Floor(f64) != f64 { - return errors.New("UintDecodeValue can only truncate float64 to an integer type when truncation is enabled") - } - if f64 > float64(math.MaxInt64) { - return fmt.Errorf("%g overflows int64", f64) - } - i64 = int64(f64) - default: - return fmt.Errorf("cannot decode %v into an integer type", vr.Type()) - } - - if !val.CanSet() { - return ValueDecoderError{ - Name: "UintDecodeValue", - Kinds: []reflect.Kind{reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint}, - Received: val, - } - } - - switch val.Kind() { - case reflect.Uint8: - if i64 < 0 || i64 > math.MaxUint8 { - return fmt.Errorf("%d overflows uint8", i64) - } - case reflect.Uint16: - if i64 < 0 || i64 > math.MaxUint16 { - return fmt.Errorf("%d overflows uint16", i64) - } - case reflect.Uint32: - if i64 < 0 || i64 > math.MaxUint32 { - return fmt.Errorf("%d overflows uint32", i64) - } - case reflect.Uint64: - if i64 < 0 { - return fmt.Errorf("%d overflows uint64", i64) - } - case reflect.Uint: - if i64 < 0 || int64(uint(i64)) != i64 { // Can we fit this inside of an uint - return fmt.Errorf("%d overflows uint", i64) - } - default: - return ValueDecoderError{ - Name: "UintDecodeValue", - Kinds: []reflect.Kind{reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint}, - Received: val, - } - } - - val.SetUint(uint64(i64)) - return nil -} - -// FloatDecodeValue is the ValueDecoderFunc for float types. -func (dvd DefaultValueDecoders) FloatDecodeValue(ec DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - var f float64 - var err error - switch vr.Type() { - case bsontype.Int32: - i32, err := vr.ReadInt32() - if err != nil { - return err - } - f = float64(i32) - case bsontype.Int64: - i64, err := vr.ReadInt64() - if err != nil { - return err - } - f = float64(i64) - case bsontype.Double: - f, err = vr.ReadDouble() - if err != nil { - return err - } - default: - return fmt.Errorf("cannot decode %v into a float32 or float64 type", vr.Type()) - } - - if !val.CanSet() { - return ValueDecoderError{Name: "FloatDecodeValue", Kinds: []reflect.Kind{reflect.Float32, reflect.Float64}, Received: val} - } - - switch val.Kind() { - case reflect.Float32: - if !ec.Truncate && float64(float32(f)) != f { - return errors.New("FloatDecodeValue can only convert float64 to float32 when truncation is allowed") - } - case reflect.Float64: - default: - return ValueDecoderError{Name: "FloatDecodeValue", Kinds: []reflect.Kind{reflect.Float32, reflect.Float64}, Received: val} - } - - val.SetFloat(f) - return nil -} - -// StringDecodeValue is the ValueDecoderFunc for string types. -func (dvd DefaultValueDecoders) StringDecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - var str string - var err error - switch vr.Type() { - // TODO(GODRIVER-577): Handle JavaScript and Symbol BSON types when allowed. - case bsontype.String: - str, err = vr.ReadString() - if err != nil { - return err - } - default: - return fmt.Errorf("cannot decode %v into a string type", vr.Type()) - } - if !val.CanSet() || val.Kind() != reflect.String { - return ValueDecoderError{Name: "StringDecodeValue", Kinds: []reflect.Kind{reflect.String}, Received: val} - } - - val.SetString(str) - return nil -} - -// JavaScriptDecodeValue is the ValueDecoderFunc for the primitive.JavaScript type. -func (DefaultValueDecoders) JavaScriptDecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Type() != tJavaScript { - return ValueDecoderError{Name: "BinaryDecodeValue", Types: []reflect.Type{tJavaScript}, Received: val} - } - - if vr.Type() != bsontype.JavaScript { - return fmt.Errorf("cannot decode %v into a primitive.JavaScript", vr.Type()) - } - - js, err := vr.ReadJavascript() - if err != nil { - return err - } - - val.SetString(js) - return nil -} - -// SymbolDecodeValue is the ValueDecoderFunc for the primitive.Symbol type. -func (DefaultValueDecoders) SymbolDecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Type() != tSymbol { - return ValueDecoderError{Name: "BinaryDecodeValue", Types: []reflect.Type{tSymbol}, Received: val} - } - - if vr.Type() != bsontype.Symbol { - return fmt.Errorf("cannot decode %v into a primitive.Symbol", vr.Type()) - } - - symbol, err := vr.ReadSymbol() - if err != nil { - return err - } - - val.SetString(symbol) - return nil -} - -// BinaryDecodeValue is the ValueDecoderFunc for Binary. -func (DefaultValueDecoders) BinaryDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Type() != tBinary { - return ValueDecoderError{Name: "BinaryDecodeValue", Types: []reflect.Type{tBinary}, Received: val} - } - - if vr.Type() != bsontype.Binary { - return fmt.Errorf("cannot decode %v into a Binary", vr.Type()) - } - - data, subtype, err := vr.ReadBinary() - if err != nil { - return err - } - - val.Set(reflect.ValueOf(primitive.Binary{Subtype: subtype, Data: data})) - return nil -} - -// UndefinedDecodeValue is the ValueDecoderFunc for Undefined. -func (DefaultValueDecoders) UndefinedDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Type() != tUndefined { - return ValueDecoderError{Name: "UndefinedDecodeValue", Types: []reflect.Type{tUndefined}, Received: val} - } - - if vr.Type() != bsontype.Undefined { - return fmt.Errorf("cannot decode %v into an Undefined", vr.Type()) - } - - val.Set(reflect.ValueOf(primitive.Undefined{})) - return vr.ReadUndefined() -} - -// ObjectIDDecodeValue is the ValueDecoderFunc for primitive.ObjectID. -func (dvd DefaultValueDecoders) ObjectIDDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Type() != tOID { - return ValueDecoderError{Name: "ObjectIDDecodeValue", Types: []reflect.Type{tOID}, Received: val} - } - - if vr.Type() != bsontype.ObjectID { - return fmt.Errorf("cannot decode %v into an ObjectID", vr.Type()) - } - oid, err := vr.ReadObjectID() - val.Set(reflect.ValueOf(oid)) - return err -} - -// DateTimeDecodeValue is the ValueDecoderFunc for DateTime. -func (DefaultValueDecoders) DateTimeDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Type() != tDateTime { - return ValueDecoderError{Name: "DateTimeDecodeValue", Types: []reflect.Type{tDateTime}, Received: val} - } - - if vr.Type() != bsontype.DateTime { - return fmt.Errorf("cannot decode %v into a DateTime", vr.Type()) - } - - dt, err := vr.ReadDateTime() - if err != nil { - return err - } - - val.Set(reflect.ValueOf(primitive.DateTime(dt))) - return nil -} - -// NullDecodeValue is the ValueDecoderFunc for Null. -func (DefaultValueDecoders) NullDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Type() != tNull { - return ValueDecoderError{Name: "NullDecodeValue", Types: []reflect.Type{tNull}, Received: val} - } - - if vr.Type() != bsontype.Null { - return fmt.Errorf("cannot decode %v into a Null", vr.Type()) - } - - val.Set(reflect.ValueOf(primitive.Null{})) - return vr.ReadNull() -} - -// RegexDecodeValue is the ValueDecoderFunc for Regex. -func (DefaultValueDecoders) RegexDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Type() != tRegex { - return ValueDecoderError{Name: "RegexDecodeValue", Types: []reflect.Type{tRegex}, Received: val} - } - - if vr.Type() != bsontype.Regex { - return fmt.Errorf("cannot decode %v into a Regex", vr.Type()) - } - - pattern, options, err := vr.ReadRegex() - if err != nil { - return err - } - - val.Set(reflect.ValueOf(primitive.Regex{Pattern: pattern, Options: options})) - return nil -} - -// DBPointerDecodeValue is the ValueDecoderFunc for DBPointer. -func (DefaultValueDecoders) DBPointerDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Type() != tDBPointer { - return ValueDecoderError{Name: "DBPointerDecodeValue", Types: []reflect.Type{tDBPointer}, Received: val} - } - - if vr.Type() != bsontype.DBPointer { - return fmt.Errorf("cannot decode %v into a DBPointer", vr.Type()) - } - - ns, pointer, err := vr.ReadDBPointer() - if err != nil { - return err - } - - val.Set(reflect.ValueOf(primitive.DBPointer{DB: ns, Pointer: pointer})) - return nil -} - -// TimestampDecodeValue is the ValueDecoderFunc for Timestamp. -func (DefaultValueDecoders) TimestampDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Type() != tTimestamp { - return ValueDecoderError{Name: "TimestampDecodeValue", Types: []reflect.Type{tTimestamp}, Received: val} - } - - if vr.Type() != bsontype.Timestamp { - return fmt.Errorf("cannot decode %v into a Timestamp", vr.Type()) - } - - t, incr, err := vr.ReadTimestamp() - if err != nil { - return err - } - - val.Set(reflect.ValueOf(primitive.Timestamp{T: t, I: incr})) - return nil -} - -// MinKeyDecodeValue is the ValueDecoderFunc for MinKey. -func (DefaultValueDecoders) MinKeyDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Type() != tMinKey { - return ValueDecoderError{Name: "MinKeyDecodeValue", Types: []reflect.Type{tMinKey}, Received: val} - } - - if vr.Type() != bsontype.MinKey { - return fmt.Errorf("cannot decode %v into a MinKey", vr.Type()) - } - - val.Set(reflect.ValueOf(primitive.MinKey{})) - return vr.ReadMinKey() -} - -// MaxKeyDecodeValue is the ValueDecoderFunc for MaxKey. -func (DefaultValueDecoders) MaxKeyDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Type() != tMaxKey { - return ValueDecoderError{Name: "MaxKeyDecodeValue", Types: []reflect.Type{tMaxKey}, Received: val} - } - - if vr.Type() != bsontype.MaxKey { - return fmt.Errorf("cannot decode %v into a MaxKey", vr.Type()) - } - - val.Set(reflect.ValueOf(primitive.MaxKey{})) - return vr.ReadMaxKey() -} - -// Decimal128DecodeValue is the ValueDecoderFunc for primitive.Decimal128. -func (dvd DefaultValueDecoders) Decimal128DecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if vr.Type() != bsontype.Decimal128 { - return fmt.Errorf("cannot decode %v into a primitive.Decimal128", vr.Type()) - } - - if !val.CanSet() || val.Type() != tDecimal { - return ValueDecoderError{Name: "Decimal128DecodeValue", Types: []reflect.Type{tDecimal}, Received: val} - } - d128, err := vr.ReadDecimal128() - val.Set(reflect.ValueOf(d128)) - return err -} - -// JSONNumberDecodeValue is the ValueDecoderFunc for json.Number. -func (dvd DefaultValueDecoders) JSONNumberDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Type() != tJSONNumber { - return ValueDecoderError{Name: "JSONNumberDecodeValue", Types: []reflect.Type{tJSONNumber}, Received: val} - } - - switch vr.Type() { - case bsontype.Double: - f64, err := vr.ReadDouble() - if err != nil { - return err - } - val.Set(reflect.ValueOf(json.Number(strconv.FormatFloat(f64, 'g', -1, 64)))) - case bsontype.Int32: - i32, err := vr.ReadInt32() - if err != nil { - return err - } - val.Set(reflect.ValueOf(json.Number(strconv.FormatInt(int64(i32), 10)))) - case bsontype.Int64: - i64, err := vr.ReadInt64() - if err != nil { - return err - } - val.Set(reflect.ValueOf(json.Number(strconv.FormatInt(i64, 10)))) - default: - return fmt.Errorf("cannot decode %v into a json.Number", vr.Type()) - } - - return nil -} - -// URLDecodeValue is the ValueDecoderFunc for url.URL. -func (dvd DefaultValueDecoders) URLDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if vr.Type() != bsontype.String { - return fmt.Errorf("cannot decode %v into a *url.URL", vr.Type()) - } - - str, err := vr.ReadString() - if err != nil { - return err - } - - u, err := url.Parse(str) - if err != nil { - return err - } - - if !val.CanSet() || val.Type() != tURL { - return ValueDecoderError{Name: "URLDecodeValue", Types: []reflect.Type{tURL}, Received: val} - } - - val.Set(reflect.ValueOf(u).Elem()) - return nil -} - -// TimeDecodeValue is the ValueDecoderFunc for time.Time. -func (dvd DefaultValueDecoders) TimeDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if vr.Type() != bsontype.DateTime { - return fmt.Errorf("cannot decode %v into a time.Time", vr.Type()) - } - - dt, err := vr.ReadDateTime() - if err != nil { - return err - } - - if !val.CanSet() || val.Type() != tTime { - return ValueDecoderError{Name: "TimeDecodeValue", Types: []reflect.Type{tTime}, Received: val} - } - - val.Set(reflect.ValueOf(time.Unix(dt/1000, dt%1000*1000000).UTC())) - return nil -} - -// ByteSliceDecodeValue is the ValueDecoderFunc for []byte. -func (dvd DefaultValueDecoders) ByteSliceDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if vr.Type() != bsontype.Binary && vr.Type() != bsontype.Null { - return fmt.Errorf("cannot decode %v into a []byte", vr.Type()) - } - - if !val.CanSet() || val.Type() != tByteSlice { - return ValueDecoderError{Name: "ByteSliceDecodeValue", Types: []reflect.Type{tByteSlice}, Received: val} - } - - if vr.Type() == bsontype.Null { - val.Set(reflect.Zero(val.Type())) - return vr.ReadNull() - } - - data, subtype, err := vr.ReadBinary() - if err != nil { - return err - } - if subtype != 0x00 { - return fmt.Errorf("ByteSliceDecodeValue can only be used to decode subtype 0x00 for %s, got %v", bsontype.Binary, subtype) - } - - val.Set(reflect.ValueOf(data)) - return nil -} - -// MapDecodeValue is the ValueDecoderFunc for map[string]* types. -func (dvd DefaultValueDecoders) MapDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Kind() != reflect.Map || val.Type().Key().Kind() != reflect.String { - return ValueDecoderError{Name: "MapDecodeValue", Kinds: []reflect.Kind{reflect.Map}, Received: val} - } - - switch vr.Type() { - case bsontype.Type(0), bsontype.EmbeddedDocument: - case bsontype.Null: - val.Set(reflect.Zero(val.Type())) - return vr.ReadNull() - default: - return fmt.Errorf("cannot decode %v into a %s", vr.Type(), val.Type()) - } - - dr, err := vr.ReadDocument() - if err != nil { - return err - } - - if val.IsNil() { - val.Set(reflect.MakeMap(val.Type())) - } - - eType := val.Type().Elem() - decoder, err := dc.LookupDecoder(eType) - if err != nil { - return err - } - - if eType == tEmpty { - dc.Ancestor = val.Type() - } - - keyType := val.Type().Key() - for { - key, vr, err := dr.ReadElement() - if err == bsonrw.ErrEOD { - break - } - if err != nil { - return err - } - - elem := reflect.New(eType).Elem() - - err = decoder.DecodeValue(dc, vr, elem) - if err != nil { - return err - } - - val.SetMapIndex(reflect.ValueOf(key).Convert(keyType), elem) - } - return nil -} - -// ArrayDecodeValue is the ValueDecoderFunc for array types. -func (dvd DefaultValueDecoders) ArrayDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.IsValid() || val.Kind() != reflect.Array { - return ValueDecoderError{Name: "ArrayDecodeValue", Kinds: []reflect.Kind{reflect.Array}, Received: val} - } - - switch vr.Type() { - case bsontype.Array: - case bsontype.Type(0), bsontype.EmbeddedDocument: - if val.Type().Elem() != tE { - return fmt.Errorf("cannot decode document into %s", val.Type()) - } - default: - return fmt.Errorf("cannot decode %v into an array", vr.Type()) - } - - var elemsFunc func(DecodeContext, bsonrw.ValueReader, reflect.Value) ([]reflect.Value, error) - switch val.Type().Elem() { - case tE: - elemsFunc = dvd.decodeD - default: - elemsFunc = dvd.decodeDefault - } - - elems, err := elemsFunc(dc, vr, val) - if err != nil { - return err - } - - if len(elems) > val.Len() { - return fmt.Errorf("more elements returned in array than can fit inside %s", val.Type()) - } - - for idx, elem := range elems { - val.Index(idx).Set(elem) - } - - return nil -} - -// SliceDecodeValue is the ValueDecoderFunc for slice types. -func (dvd DefaultValueDecoders) SliceDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Kind() != reflect.Slice { - return ValueDecoderError{Name: "SliceDecodeValue", Kinds: []reflect.Kind{reflect.Slice}, Received: val} - } - - switch vr.Type() { - case bsontype.Array: - case bsontype.Null: - val.Set(reflect.Zero(val.Type())) - return vr.ReadNull() - case bsontype.Type(0), bsontype.EmbeddedDocument: - if val.Type().Elem() != tE { - return fmt.Errorf("cannot decode document into %s", val.Type()) - } - default: - return fmt.Errorf("cannot decode %v into a slice", vr.Type()) - } - - var elemsFunc func(DecodeContext, bsonrw.ValueReader, reflect.Value) ([]reflect.Value, error) - switch val.Type().Elem() { - case tE: - dc.Ancestor = val.Type() - elemsFunc = dvd.decodeD - default: - elemsFunc = dvd.decodeDefault - } - - elems, err := elemsFunc(dc, vr, val) - if err != nil { - return err - } - - if val.IsNil() { - val.Set(reflect.MakeSlice(val.Type(), 0, len(elems))) - } - - val.SetLen(0) - val.Set(reflect.Append(val, elems...)) - - return nil -} - -// ValueUnmarshalerDecodeValue is the ValueDecoderFunc for ValueUnmarshaler implementations. -func (dvd DefaultValueDecoders) ValueUnmarshalerDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.IsValid() || (!val.Type().Implements(tValueUnmarshaler) && !reflect.PtrTo(val.Type()).Implements(tValueUnmarshaler)) { - return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val} - } - - if val.Kind() == reflect.Ptr && val.IsNil() { - if !val.CanSet() { - return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val} - } - val.Set(reflect.New(val.Type().Elem())) - } - - if !val.Type().Implements(tValueUnmarshaler) { - if !val.CanAddr() { - return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val} - } - val = val.Addr() // If they type doesn't implement the interface, a pointer to it must. - } - - t, src, err := bsonrw.Copier{}.CopyValueToBytes(vr) - if err != nil { - return err - } - - fn := val.Convert(tValueUnmarshaler).MethodByName("UnmarshalBSONValue") - errVal := fn.Call([]reflect.Value{reflect.ValueOf(t), reflect.ValueOf(src)})[0] - if !errVal.IsNil() { - return errVal.Interface().(error) - } - return nil -} - -// UnmarshalerDecodeValue is the ValueDecoderFunc for Unmarshaler implementations. -func (dvd DefaultValueDecoders) UnmarshalerDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.IsValid() || (!val.Type().Implements(tUnmarshaler) && !reflect.PtrTo(val.Type()).Implements(tUnmarshaler)) { - return ValueDecoderError{Name: "UnmarshalerDecodeValue", Types: []reflect.Type{tUnmarshaler}, Received: val} - } - - if val.Kind() == reflect.Ptr && val.IsNil() { - if !val.CanSet() { - return ValueDecoderError{Name: "UnmarshalerDecodeValue", Types: []reflect.Type{tUnmarshaler}, Received: val} - } - val.Set(reflect.New(val.Type().Elem())) - } - - if !val.Type().Implements(tUnmarshaler) { - if !val.CanAddr() { - return ValueDecoderError{Name: "UnmarshalerDecodeValue", Types: []reflect.Type{tUnmarshaler}, Received: val} - } - val = val.Addr() // If they type doesn't implement the interface, a pointer to it must. - } - - _, src, err := bsonrw.Copier{}.CopyValueToBytes(vr) - if err != nil { - return err - } - - fn := val.Convert(tUnmarshaler).MethodByName("UnmarshalBSON") - errVal := fn.Call([]reflect.Value{reflect.ValueOf(src)})[0] - if !errVal.IsNil() { - return errVal.Interface().(error) - } - return nil -} - -// EmptyInterfaceDecodeValue is the ValueDecoderFunc for interface{}. -func (dvd DefaultValueDecoders) EmptyInterfaceDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Type() != tEmpty { - return ValueDecoderError{Name: "EmptyInterfaceDecodeValue", Types: []reflect.Type{tEmpty}, Received: val} - } - - rtype, err := dc.LookupTypeMapEntry(vr.Type()) - if err != nil { - switch vr.Type() { - case bsontype.EmbeddedDocument: - if dc.Ancestor != nil { - rtype = dc.Ancestor - break - } - rtype = tD - case bsontype.Null: - val.Set(reflect.Zero(val.Type())) - return vr.ReadNull() - default: - return err - } - } - - decoder, err := dc.LookupDecoder(rtype) - if err != nil { - return err - } - - elem := reflect.New(rtype).Elem() - err = decoder.DecodeValue(dc, vr, elem) - if err != nil { - return err - } - - val.Set(elem) - return nil -} - -// CoreDocumentDecodeValue is the ValueDecoderFunc for bsoncore.Document. -func (DefaultValueDecoders) CoreDocumentDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Type() != tCoreDocument { - return ValueDecoderError{Name: "CoreDocumentDecodeValue", Types: []reflect.Type{tCoreDocument}, Received: val} - } - - if val.IsNil() { - val.Set(reflect.MakeSlice(val.Type(), 0, 0)) - } - - val.SetLen(0) - - cdoc, err := bsonrw.Copier{}.AppendDocumentBytes(val.Interface().(bsoncore.Document), vr) - val.Set(reflect.ValueOf(cdoc)) - return err -} - -func (dvd DefaultValueDecoders) decodeDefault(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) ([]reflect.Value, error) { - elems := make([]reflect.Value, 0) - - ar, err := vr.ReadArray() - if err != nil { - return nil, err - } - - eType := val.Type().Elem() - - decoder, err := dc.LookupDecoder(eType) - if err != nil { - return nil, err - } - - for { - vr, err := ar.ReadValue() - if err == bsonrw.ErrEOA { - break - } - if err != nil { - return nil, err - } - - elem := reflect.New(eType).Elem() - - err = decoder.DecodeValue(dc, vr, elem) - if err != nil { - return nil, err - } - elems = append(elems, elem) - } - - return elems, nil -} - -// CodeWithScopeDecodeValue is the ValueDecoderFunc for CodeWithScope. -func (dvd DefaultValueDecoders) CodeWithScopeDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Type() != tCodeWithScope { - return ValueDecoderError{Name: "CodeWithScopeDecodeValue", Types: []reflect.Type{tCodeWithScope}, Received: val} - } - - if vr.Type() != bsontype.CodeWithScope { - return fmt.Errorf("cannot decode %v into a primitive.CodeWithScope", vr.Type()) - } - - code, dr, err := vr.ReadCodeWithScope() - if err != nil { - return err - } - - scope := reflect.New(tD).Elem() - - elems, err := dvd.decodeElemsFromDocumentReader(dc, dr) - if err != nil { - return err - } - - scope.Set(reflect.MakeSlice(tD, 0, len(elems))) - scope.Set(reflect.Append(scope, elems...)) - - val.Set(reflect.ValueOf(primitive.CodeWithScope{Code: primitive.JavaScript(code), Scope: scope.Interface().(primitive.D)})) - return nil -} - -func (dvd DefaultValueDecoders) decodeD(dc DecodeContext, vr bsonrw.ValueReader, _ reflect.Value) ([]reflect.Value, error) { - switch vr.Type() { - case bsontype.Type(0), bsontype.EmbeddedDocument: - default: - return nil, fmt.Errorf("cannot decode %v into a D", vr.Type()) - } - - dr, err := vr.ReadDocument() - if err != nil { - return nil, err - } - - return dvd.decodeElemsFromDocumentReader(dc, dr) -} - -func (DefaultValueDecoders) decodeElemsFromDocumentReader(dc DecodeContext, dr bsonrw.DocumentReader) ([]reflect.Value, error) { - decoder, err := dc.LookupDecoder(tEmpty) - if err != nil { - return nil, err - } - - elems := make([]reflect.Value, 0) - for { - key, vr, err := dr.ReadElement() - if err == bsonrw.ErrEOD { - break - } - if err != nil { - return nil, err - } - - val := reflect.New(tEmpty).Elem() - err = decoder.DecodeValue(dc, vr, val) - if err != nil { - return nil, err - } - - elems = append(elems, reflect.ValueOf(primitive.E{Key: key, Value: val.Interface()})) - } - - return elems, nil -} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_encoders.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_encoders.go deleted file mode 100644 index 39ebfc7ecd..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_encoders.go +++ /dev/null @@ -1,648 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 - -package bsoncodec - -import ( - "encoding/json" - "errors" - "fmt" - "math" - "net/url" - "reflect" - "sync" - "time" - - "go.mongodb.org/mongo-driver/bson/bsonrw" - "go.mongodb.org/mongo-driver/bson/bsontype" - "go.mongodb.org/mongo-driver/bson/primitive" - "go.mongodb.org/mongo-driver/x/bsonx/bsoncore" -) - -var defaultValueEncoders DefaultValueEncoders - -var bvwPool = bsonrw.NewBSONValueWriterPool() - -var sliceWriterPool = sync.Pool{ - New: func() interface{} { - sw := make(bsonrw.SliceWriter, 0, 0) - return &sw - }, -} - -func encodeElement(ec EncodeContext, dw bsonrw.DocumentWriter, e primitive.E) error { - vw, err := dw.WriteDocumentElement(e.Key) - if err != nil { - return err - } - - if e.Value == nil { - return vw.WriteNull() - } - encoder, err := ec.LookupEncoder(reflect.TypeOf(e.Value)) - if err != nil { - return err - } - - err = encoder.EncodeValue(ec, vw, reflect.ValueOf(e.Value)) - if err != nil { - return err - } - return nil -} - -// DefaultValueEncoders is a namespace type for the default ValueEncoders used -// when creating a registry. -type DefaultValueEncoders struct{} - -// RegisterDefaultEncoders will register the encoder methods attached to DefaultValueEncoders with -// the provided RegistryBuilder. -func (dve DefaultValueEncoders) RegisterDefaultEncoders(rb *RegistryBuilder) { - if rb == nil { - panic(errors.New("argument to RegisterDefaultEncoders must not be nil")) - } - rb. - RegisterEncoder(tByteSlice, ValueEncoderFunc(dve.ByteSliceEncodeValue)). - RegisterEncoder(tTime, ValueEncoderFunc(dve.TimeEncodeValue)). - RegisterEncoder(tEmpty, ValueEncoderFunc(dve.EmptyInterfaceEncodeValue)). - RegisterEncoder(tOID, ValueEncoderFunc(dve.ObjectIDEncodeValue)). - RegisterEncoder(tDecimal, ValueEncoderFunc(dve.Decimal128EncodeValue)). - RegisterEncoder(tJSONNumber, ValueEncoderFunc(dve.JSONNumberEncodeValue)). - RegisterEncoder(tURL, ValueEncoderFunc(dve.URLEncodeValue)). - RegisterEncoder(tValueMarshaler, ValueEncoderFunc(dve.ValueMarshalerEncodeValue)). - RegisterEncoder(tMarshaler, ValueEncoderFunc(dve.MarshalerEncodeValue)). - RegisterEncoder(tProxy, ValueEncoderFunc(dve.ProxyEncodeValue)). - RegisterEncoder(tJavaScript, ValueEncoderFunc(dve.JavaScriptEncodeValue)). - RegisterEncoder(tSymbol, ValueEncoderFunc(dve.SymbolEncodeValue)). - RegisterEncoder(tBinary, ValueEncoderFunc(dve.BinaryEncodeValue)). - RegisterEncoder(tUndefined, ValueEncoderFunc(dve.UndefinedEncodeValue)). - RegisterEncoder(tDateTime, ValueEncoderFunc(dve.DateTimeEncodeValue)). - RegisterEncoder(tNull, ValueEncoderFunc(dve.NullEncodeValue)). - RegisterEncoder(tRegex, ValueEncoderFunc(dve.RegexEncodeValue)). - RegisterEncoder(tDBPointer, ValueEncoderFunc(dve.DBPointerEncodeValue)). - RegisterEncoder(tTimestamp, ValueEncoderFunc(dve.TimestampEncodeValue)). - RegisterEncoder(tMinKey, ValueEncoderFunc(dve.MinKeyEncodeValue)). - RegisterEncoder(tMaxKey, ValueEncoderFunc(dve.MaxKeyEncodeValue)). - RegisterEncoder(tCoreDocument, ValueEncoderFunc(dve.CoreDocumentEncodeValue)). - RegisterEncoder(tCodeWithScope, ValueEncoderFunc(dve.CodeWithScopeEncodeValue)). - RegisterDefaultEncoder(reflect.Bool, ValueEncoderFunc(dve.BooleanEncodeValue)). - RegisterDefaultEncoder(reflect.Int, ValueEncoderFunc(dve.IntEncodeValue)). - RegisterDefaultEncoder(reflect.Int8, ValueEncoderFunc(dve.IntEncodeValue)). - RegisterDefaultEncoder(reflect.Int16, ValueEncoderFunc(dve.IntEncodeValue)). - RegisterDefaultEncoder(reflect.Int32, ValueEncoderFunc(dve.IntEncodeValue)). - RegisterDefaultEncoder(reflect.Int64, ValueEncoderFunc(dve.IntEncodeValue)). - RegisterDefaultEncoder(reflect.Uint, ValueEncoderFunc(dve.UintEncodeValue)). - RegisterDefaultEncoder(reflect.Uint8, ValueEncoderFunc(dve.UintEncodeValue)). - RegisterDefaultEncoder(reflect.Uint16, ValueEncoderFunc(dve.UintEncodeValue)). - RegisterDefaultEncoder(reflect.Uint32, ValueEncoderFunc(dve.UintEncodeValue)). - RegisterDefaultEncoder(reflect.Uint64, ValueEncoderFunc(dve.UintEncodeValue)). - RegisterDefaultEncoder(reflect.Float32, ValueEncoderFunc(dve.FloatEncodeValue)). - RegisterDefaultEncoder(reflect.Float64, ValueEncoderFunc(dve.FloatEncodeValue)). - RegisterDefaultEncoder(reflect.Array, ValueEncoderFunc(dve.ArrayEncodeValue)). - RegisterDefaultEncoder(reflect.Map, ValueEncoderFunc(dve.MapEncodeValue)). - RegisterDefaultEncoder(reflect.Slice, ValueEncoderFunc(dve.SliceEncodeValue)). - RegisterDefaultEncoder(reflect.String, ValueEncoderFunc(dve.StringEncodeValue)). - RegisterDefaultEncoder(reflect.Struct, &StructCodec{cache: make(map[reflect.Type]*structDescription), parser: DefaultStructTagParser}). - RegisterDefaultEncoder(reflect.Ptr, NewPointerCodec()) -} - -// BooleanEncodeValue is the ValueEncoderFunc for bool types. -func (dve DefaultValueEncoders) BooleanEncodeValue(ectx EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Kind() != reflect.Bool { - return ValueEncoderError{Name: "BooleanEncodeValue", Kinds: []reflect.Kind{reflect.Bool}, Received: val} - } - return vw.WriteBoolean(val.Bool()) -} - -func fitsIn32Bits(i int64) bool { - return math.MinInt32 <= i && i <= math.MaxInt32 -} - -// IntEncodeValue is the ValueEncoderFunc for int types. -func (dve DefaultValueEncoders) IntEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - switch val.Kind() { - case reflect.Int8, reflect.Int16, reflect.Int32: - return vw.WriteInt32(int32(val.Int())) - case reflect.Int: - i64 := val.Int() - if fitsIn32Bits(i64) { - return vw.WriteInt32(int32(i64)) - } - return vw.WriteInt64(i64) - case reflect.Int64: - i64 := val.Int() - if ec.MinSize && fitsIn32Bits(i64) { - return vw.WriteInt32(int32(i64)) - } - return vw.WriteInt64(i64) - } - - return ValueEncoderError{ - Name: "IntEncodeValue", - Kinds: []reflect.Kind{reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int}, - Received: val, - } -} - -// UintEncodeValue is the ValueEncoderFunc for uint types. -func (dve DefaultValueEncoders) UintEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - switch val.Kind() { - case reflect.Uint8, reflect.Uint16: - return vw.WriteInt32(int32(val.Uint())) - case reflect.Uint, reflect.Uint32, reflect.Uint64: - u64 := val.Uint() - if ec.MinSize && u64 <= math.MaxInt32 { - return vw.WriteInt32(int32(u64)) - } - if u64 > math.MaxInt64 { - return fmt.Errorf("%d overflows int64", u64) - } - return vw.WriteInt64(int64(u64)) - } - - return ValueEncoderError{ - Name: "UintEncodeValue", - Kinds: []reflect.Kind{reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint}, - Received: val, - } -} - -// FloatEncodeValue is the ValueEncoderFunc for float types. -func (dve DefaultValueEncoders) FloatEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - switch val.Kind() { - case reflect.Float32, reflect.Float64: - return vw.WriteDouble(val.Float()) - } - - return ValueEncoderError{Name: "FloatEncodeValue", Kinds: []reflect.Kind{reflect.Float32, reflect.Float64}, Received: val} -} - -// StringEncodeValue is the ValueEncoderFunc for string types. -func (dve DefaultValueEncoders) StringEncodeValue(ectx EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if val.Kind() != reflect.String { - return ValueEncoderError{ - Name: "StringEncodeValue", - Kinds: []reflect.Kind{reflect.String}, - Received: val, - } - } - - return vw.WriteString(val.String()) -} - -// ObjectIDEncodeValue is the ValueEncoderFunc for primitive.ObjectID. -func (dve DefaultValueEncoders) ObjectIDEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tOID { - return ValueEncoderError{Name: "ObjectIDEncodeValue", Types: []reflect.Type{tOID}, Received: val} - } - return vw.WriteObjectID(val.Interface().(primitive.ObjectID)) -} - -// Decimal128EncodeValue is the ValueEncoderFunc for primitive.Decimal128. -func (dve DefaultValueEncoders) Decimal128EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tDecimal { - return ValueEncoderError{Name: "Decimal128EncodeValue", Types: []reflect.Type{tDecimal}, Received: val} - } - return vw.WriteDecimal128(val.Interface().(primitive.Decimal128)) -} - -// JSONNumberEncodeValue is the ValueEncoderFunc for json.Number. -func (dve DefaultValueEncoders) JSONNumberEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tJSONNumber { - return ValueEncoderError{Name: "JSONNumberEncodeValue", Types: []reflect.Type{tJSONNumber}, Received: val} - } - jsnum := val.Interface().(json.Number) - - // Attempt int first, then float64 - if i64, err := jsnum.Int64(); err == nil { - return dve.IntEncodeValue(ec, vw, reflect.ValueOf(i64)) - } - - f64, err := jsnum.Float64() - if err != nil { - return err - } - - return dve.FloatEncodeValue(ec, vw, reflect.ValueOf(f64)) -} - -// URLEncodeValue is the ValueEncoderFunc for url.URL. -func (dve DefaultValueEncoders) URLEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tURL { - return ValueEncoderError{Name: "URLEncodeValue", Types: []reflect.Type{tURL}, Received: val} - } - u := val.Interface().(url.URL) - return vw.WriteString(u.String()) -} - -// TimeEncodeValue is the ValueEncoderFunc for time.TIme. -func (dve DefaultValueEncoders) TimeEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tTime { - return ValueEncoderError{Name: "TimeEncodeValue", Types: []reflect.Type{tTime}, Received: val} - } - tt := val.Interface().(time.Time) - return vw.WriteDateTime(tt.Unix()*1000 + int64(tt.Nanosecond()/1e6)) -} - -// ByteSliceEncodeValue is the ValueEncoderFunc for []byte. -func (dve DefaultValueEncoders) ByteSliceEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tByteSlice { - return ValueEncoderError{Name: "ByteSliceEncodeValue", Types: []reflect.Type{tByteSlice}, Received: val} - } - if val.IsNil() { - return vw.WriteNull() - } - return vw.WriteBinary(val.Interface().([]byte)) -} - -// MapEncodeValue is the ValueEncoderFunc for map[string]* types. -func (dve DefaultValueEncoders) MapEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Kind() != reflect.Map || val.Type().Key().Kind() != reflect.String { - return ValueEncoderError{Name: "MapEncodeValue", Kinds: []reflect.Kind{reflect.Map}, Received: val} - } - - if val.IsNil() { - // If we have a nill map but we can't WriteNull, that means we're probably trying to encode - // to a TopLevel document. We can't currently tell if this is what actually happened, but if - // there's a deeper underlying problem, the error will also be returned from WriteDocument, - // so just continue. The operations on a map reflection value are valid, so we can call - // MapKeys within mapEncodeValue without a problem. - err := vw.WriteNull() - if err == nil { - return nil - } - } - - dw, err := vw.WriteDocument() - if err != nil { - return err - } - - return dve.mapEncodeValue(ec, dw, val, nil) -} - -// mapEncodeValue handles encoding of the values of a map. The collisionFn returns -// true if the provided key exists, this is mainly used for inline maps in the -// struct codec. -func (dve DefaultValueEncoders) mapEncodeValue(ec EncodeContext, dw bsonrw.DocumentWriter, val reflect.Value, collisionFn func(string) bool) error { - - encoder, err := ec.LookupEncoder(val.Type().Elem()) - if err != nil { - return err - } - - keys := val.MapKeys() - for _, key := range keys { - if collisionFn != nil && collisionFn(key.String()) { - return fmt.Errorf("Key %s of inlined map conflicts with a struct field name", key) - } - vw, err := dw.WriteDocumentElement(key.String()) - if err != nil { - return err - } - - if enc, ok := encoder.(ValueEncoder); ok { - err = enc.EncodeValue(ec, vw, val.MapIndex(key)) - if err != nil { - return err - } - continue - } - err = encoder.EncodeValue(ec, vw, val.MapIndex(key)) - if err != nil { - return err - } - } - - return dw.WriteDocumentEnd() -} - -// ArrayEncodeValue is the ValueEncoderFunc for array types. -func (dve DefaultValueEncoders) ArrayEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Kind() != reflect.Array { - return ValueEncoderError{Name: "ArrayEncodeValue", Kinds: []reflect.Kind{reflect.Array}, Received: val} - } - - // If we have a []primitive.E we want to treat it as a document instead of as an array. - if val.Type().Elem() == tE { - dw, err := vw.WriteDocument() - if err != nil { - return err - } - - for idx := 0; idx < val.Len(); idx++ { - e := val.Index(idx).Interface().(primitive.E) - err = encodeElement(ec, dw, e) - if err != nil { - return err - } - } - - return dw.WriteDocumentEnd() - } - - aw, err := vw.WriteArray() - if err != nil { - return err - } - - encoder, err := ec.LookupEncoder(val.Type().Elem()) - if err != nil { - return err - } - - for idx := 0; idx < val.Len(); idx++ { - vw, err := aw.WriteArrayElement() - if err != nil { - return err - } - - err = encoder.EncodeValue(ec, vw, val.Index(idx)) - if err != nil { - return err - } - } - return aw.WriteArrayEnd() -} - -// SliceEncodeValue is the ValueEncoderFunc for slice types. -func (dve DefaultValueEncoders) SliceEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Kind() != reflect.Slice { - return ValueEncoderError{Name: "SliceEncodeValue", Kinds: []reflect.Kind{reflect.Slice}, Received: val} - } - - if val.IsNil() { - return vw.WriteNull() - } - - // If we have a []primitive.E we want to treat it as a document instead of as an array. - if val.Type().ConvertibleTo(tD) { - d := val.Convert(tD).Interface().(primitive.D) - - dw, err := vw.WriteDocument() - if err != nil { - return err - } - - for _, e := range d { - err = encodeElement(ec, dw, e) - if err != nil { - return err - } - } - - return dw.WriteDocumentEnd() - } - - aw, err := vw.WriteArray() - if err != nil { - return err - } - - encoder, err := ec.LookupEncoder(val.Type().Elem()) - if err != nil { - return err - } - - for idx := 0; idx < val.Len(); idx++ { - vw, err := aw.WriteArrayElement() - if err != nil { - return err - } - - err = encoder.EncodeValue(ec, vw, val.Index(idx)) - if err != nil { - return err - } - } - return aw.WriteArrayEnd() -} - -// EmptyInterfaceEncodeValue is the ValueEncoderFunc for interface{}. -func (dve DefaultValueEncoders) EmptyInterfaceEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tEmpty { - return ValueEncoderError{Name: "EmptyInterfaceEncodeValue", Types: []reflect.Type{tEmpty}, Received: val} - } - - if val.IsNil() { - return vw.WriteNull() - } - encoder, err := ec.LookupEncoder(val.Elem().Type()) - if err != nil { - return err - } - - return encoder.EncodeValue(ec, vw, val.Elem()) -} - -// ValueMarshalerEncodeValue is the ValueEncoderFunc for ValueMarshaler implementations. -func (dve DefaultValueEncoders) ValueMarshalerEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || !val.Type().Implements(tValueMarshaler) { - return ValueEncoderError{Name: "ValueMarshalerEncodeValue", Types: []reflect.Type{tValueMarshaler}, Received: val} - } - - fn := val.Convert(tValueMarshaler).MethodByName("MarshalBSONValue") - returns := fn.Call(nil) - if !returns[2].IsNil() { - return returns[2].Interface().(error) - } - t, data := returns[0].Interface().(bsontype.Type), returns[1].Interface().([]byte) - return bsonrw.Copier{}.CopyValueFromBytes(vw, t, data) -} - -// MarshalerEncodeValue is the ValueEncoderFunc for Marshaler implementations. -func (dve DefaultValueEncoders) MarshalerEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || !val.Type().Implements(tMarshaler) { - return ValueEncoderError{Name: "MarshalerEncodeValue", Types: []reflect.Type{tMarshaler}, Received: val} - } - - fn := val.Convert(tMarshaler).MethodByName("MarshalBSON") - returns := fn.Call(nil) - if !returns[1].IsNil() { - return returns[1].Interface().(error) - } - data := returns[0].Interface().([]byte) - return bsonrw.Copier{}.CopyValueFromBytes(vw, bsontype.EmbeddedDocument, data) -} - -// ProxyEncodeValue is the ValueEncoderFunc for Proxy implementations. -func (dve DefaultValueEncoders) ProxyEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || !val.Type().Implements(tProxy) { - return ValueEncoderError{Name: "ProxyEncodeValue", Types: []reflect.Type{tProxy}, Received: val} - } - - fn := val.Convert(tProxy).MethodByName("ProxyBSON") - returns := fn.Call(nil) - if !returns[1].IsNil() { - return returns[1].Interface().(error) - } - data := returns[0] - var encoder ValueEncoder - var err error - if data.Elem().IsValid() { - encoder, err = ec.LookupEncoder(data.Elem().Type()) - } else { - encoder, err = ec.LookupEncoder(nil) - } - if err != nil { - return err - } - return encoder.EncodeValue(ec, vw, data.Elem()) -} - -// JavaScriptEncodeValue is the ValueEncoderFunc for the primitive.JavaScript type. -func (DefaultValueEncoders) JavaScriptEncodeValue(ectx EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tJavaScript { - return ValueEncoderError{Name: "JavaScriptEncodeValue", Types: []reflect.Type{tJavaScript}, Received: val} - } - - return vw.WriteJavascript(val.String()) -} - -// SymbolEncodeValue is the ValueEncoderFunc for the primitive.Symbol type. -func (DefaultValueEncoders) SymbolEncodeValue(ectx EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tSymbol { - return ValueEncoderError{Name: "SymbolEncodeValue", Types: []reflect.Type{tSymbol}, Received: val} - } - - return vw.WriteSymbol(val.String()) -} - -// BinaryEncodeValue is the ValueEncoderFunc for Binary. -func (DefaultValueEncoders) BinaryEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tBinary { - return ValueEncoderError{Name: "BinaryEncodeValue", Types: []reflect.Type{tBinary}, Received: val} - } - b := val.Interface().(primitive.Binary) - - return vw.WriteBinaryWithSubtype(b.Data, b.Subtype) -} - -// UndefinedEncodeValue is the ValueEncoderFunc for Undefined. -func (DefaultValueEncoders) UndefinedEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tUndefined { - return ValueEncoderError{Name: "UndefinedEncodeValue", Types: []reflect.Type{tUndefined}, Received: val} - } - - return vw.WriteUndefined() -} - -// DateTimeEncodeValue is the ValueEncoderFunc for DateTime. -func (DefaultValueEncoders) DateTimeEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tDateTime { - return ValueEncoderError{Name: "DateTimeEncodeValue", Types: []reflect.Type{tDateTime}, Received: val} - } - - return vw.WriteDateTime(val.Int()) -} - -// NullEncodeValue is the ValueEncoderFunc for Null. -func (DefaultValueEncoders) NullEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tNull { - return ValueEncoderError{Name: "NullEncodeValue", Types: []reflect.Type{tNull}, Received: val} - } - - return vw.WriteNull() -} - -// RegexEncodeValue is the ValueEncoderFunc for Regex. -func (DefaultValueEncoders) RegexEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tRegex { - return ValueEncoderError{Name: "RegexEncodeValue", Types: []reflect.Type{tRegex}, Received: val} - } - - regex := val.Interface().(primitive.Regex) - - return vw.WriteRegex(regex.Pattern, regex.Options) -} - -// DBPointerEncodeValue is the ValueEncoderFunc for DBPointer. -func (DefaultValueEncoders) DBPointerEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tDBPointer { - return ValueEncoderError{Name: "DBPointerEncodeValue", Types: []reflect.Type{tDBPointer}, Received: val} - } - - dbp := val.Interface().(primitive.DBPointer) - - return vw.WriteDBPointer(dbp.DB, dbp.Pointer) -} - -// TimestampEncodeValue is the ValueEncoderFunc for Timestamp. -func (DefaultValueEncoders) TimestampEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tTimestamp { - return ValueEncoderError{Name: "TimestampEncodeValue", Types: []reflect.Type{tTimestamp}, Received: val} - } - - ts := val.Interface().(primitive.Timestamp) - - return vw.WriteTimestamp(ts.T, ts.I) -} - -// MinKeyEncodeValue is the ValueEncoderFunc for MinKey. -func (DefaultValueEncoders) MinKeyEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tMinKey { - return ValueEncoderError{Name: "MinKeyEncodeValue", Types: []reflect.Type{tMinKey}, Received: val} - } - - return vw.WriteMinKey() -} - -// MaxKeyEncodeValue is the ValueEncoderFunc for MaxKey. -func (DefaultValueEncoders) MaxKeyEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tMaxKey { - return ValueEncoderError{Name: "MaxKeyEncodeValue", Types: []reflect.Type{tMaxKey}, Received: val} - } - - return vw.WriteMaxKey() -} - -// CoreDocumentEncodeValue is the ValueEncoderFunc for bsoncore.Document. -func (DefaultValueEncoders) CoreDocumentEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tCoreDocument { - return ValueEncoderError{Name: "CoreDocumentEncodeValue", Types: []reflect.Type{tCoreDocument}, Received: val} - } - - cdoc := val.Interface().(bsoncore.Document) - - return bsonrw.Copier{}.CopyDocumentFromBytes(vw, cdoc) -} - -// CodeWithScopeEncodeValue is the ValueEncoderFunc for CodeWithScope. -func (dve DefaultValueEncoders) CodeWithScopeEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Type() != tCodeWithScope { - return ValueEncoderError{Name: "CodeWithScopeEncodeValue", Types: []reflect.Type{tCodeWithScope}, Received: val} - } - - cws := val.Interface().(primitive.CodeWithScope) - - dw, err := vw.WriteCodeWithScope(string(cws.Code)) - if err != nil { - return err - } - - sw := sliceWriterPool.Get().(*bsonrw.SliceWriter) - defer sliceWriterPool.Put(sw) - *sw = (*sw)[:0] - - scopeVW := bvwPool.Get(sw) - defer bvwPool.Put(scopeVW) - - encoder, err := ec.LookupEncoder(reflect.TypeOf(cws.Scope)) - if err != nil { - return err - } - - err = encoder.EncodeValue(ec, scopeVW, reflect.ValueOf(cws.Scope)) - if err != nil { - return err - } - - err = bsonrw.Copier{}.CopyBytesToDocumentWriter(dw, *sw) - if err != nil { - return err - } - return dw.WriteDocumentEnd() -} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/doc.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/doc.go deleted file mode 100644 index 978511cbfa..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/doc.go +++ /dev/null @@ -1,61 +0,0 @@ -// Package bsoncodec provides a system for encoding values to BSON representations and decoding -// values from BSON representations. This package considers both binary BSON and ExtendedJSON as -// BSON representations. The types in this package enable a flexible system for handling this -// encoding and decoding. -// -// The codec system is composed of two parts: -// -// 1) ValueEncoders and ValueDecoders that handle encoding and decoding Go values to and from BSON -// representations. -// -// 2) A Registry that holds these ValueEncoders and ValueDecoders and provides methods for -// retrieving them. -// -// ValueEncoders and ValueDecoders -// -// The ValueEncoder interface is implemented by types that can encode a provided Go type to BSON. -// The value to encode is provided as a reflect.Value and a bsonrw.ValueWriter is used within the -// EncodeValue method to actually create the BSON representation. For convenience, ValueEncoderFunc -// is provided to allow use of a function with the correct signature as a ValueEncoder. An -// EncodeContext instance is provided to allow implementations to lookup further ValueEncoders and -// to provide configuration information. -// -// The ValueDecoder interface is the inverse of the ValueEncoder. Implementations should ensure that -// the value they receive is settable. Similar to ValueEncoderFunc, ValueDecoderFunc is provided to -// allow the use of a function with the correct signature as a ValueDecoder. A DecodeContext -// instance is provided and serves similar functionality to the EncodeContext. -// -// Registry and RegistryBuilder -// -// A Registry is an immutable store for ValueEncoders, ValueDecoders, and a type map. For looking up -// ValueEncoders and Decoders the Registry first attempts to find a ValueEncoder or ValueDecoder for -// the type provided; if one cannot be found it then checks to see if a registered ValueEncoder or -// ValueDecoder exists for an interface the type implements. Finally, the reflect.Kind of the type -// is used to lookup a default ValueEncoder or ValueDecoder for that kind. If no ValueEncoder or -// ValueDecoder can be found, an error is returned. -// -// The Registry also holds a type map. This allows users to retrieve the Go type that should be used -// when decoding a BSON value into an empty interface. This is primarily only used for the empty -// interface ValueDecoder. -// -// A RegistryBuilder is used to construct a Registry. The Register methods are used to associate -// either a reflect.Type or a reflect.Kind with a ValueEncoder or ValueDecoder. A RegistryBuilder -// returned from NewRegistryBuilder contains no registered ValueEncoders nor ValueDecoders and -// contains an empty type map. -// -// The RegisterTypeMapEntry method handles associating a BSON type with a Go type. For example, if -// you want to decode BSON int64 and int32 values into Go int instances, you would do the following: -// -// var regbuilder *RegistryBuilder = ... intType := reflect.TypeOf(int(0)) -// regbuilder.RegisterTypeMapEntry(bsontype.Int64, intType).RegisterTypeMapEntry(bsontype.Int32, -// intType) -// -// DefaultValueEncoders and DefaultValueDecoders -// -// The DefaultValueEncoders and DefaultValueDecoders types provide a full set of ValueEncoders and -// ValueDecoders for handling a wide range of Go types, including all of the types within the -// primitive package. To make registering these codecs easier, a helper method on each type is -// provided. For the DefaultValueEncoders type the method is called RegisterDefaultEncoders and for -// the DefaultValueDecoders type the method is called RegisterDefaultDecoders, this method also -// handles registering type map entries for each BSON type. -package bsoncodec diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/mode.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/mode.go deleted file mode 100644 index fbd9f0a9e9..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/mode.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 - -package bsoncodec - -import "fmt" - -type mode int - -const ( - _ mode = iota - mTopLevel - mDocument - mArray - mValue - mElement - mCodeWithScope - mSpacer -) - -func (m mode) String() string { - var str string - - switch m { - case mTopLevel: - str = "TopLevel" - case mDocument: - str = "DocumentMode" - case mArray: - str = "ArrayMode" - case mValue: - str = "ValueMode" - case mElement: - str = "ElementMode" - case mCodeWithScope: - str = "CodeWithScopeMode" - case mSpacer: - str = "CodeWithScopeSpacerFrame" - default: - str = "UnknownMode" - } - - return str -} - -// TransitionError is an error returned when an invalid progressing a -// ValueReader or ValueWriter state machine occurs. -type TransitionError struct { - parent mode - current mode - destination mode -} - -func (te TransitionError) Error() string { - if te.destination == mode(0) { - return fmt.Sprintf("invalid state transition: cannot read/write value while in %s", te.current) - } - if te.parent == mode(0) { - return fmt.Sprintf("invalid state transition: %s -> %s", te.current, te.destination) - } - return fmt.Sprintf("invalid state transition: %s -> %s; parent %s", te.current, te.destination, te.parent) -} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/pointer_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/pointer_codec.go deleted file mode 100644 index 0d9502f214..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/pointer_codec.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 - -package bsoncodec - -import ( - "reflect" - "sync" - - "go.mongodb.org/mongo-driver/bson/bsonrw" - "go.mongodb.org/mongo-driver/bson/bsontype" -) - -var defaultPointerCodec = &PointerCodec{ - ecache: make(map[reflect.Type]ValueEncoder), - dcache: make(map[reflect.Type]ValueDecoder), -} - -var _ ValueEncoder = &PointerCodec{} -var _ ValueDecoder = &PointerCodec{} - -// PointerCodec is the Codec used for pointers. -type PointerCodec struct { - ecache map[reflect.Type]ValueEncoder - dcache map[reflect.Type]ValueDecoder - l sync.RWMutex -} - -// NewPointerCodec returns a PointerCodec that has been initialized. -func NewPointerCodec() *PointerCodec { - return &PointerCodec{ - ecache: make(map[reflect.Type]ValueEncoder), - dcache: make(map[reflect.Type]ValueDecoder), - } -} - -// EncodeValue handles encoding a pointer by either encoding it to BSON Null if the pointer is nil -// or looking up an encoder for the type of value the pointer points to. -func (pc *PointerCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if val.Kind() != reflect.Ptr { - if !val.IsValid() { - return vw.WriteNull() - } - return ValueEncoderError{Name: "PointerCodec.EncodeValue", Kinds: []reflect.Kind{reflect.Ptr}, Received: val} - } - - if val.IsNil() { - return vw.WriteNull() - } - - pc.l.RLock() - enc, ok := pc.ecache[val.Type()] - pc.l.RUnlock() - if ok { - if enc == nil { - return ErrNoEncoder{Type: val.Type()} - } - return enc.EncodeValue(ec, vw, val.Elem()) - } - - enc, err := ec.LookupEncoder(val.Type().Elem()) - pc.l.Lock() - pc.ecache[val.Type()] = enc - pc.l.Unlock() - if err != nil { - return err - } - - return enc.EncodeValue(ec, vw, val.Elem()) -} - -// DecodeValue handles decoding a pointer by looking up a decoder for the type it points to and -// using that to decode. If the BSON value is Null, this method will set the pointer to nil. -func (pc *PointerCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Kind() != reflect.Ptr { - return ValueDecoderError{Name: "PointerCodec.DecodeValue", Kinds: []reflect.Kind{reflect.Ptr}, Received: val} - } - - if vr.Type() == bsontype.Null { - val.Set(reflect.Zero(val.Type())) - return vr.ReadNull() - } - - if val.IsNil() { - val.Set(reflect.New(val.Type().Elem())) - } - - pc.l.RLock() - dec, ok := pc.dcache[val.Type()] - pc.l.RUnlock() - if ok { - if dec == nil { - return ErrNoDecoder{Type: val.Type()} - } - return dec.DecodeValue(dc, vr, val.Elem()) - } - - dec, err := dc.LookupDecoder(val.Type().Elem()) - pc.l.Lock() - pc.dcache[val.Type()] = dec - pc.l.Unlock() - if err != nil { - return err - } - - return dec.DecodeValue(dc, vr, val.Elem()) -} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/proxy.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/proxy.go deleted file mode 100644 index 4cf2b01ab4..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/proxy.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 - -package bsoncodec - -// Proxy is an interface implemented by types that cannot themselves be directly encoded. Types -// that implement this interface with have ProxyBSON called during the encoding process and that -// value will be encoded in place for the implementer. -type Proxy interface { - ProxyBSON() (interface{}, error) -} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/registry.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/registry.go deleted file mode 100644 index 42e362b6ad..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/registry.go +++ /dev/null @@ -1,384 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 - -package bsoncodec - -import ( - "errors" - "reflect" - "sync" - - "go.mongodb.org/mongo-driver/bson/bsontype" -) - -// ErrNilType is returned when nil is passed to either LookupEncoder or LookupDecoder. -var ErrNilType = errors.New("cannot perform a decoder lookup on ") - -// ErrNotPointer is returned when a non-pointer type is provided to LookupDecoder. -var ErrNotPointer = errors.New("non-pointer provided to LookupDecoder") - -// ErrNoEncoder is returned when there wasn't an encoder available for a type. -type ErrNoEncoder struct { - Type reflect.Type -} - -func (ene ErrNoEncoder) Error() string { - if ene.Type == nil { - return "no encoder found for " - } - return "no encoder found for " + ene.Type.String() -} - -// ErrNoDecoder is returned when there wasn't a decoder available for a type. -type ErrNoDecoder struct { - Type reflect.Type -} - -func (end ErrNoDecoder) Error() string { - return "no decoder found for " + end.Type.String() -} - -// ErrNoTypeMapEntry is returned when there wasn't a type available for the provided BSON type. -type ErrNoTypeMapEntry struct { - Type bsontype.Type -} - -func (entme ErrNoTypeMapEntry) Error() string { - return "no type map entry found for " + entme.Type.String() -} - -// ErrNotInterface is returned when the provided type is not an interface. -var ErrNotInterface = errors.New("The provided type is not an interface") - -var defaultRegistry *Registry - -func init() { - defaultRegistry = buildDefaultRegistry() -} - -// A RegistryBuilder is used to build a Registry. This type is not goroutine -// safe. -type RegistryBuilder struct { - typeEncoders map[reflect.Type]ValueEncoder - interfaceEncoders []interfaceValueEncoder - kindEncoders map[reflect.Kind]ValueEncoder - - typeDecoders map[reflect.Type]ValueDecoder - interfaceDecoders []interfaceValueDecoder - kindDecoders map[reflect.Kind]ValueDecoder - - typeMap map[bsontype.Type]reflect.Type -} - -// A Registry is used to store and retrieve codecs for types and interfaces. This type is the main -// typed passed around and Encoders and Decoders are constructed from it. -type Registry struct { - typeEncoders map[reflect.Type]ValueEncoder - typeDecoders map[reflect.Type]ValueDecoder - - interfaceEncoders []interfaceValueEncoder - interfaceDecoders []interfaceValueDecoder - - kindEncoders map[reflect.Kind]ValueEncoder - kindDecoders map[reflect.Kind]ValueDecoder - - typeMap map[bsontype.Type]reflect.Type - - mu sync.RWMutex -} - -// NewRegistryBuilder creates a new empty RegistryBuilder. -func NewRegistryBuilder() *RegistryBuilder { - return &RegistryBuilder{ - typeEncoders: make(map[reflect.Type]ValueEncoder), - typeDecoders: make(map[reflect.Type]ValueDecoder), - - interfaceEncoders: make([]interfaceValueEncoder, 0), - interfaceDecoders: make([]interfaceValueDecoder, 0), - - kindEncoders: make(map[reflect.Kind]ValueEncoder), - kindDecoders: make(map[reflect.Kind]ValueDecoder), - - typeMap: make(map[bsontype.Type]reflect.Type), - } -} - -func buildDefaultRegistry() *Registry { - rb := NewRegistryBuilder() - defaultValueEncoders.RegisterDefaultEncoders(rb) - defaultValueDecoders.RegisterDefaultDecoders(rb) - return rb.Build() -} - -// RegisterCodec will register the provided ValueCodec for the provided type. -func (rb *RegistryBuilder) RegisterCodec(t reflect.Type, codec ValueCodec) *RegistryBuilder { - rb.RegisterEncoder(t, codec) - rb.RegisterDecoder(t, codec) - return rb -} - -// RegisterEncoder will register the provided ValueEncoder to the provided type. -// -// The type registered will be used directly, so an encoder can be registered for a type and a -// different encoder can be registered for a pointer to that type. -func (rb *RegistryBuilder) RegisterEncoder(t reflect.Type, enc ValueEncoder) *RegistryBuilder { - if t == tEmpty { - rb.typeEncoders[t] = enc - return rb - } - switch t.Kind() { - case reflect.Interface: - for idx, ir := range rb.interfaceEncoders { - if ir.i == t { - rb.interfaceEncoders[idx].ve = enc - return rb - } - } - - rb.interfaceEncoders = append(rb.interfaceEncoders, interfaceValueEncoder{i: t, ve: enc}) - default: - rb.typeEncoders[t] = enc - } - return rb -} - -// RegisterDecoder will register the provided ValueDecoder to the provided type. -// -// The type registered will be used directly, so a decoder can be registered for a type and a -// different decoder can be registered for a pointer to that type. -func (rb *RegistryBuilder) RegisterDecoder(t reflect.Type, dec ValueDecoder) *RegistryBuilder { - if t == nil { - rb.typeDecoders[nil] = dec - return rb - } - if t == tEmpty { - rb.typeDecoders[t] = dec - return rb - } - switch t.Kind() { - case reflect.Interface: - for idx, ir := range rb.interfaceDecoders { - if ir.i == t { - rb.interfaceDecoders[idx].vd = dec - return rb - } - } - - rb.interfaceDecoders = append(rb.interfaceDecoders, interfaceValueDecoder{i: t, vd: dec}) - default: - rb.typeDecoders[t] = dec - } - return rb -} - -// RegisterDefaultEncoder will registr the provided ValueEncoder to the provided -// kind. -func (rb *RegistryBuilder) RegisterDefaultEncoder(kind reflect.Kind, enc ValueEncoder) *RegistryBuilder { - rb.kindEncoders[kind] = enc - return rb -} - -// RegisterDefaultDecoder will register the provided ValueDecoder to the -// provided kind. -func (rb *RegistryBuilder) RegisterDefaultDecoder(kind reflect.Kind, dec ValueDecoder) *RegistryBuilder { - rb.kindDecoders[kind] = dec - return rb -} - -// RegisterTypeMapEntry will register the provided type to the BSON type. The primary usage for this -// mapping is decoding situations where an empty interface is used and a default type needs to be -// created and decoded into. -// -// NOTE: It is unlikely that registering a type for BSON Embedded Document is actually desired. By -// registering a type map entry for BSON Embedded Document the type registered will be used in any -// case where a BSON Embedded Document will be decoded into an empty interface. For example, if you -// register primitive.M, the EmptyInterface decoder will always use primitive.M, even if an ancestor -// was a primitive.D. -func (rb *RegistryBuilder) RegisterTypeMapEntry(bt bsontype.Type, rt reflect.Type) *RegistryBuilder { - rb.typeMap[bt] = rt - return rb -} - -// Build creates a Registry from the current state of this RegistryBuilder. -func (rb *RegistryBuilder) Build() *Registry { - registry := new(Registry) - - registry.typeEncoders = make(map[reflect.Type]ValueEncoder) - for t, enc := range rb.typeEncoders { - registry.typeEncoders[t] = enc - } - - registry.typeDecoders = make(map[reflect.Type]ValueDecoder) - for t, dec := range rb.typeDecoders { - registry.typeDecoders[t] = dec - } - - registry.interfaceEncoders = make([]interfaceValueEncoder, len(rb.interfaceEncoders)) - copy(registry.interfaceEncoders, rb.interfaceEncoders) - - registry.interfaceDecoders = make([]interfaceValueDecoder, len(rb.interfaceDecoders)) - copy(registry.interfaceDecoders, rb.interfaceDecoders) - - registry.kindEncoders = make(map[reflect.Kind]ValueEncoder) - for kind, enc := range rb.kindEncoders { - registry.kindEncoders[kind] = enc - } - - registry.kindDecoders = make(map[reflect.Kind]ValueDecoder) - for kind, dec := range rb.kindDecoders { - registry.kindDecoders[kind] = dec - } - - registry.typeMap = make(map[bsontype.Type]reflect.Type) - for bt, rt := range rb.typeMap { - registry.typeMap[bt] = rt - } - - return registry -} - -// LookupEncoder will inspect the registry for an encoder that satisfies the -// type provided. An encoder registered for a specific type will take -// precedence over an encoder registered for an interface the type satisfies, -// which takes precedence over an encoder for the reflect.Kind of the value. If -// no encoder can be found, an error is returned. -func (r *Registry) LookupEncoder(t reflect.Type) (ValueEncoder, error) { - encodererr := ErrNoEncoder{Type: t} - r.mu.RLock() - enc, found := r.lookupTypeEncoder(t) - r.mu.RUnlock() - if found { - if enc == nil { - return nil, ErrNoEncoder{Type: t} - } - return enc, nil - } - - enc, found = r.lookupInterfaceEncoder(t) - if found { - r.mu.Lock() - r.typeEncoders[t] = enc - r.mu.Unlock() - return enc, nil - } - - if t == nil { - r.mu.Lock() - r.typeEncoders[t] = nil - r.mu.Unlock() - return nil, encodererr - } - - enc, found = r.kindEncoders[t.Kind()] - if !found { - r.mu.Lock() - r.typeEncoders[t] = nil - r.mu.Unlock() - return nil, encodererr - } - - r.mu.Lock() - r.typeEncoders[t] = enc - r.mu.Unlock() - return enc, nil -} - -func (r *Registry) lookupTypeEncoder(t reflect.Type) (ValueEncoder, bool) { - enc, found := r.typeEncoders[t] - return enc, found -} - -func (r *Registry) lookupInterfaceEncoder(t reflect.Type) (ValueEncoder, bool) { - if t == nil { - return nil, false - } - for _, ienc := range r.interfaceEncoders { - if !t.Implements(ienc.i) { - continue - } - - return ienc.ve, true - } - return nil, false -} - -// LookupDecoder will inspect the registry for a decoder that satisfies the -// type provided. A decoder registered for a specific type will take -// precedence over a decoder registered for an interface the type satisfies, -// which takes precedence over a decoder for the reflect.Kind of the value. If -// no decoder can be found, an error is returned. -func (r *Registry) LookupDecoder(t reflect.Type) (ValueDecoder, error) { - if t == nil { - return nil, ErrNilType - } - decodererr := ErrNoDecoder{Type: t} - r.mu.RLock() - dec, found := r.lookupTypeDecoder(t) - r.mu.RUnlock() - if found { - if dec == nil { - return nil, ErrNoDecoder{Type: t} - } - return dec, nil - } - - dec, found = r.lookupInterfaceDecoder(t) - if found { - r.mu.Lock() - r.typeDecoders[t] = dec - r.mu.Unlock() - return dec, nil - } - - dec, found = r.kindDecoders[t.Kind()] - if !found { - r.mu.Lock() - r.typeDecoders[t] = nil - r.mu.Unlock() - return nil, decodererr - } - - r.mu.Lock() - r.typeDecoders[t] = dec - r.mu.Unlock() - return dec, nil -} - -func (r *Registry) lookupTypeDecoder(t reflect.Type) (ValueDecoder, bool) { - dec, found := r.typeDecoders[t] - return dec, found -} - -func (r *Registry) lookupInterfaceDecoder(t reflect.Type) (ValueDecoder, bool) { - for _, idec := range r.interfaceDecoders { - if !t.Implements(idec.i) && !reflect.PtrTo(t).Implements(idec.i) { - continue - } - - return idec.vd, true - } - return nil, false -} - -// LookupTypeMapEntry inspects the registry's type map for a Go type for the corresponding BSON -// type. If no type is found, ErrNoTypeMapEntry is returned. -func (r *Registry) LookupTypeMapEntry(bt bsontype.Type) (reflect.Type, error) { - t, ok := r.typeMap[bt] - if !ok || t == nil { - return nil, ErrNoTypeMapEntry{Type: bt} - } - return t, nil -} - -type interfaceValueEncoder struct { - i reflect.Type - ve ValueEncoder -} - -type interfaceValueDecoder struct { - i reflect.Type - vd ValueDecoder -} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_codec.go deleted file mode 100644 index 56eeff94b1..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_codec.go +++ /dev/null @@ -1,367 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 - -package bsoncodec - -import ( - "errors" - "fmt" - "reflect" - "strings" - "sync" - - "go.mongodb.org/mongo-driver/bson/bsonrw" - "go.mongodb.org/mongo-driver/bson/bsontype" -) - -var defaultStructCodec = &StructCodec{ - cache: make(map[reflect.Type]*structDescription), - parser: DefaultStructTagParser, -} - -// Zeroer allows custom struct types to implement a report of zero -// state. All struct types that don't implement Zeroer or where IsZero -// returns false are considered to be not zero. -type Zeroer interface { - IsZero() bool -} - -// StructCodec is the Codec used for struct values. -type StructCodec struct { - cache map[reflect.Type]*structDescription - l sync.RWMutex - parser StructTagParser -} - -var _ ValueEncoder = &StructCodec{} -var _ ValueDecoder = &StructCodec{} - -// NewStructCodec returns a StructCodec that uses p for struct tag parsing. -func NewStructCodec(p StructTagParser) (*StructCodec, error) { - if p == nil { - return nil, errors.New("a StructTagParser must be provided to NewStructCodec") - } - - return &StructCodec{ - cache: make(map[reflect.Type]*structDescription), - parser: p, - }, nil -} - -// EncodeValue handles encoding generic struct types. -func (sc *StructCodec) EncodeValue(r EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || val.Kind() != reflect.Struct { - return ValueEncoderError{Name: "StructCodec.EncodeValue", Kinds: []reflect.Kind{reflect.Struct}, Received: val} - } - - sd, err := sc.describeStruct(r.Registry, val.Type()) - if err != nil { - return err - } - - dw, err := vw.WriteDocument() - if err != nil { - return err - } - var rv reflect.Value - for _, desc := range sd.fl { - if desc.inline == nil { - rv = val.Field(desc.idx) - } else { - rv = val.FieldByIndex(desc.inline) - } - - if desc.encoder == nil { - return ErrNoEncoder{Type: rv.Type()} - } - - encoder := desc.encoder - - iszero := sc.isZero - if iz, ok := encoder.(CodecZeroer); ok { - iszero = iz.IsTypeZero - } - - if desc.omitEmpty && iszero(rv.Interface()) { - continue - } - - vw2, err := dw.WriteDocumentElement(desc.name) - if err != nil { - return err - } - - ectx := EncodeContext{Registry: r.Registry, MinSize: desc.minSize} - err = encoder.EncodeValue(ectx, vw2, rv) - if err != nil { - return err - } - } - - if sd.inlineMap >= 0 { - rv := val.Field(sd.inlineMap) - collisionFn := func(key string) bool { - _, exists := sd.fm[key] - return exists - } - - return defaultValueEncoders.mapEncodeValue(r, dw, rv, collisionFn) - } - - return dw.WriteDocumentEnd() -} - -// DecodeValue implements the Codec interface. -// By default, map types in val will not be cleared. If a map has existing key/value pairs, it will be extended with the new ones from vr. -// For slices, the decoder will set the length of the slice to zero and append all elements. The underlying array will not be cleared. -func (sc *StructCodec) DecodeValue(r DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if !val.CanSet() || val.Kind() != reflect.Struct { - return ValueDecoderError{Name: "StructCodec.DecodeValue", Kinds: []reflect.Kind{reflect.Struct}, Received: val} - } - - switch vr.Type() { - case bsontype.Type(0), bsontype.EmbeddedDocument: - default: - return fmt.Errorf("cannot decode %v into a %s", vr.Type(), val.Type()) - } - - sd, err := sc.describeStruct(r.Registry, val.Type()) - if err != nil { - return err - } - - var decoder ValueDecoder - var inlineMap reflect.Value - if sd.inlineMap >= 0 { - inlineMap = val.Field(sd.inlineMap) - if inlineMap.IsNil() { - inlineMap.Set(reflect.MakeMap(inlineMap.Type())) - } - decoder, err = r.LookupDecoder(inlineMap.Type().Elem()) - if err != nil { - return err - } - } - - dr, err := vr.ReadDocument() - if err != nil { - return err - } - - for { - name, vr, err := dr.ReadElement() - if err == bsonrw.ErrEOD { - break - } - if err != nil { - return err - } - - fd, exists := sd.fm[name] - if !exists { - // if the original name isn't found in the struct description, try again with the name in lowercase - // this could match if a BSON tag isn't specified because by default, describeStruct lowercases all field - // names - fd, exists = sd.fm[strings.ToLower(name)] - } - - if !exists { - if sd.inlineMap < 0 { - // The encoding/json package requires a flag to return on error for non-existent fields. - // This functionality seems appropriate for the struct codec. - err = vr.Skip() - if err != nil { - return err - } - continue - } - - elem := reflect.New(inlineMap.Type().Elem()).Elem() - err = decoder.DecodeValue(r, vr, elem) - if err != nil { - return err - } - inlineMap.SetMapIndex(reflect.ValueOf(name), elem) - continue - } - - var field reflect.Value - if fd.inline == nil { - field = val.Field(fd.idx) - } else { - field = val.FieldByIndex(fd.inline) - } - - if !field.CanSet() { // Being settable is a super set of being addressable. - return fmt.Errorf("cannot decode element '%s' into field %v; it is not settable", name, field) - } - if field.Kind() == reflect.Ptr && field.IsNil() { - field.Set(reflect.New(field.Type().Elem())) - } - field = field.Addr() - - dctx := DecodeContext{Registry: r.Registry, Truncate: fd.truncate || r.Truncate} - if fd.decoder == nil { - return ErrNoDecoder{Type: field.Elem().Type()} - } - - if decoder, ok := fd.decoder.(ValueDecoder); ok { - err = decoder.DecodeValue(dctx, vr, field.Elem()) - if err != nil { - return err - } - continue - } - err = fd.decoder.DecodeValue(dctx, vr, field) - if err != nil { - return err - } - } - - return nil -} - -func (sc *StructCodec) isZero(i interface{}) bool { - v := reflect.ValueOf(i) - - // check the value validity - if !v.IsValid() { - return true - } - - if z, ok := v.Interface().(Zeroer); ok && (v.Kind() != reflect.Ptr || !v.IsNil()) { - return z.IsZero() - } - - switch v.Kind() { - case reflect.Array, reflect.Map, reflect.Slice, 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.Ptr: - return v.IsNil() - } - - return false -} - -type structDescription struct { - fm map[string]fieldDescription - fl []fieldDescription - inlineMap int -} - -type fieldDescription struct { - name string - idx int - omitEmpty bool - minSize bool - truncate bool - inline []int - encoder ValueEncoder - decoder ValueDecoder -} - -func (sc *StructCodec) describeStruct(r *Registry, t reflect.Type) (*structDescription, error) { - // We need to analyze the struct, including getting the tags, collecting - // information about inlining, and create a map of the field name to the field. - sc.l.RLock() - ds, exists := sc.cache[t] - sc.l.RUnlock() - if exists { - return ds, nil - } - - numFields := t.NumField() - sd := &structDescription{ - fm: make(map[string]fieldDescription, numFields), - fl: make([]fieldDescription, 0, numFields), - inlineMap: -1, - } - - for i := 0; i < numFields; i++ { - sf := t.Field(i) - if sf.PkgPath != "" { - // unexported, ignore - continue - } - - encoder, err := r.LookupEncoder(sf.Type) - if err != nil { - encoder = nil - } - decoder, err := r.LookupDecoder(sf.Type) - if err != nil { - decoder = nil - } - - description := fieldDescription{idx: i, encoder: encoder, decoder: decoder} - - stags, err := sc.parser.ParseStructTags(sf) - if err != nil { - return nil, err - } - if stags.Skip { - continue - } - description.name = stags.Name - description.omitEmpty = stags.OmitEmpty - description.minSize = stags.MinSize - description.truncate = stags.Truncate - - if stags.Inline { - switch sf.Type.Kind() { - case reflect.Map: - if sd.inlineMap >= 0 { - return nil, errors.New("(struct " + t.String() + ") multiple inline maps") - } - if sf.Type.Key() != tString { - return nil, errors.New("(struct " + t.String() + ") inline map must have a string keys") - } - sd.inlineMap = description.idx - case reflect.Struct: - inlinesf, err := sc.describeStruct(r, sf.Type) - if err != nil { - return nil, err - } - for _, fd := range inlinesf.fl { - if _, exists := sd.fm[fd.name]; exists { - return nil, fmt.Errorf("(struct %s) duplicated key %s", t.String(), fd.name) - } - if fd.inline == nil { - fd.inline = []int{i, fd.idx} - } else { - fd.inline = append([]int{i}, fd.inline...) - } - sd.fm[fd.name] = fd - sd.fl = append(sd.fl, fd) - } - default: - return nil, fmt.Errorf("(struct %s) inline fields must be either a struct or a map", t.String()) - } - continue - } - - if _, exists := sd.fm[description.name]; exists { - return nil, fmt.Errorf("struct %s) duplicated key %s", t.String(), description.name) - } - - sd.fm[description.name] = description - sd.fl = append(sd.fl, description) - } - - sc.l.Lock() - sc.cache[t] = sd - sc.l.Unlock() - - return sd, nil -} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_tag_parser.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_tag_parser.go deleted file mode 100644 index 69d0ae4d06..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_tag_parser.go +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 - -package bsoncodec - -import ( - "reflect" - "strings" -) - -// StructTagParser returns the struct tags for a given struct field. -type StructTagParser interface { - ParseStructTags(reflect.StructField) (StructTags, error) -} - -// StructTagParserFunc is an adapter that allows a generic function to be used -// as a StructTagParser. -type StructTagParserFunc func(reflect.StructField) (StructTags, error) - -// ParseStructTags implements the StructTagParser interface. -func (stpf StructTagParserFunc) ParseStructTags(sf reflect.StructField) (StructTags, error) { - return stpf(sf) -} - -// StructTags represents the struct tag fields that the StructCodec uses during -// the encoding and decoding process. -// -// In the case of a struct, the lowercased field name is used as the key for each exported -// field but this behavior may be changed using a struct tag. The tag may also contain flags to -// adjust the marshalling behavior for the field. -// -// The properties are defined below: -// -// OmitEmpty Only include the field if it's not set to the zero value for the type or to -// empty slices or maps. -// -// MinSize Marshal an integer of a type larger than 32 bits value as an int32, if that's -// feasible while preserving the numeric value. -// -// Truncate When unmarshaling a BSON double, it is permitted to lose precision to fit within -// a float32. -// -// Inline Inline the field, which must be a struct or a map, causing all of its fields -// or keys to be processed as if they were part of the outer struct. For maps, -// keys must not conflict with the bson keys of other struct fields. -// -// Skip This struct field should be skipped. This is usually denoted by parsing a "-" -// for the name. -// -// TODO(skriptble): Add tags for undefined as nil and for null as nil. -type StructTags struct { - Name string - OmitEmpty bool - MinSize bool - Truncate bool - Inline bool - Skip bool -} - -// DefaultStructTagParser is the StructTagParser used by the StructCodec by default. -// It will handle the bson struct tag. See the documentation for StructTags to see -// what each of the returned fields means. -// -// If there is no name in the struct tag fields, the struct field name is lowercased. -// The tag formats accepted are: -// -// "[][,[,]]" -// -// `(...) bson:"[][,[,]]" (...)` -// -// An example: -// -// type T struct { -// A bool -// B int "myb" -// C string "myc,omitempty" -// D string `bson:",omitempty" json:"jsonkey"` -// E int64 ",minsize" -// F int64 "myf,omitempty,minsize" -// } -// -// A struct tag either consisting entirely of '-' or with a bson key with a -// value consisting entirely of '-' will return a StructTags with Skip true and -// the remaining fields will be their default values. -var DefaultStructTagParser StructTagParserFunc = func(sf reflect.StructField) (StructTags, error) { - key := strings.ToLower(sf.Name) - tag, ok := sf.Tag.Lookup("bson") - if !ok && !strings.Contains(string(sf.Tag), ":") && len(sf.Tag) > 0 { - tag = string(sf.Tag) - } - var st StructTags - if tag == "-" { - st.Skip = true - return st, nil - } - - for idx, str := range strings.Split(tag, ",") { - if idx == 0 && str != "" { - key = str - } - switch str { - case "omitempty": - st.OmitEmpty = true - case "minsize": - st.MinSize = true - case "truncate": - st.Truncate = true - case "inline": - st.Inline = true - } - } - - st.Name = key - - return st, nil -} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/types.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/types.go deleted file mode 100644 index 77264876aa..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/types.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 - -package bsoncodec - -import ( - "encoding/json" - "net/url" - "reflect" - "time" - - "go.mongodb.org/mongo-driver/bson/primitive" - "go.mongodb.org/mongo-driver/x/bsonx/bsoncore" -) - -var ptBool = reflect.TypeOf((*bool)(nil)) -var ptInt8 = reflect.TypeOf((*int8)(nil)) -var ptInt16 = reflect.TypeOf((*int16)(nil)) -var ptInt32 = reflect.TypeOf((*int32)(nil)) -var ptInt64 = reflect.TypeOf((*int64)(nil)) -var ptInt = reflect.TypeOf((*int)(nil)) -var ptUint8 = reflect.TypeOf((*uint8)(nil)) -var ptUint16 = reflect.TypeOf((*uint16)(nil)) -var ptUint32 = reflect.TypeOf((*uint32)(nil)) -var ptUint64 = reflect.TypeOf((*uint64)(nil)) -var ptUint = reflect.TypeOf((*uint)(nil)) -var ptFloat32 = reflect.TypeOf((*float32)(nil)) -var ptFloat64 = reflect.TypeOf((*float64)(nil)) -var ptString = reflect.TypeOf((*string)(nil)) - -var tBool = reflect.TypeOf(false) -var tFloat32 = reflect.TypeOf(float32(0)) -var tFloat64 = reflect.TypeOf(float64(0)) -var tInt = reflect.TypeOf(int(0)) -var tInt8 = reflect.TypeOf(int8(0)) -var tInt16 = reflect.TypeOf(int16(0)) -var tInt32 = reflect.TypeOf(int32(0)) -var tInt64 = reflect.TypeOf(int64(0)) -var tString = reflect.TypeOf("") -var tTime = reflect.TypeOf(time.Time{}) -var tUint = reflect.TypeOf(uint(0)) -var tUint8 = reflect.TypeOf(uint8(0)) -var tUint16 = reflect.TypeOf(uint16(0)) -var tUint32 = reflect.TypeOf(uint32(0)) -var tUint64 = reflect.TypeOf(uint64(0)) - -var tEmpty = reflect.TypeOf((*interface{})(nil)).Elem() -var tByteSlice = reflect.TypeOf([]byte(nil)) -var tByte = reflect.TypeOf(byte(0x00)) -var tURL = reflect.TypeOf(url.URL{}) -var tJSONNumber = reflect.TypeOf(json.Number("")) - -var tValueMarshaler = reflect.TypeOf((*ValueMarshaler)(nil)).Elem() -var tValueUnmarshaler = reflect.TypeOf((*ValueUnmarshaler)(nil)).Elem() -var tMarshaler = reflect.TypeOf((*Marshaler)(nil)).Elem() -var tUnmarshaler = reflect.TypeOf((*Unmarshaler)(nil)).Elem() -var tProxy = reflect.TypeOf((*Proxy)(nil)).Elem() - -var tBinary = reflect.TypeOf(primitive.Binary{}) -var tUndefined = reflect.TypeOf(primitive.Undefined{}) -var tOID = reflect.TypeOf(primitive.ObjectID{}) -var tDateTime = reflect.TypeOf(primitive.DateTime(0)) -var tNull = reflect.TypeOf(primitive.Null{}) -var tRegex = reflect.TypeOf(primitive.Regex{}) -var tCodeWithScope = reflect.TypeOf(primitive.CodeWithScope{}) -var tDBPointer = reflect.TypeOf(primitive.DBPointer{}) -var tJavaScript = reflect.TypeOf(primitive.JavaScript("")) -var tSymbol = reflect.TypeOf(primitive.Symbol("")) -var tTimestamp = reflect.TypeOf(primitive.Timestamp{}) -var tDecimal = reflect.TypeOf(primitive.Decimal128{}) -var tMinKey = reflect.TypeOf(primitive.MinKey{}) -var tMaxKey = reflect.TypeOf(primitive.MaxKey{}) -var tD = reflect.TypeOf(primitive.D{}) -var tA = reflect.TypeOf(primitive.A{}) -var tE = reflect.TypeOf(primitive.E{}) - -var tCoreDocument = reflect.TypeOf(bsoncore.Document{}) diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/copier.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/copier.go deleted file mode 100644 index 02e3a7e3d0..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/copier.go +++ /dev/null @@ -1,389 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 - -package bsonrw - -import ( - "fmt" - "io" - - "go.mongodb.org/mongo-driver/bson/bsontype" - "go.mongodb.org/mongo-driver/bson/primitive" - "go.mongodb.org/mongo-driver/x/bsonx/bsoncore" -) - -// Copier is a type that allows copying between ValueReaders, ValueWriters, and -// []byte values. -type Copier struct{} - -// NewCopier creates a new copier with the given registry. If a nil registry is provided -// a default registry is used. -func NewCopier() Copier { - return Copier{} -} - -// CopyDocument handles copying a document from src to dst. -func CopyDocument(dst ValueWriter, src ValueReader) error { - return Copier{}.CopyDocument(dst, src) -} - -// CopyDocument handles copying one document from the src to the dst. -func (c Copier) CopyDocument(dst ValueWriter, src ValueReader) error { - dr, err := src.ReadDocument() - if err != nil { - return err - } - - dw, err := dst.WriteDocument() - if err != nil { - return err - } - - return c.copyDocumentCore(dw, dr) -} - -// CopyDocumentFromBytes copies the values from a BSON document represented as a -// []byte to a ValueWriter. -func (c Copier) CopyDocumentFromBytes(dst ValueWriter, src []byte) error { - dw, err := dst.WriteDocument() - if err != nil { - return err - } - - err = c.CopyBytesToDocumentWriter(dw, src) - if err != nil { - return err - } - - return dw.WriteDocumentEnd() -} - -// CopyBytesToDocumentWriter copies the values from a BSON document represented as a []byte to a -// DocumentWriter. -func (c Copier) CopyBytesToDocumentWriter(dst DocumentWriter, src []byte) error { - // TODO(skriptble): Create errors types here. Anything thats a tag should be a property. - length, rem, ok := bsoncore.ReadLength(src) - if !ok { - return fmt.Errorf("couldn't read length from src, not enough bytes. length=%d", len(src)) - } - if len(src) < int(length) { - return fmt.Errorf("length read exceeds number of bytes available. length=%d bytes=%d", len(src), length) - } - rem = rem[:length-4] - - var t bsontype.Type - var key string - var val bsoncore.Value - for { - t, rem, ok = bsoncore.ReadType(rem) - if !ok { - return io.EOF - } - if t == bsontype.Type(0) { - if len(rem) != 0 { - return fmt.Errorf("document end byte found before end of document. remaining bytes=%v", rem) - } - break - } - - key, rem, ok = bsoncore.ReadKey(rem) - if !ok { - return fmt.Errorf("invalid key found. remaining bytes=%v", rem) - } - dvw, err := dst.WriteDocumentElement(key) - if err != nil { - return err - } - val, rem, ok = bsoncore.ReadValue(rem, t) - if !ok { - return fmt.Errorf("not enough bytes available to read type. bytes=%d type=%s", len(rem), t) - } - err = c.CopyValueFromBytes(dvw, t, val.Data) - if err != nil { - return err - } - } - return nil -} - -// CopyDocumentToBytes copies an entire document from the ValueReader and -// returns it as bytes. -func (c Copier) CopyDocumentToBytes(src ValueReader) ([]byte, error) { - return c.AppendDocumentBytes(nil, src) -} - -// AppendDocumentBytes functions the same as CopyDocumentToBytes, but will -// append the result to dst. -func (c Copier) AppendDocumentBytes(dst []byte, src ValueReader) ([]byte, error) { - if br, ok := src.(BytesReader); ok { - _, dst, err := br.ReadValueBytes(dst) - return dst, err - } - - vw := vwPool.Get().(*valueWriter) - defer vwPool.Put(vw) - - vw.reset(dst) - - err := c.CopyDocument(vw, src) - dst = vw.buf - return dst, err -} - -// CopyValueFromBytes will write the value represtend by t and src to dst. -func (c Copier) CopyValueFromBytes(dst ValueWriter, t bsontype.Type, src []byte) error { - if wvb, ok := dst.(BytesWriter); ok { - return wvb.WriteValueBytes(t, src) - } - - vr := vrPool.Get().(*valueReader) - defer vrPool.Put(vr) - - vr.reset(src) - vr.pushElement(t) - - return c.CopyValue(dst, vr) -} - -// CopyValueToBytes copies a value from src and returns it as a bsontype.Type and a -// []byte. -func (c Copier) CopyValueToBytes(src ValueReader) (bsontype.Type, []byte, error) { - return c.AppendValueBytes(nil, src) -} - -// AppendValueBytes functions the same as CopyValueToBytes, but will append the -// result to dst. -func (c Copier) AppendValueBytes(dst []byte, src ValueReader) (bsontype.Type, []byte, error) { - if br, ok := src.(BytesReader); ok { - return br.ReadValueBytes(dst) - } - - vw := vwPool.Get().(*valueWriter) - defer vwPool.Put(vw) - - start := len(dst) - - vw.reset(dst) - vw.push(mElement) - - err := c.CopyValue(vw, src) - if err != nil { - return 0, dst, err - } - - return bsontype.Type(vw.buf[start]), vw.buf[start+2:], nil -} - -// CopyValue will copy a single value from src to dst. -func (c Copier) CopyValue(dst ValueWriter, src ValueReader) error { - var err error - switch src.Type() { - case bsontype.Double: - var f64 float64 - f64, err = src.ReadDouble() - if err != nil { - break - } - err = dst.WriteDouble(f64) - case bsontype.String: - var str string - str, err = src.ReadString() - if err != nil { - return err - } - err = dst.WriteString(str) - case bsontype.EmbeddedDocument: - err = c.CopyDocument(dst, src) - case bsontype.Array: - err = c.copyArray(dst, src) - case bsontype.Binary: - var data []byte - var subtype byte - data, subtype, err = src.ReadBinary() - if err != nil { - break - } - err = dst.WriteBinaryWithSubtype(data, subtype) - case bsontype.Undefined: - err = src.ReadUndefined() - if err != nil { - break - } - err = dst.WriteUndefined() - case bsontype.ObjectID: - var oid primitive.ObjectID - oid, err = src.ReadObjectID() - if err != nil { - break - } - err = dst.WriteObjectID(oid) - case bsontype.Boolean: - var b bool - b, err = src.ReadBoolean() - if err != nil { - break - } - err = dst.WriteBoolean(b) - case bsontype.DateTime: - var dt int64 - dt, err = src.ReadDateTime() - if err != nil { - break - } - err = dst.WriteDateTime(dt) - case bsontype.Null: - err = src.ReadNull() - if err != nil { - break - } - err = dst.WriteNull() - case bsontype.Regex: - var pattern, options string - pattern, options, err = src.ReadRegex() - if err != nil { - break - } - err = dst.WriteRegex(pattern, options) - case bsontype.DBPointer: - var ns string - var pointer primitive.ObjectID - ns, pointer, err = src.ReadDBPointer() - if err != nil { - break - } - err = dst.WriteDBPointer(ns, pointer) - case bsontype.JavaScript: - var js string - js, err = src.ReadJavascript() - if err != nil { - break - } - err = dst.WriteJavascript(js) - case bsontype.Symbol: - var symbol string - symbol, err = src.ReadSymbol() - if err != nil { - break - } - err = dst.WriteSymbol(symbol) - case bsontype.CodeWithScope: - var code string - var srcScope DocumentReader - code, srcScope, err = src.ReadCodeWithScope() - if err != nil { - break - } - - var dstScope DocumentWriter - dstScope, err = dst.WriteCodeWithScope(code) - if err != nil { - break - } - err = c.copyDocumentCore(dstScope, srcScope) - case bsontype.Int32: - var i32 int32 - i32, err = src.ReadInt32() - if err != nil { - break - } - err = dst.WriteInt32(i32) - case bsontype.Timestamp: - var t, i uint32 - t, i, err = src.ReadTimestamp() - if err != nil { - break - } - err = dst.WriteTimestamp(t, i) - case bsontype.Int64: - var i64 int64 - i64, err = src.ReadInt64() - if err != nil { - break - } - err = dst.WriteInt64(i64) - case bsontype.Decimal128: - var d128 primitive.Decimal128 - d128, err = src.ReadDecimal128() - if err != nil { - break - } - err = dst.WriteDecimal128(d128) - case bsontype.MinKey: - err = src.ReadMinKey() - if err != nil { - break - } - err = dst.WriteMinKey() - case bsontype.MaxKey: - err = src.ReadMaxKey() - if err != nil { - break - } - err = dst.WriteMaxKey() - default: - err = fmt.Errorf("Cannot copy unknown BSON type %s", src.Type()) - } - - return err -} - -func (c Copier) copyArray(dst ValueWriter, src ValueReader) error { - ar, err := src.ReadArray() - if err != nil { - return err - } - - aw, err := dst.WriteArray() - if err != nil { - return err - } - - for { - vr, err := ar.ReadValue() - if err == ErrEOA { - break - } - if err != nil { - return err - } - - vw, err := aw.WriteArrayElement() - if err != nil { - return err - } - - err = c.CopyValue(vw, vr) - if err != nil { - return err - } - } - - return aw.WriteArrayEnd() -} - -func (c Copier) copyDocumentCore(dw DocumentWriter, dr DocumentReader) error { - for { - key, vr, err := dr.ReadElement() - if err == ErrEOD { - break - } - if err != nil { - return err - } - - vw, err := dw.WriteDocumentElement(key) - if err != nil { - return err - } - - err = c.CopyValue(vw, vr) - if err != nil { - return err - } - } - - return dw.WriteDocumentEnd() -} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/doc.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/doc.go deleted file mode 100644 index 750b0d2af5..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/doc.go +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 - -// Package bsonrw contains abstractions for reading and writing -// BSON and BSON like types from sources. -package bsonrw // import "go.mongodb.org/mongo-driver/bson/bsonrw" diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_parser.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_parser.go deleted file mode 100644 index 9e223edf9d..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_parser.go +++ /dev/null @@ -1,731 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 - -package bsonrw - -import ( - "errors" - "fmt" - "io" - - "go.mongodb.org/mongo-driver/bson/bsontype" -) - -const maxNestingDepth = 200 - -// ErrInvalidJSON indicates the JSON input is invalid -var ErrInvalidJSON = errors.New("invalid JSON input") - -type jsonParseState byte - -const ( - jpsStartState jsonParseState = iota - jpsSawBeginObject - jpsSawEndObject - jpsSawBeginArray - jpsSawEndArray - jpsSawColon - jpsSawComma - jpsSawKey - jpsSawValue - jpsDoneState - jpsInvalidState -) - -type jsonParseMode byte - -const ( - jpmInvalidMode jsonParseMode = iota - jpmObjectMode - jpmArrayMode -) - -type extJSONValue struct { - t bsontype.Type - v interface{} -} - -type extJSONObject struct { - keys []string - values []*extJSONValue -} - -type extJSONParser struct { - js *jsonScanner - s jsonParseState - m []jsonParseMode - k string - v *extJSONValue - - err error - canonical bool - depth int - maxDepth int - - emptyObject bool -} - -// newExtJSONParser returns a new extended JSON parser, ready to to begin -// parsing from the first character of the argued json input. It will not -// perform any read-ahead and will therefore not report any errors about -// malformed JSON at this point. -func newExtJSONParser(r io.Reader, canonical bool) *extJSONParser { - return &extJSONParser{ - js: &jsonScanner{r: r}, - s: jpsStartState, - m: []jsonParseMode{}, - canonical: canonical, - maxDepth: maxNestingDepth, - } -} - -// peekType examines the next value and returns its BSON Type -func (ejp *extJSONParser) peekType() (bsontype.Type, error) { - var t bsontype.Type - var err error - - ejp.advanceState() - switch ejp.s { - case jpsSawValue: - t = ejp.v.t - case jpsSawBeginArray: - t = bsontype.Array - case jpsInvalidState: - err = ejp.err - case jpsSawComma: - // in array mode, seeing a comma means we need to progress again to actually observe a type - if ejp.peekMode() == jpmArrayMode { - return ejp.peekType() - } - case jpsSawEndArray: - // this would only be a valid state if we were in array mode, so return end-of-array error - err = ErrEOA - case jpsSawBeginObject: - // peek key to determine type - ejp.advanceState() - switch ejp.s { - case jpsSawEndObject: // empty embedded document - t = bsontype.EmbeddedDocument - ejp.emptyObject = true - case jpsInvalidState: - err = ejp.err - case jpsSawKey: - t = wrapperKeyBSONType(ejp.k) - - if t == bsontype.JavaScript { - // just saw $code, need to check for $scope at same level - _, err := ejp.readValue(bsontype.JavaScript) - - if err != nil { - break - } - - switch ejp.s { - case jpsSawEndObject: // type is TypeJavaScript - case jpsSawComma: - ejp.advanceState() - if ejp.s == jpsSawKey && ejp.k == "$scope" { - t = bsontype.CodeWithScope - } else { - err = fmt.Errorf("invalid extended JSON: unexpected key %s in CodeWithScope object", ejp.k) - } - case jpsInvalidState: - err = ejp.err - default: - err = ErrInvalidJSON - } - } - } - } - - return t, err -} - -// readKey parses the next key and its type and returns them -func (ejp *extJSONParser) readKey() (string, bsontype.Type, error) { - if ejp.emptyObject { - ejp.emptyObject = false - return "", 0, ErrEOD - } - - // advance to key (or return with error) - switch ejp.s { - case jpsStartState: - ejp.advanceState() - if ejp.s == jpsSawBeginObject { - ejp.advanceState() - } - case jpsSawBeginObject: - ejp.advanceState() - case jpsSawValue, jpsSawEndObject, jpsSawEndArray: - ejp.advanceState() - switch ejp.s { - case jpsSawBeginObject, jpsSawComma: - ejp.advanceState() - case jpsSawEndObject: - return "", 0, ErrEOD - case jpsDoneState: - return "", 0, io.EOF - case jpsInvalidState: - return "", 0, ejp.err - default: - return "", 0, ErrInvalidJSON - } - case jpsSawKey: // do nothing (key was peeked before) - default: - return "", 0, invalidRequestError("key") - } - - // read key - var key string - - switch ejp.s { - case jpsSawKey: - key = ejp.k - case jpsSawEndObject: - return "", 0, ErrEOD - case jpsInvalidState: - return "", 0, ejp.err - default: - return "", 0, invalidRequestError("key") - } - - // check for colon - ejp.advanceState() - if err := ensureColon(ejp.s, key); err != nil { - return "", 0, err - } - - // peek at the value to determine type - t, err := ejp.peekType() - if err != nil { - return "", 0, err - } - - return key, t, nil -} - -// readValue returns the value corresponding to the Type returned by peekType -func (ejp *extJSONParser) readValue(t bsontype.Type) (*extJSONValue, error) { - if ejp.s == jpsInvalidState { - return nil, ejp.err - } - - var v *extJSONValue - - switch t { - case bsontype.Null, bsontype.Boolean, bsontype.String: - if ejp.s != jpsSawValue { - return nil, invalidRequestError(t.String()) - } - v = ejp.v - case bsontype.Int32, bsontype.Int64, bsontype.Double: - // relaxed version allows these to be literal number values - if ejp.s == jpsSawValue { - v = ejp.v - break - } - fallthrough - case bsontype.Decimal128, bsontype.Symbol, bsontype.ObjectID, bsontype.MinKey, bsontype.MaxKey, bsontype.Undefined: - switch ejp.s { - case jpsSawKey: - // read colon - ejp.advanceState() - if err := ensureColon(ejp.s, ejp.k); err != nil { - return nil, err - } - - // read value - ejp.advanceState() - if ejp.s != jpsSawValue || !ejp.ensureExtValueType(t) { - return nil, invalidJSONErrorForType("value", t) - } - - v = ejp.v - - // read end object - ejp.advanceState() - if ejp.s != jpsSawEndObject { - return nil, invalidJSONErrorForType("} after value", t) - } - default: - return nil, invalidRequestError(t.String()) - } - case bsontype.Binary, bsontype.Regex, bsontype.Timestamp, bsontype.DBPointer: - if ejp.s != jpsSawKey { - return nil, invalidRequestError(t.String()) - } - // read colon - ejp.advanceState() - if err := ensureColon(ejp.s, ejp.k); err != nil { - return nil, err - } - - ejp.advanceState() - if t == bsontype.Binary && ejp.s == jpsSawValue { - // convert legacy $binary format - base64 := ejp.v - - ejp.advanceState() - if ejp.s != jpsSawComma { - return nil, invalidJSONErrorForType(",", bsontype.Binary) - } - - ejp.advanceState() - key, t, err := ejp.readKey() - if err != nil { - return nil, err - } - if key != "$type" { - return nil, invalidJSONErrorForType("$type", bsontype.Binary) - } - - subType, err := ejp.readValue(t) - if err != nil { - return nil, err - } - - ejp.advanceState() - if ejp.s != jpsSawEndObject { - return nil, invalidJSONErrorForType("2 key-value pairs and then }", bsontype.Binary) - } - - v = &extJSONValue{ - t: bsontype.EmbeddedDocument, - v: &extJSONObject{ - keys: []string{"base64", "subType"}, - values: []*extJSONValue{base64, subType}, - }, - } - break - } - - // read KV pairs - if ejp.s != jpsSawBeginObject { - return nil, invalidJSONErrorForType("{", t) - } - - keys, vals, err := ejp.readObject(2, true) - if err != nil { - return nil, err - } - - ejp.advanceState() - if ejp.s != jpsSawEndObject { - return nil, invalidJSONErrorForType("2 key-value pairs and then }", t) - } - - v = &extJSONValue{t: bsontype.EmbeddedDocument, v: &extJSONObject{keys: keys, values: vals}} - - case bsontype.DateTime: - switch ejp.s { - case jpsSawValue: - v = ejp.v - case jpsSawKey: - // read colon - ejp.advanceState() - if err := ensureColon(ejp.s, ejp.k); err != nil { - return nil, err - } - - ejp.advanceState() - switch ejp.s { - case jpsSawBeginObject: - keys, vals, err := ejp.readObject(1, true) - if err != nil { - return nil, err - } - v = &extJSONValue{t: bsontype.EmbeddedDocument, v: &extJSONObject{keys: keys, values: vals}} - case jpsSawValue: - if ejp.canonical { - return nil, invalidJSONError("{") - } - v = ejp.v - default: - if ejp.canonical { - return nil, invalidJSONErrorForType("object", t) - } - return nil, invalidJSONErrorForType("ISO-8601 Internet Date/Time Format as decribed in RFC-3339", t) - } - - ejp.advanceState() - if ejp.s != jpsSawEndObject { - return nil, invalidJSONErrorForType("value and then }", t) - } - default: - return nil, invalidRequestError(t.String()) - } - case bsontype.JavaScript: - switch ejp.s { - case jpsSawKey: - // read colon - ejp.advanceState() - if err := ensureColon(ejp.s, ejp.k); err != nil { - return nil, err - } - - // read value - ejp.advanceState() - if ejp.s != jpsSawValue { - return nil, invalidJSONErrorForType("value", t) - } - v = ejp.v - - // read end object or comma and just return - ejp.advanceState() - case jpsSawEndObject: - v = ejp.v - default: - return nil, invalidRequestError(t.String()) - } - case bsontype.CodeWithScope: - if ejp.s == jpsSawKey && ejp.k == "$scope" { - v = ejp.v // this is the $code string from earlier - - // read colon - ejp.advanceState() - if err := ensureColon(ejp.s, ejp.k); err != nil { - return nil, err - } - - // read { - ejp.advanceState() - if ejp.s != jpsSawBeginObject { - return nil, invalidJSONError("$scope to be embedded document") - } - } else { - return nil, invalidRequestError(t.String()) - } - case bsontype.EmbeddedDocument, bsontype.Array: - return nil, invalidRequestError(t.String()) - } - - return v, nil -} - -// readObject is a utility method for reading full objects of known (or expected) size -// it is useful for extended JSON types such as binary, datetime, regex, and timestamp -func (ejp *extJSONParser) readObject(numKeys int, started bool) ([]string, []*extJSONValue, error) { - keys := make([]string, numKeys) - vals := make([]*extJSONValue, numKeys) - - if !started { - ejp.advanceState() - if ejp.s != jpsSawBeginObject { - return nil, nil, invalidJSONError("{") - } - } - - for i := 0; i < numKeys; i++ { - key, t, err := ejp.readKey() - if err != nil { - return nil, nil, err - } - - switch ejp.s { - case jpsSawKey: - v, err := ejp.readValue(t) - if err != nil { - return nil, nil, err - } - - keys[i] = key - vals[i] = v - case jpsSawValue: - keys[i] = key - vals[i] = ejp.v - default: - return nil, nil, invalidJSONError("value") - } - } - - ejp.advanceState() - if ejp.s != jpsSawEndObject { - return nil, nil, invalidJSONError("}") - } - - return keys, vals, nil -} - -// advanceState reads the next JSON token from the scanner and transitions -// from the current state based on that token's type -func (ejp *extJSONParser) advanceState() { - if ejp.s == jpsDoneState || ejp.s == jpsInvalidState { - return - } - - jt, err := ejp.js.nextToken() - - if err != nil { - ejp.err = err - ejp.s = jpsInvalidState - return - } - - valid := ejp.validateToken(jt.t) - if !valid { - ejp.err = unexpectedTokenError(jt) - ejp.s = jpsInvalidState - return - } - - switch jt.t { - case jttBeginObject: - ejp.s = jpsSawBeginObject - ejp.pushMode(jpmObjectMode) - ejp.depth++ - - if ejp.depth > ejp.maxDepth { - ejp.err = nestingDepthError(jt.p, ejp.depth) - ejp.s = jpsInvalidState - } - case jttEndObject: - ejp.s = jpsSawEndObject - ejp.depth-- - - if ejp.popMode() != jpmObjectMode { - ejp.err = unexpectedTokenError(jt) - ejp.s = jpsInvalidState - } - case jttBeginArray: - ejp.s = jpsSawBeginArray - ejp.pushMode(jpmArrayMode) - case jttEndArray: - ejp.s = jpsSawEndArray - - if ejp.popMode() != jpmArrayMode { - ejp.err = unexpectedTokenError(jt) - ejp.s = jpsInvalidState - } - case jttColon: - ejp.s = jpsSawColon - case jttComma: - ejp.s = jpsSawComma - case jttEOF: - ejp.s = jpsDoneState - if len(ejp.m) != 0 { - ejp.err = unexpectedTokenError(jt) - ejp.s = jpsInvalidState - } - case jttString: - switch ejp.s { - case jpsSawComma: - if ejp.peekMode() == jpmArrayMode { - ejp.s = jpsSawValue - ejp.v = extendJSONToken(jt) - return - } - fallthrough - case jpsSawBeginObject: - ejp.s = jpsSawKey - ejp.k = jt.v.(string) - return - } - fallthrough - default: - ejp.s = jpsSawValue - ejp.v = extendJSONToken(jt) - } -} - -var jpsValidTransitionTokens = map[jsonParseState]map[jsonTokenType]bool{ - jpsStartState: { - jttBeginObject: true, - jttBeginArray: true, - jttInt32: true, - jttInt64: true, - jttDouble: true, - jttString: true, - jttBool: true, - jttNull: true, - jttEOF: true, - }, - jpsSawBeginObject: { - jttEndObject: true, - jttString: true, - }, - jpsSawEndObject: { - jttEndObject: true, - jttEndArray: true, - jttComma: true, - jttEOF: true, - }, - jpsSawBeginArray: { - jttBeginObject: true, - jttBeginArray: true, - jttEndArray: true, - jttInt32: true, - jttInt64: true, - jttDouble: true, - jttString: true, - jttBool: true, - jttNull: true, - }, - jpsSawEndArray: { - jttEndObject: true, - jttEndArray: true, - jttComma: true, - jttEOF: true, - }, - jpsSawColon: { - jttBeginObject: true, - jttBeginArray: true, - jttInt32: true, - jttInt64: true, - jttDouble: true, - jttString: true, - jttBool: true, - jttNull: true, - }, - jpsSawComma: { - jttBeginObject: true, - jttBeginArray: true, - jttInt32: true, - jttInt64: true, - jttDouble: true, - jttString: true, - jttBool: true, - jttNull: true, - }, - jpsSawKey: { - jttColon: true, - }, - jpsSawValue: { - jttEndObject: true, - jttEndArray: true, - jttComma: true, - jttEOF: true, - }, - jpsDoneState: {}, - jpsInvalidState: {}, -} - -func (ejp *extJSONParser) validateToken(jtt jsonTokenType) bool { - switch ejp.s { - case jpsSawEndObject: - // if we are at depth zero and the next token is a '{', - // we can consider it valid only if we are not in array mode. - if jtt == jttBeginObject && ejp.depth == 0 { - return ejp.peekMode() != jpmArrayMode - } - case jpsSawComma: - switch ejp.peekMode() { - // the only valid next token after a comma inside a document is a string (a key) - case jpmObjectMode: - return jtt == jttString - case jpmInvalidMode: - return false - } - } - - _, ok := jpsValidTransitionTokens[ejp.s][jtt] - return ok -} - -// ensureExtValueType returns true if the current value has the expected -// value type for single-key extended JSON types. For example, -// {"$numberInt": v} v must be TypeString -func (ejp *extJSONParser) ensureExtValueType(t bsontype.Type) bool { - switch t { - case bsontype.MinKey, bsontype.MaxKey: - return ejp.v.t == bsontype.Int32 - case bsontype.Undefined: - return ejp.v.t == bsontype.Boolean - case bsontype.Int32, bsontype.Int64, bsontype.Double, bsontype.Decimal128, bsontype.Symbol, bsontype.ObjectID: - return ejp.v.t == bsontype.String - default: - return false - } -} - -func (ejp *extJSONParser) pushMode(m jsonParseMode) { - ejp.m = append(ejp.m, m) -} - -func (ejp *extJSONParser) popMode() jsonParseMode { - l := len(ejp.m) - if l == 0 { - return jpmInvalidMode - } - - m := ejp.m[l-1] - ejp.m = ejp.m[:l-1] - - return m -} - -func (ejp *extJSONParser) peekMode() jsonParseMode { - l := len(ejp.m) - if l == 0 { - return jpmInvalidMode - } - - return ejp.m[l-1] -} - -func extendJSONToken(jt *jsonToken) *extJSONValue { - var t bsontype.Type - - switch jt.t { - case jttInt32: - t = bsontype.Int32 - case jttInt64: - t = bsontype.Int64 - case jttDouble: - t = bsontype.Double - case jttString: - t = bsontype.String - case jttBool: - t = bsontype.Boolean - case jttNull: - t = bsontype.Null - default: - return nil - } - - return &extJSONValue{t: t, v: jt.v} -} - -func ensureColon(s jsonParseState, key string) error { - if s != jpsSawColon { - return fmt.Errorf("invalid JSON input: missing colon after key \"%s\"", key) - } - - return nil -} - -func invalidRequestError(s string) error { - return fmt.Errorf("invalid request to read %s", s) -} - -func invalidJSONError(expected string) error { - return fmt.Errorf("invalid JSON input; expected %s", expected) -} - -func invalidJSONErrorForType(expected string, t bsontype.Type) error { - return fmt.Errorf("invalid JSON input; expected %s for %s", expected, t) -} - -func unexpectedTokenError(jt *jsonToken) error { - switch jt.t { - case jttInt32, jttInt64, jttDouble: - return fmt.Errorf("invalid JSON input; unexpected number (%v) at position %d", jt.v, jt.p) - case jttString: - return fmt.Errorf("invalid JSON input; unexpected string (\"%v\") at position %d", jt.v, jt.p) - case jttBool: - return fmt.Errorf("invalid JSON input; unexpected boolean literal (%v) at position %d", jt.v, jt.p) - case jttNull: - return fmt.Errorf("invalid JSON input; unexpected null literal at position %d", jt.p) - case jttEOF: - return fmt.Errorf("invalid JSON input; unexpected end of input at position %d", jt.p) - default: - return fmt.Errorf("invalid JSON input; unexpected %c at position %d", jt.v.(byte), jt.p) - } -} - -func nestingDepthError(p, depth int) error { - return fmt.Errorf("invalid JSON input; nesting too deep (%d levels) at position %d", depth, p) -} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_reader.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_reader.go deleted file mode 100644 index dd560c96f6..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_reader.go +++ /dev/null @@ -1,659 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 - -package bsonrw - -import ( - "fmt" - "io" - "sync" - - "go.mongodb.org/mongo-driver/bson/bsontype" - "go.mongodb.org/mongo-driver/bson/primitive" -) - -// ExtJSONValueReaderPool is a pool for ValueReaders that read ExtJSON. -type ExtJSONValueReaderPool struct { - pool sync.Pool -} - -// NewExtJSONValueReaderPool instantiates a new ExtJSONValueReaderPool. -func NewExtJSONValueReaderPool() *ExtJSONValueReaderPool { - return &ExtJSONValueReaderPool{ - pool: sync.Pool{ - New: func() interface{} { - return new(extJSONValueReader) - }, - }, - } -} - -// Get retrieves a ValueReader from the pool and uses src as the underlying ExtJSON. -func (bvrp *ExtJSONValueReaderPool) Get(r io.Reader, canonical bool) (ValueReader, error) { - vr := bvrp.pool.Get().(*extJSONValueReader) - return vr.reset(r, canonical) -} - -// Put inserts a ValueReader into the pool. If the ValueReader is not a ExtJSON ValueReader nothing -// is inserted into the pool and ok will be false. -func (bvrp *ExtJSONValueReaderPool) Put(vr ValueReader) (ok bool) { - bvr, ok := vr.(*extJSONValueReader) - if !ok { - return false - } - - bvr, _ = bvr.reset(nil, false) - bvrp.pool.Put(bvr) - return true -} - -type ejvrState struct { - mode mode - vType bsontype.Type - depth int -} - -// extJSONValueReader is for reading extended JSON. -type extJSONValueReader struct { - p *extJSONParser - - stack []ejvrState - frame int -} - -// NewExtJSONValueReader creates a new ValueReader from a given io.Reader -// It will interpret the JSON of r as canonical or relaxed according to the -// given canonical flag -func NewExtJSONValueReader(r io.Reader, canonical bool) (ValueReader, error) { - return newExtJSONValueReader(r, canonical) -} - -func newExtJSONValueReader(r io.Reader, canonical bool) (*extJSONValueReader, error) { - ejvr := new(extJSONValueReader) - return ejvr.reset(r, canonical) -} - -func (ejvr *extJSONValueReader) reset(r io.Reader, canonical bool) (*extJSONValueReader, error) { - p := newExtJSONParser(r, canonical) - typ, err := p.peekType() - - if err != nil { - return nil, ErrInvalidJSON - } - - var m mode - switch typ { - case bsontype.EmbeddedDocument: - m = mTopLevel - case bsontype.Array: - m = mArray - default: - m = mValue - } - - stack := make([]ejvrState, 1, 5) - stack[0] = ejvrState{ - mode: m, - vType: typ, - } - return &extJSONValueReader{ - p: p, - stack: stack, - }, nil -} - -func (ejvr *extJSONValueReader) advanceFrame() { - if ejvr.frame+1 >= len(ejvr.stack) { // We need to grow the stack - length := len(ejvr.stack) - if length+1 >= cap(ejvr.stack) { - // double it - buf := make([]ejvrState, 2*cap(ejvr.stack)+1) - copy(buf, ejvr.stack) - ejvr.stack = buf - } - ejvr.stack = ejvr.stack[:length+1] - } - ejvr.frame++ - - // Clean the stack - ejvr.stack[ejvr.frame].mode = 0 - ejvr.stack[ejvr.frame].vType = 0 - ejvr.stack[ejvr.frame].depth = 0 -} - -func (ejvr *extJSONValueReader) pushDocument() { - ejvr.advanceFrame() - - ejvr.stack[ejvr.frame].mode = mDocument - ejvr.stack[ejvr.frame].depth = ejvr.p.depth -} - -func (ejvr *extJSONValueReader) pushCodeWithScope() { - ejvr.advanceFrame() - - ejvr.stack[ejvr.frame].mode = mCodeWithScope -} - -func (ejvr *extJSONValueReader) pushArray() { - ejvr.advanceFrame() - - ejvr.stack[ejvr.frame].mode = mArray -} - -func (ejvr *extJSONValueReader) push(m mode, t bsontype.Type) { - ejvr.advanceFrame() - - ejvr.stack[ejvr.frame].mode = m - ejvr.stack[ejvr.frame].vType = t -} - -func (ejvr *extJSONValueReader) pop() { - switch ejvr.stack[ejvr.frame].mode { - case mElement, mValue: - ejvr.frame-- - case mDocument, mArray, mCodeWithScope: - ejvr.frame -= 2 // we pop twice to jump over the vrElement: vrDocument -> vrElement -> vrDocument/TopLevel/etc... - } -} - -func (ejvr *extJSONValueReader) skipDocument() error { - // read entire document until ErrEOD (using readKey and readValue) - _, typ, err := ejvr.p.readKey() - for err == nil { - _, err = ejvr.p.readValue(typ) - if err != nil { - break - } - - _, typ, err = ejvr.p.readKey() - } - - return err -} - -func (ejvr *extJSONValueReader) skipArray() error { - // read entire array until ErrEOA (using peekType) - _, err := ejvr.p.peekType() - for err == nil { - _, err = ejvr.p.peekType() - } - - return err -} - -func (ejvr *extJSONValueReader) invalidTransitionErr(destination mode, name string, modes []mode) error { - te := TransitionError{ - name: name, - current: ejvr.stack[ejvr.frame].mode, - destination: destination, - modes: modes, - action: "read", - } - if ejvr.frame != 0 { - te.parent = ejvr.stack[ejvr.frame-1].mode - } - return te -} - -func (ejvr *extJSONValueReader) typeError(t bsontype.Type) error { - return fmt.Errorf("positioned on %s, but attempted to read %s", ejvr.stack[ejvr.frame].vType, t) -} - -func (ejvr *extJSONValueReader) ensureElementValue(t bsontype.Type, destination mode, callerName string, addModes ...mode) error { - switch ejvr.stack[ejvr.frame].mode { - case mElement, mValue: - if ejvr.stack[ejvr.frame].vType != t { - return ejvr.typeError(t) - } - default: - modes := []mode{mElement, mValue} - if addModes != nil { - modes = append(modes, addModes...) - } - return ejvr.invalidTransitionErr(destination, callerName, modes) - } - - return nil -} - -func (ejvr *extJSONValueReader) Type() bsontype.Type { - return ejvr.stack[ejvr.frame].vType -} - -func (ejvr *extJSONValueReader) Skip() error { - switch ejvr.stack[ejvr.frame].mode { - case mElement, mValue: - default: - return ejvr.invalidTransitionErr(0, "Skip", []mode{mElement, mValue}) - } - - defer ejvr.pop() - - t := ejvr.stack[ejvr.frame].vType - switch t { - case bsontype.Array: - // read entire array until ErrEOA - err := ejvr.skipArray() - if err != ErrEOA { - return err - } - case bsontype.EmbeddedDocument: - // read entire doc until ErrEOD - err := ejvr.skipDocument() - if err != ErrEOD { - return err - } - case bsontype.CodeWithScope: - // read the code portion and set up parser in document mode - _, err := ejvr.p.readValue(t) - if err != nil { - return err - } - - // read until ErrEOD - err = ejvr.skipDocument() - if err != ErrEOD { - return err - } - default: - _, err := ejvr.p.readValue(t) - if err != nil { - return err - } - } - - return nil -} - -func (ejvr *extJSONValueReader) ReadArray() (ArrayReader, error) { - switch ejvr.stack[ejvr.frame].mode { - case mTopLevel: // allow reading array from top level - case mArray: - return ejvr, nil - default: - if err := ejvr.ensureElementValue(bsontype.Array, mArray, "ReadArray", mTopLevel, mArray); err != nil { - return nil, err - } - } - - ejvr.pushArray() - - return ejvr, nil -} - -func (ejvr *extJSONValueReader) ReadBinary() (b []byte, btype byte, err error) { - if err := ejvr.ensureElementValue(bsontype.Binary, 0, "ReadBinary"); err != nil { - return nil, 0, err - } - - v, err := ejvr.p.readValue(bsontype.Binary) - if err != nil { - return nil, 0, err - } - - b, btype, err = v.parseBinary() - - ejvr.pop() - return b, btype, err -} - -func (ejvr *extJSONValueReader) ReadBoolean() (bool, error) { - if err := ejvr.ensureElementValue(bsontype.Boolean, 0, "ReadBoolean"); err != nil { - return false, err - } - - v, err := ejvr.p.readValue(bsontype.Boolean) - if err != nil { - return false, err - } - - if v.t != bsontype.Boolean { - return false, fmt.Errorf("expected type bool, but got type %s", v.t) - } - - ejvr.pop() - return v.v.(bool), nil -} - -func (ejvr *extJSONValueReader) ReadDocument() (DocumentReader, error) { - switch ejvr.stack[ejvr.frame].mode { - case mTopLevel: - return ejvr, nil - case mElement, mValue: - if ejvr.stack[ejvr.frame].vType != bsontype.EmbeddedDocument { - return nil, ejvr.typeError(bsontype.EmbeddedDocument) - } - - ejvr.pushDocument() - return ejvr, nil - default: - return nil, ejvr.invalidTransitionErr(mDocument, "ReadDocument", []mode{mTopLevel, mElement, mValue}) - } -} - -func (ejvr *extJSONValueReader) ReadCodeWithScope() (code string, dr DocumentReader, err error) { - if err = ejvr.ensureElementValue(bsontype.CodeWithScope, 0, "ReadCodeWithScope"); err != nil { - return "", nil, err - } - - v, err := ejvr.p.readValue(bsontype.CodeWithScope) - if err != nil { - return "", nil, err - } - - code, err = v.parseJavascript() - - ejvr.pushCodeWithScope() - return code, ejvr, err -} - -func (ejvr *extJSONValueReader) ReadDBPointer() (ns string, oid primitive.ObjectID, err error) { - if err = ejvr.ensureElementValue(bsontype.DBPointer, 0, "ReadDBPointer"); err != nil { - return "", primitive.NilObjectID, err - } - - v, err := ejvr.p.readValue(bsontype.DBPointer) - if err != nil { - return "", primitive.NilObjectID, err - } - - ns, oid, err = v.parseDBPointer() - - ejvr.pop() - return ns, oid, err -} - -func (ejvr *extJSONValueReader) ReadDateTime() (int64, error) { - if err := ejvr.ensureElementValue(bsontype.DateTime, 0, "ReadDateTime"); err != nil { - return 0, err - } - - v, err := ejvr.p.readValue(bsontype.DateTime) - if err != nil { - return 0, err - } - - d, err := v.parseDateTime() - - ejvr.pop() - return d, err -} - -func (ejvr *extJSONValueReader) ReadDecimal128() (primitive.Decimal128, error) { - if err := ejvr.ensureElementValue(bsontype.Decimal128, 0, "ReadDecimal128"); err != nil { - return primitive.Decimal128{}, err - } - - v, err := ejvr.p.readValue(bsontype.Decimal128) - if err != nil { - return primitive.Decimal128{}, err - } - - d, err := v.parseDecimal128() - - ejvr.pop() - return d, err -} - -func (ejvr *extJSONValueReader) ReadDouble() (float64, error) { - if err := ejvr.ensureElementValue(bsontype.Double, 0, "ReadDouble"); err != nil { - return 0, err - } - - v, err := ejvr.p.readValue(bsontype.Double) - if err != nil { - return 0, err - } - - d, err := v.parseDouble() - - ejvr.pop() - return d, err -} - -func (ejvr *extJSONValueReader) ReadInt32() (int32, error) { - if err := ejvr.ensureElementValue(bsontype.Int32, 0, "ReadInt32"); err != nil { - return 0, err - } - - v, err := ejvr.p.readValue(bsontype.Int32) - if err != nil { - return 0, err - } - - i, err := v.parseInt32() - - ejvr.pop() - return i, err -} - -func (ejvr *extJSONValueReader) ReadInt64() (int64, error) { - if err := ejvr.ensureElementValue(bsontype.Int64, 0, "ReadInt64"); err != nil { - return 0, err - } - - v, err := ejvr.p.readValue(bsontype.Int64) - if err != nil { - return 0, err - } - - i, err := v.parseInt64() - - ejvr.pop() - return i, err -} - -func (ejvr *extJSONValueReader) ReadJavascript() (code string, err error) { - if err = ejvr.ensureElementValue(bsontype.JavaScript, 0, "ReadJavascript"); err != nil { - return "", err - } - - v, err := ejvr.p.readValue(bsontype.JavaScript) - if err != nil { - return "", err - } - - code, err = v.parseJavascript() - - ejvr.pop() - return code, err -} - -func (ejvr *extJSONValueReader) ReadMaxKey() error { - if err := ejvr.ensureElementValue(bsontype.MaxKey, 0, "ReadMaxKey"); err != nil { - return err - } - - v, err := ejvr.p.readValue(bsontype.MaxKey) - if err != nil { - return err - } - - err = v.parseMinMaxKey("max") - - ejvr.pop() - return err -} - -func (ejvr *extJSONValueReader) ReadMinKey() error { - if err := ejvr.ensureElementValue(bsontype.MinKey, 0, "ReadMinKey"); err != nil { - return err - } - - v, err := ejvr.p.readValue(bsontype.MinKey) - if err != nil { - return err - } - - err = v.parseMinMaxKey("min") - - ejvr.pop() - return err -} - -func (ejvr *extJSONValueReader) ReadNull() error { - if err := ejvr.ensureElementValue(bsontype.Null, 0, "ReadNull"); err != nil { - return err - } - - v, err := ejvr.p.readValue(bsontype.Null) - if err != nil { - return err - } - - if v.t != bsontype.Null { - return fmt.Errorf("expected type null but got type %s", v.t) - } - - ejvr.pop() - return nil -} - -func (ejvr *extJSONValueReader) ReadObjectID() (primitive.ObjectID, error) { - if err := ejvr.ensureElementValue(bsontype.ObjectID, 0, "ReadObjectID"); err != nil { - return primitive.ObjectID{}, err - } - - v, err := ejvr.p.readValue(bsontype.ObjectID) - if err != nil { - return primitive.ObjectID{}, err - } - - oid, err := v.parseObjectID() - - ejvr.pop() - return oid, err -} - -func (ejvr *extJSONValueReader) ReadRegex() (pattern string, options string, err error) { - if err = ejvr.ensureElementValue(bsontype.Regex, 0, "ReadRegex"); err != nil { - return "", "", err - } - - v, err := ejvr.p.readValue(bsontype.Regex) - if err != nil { - return "", "", err - } - - pattern, options, err = v.parseRegex() - - ejvr.pop() - return pattern, options, err -} - -func (ejvr *extJSONValueReader) ReadString() (string, error) { - if err := ejvr.ensureElementValue(bsontype.String, 0, "ReadString"); err != nil { - return "", err - } - - v, err := ejvr.p.readValue(bsontype.String) - if err != nil { - return "", err - } - - if v.t != bsontype.String { - return "", fmt.Errorf("expected type string but got type %s", v.t) - } - - ejvr.pop() - return v.v.(string), nil -} - -func (ejvr *extJSONValueReader) ReadSymbol() (symbol string, err error) { - if err = ejvr.ensureElementValue(bsontype.Symbol, 0, "ReadSymbol"); err != nil { - return "", err - } - - v, err := ejvr.p.readValue(bsontype.Symbol) - if err != nil { - return "", err - } - - symbol, err = v.parseSymbol() - - ejvr.pop() - return symbol, err -} - -func (ejvr *extJSONValueReader) ReadTimestamp() (t uint32, i uint32, err error) { - if err = ejvr.ensureElementValue(bsontype.Timestamp, 0, "ReadTimestamp"); err != nil { - return 0, 0, err - } - - v, err := ejvr.p.readValue(bsontype.Timestamp) - if err != nil { - return 0, 0, err - } - - t, i, err = v.parseTimestamp() - - ejvr.pop() - return t, i, err -} - -func (ejvr *extJSONValueReader) ReadUndefined() error { - if err := ejvr.ensureElementValue(bsontype.Undefined, 0, "ReadUndefined"); err != nil { - return err - } - - v, err := ejvr.p.readValue(bsontype.Undefined) - if err != nil { - return err - } - - err = v.parseUndefined() - - ejvr.pop() - return err -} - -func (ejvr *extJSONValueReader) ReadElement() (string, ValueReader, error) { - switch ejvr.stack[ejvr.frame].mode { - case mTopLevel, mDocument, mCodeWithScope: - default: - return "", nil, ejvr.invalidTransitionErr(mElement, "ReadElement", []mode{mTopLevel, mDocument, mCodeWithScope}) - } - - name, t, err := ejvr.p.readKey() - - if err != nil { - if err == ErrEOD { - if ejvr.stack[ejvr.frame].mode == mCodeWithScope { - _, err := ejvr.p.peekType() - if err != nil { - return "", nil, err - } - } - - ejvr.pop() - } - - return "", nil, err - } - - ejvr.push(mElement, t) - return name, ejvr, nil -} - -func (ejvr *extJSONValueReader) ReadValue() (ValueReader, error) { - switch ejvr.stack[ejvr.frame].mode { - case mArray: - default: - return nil, ejvr.invalidTransitionErr(mValue, "ReadValue", []mode{mArray}) - } - - t, err := ejvr.p.peekType() - if err != nil { - if err == ErrEOA { - ejvr.pop() - } - - return nil, err - } - - ejvr.push(mValue, t) - return ejvr, nil -} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_tables.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_tables.go deleted file mode 100644 index ba39c9601f..0000000000 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_tables.go +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// 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 -// -// Based on github.com/golang/go by The Go Authors -// See THIRD-PARTY-NOTICES for original license terms. - -package bsonrw - -import "unicode/utf8" - -// safeSet holds the value true if the ASCII character with the given array -// position can be represented inside a JSON string without any further -// escaping. -// -// All values are true except for the ASCII control characters (0-31), the -// double quote ("), and the backslash character ("\"). -var safeSet = [utf8.RuneSelf]bool{ - ' ': true, - '!': true, - '"': false, - '#': true, - '$': true, - '%': true, - '&': true, - '\'': true, - '(': true, - ')': true, - '*': true, - '+': true, - ',': true, - '-': true, - '.': true, - '/': true, - '0': true, - '1': true, - '2': true, - '3': true, - '4': true, - '5': true, - '6': true, - '7': true, - '8': true, - '9': true, - ':': true, - ';': true, - '<': true, - '=': true, - '>': true, - '?': true, - '@': true, - 'A': true, - 'B': true, - 'C': true, - 'D': true, - 'E': true, - 'F': true, - 'G': true, - 'H': true, - 'I': true, - 'J': true, - 'K': true, - 'L': true, - 'M': true, - 'N': true, - 'O': true, - 'P': true, - 'Q': true, - 'R': true, - 'S': true, - 'T': true, - 'U': true, - 'V': true, - 'W': true, - 'X': true, - 'Y': true, - 'Z': true, - '[': true, - '\\': false, - ']': true, - '^': true, - '_': true, - '`': true, - 'a': true, - 'b': true, - 'c': true, - 'd': true, - 'e': true, - 'f': true, - 'g': true, - 'h': true, - 'i': true, - 'j': true, - 'k': true, - 'l': true, - 'm': true, - 'n': true, - 'o': true, - 'p': true, - 'q': true, - 'r': true, - 's': true, - 't': true, - 'u': true, - 'v': true, - 'w': true, - 'x': true, - 'y': true, - 'z': true, - '{': true, - '|': true, - '}': true, - '~': true, - '\u007f': true, -} - -// htmlSafeSet holds the value true if the ASCII character with the given -// array position can be safely represented inside a JSON string, embedded -// inside of HTML