Re: [PATCH] SMSC cluster

Alexander Malysh <[email protected]> Fri, 28 Jun 2019 09:42:54 +0200
Newsgroups gmane.comp.mobile.kannel.devel
Message-ID <[email protected]>
--Apple-Mail=_9CB41686-4CC4-40F7-9132-2A6A4864A7FD
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8

Hi,

I=E2=80=99m agree with Alejandro. For SMPP we don=E2=80=99t need such =
patch but for the CIMD2 we have to fix it to conn->id if it=E2=80=99s =
not used
there.

Thanks,
Alex


> Am 26.06.2019 um 15:13 schrieb Alejandro Guerrieri =
<[email protected]>:
>=20
> Franck,
>=20
> Thank you for clarifying.
>=20
> Regarding SMPP, you are using your application to indirectly diagnose =
problem with your binds. Kannel has a status endpoint that you can use =
to monitor the bind status directly instead of "bubbling-up" the problem =
to your application layer.
>=20
> You have a point on CIMD2, though iMHO that is a "bug" in Kannel: all =
connectors should use the same naming strategy. I don't know how likely =
is the scenario of having multi-protocol binds sharing SMS traffic, but =
in Kannel's current state it is the only case where this patch would =
make a difference. In my opinion, the right answer is to make the naming =
convention consistent so DLR's can be resolved across different =
protocols.
>=20
> Regards,
>=20
> Alejandro
>=20
> On Wed, Jun 26, 2019 at 4:11 AM Lamasuta, Franck, Vodafone Automotive =
<[email protected] <mailto:[email protected]>> =
wrote:
> Hi Alejandro,
>=20
> =20
>=20
> I know we could use identical smsc-ids but=E2=80=A6
>=20
> =20
>=20
> 1) It does not work for CIMD2 because dlr_add() and dlr_find() are =
called with conn->name which is built with the IP and port.
>=20
> =20
>=20
> 2) It could work with SMPP (because dlr_add() and dlr_find() are =
called with conn->id) but=E2=80=A6
> When a MO-SMS is received, the smsc-id is assigned to the message and =
forwarded to our back-end by smsbox.
> We use this id to monitor the incoming traffic on each bind and detect =
issues (e.g. when the MO-SMS rate is below a threshold).
>=20
> With identical smsc-ids, we could have an issue on one of the binds =
(with the bind still up) and not be able to detect it. Therefore we do =
prefer to have different smsc-ids.
>=20
>=20
> The patch only uses smsc-username which is (AFAIK) always the same =
with multiple binds.
>=20
> It is more flexible in my opinion.
>=20
> =20
>=20
> Regards,
>=20
> Franck
>=20
> =20
>=20
> =20
>=20
> From: Alejandro Guerrieri <[email protected] =
<mailto:[email protected]>>=20
> Sent: mercredi 26 juin 2019 00:27
> To: Lamasuta, Franck, Vodafone Automotive =
<[email protected] <mailto:[email protected]>>
> Cc: [email protected] <mailto:[email protected]>
> Subject: Re: [PATCH] SMSC cluster
>=20
> =20
>=20
> I'm curious why do you even need this patch? You could use the same =
smsc-id on both and assign different smsc-admin-id values to manage each =
bind separately (e.g. start/stop). If by any reason you'd want to send =
over a specific bind, you could use different allowed-smsc-id's as well.
>=20
> =20
>=20
> Regards,
>=20
> =20
>=20
> Alejandro
>=20
> =20
>=20
> On Tue, Jun 25, 2019 at 12:20 PM Lamasuta, Franck, Vodafone Automotive =
<[email protected] <mailto:[email protected]>> =
wrote:
>=20
> Hi list,
>=20
> =20
>=20
> We have implemented many patches along the way and I can finally take =
some time to submit them.
> They are running on our staging and production platforms since years =
for the oldest ones.
>=20
> I will submit them one by one in the next days/weeks.
>=20
> Let=E2=80=99s start with the first one=E2=80=A6   J
>=20
> =20
>=20
> This patch allows Kannel to retrieve a pending DLRs in its database =
when 2 (or more) SMSC binds are established (with different IPs and/or =
ports).
>=20
> It is required when a MT-SMS is submitted to SMSC A and its DLR is =
sent back by SMSC B.
>=20
> Done for CIMD2 and SMPP.
>=20
> =20
>=20
> Example of configuration where the patch is required:
>=20
> =20
>=20
> #
>=20
> # Primary server
>=20
> #
>=20
> group =3D smsc
>=20
> smsc =3D cimd2
>=20
> smsc-id =3D SMSC-A
>=20
> host =3D 123.1.2.3
>=20
> port =3D 6001
>=20
> smsc-username =3D user
>=20
> smsc-password =3D xxxxxxxx
>=20
> allowed-smsc-id =3D id1
>=20
> preferred-smsc-id =3D id1
>=20
> =20
>=20
> #
>=20
> # Secondary server
>=20
> #
>=20
> group =3D smsc
>=20
> smsc =3D cimd2
>=20
> smsc-id =3D SMSC-B
>=20
> host =3D 123.1.2.3
>=20
> port =3D 6002
>=20
> smsc-username =3D user
>=20
> smsc-password =3D xxxxxxxx
>=20
> allowed-smsc-id =3D id1
>=20
> =20
>=20
> =20
>=20
> Regards,
>=20
> Franck
>=20


