{
  "extends": [
    "../oas/ruleset.json"
  ],
  "rules": {
    "oas2-schema": {
      "summary": "Validate structure of OpenAPIv2 specification.",
      "message": "{{error}}",
      "type": "validation",
      "severity": 0,
      "given": "$",
      "then": {
        "function": "schema",
        "functionOptions": {
          "schema": {
            "title": "A JSON Schema for Swagger 2.0 API.",
            "id": "http://swagger.io/v2/schema.json#",
            "$schema": "http://json-schema.org/draft-04/schema#",
            "type": "object",
            "required": [
              "swagger",
              "info",
              "paths"
            ],
            "additionalProperties": false,
            "patternProperties": {
              "^x-": {
                "$ref": "#/definitions/vendorExtension"
              }
            },
            "properties": {
              "swagger": {
                "type": "string",
                "enum": [
                  "2.0"
                ],
                "description": "The Swagger version of this document."
              },
              "info": {
                "$ref": "#/definitions/info"
              },
              "host": {
                "type": "string",
                "pattern": "^[^{}/ :\\\\]+(?::\\d+)?$",
                "description": "The host (name or ip) of the API. Example: 'swagger.io'"
              },
              "basePath": {
                "type": "string",
                "pattern": "^/",
                "description": "The base path to the API. Example: '/api'."
              },
              "schemes": {
                "$ref": "#/definitions/schemesList"
              },
              "consumes": {
                "description": "A list of MIME types accepted by the API.",
                "allOf": [
                  {
                    "$ref": "#/definitions/mediaTypeList"
                  }
                ]
              },
              "produces": {
                "description": "A list of MIME types the API can produce.",
                "allOf": [
                  {
                    "$ref": "#/definitions/mediaTypeList"
                  }
                ]
              },
              "paths": {
                "$ref": "#/definitions/paths"
              },
              "definitions": {
                "$ref": "#/definitions/definitions"
              },
              "parameters": {
                "$ref": "#/definitions/parameterDefinitions"
              },
              "responses": {
                "$ref": "#/definitions/responseDefinitions"
              },
              "security": {
                "$ref": "#/definitions/security"
              },
              "securityDefinitions": {
                "$ref": "#/definitions/securityDefinitions"
              },
              "tags": {
                "type": "array",
                "items": {
                  "$ref": "#/definitions/tag"
                },
                "uniqueItems": true
              },
              "externalDocs": {
                "$ref": "#/definitions/externalDocs"
              }
            },
            "definitions": {
              "info": {
                "type": "object",
                "description": "General information about the API.",
                "required": [
                  "version",
                  "title"
                ],
                "additionalProperties": false,
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                },
                "properties": {
                  "title": {
                    "type": "string",
                    "description": "A unique and precise title of the API."
                  },
                  "version": {
                    "type": "string",
                    "description": "A semantic version number of the API."
                  },
                  "description": {
                    "type": "string",
                    "description": "A longer description of the API. Should be different from the title.  GitHub Flavored Markdown is allowed."
                  },
                  "termsOfService": {
                    "type": "string",
                    "description": "The terms of service for the API."
                  },
                  "contact": {
                    "$ref": "#/definitions/contact"
                  },
                  "license": {
                    "$ref": "#/definitions/license"
                  }
                }
              },
              "contact": {
                "type": "object",
                "description": "Contact information for the owners of the API.",
                "additionalProperties": false,
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "The identifying name of the contact person/organization."
                  },
                  "url": {
                    "type": "string",
                    "description": "The URL pointing to the contact information.",
                    "format": "uri"
                  },
                  "email": {
                    "type": "string",
                    "description": "The email address of the contact person/organization.",
                    "format": "email"
                  }
                },
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                }
              },
              "license": {
                "type": "object",
                "required": [
                  "name"
                ],
                "additionalProperties": false,
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "The name of the license type. It's encouraged to use an OSI compatible license."
                  },
                  "url": {
                    "type": "string",
                    "description": "The URL pointing to the license.",
                    "format": "uri"
                  }
                },
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                }
              },
              "paths": {
                "type": "object",
                "description": "Relative paths to the individual endpoints. They must be relative to the 'basePath'.",
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  },
                  "^/": {
                    "$ref": "#/definitions/pathItem"
                  }
                },
                "additionalProperties": false
              },
              "definitions": {
                "type": "object",
                "additionalProperties": {
                  "$ref": "#/definitions/schema"
                },
                "description": "One or more JSON objects describing the schemas being consumed and produced by the API."
              },
              "parameterDefinitions": {
                "type": "object",
                "additionalProperties": {
                  "$ref": "#/definitions/parameter"
                },
                "description": "One or more JSON representations for parameters"
              },
              "responseDefinitions": {
                "type": "object",
                "additionalProperties": {
                  "$ref": "#/definitions/response"
                },
                "description": "One or more JSON representations for responses"
              },
              "externalDocs": {
                "type": "object",
                "additionalProperties": false,
                "description": "information about external documentation",
                "required": [
                  "url"
                ],
                "properties": {
                  "description": {
                    "type": "string"
                  },
                  "url": {
                    "type": "string",
                    "format": "uri"
                  }
                },
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                }
              },
              "examples": {
                "type": "object",
                "additionalProperties": true
              },
              "mimeType": {
                "type": "string",
                "description": "The MIME type of the HTTP message."
              },
              "operation": {
                "type": "object",
                "required": [
                  "responses"
                ],
                "additionalProperties": false,
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                },
                "properties": {
                  "tags": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "uniqueItems": true
                  },
                  "summary": {
                    "type": "string",
                    "description": "A brief summary of the operation."
                  },
                  "description": {
                    "type": "string",
                    "description": "A longer description of the operation, GitHub Flavored Markdown is allowed."
                  },
                  "externalDocs": {
                    "$ref": "#/definitions/externalDocs"
                  },
                  "operationId": {
                    "type": "string",
                    "description": "A unique identifier of the operation."
                  },
                  "produces": {
                    "description": "A list of MIME types the API can produce.",
                    "allOf": [
                      {
                        "$ref": "#/definitions/mediaTypeList"
                      }
                    ]
                  },
                  "consumes": {
                    "description": "A list of MIME types the API can consume.",
                    "allOf": [
                      {
                        "$ref": "#/definitions/mediaTypeList"
                      }
                    ]
                  },
                  "parameters": {
                    "$ref": "#/definitions/parametersList"
                  },
                  "responses": {
                    "$ref": "#/definitions/responses"
                  },
                  "schemes": {
                    "$ref": "#/definitions/schemesList"
                  },
                  "deprecated": {
                    "type": "boolean",
                    "default": false
                  },
                  "security": {
                    "$ref": "#/definitions/security"
                  }
                }
              },
              "pathItem": {
                "type": "object",
                "additionalProperties": false,
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                },
                "properties": {
                  "$ref": {
                    "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"
                  },
                  "parameters": {
                    "$ref": "#/definitions/parametersList"
                  }
                }
              },
              "responses": {
                "type": "object",
                "description": "Response objects names can either be any valid HTTP status code or 'default'.",
                "minProperties": 1,
                "additionalProperties": false,
                "patternProperties": {
                  "^([0-9]{3})$|^(default)$": {
                    "$ref": "#/definitions/responseValue"
                  },
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                },
                "not": {
                  "type": "object",
                  "additionalProperties": false,
                  "patternProperties": {
                    "^x-": {
                      "$ref": "#/definitions/vendorExtension"
                    }
                  }
                }
              },
              "responseValue": {
                "oneOf": [
                  {
                    "$ref": "#/definitions/response"
                  },
                  {
                    "$ref": "#/definitions/jsonReference"
                  }
                ]
              },
              "response": {
                "type": "object",
                "required": [
                  "description"
                ],
                "properties": {
                  "description": {
                    "type": "string"
                  },
                  "schema": {
                    "oneOf": [
                      {
                        "$ref": "#/definitions/schema"
                      },
                      {
                        "$ref": "#/definitions/fileSchema"
                      }
                    ]
                  },
                  "headers": {
                    "$ref": "#/definitions/headers"
                  },
                  "examples": {
                    "$ref": "#/definitions/examples"
                  }
                },
                "additionalProperties": false,
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                }
              },
              "headers": {
                "type": "object",
                "additionalProperties": {
                  "$ref": "#/definitions/header"
                }
              },
              "header": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "type"
                ],
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "string",
                      "number",
                      "integer",
                      "boolean",
                      "array"
                    ]
                  },
                  "format": {
                    "type": "string"
                  },
                  "items": {
                    "$ref": "#/definitions/primitivesItems"
                  },
                  "collectionFormat": {
                    "$ref": "#/definitions/collectionFormat"
                  },
                  "default": {
                    "$ref": "#/definitions/default"
                  },
                  "maximum": {
                    "$ref": "#/definitions/maximum"
                  },
                  "exclusiveMaximum": {
                    "$ref": "#/definitions/exclusiveMaximum"
                  },
                  "minimum": {
                    "$ref": "#/definitions/minimum"
                  },
                  "exclusiveMinimum": {
                    "$ref": "#/definitions/exclusiveMinimum"
                  },
                  "maxLength": {
                    "$ref": "#/definitions/maxLength"
                  },
                  "minLength": {
                    "$ref": "#/definitions/minLength"
                  },
                  "pattern": {
                    "$ref": "#/definitions/pattern"
                  },
                  "maxItems": {
                    "$ref": "#/definitions/maxItems"
                  },
                  "minItems": {
                    "$ref": "#/definitions/minItems"
                  },
                  "uniqueItems": {
                    "$ref": "#/definitions/uniqueItems"
                  },
                  "enum": {
                    "$ref": "#/definitions/enum"
                  },
                  "multipleOf": {
                    "$ref": "#/definitions/multipleOf"
                  },
                  "description": {
                    "type": "string"
                  }
                },
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                }
              },
              "vendorExtension": {
                "description": "Any property starting with x- is valid.",
                "additionalProperties": true,
                "additionalItems": true
              },
              "bodyParameter": {
                "type": "object",
                "required": [
                  "name",
                  "in",
                  "schema"
                ],
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                },
                "properties": {
                  "description": {
                    "type": "string",
                    "description": "A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed."
                  },
                  "name": {
                    "type": "string",
                    "description": "The name of the parameter."
                  },
                  "in": {
                    "type": "string",
                    "description": "Determines the location of the parameter.",
                    "enum": [
                      "body"
                    ]
                  },
                  "required": {
                    "type": "boolean",
                    "description": "Determines whether or not this parameter is required or optional.",
                    "default": false
                  },
                  "schema": {
                    "$ref": "#/definitions/schema"
                  }
                },
                "additionalProperties": false
              },
              "headerParameterSubSchema": {
                "additionalProperties": false,
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                },
                "properties": {
                  "required": {
                    "type": "boolean",
                    "description": "Determines whether or not this parameter is required or optional.",
                    "default": false
                  },
                  "in": {
                    "type": "string",
                    "description": "Determines the location of the parameter.",
                    "enum": [
                      "header"
                    ]
                  },
                  "description": {
                    "type": "string",
                    "description": "A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed."
                  },
                  "name": {
                    "type": "string",
                    "description": "The name of the parameter."
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "string",
                      "number",
                      "boolean",
                      "integer",
                      "array"
                    ]
                  },
                  "format": {
                    "type": "string"
                  },
                  "items": {
                    "$ref": "#/definitions/primitivesItems"
                  },
                  "collectionFormat": {
                    "$ref": "#/definitions/collectionFormat"
                  },
                  "default": {
                    "$ref": "#/definitions/default"
                  },
                  "maximum": {
                    "$ref": "#/definitions/maximum"
                  },
                  "exclusiveMaximum": {
                    "$ref": "#/definitions/exclusiveMaximum"
                  },
                  "minimum": {
                    "$ref": "#/definitions/minimum"
                  },
                  "exclusiveMinimum": {
                    "$ref": "#/definitions/exclusiveMinimum"
                  },
                  "maxLength": {
                    "$ref": "#/definitions/maxLength"
                  },
                  "minLength": {
                    "$ref": "#/definitions/minLength"
                  },
                  "pattern": {
                    "$ref": "#/definitions/pattern"
                  },
                  "maxItems": {
                    "$ref": "#/definitions/maxItems"
                  },
                  "minItems": {
                    "$ref": "#/definitions/minItems"
                  },
                  "uniqueItems": {
                    "$ref": "#/definitions/uniqueItems"
                  },
                  "enum": {
                    "$ref": "#/definitions/enum"
                  },
                  "multipleOf": {
                    "$ref": "#/definitions/multipleOf"
                  }
                }
              },
              "queryParameterSubSchema": {
                "additionalProperties": false,
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                },
                "properties": {
                  "required": {
                    "type": "boolean",
                    "description": "Determines whether or not this parameter is required or optional.",
                    "default": false
                  },
                  "in": {
                    "type": "string",
                    "description": "Determines the location of the parameter.",
                    "enum": [
                      "query"
                    ]
                  },
                  "description": {
                    "type": "string",
                    "description": "A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed."
                  },
                  "name": {
                    "type": "string",
                    "description": "The name of the parameter."
                  },
                  "allowEmptyValue": {
                    "type": "boolean",
                    "default": false,
                    "description": "allows sending a parameter by name only or with an empty value."
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "string",
                      "number",
                      "boolean",
                      "integer",
                      "array"
                    ]
                  },
                  "format": {
                    "type": "string"
                  },
                  "items": {
                    "$ref": "#/definitions/primitivesItems"
                  },
                  "collectionFormat": {
                    "$ref": "#/definitions/collectionFormatWithMulti"
                  },
                  "default": {
                    "$ref": "#/definitions/default"
                  },
                  "maximum": {
                    "$ref": "#/definitions/maximum"
                  },
                  "exclusiveMaximum": {
                    "$ref": "#/definitions/exclusiveMaximum"
                  },
                  "minimum": {
                    "$ref": "#/definitions/minimum"
                  },
                  "exclusiveMinimum": {
                    "$ref": "#/definitions/exclusiveMinimum"
                  },
                  "maxLength": {
                    "$ref": "#/definitions/maxLength"
                  },
                  "minLength": {
                    "$ref": "#/definitions/minLength"
                  },
                  "pattern": {
                    "$ref": "#/definitions/pattern"
                  },
                  "maxItems": {
                    "$ref": "#/definitions/maxItems"
                  },
                  "minItems": {
                    "$ref": "#/definitions/minItems"
                  },
                  "uniqueItems": {
                    "$ref": "#/definitions/uniqueItems"
                  },
                  "enum": {
                    "$ref": "#/definitions/enum"
                  },
                  "multipleOf": {
                    "$ref": "#/definitions/multipleOf"
                  }
                }
              },
              "formDataParameterSubSchema": {
                "additionalProperties": false,
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                },
                "properties": {
                  "required": {
                    "type": "boolean",
                    "description": "Determines whether or not this parameter is required or optional.",
                    "default": false
                  },
                  "in": {
                    "type": "string",
                    "description": "Determines the location of the parameter.",
                    "enum": [
                      "formData"
                    ]
                  },
                  "description": {
                    "type": "string",
                    "description": "A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed."
                  },
                  "name": {
                    "type": "string",
                    "description": "The name of the parameter."
                  },
                  "allowEmptyValue": {
                    "type": "boolean",
                    "default": false,
                    "description": "allows sending a parameter by name only or with an empty value."
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "string",
                      "number",
                      "boolean",
                      "integer",
                      "array",
                      "file"
                    ]
                  },
                  "format": {
                    "type": "string"
                  },
                  "items": {
                    "$ref": "#/definitions/primitivesItems"
                  },
                  "collectionFormat": {
                    "$ref": "#/definitions/collectionFormatWithMulti"
                  },
                  "default": {
                    "$ref": "#/definitions/default"
                  },
                  "maximum": {
                    "$ref": "#/definitions/maximum"
                  },
                  "exclusiveMaximum": {
                    "$ref": "#/definitions/exclusiveMaximum"
                  },
                  "minimum": {
                    "$ref": "#/definitions/minimum"
                  },
                  "exclusiveMinimum": {
                    "$ref": "#/definitions/exclusiveMinimum"
                  },
                  "maxLength": {
                    "$ref": "#/definitions/maxLength"
                  },
                  "minLength": {
                    "$ref": "#/definitions/minLength"
                  },
                  "pattern": {
                    "$ref": "#/definitions/pattern"
                  },
                  "maxItems": {
                    "$ref": "#/definitions/maxItems"
                  },
                  "minItems": {
                    "$ref": "#/definitions/minItems"
                  },
                  "uniqueItems": {
                    "$ref": "#/definitions/uniqueItems"
                  },
                  "enum": {
                    "$ref": "#/definitions/enum"
                  },
                  "multipleOf": {
                    "$ref": "#/definitions/multipleOf"
                  }
                }
              },
              "pathParameterSubSchema": {
                "additionalProperties": false,
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                },
                "required": [
                  "required"
                ],
                "properties": {
                  "required": {
                    "type": "boolean",
                    "enum": [
                      true
                    ],
                    "description": "Determines whether or not this parameter is required or optional."
                  },
                  "in": {
                    "type": "string",
                    "description": "Determines the location of the parameter.",
                    "enum": [
                      "path"
                    ]
                  },
                  "description": {
                    "type": "string",
                    "description": "A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed."
                  },
                  "name": {
                    "type": "string",
                    "description": "The name of the parameter."
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "string",
                      "number",
                      "boolean",
                      "integer",
                      "array"
                    ]
                  },
                  "format": {
                    "type": "string"
                  },
                  "items": {
                    "$ref": "#/definitions/primitivesItems"
                  },
                  "collectionFormat": {
                    "$ref": "#/definitions/collectionFormat"
                  },
                  "default": {
                    "$ref": "#/definitions/default"
                  },
                  "maximum": {
                    "$ref": "#/definitions/maximum"
                  },
                  "exclusiveMaximum": {
                    "$ref": "#/definitions/exclusiveMaximum"
                  },
                  "minimum": {
                    "$ref": "#/definitions/minimum"
                  },
                  "exclusiveMinimum": {
                    "$ref": "#/definitions/exclusiveMinimum"
                  },
                  "maxLength": {
                    "$ref": "#/definitions/maxLength"
                  },
                  "minLength": {
                    "$ref": "#/definitions/minLength"
                  },
                  "pattern": {
                    "$ref": "#/definitions/pattern"
                  },
                  "maxItems": {
                    "$ref": "#/definitions/maxItems"
                  },
                  "minItems": {
                    "$ref": "#/definitions/minItems"
                  },
                  "uniqueItems": {
                    "$ref": "#/definitions/uniqueItems"
                  },
                  "enum": {
                    "$ref": "#/definitions/enum"
                  },
                  "multipleOf": {
                    "$ref": "#/definitions/multipleOf"
                  }
                }
              },
              "nonBodyParameter": {
                "type": "object",
                "required": [
                  "name",
                  "in",
                  "type"
                ],
                "oneOf": [
                  {
                    "$ref": "#/definitions/headerParameterSubSchema"
                  },
                  {
                    "$ref": "#/definitions/formDataParameterSubSchema"
                  },
                  {
                    "$ref": "#/definitions/queryParameterSubSchema"
                  },
                  {
                    "$ref": "#/definitions/pathParameterSubSchema"
                  }
                ]
              },
              "parameter": {
                "oneOf": [
                  {
                    "$ref": "#/definitions/bodyParameter"
                  },
                  {
                    "$ref": "#/definitions/nonBodyParameter"
                  }
                ]
              },
              "schema": {
                "type": "object",
                "description": "A deterministic version of a JSON Schema object.",
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                },
                "properties": {
                  "$ref": {
                    "type": "string"
                  },
                  "format": {
                    "type": "string"
                  },
                  "title": {
                    "$ref": "http://json-schema.org/draft-04/schema#/properties/title"
                  },
                  "description": {
                    "$ref": "http://json-schema.org/draft-04/schema#/properties/description"
                  },
                  "default": {
                    "$ref": "http://json-schema.org/draft-04/schema#/properties/default"
                  },
                  "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#/definitions/positiveInteger"
                  },
                  "minLength": {
                    "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
                  },
                  "pattern": {
                    "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern"
                  },
                  "maxItems": {
                    "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
                  },
                  "minItems": {
                    "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
                  },
                  "uniqueItems": {
                    "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems"
                  },
                  "maxProperties": {
                    "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
                  },
                  "minProperties": {
                    "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
                  },
                  "required": {
                    "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray"
                  },
                  "enum": {
                    "$ref": "http://json-schema.org/draft-04/schema#/properties/enum"
                  },
                  "additionalProperties": {
                    "anyOf": [
                      {
                        "$ref": "#/definitions/schema"
                      },
                      {
                        "type": "boolean"
                      }
                    ],
                    "default": {}
                  },
                  "type": {
                    "$ref": "http://json-schema.org/draft-04/schema#/properties/type"
                  },
                  "items": {
                    "anyOf": [
                      {
                        "$ref": "#/definitions/schema"
                      },
                      {
                        "type": "array",
                        "minItems": 1,
                        "items": {
                          "$ref": "#/definitions/schema"
                        }
                      }
                    ],
                    "default": {}
                  },
                  "allOf": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "$ref": "#/definitions/schema"
                    }
                  },
                  "oneOf": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "$ref": "#/definitions/schema"
                    }
                  },
                  "anyOf": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "$ref": "#/definitions/schema"
                    }
                  },
                  "properties": {
                    "type": "object",
                    "additionalProperties": {
                      "$ref": "#/definitions/schema"
                    },
                    "default": {}
                  },
                  "discriminator": {
                    "type": "string"
                  },
                  "readOnly": {
                    "type": "boolean",
                    "default": false
                  },
                  "xml": {
                    "$ref": "#/definitions/xml"
                  },
                  "externalDocs": {
                    "$ref": "#/definitions/externalDocs"
                  },
                  "example": {}
                },
                "additionalProperties": false
              },
              "fileSchema": {
                "type": "object",
                "description": "A deterministic version of a JSON Schema object.",
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                },
                "required": [
                  "type"
                ],
                "properties": {
                  "format": {
                    "type": "string"
                  },
                  "title": {
                    "$ref": "http://json-schema.org/draft-04/schema#/properties/title"
                  },
                  "description": {
                    "$ref": "http://json-schema.org/draft-04/schema#/properties/description"
                  },
                  "default": {
                    "$ref": "http://json-schema.org/draft-04/schema#/properties/default"
                  },
                  "required": {
                    "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray"
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "file"
                    ]
                  },
                  "readOnly": {
                    "type": "boolean",
                    "default": false
                  },
                  "externalDocs": {
                    "$ref": "#/definitions/externalDocs"
                  },
                  "example": {}
                },
                "additionalProperties": false
              },
              "primitivesItems": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "string",
                      "number",
                      "integer",
                      "boolean",
                      "array"
                    ]
                  },
                  "format": {
                    "type": "string"
                  },
                  "items": {
                    "$ref": "#/definitions/primitivesItems"
                  },
                  "collectionFormat": {
                    "$ref": "#/definitions/collectionFormat"
                  },
                  "default": {
                    "$ref": "#/definitions/default"
                  },
                  "maximum": {
                    "$ref": "#/definitions/maximum"
                  },
                  "exclusiveMaximum": {
                    "$ref": "#/definitions/exclusiveMaximum"
                  },
                  "minimum": {
                    "$ref": "#/definitions/minimum"
                  },
                  "exclusiveMinimum": {
                    "$ref": "#/definitions/exclusiveMinimum"
                  },
                  "maxLength": {
                    "$ref": "#/definitions/maxLength"
                  },
                  "minLength": {
                    "$ref": "#/definitions/minLength"
                  },
                  "pattern": {
                    "$ref": "#/definitions/pattern"
                  },
                  "maxItems": {
                    "$ref": "#/definitions/maxItems"
                  },
                  "minItems": {
                    "$ref": "#/definitions/minItems"
                  },
                  "uniqueItems": {
                    "$ref": "#/definitions/uniqueItems"
                  },
                  "enum": {
                    "$ref": "#/definitions/enum"
                  },
                  "multipleOf": {
                    "$ref": "#/definitions/multipleOf"
                  }
                },
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                }
              },
              "security": {
                "type": "array",
                "items": {
                  "$ref": "#/definitions/securityRequirement"
                },
                "uniqueItems": true
              },
              "securityRequirement": {
                "type": "object",
                "additionalProperties": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "uniqueItems": true
                }
              },
              "xml": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "namespace": {
                    "type": "string"
                  },
                  "prefix": {
                    "type": "string"
                  },
                  "attribute": {
                    "type": "boolean",
                    "default": false
                  },
                  "wrapped": {
                    "type": "boolean",
                    "default": false
                  }
                },
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                }
              },
              "tag": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "description": {
                    "type": "string"
                  },
                  "externalDocs": {
                    "$ref": "#/definitions/externalDocs"
                  }
                },
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                }
              },
              "securityDefinitions": {
                "type": "object",
                "additionalProperties": {
                  "oneOf": [
                    {
                      "$ref": "#/definitions/basicAuthenticationSecurity"
                    },
                    {
                      "$ref": "#/definitions/apiKeySecurity"
                    },
                    {
                      "$ref": "#/definitions/oauth2ImplicitSecurity"
                    },
                    {
                      "$ref": "#/definitions/oauth2PasswordSecurity"
                    },
                    {
                      "$ref": "#/definitions/oauth2ApplicationSecurity"
                    },
                    {
                      "$ref": "#/definitions/oauth2AccessCodeSecurity"
                    }
                  ]
                }
              },
              "basicAuthenticationSecurity": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "type"
                ],
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "basic"
                    ]
                  },
                  "description": {
                    "type": "string"
                  }
                },
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                }
              },
              "apiKeySecurity": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "type",
                  "name",
                  "in"
                ],
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "apiKey"
                    ]
                  },
                  "name": {
                    "type": "string"
                  },
                  "in": {
                    "type": "string",
                    "enum": [
                      "header",
                      "query"
                    ]
                  },
                  "description": {
                    "type": "string"
                  }
                },
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                }
              },
              "oauth2ImplicitSecurity": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "type",
                  "flow",
                  "authorizationUrl"
                ],
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "oauth2"
                    ]
                  },
                  "flow": {
                    "type": "string",
                    "enum": [
                      "implicit"
                    ]
                  },
                  "scopes": {
                    "$ref": "#/definitions/oauth2Scopes"
                  },
                  "authorizationUrl": {
                    "type": "string",
                    "format": "uri"
                  },
                  "description": {
                    "type": "string"
                  }
                },
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                }
              },
              "oauth2PasswordSecurity": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "type",
                  "flow",
                  "tokenUrl"
                ],
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "oauth2"
                    ]
                  },
                  "flow": {
                    "type": "string",
                    "enum": [
                      "password"
                    ]
                  },
                  "scopes": {
                    "$ref": "#/definitions/oauth2Scopes"
                  },
                  "tokenUrl": {
                    "type": "string",
                    "format": "uri"
                  },
                  "description": {
                    "type": "string"
                  }
                },
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                }
              },
              "oauth2ApplicationSecurity": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "type",
                  "flow",
                  "tokenUrl"
                ],
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "oauth2"
                    ]
                  },
                  "flow": {
                    "type": "string",
                    "enum": [
                      "application"
                    ]
                  },
                  "scopes": {
                    "$ref": "#/definitions/oauth2Scopes"
                  },
                  "tokenUrl": {
                    "type": "string",
                    "format": "uri"
                  },
                  "description": {
                    "type": "string"
                  }
                },
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                }
              },
              "oauth2AccessCodeSecurity": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "type",
                  "flow",
                  "authorizationUrl",
                  "tokenUrl"
                ],
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "oauth2"
                    ]
                  },
                  "flow": {
                    "type": "string",
                    "enum": [
                      "accessCode"
                    ]
                  },
                  "scopes": {
                    "$ref": "#/definitions/oauth2Scopes"
                  },
                  "authorizationUrl": {
                    "type": "string",
                    "format": "uri"
                  },
                  "tokenUrl": {
                    "type": "string",
                    "format": "uri"
                  },
                  "description": {
                    "type": "string"
                  }
                },
                "patternProperties": {
                  "^x-": {
                    "$ref": "#/definitions/vendorExtension"
                  }
                }
              },
              "oauth2Scopes": {
                "type": "object",
                "additionalProperties": {
                  "type": "string"
                }
              },
              "mediaTypeList": {
                "type": "array",
                "items": {
                  "$ref": "#/definitions/mimeType"
                },
                "uniqueItems": true
              },
              "parametersList": {
                "type": "array",
                "description": "The parameters needed to send a valid API call.",
                "additionalItems": false,
                "items": {
                  "oneOf": [
                    {
                      "$ref": "#/definitions/parameter"
                    },
                    {
                      "$ref": "#/definitions/jsonReference"
                    }
                  ]
                },
                "uniqueItems": true
              },
              "schemesList": {
                "type": "array",
                "description": "The transfer protocol of the API.",
                "items": {
                  "type": "string",
                  "enum": [
                    "http",
                    "https",
                    "ws",
                    "wss"
                  ]
                },
                "uniqueItems": true
              },
              "collectionFormat": {
                "type": "string",
                "enum": [
                  "csv",
                  "ssv",
                  "tsv",
                  "pipes"
                ],
                "default": "csv"
              },
              "collectionFormatWithMulti": {
                "type": "string",
                "enum": [
                  "csv",
                  "ssv",
                  "tsv",
                  "pipes",
                  "multi"
                ],
                "default": "csv"
              },
              "title": {
                "$ref": "http://json-schema.org/draft-04/schema#/properties/title"
              },
              "description": {
                "$ref": "http://json-schema.org/draft-04/schema#/properties/description"
              },
              "default": {
                "$ref": "http://json-schema.org/draft-04/schema#/properties/default"
              },
              "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#/definitions/positiveInteger"
              },
              "minLength": {
                "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
              },
              "pattern": {
                "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern"
              },
              "maxItems": {
                "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
              },
              "minItems": {
                "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
              },
              "uniqueItems": {
                "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems"
              },
              "enum": {
                "$ref": "http://json-schema.org/draft-04/schema#/properties/enum"
              },
              "jsonReference": {
                "type": "object",
                "required": [
                  "$ref"
                ],
                "additionalProperties": false,
                "properties": {
                  "$ref": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "tags": [
        "schema"
      ]
    },
    "api-host": {
      "summary": "OpenAPI `host` must be present and non-empty string.",
      "type": "style",
      "given": "$",
      "then": {
        "field": "host",
        "function": "truthy"
      },
      "tags": [
        "api"
      ]
    },
    "api-schemes": {
      "summary": "OpenAPI host `schemes` must be present and non-empty array.",
      "type": "style",
      "given": "$",
      "then": {
        "field": "schemes",
        "function": "schema",
        "functionOptions": {
          "schema": {
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          }
        }
      },
      "tags": [
        "api"
      ]
    },
    "host-not-example": {
      "enabled": false,
      "summary": "Server URL should not point at `example.com`.",
      "type": "style",
      "given": "$",
      "then": {
        "field": "host",
        "function": "pattern",
        "functionOptions": {
          "notMatch": "example.com"
        }
      }
    },
    "host-trailing-slash": {
      "summary": "Server URL should not have a trailing slash.",
      "type": "style",
      "given": "$",
      "then": {
        "field": "host",
        "function": "pattern",
        "functionOptions": {
          "notMatch": "/$"
        }
      }
    },
    "model-description": {
      "enabled": false,
      "summary": "Definition `description` must be present and non-empty string.",
      "type": "style",
      "given": "$..definitions[*]",
      "then": {
        "field": "description",
        "function": "truthy"
      }
    },
    "operation-security-defined": {
      "summary": "Operation `security` values must match a scheme defined in the `securityDefinitions` object.",
      "type": "validation",
      "given": "$",
      "then": {
        "function": "oasOpSecurityDefined",
        "functionOptions": {
          "schemesPath": [
            "securityDefinitions"
          ]
        }
      },
      "tags": [
        "operation"
      ]
    },
    "valid-example": {
      "summary": "Examples must be valid against their defined schema.",
      "message": "\"{{property}}\" property {{error}}",
      "type": "validation",
      "given": "$..[?(@.example)]",
      "then": {
        "function": "schemaPath",
        "functionOptions": {
          "field": "example",
          "schemaPath": "$"
        }
      }
    }
  }
}
