{
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "$id": "https://jabbertoon.com/schemas/character-pack.schema.json",
 "title": "Jabbertoon character pack",
 "description": "A character made of shapes on a tree of parts (docs/PACK_FORMAT.md, \"character\"; https://jabbertoon.com/docs/packs/). JavaScript's validateCharacter (ui/character_pack.js) checks seven more rules that JSON Schema cannot count or compare: at most 200 parts in a tree; \"legs\" equals the number of leg roots in every view; ids are unique in a tree; a spot names a part of its own view and only a view the character has; limits.min is at most limits.max; at most 4000 points in one poly shape, all its outlines together (this schema can only cap each outline at 4000); and at most 200,000 JSON values in the whole content (every object, list, string, number, boolean and null: about 66,000 outline points). Ids and names are counted in letters (code points), as maxLength counts them.",
 "type": "object",
 "properties": {
  "pack": {
   "const": 1
  },
  "id": {
   "type": "string",
   "pattern": "^(?:c4c:char:[a-z0-9_-]{1,40}|local:char:[0-9a-f]{12})$"
  },
  "type": {
   "const": "character"
  },
  "version": {
   "type": "string",
   "pattern": "^\\d+\\.\\d+\\.\\d+$"
  },
  "name": {
   "type": "string",
   "minLength": 1,
   "maxLength": 60
  },
  "description": {
   "type": "string"
  },
  "author": {
   "type": "object",
   "properties": {
    "id": {
     "type": "string"
    },
    "name": {
     "type": "string"
    }
   },
   "required": [
    "id"
   ],
   "additionalProperties": false
  },
  "license": {
   "enum": [
    "cc0",
    "cc-by",
    "c4c-free",
    "c4c-paid",
    "own"
   ]
  },
  "remixable": {
   "type": "boolean"
  },
  "derived_from": {
   "type": "array",
   "items": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "version": {
      "type": "string"
     },
     "note": {
      "type": "string"
     }
    },
    "required": [
     "id"
    ],
    "additionalProperties": false
   }
  },
  "preview": {
   "type": "object"
  },
  "content_hash": {
   "type": "string",
   "pattern": "^sha256:[0-9a-f]{64}$"
  },
  "content": {
   "$ref": "#/$defs/content"
  }
 },
 "required": [
  "pack",
  "id",
  "type",
  "version",
  "name",
  "author",
  "license",
  "remixable",
  "derived_from",
  "content_hash",
  "content"
 ],
 "additionalProperties": false,
 "$defs": {
  "number": {
   "type": "number",
   "minimum": -10000,
   "maximum": 10000
  },
  "shape": {
   "type": "object",
   "oneOf": [
    {
     "type": "object",
     "properties": {
      "type": {
       "const": "ellipse"
      },
      "w": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "h": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "ox": {
       "$ref": "#/$defs/number"
      },
      "oy": {
       "$ref": "#/$defs/number"
      }
     },
     "required": [
      "type",
      "w",
      "h"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "properties": {
      "type": {
       "const": "capsule"
      },
      "w": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "h": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "ox": {
       "$ref": "#/$defs/number"
      },
      "oy": {
       "$ref": "#/$defs/number"
      }
     },
     "required": [
      "type",
      "w",
      "h"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "properties": {
      "type": {
       "const": "hcapsule"
      },
      "w": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "h": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "ox": {
       "$ref": "#/$defs/number"
      },
      "oy": {
       "$ref": "#/$defs/number"
      }
     },
     "required": [
      "type",
      "w",
      "h"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "properties": {
      "type": {
       "const": "rrect"
      },
      "w": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "h": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "ox": {
       "$ref": "#/$defs/number"
      },
      "oy": {
       "$ref": "#/$defs/number"
      },
      "r": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      }
     },
     "required": [
      "type",
      "w",
      "h"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "properties": {
      "type": {
       "const": "teardrop"
      },
      "w": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "h": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "ox": {
       "$ref": "#/$defs/number"
      },
      "oy": {
       "$ref": "#/$defs/number"
      }
     },
     "required": [
      "type",
      "w",
      "h"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "properties": {
      "type": {
       "const": "drop"
      },
      "w": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "h": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "ox": {
       "$ref": "#/$defs/number"
      },
      "oy": {
       "$ref": "#/$defs/number"
      }
     },
     "required": [
      "type",
      "w",
      "h"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "properties": {
      "type": {
       "const": "tri"
      },
      "w": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "h": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "ox": {
       "$ref": "#/$defs/number"
      },
      "oy": {
       "$ref": "#/$defs/number"
      }
     },
     "required": [
      "type",
      "w",
      "h"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "properties": {
      "type": {
       "const": "spike"
      },
      "w": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "h": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "ox": {
       "$ref": "#/$defs/number"
      },
      "oy": {
       "$ref": "#/$defs/number"
      },
      "lean": {
       "$ref": "#/$defs/number"
      }
     },
     "required": [
      "type",
      "w",
      "h"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "properties": {
      "type": {
       "const": "egg"
      },
      "w": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "h": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "ox": {
       "$ref": "#/$defs/number"
      },
      "oy": {
       "$ref": "#/$defs/number"
      },
      "top": {
       "$ref": "#/$defs/number"
      }
     },
     "required": [
      "type",
      "w",
      "h"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "properties": {
      "type": {
       "const": "strokes"
      },
      "w": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "h": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "ox": {
       "$ref": "#/$defs/number"
      },
      "oy": {
       "$ref": "#/$defs/number"
      },
      "lw": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "lines": {
       "type": "array",
       "maxItems": 64,
       "items": {
        "type": "array",
        "minItems": 4,
        "maxItems": 4,
        "items": {
         "$ref": "#/$defs/number"
        }
       }
      }
     },
     "required": [
      "type"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "properties": {
      "type": {
       "const": "taper"
      },
      "w": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "h": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "ox": {
       "$ref": "#/$defs/number"
      },
      "oy": {
       "$ref": "#/$defs/number"
      },
      "w2": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      }
     },
     "required": [
      "type",
      "w",
      "h"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "properties": {
      "type": {
       "const": "poly"
      },
      "w": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "h": {
       "type": "number",
       "minimum": 0,
       "maximum": 10000
      },
      "ox": {
       "$ref": "#/$defs/number"
      },
      "oy": {
       "$ref": "#/$defs/number"
      },
      "subs": {
       "type": "array",
       "maxItems": 16,
       "items": {
        "type": "array",
        "maxItems": 4000,
        "items": {
         "type": "array",
         "minItems": 2,
         "maxItems": 2,
         "items": {
          "$ref": "#/$defs/number"
         }
        }
       }
      }
     },
     "required": [
      "type",
      "subs"
     ],
     "additionalProperties": false
    }
   ]
  },
  "fields": {
   "type": "object",
   "properties": {
    "id": {
     "type": "string",
     "minLength": 1,
     "maxLength": 64
    },
    "role": {
     "enum": [
      "root",
      "head",
      "neck",
      "torso",
      "hips",
      "arm",
      "forearm",
      "hand",
      "leg",
      "shin",
      "foot",
      "tail",
      "ear",
      "wing",
      "fin",
      "claw",
      "snout",
      "nose",
      "hair",
      "hat",
      "eye",
      "brow",
      null
     ]
    },
    "side": {
     "enum": [
      -1,
      0,
      1
     ]
    },
    "index": {
     "type": "integer",
     "minimum": 0,
     "maximum": 15
    },
    "shape": {
     "$ref": "#/$defs/shape"
    },
    "fit": {
     "$ref": "#/$defs/shape"
    },
    "pos": {
     "type": "object",
     "properties": {
      "x": {
       "$ref": "#/$defs/number"
      },
      "y": {
       "$ref": "#/$defs/number"
      }
     },
     "required": [
      "x",
      "y"
     ],
     "additionalProperties": false
    },
    "tip": {
     "type": "object",
     "properties": {
      "x": {
       "$ref": "#/$defs/number"
      },
      "y": {
       "$ref": "#/$defs/number"
      }
     },
     "required": [
      "x",
      "y"
     ],
     "additionalProperties": false
    },
    "rot": {
     "$ref": "#/$defs/number"
    },
    "z": {
     "$ref": "#/$defs/number"
    },
    "curl": {
     "$ref": "#/$defs/number"
    },
    "sx": {
     "allOf": [
      {
       "type": "number",
       "minimum": -100,
       "maximum": 100
      },
      {
       "not": {
        "type": "number",
        "exclusiveMinimum": -0.01,
        "exclusiveMaximum": 0.01
       }
      }
     ]
    },
    "sy": {
     "allOf": [
      {
       "type": "number",
       "minimum": -100,
       "maximum": 100
      },
      {
       "not": {
        "type": "number",
        "exclusiveMinimum": -0.01,
        "exclusiveMaximum": 0.01
       }
      }
     ]
    },
    "fill": {
     "type": "string",
     "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
    },
    "outline": {
     "anyOf": [
      {
       "type": "boolean"
      },
      {
       "type": "string",
       "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
      }
     ]
    },
    "face": {
     "anyOf": [
      {
       "type": "null"
      },
      {
       "type": "object",
       "properties": {
        "eyeX": {
         "$ref": "#/$defs/number"
        },
        "eyeY": {
         "$ref": "#/$defs/number"
        },
        "eyeR": {
         "type": "number",
         "minimum": 0,
         "maximum": 10000
        },
        "eyeCX": {
         "$ref": "#/$defs/number"
        },
        "eyes": {
         "enum": [
          1,
          2
         ]
        },
        "oneEye": {
         "type": "number",
         "minimum": 0,
         "maximum": 10000
        },
        "slit": {
         "type": "boolean"
        },
        "pupil": {
         "type": "string",
         "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
        },
        "brows": {
         "type": "boolean"
        },
        "browColor": {
         "type": "string",
         "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
        },
        "mouthW": {
         "$ref": "#/$defs/number"
        },
        "mouthH": {
         "$ref": "#/$defs/number"
        },
        "mouthX": {
         "$ref": "#/$defs/number"
        },
        "mouthY": {
         "$ref": "#/$defs/number"
        },
        "mouthColor": {
         "type": "string",
         "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
        },
        "fangs": {
         "type": "boolean"
        },
        "beak": {
         "type": "object",
         "properties": {
          "w": {
           "type": "number",
           "minimum": 0,
           "maximum": 10000
          },
          "h": {
           "type": "number",
           "minimum": 0,
           "maximum": 10000
          },
          "color": {
           "type": "string",
           "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
          }
         },
         "required": [
          "w",
          "h"
         ],
         "additionalProperties": false
        },
        "cheeks": {
         "type": "boolean"
        },
        "z": {
         "$ref": "#/$defs/number"
        },
        "profile": {
         "type": "boolean"
        }
       },
       "required": [
        "eyeX",
        "eyeY",
        "eyeR",
        "mouthW",
        "mouthH",
        "mouthY"
       ],
       "additionalProperties": false
      }
     ]
    },
    "limits": {
     "type": "object",
     "properties": {
      "min": {
       "$ref": "#/$defs/number"
      },
      "max": {
       "$ref": "#/$defs/number"
      }
     },
     "required": [
      "min",
      "max"
     ],
     "additionalProperties": false
    },
    "flex": {
     "enum": [
      1,
      -1
     ]
    },
    "sign": {
     "enum": [
      1,
      -1
     ]
    },
    "over": {
     "type": "array",
     "minItems": 2,
     "maxItems": 2,
     "items": {
      "$ref": "#/$defs/number"
     }
    },
    "fold": {
     "type": "boolean"
    },
    "bend": {
     "type": "boolean"
    }
   }
  },
  "part1": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part2"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part2": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part3"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part3": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part4"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part4": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part5"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part5": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part6"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part6": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part7"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part7": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part8"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part8": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part9"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part9": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part10"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part10": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part11"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part11": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part12"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part12": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part13"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part13": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part14"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part14": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part15"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part15": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part16"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part16": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part17"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part17": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part18"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part18": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part19"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part19": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part20"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part20": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part21"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part21": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part22"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part22": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part23"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part23": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 32,
     "items": {
      "$ref": "#/$defs/part24"
     }
    }
   },
   "unevaluatedProperties": false
  },
  "part24": {
   "type": "object",
   "$ref": "#/$defs/fields",
   "properties": {
    "children": {
     "type": "array",
     "maxItems": 0
    }
   },
   "unevaluatedProperties": false
  },
  "content": {
   "type": "object",
   "properties": {
    "tree": {
     "$ref": "#/$defs/part1"
    },
    "legs": {
     "type": "integer",
     "minimum": 0,
     "maximum": 16
    },
    "kind": {
     "enum": [
      "person",
      "kid",
      "dog",
      "cat",
      "bird",
      "monster",
      "custom"
     ]
    },
    "height": {
     "type": "number",
     "minimum": 0.000001,
     "maximum": 10000
    },
    "footprint": {
     "type": "number",
     "minimum": 0,
     "maximum": 10000
    },
    "look": {
     "enum": [
      "flat",
      "outlined",
      "soft",
      "storybook",
      "bold",
      "crayon"
     ]
    },
    "views": {
     "type": "array",
     "minItems": 1,
     "maxItems": 3,
     "prefixItems": [
      {
       "type": "object",
       "properties": {
        "view": {
         "enum": [
          "front",
          "side",
          "back"
         ]
        }
       },
       "required": [
        "view"
       ],
       "additionalProperties": false
      }
     ],
     "items": {
      "type": "object",
      "properties": {
       "view": {
        "enum": [
         "front",
         "side",
         "back"
        ]
       },
       "tree": {
        "$ref": "#/$defs/part1"
       },
       "footprint": {
        "type": "number",
        "minimum": 0,
        "maximum": 10000
       }
      },
      "required": [
       "view",
       "tree"
      ],
      "additionalProperties": false
     },
     "allOf": [
      {
       "contains": {
        "type": "object",
        "properties": {
         "view": {
          "const": "front"
         }
        },
        "required": [
         "view"
        ]
       },
       "minContains": 0,
       "maxContains": 1
      },
      {
       "contains": {
        "type": "object",
        "properties": {
         "view": {
          "const": "side"
         }
        },
        "required": [
         "view"
        ]
       },
       "minContains": 0,
       "maxContains": 1
      },
      {
       "contains": {
        "type": "object",
        "properties": {
         "view": {
          "const": "back"
         }
        },
        "required": [
         "view"
        ]
       },
       "minContains": 0,
       "maxContains": 1
      }
     ]
    },
    "spots": {
     "type": "object",
     "properties": {
      "front": {
       "type": "object",
       "properties": {
        "hip": {
         "type": "object",
         "properties": {
          "node": {
           "type": "string"
          },
          "at": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "alt": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "mirror": {
           "type": "boolean"
          },
          "hands": {
           "type": "boolean"
          }
         },
         "required": [
          "node",
          "at"
         ],
         "additionalProperties": false
        },
        "chest": {
         "type": "object",
         "properties": {
          "node": {
           "type": "string"
          },
          "at": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "alt": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "mirror": {
           "type": "boolean"
          },
          "hands": {
           "type": "boolean"
          }
         },
         "required": [
          "node",
          "at"
         ],
         "additionalProperties": false
        },
        "head": {
         "type": "object",
         "properties": {
          "node": {
           "type": "string"
          },
          "at": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "alt": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "mirror": {
           "type": "boolean"
          },
          "hands": {
           "type": "boolean"
          }
         },
         "required": [
          "node",
          "at"
         ],
         "additionalProperties": false
        },
        "mouth": {
         "type": "object",
         "properties": {
          "node": {
           "type": "string"
          },
          "at": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "alt": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "mirror": {
           "type": "boolean"
          },
          "hands": {
           "type": "boolean"
          }
         },
         "required": [
          "node",
          "at"
         ],
         "additionalProperties": false
        }
       },
       "additionalProperties": false
      },
      "side": {
       "type": "object",
       "properties": {
        "hip": {
         "type": "object",
         "properties": {
          "node": {
           "type": "string"
          },
          "at": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "alt": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "mirror": {
           "type": "boolean"
          },
          "hands": {
           "type": "boolean"
          }
         },
         "required": [
          "node",
          "at"
         ],
         "additionalProperties": false
        },
        "chest": {
         "type": "object",
         "properties": {
          "node": {
           "type": "string"
          },
          "at": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "alt": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "mirror": {
           "type": "boolean"
          },
          "hands": {
           "type": "boolean"
          }
         },
         "required": [
          "node",
          "at"
         ],
         "additionalProperties": false
        },
        "head": {
         "type": "object",
         "properties": {
          "node": {
           "type": "string"
          },
          "at": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "alt": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "mirror": {
           "type": "boolean"
          },
          "hands": {
           "type": "boolean"
          }
         },
         "required": [
          "node",
          "at"
         ],
         "additionalProperties": false
        },
        "mouth": {
         "type": "object",
         "properties": {
          "node": {
           "type": "string"
          },
          "at": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "alt": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "mirror": {
           "type": "boolean"
          },
          "hands": {
           "type": "boolean"
          }
         },
         "required": [
          "node",
          "at"
         ],
         "additionalProperties": false
        }
       },
       "additionalProperties": false
      },
      "back": {
       "type": "object",
       "properties": {
        "hip": {
         "type": "object",
         "properties": {
          "node": {
           "type": "string"
          },
          "at": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "alt": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "mirror": {
           "type": "boolean"
          },
          "hands": {
           "type": "boolean"
          }
         },
         "required": [
          "node",
          "at"
         ],
         "additionalProperties": false
        },
        "chest": {
         "type": "object",
         "properties": {
          "node": {
           "type": "string"
          },
          "at": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "alt": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "mirror": {
           "type": "boolean"
          },
          "hands": {
           "type": "boolean"
          }
         },
         "required": [
          "node",
          "at"
         ],
         "additionalProperties": false
        },
        "head": {
         "type": "object",
         "properties": {
          "node": {
           "type": "string"
          },
          "at": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "alt": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "mirror": {
           "type": "boolean"
          },
          "hands": {
           "type": "boolean"
          }
         },
         "required": [
          "node",
          "at"
         ],
         "additionalProperties": false
        },
        "mouth": {
         "type": "object",
         "properties": {
          "node": {
           "type": "string"
          },
          "at": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "alt": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
            "$ref": "#/$defs/number"
           }
          },
          "mirror": {
           "type": "boolean"
          },
          "hands": {
           "type": "boolean"
          }
         },
         "required": [
          "node",
          "at"
         ],
         "additionalProperties": false
        }
       },
       "additionalProperties": false
      }
     },
     "additionalProperties": false
    },
    "silly": {
     "type": "boolean"
    }
   },
   "required": [
    "tree",
    "legs",
    "kind",
    "height",
    "footprint"
   ],
   "additionalProperties": false
  }
 }
}