--Apple-Mail=_9CB41686-4CC4-40F7-9132-2A6A4864A7FD
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
	charset=utf-8

<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; =
charset=3Dutf-8"></head><body style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; line-break: after-white-space;" =
class=3D"">Hi,<div class=3D""><br class=3D""></div><div class=3D"">I=E2=80=
=99m agree with Alejandro. For SMPP we don=E2=80=99t need such patch but =
for the CIMD2 we have to fix it to conn-&gt;id if it=E2=80=99s not =
used</div><div class=3D"">there.</div><div class=3D""><br =
class=3D""></div><div class=3D"">Thanks,</div><div =
class=3D"">Alex</div><div class=3D""><br class=3D""></div><div =
class=3D""><div><br class=3D""><blockquote type=3D"cite" class=3D""><div =
class=3D"">Am 26.06.2019 um 15:13 schrieb Alejandro Guerrieri &lt;<a =
href=3D"mailto:[email protected]" =
class=3D"">[email protected]</a>&gt;:</div><br =
class=3D"Apple-interchange-newline"><div class=3D""><div dir=3D"ltr" =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: =
normal; letter-spacing: normal; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none;" =
class=3D"">Franck,<div class=3D""><br class=3D""></div><div =
class=3D"">Thank you for clarifying.</div><div class=3D""><br =
class=3D""></div><div class=3D"">Regarding SMPP, you are using your =
application to indirectly diagnose problem with your binds. Kannel has a =
status endpoint that you can use to monitor the bind status directly =
instead of "bubbling-up" the problem to your application =
layer.</div><div class=3D""><div class=3D""><br =
class=3D"gmail-Apple-interchange-newline">You have a point on CIMD2, =
though iMHO that is a "bug" in Kannel: all connectors should use the =
same naming strategy. I don't know how likely is the scenario of having =
multi-protocol binds sharing SMS traffic, but in Kannel's current state =
it is the only case where this patch would make a difference. In my =
opinion, the right answer is to make the naming convention consistent so =
DLR's can be resolved across different protocols.</div><div class=3D""><br=
 class=3D""></div></div><div class=3D"">Regards,</div><div class=3D""><br =
class=3D""></div><div class=3D"">Alejandro</div></div><br =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: =
normal; letter-spacing: normal; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none;" class=3D""><div =
class=3D"gmail_quote" style=3D"caret-color: rgb(0, 0, 0); font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant-caps: =
normal; font-weight: normal; letter-spacing: normal; text-align: start; =
text-indent: 0px; text-transform: none; white-space: normal; =
word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: =
none;"><div dir=3D"ltr" class=3D"gmail_attr">On Wed, Jun 26, 2019 at =
4:11 AM Lamasuta, Franck, Vodafone Automotive &lt;<a =
href=3D"mailto:[email protected]" =
class=3D"">[email protected]</a>&gt; wrote:<br =
class=3D""></div><blockquote class=3D"gmail_quote" style=3D"margin: 0px =
0px 0px 0.8ex; border-left-width: 1px; border-left-style: solid; =
border-left-color: rgb(204, 204, 204); padding-left: 1ex;"><div =
lang=3D"EN-US" class=3D""><div =
class=3D"gmail-m_-4211829121702154947WordSection1"><p =
class=3D"MsoNormal"><span style=3D"font-size: 11pt; font-family: =
Calibri, sans-serif; color: rgb(31, 73, 125);" class=3D"">Hi =
Alejandro,<u class=3D""></u><u class=3D""></u></span></p><p =
class=3D"MsoNormal"><span style=3D"font-size: 11pt; font-family: =
Calibri, sans-serif; color: rgb(31, 73, 125);" class=3D""><u =
class=3D""></u>&nbsp;<u class=3D""></u></span></p><p =
class=3D"MsoNormal"><span style=3D"font-size: 11pt; font-family: =
Calibri, sans-serif; color: rgb(31, 73, 125);" class=3D"">I know we =
could use identical smsc-ids but=E2=80=A6<u class=3D""></u><u =
class=3D""></u></span></p><p class=3D"MsoNormal"><span style=3D"font-size:=
 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" =
