<?xml version='1.0' encoding='utf-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" ipr="trust200902" docName="draft-ietf-calext-jscontact-profiles-15" number="10050" submissionType="IETF" consensus="true" category="std" xml:lang="en" obsoletes="" updates="" tocInclude="true" symRefs="true" sortRefs="true" prepTime="2026-09-19T17:19:55" indexInclude="true" scripts="Common,Han,Latin" tocDepth="3">
  <link href="https://datatracker.ietf.org/doc/draft-ietf-calext-jscontact-profiles-15" rel="prev"/>
  <link href="https://dx.doi.org/10.17487/rfc10050" rel="alternate"/>
  <link href="urn:issn:2070-1721" rel="alternate"/>
  <front>
    <title abbrev="JSContact Profiles">Protocol-Specific Profiles for JSContact</title>
    <seriesInfo name="RFC" value="10050" stream="IETF"/>
    <author initials="R." surname="Stepanek" fullname="Robert Stepanek">
      <organization showOnFrontPage="true">Fastmail</organization>
      <address>
        <postal>
          <extaddr>PO Box 234</extaddr>
          <street>Collins St. West</street>
          <city>Melbourne</city>
          <region>VIC</region>
          <code>8007</code>
          <country>Australia</country>
        </postal>
        <email>rsto@fastmailteam.com</email>
      </address>
    </author>
    <author initials="M." surname="Loffredo" fullname="Mario Loffredo">
      <organization showOnFrontPage="true">IIT-CNR</organization>
      <address>
        <postal>
          <street>Via Moruzzi, 1</street>
          <city>Pisa</city>
          <code>56124</code>
          <country>Italy</country>
        </postal>
        <email>mario.loffredo@iit.cnr.it</email>
      </address>
    </author>
    <date month="09" year="2026"/>
    <area>ART</area>
    <workgroup>calext</workgroup>
    <keyword>JSContact</keyword>
    <abstract pn="section-abstract">
      <t indent="0" pn="section-abstract-1">This document defines the "JSContact Profiles" registry, an IANA registry for named subsets of JSContact elements. The document aims to facilitate using JSContact in the context of contact data exchange protocols or other use cases in which supporting all JSContact semantics might be inappropriate.</t>
    </abstract>
    <boilerplate>
      <section anchor="status-of-memo" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.1">
        <name slugifiedName="name-status-of-this-memo">Status of This Memo</name>
        <t indent="0" pn="section-boilerplate.1-1">
            This is an Internet Standards Track document.
        </t>
        <t indent="0" pn="section-boilerplate.1-2">
            This document is a product of the Internet Engineering Task Force
            (IETF).  It represents the consensus of the IETF community.  It has
            received public review and has been approved for publication by
            the Internet Engineering Steering Group (IESG).  Further
            information on Internet Standards is available in Section 2 of 
            RFC 7841.
        </t>
        <t indent="0" pn="section-boilerplate.1-3">
            Information about the current status of this document, any
            errata, and how to provide feedback on it may be obtained at
            <eref target="https://www.rfc-editor.org/info/rfc10050" brackets="none"/>.
        </t>
      </section>
      <section anchor="copyright" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.2">
        <name slugifiedName="name-copyright-notice">Copyright Notice</name>
        <t indent="0" pn="section-boilerplate.2-1">
            Copyright (c) 2026 IETF Trust and the persons identified as the
            document authors. All rights reserved.
        </t>
        <t indent="0" pn="section-boilerplate.2-2">
            This document is subject to BCP 78 and the IETF Trust's Legal
            Provisions Relating to IETF Documents
            (<eref target="https://trustee.ietf.org/license-info" brackets="none"/>) in effect on the date of
            publication of this document. Please review these documents
            carefully, as they describe your rights and restrictions with
            respect to this document. Code Components extracted from this
            document must include Revised BSD License text as described in
            Section 4.e of the Trust Legal Provisions and are provided without
            warranty as described in the Revised BSD License.
        </t>
      </section>
    </boilerplate>
    <toc>
      <section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" pn="section-toc.1">
        <name slugifiedName="name-table-of-contents">Table of Contents</name>
        <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1">
          <li pn="section-toc.1-1.1">
            <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.1"><xref derivedContent="1" format="counter" sectionFormat="of" target="section-1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-introduction">Introduction</xref></t>
          </li>
          <li pn="section-toc.1-1.2">
            <t indent="0" keepWithNext="true" pn="section-toc.1-1.2.1"><xref derivedContent="2" format="counter" sectionFormat="of" target="section-2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-notational-conventions">Notational Conventions</xref></t>
          </li>
          <li pn="section-toc.1-1.3">
            <t indent="0" pn="section-toc.1-1.3.1"><xref derivedContent="3" format="counter" sectionFormat="of" target="section-3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-jscontact-profiles">JSContact Profiles</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.3.2">
              <li pn="section-toc.1-1.3.2.1">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.3.2.1.1"><xref derivedContent="3.1" format="counter" sectionFormat="of" target="section-3.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-profile-name">Profile Name</xref></t>
              </li>
              <li pn="section-toc.1-1.3.2.2">
                <t indent="0" pn="section-toc.1-1.3.2.2.1"><xref derivedContent="3.2" format="counter" sectionFormat="of" target="section-3.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-profile-version">Profile Version</xref></t>
              </li>
              <li pn="section-toc.1-1.3.2.3">
                <t indent="0" pn="section-toc.1-1.3.2.3.1"><xref derivedContent="3.3" format="counter" sectionFormat="of" target="section-3.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-profile-properties">Profile Properties</xref></t>
              </li>
              <li pn="section-toc.1-1.3.2.4">
                <t indent="0" pn="section-toc.1-1.3.2.4.1"><xref derivedContent="3.4" format="counter" sectionFormat="of" target="section-3.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-supported-properties">Supported Properties</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.4">
            <t indent="0" pn="section-toc.1-1.4.1"><xref derivedContent="4" format="counter" sectionFormat="of" target="section-4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-iana-considerations">IANA Considerations</xref></t>
          </li>
          <li pn="section-toc.1-1.5">
            <t indent="0" pn="section-toc.1-1.5.1"><xref derivedContent="5" format="counter" sectionFormat="of" target="section-5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-security-considerations">Security Considerations</xref></t>
          </li>
          <li pn="section-toc.1-1.6">
            <t indent="0" pn="section-toc.1-1.6.1"><xref derivedContent="6" format="counter" sectionFormat="of" target="section-6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-references">References</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.6.2">
              <li pn="section-toc.1-1.6.2.1">
                <t indent="0" pn="section-toc.1-1.6.2.1.1"><xref derivedContent="6.1" format="counter" sectionFormat="of" target="section-6.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-normative-references">Normative References</xref></t>
              </li>
              <li pn="section-toc.1-1.6.2.2">
                <t indent="0" pn="section-toc.1-1.6.2.2.1"><xref derivedContent="6.2" format="counter" sectionFormat="of" target="section-6.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-informative-references">Informative References</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.7">
            <t indent="0" pn="section-toc.1-1.7.1"><xref derivedContent="Appendix A" format="default" sectionFormat="of" target="section-appendix.a"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-example-profile">Example Profile</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.7.2">
              <li pn="section-toc.1-1.7.2.1">
                <t indent="0" pn="section-toc.1-1.7.2.1.1"><xref derivedContent="A.1" format="counter" sectionFormat="of" target="section-appendix.a.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-profile-properties-example">Profile Properties Example</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.2">
                <t indent="0" pn="section-toc.1-1.7.2.2.1"><xref derivedContent="A.2" format="counter" sectionFormat="of" target="section-appendix.a.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-card-object-example">Card Object Example</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.3">
                <t indent="0" pn="section-toc.1-1.7.2.3.1"><xref derivedContent="A.3" format="counter" sectionFormat="of" target="section-appendix.a.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-iana-registry-example">IANA Registry Example</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.4">
                <t indent="0" pn="section-toc.1-1.7.2.4.1"><xref derivedContent="A.4" format="counter" sectionFormat="of" target="section-appendix.a.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-supported-properties-exampl">Supported Properties Example</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.8">
            <t indent="0" pn="section-toc.1-1.8.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.b"/><xref derivedContent="" format="title" sectionFormat="of" target="name-authors-addresses">Authors' Addresses</xref></t>
          </li>
        </ul>
      </section>
    </toc>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="include" removeInRFC="false" pn="section-1">
      <name slugifiedName="name-introduction">Introduction</name>
      <t indent="0" pn="section-1-1">The JSContact <xref target="RFC9553" format="default" sectionFormat="of" derivedContent="RFC9553"/> contact card data model and format are designed for use in address book applications and directory services. Intended as an alternative to the prevalent vCard <xref target="RFC6350" format="default" sectionFormat="of" derivedContent="RFC6350"/> data format, JSContact covers vCard core semantics and extensions, and it provides a rich model for personal names, postal addresses, and localization. All JSContact elements are relevant for some contact card use cases, and similar to vCard, implementations are expected to support these elements when exchanging contact card information using protocols such as CardDAV <xref target="RFC6352" format="default" sectionFormat="of" derivedContent="RFC6352"/> and the JSON Meta Application Protocol (JMAP) for Contacts <xref target="RFC9610" format="default" sectionFormat="of" derivedContent="RFC9610"/>.</t>
      <t indent="0" pn="section-1-2">In contrast, other protocols and document specifications might require exchanging <em>some</em> contact card information, but not all of what JSContact provides. <xref target="RFC9553" section="1.7.4" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-1.7.4" derivedContent="RFC9553"/> outlines how JSContact implementations may ignore unknown JSContact elements, but this only applies to future extensions of <xref target="RFC9553" format="default" sectionFormat="of" derivedContent="RFC9553"/>; they are still expected to implement all elements of the core specification. Also, the extensibility of JSContact and the requirement to preserve arbitrary contact elements might not be adequate for some protocols.</t>
      <t indent="0" pn="section-1-3">To make use of JSContact under these circumstances, this document defines a new IANA registry for JSContact that allows registration of named subsets of JSContact elements. These subsets are referred to as "JSContact profiles" and are meant to bring the following benefits:</t>
      <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-1-4">
        <li pn="section-1-4.1">Protocol designers might be encouraged to use JSContact rather than coming up with their own contacts format. This facilitates cross-protocol data exchange and migration.</li>
        <li pn="section-1-4.2">Different protocols use the same IANA registry to express which JSContact elements they support. This facilitates understanding their commonalities and reusing existing profiles.</li>
        <li pn="section-1-4.3">A central registry provides implementors of JSContact libraries with a consistent format documenting which profile supports what elements rather than having to look up that information from possibly distinctly organized Internet-Drafts.</li>
      </ul>
      <t indent="0" pn="section-1-5">This document is organized as follows. <xref target="jscontact-profiles" format="default" sectionFormat="of" derivedContent="Section 3"/> defines JSContact profiles; <xref target="iana-considerations" format="default" sectionFormat="of" derivedContent="Section 4"/> discusses the new "JSContact Profiles" registry created by IANA; and <xref target="example" format="default" sectionFormat="of" derivedContent="Appendix A"/> illustrates JSContact profiles using an example.</t>
    </section>
    <section anchor="notational-conventions" numbered="true" toc="include" removeInRFC="false" pn="section-2">
      <name slugifiedName="name-notational-conventions">Notational Conventions</name>
      <t indent="0" pn="section-2-1">
