1.1 --- a/README.txt Wed Oct 28 17:06:44 2015 +0100
1.2 +++ b/README.txt Wed Oct 28 18:08:40 2015 +0100
1.3 @@ -42,41 +42,3 @@
1.4 See: docs/wiki/MailIntegration
1.5 See: docs/wiki/MailIntegration--LMTP
1.6 See: docs/wiki/MailIntegration--LocalSMTP
1.7 -
1.8 -Configuring Web Servers for Free/Busy Publishing
1.9 -================================================
1.10 -
1.11 -Each user may request the publishing of their free/busy information by
1.12 -configuring certain settings. The conf/apache/imip-agent.conf file provides a
1.13 -configuration file for deployment with the Apache Web server software that
1.14 -exposes a directory for Web publishing containing the published free/busy
1.15 -information.
1.16 -
1.17 -Access to free/busy information may not be moderated, but Web server
1.18 -directives can be introduced to impose access controls. Mail programs that
1.19 -wish to consult the free/busy information may have problems in dealing with
1.20 -authentication mechanisms, however, and it may be regarded as acceptable in
1.21 -certain environments to expose such information publicly or with
1.22 -network-specific access constraints.
1.23 -
1.24 -Configuring Web Servers for the Calendar Management Interface
1.25 -=============================================================
1.26 -
1.27 -A calendar management interface is provided to allow users to view and
1.28 -interact with their calendars through the Web. The
1.29 -conf/apache/imip-manager.conf file provides a configuration file for
1.30 -deployment with the Apache Web server software that enables this interface.
1.31 -
1.32 -The management interface is deployed as a CGI program, meaning that a suitable
1.33 -module must be enabled in the Apache configuration. On Debian, this is done as
1.34 -follows:
1.35 -
1.36 -a2enmod cgi
1.37 -
1.38 -Since such access to calendars should only be performed by identified
1.39 -users, access controls are suggested in the configuration file. Modules
1.40 -providing additional authentication support may need to be enabled. For
1.41 -example, on Debian, the LDAP authentication/authorisation support is enabled
1.42 -as follows:
1.43 -
1.44 -a2enmod authnz_ldap
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2.2 +++ b/docs/wiki/AgentPrograms Wed Oct 28 18:08:40 2015 +0100
2.3 @@ -0,0 +1,19 @@
2.4 += Agent Programs =
2.5 +
2.6 +A collection of programs are provided to handle messages for different kinds of
2.7 +mail participants. Currently, the following programs are provided:
2.8 +
2.9 +|| '''Program''' || '''Purpose''' ||
2.10 +|| `imip_person.py` ||<|2> Maintain scheduling information on behalf of people ||
2.11 +|| `imip_person_outgoing.py` ||
2.12 +|| `imip_resource.py` || Act as an autonomous resource that can be reserved ||
2.13 +
2.14 +For people, the role of the agent programs concerned is to construct a schedule
2.15 +that can be accessed via the [[../CalendarManager|management interface]] and to
2.16 +maintain a free/busy record for event scheduling purposes.
2.17 +
2.18 +For resources, the role of the agent program concerned is also to maintain
2.19 +schedule and free/busy records, but also to act autonomously - that is, without
2.20 +manual intervention - and to respond to event invitations or booking requests
2.21 +according to policies defined in the [[../Configuration|configuration]] of the
2.22 +system.
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
3.2 +++ b/docs/wiki/CalendarManager Wed Oct 28 18:08:40 2015 +0100
3.3 @@ -0,0 +1,7 @@
3.4 += Calendar Management Interface =
3.5 +
3.6 +Since some users of the calendar system may not have a calendar program or a
3.7 +mail program that understands calendar data, a Web-based interface is provided
3.8 +that allows such users to inspect incoming calendar data, consult a schedule
3.9 +that has been prepared through the work of the [[../AgentPrograms|agent programs]],
3.10 +and to create events to be shared with others.
4.1 --- a/docs/wiki/Configuration Wed Oct 28 17:06:44 2015 +0100
4.2 +++ b/docs/wiki/Configuration Wed Oct 28 18:08:40 2015 +0100
4.3 @@ -1,14 +1,15 @@
4.4 = Configuration =
4.5
4.6 -There are two principal configuration files in imip-agent:
4.7 +There are three levels of configuration in imip-agent:
4.8
4.9 - * `config.py` provides the configuration to the software itself
4.10 * `config.sh` provides system-level and tool configuration
4.11 + * `config.py` provides the configuration of the software itself
4.12 + * User preferences reside as files in separate user-specific directories
4.13
4.14 These files are by default installed into the `/etc/imip-agent` directory
4.15 and they can be changed in that location once the system is installed.
4.16
4.17 -== System User and Filesystem Configuration ==
4.18 +== System-Level and Tool Configuration ==
4.19
4.20 Given a choice of [[../SystemUsers|system users and groups]], the
4.21 resulting configuration must be indicated in the `config.sh` file. Since
4.22 @@ -16,7 +17,7 @@
4.23 be made to the file in the `tools/config.sh` location before installation
4.24 can occur.
4.25
4.26 -== Agent System Configuration ==
4.27 +== Software Configuration ==
4.28
4.29 Any changes to filesystem locations may need to be incorporated into the
4.30 `config.py` file, which is found in the `imiptools/config.py` location of
4.31 @@ -28,3 +29,13 @@
4.32 `config.py` file provides system-level settings (filesystem locations
4.33 and file permissions), service-level settings (e-mail address and Web site
4.34 choices), and default policies for users of the software.
4.35 +
4.36 +== User Preferences ==
4.37 +
4.38 +Although the software configuration in `config.py` provides default policies,
4.39 +users can choose to override these defaults by editing their own preferences.
4.40 +The most convenient way of doing this is to use the profile page provided by
4.41 +the [[../CalendarManager|management interface]].
4.42 +
4.43 +The settings for the different policies are described in the
4.44 +[[../Preferences|preferences guide]].
5.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
5.2 +++ b/docs/wiki/FreeBusyPublishing Wed Oct 28 18:08:40 2015 +0100
5.3 @@ -0,0 +1,24 @@
5.4 += Free/Busy Publishing =
5.5 +
5.6 +Although iTIP [[http://tools.ietf.org/html/rfc5546#section-3.3|specifies]] the exchange
5.7 +of free/busy information through requests and replies, many mail-based calendar clients
5.8 +do not support these particular operations over e-mail when providing general
5.9 +[[http://tools.ietf.org/html/rfc6047|iMIP]] support. However, they may support the
5.10 +acquisition of free/busy information over HTTP.
5.11 +
5.12 +The publishing of free/busy resources for users can be enabled by default in the
5.13 +[[../Configuration|configuration]] by changing the `PUBLISHING_DEFAULT` setting:
5.14 +
5.15 +{{{
5.16 +PUBLISHING_DEFAULT = "publish"
5.17 +}}}
5.18 +
5.19 +For this setting to have an effect, the `SHARING_DEFAULT` setting will need to be
5.20 +changed to enable free/busy sharing by default:
5.21 +
5.22 +{{{
5.23 +SHARING_DEFAULT = "share"
5.24 +}}}
5.25 +
5.26 +Users can enable sharing and publishing themselves by accessing their profile in the
5.27 +[[../CalendarManager|management interface]].
6.1 --- a/docs/wiki/FrontPage Wed Oct 28 17:06:44 2015 +0100
6.2 +++ b/docs/wiki/FrontPage Wed Oct 28 18:08:40 2015 +0100
6.3 @@ -68,20 +68,20 @@
6.4 ||
6.5 Although [[https://tools.ietf.org/html/rfc6047|iMIP]] supports this, most mail
6.6 programs do not, so imip-agent will gather information about events and
6.7 -publish it for retrieval via HTTP. It will also respond to any iMIP requests
6.8 -for free/busy information via mail.
6.9 +[[/FreeBusyPublishing|publish it for retrieval via HTTP]]. It will also respond
6.10 +to any iMIP requests for free/busy information via mail.
6.11 ==
6.12 Organisations may want to coordinate access to resources using calendaring.
6.13 ||
6.14 -Here, imip-agent can provide autonomous agents that can respond to event
6.15 -invitations, allowing users to book resources and to see published
6.16 -availability information for those resources.
6.17 +Here, imip-agent can provide [[/AgentPrograms|autonomous agents]] that can
6.18 +respond to event invitations, allowing users to book resources and to see
6.19 +published availability information for those resources.
6.20 ==
6.21 Some users may not be using mail programs that understand calendars and
6.22 events.
6.23 ||
6.24 -Here, imip-agent can provide a Web interface to let them respond to
6.25 -invitations and to create and schedule their own events.
6.26 +Here, imip-agent can provide a [[/CalendarManager|Web interface]] to let
6.27 +them respond to invitations and to create and schedule their own events.
6.28 }}}
6.29
6.30 According to your requirements, any or all of the above solutions can be
7.1 --- a/docs/wiki/GettingStarted Wed Oct 28 17:06:44 2015 +0100
7.2 +++ b/docs/wiki/GettingStarted Wed Oct 28 18:08:40 2015 +0100
7.3 @@ -34,6 +34,10 @@
7.4 appropriate locations. You may need to be `root` or use `sudo` to
7.5 successfully use this script.
7.6
7.7 +{{{
7.8 +tools/install.sh
7.9 +}}}
7.10 +
7.11 See the [[../Prerequisites|prerequisites]] for other software that will be
7.12 required for the software to function.
7.13
7.14 @@ -59,16 +63,31 @@
7.15
7.16 The `conf` directory contains subdirectories for different systems:
7.17
7.18 -|| '''Directory''' || '''Description''' ||
7.19 -|| `apache` || Apache 2 site configuration for publishing resources ||
7.20 -|| `cron` || Cron command scheduling for free/busy updates ||
7.21 -|| `exim` || Exim 4 routing and transport configuration ||
7.22 -|| `ldap` || Some LDAP-related resources ||
7.23 -|| `postfix` || Postfix routing and transport configuration ||
7.24 +{{{#!table
7.25 +'''Directory''' || '''Description''' || '''Guide'''
7.26 +==
7.27 +`apache`
7.28 +|| Apache 2 site configuration for publishing resources
7.29 +|| [[../WebServerIntegration|Web Server Integration]]
7.30 +==
7.31 +`cron`
7.32 +|| Cron command scheduling for free/busy updates
7.33 +|| [[../CronIntegration|Cron Task Scheduler Integration]]
7.34 +==
7.35 +`exim`
7.36 +|| Exim 4 routing and transport configuration
7.37 +|| [[../MailIntegration|E-Mail Integration]]
7.38 +==
7.39 +`ldap`
7.40 +|| Some LDAP-related resources
7.41 +||
7.42 +==
7.43 +`postfix`
7.44 +|| Postfix routing and transport configuration
7.45 +|| [[../MailIntegration|E-Mail Integration]]
7.46 +}}}
7.47
7.48 -The configuration activities associated with these directories are covered in
7.49 -the following documents:
7.50 +== Configuring the Software ==
7.51
7.52 - * [[../CronIntegration|Cron Task Scheduler Integration]]
7.53 - * [[../MailIntegration|E-Mail Integration]]
7.54 - * [[../WebServerIntegration|Web Server Integration]]
7.55 +The behaviour of the imip-agent software itself can be configured using
7.56 +mechanisms described in the [[../Configuration|configuration guide]].
8.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
8.2 +++ b/docs/wiki/Preferences Wed Oct 28 18:08:40 2015 +0100
8.3 @@ -0,0 +1,255 @@
8.4 += Preferences =
8.5 +
8.6 +The correspondence between user preferences (stored in user preference
8.7 +directories) and the default settings (stored in `config.py`) is described
8.8 +below.
8.9 +
8.10 +|| '''Preference''' || '''Default Setting''' ||
8.11 +|| `LANG` || `LANG` ||
8.12 +|| `add_method_response` || `ADD_RESPONSE_DEFAULT` ||
8.13 +|| `event_refreshing` || `REFRESHING_DEFAULT` ||
8.14 +|| `freebusy_bundling` || `BUNDLING_DEFAULT` ||
8.15 +|| `freebusy_messages` || `NOTIFYING_DEFAULT` ||
8.16 +|| `freebusy_offers` || `FREEBUSY_OFFER_DEFAULT` ||
8.17 +|| `freebusy_publishing` || `PUBLISHING_DEFAULT` ||
8.18 +|| `freebusy_sharing` || `SHARING_DEFAULT` ||
8.19 +|| `incoming` || `INCOMING_DEFAULT` ||
8.20 +|| `organiser_replacement` || `ORGANISER_REPLACEMENT_DEFAULT` ||
8.21 +|| `participating` || `PARTICIPATING_DEFAULT` ||
8.22 +
8.23 +See the [[../Configuration|configuration guide]] for more information about
8.24 +the `config.py` file.
8.25 +
8.26 +== User Preference Settings ==
8.27 +
8.28 +<<TableOfContents(3,3)>>
8.29 +
8.30 +Each of the user preferences or settings are stored in a separate file within
8.31 +a dedicated preferences directory for each user, with the filename bearing the
8.32 +name of the setting concerned.
8.33 +
8.34 +=== CN ===
8.35 +
8.36 + Default:: (none)
8.37 + Alternatives:: (see below)
8.38 +
8.39 +The common name of the user, employed in iCalendar objects and user
8.40 +interfaces.
8.41 +
8.42 +=== LANG ===
8.43 +
8.44 + Default:: `en` (English)
8.45 + Alternatives:: (any recognised and supported locale)
8.46 +
8.47 +The language for messages and user interface text.
8.48 +
8.49 +=== TZID ===
8.50 +
8.51 + Default:: system timezone (see `/etc/timezone`)
8.52 + Alternatives:: (any recognised Olson time zone identifier)
8.53 +
8.54 +The default time zone/regime for calendars, new events and local times.
8.55 +
8.56 +=== add_method_response ===
8.57 +
8.58 + Default:: `refresh`
8.59 + Alternatives:: (see below)
8.60 +
8.61 +Indicate how `ADD` methods shall be responded to when received by a recipient:
8.62 +
8.63 +{{{#!table
8.64 +`add` || apply them to events as received
8.65 +==
8.66 +`ignore` || ignore attempts to add event occurrences
8.67 +==
8.68 +`refresh` || respond with a `REFRESH` message to obtain a proper request with
8.69 + .. all event details
8.70 +}}}
8.71 +
8.72 +=== event_refreshing ===
8.73 +
8.74 + Default:: `never`
8.75 + Alternative:: `always`
8.76 +
8.77 +Indicate whether messages requesting a refresh of event details shall be
8.78 +handled automatically. If not, such messages will be passed on to the
8.79 +recipient for their mail program to handle.
8.80 +
8.81 +=== freebusy_bundling ===
8.82 +
8.83 + Default:: `never`
8.84 + Alternative:: `always`
8.85 +
8.86 +Indicate whether to bundle free/busy details with other payloads such as
8.87 +event and free/busy objects. The `freebusy_sharing` setting must be
8.88 +configured for bundling to operate.
8.89 +
8.90 +=== freebusy_messages ===
8.91 +
8.92 + Default:: `none`
8.93 + Alternative:: `notify`
8.94 +
8.95 +Indicate whether recipients are notified about received free/busy payloads.
8.96 +
8.97 +=== freebusy_offers ===
8.98 +
8.99 + Default:: (none)
8.100 + Alternative:: (see below)
8.101 +
8.102 +Define the period for which free/busy offers are extended by participants
8.103 +supporting this setting when counter-proposals are made during event
8.104 +scheduling.
8.105 +
8.106 +This setting requires a value indicating a duration as described in the
8.107 +iCalendar format specification:
8.108 +
8.109 +http://tools.ietf.org/html/rfc5545#section-3.3.6
8.110 +
8.111 +For example:
8.112 +
8.113 +|| `PT10M` || extend scheduling offers for 10 minutes ||
8.114 +|| `PT600S` || extend scheduling offers for 600 seconds (10 minutes) ||
8.115 +|| `PT1D` || extend offers for 1 day ||
8.116 +
8.117 +=== freebusy_publishing ===
8.118 +
8.119 + Default:: `no`
8.120 + Alternative:: `publish`
8.121 +
8.122 +Indicate whether to publish free/busy details as Web resources. The
8.123 +`freebusy_sharing` setting must be configured for publishing to operate.
8.124 +
8.125 +=== freebusy_sharing ===
8.126 +
8.127 + Default:: `no`
8.128 + Alternative:: `share`
8.129 +
8.130 +Share free/busy details generally:
8.131 +
8.132 + * bundling in e-mail messages if bundling is configured
8.133 + * responding to free/busy requests via e-mail
8.134 + * publishing as Web resources if a static Web resource is configured and if
8.135 + publishing is configured
8.136 +
8.137 +=== incoming ===
8.138 +
8.139 + Default:: `summary-wraps-message`
8.140 + Alternatives:: (see below)
8.141 +
8.142 +Define how incoming event messages are delivered to recipients:
8.143 +
8.144 +{{{#!table
8.145 +`message-only`
8.146 +|| deliver only the incoming message as it was received
8.147 +==
8.148 +`message-then-summary`
8.149 +|| deliver the message first followed by a summary message
8.150 +==
8.151 +`summary-then-message`
8.152 +|| deliver a summary first followed by the message
8.153 +==
8.154 +`summary-only`
8.155 +|| deliver only a summary of the message
8.156 +==
8.157 +`summary-wraps-message`
8.158 +|| deliver a summary that includes the original message as an attachment
8.159 +}}}
8.160 +
8.161 +=== organiser_replacement ===
8.162 +
8.163 + Default:: `attendee`
8.164 + Alternatives:: (see below)
8.165 +
8.166 +Indicate whether the organiser of an event can be replaced and the nature of
8.167 +any replacement:
8.168 +
8.169 +{{{#!table
8.170 +`any` || any identity, regardless of whether it is already present or even
8.171 + .. previously unknown, may become the organiser
8.172 +==
8.173 +`attendee` || any new organiser must be a previously-recognised attendee
8.174 +==
8.175 +`never` || forbid the replacement of an event's organiser
8.176 +}}}
8.177 +
8.178 +=== participating ===
8.179 +
8.180 + Default:: `participate`
8.181 + Alternative:: `no`
8.182 +
8.183 +Indicate whether a recipient participates in the calendar system. Note that
8.184 +participation by default occurs because the handler programs will be defined
8.185 +in the mail system for recipients fulfilling certain criteria; other
8.186 +recipients will be handled in other ways. Thus, initial non-participation must
8.187 +be defined by initialising this setting to "no" for all eligible users, if
8.188 +this is the general policy on initial calendar system participation.
8.189 +
8.190 +=== permitted_times ===
8.191 +
8.192 + Default:: (none)
8.193 + Alternatives:: (see below)
8.194 +
8.195 +Define the time values at which events can be scheduled. In its simplest form,
8.196 +this indicates the resolution of a calendar for a participant supporting this
8.197 +setting, with the given minute values being those allowed for the start and
8.198 +end of an event. This setting requires a value of one of the following forms:
8.199 +
8.200 +{{{
8.201 +<minute values>
8.202 +<hour values>:<minute values>
8.203 +<hour values>:<minute values>:<second values>
8.204 +}}}
8.205 +
8.206 +Each list of values is a comma-separated collection of permissible values for
8.207 +the unit of time being constrained. Any unspecified list is taken to permit
8.208 +all normally permissible values for that unit of time. For example:
8.209 +
8.210 +{{{#!table
8.211 +`0,15,30,45` || every 15 minutes from the start of each hour
8.212 +==
8.213 +`10,12,14,16:0,20,40` || every 20 minutes from 10:00 until 16:40 inclusive
8.214 +==
8.215 +`12::0,30` || every 30 seconds from the start of each minute
8.216 + .. during the period from 12:00:00 until 12:59:30
8.217 + .. inclusive
8.218 +}}}
8.219 +
8.220 +The purpose of this setting is not necessarily to impose availability
8.221 +constraints but instead to impose a "grid" to which event start and end points
8.222 +shall be "locked".
8.223 +
8.224 +The values are interpreted in the local time of the participant. Thus, a time
8.225 +represented in UTC may have apparently inappropriate hour (and for some zones)
8.226 +minute values that correspond to permitted values in this participant's own
8.227 +time zone.
8.228 +
8.229 +=== scheduling_function ===
8.230 +
8.231 + Default:: `schedule_in_freebusy`
8.232 + Alternatives:: (see below)
8.233 +
8.234 +Indicates the scheduling function used by resources to find an appropriate
8.235 +period for an event. The `imiptools.handlers.scheduling` module contains the
8.236 +built-in scheduling functions which include the following:
8.237 +
8.238 +{{{#!table
8.239 +`schedule_in_freebusy` || accept an invitation if the event periods are free
8.240 + .. according to the free/busy records for the resource;
8.241 + .. decline otherwise
8.242 +==
8.243 +`schedule_corrected_in_freebusy` || correct periods in an event according to
8.244 + .. the permitted_times setting (see above),
8.245 + .. then attempt to schedule the event according to the
8.246 + .. free/busy records for the resource
8.247 +==
8.248 +`schedule_next_available_in_freebusy` || correct periods in an event according
8.249 + .. to the permitted_times setting (see
8.250 + .. above), if configured, and attempt to schedule the
8.251 + .. event according to the free/busy records for the
8.252 + .. resource and for any attendees for whom records are
8.253 + .. available, seeking the next available free period for
8.254 + .. each period that conflicts with an existing event
8.255 +}}}
8.256 +
8.257 +The scheduling mechanism can be extended by implementing additional scheduling
8.258 +functions or by extending the handler framework directly.
9.1 --- a/docs/wiki/WebServerIntegration Wed Oct 28 17:06:44 2015 +0100
9.2 +++ b/docs/wiki/WebServerIntegration Wed Oct 28 18:08:40 2015 +0100
9.3 @@ -3,13 +3,13 @@
9.4 Although imip-agent is mostly concerned with e-mail messaging, it can
9.5 integrate with a Web server for the following purposes:
9.6
9.7 - * To publish free/busy information for calendar users
9.8 - * To provide a management interface for calendar users
9.9 + * To [[../FreeBusyPublishing|publish free/busy information]] for calendar users
9.10 + * To provide a [[../CalendarManager|management interface]] for calendar users
9.11
9.12 Currently, imip-agent provides configuration files for Apache, but other Web
9.13 servers may also be supported.
9.14
9.15 -== Authentication and Access Control ==
9.16 +== Authentication and Access Control in Apache ==
9.17
9.18 Apache supports a range of mechanisms for protecting resources and
9.19 authenticating users. Most usefully for imip-agent given the
9.20 @@ -17,3 +17,43 @@
9.21 [[http://httpd.apache.org/docs/2.4/mod/mod_authnz_ldap.html|LDAP]] and
9.22 [[http://httpd.apache.org/docs/2.4/mod/mod_auth_basic.html|text-based lists]]
9.23 of users are available for such purposes.
9.24 +
9.25 +== Configuring Web Servers for Free/Busy Publishing ==
9.26 +
9.27 +Each user may request the [[../FreeBusyPublishing|publishing]] of their
9.28 +free/busy information by configuring certain settings. The
9.29 +`conf/apache/imip-agent.conf` file provides a configuration file for
9.30 +deployment with the Apache Web server software that exposes a directory for
9.31 +Web publishing containing the published free/busy information.
9.32 +
9.33 +Access to free/busy information may not be moderated, but Web server
9.34 +directives can be introduced to impose access controls. Mail programs that
9.35 +wish to consult the free/busy information may have problems in dealing with
9.36 +authentication mechanisms, however, and it may be regarded as acceptable in
9.37 +certain environments to expose such information publicly or with
9.38 +network-specific access constraints.
9.39 +
9.40 +== Configuring Web Servers for the Calendar Management Interface ==
9.41 +
9.42 +A [[../CalendarManager|calendar management interface]] is provided to allow
9.43 +users to view and interact with their calendars through the Web. The
9.44 +`conf/apache/imip-manager.conf` file provides a configuration file for
9.45 +deployment with the Apache Web server software that enables this interface.
9.46 +
9.47 +The management interface is deployed as a CGI program, meaning that a suitable
9.48 +module must be enabled in the Apache configuration. On Debian, this is done as
9.49 +follows:
9.50 +
9.51 +{{{
9.52 +a2enmod cgi
9.53 +}}}
9.54 +
9.55 +Since such access to calendars should only be performed by identified
9.56 +users, access controls are suggested in the configuration file. Modules
9.57 +providing additional authentication support may need to be enabled. For
9.58 +example, on Debian, the LDAP authentication/authorisation support is enabled
9.59 +as follows:
9.60 +
9.61 +{{{
9.62 +a2enmod authnz_ldap
9.63 +}}}