class=3D""><u class=3D""></u>&nbsp;<u class=3D""></u></span></p><p =
class=3D"MsoNormal"><span style=3D"font-size: 11pt; font-family: =
Calibri, sans-serif; color: rgb(31, 73, 125);" class=3D"">1) It does not =
work for CIMD2 because dlr_add() and dlr_find() are called with =
conn-&gt;name which is built with the IP and port.<u class=3D""></u><u =
class=3D""></u></span></p><p class=3D"MsoNormal"><span style=3D"font-size:=
 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" =
class=3D""><u class=3D""></u>&nbsp;<u class=3D""></u></span></p><p =
class=3D"MsoNormal"><span style=3D"font-size: 11pt; font-family: =
Calibri, sans-serif; color: rgb(31, 73, 125);" class=3D"">2) It could =
work with SMPP (because dlr_add() and dlr_find() are called with =
conn-&gt;id) but=E2=80=A6<br class=3D"">When a MO-SMS is received, the =
smsc-id is assigned to the message and forwarded to our back-end by =
smsbox.<br class=3D"">We use this id to monitor the incoming traffic on =
each bind and detect issues (e.g. when the MO-SMS rate is below a =
threshold).<u class=3D""></u><u class=3D""></u></span></p><p =
class=3D"MsoNormal"><span style=3D"font-size: 11pt; font-family: =
Calibri, sans-serif; color: rgb(31, 73, 125);" class=3D"">With identical =
smsc-ids, we could have an issue on one of the binds (with the bind =
still up) and not be able to detect it. Therefore we do prefer to have =
different smsc-ids.<br class=3D""><br class=3D""><u class=3D""></u><u =
class=3D""></u></span></p><p class=3D"MsoNormal"><span style=3D"font-size:=
 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" =
class=3D"">The patch only uses smsc-username which is (AFAIK) always the =
same with multiple binds.<u class=3D""></u><u class=3D""></u></span></p><p=
 class=3D"MsoNormal"><span style=3D"font-size: 11pt; font-family: =
Calibri, sans-serif; color: rgb(31, 73, 125);" class=3D"">It is more =
flexible in my opinion.<u class=3D""></u><u class=3D""></u></span></p><p =
class=3D"MsoNormal"><span style=3D"font-size: 11pt; font-family: =
Calibri, sans-serif; color: rgb(31, 73, 125);" class=3D""><u =
class=3D""></u>&nbsp;<u class=3D""></u></span></p><p =
class=3D"MsoNormal"><span style=3D"font-size: 11pt; font-family: =
Calibri, sans-serif; color: rgb(31, 73, 125);" class=3D"">Regards,<u =
class=3D""></u><u class=3D""></u></span></p><p class=3D"MsoNormal"><span =
style=3D"font-size: 11pt; font-family: Calibri, sans-serif; color: =
rgb(31, 73, 125);" class=3D"">Franck<u class=3D""></u><u =
class=3D""></u></span></p><p class=3D"MsoNormal"><span style=3D"font-size:=
 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" =
