<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
  <xs:simpleType name="BooleanType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="true" />
      <xs:enumeration value="false" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="BooleanNodeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="" />
      <xs:enumeration value="true" />
      <xs:enumeration value="false" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ConfigLocalizedType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="mandatory" />
      <xs:enumeration value="optional" />
      <xs:enumeration value="no" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="NonEmptyString">
    <xs:restriction base="xs:string">
      <xs:pattern value=".*\S.*" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="CuidType">
    <xs:restriction base="xs:string">
      <xs:pattern value="[0-9a-f]{24}" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="nodeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Concept" />
      <xs:enumeration value="Term" />
      <xs:enumeration value="Tag" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="propertyTypeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="text" />
      <xs:enumeration value="multiline_text" />
      <xs:enumeration value="number" />
      <xs:enumeration value="date" />
      <xs:enumeration value="boolean" />
      <xs:enumeration value="picklist" />
      <xs:enumeration value="multiselect_picklist" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="propertyTypeWithAssetType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="text" />
      <xs:enumeration value="multiline_text" />
      <xs:enumeration value="number" />
      <xs:enumeration value="date" />
      <xs:enumeration value="boolean" />
      <xs:enumeration value="picklist" />
      <xs:enumeration value="multiselect_picklist" />
      <xs:enumeration value="asset" />
    </xs:restriction>
  </xs:simpleType>
  <!-- POLICY -->
  <xs:simpleType name="policyScopeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="all" />
      <xs:enumeration value="new" />
      <xs:enumeration value="exists" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="basePolicyType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ignore" />
      <xs:enumeration value="include" />
      <xs:enumeration value="add" />
      <xs:enumeration value="replace" />
      <xs:enumeration value="invoke" />
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="policyType">
    <xs:simpleContent>
      <xs:extension base="basePolicyType">
        <xs:attribute name="scope" type="policyScopeType" use="optional" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="termPolicyType">
    <xs:simpleContent>
      <xs:extension base="policyType">
        <xs:attribute name="lang" type="xs:language" use="optional" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="propertyPolicyType">
    <xs:simpleContent>
      <xs:extension base="termPolicyType">
        <xs:attribute name="key" type="xs:string" use="optional" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <!-- CONFIG -->
  <xs:simpleType name="configKeyType">
    <xs:restriction base="xs:string">
      <xs:pattern value="[^$\.]+[^\.]*" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="configACLSubjectTypeType">
    <xs:restriction base="xs:string">
      <xs:pattern value="config" />
      <xs:pattern value="concept" />
      <xs:pattern value="concept_property" />
      <xs:pattern value="term" />
      <xs:pattern value="term_property" />
      <xs:pattern value="edge" />
      <xs:pattern value="edge_property" />
      <xs:pattern value="property" />
      <xs:pattern value="filter_set" />
      <xs:pattern value="todo_task" />
      <xs:pattern value="import" />
      <xs:pattern value="export" />
      <xs:pattern value="snapshot" />
      <xs:pattern value="import_policy_set" />
      <xs:pattern value="export_template" />
      <xs:pattern value="xslt_stylesheet" />
      <xs:pattern value="pdf_template" />
      <xs:pattern value="sparql" />
      <xs:pattern value="annotation" />
      <xs:pattern value="mcp" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="configACLActionTypeType">
    <xs:restriction base="xs:string">
      <xs:pattern value="manage" />
      <xs:pattern value="read" />
      <xs:pattern value="write" />
      <xs:pattern value="set_public" />
      <xs:pattern value="apply" />
      <xs:pattern value="aknowledge" />
      <xs:pattern value="sparql_query" />
      <xs:pattern value="use" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="configACLActionConditionTypeType">
    <xs:restriction base="xs:string">
      <xs:pattern value="own" />
      <xs:pattern value="new" />
      <xs:pattern value="public" />
      <xs:pattern value="key" />
      <xs:pattern value="lang" />
      <xs:pattern value="property" />
      <xs:pattern value="flag_set" />
      <xs:pattern value="edge_type" />
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="configLabelType">
    <xs:simpleContent>
      <xs:extension base="NonEmptyString">
        <xs:attribute name="lang" type="xs:language" use="required" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="configLabelsType">
    <xs:sequence>
      <xs:element name="label" type="configLabelType" minOccurs="1" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="configType">
    <xs:attribute name="key" type="configKeyType" use="required" />
  </xs:complexType>
  <xs:complexType name="configValueType">
    <xs:complexContent>
      <xs:extension base="configType">
        <xs:all>
          <xs:element name="labels" type="configLabelsType" minOccurs="0" maxOccurs="1" />
        </xs:all>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="valueType">
    <xs:sequence>
      <xs:element name="labels" type="configLabelsType" minOccurs="0" maxOccurs="1" />
    </xs:sequence>
    <xs:attribute name="key" type="NonEmptyString" use="required" />
  </xs:complexType>
  <xs:complexType name="configLanguageType">
    <xs:complexContent>
      <xs:extension base="configValueType" />
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="configPropertyTypeType">
    <xs:complexContent>
      <xs:extension base="configType">
        <xs:choice maxOccurs="unbounded">
          <xs:element name="labels" type="configLabelsType" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>(future enhancement: instead of hard-wired property key value, show an even localisable custom UI string)</xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="required" type="BooleanNodeType" minOccurs="0" maxOccurs="1" />
          <xs:element name="autoincr" type="BooleanNodeType" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>for properties of type number, auto-generate the next value</xs:documentation>
            </xs:annotation>
          </xs:element>
          <!-- TODO: Limit these 2 elements to conceptProperties only -->
          <xs:element name="localized" type="ConfigLocalizedType" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>whether a property must,  can or may not carry a language flag. Applies only to concept properties</xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="uniqueSiblings" type="BooleanNodeType" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>if true, then this property's value may only who up once amongst its siblings</xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="flagSets" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>a multiselect picklist-like data structure to flag a property with a set of values</xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:element name="flagSet" minOccurs="1" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element name="labels" type="configLabelsType" minOccurs="0" maxOccurs="1" />
                      <xs:element name="values" minOccurs="1" maxOccurs="1">
                        <xs:complexType>
                          <xs:sequence>
                            <xs:element name="value" type="valueType" minOccurs="1" maxOccurs="unbounded" />
                          </xs:sequence>
                        </xs:complexType>
                      </xs:element>
                    </xs:sequence>
                    <xs:attribute name="key" type="configKeyType" use="required" />
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="values" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="value" type="valueType" minOccurs="1" maxOccurs="unbounded" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="default" type="xs:string" minOccurs="0" maxOccurs="unbounded">
            <xs:annotation>
              <xs:documentation>a default value to use when adding the property</xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:choice>
        <xs:attribute name="type" type="propertyTypeWithAssetType" use="optional" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="configConceptPropertyTypeType">
    <xs:complexContent>
      <xs:extension base="configPropertyTypeType" />
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="configTermPropertyTypeType">
    <xs:complexContent>
      <xs:extension base="configPropertyTypeType" />
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="configEdgePropertyTypeType">
    <xs:complexContent>
      <xs:extension base="configPropertyTypeType" />
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="configRatingRuleType">
    <xs:complexContent>
      <xs:extension base="configType">
        <xs:all>
          <xs:element name="propertyType" type="configKeyType" minOccurs="1" maxOccurs="1" />
          <xs:element name="labels" type="configLabelsType" minOccurs="0" maxOccurs="1" />
          <xs:element name="preferred" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="key" type="configKeyType" minOccurs="0" maxOccurs="unbounded" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="undesirable" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="key" type="configKeyType" minOccurs="0" maxOccurs="unbounded" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="icons" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="preferredIcon" type="BooleanNodeType" minOccurs="0" maxOccurs="1" />
                <xs:element name="neutralIcon" type="BooleanNodeType" minOccurs="0" maxOccurs="1" />
                <xs:element name="undesirableIcon" type="BooleanNodeType" minOccurs="0" maxOccurs="1" />
              </xs:choice>
              <xs:attribute name="family" type="xs:string" use="optional" />
            </xs:complexType>
          </xs:element>
        </xs:all>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="configClassificationType">
    <xs:complexContent>
      <xs:extension base="configType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="labels" type="configLabelsType" minOccurs="0" maxOccurs="1" />
          <xs:element name="propertyType" type="configKeyType" minOccurs="1" maxOccurs="1" />
          <xs:element name="separator" type="NonEmptyString" minOccurs="0" maxOccurs="1" />
          <xs:element name="prefix" type="xs:string" minOccurs="0" maxOccurs="1" />
        </xs:choice>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="configRelationTypeType">
    <xs:complexContent>
      <xs:extension base="configType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="labels" type="configLabelsType" minOccurs="0" maxOccurs="1" />
          <xs:element name="icon" type="xs:string" minOccurs="0" maxOccurs="1" />
        </xs:choice>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="configRoleType">
    <xs:complexContent>
      <xs:extension base="configType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="labels" type="configLabelsType" minOccurs="0" maxOccurs="1" />
          <xs:element name="description" type="xs:string" minOccurs="0" maxOccurs="1" />
          <xs:element name="acl" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="subject" minOccurs="0" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element name="action" minOccurs="0" maxOccurs="unbounded">
                        <xs:complexType>
                          <xs:choice minOccurs="0" maxOccurs="unbounded">
                            <xs:element name="condition">
                              <xs:complexType>
                                <xs:sequence>
                                  <xs:element name="value" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
                                </xs:sequence>
                                <xs:attribute name="type" type="configACLActionConditionTypeType" use="required" />
                                <xs:attribute name="key" type="configKeyType" use="optional" />
                              </xs:complexType>
                            </xs:element>
                          </xs:choice>
                          <xs:attribute name="type" type="configACLActionTypeType" use="required" />
                        </xs:complexType>
                      </xs:element>
                    </xs:sequence>
                    <xs:attribute name="type" type="configACLSubjectTypeType" use="required" />
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <!-- HISTORY -->
  <xs:simpleType name="actionScopePropertyType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Concept" />
      <xs:enumeration value="Term" />
      <xs:enumeration value="Tag" />
      <xs:enumeration value="Edge" />
      <xs:enumeration value="Property" />
      <xs:enumeration value="FlagSet" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="contextTypePropertyType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Concept" />
      <xs:enumeration value="Term" />
      <xs:enumeration value="Tag" />
      <xs:enumeration value="Edge" />
      <xs:enumeration value="Property" />
      <xs:enumeration value="FlagSet" />
      <xs:enumeration value="SourceNode::Concept" />
      <xs:enumeration value="SourceNode::Term" />
      <xs:enumeration value="SourceNode::Tag" />
      <xs:enumeration value="SourceNode::Edge" />
      <xs:enumeration value="SourceNode::Property" />
      <xs:enumeration value="TargetNode::Concept" />
      <xs:enumeration value="TargetNode::Term" />
      <xs:enumeration value="TargetNode::Tag" />
      <xs:enumeration value="TargetNode::Edge" />
      <xs:enumeration value="TargetNode::Property" />
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="contextIdType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="of" type="contextTypePropertyType" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="contextCuidType">
    <xs:simpleContent>
      <xs:extension base="CuidType">
        <xs:attribute name="of" type="contextTypePropertyType" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="historyChangeType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="for" type="xs:string" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="historyType">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="create">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="new" type="historyChangeType" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
          <xs:attribute name="at" type="xs:dateTime" />
          <xs:attribute name="by" type="xs:string" use="optional" />
          <xs:attribute name="transaction" type="xs:string" use="optional" />
        </xs:complexType>
      </xs:element>
      <xs:element name="update">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="old" type="historyChangeType" />
            <xs:element name="new" type="historyChangeType" />
          </xs:choice>
          <xs:attribute name="at" type="xs:dateTime" />
          <xs:attribute name="by" type="xs:string" use="optional" />
          <xs:attribute name="transaction" type="xs:string" use="optional" />
        </xs:complexType>
      </xs:element>
      <xs:element name="delete">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="old" type="historyChangeType" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
          <xs:attribute name="at" type="xs:dateTime" />
          <xs:attribute name="by" type="xs:string" use="optional" />
          <xs:attribute name="transaction" type="xs:string" use="optional" />
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:complexType>
  <xs:complexType name="backlogActionType">
    <xs:sequence>
      <xs:element name="context" minOccurs="1" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="id" type="contextIdType" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="cuid" type="contextCuidType" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="edits" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="old" type="historyChangeType" />
            <xs:element name="new" type="historyChangeType" />
          </xs:choice>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="type" type="xs:string" />
    <xs:attribute name="scope" type="actionScopePropertyType" />
    <xs:attribute name="at" type="xs:dateTime" />
    <xs:attribute name="by" type="xs:string" use="optional" />
    <xs:attribute name="transaction" type="xs:string" use="optional" />
  </xs:complexType>
  <!-- DATA -->
  <xs:complexType name="flagsetType">
    <xs:sequence>
      <xs:element name="values">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="value" type="xs:string" minOccurs="1" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="admin" type="adminType" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="history" type="historyType" minOccurs="0" maxOccurs="1" />
    </xs:sequence>
    <xs:attribute name="key" type="xs:string" use="required" />
    <xs:attribute name="id" type="xs:string" />
    <xs:attribute name="cuid" type="CuidType" />
  </xs:complexType>
  <xs:complexType name="propertyType">
    <xs:annotation>
      <xs:documentation>a custom property, such as Definition of Part-of-Speech as configured in the Model</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="key" type="xs:string" minOccurs="1" maxOccurs="1" />
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:element name="value" type="xs:string">
          <xs:annotation>
            <xs:documentation>supports markdown</xs:documentation>
          </xs:annotation>
        </xs:element>
        <xs:element name="values">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="value" type="xs:string" minOccurs="1" maxOccurs="unbounded" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
      <xs:element name="flag_set" type="flagsetType" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="admin" type="adminType" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="history" type="historyType" minOccurs="0" maxOccurs="1" />
    </xs:sequence>
    <xs:attribute name="type" type="propertyTypeType" />
    <xs:attribute name="id" type="xs:string" />
    <xs:attribute name="cuid" type="CuidType" />
    <xs:attribute name="lang" type="xs:language" />
  </xs:complexType>
  <xs:complexType name="assetFileType">
    <xs:attribute name="src" type="xs:anyURI" use="required" />
  </xs:complexType>
  <xs:complexType name="assetEmbedType">
    <xs:simpleContent>
      <xs:extension base="xs:base64Binary">
        <xs:attribute name="name" type="xs:string" use="required" />
        <xs:attribute name="mime" type="xs:string" use="required" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="assetType">
    <xs:sequence>
      <xs:element name="key" type="xs:string" minOccurs="1" maxOccurs="1" />
      <xs:element name="caption" type="xs:string" minOccurs="0" maxOccurs="1" />
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:element name="file" type="assetFileType" />
        <xs:element name="embed" type="assetEmbedType" />
      </xs:choice>
      <xs:element name="flag_set" type="flagsetType" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="admin" type="adminType" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="history" type="historyType" minOccurs="0" maxOccurs="1" />
    </xs:sequence>
    <xs:attribute name="id" type="xs:string" />
    <xs:attribute name="cuid" type="CuidType" />
    <xs:attribute name="lang" type="xs:language" />
    <xs:attribute name="width" type="xs:integer" />
    <xs:attribute name="height" type="xs:integer" />
  </xs:complexType>
  <xs:complexType name="adminType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="name" type="xs:string" use="required" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="tagType">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="property" type="propertyType" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="admin" type="adminType" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="tag" type="tagType" minOccurs="0" maxOccurs="unbounded" />
    </xs:choice>
    <xs:attribute name="id" type="xs:string" />
    <xs:attribute name="cuid" type="CuidType" />
  </xs:complexType>
  <xs:complexType name="conceptType">
    <xs:annotation>
      <xs:documentation>main structure to carry data about a concept: properties/assets + terms</xs:documentation>
    </xs:annotation>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="property" type="propertyType" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="asset" type="assetType" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="admin" type="adminType" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="term" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:choice minOccurs="1" maxOccurs="unbounded">
            <xs:element name="value" minOccurs="1" maxOccurs="1">
              <xs:annotation>
                <xs:documentation>supports markdown</xs:documentation>
              </xs:annotation>
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:minLength value="1" />
                </xs:restriction>
              </xs:simpleType>
            </xs:element>
            <xs:element name="property" type="propertyType" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="asset" type="assetType" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="admin" type="adminType" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="history" type="historyType" minOccurs="0" maxOccurs="1" />
          </xs:choice>
          <xs:attribute name="id" type="xs:string" />
          <xs:attribute name="cuid" type="CuidType" />
          <xs:attribute name="lang" type="xs:language" use="required" />
        </xs:complexType>
      </xs:element>
      <xs:element name="history" type="historyType" minOccurs="0" maxOccurs="1" />
    </xs:choice>
    <xs:attribute name="id" type="xs:string">
      <xs:annotation>
        <xs:documentation>can be any string to identify the concept, term, property, edge outside of Coreon - during import it gets its unique cuid</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="cuid" type="CuidType">
      <xs:annotation>
        <xs:documentation>unique, persistent identifier</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="coreonType" type="xs:string">
      <xs:annotation>
        <xs:documentation>"group" or "normal" - if group then UI renders the concept as a group concept</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="branchRoot" type="BooleanType">
      <xs:annotation>
        <xs:documentation>if true then UI renders all its sub-tree concepts as part of that branch</xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="aliasType">
    <xs:annotation>
      <xs:documentation>a concept-like node that acts like a placeholder and points to a referent concept</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:element name="referentId" />
        <xs:element name="referentCuid" type="contextIdType" />
      </xs:choice>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="admin" type="adminType" minOccurs="0" maxOccurs="unbounded" />
        <xs:element name="history" type="historyType" minOccurs="0" maxOccurs="1" />
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="id" type="xs:string" />
    <xs:attribute name="cuid" type="CuidType" />
    <xs:attribute name="branchRoot" type="BooleanType" />
  </xs:complexType>
  <xs:complexType name="edgeType">
    <xs:annotation>
      <xs:documentation>main type to carry relational information: reference to a source and target concept + the type, i.e. the name of the relation </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="type" type="xs:string" minOccurs="1" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>can be any string for custom associative relations. Built-in are the following for hierarchical: SUPERCONCEPT_OF, HAS_SPECIFIC, HAS_PART, HAS_INSTANCE</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:element name="source">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute name="type" type="nodeType" />
                <xs:attribute name="propertyId" />
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
        <xs:element name="sourceCuid">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="CuidType">
                <xs:attribute name="type" type="nodeType" />
                <xs:attribute name="propertyId" type="CuidType" />
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:choice>
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:element name="target">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute name="type" type="nodeType" />
                <xs:attribute name="propertyId" />
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
        <xs:element name="targetCuid">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="CuidType">
                <xs:attribute name="type" type="nodeType" />
                <xs:attribute name="propertyId" type="CuidType" />
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:choice>
      <xs:element name="admin" type="adminType" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="history" type="historyType" minOccurs="0" maxOccurs="1" />
    </xs:sequence>
    <xs:attribute name="id" type="xs:string" />
    <xs:attribute name="cuid" type="CuidType" />
  </xs:complexType>
  <xs:complexType name="rootType">
    <xs:annotation>
      <xs:documentation>
      The Coreon XML root node
    </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="head" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="policies" minOccurs="0" maxOccurs="1">
              <xs:annotation>
                <xs:documentation>import policies. If given the policy in the file overrules all other given policies</xs:documentation>
              </xs:annotation>
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="concepts" type="policyType" minOccurs="0" maxOccurs="unbounded" />
                  <xs:element name="conceptProperties" type="propertyPolicyType" minOccurs="0" maxOccurs="unbounded" />
                  <xs:element name="terms" type="termPolicyType" minOccurs="0" maxOccurs="unbounded" />
                  <xs:element name="termProperties" type="propertyPolicyType" minOccurs="0" maxOccurs="unbounded" />
                  <xs:element name="edges" type="policyType" minOccurs="0" maxOccurs="unbounded" />
                  <xs:element name="edgeProperties" type="propertyPolicyType" minOccurs="0" maxOccurs="unbounded" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="repositoryConfiguration" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>All settings a repository is configured with (properties, languages, rating rules ...)</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:all>
            <xs:element name="languages" minOccurs="0" maxOccurs="1">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="language" type="configLanguageType" minOccurs="0" maxOccurs="unbounded" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="conceptPropertyTypes" minOccurs="0" maxOccurs="1">
              <xs:annotation>
                <xs:documentation>properties for concepts</xs:documentation>
              </xs:annotation>
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="conceptPropertyType" type="configConceptPropertyTypeType" minOccurs="0" maxOccurs="unbounded" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="termPropertyTypes" minOccurs="0" maxOccurs="1">
              <xs:annotation>
                <xs:documentation>properties for terms</xs:documentation>
              </xs:annotation>
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="termPropertyType" type="configTermPropertyTypeType" minOccurs="0" maxOccurs="unbounded" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="edgePropertyTypes" minOccurs="0" maxOccurs="1">
              <xs:annotation>
                <xs:documentation>(future enhancement, no effect yet)</xs:documentation>
              </xs:annotation>
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="edgePropertyType" type="configEdgePropertyTypeType" minOccurs="0" maxOccurs="unbounded" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="ratingRules" minOccurs="0" maxOccurs="1">
              <xs:annotation>
                <xs:documentation>one or more rules whether a term should be treated as preferred or undesirable, depending from the value of a given term property</xs:documentation>
              </xs:annotation>
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="ratingRule" type="configRatingRuleType" minOccurs="0" maxOccurs="unbounded" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="classifications" minOccurs="0" maxOccurs="1">
              <xs:annotation>
                <xs:documentation>additional breadcrump-like computation of a hierarchical path of a given property key</xs:documentation>
              </xs:annotation>
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="classification" type="configClassificationType" minOccurs="0" maxOccurs="unbounded" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="relationTypes" minOccurs="0" maxOccurs="1">
              <xs:annotation>
                <xs:documentation>associative relations (hierarchical ones are built in)</xs:documentation>
              </xs:annotation>
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="relationType" type="configRelationTypeType" minOccurs="0" maxOccurs="unbounded" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="roles" minOccurs="0" maxOccurs="1">
              <xs:annotation>
                <xs:documentation>user roles for access management</xs:documentation>
              </xs:annotation>
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="role" type="configRoleType" minOccurs="0" maxOccurs="unbounded" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="tags" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>(deprecated, not in use by Coreon)</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="tag" type="tagType" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="concepts" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>all concepts and aliases</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="concept" type="conceptType" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="alias" type="aliasType" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="edges" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>all relations</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="edge" type="edgeType" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="backlog" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>history log when not saved inline</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="action" type="backlogActionType" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="exportedAt" type="xs:dateTime" />
    <xs:attribute name="host" type="xs:string" />
  </xs:complexType>
  <xs:element name="coreon" type="rootType" />
</xs:schema>