The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
"<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>",
"<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>",
"<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be
interpreted as described in BCP 14 <xref target="RFC2119" format="default" sectionFormat="of" derivedContent="RFC2119"/> <xref target="RFC8174" format="default" sectionFormat="of" derivedContent="RFC8174"/> when, and only when, they appear in all capitals, as
shown here.
      </t>
      <t indent="0" pn="section-2-2">The ABNF definitions in this document use the notations of <xref target="RFC5234" format="default" sectionFormat="of" derivedContent="RFC5234"/>. ABNF rules not defined in this document are defined in <xref target="RFC5234" format="default" sectionFormat="of" derivedContent="RFC5234"/> (such as the ABNF for DIGIT).</t>
    </section>
    <section anchor="jscontact-profiles" numbered="true" removeInRFC="false" toc="include" pn="section-3">
      <name slugifiedName="name-jscontact-profiles">JSContact Profiles</name>
      <t indent="0" pn="section-3-1">A JSContact profile is a named and versioned set of JSContact elements, such as properties, types, and values. The JSContact elements <bcp14>MUST</bcp14> be registered in the IANA "JSContact" registry group <xref target="IANA.jscontact" format="default" sectionFormat="of" derivedContent="IANA.jscontact"/>. A profile <bcp14>MAY</bcp14> define additional restrictions for these elements as outlined in <xref target="properties" format="default" sectionFormat="of" derivedContent="Section 3.3"/>, but a profile <bcp14>MUST NOT</bcp14> loosen restrictions. This document creates an IANA registry for JSContact profiles (see <xref target="iana-considerations" format="default" sectionFormat="of" derivedContent="Section 4"/>).</t>
      <t indent="0" pn="section-3-2">A JSContact object complies with a profile if all its properties are in the set of properties defined by that profile and the property values comply with the profile restrictions for that property. A JSContact object <bcp14>MAY</bcp14> comply with multiple profiles. Accordingly, this document does not specify any means for JSContact data to communicate which profiles it complies with, e.g., it does not define a "profile" property for the Card object.</t>
      <t indent="0" pn="section-3-3">All properties and values of a JSContact object that complies with a profile <bcp14>MUST</bcp14> also be valid (<xref target="RFC9553" section="1.7" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-1.7" derivedContent="RFC9553"/>). Handling JSContact data that is valid but that does not comply with the expected profile is protocol-specific. This document deliberately does not define such non-compliant data as invalid. Profile designers decide on their own strategies for handling non-compliant data, one of which may be to reject it as invalid. JSContact data that complies with a profile may still not be valid in the context of that protocol; the protocol specification <bcp14>MAY</bcp14> define additional restrictions that a profile cannot express.</t>
      <t indent="0" pn="section-3-4"><xref target="name" format="default" sectionFormat="of" derivedContent="Section 3.1"/> defines how to name a JSContact profile; <xref target="version" format="default" sectionFormat="of" derivedContent="Section 3.2"/> defines how to version it; <xref target="properties" format="default" sectionFormat="of" derivedContent="Section 3.3"/> defines how to specify the properties supported by that profile; and <xref target="supported-properties" format="default" sectionFormat="of" derivedContent="Section 3.4"/> describes how                     
   to determine the supported properties.</t>
      <section anchor="name" numbered="true" removeInRFC="false" toc="include" pn="section-3.1">
        <name slugifiedName="name-profile-name">Profile Name</name>
        <t indent="0" pn="section-3.1-1">A JSContact profile has a unique name. The name <bcp14>MUST</bcp14> only contain ASCII lowercase alphabetic and numeric characters, optionally separated by hyphens. It <bcp14>MUST</bcp14> start with an alphabetic character, and it <bcp14>MUST</bcp14> be of at least 1 character and at most 255 characters in size. Formally, it <bcp14>MUST</bcp14> be a valid "profile-name" defined in <xref target="profile-name-abnf" format="default" sectionFormat="of" derivedContent="Figure 1"/>.</t>
        <figure anchor="profile-name-abnf" align="left" suppress-title="false" pn="figure-1">
          <name slugifiedName="name-abnf-rule-for-jscontact-pro">ABNF Rule for JSContact Profile Name</name>
          <sourcecode type="abnf" markers="false" pn="section-3.1-2.1">
profile-name = lalpha *( ["-"] lalpha / DIGIT )
               ; at most 255 characters in size

lalpha       = %x61-7A ; a-z</sourcecode>
        </figure>
      </section>
      <section anchor="version" numbered="true" removeInRFC="false" toc="include" pn="section-3.2">
        <name slugifiedName="name-profile-version">Profile Version</name>
        <t indent="0" pn="section-3.2-1">A JSContact profile has a current version, and each profile is versioned independently.  The version <bcp14>MUST</bcp14> be a positive integer, and it <bcp14>MUST</bcp14> increase whenever the profile properties (see <xref target="properties" format="default" sectionFormat="of" derivedContent="Section 3.3"/>) change. The initial version value is 1.</t>
      </section>
      <section anchor="properties" numbered="true" removeInRFC="false" toc="include" pn="section-3.3">
        <name slugifiedName="name-profile-properties">Profile Properties</name>
        <t indent="0" pn="section-3.3-1">A profile defines a list of property entries that together determine the set of properties supported by that profile, as described in <xref target="supported-properties" format="default" sectionFormat="of" derivedContent="Section 3.4"/>. The list <bcp14>MUST NOT</bcp14> be empty.</t>
        <t indent="0" pn="section-3.3-2">Each property entry consists of the following elements:</t>
        <dl newline="false" indent="3" spacing="normal" pn="section-3.3-3">
          <dt pn="section-3.3-3.1">Property Name:</dt>
          <dd pn="section-3.3-3.2">This is the name of the JSContact property that this entry refers to. This <bcp14>MUST</bcp14> be a property name registered in the "JSContact Properties" registry. A property name <bcp14>MAY</bcp14> occur multiple times in the property entry list if the profile-specific restrictions for that property cannot be expressed with a single entry, but such multiple entries <bcp14>MUST NOT</bcp14> result in conflicting restrictions for the same property. This field <bcp14>MUST NOT</bcp14> be empty.</dd>
          <dt pn="section-3.3-3.3">Property Context:</dt>
          <dd pn="section-3.3-3.4">This is a comma-separated list of JSContact object types that support this property in this profile. Each of these types <bcp14>MUST</bcp14> also be listed in the Property Contexts for this property in the "JSContact Properties" registry, but a profile <bcp14>MAY</bcp14> only support the property in a subset of these contexts. This field <bcp14>MUST NOT</bcp14> be empty.</dd>
          <dt pn="section-3.3-3.5">Restricted Attributes:</dt>
          <dd pn="section-3.3-3.6">This restricts the attributes of the property.  This specification only defines how to restrict the attributes such that a property becomes mandatory in the listed Property Contexts, despite the property originally being defined to be optional in the same contexts. The verbatim value "mandatory" (without quotes) indicates that it is mandatory in this profile; the absence of any value indicates that this profile does not restrict the property attributes of the original definition.</dd>
          <dt pn="section-3.3-3.7">Restricted Property Type:</dt>
          <dd pn="section-3.3-3.8">
            <t indent="0" pn="section-3.3-3.8.1">This restricts the property value type in the listed Property Contexts. It allows a profile to restrict the allowed types to the original type definition such that future changes to JSContact do not extend the allowed types of the property for this profile, and it allows a profile to restrict the allowed types to a subset of the original type definition. The absence of any value indicates that this profile does not restrict the property value type of the original definition or any future extensions of the value type.</t>
            <t indent="0" pn="section-3.3-3.8.2">If set, the restricted value type <bcp14>MUST</bcp14> exactly match the original definition at the time when the profile is defined, or the original value type <bcp14>MUST</bcp14> contain some type signature in the form "A|B" and the restricted value type <bcp14>MUST</bcp14> resemble the original except that some of the original "A|B" forms now only allow a subset of the original choices. Restricted property types <bcp14>MUST NOT</bcp14> redefine the "defaultType" attribute (<xref target="RFC9553" section="1.3.3" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-1.3.3" derivedContent="RFC9553"/>); the rules about when to set the "@type" property (<xref target="RFC9553" section="1.3.4" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-1.3.4" derivedContent="RFC9553"/>) of the original type definition still apply.</t>
            <t indent="0" pn="section-3.3-3.8.3">As an example of restricting the type definition to prevent future type extensions in the profile, one might restrict the type definition of the "addresses" property of the Card object to "Id[Address]", which matches the original definition as of this writing.</t>
            <t indent="0" pn="section-3.3-3.8.4">As an example of restricting the type to a subset of the original value, one might want to restrict the "date" property of the Anniversary object to only allow partial dates as values. To do so, the original value type "PartialDate|Timestamp" can be restricted to "PartialDate". Note that the original value type need not be exactly in form "A|B". For example, the type signature "Id[A|B|C]" could be restricted to any of "Id[A|B]", "Id[A|C]", "Id[B|C]", "Id[A]", "Id[B]", "Id[C]", and the type signature "(A|B)[]" could be restricted to one of "A[]" or "B[]".</t>
          </dd>
          <dt pn="section-3.3-3.9">Restricted Enum Values:</dt>
          <dd pn="section-3.3-3.10">This restricts the enumerated values defined for this property to a subset of those values. The values <bcp14>MUST</bcp14> be listed in the "JSContact Enum Values" registry for this property and context. Allowed values are separated by a comma; the absence of any value indicates that all enumerated values are allowed. A profile <bcp14>MAY</bcp14> exclude the default enumerated value of a property, in which case all instances of the object <bcp14>MUST</bcp14> have this property set to one of the allowed values.</dd>
          <dt pn="section-3.3-3.11">Restricted PatchObject:</dt>
          <dd pn="section-3.3-3.12">This restricts the PatchObject value of this property such that each JSON Pointer key in the PatchObject <bcp14>MUST</bcp14> consist of exactly one JSON Pointer reference token (<xref target="RFC6901" section="3" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc6901#section-3" derivedContent="RFC6901"/>). For example, with this restriction, the "localizations" property of the Card object can only patch properties of the Card object by replacing their values entirely. The verbatim value "yes" (without quotes) indicates that this profile restricts PatchObject keys to a single token; the absence of any value indicates that it does not restrict them. This <bcp14>MUST NOT</bcp14> be set to "yes" if the property value type is not a PatchObject.</dd>
        </dl>
        <t indent="0" pn="section-3.3-4">All profiles <bcp14>MUST</bcp14> support "@type" and "version"; therefore, profiles <bcp14>MUST NOT</bcp14> include entries for these properties.</t>
      </section>
      <section anchor="supported-properties" numbered="true" removeInRFC="false" toc="include" pn="section-3.4">
        <name slugifiedName="name-supported-properties">Supported Properties</name>
        <t indent="0" pn="section-3.4-1">The supported properties of a JSContact profile are determined by the profile's property entries and the contents of the IANA "JSContact Properties" registry, which are referred to here as "IANA-registered properties" for short. The "version" property of the Card object and the "@type" property of any object type are always supported.</t>
        <t indent="0" pn="section-3.4-2">A Card object complies with the profile if all its properties are part of the supported properties and all property values are valid according to the restrictions defined in the applicable property entries. A PatchObject <bcp14>MUST NOT</bcp14> patch properties that are not supported in that profile.</t>
        <t indent="0" pn="section-3.4-3">The following describes the steps to determine the supported properties:</t>
        <ol indent="adaptive" spacing="normal" start="1" type="1" pn="section-3.4-4">
          <li pn="section-3.4-4.1" derivedCounter="1.">Initialize the set with all properties of the Card object for which a property entry contains "Card" in the Property Context of the profile. If no such entry exists, then initialize the set with all IANA-registered properties of the Card object.</li>
          <li pn="section-3.4-4.2" derivedCounter="2.">For every property in the set having either an object type as the value type or a list, map, or union of object types, add all properties for which a property entry contains those object types in the Property Context of the profile. If no such property entry exists, then add all IANA-registered properties for the object types.</li>
          <li pn="section-3.4-4.3" derivedCounter="3.">Repeat the previous step until all object types that are value types of properties in the set have been considered.</li>
        </ol>
        <t indent="0" pn="section-3.4-5"><xref target="example-supported-properties" format="default" sectionFormat="of" derivedContent="Appendix A.4"/> describes how to determine the supported properties of the example profile in <xref target="example" format="default" sectionFormat="of" derivedContent="Appendix A"/>.</t>
      </section>
    </section>
    <section anchor="iana-considerations" numbered="true" toc="include" removeInRFC="false" pn="section-4">
      <name slugifiedName="name-iana-considerations">IANA Considerations</name>
      <t indent="0" pn="section-4-1">IANA has created the "JSContact Profiles" registry within the "JSContact" registry group. The purpose of this new registry is to register profiles for JSContact data. The registry policy to add an entry to this registry is "Specification Required" <xref target="RFC8126" format="default" sectionFormat="of" derivedContent="RFC8126"/>; this applies to defining a new profile name or version. The registry policy to update an existing profile is "Expert Review"; this applies to updating the references of an entry. The change controller is the IETF.</t>
      <t indent="0" pn="section-4-2">An entry in this registry consists of the following, all of which <bcp14>MUST</bcp14> be set:</t>
      <dl newline="true" indent="3" spacing="normal" pn="section-4-3">
        <dt pn="section-4-3.1">Name:</dt>
        <dd pn="section-4-3.2">This is the name of the profile. This field is immutable after creation. The name <bcp14>MUST</bcp14> be unique among all registered profiles and <bcp14>MUST</bcp14> comply with the definitions in <xref target="name" format="default" sectionFormat="of" derivedContent="Section 3.1"/>.</dd>
        <dt pn="section-4-3.3">Version:</dt>
        <dd pn="section-4-3.4">This is the version number of the profile. This field is immutable after creation. It <bcp14>MUST</bcp14> comply with the definitions in <xref target="version" format="default" sectionFormat="of" derivedContent="Section 3.2"/>.</dd>
        <dt pn="section-4-3.5">Reference:</dt>
        <dd pn="section-4-3.6">This refers to the specification of the protocol or use case for which this profile applies. The reference <bcp14>MUST</bcp14> include the section number or section name that defines or updates the property entries for this profile, as defined in <xref target="properties" format="default" sectionFormat="of" derivedContent="Section 3.3"/>.</dd>
      </dl>
      <t indent="0" pn="section-4-4">Designated experts assert that all proposed assignments are valid according to the definitions in this document. For example, they check that:</t>
      <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-4-5">
        <li pn="section-4-5.1">the profile name is unique,</li>
        <li pn="section-4-5.2">the entries in the profile entries are syntactically valid,</li>
        <li pn="section-4-5.3">only known property names are referred to,</li>
        <li pn="section-4-5.4">type restrictions do not incorrectly alter the type of a property, and</li>
        <li pn="section-4-5.5">the version number increases.</li>
      </ul>
      <t indent="0" pn="section-4-6">On the other hand, designated experts do not decide the contents of the profile as long as the assignments are valid.</t>
      <t indent="0" pn="section-4-7">The decision whether to register a new profile name or register a new version for an existing profile depends on the scope of the proposed profile. A new profile name is recommended if the profile is introduced in the context of an application or protocol for which no JSContact profile is already registered or if the proposed profile properties or restrictions substantially differ from existing profiles for that context. A new version is recommended if the profile context does not change and multiple implementations of the current profile will also support the new version. The profile version of the new entry for an already-registered profile by that name has to be higher than the last registered version for that profile. Existing registry entries are preserved.</t>
      <t indent="0" pn="section-4-8">This document does not define any initial contents for the "JSContact Profiles" registry.</t>
    </section>
    <section anchor="security-considerations" numbered="true" toc="include" removeInRFC="false" pn="section-5">
      <name slugifiedName="name-security-considerations">Security Considerations</name>
      <t indent="0" pn="section-5-1">This document does not provide any new security considerations. The security considerations in <xref target="RFC9553" section="4" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-4" derivedContent="RFC9553"/> apply.</t>
    </section>
  </middle>
  <back>
    <references pn="section-6">
      <name slugifiedName="name-references">References</name>
      <references pn="section-6.1">
        <name slugifiedName="name-normative-references">Normative References</name>
        <reference anchor="IANA.jscontact" target="https://www.iana.org/assignments/jscontact" quoteTitle="true" derivedAnchor="IANA.jscontact">
          <front>
            <title>JSContact</title>
            <author>
              <organization showOnFrontPage="true">IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" quoteTitle="true" derivedAnchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t indent="0">In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC5234" target="https://www.rfc-editor.org/info/rfc5234" quoteTitle="true" derivedAnchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
            <author fullname="P. Overell" initials="P." surname="Overell"/>
            <date month="January" year="2008"/>
            <abstract>
              <t indent="0">Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
        <reference anchor="RFC6901" target="https://www.rfc-editor.org/info/rfc6901" quoteTitle="true" derivedAnchor="RFC6901">
          <front>
            <title>JavaScript Object Notation (JSON) Pointer</title>
            <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan"/>
            <author fullname="K. Zyp" initials="K." surname="Zyp"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <date month="April" year="2013"/>
            <abstract>
              <t indent="0">JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6901"/>
          <seriesInfo name="DOI" value="10.17487/RFC6901"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" quoteTitle="true" derivedAnchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t indent="0">RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC9553" target="https://www.rfc-editor.org/info/rfc9553" quoteTitle="true" derivedAnchor="RFC9553">
          <front>
            <title>JSContact: A JSON Representation of Contact Data</title>
            <author fullname="R. Stepanek" initials="R." surname="Stepanek"/>
            <author fullname="M. Loffredo" initials="M." surname="Loffredo"/>
            <date month="May" year="2024"/>
            <abstract>
              <t indent="0">This specification defines a data model and JavaScript Object Notation (JSON) representation of contact card information that can be used for data storage and exchange in address book or directory applications. It aims to be an alternative to the vCard data format and to be unambiguous, extendable, and simple to process. In contrast to the JSON-based jCard format, it is not a direct mapping from the vCard data model and expands semantics where appropriate. Two additional specifications define new vCard elements and how to convert between JSContact and vCard.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9553"/>
          <seriesInfo name="DOI" value="10.17487/RFC9553"/>
        </reference>
      </references>
      <references pn="section-6.2">
        <name slugifiedName="name-informative-references">Informative References</name>
        <reference anchor="RFC6350" target="https://www.rfc-editor.org/info/rfc6350" quoteTitle="true" derivedAnchor="RFC6350">
          <front>
            <title>vCard Format Specification</title>
            <author fullname="S. Perreault" initials="S." surname="Perreault"/>
            <date month="August" year="2011"/>
            <abstract>
              <t indent="0">This document defines the vCard data format for representing and exchanging a variety of information about individuals and other entities (e.g., formatted and structured name and delivery addresses, email address, multiple telephone numbers, photograph, logo, audio clips, etc.). This document obsoletes RFCs 2425, 2426, and 4770, and updates RFC 2739. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6350"/>
          <seriesInfo name="DOI" value="10.17487/RFC6350"/>
        </reference>
        <reference anchor="RFC6352" target="https://www.rfc-editor.org/info/rfc6352" quoteTitle="true" derivedAnchor="RFC6352">
          <front>
            <title>CardDAV: vCard Extensions to Web Distributed Authoring and Versioning (WebDAV)</title>
            <author fullname="C. Daboo" initials="C." surname="Daboo"/>
            <date month="August" year="2011"/>
            <abstract>
              <t indent="0">This document defines extensions to the Web Distributed Authoring and Versioning (WebDAV) protocol to specify a standard way of accessing, managing, and sharing contact information based on the vCard format. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6352"/>
          <seriesInfo name="DOI" value="10.17487/RFC6352"/>
        </reference>
        <reference anchor="RFC8126" target="https://www.rfc-editor.org/info/rfc8126" quoteTitle="true" derivedAnchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t indent="0">Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t indent="0">To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t indent="0">This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
        <reference anchor="RFC9610" target="https://www.rfc-editor.org/info/rfc9610" quoteTitle="true" derivedAnchor="RFC9610">
          <front>
            <title>JSON Meta Application Protocol (JMAP) for Contacts</title>
            <author fullname="N. Jenkins" initials="N." role="editor" surname="Jenkins"/>
            <date month="December" year="2024"/>
            <abstract>
              <t indent="0">This document specifies a data model for synchronising contact data with a server using the JSON Meta Application Protocol (JMAP).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9610"/>
          <seriesInfo name="DOI" value="10.17487/RFC9610"/>
        </reference>
      </references>
    </references>
    <section anchor="example" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.a">
      <name slugifiedName="name-example-profile">Example Profile</name>
      <t indent="0" pn="section-appendix.a-1">This section provides an example of a JSContact profile and illustrates how a JSContact Card complies with that profile.</t>
      <t indent="0" pn="section-appendix.a-2">The properties of the example profile are defined in <xref target="example-profile-properties" format="default" sectionFormat="of" derivedContent="Appendix A.1"/>. The profile describes contact cards that can only contain:</t>
      <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-appendix.a-3">
        <li pn="section-appendix.a-3.1">Contact cards for individuals and organizations, but no other kinds such as groups or devices.</li>
        <li pn="section-appendix.a-3.2">Full postal address lines, but no address components or any other property of the Address object type. The value type of the "addresses" property is pinned to its original definition, so that future JSContact extensions of that type do not become part of the profile.</li>
        <li pn="section-appendix.a-3.3">Full names and name components, but no other properties of the Name object type.</li>
        <li pn="section-appendix.a-3.4">Email addresses, where all properties of the EmailAddress object are supported.</li>
        <li pn="section-appendix.a-3.5">Anniversaries for birthdays, and only having "date" property values of type PartialDate, not Timestamp.</li>
        <li pn="section-appendix.a-3.6">Localizations, with the restriction that the PatchObject must only patch properties of the Card object.</li>
      </ul>
      <t indent="0" pn="section-appendix.a-4">An example of JSContact data that complies with this profile is shown in <xref target="example-profile-card" format="default" sectionFormat="of" derivedContent="Appendix A.2"/>. An example of its fictive IANA registration is shown in <xref target="example-profile-iana" format="default" sectionFormat="of" derivedContent="Appendix A.3"/>. This profile is just for illustration; it is not registered with IANA. <xref target="example-supported-properties" format="default" sectionFormat="of" derivedContent="Appendix A.4"/> describes how to determine the supported properties for that profile.</t>
      <section anchor="example-profile-properties" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.a.1">
        <name slugifiedName="name-profile-properties-example">Profile Properties Example</name>
        <t indent="0" pn="section-appendix.a.1-1">The following entries define properties of that profile. Entry elements with empty values are omitted:</t>
        <dl spacing="compact" indent="3" newline="false" pn="section-appendix.a.1-2">
          <dt pn="section-appendix.a.1-2.1">Property Name:</dt>
          <dd pn="section-appendix.a.1-2.2">addresses</dd>
          <dt pn="section-appendix.a.1-2.3">Property Context:</dt>
          <dd pn="section-appendix.a.1-2.4">Card</dd>
          <dt pn="section-appendix.a.1-2.5">Restricted Property Type:</dt>
          <dd pn="section-appendix.a.1-2.6">Id[Address]</dd>
        </dl>
        <dl spacing="compact" indent="3" newline="false" pn="section-appendix.a.1-3">
          <dt pn="section-appendix.a.1-3.1">Property Name:</dt>
          <dd pn="section-appendix.a.1-3.2">anniversaries</dd>
          <dt pn="section-appendix.a.1-3.3">Property Context:</dt>
          <dd pn="section-appendix.a.1-3.4">Card</dd>
        </dl>
        <dl spacing="compact" indent="3" newline="false" pn="section-appendix.a.1-4">
          <dt pn="section-appendix.a.1-4.1">Property Name:</dt>
          <dd pn="section-appendix.a.1-4.2">emails</dd>
          <dt pn="section-appendix.a.1-4.3">Property Context:</dt>
          <dd pn="section-appendix.a.1-4.4">Card</dd>
        </dl>
        <dl spacing="compact" indent="3" newline="false" pn="section-appendix.a.1-5">
          <dt pn="section-appendix.a.1-5.1">Property Name:</dt>
          <dd pn="section-appendix.a.1-5.2">kind</dd>
          <dt pn="section-appendix.a.1-5.3">Property Context:</dt>
          <dd pn="section-appendix.a.1-5.4">Card</dd>
          <dt pn="section-appendix.a.1-5.5">Restricted Enum Values:</dt>
          <dd pn="section-appendix.a.1-5.6">individual,org</dd>
        </dl>
        <dl spacing="compact" indent="3" newline="false" pn="section-appendix.a.1-6">
          <dt pn="section-appendix.a.1-6.1">Property Name:</dt>
          <dd pn="section-appendix.a.1-6.2">localizations</dd>
          <dt pn="section-appendix.a.1-6.3">Property Context:</dt>
          <dd pn="section-appendix.a.1-6.4">Card</dd>
          <dt pn="section-appendix.a.1-6.5">Restricted PatchObject:</dt>
          <dd pn="section-appendix.a.1-6.6">yes</dd>
        </dl>
        <dl spacing="compact" indent="3" newline="false" pn="section-appendix.a.1-7">
          <dt pn="section-appendix.a.1-7.1">Property Name:</dt>
          <dd pn="section-appendix.a.1-7.2">name</dd>
          <dt pn="section-appendix.a.1-7.3">Property Context:</dt>
          <dd pn="section-appendix.a.1-7.4">Card</dd>
        </dl>
        <dl spacing="compact" indent="3" newline="false" pn="section-appendix.a.1-8">
          <dt pn="section-appendix.a.1-8.1">Property Name:</dt>
          <dd pn="section-appendix.a.1-8.2">full</dd>
          <dt pn="section-appendix.a.1-8.3">Property Context:</dt>
          <dd pn="section-appendix.a.1-8.4">Address</dd>
          <dt pn="section-appendix.a.1-8.5">Restricted Attributes:</dt>
          <dd pn="section-appendix.a.1-8.6">mandatory</dd>
        </dl>
        <dl spacing="compact" indent="3" newline="false" pn="section-appendix.a.1-9">
          <dt pn="section-appendix.a.1-9.1">Property Name:</dt>
          <dd pn="section-appendix.a.1-9.2">date</dd>
          <dt pn="section-appendix.a.1-9.3">Property Context:</dt>
          <dd pn="section-appendix.a.1-9.4">Anniversary</dd>
          <dt pn="section-appendix.a.1-9.5">Restricted Property Type:</dt>
          <dd pn="section-appendix.a.1-9.6">PartialDate</dd>
        </dl>
        <dl spacing="compact" indent="3" newline="false" pn="section-appendix.a.1-10">
          <dt pn="section-appendix.a.1-10.1">Property Name:</dt>
          <dd pn="section-appendix.a.1-10.2">kind</dd>
          <dt pn="section-appendix.a.1-10.3">Property Context:</dt>
          <dd pn="section-appendix.a.1-10.4">Anniversary</dd>
          <dt pn="section-appendix.a.1-10.5">Restricted Enum Values:</dt>
          <dd pn="section-appendix.a.1-10.6">birth</dd>
        </dl>
        <dl spacing="compact" indent="3" newline="false" pn="section-appendix.a.1-11">
          <dt pn="section-appendix.a.1-11.1">Property Name:</dt>
          <dd pn="section-appendix.a.1-11.2">components</dd>
          <dt pn="section-appendix.a.1-11.3">Property Context:</dt>
          <dd pn="section-appendix.a.1-11.4">Name</dd>
        </dl>
        <dl spacing="compact" indent="3" newline="false" pn="section-appendix.a.1-12">
          <dt pn="section-appendix.a.1-12.1">Property Name:</dt>
          <dd pn="section-appendix.a.1-12.2">full</dd>
          <dt pn="section-appendix.a.1-12.3">Property Context:</dt>
          <dd pn="section-appendix.a.1-12.4">Name</dd>
        </dl>
        <dl spacing="compact" indent="3" newline="false" pn="section-appendix.a.1-13">
          <dt pn="section-appendix.a.1-13.1">Property Name:</dt>
          <dd pn="section-appendix.a.1-13.2">kind</dd>
          <dt pn="section-appendix.a.1-13.3">Property Context:</dt>
          <dd pn="section-appendix.a.1-13.4">NameComponent</dd>
        </dl>
        <dl spacing="compact" indent="3" newline="false" pn="section-appendix.a.1-14">
          <dt pn="section-appendix.a.1-14.1">Property Name:</dt>
          <dd pn="section-appendix.a.1-14.2">value</dd>
          <dt pn="section-appendix.a.1-14.3">Property Context:</dt>
          <dd pn="section-appendix.a.1-14.4">NameComponent</dd>
        </dl>
      </section>
      <section anchor="example-profile-card" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.a.2">
        <name slugifiedName="name-card-object-example">Card Object Example</name>
        <t indent="0" pn="section-appendix.a.2-1">The following Card object complies with the example profile:</t>
        <sourcecode type="json" markers="false" pn="section-appendix.a.2-2">
{
  "@type": "Card",
  "version": "1.0",
  "name": {
     "components": [
      { "kind": "given", "value": "Hayao" },
      { "kind": "surname", "value": "Miyazaki" }
    ]
  },
  "addresses": {
    "a1": {
      "full": "71 Cherry Court, Somewhere, 123SO, UK"
    }
  },
  "emails": {
    "e1": {
      "address": "hayao@example.com"
    }
  },
  "anniversaries": {
    "a1": {
      "kind": "birth",
      "date": {
        "month": 3,
        "day": 4
      }
    }
  },
  "localizations": {
    "jp": {
      "name": {
        "components": [
         { "kind": "surname", "value": "宮崎" },
         { "kind": "given", "value": "駿" }
        ]
      }
    }
  }
}</sourcecode>
        <t indent="0" pn="section-appendix.a.2-3">Note that:</t>
        <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-appendix.a.2-4">
          <li pn="section-appendix.a.2-4.1">The Address, Card, Name, and NameComponent object values only contain properties for which a property entry exists in the profile.</li>
          <li pn="section-appendix.a.2-4.2">The EmailAddress object contains the "address" property. This is allowed because the profile contains a property entry for the "emails" property of the Card object, but it does not define entries for the EmailAddress object properties. Consequently, all properties of the EmailAddress object can be set.</li>
          <li pn="section-appendix.a.2-4.3">The "full" property of the Address object is set. It is the only property allowed to be set in that profile for Address, and the "full" property is mandatory for this profile.</li>
          <li pn="section-appendix.a.2-4.4">The "kind" property of the NameComponent object is set to "surname" and "given". Since the profile does not restrict the enumerated values of this property, all valid NameComponent "kind" property values are supported.</li>
          <li pn="section-appendix.a.2-4.5">The "kind" property of the Card object is not set. The profile restricts the enumerated values of this property to "individual" and "org". Since "individual" is the default value for this property, there is no need to set it.</li>
          <li pn="section-appendix.a.2-4.6">The "date" property of the Anniversary object is restricted to be of type PartialDate in this profile. Because PartialDate is the default type for this property, there is no need to the set the "@type" property of the PartialDate object.</li>
        </ul>
      </section>
      <section anchor="example-profile-iana" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.a.3">
        <name slugifiedName="name-iana-registry-example">IANA Registry Example</name>
        <t indent="0" pn="section-appendix.a.3-1">The following would be registered at IANA if this were a real profile:</t>
        <dl newline="false" indent="3" spacing="normal" pn="section-appendix.a.3-2">
          <dt pn="section-appendix.a.3-2.1">Name:</dt>
          <dd pn="section-appendix.a.3-2.2">jscontact-simple-example</dd>
          <dt pn="section-appendix.a.3-2.3">Version:</dt>
          <dd pn="section-appendix.a.3-2.4">1</dd>
          <dt pn="section-appendix.a.3-2.5">Reference:</dt>
          <dd pn="section-appendix.a.3-2.6">This document, <xref target="example-profile-properties" format="default" sectionFormat="of" derivedContent="Appendix A.1"/></dd>
        </dl>
        <t indent="0" pn="section-appendix.a.3-3">See <xref target="iana-considerations" format="default" sectionFormat="of" derivedContent="Section 4"/> for the definition of each registry item.</t>
      </section>
      <section anchor="example-supported-properties" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.a.4">
        <name slugifiedName="name-supported-properties-exampl">Supported Properties Example</name>
        <t indent="0" pn="section-appendix.a.4-1">The following illustrates how to determine the supported properties of the example profile in this appendix, according to the steps defined in <xref target="supported-properties" format="default" sectionFormat="of" derivedContent="Section 3.4"/>:</t>
        <ol indent="adaptive" spacing="normal" start="1" type="1" pn="section-appendix.a.4-2">
        <li pn="section-appendix.a.4-2.1" derivedCounter="1.">
            <t indent="0" pn="section-appendix.a.4-2.1.1">We initialize the set of supported properties with all profile properties for which the Property Context includes the Card object. The set now includes the following properties:</t>
            <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-appendix.a.4-2.1.2">
              <li pn="section-appendix.a.4-2.1.2.1">Card.addresses</li>
              <li pn="section-appendix.a.4-2.1.2.2">Card.anniversaries</li>
              <li pn="section-appendix.a.4-2.1.2.3">Card.emails</li>
              <li pn="section-appendix.a.4-2.1.2.4">Card.kind</li>
              <li pn="section-appendix.a.4-2.1.2.5">Card.localizations</li>
              <li pn="section-appendix.a.4-2.1.2.6">Card.name</li>
            </ul>
          </li>
          <li pn="section-appendix.a.4-2.2" derivedCounter="2.">Next, we determine which of the properties in the current set have an object type as the value type. These are the Card.addresses, Card.anniversaries, Card.emails, and Card.name properties, so we need to inspect the object types Address, Anniversary, EmailAddress, and Name. The "addresses" entry restricts the value type of that property to "Id[Address]", which matches its original definition, but any future type extension would still require us only to inspect the Address type.</li>
          <li pn="section-appendix.a.4-2.3" derivedCounter="3.">
            <t indent="0" pn="section-appendix.a.4-2.3.1">For the Address object type, the profile has an entry for the "full" property, which contains the Address object in the Property Context, so we add that and only that to the set of supported properties. It now contains:</t>
            <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-appendix.a.4-2.3.2">
              <li pn="section-appendix.a.4-2.3.2.1">Address.full</li>
              <li pn="section-appendix.a.4-2.3.2.2">Card.addresses</li>
              <li pn="section-appendix.a.4-2.3.2.3">Card.emails</li>
              <li pn="section-appendix.a.4-2.3.2.4">Card.kind</li>
              <li pn="section-appendix.a.4-2.3.2.5">Card.localizations</li>
              <li pn="section-appendix.a.4-2.3.2.6">Card.name</li>
            </ul>
            <t indent="0" pn="section-appendix.a.4-2.3.3">The value type of the Address.full property is not an object type, so we need not consider a new object type to inspect. The remaining object types to inspect are the Anniversary, EmailAddress, and Name objects.</t>
          </li>
          <li pn="section-appendix.a.4-2.4" derivedCounter="4.">
            <t indent="0" pn="section-appendix.a.4-2.4.1">For the Anniversary object type, the profile explicitly lists the "kind" and "date" properties, so we add them to the set of supported properties. It now contains:</t>
            <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-appendix.a.4-2.4.2">
              <li pn="section-appendix.a.4-2.4.2.1">Address.full</li>
              <li pn="section-appendix.a.4-2.4.2.2">Anniversary.date</li>
              <li pn="section-appendix.a.4-2.4.2.3">Anniversary.kind</li>
              <li pn="section-appendix.a.4-2.4.2.4">Card.addresses</li>
              <li pn="section-appendix.a.4-2.4.2.5">Card.emails</li>
              <li pn="section-appendix.a.4-2.4.2.6">Card.kind</li>
              <li pn="section-appendix.a.4-2.4.2.7">Card.localizations</li>
              <li pn="section-appendix.a.4-2.4.2.8">Card.name</li>
            </ul>
            <t indent="0" pn="section-appendix.a.4-2.4.3">The newly added Anniversary.date property has object value type PartialDate, so we add that to the list of object types to inspect. The entry restricts the type of that property to only be of that type, so we do not add the object value type Timestamp. The remaining object types to inspect are the EmailAddress, Name, and PartialDate objects.</t>
          </li>
          <li pn="section-appendix.a.4-2.5" derivedCounter="5.">
            <t indent="0" pn="section-appendix.a.4-2.5.1">For the PartialDate object type, the profile does not contain any entry where the Property Context contains the PartialDate object. Instead, we add properties from the "JSContact Properties" registry where the Property Context includes the PartialDate object. The set of supported properties now contains:</t>
            <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-appendix.a.4-2.5.2">
              <li pn="section-appendix.a.4-2.5.2.1">Address.full</li>
              <li pn="section-appendix.a.4-2.5.2.2">Anniversary.date</li>
              <li pn="section-appendix.a.4-2.5.2.3">Anniversary.kind</li>
              <li pn="section-appendix.a.4-2.5.2.4">Card.addresses</li>
              <li pn="section-appendix.a.4-2.5.2.5">Card.emails</li>
              <li pn="section-appendix.a.4-2.5.2.6">Card.kind</li>
              <li pn="section-appendix.a.4-2.5.2.7">Card.localizations</li>
              <li pn="section-appendix.a.4-2.5.2.8">Card.name</li>
              <li pn="section-appendix.a.4-2.5.2.9">PartialDate.calendarScale</li>
              <li pn="section-appendix.a.4-2.5.2.10">PartialDate.day</li>
              <li pn="section-appendix.a.4-2.5.2.11">PartialDate.month</li>
              <li pn="section-appendix.a.4-2.5.2.12">PartialDate.year</li>
            </ul>
            <t indent="0" pn="section-appendix.a.4-2.5.3">None of the newly added properties have object value types. The remaining object types to inspect are the EmailAddress and Name objects.</t>
          </li>
          <li pn="section-appendix.a.4-2.6" derivedCounter="6.">
            <t indent="0" pn="section-appendix.a.4-2.6.1">For the EmailAddress object type, the profile does not contain any entry where the Property Context contains the EmailAddress object. Instead, we add properties from the "JSContact Properties" registry where the Property Context includes the EmailAddress object. The set of supported properties now contains:</t>
            <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-appendix.a.4-2.6.2">
              <li pn="section-appendix.a.4-2.6.2.1">Address.full</li>
              <li pn="section-appendix.a.4-2.6.2.2">Anniversary.date</li>
              <li pn="section-appendix.a.4-2.6.2.3">Anniversary.kind</li>
              <li pn="section-appendix.a.4-2.6.2.4">Card.addresses</li>
              <li pn="section-appendix.a.4-2.6.2.5">Card.emails</li>
              <li pn="section-appendix.a.4-2.6.2.6">Card.kind</li>
              <li pn="section-appendix.a.4-2.6.2.7">Card.localizations</li>
              <li pn="section-appendix.a.4-2.6.2.8">Card.name</li>
              <li pn="section-appendix.a.4-2.6.2.9">EmailAddress.address</li>
              <li pn="section-appendix.a.4-2.6.2.10">EmailAddress.contexts</li>
              <li pn="section-appendix.a.4-2.6.2.11">EmailAddress.label</li>
              <li pn="section-appendix.a.4-2.6.2.12">EmailAddress.pref</li>
              <li pn="section-appendix.a.4-2.6.2.13">PartialDate.calendarScale</li>
              <li pn="section-appendix.a.4-2.6.2.14">PartialDate.day</li>
              <li pn="section-appendix.a.4-2.6.2.15">PartialDate.month</li>
              <li pn="section-appendix.a.4-2.6.2.16">PartialDate.year</li>
            </ul>
            <t indent="0" pn="section-appendix.a.4-2.6.3">None of the newly added properties have object value types. The remaining object type to inspect is the Name object.</t>
          </li>
          <li pn="section-appendix.a.4-2.7" derivedCounter="7.">
            <t indent="0" pn="section-appendix.a.4-2.7.1">For the Name object type, the profile explicitly lists the "components" and "full" properties, so we add them to the set of supported properties. It now contains:</t>
            <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-appendix.a.4-2.7.2">
              <li pn="section-appendix.a.4-2.7.2.1">Address.full</li>
              <li pn="section-appendix.a.4-2.7.2.2">Anniversary.date</li>
              <li pn="section-appendix.a.4-2.7.2.3">Anniversary.kind</li>
              <li pn="section-appendix.a.4-2.7.2.4">Card.addresses</li>
              <li pn="section-appendix.a.4-2.7.2.5">Card.emails</li>
              <li pn="section-appendix.a.4-2.7.2.6">Card.kind</li>
              <li pn="section-appendix.a.4-2.7.2.7">Card.localizations</li>
              <li pn="section-appendix.a.4-2.7.2.8">Card.name</li>
              <li pn="section-appendix.a.4-2.7.2.9">EmailAddress.address</li>
              <li pn="section-appendix.a.4-2.7.2.10">EmailAddress.contexts</li>
              <li pn="section-appendix.a.4-2.7.2.11">EmailAddress.label</li>
              <li pn="section-appendix.a.4-2.7.2.12">EmailAddress.pref</li>
              <li pn="section-appendix.a.4-2.7.2.13">Name.full</li>
              <li pn="section-appendix.a.4-2.7.2.14">Name.components</li>
              <li pn="section-appendix.a.4-2.7.2.15">PartialDate.calendarScale</li>
              <li pn="section-appendix.a.4-2.7.2.16">PartialDate.day</li>
              <li pn="section-appendix.a.4-2.7.2.17">PartialDate.month</li>
              <li pn="section-appendix.a.4-2.7.2.18">PartialDate.year</li>
            </ul>
            <t indent="0" pn="section-appendix.a.4-2.7.3">The newly added Name.components property has object value type NameComponent, so we add that to the list of object types to inspect.</t>
          </li>
          <li pn="section-appendix.a.4-2.8" derivedCounter="8.">
            <t indent="0" pn="section-appendix.a.4-2.8.1">For the NameComponent object type, the profile does not explicitly list any property. Instead, we add properties of the "JSContact Properties" registry where the Property Context includes the NameComponent object. The set of supported properties now contains:</t>
            <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-appendix.a.4-2.8.2">
              <li pn="section-appendix.a.4-2.8.2.1">Address.full</li>
              <li pn="section-appendix.a.4-2.8.2.2">Anniversary.date</li>
              <li pn="section-appendix.a.4-2.8.2.3">Anniversary.kind</li>
              <li pn="section-appendix.a.4-2.8.2.4">Card.addresses</li>
              <li pn="section-appendix.a.4-2.8.2.5">Card.emails</li>
              <li pn="section-appendix.a.4-2.8.2.6">Card.kind</li>
              <li pn="section-appendix.a.4-2.8.2.7">Card.localizations</li>
              <li pn="section-appendix.a.4-2.8.2.8">Card.name</li>
              <li pn="section-appendix.a.4-2.8.2.9">EmailAddress.address</li>
              <li pn="section-appendix.a.4-2.8.2.10">EmailAddress.contexts</li>
              <li pn="section-appendix.a.4-2.8.2.11">EmailAddress.label</li>
              <li pn="section-appendix.a.4-2.8.2.12">EmailAddress.pref</li>
              <li pn="section-appendix.a.4-2.8.2.13">NameComponent.kind</li>
              <li pn="section-appendix.a.4-2.8.2.14">NameComponent.phonetic</li>
              <li pn="section-appendix.a.4-2.8.2.15">NameComponent.value</li>
              <li pn="section-appendix.a.4-2.8.2.16">PartialDate.calendarScale</li>
              <li pn="section-appendix.a.4-2.8.2.17">PartialDate.day</li>
              <li pn="section-appendix.a.4-2.8.2.18">PartialDate.month</li>
              <li pn="section-appendix.a.4-2.8.2.19">PartialDate.year</li>
            </ul>
            <t indent="0" pn="section-appendix.a.4-2.8.3">None of the newly added properties have object value types, and there are no remaining object types to inspect. This determines the set of supported properties by that profile, in addition to the "Card.version" and "@type" property that are always supported.</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="authors-addresses" numbered="false" removeInRFC="false" toc="include" pn="section-appendix.b">
      <name slugifiedName="name-authors-addresses">Authors' Addresses</name>
      <author initials="R." surname="Stepanek" fullname="Robert Stepanek">
        <organization showOnFrontPage="true">Fastmail</organization>
        <address>
          <postal>
            <extaddr>PO Box 234</extaddr>
            <street>Collins St. West</street>
            <city>Melbourne</city>
            <region>VIC</region>
            <code>8007</code>
            <country>Australia</country>
          </postal>
          <email>rsto@fastmailteam.com</email>
        </address>
      </author>
      <author initials="M." surname="Loffredo" fullname="Mario Loffredo">
        <organization showOnFrontPage="true">IIT-CNR</organization>
        <address>
          <postal>
            <street>Via Moruzzi, 1</street>
            <city>Pisa</city>
            <code>56124</code>
            <country>Italy</country>
          </postal>
          <email>mario.loffredo@iit.cnr.it</email>
        </address>
      </author>
    </section>
  </back>
</rfc>
