1
0
mirror of https://github.com/moparisthebest/xeps synced 2024-11-15 22:05:01 -05:00
xeps/xep-0298.xml

725 lines
26 KiB
XML
Raw Normal View History

2011-04-13 23:16:55 -04:00
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE xep SYSTEM 'xep.dtd' [
<!ENTITY % ents SYSTEM 'xep.ent'>
%ents;
]>
<?xml-stylesheet type='text/xsl' href='xep.xsl'?>
<xep>
<header>
<title>Delivering Conference Information to Jingle Participants (Coin)</title>
<abstract>This specification defines an XMPP extension for tightly coupled
conference calls. It allows users who participate in multiparty Jingle
calls via a focus agent (mixer) to retrieve information and receive
notifications about the state of the call and the other participants.
This extension is also meant to provide a straightforward way of
connecting SIP and XMPP clients to the same conference room.
</abstract>
&LEGALNOTICE;
2011-06-09 18:21:43 -04:00
<number>0298</number>
2012-07-05 17:07:03 -04:00
<status>Deferred</status>
2011-04-13 23:16:55 -04:00
<type>Standards Track</type>
<sig>Standards</sig>
<approver>Council</approver>
<dependencies>
<spec>XEP-0167</spec>
</dependencies>
<supersedes />
<supersededby />
<shortname>coin</shortname>
<author>
<firstname>Emil</firstname>
<surname>Ivov</surname>
2011-06-09 18:21:43 -04:00
<email>emcho@jitsi.org</email>
2011-04-13 23:16:55 -04:00
<jid>emcho@sip-communicator.org</jid>
</author>
<author>
<firstname>Enrico</firstname>
<surname>Marocco</surname>
<email>enrico.marocco@telecomitalia.it</email>
<jid>enrico@tilab.com </jid>
</author>
<discuss>jingle</discuss>
2011-06-09 18:21:43 -04:00
<revision>
<version>0.1</version>
<date>2011-06-09</date>
<initials>psa</initials>
<remark><p>Initial published version.</p></remark>
</revision>
2011-04-13 23:16:55 -04:00
<revision>
<version>0.0.1</version>
2011-06-09 18:21:43 -04:00
<date>2011-06-09</date>
2011-04-13 23:16:55 -04:00
<initials>ei/em</initials>
<remark>
<p>First draft.</p>
</remark>
</revision>
</header>
<section1 topic='Introduction' anchor='intro'>
<p>&xep0166; defines a way for XMPP agents to establish and control
one-to-one media sessions. It is possible for either participant in such a
session to also establish additional conversations and then serve as a
media mixer. This could be viewed as a classic conference call scenario
and is also often referred to as a tightly coupled conference.</p>
<p>Basic participation or hosting of tightly coupled conferences requires
no specific protocol support. With the exception of the mixing agent, call
members, however, all perceive the session as a regular one-to-one call.
They have no way of obtaining additional information about how many and what
other users are participating.</p>
<p>The Coin extension (short for Conference Information) allows media
mixers to deliver to participants additional information about the status
of the call, and that of its members.</p>
<p>A conference participant exchanges Coin IQs only with the agent they
have established a session with. This means that it can also be used in
cases where only a subset of the users on a call are using XMPP while others
are connected via alternative mechanisms such as SIP's conference
package &rfc4575;</p>
</section1>
<section1 topic='Terminology' anchor='terms'>
<dl>
<di>
<dt>Mixer</dt>
<dd>Throughout this document the term is used to depict an entity that is
responsible for mixing and delivering to conference participants both
signalling and media. Other specifications refer to mixers and focus
agents as two distinct entities but we find this separation to be
unnecessary in the current specification and view both as a single logical
entity</dd>
</di>
</dl>
</section1>
<section1 topic='Requirements' anchor='reqs'>
<p>The extension defined herein is designed to meet the following
requirements:</p>
<ol>
<li>Provide a means for mixer agents in tightly coupled
conferences to advertise call and member state information to the call
participants.</li>
<li>Reuse as much as possible the existing format and XML schema already
defined in <cite>RFC 4575</cite>.</li>
<li>Impose no requirements on agents joining the call other than those
necessary to establish a regular one-to-one call.</li>
<li>Allow straightforward interoperability with other conferencing
mechanisms such as <cite>RFC 4575</cite>; or &xep0272;</li>
</ol>
</section1>
<section1 topic='How It Works' anchor='howitworks'>
<p>This section provides a friendly introduction to Coin.</p>
<p>In essence Coin allows clients that establish Jingle calls to
determine whether their peer is acting as a mixer or to announce themselves
as such. This way non-mixer participants would know when they are
participating in a conference call and would be able to notify the user
accordingly.</p>
<p>Once in a call, call members and mixers can use Coin to exchange
<cite>RFC 4575</cite> conference information indicating what participants
are currently on the call and what their status is.</p>
</section1>
<section1 topic='Creating a conference call' anchor='call-create'>
<p>When creating conference calls mixers SHOULD indicate the nature of the
call as early as possible. This is necessary in order to allow other
participating user agents to adapt their user interface in an appropriate
way.</p>
<code caption="A mixer sends session-initiate for a conference call">
<![CDATA[
<iq from='romeo@montague.lit/orchard'
id='zid615d9'
to='juliet@capulet.lit/balcony'
type='set'>
<jingle xmlns='urn:xmpp:jingle:1'>
action='session-initiate'
initiator='romeo@montague.lit/orchard'
sid='a73sjjvkla37jfea'>
<content creator='initiator' name='this-is-a-stub'>
<description xmlns='urn:xmpp:jingle:apps:stub:0'/>
<transport xmlns='urn:xmpp:jingle:transports:stub:0'/>
</content>
<conference-info isfocus='true'/>
</jingle>
</iq>
]]></code>
<p>Similarly mixers being dialed by new participants SHOULD indicate the
nature of the call by including the &lt;conference-info/&gt; element into
the Jingle session-accept message.</p>
<p>Finally, when transforming an existing one-to-one session into a
conference or vice-versa a mixer SHOULD send a Jingle session-info message
with the appropriate &lt;conference-info/&gt; element. </p>
<p>Note that presence of the &lt;conference-info/&gt; element is only
determines whether the party sending it is currently acting as a mixer or
not. If multiple peers in a call are independently acting as mixers they
should all indicate their status accordingly.</p>
</section1>
<section1 topic='Delivering conference information' anchor='coin-delivery'>
<p>Once a conference call has been established and advertised as such, a
mixer MAY at any point send information describing the state of the call and
its current participants.</p>
<code caption="Mixer sends information about the current state of the call">
<![CDATA[
<iq from='romeo@montague.lit/orchard'
id='zid615d9'
to='juliet@capulet.lit/balcony'
type='set'>
<conference-info xmlns="urn:ietf:params:xml:ns:conference-info"
entity="xmpp:romeo@monague.lit/orchard"
state="full"
version="1">
<!-- CONFERENCE INFO -->
<conference-description>
<subject>Ending a relationship</subject>
</conference-description>
<!-- CONFERENCE STATE -->
<conference-state>
<user-count>3</user-count>
</conference-state>
<!-- USERS -->
<users>
<user entity="xmpp:romeo@montague.lit" state="full">
<display-text>Romeo</display-text>
<!-- ENDPOINTS -->
<endpoint entity="xmpp:romeo@montague.lit/orchard">
<display-text>Romeo's smartphone</display-text>
<status>disconnected</status>
<disconnection-info>
<when>2011-01-31T20:00:00Z</when>
<reason>poisoned</reason>
</disconnection-info>
<!-- MEDIA -->
<media id="1">
<display-text>main audio</display-text>
<type>audio</type>
<src-id>432424</src-id>
</media>
</endpoint>
</user>
<user entity="xmpp:juliet@capulet.lit" state="full">
<display-text>Romeo</display-text>
<!-- ENDPOINTS -->
<endpoint entity="juliet@capulet.lit/balcony/orchard">
<display-text>Juliet's netbook</display-text>
<status>connected</status>
<!-- MEDIA -->
<media id="1">
<type>audio</type>
<src-id>2124</src-id>
</media>
</endpoint>
</user>
<!-- USER -->
<user entity="sip:alice@example.com" state="full">
<display-text>Alice</display-text>
<!-- ENDPOINTS -->
<endpoint entity="sip:4kfk4j392jsu@example.com;grid=433kj4j3u">
<status>connected</status>
<!-- MEDIA -->
<media id="1">
<type>audio</type>
<src-id>534232</src-id>
</media>
</endpoint>
</user>
</users>
</conference-info>
</iq>
]]></code>
</section1>
<section1 topic='Determining Support' anchor='support'>
<p>If an entity supports Coin, it SHOULD advertise that fact by returning
a feature of "urn:xmpp:coin" in response to a &xep0030;
information request.</p>
<example caption="Service Discovery Information Request"><![CDATA[
<iq from='kingclaudius@shakespeare.lit/castle'
id='ku6e51v3'
to='laertes@shakespeare.lit/castle'
type='get'>
<query xmlns='http://jabber.org/protocol/disco#info'/>
</iq>
]]></example>
<example caption="Service Discovery Information Response"><![CDATA[
<iq from='laertes@shakespeare.lit/castle'
id='ku6e51v3'
to='kingclaudius@shakespeare.lit/castle'
type='result'>
<query xmlns='http://jabber.org/protocol/disco#info'>
<feature var='urn:xmpp:coin'/>
</query>
</iq>
]]></example>
<p>In order for an application to determine whether an entity supports this
protocol, where possible it SHOULD use the dynamic, presence-based profile
of service discovery defined in &xep0115;. However, if an application has
not received entity capabilities information from an entity, it SHOULD use
explicit service discovery instead.</p>
</section1>
<section1 topic='Security Considerations' anchor='security'>
<p>PENDING: <cite>RFC 4575</cite> mostly talks about authentication
conference-info subscriptions but these are not part of this specification.
The authors are hence currently unaware of any other Coin specific security
considerations</p>
</section1>
<section1 topic='Open Issues' anchor='issues'>
<p>This document provides a basic description of a simple way to support
tightly coupled conference calls. It is in many respects still a stub and a
number of open issues require the attention of the community:</p>
<ol>
<li>Need to define best practices for user agents to easily determine
whether the request of user to establish a conference call should result
in a Muji or a Coin conference.</li>
</ol>
</section1>
<section1 topic='XML Schemas' anchor='schema'>
<section2 topic='Advertising Conf Calls' anchor='schema-discover'>
<code><![CDATA[
<?xml version='1.0' encoding='UTF-8'?>
<xs:schema
xmlns:xs='http://www.w3.org/2001/XMLSchema'
targetNamespace='urn:xmpp:jingle:apps:coin:1'
xmlns='urn:xmpp:jingle:apps:coin:1'
elementFormDefault='qualified'>
<xs:annotation>
<xs:documentation>
The protocol documented by this schema is defined in
XEP-0XXX: http://www.xmpp.org/extensions/xep-0XXX.html
</xs:documentation>
</xs:annotation>
<xs:element name="conference-info" type="empty">
<xs:complexType>
<xs:attribute name='isfocus' type='xs:boolean' required='true'/>
</xs:complexType>
</xs:element>
</xs:schema>
]]></code>
</section2>
<section2 topic='Conference Info' anchor='schema-coin'>
<code><![CDATA[
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema
targetNamespace="urn:ietf:params:xml:ns:conference-info"
xmlns:tns="urn:ietf:params:xml:ns:conference-info"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="urn:ietf:params:xml:ns:conference-info"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:annotation>
<xs:documentation>
The protocol documented by this schema is defined in
RFC 4575: http://tools.ietf.org/html/rfc4575 and reused by
XEP XXXX http://www.xmpp.org/extensions/xep-XXXX.html
</xs:documentation>
</xs:annotation>
<!--
This imports the xml:language definition
-->
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="http://www.w3.org/2001/03/xml.xsd"/>
<!--
CONFERENCE ELEMENT
-->
<xs:element name="conference-info" type="conference-type"/>
<!--
CONFERENCE TYPE
-->
<xs:complexType name="conference-type">
<xs:sequence>
<xs:element name="conference-description"
type="conference-description-type" minOccurs="0"/>
<xs:element name="host-info"
type="host-type" minOccurs="0"/>
<xs:element name="conference-state"
type="conference-state-type" minOccurs="0"/>
<xs:element name="users"
type="users-type" minOccurs="0"/>
<xs:element name="sidebars-by-ref"
type="uris-type" minOccurs="0"/>
<xs:element name="sidebars-by-val"
type="sidebars-by-val-type" minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="entity"
type="xs:anyURI" use="required"/>
<xs:attribute name="state"
type="state-type" use="optional" default="full"/>
<xs:attribute name="version"
type="xs:unsignedInt" use="optional"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
STATE TYPE
-->
<xs:simpleType name="state-type">
<xs:restriction base="xs:string">
<xs:enumeration value="full"/>
<xs:enumeration value="partial"/>
<xs:enumeration value="deleted"/>
</xs:restriction>
</xs:simpleType>
<!--
CONFERENCE DESCRIPTION TYPE
-->
<xs:complexType name="conference-description-type">
<xs:sequence>
<xs:element name="display-text"
type="xs:string" minOccurs="0"/>
<xs:element name="subject"
type="xs:string" minOccurs="0"/>
<xs:element name="free-text"
type="xs:string" minOccurs="0"/>
<xs:element name="keywords"
type="keywords-type" minOccurs="0"/>
<xs:element name="conf-uris"
type="uris-type" minOccurs="0"/>
<xs:element name="service-uris"
type="uris-type" minOccurs="0"/>
<xs:element name="maximum-user-count"
type="xs:unsignedInt" minOccurs="0"/>
<xs:element name="available-media"
type="conference-media-type" minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
HOST TYPE
-->
<xs:complexType name="host-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="web-page" type="xs:anyURI"
minOccurs="0"/>
<xs:element name="uris" type="uris-type"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
CONFERENCE STATE TYPE
-->
<xs:complexType name="conference-state-type">
<xs:sequence>
<xs:element name="user-count" type="xs:unsignedInt"
minOccurs="0"/>
<xs:element name="active" type="xs:boolean"
minOccurs="0"/>
<xs:element name="locked" type="xs:boolean"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
CONFERENCE MEDIA TYPE
-->
<xs:complexType name="conference-media-type">
<xs:sequence>
<xs:element name="entry" type="conference-medium-type"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
CONFERENCE MEDIUM TYPE
-->
<xs:complexType name="conference-medium-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="type" type="xs:string"/>
<xs:element name="status" type="media-status-type"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="label" type="xs:string"
use="required"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
URIs TYPE
-->
<xs:complexType name="uris-type">
<xs:sequence>
<xs:element name="entry" type="uri-type"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="state" type="state-type"
use="optional" default="full"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
URI TYPE
-->
<xs:complexType name="uri-type">
<xs:sequence>
<xs:element name="uri" type="xs:anyURI"/>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="purpose" type="xs:string"
minOccurs="0"/>
<xs:element name="modified" type="execution-type"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
KEYWORDS TYPE
-->
<xs:simpleType name="keywords-type">
<xs:list itemType="xs:string"/>
</xs:simpleType>
<!--
USERS TYPE
-->
<xs:complexType name="users-type">
<xs:sequence>
<xs:element name="user" type="user-type"
minOccurs="0" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="state" type="state-type"
use="optional" default="full"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
USER TYPE
-->
<xs:complexType name="user-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="associated-aors" type="uris-type"
minOccurs="0"/>
<xs:element name="roles" type="user-roles-type"
minOccurs="0"/>
<xs:element name="languages" type="user-languages-type"
minOccurs="0"/>
<xs:element name="cascaded-focus" type="xs:anyURI"
minOccurs="0"/>
<xs:element name="endpoint" type="endpoint-type"
minOccurs="0" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="entity" type="xs:anyURI"/>
<xs:attribute name="state" type="state-type"
use="optional" default="full"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
USER ROLES TYPE
-->
<xs:complexType name="user-roles-type">
<xs:sequence>
<xs:element name="entry" type="xs:string"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
USER LANGUAGES TYPE
-->
<xs:simpleType name="user-languages-type">
<xs:list itemType="xs:language"/>
</xs:simpleType>
<!--
ENDPOINT TYPE
-->
<xs:complexType name="endpoint-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="referred" type="execution-type"
minOccurs="0"/>
<xs:element name="status" type="endpoint-status-type"
minOccurs="0"/>
<xs:element name="joining-method" type="joining-type"
minOccurs="0"/>
<xs:element name="joining-info"
type="execution-type"
minOccurs="0"/>
<xs:element name="disconnection-method"
type="disconnection-type"
minOccurs="0"/>
<xs:element name="disconnection-info"
type="execution-type"
minOccurs="0"/>
<xs:element name="media" type="media-type"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="call-info" type="call-type"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="entity" type="xs:string"/>
<xs:attribute name="state" type="state-type"
use="optional" default="full"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
ENDPOINT STATUS TYPE
-->
<xs:simpleType name="endpoint-status-type">
<xs:restriction base="xs:string">
<xs:enumeration value="pending"/>
<xs:enumeration value="dialing-out"/>
<xs:enumeration value="dialing-in"/>
<xs:enumeration value="alerting"/>
<xs:enumeration value="on-hold"/>
<xs:enumeration value="connected"/>
<xs:enumeration value="muted-via-focus"/>
<xs:enumeration value="disconnecting"/>
<xs:enumeration value="disconnected"/>
</xs:restriction>
</xs:simpleType>
<!--
JOINING TYPE
-->
<xs:simpleType name="joining-type">
<xs:restriction base="xs:string">
<xs:enumeration value="dialed-in"/>
<xs:enumeration value="dialed-out"/>
<xs:enumeration value="focus-owner"/>
</xs:restriction>
</xs:simpleType>
<!--
DISCONNECTION TYPE
-->
<xs:simpleType name="disconnection-type">
<xs:restriction base="xs:string">
<xs:enumeration value="departed"/>
<xs:enumeration value="booted"/>
<xs:enumeration value="failed"/>
<xs:enumeration value="busy"/>
</xs:restriction>
</xs:simpleType>
<!--
EXECUTION TYPE
-->
<xs:complexType name="execution-type">
<xs:sequence>
<xs:element name="when" type="xs:dateTime"
minOccurs="0"/>
<xs:element name="reason" type="xs:string"
minOccurs="0"/>
<xs:element name="by" type="xs:anyURI"
minOccurs="0"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
CALL TYPE
-->
<xs:complexType name="call-type">
<xs:choice>
<xs:element name="sip" type="sip-dialog-id-type"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:choice>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
SIP DIALOG ID TYPE
-->
<xs:complexType name="sip-dialog-id-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="call-id" type="xs:string"/>
<xs:element name="from-tag" type="xs:string"/>
<xs:element name="to-tag" type="xs:string"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
MEDIA TYPE
-->
<xs:complexType name="media-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="type" type="xs:string"
minOccurs="0"/>
<xs:element name="label" type="xs:string"
minOccurs="0"/>
<xs:element name="src-id" type="xs:string"
minOccurs="0"/>
<xs:element name="status" type="media-status-type"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="xs:string"
use="required"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
MEDIA STATUS TYPE
-->
<xs:simpleType name="media-status-type">
<xs:restriction base="xs:string">
<xs:enumeration value="recvonly"/>
<xs:enumeration value="sendonly"/>
<xs:enumeration value="sendrecv"/>
<xs:enumeration value="inactive"/>
</xs:restriction>
</xs:simpleType>
<!--
SIDEBARS BY VAL TYPE
-->
<xs:complexType name="sidebars-by-val-type">
<xs:sequence>
<xs:element name="entry" type="conference-type"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="state" type="state-type"
use="optional" default="full"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:schema>
</xs:schema>
]]></code>
</section2>
</section1>
2011-06-09 18:21:43 -04:00
<section1 topic='Acknowledgements' anchor='acks'>
<p>Jitsi's participation in this specification is funded by the NLnet
Foundation.</p>
</section1>
2011-04-13 23:16:55 -04:00
</xep>