{
  "type": "object",
  "properties": {
    "version": {
      "$ref": "#/definitions/decimal_type"
    },
    "address": {
      "$ref": "#/definitions/address_type"
    },
    "phones": {
      "type": "array",
      "minItems": 1,
      "maxItems": 2,
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/phone_type"
      }
    },
    "names": {
      "type": "array",
      "items": [
        { "type": "string" },
        { "type": "string" }
      ],
      "additionalItems": false
    },
    "extra": {
      "type": "object",
      "patternProperties": {
        "^S_": { "type": "string" }
      }
    },
    "gender": {
      "type": "string",
      "enum": ["M", "F"]
    }
  },
  "additionalProperties": false,
  "dependencies": {
    "address": [ "version" ],
    "names": {
      "properties": {
        "version": { "$ref": "#/definitions/decimal_type" }
      },
      "required": ["version"]
    }
  },
  "definitions": {
    "address_type": {
      "type": "object",
      "properties": {
        "number": {
          "$ref": "#/definitions/positiveInt_type"
        },
        "street1": {
          "type": "string"
        },
        "street2": {
          "type": ["string", "null"]
        },
        "street3": {
          "not": { "type": ["boolean", "number", ",integer", "object", "null"] }
        },
        "city": {
          "type": "string",
          "maxLength": 10,
          "minLength": 4
        },
        "area": {
          "oneOf": [
            { "$ref": "#/definitions/county_type" },
            { "$ref": "#/definitions/province_type" }
          ]
        },
        "country": {
          "allOf": [
            { "$ref": "#/definitions/country_type" }
          ]
        },
        "postcode": {
          "anyOf": [
            { "type": "string", "pattern": "^[A-Z]{2}[0-9]{1,2} [0-9][A-Z]{2}$" },
            { "type": "string", "pattern": "^[0-9]{5}$" }
          ]
        }
      },
      "minProperties": 7,
      "required": [
        "number",
        "street1",
        "city"
      ]
    },
    "country_type": {
      "type": "string",
      "enum": ["UK", "Canada"]
    },
    "county_type": {
      "type": "string",
      "enum": ["Sussex", "Surrey", "Kent"]
    },
    "province_type": {
      "type": "string",
      "enum": ["Quebec", "BC", "Alberta"]
    },
    "date_type": {
      "pattern": "^([0-9]([0-9]([0-9][1-9]|[1-9]0)|[1-9]00)|[1-9]000)(-(0[1-9]|1[0-2])(-(0[1-9]|[1-2][0-9]|3[0-1]))?)?$",
      "type": "string"
    },
    "positiveInt_type": {
      "minimum": 0,
      "exclusiveMinimum": true,
      "maximum": 100,
      "exclusiveMaximum": true,
      "type": "integer"
    },
    "decimal_type": {
      "multipleOf": 1.0,
      "type": "number"
    },
    "time_type": {
      "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)(\\.[0-9]+)?$",
      "type": "string"
    },
    "unsignedInt_type": {
      "type": "integer",
      "minimum": 0,
      "maximum": 99999
    },
    "phone_type": {
      "pattern": "^[0-9]*-[0-9]*",
      "type": "string"
    },
    "url_type": {
      "pattern": "^\\S*$",
      "type": "string"
    }
  }
}