class=3D""><u class=3D""></u>&nbsp;<u class=3D""></u></span></p><p =
class=3D"MsoNormal"><u class=3D""></u>&nbsp;<u class=3D""></u></p><p =
class=3D"MsoNormal"><b class=3D""><span style=3D"font-size: 11pt; =
font-family: Calibri, sans-serif;" class=3D"">From:</span></b><span =
style=3D"font-size: 11pt; font-family: Calibri, sans-serif;" =
class=3D""><span class=3D"Apple-converted-space">&nbsp;</span>Alejandro =
Guerrieri &lt;<a href=3D"mailto:[email protected]" =
target=3D"_blank" class=3D"">[email protected]</a>&gt;<span =
class=3D"Apple-converted-space">&nbsp;</span><br class=3D""><b =
class=3D"">Sent:</b><span =
class=3D"Apple-converted-space">&nbsp;</span>mercredi 26 juin 2019 =
00:27<br class=3D""><b class=3D"">To:</b><span =
class=3D"Apple-converted-space">&nbsp;</span>Lamasuta, Franck, Vodafone =
Automotive &lt;<a href=3D"mailto:[email protected]" =
target=3D"_blank" class=3D"">[email protected]</a>&gt;<br =
class=3D""><b class=3D"">Cc:</b><span =
class=3D"Apple-converted-space">&nbsp;</span><a =
href=3D"mailto:[email protected]" target=3D"_blank" =
class=3D"">[email protected]</a><br class=3D""><b =
class=3D"">Subject:</b><span =
class=3D"Apple-converted-space">&nbsp;</span>Re: [PATCH] SMSC cluster<u =
class=3D""></u><u class=3D""></u></span></p><p class=3D"MsoNormal"><u =
class=3D""></u>&nbsp;<u class=3D""></u></p><div class=3D""><p =
class=3D"MsoNormal">I'm curious why do you even need this patch? You =
could use the same smsc-id on both and assign different smsc-admin-id =
values to manage each bind separately (e.g. start/stop). If by any =
reason you'd want to send over a specific bind, you could use different =
allowed-smsc-id's as well.<u class=3D""></u><u class=3D""></u></p><div =
class=3D""><div class=3D""><p class=3D"MsoNormal"><u =
class=3D""></u>&nbsp;<u class=3D""></u></p></div><div class=3D""><p =
class=3D"MsoNormal">Regards,<u class=3D""></u><u =
class=3D""></u></p></div><div class=3D""><p class=3D"MsoNormal"><u =
class=3D""></u>&nbsp;<u class=3D""></u></p></div><div class=3D""><p =
class=3D"MsoNormal">Alejandro<u class=3D""></u><u =
class=3D""></u></p></div></div></div><p class=3D"MsoNormal"><u =
class=3D""></u>&nbsp;<u class=3D""></u></p><div class=3D""><div =
class=3D""><p class=3D"MsoNormal">On Tue, Jun 25, 2019 at 12:20 PM =
Lamasuta, Franck, Vodafone Automotive &lt;<a =
href=3D"mailto:[email protected]" target=3D"_blank" =
class=3D"">[email protected]</a>&gt; wrote:<u class=3D""></u><u=
 class=3D""></u></p></div><blockquote style=3D"border-style: none none =
