| 
									
										
										
										
											2008-09-16 15:53:46 -04:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Laconica, the distributed open-source microblogging tool | 
					
						
							| 
									
										
										
										
											2008-09-16 15:53:46 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |  * common superclass for direct messages inbox and outbox | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * LICENCE: This program is free software: you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2008-09-16 15:53:46 -04:00
										 |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2008-12-22 15:13:04 -05:00
										 |  |  |  * @category  Message | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |  * @package   Laconica | 
					
						
							|  |  |  |  * @author    Evan Prodromou <evan@controlyourself.ca> | 
					
						
							|  |  |  |  * @copyright 2008 Control Yourself, Inc. | 
					
						
							|  |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link      http://laconi.ca/ | 
					
						
							| 
									
										
										
										
											2008-09-16 15:53:46 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  | if (!defined('LACONICA')) { | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-09-16 15:53:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  | require_once INSTALLDIR.'/lib/personal.php'; | 
					
						
							| 
									
										
										
										
											2008-09-16 15:53:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | define('MESSAGES_PER_PAGE', 20); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  | /** | 
					
						
							|  |  |  |  * common superclass for direct messages inbox and outbox | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2008-12-22 15:13:04 -05:00
										 |  |  |  * @category Message | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |  * @package  Laconica | 
					
						
							|  |  |  |  * @author   Evan Prodromou <evan@controlyourself.ca> | 
					
						
							|  |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link     http://laconi.ca/ | 
					
						
							|  |  |  |  * @see      InboxAction | 
					
						
							|  |  |  |  * @see      OutboxAction | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class MailboxAction extends PersonalAction | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |     var $page = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function prepare($args)  | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         parent::prepare($args); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $nickname   = common_canonical_nickname($this->arg('nickname')); | 
					
						
							|  |  |  |         $this->user = User::staticGet('nickname', $nickname); | 
					
						
							|  |  |  |         $this->page = $this->trimmed('page'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!$this->page) { | 
					
						
							|  |  |  |             $this->page = 1; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-05 16:16:10 -08:00
										 |  |  |         common_set_returnto($this->selfUrl()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * output page based on arguments | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param array $args HTTP arguments (from $_REQUEST) | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function handle($args) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         parent::handle($args); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |         if (!$this->user) { | 
					
						
							|  |  |  |             $this->clientError(_('No such user.'), 404); | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $cur = common_current_user(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |         if (!$cur || $cur->id != $this->user->id) { | 
					
						
							|  |  |  |             $this->clientError(_('Only the user can read their own mailboxes.'), | 
					
						
							|  |  |  |                 403); | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |         $this->showPage(); | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |     function showLocalNav() | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |         $nav = new PersonalGroupNav($this); | 
					
						
							|  |  |  |         $nav->show(); | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |     function showNoticeForm() | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |         $message_form = new MessageForm($this); | 
					
						
							|  |  |  |         $message_form->show(); | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |     function showContent() | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |         $message = $this->getMessages(); | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if ($message) { | 
					
						
							|  |  |  |             $cnt = 0; | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  |             $this->elementStart('div', array('id' =>'notices_primary')); | 
					
						
							|  |  |  |             $this->element('h2', null, _('Notices')); | 
					
						
							|  |  |  |             $this->elementStart('ul', 'notices'); | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |             while ($message->fetch() && $cnt <= MESSAGES_PER_PAGE) { | 
					
						
							|  |  |  |                 $cnt++; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if ($cnt > MESSAGES_PER_PAGE) { | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 15:13:04 -05:00
										 |  |  |                 $this->showMessage($message); | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |             $this->elementEnd('ul'); | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |             $this->pagination($this->page > 1, $cnt > MESSAGES_PER_PAGE, | 
					
						
							|  |  |  |                               $this->page, $this->trimmed('action'), | 
					
						
							|  |  |  |                               array('nickname' => $this->user->nickname)); | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  |             $this->elementEnd('div'); | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |             $message->free(); | 
					
						
							|  |  |  |             unset($message); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |     function getMessages() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return null; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * returns the profile we want to show with the message | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * For inboxes, we show the sender; for outboxes, the recipient. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Message $message The message to get the profile for | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Profile The profile that matches the message | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 15:13:04 -05:00
										 |  |  |     function getMessageProfile($message) | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         return null; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * show a single message in the list format | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |      * XXX: This needs to be extracted out into a MessageList similar | 
					
						
							|  |  |  |      * to NoticeList. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |      * @param Message $message the message to show | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 15:13:04 -05:00
										 |  |  |     function showMessage($message) | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  |         $this->elementStart('li', array('class' => 'hentry notice', | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |                                          'id' => 'message-' . $message->id)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 15:13:04 -05:00
										 |  |  |         $profile = $this->getMessageProfile($message); | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  |         $this->elementStart('div', 'entry-title'); | 
					
						
							|  |  |  |         $this->elementStart('span', 'vcard author'); | 
					
						
							|  |  |  |         $this->elementStart('a', array('href' => $profile->profileurl, | 
					
						
							|  |  |  |                                        'class' => 'url')); | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |         $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE); | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |         $this->element('img', array('src' => ($avatar) ? | 
					
						
							| 
									
										
										
										
											2009-02-06 03:13:08 -05:00
										 |  |  |                                     $avatar->displayUrl() : | 
					
						
							|  |  |  |                                     Avatar::defaultImage(AVATAR_STREAM_SIZE), | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  |                                     'class' => 'photo avatar', | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |                                     'width' => AVATAR_STREAM_SIZE, | 
					
						
							|  |  |  |                                     'height' => AVATAR_STREAM_SIZE, | 
					
						
							|  |  |  |                                     'alt' => | 
					
						
							|  |  |  |                                     ($profile->fullname) ? $profile->fullname : | 
					
						
							|  |  |  |                                     $profile->nickname)); | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  |         $this->element('span', array('class' => 'nickname fn'), | 
					
						
							|  |  |  |                             $profile->nickname); | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |         $this->elementEnd('a'); | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  |         $this->elementEnd('span'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |         // FIXME: URL, image, video, audio
 | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  |         $this->elementStart('p', array('class' => 'entry-content')); | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |         $this->raw($message->rendered); | 
					
						
							|  |  |  |         $this->elementEnd('p'); | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  |         $this->elementEnd('div'); | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $messageurl = common_local_url('showmessage', | 
					
						
							|  |  |  |                                        array('message' => $message->id)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // XXX: we need to figure this out better. Is this right?
 | 
					
						
							|  |  |  |         if (strcmp($message->uri, $messageurl) != 0 && | 
					
						
							|  |  |  |             preg_match('/^http/', $message->uri)) { | 
					
						
							|  |  |  |             $messageurl = $message->uri; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->elementStart('div', 'entry-content'); | 
					
						
							|  |  |  |         $this->elementStart('dl', 'timestamp'); | 
					
						
							|  |  |  |         $this->element('dt', null, _('Published')); | 
					
						
							|  |  |  |         $this->elementStart('dd', null); | 
					
						
							|  |  |  |         $dt = common_date_iso8601($message->created); | 
					
						
							|  |  |  |         $this->elementStart('a', array('rel' => 'bookmark', | 
					
						
							|  |  |  |                                        'href' => $messageurl)); | 
					
						
							|  |  |  |         $this->element('abbr', array('class' => 'published', | 
					
						
							|  |  |  |                                      'title' => $dt), | 
					
						
							|  |  |  |                                common_date_string($message->created)); | 
					
						
							|  |  |  |         $this->elementEnd('a'); | 
					
						
							|  |  |  |         $this->elementEnd('dd'); | 
					
						
							|  |  |  |         $this->elementEnd('dl'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |         if ($message->source) { | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  |             $this->elementStart('dl', 'device'); | 
					
						
							|  |  |  |             $this->elementStart('dt'); | 
					
						
							|  |  |  |             $this->text(_('From')); | 
					
						
							|  |  |  |             $this->elementEnd('dt'); | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |             $this->showSource($message->source); | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  |             $this->elementEnd('dl'); | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  |         $this->elementEnd('div'); | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |         $this->elementEnd('li'); | 
					
						
							| 
									
										
										
										
											2008-12-22 14:50:41 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Show the page notice | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Shows instructions for the page | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function showPageNotice() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $instr  = $this->getInstructions(); | 
					
						
							|  |  |  |         $output = common_markup_to_html($instr); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->elementStart('div', 'instructions'); | 
					
						
							|  |  |  |         $this->raw($output); | 
					
						
							|  |  |  |         $this->elementEnd('div'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Show the source of the message | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Returns either the name (and link) of the API client that posted the notice, | 
					
						
							|  |  |  |      * or one of other other channels. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $source the source of the message  | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function showSource($source)  | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $source_name = _($source); | 
					
						
							|  |  |  |         switch ($source) { | 
					
						
							|  |  |  |         case 'web': | 
					
						
							|  |  |  |         case 'xmpp': | 
					
						
							|  |  |  |         case 'mail': | 
					
						
							|  |  |  |         case 'omb': | 
					
						
							|  |  |  |         case 'api': | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  |             $this->element('dd', null, $source_name); | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             $ns = Notice_source::staticGet($source); | 
					
						
							|  |  |  |             if ($ns) { | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  |                 $this->elementStart('dd', null); | 
					
						
							|  |  |  |                 $this->element('a', array('href' => $ns->url, | 
					
						
							|  |  |  |                                           'rel' => 'external'), | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |                                $ns->name); | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  |                 $this->elementEnd('dd'); | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2009-01-21 05:27:16 +00:00
										 |  |  |                 $this->element('dd', null, $source_name); | 
					
						
							| 
									
										
										
										
											2009-01-20 17:49:47 -08:00
										 |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-16 15:53:46 -04:00
										 |  |  | } |