XMPP client aTalk with smack 4.4.0 with an account registered on example.ru service which runs on openfire v4.2.3:
Following decribes the observation:
- while the user test@example.ru is in standby, and aTalk is receiving ping from the server. Everything is working fine at this stage.
- User activates a chat session with babai@example.ru; aTalk auto init a check for buddy capabilities including omemo support.
- Openfire throws stream error indicated that there is an out-of-order sm ack.
<stream:error xmlns:stream=“http://etherx.jabber.org/streams”>You acknowledged stanzas that we didn’t send. Your Ack h: 39, our last stanza: 21</stream:error>
-
All this while, aTalk testing has been carried out with own home server ejabberd v18.03, it never encounters this problem before.
-
Look like the sm ack out of error also occurs while aTalk is trying to request for server chatRoom info.
-
The above is also not being observed while user is using openfire v4.1.6, prior to him upgraded the server to use v4.2.3 yesterday.
========== aTalk log when accessing omemo messaging ========
09-06 08:12:05.440 14439-14551/org.atalk.android D/SMACK: RECV (0): <iq type="get" id="948-4056" from="example.ru" to="test@example.ru/atalk"><ping xmlns="urn:xmpp:ping"/></iq>
09-06 08:12:05.460 14439-14550/org.atalk.android D/SMACK: SENT (0): <iq to='example.ru' id='948-4056' type='result'></iq><r xmlns='urn:xmpp:sm:3'/>
09-06 08:12:05.873 14439-14551/org.atalk.android D/SMACK: RECV (0): <a xmlns='urn:xmpp:sm:3' h='35' />
09-06 08:12:21.130 14439-14551/org.atalk.android D/SMACK: RECV (0): <iq type="get" id="535-4059" from="example.ru" to="test@example.ru/atalk"><ping xmlns="urn:xmpp:ping"/></iq>
09-06 08:12:21.145 14439-14550/org.atalk.android D/SMACK: SENT (0): <iq to='example.ru' id='535-4059' type='result'></iq>
09-06 08:12:36.799 14439-14551/org.atalk.android D/SMACK: RECV (0): <iq type="get" id="352-4063" from="example.ru" to="test@example.ru/atalk"><ping xmlns="urn:xmpp:ping"/></iq>
09-06 08:12:36.814 14439-14550/org.atalk.android D/SMACK: SENT (0): <iq to='example.ru' id='352-4063' type='result'></iq>
09-06 08:12:38.978 14439-14550/org.atalk.android D/SMACK: SENT (0): <iq to='example.ru' id='rLXRF-117' type='get'><query xmlns='http://jabber.org/protocol/disco#info'></query></iq>
09-06 08:12:39.137 14439-14439/org.atalk.android I/aTalk: [2] org.jivesoftware.smackx.avatar.AvatarManager.getAvatarImageByJid() Fetching avatar from local storage for: 09-06 08:12:39.458 14439-14551/org.atalk.android D/SMACK: RECV (0): <iq type="result" id="rLXRF-117" from="example.ru" to="test@example.ru/atalk"><query xmlns="http://jabber.org/protocol/disco#info"><identity category="server" name="Openfire Server" type="im"/><identity category="pubsub" type="pep"/><feature var="http://jabber.org/protocol/pubsub#retrieve-default"/><feature var="http://jabber.org/protocol/pubsub#purge-nodes"/><feature var="vcard-temp"/><feature var="http://jabber.org/protocol/pubsub#subscribe"/><feature var="http://jabber.org/protocol/pubsub#subscription-options"/><feature var="http://jabber.org/protocol/pubsub#create-nodes"/><feature var="http://jabber.org/protocol/pubsub#outcast-affiliation"/><feature var="msgoffline"/><feature var="http://jabber.org/protocol/pubsub#get-pending"/><feature var="http://jabber.org/protocol/pubsub#multi-subscribe"/><feature var="http://jabber.org/protocol/pubsub#presence-notifications"/><feature var="urn:xmpp:ping"/><feature var="jabber:iq:register"/><feature var="http://jabber.org/protocol/pubsub#delete-nodes"/><feature var="http://jabber.org/protocol/pubsub#config-node"/><feature var="http://jabber.org/protocol/pubsub#retrieve-items"/><feature var="http://jabber.org/protocol/pubsub#auto-create"/><feature var="http://jabber.org/protocol/disco#items"/><feature var="http://jabber.org/protocol/pubsub#item-ids"/><feature var="http://jabber.org/protocol/pubsub#meta-data"/><feature var="jabber:iq:roster"/><feature var="http://jabber.org/protocol/pubsub#instant-nodes"/><feature var="http://jabber.org/protocol/pubsub#modify-affiliations"/><feature var="http://jabber.org/protocol/pubsub#persistent-items"/><feature var="http://jabber.org/protocol/pubsub#create-and-configure"/><feature var="http://jabber.org/protocol/pubsub"/><feature var="http://jabber.org/protocol/pubsub#publisher-affiliation"/><feature var="http://jabber.org/protocol/pubsub#access-open"/><feature var="http://jabber.org/protocol/pubsub#retrieve-affiliations"/><feature var="jabber:iq:version"/><feature var="http://jabber.org/protocol/pubsub#retract-items"/><feature var="urn:xmpp:time"/><feature var="http://jabber.org/protocol/pubsub#manage-subscriptions"/><feature var="jabber:iq:privacy"/><feature var="jabber:iq:last"/><feature var="http://jabber.org/protocol/commands"/><feature var="http://jabber.org/protocol/offline"/><feature var="urn:xmpp:carbons:2"/><feature var="http://jabber.org/protocol/address"/><feature var="http://jabber.org/protocol/pubsub#publish"/><feature var="http://jabber.org/protocol/pubsub#collections"/><feature var="http://jabber.org/protocol/pubsub#retrieve-subscriptions"/><feature var="http://jabber.org/protocol/disco#info"/><feature var="jabber:iq:private"/><feature var="http://jabber.org/protocol/rsm"/></query></iq>
09-06 08:12:43.280 14439-14550/org.atalk.android D/SMACK: SENT (0): <iq to='babai@example.ru' id='rLXRF-119' type='get'><query xmlns='http://jabber.org/protocol/disco#info' node='eu.siacs.conversations.axolotl.devicelist'></query></iq>
09-06 08:12:43.763 14439-14551/org.atalk.android D/SMACK: RECV (0): <iq type="result" id="rLXRF-119" from="babai@example.ru" to="test@example.ru/atalk"><query xmlns="http://jabber.org/protocol/disco#info" node="eu.siacs.conversations.axolotl.devicelist"><identity category="pubsub" type="leaf"/><feature var="http://jabber.org/protocol/pubsub"/><feature var="http://jabber.org/protocol/disco#info"/><x xmlns="jabber:x:data" type="result"><field var="FORM_TYPE" type="hidden"><value>http://jabber.org/protocol/pubsub#meta-data</value></field><field var="pubsub#title" type="text-single" label="Краткое имя узла"><value></value></field><field var="pubsub#description" type="text-single" label="Описание узла"><value></value></field><field var="pubsub#node_type" type="text-single" label="Является ли узел листом (по умолчанию) или сборкой"><value>leaf</value></field><field var="pubsub#collection" type="text-single" label="Сборник, с которой связан узел."/><field var="pubsub#subscribe" type="boolean" label="Разрешить подписку на узел"><value>1</value></field><field var="pubsub#subscription_required" type="boolean" label="Новые подписки требуют настройки"><value>0</value></field><field var="pubsub#deliver_payloads" type="boolean" label="Отправлять полезную нагрузку с уведомлениями о событиях"><value>1</value></field><field var="pubsub#notify_config" type="boolean" label="Уведомлять подписчиков при изменении конфигурации узла"><value>1</value></field><field var="pubsub#notify_delete" type="boolean" label="Уведомлять подписчиков при удалении узла"><value>1</value></field><field var="pubsub#notify_retract" type="boolean" label="Уведомлять подписчиков при удалении элементов из узла"><value>1</value></field><field var="pubsub#presence_based_delivery" type="boolean" label="Отправлять уведомления только доступным пользователям"><value>0</value></field><field var="pubsub#type" type="text-single" label="Тип данных полезной нагрузки, которые будут предоставлены на этом узле"><value></value></field><field var="pubsub#body_xslt" type="text-single" label="Тело сообщения XSLT"><value></value></field><field var="pubsub#dataform_xslt" type="text-single" label="Полезная нагрузка XSLT"><value></value></field><field var="pubsub#access_model" type="list-single" label="Укажите, кто может подписываться и получать элементы"><option><value>authorize</value></option><option><value>open</value></option><option><value>presence</value></option><option><value>roster</value></option><option><value>whitelist</value></option><value>presence</value></field><field var="pubsub#publish_model" type="list-single" label="Модель издателя"><option><value>publishers</value></option><option><value>subscribers</value></option><option><value>open</value></option><value>publishers</value></field><field var="pubsub#roster_groups_allowed" type="list-multi" label="Группам списков разрешено подписываться"/><field var="pubsub#contact" type="jid-multi" label="Люди, с которыми можно связаться"/><field var="pubsub#language" type="text-single" label="Язык по умолчанию"><value>English</value></field><field var="pubsub#owner" type="jid-multi" label="Владельцы узлов"><value>babai@example.ru</value></field><field var="pubsub#publisher" type="jid-multi" label="Издатели узлов"/><field var="pubsub#itemreply" type="list-single" label="Выберите объект, который должен получать ответы на элементы"><option><value>owner</value></option><option><value>publisher</valu
09-06 08:12:43.806 14439-14550/org.atalk.android D/SMACK: SENT (0): <iq to='babai@example.ru' id='rLXRF-121' type='get'><pubsub xmlns='http://jabber.org/protocol/pubsub'><items node='eu.siacs.conversations.axolotl.devicelist'/></pubsub></iq><r xmlns='urn:xmpp:sm:3'/>
09-06 08:12:44.172 14439-14551/org.atalk.android D/SMACK: RECV (0): <r xmlns='urn:xmpp:sm:3' />
09-06 08:12:44.180 14439-14550/org.atalk.android D/SMACK: SENT (0): <a xmlns='urn:xmpp:sm:3' h='39'/>
09-06 08:12:44.687 14439-14551/org.atalk.android D/SMACK: RECV (0): <iq type="result" id="rLXRF-121" from="babai@example.ru" to="test@example.ru/atalk"><pubsub xmlns="http://jabber.org/protocol/pubsub"><items node="eu.siacs.conversations.axolotl.devicelist"/></pubsub></iq>
09-06 08:12:44.713 14439-14551/org.atalk.android D/SMACK: RECV (0): <a xmlns='urn:xmpp:sm:3' h='40' />
09-06 08:12:44.719 14439-14551/org.atalk.android D/SMACK: RECV (0): <stream:error xmlns:stream="http://etherx.jabber.org/streams"><undefined-condition xmlns="urn:ietf:params:xml:ns:xmpp-streams"/><text xmlns="urn:ietf:params:xml:ns:xmpp-streams">You acknowledged stanzas that we didn't send. Your Ack h: 39, our last stanza: 21</text></stream:error>
09-06 08:12:44.754 14439-14551/org.atalk.android W/aTalk: [7568] org.jivesoftware.smack.AbstractXMPPConnection.callConnectionClosedOnErrorListener() Connection XMPPTCPConnection[test@example.ru/atalk] (0) closed with error
org.jivesoftware.smack.XMPPException$StreamErrorException: undefined-condition You can read more about the meaning of this stream error at http://xmpp.org/rfcs/rfc6120.html#streams-error-conditions
<stream:error><undefined-condition xmlns='urn:ietf:params:xml:ns:xmpp-streams'/><text>You acknowledged stanzas that we didn't send. Your Ack h: 39, our last stanza: 21</text></stream:error>
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:1057)
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPConnection.java:993)
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:1009)
at java.lang.Thread.run(Thread.java:764)
09-06 08:12:44.781 14439-14439/org.atalk.android I/aTalk: [2] org.jivesoftware.smackx.avatar.AvatarManager.getAvatarImageByJid() Fetching avatar from local storage for: (test@example.ru) => null
09-06 08:12:44.792 14439-14551/org.atalk.android D/SMACK: XMPPConnection closed due to an exception (XMPPTCPConnection[test@example.ru/atalk] (0))
org.jivesoftware.smack.XMPPException$StreamErrorException: undefined-condition You can read more about the meaning of this stream error at http://xmpp.org/rfcs/rfc6120.html#streams-error-conditions
<stream:error><undefined-condition xmlns='urn:ietf:params:xml:ns:xmpp-streams'/><text>You acknowledged stanzas that we didn't send. Your Ack h: 39, our last stanza: 21</text></stream:error>
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:1057)
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPConnection.java:993)
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:1009)
at java.lang.Thread.run(Thread.java:764)
09-06 08:12:44.803 14439-14439/org.atalk.android I/aTalk: [2] org.jivesoftware.smackx.avatar.AvatarManager.getAvatarImageByJid() Fetching avatar from local storage for: (test@example.ru) => null
09-06 08:12:44.817 14439-14439/org.atalk.android I/aTalk: [2] org.jivesoftware.smackx.avatar.AvatarManager.getAvatarImageByJid() Fetching avatar from local storage for: (test@example.ru) => null
09-06 08:12:45.807 14439-14831/org.atalk.android D/SMACK: XMPPConnection (XMPPTCPConnection[test@example.ru/atalk] (0)) will reconnect in 4
09-06 08:12:46.810 14439-14831/org.atalk.android D/SMACK: XMPPConnection (XMPPTCPConnection[test@example.ru/atalk] (0)) will reconnect in 3
09-06 08:12:47.813 14439-14831/org.atalk.android D/SMACK: XMPPConnection (XMPPTCPConnection[test@example.ru/atalk] (0)) will reconnect in 2
09-06 08:12:48.815 14439-14831/org.atalk.android D/SMACK: XMPPConnection (XMPPTCPConnection[test@example.ru/atalk] (0)) will reconnect in 1
09-06 08:12:49.818 14439-14831/org.atalk.android D/SMACK: XMPPConnection (XMPPTCPConnection[test@example.ru/atalk] (0)) will reconnect in 0
09-06 08:13:36.819 14439-14843/org.atalk.android D/SMACK: SENT (0): <stream:stream xmlns='jabber:client' to='example.ru' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' xml:lang='en'>
09-06 08:13:37.216 14439-14844/org.atalk.android D/SMACK: RECV (0): <?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="example.ru" id="88fsbh1um9" xml:lang="en" version="1.0">
================ aTalk log while request for server chatRoom ============
09-06 08:58:09.058 17633-18241/org.atalk.android D/SMACK: RECV (2): <iq type="get" id="726-4762" from="example.ru" to="test@example.ru/atalk"><ping xmlns="urn:xmpp:ping"/></iq>
09-06 08:58:09.071 17633-18240/org.atalk.android D/SMACK: SENT (2): <iq to='example.ru' id='726-4762' type='result'></iq>
09-06 08:58:10.435 17633-18240/org.atalk.android D/SMACK: SENT (2): <iq to='example.ru' id='8EH6x-122' type='get'><query xmlns='http://jabber.org/protocol/disco#info'></query></iq><r xmlns='urn:xmpp:sm:3'/>
09-06 08:58:10.900 17633-18241/org.atalk.android D/SMACK: RECV (2): <iq type="result" id="8EH6x-122" from="example.ru" to="test@example.ru/atalk"><query xmlns="http://jabber.org/protocol/disco#info"><identity category="server" name="Openfire Server" type="im"/><identity category="pubsub" type="pep"/><feature var="http://jabber.org/protocol/pubsub#retrieve-default"/><feature var="http://jabber.org/protocol/pubsub#purge-nodes"/><feature var="vcard-temp"/><feature var="http://jabber.org/protocol/pubsub#subscribe"/><feature var="http://jabber.org/protocol/pubsub#subscription-options"/><feature var="http://jabber.org/protocol/pubsub#create-nodes"/><feature var="http://jabber.org/protocol/pubsub#outcast-affiliation"/><feature var="msgoffline"/><feature var="http://jabber.org/protocol/pubsub#get-pending"/><feature var="http://jabber.org/protocol/pubsub#multi-subscribe"/><feature var="http://jabber.org/protocol/pubsub#presence-notifications"/><feature var="urn:xmpp:ping"/><feature var="jabber:iq:register"/><feature var="http://jabber.org/protocol/pubsub#delete-nodes"/><feature var="http://jabber.org/protocol/pubsub#config-node"/><feature var="http://jabber.org/protocol/pubsub#retrieve-items"/><feature var="http://jabber.org/protocol/pubsub#auto-create"/><feature var="http://jabber.org/protocol/disco#items"/><feature var="http://jabber.org/protocol/pubsub#item-ids"/><feature var="http://jabber.org/protocol/pubsub#meta-data"/><feature var="jabber:iq:roster"/><feature var="http://jabber.org/protocol/pubsub#instant-nodes"/><feature var="http://jabber.org/protocol/pubsub#modify-affiliations"/><feature var="http://jabber.org/protocol/pubsub#persistent-items"/><feature var="http://jabber.org/protocol/pubsub#create-and-configure"/><feature var="http://jabber.org/protocol/pubsub"/><feature var="http://jabber.org/protocol/pubsub#publisher-affiliation"/><feature var="http://jabber.org/protocol/pubsub#access-open"/><feature var="http://jabber.org/protocol/pubsub#retrieve-affiliations"/><feature var="jabber:iq:version"/><feature var="http://jabber.org/protocol/pubsub#retract-items"/><feature var="urn:xmpp:time"/><feature var="http://jabber.org/protocol/pubsub#manage-subscriptions"/><feature var="jabber:iq:privacy"/><feature var="jabber:iq:last"/><feature var="http://jabber.org/protocol/commands"/><feature var="http://jabber.org/protocol/offline"/><feature var="urn:xmpp:carbons:2"/><feature var="http://jabber.org/protocol/address"/><feature var="http://jabber.org/protocol/pubsub#publish"/><feature var="http://jabber.org/protocol/pubsub#collections"/><feature var="http://jabber.org/protocol/pubsub#retrieve-subscriptions"/><feature var="http://jabber.org/protocol/disco#info"/><feature var="jabber:iq:private"/><feature var="http://jabber.org/protocol/rsm"/></query></iq>
09-06 08:58:10.916 17633-18240/org.atalk.android D/SMACK: SENT (2): <iq to='example.ru' id='8EH6x-124' type='get'><query xmlns='http://jabber.org/protocol/disco#items'></query></iq>
09-06 08:58:11.311 17633-18241/org.atalk.android D/SMACK: RECV (2): <a xmlns='urn:xmpp:sm:3' h='30' />
09-06 08:58:11.823 17633-18241/org.atalk.android D/SMACK: RECV (2): <iq type="result" id="8EH6x-124" from="example.ru" to="test@example.ru/atalk"><query xmlns="http://jabber.org/protocol/disco#items"><item jid="conference.example.ru" name="Public Chatrooms"/><item jid="pubsub.example.ru" name="Publish-Subscribe service"/></query></iq>
09-06 08:58:11.834 17633-18241/org.atalk.android D/SMACK: RECV (2): <r xmlns='urn:xmpp:sm:3' />
09-06 08:58:11.850 17633-18240/org.atalk.android D/SMACK: SENT (2): <iq to='conference.example.ru' id='8EH6x-126' type='get'><query xmlns='http://jabber.org/protocol/disco#info'></query></iq><a xmlns='urn:xmpp:sm:3' h='31'/>
09-06 08:58:12.334 17633-18241/org.atalk.android D/SMACK: RECV (2): <iq type="result" id="8EH6x-126" from="conference.example.ru" to="test@example.ru/atalk"><query xmlns="http://jabber.org/protocol/disco#info"><identity category="conference" name="Public Chatrooms" type="text"/><identity category="directory" name="Public Chatroom Search" type="chatroom"/><feature var="http://jabber.org/protocol/muc"/><feature var="http://jabber.org/protocol/disco#info"/><feature var="http://jabber.org/protocol/disco#items"/><feature var="jabber:iq:search"/><feature var="http://jabber.org/protocol/rsm"/></query></iq>
09-06 08:58:12.346 17633-18241/org.atalk.android D/SMACK: RECV (2): <stream:error xmlns:stream="http://etherx.jabber.org/streams"><undefined-condition xmlns="urn:ietf:params:xml:ns:xmpp-streams"/><text xmlns="urn:ietf:params:xml:ns:xmpp-streams">You acknowledged stanzas that we didn't send. Your Ack h: 31, our last stanza: 21</text></stream:error>
09-06 08:58:12.356 17633-18240/org.atalk.android D/SMACK: SENT (2): <iq to='pubsub.example.ru' id='8EH6x-128' type='get'><query xmlns='http://jabber.org/protocol/disco#info'></query></iq>
09-06 08:58:12.369 17633-18241/org.atalk.android W/aTalk: [7648] org.jivesoftware.smack.AbstractXMPPConnection.callConnectionClosedOnErrorListener() Connection XMPPTCPConnection[test@example.ru/atalk] (2) closed with error
org.jivesoftware.smack.XMPPException$StreamErrorException: undefined-condition You can read more about the meaning of this stream error at http://xmpp.org/rfcs/rfc6120.html#streams-error-conditions
<stream:error><undefined-condition xmlns='urn:ietf:params:xml:ns:xmpp-streams'/><text>You acknowledged stanzas that we didn't send. Your Ack h: 31, our last stanza: 21</text></stream:error>
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:1057)
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPConnection.java:993)
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:1009)
at java.lang.Thread.run(Thread.java:764)
09-06 08:58:12.398 17633-18241/org.atalk.android D/SMACK: XMPPConnection closed due to an exception (XMPPTCPConnection[test@example.ru/atalk] (2))
org.jivesoftware.smack.XMPPException$StreamErrorException: undefined-condition You can read more about the meaning of this stream error at http://xmpp.org/rfcs/rfc6120.html#streams-error-conditions
<stream:error><undefined-condition xmlns='urn:ietf:params:xml:ns:xmpp-streams'/><text>You acknowledged stanzas that we didn't send. Your Ack h: 31, our last stanza: 21</text></stream:error>
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:1057)
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPConnection.java:993)
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:1009)
at java.lang.Thread.run(Thread.java:764)
09-06 08:58:13.403 17633-18299/org.atalk.android D/SMACK: XMPPConnection (XMPPTCPConnection[test@example.ru/atalk] (2)) will reconnect in 4
09-06 08:58:14.405 17633-18299/org.atalk.android D/SMACK: XMPPConnection (XMPPTCPConnection[test@example.ru/atalk] (2)) will reconnect in 3
09-06 08:58:15.408 17633-18299/org.atalk.android D/SMACK: XMPPConnection (XMPPTCPConnection[test@example.ru/atalk] (2)) will reconnect in 2
09-06 08:58:16.410 17633-18299/org.atalk.android D/SMACK: XMPPConnection (XMPPTCPConnection[test@example.ru/atalk] (2)) will reconnect in 1
09-06 08:58:17.413 17633-18299/org.atalk.android D/SMACK: XMPPConnection (XMPPTCPConnection[test@example.ru/atalk] (2)) will reconnect in 0
09-06 08:58:19.928 17633-18305/org.atalk.android D/SMACK: SENT (2): <stream:stream xmlns='jabber:client' to='example.ru' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' xml:lang='en'>