none solid; border-left-width: 1pt; border-left-color: rgb(204, 204, =
204); padding: 0cm 0cm 0cm 6pt; margin-left: 4.8pt; margin-right: 0cm;" =
class=3D""><div class=3D""><div class=3D""><p class=3D"MsoNormal"><span =
lang=3D"FR" class=3D"">Hi list,</span><u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal"><span lang=3D"FR" =
class=3D"">&nbsp;</span><u class=3D""></u><u class=3D""></u></p><p =
class=3D"MsoNormal">We have implemented many patches along the way and I =
can finally take some time to submit them.<br class=3D"">They are =
running on our staging and production platforms since years for the =
oldest ones.<u class=3D""></u><u class=3D""></u></p><p =
class=3D"MsoNormal">I will submit them one by one in the next =
days/weeks.<u class=3D""></u><u class=3D""></u></p><p =
class=3D"MsoNormal">Let=E2=80=99s start with the first =
one=E2=80=A6&nbsp;&nbsp;<span =
class=3D"Apple-converted-space">&nbsp;</span><span style=3D"font-family: =
Wingdings;" class=3D"">J</span><u class=3D""></u><u class=3D""></u></p><p =
class=3D"MsoNormal">&nbsp;<u class=3D""></u><u class=3D""></u></p><p =
class=3D"MsoNormal">This patch allows Kannel to retrieve a pending DLRs =
in its database when 2 (or more) SMSC binds are established (with =
different IPs and/or ports).<u class=3D""></u><u class=3D""></u></p><p =
class=3D"MsoNormal">It is required when a MT-SMS is submitted to SMSC A =
and its DLR is sent back by SMSC B.<u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal">Done for CIMD2 and SMPP.<u =
class=3D""></u><u class=3D""></u></p><p class=3D"MsoNormal">&nbsp;<u =
class=3D""></u><u class=3D""></u></p><p class=3D"MsoNormal">Example of =
configuration where the patch is required:<u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal">&nbsp;<u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal"><span style=3D"font-family: =
&quot;Courier New&quot;; color: rgb(68, 114, 196);" class=3D"">#</span><u =
class=3D""></u><u class=3D""></u></p><p class=3D"MsoNormal"><span =
style=3D"font-family: &quot;Courier New&quot;; color: rgb(68, 114, =
196);" class=3D""># Primary server</span><u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal"><span style=3D"font-family: =
&quot;Courier New&quot;; color: rgb(68, 114, 196);" class=3D"">#</span><u =
class=3D""></u><u class=3D""></u></p><p class=3D"MsoNormal"><span =
style=3D"font-family: &quot;Courier New&quot;; color: rgb(68, 114, =
196);" class=3D"">group =3D smsc</span><u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal"><span style=3D"font-family: =
&quot;Courier New&quot;; color: rgb(68, 114, 196);" class=3D"">smsc =3D =
cimd2</span><u class=3D""></u><u class=3D""></u></p><p =
class=3D"MsoNormal"><span style=3D"font-family: &quot;Courier New&quot;; =
color: rgb(68, 114, 196);" class=3D"">smsc-id =3D SMSC-A</span><u =
class=3D""></u><u class=3D""></u></p><p class=3D"MsoNormal"><span =
style=3D"font-family: &quot;Courier New&quot;; color: rgb(68, 114, =
196);" class=3D"">host =3D 123.1.2.3</span><u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal"><span style=3D"font-family: =
&quot;Courier New&quot;; color: rgb(68, 114, 196);" class=3D"">port =3D =
6001</span><u class=3D""></u><u class=3D""></u></p><p =
class=3D"MsoNormal"><span style=3D"font-family: &quot;Courier New&quot;; =
color: rgb(68, 114, 196);" class=3D"">smsc-username =3D user</span><u =
class=3D""></u><u class=3D""></u></p><p class=3D"MsoNormal"><span =
style=3D"font-family: &quot;Courier New&quot;; color: rgb(68, 114, =
196);" class=3D"">smsc-password =3D xxxxxxxx</span><u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal"><span style=3D"font-family: =
&quot;Courier New&quot;; color: rgb(68, 114, 196);" =
class=3D"">allowed-smsc-id =3D id1</span><u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal"><span style=3D"font-family: =
&quot;Courier New&quot;; color: rgb(68, 114, 196);" =
class=3D"">preferred-smsc-id =3D id1</span><u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal"><span style=3D"font-family: =
&quot;Courier New&quot;; color: rgb(68, 114, 196);" =
class=3D"">&nbsp;</span><u class=3D""></u><u class=3D""></u></p><p =
class=3D"MsoNormal"><span style=3D"font-family: &quot;Courier New&quot;; =
color: rgb(68, 114, 196);" class=3D"">#</span><u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal"><span style=3D"font-family: =
&quot;Courier New&quot;; color: rgb(68, 114, 196);" class=3D""># =
Secondary server</span><u class=3D""></u><u class=3D""></u></p><p =
class=3D"MsoNormal"><span style=3D"font-family: &quot;Courier New&quot;; =
color: rgb(68, 114, 196);" class=3D"">#</span><u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal"><span style=3D"font-family: =
&quot;Courier New&quot;; color: rgb(68, 114, 196);" class=3D"">group =3D =
smsc</span><u class=3D""></u><u class=3D""></u></p><p =
class=3D"MsoNormal"><span style=3D"font-family: &quot;Courier New&quot;; =
color: rgb(68, 114, 196);" class=3D"">smsc =3D cimd2</span><u =
class=3D""></u><u class=3D""></u></p><p class=3D"MsoNormal"><span =
style=3D"font-family: &quot;Courier New&quot;; color: rgb(68, 114, =
196);" class=3D"">smsc-id =3D SMSC-B</span><u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal"><span style=3D"font-family: =
&quot;Courier New&quot;; color: rgb(68, 114, 196);" class=3D"">host =3D =
123.1.2.3</span><u class=3D""></u><u class=3D""></u></p><p =
class=3D"MsoNormal"><span style=3D"font-family: &quot;Courier New&quot;; =
color: rgb(68, 114, 196);" class=3D"">port =3D 6002</span><u =
class=3D""></u><u class=3D""></u></p><p class=3D"MsoNormal"><span =
style=3D"font-family: &quot;Courier New&quot;; color: rgb(68, 114, =
196);" class=3D"">smsc-username =3D user</span><u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal"><span style=3D"font-family: =
&quot;Courier New&quot;; color: rgb(68, 114, 196);" =
class=3D"">smsc-password =3D xxxxxxxx</span><u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal"><span style=3D"font-family: =
&quot;Courier New&quot;; color: rgb(68, 114, 196);" =
class=3D"">allowed-smsc-id =3D id1</span><u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal">&nbsp;<u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal">&nbsp;<u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal">Regards,<u class=3D""></u><u =
class=3D""></u></p><p class=3D"MsoNormal">Franck<u class=3D""></u><u =
class=3D""></u></p></div></div></blockquote></div></div></div></blockquote=
></div><style class=3D"">ul[class*=3D'mb-extra__public-links'], =
ul[class*=3D'mb-note__public-links'], ul[class*=3D'mb-task__public-links']=
 { display: none !important; }</style></div></blockquote></div><br =
class=3D""></div></body></html>=

--Apple-Mail=_9CB41686-4CC4-40F7-9132-2A6A4864A7FD--