diff --git a/README.md b/README.md
index ba73e7c..5a7253b 100644
--- a/README.md
+++ b/README.md
@@ -321,6 +321,7 @@ and its nice display in [Erlang/Elixir XMPP at xmpp.org](https://xmpp.org/softwa
- [XEP-0363](https://xmpp.org/extensions/xep-0363.html): HTTP File Upload
- [XEP-0369](https://xmpp.org/extensions/xep-0369.html): Mediated Information eXchange (MIX)
- [XEP-0377](https://xmpp.org/extensions/xep-0377.html): Spam Reporting
+- [XEP-0379](https://xmpp.org/extensions/xep-0379.html): Pre-Authenticated Roster Subscription
- [XEP-0386](https://xmpp.org/extensions/xep-0386.html): Bind 2
- [XEP-0388](https://xmpp.org/extensions/xep-0388.html): Extensible SASL Profile
- [XEP-0402](https://xmpp.org/extensions/xep-0402.html): PEP Native Bookmarks
@@ -333,6 +334,7 @@ and its nice display in [Erlang/Elixir XMPP at xmpp.org](https://xmpp.org/softwa
- [XEP-0425](https://xmpp.org/extensions/xep-0425.html): Message Moderation
- [XEP-0430](https://xmpp.org/extensions/xep-0430.html): Inbox
- [XEP-0440](https://xmpp.org/extensions/xep-0440.html): SASL Channel-Binding Type Capability
+- [XEP-0445](https://xmpp.org/extensions/xep-0445.html): Pre-Authenticated In-Band Registration
- [XEP-0474](https://xmpp.org/extensions/xep-0474.html): SASL SCRAM Downgrade Protection
- [draft-cridland-xmpp-session-01](https://tools.ietf.org/html/draft-cridland-xmpp-session-01): XMPP Session Establishment
diff --git a/include/ns.hrl b/include/ns.hrl
index f08d9e6..2c2942c 100644
--- a/include/ns.hrl
+++ b/include/ns.hrl
@@ -222,3 +222,6 @@
-define(NS_MESSAGE_MODERATE_1, <<"urn:xmpp:message-moderate:1">>).
-define(NS_MESSAGE_RETRACT, <<"urn:xmpp:message-retract:1">>).
-define(NS_OCCUPANT_ID, <<"urn:xmpp:occupant-id:0">>).
+-define(NS_PREAUTHENTICATED_ROSTER_SUBSCRIPTION, <<"urn:xmpp:pars:0">>).
+-define(NS_FEATURE_IBR_TOKEN, <<"urn:xmpp:ibr-token:0">>).
+-define(NS_FEATURE_SUB_PRE_APPROVAL, <<"urn:xmpp:features:pre-approval">>).
diff --git a/include/xmpp_codec.hrl b/include/xmpp_codec.hrl
index f87c3cb..3921e4e 100644
--- a/include/xmpp_codec.hrl
+++ b/include/xmpp_codec.hrl
@@ -190,15 +190,9 @@
cdata = <<>> :: binary()}).
-type scram_upgrade_salt() :: #scram_upgrade_salt{}.
--record(receipt_request, {}).
--type receipt_request() :: #receipt_request{}.
-
-record(legacy_auth_feature, {}).
-type legacy_auth_feature() :: #legacy_auth_feature{}.
--record(rosterver_feature, {}).
--type rosterver_feature() :: #rosterver_feature{}.
-
-record(mix_roster_channel, {participant_id = <<>> :: binary()}).
-type mix_roster_channel() :: #mix_roster_channel{}.
@@ -341,6 +335,9 @@
-record(private, {sub_els = [] :: [xmpp_element() | fxml:xmlel()]}).
-type private() :: #private{}.
+-record(preauth, {token = <<>> :: binary()}).
+-type preauth() :: #preauth{}.
+
-record(scram_upgrade_hash, {data = <<>> :: binary()}).
-type scram_upgrade_hash() :: #scram_upgrade_hash{}.
@@ -389,6 +386,9 @@
id = <<>> :: binary()}).
-type inbox_entry() :: #inbox_entry{}.
+-record(feature_register_ibr_token, {}).
+-type feature_register_ibr_token() :: #feature_register_ibr_token{}.
+
-record(x509_challenge_failed, {}).
-type x509_challenge_failed() :: #x509_challenge_failed{}.
@@ -644,6 +644,9 @@
items = [] :: [#ps_item{}]}).
-type ps_publish() :: #ps_publish{}.
+-record(feature_pre_approval, {}).
+-type feature_pre_approval() :: #feature_pre_approval{}.
+
-record(report, {reason :: 'abuse' | 'spam',
text = [] :: [#text{}]}).
-type report() :: #report{}.
@@ -860,11 +863,6 @@
resource :: 'undefined' | binary()}).
-type legacy_auth() :: #legacy_auth{}.
--record(privacy_query, {lists = [] :: [#privacy_list{}],
- default :: 'none' | 'undefined' | binary(),
- active :: 'none' | 'undefined' | binary()}).
--type privacy_query() :: #privacy_query{}.
-
-record(pubsub_serverinfo_remote_domain, {name = <<>> :: binary(),
type = [] :: ['bidi' | 'incoming' | 'outgoing']}).
-type pubsub_serverinfo_remote_domain() :: #pubsub_serverinfo_remote_domain{}.
@@ -927,14 +925,6 @@
-record(credentials, {services = [] :: [#service{}]}).
-type credentials() :: #credentials{}.
--record(vcard_email, {home = false :: boolean(),
- work = false :: boolean(),
- internet = false :: boolean(),
- pref = false :: boolean(),
- x400 = false :: boolean(),
- userid :: 'undefined' | binary()}).
--type vcard_email() :: #vcard_email{}.
-
-record(block_item, {jid :: jid:jid(),
spam_report :: 'undefined' | #report{}}).
-type block_item() :: #block_item{}.
@@ -1255,38 +1245,6 @@
suffix :: 'undefined' | binary()}).
-type vcard_name() :: #vcard_name{}.
--record(vcard_temp, {version :: 'undefined' | binary(),
- fn :: 'undefined' | binary(),
- n :: 'undefined' | #vcard_name{},
- nickname :: 'undefined' | binary(),
- photo :: 'undefined' | #vcard_photo{},
- bday :: 'undefined' | binary(),
- adr = [] :: [#vcard_adr{}],
- label = [] :: [#vcard_label{}],
- tel = [] :: [#vcard_tel{}],
- email = [] :: [#vcard_email{}],
- jabberid :: 'undefined' | binary(),
- mailer :: 'undefined' | binary(),
- tz :: 'undefined' | binary(),
- geo :: 'undefined' | #vcard_geo{},
- title :: 'undefined' | binary(),
- role :: 'undefined' | binary(),
- logo :: 'undefined' | #vcard_logo{},
- org :: 'undefined' | #vcard_org{},
- categories = [] :: [binary()],
- note :: 'undefined' | binary(),
- prodid :: 'undefined' | binary(),
- rev :: 'undefined' | binary(),
- sort_string :: 'undefined' | binary(),
- sound :: 'undefined' | #vcard_sound{},
- uid :: 'undefined' | binary(),
- url :: 'undefined' | binary(),
- class :: 'confidential' | 'private' | 'public' | 'undefined',
- key :: 'undefined' | #vcard_key{},
- desc :: 'undefined' | binary(),
- sub_els = [] :: [xmpp_element() | fxml:xmlel()]}).
--type vcard_temp() :: #vcard_temp{}.
-
-record(ibb_data, {sid = <<>> :: binary(),
seq :: non_neg_integer(),
data = <<>> :: binary()}).
@@ -1338,28 +1296,6 @@
text = [] :: [#text{}]}).
-type sasl_failure() :: #sasl_failure{}.
--record(bind, {jid :: undefined | jid:jid(),
- resource = <<>> :: binary()}).
--type bind() :: #bind{}.
-
--record(jingle_ft_file, {date :: undefined | erlang:timestamp(),
- desc = [] :: [#text{}],
- hash = [] :: [#hash{}],
- 'hash-used' :: 'undefined' | #hash_used{},
- 'media-type' :: 'undefined' | binary(),
- name :: 'undefined' | binary(),
- size :: 'undefined' | non_neg_integer(),
- range :: 'undefined' | #jingle_ft_range{}}).
--type jingle_ft_file() :: #jingle_ft_file{}.
-
--record(jingle_ft_checksum, {creator :: 'initiator' | 'responder' | 'undefined',
- name = <<>> :: binary(),
- file :: #jingle_ft_file{}}).
--type jingle_ft_checksum() :: #jingle_ft_checksum{}.
-
--record(jingle_ft_description, {file :: 'undefined' | #jingle_ft_file{}}).
--type jingle_ft_description() :: #jingle_ft_description{}.
-
-record(pubsub, {subscriptions :: 'undefined' | {binary(),[#ps_subscription{}]},
subscription :: 'undefined' | #ps_subscription{},
affiliations :: 'undefined' | {binary(),[#ps_affiliation{}]},
@@ -1400,6 +1336,88 @@
sub_els = [] :: [xmpp_element() | fxml:xmlel()]}).
-type jingle() :: #jingle{}.
+-record(muc_subscription, {jid :: undefined | jid:jid(),
+ nick = <<>> :: binary(),
+ events = [] :: [binary()]}).
+-type muc_subscription() :: #muc_subscription{}.
+
+-record(muc_subscriptions, {list = [] :: [#muc_subscription{}]}).
+-type muc_subscriptions() :: #muc_subscriptions{}.
+
+-record(pubsub_owner, {affiliations :: 'undefined' | {binary(),[#ps_affiliation{}]},
+ configure :: 'undefined' | {binary(),'undefined' | #xdata{}},
+ default :: 'undefined' | {binary(),'undefined' | #xdata{}},
+ delete :: 'undefined' | {binary(),binary()},
+ purge :: 'undefined' | binary(),
+ subscriptions :: 'undefined' | {binary(),[#ps_subscription{}]}}).
+-type pubsub_owner() :: #pubsub_owner{}.
+
+-record(receipt_request, {}).
+-type receipt_request() :: #receipt_request{}.
+
+-record(vcard_email, {home = false :: boolean(),
+ work = false :: boolean(),
+ internet = false :: boolean(),
+ pref = false :: boolean(),
+ x400 = false :: boolean(),
+ userid :: 'undefined' | binary()}).
+-type vcard_email() :: #vcard_email{}.
+
+-record(vcard_temp, {version :: 'undefined' | binary(),
+ fn :: 'undefined' | binary(),
+ n :: 'undefined' | #vcard_name{},
+ nickname :: 'undefined' | binary(),
+ photo :: 'undefined' | #vcard_photo{},
+ bday :: 'undefined' | binary(),
+ adr = [] :: [#vcard_adr{}],
+ label = [] :: [#vcard_label{}],
+ tel = [] :: [#vcard_tel{}],
+ email = [] :: [#vcard_email{}],
+ jabberid :: 'undefined' | binary(),
+ mailer :: 'undefined' | binary(),
+ tz :: 'undefined' | binary(),
+ geo :: 'undefined' | #vcard_geo{},
+ title :: 'undefined' | binary(),
+ role :: 'undefined' | binary(),
+ logo :: 'undefined' | #vcard_logo{},
+ org :: 'undefined' | #vcard_org{},
+ categories = [] :: [binary()],
+ note :: 'undefined' | binary(),
+ prodid :: 'undefined' | binary(),
+ rev :: 'undefined' | binary(),
+ sort_string :: 'undefined' | binary(),
+ sound :: 'undefined' | #vcard_sound{},
+ uid :: 'undefined' | binary(),
+ url :: 'undefined' | binary(),
+ class :: 'confidential' | 'private' | 'public' | 'undefined',
+ key :: 'undefined' | #vcard_key{},
+ desc :: 'undefined' | binary(),
+ sub_els = [] :: [xmpp_element() | fxml:xmlel()]}).
+-type vcard_temp() :: #vcard_temp{}.
+
+-record(privacy_query, {lists = [] :: [#privacy_list{}],
+ default :: 'none' | 'undefined' | binary(),
+ active :: 'none' | 'undefined' | binary()}).
+-type privacy_query() :: #privacy_query{}.
+
+-record(jingle_ft_file, {date :: undefined | erlang:timestamp(),
+ desc = [] :: [#text{}],
+ hash = [] :: [#hash{}],
+ 'hash-used' :: 'undefined' | #hash_used{},
+ 'media-type' :: 'undefined' | binary(),
+ name :: 'undefined' | binary(),
+ size :: 'undefined' | non_neg_integer(),
+ range :: 'undefined' | #jingle_ft_range{}}).
+-type jingle_ft_file() :: #jingle_ft_file{}.
+
+-record(jingle_ft_checksum, {creator :: 'initiator' | 'responder' | 'undefined',
+ name = <<>> :: binary(),
+ file :: #jingle_ft_file{}}).
+-type jingle_ft_checksum() :: #jingle_ft_checksum{}.
+
+-record(jingle_ft_description, {file :: 'undefined' | #jingle_ft_file{}}).
+-type jingle_ft_description() :: #jingle_ft_description{}.
+
-record(register, {registered = false :: boolean(),
remove = false :: boolean(),
instructions :: 'undefined' | binary(),
@@ -1424,21 +1442,12 @@
sub_els = [] :: [xmpp_element() | fxml:xmlel()]}).
-type register() :: #register{}.
--record(muc_subscription, {jid :: undefined | jid:jid(),
- nick = <<>> :: binary(),
- events = [] :: [binary()]}).
--type muc_subscription() :: #muc_subscription{}.
-
--record(muc_subscriptions, {list = [] :: [#muc_subscription{}]}).
--type muc_subscriptions() :: #muc_subscriptions{}.
+-record(bind, {jid :: undefined | jid:jid(),
+ resource = <<>> :: binary()}).
+-type bind() :: #bind{}.
--record(pubsub_owner, {affiliations :: 'undefined' | {binary(),[#ps_affiliation{}]},
- configure :: 'undefined' | {binary(),'undefined' | #xdata{}},
- default :: 'undefined' | {binary(),'undefined' | #xdata{}},
- delete :: 'undefined' | {binary(),binary()},
- purge :: 'undefined' | binary(),
- subscriptions :: 'undefined' | {binary(),[#ps_subscription{}]}}).
--type pubsub_owner() :: #pubsub_owner{}.
+-record(rosterver_feature, {}).
+-type rosterver_feature() :: #rosterver_feature{}.
-type xmpp_element() :: address() |
addresses() |
@@ -1491,7 +1500,9 @@
fasten_apply_to() |
fasten_external() |
feature_csi() |
+ feature_pre_approval() |
feature_register() |
+ feature_register_ibr_token() |
feature_sm() |
forwarded() |
gone() |
@@ -1583,6 +1594,7 @@
origin_id() |
pep_bookmarks_conference() |
ping() |
+ preauth() |
presence() |
privacy_item() |
privacy_list() |
diff --git a/specs/xmpp_codec.spec b/specs/xmpp_codec.spec
index 1940b54..6f9f352 100644
--- a/specs/xmpp_codec.spec
+++ b/specs/xmpp_codec.spec
@@ -105,6 +105,12 @@
module = rfc6121,
result = {rosterver_feature}}).
+-xml(feature_pre_approval,
+ #elem{name = <<"sub">>,
+ xmlns = <<"urn:xmpp:features:pre-approval">>,
+ module = 'rfc6121',
+ result = {feature_pre_approval}}).
+
-xml(privacy_message,
#elem{name = <<"message">>,
xmlns = <<"jabber:iq:privacy">>,
@@ -5743,6 +5749,20 @@
enc = {enc_enum, []},
dec = {dec_enum, [[incoming, outgoing, bidi]]}}]}).
+-xml(preauth,
+ #elem{name = <<"preauth">>,
+ xmlns = <<"urn:xmpp:pars:0">>,
+ module = 'xep0379',
+ attrs = [#attr{name = <<"token">>,
+ label = '$token'}],
+ result = {preauth, '$token'}}).
+
+-xml(feature_register_ibr_token,
+ #elem{name = <<"register">>,
+ xmlns = <<"urn:xmpp:ibr-token:0">>,
+ module = 'xep0445',
+ result = {feature_register_ibr_token}}).
+
-spec dec_tzo(_) -> {integer(), integer()}.
dec_tzo(Val) ->
[H1, M1] = binary:split(Val, <<":">>),
diff --git a/src/rfc6121.erl b/src/rfc6121.erl
index a1705e9..8fc2372 100644
--- a/src/rfc6121.erl
+++ b/src/rfc6121.erl
@@ -5,6 +5,11 @@
-compile(export_all).
+do_decode(<<"sub">>,
+ <<"urn:xmpp:features:pre-approval">>, El, Opts) ->
+ decode_feature_pre_approval(<<"urn:xmpp:features:pre-approval">>,
+ Opts,
+ El);
do_decode(<<"ver">>, <<"urn:xmpp:features:rosterver">>,
El, Opts) ->
decode_rosterver_feature(<<"urn:xmpp:features:rosterver">>,
@@ -25,7 +30,8 @@ do_decode(Name, XMLNS, _, _) ->
erlang:error({xmpp_codec, {unknown_tag, Name, XMLNS}}).
tags() ->
- [{<<"ver">>, <<"urn:xmpp:features:rosterver">>},
+ [{<<"sub">>, <<"urn:xmpp:features:pre-approval">>},
+ {<<"ver">>, <<"urn:xmpp:features:rosterver">>},
{<<"query">>, <<"jabber:iq:roster">>},
{<<"item">>, <<"jabber:iq:roster">>},
{<<"group">>, <<"jabber:iq:roster">>}].
@@ -36,13 +42,18 @@ do_encode({roster_item, _, _, _, _, _, _} = Item,
do_encode({roster_query, _, _, _} = Query, TopXMLNS) ->
encode_roster_query(Query, TopXMLNS);
do_encode({rosterver_feature} = Ver, TopXMLNS) ->
- encode_rosterver_feature(Ver, TopXMLNS).
+ encode_rosterver_feature(Ver, TopXMLNS);
+do_encode({feature_pre_approval} = Sub, TopXMLNS) ->
+ encode_feature_pre_approval(Sub, TopXMLNS).
+do_get_name({feature_pre_approval}) -> <<"sub">>;
do_get_name({roster_item, _, _, _, _, _, _}) ->
<<"item">>;
do_get_name({roster_query, _, _, _}) -> <<"query">>;
do_get_name({rosterver_feature}) -> <<"ver">>.
+do_get_ns({feature_pre_approval}) ->
+ <<"urn:xmpp:features:pre-approval">>;
do_get_ns({roster_item, _, _, _, _, _, _}) ->
<<"jabber:iq:roster">>;
do_get_ns({roster_query, _, _, _}) ->
@@ -54,12 +65,14 @@ pp(roster_item, 6) ->
[jid, name, groups, subscription, ask, mix_channel];
pp(roster_query, 3) -> [items, ver, mix_annotate];
pp(rosterver_feature, 0) -> [];
+pp(feature_pre_approval, 0) -> [];
pp(_, _) -> no.
records() ->
[{roster_item, 6},
{roster_query, 3},
- {rosterver_feature, 0}].
+ {rosterver_feature, 0},
+ {feature_pre_approval, 0}].
dec_enum(Val, Enums) ->
AtomVal = erlang:binary_to_existing_atom(Val, utf8),
@@ -69,6 +82,21 @@ dec_enum(Val, Enums) ->
enc_enum(Atom) -> erlang:atom_to_binary(Atom, utf8).
+decode_feature_pre_approval(__TopXMLNS, __Opts,
+ {xmlel, <<"sub">>, _attrs, _els}) ->
+ {feature_pre_approval}.
+
+encode_feature_pre_approval({feature_pre_approval},
+ __TopXMLNS) ->
+ __NewTopXMLNS =
+ xmpp_codec:choose_top_xmlns(<<"urn:xmpp:features:pre-approval">>,
+ [],
+ __TopXMLNS),
+ _els = [],
+ _attrs = xmpp_codec:enc_xmlns_attrs(__NewTopXMLNS,
+ __TopXMLNS),
+ {xmlel, <<"sub">>, _attrs, _els}.
+
decode_rosterver_feature(__TopXMLNS, __Opts,
{xmlel, <<"ver">>, _attrs, _els}) ->
{rosterver_feature}.
diff --git a/src/xmpp_codec.erl b/src/xmpp_codec.erl
index f4feb18..fff1037 100644
--- a/src/xmpp_codec.erl
+++ b/src/xmpp_codec.erl
@@ -676,6 +676,9 @@ get_mod(<<"decline">>, <<"urn:xmpp:jingle:1">>) ->
get_mod(<<"connection">>,
<<"urn:xmpp:serverinfo:0">>) ->
xep0485;
+get_mod(<<"sub">>,
+ <<"urn:xmpp:features:pre-approval">>) ->
+ rfc6121;
get_mod(<<"key">>, <<"jabber:iq:register">>) -> xep0077;
get_mod(<<"unsupported">>,
<<"http://jabber.org/protocol/pubsub#errors">>) ->
@@ -692,6 +695,8 @@ get_mod(<<"query">>, <<"jabber:iq:register">>) ->
xep0077;
get_mod(<<"CLASS">>, <<"vcard-temp">>) -> xep0054;
get_mod(<<"result">>, <<"urn:xmpp:mam:2">>) -> xep0313;
+get_mod(<<"register">>, <<"urn:xmpp:ibr-token:0">>) ->
+ xep0445;
get_mod(<<"purge">>,
<<"http://jabber.org/protocol/pubsub#event">>) ->
xep0060;
@@ -852,6 +857,8 @@ get_mod(<<"connectivity-error">>,
get_mod(<<"retracted">>,
<<"urn:xmpp:message-retract:1">>) ->
xep0424;
+get_mod(<<"preauth">>, <<"urn:xmpp:pars:0">>) ->
+ xep0379;
get_mod(<<"stream:features">>, <<"jabber:server">>) ->
rfc6120;
get_mod(<<"request">>,
@@ -1813,6 +1820,7 @@ get_mod({disco_items, _, _, _}) -> xep0030;
get_mod({vcard_xupdate, _}) -> xep0153;
get_mod({sasl2_challenge, _}) -> xep0388;
get_mod({bind2_feature, _}) -> xep0386;
+get_mod({feature_register_ibr_token}) -> xep0445;
get_mod({block_item, _, _}) -> xep0191;
get_mod({message, _, _, _, _, _, _, _, _, _, _}) ->
rfc6120;
@@ -1917,18 +1925,15 @@ get_mod({fasten_apply_to, _, _, _}) -> xep0422;
get_mod({mix_destroy, _, _}) -> xep0369;
get_mod({media_uri, _, _}) -> xep0221;
get_mod({jingle_error, _}) -> xep0166;
+get_mod({feature_pre_approval}) -> rfc6121;
get_mod({sasl_success, _}) -> rfc6120;
get_mod({compress, _}) -> xep0138;
get_mod({xdata_field, _, _, _, _, _, _, _, _}) ->
xep0004;
-get_mod({muc_subscriptions, _}) -> p1_mucsub;
-get_mod({mix, _, _, _, _}) -> xep0369;
-get_mod({addresses, _}) -> xep0033;
get_mod({adhoc_command, _, _, _, _, _, _, _, _}) ->
xep0050;
get_mod({media, _, _, _}) -> xep0221;
get_mod({oob_x, _, _, _, _}) -> xep0066;
-get_mod({ibb_data, _, _, _}) -> xep0047;
get_mod({identity, _, _, _, _}) -> xep0030;
get_mod({redirect, _}) -> rfc6120;
get_mod({muc_history, _, _, _, _}) -> xep0045;
@@ -2093,6 +2098,7 @@ get_mod({message_moderate, _, _, _}) -> xep0425;
get_mod({sasl_channel_binding, _}) -> xep0440;
get_mod({db_result, _, _, _, _, _}) -> xep0220;
get_mod({scram_upgrade_hash, _}) -> xep0480;
+get_mod({preauth, _}) -> xep0379;
get_mod({bookmark_conference, _, _, _, _, _}) ->
xep0048;
get_mod({vcard_name, _, _, _, _, _}) -> xep0054;
@@ -2165,4 +2171,8 @@ get_mod({upload_slot_0, _, _, _}) -> xep0363;
get_mod({delegation_query, _, _}) -> xep0355;
get_mod({jingle_s5b_candidate, _, _, _, _, _, _}) ->
xep0260;
+get_mod({muc_subscriptions, _}) -> p1_mucsub;
+get_mod({mix, _, _, _, _}) -> xep0369;
+get_mod({addresses, _}) -> xep0033;
+get_mod({ibb_data, _, _, _}) -> xep0047;
get_mod(Record) -> xmpp_codec_external:lookup(Record).
diff --git a/xmpp.doap b/xmpp.doap
index fe8f904..2c05207 100644
--- a/xmpp.doap
+++ b/xmpp.doap
@@ -638,6 +638,15 @@
+
+
+
+ 0.3.3
+ 1.11.3
+
+
+
+
@@ -746,6 +755,15 @@
+
+
+
+ 0.2.0
+ 1.11.3
+
+
+
+