<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Notifications</title><link>https://community.telligent.com/community/11/w/developer-training/65121/notifications</link><description /><dc:language>en-US</dc:language><generator>14.0.0.586 14</generator><item><title>Notifications</title><link>https://community.telligent.com/community/11/w/developer-training/65121/notifications</link><pubDate>Tue, 04 Aug 2020 21:56:49 GMT</pubDate><guid isPermaLink="false">f27d95e5-a823-4b2b-aadb-885769e860cd</guid><dc:creator>Former Member</dc:creator><comments>https://community.telligent.com/community/11/w/developer-training/65121/notifications#comments</comments><description>Current Revision posted to Developer Training by Former Member on 08/04/2020 21:56:49&lt;br /&gt;
&lt;p&gt;The Notification Service is made up of two parts the notification type and the notification distribution type. The [[api-documentation:INotificationType Plugin Type|INotificationType]] defines your notification and allows you to setup the name, permissions and message. When a notification event is triggered then the [[api-documentation:INotificationDistributionType Plugin Type|INotificationDistributionType]] is responsible for sending the notification via a particular medium. Out of the box Verint Community provides two distribution types, the email and socket (toast) distribution types.&lt;/p&gt;
&lt;p&gt;[toc]&lt;/p&gt;
&lt;h2&gt;&lt;a id="Why_Should_I_Create_a_Notification_Type" name="Why_Should_I_Create_a_Notification_Type"&gt;&lt;/a&gt;Why Should I Create a Notification Type?&lt;/h2&gt;
&lt;p&gt;New notification types are useful when you want to notify community members about specific events in the community, either events that occur with core functionality or because of new functionality added to the platform.&lt;/p&gt;
&lt;h2&gt;&lt;a id="Why_Should_I_Create_a_Notification_Distribution_Type" name="Why_Should_I_Create_a_Notification_Distribution_Type"&gt;&lt;/a&gt;Why Should I Create a Notification Distribution Type?&lt;/h2&gt;
&lt;p&gt;Besides sending a notification via email or toast notification a new distribution type can send a notification through another medium. For example you could setup a notification distribution using a text messaging platform. Defining a distribution type is out of scope for this document.&lt;/p&gt;
&lt;h2&gt;&lt;a id="Creating_an_INotificationType" name="Creating_an_INotificationType"&gt;&lt;/a&gt;Creating an INotificationType&lt;/h2&gt;
&lt;p&gt;To add support for sending notifications through Verint Community the [[api-documentation:INotificationType Plugin Type|INotificationType]] plugin must be implemented. The &lt;code&gt;INotificationType&lt;/code&gt; interface extends &lt;a class="ExistingPageLink" title="Click to view the page titled: Plugins" href="/training/w/developer90/52443.plugins"&gt;IPlugin&lt;/a&gt; and the following assemblies must also be referenced in your plugin Telligent.Evolution.Components.dll, Telligent.Evolution.Api and Telligent.Evolution.Core.&lt;/p&gt;
&lt;p&gt;When creating a NotificationType plugin use an event handler to create a notification. For instance, if a user comments on content an event handler can be created for the event in the plugin&amp;#39;s Initialize method. Then the notification can be sent by using the controller.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;private void CommentEvents_AfterCreate(CommentAfterCreateEventArgs e)
{
    if (e == null
        || e.Content == null
        || e.User == null
        || !e.IsApproved
        || !e.Content.CreatedByUserId.HasValue
        || e.CommentTypeId.GetValueOrDefault(Guid.Empty) != Guid.Empty)
    {
        return;
    }

    var comment = Apis.Get&amp;lt;IComments&amp;gt;().Get(e.CommentId);
    if (comment != null &amp;amp;&amp;amp; comment.IsApproved)
    {
        AddNotifications(e.Content.ContentId, e.Content.ContentTypeId, e.CommentId, e.Content.CreatedByUserId.Value, e.UserId);
    }
}
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;When &lt;code&gt;SetController&lt;/code&gt; is called the plugin&amp;#39;s instance of the notification controller is passed to the &lt;code&gt;INotificationType&lt;/code&gt;. This is a crucial part of the notification plugin. If you do not define a private [[api-documentation:INotificationType Plugin Type|INotificationController]] seen here as _notificationController you cannot send notifications.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;public void SetController(INotificationController controller)
{
    _notificationController = controller;
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;In the AddNotifications method the [[api-documentation:INotificationType Plugin Type|INotificationController]] is used. When the &lt;code&gt;CreateUpdate&lt;/code&gt; method is called one of two processes will occur. If a notification matching the ContentId and ContentTypeId exists it will modify the notification accordingly. If the notification does not exist, it will create one.&lt;/p&gt;
&lt;p&gt;Alternatively there is also a &lt;code&gt;Delete&lt;/code&gt; method in the [[api-documentation:INotificationType Plugin Type|INotificationController]], this can be used if a &lt;code&gt;BeforeDelete&lt;/code&gt; event handler is implemented.&lt;/p&gt;
&lt;p&gt;It is also possible to add ExtendedAttibutes if you need to pass other information when rendering the message. In this example we define the content id and type to be used later in the &lt;code&gt;GetTargetUrl&lt;/code&gt; method and save the comment id as an [[api-documentation:ExtendedAttribute Plugin Supplementary Type|ExtendedAttribute]] so it can later be used in &lt;code&gt;GetMessage&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;private void AddNotifications(Guid contentId, Guid contentTypeId, Guid commentId, int contentAuthor, int actorId)
{
    var comment = Apis.Get&amp;lt;IComments&amp;gt;().Get(commentId);
    if (comment == null) { return; }

    var attributes = new List&amp;lt;IExtendedAttribute&amp;gt;
    {
        new ExtendedAttribute {Key = &amp;quot;TargetCommentId&amp;quot;, Value = comment.CommentId.ToString(&amp;quot;N&amp;quot;)}
    };

    _notificationController.CreateUpdate(new NotificationCreateUpdateOptions
    {
        ContentId = contentId,
        ContentTypeId = contentTypeId,
        LastUpdate = DateTime.UtcNow,
        UserId = contentAuthor,
        ActorIdToAdd = actorId,
        ExtendedAttributes = attributes
    });
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Begin by choosing a name and description for the notification type, this is different than the plugin name. It will be displayed in the user&amp;#39;s settings page under the Notification&amp;#39;s tab.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;public string NotificationTypeName
{
    get { return &amp;quot;Notification Sample&amp;quot;; }
}

public string NotificationTypeDescription
{
    get { return &amp;quot;Sends a sample notification.&amp;quot;; }
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;The&amp;nbsp;&lt;code&gt;NotificationTypeId&lt;/code&gt; is the unique ID for the notification type.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;public Guid NotificationTypeId
{
    get { return new Guid(&amp;quot;3C0542FD-5AB0-4386-911C-86CCF530BAEE&amp;quot;); }
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;To tell the system if the notification data can and should be cached the &lt;code&gt;IsCacheable&lt;/code&gt; property is used. The other cache property, &lt;code&gt;VaryCacheByUser&lt;/code&gt;, tells the system if the notification data should be cached according to each user.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;public bool IsCacheable
{
    get { return true; }
}

public bool VaryCacheByUser
{
    get { return true; }
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;It is necessary to define if a user can delete a notification. This value tells the system if the user attempting to delete the notification is allowed to do so. In this sample, deleting is allowed only by the&amp;nbsp;recipient which is defined by the UserId in the notification.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;public bool CanDeleteNotification(Guid notificationId, int userId)
{
    var notification = PublicApi.Notifications.Get(notificationId);
    return notification != null &amp;amp;&amp;amp; notification.UserId == userId;
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;GetMessage&lt;/code&gt; returns a string value of the message being sent to the user. Here the &lt;code&gt;ExtendedAttributes&lt;/code&gt; can be accessed, the information was passed in from the create notification in &lt;code&gt;CommentEvents_AfterCreate&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;public string GetMessage(Guid notificationId, string target)
{
    var notification = Apis.Get&amp;lt;INotifications&amp;gt;().Get(notificationId);
    if (notification == null || notification.ExtendedAttributes == null) { return null; }

    var commentIdAttribute = notification.ExtendedAttributes.FirstOrDefault(ea =&amp;gt; ea.Key == &amp;quot;TargetCommentId&amp;quot;);
    if (commentIdAttribute == null) { return null; }

    var commentId = Guid.Parse(commentIdAttribute.Value);
    var comment = Apis.Get&amp;lt;IComments&amp;gt;().Get(commentId);
    if (comment == null) { return null; }

    var user = Apis.Get&amp;lt;IUsers&amp;gt;().Get(new UsersGetOptions { Id = notification.UserId });
    if (user == null) { return null; }

    return string.Format(&amp;quot;{0}, added a comment \&amp;quot;{1}\&amp;quot;&amp;quot;, user.DisplayName, comment.Body());
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;GetTargetUrl&lt;/code&gt; will contain the URL where the content is located and returns a string value of the location. In this sample the comment contains the content Id and type that it is associated with.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;public string GetTargetUrl(Guid notificationId)
{
    var notification = Apis.Get&amp;lt;INotifications&amp;gt;().Get(notificationId);
    return notification != null &amp;amp;&amp;amp; notification.Content != null ? notification.Content.Url : null;
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Here is the complete sample.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://community.telligent.com/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/7041_2E00_MyNotifications_2E00_cs"&gt;community.telligent.com/.../7041_2E00_MyNotifications_2E00_cs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In this sample the notification is displayed when a comment is created. To enable the plugin, in the administration panel, navigate to the Notifications menu and find the &amp;quot;My Notifications Plugin&amp;quot; check Enabled and click Save. Create a comment and notice the toast notification.&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/4784.png"&gt;&lt;img style="border:1px solid #DEDEDE;" alt=" " src="/resized-image/__size/768x768/__key/communityserver-wikis-components-files/00-00-00-12-83/4784.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a sample of the toast notification.&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/8816.png"&gt;&lt;img style="border:1px solid #DEDEDE;" alt=" " src="/resized-image/__size/768x768/__key/communityserver-wikis-components-files/00-00-00-12-83/8816.png" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: INotificationDistributionType, INotificationType&lt;/div&gt;
</description></item><item><title>Notifications</title><link>https://community.telligent.com/community/11/w/developer-training/65121/notifications/revision/1</link><pubDate>Thu, 13 Jun 2019 19:28:58 GMT</pubDate><guid isPermaLink="false">f27d95e5-a823-4b2b-aadb-885769e860cd</guid><dc:creator>Ben Tiedt</dc:creator><comments>https://community.telligent.com/community/11/w/developer-training/65121/notifications#comments</comments><description>Revision 1 posted to Developer Training by Ben Tiedt on 06/13/2019 19:28:58&lt;br /&gt;
&lt;p&gt;The Notification Service is made up of two parts the notification type and the notification distribution type. The [[api-documentation:INotificationType Plugin Type|INotificationType]] defines your notification and allows you to setup the name, permissions and message. When a notification event is triggered then the [[api-documentation:INotificationDistributionType Plugin Type|INotificationDistributionType ]]is responsible for sending the notification via a particular medium. Out of the box Telligent Community provides two distribution types, the email and socket (toast) distribution types.&lt;/p&gt;
&lt;p&gt;[toc]&lt;/p&gt;
&lt;h2&gt;&lt;a id="Why_Should_I_Create_a_Notification_Type" name="Why_Should_I_Create_a_Notification_Type"&gt;&lt;/a&gt;Why Should I Create a Notification Type?&lt;/h2&gt;
&lt;p&gt;New notification types are useful when you want to notify community members about specific events in the community, either events that occur with core functionality or because of new functionality added to the platform.&lt;/p&gt;
&lt;h2&gt;&lt;a id="Why_Should_I_Create_a_Notification_Distribution_Type" name="Why_Should_I_Create_a_Notification_Distribution_Type"&gt;&lt;/a&gt;Why Should I Create a Notification Distribution Type?&lt;/h2&gt;
&lt;p&gt;Besides sending a notification via email or toast notification a new distribution type can send a notification through another medium. For example you could setup a notification distribution using a text messaging platform. Defining a distribution type is out of scope for this document.&lt;/p&gt;
&lt;h2&gt;&lt;a id="Creating_an_INotificationType" name="Creating_an_INotificationType"&gt;&lt;/a&gt;Creating an INotificationType&lt;/h2&gt;
&lt;p&gt;To add support for sending notifications through Telligent Community the [[api-documentation:INotificationType Plugin Type|INotificationType]] plugin must be implemented. The &lt;code&gt;INotificationType&lt;/code&gt; interface extends &lt;a class="ExistingPageLink" title="Click to view the page titled: Plugins" href="/training/w/developer90/52443.plugins"&gt;IPlugin&lt;/a&gt; and the following assemblies must also be referenced in your plugin Telligent.Evolution.Components.dll, Telligent.Evolution.Api and Telligent.Evolution.Core.&lt;/p&gt;
&lt;p&gt;When creating a NotificationType plugin use an event handler to create a notification. For instance, if a user comments on content an event handler can be created for the event in the plugin&amp;#39;s Initialize method. Then the notification can be sent by using the controller.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;private void CommentEvents_AfterCreate(CommentAfterCreateEventArgs e)
{
    if (e == null
        || e.Content == null
        || e.User == null
        || !e.IsApproved
        || !e.Content.CreatedByUserId.HasValue
        || e.CommentTypeId.GetValueOrDefault(Guid.Empty) != Guid.Empty)
    {
        return;
    }

    var comment = Apis.Get&amp;lt;IComments&amp;gt;().Get(e.CommentId);
    if (comment != null &amp;amp;&amp;amp; comment.IsApproved)
    {
        AddNotifications(e.Content.ContentId, e.Content.ContentTypeId, e.CommentId, e.Content.CreatedByUserId.Value, e.UserId);
    }
}
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;When &lt;code&gt;SetController&lt;/code&gt; is called the plugin&amp;#39;s instance of the notification controller is passed to the &lt;code&gt;INotificationType&lt;/code&gt;. This is a crucial part of the notification plugin. If you do not define a private [[api-documentation:INotificationType Plugin Type|INotificationController]] seen here as _notificationController you cannot send notifications.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;public void SetController(INotificationController controller)
{
    _notificationController = controller;
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;In the AddNotifications method the [[api-documentation:INotificationType Plugin Type|INotificationController]] is used. When the &lt;code&gt;CreateUpdate&lt;/code&gt; method is called one of two processes will occur. If a notification matching the ContentId and ContentTypeId exists it will modify the notification accordingly. If the notification does not exist, it will create one.&lt;/p&gt;
&lt;p&gt;Alternatively there is also a &lt;code&gt;Delete&lt;/code&gt; method in the [[api-documentation:INotificationType Plugin Type|INotificationController]], this can be used if a &lt;code&gt;BeforeDelete&lt;/code&gt; event handler is implemented.&lt;/p&gt;
&lt;p&gt;It is also possible to add ExtendedAttibutes if you need to pass other information when rendering the message. In this example we define the content id and type to be used later in the &lt;code&gt;GetTargetUrl&lt;/code&gt; method and save the comment id as an [[api-documentation:ExtendedAttribute Plugin Supplementary Type|ExtendedAttribute]] so it can later be used in &lt;code&gt;GetMessage&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;private void AddNotifications(Guid contentId, Guid contentTypeId, Guid commentId, int contentAuthor, int actorId)
{
    var comment = Apis.Get&amp;lt;IComments&amp;gt;().Get(commentId);
    if (comment == null) { return; }

    var attributes = new List&amp;lt;IExtendedAttribute&amp;gt;
    {
        new ExtendedAttribute {Key = &amp;quot;TargetCommentId&amp;quot;, Value = comment.CommentId.ToString(&amp;quot;N&amp;quot;)}
    };

    _notificationController.CreateUpdate(new NotificationCreateUpdateOptions
    {
        ContentId = contentId,
        ContentTypeId = contentTypeId,
        LastUpdate = DateTime.UtcNow,
        UserId = contentAuthor,
        ActorIdToAdd = actorId,
        ExtendedAttributes = attributes
    });
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Begin by choosing a name and description for the notification type, this is different than the plugin name. It will be displayed in the user&amp;#39;s settings page under the Notification&amp;#39;s tab.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;public string NotificationTypeName
{
    get { return &amp;quot;Notification Sample&amp;quot;; }
}

public string NotificationTypeDescription
{
    get { return &amp;quot;Sends a sample notification.&amp;quot;; }
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;The&amp;nbsp;&lt;code&gt;NotificationTypeId&lt;/code&gt; is the unique ID for the notification type.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;public Guid NotificationTypeId
{
    get { return new Guid(&amp;quot;3C0542FD-5AB0-4386-911C-86CCF530BAEE&amp;quot;); }
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;To tell the system if the notification data can and should be cached the &lt;code&gt;IsCacheable&lt;/code&gt; property is used. The other cache property, &lt;code&gt;VaryCacheByUser&lt;/code&gt;, tells the system if the notification data should be cached according to each user.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;public bool IsCacheable
{
    get { return true; }
}

public bool VaryCacheByUser
{
    get { return true; }
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;It is necessary to define if a user can delete a notification. This value tells the system if the user attempting to delete the notification is allowed to do so. In this sample, deleting is allowed only by the&amp;nbsp;recipient which is defined by the UserId in the notification.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;public bool CanDeleteNotification(Guid notificationId, int userId)
{
    var notification = PublicApi.Notifications.Get(notificationId);
    return notification != null &amp;amp;&amp;amp; notification.UserId == userId;
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;GetMessage&lt;/code&gt; returns a string value of the message being sent to the user. Here the &lt;code&gt;ExtendedAttributes&lt;/code&gt; can be accessed, the information was passed in from the create notification in &lt;code&gt;CommentEvents_AfterCreate&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;public string GetMessage(Guid notificationId, string target)
{
    var notification = Apis.Get&amp;lt;INotifications&amp;gt;().Get(notificationId);
    if (notification == null || notification.ExtendedAttributes == null) { return null; }

    var commentIdAttribute = notification.ExtendedAttributes.FirstOrDefault(ea =&amp;gt; ea.Key == &amp;quot;TargetCommentId&amp;quot;);
    if (commentIdAttribute == null) { return null; }

    var commentId = Guid.Parse(commentIdAttribute.Value);
    var comment = Apis.Get&amp;lt;IComments&amp;gt;().Get(commentId);
    if (comment == null) { return null; }

    var user = Apis.Get&amp;lt;IUsers&amp;gt;().Get(new UsersGetOptions { Id = notification.UserId });
    if (user == null) { return null; }

    return string.Format(&amp;quot;{0}, added a comment \&amp;quot;{1}\&amp;quot;&amp;quot;, user.DisplayName, comment.Body());
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;GetTargetUrl&lt;/code&gt; will contain the URL where the content is located and returns a string value of the location. In this sample the comment contains the content Id and type that it is associated with.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;public string GetTargetUrl(Guid notificationId)
{
    var notification = Apis.Get&amp;lt;INotifications&amp;gt;().Get(notificationId);
    return notification != null &amp;amp;&amp;amp; notification.Content != null ? notification.Content.Url : null;
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Here is the complete sample.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://community.telligent.com/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/7041_2E00_MyNotifications_2E00_cs"&gt;community.telligent.com/.../7041_2E00_MyNotifications_2E00_cs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In this sample the notification is displayed when a comment is created. To enable the plugin, in the administration panel, navigate to the Notifications menu and find the &amp;quot;My Notifications Plugin&amp;quot; check Enabled and click Save. Create a comment and notice the toast notification.&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/4784.png"&gt;&lt;img style="border:1px solid #DEDEDE;" src="/resized-image/__size/768x768/__key/communityserver-wikis-components-files/00-00-00-12-83/4784.png" alt=" " /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a sample of the toast notification.&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/8816.png"&gt;&lt;img style="border:1px solid #DEDEDE;" src="/resized-image/__size/768x768/__key/communityserver-wikis-components-files/00-00-00-12-83/8816.png" alt=" " /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item></channel></rss>