From d41252133fa2f45c512c2c723414496b0aa5945d Mon Sep 17 00:00:00 2001 From: pluslive Date: Tue, 28 Aug 2012 18:44:46 +0900 Subject: [PATCH 001/339] =?UTF-8?q?+live=20111106.1230=20=E3=82=92Merge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 1 + conf/conf_user_def.inc.php | 5 + conf/conf_user_def_live.inc.php | 71 + conf/conf_user_style.inc.php | 13 + lib/NgAbornCtl.php | 10 + lib/ShowThread.php | 43 +- lib/ShowThreadPc.php | 128 +- lib/live/default_view.inc.php | 81 ++ lib/live/live_ShowThread.php | 2050 +++++++++++++++++++++++++++ lib/live/live_ShowThreadPc.php | 1999 ++++++++++++++++++++++++++ lib/live/live_header.inc.php | 84 ++ lib/live/live_highlight_check.php | 48 + lib/live/live_highlight_convert.php | 45 + lib/live/live_post_form.inc.php | 173 +++ lib/live/live_view.inc.php | 106 ++ lib/live/live_view_ctl.inc.php | 112 ++ lib/read_footer.inc.php | 24 + lib/read_header.inc.php | 45 +- lib/sb_print.inc.php | 17 +- rep2/edit_aborn_word.php | 6 +- rep2/edit_conf_user.php | 82 +- rep2/editpref.php | 26 +- rep2/img/live.png | Bin 0 -> 364 bytes rep2/img/re.png | Bin 0 -> 369 bytes rep2/info_sp.php | 47 +- rep2/js/live_htmlpopup.js | 169 +++ rep2/js/live_htmlpopup_resizable.js | 356 +++++ rep2/js/preview_video_half.js | 98 ++ rep2/js/smartpopup.js | 11 +- rep2/live_control.php | 52 + rep2/live_frame.php | 74 + rep2/live_post.php | 1000 +++++++++++++ rep2/live_post_form.php | 212 +++ rep2/live_read.php | 532 +++++++ rep2/read.php | 24 + rep2/read_new.php | 14 +- rep2/skin/blackboard.php | 13 + rep2/skin/classicWP.php | 13 + rep2/skin/flat.php | 13 + rep2/skin/flat2.php | 13 + rep2/skin/live.php | 257 ++++ rep2/skin/live/bg.gif | Bin 0 -> 43 bytes rep2/skin/live2.php | 257 ++++ rep2/skin/live_box.php | 413 ++++++ rep2/skin/live_box2.php | 413 ++++++ rep2/skin/metal.php | 13 + rep2/skin/tangerine.php | 13 + rep2/title.php | 7 +- style/read_css.inc | 12 +- 49 files changed, 9100 insertions(+), 95 deletions(-) create mode 100755 conf/conf_user_def_live.inc.php create mode 100755 lib/live/default_view.inc.php create mode 100755 lib/live/live_ShowThread.php create mode 100755 lib/live/live_ShowThreadPc.php create mode 100755 lib/live/live_header.inc.php create mode 100755 lib/live/live_highlight_check.php create mode 100755 lib/live/live_highlight_convert.php create mode 100755 lib/live/live_post_form.inc.php create mode 100755 lib/live/live_view.inc.php create mode 100755 lib/live/live_view_ctl.inc.php mode change 100644 => 100755 lib/read_header.inc.php create mode 100755 rep2/img/live.png create mode 100755 rep2/img/re.png create mode 100755 rep2/js/live_htmlpopup.js create mode 100755 rep2/js/live_htmlpopup_resizable.js create mode 100755 rep2/js/preview_video_half.js create mode 100755 rep2/live_control.php create mode 100755 rep2/live_frame.php create mode 100755 rep2/live_post.php create mode 100755 rep2/live_post_form.php create mode 100755 rep2/live_read.php mode change 100644 => 100755 rep2/read_new.php create mode 100755 rep2/skin/live.php create mode 100755 rep2/skin/live/bg.gif create mode 100755 rep2/skin/live2.php create mode 100755 rep2/skin/live_box.php create mode 100755 rep2/skin/live_box2.php diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 937a711de..aaf4e8852 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -10,6 +10,7 @@ 'p2expack' => '120300.9999', // 拡張パックのバージョン 'p2name' => 'expack', // rep2の名前 'p2custom' => '0', // カスタムバージョン + 'p2live' => '120824.0000', // +liveのバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}+{$_conf['p2expack']}"; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 1afa95b2c..644e4fe4f 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -501,6 +501,11 @@ include P2_CONFIG_DIR . '/conf_user_def_wiki.inc.php'; +// }}} +// {{{ +live + +include P2_CONFIG_DIR . '/conf_user_def_live.inc.php'; + // }}} /* diff --git a/conf/conf_user_def_live.inc.php b/conf/conf_user_def_live.inc.php new file mode 100755 index 000000000..b42464f73 --- /dev/null +++ b/conf/conf_user_def_live.inc.php @@ -0,0 +1,71 @@ + '常にデフォルト表示', '1' => '実況時のみ実況用表示', '2' => '常に実況用表示'); + +// ID末尾の O (携帯) P (公式p2) Q (フルブラウザ) I (iPhone) を太字に +$conf_user_def['live.id_b'] = 0; // (0) +$conf_user_rad['live.id_b'] = array('1' => 'する', '0' => 'しない'); + +// 連鎖ハイライト (表示範囲のレスのみに連鎖) +$conf_user_def['live.highlight_chain'] = 0; // (0) +$conf_user_rad['live.highlight_chain'] = array('1' => 'する', '0' => 'しない'); + +// YouTubeプレビュー表示のサイズ +$conf_user_def['live.youtube_winsize'] = 0; // (0) +$conf_user_sel['live.youtube_winsize'] = array('0' => 'ノーマルサイズ', '1' => 'ハーフサイズ'); + +// }}} +// {{{ ■実況中設定 + +// 表示するレス数 (100以下推奨) +$conf_user_def['live.before_respointer'] = "50"; // ("50") + +// 下部書込フレームの高さ (px) +$conf_user_def['live.post_width'] = "85"; // ("85") + +// デフォルトの名無しの表示 +$conf_user_def['live.bbs_noname'] = 0; // (0) +$conf_user_rad['live.bbs_noname'] = array('1' => 'する', '0' => 'しない'); + +// sage を ▼ に +$conf_user_def['live.mail_sage'] = 1; // (1) +$conf_user_rad['live.mail_sage'] = array('1' => 'する', '0' => 'しない'); + +// 全ての改行とスペースの削除 +$conf_user_def['live.msg'] = 1; // (1) +$conf_user_rad['live.msg'] = array('1' => 'する', '0' => 'しない'); + +// [これにレス] の方法 +$conf_user_def['live.res_button'] = 0; // (0) +$conf_user_sel['live.res_button'] = array('0' => '[ re: ] ボタン', '1' => '両方', '2' => '内容をダブルクリック'); + +// 書込規制用タイマー +$conf_user_def['live.write_regulation'] = 0; // (0) +$conf_user_sel['live.write_regulation'] = array('0' => 'タイマー無し', '1' => '15秒', '2' => '20秒', '3' => '30秒', '4' => '40秒', '5' => '50秒', '6' => '1分'); + +// ImageCache2のサムネイル作成 +$conf_user_def['live.ic2_onoff'] = "1"; // ("1") +$conf_user_rad['live.ic2_onoff'] = array('1' => 'on', '0' => 'off'); + +// }}} +// {{{ ■リロード/スクロール + +// オートリロードの間隔 +$conf_user_def['live.reload_time'] = 2; // (2) +$conf_user_sel['live.reload_time'] = array('0' => 'リロード無し', '1' => '5秒', '2' => '10秒', '3' => '15秒', '4' => '20秒'); + +// オートスクロールの滑らかさ (最も滑らか 1 、スクロール無し 0) +$conf_user_def['live.scroll_move'] = 3; // (3) + +// オートスクロールの速度 (最速 1 、スクロール無しの場合は上の滑らかさの値を 0 に) +$conf_user_def['live.scroll_speed'] = 10; // (10) + +// }}} +?> diff --git a/conf/conf_user_style.inc.php b/conf/conf_user_style.inc.php index 13848b2cd..53634e6c7 100644 --- a/conf/conf_user_style.inc.php +++ b/conf/conf_user_style.inc.php @@ -151,6 +151,19 @@ $STYLE['mobile_read_ngword_color'] = "#bbbbbb"; // ("#bbbbbb") $STYLE['mobile_read_onthefly_color'] = "#00aa00"; // ("#00aa00") +// }}} +// {{{ +live 実況モード + +$STYLE['live_b_l'] = "1px #999 dotted"; // ("1px #999 dotted") +live レス間の仕切線 +$STYLE['live_b_s'] = "1px #999 dotted"; // ("1px #999 dotted") +live 番号 目欄 名前 日付 ID 表示部とレス表示部の仕切線 +$STYLE['live_b_n'] = "2px #f30 dotted"; // ("2px #f30 dotted") +live 実況表示&オートリロード時の既読〜新着の仕切線 +$STYLE['live_highlight'] = "#cff"; // ("#cff") +live ハイライトワード表示時の背景色 +$STYLE['live_highlight_chain'] = "#ffc"; // ("#ffc") +live 連鎖ハイライト表示時の背景色 +$STYLE['live_highlight_word_weight'] = "bold"; // ("bold") +live 連鎖ハイライト表示時のフォントの太さ +$STYLE['live_highlight_word_border'] = "3px #f30 double"; // ("3px #f30 double") +live 連鎖ハイライト表示時のアンダーライン +$STYLE['live_font-size'] = "10px"; // ("10px") +live 番号 目欄 名前 日付 ID 欄のフォントサイズ +$STYLE['live2_color'] = "#ddd"; // ("#ddd") +live Type-Bの 番号 目欄 名前 日付 ID 表示部の背景色 + // }}} /* diff --git a/lib/NgAbornCtl.php b/lib/NgAbornCtl.php index 6c49767e1..c16402b8f 100644 --- a/lib/NgAbornCtl.php +++ b/lib/NgAbornCtl.php @@ -20,6 +20,11 @@ 'ng_mail' => 0, 'ng_msg' => 0, 'ng_name' => 0, + 'highlight_chain' => 0, + 'highlight_id' => 0, + 'highlight_mail' => 0, + 'highlight_msg' => 0, + 'highlight_name' => 0, ); // }}} @@ -172,6 +177,11 @@ static public function loadNgAborns() // +Wiki $ngaborns['aborn_be'] = self::_readNgAbornFromFile('p2_aborn_be.txt'); $ngaborns['ng_be'] = self::_readNgAbornFromFile('p2_ng_be.txt'); + // +live + $ngaborns['highlight_name'] = self::_readNgAbornFromFile('p2_highlight_name.txt'); + $ngaborns['highlight_mail'] = self::_readNgAbornFromFile('p2_highlight_mail.txt'); + $ngaborns['highlight_msg'] = self::_readNgAbornFromFile('p2_highlight_msg.txt'); + $ngaborns['highlight_id'] = self::_readNgAbornFromFile('p2_highlight_id.txt'); return $ngaborns; } diff --git a/lib/ShowThread.php b/lib/ShowThread.php index cb60b032d..f367843cc 100644 --- a/lib/ShowThread.php +++ b/lib/ShowThread.php @@ -65,6 +65,14 @@ abstract class ShowThread const NG_CHAIN = 32; const NG_AA = 64; + // +live ハイライトワード用 + const HIGHLIGHT_NONE = 128; + const HIGHLIGHT_NAME = 256; + const HIGHLIGHT_MAIL = 512; + const HIGHLIGHT_ID = 1024; + const HIGHLIGHT_MSG = 2048; + const HIGHLIGHT_CHAIN = 4096; + // }}} // {{{ static properties @@ -89,6 +97,9 @@ abstract class ShowThread */ static protected $_ngaborns_body_hits = 0; + static protected $_highlight_head_hits = 0; // 本文以外がハイライトにヒットした総数 + static protected $_highlight_body_hits = 0; // 本文がハイライトにヒットした総数 + /** * getAnchorRegex() のキャッシュ * @@ -152,6 +163,9 @@ abstract class ShowThread protected $_aborn_nums; protected $_ng_nums; + protected $_highlight_nums; // ハイライトレス番号を格納する配列 + protected $_highlight_msgs; // ハイライトメッセージを格納する配列 + /** * リダイレクタの種類 * @@ -323,6 +337,9 @@ protected function __construct(ThreadRead $aThread, $matome = false) $this->_aborn_nums = array(); $this->_ng_nums = array(); + $this->_highlight_nums = array(); + $this->_highlight_msgs = array(); + if (P2Util::isHostBbsPink($this->thread->host)) { $this->_redirector = self::REDIRECTOR_PINKTOWER; } elseif (P2Util::isHost2chs($this->thread->host)) { @@ -695,7 +712,7 @@ public function replaceBeId($date_id, $i) */ protected function _ngAbornCheck($i, $name, $mail, $date_id, $id, $msg, $nong = false, &$info = null) { - global $_conf, $ngaborns_hits; + global $_conf, $ngaborns_hits, $highlight_msgs, $highlight_chain_nums; $info = array(); $type = self::NG_NONE; @@ -818,6 +835,9 @@ protected function _ngAbornCheck($i, $name, $mail, $date_id, $id, $msg, $nong = p2h($a_ng_msg)); } + // +live ハイライトチェック + include P2_LIB_DIR . '/live/live_highlight_check.php'; + // }}} return $type; @@ -858,6 +878,26 @@ protected function _markNgAborn($num, $type, $isBody) } // }}} + // {{{ _markHighlight() + + // +live ハイライトにヒットしたレス番号を記録する + protected function _markHighlight($num, $type, $isBody) + { + if ($type) { + if ($isBody) { + self::$_highlight_body_hits++; + } else { + self::$_highlight_head_hits++; + } + + $str = (string)$num; + $this->_highlight_nums[$num] = $str; + } + + return $type; + } + + // }}} // {{{ ngAbornCheck() /** @@ -1026,6 +1066,7 @@ public function stripLineBreaks($msg, $replacement = '

') { if (P2_MBREGEX_AVAILABLE) { $msg = mb_ereg_replace('(?:[\\s ]*
)+[\\s ]*$', '', $msg); + $msg = mb_ereg_replace('(?:^[\\s ]*
)+[\\s ]*', '', $msg); $msg = mb_ereg_replace('(?:[\\s ]*
){3,}', $replacement, $msg); } else { mb_convert_variables('UTF-8', 'CP932', $msg, $replacement); diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index 33187a336..45a7e60cb 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -13,6 +13,8 @@ class ShowThreadPc extends ShowThread { + var $BBS_NONAME_NAME = ''; // +live (live.bbs_noname) 用 + // {{{ properties static private $_spm_objects = array(); @@ -44,6 +46,20 @@ public function __construct($aThread, $matome = false) 'plugin_linkThread', 'plugin_link2chSubject', ); + + // +live (live.bbs_noname) 用 + if ($_GET['live']) { + if (empty($_conf['live.bbs_noname'])) { + require_once P2_LIB_DIR . '/SettingTxt.php'; + $st = new SettingTxt($this->thread->host, $this->thread->bbs); + $st->setSettingArray(); + if (!empty($st->setting_array['BBS_NONAME_NAME'])) { + $this->BBS_NONAME_NAME = $st->setting_array['BBS_NONAME_NAME']; + } + } + + } + // +Wiki if (isset($GLOBALS['linkPluginCtl'])) { $this->_url_handlers[] = 'plugin_linkPlugin'; @@ -118,7 +134,7 @@ public function __construct($aThread, $matome = false) */ public function transRes($ares, $i, $pattern = null) { - global $_conf, $STYLE, $mae_msg; + global $_conf, $STYLE, $mae_msg, $highlight_msgs, $highlight_chain_nums; list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($ares); if (($id = $this->thread->ids[$i]) !== null) { @@ -137,6 +153,11 @@ public function transRes($ares, $i, $pattern = null) $msg = $replaceWordCtl->replace('msg', $this->thread, $ares, $i); } + // +live (live.bbs_noname) 用 + if (!empty($this->BBS_NONAME_NAME) and $this->BBS_NONAME_NAME == $name) { + $name = ''; + } + $tores = ''; $rpop = ''; if ($this->_matome) { @@ -158,6 +179,12 @@ public function transRes($ares, $i, $pattern = null) $ngaborns_body_hits = self::$_ngaborns_body_hits; } + // +live ハイライトチェック + if ($ng_type != self::HIGHLIGHT_NONE) { + $highlight_head_hits = self::$_highlight_head_hits; + $highlight_body_hits = self::$_highlight_body_hits; + } + // AA判定 if ($this->am_autodetect && $this->activeMona->detectAA($msg)) { $msg_class .= ' ActiveMona'; @@ -240,6 +267,9 @@ public function transRes($ares, $i, $pattern = null) } + // +live ハイライトワード変換 + include P2_LIB_DIR . '/live/live_highlight_convert.php'; + /* //「ここから新着」画像を挿入 if ($i == $this->thread->readnum +1) { @@ -257,75 +287,9 @@ public function transRes($ares, $i, $pattern = null) $spmeh = ''; } - if ($_conf['backlink_block'] > 0) { - // 被参照ブロック表示用にonclickを設定 - $tores .= "
\n"; - } else { - $tores .= "
\n"; - } - $tores .= "
"; - - if ($this->thread->onthefly) { - $GLOBALS['newres_to_show_flag'] = true; - //番号(オンザフライ時) - $tores .= "{$i} : "; - } elseif ($i > $this->thread->readnum) { - $GLOBALS['newres_to_show_flag'] = true; - // 番号(新着レス時) - $tores .= "{$i} : "; - } elseif ($_conf['expack.spm.enabled']) { - // 番号(SPM) - $tores .= "{$i} : "; - } else { - // 番号 - $tores .= "{$i} : "; - } - // 名前 - $tores .= preg_replace('{[ ]*}i', '', "{$name} : "); - - // メール - if ($mail) { - if (strpos($mail, 'sage') !== false && $STYLE['read_mail_sage_color']) { - $tores .= "{$mail} : "; - } elseif ($STYLE['read_mail_color']) { - $tores .= "{$mail} : "; - } else { - $tores .= $mail . ' : '; - } - } - - // IDフィルタ - if ($_conf['flex_idpopup'] == 1 && $id && $this->thread->idcount[$id] > 1) { - $date_id = str_replace($idstr, $this->idFilter($idstr, $id), $date_id); - } - - $tores .= $date_id; // 日付とID - if ($this->am_side_of_id) { - $tores .= ' ' . $this->activeMona->getMona($msg_id); - } - $tores .= "
\n"; // res-headerを閉じる - - // 被レスリスト(縦形式) - if ($_conf['backlink_list'] == 1 || $_conf['backlink_list'] > 2) { - $tores .= $this->_quotebackListHtml($i, 1); - } - - $tores .= "
{$msg}
\n"; // 内容 - // 被レス展開用ブロック - if ($_conf['backlink_block'] > 0) { - $backlinks = $this->_getBacklinkComment($i); - if (strlen($backlinks)) { - $tores .= '
'; - $tores .= $backlinks; - } - } - // 被レスリスト(横形式) - if ($_conf['backlink_list'] == 2 || $_conf['backlink_list'] > 2) { - $tores .= $this->_quotebackListHtml($i, 2, false); - } - $tores .= "
\n"; + // +live スレッド内容表示切替 + include P2_LIB_DIR . '/live/live_view_ctl.inc.php'; -// $tores .= $rpop; // レスポップアップ用引用 /*if ($_conf['expack.am.enabled'] == 2) { $tores .= << @@ -453,9 +417,14 @@ public function qRes($ares, $i) // $toresにまとめて出力 $tores .= '
'; $tores .= "{$i} : "; // 番号 - $tores .= preg_replace('{[ ]*}i', '', "{$name} : "); + $tores .= preg_replace('{[ ]*}i', '', "{$name} : "); if ($mail) { - $tores .= $mail . ' : '; // メール + // メール + if (preg_match ("(^[\\s ]*sage[\\s ]*$)", $mail)) { + $tores .= "$mail"." :"; + } else { + $tores .= "$mail"." :"; + } } $tores .= $date_id; // 日付とID if ($this->am_side_of_id) { @@ -1345,6 +1314,13 @@ public function plugin_linkYouTube($url, $purl, $str) { global $_conf; + // +live YouTubeプレビュー表示のサイズ指定 + if ($_conf['live.youtube_winsize'] == 1) { + $youtube_winsize = "width=\"212\" height=\"175\""; // ハーフ + } else { + $youtube_winsize = "width=\"425\" height=\"350\""; // ノーマル + } + // http://www.youtube.com/watch?v=Mn8tiFnAUAI // http://m.youtube.com/watch?v=OhcX0xJsDK8&client=mv-google&gl=JP&hl=ja&guid=ON&warned=True if (preg_match('{^http://(www|jp|m)\\.youtube\\.com/watch\\?(?:.+&)?v=([0-9a-zA-Z_\\-]+)}', $url, $m)) { @@ -1355,6 +1331,8 @@ public function plugin_linkYouTube($url, $purl, $str) $link_url = $url; } + $link_url = $link_url . "&fmt=18"; // 高画質用 + // HTMLポップアップ if ($_conf['iframe_popup']) { $link = $this->iframePopup($link_url, $str, $_conf['ext_win_target_at']); @@ -1371,7 +1349,13 @@ public function plugin_linkYouTube($url, $purl, $str) EOP; } else { return <<
+{$link}
+ + + + + +
EOP; } } diff --git a/lib/live/default_view.inc.php b/lib/live/default_view.inc.php new file mode 100755 index 000000000..1e416996f --- /dev/null +++ b/lib/live/default_view.inc.php @@ -0,0 +1,81 @@ + 0) { + // 被参照ブロック表示用にonclickを設定 + $tores .= "
\n"; + } else { + $tores .= "
\n"; + } + $tores .= "
"; + + if ($this->thread->onthefly) { + $GLOBALS['newres_to_show_flag'] = true; + //番号(オンザフライ時) + $tores .= "{$i} : "; + } elseif ($i > $this->thread->readnum) { + $GLOBALS['newres_to_show_flag'] = true; + // 番号(新着レス時) + $tores .= "{$i} : "; + } elseif ($_conf['expack.spm.enabled']) { + // 番号(SPM) + $tores .= "{$i} : "; + } else { + // 番号 + $tores .= "{$i} : "; + } + +// レスボタン +if ($_GET['live']) { + $tores .= "$res_button"; +} + + // 名前 + $tores .= preg_replace('{[ ]*}i', '', "{$name} : "); + + // メール + if ($mail) { + if (strpos($mail, 'sage') !== false && $STYLE['read_mail_sage_color']) { + $tores .= "{$mail} : "; + } elseif ($STYLE['read_mail_color']) { + $tores .= "{$mail} : "; + } else { + $tores .= $mail . ' : '; + } + } + + // IDフィルタ + if ($_conf['flex_idpopup'] == 1 && $id && $this->thread->idcount[$id] > 1) { + $date_id = str_replace($idstr, $this->idFilter($idstr, $id), $date_id); + } + + $tores .= $date_id; // 日付とID + if ($this->am_side_of_id) { + $tores .= ' ' . $this->activeMona->getMona($msg_id); + } + $tores .= "
\n"; // res-headerを閉じる + + // 被レスリスト(縦形式) + if ($_conf['backlink_list'] == 1 || $_conf['backlink_list'] > 2) { + $tores .= $this->_quotebackListHtml($i, 1); + } + + $tores .= "
{$msg}
\n"; // 内容 + // 被レス展開用ブロック + if ($_conf['backlink_block'] > 0) { + $backlinks = $this->_getBacklinkComment($i); + if (strlen($backlinks)) { + $tores .= '
'; + $tores .= $backlinks; + } + } + // 被レスリスト(横形式) + if ($_conf['backlink_list'] == 2 || $_conf['backlink_list'] > 2) { + $tores .= $this->_quotebackListHtml($i, 2, false); + } + $tores .= "
\n"; + +// $tores .= $rpop; // レスポップアップ用引用 + +?> \ No newline at end of file diff --git a/lib/live/live_ShowThread.php b/lib/live/live_ShowThread.php new file mode 100755 index 000000000..9d205aedb --- /dev/null +++ b/lib/live/live_ShowThread.php @@ -0,0 +1,2050 @@ +(<[Aa][ ].+?>)(.*?)()) # リンク(PCREの特性上、必ずこのパターンを最初に試行する) +| +(?: + (?P # 引用 + ((?:>|>){1,2}[ ]?) # 引用符 + ( + (?:[1-9]\\d{0,3}) # 1つ目の番号 + (?: + (?:[ ]?(?:[,=]|、)[ ]?[1-9]\\d{0,3})+ # 連続 + | + -(?:[1-9]\\d{0,3})? # 範囲 + )? + ) + (?=\\D|$) + ) # 引用ここまで +| # PHP 5.3縛りにするなら、↓の\'のエスケープを外し、NOWDOCにする + (?P(ftp|h?t?tps?)://([0-9A-Za-z][\\w;/?:@=&$\\-_.+!*\'(),#%\\[\\]^~]+)) # URL + ([^\\s<>]*) # URLの直後、タグorホワイトスペースが現れるまでの文字列 +| + (?PID:[ ]?([0-9A-Za-z/.+]{8,11})(?=[^0-9A-Za-z/.+]|$)) # ID(8,10桁 +PC/携帯識別フラグ) +) +}x'; + + /** + * リダイレクタの種類 + * + * @var int + */ + const REDIRECTOR_NONE = 0; + const REDIRECTOR_IMENU = 1; + const REDIRECTOR_PINKTOWER = 2; + const REDIRECTOR_MACHIBBS = 3; + + /** + * NGあぼーんの種類 + * + * @var int + */ + const ABORN = -1; + const NG_NONE = 0; + const NG_NAME = 1; + const NG_MAIL = 2; + const NG_ID = 4; + const NG_MSG = 8; + const NG_FREQ = 16; + const NG_CHAIN = 32; + const NG_AA = 64; + + // }}} + // {{{ static properties + + /** + * まとめ読みモード時のスレッド数 + * + * @var int + */ + static private $_matome_count = 0; + + /** + * 本文以外がNGあぼーんにヒットした総数 + * + * @var int + */ + static protected $_ngaborns_head_hits = 0; + + /** + * 本文がNGあぼーんにヒットした総数 + * + * @var int + */ + static protected $_ngaborns_body_hits = 0; + + /** + * getAnchorRegex() のキャッシュ + * + * @var array + */ + static private $_anchorRegexes = array(); + + /** + * _getAnchorRegexParts() のキャッシュ + * + * @var array + */ + static private $_anchorRegexParts = null; + + // }}} + // {{{ properties + + /** + * まとめ読みモード時のスレッド番号 + * + * @var int + */ + protected $_matome; + + /** + * URLを処理する関数・メソッド名などを格納する配列 + * (組み込み) + * + * @var array + */ + protected $_url_handlers; + + /** + * URLを処理する関数・メソッド名などを格納する配列 + * (ユーザ定義、組み込みのものより優先) + * + * @var array + */ + protected $_user_url_handlers; + + /** + * 頻出IDをあぼーんする + * + * @var bool + */ + protected $_ngaborn_frequent; + + /** + * NG or あぼーんレスがあるかどうか + * + * @var bool + */ + protected $_has_ngaborns; + + /** + * あぼーんレス番号およびNGレス番号を格納する配列 + * array_intersect()を効率よく行うため、該当するレス番号は文字列にキャストして格納する + * + * @var array + */ + protected $_aborn_nums; + protected $_ng_nums; + + /** + * リダイレクタの種類 + * + * @var int + */ + protected $_redirector; + + /** + * スレッドオブジェクト + * + * @var ThreadRead + */ + public $thread; + + /** + * アクティブモナー・オブジェクト + * + * @var ActiveMona + */ + public $activeMona; + + /** + * アクティブモナーが有効か否か + * + * @var bool + */ + public $am_enabled = false; + + /** + * 引用しているレス番号を登録した配列 + * + * @var array + */ + protected $_quote_res_nums; + + + /** + * 引用チェック済みレス番号の配列 + * + * @var array + */ + protected $_quote_res_nums_checked; + + /** + * 引用変換済みレス番号の配列 + * + * @var array + */ + protected $_quote_res_nums_done; + + /** + * レス番号チェックの再帰の深さ + * + * @var int + */ + private $_quote_check_depth; + + /** + * デフォルトの名前 + * + * @var string + */ + protected $_nanashiName = null; + + /** + * 被アンカーを集計した配列(範囲アンカー含む) // [被参照レス番 : [参照レス番, ...], ...) + * + * @var array + */ + protected $_quote_from = null; + + /** + * アンカーを集計した配列(範囲アンカー除く) // [レス番 : [参照先レス番, ...], ...) + * + * @var array + */ + protected $_quote_to = null; + + /** + * お気に自動ランク + * + * @var bool + */ + private $_auto_fav_rank = false; + + /** + * リンクするサムネイルを生成するクラスのインスタンス + * + * @var ImageCache2_Thumbnailer + */ + public $thumbnailer; + + /** + * インライン表示するサムネイルを生成するクラスのインスタンス + * + * @var ImageCache2_Thumbnailer + */ + public $inline_prvw; + + /** + * インラインサムネイルのID属性接尾辞 + * + * @var string + */ + public $thumb_id_suffix; + + /** + * 画像に付加するメモ + * + * @var string + */ + public $img_memo; + + /** + * 画像にメモを付けるためのクエリ文字列 + * + * @var string + */ + public $img_memo_query; + + /** + * 画像解像度 + * + * @var float + */ + public $img_dpr = 1.0; + + /** + * 画像解像度を指定するクエリ文字列 + * + * @var string + */ + public $img_dpr_query; + + // }}} + // {{{ constructor + + /** + * コンストラクタ + */ + protected function __construct(ThreadRead $aThread, $matome = false) + { + global $_conf; + + // スレッドオブジェクトを登録 + $this->thread = $aThread; + $this->str_to_link_regex = $this->_buildStrToLinkRegex(); + + // まとめ読みモードか否か + if ($matome) { + $this->_matome = ++self::$_matome_count; + } else { + $this->_matome = false; + } + + $this->_url_handlers = array(); + $this->_user_url_handlers = array(); + + $this->_ngaborn_frequent = 0; + if ($_conf['ngaborn_frequent']) { + if ($_conf['ngaborn_frequent_dayres'] == 0) { + $this->_ngaborn_frequent = $_conf['ngaborn_frequent']; + } elseif ($this->thread->setDayRes() && $this->thread->dayres < $_conf['ngaborn_frequent_dayres']) { + $this->_ngaborn_frequent = $_conf['ngaborn_frequent']; + } + } + + $this->_has_ngaborns = false; + $this->_aborn_nums = array(); + $this->_ng_nums = array(); + + if (P2Util::isHostBbsPink($this->thread->host)) { + $this->_redirector = self::REDIRECTOR_PINKTOWER; + } elseif (P2Util::isHost2chs($this->thread->host)) { + $this->_redirector = self::REDIRECTOR_IMENU; + } elseif (P2Util::isHostMachiBbs($this->thread->host)) { + $this->_redirector = self::REDIRECTOR_MACHIBBS; + } else { + $this->_redirector = self::REDIRECTOR_NONE; + } + + $this->_quote_res_nums = array(); + $this->_quote_res_nums_checked = array(); + $this->_quote_res_nums_done = array(); + } + + // }}} + + /** + * @param void + * @return void + */ + protected function setBbsNonameName() + { + $st = new SettingTxt($this->thread->host, $this->thread->bbs); + $st->setSettingArray(); + if (array_key_exists('BBS_NONAME_NAME', $st->setting_array)) { + $BBS_NONAME_NAME = $st->setting_array['BBS_NONAME_NAME']; + if (strlen($BBS_NONAME_NAME)) { + $this->_nanashiName = $BBS_NONAME_NAME; + } + } + } + + // {{{ getDatToHtml() + + /** + * DatをHTML変換したものを取得する + * + * @param bool $is_fragment + * @return bool|string + */ + public function getDatToHtml($is_fragment = false) + { + return $this->datToHtml(true, $is_fragment); + } + public function getDatToHtml_resFrom($is_fragment = false) + { + return $this->datToHtml_resFrom(true, $is_fragment); + } + + // }}} + // {{{ datToHtml() + + /** + * DatをHTMLに変換して表示する + * + * @param bool $capture trueなら変換結果を出力せずに返す + * @param bool $is_fragment trueなら
で囲まない + * @return bool|string + */ + public function datToHtml($capture = false, $is_fragment = false) + { + global $_conf, $filter_hits, $last_hit_resnum; + + $aThread = $this->thread; + + // 表示レス範囲が指定されていなければ + if (!$aThread->resrange) { + $error = '

p2 error: {$this->resrange} is false at datToHtml()

'; + if ($capture) { + return $error; + } else { + echo $error; + return false; + } + } + + $start = $aThread->resrange['start']; + $to = $aThread->resrange['to']; + $nofirst = $aThread->resrange['nofirst']; + + $is_ktai = $_conf['ktai']; + $resFilter = ResFilter::getFilter(); + if ($resFilter && $resFilter->hasWord()) { + $do_filtering = true; + $nofirst = true; + } else { + $do_filtering = false; + } + + $datlines = $aThread->datlines; + $count = count($datlines); + + $buf['body'] = $is_fragment ? '' : "
\n"; + $buf['q'] = ''; + + // まず 1 を表示 + if (!$nofirst) { + $res = $this->transRes($datlines[0], 1); + if (is_array($res)) { + $buf['body'] .= $res['body']; + $buf['q'] .= $res['q'] ? $res['q'] : ''; + } else { + $buf['body'] .= $res; + } + } + + // 連鎖のため、範囲外のNGあぼーんチェック + if ($_conf['ngaborn_chain_all'] && empty($_GET['nong'])) { + $pre = min($count, $start); + for ($i = ($nofirst) ? 0 : 1; $i < $pre; $i++) { + $n = $i + 1; + list($name, $mail, $date_id, $msg) = $aThread->explodeDatLine($datlines[$i]); + if (($id = $aThread->ids[$n]) !== null) { + $date_id = str_replace($aThread->idp[$n] . $id, "ID:$id", $date_id); + } + $this->_ngAbornCheck($n, strip_tags($name), $mail, $date_id, $id, $msg); + } + } + + // フィルタリング + if ($do_filtering) { + $datlines = $resFilter->apply($this); + $filter_hits = $resFilter->hits; + $last_hit_resnum = $resFilter->last_hit_resnum; + } + + // 指定範囲を表示 + $i = 0; + $n = 0; + $rn = 0; + + if ($do_filtering) { + if (!empty($resFilter->range)) { + $start = $resFilter->range['start']; + $to = $resFilter->range['to']; + } + $pattern = $resFilter->getPattern(); + } else { + $pattern = null; + } + + foreach ($datlines as $i => $ares) { + if ($ares === null) { + continue; + } + $n++; + if ($i === 0 && !$nofirst) { + continue; + } + if ($n < $start) { + continue; + } + if ($n > $to) { + break; + } + $rn = $i + 1; + $res = $this->transRes($ares, $rn, $pattern); + if (is_array($res)) { + $buf['body'] .= $res['body']; + $buf['q'] .= $res['q'] ? $res['q'] : ''; + } else { + $buf['body'] .= $res; + } + if (!$capture && $n % 10 == 0) { + echo $buf['body']; + if ($do_filtering && !$is_ktai) { + echo "\n"; + } + flush(); + $buf['body'] = ''; + } + } + + if ($this->thread->readnum < $rn) { + $this->thread->readnum = $rn; + } + + if ($do_filtering && !$is_ktai) { + $buf['body'] .= "\n"; + } + +// +live オートリロードされるスレ内容の表示部 +echo <<
\n +LIVE; + + if (!$is_fragment) { + $buf['body'] .= "
\n"; + } + + if ($capture) { + return $buf['body'] . $buf['q']; + } else { + echo $buf['body']; + echo $buf['q']; + flush(); + return true; + } + } + + /** + * 指定の書込みへのレスをHTMLに変換して表示する + * + * @param bool $capture trueなら変換結果を出力せずに返す + * @param bool $is_fragment trueなら
で囲まない + * @param bool $show_rootres trueなら指定の書込みも結果に含める + * @return bool|string + */ + public function datToHtml_resFrom($capture = false, $is_fragment = false, $show_rootres = false) + { + global $_conf; + + $aThread = $this->thread; + + // 表示レスが指定されていなければ + $target = $aThread->resrange['start']; + if (!$aThread->resrange || $target != $aThread->resrange['to']) { + $error = '

p2 error: {$this->resrange} is false at datToHtml()

'; + if ($capture) { + return $error; + } else { + echo $error; + return false; + } + } + + $datlines = $aThread->datlines; + $count = count($datlines); + + $buf['body'] = $is_fragment ? '' : "
\n"; + $buf['q'] = ''; + + // 連鎖のため、範囲外のNGあぼーんチェック + if ($_conf['ngaborn_chain_all'] && empty($_GET['nong'])) { + $pre = min($count, $start); + for ($i = ($nofirst) ? 0 : 1; $i < $pre; $i++) { + $n = $i + 1; + list($name, $mail, $date_id, $msg) = $aThread->explodeDatLine($datlines[$i]); + if (($id = $aThread->ids[$n]) !== null) { + $date_id = str_replace($aThread->idp[$n] . $id, "ID:$id", $date_id); + } + $this->_ngAbornCheck($n, strip_tags($name), $mail, $date_id, $id, $msg); + } + } + + // レス展開 + $datlines = array_fill(0, count($aThread->datlines), null); + if ($show_rootres) { + $datlines[$target - 1] = $aThread->datlines[$target - 1]; + } + list($name, $mail, $date_id, $msg) = + $aThread->explodeDatLine($aThread->datlines[$target - 1]); + foreach ($this->checkQuoteResNums($target, $name, $msg, false, true, false) as $rn) { + $ri = $rn - 1; + if ($datlines[$ri] === null) { + $datlines[$ri] = $aThread->datlines[$ri]; + } + } + + // 表示 + $i = 0; + $n = 0; + $rn = 0; + foreach ($datlines as $i => $ares) { + if ($ares === null) { + continue; + } + $n++; + $rn = $i + 1; + $res = $this->transRes($ares, $rn); + if (is_array($res)) { + $buf['body'] .= $res['body']; + $buf['q'] .= $res['q'] ? $res['q'] : ''; + } else { + $buf['body'] .= $res; + } + if (!$capture && $n % 10 == 0) { + echo $buf['body']; + flush(); + $buf['body'] = ''; + } + } + + if (!$is_fragment) { + $buf['body'] .= "
\n"; + } + + if ($capture) { + return $buf['body'] . $buf['q']; + } else { + echo $buf['body']; + echo $buf['q']; + flush(); + return true; + } + } + + // }}} + // {{{ transRes() + + /** + * DatレスをHTMLレスに変換する + * + * @param string $ares datの1ライン + * @param int $i レス番号 + * @return string + */ + abstract public function transRes($ares, $i); + + // }}} + // {{{ transName() + + /** + * 名前をHTML用に変換する + * + * @param string $name 名前 + * @return string + */ + abstract public function transName($name); + + // }}} + // {{{ transMsg() + + /** + * datのレスメッセージをHTML表示用メッセージに変換する + * + * @param string $msg メッセージ + * @param int $mynum レス番号 + * @return string + */ + abstract public function transMsg($msg, $mynum); + + // }}} + // {{{ replaceBeId() + + /** + * BEプロファイルリンク変換 + */ + public function replaceBeId($date_id, $i) + { + global $_conf; + + $beid_replace = "thread->host}/test/read.cgi/{$this->thread->bbs}/{$this->thread->key}/{$i}\"{$_conf['ext_win_target_at']}>Lv.\$2"; + + // + $be_match = '||i'; + if (preg_match($be_match, $date_id)) { + $date_id = preg_replace($be_match, $beid_replace, $date_id); + + } else { + + $beid_replace = "thread->host}/test/read.cgi/{$this->thread->bbs}/{$this->thread->key}/{$i}\"{$_conf['ext_win_target_at']}>?\$2"; + $date_id = preg_replace('|BE: ?(\d+)-(#*)|i', $beid_replace, $date_id); + } + + return $date_id; + } + + // }}} + // {{{ _ngAbornCheck() + + /** + * NGあぼーんチェック + * + * @param int $i レス番号 + * @param string $name 名前欄 + * @param string $mail メール欄 + * @param string $date_id 日付・ID欄 + * @param string $id ID + * @param string $msg レス本文 + * @param bool $nong NGチェックをするかどうか + * @param array &$info NGの理由が格納される変数の参照 + * @return int NGタイプ。ShowThread::NG_XXX のビット和か ShowThread::ABORN + */ + protected function _ngAbornCheck($i, $name, $mail, $date_id, $id, $msg, $nong = false, &$info = null) + { + global $_conf, $ngaborns_hits; + + $info = array(); + $type = self::NG_NONE; + + // {{{ 頻出IDチェック + + if ($this->_ngaborn_frequent && $id && $this->thread->idcount[$id] >= $_conf['ngaborn_frequent_num']) { + if (!$_conf['ngaborn_frequent_one'] && $id == $this->thread->ids[1]) { + // >>1 はそのまま表示 + } elseif ($this->_ngaborn_frequent == 1) { + $ngaborns_hits['aborn_freq']++; + return $this->_markNgAborn($i, self::ABORN, false); + } elseif (!$nong) { + $ngaborns_hits['ng_freq']++; + $type |= $this->_markNgAborn($i, self::NG_FREQ, false); + $info[] = sprintf('頻出ID:%s(%d)', $id, $this->thread->idcount[$id]); + } + } + + // }}} + // {{{ 連鎖チェック + + if ($_conf['ngaborn_chain'] && $this->_has_ngaborns && + preg_match_all('/(?:>|>)([1-9][0-9\\-,]*)/', $msg, $matches) + ) { + $references = array_unique(preg_split('/[-,]+/', + trim(implode(',', $matches[1]), '-,'), + -1, + PREG_SPLIT_NO_EMPTY)); + $intersections = array_intersect($references, $this->_aborn_nums); + $info_suffix = ''; + + if ($intersections) { + if ($_conf['ngaborn_chain'] == 1) { + $ngaborns_hits['aborn_chain']++; + return $this->_markNgAborn($i, self::ABORN, true); + } + if ($nong) { + $intersections = null; + } else { + $info_suffix = '(' . (($_conf['ktai']) ? 'アボン' : 'あぼーん') . ')'; + } + } elseif (!$nong) { + $intersections = array_intersect($references, $this->_ng_nums); + } + + if ($intersections) { + $ngaborns_hits['ng_chain']++; + $type |= $this->_markNgAborn($i, self::NG_CHAIN, true); + $info[] = sprintf('連鎖NG:>>%d%s', current($intersections), $info_suffix); + } + } + + // }}} + // {{{ あぼーんチェック + + // あぼーんレス + if ($this->abornResCheck($i) !== false) { + $ngaborns_hits['aborn_res']++; + return $this->_markNgAborn($i, self::ABORN, false); + } + + // あぼーんネーム + if ($this->ngAbornCheck('aborn_name', $name) !== false) { + $ngaborns_hits['aborn_name']++; + return $this->_markNgAborn($i, self::ABORN, false); + } + + // あぼーんメール + if ($this->ngAbornCheck('aborn_mail', $mail) !== false) { + $ngaborns_hits['aborn_mail']++; + return $this->_markNgAborn($i, self::ABORN, false); + } + + // あぼーんID + if ($this->ngAbornCheck('aborn_id', $date_id) !== false) { + $ngaborns_hits['aborn_id']++; + return $this->_markNgAborn($i, self::ABORN, false); + } + + // あぼーんメッセージ + if ($this->ngAbornCheck('aborn_msg', $msg) !== false) { + $ngaborns_hits['aborn_msg']++; + return $this->_markNgAborn($i, self::ABORN, true); + } + + // }}} + + if ($nong) { + return $type; + } + + // {{{ NGチェック + + // NGネームチェック + if ($this->ngAbornCheck('ng_name', $name) !== false) { + $ngaborns_hits['ng_name']++; + $type |= $this->_markNgAborn($i, self::NG_NAME, false); + } + + // NGメールチェック + if ($this->ngAbornCheck('ng_mail', $mail) !== false) { + $ngaborns_hits['ng_mail']++; + $type |= $this->_markNgAborn($i, self::NG_MAIL, false); + } + + // NGIDチェック + if ($this->ngAbornCheck('ng_id', $date_id) !== false) { + $ngaborns_hits['ng_id']++; + $type |= $this->_markNgAborn($i, self::NG_ID, false); + } + + // NGメッセージチェック + $a_ng_msg = $this->ngAbornCheck('ng_msg', $msg); + if ($a_ng_msg !== false) { + $ngaborns_hits['ng_msg']++; + $type |= $this->_markNgAborn($i, self::NG_MSG, true); + $info[] = sprintf('NG%s:%s', + ($_conf['ktai']) ? 'ワード' : 'ワード', + p2h($a_ng_msg)); + } + + // }}} + + return $type; + } + + // }}} + // {{{ _markNgAborn() + + /** + * NGあぼーんにヒットしたレス番号を記録する + * + * @param int $num レス番号 + * @param int $type NGあぼーんの種類 + * @param bool $isBody 本文にヒットしたかどうか + * @return int $typeと同じ値 + */ + protected function _markNgAborn($num, $type, $isBody) + { + if ($type) { + if ($isBody) { + self::$_ngaborns_body_hits++; + } else { + self::$_ngaborns_head_hits++; + } + + // array_intersect()を効率よく行うため、レス番号を文字列型にキャストする + $str = (string)$num; + if ($type == self::ABORN) { + $this->_aborn_nums[$num] = $str; + } else { + $this->_ng_nums[$num] = $str; + } + + $this->_has_ngaborns = true; + } + + return $type; + } + + // }}} + // {{{ ngAbornCheck() + + /** + * NGあぼーんチェック + */ + public function ngAbornCheck($code, $resfield, $ic = false) + { + global $ngaborns; + + //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection('ngAbornCheck()'); + + if (isset($ngaborns[$code]['data']) && is_array($ngaborns[$code]['data'])) { + // +Wiki:BEあぼーん + if ($code == 'aborn_be' || $code == 'ng_be') { + // プロフィールIDを抜き出す + if (preg_match('/BE:(\\d+)/', $resfield, $matches)) { + $beId = P2UtilWiki::calcBeId((int)$matches[1]); + if ($beId === 0) { + return false; + } + $resfield = (string)$beId; + } else { + return false; + } + } + + $bbs = $this->thread->bbs; + $title = $this->thread->ttitle_hc; + + foreach ($ngaborns[$code]['data'] as $k => $v) { + // 板チェック + if (isset($v['bbs']) && in_array($bbs, $v['bbs']) == false) { + continue; + } + + // タイトルチェック + if (isset($v['title']) && stripos($title, $v['title']) === false) { + continue; + } + + // ワードチェック + // 正規表現 + if ($v['regex']) { + $re_method = $v['regex']; + /*if ($re_method($v['word'], $resfield, $matches)) { + $this->ngAbornUpdate($code, $k); + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); + return p2h($matches[0]); + }*/ + if ($re_method($v['word'], $resfield)) { + $this->ngAbornUpdate($code, $k); + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); + return $v['cond']; + } + // +Wiki:BEあぼーん(完全一致) + } elseif ($code == 'aborn_be' || $code == 'ng_be') { + if ($resfield == $v['word']) { + $this->ngAbornUpdate($code, $k); + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); + return $v['cond']; + } + // 大文字小文字を無視 + } elseif ($ic || $v['ignorecase']) { + if (stripos($resfield, $v['word']) !== false) { + $this->ngAbornUpdate($code, $k); + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); + return $v['cond']; + } + // 単純に文字列が含まれるかどうかをチェック + } else { + if (strpos($resfield, $v['word']) !== false) { + $this->ngAbornUpdate($code, $k); + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); + return $v['cond']; + } + } + } + } + + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); + return false; + } + + // }}} + // {{{ abornResCheck() + + /** + * 特定レスの透明あぼーんチェック + */ + public function abornResCheck($resnum) + { + global $ngaborns; + + $target = $this->thread->host . '/' . $this->thread->bbs . '/' . $this->thread->key . '/' . $resnum; + + if (isset($ngaborns['aborn_res']['data']) && is_array($ngaborns['aborn_res']['data'])) { + foreach ($ngaborns['aborn_res']['data'] as $k => $v) { + if ($ngaborns['aborn_res']['data'][$k]['word'] == $target) { + $this->ngAbornUpdate('aborn_res', $k); + return true; + } + } + } + return false; + } + + // }}} + // {{{ ngAbornUpdate() + + /** + * NG/あぼ〜ん日時と回数を更新 + */ + public function ngAbornUpdate($code, $k) + { + global $ngaborns; + + if (isset($ngaborns[$code]['data'][$k])) { + $ngaborns[$code]['data'][$k]['lasttime'] = date('Y/m/d G:i'); // HIT時間を更新 + if (empty($ngaborns[$code]['data'][$k]['hits'])) { + $ngaborns[$code]['data'][$k]['hits'] = 1; // 初HIT + } else { + $ngaborns[$code]['data'][$k]['hits']++; // HIT回数を更新 + } + } + } + + // }}} + // {{{ addURLHandler() + + /** + * ユーザ定義URLハンドラ(メッセージ中のURLを書き換える関数)を追加する + * + * ハンドラは最初に追加されたものから順番に試行される + * URLはハンドラの返り値(文字列)で置換される + * falseを帰した場合は次のハンドラに処理が委ねられる + * + * ユーザ定義URLハンドラの引数は + * 1. string $url URL + * 2. array $purl URLをparse_url()したもの + * 3. string $str パターンにマッチした文字列、URLと同じことが多い + * 4. object $aShowThread 呼び出し元のオブジェクト + * である + * 常にfalseを返し、内部で処理するだけの関数を登録してもよい + * + * @param callback $function コールバックメソッド + * @return void + * @access public + * @todo ユーザ定義URLハンドラのオートロード機能を実装 + */ + public function addURLHandler($function) + { + $this->_user_url_handlers[] = $function; + } + + // }}} + // {{{ stripLineBreaks() + + /** + * 文末の改行と連続する改行を取り除く + * + * @param string $msg + * @param string $replacement + * @return string + */ + public function stripLineBreaks($msg, $replacement = '

') + { + if (P2_MBREGEX_AVAILABLE) { + $msg = mb_ereg_replace('(?:[\\s ]*
)+[\\s ]*$', '', $msg); + $msg = mb_ereg_replace('(?:[\\s ]*
){3,}', $replacement, $msg); + } else { + mb_convert_variables('UTF-8', 'CP932', $msg, $replacement); + $msg = preg_replace('/(?:[\\s\\x{3000}]*
)+[\\s\\x{3000}]*$/u', '', $msg); + $msg = preg_replace('/(?:[\\s\\x{3000}]*
){3,}/u', $replacement, $msg); + $msg = mb_convert_encoding($msg, 'CP932', 'UTF-8'); + } + + return $msg; + } + + // }}} + // {{{ transLink() + + /** + * リンク対象文字列を変換する + * + * @param string $str + * @return string + */ + public function transLink($str) + { + return preg_replace_callback($this->str_to_link_regex, array($this, 'transLinkDo'), $str); + } + + // }}} + // {{{ transLinkDo() + + /** + * リンク対象文字列の種類を判定して対応した関数/メソッドに渡す + * + * @param array $s + * @return string + */ + public function transLinkDo(array $s) + { + global $_conf; + + $orig = $s[0]; + $following = ''; + + // PHP 5.2.7 未満の preg_replace_callback() では名前付き捕獲式集合が使えないので + /* + if (!array_key_exists('link', $s)) { + $s['link'] = $s[1]; + $s['quote'] = $s[5]; + $s['url'] = $s[8]; + $s['id'] = $s[11]; + } + */ + + // マッチしたサブパターンに応じて分岐 + // リンク + if ($s['link']) { + if (preg_match('{ href=(["\'])?(.+?)(?(1)\\1)(?=[ >])}i', $s[2], $m)) { + $url = $m[2]; + $str = $s[3]; + } else { + return $s[3]; + } + + // 引用 + } elseif ($s['quote']) { + return preg_replace_callback( + self::getAnchorRegex('/(%prefix%)?(%a_range%)/'), + array($this, '_quoteResCallback'), $s['quote']); + + // http or ftp のURL + } elseif ($s['url']) { + if ($_conf['ktai'] && $s[9] == 'ftp') { + return $orig; + } + $url = preg_replace('/^t?(tps?)$/', 'ht$1', $s[9]) . '://' . $s[10]; + $str = $s['url']; + $following = $s[11]; + if (strlen($following) > 0) { + // ウィキペディア日本語版のURLで、SJISの2バイト文字の上位バイト + // (0x81-0x9F,0xE0-0xEF)が続くとき + if (P2Util::isUrlWikipediaJa($url)) { + $leading = ord($following); + if ((($leading ^ 0x90) < 32 && $leading != 0x80) || ($leading ^ 0xE0) < 16) { + $url .= rawurlencode(mb_convert_encoding($following, 'UTF-8', 'CP932')); + $str .= $following; + $following = ''; + } + } elseif (strpos($following, 'tp://') !== false) { + // 全角スペース+URL等の場合があるので再チェック + $following = $this->transLink($following); + } + } + + // ID + } elseif ($s['id'] && $_conf['flex_idpopup']) { // && $_conf['flex_idlink_k'] + return $this->idFilter($s['id'], $s[12]); + + // その他(予備) + } else { + return strip_tags($orig); + } + + // リダイレクタを外す + switch ($this->_redirector) { + case self::REDIRECTOR_IMENU: + $url = preg_replace('{^([a-z]+://)ime\\.nu/}', '$1', $url); + break; + case self::REDIRECTOR_PINKTOWER: + $url = preg_replace('{^([a-z]+://)pinktower\\.com/}', '$1', $url); + break; + case self::REDIRECTOR_MACHIBBS: + $url = preg_replace('{^[a-z]+://machi(?:bbs\\.com|\\.to)/bbs/link\\.cgi\\?URL=}', '', $url); + break; + } + + // エスケープされていない特殊文字をエスケープ + $url = p2h($url, false); + $str = p2h($str, false); + // 実態参照・数値参照を完全にデコードしようとすると負荷が大きいし、 + // "&"以外の特殊文字はほとんどの場合URLエンコードされているはずなので + // 中途半端に凝った処理はせず、"&"→"&"のみ再変換する。 + $raw_url = str_replace('&', '&', $url); + + // URLをパース・ホストを検証 + $purl = @parse_url($raw_url); + if (!$purl || !array_key_exists('host', $purl) || + strpos($purl['host'], '.') === false || + $purl['host'] == '127.0.0.1' || + //HostCheck::isAddressLocal($purl['host']) || + //HostCheck::isAddressPrivate($purl['host']) || + P2Util::isHostExample($purl['host'])) + { + return $orig; + } + // URLのマッチングで"&"を考慮しなくて済むように、生のURLを登録しておく + $purl[0] = $raw_url; + + // URLを処理 + foreach ($this->_user_url_handlers as $handler) { + if (false !== ($link = call_user_func($handler, $url, $purl, $str, $this))) { + return $link . $following; + } + } + foreach ($this->_url_handlers as $handler) { + if (false !== ($link = $this->$handler($url, $purl, $str))) { + return $link . $following; + } + } + + return $orig; + } + + // }}} + // {{{ idFilter() + + /** + * IDフィルタリング変換 + * + * @param string $idstr ID:xxxxxxxxxx + * @param string $id xxxxxxxxxx + * @return string + */ + abstract public function idFilter($idstr, $id); + + // }}} + // {{{ _idFilterCallback() + + /** + * IDフィルタリング変換 + * + * @param array $s 正規表現にマッチした要素の配列 + * @return string + */ + protected function _idFilterCallback(array $s) + { + return $this->idFilter($s[0], $s[1]); + } + + // }}} + // {{{ _quoteNameCallback() + + /** + * @param array $s + * @return string HTML + */ + protected function _quoteNameCallback($s) + { + return preg_replace_callback( + self::getAnchorRegex('/(%prefix%)?(%a_num%)/'), + array($this, '_quoteResCallback'), $s[0] + ); + } + + // }}} + // {{{ quoteRes() + + /** + * 引用変換(単独) + * + * @param string $full >>1 + * @param string $qsign >> + * @param string $appointed_num 1 + * @return string + */ + abstract public function quoteRes($full, $qsign, $appointed_num); + + // }}} + // {{{ _quoteResCallback() + + /** + * 引用変換(単独) + * + * @param array $s 正規表現にマッチした要素の配列 + * @return string + */ + protected function _quoteResCallback(array $s) + { + return $this->quoteRes($s[0], $s[1], $s[2]); + } + + // }}} + // {{{ quoteResRange() + + /** + * 引用変換(範囲) + * + * @param string $full >>1-100 + * @param string $qsign >> + * @param string $appointed_num 1-100 + * @return string + */ + abstract public function quoteResRange($full, $qsign, $appointed_num); + + // }}} + // {{{ _quoteResRangeCallback() + + /** + * 引用変換(範囲) + * + * @param array $s 正規表現にマッチした要素の配列 + * @return string + */ + protected function _quoteResRangeCallback(array $s) + { + return $this->quoteResRange($s[0], $s[1], $s[2]); + } + + // }}} + // {{{ checkQuoteResNums() + + /** + * HTMLメッセージ中の引用レスの番号を再帰チェックする + */ + public function checkQuoteResNums($res_num, $name, $msg, + $with_quotes = true, + $with_backlinks = null, + $cascade = true) + { + global $_conf; + + $this->_quote_check_depth = 0; + + if ($with_backlinks === null) { + $with_backlinks = ($_conf['backlink_list'] > 0 || $_conf['backlink_block'] > 0) ? true : false; + } + + if ($with_backlinks) { + return $this->checkQuoteResNumsFromSummary( + $res_num == 0 ? 1 : $res_num, $with_quotes, $with_backlinks); + } + + return $this->_checkQuoteResNums($res_num, $name, $msg); + } + + // }}} + // {{{ _checkQuoteResNums() + + /** + * HTMLメッセージ中の引用レスの番号を再帰チェックする + */ + protected function _checkQuoteResNums($res_num, $name, $msg) + { + // 再帰リミッタ + if ($this->_quote_check_depth > 30) { + return array(); + } else { + $this->_quote_check_depth++; + } + + if (array_key_exists($res_num, $this->_quote_res_nums)) { + return $this->_quote_res_nums[$res_num]; + } + + $aThread = $this->thread; + + $quote_res_nums = array(); + + $name = preg_replace('/(◆.*)/', '', $name, 1); + + // 名前 + if ($matches = $this->getQuoteResNumsName($name)) { + foreach ($matches as $a_quote_res_num) { + if ($a_quote_res_num) { + $quote_res_nums[] = $a_quote_res_num; + $a_quote_res_idx = $a_quote_res_num - 1; + + // 自分自身の番号と同一でなければ、 + if ($a_quote_res_num != $res_num) { + // チェックしていない番号を再帰チェック + if (!isset($this->_quote_res_nums_checked[$a_quote_res_num])) { + $this->_quote_res_nums_checked[$a_quote_res_num] = true; + if (isset($aThread->datlines[$a_quote_res_idx])) { + $datalinear = $aThread->explodeDatLine($aThread->datlines[$a_quote_res_idx]); + $quote_name = $datalinear[0]; + $quote_msg = $aThread->datlines[$a_quote_res_idx]; + $quote_res_nums = array_merge($quote_res_nums, + $this->_checkQuoteResNums($a_quote_res_num, + $quote_name, + $quote_msg)); + } + } + } + } + // $name=preg_replace("/([0-9]+)/", "", $name, 1); + } + } + + // >>1のリンクをいったん外す + // >>1 + $msg = preg_replace('{<[Aa] .+?>(>>[1-9][\\d\\-]*)}', '$1', $msg); + + //echo $msg; + if (preg_match_all(self::getAnchorRegex('/%full%/'), $msg, $out, PREG_PATTERN_ORDER)) { + foreach ($out[2] as $numberq) { + if ($matches=preg_split(self::getAnchorRegex('/%delimiter%/'), $numberq)) { + foreach ($matches as $a_quote_res_num) { + if (preg_match(self::getAnchorRegex('/%range_delimiter%/'),$a_quote_res_num)) { continue;} + $a_quote_res_num = (int) (mb_convert_kana($a_quote_res_num, 'n')); + $a_quote_res_idx = $a_quote_res_num - 1; + + //echo $a_quote_res_num; + + if (!$a_quote_res_num) {break;} + $quote_res_nums[] = $a_quote_res_num; + + // 自分自身の番号と同一でなければ、 + if ($a_quote_res_num != $res_num) { + // チェックしていない番号を再帰チェック + if (!isset($this->_quote_res_nums_checked[$a_quote_res_num])) { + $this->_quote_res_nums_checked[$a_quote_res_num] = true; + if (isset($aThread->datlines[$a_quote_res_idx])) { + $datalinear = $aThread->explodeDatLine($aThread->datlines[$a_quote_res_idx]); + $quote_name = $datalinear[0]; + $quote_msg = $aThread->datlines[$a_quote_res_idx]; + $quote_res_nums = array_merge($quote_res_nums, + $this->_checkQuoteResNums($a_quote_res_num, + $quote_name, + $quote_msg)); + } + } + } + + } + + } + + } + + } + + if (count($quote_res_nums)) { + sort($quote_res_nums, SORT_NUMERIC); + $this->_quote_res_nums[$res_num] = array_unique($quote_res_nums); + $quote_res_nums = $this->_quote_res_nums[$res_num]; + } + + return $quote_res_nums; + } + + // }}} + // {{{ checkQuoteResNumsFromSummary() + + /** + * 引用レス集計結果からポップアップ用に用意すべき番号を再帰チェックする + */ + public function checkQuoteResNumsFromSummary($res_num, $with_quotes, $with_backlinks) + { + // 再帰リミッタ + if ($this->_quote_check_depth > 3000) { + return array(); + } else { + $this->_quote_check_depth++; + } + + $ret = array(); + + // 参照レス + if ($with_quotes) { + $ret = array_merge($ret, + $this->_checkQuoteResNumsFromSummary( + $res_num, $this->getQuoteTo(), $with_quotes, $with_backlinks)); + } + // 被参照レス + if ($with_backlinks) { + $ret = array_merge($ret, + $this->_checkQuoteResNumsFromSummary( + $res_num, $this->getQuoteFrom(), $with_quotes, $with_backlinks)); + } + return $ret; + } + + // }}} + // {{{ _checkQuoteResNumsFromSummary() + + protected function _checkQuoteResNumsFromSummary($res_num, $quotes, $with_quotes, $with_backlinks) + { + $ret = array(); + if (array_key_exists($res_num, $quotes)) { + foreach ($quotes[$res_num] as $quote_num) { + $ret[] = $quote_num; + if ($quote_num != $res_num) { + if (!isset($this->_quote_res_nums_checked[$quote_num])) { + $this->_quote_res_nums_checked[$quote_num] = true; + $ret = array_merge($ret, + $this->checkQuoteResNumsFromSummary($quote_num, $with_quotes, $with_backlinks)); + } + } + } + } + return $ret; + } + + // }}} + // {{{ getQuoteResNumsName() + + public function getQuoteResNumsName($name) + { + if (strlen(trim($name)) == 0 || $name == $this->_nanashiName) { + return false; + } + + // トリップを除去 + $name = preg_replace('/◆.*/', '', $name, 1); + $name = strip_tags($name); + + /* + //if (preg_match('/[0-9]+/', $name, $m)) { + return (int)$m[0]; + } + */ + + if (preg_match_all(self::getAnchorRegex('/(?:^|%prefix%)(%nums%)/'), $name, $matches)) { + foreach ($matches[1] as $a_quote_res_num) { + $quote_res_nums[] = (int)mb_convert_kana($a_quote_res_num, 'n'); + } + return array_unique($quote_res_nums); + } + + return false; + } + + // }}} + // {{{ _wikipediaFilter() + + /** + * [[語句]]があった時にWikipediaへ自動リンク + * + * @param string $msg メッセージ + * @return string + * + * original code: + * http://akid.s17.xrea.com/p2puki/index.phtml?%A5%E6%A1%BC%A5%B6%A1%BC%A5%AB%A5%B9%A5%BF%A5%DE%A5%A4%A5%BA%28rep2%20Ver%201.7.0%A1%C1%29#led2c85d + */ + protected function _wikipediaFilter($msg) + { + if (strpos($msg, '[[') === false) { + return $msg; + } + + $msg = preg_replace_callback('/\\[\\[([^\\[\\]\\n<>]+)\\]\\]+/u', + array($this, '_linkToWikipeidaCallback'), + mb_convert_encoding($msg, 'UTF-8', 'CP932')); + + return mb_convert_encoding($msg, 'CP932', 'UTF-8'); + } + + // }}} + // {{{ _linkToWikipeidaCallback() + + /** + * Wikipediaの語句をリンクに変換して返す. + * + * @param array $matches + * @return string + */ + protected function _linkToWikipeidaCallback($matches) + { + return '[[' . $this->_linkToWikipeida($matches[1]) . ']]'; + } + + // }}} + // {{{ _linkToWikipeida() + + /** + * Wikipediaの語句をリンクに変換して返す. + * + * @param string $word 語句 + * @return string + */ + abstract protected function _linkToWikipeida($word); + + // }}} + // {{{ _makeQuotes() + + /** + * レスデータを集計して$this->_quote_toと$this->_quote_fromに保存. + */ + protected function _makeQuotes() + { + global $_conf; + + $this->_quote_to = array(); + $this->_quote_from = array(); + + if (!$this->thread->datlines) { + return; + } + + foreach ($this->thread->datlines as $num => $line) { + list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($line); + + // NGあぼーんチェック + if (($id = $this->thread->ids[$num + 1]) !== null) { + $date_id = str_replace($this->thread->idp[$i] . $id, 'ID:' . $id, $date_id); + } + $ng_type = $this->_ngAbornCheck($num + 1, strip_tags($name), $mail, $date_id, $id, $msg); + if ($ng_type == self::ABORN) { + continue; + } + + // 名前 + if ($nmatches = $this->getQuoteResNumsName($name)) { + foreach ($nmatches as $a_quote_res_num) { + if ($a_quote_res_num) { + if (!array_key_exists($a_quote_res_num, $this->_quote_from) || $this->_quote_from[$a_quote_res_num] === null) { + $this->_quote_from[$a_quote_res_num] = array(); + } + if (!in_array($num + 1, $this->_quote_from[$a_quote_res_num])) { + $this->_quote_from[$a_quote_res_num][] = $num + 1; + } + + if (!array_key_exists($num + 1, $this->_quote_to) || $this->_quote_to[$num + 1] === null) { + $this->_quote_to[$num + 1] = array(); + } + if (!in_array($a_quote_res_num, $this->_quote_to[$num + 1])) { + $this->_quote_to[$num + 1][] = $a_quote_res_num; + } + } + } + } + + + // >>1のリンクをいったん外す + // >>1 + $msg = preg_replace('{<[Aa] .+?>(>>[1-9][\\d\\-]*)}', '$1', $msg); + if (!preg_match_all(self::getAnchorRegex('/%full%/'), $msg, $out, PREG_PATTERN_ORDER)) { + continue; + } + foreach ($out[2] as $numberq) { + if (!preg_match_all(self::getAnchorRegex('/(?:%prefix%)?(%a_range%)/'), $numberq, $anchors, PREG_PATTERN_ORDER)) continue; + foreach ($anchors[1] as $anchor) { + if (preg_match(self::getAnchorRegex('/(%a_num%)%range_delimiter%(?:%prefix%)?(%a_num%)/'), $anchor, $matches)) { + $from = intval(mb_convert_kana($matches[1], 'n')); + $to = intval(mb_convert_kana($matches[2], 'n')); + if ($from < 1 || $to < 1 || $from > $to + || ($to - $from + 1) > sizeof($this->thread->datlines)) { + continue; + } + if ($_conf['backlink_list_range_anchor_limit'] != 0) { + if ($to - $from >= $_conf['backlink_list_range_anchor_limit']) { + continue; + } + } + for ($i = $from; $i <= $to; $i++) { + if ($i > sizeof($this->thread->datlines)) { + break; + } + if ($_conf['backlink_list_future_anchor'] == 0) { + // レス番号以降のアンカーは無視する + if ($i >= $num + 1) { + continue; + } + } + if (!array_key_exists($i, $this->_quote_from) || $this->_quote_from[$i] === null) { + $this->_quote_from[$i] = array(); + } + if (!in_array($num + 1, $this->_quote_from[$i])) { + $this->_quote_from[$i][] = $num + 1; + } + } + } elseif (preg_match(self::getAnchorRegex('/(%a_num%)/'), $anchor, $matches)) { + $quote_num = intval(mb_convert_kana($matches[1], 'n')); + if (!array_key_exists($num + 1, $this->_quote_to) || $this->_quote_to[$num + 1] === null) { + $this->_quote_to[$num + 1] = array(); + } + if (!in_array($quote_num, $this->_quote_to[$num + 1])) { + $this->_quote_to[$num + 1][] = $quote_num; + } + + if ($_conf['backlink_list_future_anchor'] == 0) { + // レス番号以降のアンカーは無視する + if ($quote_num >= $num + 1) { + continue; + } + } + if (!array_key_exists($quote_num, $this->_quote_from) || $this->_quote_from[$quote_num] === null) { + $this->_quote_from[$quote_num] = array(); + } + if (!in_array($num + 1, $this->_quote_from[$quote_num])) { + $this->_quote_from[$quote_num][] = $num + 1; + } + } + } + } + } + } + + // }}} + // {{{ getQuoteFrom() + + /** + * 被レスリストを返す. + * + * @return array + */ + public function getQuoteFrom() + { + if ($this->_quote_from === null) { + $this->_makeQuotes(); // 被レスデータ集計 + } + return $this->_quote_from; + } + + // }}} + // {{{ getQuoteTo() + + /** + * レスリストを返す. + * + * @return array + */ + public function getQuoteTo() + { + if ($this->_quote_to === null) { + $this->_makeQuotes(); // レスデータ集計 + } + return $this->_quote_to; + } + + // }}} + // {{{ _quotebackListHtml() + + /** + * 被レスリストをHTMLで整形して返す. + * + * @param int $resnum レス番号 + * @param int $type 1:縦形式 2:横形式 3:展開用ブロック用文字列 + * @param bool $popup 横形式でのポップアップ処理(true:ポップアップする、false:挿入する) + * @return string + */ + protected function _quotebackListHtml($resnum, $type, $popup=true) + { + $quote_from = $this->getQuoteFrom(); + if (!array_key_exists($resnum, $quote_from)) return $ret; + + $anchors = $quote_from[$resnum]; + sort($anchors); + + if ($type == 1) { + return $this->_quotebackVerticalListHtml($anchors, $resnum); + } elseif ($type == 2) { + return $this->_quotebackHorizontalListHtml($anchors, $resnum); + } elseif ($type == 3) { + return $this->_quotebackResData($anchors, $resnum); + } + } + + // }}} + // {{{ _quotebackVerticalListHtml() + + protected function _quotebackVerticalListHtml($anchors, $resnum) + { + $ret = '
    '; + $anchor_cnt = 1; + foreach ($anchors as $anchor) { + if ($anchor_cnt > 1) { + $ret .= '
  • '; + } + if ($anchor_cnt < count($anchors)) { + $ret .= '
  • ├'; + } else { + $ret .= '
  • └'; + } + $ret .= ($anchor == $resnum) + ? $anchor + : $this->quoteRes($anchor, '', $anchor, true); + $anchor_cnt++; + } + $ret .= '
'; + return $ret; + } + + // }}} + // {{{ _quotebackHorizontalListHtml() + + protected function _quotebackHorizontalListHtml($anchors, $resnum) + { + $ret = '
'; + $count = 0; + + foreach ($anchors as $idx => $anchor) { + if ($anchor == $resnum) { + continue; + } + $anchor_link= $this->quoteRes('>>' . $anchor, '>>', $anchor); + $qres_id = ($this->_matome ? "t{$this->_matome}" : '') ."qr{$anchor}"; + $ret .= '
'; + $ret .= sprintf('
【参照レス:%s】
',$anchor_link); + $ret .= '
'; + $count++; + } + $ret .= '
'; + + return $ret; + } + + // }}} + // {{{ _quotebackResData() + + protected function _quotebackResData($anchors, $resnum) + { + $ret = array(); + foreach ($anchors as $idx => $anchor) { + if ($anchor == $resnum) { + continue; + } + $ret[] = ($this->_matome ? "t{$this->_matome}" : '') ."qr{$anchor}"; + } + + return join('/', $ret); + } + + // }}} + // {{{ getDatochiResiduums() + + /** + * DAT落ちの際に取得できた>>1と最後のレスをHTMLで返す. + * + * @return string|false + */ + public function getDatochiResiduums() + { + $ret = ''; + $elines = $this->thread->datochi_residuums; + if (!count($elines)) { + return $ret; + } + + $this->thread->onthefly = true; + $ret = "
on the fly
\n"; + $ret .= "
\n"; + + foreach($elines as $num => $line) { + $res = $this->transRes($line, $num); + if (is_array($res)) { + $ret .= $res['body'] . $res['q']; + } else { + $ret .= $res; + } + } + + $ret .= "
\n"; + + return $ret; + } + + // }}} + // {{{ getAutoFavRanks() + + /** + * 自動ランク設定を返す. + * + * @return array + */ + public function getAutoFavRank() + { + global $_conf; + + if ($this->_auto_fav_rank !== false) { + return $this->_auto_fav_rank; + } + + $ranks = explode(',', strtr($_conf['expack.ic2.fav_auto_rank_setting'], ' ', '')); + $ret = null; + if ($_conf['expack.misc.multi_favs']) { + $idx = 0; + if (!is_array($this->thread->favs)) { + return null; + } + foreach ($this->thread->favs as $fav) { + if ($fav) { + $rank = $ranks[$idx]; + if (is_numeric($rank)) { + $rank = intval($rank); + if ($ret === null) { + $ret = $rank; + } else { + $ret = max($ret, $rank); + } + } + } + $idx++; + } + } else { + if ($this->thread->fav && is_numeric($ranks[0])) { + $ret = intval($ranks[0]); + } + } + $this->_auto_fav_rank = $ret; + + return $ret; + } + + // }}} + // {{{ isAutoFavRankOverride() + + /** + * 自動ランク設定でランクを上書きすべきか返す. + * + * @param int $now 現在のランク + * @param int $new 自動ランク + * @return bool + */ + static public function isAutoFavRankOverride($now, $new) + { + global $_conf; + + switch ($_conf['expack.ic2.fav_auto_rank_override']) { + case 0: + return false; + break; + case 1: + return $now != $new; + break; + case 2: + return $now == 0 && $now != $new; + break; + case 3: + return $now < $new; + break; + default: + return false; + } + return false; + } + + // }}} + // {{{ getAnchorRegex() + + /** + * アンカーの正規表現を返す + * + * @param string $pattern ex)'/%full%/' + * @param boolean $unicode + * @return string + */ + static public function getAnchorRegex($pattern, $unicode = false) + { + if (!array_key_exists($pattern, self::$_anchorRegexes)) { + self::$_anchorRegexes[$pattern] = strtr($pattern, self::_getAnchorRegexParts()); + // 大差はないが compileMobile2chUriCallBack() のように preg_relplace_callback()してもいいかも。 + } + if ($unicode) { + return StrSjis::toUnicodePattern($_anchorRegexes[$pattern]); + } + return self::$_anchorRegexes[$pattern]; + } + + // }}} + // {{{ _getAnchorRegexParts() + + /** + * アンカーの構成要素(正規表現パーツの配列)を返す + * + * @param void + * @return string + */ + static private function _getAnchorRegexParts() + { + if (!is_null(self::$_anchorRegexParts)) { + return self::$_anchorRegexParts; + } + + $anchor = array(); + + // アンカーの構成要素(正規表現パーツの配列) + + // 空白文字 + $anchor_space = '(?:[ ]| )'; + //$anchor[' '] = ''; + + // アンカー引用子 >> + $anchor['prefix'] = "(?:(?:>|>|<|<|〉){1,2}|(?:\)){2}|》|≫){$anchor_space}*\.?"; + + // 数字 + $anchor['a_digit'] = '(?:\\d|0|1|2|3|4|5|6|7|8|9)'; + /* + $anchor[0] = '(?:0|0)'; + $anchor[1] = '(?:1|1)'; + $anchor[2] = '(?:2|2)'; + $anchor[3] = '(?:3|3)'; + $anchor[4] = '(?:4|4)'; + $anchor[5] = '(?:5|5)'; + $anchor[6] = '(?:6|6)'; + $anchor[7] = '(?:7|7)'; + $anchor[8] = '(?:8|8)'; + $anchor[9] = '(?:9|9)'; + */ + + // 範囲指定子 + // -|‐|ー = HYPHEN-MINUS | HYPHEN | KATAKANA-HIRAGANA PROLONGED SOUND MARK + $anchor['range_delimiter'] = '(?:-|\\x81\\x5d|\\x81\\x5b)'; // [\\-\\x{2010}\\x{30fc}] + + // 列挙指定子 + $anchor['delimiter'] = "{$anchor_space}?(?:[\.,=+]|、|・|=|,){$anchor_space}?"; + + // あぼーん用アンカー引用子 + //$anchor['prefix_abon'] = ">{1,2}{$anchor_space}?"; + + // レス番号 + $anchor['a_num'] = sprintf('%s{1,4}', $anchor['a_digit']); + + // レス範囲 + /* + $anchor['a_range'] = sprintf('%s(?:%s%s)?', + $anchor['a_num'], $anchor['range_delimiter'], $anchor['a_num'] + ); + */ + $anchor['a_range'] = sprintf('%s(?:%s(?:%s)?%s)?', + $anchor['a_num'], $anchor['range_delimiter'], $anchor['prefix'], $anchor['a_num'] + ); + + // レス範囲の列挙 + $anchor['ranges'] = sprintf('%s(?:%s%s)*(?!%s)', + $anchor['a_range'], $anchor['delimiter'], $anchor['a_range'], $anchor['a_digit'] + ); + + // レス番号の列挙 + $anchor['nums'] = sprintf('%s(?:%s%s)*(?!%s)', + $anchor['a_num'], $anchor['delimiter'], $anchor['a_num'], $anchor['a_digit'] + ); + + // アンカー全体 + $anchor['full'] = sprintf('(%s)(%s)', $anchor['prefix'], $anchor['ranges']); + + // getAnchorRegex() の strtr() 置換用にkeyを '%key%' に変換する + foreach ($anchor as $k => $v) { + $anchor['%' . $k . '%'] = $v; + unset($anchor[$k]); + } + + self::$_anchorRegexParts = $anchor; + + return self::$_anchorRegexParts; + } + + // }}} + // {{{_buildStrToLinkRegex() + + /** + * リンクとして扱うパターンを返す + * + * @param void + * @return string + */ + static protected function _buildStrToLinkRegex() + { + return '{' + . '(?P(<[Aa] .+?>)(.*?)())' // リンク(PCREの特性上、必ずこのパターンを最初に試行する) + . '|' + . '(?:' + . '(?P' // 引用 + . self::getAnchorRegex('%full%') + . ')' + . '|' + . '(?P' + . '(ftp|h?ttps?|tps?)://([0-9A-Za-z][\\w!#%&+*,\\-./:;=?@\\[\\]^~]+)' // URL + . ')' + . '|' + . '(?PID: ?([0-9A-Za-z/.+]{8,11})(?=[^0-9A-Za-z/.+]|$))' // ID(8,10桁 +PC/携帯識別フラグ) + . ')' + . '}'; + } + + // }}} +} + +// }}} + +/* + * Local Variables: + * mode: php + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ +// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/lib/live/live_ShowThreadPc.php b/lib/live/live_ShowThreadPc.php new file mode 100755 index 000000000..7c2f12102 --- /dev/null +++ b/lib/live/live_ShowThreadPc.php @@ -0,0 +1,1999 @@ +_url_handlers = array( + 'plugin_linkThread', + 'plugin_link2chSubject', + ); + // +Wiki + if (isset($GLOBALS['linkPluginCtl'])) { + $this->_url_handlers[] = 'plugin_linkPlugin'; + } + if (isset($GLOBALS['replaceImageUrlCtl'])) { + $this->_url_handlers[] = 'plugin_replaceImageUrl'; + } + if (P2_IMAGECACHE_AVAILABLE == 2) { + $this->_url_handlers[] = 'plugin_imageCache2'; + } elseif ($_conf['preview_thumbnail']) { + $this->_url_handlers[] = 'plugin_viewImage'; + } + if ($_conf['link_youtube']) { + $this->_url_handlers[] = 'plugin_linkYouTube'; + } + if ($_conf['link_niconico']) { + $this->_url_handlers[] = 'plugin_linkNicoNico'; + } + $this->_url_handlers[] = 'plugin_linkURL'; + + // imepitaのURLを加工してImageCache2させるプラグインを登録 + if (P2_IMAGECACHE_AVAILABLE == 2) { + $this->addURLHandler(array($this, 'plugin_imepitaToImageCache2')); + } + + // サムネイル表示制限数を設定 + if (!isset($GLOBALS['pre_thumb_unlimited']) || !isset($GLOBALS['pre_thumb_limit'])) { + if (isset($_conf['pre_thumb_limit']) && $_conf['pre_thumb_limit'] > 0) { + $GLOBALS['pre_thumb_limit'] = $_conf['pre_thumb_limit']; + $GLOBALS['pre_thumb_unlimited'] = false; + } else { + $GLOBALS['pre_thumb_limit'] = null; // ヌル値だとisset()はfalseを返す + $GLOBALS['pre_thumb_unlimited'] = true; + } + } + $GLOBALS['pre_thumb_ignore_limit'] = false; + + // アクティブモナー初期化 + if (P2_ACTIVEMONA_AVAILABLE) { + ExpackLoader::initActiveMona($this); + } + + // ImageCache2初期化 + if (P2_IMAGECACHE_AVAILABLE == 2) { + ExpackLoader::initImageCache($this); + } + + // 非同期レスポップアップ・SPM初期化 + $js_id = sprintf('%u', crc32($this->thread->keydat)); + if ($this->_matome) { + $this->asyncObjName = "t{$this->_matome}asp{$js_id}"; + $this->spmObjName = "t{$this->_matome}spm{$js_id}"; + } else { + $this->asyncObjName = "asp{$js_id}"; + $this->spmObjName = "spm{$js_id}"; + } + + // 名無し初期化 + $this->setBbsNonameName(); + } + + // }}} + // {{{ transRes() + + /** + * DatレスをHTMLレスに変換する + * + * @param string $ares datの1ライン + * @param int $i レス番号 + * @param string $pattern ハイライト用正規表現 + * @return string + */ + public function transRes($ares, $i, $pattern = null) + { + global $_conf, $STYLE, $mae_msg; + + list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($ares); + if (($id = $this->thread->ids[$i]) !== null) { + $idstr = 'ID:' . $id; + $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $date_id); + } else { + $idstr = null; + } + + // +Wiki:置換ワード + if (isset($GLOBALS['replaceWordCtl'])) { + $replaceWordCtl = $GLOBALS['replaceWordCtl']; + $name = $replaceWordCtl->replace('name', $this->thread, $ares, $i); + $mail = $replaceWordCtl->replace('mail', $this->thread, $ares, $i); + $date_id = $replaceWordCtl->replace('date', $this->thread, $ares, $i); + $msg = $replaceWordCtl->replace('msg', $this->thread, $ares, $i); + } + + $tores = ''; + $rpop = ''; + if ($this->_matome) { + $res_id = "t{$this->_matome}r{$i}"; + $msg_id = "t{$this->_matome}m{$i}"; + } else { + $res_id = "r{$i}"; + $msg_id = "m{$i}"; + } + $msg_class = 'message'; + + // NGあぼーんチェック + $ng_type = $this->_ngAbornCheck($i, strip_tags($name), $mail, $date_id, $id, $msg, false, $ng_info); + if ($ng_type == self::ABORN) { + return $this->_abornedRes($res_id); + } + if ($ng_type != self::NG_NONE) { + $ngaborns_head_hits = self::$_ngaborns_head_hits; + $ngaborns_body_hits = self::$_ngaborns_body_hits; + } + + // AA判定 + if ($this->am_autodetect && $this->activeMona->detectAA($msg)) { + $msg_class .= ' ActiveMona'; + } + + //============================================================= + // レスをポップアップ表示 + //============================================================= + if ($_conf['quote_res_view']) { + $quote_res_nums = $this->checkQuoteResNums($i, $name, $msg); + + foreach ($quote_res_nums as $rnv) { + if (!isset($this->_quote_res_nums_done[$rnv])) { + $this->_quote_res_nums_done[$rnv] = true; + if (isset($this->thread->datlines[$rnv-1])) { + if ($this->_matome) { + $qres_id = "t{$this->_matome}qr{$rnv}"; + } else { + $qres_id = "qr{$rnv}"; + } + $ds = $this->qRes($this->thread->datlines[$rnv-1], $rnv); + $onPopUp_at = " onmouseover=\"showResPopUp('{$qres_id}',event)\" onmouseout=\"hideResPopUp('{$qres_id}')\""; + $rpop .= "
\n{$ds}
\n"; + } + } + } + } + + //============================================================= + // まとめて出力 + //============================================================= + + $name = $this->transName($name); // 名前HTML変換 + $msg = $this->transMsg($msg, $i); // メッセージHTML変換 + + + // BEプロファイルリンク変換 + $date_id = $this->replaceBeId($date_id, $i); + + // HTMLポップアップ + if ($_conf['iframe_popup']) { + $date_id = preg_replace_callback("{((\?#*)|(Lv\.\d+))}", array($this, 'iframePopupCallback'), $date_id); + } + + // NGメッセージ変換 + if ($ng_type != self::NG_NONE && count($ng_info)) { + $ng_info = implode(', ', $ng_info); + $msg = <<{$ng_info} +
{$msg}
+EOMSG; + } + + // NGネーム変換 + if ($ng_type & self::NG_NAME) { + $name = <<{$name} +EONAME; + $msg = <<{$msg}
+EOMSG; + + // NGメール変換 + } elseif ($ng_type & self::NG_MAIL) { + $mail = <<{$mail} +EOMAIL; + $msg = <<{$msg} +EOMSG; + + // NGID変換 + } elseif ($ng_type & self::NG_ID) { + $date_id = <<{$date_id} +EOID; + $msg = <<{$msg} +EOMSG; + + } + + /* + //「ここから新着」画像を挿入 + if ($i == $this->thread->readnum +1) { + $tores .= <<新着レス +EOP; + } + */ + + // SPM + if ($_conf['expack.spm.enabled']) { + $spmeh = " onmouseover=\"{$this->spmObjName}.show({$i},'{$msg_id}',event)\""; + $spmeh .= " onmouseout=\"{$this->spmObjName}.hide(event)\""; + } else { + $spmeh = ''; + } + + // +live スレ内容表示部削除 + + /*if ($_conf['expack.am.enabled'] == 2) { + $tores .= << +// +\n +EOJS; + }*/ + + // まとめてフィルタ色分け + if ($pattern) { + $tores = StrCtl::filterMarking($pattern, $tores); + } + + return array('body' => $tores, 'q' => $rpop); + } + + // }}} + // {{{ quoteOne() + + /** + * >>1 を表示する (引用ポップアップ用) + */ + public function quoteOne() + { + global $_conf; + + if (!$_conf['quote_res_view']) { + return false; + } + + $rpop = ''; + $quote_res_nums = $this->checkQuoteResNums(0, '1', ''); + if (array_search(1, $quote_res_nums) === false) { + $quote_res_nums[] = 1; + } + + foreach ($quote_res_nums as $rnv) { + if (!isset($this->_quote_res_nums_done[$rnv])) { + $this->_quote_res_nums_done[$rnv] = true; + if (isset($this->thread->datlines[$rnv-1])) { + if ($this->_matome) { + $qres_id = "t{$this->_matome}qr{$rnv}"; + } else { + $qres_id = "qr{$rnv}"; + } + $ds = $this->qRes($this->thread->datlines[$rnv-1], $rnv); + $onPopUp_at = " onmouseover=\"showResPopUp('{$qres_id}',event)\" onmouseout=\"hideResPopUp('{$qres_id}')\""; + $rpop .= "
\n{$ds}
\n"; + } + } + } + + $res1['q'] = $rpop; + $res1['body'] = $this->transMsg('>>1', 1); + + return $res1; + } + + // }}} + // {{{ qRes() + + /** + * レス引用HTML + */ + public function qRes($ares, $i) + { + global $_conf; + + $resar = $this->thread->explodeDatLine($ares); + $name = $this->transName($resar[0]); + $mail = $resar[1]; + if (($id = $this->thread->ids[$i]) !== null) { + $idstr = 'ID:' . $id; + $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $resar[2]); + } else { + $idstr = null; + $date_id = $resar[2]; + } + $msg = $this->transMsg($resar[3], $i); + + $tores = ''; + + if ($this->_matome) { + $qmsg_id = "t{$this->_matome}qm{$i}"; + } else { + $qmsg_id = "qm{$i}"; + } + + // >>1 + if ($i == 1) { + $tores = "

{$this->thread->ttitle_hd}

"; + } + + // BEプロファイルリンク変換 + $date_id = $this->replaceBeId($date_id, $i); + + // HTMLポップアップ + if ($_conf['iframe_popup']) { + $date_id = preg_replace_callback("{((\?#*)|(Lv\.\d+))}", array($this, 'iframePopupCallback'), $date_id); + } + // + + // IDフィルタ + if ($_conf['flex_idpopup'] == 1 && $id && $this->thread->idcount[$id] > 1) { + $date_id = str_replace($idstr, $this->idFilter($idstr, $id), $date_id); + } + + $msg_class = 'message'; + + // AA 判定 + if ($this->am_autodetect && $this->activeMona->detectAA($msg)) { + $msg_class .= ' ActiveMona'; + } + + // SPM + if ($_conf['expack.spm.enabled']) { + $spmeh = " onmouseover=\"{$this->spmObjName}.show({$i},'{$qmsg_id}',event)\""; + $spmeh .= " onmouseout=\"{$this->spmObjName}.hide(event)\""; + } else { + $spmeh = ''; + } + + // $toresにまとめて出力 + $tores .= '
'; + $tores .= "{$i} : "; // 番号 + $tores .= preg_replace('{[ ]*}i', '', "{$name} : "); + if ($mail) { + $tores .= $mail . ' : '; // メール + } + $tores .= $date_id; // 日付とID + if ($this->am_side_of_id) { + $tores .= ' ' . $this->activeMona->getMona($qmsg_id); + } + $tores .= "
\n"; + + // 被レスリスト(縦形式) + if ($_conf['backlink_list'] == 1 || $_conf['backlink_list'] > 2) { + $tores .= $this->_quotebackListHtml($i, 1); + } + + $tores .= "
{$msg}
\n"; // 内容 + // 被レスリスト(横形式) + if ($_conf['backlink_list'] == 2 || $_conf['backlink_list'] > 2) { + $tores .= $this->_quotebackListHtml($i, 2); + } + + // 被参照ブロック用データ + if ($_conf['backlink_block'] > 0) { + $tores .= $this->_getBacklinkComment($i); + } + + return $tores; + } + + // }}} + // {{{ _getBacklinkComment() + + protected function _getBacklinkComment($i) + { + $backlinks = $this->_quotebackListHtml($i, 3); + if (strlen($backlinks)) { + return ''; + } + return ''; + } + + // }}} + // {{{ transName() + + /** + * 名前をHTML用に変換する + * + * @param string $name 名前 + * @return string + */ + public function transName($name) + { + global $_conf; + + // トリップやホスト付きなら分解する + if (($pos = strpos($name, '◆')) !== false) { + $trip = substr($name, $pos); + $name = substr($name, 0, $pos); + } else { + $trip = null; + } + + // 数字を引用レスポップアップリンク化 + if ($_conf['quote_res_view']) { + if (strlen($name) && $name != $this->_nanashiName) { + $name = preg_replace_callback( + self::getAnchorRegex('/(?:^|%prefix%)(%nums%)/'), + array($this, '_quoteNameCallback'), $name + ); + } + } + + if ($trip) { + $name .= $trip; + } elseif ($name) { + // 文字化け回避 + $name = $name . ' '; + //if (in_array(0xF0 & ord(substr($name, -1)), array(0x80, 0x90, 0xE0))) { + // $name .= ' '; + //} + } + + return $name; + } + + // }}} + // {{{ transMsg() + + /** + * datのレスメッセージをHTML表示用メッセージに変換する + * + * @param string $msg メッセージ + * @param int $mynum レス番号 + * @return string + */ + public function transMsg($msg, $mynum) + { + global $_conf; + global $pre_thumb_ignore_limit; + + // 2ch旧形式のdat + if ($this->thread->dat_type == '2ch_old') { + $msg = str_replace('@`', ',', $msg); + $msg = preg_replace('/&(?=[^;])/', '&', $msg); + } + + // &補正 + $msg = preg_replace('/&(?!#?\\w+;)/', '&', $msg); + + // Safariから投稿されたリンク中チルダの文字化け補正 + //$msg = preg_replace('{(h?t?tp://[\w\.\-]+/)〜([\w\.\-%]+/?)}', '$1~$2', $msg); + + // >>1のリンクをいったん外す + // >>1 + $msg = preg_replace('{<[Aa] .+?>(>>\\d[\\d\\-]*)}', '$1', $msg); + + // 本来は2chのDAT時点でなされていないとエスケープの整合性が取れない気がする。(URLリンクのマッチで副作用が出てしまう) + //$msg = str_replace(array('"', "'"), array('"', '''), $msg); + + // 2006/05/06 ノートンの誤反応対策 body onload=window() + $msg = str_replace('onload=window()', 'onload=window()', $msg); + + // 新着レスの画像は表示制限を無視する設定なら + if ($mynum > $this->thread->readnum && $_conf['expack.ic2.newres_ignore_limit']) { + $pre_thumb_ignore_limit = true; + } + + // 文末の改行と連続する改行を除去 + if ($_conf['strip_linebreaks']) { + $msg = $this->stripLineBreaks($msg /*, '
***
'*/); + } + + // 引用やURLなどをリンク + $msg = $this->transLink($msg); + + // Wikipedia記法への自動リンク + if ($_conf['_linkToWikipeida']) { + $msg = $this->_wikipediaFilter($msg); + } + + return $msg; + } + + // }}} + // {{{ _abornedRes() + + /** + * あぼーんレスのHTMLを取得する + * + * @param string $res_id + * @return string + */ + protected function _abornedRes($res_id) + { + global $_conf; + + if ($_conf['ngaborn_purge_aborn']) { + return ''; + } + + return << +
 
+
 
+\n +EOP; + } + + // }}} + // {{{ idFilter() + + /** + * IDフィルタリングポップアップ変換 + * + * @param string $idstr ID:xxxxxxxxxx + * @param string $id xxxxxxxxxx + * @return string + */ + public function idFilter($idstr, $id) + { + global $_conf; + + // IDは8桁または10桁(+携帯/PC識別子)と仮定して + /* + if (strlen($id) % 2 == 1) { + $id = substr($id, 0, -1); + } + */ + $num_ht = ''; + if (isset($this->thread->idcount[$id]) && $this->thread->idcount[$id] > 0) { + $num = (string) $this->thread->idcount[$id]; + if ($_conf['iframe_popup'] == 3) { + $num_ht = ' '; + $num_ht .= preg_replace('/\\d/', '', $num); + $num_ht .= ' '; + } else { + $num_ht = '('.$num.')'; + } + } else { + return $idstr; + } + + if ($_conf['coloredid.enable'] > 0 && preg_match("|^ID:[ ]?[0-9A-Za-z/.+]{8,11}|",$idstr)) { + if ($this->_ids_for_render === null) { + $this->_ids_for_render = array(); + } + $this->_ids_for_render[substr($id, 0, 8)] = $this->thread->idcount[$id]; + if ($_conf['coloredid.click'] > 0) { + $num_ht = '' . $num_ht . ''; + } + $idstr = $this->_coloredIdStr( + $idstr, $id, $_conf['coloredid.click'] > 0 ? true : false); + } + + $filter_url = $_conf['read_php'] . '?' . http_build_query(array( + 'host' => $this->thread->host, + 'bbs' => $this->thread->bbs, + 'key' => $this->thread->key, + 'ls' => 'all', + 'offline' => '1', + 'idpopup' => '1', + 'rf' => array( + 'field' => ResFilter::FIELD_ID, + 'method' => ResFilter::METHOD_JUST, + 'match' => ResFilter::MATCH_ON, + 'include' => ResFilter::INCLUDE_NONE, + 'word' => $id, + ), + ), '', '&') . $_conf['k_at_a']; + + if ($_conf['iframe_popup']) { + return $this->iframePopup($filter_url, $idstr, $_conf['bbs_win_target_at']) . $num_ht; + } + return "{$idstr}{$num_ht}"; + } + + // }}} + // {{{ _linkToWikipeida() + + /** + * @see ShowThread + */ + protected function _linkToWikipeida($word) + { + global $_conf; + + $link = 'http://ja.wikipedia.org/wiki/' . rawurlencode($word); + if ($_conf['through_ime']) { + $link = P2Util::throughIme($link); + } + + return "{$word}"; + } + + // }}} + // {{{ quoteRes() + + /** + * 引用変換(単独) + * + * @param string $full >>1-100 + * @param string $qsign >> + * @param string $appointed_num 1-100 + * @param bool $anchor_jump + * @return string + */ + public function quoteRes($full, $qsign, $appointed_num, $anchor_jump = false) + { + global $_conf; + + $appointed_num = mb_convert_kana($appointed_num, 'n'); // 全角数字を半角数字に変換 + if (preg_match('/\\D/', $appointed_num)) { + $appointed_num = preg_replace('/\\D+/', '-', $appointed_num); + return $this->quoteResRange($full, $qsign, $appointed_num); + } + if (preg_match('/^0/', $appointed_num)) { + return $full; + } + + $qnum = intval($appointed_num); + if ($qnum < 1 || $qnum > sizeof($this->thread->datlines)) { + return $full; + } + + // あぼーんレスへのアンカー + if ($_conf['quote_res_view_aborn'] == 0 && + in_array($qnum, $this->_aborn_nums)) { + return '' . "{$full}"; + } + + if ($anchor_jump && $qnum >= $this->thread->resrange['start'] && $qnum <= $this->thread->resrange['to']) { + $read_url = '#' . ($this->_matome ? "t{$this->_matome}" : '') . "r{$qnum}"; + } else { + $read_url = "{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&offline=1&ls={$appointed_num}"; + } + $attributes = $_conf['bbs_win_target_at']; + if ($_conf['quote_res_view'] && ($_conf['quote_res_view_ng'] != 0 || + !in_array($qnum, $this->_ng_nums))) { + if ($this->_matome) { + $qres_id = "t{$this->_matome}qr{$qnum}"; + } else { + $qres_id = "qr{$qnum}"; + } + $attributes .= " onmouseover=\"showResPopUp('{$qres_id}',event)\""; + $attributes .= " onmouseout=\"hideResPopUp('{$qres_id}')\""; + } + return "_aborn_nums) ? ' class="abornanchor"' : + (in_array($qnum, $this->_ng_nums) ? ' class="nganchor"' : '')) + . ">{$full}"; + } + + // }}} + // {{{ quoteResRange() + + /** + * 引用変換(範囲) + * + * @param string $full >>1-100 + * @param string $qsign >> + * @param string $appointed_num 1-100 + * @return string + */ + public function quoteResRange($full, $qsign, $appointed_num) + { + global $_conf; + + if ($appointed_num == '-') { + return $full; + } + + $read_url = "{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&offline=1&ls={$appointed_num}n"; + + if ($_conf['iframe_popup']) { + $pop_url = $read_url . "&renzokupop=true"; + return $this->iframePopup(array($read_url, $pop_url), $full, $_conf['bbs_win_target_at'], 1); + } + + // 普通にリンク + return "{$full}"; + + // 1つ目を引用レスポップアップ + /* + $qnums = explode('-', $appointed_num); + $qlink = $this->quoteRes($qsign . $qnum[0], $qsign, $qnum[0]) . '-'; + if (isset($qnums[1])) { + $qlink .= $qnums[1]; + } + return $qlink; + */ + } + + // }}} + // {{{ iframePopup() + + /** + * HTMLポップアップ変換 + * + * @param string|array $url + * @param string|array $str + * @param string $attr + * @param int|null $mode + * @param bool $marker + * @return string + */ + public function iframePopup($url, $str, $attr = '', $mode = null, $marker = false) + { + global $_conf; + + // リンク用URLとポップアップ用URL + if (is_array($url)) { + $link_url = $url[0]; + $pop_url = $url[1]; + } else { + $link_url = $url; + $pop_url = $url; + } + + // リンク文字列とポップアップの印 + if (is_array($str)) { + $link_str = $str[0]; + $pop_str = $str[1]; + } else { + $link_str = $str; + $pop_str = null; + } + + // リンクの属性 + if (is_array($attr)) { + $_attr = $attr; + $attr = ''; + foreach ($_attr as $key => $value) { + $attr .= ' ' . $key . '="' . p2h($value) . '"'; + } + } elseif ($attr !== '' && substr($attr, 0, 1) != ' ') { + $attr = ' ' . $attr; + } + + // リンクの属性にHTMLポップアップ用のイベントハンドラを加える + $pop_attr = $attr; + if ($_conf['iframe_popup_event'] == 1) { + $pop_attr .= " onclick=\"stophide=true; showHtmlPopUp('{$pop_url}',event,0" . ($marker ? ' ,this' : '') . "); return false;\""; + } else { + $pop_attr .= " onmouseover=\"showHtmlPopUp('{$pop_url}',event,{$_conf['iframe_popup_delay']}" . ($marker ? ' ,this' : '') . ")\""; + } + $pop_attr .= " onmouseout=\"offHtmlPopUp()\""; + + // 最終調整 + if (is_null($mode)) { + $mode = $_conf['iframe_popup']; + } + if ($mode == 2 && !is_null($pop_str)) { + $mode = 3; + } elseif ($mode == 3 && is_null($pop_str)) { + global $skin, $STYLE; + + $custom_pop_img = "skin/{$skin}/pop.png"; + if (file_exists($custom_pop_img)) { + $pop_img = p2h($custom_pop_img); + $x = $STYLE['iframe_popup_mark_width']; + $y = $STYLE['iframe_popup_mark_height']; + } else { + $pop_img = 'img/pop.png'; + $y = $x = 12; + } + $pop_str = "\"\""; + } + + // リンク作成 + switch ($mode) { + // マーク無し + case 1: + return "{$link_str}"; + // (p)マーク + case 2: + return "(p){$link_str}"; + // [p]画像、サムネイルなど + case 3: + return "{$pop_str}{$link_str}"; + // ポップアップしない + default: + return "{$link_str}"; + } + } + + // }}} + // {{{ iframePopupCallback() + + /** + * HTMLポップアップ変換(コールバック用インターフェース) + * + * @param array $s 正規表現にマッチした要素の配列 + * @return string + */ + public function iframePopupCallback($s) + { + return $this->iframePopup(p2h($s[1], false), p2h($s[3], false), $s[2]); + } + + // }}} + // {{{ _coloredIdStr() + + /** + * Merged from http://jiyuwiki.com/index.php?cmd=read&page=rep2%A4%C7%A3%C9%A3%C4%A4%CE%C7%D8%B7%CA%BF%A7%CA%D1%B9%B9&alias%5B%5D=pukiwiki%B4%D8%CF%A2 + * + * @return string + */ + protected function _coloredIdStr($idstr, $id, $classed = false) + { + global $_conf; + + if (!(isset($this->thread->idcount[$id]) + && $this->thread->idcount[$id] > 1)) { + return $idstr; + } + if ($classed) { + return $this->_coloredIdStrClassed($idstr, $id); + } + + switch ($_conf['coloredid.rate.type']) { + case 1: + $rate = $_conf['coloredid.rate.times']; + break; + case 2: + $rate = $this->getIdCountRank(10); + break; + case 3: + $rate = $this->getIdCountAverage(); + break; + default: + return $idstr; + } + + if ($rate > 1 && $this->thread->idcount[$id] >= $rate) { + switch ($_conf['coloredid.coloring.type']) { + case 0: + return $this->_coloredIdStr0($idstr, $id); + break; + case 1: + return $this->_coloredIdStr1($idstr, $id); + break; + default: + return $idstr; + } + } + + return $idstr; + } + + // }}} + // {{{ _coloredIdStrClassed() + + private function _coloredIdStrClassed($idstr, $id) + { + $ret = array(); + $arr = explode(':', $idstr); + foreach ($arr as $i => $str) { + if ($i == 0 || $i == 1) { + $ret[] = '' . $str . ''; + } else { + $ret[] = $str; + } + } + return implode(':', $ret); + } + + // }}} + // {{{ _coloredIdStr0() + + /** + * IDカラー オリジナル着色用 + */ + private function _coloredIdStr0($idstr, $id) + { + if (!function_exists('coloredIdStyle0')) { + require P2_LIB_DIR . '/color/coloredIdStyle0.inc.php'; + } + + if (isset($this->idstyles[$id])) { + $colored = $this->idstyles[$id]; + } else { + $colored = coloredIdStyle0($id, $this->thread->idcount[$id]); + $this->idstyles[$id] = $colored; + } + $ret = array(); + foreach ($arr = explode(':', $idstr) as $i => $str) { + if ($colored[$i]) { + $ret[] = "{$str}"; + } else { + $ret[] = $str; + } + } + return implode(':', $ret); + } + + // }}} + // {{{ _coloredIdStr1() + + /** + * IDカラー thermon版用 + */ + private function _coloredIdStr1($idstr, $id) + { + if (!function_exists('coloredIdStyle')) { + require P2_LIB_DIR . '/color/coloredIdStyle.inc.php'; + } + + $colored = coloredIdStyle($idstr, $id, $this->thread->idcount[$id]); + $idstr2 = preg_split('/:/',$idstr,2); // コロンでID文字列を分割 + $ret = array_shift($idstr2).':'; + if ($colored[1]) { + $idstr2[1] = substr($idstr2[0], 4); + $idstr2[0] = substr($idstr2[0], 0, 4); + } + foreach ($idstr2 as $i => $str) { + if ($colored[$i]) { + $ret .= "{$str}"; + } else { + $ret .= $str; + } + } + return $ret; + } + + // }}} + // {{{ cssClassedId() + + /** + * IDカラーに使用するCSSクラス名をID文字列から算出して返す. + */ + static public function cssClassedId($id) + { + return 'idcss-' . bin2hex( + base64_decode(str_replace('.', '+', substr($id, 0, 8)))); + } + + // }}} + // {{{ ユーティリティメソッド + // {{{ imageHtmlPopup() + + /** + * 画像をHTMLポップアップ&ポップアップウインドウサイズに合わせる + */ + public function imageHtmlPopup($img_url, $img_tag, $link_str) + { + global $_conf; + + if ($_conf['expack.ic2.enabled'] && $_conf['expack.ic2.fitimage']) { + $popup_url = 'ic2_fitimage.php?url=' . rawurlencode(str_replace('&', '&', $img_url)); + } else { + $popup_url = $img_url; + } + + $pops = ($_conf['iframe_popup'] == 1) ? $img_tag . $link_str : array($link_str, $img_tag); + return $this->iframePopup(array($img_url, $popup_url), $pops, $_conf['ext_win_target_at'], null, true); + } + + // }}} + // {{{ respopToAsync() + + /** + * レスポップアップを非同期モードに加工する + */ + public function respopToAsync($str) + { + $respop_regex = '/(onmouseover)=\"(showResPopUp\(\'(q(\d+)of\d+)\',event\).*?)\"/'; + $respop_replace = '$1="loadResPopUp(' . $this->asyncObjName . ', $4);$2"'; + return preg_replace($respop_regex, $respop_replace, $str); + } + + // }}} + // {{{ getASyncObjJs() + + /** + * 非同期読み込みで利用するJavaScriptオブジェクトを生成する + */ + public function getASyncObjJs() + { + global $_conf; + static $done = array(); + + if (isset($done[$this->asyncObjName])) { + return; + } + $done[$this->asyncObjName] = true; + + $code = << +//asyncObjName} = { + host:"{$this->thread->host}", bbs:"{$this->thread->bbs}", key:"{$this->thread->key}", + readPhp:"{$_conf['read_php']}", readTarget:"{$_conf['bbs_win_target']}" +}; +//]]> +\n +EOJS; + return $code; + } + + // }}} + // {{{ getSpmObjJs() + + /** + * スマートポップアップメニューを生成するJavaScriptコードを生成する + */ + public function getSpmObjJs($retry = false) + { + global $_conf, $STYLE; + + if (isset(self::$_spm_objects[$this->spmObjName])) { + return $retry ? self::$_spm_objects[$this->spmObjName] : ''; + } + + $ttitle_en = UrlSafeBase64::encode($this->thread->ttitle); + + if ($_conf['expack.spm.filter_target'] == '' || $_conf['expack.spm.filter_target'] == 'read') { + $_conf['expack.spm.filter_target'] = '_self'; + } + + $motothre_url = $this->thread->getMotoThread(); + $motothre_url = substr($motothre_url, 0, strlen($this->thread->ls) * -1); + + $_spmOptions = array( + 'null', + ((!$_conf['disable_res'] && $_conf['expack.spm.kokores']) ? (($_conf['expack.spm.kokores_orig']) ? '2' : '1') : '0'), + (($_conf['expack.spm.ngaborn']) ? (($_conf['expack.spm.ngaborn_confirm']) ? '2' : '1') : '0'), + (($_conf['expack.spm.filter']) ? '1' : '0'), + (($this->am_on_spm) ? '1' : '0'), + (($_conf['expack.aas.enabled']) ? '1' : '0'), + ); + $spmOptions = implode(',', $_spmOptions); + + // エスケープ + $_spm_title = StrCtl::toJavaScript($this->thread->ttitle_hc); + $_spm_url = addslashes($motothre_url); + $_spm_host = addslashes($this->thread->host); + $_spm_bbs = addslashes($this->thread->bbs); + $_spm_key = addslashes($this->thread->key); + $_spm_ls = addslashes($this->thread->ls); + + $code = << +//spmObjName} = { + 'objName':'{$this->spmObjName}', + 'rc':'{$this->thread->rescount}', + 'title':'{$_spm_title}', + 'ttitle_en':'{$ttitle_en}', + 'url':'{$_spm_url}', + 'host':'{$_spm_host}', + 'bbs':'{$_spm_bbs}', + 'key':'{$_spm_key}', + 'ls':'{$_spm_ls}', + 'spmOption':[{$spmOptions}] +}; +SPM.init({$this->spmObjName}); +//]]> +\n +EOJS; + + self::$_spm_objects[$this->spmObjName] = $code; + + return $code; + } + + // }}} + // }}} + // {{{ transLinkDo()から呼び出されるURL書き換えメソッド + /** + * これらのメソッドは引数が処理対象パターンに合致しないとfalseを返し、 + * transLinkDo()はfalseが返ってくると$_url_handlersに登録されている次の関数/メソッドに処理させようとする。 + */ + // {{{ plugin_linkURL() + + /** + * URLリンク + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_linkURL($url, $purl, $str) + { + global $_conf; + + if (isset($purl['scheme'])) { + // ime + if ($_conf['through_ime']) { + $link_url = P2Util::throughIme($purl[0]); + } else { + $link_url = $url; + } + + $is_http = ($purl['scheme'] == 'http' || $purl['scheme'] == 'https'); + + // HTMLポップアップ + if ($_conf['iframe_popup'] && $is_http) { + // *pm 指定の場合のみ、特別に手動転送指定を追加する + if (substr($_conf['through_ime'], -2) == 'pm') { + $pop_url = P2Util::throughIme($purl[0], -1); + } else { + $pop_url = $link_url; + } + $link = $this->iframePopup(array($link_url, $pop_url), $str, $_conf['ext_win_target_at']); + } else { + $link = "{$str}"; + } + + // ブラクラチェッカ + if ($_conf['brocra_checker_use'] && $_conf['brocra_checker_url'] && $is_http) { + if (strlen($_conf['brocra_checker_query'])) { + $brocra_checker_url = $_conf['brocra_checker_url'] . '?' . $_conf['brocra_checker_query'] . '=' . rawurlencode($purl[0]); + } else { + $brocra_checker_url = rtrim($_conf['brocra_checker_url'], '/') . '/' . $url; + } + $brocra_checker_url_orig = $brocra_checker_url; + // ブラクラチェッカ・ime + if ($_conf['through_ime']) { + $brocra_checker_url = P2Util::throughIme($brocra_checker_url); + } + $check_mark = 'チェック'; + $check_mark_prefix = '['; + $check_mark_suffix = ']'; + // ブラクラチェッカ・HTMLポップアップ + if ($_conf['iframe_popup']) { + // *pm 指定の場合のみ、特別に手動転送指定を追加する + if (substr($_conf['through_ime'], -2) == 'pm') { + $brocra_checker_url = P2Util::throughIme($brocra_checker_url_orig, -1); + } else { + $brocra_pop_url = $brocra_checker_url; + } + if ($_conf['iframe_popup'] == 3) { + $check_mark = ''; + $check_mark_prefix = ''; + $check_mark_suffix = ''; + } + $brocra_checker_link = $this->iframePopup(array($brocra_checker_url, $brocra_pop_url), $check_mark, $_conf['ext_win_target_at']); + } else { + $brocra_checker_link = "{$check_mark}"; + } + $link .= $check_mark_prefix . $brocra_checker_link . $check_mark_suffix; + } + + return $link; + } + return false; + } + + // }}} + // {{{ plugin_link2chSubject() + + /** + * 2ch bbspink 板リンク + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_link2chSubject($url, $purl, $str) + { + global $_conf; + + if (preg_match('{^http://(\\w+\\.(?:2ch\\.net|bbspink\\.com))/(\\w+)/$}', $purl[0], $m)) { + $subject_url = "{$_conf['subject_php']}?host={$m[1]}&bbs={$m[2]}"; + return "{$str} [板をp2で開く]"; + } + return false; + } + + // }}} + // {{{ plugin_linkThread() + + /** + * スレッドリンク + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_linkThread($url, $purl, $str) + { + global $_conf; + + list($nama_url, $host, $bbs, $key, $ls) = P2Util::detectThread($purl[0]); + if ($host && $bbs && $key) { + $read_url = "{$_conf['read_php']}?host={$host}&bbs={$bbs}&key={$key}&ls={$ls}"; + if ($_conf['iframe_popup']) { + if ($ls && preg_match('/^[0-9\\-n]+$/', $ls)) { + $pop_url = $read_url; + } else { + $pop_url = $read_url . '&one=true'; + } + return $this->iframePopup(array($read_url, $pop_url), $str, $_conf['bbs_win_target_at']); + } + return "{$str}"; + } + + return false; + } + + // }}} + // {{{ plugin_linkYouTube() + + /** + * YouTubeリンク変換プラグイン + * + * Zend_Gdata_Youtubeを使えばサムネイルその他の情報を簡単に取得できるが... + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_linkYouTube($url, $purl, $str) + { + global $_conf; + + // http://www.youtube.com/watch?v=Mn8tiFnAUAI + // http://m.youtube.com/watch?v=OhcX0xJsDK8&client=mv-google&gl=JP&hl=ja&guid=ON&warned=True + if (preg_match('{^http://(www|jp|m)\\.youtube\\.com/watch\\?(?:.+&)?v=([0-9a-zA-Z_\\-]+)}', $url, $m)) { + // ime + if ($_conf['through_ime']) { + $link_url = P2Util::throughIme($url); + } else { + $link_url = $url; + } + + // HTMLポップアップ + if ($_conf['iframe_popup']) { + $link = $this->iframePopup($link_url, $str, $_conf['ext_win_target_at']); + } else { + $link = "{$str}"; + } + + $subd = $m[1]; + $id = $m[2]; + + if ($_conf['link_youtube'] == 2) { + return << +EOP; + } else { + return << +EOP; + } + } + return false; + } + + // }}} + // {{{ plugin_linkNicoNico() + + /** + * ニコニコ動画変換プラグイン + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_linkNicoNico($url, $purl, $str) + { + global $_conf; + + // http://www.nicovideo.jp/watch?v=utbrYUJt9CSl0 + // http://www.nicovideo.jp/watch/utvWwAM30N0No + // http://m.nicovideo.jp/watch/sm7044684 + if (preg_match('{^http://(?:www|m)\\.nicovideo\\.jp/watch(?:/|(?:\\?v=))([0-9a-zA-Z_-]+)}', $url, $m)) { + // ime + if ($_conf['through_ime']) { + $link_url = P2Util::throughIme($purl[0]); + } else { + $link_url = $url; + } + + // HTMLポップアップ + if ($_conf['iframe_popup']) { + $link = $this->iframePopup($link_url, $str, $_conf['ext_win_target_at']); + } else { + $link = "{$str}"; + } + + $id = $m[1]; + + if ($_conf['link_niconico'] == 2) { + return << +EOP; + } else { + return << +EOP; + } + } + return false; + } + + // }}} + // {{{ plugin_viewImage() + + /** + * 画像ポップアップ変換 + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_viewImage($url, $purl, $str) + { + global $_conf; + global $pre_thumb_unlimited, $pre_thumb_limit; + + if (P2Util::isUrlWikipediaJa($url)) { + return false; + } + + // 表示制限 + if (!$pre_thumb_unlimited && empty($pre_thumb_limit)) { + return false; + } + + if (preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $purl[0]) && empty($purl['query'])) { + $pre_thumb_limit--; // 表示制限カウンタを下げる + $img_tag = ""; + + if ($_conf['iframe_popup']) { + $view_img = $this->imageHtmlPopup($url, $img_tag, $str); + } else { + $view_img = "{$img_tag}{$str}"; + } + + // ブラクラチェッカ (プレビューとは相容れないのでコメントアウト) + /*if ($_conf['brocra_checker_use']) { + $link_url_en = rawurlencode($url); + if ($_conf['iframe_popup'] == 3) { + $check_mark = ''; + $check_mark_prefix = ''; + $check_mark_suffix = ''; + } else { + $check_mark = 'チェック'; + $check_mark_prefix = '['; + $check_mark_suffix = ']'; + } + $view_img .= $check_mark_prefix . "{$check_mark}" . $check_mark_suffix; + }*/ + + return $view_img; + } + + return false; + } + + // }}} + // {{{ plugin_imageCache2() + + /** + * ImageCache2サムネイル変換 + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_imageCache2($url, $purl, $str, + $force = false, + $referer = null) + { + static $serial = 0; + + global $_conf; + global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit; + + if (P2Util::isUrlWikipediaJa($url)) { + return false; + } + + if ((preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $purl[0]) && empty($purl['query'])) || $force) { + // 準備 + $serial++; + $thumb_id = 'thumbs' . $serial . $this->thumb_id_suffix; + $tmp_thumb = './img/ic_load.png'; + $url_ht = $url; + $url = $purl[0]; + $url_en = rawurlencode($url) . + ($referer ? '&ref=' . rawurlencode($referer) : ''); + $img_id = null; + + $icdb = new ImageCache2_DataObject_Images(); + + // r=0:リンク;r=1:リダイレクト;r=2:PHPで表示 + // t=0:オリジナル;t=1:PC用サムネイル;t=2:携帯用サムネイル;t=3:中間イメージ + $img_url = 'ic2.php?r=1&uri=' . $url_en; + $thumb_url = 'ic2.php?r=1&t=1&uri=' . $url_en; + // お気にスレ自動画像ランク + $rank = null; + if ($_conf['expack.ic2.fav_auto_rank']) { + $rank = $this->getAutoFavRank(); + if ($rank !== null) { + $thumb_url .= '&rank=' . $rank; + } + } + + // DBに画像情報が登録されていたとき + if ($icdb->get($url)) { + $img_id = $icdb->id; + + // ウィルスに感染していたファイルのとき + if ($icdb->mime == 'clamscan/infected') { + return " {$str}"; + } + // あぼーん画像のとき + if ($icdb->rank < 0) { + return " {$str}"; + } + + // オリジナルがキャッシュされているときは画像を直接読み込む + $_img_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); + if (file_exists($_img_url)) { + $img_url = $_img_url; + $cached = true; + } else { + $cached = false; + } + + // サムネイルが作成されていているときは画像を直接読み込む + $_thumb_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); + if (file_exists($_thumb_url)) { + $thumb_url = $_thumb_url; + // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 + if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false){ + $update = new ImageCache2_DataObject_Images(); + if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { + $update->memo = $this->img_memo . ' ' . $icdb->memo; + } else { + $update->memo = $this->img_memo; + } + $update->whereAddQuoted('uri', '=', $url); + } + + // expack.ic2.fav_auto_rank_override の設定とランク条件がOKなら + // お気にスレ自動画像ランクを上書き更新 + if ($rank !== null && + self::isAutoFavRankOverride($icdb->rank, $rank)) { + if ($update === null) { + $update = new ImageCache2_DataObject_Images(); + $update->whereAddQuoted('uri', '=', $url); + } + $update->rank = $rank; + } + + if ($update !== null) { + $update->update(); + } + } + + // サムネイルの画像サイズ + $thumb_size = $this->thumbnailer->calc($icdb->width, $icdb->height); + $thumb_size = preg_replace('/(\d+)x(\d+)/', 'width="$1" height="$2"', $thumb_size); + $tmp_thumb = './img/ic_load1.png'; + + $orig_img_url = $img_url; + $orig_thumb_url = $thumb_url; + + // 画像がキャッシュされていないとき + // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める + } else { + // 画像がブラックリストorエラーログにあるか確認 + if (false !== ($errcode = $icdb->ic2_isError($url))) { + return " {$str}"; + } + + $cached = false; + + $orig_img_url = $img_url; + $orig_thumb_url = $thumb_url; + $img_url .= $this->img_memo_query; + $thumb_url .= $this->img_memo_query; + $thumb_size = ''; + $tmp_thumb = './img/ic_load2.png'; + } + + // キャッシュされておらず、表示数制限が有効のとき + if (!$cached && !$pre_thumb_unlimited && !$pre_thumb_ignore_limit) { + // 表示制限を超えていたら、表示しない + // 表示制限を超えていなければ、表示制限カウンタを下げる + if ($pre_thumb_limit <= 0) { + $show_thumb = false; + } else { + $show_thumb = true; + $pre_thumb_limit--; + } + } else { + $show_thumb = true; + } + + // 表示モード + if ($show_thumb) { + $img_tag = ""; + if ($_conf['iframe_popup']) { + $view_img = $this->imageHtmlPopup($img_url, $img_tag, $str); + } else { + $view_img = "{$img_tag}{$str}"; + } + } else { + $img_tag = ""; + $view_img = "{$img_tag}{$str}"; + } + + // ソースへのリンクをime付きで表示 + if ($_conf['expack.ic2.enabled'] && $_conf['expack.ic2.through_ime']) { + $ime_url = P2Util::throughIme($url); + if ($_conf['iframe_popup'] == 3) { + $ime_mark = ''; + } else { + $ime_mark = '[ime]'; + } + $view_img .= " {$ime_mark}"; + } + + $view_img .= ''; + + return $view_img; + } + + return false; + } + + // }}} + // {{{ plugin_replaceImageUrl() + + /** + * 置換画像URL+ImageCache2 + */ + public function plugin_replaceImageUrl($url, $purl, $str) + { + static $serial = 0; + + global $_conf; + global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit; + + // +Wiki + global $replaceImageUrlCtl; + + $url = $purl[0]; + $replaced = $replaceImageUrlCtl->replaceImageUrl($url); + if (!$replaced[0]) { + return false; + } + + foreach ($replaced as $v) { + $url_en = rawurlencode($v['url']); + $url_ht = p2h($v['url']); + $ref_en = $v['referer'] ? '&ref=' . rawurlencode($v['referer']) : ''; + + // 準備 + $serial++; + $thumb_id = 'thumbs' . $serial . $this->thumb_id_suffix; + $tmp_thumb = './img/ic_load.png'; + + $icdb = new ImageCache2_DataObject_Images(); + + // r=0:リンク;r=1:リダイレクト;r=2:PHPで表示 + // t=0:オリジナル;t=1:PC用サムネイル;t=2:携帯用サムネイル;t=3:中間イメージ + // +Wiki + $img_url = 'ic2.php?r=1&uri=' . $url_en . $ref_en; + $thumb_url = 'ic2.php?r=1&t=1&uri=' . $url_en . $ref_en; + // お気にスレ自動画像ランク + $rank = null; + if ($_conf['expack.ic2.fav_auto_rank']) { + $rank = $this->getAutoFavRank(); + if ($rank !== null) $thumb_url .= '&rank=' . $rank; + } + + // DBに画像情報が登録されていたとき + if ($icdb->get($v['url'])) { + + // ウィルスに感染していたファイルのとき + if ($icdb->mime == 'clamscan/infected') { + $result .= ""; + continue; + } + // あぼーん画像のとき + if ($icdb->rank < 0) { + $result .= ""; + continue; + } + + // オリジナルがキャッシュされているときは画像を直接読み込む + $_img_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); + if (file_exists($_img_url)) { + $img_url = $_img_url; + $cached = true; + } else { + $cached = false; + } + + // サムネイルが作成されていているときは画像を直接読み込む + $_thumb_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); + if (file_exists($_thumb_url)) { + $thumb_url = $_thumb_url; + // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 + if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false){ + $update = new ImageCache2_DataObject_Images(); + if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { + $update->memo = $this->img_memo . ' ' . $icdb->memo; + } else { + $update->memo = $this->img_memo; + } + $update->whereAddQuoted('uri', '=', $v['url']); + } + + // expack.ic2.fav_auto_rank_override の設定とランク条件がOKなら + // お気にスレ自動画像ランクを上書き更新 + if ($rank !== null && + self::isAutoFavRankOverride($icdb->rank, $rank)) { + if ($update === null) { + $update = new ImageCache2_DataObject_Images(); + $update->whereAddQuoted('uri', '=', $v['url']); + } + $update->rank = $rank; + } + + if ($update !== null) { + $update->update(); + } + } + + // サムネイルの画像サイズ + $thumb_size = $this->thumbnailer->calc($icdb->width, $icdb->height); + $thumb_size = preg_replace('/(\d+)x(\d+)/', 'width="$1" height="$2"', $thumb_size); + $tmp_thumb = './img/ic_load1.png'; + + $orig_img_url = $img_url; + $orig_thumb_url = $thumb_url; + + // 画像がキャッシュされていないとき + // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める + } else { + // 画像がブラックリストorエラーログにあるか確認 + if (false !== ($errcode = $icdb->ic2_isError($v['url']))) { + $result .= ""; + continue; + } + + $cached = false; + + $orig_img_url = $img_url; + $orig_thumb_url = $thumb_url; + $img_url .= $this->img_memo_query; + $thumb_url .= $this->img_memo_query; + $thumb_size = ''; + $tmp_thumb = './img/ic_load2.png'; + } + + // キャッシュされておらず、表示数制限が有効のとき + if (!$cached && !$pre_thumb_unlimited && !$pre_thumb_ignore_limit) { + // 表示制限を超えていたら、表示しない + // 表示制限を超えていなければ、表示制限カウンタを下げる + if ($pre_thumb_limit <= 0) { + $show_thumb = false; + } else { + $show_thumb = true; + $pre_thumb_limit--; + } + } else { + $show_thumb = true; + } + + // 表示モード + if ($show_thumb) { + $img_tag = ""; + if ($_conf['iframe_popup']) { + $view_img = $this->imageHtmlPopup($img_url, $img_tag, ''); + } else { + $view_img = "{$img_tag}"; + } + } else { + $img_tag = ""; + $view_img = "{$img_tag}"; + } + + $view_img .= '"; + . "'{$url_ht}', event)\">"; + + $result .= $view_img; + } + // ソースへのリンクをime付きで表示 + $ime_url = P2Util::throughIme($url); + $result .= "{$str}"; + return $result; + } + + /** + * +Wiki:リンクプラグイン + */ + public function plugin_linkPlugin($url, $purl, $str) + { + return $GLOBALS['linkPluginCtl']->replaceLinkToHTML($url, $str); + } + + // }}} + // {{{ plugin_imepitaToImageCache2() + + /** + * imepitaのURLを加工してImageCache2させるプラグイン + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_imepitaToImageCache2($url, $purl, $str) + { + if (preg_match('{^https?://imepita\.jp/(?:image/)?(\d{8}/\d{6})}i', + $purl[0], $m) && empty($purl['query'])) { + $_url = 'http://imepita.jp/image/' . $m[1]; + $_purl = @parse_url($_url); + $_purl[0] = $_url; + return $this->plugin_imageCache2($_url, $_purl, $str, true, $url); + } + return false; + } + + // }}} + // }}} + // {{{ getQuotebacksJson() + + public function getQuotebacksJson() + { + $ret = array(); + foreach ($this->getQuoteFrom() as $resnum => $quote_from) { + if (!$quote_from) { + continue; + } + if ($resnum != 1 && ($resnum < $this->thread->resrange['start'] || $resnum > $this->thread->resrange['to'])) { + continue; + } + $tmp = array(); + foreach ($quote_from as $quote) { + if ($quote != 1 && ($quote < $this->thread->resrange['start'] || $quote > $this->thread->resrange['to'])) { + continue; + } + $tmp[] = $quote; + } + if ($tmp) $ret[] = "{$resnum}:[" . join(',', $tmp) . "]"; + } + return '{' . join(',', $ret) . '}'; + } + + // }}} + // {{{ getResColorJs() + + public function getResColorJs() + { + global $_conf, $STYLE; + + $fontstyle_bold = empty($STYLE['fontstyle_bold']) ? 'normal' : $STYLE['fontstyle_bold']; + $fontweight_bold = empty($STYLE['fontweight_bold']) ? 'normal' : $STYLE['fontweight_bold']; + $fontfamily_bold = $STYLE['fontfamily_bold']; + $backlinks = $this->getQuotebacksJson(); + $colors = array(); + $backlink_colors = join(',', + array_map(create_function('$x', 'return "\'{$x}\'";'), + explode(',', $_conf['backlink_coloring_track_colors'])) + ); + $prefix = $this->_matome ? "t{$this->_matome}" : ''; + return << +if (typeof rescolObjs == 'undefined') rescolObjs = []; +rescolObjs.push((function() { + var obj = new BacklinkColor('{$prefix}'); + obj.colors = [{$backlink_colors}]; + obj.highlightStyle = {fontStyle :'{$fontstyle_bold}', fontWeight : '{$fontweight_bold}', fontFamily : '{$fontfamily_bold}'}; + obj.backlinks = {$backlinks}; + return obj; +})()); + +EOJS; + } + + // }}} + // {{{ getIdsForRenderJson() + + public function getIdsForRenderJson() + { + $ret = array(); + if ($this->_ids_for_render) { + foreach ($this->_ids_for_render as $id => $count) { + $ret[] = "'{$id}':{$count}"; + } + } + return '{' . join(',', $ret) . '}'; + } + + // }}} + // {{{ getIdColorJs() + + public function getIdColorJs() + { + global $_conf, $STYLE; + + if ($_conf['coloredid.enable'] < 1 || $_conf['coloredid.click'] < 1) { + return ''; + } + if (count($this->thread->idcount) < 1) { + return ''; + } + + $idslist = $this->getIdsForRenderJson(); + + $rate = $_conf['coloredid.rate.times']; + $tops = $this->getIdCountRank(10); + $average = $this->getIdCountAverage(); + $color_init = ''; + if ($_conf['coloredid.rate.type'] > 0) { + switch($_conf['coloredid.rate.type']) { + case 2: + $init_rate = $tops; + break; + case 3: + $init_rate = $average; + break; + case 1: + $init_rate = $rate; + default: + } + if ($init_rate > 1) + $color_init .= 'idCol.initColor(' . $init_rate . ', idslist);'; + } + $color_init .= "idCol.rate = {$rate};"; + if (!$this->_matome) { + $color_init .= "idCol.tops = {$tops};"; + $color_init .= "idCol.average = {$average};"; + } + $hissiCount = $_conf['coloredid.rate.hissi.times']; + $mark_colors = join(',', + array_map(create_function('$x', 'return "\'{$x}\'";'), + explode(',', $_conf['coloredid.marking.colors'])) + ); + $fontstyle_bold = empty($STYLE['fontstyle_bold']) ? 'normal' : $STYLE['fontstyle_bold']; + $fontweight_bold = empty($STYLE['fontweight_bold']) ? 'normal' : $STYLE['fontweight_bold']; + $fontfamily_bold = $STYLE['fontfamily_bold']; + $uline = $STYLE['a_underline_none'] != 1 + ? 'idCol.colorStyle["textDecoration"] = "underline"' : ''; + return << +(function() { +var idslist = {$idslist}; +if (typeof idCol == 'undefined') { + idCol = new IDColorChanger(idslist, {$hissiCount}); + idCol.colors = [{$mark_colors}]; +{$uline}; + idCol.highlightStyle = {fontStyle :'{$fontstyle_bold}', fontWeight : '{$fontweight_bold}', fontFamily : '{$fontfamily_bold}', fontSize : '104%'}; +} else idCol.addIdlist(idslist); +{$color_init} +idCol.setupSPM('{$this->spmObjName}'); +})(); + +EOJS; + } + + // }}} + // {{{ getIdCountAverage() + + public function getIdCountAverage() + { + if ($this->_idcount_average !== null) { + return $this->_idcount_average; + } + + $sum = 0; + $param = 0; + + foreach ($this->thread->idcount as $count) { + if ($count > 1) { + $sum += $count; + $param++; + } + } + + $result = ($param < 1) ? 0 : intval(ceil($sum / $param)); + $this->_idcount_average = $result; + + return $result; + } + + // }}} + // {{{ getIdCountRank() + + public function getIdCountRank($rank) + { + if ($this->_idcount_tops !== null) { + return $this->_idcount_tops; + } + + $ranking = array(); + + foreach ($this->thread->idcount as $count) { + if ($count > 1) { + $ranking[] = $count; + } + } + + if (count($ranking) == 0) { + return 0; + } + + rsort($ranking); + $rcount = count($ranking); + + $result = ($rcount >= $rank) ? $ranking[$rank - 1] : $ranking[$rcount - 1]; + $this->_idcount_tops = $result; + + return $result; + } + + // }}} +} + +// }}} + +/* + * Local Variables: + * mode: php + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ +// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/lib/live/live_header.inc.php b/lib/live/live_header.inc.php new file mode 100755 index 000000000..7da5bcf21 --- /dev/null +++ b/lib/live/live_header.inc.php @@ -0,0 +1,84 @@ +rescount) { +// $reload_time = $_GET['reltime'] + 5000; +//} else { + if ($_conf['live.reload_time'] == 4 ) { + $reload_time = 20 * 1000; + } else if ($_conf['live.reload_time'] == 3 ) { + $reload_time = 15 * 1000; + } else if ($_conf['live.reload_time'] == 2 ) { + $reload_time = 10 * 1000; + } else if ($_conf['live.reload_time'] == 1 ) { + $reload_time = 5 * 1000; + } else { + $reload_time = 0 * 1000; + } +//} + +if ($_GET['live']) { + echo << + + \n +xmht; +} else { + echo ""; +} + +?> \ No newline at end of file diff --git a/lib/live/live_highlight_check.php b/lib/live/live_highlight_check.php new file mode 100755 index 000000000..ddc64c840 --- /dev/null +++ b/lib/live/live_highlight_check.php @@ -0,0 +1,48 @@ +_has_ngaborns && + preg_match_all('/(?:>|>)([1-9][0-9\\-,]*)/', $msg, $highlight_matches) +) { + $highlight_chain_nums = array_unique(preg_split('/[-,]+/', + trim(implode(',', $highlight_matches[1]), '-,'), + -1, + PREG_SPLIT_NO_EMPTY)); + + if (array_intersect($highlight_chain_nums, $this->_highlight_nums)) { + $ngaborns_hits['highlight_chain']++; + $type |= $this->_markHighlight($i, self::HIGHLIGHT_CHAIN, true); + } +} + +// ハイライトネームチェック +if ($this->ngAbornCheck('highlight_name', $name) !== false) { + $ngaborns_hits['highlight_name']++; + $type |= $this->_markHighlight($i, self::HIGHLIGHT_NAME, false); +} + +// ハイライトメールチェック +if ($this->ngAbornCheck('highlight_mail', $mail) !== false) { + $ngaborns_hits['highlight_mail']++; + $type |= $this->_markHighlight($i, self::HIGHLIGHT_MAIL, false); +} + +// ハイライトIDチェック +if ($this->ngAbornCheck('highlight_id', $date_id) !== false) { + $ngaborns_hits['highlight_id']++; + $type |= $this->_markHighlight($i, self::HIGHLIGHT_ID, false); +} + +// ハイライトメッセージチェック +$a_highlight_msg = $this->ngAbornCheck('highlight_msg', $msg); +if ($a_highlight_msg !== false) { + $ngaborns_hits['highlight_msg']++; + $type |= $this->_markHighlight($i, self::HIGHLIGHT_MSG, true); + $this->_highlight_msgs[] = $a_highlight_msg; + $highlight_msgs = array_unique($this->_highlight_msgs); +} + +?> \ No newline at end of file diff --git a/lib/live/live_highlight_convert.php b/lib/live/live_highlight_convert.php new file mode 100755 index 000000000..ac8f96e2c --- /dev/null +++ b/lib/live/live_highlight_convert.php @@ -0,0 +1,45 @@ +_highlight_nums)); + $highlight_chain_nums = "(" . $highlight_chain_nums . ")(?!\d)(?![^<]*>)"; // 数字が一部被ってしまうアンカーとHTMLタグ内にマッチさせない + $msg = preg_replace("(((?:>|>|-)+)($highlight_chain_nums))", "$1$2", $msg); +} + +// ハイライトメッセージ変換 +if ($ng_type & self::HIGHLIGHT_MSG) { + $highlight_msgs = quotemeta(implode('|', $highlight_msgs)); + $highlight_msgs = "(" . $highlight_msgs . ")(?![^<]*>)"; // HTMLタグ内にマッチさせない + if (preg_match("(<(regex:i|i)>)", $highlight_msgs)) { + $highlight_msgs = preg_replace("(<(regex|regex:i|i)>)", "", $highlight_msgs); + $msg = mb_eregi_replace("($highlight_msgs)", "\\1", $msg); + } else { + $highlight_msgs = preg_replace("(<(regex|regex:i|i)>)", "", $highlight_msgs); + $msg = mb_ereg_replace("($highlight_msgs)", "\\1", $msg); + } +} + +// ハイライトネーム変換 +if ($ng_type & self::HIGHLIGHT_NAME) { + $name = preg_replace("(|)", "", $name); + $name = "$name"; +} + +// ハイライトメール変換 +if ($ng_type & self::HIGHLIGHT_MAIL) { + $mail = "$mail"; +} + +// ハイライトID変換 +if ($ng_type & self::HIGHLIGHT_ID) { + $date_id = preg_replace("((ID:))", "$1", $date_id .""); +} + +?> \ No newline at end of file diff --git a/lib/live/live_post_form.inc.php b/lib/live/live_post_form.inc.php new file mode 100755 index 000000000..eaed7f059 --- /dev/null +++ b/lib/live/live_post_form.inc.php @@ -0,0 +1,173 @@ +'; + $htm['kaiko_on_js'] = ''; + $htm['kaiko_set_hidden_js'] = ''; + $htm['table_begin'] = ''; + $htm['table_break1'] = ''; + $htm['table_break2'] = ''; + $htm['table_end'] = '
'; + if ($_conf['iphone']) { + $htm['options'] .= << + + + + +EOP; + $htm['name_label'] = '名前:'; + $htm['mail_label'] = 'E-mail:'; + $htm['name_extra_at'] = ' autocorrect="off" autocapitalize="off"'; + $htm['mail_extra_at'] = ' autocorrect="off" autocapitalize="off"'; + $htm['msg_extra_at'] = ' autocorrect="off" autocapitalize="off"'; + $htm['submit_extra_at'] = ''; + if ($_conf['expack.editor.mobile.savedraft'] != '0' && $_conf['expack.editor.mobile.savedraft.interval'] > 0) { + $htm['kaiko_on_js'] = ' onfocus="DraftKakiko.startAutoSave(this.form, ' . ($_conf['expack.editor.mobile.savedraft.interval'] * 1000) . ')"'; + } + } else { + $htm['name_label'] = '名前:'; + $htm['mail_label'] = 'E-mail:'; + $htm['name_extra_at'] = ''; + $htm['mail_extra_at'] = ''; + $htm['msg_extra_at'] = ''; + $htm['submit_extra_at'] = ''; + } +} else {*/ +// レスアンカー +if ($q_resnum) { + $hd['MESSAGE'] = ">>" . $q_resnum . "\r\n"; +} else { + $htm['k_br'] = ''; + if ($_conf['expack.editor.dpreview']) { + $htm['kaiko_on_js_fmt'] = ' onfocus="%1$s" onkeyup="if(%2$s){%1$s}DPSetMsg()"'; + } else { + $htm['kaiko_on_js_fmt'] = ' onfocus="%1$s" onkeyup="if(%2$s){%1$s}"'; + } +/* $htm['kaiko_on_js_func'] = sprintf("adjustTextareaRows(this,%d,2)", $STYLE['post_msg_rows']); + if ($_conf['expack.editor.savedraft'] != '0' && $_conf['expack.editor.savedraft.interval'] > 0) { + $htm['kaiko_on_js_func'] = 'DraftKakiko.startAutoSave(this.form, ' . ($_conf['expack.editor.savedraft.interval'] * 1000) . '); ' . $htm['kaiko_on_js_func']; + } + $htm['kaiko_on_js_cond'] = '!event||((event.keyCode&&(event.keyCode==8||event.keyCode==13))||event.ctrlKey||event.metaKey||event.altKey)'; + $htm['kaiko_on_js'] = sprintf($htm['kaiko_on_js_fmt'], $htm['kaiko_on_js_func'], p2h($htm['kaiko_on_js_cond'])); + //$htm['kaiko_on_js'] .= ' ondblclick="this.rows=this.value.split(/\r\n|\r|\n/).length+1"'; + $htm['kaiko_set_hidden_js'] = ' onclick="setHiddenValue(this);"'; + $htm['table_begin'] = '
'; + $htm['table_break1'] = '
'; + $htm['table_break2'] = ''; + $htm['table_end'] = '
';*/ + $htm['name_label'] = ':'; + $htm['mail_label'] = ':'; + $htm['name_extra_at'] = ' tabindex="1"'; + $htm['mail_extra_at'] = ' tabindex="2"'; + $htm['msg_extra_at'] = ' tabindex="3"'; + $htm['submit_extra_at'] = ' tabindex="4"'; + $hd['MESSAGE'] = ""; +} + +$ttitle_len = mb_strlen("$ttitle"); +$ttitle = htmlspecialchars_decode($ttitle, ENT_QUOTES); +$ttitle = mb_convert_kana($ttitle, 'rnas'); + +if ($ttitle_len > 15) { // スレタイが15文字以上の場合は短縮 + $ttitle_pfi = mb_substr($ttitle, 0, 14) ."…"; +} else { + $ttitle_pfi = "$ttitle"; +} + +// +Wiki:sambaタイマー +if ($_conf['wiki.samba_timer']) { + require_once P2_LIB_DIR . '/wiki/Samba.php'; + $samba = new Samba(); + $htm['samba'] .= $samba->createTimer($samba->getSamba($host, $bbs)); +} + +// 下書き保存 +$savedraft = ''; +if ((!$_conf['ktai'] && $_conf['expack.editor.savedraft'] != 0) || + ($_conf['iphone'] && $_conf['expack.editor.mobile.savedraft'] != 0)) { + $savedraft = << + +EOP; +} elseif ($_conf['ktai'] && $_conf['expack.editor.mobile.savedraft']) { + $savedraft = << +EOP; +} + +// 文字コード判定用文字列を先頭に仕込むことでmb_convert_variables()の自動判定を助ける +$htm['post_form'] = << + +
+ + {$ttitle_pfi}  +{$htm['maru_post']} +{$htm['name_label']} +{$htm['mail_label']} +{$htm['sage_cb']} +{$htm['options']} + + + + + +{$htm['src_fix']} +{$htm['block_submit']} + + + + + +{$htm['beres']} +{$htm['p2res']} + +{$htm['samba']} +{$htm['k_br']}{$savedraft} +
+ + + + + + + + + + + +{$newthread_hidden_ht}{$readnew_hidden_ht} +{$_conf['detect_hint_input_ht']} +
+ +EOP; + +/* + * Local Variables: + * mode: php + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ +// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/lib/live/live_view.inc.php b/lib/live/live_view.inc.php new file mode 100755 index 000000000..d2c69dc9b --- /dev/null +++ b/lib/live/live_view.inc.php @@ -0,0 +1,106 @@ +"; +$live_oldline = ""; +// +$live_td = ""; + +// 仕切 & レスボタン +$stall_05 = ""; +$stall_30 = ""; +if ($_GET['live']) { + $tores .= "$stall_30"; +} else { + $tores .= "$stall_05"; +} + +// 内容 +$tores .= ""; + +// テーブル終了 +$tores .= "
"; +// 新着レスの番号色 +$live_newnum = "{$i}"; +$live_oldnum = "{$i}"; + +if ($this->thread->onthefly) { + $GLOBALS['newres_to_show_flag'] = true; + // 番号 (オンザフライ) + $tores .= "{$live_oldline}{$live_td}{$i}"; +} elseif ($i == 1) { + // 番号 (1) + if ($this->thread->readnum > 1) { + $tores .= "{$live_oldline}{$live_td}{$live_oldnum}"; + } else { + $tores .= "{$live_oldline}{$live_td}{$live_newnum}"; + } +} elseif ($i == $this->thread->readnum +1) { + $GLOBALS['newres_to_show_flag'] = true; + // 番号 (新着レス時 先頭) + if ($_GET['live']) { + $tores .= "{$live_newline}{$live_td}{$live_newnum}"; + } else { + $tores .= "{$live_oldline}{$live_td}{$live_newnum}"; + } +} elseif ($i > $this->thread->readnum) { + // 番号 (新着レス時 後続) + $tores .= "{$live_oldline}{$live_td}{$live_newnum}"; +} elseif ($_conf['expack.spm.enabled']) { + // 番号 (SPM) + $tores .= "{$live_oldline}{$live_td}{$live_oldnum}"; +} else { + // 番号 + $tores .= "{$live_oldline}{$live_td}{$i}"; +} + +// 名前 +$tores .= preg_replace('{[ ]*}i', '', " {$name} : "); + +// ID +$tores .= "{$date_id}"; + +if ($this->am_side_of_id) { + $tores .= ' ' . $this->activeMona->getMona($res_id); +} + +// メール +$tores .= " {$mail}"; + +// 被レスリスト(縦形式) +if ($_conf['backlink_list'] == 1 || $_conf['backlink_list'] > 2) { + $tores .= $this->_quotebackListHtml($i, 1); +} + +$tores .= "  {$res_button}{$msg} "; + +if ($_conf['backlink_block'] > 0) { + // 被参照ブロック表示用にonclickを設定 + $tores .= "
\n"; +} else { + $tores .= "
\n"; +} + +// 被レス展開用ブロック +if ($_conf['backlink_block'] > 0) { + $backlinks = $this->_getBacklinkComment($i); + if (strlen($backlinks)) { + $tores .= '
'; + $tores .= $backlinks; + } +} +// 被レスリスト(横形式) +if ($_conf['backlink_list'] == 2 || $_conf['backlink_list'] > 2) { + $tores .= $this->_quotebackListHtml($i, 2, false); +} + +$tores .= "
"; +$tores .= "
\n"; + +// レスポップアップ用引用 +//$tores .= $rpop; + +?> \ No newline at end of file diff --git a/lib/live/live_view_ctl.inc.php b/lib/live/live_view_ctl.inc.php new file mode 100755 index 000000000..560bbe98f --- /dev/null +++ b/lib/live/live_view_ctl.inc.php @@ -0,0 +1,112 @@ +thread->idcount[$id] > 1) { + $date_id = str_replace($idstr, $this->idFilter($idstr, $id), $date_id); +} +// ID末尾 (O,P,Q,I 等) の強調 +if ($_conf['live.id_b']) { + if (!preg_match("(ID:)", $date_id)) { // ID無しで末尾表示のみ有りの板 (狼等) + $date_id = preg_replace('((\s([a-zA-Z])$)(?![^<]*>))', '$1', $date_id); + } else { + $date_id = preg_replace('((ID: ?)([0-9A-Za-z/.+]{10}|[0-9A-Za-z/.+]{8}|\\?\\?\\?)?([a-zA-Z])(?=[^0-9A-Za-z/.+]|$)(?![^<]*>))', '$1$2 $3', $date_id); + } +} +// 日付の短縮 +if (preg_match("([0-2][0-9]{3}/[0-1][0-9]/[0-3][0-9])", $date_id)) { + if ($_GET['live']) { // 実況中は日付を全削除 + $date_id = preg_replace("([0-2][0-9]{3}/[0-1][0-9]/[0-3][0-9]\(..\))", "", $date_id); + } else { // 上記以外は年を下2桁に + if (preg_match("(class=\"ngword)", $date_id)) { // NGIDの時 + $date_id = preg_replace("(([0-2][0-9])([0-9]{2}/[0-1][0-9]/[0-3][0-9]\(..\)))", "$2", $date_id); + } else { + $date_id = preg_replace("(([0-2][0-9])([0-9]{2}/[0-1][0-9]/[0-3][0-9]\(..\)))", "$2", $date_id); + } + } +} + +// メール +if ($mail) { + // 実況中の場合 + if ($_conf['live.mail_sage'] + && ($_GET['live'])) { + // sage を ▼ に + if (preg_match("(^[\\s ]*sage[\\s ]*$)", $mail)) { + if ($STYLE['read_mail_sage_color']) { + $mail = ""; + } elseif ($STYLE['read_mail_color']) { + $mail = ""; + } else { + $mail = ""; + } + // sage 以外を ● に + } else { + $mail = ""; + } + // ノーマル処理 + } elseif (preg_match("(^[\\s ]*sage[\\s ]*$)", $mail) + && $STYLE['read_mail_sage_color']) { + $mail = "{$mail}"; + } elseif ($STYLE['read_mail_color']) { + $mail = "{$mail}"; + } else { + $mail = "{$mail}"; + } +} + +// [これにレス] の方法 +if ($_GET['live']) { + $ttitle_en_q ="&ttitle_en=".UrlSafeBase64::encode($this->thread->ttitle); + // 内容をダブルクリック + if ($_conf['live.res_button'] >= 1) { + $res_dblclc = "ondblclick=\"window.parent.livepost.location.href='live_post_form.php?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&resnum={$i}{$ttitle_en_q}&inyou=1'\" title=\"{$i} にレス (double click)\""; + } + // レスボタン + if ($_conf['live.res_button'] <= 1) { + if ($_conf['iframe_popup'] == 3) { + $res_button = "thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&resnum={$i}{$ttitle_en_q}&inyou=1\" target=\"livepost\" title=\"{$i} にレス\">\"Re:\""; + } else { + $res_button = "(thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&resnum={$i}{$ttitle_en_q}&inyou=1\" target=\"livepost\" title=\"{$i} にレス\">re:)"; + } + } +} + +// 内容 +// 表示切詰め処理 +if (mb_ereg("(([\\s ]*[^\x01-\x7E][\\s ]*
){2,})", $msg)) { + $msg = mb_ereg_replace("([\\s ]*
[\\s ]*)", "", $msg); // 3行以上の1文字置きの改行文から改行を削除 +} +// 実況中の表示切詰め処理 +if ($_conf['live.msg'] +&& ($_GET['live'])) { + $msg = mb_convert_kana($msg, 'rnas'); // 全角の英数、記号、スペースを半角に + if (!preg_match ("(tp:/|ps:/|res/)", $msg)) { + $msg = mb_ereg_replace("([\\s ]*
[\\s ]*)", " ", $msg); // 全改行を消去し半角スペースに。内容に外部リンクや板別勢い一覧を含む場合は対象外 + } + $msg = mb_ereg_replace("(\s{2,})", " ", $msg); // 連続スペースを1つに +} + +// +live スレッド内容表示切替 +if ($_GET['live']) { + if ($_conf['live.view_type'] == 0 ) { + include P2_LIB_DIR . '/live/default_view.inc.php'; + } else { + include P2_LIB_DIR . '/live/live_view.inc.php'; + } +} else { + if ($_conf['live.view_type'] > 1 ) { + include P2_LIB_DIR . '/live/live_view.inc.php'; + } else { + include P2_LIB_DIR . '/live/default_view.inc.php'; + } +} + +?> \ No newline at end of file diff --git a/lib/read_footer.inc.php b/lib/read_footer.inc.php index d70a054a3..d96fec174 100644 --- a/lib/read_footer.inc.php +++ b/lib/read_footer.inc.php @@ -59,9 +59,16 @@ {$dores_st} EOP; } else { + // +live リンク切替 + if ($_GET['live']) { + $htm['dores'] = <<{$dores_st} +LIVE; + } else { $htm['dores'] = <<{$dores_st} EOP; + } } $res_form_ht_pb = $res_form_ht; @@ -169,6 +176,23 @@ if ($_conf['expack.ic2.enabled']) { include P2EX_LIB_DIR . '/ImageCache2/templates/info.tpl.html'; } + +// +live 表示切替スクリプト +if ($_GET['live']) { + echo ""; +} else { + echo << + + \n +LIVE; +} // ==== echo ''; diff --git a/lib/read_header.inc.php b/lib/read_header.inc.php old mode 100644 new mode 100755 index f6feec418..a73ac4bc4 --- a/lib/read_header.inc.php +++ b/lib/read_header.inc.php @@ -104,7 +104,12 @@ // $read_footer_navi_new 続きを読む 新着レスの表示 if ($aThread->resrange['to'] == $aThread->rescount) { + // +live リンク切替 + if ($_GET['live']) { + $read_footer_navi_new = "{$shinchaku_st}"; + } else { $read_footer_navi_new = "rescount}-&nt={$newtime}#r{$aThread->rescount}\" accesskey=\"r\">{$shinchaku_st}"; + } } else { $read_footer_navi_new = "resrange['to']}-{$offline_q}\" accesskey=\"r\">{$tuduki_st}"; } @@ -197,23 +202,33 @@ \n EOP; +// +live 実況表示 html popup 切換 +if ($_conf['live.view_type'] > 1 ) { + $live_view_popup = live_; +} + if ($_conf['iframe_popup_type'] == 1) { echo << - + EOP; } else { echo << + EOP; } if ($_conf['link_youtube'] == 2 || $_conf['link_niconico'] == 2) { + // +live YouTubeプレビュー表示のサイズ指定 + if ($_conf['live.youtube_winsize'] == 1) { + echo "\t\n"; + } else { echo <<\n EOP; + } } if ($_conf['expack.am.enabled']) { echo << -
\n +
\n EOP; P2Util::printInfoHtml(); @@ -425,6 +451,18 @@ function filterCount(n) EOP; } +// +live 実況フレーム 2ペインで開く +if ($_GET['live']) { +$htm['p2frame'] = << +//実況フレーム 2ペインで開く | +} +//]]> +\n +live; +} else { // {{{ p2フレーム 3ペインで開く $htm['p2frame'] = << \n EOP; +} // }}} diff --git a/lib/sb_print.inc.php b/lib/sb_print.inc.php index 2d57967c8..318491026 100644 --- a/lib/sb_print.inc.php +++ b/lib/sb_print.inc.php @@ -361,6 +361,13 @@ function sb_print($aThreadList) } $thre_url = "{$_conf['read_php']}?{$host_bbs_key_q}{$rescount_q}{$offline_q}{$word_q}{$anum_ht}"; + // +live リンク表示切替 + $ttitle_en = UrlSafeBase64::encode($aThread->ttitle); + $ttitle_urlen = rawurlencode($ttitle_en); + $ttitle_en_q ="&ttitle_en=".$ttitle_urlen; + + $live_url = "live_frame.php?{$host_bbs_key_q}&live=1{$ttitle_en_q}{$rescount_q}{$anum_ht}"; + // オンリー>>1 if ($only_one_bool) { $td['one'] = << //==================================================================================== + // +live 実況中ic2のサムネイル作成をonoff + if ($_conf['expack.ic2.enabled'] + && (!$_conf['live.ic2_onoff'])) { + $live_ic2_off = "onclick=\"javascript:parent.menu.ic2_menu_switch(0);\""; + } + // ボディ echo << {$td['edit']}{$td['offrec']}{$td['unum']}{$td['rescount']}{$td['one']}{$td['checkbox']}{$torder_ht} -
{$moto_thre_ht}{$ttitle_ht}
+
{$moto_thre_ht} ++live  +{$ttitle_ht}
{$td['ita']}{$td['spd']}{$td['ikioi']}{$td['birth']}{$td['fav']}\n EOR; diff --git a/rep2/edit_aborn_word.php b/rep2/edit_aborn_word.php index 287b30a0f..17f04dc35 100644 --- a/rep2/edit_aborn_word.php +++ b/rep2/edit_aborn_word.php @@ -28,6 +28,10 @@ 'p2_ng_id.txt' => 'NGID', 'p2_aborn_be.txt' => 'あぼーんBE', 'p2_ng_be.txt' => 'NGBE', + 'p2_highlight_name.txt' => 'ハイライトネーム', + 'p2_highlight_mail.txt' => 'ハイライトメール', + 'p2_highlight_msg.txt' => 'ハイライトメッセージ', + 'p2_highlight_id.txt' => 'ハイライトID', ); if (!array_key_exists($filename, $writable_files)) { @@ -221,7 +225,7 @@ $usage = <<
  • ×: 削除
  • -
  • ワード: NG/あぼーんワード (空にすると登録解除)
  • +
  • ワード: NG/あぼーん/ハイライトワード (空にすると登録解除)
  • i: 大文字小文字を無視
  • re: 正規表現
  • 板: newsplus,software 等 (完全一致, カンマ区切り)
  • diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index b71fa1777..002947a9f 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -353,8 +353,8 @@ array('ngaborn_frequent_num', '頻出IDあぼーんのしきい値 (出現回数がこれ以上のIDをあぼーん)'), array('ngaborn_frequent_dayres', '勢いの速いスレでは頻出IDあぼーんしない
    (総レス数/スレ立てからの日数、0なら無効)'), array('ngaborn_chain', '連鎖NGあぼーん
    「する」ならあぼーんレスへのレスはあぼーん、NGレスへのレスはNG。
    「すべてNGにする」の場合、あぼーんレスへのレスもNGにする。'), - array('ngaborn_chain_all', '表示範囲外のレスも連鎖NGあぼーんの対象にする
    (処理を軽くするため、デフォルトではしない)'), - array('ngaborn_daylimit', 'この期間、NGあぼーんにHITしなければ、登録ワードを自動的に外す (日数)'), + array('ngaborn_chain_all', '表示範囲外のレスも連鎖NG/あぼーん/ハイライトの対象にする
    (処理を軽くするため、デフォルトではしない)'), + array('ngaborn_daylimit', 'この期間、NG/あぼーん/ハイライトにHITしなければ、登録ワードを自動的に外す (日数)'), array('ngaborn_purge_aborn', 'あぼーんレスは不可視divブロックも描画しない'), ); printEditConfGroupHtml($groupname, $conflist, $flags); @@ -571,8 +571,8 @@ $conflist = array( array('expack.spm.kokores', 'ここにレス'), array('expack.spm.kokores_orig', 'ここにレスで開くフォームに元レスの内容を表示する'), - array('expack.spm.ngaborn', 'あぼーんワード・NGワード登録'), - array('expack.spm.ngaborn_confirm', 'あぼーんワード・NGワード登録時に確認する'), + array('expack.spm.ngaborn', 'あぼーん/NG/ハイライトワード登録'), + array('expack.spm.ngaborn_confirm', 'あぼーん/NG/ハイライトワード登録時に確認する'), array('expack.spm.filter', 'フィルタリング'), array('expack.spm.filter_target', 'フィルタリング結果を開くフレームまたはウインドウ'), ); @@ -817,6 +817,78 @@ echo << + +
    +

    +live設定

    +
    \n +EOP; +} + +// {{{ +live設定 +// {{{ +live - 表示設定 + +$groupname = '表示設定'; +$groups[] = $groupname; +$flags = getGroupShowFlags($groupname); +if ($flags & P2_EDIT_CONF_USER_SKIPPED) { + $keep_old = true; +} else { + $conflist = array( + array('live.view_type', 'レス表示の種類'), + array('live.id_b', 'ID末尾の O (携帯) P (公式p2) Q (フルブラウザ) i (iPhone)を太字に'), + array('live.highlight_chain', '連鎖ハイライト (連鎖範囲は ngaborn_chain_all にて設定)'), + array('live.youtube_winsize', 'YouTubeプレビュー表示のサイズ'), + ); + printEditConfGroupHtml($groupname, $conflist, $flags); +} + +// }}} +// {{{ +live - 実況中設定 + +$groupname = '実況中設定'; +$groups[] = $groupname; +$flags = getGroupShowFlags($groupname); +if ($flags & P2_EDIT_CONF_USER_SKIPPED) { + $keep_old = true; +} else { + $conflist = array( + array('live.before_respointer', '表示するレス数 (100以下推奨)'), + array('live.post_width', '下部書込フレームの高さ (px)'), + array('live.bbs_noname', 'デフォルトの名無しの表示'), + array('live.mail_sage', 'sage を ▼ に'), + array('live.msg', '全ての改行とスペースの削除'), + array('live.res_button', '[これにレス] の方法'), + array('live.write_regulation', '書込規制用タイマー'), + array('live.ic2_onoff', 'ImageCache2のサムネイル作成'), + ); + printEditConfGroupHtml($groupname, $conflist, $flags); +} + +// }}} +// {{{ +live - リロード/スクロール + +$groupname = 'リロード/スクロール'; +$groups[] = $groupname; +$flags = getGroupShowFlags($groupname); +if ($flags & P2_EDIT_CONF_USER_SKIPPED) { + $keep_old = true; +} else { + $conflist = array( + array('live.reload_time', 'オートリロードの間隔'), + array('live.scroll_move', 'オートスクロールの滑らかさ (最も滑らか 1 、スクロール無し 0)'), + array('live.scroll_speed', 'オートスクロールの速度
    (最速 1 、スクロール無しの場合は上の滑らかさの値を 0 に)'), + ); + printEditConfGroupHtml($groupname, $conflist, $flags); +} + +// }}} +// }}} + +// PC用表示 +if (empty($_conf['ktai'])) { + echo << +
    \n EOP; // 携帯用表示 @@ -848,6 +920,8 @@ if ($_conf['iphone']) { if ($groupname == 'tGrep') { echo ''; + } elseif ($groupname == '表示設定') { + echo ''; } elseif ($groupname == 'subject-i') { echo ''; } diff --git a/rep2/editpref.php b/rep2/editpref.php index a346d1adf..778ce4c33 100644 --- a/rep2/editpref.php +++ b/rep2/editpref.php @@ -174,6 +174,11 @@ // +Wiki $aborn_be_txt = 'p2_aborn_be.txt'; $ng_be_txt = 'p2_ng_be.txt'; +// +live ハイライトワード用 +$highlight_name_txt = 'p2_highlight_name.txt'; +$highlight_mail_txt = 'p2_highlight_mail.txt'; +$highlight_msg_txt = 'p2_highlight_msg.txt'; +$highlight_id_txt = 'p2_highlight_id.txt'; echo '
    '; echo <<"; // }}} + // {{{ PC - +live ハイライトワード編集 + + echo "\n\n"; + + echo << +ハイライトワード編集\n +EOP; + printEditFileForm($highlight_name_txt, '名前'); + printEditFileForm($highlight_mail_txt, 'メール'); + printEditFileForm($highlight_msg_txt, '本文'); + printEditFileForm($highlight_id_txt, 'ID'); + echo <<\n +EOP; + + echo ""; + + // }}} // {{{ PC - ホストの同期 HTMLのセット echo <<7j znJ{nOxrR{TGbJ%e1-?g`zI-VG`V1`nGB}3e=;9kTJ>kq}qGJ9X%wje>uXH(LZp&G> zo(L5&h$Nswn5Meo~wrNiHhtA~5>Y6(WSQYiy59m7TC1xpM`MERtLqVo^y85}Sb4q9e0Hu(E&;S4c literal 0 HcmV?d00001 diff --git a/rep2/img/re.png b/rep2/img/re.png new file mode 100755 index 0000000000000000000000000000000000000000..59397ebe9158655b0c3a1cf33b979733514273f3 GIT binary patch literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^VnEEp!N$PADEO~70LbAi@Q5sCVBi)4Va7{$>;3=* zS<)SS9T^xl&P()h{0`(RBzpw;GB8xBGB7kWGcf%852Rl(Fa&WhFp5SnFj!4zU=Yv0 z9wk2ksP?(1i(^Q|EtZ3fj0_AMhc-lu8BP3_xBOCAgSXNFGdTu^|Nonc9~c>@pG!#q z0-z3{h||PI&2%{L&;*c7!k_>D?PCmVZDm7&#N5PZXJ+!eeEE_GqN6FADVWt*T>8K& ziJK-VXEn~Lvp^&cz2eSE0IKcj`40sA#Y}eQ%a<=VJ|Mbyx9IHO8)x;LZLaWj3u{R- zGL-Z2_fLoDQqp|U!79PF__&3kW を登録しました。'; + } elseif ($resar[0] != "") { + $msg = 'ハイライトワード(名前)に ' . $resar[0] . ' を登録してよろしいですか?'; + $aborn_str_en = UrlSafeBase64::encode($resar[0]); + } + $edit_value = 'ハイライトワード編集:名前'; + break; + case 'highlight_mail': + $title_st = 'p2 - ハイライトワード登録:メール'; + if ($popup == 2) { + $msg = 'ハイライトワード(メール)に ' . $aborn_str . ' を登録しました。'; + } elseif ($resar[1] != "") { + $msg = 'ハイライトワード(メール)に ' . $resar[1] . ' を登録してよろしいですか?'; + $aborn_str_en = UrlSafeBase64::encode($resar[1]); + } + $edit_value = 'ハイライトワード編集:メール'; + break; + case 'highlight_msg': + $title_st = 'p2 - ハイライトワード登録:メッセージ'; + if ($popup == 2) { + $msg = 'ハイライトワード(メッセージ)に ' . $aborn_str . ' を登録しました。'; + } else { + $msg = 'ハイライトワード(メッセージ)
    '; + } + $edit_value = 'ハイライトワード編集:メッセージ'; + break; + case 'highlight_id': + $title_st = 'p2 - ハイライトワード登録:ID'; + if ($popup == 2) { + $msg = 'ハイライトワード(ID)に ' . $aborn_str . ' を登録しました。'; + } elseif ($aborn_id != "") { + $msg = 'ハイライトワード(ID)に ' . $aborn_id . ' を登録してよろしいですか?'; + $aborn_str_en = UrlSafeBase64::encode($aborn_id); + } + $edit_value = 'ハイライトワード編集:ID'; + break; default: /*放置*/ } @@ -293,7 +332,7 @@ function infoSpLiveAborn() var tgt = "{$aborn_target}"; var once = {$aborn_once}; /*try {*/ - var heads = opener.document.getElementsByTagName('div'); + var heads = opener.document.getElementsByTagName('*'); for (var i = heads.length - 1; i >= 0 ; i--) { if (heads[i].className.indexOf('res-header') != -1 && heads[i].innerHTML.indexOf(tgt) != -1) diff --git a/rep2/js/live_htmlpopup.js b/rep2/js/live_htmlpopup.js new file mode 100755 index 000000000..93df16767 --- /dev/null +++ b/rep2/js/live_htmlpopup.js @@ -0,0 +1,169 @@ +/* + p2 - HTMLをポップアップするためのJavaScript +*/ + +//showHtmlDelaySec = 0.2 * 1000; // HTML表示ディレイタイム。マイクロ秒。 + +showHtmlTimerID = 0; +node_div = false; +node_close = false; +tUrl = ""; // URLテンポラリ変数 +gUrl = ""; // URLグローバル変数 +gX = 0; +gY = 0; + +/** + * クローズボタンもしくはポップアップ外部をクリックして閉じるための関数 + */ +function hideHtmlPopUpCallback(evt) +{ + evt = evt || window.event; + + hideHtmlPopUp(); + + // イベントリスナを削除 + if (window.removeEventListener) { + // W3C DOM + document.body.removeEventListener('click', hideHtmlPopUpCallback, false); + evt.preventDefault(); + evt.stopPropagation(); + } else if (window.detachEvent) { + // IE + document.body.detachEvent('onclick', hideHtmlPopUpCallback); + evt.returnValue = false; + evt.cancelBubble = true; + } +} + +/** + * HTMLポップアップを表示する + * + * 複数の引用レス番や(p)の onMouseover で呼び出される + */ +function showHtmlPopUp(url,ev,showHtmlDelaySec, marker) +{ + if (!document.createElement) { return; } // DOM非対応 + + // まだ onLoad されていなく、コンテナもなければ、抜ける + if (!gIsPageLoaded && !document.getElementById('popUpContainer')) { + return; + } + + showHtmlDelaySec = showHtmlDelaySec * 1000; + + if (!node_div || url != gUrl) { + tUrl = url; + gX = getPageX(ev); + gY = getPageY(ev); + showHtmlTimerID = setTimeout(function() {showHtmlPopUpDo(marker);}, showHtmlDelaySec); // HTML表示ディレイタイマー + } +} + +/** + * HTMLポップアップの実行 + */ +function showHtmlPopUpDo(marker) +{ + if (marker && marker.firstChild) marker = marker.firstChild; + var gX = marker && marker.offsetLeft && marker.width ? + (marker.offsetLeft + marker.width) : window.gX; + // あらかじめ既存のHTMLポップアップを閉じておく + hideHtmlPopUp(); + + gUrl = tUrl; + var x_adjust = 300; // x軸位置調整 + var y_adjust = -46; // y軸位置調整 + var closebox_width = 18; + + if (!node_div) { + node_div = document.createElement('div'); + node_div.setAttribute('id', "iframespace"); + + if (!window.addEventListener && !window.attachEvent) { + node_close = document.createElement('div'); + node_close.setAttribute('id', "closebox"); + } + + node_div.style.left = gX + x_adjust + "px"; //ポップアップ位置 + node_div.style.top = getScrollY() + "px"; //gY + y_adjust + "px"; + if (node_close) { + node_close.style.left = (gX + x_adjust - closebox_width) + "px"; // ポップアップ位置 + node_close.style.top = node_div.style.top; + } + var b_adjust = 4; // iframeの(frameborder+border)*2 + var yokohaba = getWindowWidth() - b_adjust - gX - x_adjust; + var tatehaba = getWindowHeight() - b_adjust; + + pageMargin = ""; + // 画像の場合はマージンをゼロに + if (gUrl.search(/\.(jpe?g|gif|png)$/) !== -1) { + pageMargin = ' marginheight="0" marginwidth="0" hspace="0" vspace="0"'; + } + node_div.innerHTML = ''; + + if (node_close) { + node_close.innerHTML = '×'; + } + + var popUpContainer = document.getElementById("popUpContainer"); + if (!popUpContainer) { + popUpContainer = document.body; + } + popUpContainer.appendChild(node_div); + if (node_close) { + popUpContainer.appendChild(node_close); + } + } + + // HTMLポップアップ外部をクリックしても閉じられるようにする + if (window.addEventListener) { + // W3C DOM + document.body.addEventListener('click', hideHtmlPopUpCallback, false); + } else if (window.attachEvent) { + // IE + document.body.attachEvent('onclick', hideHtmlPopUpCallback); + } +} + +/** + * HTMLポップアップを非表示にする + */ +function hideHtmlPopUp() +{ + if (!document.createElement) { return; } // DOM非対応 + if (showHtmlTimerID) { clearTimeout(showHtmlTimerID); } // HTML表示ディレイタイマーを解除 + if (node_div) { + node_div.style.visibility = "hidden"; + node_div.parentNode.removeChild(node_div); + node_div = false; + } + if (node_close) { + node_close.style.visibility = "hidden"; + node_close.parentNode.removeChild(node_close); + node_close = false; + } +} + +/** + * HTML表示タイマーを解除する + * + * (p)の onMouseout で呼び出される + */ +function offHtmlPopUp() +{ + // HTML表示ディレイタイマーがあれば解除しておく + if (showHtmlTimerID) { + clearTimeout(showHtmlTimerID); + } +} + +/* + * Local Variables: + * mode: javascript + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: t + * End: + */ +/* vim: set syn=javascript fenc=cp932 ai noet ts=4 sw=4 sts=4 fdm=marker: */ diff --git a/rep2/js/live_htmlpopup_resizable.js b/rep2/js/live_htmlpopup_resizable.js new file mode 100755 index 000000000..5e8f1042e --- /dev/null +++ b/rep2/js/live_htmlpopup_resizable.js @@ -0,0 +1,356 @@ +/* + p2 - HTMLをポップアップするためのJavaScript + + @thanks http://www.yui-ext.com/deploy/yui-ext/docs/ +*/ + +//showHtmlDelaySec = 0.2 * 1000; // HTML表示ディレイタイム。マイクロ秒。 + +gShowHtmlTimerID = null; +gNodePopup = null; // iframeを格納するdiv要素 +//gNodeClose = null; // ×を格納するdiv要素 +tUrl = ""; // URLテンポラリ変数 +gUrl = ""; // URLグローバル変数 + +// ブラウザ画面(スクリーン上)のマウスの X, Y座標 +gMouseX = 0; +gMouseY = 0; + +iResizable = null; +stophide = false; + +/** + * HTMLプアップを表示する + * 複数の引用レス番や(p)の onMouseover で呼び出される + * [memo] 第一引数をeventオブジェクトにした方がよいだろうか。 + * + * @access public + */ +function showHtmlPopUp(url, ev, showHtmlDelaySec, marker) +{ + if (!document.createElement) { return; } // DOM非対応なら抜ける + + // まだ onLoad されていなく、コンテナもなければ、抜ける + if (!gIsPageLoaded && !document.getElementById('popUpContainer')) { + return; + } + + showHtmlDelaySec = showHtmlDelaySec * 1000; + + if (!gNodePopup || url != gUrl) { + tUrl = url; + + var pointer = getPageXY(ev); + gMouseX = pointer[0]; + gMouseY = pointer[1]; + + // HTML表示ディレイタイマー + gShowHtmlTimerID = setTimeout(function() {showHtmlPopUpDo(marker);}, showHtmlDelaySec); + } +} + +/** + * showHtmlPopUpDo() から利用される + * + * @return integer + */ +function getCloseTop(win_bottom) +{ + var close_top_adjust = 16; + + close_top = Math.min(win_bottom - close_top_adjust, gMouseY + close_top_adjust); + if (close_top >= win_bottom - close_top_adjust) { + close_top = gMouseY - close_top_adjust - 12; + } + return close_top; +} + +/** + * HTMLポップアップの実行 + */ +function showHtmlPopUpDo(marker) +{ + if (marker && marker.firstChild) marker = marker.firstChild; + var gMouseX = marker && marker.offsetLeft && marker.width ? + (marker.offsetLeft + marker.width) : window.gMouseX; + + // あらかじめ既存のHTMLポップアップを閉じておく + hideHtmlPopUp(null, true); + + gUrl = tUrl; + var popup_x_adjust = 300; // popup(iframe)のx軸位置調整 + var closebox_width = 18; // ×の横幅 + var adjust_for_scrollbar = 22; // 22 スクロールバーを考慮して少し小さ目に微調整 + + if (gUrl.indexOf("kanban.php?") != -1) { popup_x_adjust += 23; } + + if (!gNodePopup) { + gNodePopup = document.createElement('iframe'); + gNodePopup.setAttribute('id', 'iframespace'); + gNodePopup.style.backgroundColor = "#ffffff"; + + /* + gNodeClose = document.createElement('div'); + gNodeClose.setAttribute('id', "closebox"); + gNodeClose.setAttribute('onMouseover', "hideHtmlPopUp(ev)"); + */ + + var closeX = gMouseX + popup_x_adjust - closebox_width; + + // IE用 + if (document.all) { + var body = getDocumentBodyIE(); + + var iframeX = gMouseX + popup_x_adjust; + gNodePopup.style.pixelLeft = iframeX; // ポップアップ位置 iframeのX座標 + gNodePopup.style.pixelTop = body.scrollTop; // ポップアップ位置 iframeのY座標 + // document.body.scrollTop は DOCTIYEで document.documentElement.scrollTop になるらしい + + /* + gNodeClose.style.pixelLeft = closeX; // ポップアップ位置 ×のX座標 + // ポップアップ位置 ×のY座標 + var close_top = getCloseTop(body.scrollTop + body.clientHeight); + gNodeClose.style.pixelTop = close_top; + */ + + var iframe_width = body.clientWidth - gNodePopup.style.pixelLeft - adjust_for_scrollbar; + var iframe_height = body.clientHeight - adjust_for_scrollbar; + + widthRatio = 0.6; + if (iframe_width < body.clientWidth * widthRatio) { + addIframeWidth = (body.clientWidth * widthRatio) - iframe_width; + iframe_width += addIframeWidth; + gNodePopup.style.pixelLeft = iframeX - addIframeWidth; + } + + // DOM対応用(Mozilla) + } else if (document.getElementById) { + + var iframeX = gMouseX + popup_x_adjust; + gNodePopup.style.left = iframeX + "px"; // ポップアップ位置 iframeのX座標 + gNodePopup.style.top = window.pageYOffset + "px"; // ポップアップ位置 iframeのY座標 + + /* + gNodeClose.style.left = closeX + "px"; // ポップアップ位置 ×のX座標 + // ポップアップ位置 ×のY座標 + var close_top = getCloseTop(window.pageYOffset + window.innerHeight); + gNodeClose.style.top = close_top + "px"; + */ + + var iframe_width = window.innerWidth - iframeX - adjust_for_scrollbar; + var iframe_height = window.innerHeight - adjust_for_scrollbar; + + widthRatio = 0.6; + if (iframe_width < window.innerWidth * widthRatio) { + addIframeWidth = (window.innerWidth * widthRatio) - iframe_width; + iframe_width += addIframeWidth; + var iframe_left = iframeX - addIframeWidth; + gNodePopup.style.left = iframe_left + 'px'; + } + } + +// gNodePopup.src = gUrl; + gNodePopup.frameborder = 0; + gNodePopup.width = iframe_width; + gNodePopup.height = iframe_height; + + pageMargin_at = ""; + // 画像の場合はマージンをゼロにする + if (gUrl.match(/(jpg|jpeg|gif|png)$/)) { + //pageMargin_at = ' marginheight="0" marginwidth="0" hspace="0" vspace="0"'; + + // ↓の設定は効いていない?innerHTMLでは効いていた気がする + gNodePopup.marginheight = 0; + gNodePopup.marginwidth = 0; + gNodePopup.hspace = 0; + gNodePopup.vspace = 0; + } + + // 2006/11/30 これまでdiv内のinnerHTMLにしていたのは、何か理由があった気もするが忘れた。 + // IEでのポップアップ内ポップアップはどちらにしろできていないようだ。 + //gNodePopup.innerHTML = ""; + + //gNodeClose.innerHTML = "×"; + + var popUpContainer = document.getElementById("popUpContainer"); + + var headerEI = document.getElementById("header"); //read用 + if (headerEI) { + popUpContainer = headerEI; + } else { + var Ntd1EI = document.getElementById("ntd1"); // read_new用 + if (Ntd1EI) { + popUpContainer = Ntd1EI; + } + } + // popUpContainer はbody読み込みを完了する前から利用できるように用意している。 + // popUpContainer では、YAHOO.ext.Resizable の表示を閉じた時に、IEで空白スペースが入ってしまう(?)ので、 + // header がある時は、headerを利用している + if (popUpContainer) { + popUpContainer.appendChild(gNodePopup); + //popUpContainer.appendChild(gNodeClose); + } else { + document.body.appendChild(gNodePopup); + //document.body.appendChild(gNodeClose); + } + + if (gIsPageLoaded) { + setIframeResizable(); + } else { + var setIframeResizableOnLoad = function(){ setIframeResizable(); } + YAHOO.util.Event.addListener(window, 'load', setIframeResizableOnLoad); + } + gNodePopup.src = gUrl; + } +} + +function setIframeResizable() +{ + if (!gNodePopup) { + return; + } + + iResizable = new YAHOO.ext.Resizable('iframespace', { + pinned:true, + //width: 200, + //height: 100, + minWidth:100, + minHeight:50, + handles: 'all', + wrap:true, + draggable:true, + dynamic: true + }); + + var iframespaceEl = iResizable.getEl(); + + iframespaceEl.dom.style.backgroundColor = "#ffffff"; + iframespaceEl.dom.ondblclick = hideHtmlPopUp; + + var msgClose = '閉じるには、ポップアップ外をクリック'; + window.status = msgClose; + + iframespaceEl.on('resize', function(){ + stophide = true; + this.dom.title = msgClose; + }); +} + +// ページトップからのマウス位置のX, Y座標 +// @return array +function getPageXY(ev) +{ + /* + // Yahoo UI は使えそうで使えない?何かありそうな気がするんだが… + alert(YAHOO.util.Dom.getClientHeight()); // 画面の高さ // Deprecated Now using getViewportHeight. + alert(YAHOO.util.Dom.getViewportHeight()); // 画面 (excludes scrollbars) + alert(YAHOO.util.Dom.getDocumentHeight()); // ドキュメント全体 + // YAHOO.util.Event.getPageX(ev) + var cursor1 = YAHOO.util.Event.getXY(ev); // ページ内 + alert(cursor1); + */ + + // IE用 + if (document.all) { + // 現在のマウス位置のX, Y座標 + var body = getDocumentBodyIE(); + // IEならwindow.eventでグローバルに参照できるが、ここではIE以外にも合わせて使わないでおく + var pageX = body.scrollLeft + ev.clientX; + var pageY = body.scrollTop + ev.clientY; + + } else { + // pageX, pageY は、IEは非サポート + var pageX = ev.pageX; + var pageY = ev.pageY; + } + return [pageX, pageY]; +} + +/** + * HTMLポップアップを非表示にする + * + * @access public + */ +function hideHtmlPopUp(ev, fast) +{ + if (!gIsPageLoaded) { + return false; + } + + if (!document.createElement) { return; } // DOM非対応なら抜ける + + if (stophide) { + stophide = false; + return; + } + + if (!gFade) { + fast = true; + } + + if (iResizable) { + var iframespaceEl = iResizable.getEl(); + + var iRegion = YAHOO.util.Region.getRegion(iframespaceEl.dom); + + if (ev) { + var pageXY = getPageXY(ev); + //alert(pageXY); + var pagePoint = new YAHOO.util.Point(pageXY); + + if (iRegion.intersect(pagePoint)) { + return; + } + //alert(iRegion); + } + + if (fast) { + iframespaceEl.remove(); + iResizable = null; + hideHtmlPopUpDo(); + } else { + iframespaceEl.setOpacity(0, true, 0.15, function(){ + this.remove(); + iResizable = null; + hideHtmlPopUpDo(); + }); + } + + } else { + hideHtmlPopUpDo(); + } + +} + +function hideHtmlPopUpDo() +{ + if (gShowHtmlTimerID) { clearTimeout(gShowHtmlTimerID); } // HTML表示ディレイタイマーを解除する + + + if (gNodePopup) { + gNodePopup.style.visibility = "hidden"; + gNodePopup.parentNode.removeChild(gNodePopup); + gNodePopup = null; + } + + /* + if (gNodeClose) { + gNodeClose.style.visibility = "hidden"; + gNodeClose.parentNode.removeChild(gNodeClose); + gNodeClose = null; + } + */ +} + +/** + * HTML表示タイマーを解除する + * + * (p)の onMouseout で呼び出される + */ +function offHtmlPopUp() +{ + // HTML表示ディレイタイマーがあれば解除しておく + if (gShowHtmlTimerID) { + clearTimeout(gShowHtmlTimerID); + } +} diff --git a/rep2/js/preview_video_half.js b/rep2/js/preview_video_half.js new file mode 100755 index 000000000..40e89a9be --- /dev/null +++ b/rep2/js/preview_video_half.js @@ -0,0 +1,98 @@ +/* + * rep2expack - ネット動画のプレビュー + */ + +// {{{ preview_video_youtube() + +/* + * YouTubeのプレビューを表示する + * + * @param String id + * @param Element placeholder + * @return void + */ +function preview_video_youtube(id, placeholder) +{ + var container = document.createElement('div'); + container.className = 'preview-video preview-video-youtube'; + + var embed = document.createElement('embed'); + embed.setAttribute('src', 'http://www.youtube.com/v/' + id); + embed.setAttribute('type', 'application/x-shockwave-flash'); + embed.setAttribute('wmode', 'transparent'); + embed.setAttribute('width', '212'); + embed.setAttribute('height', '175'); + + if (document.all) { + container.appendChild(embed); + } else { + var preview = document.createElement('object'); + preview.setAttribute('width', '212'); + preview.setAttribute('height', '175'); + + var param1 = document.createElement('param'); + param1.setAttribute('name', 'movie'); + param1.setAttribute('value', 'http://www.youtube.com/v/' + id); + param1.setAttribute('valuetype', 'ref'); + param1.setAttribute('type', 'application/x-shockwave-flash'); + + var param2 = document.createElement('param'); + param2.setAttribute('name', 'wmode'); + param2.setAttribute('value', 'transparent'); + + preview.appendChild(param1); + preview.appendChild(param2); + preview.appendChild(embed); + container.appendChild(preview); + } + + if (placeholder && placeholder.parentNode) { + placeholder.parentNode.replaceChild(container, placeholder); + } else { + document.body.appendChild(container); + } +} + +// }}} +// {{{ preview_video_niconico() + +/* + * ニコニコ動画のプレビューを表示する + * + * @param String id + * @param Element placeholder + * @return void + */ +function preview_video_niconico(id, placeholder) +{ + var container = document.createElement('div'); + container.className = 'preview-video preview-video-niconico'; + + var preview = document.createElement('iframe'); + preview.setAttribute('src', 'http://ext.nicovideo.jp/thumb/' + id); + preview.setAttribute('width', '425'); + preview.setAttribute('height', '175'); + preview.setAttribute('frameborder', '0'); + preview.setAttribute('scrolling', 'auto'); + + container.appendChild(preview); + + if (placeholder && placeholder.parentNode) { + placeholder.parentNode.replaceChild(container, placeholder); + } else { + document.body.appendChild(container); + } +} + +// }}} + +/* + * Local Variables: + * mode: javascript + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: t + * End: + */ +/* vim: set syn=javascript fenc=cp932 ai noet ts=4 sw=4 sts=4 fdm=marker: */ diff --git a/rep2/js/smartpopup.js b/rep2/js/smartpopup.js index 39c8ee328..b8df91465 100644 --- a/rep2/js/smartpopup.js +++ b/rep2/js/smartpopup.js @@ -55,18 +55,21 @@ SPM.init = function (aThread) { // ブックマーク (未実装) - // あぼーんワード・NGワード + // あぼーんワード・NGワード・ハイライトワード if (opt[2] == 1 || opt[2] == 2) { var abnId = threadId + '_ab'; var ngId = threadId + '_ng'; + var highlightId = threadId + '_highlight'; spm.appendItem('あぼーんする', [aThread, 'info_sp.php', 'mode=aborn_res']); spm.appendItem('あぼーんワード', null, abnId); spm.appendItem('NGワード', null, ngId); + spm.appendItem('ハイライトワード', null, highlightId); // サブメニュー生成 var spmAborn = SPM.createNgAbornSubMenu(abnId, aThread, 'aborn'); var spmNg = SPM.createNgAbornSubMenu(ngId, aThread, 'ng'); + var spmHighlight = SPM.createNgAbornSubMenu(highlightId, aThread, 'highlight'); } else { - var spmAborn = false, spmNg = false; + var spmAborn = false, spmNg = false, spmHighlight = false; } // フィルタリング @@ -121,6 +124,10 @@ SPM.init = function (aThread) { if (spmNg) { container.appendChild(spmNg); } + // ハイライトワード・サブメニューをコンテナに追加 + if (spmHighlight) { + container.appendChild(spmHighlight); + } // フィルタリング・サブメニューをコンテナに追加 if (spmFilter) { container.appendChild(spmFilter); diff --git a/rep2/live_control.php b/rep2/live_control.php new file mode 100755 index 000000000..9dc50465f --- /dev/null +++ b/rep2/live_control.php @@ -0,0 +1,52 @@ + + + + + + + + + + +
    +
    +

     

    +

     

    +
    +
    + + +LIVE; + +?> \ No newline at end of file diff --git a/rep2/live_frame.php b/rep2/live_frame.php new file mode 100755 index 000000000..1c5f9a8a7 --- /dev/null +++ b/rep2/live_frame.php @@ -0,0 +1,74 @@ +authorize(); // ユーザ認証 + +// 変数 +if (empty($_GET['host'])) { + // 引数エラー + die('p2 error: host が指定されていません'); +} else { + $host = $_GET['host']; +} +$bbs = isset($_GET['bbs']) ? $_GET['bbs'] : ''; +$key = isset($_GET['key']) ? $_GET['key'] : ''; +$rescount = isset($_GET['rescount']) ? intval($_GET['rescount']) : 1; + +$itaj = P2Util::getItaName($host, $bbs); +if (!$itaj) { $itaj = $bbs; } + +$ttitle_en = isset($_GET['ttitle_en']) ? $_GET['ttitle_en'] : ''; +$ttitle = (strlen($ttitle_en) > 0) ? UrlSafeBase64::decode($ttitle_en) : ''; +$ttitle_hd = htmlspecialchars($ttitle, ENT_QUOTES); +$ttitle_urlen = rawurlencode($ttitle_en); +$ttitle_en_q = "&ttitle_en=" . $ttitle_urlen; + +$live_read = "live_read.php"; +$live_q = "&live=1"; + +if ($_GET['offline']) { + $offline_l = isset($_GET['offline']) ? $_GET['offline'] : ''; + $offline_q = "&offline=" . $offline_l; + $live_read = "read.php"; + $live_q = "&live=0"; +} + +if ($_GET['word']) { + $word_l = isset($_GET['word']) ? $_GET['word'] : ''; + $method_l = isset($_GET['method']) ? $_GET['method'] : ''; + $word_q = "&word=" . $word_l . "&method=" . $method_l; + $live_read = "read.php"; + $live_q = "&live=0"; +} + +// HTMLプリント +P2Util::header_nocache(); +P2Util::header_content_type(); + +if ($_conf['doctype']) { echo $_conf['doctype']; } + +echo << + + + + + {$itaj} / {$ttitle_hd} + + + + + + + + + + + +LIVE; + +?> \ No newline at end of file diff --git a/rep2/live_post.php b/rep2/live_post.php new file mode 100755 index 000000000..2387c29f4 --- /dev/null +++ b/rep2/live_post.php @@ -0,0 +1,1000 @@ +authorize(); // ユーザ認証 + +if (!empty($_conf['disable_res'])) { + p2die('書き込み機能は無効です。'); +} + +// 引数エラー +if (empty($_POST['host'])) { + p2die('引数の指定が変です'); +} + +$el = error_reporting(E_ALL & ~E_NOTICE); +$salt = 'post' . $_POST['host'] . $_POST['bbs'] . $_POST['key']; +error_reporting($el); + +if (!isset($_POST['csrfid']) or $_POST['csrfid'] != P2Util::getCsrfId($salt)) { + p2die('不正なポストです'); +} + +if ($_conf['expack.aas.enabled'] && !empty($_POST['PREVIEW_AAS'])) { + include P2_BASE_DIR . '/aas.php'; + exit; +} + +//================================================================ +// 変数 +//================================================================ +$newtime = date('gis'); + +$post_param_keys = array('bbs', 'key', 'time', 'FROM', 'mail', 'MESSAGE', 'subject', 'submit'); +$post_internal_keys = array('host', 'sub', 'popup', 'rescount', 'ttitle_en'); +$post_optional_keys = array('newthread', 'beres', 'p2res', 'from_read_new', 'maru', 'csrfid'); +$post_p2_flag_keys = array('b', 'p2_post_confirm_cookie'); + +foreach ($post_param_keys as $pk) { + ${$pk} = (isset($_POST[$pk])) ? $_POST[$pk] : ''; +} +foreach ($post_internal_keys as $pk) { + ${$pk} = (isset($_POST[$pk])) ? $_POST[$pk] : ''; +} + +if (!isset($ttitle)) { + if ($ttitle_en) { + $ttitle = UrlSafeBase64::decode($ttitle_en); + } elseif ($subject) { + $ttitle = $subject; + } else { + $ttitle = ''; + } +} + +//$MESSAGE = rtrim($MESSAGE); + +// {{{ ソースコードがきれいに再現されるように変換 + +if (!empty($_POST['fix_source'])) { + // タブをスペースに + $MESSAGE = tab2space($MESSAGE); + // 特殊文字を実体参照に + $MESSAGE = p2h($MESSAGE); + // 自動URLリンク回避 + $MESSAGE = str_replace('tp://', 'tp://', $MESSAGE); + // 行頭のスペースを実体参照に + $MESSAGE = preg_replace('/^ /m', ' ', $MESSAGE); + // 二つ続くスペースの一つ目を実体参照に + $MESSAGE = preg_replace('/(? $v) { + if (!array_key_exists($k, $post) && !in_array($k, $post_ignore_keys)) { + $post[$k] = $v; + } + } +} + +if (!empty($_POST['newthread'])) { + $ptitle = 'rep2 - 新規スレッド作成'; +} else { + $ptitle = 'rep2 - レス書き込み'; +} + +$post_backup_key = PostDataStore::getKeyForBackup($host, $bbs, $key, !empty($_REQUEST['newthread'])); +$post_config_key = PostDataStore::getKeyForConfig($host, $bbs); + +// 設定を保存 +PostDataStore::set($post_config_key, array( + 'beres' => !empty($_REQUEST['beres']), + 'p2res' => !empty($_REQUEST['p2res']), +)); + +//================================================================ +// 書き込み処理 +//================================================================ + +// 書き込みを一時的に保存 +PostDataStore::set($post_backup_key, $post_cache); + +// ポスト実行 +if (!empty($_POST['p2res']) && empty($_POST['newthread'])) { + // 公式p2で書き込み + $posted = postIt2($host, $bbs, $key, $FROM, $mail, $MESSAGE); +} else { + // cookie 読み込み + $cookie_key = $_login->user_u . '/' . P2Util::normalizeHostName(P2Util::isHostBbsPink($host) ? 'www.bbspink.com' : P2Util::isHost2chs($host) ? 'www.2ch.net' : $host); // 忍法帳対応 + if ($p2cookies = CookieDataStore::get($cookie_key)) { + if (is_array($p2cookies)) { + if (array_key_exists('expires', $p2cookies)) { + // 期限切れなら破棄 + if (time() > strtotime($p2cookies['expires'])) { + CookieDataStore::delete($cookie_key); + $p2cookies = null; + } + } + } else { + CookieDataStore::delete($cookie_key); + $p2cookies = null; + } + } else { + $p2cookies = null; + } + + // 直接書き込み + $posted = postIt($host, $bbs, $key, $post); + + // cookie 保存 + if ($p2cookies) { + CookieDataStore::set($cookie_key, $p2cookies); + } +} + +// 投稿失敗記録を削除 +if ($posted) { + PostDataStore::delete($post_backup_key); +} + +//============================================= +// スレ立て成功なら、subjectからkeyを取得 +//============================================= +if (!empty($_POST['newthread']) && $posted) { + sleep(1); + $key = getKeyInSubject(); +} + +//============================================= +// key.idx 保存 +//============================================= +// <> を外す。。 +$tag_rec['FROM'] = str_replace('<>', '', $FROM); +$tag_rec['mail'] = str_replace('<>', '', $mail); + +// 名前とメール、空白時は P2NULL を記録 +$tag_rec_n['FROM'] = ($tag_rec['FROM'] == '') ? 'P2NULL' : $tag_rec['FROM']; +$tag_rec_n['mail'] = ($tag_rec['mail'] == '') ? 'P2NULL' : $tag_rec['mail']; + +if ($host && $bbs && $key) { + $keyidx = P2Util::idxDirOfHostBbs($host, $bbs) . $key . '.idx'; + + // 読み込み + if ($keylines = FileCtl::file_read_lines($keyidx, FILE_IGNORE_NEW_LINES)) { + $akeyline = explode('<>', $keylines[0]); + } + $sar = array($akeyline[0], $akeyline[1], $akeyline[2], $akeyline[3], $akeyline[4], + $akeyline[5], $akeyline[6], $tag_rec_n['FROM'], $tag_rec_n['mail'], $akeyline[9], + $akeyline[10], $akeyline[11], $akeyline[12]); + P2Util::recKeyIdx($keyidx, $sar); // key.idxに記録 +} + +//============================================= +// 書き込み履歴 +//============================================= +if (empty($posted)) { + exit; +} + +if ($host && $bbs && $key) { + + $lock = new P2Lock($_conf['res_hist_idx'], false); + + FileCtl::make_datafile($_conf['res_hist_idx']); // なければ生成 + + $lines = FileCtl::file_read_lines($_conf['res_hist_idx'], FILE_IGNORE_NEW_LINES); + + $neolines = array(); + + // {{{ 最初に重複要素を削除しておく + + if (is_array($lines)) { + foreach ($lines as $line) { + $lar = explode('<>', $line); + // 重複回避, keyのないものは不正データ + if (!$lar[1] || $lar[1] == $key) { + continue; + } + $neolines[] = $line; + } + } + + // }}} + + // 新規データ追加 + $newdata = "{$ttitle}<>{$key}<><><><><><>{$tag_rec['FROM']}<>{$tag_rec['mail']}<><>{$host}<>{$bbs}"; + array_unshift($neolines, $newdata); + while (sizeof($neolines) > $_conf['res_hist_rec_num']) { + array_pop($neolines); + } + + // {{{ 書き込む + + if ($neolines) { + $cont = ''; + foreach ($neolines as $l) { + $cont .= $l . "\n"; + } + + if (FileCtl::file_write_contents($_conf['res_hist_idx'], $cont) === false) { + p2die('cannot write file.'); + } + } + + // }}} + + $lock->free(); +} + +//============================================= +// 書き込みログ記録 +//============================================= +if ($_conf['res_write_rec']) { + + // データPHP形式(p2_res_hist.dat.php, タブ区切り)の書き込み履歴を、dat形式(p2_res_hist.dat, <>区切り)に変換する + P2Util::transResHistLogPhpToDat(); + + $date_and_id = date('y/m/d H:i'); + $message = htmlspecialchars($MESSAGE, ENT_NOQUOTES, 'Shift_JIS'); + $message = preg_replace('/\\r\\n|\\r|\\n/', '
    ', $message); + + FileCtl::make_datafile($_conf['res_hist_dat']); // なければ生成 + + $resnum = ''; + if (!empty($_POST['newthread'])) { + $resnum = 1; + } else { + if ($rescount) { + $resnum = $rescount + 1; + } + } + + // 新規データ + $newdata = "{$tag_rec['FROM']}<>{$tag_rec['mail']}<>{$date_and_id}<>{$message}<>{$ttitle}<>{$host}<>{$bbs}<>{$key}<>{$resnum}"; + + // まずタブを全て外して(2chの書き込みではタブは削除される 2004/12/13) + $newdata = str_replace("\t", '', $newdata); + // <>をタブに変換して + //$newdata = str_replace('<>', "\t", $newdata); + + $cont = $newdata."\n"; + + // 書き込み処理 + if (FileCtl::file_write_contents($_conf['res_hist_dat'], $cont, FILE_APPEND) === false) { + trigger_error('rep2 error: 書き込みログの保存に失敗しました', E_USER_WARNING); + // これは実際は表示されないけれども + //P2Util::pushInfoHtml('

    rep2 error: 書き込みログの保存に失敗しました

    '); + } +} + +//=========================================================== +// 関数 +//=========================================================== +// {{{ postIt() + +/** + * レスを書き込む + * + * @return boolean 書き込み成功なら true、失敗なら false + */ +function postIt($host, $bbs, $key, $post) +{ + global $_conf, $post_result, $post_error2ch, $p2cookies, $host, $bbs, $key, $popup, $rescount, $ttitle_en; + global $bbs_cgi; + + $method = 'POST'; + $bbs_cgi_url = 'http://' . $host . $bbs_cgi; + + $URL = parse_url($bbs_cgi_url); // URL分解 + if (isset($URL['query'])) { // クエリー + $URL['query'] = '?' . $URL['query']; + } else { + $URL['query'] = ''; + } + + // プロキシ + if ($_conf['proxy_use']) { + $send_host = $_conf['proxy_host']; + $send_port = $_conf['proxy_port']; + $send_path = $bbs_cgi_url; + } else { + $send_host = $URL['host']; + $send_port = isset($URL['port']) ? $URL['port'] : 80; + $send_path = $URL['path'] . $URL['query']; + } + + if (!$send_port) { $send_port = 80; } // デフォルトを80 + + $request = "{$method} {$send_path} HTTP/1.0\r\n"; + $request .= "Host: {$URL['host']}\r\n"; + $request .= "User-Agent: Monazilla/1.00 ({$_conf['p2ua']})\r\n"; + $request .= "Referer: http://{$URL['host']}/\r\n"; + + // クッキー + $cookies_to_send = ''; + if ($p2cookies) { + foreach ($p2cookies as $cname => $cvalue) { + if ($cname != 'expires') { + $cookies_to_send .= " {$cname}={$cvalue};"; + } + } + } + + // be.2ch.net 認証クッキー + if (P2Util::isHostBe2chNet($host) || !empty($_REQUEST['beres'])) { + $cookies_to_send .= ' MDMD='.$_conf['be_2ch_code'].';'; // be.2ch.netの認証コード(パスワードではない) + $cookies_to_send .= ' DMDM='.$_conf['be_2ch_mail'].';'; // be.2ch.netの登録メールアドレス + } + + if (!$cookies_to_send) { $cookies_to_send = ' ;'; } + $request .= 'Cookie:'.$cookies_to_send."\r\n"; + //$request .= 'Cookie: PON='.$SPID.'; NAME='.$FROM.'; MAIL='.$mail."\r\n"; + + $request .= "Connection: Close\r\n"; + + // {{{ POSTの時はヘッダを追加して末尾にURLエンコードしたデータを添付 + + if (strcasecmp($method, 'POST') == 0) { + $post_enc = array(); + while (list($name, $value) = each($post)) { + + // したらば or be.2ch.netなら、EUCに変換 + if (P2Util::isHostJbbsShitaraba($host) || P2Util::isHostBe2chNet($host)) { + $value = mb_convert_encoding($value, 'CP51932', 'CP932'); + } + + $post_enc[] = $name . '=' . rawurlencode($value); + } + $postdata = implode("&", $post_enc); + $request .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $request .= "Content-Length: ".strlen($postdata)."\r\n"; + $request .= "\r\n"; + $request .= $postdata; + + } else { + $request .= "\r\n"; + } + // }}} + + // WEBサーバへ接続 + $fp = fsockopen($send_host, $send_port, $errno, $errstr, $_conf['http_conn_timeout']); + if (!$fp) { + $errstr = p2h($errstr); + showPostMsg(false, "サーバ接続エラー: $errstr ($errno)
    p2 Error: 板サーバへの接続に失敗しました", false); + return false; + } + stream_set_timeout($fp, $_conf['http_read_timeout'], 0); + + //echo '

    $request

    ' . $request . "

    "; //for debug + fputs($fp, $request); + + $start_here = false; + $post_seikou = false; + + while (!p2_stream_eof($fp, $timed_out)) { + + if ($start_here) { + $wr = ''; + while (!p2_stream_eof($fp, $timed_out)) { + $wr .= fread($fp, 164000); + } + $response = $wr; + break; + + } else { + $l = fgets($fp, 164000); + //echo $l .'
    '; // for debug + // クッキーキタ + if (preg_match('/Set-Cookie: (.+?)\\r\\n/', $l, $matches)) { + //echo '

    ' . $matches[0] . '

    '; // + $cgroups = explode(';', $matches[1]); + if ($cgroups) { + foreach ($cgroups as $v) { + if (preg_match('/(.+)=(.*)/', $v, $m)) { + $k = ltrim($m[1]); + if ($k != 'path') { + if (!$p2cookies) { + $p2cookies = array(); + } + $p2cookies[$k] = $m[2]; + } + } + } + } + if ($p2cookies) { + $cookies_to_send = ''; + foreach ($p2cookies as $cname => $cvalue) { + if ($cname != 'expires') { + $cookies_to_send .= " {$cname}={$cvalue};"; + } + } + $newcookies = "Cookie:{$cookies_to_send}\r\n"; + + $request = preg_replace('/Cookie: .*?\\r\\n/', $newcookies, $request); + } + + // 転送は書き込み成功と判断 + } elseif (preg_match('/^Location: /', $l, $matches)) { + $post_seikou = true; + } + if ($l == "\r\n") { + $start_here = true; + } + } + + } + fclose($fp); + + // be.2ch.net or JBBSしたらば 文字コード変換 EUC→SJIS + if (P2Util::isHostBe2chNet($host) || P2Util::isHostJbbsShitaraba($host)) { + $response = mb_convert_encoding($response, 'CP932', 'CP51932'); + + // + $response = preg_replace( + '{(.*?)(.*)}is', + '$1$2', + $response); + } + + $kakikonda_match = '{.*(?:書きこみました|■ 書き込みました ■|書き込み終了 - SubAll BBS).*}is'; + $cookie_kakunin_match = '{|■ 書き込み確認 ■|>書き込み確認。<}'; + + if (preg_match('/<.+>/s', $response, $matches)) { + $response = $matches[0]; + } + + // カキコミ成功 + if ($post_seikou || preg_match($kakikonda_match, $response)) { + $reload = empty($_POST['from_read_new']); + showPostMsg(true, '書きこみが終わりました。', $reload); + + // +Wiki sambaタイマー + if ($_conf['wiki.samba_timer']) { + require_once P2_LIB_DIR . '/wiki/Samba.php'; + $samba = new Samba(); + $samba->setWriteTime($host, $bbs); + $samba->save(); + } + + return true; + //$response_ht = p2h($response); + //echo "
    {$response_ht}
    "; + + // cookie確認(post再チャレンジ) + } elseif (preg_match($cookie_kakunin_match, $response)) { + showCookieConfirmation($host, $response); + return false; + + // その他はレスポンスをそのまま表示 + } else { + echo preg_replace('@こちらでリロードしてください。 GO!
    @', '', $response); + return false; + } +} + +// }}} +// {{{ postIt2() + +/** + * 公式p2でレスを書き込む + * + * @return boolean 書き込み成功なら true、失敗なら false + */ +function postIt2($host, $bbs, $key, $FROM, $mail, $MESSAGE) +{ + if (P2Util::isHostBe2chNet($host) || !empty($_REQUEST['beres'])) { + $beRes = true; + } else { + $beRes = false; + } + + try { + $posted = P2Util::getP2Client()->post($host, $bbs, $key, + $FROM, $mail, $MESSAGE, + $beRes, $response); + } catch (P2Exception $e) { + p2die('公式p2ポスト失敗', $e->getMessage()); + } + + if ($posted) { + $reload = empty($_POST['from_read_new']); + showPostMsg(true, '書きこみが終わりました。', $reload); + } else { + $result_msg = '公式p2ポスト失敗

    ' + . '
    ' . p2h($response['body']) . '
    ' + . '

    -'; + showPostMsg(false, $result_msg, false); + } + + return $posted; +} + +// }}} +// {{{ showPostMsg() + +/** + * 書き込み処理結果表示する + * + * @return void + */ +function showPostMsg($isDone, $result_msg, $reload) +{ + global $_conf, $location_ht, $popup, $ttitle, $ptitle; + global $STYLE, $skin_en; + + // プリント用変数 =============== + if (!$_conf['ktai']) { + $class_ttitle = ' class="thre_title"'; + } else { + $class_ttitle = ''; + } + $ttitle_ht = "{$ttitle}"; + + $popup_ht = ''; + if ($isDone) { + // 2005/03/01 aki: jigブラウザに対応するため、& ではなく & で + // 2005/04/25 rsk: +EOJS; + } else { + $_conf['extra_headers_ht'] .= << +EOP; + } + } + + // プリント ============== + echo $_conf['doctype']; + echo << + + + + + + {$_conf['extra_headers_ht']} +EOHEADER; + + if ($isDone) { + echo " rep2 - 書きこみました。"; + } else { + echo " {$ptitle}"; + } + + if (!$_conf['ktai']) { + echo << + + \n +EOP; + if ($popup) { + echo << + // + +EOSCRIPT; + } + if ($reload) { + echo $popup_ht; + } + $kakunin_ht = ''; + } else { + $kakunin_ht = <<確認

    +EOP; + } + + echo "\n"; + echo "\n"; + + P2Util::printInfoHtml(); + + echo <<{$ttitle_ht}

    +

    {$result_msg}

    +{$kakunin_ht} + + +EOP; +} + +// }}} +// {{{ showCookieConfirmation() + +/** + * Cookie確認HTMLを表示する + * + * @param string $host ホスト名 + * @param string $response レスポンスボディ + * @return void + */ +function showCookieConfirmation($host, $response) +{ + global $_conf, $post_param_keys, $post_send_keys, $post_optional_keys; + global $popup, $rescount, $ttitle_en; + global $STYLE, $skin_en; + + // HTMLをDOMで解析 + $doc = P2Util::getHtmlDom($response, 'Shift_JIS', false); + if (!$doc) { + showUnexpectedResponse($response, __LINE__); + return; + } + + $xpath = new DOMXPath($doc); + $heads = $doc->getElementsByTagName('head'); + $bodies = $doc->getElementsByTagName('body'); + if ($heads->length != 1 || $bodies->length != 1) { + showUnexpectedResponse($response, __LINE__); + return; + } + + $head = $heads->item(0); + $body = $bodies->item(0); + $xpath = new DOMXPath($doc); + + // フォームを探索 + $forms = $xpath->query(".//form[(@method = 'POST' or @method = 'post') + and (starts-with(@action, '../test/bbs.cgi') or starts-with(@action, '../test/subbbs.cgi'))]", $body); + if ($forms->length != 1) { + showUnexpectedResponse($response, __LINE__); + return; + } + $form = $forms->item(0); + + if (!preg_match('{^\\.\\./test/(sub)?bbs\\.cgi(?:\\?guid=ON)?$}', $form->getAttribute('action'), $matches)) { + showUnexpectedResponse($response, __LINE__); + return; + } + + if (array_key_exists(1, $matches) && strlen($matches[1])) { + $subbbs = $matches[1]; + } else { + $subbbs = false; + } + + // form要素の属性値を書き換える + // method属性とaction属性以外の属性は削除し、accept-charset属性を追加する + // DOMNamedNodeMapのイテレーションと、それに含まれるノードの削除は別に行う + $rmattrs = array(); + foreach ($form->attributes as $name => $node) { + switch ($name) { + case 'method': + //$node->value = 'POST'; + break; + case 'action': + $node->value = './live_post.php'; + break; + default: + $rmattrs[] = $name; + } + } + foreach ($rmattrs as $name) { + $form->removeAttribute($name); + } + $form->setAttribute('accept-charset', $_conf['accept_charset']); + + // POSTする値を再設定 + foreach (array_combine($post_send_keys, $post_param_keys) as $key => $name) { + if (array_key_exists($name, $_POST)) { + $nodes = $xpath->query("./input[@type = 'hidden' and @name = '{$key}']"); + if ($nodes->length) { + $elem = $nodes->item(0); + if ($key != $name) { + $elem->setAttribute('name', $name); + } + $elem->setAttribute('value', mb_convert_encoding($_POST[$name], 'UTF-8', 'CP932')); + } + } + } + + // 各種隠しパラメータを追加 + $hidden = $doc->createElement('input'); + $hidden->setAttribute('type', 'hidden'); + + // rep2が使用する変数その1 + foreach (array('host', 'popup', 'rescount', 'ttitle_en') as $name) { + $elem = $hidden->cloneNode(); + $elem->setAttribute('name', $name); + $elem->setAttribute('value', $$name); + $form->appendChild($elem); + } + + // rep2が使用する変数その2 + foreach ($post_optional_keys as $name) { + if (array_key_exists($name, $_POST)) { + $elem = $hidden->cloneNode(); + $elem->setAttribute('name', $name); + $elem->setAttribute('value', mb_convert_encoding($_POST[$name], 'UTF-8', 'CP932')); + $form->appendChild($elem); + } + } + + // POST先がsubbbs.cgi + if ($subbbs !== false) { + $elem = $hidden->cloneNode(); + $elem->setAttribute('name', 'sub'); + $elem->setAttribute('value', $subbbs); + $form->appendChild($elem); + } + + // ソースコード補正 + if (!empty($_POST['fix_source'])) { + $elem = $hidden->cloneNode(); + $elem->setAttribute('name', 'fix_source'); + $elem->setAttribute('value', '1'); + $form->appendChild($elem); + } + + // 強制ビュー指定 + if ($_conf['b'] != $_conf['client_type']) { + $elem = $hidden->cloneNode(); + $elem->setAttribute('name', 'b'); + $elem->setAttribute('value', $_conf['b']); + $form->appendChild($elem); + } + + // Cookie確認フラグ + $elem = $hidden->cloneNode(); + $elem->setAttribute('name', 'p2_post_confirm_cookie'); + $elem->setAttribute('value', '1'); + $form->appendChild($elem); + + // エンコーディング判定のヒント + $hidden->setAttribute('name', '_hint'); + $hidden->setAttribute('value', mb_convert_encoding($_conf['detect_hint'], 'UTF-8', 'CP932')); + $form->insertBefore($hidden, $form->firstChild); + + // ヘッダに要素を追加 + if (!$_conf['ktai']) { + $skin_q = str_replace('&', '&', $skin_en); + $link = $doc->createElement('link'); + $link->setAttribute('rel', 'stylesheet'); + $link->setAttribute('type', 'text/css'); + $link->setAttribute('href', "css.php?css=style&skin={$skin_q}"); + $link = $head->appendChild($link)->cloneNode(); + $link->setAttribute('href', "css.php?css=post&skin={$skin_q}"); + $head->appendChild($link); + + if ($popup) { + $mado_okisa = explode(',', $STYLE['post_pop_size']); + $script = $doc->createElement('script'); + $script->setAttribute('type', 'text/javascript'); + $head->appendChild($script)->appendChild($doc->createCDATASection( + sprintf('resizeTo(%d,%d);', $mado_okisa[0], $mado_okisa[1] + 200) + )); + } + } + + // 構文修正 + // li要素を直接の子要素として含まないul要素をblockquote要素で置換 + // DOMNodeListのイテレーションと、それに含まれるノードの削除は別に行う + $nodes = array(); + foreach ($xpath->query('.//ul[count(./li)=0]', $body) as $node) { + $nodes[] = $node; + } + foreach ($nodes as $node) { + $children = array(); + foreach ($node->childNodes as $child) { + $children[] = $child; + } + $elem = $doc->createElement('blockquote'); + foreach ($children as $child) { + $elem->appendChild($node->removeChild($child)); + } + $node->parentNode->replaceChild($elem, $node); + } + + // libxml2内部の文字列エンコーディングはUTF-8であるが、saveHTML()等の + // メソッドでは読み込んだ文書のエンコーディングに再変換して出力される + // (DOMDocumentのencodingプロパティを変更することで変られる) + echo $doc->saveHTML(); +} + +// }}} +// {{{ showUnexpectedResponse() + +/** + * サーバから予期しないレスポンスが返ってきた旨を表示する + * + * @param string $response レスポンスボディ + * @param int $line 行番号 + * @return void + */ +function showUnexpectedResponse($response, $line = null) +{ + echo 'p2 ERROR'; + echo '

    p2 ERROR

    サーバからのレスポンスが変です。'; + if (is_numeric($line)) { + echo "({$line})"; + } + echo '

    ';
    +    echo p2h($response);
    +    echo '
    '; +} + +// }}} +// {{{ getKeyInSubject() + +/** + * subjectからkeyを取得する + * + * @return string|false + */ +function getKeyInSubject() +{ + global $host, $bbs, $ttitle; + + $aSubjectTxt = new SubjectTxt($host, $bbs); + + foreach ($aSubjectTxt->subject_lines as $l) { + if (strpos($l, $ttitle) !== false) { + if (preg_match("/^([0-9]+)\.(dat|cgi)(,|<>)(.+) ?(\(|()([0-9]+)(\)|))/", $l, $matches)) { + return $key = $matches[1]; + } + } + } + + return false; +} + +// }}} +// {{{ tab2space() + +/** + * 整形を維持しながら、タブをスペースに置き換える + * + * @param string $in_str 対象文字列 + * @param int $tabwidth タブ幅 + * @param string $linebreak 改行文字(列) + * @return string + */ +function tab2space($in_str, $tabwidth = 4, $linebreak = "\n") +{ + $out_str = ''; + $lines = preg_split('/\\r\\n|\\r|\\n/', $in_str); + $ln = count($lines); + $i = 0; + + while ($i < $ln) { + $parts = explode("\t", rtrim($lines[$i])); + $pn = count($parts); + + for ($j = 0; $j < $pn; $j++) { + if ($j == 0) { + $l = $parts[$j]; + } else { + //$t = $tabwidth - (strlen($l) % $tabwidth); + $sn = $tabwidth - (mb_strwidth($l) % $tabwidth); // UTF-8でも全角文字幅を2とカウントする + for ($k = 0; $k < $sn; $k++) { + $l .= ' '; + } + $l .= $parts[$j]; + } + } + + $out_str .= $l; + if (++$i < $ln) { + $out_str .= $linebreak; + } + } + + return $out_str; +} + +// }}} + +/* + * Local Variables: + * mode: php + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ +// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/rep2/live_post_form.php b/rep2/live_post_form.php new file mode 100755 index 000000000..d72292b01 --- /dev/null +++ b/rep2/live_post_form.php @@ -0,0 +1,212 @@ +authorize(); // ユーザ認証 + +//================================================== +// 変数 +//================================================== +if (empty($_GET['host'])) { + // 引数エラー + p2die('host が指定されていません'); +} else { + $host = $_GET['host']; +} + +$bbs = isset($_GET['bbs']) ? $_GET['bbs'] : ''; +$key = isset($_GET['key']) ? $_GET['key'] : ''; + +$rescount = isset($_GET['rescount']) ? intval($_GET['rescount']) : 1; +$popup = isset($_GET['popup']) ? intval($_GET['popup']) : 0; + +$itaj = P2Util::getItaName($host, $bbs); +if (!$itaj) { + $itaj = $bbs; +} +$itaj_hd = p2h($itaj, false); + +$ttitle_en = isset($_GET['ttitle_en']) ? $_GET['ttitle_en'] : ''; +$ttitle = (strlen($ttitle_en) > 0) ? UrlSafeBase64::decode($ttitle_en) : ''; +$ttitle_hd = p2h($ttitle); +$ttitle_urlen = rawurlencode($ttitle_en); +$ttitle_en_q = "&ttitle_en=" . $ttitle_urlen; + +$key_idx = P2Util::idxDirOfHostBbs($host, $bbs) . $key . '.idx'; + +// フォームのオプション読み込み +include P2_LIB_DIR . '/post_form_options.inc.php'; + +// 表示指定 +if (!$_conf['ktai']) { + $class_ttitle = ' class="thre_title"'; + $target_read = ' target="read"'; + $sub_size_at = ' size="40"'; +} else { + $class_ttitle = ''; + $target_read = ''; + $sub_size_at = ''; +} + +// {{{ スレ立てなら +if (!empty($_GET['newthread'])) { + $ptitle = "{$itaj_hd} - 新規スレッド作成"; + + // machibbs、JBBS@したらば なら + if (P2Util::isHostMachiBbs($host) or P2Util::isHostJbbsShitaraba($host)) { + $submit_value = '新規書き込み'; + // 2chなら + } else { + $submit_value = '新規スレッド作成'; + } + + $htm['subject'] = <<タイトル:
    +EOP; + if ($_conf['ktai']) { + $htm['subject'] = "{$itaj_hd}
    ".$htm['subject']; + } + $newthread_hidden_ht = ''; +// }}} + +// {{{ 書き込みなら +} else { + $ptitle = "{$itaj_hd} - レス書き込み"; + + $submit_value = "書き込む"; + + $htm['resform_ttitle'] = <<{$ttitle_hd}

    +EOP; + $newthread_hidden_ht = ''; +} +// }}} + +$readnew_hidden_ht = !empty($_GET['from_read_new']) ? '' : ''; + + +//========================================================== +// HTMLプリント +//========================================================== +echo $_conf['doctype']; +echo << + + + + + + {$_conf['extra_headers_ht']} + {$ptitle}\n +EOHEADER; + +if (!$_conf['ktai']) { + echo << + \n +EOP; + if ($_conf['expack.editor.dpreview']) { + echo "\n"; + } + echo << + + \n +EOP; +} +// 下書き保存JS +if ((!$_conf['ktai'] && $_conf['expack.editor.savedraft']) || + ($_conf['iphone'] && $_conf['expack.editor.mobile.savedraft'])) { + echo << +EOP; + + // +live 書込規制用タイマー + if ($_GET['w_reg'] && $_conf['live.write_regulation']) { + $load_control = "cd_on()"; + if ($_conf['live.write_regulation'] == 3) { + $count_down_second = "31"; + } else if ($_conf['live.write_regulation'] == 2) { + $count_down_second = "21"; + } else if ($_conf['live.write_regulation'] == 1) { + $count_down_second = "11"; + } + } else { + $load_control = "cd_off()"; + $count_down_second = "0"; + } + + echo << + + +LIVE; +} + +$body_on_load = << +\n +EOP; + +P2Util::printInfoHtml(); + +// $htm['post_form'] を取得 +require_once P2_LIB_DIR . '/live/live_post_form.inc.php'; + +echo $htm['orig_msg']; +echo $htm['dpreview']; +echo $htm['post_form']; +echo $htm['dpreview2']; + +echo ''; + +/* + * Local Variables: + * mode: php + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ +// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/rep2/live_read.php b/rep2/live_read.php new file mode 100755 index 000000000..ab27c4fd6 --- /dev/null +++ b/rep2/live_read.php @@ -0,0 +1,532 @@ +authorize(); // ユーザ認証 + +// +Wiki +require_once P2_LIB_DIR . '/wiki/read.inc.php'; + +// iPhone +if ($_conf['iphone']) { + include P2_LIB_DIR . '/toolbar_i.inc.php'; + define('READ_HEADER_INC_PHP', P2_LIB_DIR . '/read_header_i.inc.php'); + define('READ_FOOTER_INC_PHP', P2_LIB_DIR . '/read_footer_i.inc.php'); +// 携帯 +} elseif ($_conf['ktai']) { + define('READ_HEADER_INC_PHP', P2_LIB_DIR . '/read_header_k.inc.php'); + define('READ_FOOTER_INC_PHP', P2_LIB_DIR . '/read_footer_k.inc.php'); +// PC +} else { + define('READ_HEADER_INC_PHP', P2_LIB_DIR . '/read_header.inc.php'); + define('READ_FOOTER_INC_PHP', P2_LIB_DIR . '/read_footer.inc.php'); +} + +//================================================================ +// 変数 +//================================================================ +$newtime = date('gis'); // 同じリンクをクリックしても再読込しない仕様に対抗するダミークエリー +// $_today = date('y/m/d'); +$is_ajax = !empty($_GET['ajax']); + +//================================================= +// スレの指定 +//================================================= +detectThread(); // global $host, $bbs, $key, $ls + +//================================================= +// レスフィルタ +//================================================= +$do_filtering = false; +if (array_key_exists('rf', $_REQUEST) && is_array($_REQUEST['rf'])) { + $resFilter = ResFilter::configure($_REQUEST['rf']); + if ($resFilter->hasWord()) { + $do_filtering = true; + if ($_conf['ktai']) { + $page = isset($_REQUEST['page']) ? $_REQUEST['page'] : 1; + $resFilter->setRange($_conf['mobile.rnum_range'], $page); + } + if (empty($popup_filter) && isset($_REQUEST['submit_filter'])) { + $resFilter->save(); + } + } +} else { + $resFilter = ResFilter::restore(); +} + +//================================================= +// あぼーん&NGワード設定読み込み +//================================================= +$GLOBALS['ngaborns'] = NgAbornCtl::loadNgAborns(); + +//================================================================== +// メイン +//================================================================== + +if (!isset($aThread)) { + $aThread = new ThreadRead(); +} + +// lsのセット +if (!empty($ls)) { + $aThread->ls = mb_convert_kana($ls, 'a'); +} + +//========================================================== +// idxの読み込み +//========================================================== + +// hostを分解してidxファイルのパスを求める +if (!isset($aThread->keyidx)) { + $aThread->setThreadPathInfo($host, $bbs, $key); +} + +// 板ディレクトリが無ければ作る +FileCtl::mkdirFor($aThread->keyidx); +FileCtl::mkdirFor($aThread->keydat); + +$aThread->itaj = P2Util::getItaName($host, $bbs); +if (!$aThread->itaj) { $aThread->itaj = $aThread->bbs; } + +// idxファイルがあれば読み込む +if ($lines = FileCtl::file_read_lines($aThread->keyidx, FILE_IGNORE_NEW_LINES)) { + $idx_data = explode('<>', $lines[0]); +} else { + $idx_data = array_fill(0, 12, ''); +} +$aThread->getThreadInfoFromIdx(); + +//========================================================== +// preview >>1 +//========================================================== + +//if (!empty($_GET['onlyone'])) { +if (!empty($_GET['one'])) { + $aThread->ls = '1'; + $aThread->resrange = array('start' => 1, 'to' => 1, 'nofirst' => false); + + // 必ずしも正確ではないが便宜的に + //if (!isset($aThread->rescount) && !empty($_GET['rc'])) { + if (!isset($aThread->rescount) && !empty($_GET['rescount'])) { + //$aThread->rescount = $_GET['rc']; + $aThread->rescount = (int)$_GET['rescount']; + } + + $preview = $aThread->previewOne(); + $ptitle_ht = p2h($aThread->itaj) . ' / ' . $aThread->ttitle_hd; + + include READ_HEADER_INC_PHP; + echo $preview; + include READ_FOOTER_INC_PHP; + + return; +} + +//=========================================================== +// DATのダウンロード +//=========================================================== +$offline = !empty($_GET['offline']); + +if (!$offline) { + $aThread->downloadDat(); +} + +// DATを読み込み +$aThread->readDat(); + +// オフライン指定でもログがなければ、改めて強制読み込み +if (empty($aThread->datlines) && $offline) { + $aThread->downloadDat(); + $aThread->readDat(); +} + +// タイトルを取得して設定 +$aThread->setTitleFromLocal(); + +//=========================================================== +// 表示レス番の範囲を設定 +//=========================================================== +if ($_conf['ktai']) { + $before_respointer = $_conf['mobile.before_respointer']; +} else { + $before_respointer = $_conf['before_respointer']; +} + +// 取得済みなら +if ($aThread->isKitoku()) { + + //「新着レスの表示」の時は特別にちょっと前のレスから表示 + if (!empty($_GET['nt'])) { + if (substr($aThread->ls, -1) == '-') { + $n = $aThread->ls - $before_respointer; + if ($n < 1) { $n = 1; } + $aThread->ls = $n . '-'; + } + + } elseif (!$aThread->ls) { + $from_num = $aThread->readnum +1 - $_conf['respointer'] - $before_respointer; + if ($from_num < 1) { + $from_num = 1; + } elseif ($from_num > $aThread->rescount) { + $from_num = $aThread->rescount - $_conf['respointer'] - $before_respointer; + } + $aThread->ls = $from_num . '-'; + } + + if ($_conf['ktai'] && strpos($aThread->ls, 'n') === false) { + $aThread->ls = $aThread->ls . 'n'; + } + +// 未取得なら +} else { + if (!$aThread->ls) { + $aThread->ls = $_conf['get_new_res_l']; + } +} + +// フィルタリングの時は、all固定とする +if ($resFilter && $resFilter->hasWord()) { + $aThread->ls = 'all'; +} + +$aThread->lsToPoint(); + +//=============================================================== +// プリント +//=============================================================== +$ptitle_ht = p2h($aThread->itaj) . ' / ' . $aThread->ttitle_hd; + +if ($_conf['ktai']) { + + if ($resFilter && $resFilter->hasWord() && $aThread->rescount) { + $GLOBALS['filter_hits'] = 0; + } else { + $GLOBALS['filter_hits'] = null; + } + + $aShowThread = new ShowThreadK($aThread); + + if ($is_ajax) { + $response = trim(mb_convert_encoding($aShowThread->getDatToHtml(true), 'UTF-8', 'CP932')); + if (isset($_GET['respop_id'])) { + $response = preg_replace('/<[^<>]+? id="/u', sprintf('$0_respop%d_', $_GET['respop_id']), $response); + } + /*if ($_conf['iphone']) { + // HTMLの断片をXMLとして渡してもDOMでidやclassが期待通りに反映されない + header('Content-Type: application/xml; charset=UTF-8'); + //$responseId = 'ajaxResponse' . time(); + $doc = new DOMDocument(); + $err = error_reporting(E_ALL & ~E_WARNING); + $html = '' + . '' + . '' + . $response + . ''; + $doc->loadHTML($html); + error_reporting($err); + echo ''; + echo $doc->saveXML($doc->getElementsByTagName('div')->item(0)); + } else {*/ + // よって、HTMLの断片をそのまま返してinnterHTMLに代入しないといけない。 + // (根本的にレスポンスのフォーマットとクライアント側での処理を変えない限りは) + header('Content-Type: text/html; charset=UTF-8'); + echo $response; + //} + } else { + if ($aThread->rescount) { + if ($_GET['showbl']) { + $content = $aShowThread->getDatToHtml_resFrom(); + } else { + $content = $aShowThread->getDatToHtml(); + } + } elseif ($aThread->diedat && count($aThread->datochi_residuums) > 0) { + $content = $aShowThread->getDatochiResiduums(); + } + + include READ_HEADER_INC_PHP; + + if ($_conf['iphone'] && $_conf['expack.spm.enabled']) { + echo $aShowThread->getSpmObjJs(); + } + + echo $content; + + include READ_FOOTER_INC_PHP; + } + +} else { + + // ヘッダ 表示 + include READ_HEADER_INC_PHP; + flush(); + + //=========================================================== + // ローカルDatを変換してHTML表示 + //=========================================================== + // レスがあり、検索指定があれば + if ($resFilter && $resFilter->hasWord() && $aThread->rescount) { + + $all = $aThread->rescount; + + $GLOBALS['filter_hits'] = 0; + + echo "

    {$all}レス中 nレスがヒット

    \n"; + } + if ($_GET['showbl']) { + echo '

    ' . p2h($aThread->resrange['start']) . 'へのレス

    '; + } + + //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("datToHtml"); + + if ($aThread->rescount) { + $mainhtml = ''; + require_once P2_LIB_DIR . '/live/live_ShowThreadPc.php'; + $aShowThread = new ShowThreadPc($aThread); + + if ($_conf['expack.spm.enabled']) { + echo $aShowThread->getSpmObjJs(); + } + + $res1 = $aShowThread->quoteOne(); // >>1ポップアップ用 + if ($_conf['coloredid.enable'] > 0 && $_conf['coloredid.click'] > 0 && + $_conf['coloredid.rate.type'] > 0) { + if ($_GET['showbl']) { + $mainhtml = $aShowThread->datToHtml_resFrom(true); + } else { + $mainhtml .= $aShowThread->datToHtml(true); + } + $mainhtml .= $res1['q']; + } else { + if ($_GET['showbl']) { + $aShowThread->datToHtml_resFrom(); + } else { + $aShowThread->datToHtml(); + } + echo $res1['q']; + } + + + // レス追跡カラー + if ($_conf['backlink_coloring_track']) { + echo $aShowThread->getResColorJs(); + } + + // IDカラーリング + if ($_conf['coloredid.enable'] > 0 && $_conf['coloredid.click'] > 0) { + echo $aShowThread->getIdColorJs(); + // ブラウザ負荷軽減のため、CSS書き換えスクリプトの後でコンテンツを + // レンダリングさせる + echo $mainhtml; + } + + // 外部ツール + $pluswiki_js = ''; + + if ($_conf['wiki.idsearch.spm.mimizun.enabled']) { + if (!class_exists('Mimizun', false)) { + require P2_PLUGIN_DIR . '/mimizun/Mimizun.php'; + } + $mimizun = new Mimizun(); + $mimizun->host = $aThread->host; + $mimizun->bbs = $aThread->bbs; + if ($mimizun->isEnabled()) { + $pluswiki_js .= "WikiTools.addMimizun({$aShowThread->spmObjName});"; + } + } + + if ($_conf['wiki.idsearch.spm.hissi.enabled']) { + if (!class_exists('Hissi', false)) { + require P2_PLUGIN_DIR . '/hissi/Hissi.php'; + } + $hissi = new Hissi(); + $hissi->host = $aThread->host; + $hissi->bbs = $aThread->bbs; + if ($hissi->isEnabled()) { + $pluswiki_js .= "WikiTools.addHissi({$aShowThread->spmObjName});"; + } + } + + if ($_conf['wiki.idsearch.spm.stalker.enabled']) { + if (!class_exists('Stalker', false)) { + require P2_PLUGIN_DIR . '/stalker/Stalker.php'; + } + $stalker = new Stalker(); + $stalker->host = $aThread->host; + $stalker->bbs = $aThread->bbs; + if ($stalker->isEnabled()) { + $pluswiki_js .= "WikiTools.addStalker({$aShowThread->spmObjName});"; + } + } + + if ($pluswiki_js !== '') { + echo << +// + +EOP; + } + + } elseif ($aThread->diedat && count($aThread->datochi_residuums) > 0) { + require_once P2_LIB_DIR . '/ShowThreadPc.php'; + $aShowThread = new ShowThreadPc($aThread); + echo $aShowThread->getDatochiResiduums(); + } + + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("datToHtml"); + + // フィルタ結果を表示 + if ($resFilter && $resFilter->hasWord() && $aThread->rescount) { + echo << +// +\n +EOP; + if ($GLOBALS['filter_hits'] > 5) { + echo "

    {$all}レス中 {$GLOBALS['filter_hits']}レスがヒット

    \n"; + } + } + + // フッタ 表示 + include READ_FOOTER_INC_PHP; +} +flush(); + +//=========================================================== +// idxの値を設定、記録 +//=========================================================== +if ($aThread->rescount) { + + // 検索の時は、既読数を更新しない + if ((isset($GLOBALS['word']) && strlen($GLOBALS['word']) > 0) || $is_ajax) { + $aThread->readnum = $idx_data[5]; + } else { + $aThread->readnum = min($aThread->rescount, max(0, $idx_data[5], $aThread->resrange['to'])); + } + $newline = $aThread->readnum + 1; // $newlineは廃止予定だが、旧互換用に念のため + + $sar = array($aThread->ttitle, $aThread->key, $idx_data[2], $aThread->rescount, '', + $aThread->readnum, $idx_data[6], $idx_data[7], $idx_data[8], $newline, + $idx_data[10], $idx_data[11], $aThread->datochiok); + P2Util::recKeyIdx($aThread->keyidx, $sar); // key.idxに記録 +} + +//=========================================================== +// 履歴を記録 +//=========================================================== +if ($aThread->rescount && !$is_ajax) { + recRecent(implode('<>', array($aThread->ttitle, $aThread->key, $idx_data[2], '', '', + $aThread->readnum, $idx_data[6], $idx_data[7], $idx_data[8], $newline, + $aThread->host, $aThread->bbs))); +} + +// NGあぼーんを記録 +NgAbornCtl::saveNgAborns(); + +// 以上 --------------------------------------------------------------- +exit; + +//=============================================================================== +// 関数 +//=============================================================================== +// {{{ detectThread() + +/** + * スレッドを指定する + */ +function detectThread() +{ + global $_conf, $host, $bbs, $key, $ls; + + list($nama_url, $host, $bbs, $key, $ls) = P2Util::detectThread(); + + if (!($host && $bbs && $key)) { + if ($nama_url) { + $nama_url = p2h($nama_url); + p2die('スレッドの指定が変です。', "{$nama_url}", true); + } else { + p2die('スレッドの指定が変です。'); + } + } +} + +// }}} +// {{{ recRecent() + +/** + * 履歴を記録する + */ +function recRecent($data) +{ + global $_conf; + + $lock = new P2Lock($_conf['recent_idx'], false); + + // $_conf['recent_idx'] ファイルがなければ生成 + FileCtl::make_datafile($_conf['recent_idx']); + + $lines = FileCtl::file_read_lines($_conf['recent_idx'], FILE_IGNORE_NEW_LINES); + $neolines = array(); + + // {{{ 最初に重複要素を削除しておく + + if (is_array($lines)) { + foreach ($lines as $l) { + $lar = explode('<>', $l); + $data_ar = explode('<>', $data); + if ($lar[1] == $data_ar[1]) { continue; } // keyで重複回避 + if (!$lar[1]) { continue; } // keyのないものは不正データ + $neolines[] = $l; + } + } + + // }}} + + // 新規データ追加 + array_unshift($neolines, $data); + + while (sizeof($neolines) > $_conf['rct_rec_num']) { + array_pop($neolines); + } + + // {{{ 書き込む + + if ($neolines) { + $cont = ''; + foreach ($neolines as $l) { + $cont .= $l . "\n"; + } + + if (FileCtl::file_write_contents($_conf['recent_idx'], $cont) === false) { + p2die('cannot write file.'); + } + } + + // }}} + + return true; +} + +// }}} + +/* + * Local Variables: + * mode: php + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ +// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/rep2/read.php b/rep2/read.php index 4062bfa06..ebf005656 100644 --- a/rep2/read.php +++ b/rep2/read.php @@ -153,7 +153,12 @@ if ($_conf['ktai']) { $before_respointer = $_conf['mobile.before_respointer']; } else { + // +live レス表示数切替 + if ($_GET['live']) { + $before_respointer = $_conf['live.before_respointer']; + } else { $before_respointer = $_conf['before_respointer']; + } } // 取得済みなら @@ -184,7 +189,12 @@ // 未取得なら } else { if (!$aThread->ls) { + // +live レス表示数切替 + if ($_GET['live']) { + $aThread->ls = l .$_conf['live.before_respointer']; + } else { $aThread->ls = $_conf['get_new_res_l']; + } } } @@ -260,8 +270,13 @@ } else { + // +live ヘッダ切替 + if ($_GET['live']) { + P2Util::header_content_type(); + } else { // ヘッダ 表示 include READ_HEADER_INC_PHP; + } flush(); //=========================================================== @@ -397,8 +412,17 @@ } } + // +live フッタ切替 + if ($_GET['live']) { + echo << + + +LIVE; + } else { // フッタ 表示 include READ_FOOTER_INC_PHP; + } } flush(); diff --git a/rep2/read_new.php b/rep2/read_new.php old mode 100644 new mode 100755 index 0f95b24d0..6749f9e8e --- a/rep2/read_new.php +++ b/rep2/read_new.php @@ -127,23 +127,33 @@ \n EOHEADER; +// +live 実況表示 html popup 切換 +if ($_conf['live.view_type'] > 1 ) { + $live_view_popup = live_; +} + if ($_conf['iframe_popup_type'] == 1) { echo << - + EOP; } else { echo << + EOP; } if ($_conf['link_youtube'] == 2 || $_conf['link_niconico'] == 2) { + // +live YouTubeプレビュー表示のサイズ指定 + if ($_conf['live.youtube_winsize'] == 1) { + echo "\t\n"; + } else { echo <<\n EOP; + } } if ($_conf['expack.am.enabled']) { echo << \ No newline at end of file diff --git a/rep2/skin/live/bg.gif b/rep2/skin/live/bg.gif new file mode 100755 index 0000000000000000000000000000000000000000..8ecf7af7d8a873bda2dbc3162b88a740e80d4488 GIT binary patch literal 43 vcmZ?wbhEHbWMW`qXkcVGbLPzd|Nj+#vM@3*Ff!;c00Bsbfr-f_j=>rL2D=Hs literal 0 HcmV?d00001 diff --git a/rep2/skin/live2.php b/rep2/skin/live2.php new file mode 100755 index 000000000..658852d90 --- /dev/null +++ b/rep2/skin/live2.php @@ -0,0 +1,257 @@ + \ No newline at end of file diff --git a/rep2/skin/live_box.php b/rep2/skin/live_box.php new file mode 100755 index 000000000..449dc8e18 --- /dev/null +++ b/rep2/skin/live_box.php @@ -0,0 +1,413 @@ + "6px", // ("") 角丸ボックス + '-webkit-border-radius' => "6px", // ("") 角丸ボックス + '-moz-border-radius' => "6px", // ("") 角丸ボックス + '-opera-border-radius' => "6px", // ("") 角丸ボックス + 'background-color' => "#fff", // ("") 角丸ボックスの背景色 + 'border' => "1px solid #999", // ("") 角丸ボックスのボーダー +// 'margin' => "6px 0px", // ("") 角丸ボックス外の余白 +// 'padding' => "6px", // ("") 角丸ボックス内の余白 +// 'box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-webkit-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-moz-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-opera-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +); + +// メニュー +$MYSTYLE['menu']['div.menu_cate'] = array( + 'border-radius' => "6px", // ("") 角丸ボックス + '-webkit-border-radius' => "6px", // ("") 角丸ボックス + '-moz-border-radius' => "6px", // ("") 角丸ボックス + '-opera-border-radius' => "6px", // ("") 角丸ボックス + 'background-color' => "#fff", // ("") 角丸ボックスの背景色 + 'border' => "1px solid #999", // ("") 角丸ボックスのボーダー +// 'margin' => "6px 0px", // ("") 角丸ボックス外の余白 + 'padding' => "6px", // ("") 角丸ボックス内の余白 +// 'box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-webkit-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-moz-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-opera-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +); + +$MYSTYLE['menu']['div#c_online_boards div.menu_cate'] = array( + 'border' => "0px", // ("") 角丸ボックスのボーダー + 'padding' => "0px", // ("") 角丸ボックス内の余白 +// 'box-shadow' => "0px 0px 0px #fff", // ("") 角丸ボックスの影 +// '-webkit-box-shadow' => "0px 0px 0px #fff", // ("") 角丸ボックスの影 +// '-moz-box-shadow' => "0px 0px 0px #fff", // ("") 角丸ボックスの影 +// '-opera-box-shadow' => "0px 0px 0px #fff", // ("") 角丸ボックスの影 +); + +// スレタイ +$MYSTYLE['read']['h3.thread_title'] = array( + 'border-radius' => "6px", // ("") 角丸ボックス + '-webkit-border-radius' => "6px", // ("") 角丸ボックス + '-moz-border-radius' => "6px", // ("") 角丸ボックス + '-opera-border-radius' => "6px", // ("") 角丸ボックス + 'background-color' => "#fff", // ("") 角丸ボックスの背景色 + 'border' => "1px solid #999", // ("") 角丸ボックスのボーダー +// 'margin' => "6px 0px", // ("") 角丸ボックス外の余白 + 'padding' => "6px", // ("") 角丸ボックス内の余白 +// 'box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-webkit-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-moz-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-opera-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +); + +// レス デフォルト表示 +$MYSTYLE['read']['div.res'] = array( + 'border-radius' => "6px", // ("") 角丸ボックス + '-webkit-border-radius' => "6px", // ("") 角丸ボックス + '-moz-border-radius' => "6px", // ("") 角丸ボックス + '-opera-border-radius' => "6px", // ("") 角丸ボックス + 'background-color' => "#fff", // ("") 角丸ボックスの背景色 + 'border' => "1px solid #999", // ("") 角丸ボックスのボーダー + 'margin' => "6px 0px", // ("") 角丸ボックス外の余白 + 'padding' => "6px", // ("") 角丸ボックス内の余白 +// 'box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-webkit-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-moz-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-opera-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +); + +// レス 実況表示 +$MYSTYLE['read']['td.live_res'] = array( + 'border-radius' => "6px", // ("") 角丸ボックス + '-webkit-border-radius' => "6px", // ("") 角丸ボックス + '-moz-border-radius' => "6px", // ("") 角丸ボックス + '-opera-border-radius' => "6px", // ("") 角丸ボックス + 'background-color' => "#fff", // ("") 角丸ボックスの背景色 + 'border' => "1px solid #999", // ("") 角丸ボックスのボーダー + 'margin' => "6px 0px", // ("") 角丸ボックス外の余白 + 'padding' => "6px", // ("") 角丸ボックス内の余白 +// 'box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-webkit-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-moz-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-opera-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +); + +// レス 共通 +$MYSTYLE['read']['div.aborned'] = array( + 'border' => "0px solid #ccc", // ("") 角丸ボックスのボーダー +); + +$MYSTYLE['read']['div.res-header'] = array( + 'border-bottom' => "1px solid #999", // ("") 角丸ボックス内の仕切線 + 'margin-bottom' => "6px", // ("") 仕切線外の余白 + 'padding-bottom' => "6px", // ("") 仕切線内の余白 +); + +// レスポップアップ +$MYSTYLE['read']['div.respopup'] = array( + 'border-radius' => "6px", // ("") 角丸ボックス + '-webkit-border-radius' => "6px", // ("") 角丸ボックス + '-moz-border-radius' => "6px", // ("") 角丸ボックス + '-opera-border-radius' => "6px", // ("") 角丸ボックス + 'background-color' => "#fff", // ("") 角丸ボックスの背景色 + 'border' => "1px solid #999", // ("") 角丸ボックスのボーダー +// 'margin' => "6px 0px", // ("") 角丸ボックス外の余白 + 'padding' => "6px", // ("") 角丸ボックス内の余白 +// 'box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-webkit-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-moz-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-opera-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +); + +// スマートポップアップ +$MYSTYLE['read']['.spm'] = array( + 'border-radius' => "6px", // ("") 角丸ボックス + '-webkit-border-radius' => "6px", // ("") 角丸ボックス + '-moz-border-radius' => "6px", // ("") 角丸ボックス + '-opera-border-radius' => "6px", // ("") 角丸ボックス + 'background-color' => "#fff", // ("") 角丸ボックスの背景色 + 'border' => "1px solid #999", // ("") 角丸ボックスのボーダー +// 'margin' => "6px 0px", // ("") 角丸ボックス外の余白 + 'padding' => "6px", // ("") 角丸ボックス内の余白 +// 'box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-webkit-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-moz-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-opera-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +); + +// 参照レスブロック +$MYSTYLE['read']['div.resblock div.resblock_inner'] = array( + 'border-radius' => "6px", // ("") 角丸ボックス + '-webkit-border-radius' => "6px", // ("") 角丸ボックス + '-moz-border-radius' => "6px", // ("") 角丸ボックス + '-opera-border-radius' => "6px", // ("") 角丸ボックス + 'background-color' => "#fff", // ("") 角丸ボックスの背景色 + 'border' => "1px solid #999", // ("") 角丸ボックスのボーダー +// 'margin' => "6px 0px", // ("") 角丸ボックス外の余白 + 'padding' => "0px", // ("") 角丸ボックス内の余白 +// 'box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-webkit-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-moz-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +// '-opera-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +); + +// 参照レスブロック +$MYSTYLE['read']['blockquote.folding_container'] = array( + 'padding' => "6px", +); + +// }}} + +?> \ No newline at end of file diff --git a/rep2/skin/live_box2.php b/rep2/skin/live_box2.php new file mode 100755 index 000000000..dcaa39d9e --- /dev/null +++ b/rep2/skin/live_box2.php @@ -0,0 +1,413 @@ + "6px", // ("") 角丸ボックス + '-webkit-border-radius' => "6px", // ("") 角丸ボックス + '-moz-border-radius' => "6px", // ("") 角丸ボックス + '-opera-border-radius' => "6px", // ("") 角丸ボックス + 'background-color' => "#fff", // ("") 角丸ボックスの背景色 + 'border' => "1px solid #ccc", // ("") 角丸ボックスのボーダー +// 'margin' => "6px 0px", // ("") 角丸ボックス外の余白 +// 'padding' => "6px", // ("") 角丸ボックス内の余白 + 'box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-webkit-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-moz-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-opera-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +); + +// メニュー +$MYSTYLE['menu']['div.menu_cate'] = array( + 'border-radius' => "6px", // ("") 角丸ボックス + '-webkit-border-radius' => "6px", // ("") 角丸ボックス + '-moz-border-radius' => "6px", // ("") 角丸ボックス + '-opera-border-radius' => "6px", // ("") 角丸ボックス + 'background-color' => "#fff", // ("") 角丸ボックスの背景色 + 'border' => "1px solid #ccc", // ("") 角丸ボックスのボーダー +// 'margin' => "6px 0px", // ("") 角丸ボックス外の余白 + 'padding' => "6px", // ("") 角丸ボックス内の余白 + 'box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-webkit-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-moz-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-opera-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +); + +$MYSTYLE['menu']['div#c_online_boards div.menu_cate'] = array( + 'border' => "0px", // ("") 角丸ボックスのボーダー + 'padding' => "0px", // ("") 角丸ボックス内の余白 + 'box-shadow' => "0px 0px 0px #fff", // ("") 角丸ボックスの影 + '-webkit-box-shadow' => "0px 0px 0px #fff", // ("") 角丸ボックスの影 + '-moz-box-shadow' => "0px 0px 0px #fff", // ("") 角丸ボックスの影 + '-opera-box-shadow' => "0px 0px 0px #fff", // ("") 角丸ボックスの影 +); + +// スレタイ +$MYSTYLE['read']['h3.thread_title'] = array( + 'border-radius' => "6px", // ("") 角丸ボックス + '-webkit-border-radius' => "6px", // ("") 角丸ボックス + '-moz-border-radius' => "6px", // ("") 角丸ボックス + '-opera-border-radius' => "6px", // ("") 角丸ボックス + 'background-color' => "#fff", // ("") 角丸ボックスの背景色 + 'border' => "1px solid #ccc", // ("") 角丸ボックスのボーダー +// 'margin' => "6px 0px", // ("") 角丸ボックス外の余白 + 'padding' => "6px", // ("") 角丸ボックス内の余白 + 'box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-webkit-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-moz-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-opera-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +); + +// レス デフォルト表示 +$MYSTYLE['read']['div.res'] = array( + 'border-radius' => "6px", // ("") 角丸ボックス + '-webkit-border-radius' => "6px", // ("") 角丸ボックス + '-moz-border-radius' => "6px", // ("") 角丸ボックス + '-opera-border-radius' => "6px", // ("") 角丸ボックス + 'background-color' => "#fff", // ("") 角丸ボックスの背景色 + 'border' => "1px solid #ccc", // ("") 角丸ボックスのボーダー + 'margin' => "6px 0px", // ("") 角丸ボックス外の余白 + 'padding' => "6px", // ("") 角丸ボックス内の余白 + 'box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-webkit-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-moz-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-opera-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +); + +// レス 実況表示 +$MYSTYLE['read']['td.live_res'] = array( + 'border-radius' => "6px", // ("") 角丸ボックス + '-webkit-border-radius' => "6px", // ("") 角丸ボックス + '-moz-border-radius' => "6px", // ("") 角丸ボックス + '-opera-border-radius' => "6px", // ("") 角丸ボックス + 'background-color' => "#fff", // ("") 角丸ボックスの背景色 + 'border' => "1px solid #ccc", // ("") 角丸ボックスのボーダー + 'margin' => "6px 0px", // ("") 角丸ボックス外の余白 + 'padding' => "6px", // ("") 角丸ボックス内の余白 + 'box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-webkit-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-moz-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-opera-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +); + +// レス 共通 +$MYSTYLE['read']['div.aborned'] = array( + 'border' => "0px solid #ccc", // ("") 角丸ボックスのボーダー +); + +$MYSTYLE['read']['div.res-header'] = array( + 'border-bottom' => "1px solid #ccc", // ("") 角丸ボックス内の仕切線 + 'margin-bottom' => "6px", // ("") 仕切線外の余白 + 'padding-bottom' => "6px", // ("") 仕切線内の余白 +); + +// レスポップアップ +$MYSTYLE['read']['div.respopup'] = array( + 'border-radius' => "6px", // ("") 角丸ボックス + '-webkit-border-radius' => "6px", // ("") 角丸ボックス + '-moz-border-radius' => "6px", // ("") 角丸ボックス + '-opera-border-radius' => "6px", // ("") 角丸ボックス + 'background-color' => "#fff", // ("") 角丸ボックスの背景色 + 'border' => "1px solid #ccc", // ("") 角丸ボックスのボーダー +// 'margin' => "6px 0px", // ("") 角丸ボックス外の余白 + 'padding' => "6px", // ("") 角丸ボックス内の余白 + 'box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-webkit-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-moz-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-opera-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +); + +// スマートポップアップ +$MYSTYLE['read']['.spm'] = array( + 'border-radius' => "6px", // ("") 角丸ボックス + '-webkit-border-radius' => "6px", // ("") 角丸ボックス + '-moz-border-radius' => "6px", // ("") 角丸ボックス + '-opera-border-radius' => "6px", // ("") 角丸ボックス + 'background-color' => "#fff", // ("") 角丸ボックスの背景色 + 'border' => "1px solid #ccc", // ("") 角丸ボックスのボーダー +// 'margin' => "6px 0px", // ("") 角丸ボックス外の余白 + 'padding' => "6px", // ("") 角丸ボックス内の余白 + 'box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-webkit-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-moz-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-opera-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +); + +// 参照レスブロック +$MYSTYLE['read']['div.resblock div.resblock_inner'] = array( + 'border-radius' => "6px", // ("") 角丸ボックス + '-webkit-border-radius' => "6px", // ("") 角丸ボックス + '-moz-border-radius' => "6px", // ("") 角丸ボックス + '-opera-border-radius' => "6px", // ("") 角丸ボックス + 'background-color' => "#fff", // ("") 角丸ボックスの背景色 + 'border' => "1px solid #ccc", // ("") 角丸ボックスのボーダー +// 'margin' => "6px 0px", // ("") 角丸ボックス外の余白 + 'padding' => "0px", // ("") 角丸ボックス内の余白 + 'box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-webkit-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-moz-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 + '-opera-box-shadow' => "0px 0px 6px #ccc", // ("") 角丸ボックスの影 +); + +// 参照レスブロック +$MYSTYLE['read']['blockquote.folding_container'] = array( + 'padding' => "6px", +); + +// }}} + +?> \ No newline at end of file diff --git a/rep2/skin/metal.php b/rep2/skin/metal.php index 00fd26ccb..d87eb9923 100644 --- a/rep2/skin/metal.php +++ b/rep2/skin/metal.php @@ -171,6 +171,19 @@ $MYSTYLE['read']['.thread_title']['text-shadow'] = "3px 3px 2px #000"; +// }}} +// {{{ +live 実況モード + +$STYLE['live_b_l'] = "1px #999 dotted"; // ("1px #999 dotted") +live レス間の仕切線 +$STYLE['live_b_s'] = "1px #999 dotted"; // ("1px #999 dotted") +live 番号 目欄 名前 日付 ID 表示部とレス表示部の仕切線 +$STYLE['live_b_n'] = "2px #f30 dotted"; // ("2px #f30 dotted") +live 実況表示&オートリロード時の既読〜新着の仕切線 +$STYLE['live_highlight'] = "#cff"; // ("#cff") +live ハイライトワード表示時の背景色 +$STYLE['live_highlight_chain'] = "#ffc"; // ("#ffc") +live 連鎖ハイライト表示時の背景色 +$STYLE['live_highlight_word_weight'] = "bold"; // ("bold") +live 連鎖ハイライト表示時のフォントの太さ +$STYLE['live_highlight_word_border'] = "3px #f30 double"; // ("3px #f30 double") +live 連鎖ハイライト表示時のアンダーライン +$STYLE['live_font-size'] = "10px"; // ("10px") +live 番号 目欄 名前 日付 ID 欄のフォントサイズ +$STYLE['live2_color'] = "#cfcfcf"; // ("#cfcfcf") +live Type-Bの 番号 目欄 名前 日付 ID 表示部の背景色 + // }}} /* diff --git a/rep2/skin/tangerine.php b/rep2/skin/tangerine.php index 9fea9baa6..34ed154da 100644 --- a/rep2/skin/tangerine.php +++ b/rep2/skin/tangerine.php @@ -166,6 +166,19 @@ $STYLE['info_pop_size'] = "600,380"; // ("600,380") 情報ポップアップウィンドウの大きさ(横,縦) +// }}} +// {{{ +live 実況モード + +$STYLE['live_b_l'] = "1px #999 dotted"; // ("1px #999 dotted") +live レス間の仕切線 +$STYLE['live_b_s'] = "1px #999 dotted"; // ("1px #999 dotted") +live 番号 目欄 名前 日付 ID 表示部とレス表示部の仕切線 +$STYLE['live_b_n'] = "2px ForestGreen dotted"; // ("2px ForestGreen dotted") +live 実況表示&オートリロード時の既読〜新着の仕切線 +$STYLE['live_highlight'] = "#cff"; // ("#cff") +live ハイライトワード表示時の背景色 +$STYLE['live_highlight_chain'] = "#ffc"; // ("#ffc") +live 連鎖ハイライト表示時の背景色 +$STYLE['live_highlight_word_weight'] = "bold"; // ("bold") +live 連鎖ハイライト表示時のフォントの太さ +$STYLE['live_highlight_word_border'] = "3px ForestGreen double"; // ("3px ForestGreen double") +live 連鎖ハイライト表示時のアンダーライン +$STYLE['live_font-size'] = "10px"; // ("10px") +live 番号 目欄 名前 日付 ID 欄のフォントサイズ +$STYLE['live2_color'] = "#fff3c2"; // ("#fff3c2") +live Type-Bの 番号 目欄 名前 日付 ID 表示部の背景色 + // }}} /* diff --git a/rep2/title.php b/rep2/title.php index 711d44b51..438f4b51a 100644 --- a/rep2/title.php +++ b/rep2/title.php @@ -54,9 +54,9 @@ //========================================================= // 最新版チェック $newversion_found = ''; -if (!empty($_conf['updatan_haahaa'])) { +/*if (!empty($_conf['updatan_haahaa'])) { $newversion_found = checkUpdatan(); -} +}*/ // ログインユーザ情報 $htm['auth_user'] = "

    ログインユーザ: {$_login->user_u} - " . date("Y/m/d (D) G:i") . "

    \n"; @@ -168,7 +168,8 @@
    {$newversion_found} -

    rep2-expack rev.{$_conf['p2expack']}; extends rep2-{$_conf['p2version']}
    +

    +live {$_conf['p2live']}
    + rep2-expack rev.{$_conf['p2expack']}; extends rep2-{$_conf['p2version']}
    {$_conf['expack.web_url']}
    {$_conf['p2web_url']}

      diff --git a/style/read_css.inc b/style/read_css.inc index 02b8ecbb9..e29f3f1c8 100644 --- a/style/read_css.inc +++ b/style/read_css.inc @@ -86,7 +86,7 @@ div.thread { div.res { margin: 0 0 2.0em 0; padding: 0; - width: 100%; + width: 99%; /*\*//*/ overflow: hidden; /**/ @@ -333,6 +333,16 @@ div.res div.v_reslist ul { div.res div.v_reslist ul li:first-letter { color: #777; } +/* +live 実況表示用 */ +table.res div.v_reslist ul { + list-style-type: none; + line-height: 0.75; + margin: 0; + padding: 0; +} +table.res div.v_reslist ul li:first-letter { + color: #777; +} /* 逆参照リスト 縦配置 (引用レスポップアップ) */ div.respopup div.v_reslist { From f6df2b0b43ffd6d1ddc93a283e99208878b89d52 Mon Sep 17 00:00:00 2001 From: pluslive Date: Fri, 7 Sep 2012 15:49:35 +0900 Subject: [PATCH 002/339] =?UTF-8?q?=E5=AE=9F=E6=B3=81=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E6=99=82=E3=81=AEHTML=E3=83=9D=E3=83=83=E3=83=97=E3=82=A2?= =?UTF-8?q?=E3=83=83=E3=83=97=E4=BD=8D=E7=BD=AE=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/js/live_htmlpopup.js | 7 ++++++- rep2/js/live_htmlpopup_resizable.js | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/rep2/js/live_htmlpopup.js b/rep2/js/live_htmlpopup.js index 93df16767..fa568ef85 100755 --- a/rep2/js/live_htmlpopup.js +++ b/rep2/js/live_htmlpopup.js @@ -71,7 +71,12 @@ function showHtmlPopUpDo(marker) hideHtmlPopUp(); gUrl = tUrl; - var x_adjust = 300; // x軸位置調整 + // 画像のみ位置調整 + if (gUrl.match(/\.(jpe?g|gif|png)/)) { + var x_adjust = 300; + } else { + var x_adjust = 7; // x軸位置調整 + } var y_adjust = -46; // y軸位置調整 var closebox_width = 18; diff --git a/rep2/js/live_htmlpopup_resizable.js b/rep2/js/live_htmlpopup_resizable.js index 5e8f1042e..7c0cb9e2f 100755 --- a/rep2/js/live_htmlpopup_resizable.js +++ b/rep2/js/live_htmlpopup_resizable.js @@ -78,7 +78,12 @@ function showHtmlPopUpDo(marker) hideHtmlPopUp(null, true); gUrl = tUrl; - var popup_x_adjust = 300; // popup(iframe)のx軸位置調整 + // 画像のみ位置調整 + if (gUrl.match(/\.(jpe?g|gif|png)/)) { + var popup_x_adjust = 300; + } else { + var popup_x_adjust = 7; // popup(iframe)のx軸位置調整 + } var closebox_width = 18; // ×の横幅 var adjust_for_scrollbar = 22; // 22 スクロールバーを考慮して少し小さ目に微調整 From 45979a05ac4c4492b2fb1f086be8c4f85565f96c Mon Sep 17 00:00:00 2001 From: pluslive Date: Thu, 13 Sep 2012 12:04:43 +0900 Subject: [PATCH 003/339] =?UTF-8?q?+live=E3=81=AE=E3=83=90=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E3=83=A7=E3=83=B3=E8=A1=A8=E7=A4=BA=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 -- rep2/title.php | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 7a1dc7159..f43cb5cde 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -8,8 +8,6 @@ $_conf = array( 'p2name' => 'rep2-expack', // rep2の名前 'p2version' => '120912.2345', // rep2のバージョン - - 'p2live' => '120824.0000', // +liveのバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/rep2/title.php b/rep2/title.php index 44144db05..4f72f4ba5 100644 --- a/rep2/title.php +++ b/rep2/title.php @@ -168,8 +168,7 @@
      {$newversion_found} -

      +live {$_conf['p2live']}
      - {$_conf['p2name']} ver.{$_conf['p2version']}
      +

      {$_conf['p2name']} ver.{$_conf['p2version']} +live
      {$_conf['expack.web_url']}
      {$_conf['p2web_url']}

        From b1d310343b9147e0c2ccd24f329638b90f8420e4 Mon Sep 17 00:00:00 2001 From: pluslive Date: Thu, 13 Sep 2012 23:10:53 +0900 Subject: [PATCH 004/339] =?UTF-8?q?=E9=80=A3=E9=8E=96=E3=83=8F=E3=82=A4?= =?UTF-8?q?=E3=83=A9=E3=82=A4=E3=83=88=E3=81=8C=E9=83=A8=E5=88=86=E7=9A=84?= =?UTF-8?q?=E3=81=AB=E5=8A=B9=E3=81=8B=E3=81=AA=E3=81=8F=E3=81=AA=E3=81=A3?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThread.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/ShowThread.php b/lib/ShowThread.php index f367843cc..ed7d41383 100644 --- a/lib/ShowThread.php +++ b/lib/ShowThread.php @@ -892,6 +892,8 @@ protected function _markHighlight($num, $type, $isBody) $str = (string)$num; $this->_highlight_nums[$num] = $str; + + $this->_has_ngaborns = true; } return $type; From f4367a6f15973c8a766943b1e72b06068f58adfb Mon Sep 17 00:00:00 2001 From: pluslive Date: Mon, 24 Sep 2012 15:51:08 +0900 Subject: [PATCH 005/339] =?UTF-8?q?submodule=20p2pear=E3=81=8C=E5=8F=82?= =?UTF-8?q?=E7=85=A7=E3=81=99=E3=82=8B=E3=82=B3=E3=83=9F=E3=83=83=E3=83=88?= =?UTF-8?q?=E3=82=92=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- p2pear | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/p2pear b/p2pear index ed7f177eb..2c2a09612 160000 --- a/p2pear +++ b/p2pear @@ -1 +1 @@ -Subproject commit ed7f177ebb3e3e1ce38747148fa7b48be0e585a3 +Subproject commit 2c2a096121d6119cec4b81826d2018a24b3ee510 From 3c5190a0d314186ed2e831e725a468ec7c97e733 Mon Sep 17 00:00:00 2001 From: pluslive Date: Mon, 4 Mar 2013 11:40:11 +0900 Subject: [PATCH 006/339] =?UTF-8?q?Dropbox=E3=82=A2=E3=83=83=E3=83=97?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=89=E6=A9=9F=E8=83=BD=E3=82=92=E5=AE=9F?= =?UTF-8?q?=E6=B3=81=E8=A1=A8=E7=A4=BA=E6=99=82=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/live/live_post_form.inc.php | 1 + rep2/live_post_form.php | 1 + rep2/live_read.php | 1 + 3 files changed, 3 insertions(+) diff --git a/lib/live/live_post_form.inc.php b/lib/live/live_post_form.inc.php index eaed7f059..81b762e1d 100755 --- a/lib/live/live_post_form.inc.php +++ b/lib/live/live_post_form.inc.php @@ -143,6 +143,7 @@ {$htm['samba']} {$htm['k_br']}{$savedraft} +{$upload_form}
        diff --git a/rep2/live_post_form.php b/rep2/live_post_form.php index d72292b01..7214d3bce 100755 --- a/rep2/live_post_form.php +++ b/rep2/live_post_form.php @@ -3,6 +3,7 @@ * rep2 - レス書き込みフォーム */ +define('P2_SESSION_CLOSE_AFTER_AUTHENTICATION', 0); require_once __DIR__ . '/../init.php'; $_login->authorize(); // ユーザ認証 diff --git a/rep2/live_read.php b/rep2/live_read.php index ab27c4fd6..e9f9b1650 100755 --- a/rep2/live_read.php +++ b/rep2/live_read.php @@ -4,6 +4,7 @@ * フレーム分割画面、右下部分 */ +define('P2_SESSION_CLOSE_AFTER_AUTHENTICATION', 0); require_once __DIR__ . '/../init.php'; $_login->authorize(); // ユーザ認証 From c17bf5d074a0e1039ad233310054faf098c80e01 Mon Sep 17 00:00:00 2001 From: pluslive Date: Tue, 2 Apr 2013 15:20:15 +0900 Subject: [PATCH 007/339] =?UTF-8?q?README.md=20=E3=81=AE=E4=B8=80=E9=83=A8?= =?UTF-8?q?=E3=82=92=20+live=20=E7=94=A8=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index cbe4fbf8a..219f634b5 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,15 @@ -# rep2 expack +サソ# rep2 expack +live -縺ェ繧薙□縺九s縺縺ァ豁エ蜿イ縺ョ髟キ縺縲 ̄HP縺ァ縺、縺上i繧後◆繧オ繝シ繝舌シ繧オ繧、繝2縺。繧繧薙ュ繧九ン繝・繝シ繝ッ繝シ縺ァ縺吶 +rsk縺輔s菴 rep2expack 繧貞縺ォ縲∝ョ滓ウ∫畑讖溯ス繧定ソス蜉縺励※縺縺セ縺吶 -菴懊j縺後Ξ繧ャ繧キ繝シ縺ェ縺ョ縺ッ菴懊▲縺ヲ縺繧九イ縺ィ縺後>縺。縺ー繧薙h縺上o縺九▲縺ヲ縺繧九ョ縺ァ縲∝鋸蠑√@縺ヲ縺、縺九≠縺輔>縲 -[谺。荳紋サ」迚亥サコ險ュ莠亥ョ壼慍](https://github.com/rsky/page2) +### 霑ス蜉讖溯ス + +* 螳滓ウ∫畑陦ィ遉コ +* 繧ェ繝シ繝医Μ繝ュ繝シ繝/繧ケ繧ッ繝ュ繝シ繝ォ +* 繝上う繝ゥ繧、繝医Ρ繝シ繝/騾」骼悶ワ繧、繝ゥ繧、繝 + +縺昴ョ莉門渕譛ャ讖溯ス縺ッ繝吶シ繧ケ縺ィ縺ェ縺」縺ヲ縺繧 rep2expack 縺ィ蜷後§縺ァ縺吶 ## 繧サ繝繝医い繝繝 @@ -12,7 +17,7 @@ ### Git & Composer縺ァ 1. 譛ャ菴薙rclone -
        git clone git://github.com/rsky/p2-php.git
        +  
        git clone git://github.com/pluslive/p2-php.git
           cd p2-php
        2. 萓晏ュ倥Λ繧、繝悶Λ繝ェ繧偵ム繧ヲ繝ウ繝ュ繝シ繝 From 3f4671cd410a9e34f73ecb90d8aa12cc3585829e Mon Sep 17 00:00:00 2001 From: orzisun Date: Mon, 14 Jul 2014 23:59:25 +0900 Subject: [PATCH 008/339] =?UTF-8?q?composer.json=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/composer.json b/composer.json index 84ff66609..c9e7b7141 100644 --- a/composer.json +++ b/composer.json @@ -13,24 +13,24 @@ "rsky/pear-core-min": "dev-master", "rsky/pear-pager": ">=2.4.9beta2", "rsky/pear-html_template_flexy": ">=1.3.13alpha6", - "pear-pear/benchmark": "1.2.9", - "pear-pear/cache_lite": "1.7.15", - "pear-pear/db": "1.7.14", - "pear-pear/db_dataobject": "1.11.2", - "pear-pear/date": "1.4.7", - "pear-pear/file": "1.4.1", - "pear-pear/file_util": "1.0.0", - "pear-pear/html_common": "1.2.5", - "pear-pear/html_quickform": "3.2.13", - "pear-pear/http_client": "1.2.1", - "pear-pear/http_request": "1.4.4", - "pear-pear/net_socket": "1.0.10", - "pear-pear/net_url": "1.0.15", - "pear-pear/net_useragent_mobile": "1.0.0", - "pear-pear/validate": "0.8.5", - "pear-pear/var_dump": "1.0.4", - "pear-pear/xml_parser": "1.3.4", - "pear-pear/xml_rss": "1.0.2", + "pear-pear.php.net/benchmark": "1.2.9", + "pear-pear.php.net/cache_lite": "1.7.15", + "pear-pear.php.net/db": "1.7.14", + "pear-pear.php.net/db_dataobject": "1.11.2", + "pear-pear.php.net/date": "1.4.7", + "pear-pear.php.net/file": "1.4.1", + "pear-pear.php.net/file_util": "1.0.0", + "pear-pear.php.net/html_common": "1.2.5", + "pear-pear.php.net/html_quickform": "3.2.13", + "pear-pear.php.net/http_client": "1.2.1", + "pear-pear.php.net/http_request": "1.4.4", + "pear-pear.php.net/net_socket": "1.0.10", + "pear-pear.php.net/net_url": "1.0.15", + "pear-pear.php.net/net_useragent_mobile": "1.0.0", + "pear-pear.php.net/validate": "0.8.5", + "pear-pear.php.net/var_dump": "1.0.4", + "pear-pear.php.net/xml_parser": "1.3.4", + "pear-pear.php.net/xml_rss": "1.0.2", "symfony/console": "2.2.*", "symfony/yaml": "2.2.*", "dropbox/dropbox-sdk": "dev-master" From 16884202aed0d48dc9a259dae9b7da243759ba07 Mon Sep 17 00:00:00 2001 From: orzisun Date: Tue, 15 Jul 2014 14:49:45 +0900 Subject: [PATCH 009/339] =?UTF-8?q?vip2ch.com=E8=AA=AD=E3=81=BF=E8=BE=BC?= =?UTF-8?q?=E3=81=BF=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_ic2.inc.php | 2 +- lib/P2Util.php | 31 +++++++++++++++++++++++++++++-- lib/ThreadRead.php | 21 +++++++++++++++++---- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/conf/conf_ic2.inc.php b/conf/conf_ic2.inc.php index 4bb5d6750..720bbface 100644 --- a/conf/conf_ic2.inc.php +++ b/conf/conf_ic2.inc.php @@ -17,7 +17,7 @@ // SQLite2: 'sqlite:///' . $_conf['db_dir'] . '/imgcache.sqlite' // 注1: username,password,databaseは実際のものと読み替える。 // 注2: MySQL,PosrgreSQLでは予めデータベースを作っておく。 -$_conf['expack.ic2.general.dsn'] = ""; +$_conf['expack.ic2.general.dsn'] = "mysql://rep2:rep2@localhost:3306/rep2"; // DBで使うテーブル名 $_conf['expack.ic2.general.table'] = "imgcache"; diff --git a/lib/P2Util.php b/lib/P2Util.php index a0fde9636..c655a5536 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -53,6 +53,11 @@ class P2Util */ static private $_hostIsJbbsShitaraba = array(); + /** + * isHostVip2ch()のキャッシュ + */ + static private $_hostIsVip2ch = array(); + /** * P2Imeオブジェクト * @@ -445,6 +450,9 @@ static private function _p2DirOfHost($base_dir, $host, $dir_sep = true) } else { $host_dir = $base_dir . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $host); } + // vip.2ch.com + } elseif (self::isHostVip2ch($host)) { + $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'vip2ch'; // livedoor レンタル掲示板以外でスラッシュ等の文字を含むとき } elseif (preg_match('/[^0-9A-Za-z.\\-_]/', $host)) { @@ -843,6 +851,23 @@ static public function isHost2chs($host) return self::$_hostIs2chs[$host]; } + // }}} + // {{{ isHostVip2ch() + + /** + * host が vip2ch なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostVip2ch($host) + { + if (!array_key_exists($host, self::$_hostIsVip2ch)) { + self::$_hostIsVip2ch[$host] = (bool)preg_match('<^\\w+\\.(?:vip2ch\\.com)$>', $host); + } + return self::$_hostIsVip2ch[$host]; + } + // }}} // {{{ isHostBe2chNet() @@ -1850,7 +1875,7 @@ static public function detectThread($url = null) if ($nama_url) { // 2ch or pink - http://choco.2ch.net/test/read.cgi/event/1027770702/ - if (preg_match('<^http://(\\w+\\.(?:2ch\\.net|bbspink\\.com))/test/read\\.(?:cgi|html) + if (preg_match('<^http://(\\w+\\.(?:2ch\\.net|bbspink\\.com|vip2ch\\.com))/test/read\\.(?:cgi|html) /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) { $host = $matches[1]; @@ -1859,7 +1884,7 @@ static public function detectThread($url = null) $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; // 2ch or pink 過去ログhtml - http://pc.2ch.net/mac/kako/1015/10153/1015358199.html - } elseif (preg_match('<^(http://(\\w+\\.(?:2ch\\.net|bbspink\\.com))(?:/[^/]+)?/(\\w+) + } elseif (preg_match('<^(http://(\\w+\\.(?:2ch\\.net|bbspink\\.com|vip2ch\\.com))(?:/[^/]+)?/(\\w+) /kako/\\d+(?:/\\d+)?/(\\d+)).html>x', $nama_url, $matches)) { $host = $matches[2]; @@ -2022,6 +2047,8 @@ static public function getHostGroupName($host) return 'machibbs'; } elseif (self::isHostJbbsShitaraba($host)) { return 'shitaraba'; + } elseif (self::isHostVip2ch($host)) { + return 'vip2ch'; } else { return $host; } diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 1d766263c..62dec44d8 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -358,7 +358,7 @@ protected function _downloadDat2ch($from_bytes) protected function _downloadDat2chNotFound($code = null) { // 2ch, bbspink ならread.cgiで確認 - if (P2Util::isHost2chs($this->host)) { + if (P2Util::isHost2chs($this->host) || P2Util::isHostVip2ch($this->host)) { $this->getdat_error_msg_ht .= $this->get2chDatError($code); } $this->diedat = true; @@ -782,6 +782,7 @@ public function get2chDatError($code = null) $dat_response_status = ''; $dat_response_msg = ''; + $vip2ch_kakosoko_match = "/格.{1,2}されています。もう書き込みできません。。/"; $kakosoko_match = "/このスレッドは過去ログ倉庫に格.{1,2}されています/"; $naidesu_match = "/そんな板orスレッドないです。<\/title>/"; @@ -846,7 +847,7 @@ public function get2chDatError($code = null) // // <title>がそんな板orスレッドないです。or error 3939 // - } elseif ($reason === 'kakohtml' or preg_match($naidesu_match, $read_response_html, $matches) || preg_match($error3939_match, $read_response_html, $matches)) { + } elseif ($reason === 'kakohtml' or preg_match($naidesu_match, $read_response_html, $matches) || preg_match($error3939_match, $read_response_html, $matches) ||preg_match($vip2ch_kakosoko_match, $read_response_html, $matches)) { if ($reason === 'kakohtml' or preg_match($kakohtml_match, $read_response_html, $matches)) { if ($reason === 'kakohtml') { @@ -864,6 +865,18 @@ public function get2chDatError($code = null) $moritori_ht = $this->_generateMoritapoDatLink(); $dat_response_msg = "<p>2ch info - 隊長! スレッドはhtml化されるのを待っているようです。{$marutori_ht}{$moritori_ht}</p>"; + } elseif (preg_match($vip2ch_kakosoko_match, $read_response_html, $matches)) { + //当座の凌ぎもう少しきれいな書き方をしたいかも + $ur1test = $this->key; + $ur2test = $this->key; + $ur1test = substr($ur1test,0,4); + $ur2test = substr($ur2test,0,5); + $dat_response_status = "このスレッドは過去ログ倉庫に格納されています。"; + $kakolog_uri = "http://{$this->host}/{$this->bbs}/kako/{$ur1test}/{$ur2test}/{$this->key}"; + $kakolog_url_en = rawurlencode($kakolog_uri); + $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; + $dat_response_msg = "<p>2ch info - 隊長! 過去ログ倉庫で、<a href=\"{$kakolog_uri}.html\"{$_conf['bbs_win_target_at']}>スレッド {$this->key}.html</a> を発見しました。 [<a href=\"{$read_kako_url}\">rep2に取り込んで読む</a>]</p>"; + } else { if (!empty($_GET['kakolog'])) { $dat_response_status = 'そんな板orスレッドないです。'; @@ -1067,8 +1080,8 @@ public function previewOneNotFound($code = null) global $_conf; $this->diedat = true; - // 2ch, bbspink ならread.cgiで確認 - if (P2Util::isHost2chs($this->host)) { + // 2ch, bbspink, vip2ch ならread.cgiで確認 + if (P2Util::isHost2chs($this->host) || P2Util::isHostVip2ch($this->host)) { $this->getdat_error_msg_ht = $this->get2chDatError($code); if (count($this->datochi_residuums)) { if ($_conf['ktai']) { From 74c9e50cc87c537bf8b2a926cb6504d556447f0d Mon Sep 17 00:00:00 2001 From: orzisun <kngw-779@not-exist.info> Date: Tue, 15 Jul 2014 15:07:37 +0900 Subject: [PATCH 010/339] =?UTF-8?q?=E3=81=97=E3=81=9F=E3=82=89=E3=81=B0URL?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index c655a5536..6aa400ace 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -953,7 +953,7 @@ static public function isHostJbbsShitaraba($in_host) if (!array_key_exists($in_host, self::$_hostIsJbbsShitaraba)) { if ($in_host == 'rentalbbs.livedoor.com') { self::$_hostIsJbbsShitaraba[$in_host] = true; - } elseif (preg_match('<^jbbs\\.(?:shitaraba\\.com|livedoor\\.(?:com|jp))(?:/|$)>', $in_host)) { + } elseif (preg_match('<^jbbs\\.(?:shitaraba\\.(?:net|com)|livedoor\\.(?:com|jp))(?:/|$)>', $in_host)) { self::$_hostIsJbbsShitaraba[$in_host] = true; } else { self::$_hostIsJbbsShitaraba[$in_host] = false; @@ -973,7 +973,7 @@ static public function isHostJbbsShitaraba($in_host) */ static public function adjustHostJbbs($in_str) { - return preg_replace('<(^|/)jbbs\\.(?:shitaraba|livedoor)\\.com(/|$)>', '\\1jbbs.livedoor.jp\\2', $in_str, 1); + return preg_replace('<(^|/)jbbs\\.(?:shitaraba|livedoor)\\.(?:net|com)(/|$)>', '\\1jbbs.shitaraba.net\\2', $in_str, 1); //return preg_replace('<(^|/)jbbs\\.(?:shitaraba\\.com|livedoor\\.(?:com|jp))(/|$)>', '\\1rentalbbs.livedoor.com\\2', $in_str, 1); } @@ -1904,7 +1904,7 @@ static public function detectThread($url = null) $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; // したらばJBBS - http://jbbs.livedoor.com/bbs/read.cgi/computer/2999/1081177036/-100 - } elseif (preg_match('<^http://(jbbs\\.(?:livedoor\\.(?:jp|com)|shitaraba\\.com))/bbs/read\\.cgi + } elseif (preg_match('<^http://(jbbs\\.(?:livedoor\\.(?:jp|com)|shitaraba\\.(?:net|com)))/bbs/read\\.cgi /(\\w+)/(\\d+)/(\\d+)/((?:\\d+)?-(?:\\d+)?)?[^"]*>x', $nama_url, $matches)) { $host = $matches[1] . '/' . $matches[2]; @@ -1919,7 +1919,7 @@ static public function detectThread($url = null) $host = $matches[1]; list($bbs, $key, $ls) = self::parseMachiQuery($matches[2]); - } elseif (preg_match('<^http://((jbbs\\.(?:livedoor\\.(?:jp|com)|shitaraba\\.com))(?:/(\\w+))?)/bbs/read\\.(?:pl|cgi)\\?(.+)>', + } elseif (preg_match('<^http://((jbbs\\.(?:livedoor\\.(?:jp|com)|shitaraba\\.(?:net|com)))(?:/(\\w+))?)/bbs/read\\.(?:pl|cgi)\\?(.+)>', $nama_url, $matches)) { $host = $matches[1]; From 400a09c8ccac07ba3903668bf7cd8b08c6478671 Mon Sep 17 00:00:00 2001 From: orzisun <kngw-779@not-exist.info> Date: Tue, 15 Jul 2014 15:31:37 +0900 Subject: [PATCH 011/339] 20140715.1530 --- conf/conf.inc.php | 4 ++-- doc/test.txt | 4 ++++ lib/ThreadRead.php | 11 ++++------- 3 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 doc/test.txt diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 62ff4666f..4fa6b407f 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -6,8 +6,8 @@ // バージョン情報 $_conf = array( - 'p2name' => 'rep2-expack', // rep2の名前 - 'p2version' => '130331.2233', // rep2のバージョン + 'p2name' => 'rep2-expack_test', // rep2の名前 + 'p2version' => '140715.1530', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/test.txt b/doc/test.txt new file mode 100644 index 000000000..b5f10ebd2 --- /dev/null +++ b/doc/test.txt @@ -0,0 +1,4 @@ +2014/07/15 (20140715.1530) + ・vip2ch.com読み込み対応 + ・したらば掲示板移転対応 + ・composer.json変更 (pear-pear → pear-pear.php.net ) \ No newline at end of file diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 62dec44d8..3e3817e27 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -793,6 +793,7 @@ public function get2chDatError($code = null) //$kakohtml_match = "{<a href=\"\.\./\.\./\.\./\.\./([^/]+/kako/\d+(/\d+)?/(\d+)).html\">}"; $kakohtml_match = "{/([^/]+/kako/\d+(/\d+)?/(\d+)).html\">}"; $waithtml_match = "/html化されるのを待っているようです。/"; + $vip2ch_kakodat_match = "{/([^/]+/kako/\d+(/\d+)?/(\d+)).dat\">}"; // vip2ch.com用 // // <title>がこのスレッドは過去ログ倉庫に @@ -865,14 +866,10 @@ public function get2chDatError($code = null) $moritori_ht = $this->_generateMoritapoDatLink(); $dat_response_msg = "<p>2ch info - 隊長! スレッドはhtml化されるのを待っているようです。{$marutori_ht}{$moritori_ht}</p>"; - } elseif (preg_match($vip2ch_kakosoko_match, $read_response_html, $matches)) { + } elseif (preg_match($vip2ch_kakodat_match, $read_response_html, $matches)) { //当座の凌ぎもう少しきれいな書き方をしたいかも - $ur1test = $this->key; - $ur2test = $this->key; - $ur1test = substr($ur1test,0,4); - $ur2test = substr($ur2test,0,5); - $dat_response_status = "このスレッドは過去ログ倉庫に格納されています。"; - $kakolog_uri = "http://{$this->host}/{$this->bbs}/kako/{$ur1test}/{$ur2test}/{$this->key}"; + $dat_response_status = "隊長! 過去ログ倉庫で、datを発見しました。"; + $kakolog_uri = "http://{$this->host}/{$matches[1]}"; $kakolog_url_en = rawurlencode($kakolog_uri); $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; $dat_response_msg = "<p>2ch info - 隊長! 過去ログ倉庫で、<a href=\"{$kakolog_uri}.html\"{$_conf['bbs_win_target_at']}>スレッド {$this->key}.html</a> を発見しました。 [<a href=\"{$read_kako_url}\">rep2に取り込んで読む</a>]</p>"; From 1e8ee7ed77edb39d2432b24c6dcab39f0aaf7ccf Mon Sep 17 00:00:00 2001 From: orzisun <kngw-779@not-exist.info> Date: Tue, 15 Jul 2014 17:03:09 +0900 Subject: [PATCH 012/339] 20140715.1701 --- doc/test.txt | 4 ++++ lib/ThreadRead.php | 8 +++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/doc/test.txt b/doc/test.txt index b5f10ebd2..5d3f6172e 100644 --- a/doc/test.txt +++ b/doc/test.txt @@ -1,3 +1,7 @@ +2014/07/15 (20140715.1701) + ・浪人IDでのdat取得に対応 + ・vip2ch.com読み込み関係修正 (本家 ver.1.8.85に合わせる) + 2014/07/15 (20140715.1530)  ・vip2ch.com読み込み対応  ・したらば掲示板移転対応 diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 3e3817e27..ec7e64066 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -387,7 +387,10 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch) $method = 'GET'; // GET /test/offlaw.cgi?bbs=板名&key=スレッド番号&sid=セッションID HTTP/1.1 - $url = "http://{$this->host}/test/offlaw.cgi/{$this->bbs}/{$this->key}/?raw=0.0&sid="; + //$url = "http://{$this->host}/test/offlaw.cgi/{$this->bbs}/{$this->key}/?raw=0.0&sid="; + // 浪人対応 + $rokkasystem = explode(".", $this->host , 2); + $url = "http://rokka.$rokkasystem[1]/$rokkasystem[0]/{$this->bbs}/{$this->key}/?raw=0.0&sid="; $url .= rawurlencode($SID2ch); $purl = parse_url($url); // URL分解 @@ -479,7 +482,7 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch) if ($marudatlines = FileCtl::file_read_lines($this->keydat)) { $firstline = array_shift($marudatlines); // チャンクとか - if (strpos($firstline, '+OK') === false) { + if (strpos($firstline, 'Success') === false) { // 浪人(rokka)対応 $secondline = array_shift($marudatlines); } $cont = ''; @@ -867,7 +870,6 @@ public function get2chDatError($code = null) $dat_response_msg = "<p>2ch info - 隊長! スレッドはhtml化されるのを待っているようです。{$marutori_ht}{$moritori_ht}</p>"; } elseif (preg_match($vip2ch_kakodat_match, $read_response_html, $matches)) { - //当座の凌ぎもう少しきれいな書き方をしたいかも $dat_response_status = "隊長! 過去ログ倉庫で、datを発見しました。"; $kakolog_uri = "http://{$this->host}/{$matches[1]}"; $kakolog_url_en = rawurlencode($kakolog_uri); From 0a15a54999dbc46950896334be71481097d159f7 Mon Sep 17 00:00:00 2001 From: orzisun <kngw-779@not-exist.info> Date: Tue, 15 Jul 2014 17:04:17 +0900 Subject: [PATCH 013/339] 20140715.1701 --- conf/conf.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 4fa6b407f..8c87cff48 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_test', // rep2の名前 - 'p2version' => '140715.1530', // rep2のバージョン + 'p2version' => '140715.1701', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; From 9407f078732b30daf5f79de3ccac65de702c9a2a Mon Sep 17 00:00:00 2001 From: orzisun <kngw-779@not-exist.info> Date: Tue, 15 Jul 2014 17:48:46 +0900 Subject: [PATCH 014/339] 20140715.1701 --- doc/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/test.txt b/doc/test.txt index 5d3f6172e..79219702a 100644 --- a/doc/test.txt +++ b/doc/test.txt @@ -1,5 +1,5 @@ 2014/07/15 (20140715.1701) - ・浪人IDでのdat取得に対応 + ・浪人IDでのdat取得に対応 (rokka system利用、一部鯖、板では取得不可能)  ・vip2ch.com読み込み関係修正 (本家 ver.1.8.85に合わせる) 2014/07/15 (20140715.1530) From 80a834e877fea4a9b8ad6eade19177e3915bd0df Mon Sep 17 00:00:00 2001 From: orzisun <kngw-779@not-exist.info> Date: Wed, 16 Jul 2014 11:52:48 +0900 Subject: [PATCH 015/339] =?UTF-8?q?shiro=3Dkuma=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- doc/test.txt | 10 ++++++-- lib/ThreadRead.php | 62 +++++++++++++++++++++++++++------------------- 3 files changed, 45 insertions(+), 29 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 8c87cff48..bb68e1743 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_test', // rep2の名前 - 'p2version' => '140715.1701', // rep2のバージョン + 'p2version' => '140716.1150', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/test.txt b/doc/test.txt index 79219702a..a9bb794da 100644 --- a/doc/test.txt +++ b/doc/test.txt @@ -1,8 +1,14 @@ -2014/07/15 (20140715.1701) +2014/07/16 (20140716.1150) + ・過去ログ所得方法の変更 +  ・2ch.netはoffraw.so、shoro=kumaで取得 +  ・bbspinkはrokkaで取得 +  ※2ch一部板 (鯖?)もrokkaで取得できたりするが面倒くさいので上記のようにする + +2014/07/15 (140715.1701)  ・浪人IDでのdat取得に対応 (rokka system利用、一部鯖、板では取得不可能)  ・vip2ch.com読み込み関係修正 (本家 ver.1.8.85に合わせる) -2014/07/15 (20140715.1530) +2014/07/15 (140715.1530)  ・vip2ch.com読み込み対応  ・したらば掲示板移転対応  ・composer.json変更 (pear-pear → pear-pear.php.net ) \ No newline at end of file diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index ec7e64066..f45e07185 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -72,23 +72,27 @@ public function downloadDat() // 2ch bbspink●読み if (P2Util::isHost2chs($this->host) && !empty($_GET['maru'])) { - // ログインしてなければ or ログイン後、24時間以上経過していたら自動再ログイン - if (!file_exists($_conf['sid2ch_php']) || - !empty($_REQUEST['relogin2ch']) || - (filemtime($_conf['sid2ch_php']) < time() - 60*60*24)) - { - if (!function_exists('login2ch')) { - include P2_LIB_DIR . '/login2ch.inc.php'; - } - if (!login2ch()) { - $this->getdat_error_msg_ht .= $this->get2chDatError(); - $this->diedat = true; - return false; + if ($this->host === "bbspink.com") { + // ログインしてなければ or ログイン後、24時間以上経過していたら自動再ログイン + if (!file_exists($_conf['sid2ch_php']) || + !empty($_REQUEST['relogin2ch']) || + (filemtime($_conf['sid2ch_php']) < time() - 60*60*24)) + { + if (!function_exists('login2ch')) { + include P2_LIB_DIR . '/login2ch.inc.php'; + } + if (!login2ch()) { + $this->getdat_error_msg_ht .= $this->get2chDatError(); + $this->diedat = true; + return false; + } } - } - include $_conf['sid2ch_php']; - $this->_downloadDat2chMaru($uaMona, $SID2ch); + include $_conf['sid2ch_php']; + $this->_downloadDat2chMaru($uaMona, $SID2ch); + } else { + $this->_downloadDat2chMaru($uaMona, $SID2ch, 'shirokuma'); + } // 2ch bbspink モリタポ読み } elseif (P2Util::isHost2chs($this->host) && !empty($_GET['moritapodat']) && @@ -373,10 +377,11 @@ protected function _downloadDat2chNotFound($code = null) * * @param string $uaMona * @param string $SID2ch + * @param string $shirokuma * @return bool * @see lib/login2ch.inc.php */ - protected function _downloadDat2chMaru($uaMona, $SID2ch) + protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma) { global $_conf; @@ -388,11 +393,14 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch) // GET /test/offlaw.cgi?bbs=板名&key=スレッド番号&sid=セッションID HTTP/1.1 //$url = "http://{$this->host}/test/offlaw.cgi/{$this->bbs}/{$this->key}/?raw=0.0&sid="; - // 浪人対応 - $rokkasystem = explode(".", $this->host , 2); - $url = "http://rokka.$rokkasystem[1]/$rokkasystem[0]/{$this->bbs}/{$this->key}/?raw=0.0&sid="; - $url .= rawurlencode($SID2ch); - + if (!$shirokuma) { + // 浪人対応 + $rokkasystem = explode(".", $this->host , 2); + $url = "http://rokka.$rokkasystem[1]/$rokkasystem[0]/{$this->bbs}/{$this->key}/?raw=0.0&sid="; + $url .= rawurlencode($SID2ch); + } else { + $url ="http://{$this->host}/test/offlaw2.so?shiro=kuma&bbs={$this->bbs}&key={$this->key}&sid=ERROR"; + } $purl = parse_url($url); // URL分解 if (isset($purl['query'])) { // クエリー $purl['query'] = '?'.$purl['query']; @@ -480,11 +488,13 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch) // クリーニング ===== if ($marudatlines = FileCtl::file_read_lines($this->keydat)) { - $firstline = array_shift($marudatlines); - // チャンクとか - if (strpos($firstline, 'Success') === false) { // 浪人(rokka)対応 - $secondline = array_shift($marudatlines); - } + if (!$shirokuma) { + $firstline = array_shift($marudatlines); + // チャンクとか + if (strpos($firstline, 'Success') === false) { // 浪人(rokka)対応 + $secondline = array_shift($marudatlines); + } + } $cont = ''; foreach ($marudatlines as $aline) { // チャンクエンコーディングが欲しいところ(HTTP 1.0でしのぐ) From 2eed46349a1237f69201b2d5bcb011478fe17e7c Mon Sep 17 00:00:00 2001 From: orzisun <kngw-779@not-exist.info> Date: Fri, 18 Jul 2014 21:28:27 +0900 Subject: [PATCH 016/339] =?UTF-8?q?offlaw2.so=20and=20rokka=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index f45e07185..3ee5eb147 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -69,10 +69,10 @@ public function downloadDat() // 2ch系 } else { $this->getDatBytesFromLocalDat(); // $aThread->length をset + $pinktest = "/\w+\.bbspink.com/"; // 2ch bbspink●読み if (P2Util::isHost2chs($this->host) && !empty($_GET['maru'])) { - if ($this->host === "bbspink.com") { // ログインしてなければ or ログイン後、24時間以上経過していたら自動再ログイン if (!file_exists($_conf['sid2ch_php']) || !empty($_REQUEST['relogin2ch']) || @@ -90,9 +90,6 @@ public function downloadDat() include $_conf['sid2ch_php']; $this->_downloadDat2chMaru($uaMona, $SID2ch); - } else { - $this->_downloadDat2chMaru($uaMona, $SID2ch, 'shirokuma'); - } // 2ch bbspink モリタポ読み } elseif (P2Util::isHost2chs($this->host) && !empty($_GET['moritapodat']) && @@ -115,6 +112,8 @@ public function downloadDat() $this->_downloadDat2chKako($_GET['kakolog'], $ext); // 2ch or 2ch互換 + } elseif (P2Util::isHost2chs($this->host) && !empty($_GET['shirokuma'])) { + $this->_downloadDat2chMaru($uaMona, $SID2ch, 'shirokuma'); } else { // DATを差分DLする $this->_downloadDat2ch($this->length); @@ -778,7 +777,10 @@ public function get2chDatError($code = null) } $wap_res = $wap_ua->request($wap_req); - if ($wap_res->isError()) { + $test403 = "/403\.dat/"; + if ($wap_res->code == 302 || preg_match( $test403, $wap_res->content, $test403)) { + $read_response_html = $wap_res->content; + } elseif ($wap_res->isError()) { $url_t = P2Util::throughIme($wap_req->url); $info_msg_ht = "<p class=\"info-msg\">Error: {$wap_res->code} {$wap_res->message}<br>"; $info_msg_ht .= "rep2 info: <a href=\"{$url_t}\"{$_conf['ext_win_target_at']}>{$wap_req->url}</a> に接続できませんでした。</p>"; @@ -797,7 +799,12 @@ public function get2chDatError($code = null) $vip2ch_kakosoko_match = "/格.{1,2}されています。もう書き込みできません。。/"; $kakosoko_match = "/このスレッドは過去ログ倉庫に格.{1,2}されています/"; - + //$kakosoko_match = "/あなたは間違った道を歩んでいます誠に申し訳ございません。/"; + $kakosoko_match2 = "/http:\/\/turing1000\.nttec\.com\/?(403|404|500)\.dat/"; +//memo +//過去ログ倉庫に格納〜 = sirokuma +//あなたは間違った道を歩んでいます誠に申し訳ございません。 = ● +// $naidesu_match = "/<title>そんな板orスレッドないです。<\/title>/"; $error3939_match = "{<title>2ちゃんねる error 3939}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) @@ -811,10 +818,14 @@ public function get2chDatError($code = null) // // がこのスレッドは過去ログ倉庫に // - if ($reason === 'datochi' || preg_match($kakosoko_match, $read_response_html, $matches)) { + if ($reason === 'datochi' || preg_match($kakosoko_match, $read_response_html, $matches) || preg_match($kakosoko_match2, $read_response_html, $matches)) { $dat_response_status = "このスレッドは過去ログ倉庫に格納されています。"; //if (file_exists($_conf['idpw2ch_php']) || file_exists($_conf['sid2ch_php'])) { + if ( preg_match($kakosoko_match2, $read_response_html, $matches)) { $marutori_ht = " [<a href=\"{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&maru=true{$_conf['k_at_a']}\">●IDでrep2に取り込む</a>]"; + } else { + $marutori_ht = " [<a href=\"{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&shirokuma=true{$_conf['k_at_a']}\">offlaw経由でrep2に取り込む</a>]"; + } //} else { // $marutori_ht = " [<a href=\"login2ch.php\" target=\"subject\">●IDログイン</a>]"; //} From f4d60ec3eabb372e583afd81ef3bb2c44d7b4a59 Mon Sep 17 00:00:00 2001 From: orzisun <kngw-779@not-exist.info> Date: Fri, 18 Jul 2014 21:32:45 +0900 Subject: [PATCH 017/339] =?UTF-8?q?offlaw2.so=20and=20rokka=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- doc/test.txt | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index bb68e1743..95d5a598c 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_test', // rep2の名前 - 'p2version' => '140716.1150', // rep2のバージョン + 'p2version' => '140718.2130', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/test.txt b/doc/test.txt index a9bb794da..e58e447a5 100644 --- a/doc/test.txt +++ b/doc/test.txt @@ -1,4 +1,8 @@ -2014/07/16 (20140716.1150) +2014/07/18 (140718.2130) + ・過去ログ取得をofflaw2.so経由、rokka経由両方に対応(仮) +  ・read.cgi経由で確認時のHTMLでどちらを利用するか選択 + +2014/07/16 (140716.1150)  ・過去ログ所得方法の変更   ・2ch.netはoffraw.so、shoro=kumaで取得   ・bbspinkはrokkaで取得 From e2ea6749ef9e4a0e1f38e0401c41f83fd3da3226 Mon Sep 17 00:00:00 2001 From: orzisun <kngw-779@not-exist.info> Date: Sat, 19 Jul 2014 14:47:15 +0900 Subject: [PATCH 018/339] Update conf_ic2.inc.php --- conf/conf_ic2.inc.php | 218 +++++++++++++++++++++--------------------- 1 file changed, 109 insertions(+), 109 deletions(-) diff --git a/conf/conf_ic2.inc.php b/conf/conf_ic2.inc.php index 720bbface..1664f0e9c 100644 --- a/conf/conf_ic2.inc.php +++ b/conf/conf_ic2.inc.php @@ -1,284 +1,284 @@ <?php /** - * ImageCache2 設定ファイル + * ImageCache2 ソスン抵ソスtソス@ソスCソスソス */ -// {{{ 全般 +// {{{ ソスSソスソス -// キャッシュ保存ディレクトリのパスとURI +// ソスLソスソスソスbソスVソスソスソスロ托ソスソスfソスBソスソスソスNソスgソスソスソスフパソスXソスソスURI $_conf['expack.ic2.general.cachedir'] = P2_WWW_DIR . '/ic'; $_conf['expack.ic2.general.cacheuri'] = './ic'; -// DSN (DBに接続するためのデータソース名) +// DSN (DBソスノ接托ソスソスソスソス驍スソス゚のデソス[ソス^ソス\ソス[ソスXソスソス) // @link http://jp.pear.php.net/manual/ja/package.database.db.intro-dsn.php -// 例) +// ソスソス) // MySQL: 'mysql://username:password@localhost:3306/database' // PostgreSQL: 'pgsql://username:password@localhost:5432/database' // SQLite2: 'sqlite:///' . $_conf['db_dir'] . '/imgcache.sqlite' -// 注1: username,password,databaseは実際のものと読み替える。 -// 注2: MySQL,PosrgreSQLでは予めデータベースを作っておく。 -$_conf['expack.ic2.general.dsn'] = "mysql://rep2:rep2@localhost:3306/rep2"; +// ソスソス1: username,password,databaseソスヘ趣ソスソスロのゑソスソスフと読み替ゑソスソスソスB +// ソスソス2: MySQL,PosrgreSQLソスナは予ソス゚デソス[ソス^ソスxソス[ソスXソスソスソスソスソスソストゑソスソスソスソスB +$_conf['expack.ic2.general.dsn'] = ""; -// DBで使うテーブル名 +// DBソスナ使ソスソスソスeソス[ソスuソスソスソスソス $_conf['expack.ic2.general.table'] = "imgcache"; -// 削除済み&再ダウンロードしない画像リストのテーブル名 +// ソス除ソスマみソスソストダソスEソスソスソスソスソス[ソスhソスソスソスネゑソスソス鞫懶ソスソスソスXソスgソスフテソス[ソスuソスソスソスソス $_conf['expack.ic2.general.blacklist_table'] = "ic2_blacklist"; -// エラーを記録するテーブル名 +// ソスGソスソスソス[ソスソスソスLソス^ソスソスソスソスeソス[ソスuソスソスソスソス $_conf['expack.ic2.general.error_table'] = "ic2_errors"; -// エラーを記録する最大の行数 +// ソスGソスソスソス[ソスソスソスLソス^ソスソスソスソスナ托ソスフ行ソスソス $_conf['expack.ic2.general.error_log_num'] = 100; -// 画像のURLが貼られたスレッドのタイトルを自動で記録する (off:0;on:1) +// ソス鞫懶ソスソスURLソスソスソス\ソスソス黷スソスXソスソスソスbソスhソスフタソスCソスgソスソスソスソスソスソスソスソスソスナ記ソス^ソスソスソスソス (off:0;on:1) $_conf['expack.ic2.general.automemo'] = 1; -// 画像を処理するプログラム (gd | imagick | ImageMagick) -// gd, imagick は PHP の拡張モジュールを利用、ImageMagick は外部コマンドを利用 -// ImageMagickのバージョンを自動判定するようになったので -// 明示的に"ImageMagick6"を指定しなくてもよい +// ソス鞫懶ソスソスソスソスソスソスソスソスソスソスvソスソスソスOソスソスソスソス (gd | imagick | ImageMagick) +// gd, imagick ソスソス PHP ソスフ拡ソスソスソスソスソスWソスソスソス[ソスソスソス利用ソスAImageMagick ソスヘ外ソスソスソスRソス}ソスソスソスhソス利用 +// ImageMagickソスフバソス[ソスWソスソスソスソスソスソスソスソスソスソスソスソスソス閧キソスソス謔、ソスノなゑソスソスソスソスフゑソス +// ソスソスソスソスソスIソスソス"ImageMagick6"ソスソスソスwソス閧オソスネゑソスソストゑソスソス謔「 $_conf['expack.ic2.general.driver'] = "gd"; -// JPEG to JPEG 変換に Epeg エクステンションを使う (off:0;on:1) +// JPEG to JPEG ソスマ奇ソスソスソス Epeg ソスGソスNソスXソスeソスソスソスVソスソスソスソスソスソスソスgソスソス (off:0;on:1) // http://page2.xrea.jp/index.php#php_epeg $_conf['expack.ic2.general.epeg'] = 0; -// JPEG の品質がこの値より小さいとき Epeg エクステンションを使う +// JPEG ソスフ品ソスソスソスソスソスソスソスフ値ソスソス闖ャソスソスソスソスソスニゑソス Epeg ソスGソスNソスXソスeソスソスソスVソスソスソスソスソスソスソスgソスソス $_conf['expack.ic2.general.epeg_quality_limit'] = 90; -// ImageMagickのパス(convertがある“ディレクトリ”のパス) -// httpdの環境変数でパスが通っているなら空のままでよい -// パスを明示的に指定する場合は、スペースがあるとサムネイルが作成できないので注意 +// ImageMagickソスフパソスXソスiconvertソスソスソスソスソスソスgソスfソスBソスソスソスNソスgソスソスソスhソスフパソスXソスj +// httpdソスフ環具ソスソスマ撰ソスソスナパソスXソスソスソスハゑソスソストゑソスソスソスネゑソスソスフままでよい +// ソスpソスXソス明趣ソスソスIソスノ指ソス閧キソスソス鼾ソスヘ、ソスXソスyソス[ソスXソスソスソスソスソスソスニサソスソスソスlソスCソスソスソスソスソス成ソスナゑソスソスネゑソスソスフで抵ソスソスソス $_conf['expack.ic2.general.magick'] = ""; -// 透過画像をサムネイル化する際の背景色 (ImageMagick(6)では無効、16進6桁で指定) +// ソスソスソス゚画像ソスソスソスTソスソスソスlソスCソスソスソスソスソスソスソスソスロの背ソスiソスF (ImageMagick(6)ソスナは厄ソスソスソスソスA16ソスi6ソスソスソスナ指ソスソス) $_conf['expack.ic2.general.bgcolor'] = "#FFFFFF"; -// 携帯でもサムネイルをインライン表示する (off:0;on:1) -// このときの大きさはPCと同じ +// ソスgソスムでゑソスソスTソスソスソスlソスCソスソスソスソスソスCソスソスソスソスソスCソスソスソス\ソスソスソスソスソスソス (off:0;on:1) +// ソスソスソスフとゑソスソスフ大きソスソスソスソスPCソスニ難ソスソスソス $_conf['expack.ic2.general.inline'] = 1; -// 携帯用の画像を表示するときLocation ヘッダを使ってリダイレクトする (off:0;on:1) -// offならPHPで適切なContent-Typeヘッダと画像を出力する +// ソスgソスム用ソスフ画像ソスソス\ソスソスソスソスソスソスニゑソスLocation ソスwソスbソス_ソスソスソスgソスソスソストソスソス_ソスCソスソスソスNソスgソスソスソスソス (off:0;on:1) +// offソスネゑソスPHPソスナ適ソスリゑソスContent-Typeソスwソスbソス_ソスニ画像ソスソスソスoソスヘゑソスソスソス $_conf['expack.ic2.general.redirect'] = 1; // }}} -// {{{ 一覧 +// {{{ ソス齬 -// ページタイトル +// ソスyソス[ソスWソス^ソスCソスgソスソス $_conf['expack.ic2.viewer.title'] = "ImageCache2::Viewer"; -// Lightbox Plus で画像を表示 (off:0;on:1) +// Lightbox Plus ソスナ画像ソスソス\ソスソス (off:0;on:1) // @link http://serennz.sakura.ne.jp/toybox/lightbox/?ja $_conf['expack.ic2.viewer.lightbox'] = 0; -// オリジナル画像が見つからないレコードを自動で消去する (off:0;on:1) +// ソスIソスソスソスWソスiソスソスソス鞫懶ソスソスソスソスソスツゑソスソスソスネゑソスソスソスソスRソス[ソスhソスソスソスソスソスソスソスナ擾ソスソスソスソスソスソスソス (off:0;on:1) $_conf['expack.ic2.viewer.delete_src_not_exists'] = 0; -// 表示用に調整した画像情報をキャッシュ (off:0;on:1) +// ソス\ソスソスソスpソスノ抵ソスソスソスソスソスソスソスソス鞫懶ソスソスソスソスソスLソスソスソスbソスVソスソス (off:0;on:1) $_conf['expack.ic2.viewer.cache'] = 0; -// キャッシュの有効期限(秒) -// 1時間=3600 -// 1日=86400 -// 1週間=604800 -// 手動でクリアするまでずっと=-1 +// ソスLソスソスソスbソスVソスソスソスフ有ソスソスソスソスソスソスソスiソスbソスj +// 1ソスソスソスソス=3600 +// 1ソスソス=86400 +// 1ソスTソスソス=604800 +// ソス闢ョソスナクソスソスソスAソスソスソスソスワでゑソスソスソスソスソス=-1 $_conf['expack.ic2.viewer.cache_lifetime'] = 3600; -// 重複画像を最初にヒットする1枚だけ表示 -// (off:0;on:1;サイズで並び替えるときだけ:2;) -// サブクエリに対応していないMySQL 4.1未満で有効にするとエラーが出る +// ソスdソスソスソス鞫懶ソスソスソスナ擾ソスソスノヒソスbソスgソスソスソスソス1ソスソスソスソスソスソスソス\ソスソス +// (off:0;on:1;ソスTソスCソスYソスナ包ソスソスム替ゑソスソスソスニゑソスソスソスソスソス:2;) +// ソスTソスuソスNソスGソスソスソスノ対会ソスソスソスソストゑソスソスネゑソスMySQL 4.1ソスソスソスソスソスナ有ソスソスソスノゑソスソスソスニエソスソスソス[ソスソスソスoソスソス $_conf['expack.ic2.viewer.unique'] = 0; -// Exif情報を表示 (off:0;on:1) +// Exifソスソスソスソス\ソスソス (off:0;on:1) $_conf['expack.ic2.viewer.exif'] = 0; -// --以下の設定ははデフォルト値で、ツールバーで変更できる-- +// --ソスネ会ソスソスフ設抵ソスヘはデソスtソスHソスソスソスgソスlソスナ、ソスcソス[ソスソスソスoソス[ソスナ変更ソスナゑソスソスソス-- -// 1ページ当たりの列数 +// 1ソスyソス[ソスWソスソスソスソスソスソスフ暦ソス $_conf['expack.ic2.viewer.cols'] = 8; -// 1ページ当たりの行数 +// 1ソスyソス[ソスWソスソスソスソスソスソスフ行ソスソス $_conf['expack.ic2.viewer.rows'] = 5; -// 1ページ当たりの画像数(携帯用) +// 1ソスyソス[ソスWソスソスソスソスソスソスフ画像ソスソスソスiソスgソスム用ソスj $_conf['expack.ic2.viewer.inum'] = 10; -// しきい値 (-1 ~ 5) +// ソスソスソスソスソスソスソスl (-1 ~ 5) $_conf['expack.ic2.viewer.threshold'] = 0; -// 比較方法 (>= | = | <=) +// ソスソスrソスソスソス@ (>= | = | <=) $_conf['expack.ic2.viewer.compare'] = '>='; -// 並び替え基準 (time | uri | date_uri | name | size | width | height | pixels) +// ソスソスソスム替ゑソスソス準 (time | uri | date_uri | name | size | width | height | pixels) $_conf['expack.ic2.viewer.order'] = "time"; -// 並び替え方向 (ASC | DESC) +// ソスソスソスム替ゑソスソスソスソスソス (ASC | DESC) $_conf['expack.ic2.viewer.sort'] = "DESC"; -// 検索フィールド (uri | name | memo) +// ソスソスソスソスソスtソスBソス[ソスソスソスh (uri | name | memo) $_conf['expack.ic2.viewer.field'] = "memo"; // }}} -// {{{ 管理 +// {{{ ソスヌ暦ソス -// ページタイトル +// ソスyソス[ソスWソス^ソスCソスgソスソス $_conf['expack.ic2.manager.title'] = "ImageCache2::Manager"; -// メモ記入欄の1行当たりの半角文字数 +// ソスソスソスソスソスLソスソスソスソスソスソス1ソスsソスソスソスソスソスソスフ費ソスソスpソスソスソスソスソスソス $_conf['expack.ic2.manager.cols'] = 40; -// メモ記入欄の行数 +// ソスソスソスソスソスLソスソスソスソスソスフ行ソスソス $_conf['expack.ic2.manager.rows'] = 5; // }}} -// {{{ ダウンロード +// {{{ ソス_ソスEソスソスソスソスソス[ソスh -// ページタイトル +// ソスyソス[ソスWソス^ソスCソスgソスソス $_conf['expack.ic2.getter.title'] = "ImageCache2::Getter"; -// サーバに接続する際にタイムアウトするまでの時間(秒) +// ソスTソス[ソスoソスノ接托ソスソスソスソスソスロにタソスCソスソスソスAソスEソスgソスソスソスソスワでの趣ソスソスヤ(ソスbソスj $_conf['expack.ic2.getter.conn_timeout'] = 5; -// ダウンロードがタイムアウトするまでの時間(秒) +// ソス_ソスEソスソスソスソスソス[ソスhソスソスソス^ソスCソスソスソスAソスEソスgソスソスソスソスワでの趣ソスソスヤ(ソスbソスj $_conf['expack.ic2.getter.read_timeout'] = 60; -// エラーログにある画像はダウンロードを試みない (no:0;yes:1) +// ソスGソスソスソス[ソスソスソスOソスノゑソスソスソス鞫懶ソスヘダソスEソスソスソスソスソス[ソスhソスソスソスソスソスンなゑソス (no:0;yes:1) $_conf['expack.ic2.getter.checkerror'] = 1; -// デフォルトでURL+.htmlの偽リファラを送る (no:0;yes:1) +// ソスfソスtソスHソスソスソスgソスソスURL+.htmlソスフ偽ソスソスソスtソス@ソスソスソス送ゑソス (no:0;yes:1) $_conf['expack.ic2.getter.sendreferer'] = 0; -// sendreferer = 0 のとき、例外的にリファラを送るホスト(カンマ区切り) +// sendreferer = 0 ソスフとゑソスソスAソスソスOソスIソスノソスソスtソス@ソスソスソス送ゑソスzソスXソスgソスiソスJソスソスソス}ソスソスリゑソスj $_conf['expack.ic2.getter.refhosts'] = ""; -// sendreferer = 1 のとき、例外的にリファラを送らないホスト(カンマ区切り) +// sendreferer = 1 ソスフとゑソスソスAソスソスOソスIソスノソスソスtソス@ソスソスソス送ゑソスネゑソスソスzソスXソスgソスiソスJソスソスソス}ソスソスリゑソスj $_conf['expack.ic2.getter.norefhosts'] = ""; -// 強制あぼーんのホスト(カンマ区切り) +// ソスソスソスソスソスソスソスレーソスソスフホソスXソスgソスiソスJソスソスソス}ソスソスリゑソスj $_conf['expack.ic2.getter.reject_hosts'] = "rotten.com,shinrei.net"; -// 強制あぼーんURLの正規表現 +// ソスソスソスソスソスソスソスレーソスソスURLソスフ撰ソスソスKソス\ソスソス $_conf['expack.ic2.getter.reject_regex'] = ""; -// ウィルススキャンをする (no:0;clamscan:1;clamdscan:2) -// (Clam AntiVirusを利用) -// ImageCache2や手動スキャンにしかClamAVを使わないなら1でclamscanの方が無難と思われる +// ソスEソスBソスソスソスXソスXソスLソスソスソスソスソスソスソスソスソスソス (no:0;clamscan:1;clamdscan:2) +// ソスiClam AntiVirusソス利用ソスj +// ImageCache2ソスソス闢ョソスXソスLソスソスソスソスソスノゑソスソスソスClamAVソスソスソスgソスソスネゑソスソスネゑソス1ソスソスclamscanソスフ包ソスソスソスソスソスソスソスニ思ソスソスソスソス $_conf['expack.ic2.getter.virusscan'] = 0; -// ClamAVのパス(clam(d)scanがある“ディレクトリ”のパス) -// httpdの環境変数でパスが通っているなら空のままでよい -// パスを明示的に指定する場合は、スペースがあるとウィルススキャンできないので注意 +// ClamAVソスフパソスXソスiclam(d)scanソスソスソスソスソスソスgソスfソスBソスソスソスNソスgソスソスソスhソスフパソスXソスj +// httpdソスフ環具ソスソスマ撰ソスソスナパソスXソスソスソスハゑソスソストゑソスソスソスネゑソスソスフままでよい +// ソスpソスXソス明趣ソスソスIソスノ指ソス閧キソスソス鼾ソスヘ、ソスXソスyソス[ソスXソスソスソスソスソスソスニウソスBソスソスソスXソスXソスLソスソスソスソスソスナゑソスソスネゑソスソスフで抵ソスソスソス $_conf['expack.ic2.getter.clamav'] = ""; -// リトライ -// リトライを行うURLの正規表現 +// ソスソスソスgソスソスソスC +// ソスソスソスgソスソスソスCソスソスソスsソスソスURLソスフ撰ソスソスKソス\ソスソス $_conf['expack.ic2.getter.retry_regex'] = '{^http://imepita\.jp/}'; -// リトライの最大回数 +// ソスソスソスgソスソスソスCソスフ最托ソスソス $_conf['expack.ic2.getter.retry_max'] = 5; -// リトライの間隔(秒) +// ソスソスソスgソスソスソスCソスフ間隔(ソスb) $_conf['expack.ic2.getter.retry_interval'] = 5; // }}} -// {{{ プロキシ +// {{{ ソスvソスソスソスLソスV -// 画像のダウンロードにプロキシを使う (no:0;yes:1) +// ソス鞫懶ソスフダソスEソスソスソスソスソス[ソスhソスノプソスソスソスLソスVソスソスソスgソスソス (no:0;yes:1) $_conf['expack.ic2.proxy.enabled'] = 0; -// ホスト +// ソスzソスXソスg $_conf['expack.ic2.proxy.host'] = ""; -// ポート +// ソス|ソス[ソスg $_conf['expack.ic2.proxy.port'] = ""; -// ユーザ名 +// ソスソスソス[ソスUソスソス $_conf['expack.ic2.proxy.user'] = ""; -// パスワード +// ソスpソスXソスソスソス[ソスh $_conf['expack.ic2.proxy.pass'] = ""; // }}} -// {{{ ソース +// {{{ ソス\ソス[ソスX -// 保存用サブディレクトリ名 +// ソスロ托ソスソスpソスTソスuソスfソスBソスソスソスNソスgソスソスソスソス $_conf['expack.ic2.source.name'] = "src"; -// キャッシュする最大データサイズ(これを越えると禁止リスト行き、0は無制限) +// ソスLソスソスソスbソスVソスソスソスソスソスソスナ托ソスfソス[ソス^ソスTソスCソスYソスiソスソスソスソスソスソスzソスソスソスソスニ禁止ソスソスソスXソスgソスsソスソスソスA0ソスヘ厄ソスソスソスソスソスソスj $_conf['expack.ic2.source.maxsize'] = 10000000; -// キャッシュする最大の幅(上に同じく) +// ソスLソスソスソスbソスVソスソスソスソスソスソスナ托ソスフ包ソスソスiソスソスノ難ソスソスソスソスソスソスj $_conf['expack.ic2.source.maxwidth'] = 4000; -// キャッシュする最大の高さ(〃) +// ソスLソスソスソスbソスVソスソスソスソスソスソスナ托ソスフ搾ソスソスソスソスiソスVソスj $_conf['expack.ic2.source.maxheight'] = 4000; // }}} -// {{{ サムネイル +// {{{ ソスTソスソスソスlソスCソスソス -// 設定名(=保存用サブディレクトリ名) +// ソスン定名ソスiソスソスソスロ托ソスソスpソスTソスuソスfソスBソスソスソスNソスgソスソスソスソスソスj $_conf['expack.ic2.thumb1.name'] = 6464; -// サムネイルの最大幅(正の整数) +// ソスTソスソスソスlソスCソスソスソスフ最大幅ソスiソスソスソスフ撰ソスソスソスソスj $_conf['expack.ic2.thumb1.width'] = 64; -// サムネイルの最大高さ(正の整数) +// ソスTソスソスソスlソスCソスソスソスフ最大高ソスソスソスiソスソスソスフ撰ソスソスソスソスj $_conf['expack.ic2.thumb1.height'] = 64; -// サムネイルのJPEG品質(正の整数、1~100以外にするとPNG) +// ソスTソスソスソスlソスCソスソスソスソスJPEGソスiソスソスソスiソスソスソスフ撰ソスソスソスソスA1~100ソスネ外ソスノゑソスソスソスソスPNGソスj $_conf['expack.ic2.thumb1.quality'] = 80; // }}} -// {{{ 携帯フルスクリーン +// {{{ ソスgソスムフソスソスソスXソスNソスソスソス[ソスソス -// 設定名 +// ソスン定名 $_conf['expack.ic2.thumb2.name'] = "qvga_v"; -// サムネイルの最大幅 +// ソスTソスソスソスlソスCソスソスソスフ最大幅 $_conf['expack.ic2.thumb2.width'] = 240; -// サムネイルの最大高さ +// ソスTソスソスソスlソスCソスソスソスフ最大高ソスソス $_conf['expack.ic2.thumb2.height'] = 320; -// サムネイルのJPEG品質 +// ソスTソスソスソスlソスCソスソスソスソスJPEGソスiソスソス $_conf['expack.ic2.thumb2.quality'] = 80; // }}} -// {{{ 中間イメージ +// {{{ ソスソスソスヤイソスソスソス[ソスW -// 設定名 +// ソスン定名 $_conf['expack.ic2.thumb3.name'] = "vga"; -// サムネイルの最大幅 +// ソスTソスソスソスlソスCソスソスソスフ最大幅 $_conf['expack.ic2.thumb3.width'] = 640; -// サムネイルの最大高さ +// ソスTソスソスソスlソスCソスソスソスフ最大高ソスソス $_conf['expack.ic2.thumb3.height'] = 480; -// サムネイルのJPEG品質 +// ソスTソスソスソスlソスCソスソスソスソスJPEGソスiソスソス $_conf['expack.ic2.thumb3.quality'] = 80; // }}} -// {{{ サムネイルの装飾 +// {{{ ソスTソスソスソスlソスCソスソスソスフ托ソスソスソス -// アニメーションGIFを検出した場合に装飾を加える (off:0;on:1) +// ソスAソスjソスソスソス[ソスVソスソスソスソスGIFソスソスソスソスソスoソスソスソスソスソス鼾ソスノ托ソスソスソスソスソスソスソスソスソスソスソス (off:0;on:1) $_conf['expack.ic2.thumbdeco.anigif'] = 1; -// アニメーションGIFを検出した場合に加える装飾ファイルのパス +// ソスAソスjソスソスソス[ソスVソスソスソスソスGIFソスソスソスソスソスoソスソスソスソスソス鼾ソスノ会ソスソスソスソス髑包ソスソスソスtソス@ソスCソスソスソスフパソスX $_conf['expack.ic2.thumbdeco.anigif_path'] = './img/thumb-deco/pera2-3.png'; -// アニメーションGIFを偽装してそうな場合に装飾を加える (off:0;on:1) +// ソスAソスjソスソスソス[ソスVソスソスソスソスGIFソスソスソスUソスソスソスソスソストゑソスソスソスソスネ場合ソスノ托ソスソスソスソスソスソスソスソスソスソスソス (off:0;on:1) $_conf['expack.ic2.thumbdeco.gifcaution'] = 1; -// アニメーションGIFを偽装してそうな場合に加える装飾ファイルのパス +// ソスAソスjソスソスソス[ソスVソスソスソスソスGIFソスソスソスUソスソスソスソスソストゑソスソスソスソスネ場合ソスノ会ソスソスソスソス髑包ソスソスソスtソス@ソスCソスソスソスフパソスX $_conf['expack.ic2.thumbdeco.gifcaution_path'] = './img/thumb-deco/caution.png'; // }}} -// {{{ 生成した画像をキャッシュしない動的生成のプリセット値 +// {{{ ソスソスソスソスソスソスソスソスソス鞫懶ソスソスソスLソスソスソスbソスVソスソスソスソスソスネゑソスソスソスソスIソスソスソスソスソスフプソスソスソスZソスbソスgソスl -// "設定名" => arrray(width, height, quality) の連想配列 +// "ソスン定名" => arrray(width, height, quality) ソスフ連ソスzソスzソスソス $_conf['expack.ic2.dynamic.presets'] = array( - //"WQVGA待受" => array(240, 400, 90), - //"iPhone待受" => array(320, 480, 0), + //"WQVGAソスメ趣ソス" => array(240, 400, 90), + //"iPhoneソスメ趣ソス" => array(320, 480, 0), ); // }}} From 4f48e8a998980ea2fdfa78181baced33cb7df1fd Mon Sep 17 00:00:00 2001 From: orzisun <kngw-779@not-exist.info> Date: Sat, 19 Jul 2014 14:48:42 +0900 Subject: [PATCH 019/339] =?UTF-8?q?offlaw2.so=20and=20rokka=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_ic2.inc.php | 2 +- lib/ThreadRead.php | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/conf/conf_ic2.inc.php b/conf/conf_ic2.inc.php index 720bbface..4bb5d6750 100644 --- a/conf/conf_ic2.inc.php +++ b/conf/conf_ic2.inc.php @@ -17,7 +17,7 @@ // SQLite2: 'sqlite:///' . $_conf['db_dir'] . '/imgcache.sqlite' // 注1: username,password,databaseは実際のものと読み替える。 // 注2: MySQL,PosrgreSQLでは予めデータベースを作っておく。 -$_conf['expack.ic2.general.dsn'] = "mysql://rep2:rep2@localhost:3306/rep2"; +$_conf['expack.ic2.general.dsn'] = ""; // DBで使うテーブル名 $_conf['expack.ic2.general.table'] = "imgcache"; diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 3ee5eb147..d67d67a7f 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -799,12 +799,8 @@ public function get2chDatError($code = null) $vip2ch_kakosoko_match = "/格.{1,2}されています。もう書き込みできません。。/"; $kakosoko_match = "/このスレッドは過去ログ倉庫に格.{1,2}されています/"; - //$kakosoko_match = "/あなたは間違った道を歩んでいます誠に申し訳ございません。/"; $kakosoko_match2 = "/http:\/\/turing1000\.nttec\.com\/?(403|404|500)\.dat/"; -//memo -//過去ログ倉庫に格納〜 = sirokuma -//あなたは間違った道を歩んでいます誠に申し訳ございません。 = ● -// + $naidesu_match = "/<title>そんな板orスレッドないです。<\/title>/"; $error3939_match = "{<title>2ちゃんねる error 3939}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) @@ -823,6 +819,9 @@ public function get2chDatError($code = null) //if (file_exists($_conf['idpw2ch_php']) || file_exists($_conf['sid2ch_php'])) { if ( preg_match($kakosoko_match2, $read_response_html, $matches)) { $marutori_ht = " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&maru=true{$_conf['k_at_a']}\">●IDでrep2に取り込む]"; + //$kakolog_url_en = rawurlencode("http://{$this->host}/{$this->bbs}/kako/".substr($this->key, 0, 4)."/".substr($this->key, 0, 5)."/{$this->key}"); + //$read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; + //$marutori_ht .= "

        2ch info - 隊長! 過去ログ倉庫で、スレッド {$matches[3]}.html を発見しました。 [rep2に取り込んで読む]

        "; } else { $marutori_ht = " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&shirokuma=true{$_conf['k_at_a']}\">offlaw経由でrep2に取り込む]"; } From edbb15f4a2975775b7e0479b2a93f46d230b6376 Mon Sep 17 00:00:00 2001 From: orzisun Date: Sat, 19 Jul 2014 17:35:53 +0900 Subject: [PATCH 020/339] =?UTF-8?q?=E3=83=AD=E3=82=B0=E5=8F=96=E5=BE=97?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- doc/test.txt | 3 +++ lib/ThreadRead.php | 9 +++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 95d5a598c..db32cc85f 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_test', // rep2の名前 - 'p2version' => '140718.2130', // rep2のバージョン + 'p2version' => '140719.1733', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/test.txt b/doc/test.txt index e58e447a5..9bdeb576b 100644 --- a/doc/test.txt +++ b/doc/test.txt @@ -1,3 +1,6 @@ +2014/07/19 (140719.1733) + ・過去ログ取得をofflawで行うかrokka(●ID)で行うか選択するようにする + 2014/07/18 (140718.2130)  ・過去ログ取得をofflaw2.so経由、rokka経由両方に対応(仮)   ・read.cgi経由で確認時のHTMLでどちらを利用するか選択 diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index d67d67a7f..04680be75 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -568,6 +568,7 @@ protected function _downloadDat2chMaruNotFound() return $this->downloadDat(); } else { $remarutori_ht = " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&maru=true&relogin2ch=true{$_conf['k_at_a']}\">再取得を試みる]"; + $remarutori_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&shirokuma=true{$_conf['k_at_a']}\">offlaw経由でrep2に取り込む]"; $moritori_ht = $this->_generateMoritapoDatLink(); $this->getdat_error_msg_ht .= "

        rep2 info: ●IDでのスレッド取得に失敗しました。{$remarutori_ht}{$moritori_ht}

        "; $this->diedat = true; @@ -817,14 +818,14 @@ public function get2chDatError($code = null) if ($reason === 'datochi' || preg_match($kakosoko_match, $read_response_html, $matches) || preg_match($kakosoko_match2, $read_response_html, $matches)) { $dat_response_status = "このスレッドは過去ログ倉庫に格納されています。"; //if (file_exists($_conf['idpw2ch_php']) || file_exists($_conf['sid2ch_php'])) { - if ( preg_match($kakosoko_match2, $read_response_html, $matches)) { + //if ( preg_match($kakosoko_match2, $read_response_html, $matches)) { $marutori_ht = " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&maru=true{$_conf['k_at_a']}\">●IDでrep2に取り込む]"; //$kakolog_url_en = rawurlencode("http://{$this->host}/{$this->bbs}/kako/".substr($this->key, 0, 4)."/".substr($this->key, 0, 5)."/{$this->key}"); //$read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; //$marutori_ht .= "

        2ch info - 隊長! 過去ログ倉庫で、スレッド {$matches[3]}.html を発見しました。 [rep2に取り込んで読む]

        "; - } else { - $marutori_ht = " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&shirokuma=true{$_conf['k_at_a']}\">offlaw経由でrep2に取り込む]"; - } + //} else { + $marutori_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&shirokuma=true{$_conf['k_at_a']}\">offlaw経由でrep2に取り込む]"; + //} //} else { // $marutori_ht = " [●IDログイン]"; //} From ea27c306cbb0ac56a16586aa5087a40267a4def8 Mon Sep 17 00:00:00 2001 From: orzisun Date: Wed, 23 Jul 2014 15:04:43 +0900 Subject: [PATCH 021/339] =?UTF-8?q?fastpic.jp=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/data/p2_replace_imageurl.txt | 230 ++++++++++++++++--------------- lib/P2Util.php | 2 +- 2 files changed, 117 insertions(+), 115 deletions(-) diff --git a/doc/data/p2_replace_imageurl.txt b/doc/data/p2_replace_imageurl.txt index c5ae9b1fe..ae13b8a5d 100644 --- a/doc/data/p2_replace_imageurl.txt +++ b/doc/data/p2_replace_imageurl.txt @@ -8,20 +8,20 @@ ;EXTRACT再取得 次回もHTMLを取得するか ;一意ID取得 EXTRACT置換結果の画像URLに対する正規表現。指定されている場合はこれでマッチした文字列で前回キャッシュと比較し、同一であれば同じ画像と見做す。 ; -http://((?:(?:www\.)?(?:kiken|sekai)\.(?:nu|jp)|www\.animar-japan\.com|altair\.mydns\.jp).+)/image\.php\?\./(log/\d{14}/img/img\d+\.(?:jpe?g|png|gif|bmp)) http://$1/$2 $& +http://((?:(?:www\.)?(?:kiken|sekai)\.(?:nu|jp)|www\.animar-japan\.com|altair\.mydns\.jp).+)/image\.php\?\./(log/\d{14}/img/img\d+\.(?:jpe?g|png|gif|bmp)) http://$1/$2 $& http://((?:[^/]+\.)?(?:haru\.gs|byonavi\.com|byokan\.net|aki\.gs)/.*vip.*)/html/(\w+)\.html http://$1/vip$EXTRACT $& $EXTRACT (/data/$2\.(?:jpe?g|png|gif|bmp)) http://((?:[^/]+\.)?(?:haru\.gs|byonavi\.com|byokan\.net|aki\.gs)/.+(/vip/\w+))\.html http://$1.$EXTRACT $& $EXTRACT $2\.(jpe?g|png|gif|bmp) http://((?:[^/]+\.)?(?:haru\.gs|byonavi\.com|byokan\.net|aki\.gs)/.+)/html/(\w+)\.html http://$1$EXTRACT $& $EXTRACT (/data/$2\.(?:jpe?g|png|gif|bmp)) http://((?:\d\.)?new\.cx)/\?(\w+) $EXTRACT $& $EXTRACT (http://$1/[^"']+$2\.(?:jpe?g|png|gif|bmp)) -http://((?:arn|asc)\.kyosui\.net/ib)/disp\.php\?img=(\w+)_(\d+\.(?:jpe?g|gif|png|bmp)) http://$1/img/$2/$2_$3 $& +http://((?:arn|asc)\.kyosui\.net/ib)/disp\.php\?img=(\w+)_(\d+\.(?:jpe?g|gif|png|bmp)) http://$1/img/$2/$2_$3 $& http://((?:gazou\.tank\.jp|momiage\.sakura\.ne\.jp|namamono\.tk|8\.pro\.tok2.com/~namamono)/\w+)/ref/(\d+)\.htm http://$1$EXTRACT $& $EXTRACT=$& (/src/$2\.(?:jpe?g|png|gif)) -http://((?:gazou\.tank\.jp|momiage\.sakura\.ne\.jp|namamono\.tk|8\.pro\.tok2.com/~namamono)/\w+/)src(/\d+\.)(?:jpe?g|png|gif|bmp) $& http://$1ref$2htm -http://((?:lapislazuli|adularia)\.ath\.cx/)image(/\d+) http://$1uploader$2_tb.gif -http://((?:pinknotora\.net|\dserver\.harikonotora\.net|\dserver\.sakura\.ne\.jp)/[^/]+)/pc/img\.php\?src=\.\.(/src/\d+-\d+\.(?:jpe?g|png|gif|bmp)) http://$1$2 +http://((?:gazou\.tank\.jp|momiage\.sakura\.ne\.jp|namamono\.tk|8\.pro\.tok2.com/~namamono)/\w+/)src(/\d+\.)(?:jpe?g|png|gif|bmp) $& http://$1ref$2htm +http://((?:lapislazuli|adularia)\.ath\.cx/)image(/\d+) http://$1uploader$2_tb.gif +http://((?:pinknotora\.net|\dserver\.harikonotora\.net|\dserver\.sakura\.ne\.jp)/[^/]+)/pc/img\.php\?src=\.\.(/src/\d+-\d+\.(?:jpe?g|png|gif|bmp)) http://$1$2 http://((?:pinknotora\.net|\dserver\.harikonotora\.net|\dserver\.sakura\.ne\.jp)/[^/]+)/pc/index\.php\?res=(\d+) http://$1$EXTRACT $& $EXTRACT (/src/$2-1\.(?:jpe?g|png|gif|bmp)) http://((img\d+)\.imageshack\.us/)my\.php\?image=(.+?\.(?:jpe?g|png|gif|bmp)) $EXTRACT $& $EXTRACT src="(http://$1$2/\d+/$3)" http://((www\.happinetonline\.com).+Action=\w+)(?:(?!_pict)(&.+#)|_pict(&.+))$ http://$2$EXTRACT http://$1_pict$3$4 $EXTRACT src="(.+\.(?:jpe?g|png|gif|bmp))" -http://((www\d?\.uploader\.jp/)dl(/[^/]+/)([^/]+\.(?:jpe?g|png|gif|bmp)))(?:\.html)? http://$2user$3images/$4 http://$1.html +http://((www\d?\.uploader\.jp/)dl(/[^/]+/)([^/]+\.(?:jpe?g|png|gif|bmp)))(?:\.html)? http://$2user$3images/$4 http://$1.html http://(?:img\.)?0bbs\.jp/(?:(\w+)/img|u/(\w+)/[^/]+/)(\d+_\d+) $EXTRACT http://0bbs.jp/$1$2/img$3 $EXTRACT (http://img\.0bbs\.jp/u/$1$2/[^/]+/$3) http://(?:imgb(\d)?|c)(\.rentalcgi\.com/view)(?:(?:(?!1)(\d)|1)/\w+)?/(\w+/\d+\.(?:jpe?g|gif|png|bmp))(?:\.html)? $EXTRACT http://imgb$1$3$2/$4.html $EXTRACT (http://c$2\d/\w+/$4) http://(?:www\.)?77c\.org/[dp]\.php\?f=(\w+\.(?:jpe?g|png|gif)) http://77c.org/$EXTRACT $& $EXTRACT href="(p\.php\?f=$1&c=\w+) @@ -32,122 +32,122 @@ http://(\w+)a\.updoga\.com/(\w+)/?$ $EXTRACT http://wwwa.updoga.com/img.php/$1/$ http://(\w+\.(?:artemisweb|imgbbs)\.jp/.+/)(?!index)[^/]*(\d+)\.html? http://$1$EXTRACT $& $EXTRACT src=["']?((?:[^"']+)?$2\.(?:jpe?g|png|gif|bmp))["']? http://(\w+\.)?p2\.ms/(\w{5}).* http://$1p2.ms$EXTRACT240 $& $EXTRACT (/skur-$2\d&s=)(?:240|30) http://(\w+\.2chan\.net/\w+)/red/(\d+)\.htm http://$1$EXTRACT $& $EXTRACT (/src/$2(?:\w+)?\.(?:jpe?g|png|gif|bmp)) -http://(\w+\.4chan\.org/\w+)/src\.cgi/(\d{13}\.\w+) http://$1/src/$2 -http://(\w+\.meiwasuisan\.com/bbs(?:pink)?/)bin/img/(\w+/)(\d+\.(?:jpe?g|png|gif|bmp)) http://$1$2img/$3 -http://(\w+\.oekakibbs\.com/bbs/\w+)/oekakibbs\.cgi\?.*thisfile=(\d+\.(?:jpe?g|png|gif|bmp)) http://$1/data/$2 -http://(\w+\.s\d\+\.x-beat\.com/)upfile\.php\?n=(img/.+\.(?:jpe?g|png|gif|bmp)) http://$1$2 $& -http://(\w+\.vip2ch\.com|files\.or\.tp)/dl(?:\.p(?:hp)?)?\?f=((?:\w+)\.(?:jpe?g|png|gif|bmp)) http://$1/$2 -http://(\w+\.wtakumi\.com)/bbs\.cgi\?id=(\w+).+&file=(\d+\.(?:jpe?g|png|gif|bmp)) http://$1/s/$2/$3 +http://(\w+\.4chan\.org/\w+)/src\.cgi/(\d{13}\.\w+) http://$1/src/$2 +http://(\w+\.meiwasuisan\.com/bbs(?:pink)?/)bin/img/(\w+/)(\d+\.(?:jpe?g|png|gif|bmp)) http://$1$2img/$3 +http://(\w+\.oekakibbs\.com/bbs/\w+)/oekakibbs\.cgi\?.*thisfile=(\d+\.(?:jpe?g|png|gif|bmp)) http://$1/data/$2 +http://(\w+\.s\d\+\.x-beat\.com/)upfile\.php\?n=(img/.+\.(?:jpe?g|png|gif|bmp)) http://$1$2 $& +http://(\w+\.vip2ch\.com|files\.or\.tp)/dl(?:\.p(?:hp)?)?\?f=((?:\w+)\.(?:jpe?g|png|gif|bmp)) http://$1/$2 +http://(\w+\.wtakumi\.com)/bbs\.cgi\?id=(\w+).+&file=(\d+\.(?:jpe?g|png|gif|bmp)) http://$1/s/$2/$3 http://(\w\.pic\.to/)(\w+)(?:(\?r)=(\d+))?$ http://$1$EXTRACT http://$1$2$3$4 $EXTRACT src='($2-$4[^']+\.(?:jpe?g|png|gif|bmp))' 1 http://\w\.pic\.to/([^-]+-[^-]+)-[^"']+\.(?:jpe?g|png|gif|bmp) http://(18ban\.jp/photo\.php\?)(?:&.*)?(?:kid=(\d+)(?:&.*)?&wid=(\d+)|wid=(\d+)(?:&.*)?&kid=(\d+))(?:&.*)? $EXTRACT http://$1kid=$2$5&wid=$3$4&br=m $EXTRACT (http://[^"]+/photo/\d/$2$5/$2$5-\d+-\d+-$3$4(?:-pc)?\.(?:jpe?g|png|gif|bmp)) http://(appleup\.bbsnow\.net/\w+)/html/(\w+)\.html http://$1$EXTRACT $& $EXTRACT (/data/$2\.(?:jpe?g|png|gif|bmp)) http://(bbs\.avi\.jp/photo)/(\d+)/(\d+)(?:[&/].*)? $EXTRACT http://$1.php?kid=$2&wid=$3&br=m $EXTRACT (http://photo\d\.avi\.jp/photo/\d/$2/$2-\d+-\d+-$3(?:-pc)?\.(?:jpe?g|png|gif|bmp)) http://(bbs\.avi\.jp/photo\.php\?).*(?:kid=(\d+).*&wid=(\d+)|wid=(\d+).*&kid=(\d+)).* $EXTRACT http://$1kid=$2$5&wid=$3$4&br=m $EXTRACT (http://photo\d\.avi\.jp/photo/\d/$2$5/$2$5-\d+-\d+-$3$4(?:-pc)?\.(?:jpe?g|png|gif|bmp)) http://(bbs\.j-banana\.net/\w+)/gazou\.cgi\?room=(\w+)&no=(\d+) http://$1$EXTRACT $& $EXTRACT (/user/(?:images/)?$2_img/$3\.(?:jpe?g|png|gif|bmp)) -http://(bbs\d+\.aimix-z\.com)/photovw\.cgi\?room=(\w+)&image=(\d+\.(?:jpe?g|png|gif|bmp)).* http://$1/gbbsimg/$2/$3 $& +http://(bbs\d+\.aimix-z\.com)/photovw\.cgi\?room=(\w+)&image=(\d+\.(?:jpe?g|png|gif|bmp)).* http://$1/gbbsimg/$2/$3 $& http://(bbs01\.apricot-fizz\.net/\w+/)(?:(?:index\.php)?\?.*&num=)(\d+) http://$1$EXTRACT $& $EXTRACT (grpview.php/$2\.\d{10}\.(?:jpe?g|png|gif|bmp)) http://(beach\.dip\.jp/BBS)/(\w+/\d+\.)html http://$1$EXTRACT $& $EXTRACT (/img/$2(?:jpe?g|png|gif)) -http://(cheke|sabayomi)\.jp/detail/((\w{2})(\w{2})\w+) http://img.$1.jp/$3/$4/$2.jpg -http://(chiba\.tm\.land\.to/upload/src/(\w+\.(?:jpe?g|png|gif|bmp))) http://$1/$2 -http://(cream\.ath\.cx/ichigo)/cream/(IchigoCream\d+\.\w+) $& http://$1/dl.cgi?filename=$2 -http://(cream\.ath\.cx/ichigo)/dl\.cgi\?filename=(IchigoCream\d+\.\w+) http://$1/cream/$2 $& +http://(cheke|sabayomi)\.jp/detail/((\w{2})(\w{2})\w+) http://img.$1.jp/$3/$4/$2.jpg +http://(chiba\.tm\.land\.to/upload/src/(\w+\.(?:jpe?g|png|gif|bmp))) http://$1/$2 +http://(cream\.ath\.cx/ichigo)/cream/(IchigoCream\d+\.\w+) $& http://$1/dl.cgi?filename=$2 +http://(cream\.ath\.cx/ichigo)/dl\.cgi\?filename=(IchigoCream\d+\.\w+) http://$1/cream/$2 $& http://(f\.hatena\.ne\.jp)/(([^/])[^/]+)/((\d{8})\d+) http://$1$EXTRACT $& $EXTRACT (/images/fotolife/$3/$2/$5/$4\.(?:jpe?g|png|gif)) -http://(fancyfree\.myphotos\.cc/[^/]+/)img/\d+\.(?:jpe?g|png|gif|bmp) $& http://$1 +http://(fancyfree\.myphotos\.cc/[^/]+/)img/\d+\.(?:jpe?g|png|gif|bmp) $& http://$1 http://(img\d+\.imagevenue\.com/)[^/]+\.php.*[?&]image=[^&]+\.(?:jpe?g|png|gif|bmp) http://$1$EXTRACT $& $EXTRACT SRC="([^"/]+/loc\d+/[^"/]+\.(?:jpe?g|png|gif|bmp)) http://(imgb1\.ziyu\.net)/view(/[^/]+/\d+\.(?:jpe?g|png|gif))(?:\.html)? http://$1$EXTRACT http://$1/view$2.html $EXTRACT SRC=['"](/[^/]+$2) http://(kjm\.kir\.jp)/(?:mailbbs\d?\.php)?\?pt?=(\d+) http://$1$EXTRACT http://$1/mailbbs2.php?pt=$2 $EXTRACT (/data/\d+\.(?:jpe?g|png|gif|bmp)) -http://(moeboard\.neuromancer\.se)/info/(moeb/.+\.(?:jpe?g|png|gif|bmp)) http://$1/image/32fdab6559cdfa4f167f8c31b9199643/i/$2 +http://(moeboard\.neuromancer\.se)/info/(moeb/.+\.(?:jpe?g|png|gif|bmp)) http://$1/image/32fdab6559cdfa4f167f8c31b9199643/i/$2 http://(mup\.vip2ch\.com)/m?dl(?:\.p(?:hp)?)?\?(?:f|img)=(?:vipper)?(\d+)(?:[&.].+)? http://$1$EXTRACT $& $EXTRACT (/up/vipper$2\.(?:jpe?g|png|gif|bmp)) http://(ona-mona\.s5\.x-beat\.com/file)/html/(\w+)\.html http://$1$EXTRACT $& $EXTRACT (/data/$2\.(?:jpe?g|png|gif|bmp)) -http://(pc\.gban\.jp(?:/[fm])?)/(?:index\.php)?\?p=(.+\.(?:jpe?g|png|gif|bmp)) http://$1/img/$2 $& +http://(pc\.gban\.jp(?:/[fm])?)/(?:index\.php)?\?p=(.+\.(?:jpe?g|png|gif|bmp)) http://$1/img/$2 $& http://(siokara\.ath\.cx/sio2?)/ref/(\d+)\.htm http://$1$EXTRACT $& $EXTRACT (/sio_src/$2\.(?:jpe?g|png|gif|bmp)) http://(siokara\.ath\.cx/sio3)/ref/(\d+)\.htm http://$1$EXTRACT $& $EXTRACT (/src/$2\.(?:jpe?g|png|gif|bmp)) http://(siokara-3\.ath\.cx/hokan/\w+)/refer/(\w+)\.htm http://$1$EXTRACT $& $EXTRACT (/img/$2\.(?:jpe?g|png|gif|bmp)) http://(sourceforge\.net)/project/screenshots\.php\?.+ http://$1$EXTRACT $& $EXTRACT src="(/dbimage\.php\?id=\d+)" -http://(thumb2?\.(?:(?:imgup|uploda|vipper)\.org|vipper\.net)/v?)html/(\w+\.(?:jpe?g|png|gif|bmp))\.html http://$1file/$2 -http://(up2\.viploader\.net/\w+/)link\.php\?updir=([^&]+)&file=(\w+\.)(jpe?g|png|gif|bmp) http://$1$2/$3$4 http://$1refer/$3htm +http://(thumb2?\.(?:(?:imgup|uploda|vipper)\.org|vipper\.net)/v?)html/(\w+\.(?:jpe?g|png|gif|bmp))\.html http://$1file/$2 +http://(up2\.viploader\.net/\w+/)link\.php\?updir=([^&]+)&file=(\w+\.)(jpe?g|png|gif|bmp) http://$1$2/$3$4 http://$1refer/$3htm http://(up2\.viploader\.net/\w+/)refer/(\w+)\.htm http://$1$EXTRACT $& $EXTRACT (\w+/$2\.(?:jpe?g|png|gif|bmp)) http://(upld\.dip\.jp:8713/files/s)/link\.php\?id=(\d+) $EXTRACT $& $EXTRACT (http://$1/img/mohemohe$2\.(?:jpe?g|png|gif|bmp)) -http://(wp\.madcowdisease\.org)/gp(/.+\.(?:jpe?g|png|gif|bmp)) http://$1$2 -http://(www\.774\.cc)/down/downcon\.cgi\?name=(up\d+\.(?:jpe?g|png|gif|bmp))@Uploda(\w+) http://$1:8020/upload-$3/src/files/$2 -http://(www\.774\.cc:80)0(0/upload-\w+/src)/(up\d+\.(?:jpe?g|png|gif|bmp))\.html http://$12$2/files/$3 -http://(www\.channel-h\.net/img(\d)?/cgi)/(?:img-box/img\d{14}\.(?:jpe?g|png|gif|bmp)) $& http://$1/imgboard$2.cgi +http://(wp\.madcowdisease\.org)/gp(/.+\.(?:jpe?g|png|gif|bmp)) http://$1$2 +http://(www\.774\.cc)/down/downcon\.cgi\?name=(up\d+\.(?:jpe?g|png|gif|bmp))@Uploda(\w+) http://$1:8020/upload-$3/src/files/$2 +http://(www\.774\.cc:80)0(0/upload-\w+/src)/(up\d+\.(?:jpe?g|png|gif|bmp))\.html http://$12$2/files/$3 +http://(www\.channel-h\.net/img(\d)?/cgi)/(?:img-box/img\d{14}\.(?:jpe?g|png|gif|bmp)) $& http://$1/imgboard$2.cgi http://(www\.csync\.net/service/file)/view\.cgi\?id=(\d+) http://$1$EXTRACT $& $EXTRACT src="\.(/data/$2\.(?:jpe?g|gif|png|bmp))" http://(www\.ec2up\.com)/view/_(\w+) http://$1$EXTRACT $& $EXTRACT src="(/pics/$2\.(?:jpe?g|gif|png)) http://(www\.ec2up\.com/v)p?(\.php\?\w+) $EXTRACT http://$1p$2 $EXTRACT (http://$1p$2) -http://(www\.gz-loader\.com/[^/]+/)mailbbs\.php\?mode=graphic&log=([^.]+)\.dat&file=(.+\.(?:jpe?g|png|gif|bmp)) http://$1data/$2/org/$3 -http://(www\.hotass\.jp/more-\w+/\d+/)pages(/[^/]+_(jpe?g|gif|png|bmp)\.)htm http://$1images$2$3 +http://(www\.gz-loader\.com/[^/]+/)mailbbs\.php\?mode=graphic&log=([^.]+)\.dat&file=(.+\.(?:jpe?g|png|gif|bmp)) http://$1data/$2/org/$3 +http://(www\.hotass\.jp/more-\w+/\d+/)pages(/[^/]+_(jpe?g|gif|png|bmp)\.)htm http://$1images$2$3 http://(www\.inverse\.jp/perl2/gazou)/html/(\d+)\.htm http://$1$EXTRACT $& $EXTRACT=$& (/src/$2\.(?:jpe?g|png|gif)) -http://(www\.inverse\.jp/perl2/gazou)/src/(\d+)\.(?:jpe?g|png|gif) $& http://$1/html/$2.htm -http://(www\.sukebegazou\.com/(?:[^/]*/)?(?:img)?bbs\d)/image\.cgi\?id=(.+\.(?:jpe?g|png|gif|bmp)) http://$1/$2 $& -http://(www\d+\.axfc\.net/uploader/\d+/so)/(?:l/\d+/|view\.cgi\?dr=\d+&file=)?([^/]+\.(?:jpe?g|png|gif|bmp))(?:\.html)? http://$1/s/$2 http://$1/$2.html -http://[^/.]+\.(?:freespace\.jp|poosan\.net)/(.+(?:jpe?g|png|gif|bmp)) http://new1314.freespace.jp/$1 http://www.sunseagull.com/freespace/download.html?download1314&$1 -http://[^/]*18ban[^/]+/photo/\d/(\d+)/\d+-\d+-\d+-(\d+)(?:-pc)?\.(?:jpe?g|png|gif|bmp) $& http://18ban.jp/photo.php?kid=$1&wid=$2&br=m +http://(www\.inverse\.jp/perl2/gazou)/src/(\d+)\.(?:jpe?g|png|gif) $& http://$1/html/$2.htm +http://(www\.sukebegazou\.com/(?:[^/]*/)?(?:img)?bbs\d)/image\.cgi\?id=(.+\.(?:jpe?g|png|gif|bmp)) http://$1/$2 $& +http://(www\d+\.axfc\.net/uploader/\d+/so)/(?:l/\d+/|view\.cgi\?dr=\d+&file=)?([^/]+\.(?:jpe?g|png|gif|bmp))(?:\.html)? http://$1/s/$2 http://$1/$2.html +http://[^/.]+\.(?:freespace\.jp|poosan\.net)/(.+(?:jpe?g|png|gif|bmp)) http://new1314.freespace.jp/$1 http://www.sunseagull.com/freespace/download.html?download1314&$1 +http://[^/]*18ban[^/]+/photo/\d/(\d+)/\d+-\d+-\d+-(\d+)(?:-pc)?\.(?:jpe?g|png|gif|bmp) $& http://18ban.jp/photo.php?kid=$1&wid=$2&br=m http://\w+\.bannch\.com/\w+/BBSmsg2\?bbsid=\d+&fname=(\d{10}\.(?:jpe?g|png|gif|bmp)) $EXTRACT $& $EXTRACT href="([^"]+/$1)" http://\w+\.updoga\.com/[^/]+(/\w+/\w+)(?:/?$|(/\d+).*$) $EXTRACTe http://wwwa.updoga.com/img.php$1$2/ORG/ $EXTRACT src="([^"]+\.jp)[eg]" http://a\.upup\.be/(?:index(?:\.php)?)?\?(.*)(?:&l=\d)?(.*) http://a.upup.be/?mode=imageout$EXTRACT http://a.upup.be/?$1$2 $EXTRACT src=/\?mode=imageout.*(&k=\w+) http://an\.to/(?:\w+/)?\?.+ $EXTRACT $& $EXTRACT (http://[^"']+?\.(?:jpe?g|png|gif|bmp)) http://atk\.jp/.+ $EXTRACT $& $EXTRACT (http://[^"']+?\.(?:jpe?g|png|gif|bmp)) -http://bbs\.2ch2\.net/(\w+)/\?m=[^/]*/\w+/(img/.+\.(?:jpe?g|png|gif|bmp)) http://bbs.2ch2.net/$1/$2 -http://co0\.sakura\.ne\.jp/ph/link\.php\?f=(\d{10})x(jpe?g|png|gif|bmp) http://co0.sakura.ne.jp/ph/src/$1.$2 +http://bbs\.2ch2\.net/(\w+)/\?m=[^/]*/\w+/(img/.+\.(?:jpe?g|png|gif|bmp)) http://bbs.2ch2.net/$1/$2 +http://co0\.sakura\.ne\.jp/ph/link\.php\?f=(\d{10})x(jpe?g|png|gif|bmp) http://co0.sakura.ne.jp/ph/src/$1.$2 http://doup\.org/(?:files/)?(\w+) http://doup.org/files/$1/$EXTRACT http://doup.org/$1 $EXTRACT src=([^\s]+(?:jpe?g|png|gif|bmp)) http://fout\.garon\.jp/\?key=.+:(\w+)&ext=(jpe?g|png|gif|bmp) $EXTRACT $& $EXTRACT (http://g\d{3}\.garon\.jp/gdb/[^"]+$1\.$2) http://gban\.jp/i/(\w+(\w)) $EXTRACT $& $EXTRACT (http://gban\.jp/d/$2/$1\.(?:jpe?g|png|gif|bmp)) http://hidebbs\.net/bbs/(\w+)\?.*no=\d+ $EXTRACT $& $EXTRACT (http://www7\.hidebbs\.net/\d+/$1/bbs/\d{4}/\d{2}/\d{2}/\w+\.(?:jpe?g|gif|png|bmp)) -http://i\.turboimagehost\.com/p/(\d+/[^/]+\.(?:jpe?g|png|gif|bmp))\.html http://i2.turboimagehost.com/b1/$1 -http://i-bbs\.sijex\.net/imageDisp\.jsp\?id=(.*)&file=([^.]+\.(?:jpe?g|png|gif|bmp)) http://image.i-bbs.sijex.net/bbs/$1/$2 -http://i-bbs\.sijex\.net/servlet/ImageOutput\?pa=([^.]+\.(?:jpe?g|png|gif|bmp))&id=(\w+)&t=\d+ http://i-bbs.sijex.net/bbs/$2/$1 http://i-bbs.sijex.net/imageBoard.jsp?id=$2 +http://i\.turboimagehost\.com/p/(\d+/[^/]+\.(?:jpe?g|png|gif|bmp))\.html http://i2.turboimagehost.com/b1/$1 +http://i-bbs\.sijex\.net/imageDisp\.jsp\?id=(.*)&file=([^.]+\.(?:jpe?g|png|gif|bmp)) http://image.i-bbs.sijex.net/bbs/$1/$2 +http://i-bbs\.sijex\.net/servlet/ImageOutput\?pa=([^.]+\.(?:jpe?g|png|gif|bmp))&id=(\w+)&t=\d+ http://i-bbs.sijex.net/bbs/$2/$1 http://i-bbs.sijex.net/imageBoard.jsp?id=$2 http://iboard\d\.to/GAZOimage/\d{6}/\w\d+_\d+_\w+ $EXTRACT $& $EXTRACT ($&) -http://image\.(i-bbs\.sijex\.net/bbs/\w+/\d{13}o\.(?:jpe?g|png|gif|bmp)) $& http://$1 -http://imagesocket\.com/view/(.+(?:jpe?g|png|gif|bmp)) http://content.imagesocket.com/images/$1 +http://image\.(i-bbs\.sijex\.net/bbs/\w+/\d{13}o\.(?:jpe?g|png|gif|bmp)) $& http://$1 +http://imagesocket\.com/view/(.+(?:jpe?g|png|gif|bmp)) http://content.imagesocket.com/images/$1 http://imepita\.jp/(?:image/)?(\d{8}/\d{6}) http://imepita.jp/image/$1 http://imepita.jp/$1 http://imgcash\d\.imageshack\.us/Himg\d+/scaled\.php\?(?:.+&)?filename=[^&]+\.(?:jpe?g|png|gif|bmp).* $EXTRACT $& $EXTRACT ($&) -http://imgup5\.myphotos\.cc/image/\d+/[^/]+\.(?:jpe?g|png|gif|bmp) $& -http://kjm\.kir\.jp/pc/.*\?p=(.+\.(?:jpe?g|png|gif|bmp)) http://kjm.kir.jp/pc/img/$1 $& +http://imgup5\.myphotos\.cc/image/\d+/[^/]+\.(?:jpe?g|png|gif|bmp) $& +http://kjm\.kir\.jp/pc/.*\?p=(.+\.(?:jpe?g|png|gif|bmp)) http://kjm.kir.jp/pc/img/$1 $& http://mokei\.net/up/img/img\d+\.(?:jpe?g|png|gif|bmp) http://mokei.net$EXTRACT $& $EXTRACT "(/up/gresize\.cgi\?rn=[^"]+)" http://nurupo\.net/(?:(?:index\.php)?\?d=|cabinet/)([^&/]+)(?:&f=|/)([^?&/]+\.(?:jpe?g|png|gif|bmp))[&?](ak=\w+) $EXTRACT http://nurupo.net/cabinet/$1/$2?$3 $EXTRACT (http://nurupo\.net/cabinet/$1/$2\?$3) -http://nurupo\.net/(?:index\.php)?\?d=([^&]+)&f=([^/&]+\.(?:jpe?g|png|gif|bmp))$ http://nurupo.net/cabinet/$1/$2 $& +http://nurupo\.net/(?:index\.php)?\?d=([^&]+)&f=([^/&]+\.(?:jpe?g|png|gif|bmp))$ http://nurupo.net/cabinet/$1/$2 $& http://p\.pita\.st/\?(?:m=)?(\w{8}) $EXTRACT $& $EXTRACT .+img src="?([^"\s]+\.(?:jpe?g|png|gif|bmp)) -http://www\.gazoru\.com/g-((\w)\w{31}\.(?:jpe?g|png|gif|bmp))\.html http://www.gazoru.com/file/pic/$2/$1 -http://www\.sunseagull\.com/freespace/download\.html\?download(\d+)&(.+) http://new$1.freespace.jp/$2 $& -http://www\.uploda\.net/cgi/uploader1/index\.php\?file_id=(\d{10}\.(?:jpe?g|png|gif|bmp)) http://aploda.com/dl.php?mode=pass&file_id=$1 -http://www\.uploda\.net/cgi/uploader2/index\.php\?file_id=(\d{10}\.(?:jpe?g|png|gif|bmp)) http://aploda.net/dl.php?mode=pass&file_id=$1 -http://www\.uploda\.net/cgi/uploader3/index\.php\?file_id=(\d{10}\.(?:jpe?g|png|gif|bmp)) http://xelhes.com/dl.php?mode=pass&file_id=$1 -http://www\.uploda\.net/cgi/uploader4/index\.php\?file_id=(\d{10}\.(?:jpe?g|png|gif|bmp)) http://aploda.org/dl.php?mode=pass&file_id=$1 -http://www\.uploda\.net/i/cgi/upk1/index\.php\?file_id=(\d{10}\.(?:jpe?g|png|gif|bmp)) http://lieza.net/dl.php?mode=pass&file_id=$1 +http://www\.gazoru\.com/g-((\w)\w{31}\.(?:jpe?g|png|gif|bmp))\.html http://www.gazoru.com/file/pic/$2/$1 +http://www\.sunseagull\.com/freespace/download\.html\?download(\d+)&(.+) http://new$1.freespace.jp/$2 $& +http://www\.uploda\.net/cgi/uploader1/index\.php\?file_id=(\d{10}\.(?:jpe?g|png|gif|bmp)) http://aploda.com/dl.php?mode=pass&file_id=$1 +http://www\.uploda\.net/cgi/uploader2/index\.php\?file_id=(\d{10}\.(?:jpe?g|png|gif|bmp)) http://aploda.net/dl.php?mode=pass&file_id=$1 +http://www\.uploda\.net/cgi/uploader3/index\.php\?file_id=(\d{10}\.(?:jpe?g|png|gif|bmp)) http://xelhes.com/dl.php?mode=pass&file_id=$1 +http://www\.uploda\.net/cgi/uploader4/index\.php\?file_id=(\d{10}\.(?:jpe?g|png|gif|bmp)) http://aploda.org/dl.php?mode=pass&file_id=$1 +http://www\.uploda\.net/i/cgi/upk1/index\.php\?file_id=(\d{10}\.(?:jpe?g|png|gif|bmp)) http://lieza.net/dl.php?mode=pass&file_id=$1 http://www-2ch\.net:8080/up/download/\d+\.[^?]+ $EXTRACT $& $EXTRACT ($&) -http://((?:\w+\.)?ascii24\.com/.+/\d{4}/\d{2}/\d{2}/image)view/(images\d{6}\.(?:jpe?g|png|gif|bmp))\.html http://$1s/$2 $& +http://((?:\w+\.)?ascii24\.com/.+/\d{4}/\d{2}/\d{2}/image)view/(images\d{6}\.(?:jpe?g|png|gif|bmp))\.html http://$1s/$2 $& http://((?:www\.)?jeux-france\.com/)images\d+_\d_\d+\.html http://$1$EXTRACT $& $EXTRACT src="(Webmasters/[^"]+_big\.jpg) http://(\w+\.nikkeibp\.co\.jp/.+/\d+/\d+)/\?SS=(?:\w+)?imgview&FD=.+ http://$1/$EXTRACT $& $EXTRACT src="([^/]+\.(?:jpe?g|png|gif|bmp))" http://(\w+\.watch\.impress\.co\.jp)/cda/parts/image_for_link/\d+-\d+-\d+-\d+\.html http://$1$EXTRACT $& $EXTRACT (/cda/static/image/\d{4}/\d{2}/\d{2}/[^/]+\.(?:jpe?g|png|gif|bmp)) http://(arena\.nikkeibp\.co\.jp/.+/\d+/\d+/)(\d{2}v)\.shtml http://$1$EXTRACT $& $EXTRACT src="($2\.(?:jpe?g|png|gif|bmp))" -http://(cms\.rbbtoday\.com/review/(?:photo|images)/[^/]+)\.html http://$1.jpg +http://(cms\.rbbtoday\.com/review/(?:photo|images)/[^/]+)\.html http://$1.jpg http://(ga\.sbcr\.jp/(?!wall/|sound/).+/)(\d{2})(?:-640|-1024)?\.html http://$1$EXTRACT $& $EXTRACT SRC="(?:\./)?(images/$2(?:-640|-1024)?\.jpg)" -http://(ga\.sbcr\.jp/sound/\w+)/(\d{2})\.html http://$1/images/image$2.jpg +http://(ga\.sbcr\.jp/sound/\w+)/(\d{2})\.html http://$1/images/image$2.jpg http://(ga\.sbcr\.jp/wall)/(640|1024)\.html http://$1$EXTRACT $& $EXTRACT SRC="\.(/\d+/images/$2\.jpg)" -http://(ga\.sbcr\.jp/wall/\d+)/(\d{2})\.html http://$1/images/gallery$2.jpg -http://(image\.itmedia\.co\.jp)/(?:l/im/)?(.+\.(?:jpe?g|png|gif|bmp)) http://$1/$2 $& +http://(ga\.sbcr\.jp/wall/\d+)/(\d{2})\.html http://$1/images/gallery$2.jpg +http://(image\.itmedia\.co\.jp)/(?:l/im/)?(.+\.(?:jpe?g|png|gif|bmp)) http://$1/$2 $& http://(it\.nikkei\.co\.jp)/.+\.aspx\?n=[^&]+.*&ps=\d+ http://$1$EXTRACT $& $EXTRACT (/photo/[^"]+\.(?:jpe?g|png|gif|bmp)) -http://(journal\.mycom\.co\.jp)/photo/(.+/images/\w+\.(?:jpe?g|png|gif)) http://$1/$2 +http://(journal\.mycom\.co\.jp)/photo/(.+/images/\w+\.(?:jpe?g|png|gif)) http://$1/$2 http://(k-tai\.impress\.co\.jp)/cda/parts/image_for_link/\d+-\d+-\d+-\d+\.html http://$1$EXTRACT $& $EXTRACT SRC="(/cda/static/image/\d{4}/\d{2}/\d{2}/[^/"]+\.(?:jpe?g|png|gif|bmp)) http://(news\.livedoor\.com)/article/image_detail/\d+/\?img_id=\d+ $EXTRACT $& $EXTRACT (http://image\.$1/newsimage/\w/\w/[^/"]+\.(?:jpe?g|gif|png|bmp)) http://(news\.www\.infoseek\.co\.jp)/photo/(?:\w+)/full/story/\w+/ $EXTRACT $& $EXTRACT (http://$1/img/photos/\w+/[^/]+\.(?:jpe?g|png|gif|bmp)) http://(pc\.nikkeibp\.co\.jp/.+/\d+/\d+)/[^/]+_imgview(\d)\.html http://$1/$2.$EXTRACT $& $EXTRACT $2\.(jpe?g|png|gif|bmp) -http://(release\.nikkei\.co\.jp)/attach\.cfm\?attID=(.+\.(?:jpe?g|gif|png|bmp)) http://$1/attach_file/$2 $& +http://(release\.nikkei\.co\.jp)/attach\.cfm\?attID=(.+\.(?:jpe?g|gif|png|bmp)) http://$1/attach_file/$2 $& http://(sports\.livedoor\.com)/photo/detail-\d+\.html.* $EXTRACT $& $EXTRACT (http://image.$1/photo/\w/\w/[^/"]+\.(?:jpe?g|gif|png|bmp)) http://(www\.4gamer\.net/news/image/\d{4}\.\d{2}/)(\d{14}_\w+)\.html http://$1$EXTRACT $& $EXTRACT ($2\.(?:jpe?g|png|gif|bmp)) http://(www\.asahi\.com)/photonews/\w+\.html http://$1$EXTRACT $& $EXTRACT src="(/photonews/images/\w+\.jpg)" @@ -156,103 +156,105 @@ http://(www\.dengekionline\.com/data/\w+/\d{4}/(?:\d{1,2}/){1,2})\w+_\d+\.html h http://(www\.forest\.impress\.co\.jp/article/.+)/(\w+\d+r)\.html http://$1/$EXTRACT $& $EXTRACT ($2\.(?:jpe?g|png|gif|bmp)) http://(www\.iza\.ne\.jp)/\w+/(?:newsarticle/.+/\d+/slideshow|(?:news)?photo/.+/\d+)/.* http://$1$EXTRACT.jpg $& $EXTRACT (/images/news/\d{8}/\d+)(?:_c350)?\.jpg http://(www\.mainichi-msn\.co\.jp/.+/graph/.+/)\d+\.html http://$1$EXTRACT $& $EXTRACT img src="(\d+\.jpg)" -http://(www\.rbbtoday\.com)/cgi-bin/news/pict/(\d+)/\d+/jpg/([^/]+)\.html http://$1/news/$2/$3.jpg -http://(www\.sponichi\.co\.jp/.+)(/K.+\d{11})_p\.html http://$1/images$2_l.jpg -http://(www\.vector\.co\.jp/games/news)/(\d{6})/(\d{2})/(\d{2})/images_(\d{2})\.html http://$1/$2/$3/$4/images/$2$3_$4_$5.jpg -http://(www\.vector\.co\.jp/games/review/\d{4})/images_(\d{2})\.html http://$1/images/$2_l.gif -http://(www\.vector\.co\.jp/magazine/\w+/\d{6})/(\w+[^b])b?_pic\.html http://$1/images/$2b.gif +http://(www\.rbbtoday\.com)/cgi-bin/news/pict/(\d+)/\d+/jpg/([^/]+)\.html http://$1/news/$2/$3.jpg +http://(www\.sponichi\.co\.jp/.+)(/K.+\d{11})_p\.html http://$1/images$2_l.jpg +http://(www\.vector\.co\.jp/games/news)/(\d{6})/(\d{2})/(\d{2})/images_(\d{2})\.html http://$1/$2/$3/$4/images/$2$3_$4_$5.jpg +http://(www\.vector\.co\.jp/games/review/\d{4})/images_(\d{2})\.html http://$1/images/$2_l.gif +http://(www\.vector\.co\.jp/magazine/\w+/\d{6})/(\w+[^b])b?_pic\.html http://$1/images/$2b.gif http://(www\.watch\.impress\.co\.jp/akiba/hotline/\d{8}/image/)(\w+\d)\.html http://$1$EXTRACT $& $EXTRACT src="($2\.(?:jpe?g|png|gif|bmp))" http://(www\.watch\.impress\.co\.jp/game/docs/\d{8}/)(?:\w*(?:\D|_))?\d{2}\.htm http://$1$EXTRACT $& $EXTRACT Date: Wed, 3 Sep 2014 15:57:28 +0900 Subject: [PATCH 022/339] =?UTF-8?q?dig.2ch.net=E6=A4=9C=E7=B4=A2=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 3 ++- conf/conf_admin_ex.inc.php | 4 ++++ lib/expack/tgrep/view.inc.php | 7 +++++++ lib/expack/tgrep/view_k.inc.php | 1 + lib/expack/tgrep/view_x.inc.php | 2 ++ rep2/tgrepc.php | 34 +++++++++++++++++++-------------- 6 files changed, 36 insertions(+), 15 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index db32cc85f..ebff3dea0 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_test', // rep2の名前 - 'p2version' => '140719.1733', // rep2のバージョン + 'p2version' => '140718.2130', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; @@ -79,6 +79,7 @@ function p2_init() $_conf['expack.download_url'] = 'http://page2.skr.jp/rep2/downloads.html'; $_conf['expack.history_url'] = 'http://page2.skr.jp/rep2/history.html'; $_conf['expack.tgrep_url'] = 'http://page2.xrea.jp/tgrep/search'; + $_conf['test.dig2ch_url'] = 'http://dig.2ch.net/?AndOr=0&maxResult=100&atLeast=1&Sort=5&Link=1&Bbs=all&924=1&json=1&keywords='; $_conf['expack.gate_php'] = 'http://page2.skr.jp/gate.php'; $_conf['menu_php'] = 'menu.php'; $_conf['subject_php'] = 'subject.php'; diff --git a/conf/conf_admin_ex.inc.php b/conf/conf_admin_ex.inc.php index 680288feb..a266f80d7 100644 --- a/conf/conf_admin_ex.inc.php +++ b/conf/conf_admin_ex.inc.php @@ -25,6 +25,10 @@ // ロードするようになっていない場合のみ 1 にする $_conf['expack.dl_pecl_http'] = 0; // (0) +// スレタイ検索をdig.2ch.netで行う +$_conf['test.search_dig2ch'] = 1; // (1) + + // }}} // {{{ スキン diff --git a/lib/expack/tgrep/view.inc.php b/lib/expack/tgrep/view.inc.php index a1657d35a..7b3ca63ee 100644 --- a/lib/expack/tgrep/view.inc.php +++ b/lib/expack/tgrep/view.inc.php @@ -91,6 +91,13 @@ function sf() { + + + + + +
        +
        diff --git a/lib/expack/tgrep/view_k.inc.php b/lib/expack/tgrep/view_k.inc.php index c2e1087e2..f30cd366f 100644 --- a/lib/expack/tgrep/view_k.inc.php +++ b/lib/expack/tgrep/view_k.inc.php @@ -70,6 +70,7 @@ + {$profile['cm0']}";} + if ($_conf['test.search_dig2ch']) { echo "
      • "; echo $profile['cm0'];echo $profile['cm1'];echo $profile['cm2'];echo "
      • ";} foreach ($threads as $o => $t) { $ttitle_ht = strip_tags($t->title); diff --git a/rep2/tgrepc.php b/rep2/tgrepc.php index 20c4d89df..0201a7cfa 100644 --- a/rep2/tgrepc.php +++ b/rep2/tgrepc.php @@ -156,7 +156,8 @@ // 基本変数 $htm = array(); -$htm['tgrep_url'] = p2h($_conf['expack.tgrep_url']); +//$htm['tgrep_url'] = p2h($_conf['expack.tgrep_url']); +$htm['tgrep_url'] = p2h($_conf['test.dig2ch_url']); $htm['php_self'] = 'tgrepc.php'; //p2h($_SERVER['SCRIPT_NAME']); $htm['query'] = (isset($_GET['Q'])) ? p2h($_GET['Q']) : ''; $htm['query_en'] = (isset($_GET['Q'])) ? rawurlencode($_GET['Q']) : ''; @@ -336,20 +337,25 @@ function tgrep_search($query) { global $_conf; - $client = new HTTP_Client(); - $client->setDefaultHeader('User-Agent', 'p2-tgrep-client'); - $code = $client->get($_conf['expack.tgrep_url'] . '?' . $query); - if (PEAR::isError($code)) { - p2die($code->getMessage()); - } elseif ($code != 200) { - p2die("HTTP Error - {$code}"); - } - $response = $client->currentResponse(); - $result = unserialize($response['body']); - if (!$result) { - p2die('Error: 検索結果の展開に失敗しました。'); + if (!$_conf['test.search_dig2ch']) { + $client = new HTTP_Client(); + $client->setDefaultHeader('User-Agent', 'p2-tgrep-client'); + $code = $client->get($_conf['expack.tgrep_url'] . '?' . $query); + if (PEAR::isError($code)) { + p2die($code->getMessage()); + } elseif ($code != 200) { + p2die("HTTP Error - {$code}"); + } + $response = $client->currentResponse(); + $result = unserialize($response['body']); + if (!$result) { + p2die('Error: 検索結果の展開に失敗しました。'); + } + return $result; + } else { + require_once './dig2ch.php'; + return dig2chsearch($query); // 追加 } - return $result; } // }}} From cbeaab642f1832a8ca7d00378d274f87a30eedc2 Mon Sep 17 00:00:00 2001 From: orzisun Date: Wed, 3 Sep 2014 16:00:06 +0900 Subject: [PATCH 023/339] =?UTF-8?q?dig.2ch.net=E6=A4=9C=E7=B4=A2=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/test.txt | 3 ++ rep2/dig2ch.php | 75 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 rep2/dig2ch.php diff --git a/doc/test.txt b/doc/test.txt index 9bdeb576b..c47e657d0 100644 --- a/doc/test.txt +++ b/doc/test.txt @@ -1,3 +1,6 @@ +2014/09/03 (140903.1600) + ・dig.2ch.netでスレタイが検索できるようにした (tgrepc.phpの変更、dig2ch.php作成) + 2014/07/19 (140719.1733)  ・過去ログ取得をofflawで行うかrokka(●ID)で行うか選択するようにする diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php new file mode 100644 index 000000000..0391bc343 --- /dev/null +++ b/rep2/dig2ch.php @@ -0,0 +1,75 @@ +setDefaultHeader('User-Agent', 'p2-tgrep-client'); + $code = $client->get($_conf['test.dig2ch_url'] . $query_arry['q']); + if (PEAR::isError($code)) { + p2die($code->getMessage()); + } elseif ($code != 200) { + p2die("HTTP Error - {$code}"); + } + $response = $client->currentResponse(); + + $jsontest1 = json_decode($response['body'], true); + + //mb_convert_variables('SHIFT-JIS','UTF-8',$jsontest1); + /* switch (json_last_error()) { + case JSON_ERROR_NONE: + echo ' - No errors'; + break; + case JSON_ERROR_DEPTH: + echo ' - Maximum stack depth exceeded'; + break; + case JSON_ERROR_STATE_MISMATCH: + echo ' - Underflow or the modes mismatch'; + break; + case JSON_ERROR_CTRL_CHAR: + echo ' - Unexpected control character found'; + break; + case JSON_ERROR_SYNTAX: + echo ' - Syntax error, malformed JSON'; + break; + case JSON_ERROR_UTF8: + echo ' - Malformed UTF-8 characters, possibly incorrectly encoded'; + break; + default: + echo ' - Unknown error'; + break; + } */ + if ($jsontest1 === NULL) { + p2die('Error: 失敗'); + } + + foreach ($jsontest1[result] as $jsontest2) { + $result['threads'][$n1]->title = $jsontest2[subject]; + $result['threads'][$n1]->host = $jsontest2[server]; + $result['threads'][$n1]->bbs = $jsontest2[bbs]; + $result['threads'][$n1]->tkey = $jsontest2[key]; + $result['threads'][$n1]->resnum = $jsontest2[resno]; + $result['threads'][$n1]->ita = $jsontest2[ita]; + $result['threads'][$n1]->dayres = $jsontest2[ikioi]; + $n1++; + } + $result['modified'] = $response['body']['date']; + $result['profile']['regex'] = '/(' . $jsontest1[query] .')/i'; + $result['profile']['hits'] = $jsontest1[found]; + $result['profile']['cm0'] = str_replace("a href=" , "a target=\"_blank\" href=", $jsontest1[cm0]); + if (strstr($result['profile']['cm0'] , "rounin")) { $result['profile']['cm0'] = str_replace("src=\"" , "src=\"http://dig.2ch.net", $result['profile']['cm0']);} + $result['profile']['cm0'] = str_replace("
        " , "", $result['profile']['cm0']); + + $result['profile']['cm1'] = str_replace("a href=" , "a target=\"_blank\" href=", $jsontest1[cm1]); + if (strstr($result['profile']['cm1'] , "rounin")) { $result['profile']['cm1'] = str_replace("src=\"" , "src=\"http://dig.2ch.net", $result['profile']['cm1']);} + $result['profile']['cm1'] = str_replace("
        " , "", $result['profile']['cm1']); + + $result['profile']['cm2'] = str_replace("a href=" , "a target=\"_blank\" href=", $jsontest1[cm2]); + if (strstr($result['profile']['cm2'] , "rounin")) { $result['profile']['cm2'] = str_replace("src=\"" , "src=\"http://dig.2ch.net", $result['profile']['cm2']);} + $result['profile']['cm2'] = str_replace("
        " , "", $result['profile']['cm2']); + + return $result; +} + From 5bf307f45f1b050d1eecd345f11bd1de31c2d28c Mon Sep 17 00:00:00 2001 From: orzisun Date: Sun, 7 Sep 2014 06:15:33 +0900 Subject: [PATCH 024/339] =?UTF-8?q?dig.2ch.net=E6=A4=9C=E7=B4=A2=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 3 ++- lib/expack/tgrep/view_k.inc.php | 23 +++++++++++++++- lib/menu.inc.php | 47 +++++++++++++++++++++++++++++++-- rep2/dig2ch.php | 7 ++--- rep2/menu_i.php | 29 +++++++++++++++++--- rep2/tgrepc.php | 10 +++++++ 6 files changed, 108 insertions(+), 11 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index ebff3dea0..fd332fccd 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -79,7 +79,8 @@ function p2_init() $_conf['expack.download_url'] = 'http://page2.skr.jp/rep2/downloads.html'; $_conf['expack.history_url'] = 'http://page2.skr.jp/rep2/history.html'; $_conf['expack.tgrep_url'] = 'http://page2.xrea.jp/tgrep/search'; - $_conf['test.dig2ch_url'] = 'http://dig.2ch.net/?AndOr=0&maxResult=100&atLeast=1&Sort=5&Link=1&Bbs=all&924=1&json=1&keywords='; + $_conf['test.dig2ch_url'] = 'http://dig.2ch.net/'; + //$_conf['test.dig2ch_url'] = 'http://dig.2ch.net/?AndOr=0&maxResult=100&atLeast=1&Sort=5&Link=1&Bbs=all&924=1&json=1&keywords='; $_conf['expack.gate_php'] = 'http://page2.skr.jp/gate.php'; $_conf['menu_php'] = 'menu.php'; $_conf['subject_php'] = 'subject.php'; diff --git a/lib/expack/tgrep/view_k.inc.php b/lib/expack/tgrep/view_k.inc.php index f30cd366f..73f7c3a93 100644 --- a/lib/expack/tgrep/view_k.inc.php +++ b/lib/expack/tgrep/view_k.inc.php @@ -17,7 +17,28 @@
        > - +
        +
        +最大件表示
        +
        +924を

        diff --git a/lib/menu.inc.php b/lib/menu.inc.php index d40f85599..2419d9554 100644 --- a/lib/menu.inc.php +++ b/lib/menu.inc.php @@ -166,7 +166,29 @@ function chMenuColor(idnum){ // スレタイ検索 echo << - +
        +
        + 最大件表示
        +
        + 924を + {$_conf['detect_hint_input_ht']}{$_conf['k_input_ht']}
        \n EOP; @@ -185,7 +207,28 @@ function chMenuColor(idnum){ // スレタイ検索 echo << - +
        +
        + 最大件表示
        +
        + 924を {$_conf['detect_hint_input_ht']}{$_conf['k_input_ht']}
        \n EOP; diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php index 0391bc343..faf87e722 100644 --- a/rep2/dig2ch.php +++ b/rep2/dig2ch.php @@ -3,11 +3,11 @@ function dig2chsearch($query) { global $_conf; - $fp = fopen("/var/www/html/test/test/test.txt", "w"); + parse_str($query, $query_arry); $client = new HTTP_Client(); $client->setDefaultHeader('User-Agent', 'p2-tgrep-client'); - $code = $client->get($_conf['test.dig2ch_url'] . $query_arry['q']); + $code = $client->get($_conf['test.dig2ch_url'] . '?AndOr=' . $query_arry['AndOr'] . '&maxResult=' . $query_arry['maxResult'] . '&atLeast=1&Sort=' . $query_arry['Sort'] . '&Link=1&Bbs=all&924=' . $query_arry['924'] . '&json=1&keywords=' . $query_arry['q']); if (PEAR::isError($code)) { p2die($code->getMessage()); } elseif ($code != 200) { @@ -17,6 +17,7 @@ function dig2chsearch($query) $jsontest1 = json_decode($response['body'], true); + //mb_convert_variables('SHIFT-JIS','UTF-8',$jsontest1); /* switch (json_last_error()) { case JSON_ERROR_NONE: @@ -42,7 +43,7 @@ function dig2chsearch($query) break; } */ if ($jsontest1 === NULL) { - p2die('Error: 失敗'); + p2die("検索結果の取得に失敗しました"); } foreach ($jsontest1[result] as $jsontest2) { diff --git a/rep2/menu_i.php b/rep2/menu_i.php index f210084ed..27d8d7bf2 100644 --- a/rep2/menu_i.php +++ b/rep2/menu_i.php @@ -186,7 +186,7 @@ // }}} // {{{ エラー -if (P2Util::hasInfoHtml()) { +if (P2Util::hasInfoHtml()) { echo '
        '; P2Util::printInfoHtml(); echo '
        '; @@ -258,7 +258,7 @@ // }}} // {{{ RSS - if ($_conf['expack.rss.enabled']) { + if ($_conf['expack.rss.enabled']) { $rss = FavSetManager::getFavSetTitles('m_rss_set'); if (!$rss) { $rss = array(); @@ -292,7 +292,7 @@ } else { menu_iphone_show_favorite_boards('お気に板'); - if ($_conf['expack.rss.enabled']) { + if ($_conf['expack.rss.enabled']) { menu_iphone_show_feed_list('RSS'); } } @@ -382,7 +382,28 @@ 取消 検索 - +
        +
        + 最大件表示
        + + 924を diff --git a/rep2/tgrepc.php b/rep2/tgrepc.php index 0201a7cfa..9ed82b595 100644 --- a/rep2/tgrepc.php +++ b/rep2/tgrepc.php @@ -20,6 +20,11 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') { require_once P2_LIB_DIR . '/menu_iphone.inc.php'; $_GET['Q'] = menu_iphone_unicode_urldecode($_POST['iq']); + if (isset($_POST['AndOr'])) { $_GET['AndOr'] = $_POST['AndOr'];} + if (isset($_POST['maxResult'])) { $_GET['maxResult'] = $_POST['maxResult'];} + if (isset($_POST['Sort'])) { $_GET['Sort'] = $_POST['Sort'];} + if (isset($_POST['Link'])) { $_GET['Link'] = $_POST['Link'];} + if (isset($_POST['924'])) { $_GET['924'] = $_POST['924'];} } else { $_GET['Q'] = $_GET['iq']; } @@ -39,6 +44,11 @@ if (isset($_GET['Q']) && is_string($_GET['Q']) && strlen($_GET['Q']) > 0) { $query_params['q'] = $_GET['Q']; $query_params['n'] = $limit = ($_conf['ktai'] || $_conf['iphone']) ? '25' : '100'; + if (isset($_GET['AndOr'])) { $query_params['AndOr'] = $_GET['AndOr'];} + if (isset($_GET['maxResult'])) { $query_params['maxResult'] = $_GET['maxResult'];} + if (isset($_GET['Sort'])) { $query_params['Sort'] = $_GET['Sort'];} + if (isset($_GET['Link'])) { $query_params['Link'] = $_GET['Link'];} + if (isset($_GET['924'])) { $query_params['924'] = $_GET['924'];} //$query_keys = array('s', 'b', 'c', 'o', 'n', 'p'); $query_keys = array('s', 'b', 'c', 'p'); foreach ($query_keys as $_k) { From 04dfa3b20b3f1cf3375bc686900b0cc41fcf5b3a Mon Sep 17 00:00:00 2001 From: orzisun Date: Sun, 7 Sep 2014 14:22:59 +0900 Subject: [PATCH 025/339] =?UTF-8?q?dig.2ch.net=E6=A4=9C=E7=B4=A2=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 3 +-- doc/test.txt | 4 ++++ rep2/dig2ch.php | 5 ++++- rep2/tgrepc.php | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index fd332fccd..84e50e2c7 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_test', // rep2の名前 - 'p2version' => '140718.2130', // rep2のバージョン + 'p2version' => '1140907.1420', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; @@ -80,7 +80,6 @@ function p2_init() $_conf['expack.history_url'] = 'http://page2.skr.jp/rep2/history.html'; $_conf['expack.tgrep_url'] = 'http://page2.xrea.jp/tgrep/search'; $_conf['test.dig2ch_url'] = 'http://dig.2ch.net/'; - //$_conf['test.dig2ch_url'] = 'http://dig.2ch.net/?AndOr=0&maxResult=100&atLeast=1&Sort=5&Link=1&Bbs=all&924=1&json=1&keywords='; $_conf['expack.gate_php'] = 'http://page2.skr.jp/gate.php'; $_conf['menu_php'] = 'menu.php'; $_conf['subject_php'] = 'subject.php'; diff --git a/doc/test.txt b/doc/test.txt index c47e657d0..44ef83aea 100644 --- a/doc/test.txt +++ b/doc/test.txt @@ -1,3 +1,7 @@ +2014/09/07 (140907.1420) + ・スレタイ検索でAND/OR検索ができるようにする + ・半角スペース、全角スペースの処理 + 2014/09/03 (140903.1600)  ・dig.2ch.netでスレタイが検索できるようにした (tgrepc.phpの変更、dig2ch.php作成) diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php index faf87e722..75c95fbff 100644 --- a/rep2/dig2ch.php +++ b/rep2/dig2ch.php @@ -5,6 +5,10 @@ function dig2chsearch($query) global $_conf; parse_str($query, $query_arry); + + //$query_q = preg_replace('/(\s+)/' , '\+' ,$query_arry['q']); + $query_arry['q'] = urlencode($query_arry['q']); + $client = new HTTP_Client(); $client->setDefaultHeader('User-Agent', 'p2-tgrep-client'); $code = $client->get($_conf['test.dig2ch_url'] . '?AndOr=' . $query_arry['AndOr'] . '&maxResult=' . $query_arry['maxResult'] . '&atLeast=1&Sort=' . $query_arry['Sort'] . '&Link=1&Bbs=all&924=' . $query_arry['924'] . '&json=1&keywords=' . $query_arry['q']); @@ -17,7 +21,6 @@ function dig2chsearch($query) $jsontest1 = json_decode($response['body'], true); - //mb_convert_variables('SHIFT-JIS','UTF-8',$jsontest1); /* switch (json_last_error()) { case JSON_ERROR_NONE: diff --git a/rep2/tgrepc.php b/rep2/tgrepc.php index 9ed82b595..71df610fc 100644 --- a/rep2/tgrepc.php +++ b/rep2/tgrepc.php @@ -42,7 +42,7 @@ $query_params = array(); if (isset($_GET['Q']) && is_string($_GET['Q']) && strlen($_GET['Q']) > 0) { - $query_params['q'] = $_GET['Q']; + $query_params['q'] = mb_convert_kana($_GET['Q'], 's'); $query_params['n'] = $limit = ($_conf['ktai'] || $_conf['iphone']) ? '25' : '100'; if (isset($_GET['AndOr'])) { $query_params['AndOr'] = $_GET['AndOr'];} if (isset($_GET['maxResult'])) { $query_params['maxResult'] = $_GET['maxResult'];} From 136f8ead4fd88c8fcf2bbabd096e60d692f60950 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 4 Mar 2015 21:51:46 +0900 Subject: [PATCH 026/339] =?UTF-8?q?*=20=E3=83=AD=E3=83=BC=E3=82=AB?= =?UTF-8?q?=E3=83=AB=E6=9D=BF=E4=B8=80=E8=A6=A7=E7=94=A8.brd=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE=E7=BD=AE=E3=81=8D=E5=A0=B4?= =?UTF-8?q?=E6=89=80=E3=82=92/rep2/board=E3=81=8B=E3=82=89$=5Fconf['data?= =?UTF-8?q?=5Fdir']/brard=E3=81=AB=E5=A4=89=E6=9B=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/BrdCtl.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/BrdCtl.php b/lib/BrdCtl.php index 66ca87942..b73482b4b 100644 --- a/lib/BrdCtl.php +++ b/lib/BrdCtl.php @@ -30,8 +30,9 @@ static public function read_brds() */ static public function read_brd_dir() { + global $_conf; $brd_menus = array(); - $brd_dir = './board'; + $brd_dir = $_conf['data_dir'] . '/board'; if ($cdir = @dir($brd_dir)) { // ディレクトリ走査 From 63858f543ea6206a170c81b328fb474562b2a311 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 4 Mar 2015 22:01:15 +0900 Subject: [PATCH 027/339] =?UTF-8?q?2ch=20API=E5=AF=BE=E5=BF=9C=E3=83=91?= =?UTF-8?q?=E3=83=83=E3=83=81=E9=81=A9=E7=94=A8=E3=80=80http://anago.2ch.n?= =?UTF-8?q?et/test/read.cgi/software/1406547695/983?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 1 + conf/conf_user_def.inc.php | 17 +++ lib/ThreadRead.php | 275 ++++++++++++++++++++++++++++++++++++- lib/auth2chapi.inc.php | 92 +++++++++++++ rep2/edit_conf_user.php | 18 +++ 5 files changed, 402 insertions(+), 1 deletion(-) create mode 100644 lib/auth2chapi.inc.php diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 84e50e2c7..2fec7aee8 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -262,6 +262,7 @@ function p2_init() 'auth_user_file' => 'p2_auth_user.php', // 認証ユーザ設定ファイル(データPHP) 'login_log_file' => 'p2_login.log.php', // ログイン履歴 (データPHP) 'login_failed_log_file' => 'p2_login_failed.dat.php', // ログイン失敗履歴 (データPHP) + 'sid2chapi_php' => 'p2_sid2chapi.php', // 2ch APIセッションID記録ファイル (データPHP) ); foreach ($preferences as $k => $v) { $_conf[$k] = $_conf['pref_dir'] . '/' . $v; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 644e4fe4f..7ba4dae49 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -373,6 +373,23 @@ $conf_user_def['ngaborn_purge_aborn'] = 0; // (0) $conf_user_rad['ngaborn_purge_aborn'] = array('1' => 'はい', '0' => 'いいえ'); +// }}} +// {{{ 2ch API + +// 2ch API を使用する +$conf_user_def['2chapi_use'] = 1; // (1) +$conf_user_rad['2chapi_use'] = array('1' => 'する', '0' => 'しない'); + +// 2ch API 認証時に●(浪人)IDを送信する +$conf_user_def['2chapi_rounin'] = 0; // (0) +$conf_user_rad['2chapi_rounin'] = array('1' => 'する', '0' => 'しない'); + +// APPKey +$conf_user_def['2chapi_appkey'] = ""; // ("") + +// HMKey +$conf_user_def['2chapi_hmkey'] = ""; // ("") + // }}} // {{{ ETC diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 04680be75..e6e13f5c5 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -113,12 +113,282 @@ public function downloadDat() // 2ch or 2ch互換 } elseif (P2Util::isHost2chs($this->host) && !empty($_GET['shirokuma'])) { - $this->_downloadDat2chMaru($uaMona, $SID2ch, 'shirokuma'); + $this->_downloadDat2chMaru($uaMona, $SID2ch, 'shirokuma'); + //2ch はAPI経由で落とす + } elseif (P2Util::isHost2chs($this->host) && $_conf['2chapi_use'] == 1 && empty($_GET['olddat'])) { + $AppKey = $_conf['2chapi_appkey']; + $HMKey = $_conf['2chapi_hmkey']; + + // ログインしてなければ or ログイン後、55分以上経過していたら自動再ログイン + if (!file_exists($_conf['sid2chapi_php']) || + !empty($_REQUEST['relogin2chapi']) || + (filemtime($_conf['sid2chapi_php']) < time() - 60*55)) + { + if (!function_exists('authenticate_2chapi')) { + include P2_LIB_DIR . '/auth2chapi.inc.php'; + } + if (!authenticate_2chapi($AppKey,$HMKey)) { + $this->getdat_error_msg_ht .= $this->get2chDatError(); + $this->diedat = true; + return false; + } + } + + include $_conf['sid2chapi_php']; + $this->_downloadDat2chAPI($AppKey,$HMKey,$SID2chAPI,$this->length); } else { + //2ch 以外の外部板 // DATを差分DLする $this->_downloadDat2ch($this->length); } + } + } + + // }}} + // {{{ _downloadDat2chAPI() + + /** + * 2chAPIで DAT を差分ダウンロードする + * + * @return mix 取得できたか、更新がなかった場合はtrueを返す + */ + protected function _downloadDat2chAPI($AppKey,$HMKey,$sid,$from_bytes) + { + global $_conf; + global $debug; + + if (!($this->host && $this->bbs && $this->key)) { + return false; + } + + if ($sid == '') { + return false; + } + + $from_bytes = intval($from_bytes); + + if ($from_bytes == 0) { + $zero_read = true; + } else { + $zero_read = false; + $from_bytes = $from_bytes - 1; + } + + $serverName = explode('.', $this->host); + //$url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; + //$url="http://news2.2ch.net/test/read.cgi?bbs=newsplus&key=1038486598"; + $url = 'https://api.2ch.net/v1/'.$serverName[0].'/'.$this->bbs.'/'.$this->key; + $message = '/v1/'.$serverName[0].'/'.$this->bbs.'/'.$this->key.$sid.$AppKey; + $HB = hash_hmac("sha256", $message, $HMKey); + + $headers = "User-Agent: Mozilla/3.0 (compatible; JaneStyle/3.80β)\r\n"; + $headers .= "Connection: close\r\n"; + $headers .= "Content-Type: application/x-www-form-urlencoded\r\n"; + + $purl = parse_url($url); // URL分解 + + if (!$zero_read) { + $headers .= "Range: bytes={$from_bytes}-\r\n"; + } + + if ($this->modified) { + $headers .= "If-Modified-Since: {$this->modified}\r\n"; + } + + // Basic認証用のヘッダ + if (isset($purl['user']) && isset($purl['pass'])) { + $headers .= "Authorization: Basic ".base64_encode($purl['user'].":".$purl['pass'])."\r\n"; + } + + $post_values = array( + 'sid' => $sid, + 'hobo' => $HB, + 'appkey' => $AppKey, + ); + + $http = array( + 'method' => 'POST', + 'header' => $headers, + 'ignore_errors'=> true, + 'content' => http_build_query($post_values), + ); + + // プロキシ + if ($_conf['proxy_use']) { + $http += array('proxy' => 'tcp://'.$_conf['proxy_host'].":".$_conf['proxy_port']); + $http += array('request_fulluri' => true); + } + + $options = array('http' => $http); + + // WEBサーバへ接続 + $fp = @fopen($url, 'r', false, stream_context_create($options)); + if (!$fp) { + self::_pushInfoConnectFailed($url, $errno, $errstr); + $this->diedat = true; + return false; + } + stream_set_timeout($fp, $_conf['http_read_timeout'], 0); + + $body = ''; + $code = null; + $start_here = false; + while (!p2_stream_eof($fp, $timed_out)) { + + if ($start_here) { + + if ($code == '200' || $code == '206') { + + while (!p2_stream_eof($fp, $timed_out)) { + $body .= fread($fp, 4096); + } + + if ($timed_out) { + self::_pushInfoReadTimedOut($url); + $this->diedat = true; + fclose($fp); + return false; + } + //1行目を少し切り出す + $firstmsg = substr($body, 0, 50); + if(strstr($firstmsg, 'ng')) { + //ngで始まってたらapiのエラー + fclose($fp); + if (strstr($firstmsg, "not valid")) { + //sidが無効になった可能性。もう一回認証するため最初からやり直し。 + if (empty($_REQUEST['relogin2chapi'])) { + $_REQUEST['relogin2chapi'] = true; + return $this->downloadDat(); + } + } + $this->getdat_error_msg_ht .= "

        rep2 error: API経由でのスレッド取得に失敗しました。".trim($firstmsg)."

        "; + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&relogin2chapi=true\">APIで再取得を試みる]"; + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&olddat=true\">旧datで再取得を試みる]"; + $this->diedat = true; + return false; + + } + unset($firstmsg); + + // 末尾の改行であぼーんチェック + if (!$zero_read) { + if (substr($body, 0, 1) != "\n") { + //echo "あぼーん検出"; + fclose($fp); + $this->onbytes = 0; + $this->modified = null; + return $this->_downloadDat2chAPI($AppKey,$HMKey,$sid,0); // あぼーん検出。全部取り直し。 + } + $body = substr($body, 1); + } + + $file_append = ($zero_read) ? 0 : FILE_APPEND; + + if (FileCtl::file_write_contents($this->keydat, $body, $file_append) === false) { + p2die('cannot write file.'); + } + + //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("dat_size_check"); + // 取得後サイズチェック + if ($zero_read == false && $this->onbytes) { + $this->getDatBytesFromLocalDat(); // $aThread->length をset + if ($this->onbytes != $this->length) { + fclose($fp); + $this->onbytes = 0; + $this->modified = null; + P2Util::pushInfoHtml("

        rep2 info: {$this->onbytes}/{$this->length} ファイルサイズが変なので、datを再取得

        "); + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("dat_size_check"); + return $this->_downloadDat2chAPI($AppKey,$HMKey,$sid,0); //datサイズは不正。全部取り直し。 + + // サイズが同じならそのまま + } elseif ($this->onbytes == $this->length) { + fclose($fp); + $this->isonline = true; + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('dat_size_check'); + return true; + } + } + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('dat_size_check'); + + // スレッドがないと判断 + } else { + fclose($fp); + return $this->_downloadDat2chNotFound($code); + } + + } else { + $meta = stream_get_meta_data($fp); + foreach($meta['wrapper_data'] as $l) + { + // ex) HTTP/1.1 304 Not Modified + if (preg_match('@^HTTP/1\\.\\d (\\d+) (.+)@i', $l, $matches)) { + $code = $matches[1]; + + if ($code == '200' || $code == '206') { // Partial Content + ; + + } elseif ($code == '302') { // Found + + // ホストの移転を追跡 + $new_host = BbsMap::getCurrentHost($this->host, $this->bbs); + if ($new_host != $this->host) { + fclose($fp); + $this->old_host = $this->host; + $this->host = $new_host; + return $this->_downloadDat2chAPI($AppKey,$HMKey,$sid,$from_bytes); + } else { + fclose($fp); + return $this->_downloadDat2chNotFound($code); + } + + } elseif ($code == '304') { // Not Modified + fclose($fp); + $this->isonline = true; + return '304 Not Modified'; + + } elseif ($code == '416') { // Requested Range Not Satisfiable + //echo "あぼーん検出"; + fclose($fp); + $this->onbytes = 0; + $this->modified = null; + return $this->_downloadDat2chAPI($AppKey,$HMKey,$sid,0); // あぼーん検出。全部取り直し。 + + } else { + fclose($fp); + return $this->_downloadDat2chNotFound($code); + } + } + + if ($zero_read) { + if (preg_match('/^Content-Length: ([0-9]+)/i', $l, $matches)) { + $this->onbytes = intval($matches[1]); + } + } else { + + if (preg_match('@^Content-Range: bytes ([^/]+)/([0-9]+)@i', $l, $matches)) { + $this->onbytes = intval($matches[2]); + } + + } + + if (preg_match('/^Last-Modified: (.+)/i', $l, $matches)) { + //echo $matches[1] . '
        '; //debug + $this->modified = $matches[1]; + } + } + $start_here = true; + } + } + + fclose($fp); + if ($timed_out) { + self::_pushInfoReadTimedOut($url); + $this->diedat = true; + return false; + } else { + $this->isonline = true; + return true; } } @@ -760,6 +1030,9 @@ public function get2chDatError($code = null) $reason = 'kakohtml'; } } + } elseif (P2Util::isHost2chs($this->host) && $code == '404') { + //APIの為404だったら過去ログと決めつけとく(fix Here) + $reason = 'datochi'; } $read_url = "http://{$this->host}/test/read.cgi/{$this->bbs}/{$this->key}/"; diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php new file mode 100644 index 000000000..dc697b8c6 --- /dev/null +++ b/lib/auth2chapi.inc.php @@ -0,0 +1,92 @@ + $login2chID, + 'PW' => $login2chPW, + 'KY' => $AppKey, + 'CT' => $CT, + 'HB' => $HB, + ); + $options = array('http' => array( + 'ignore_errors' => true, + 'method' => 'POST', + 'header' => implode("\r\n", array( + 'User-Agent: Monazilla/1.3', + 'X-2ch-UA: JaneStyle/3.80', + 'Content-Type: application/x-www-form-urlencoded', + )), + 'content' => http_build_query($values), + )); + + // プロキシ + if ($_conf['proxy_use']) { + $options['http'] += array('proxy' => 'tcp://'.$_conf['proxy_host'].":".$_conf['proxy_port']); + $options['http'] += array('request_fulluri' => true); + } + + $response = ''; + $response = file_get_contents($url, false, stream_context_create($options)); + + if(file_exists($_conf['sid2chapi_php'])) { + unlink($_conf['sid2chapi_php']); + } + + if (strpos($response, ':') != false) + { + $sid = explode(':', $response); + + P2Util::pushInfoHtml($response); + + if($sid[0]!='SESSION-ID=Monazilla/1.00') { + P2Util::pushInfoHtml("

        p2 Error: 2ch API のSessionIDを取得出来ませんでした。

        "); + return ''; + } + + $cont = sprintf('p2 Error: {$_conf['sid2chapi_php']} を保存できませんでした。ログイン登録失敗。

        "); + return ''; + } + + return $sid[1]; + } + + return ''; + } +// }}} + +/* + * Local Variables: + * mode: php + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ +// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index 1dcc97fcd..11a52d760 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -359,6 +359,24 @@ printEditConfGroupHtml($groupname, $conflist, $flags); } +// }}} +// {{{ '2ch API' + +$groupname = '2ch API'; +$groups[] = $groupname; +$flags = getGroupShowFlags($groupname); +if ($flags & P2_EDIT_CONF_USER_SKIPPED) { + $keep_old = true; +} else { + $conflist = array( + array('2chapi_use','2ch API を使用する'), + array('2chapi_rounin','2ch API 認証時に●(浪人)IDを送信する(人柱機能)'), + array('2chapi_appkey','AppKey'), + array('2chapi_hmkey','HMkey'), + ); + printEditConfGroupHtml($groupname, $conflist, $flags); +} + // }}} // {{{ ETC From e9a4c419604fd5d3d176e1fc92a4571d6ec6a6ea Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 4 Mar 2015 22:48:29 +0900 Subject: [PATCH 028/339] =?UTF-8?q?2ch=20API=E3=81=AE=E8=AA=8D=E8=A8=BC?= =?UTF-8?q?=E3=82=92=E5=B7=A6=E3=83=A1=E3=83=8B=E3=83=A5=E3=83=BC=E3=81=AE?= =?UTF-8?q?=E3=83=AD=E3=82=B0=E3=82=A4=E3=83=B3=E7=AE=A1=E7=90=86=E3=81=8B?= =?UTF-8?q?=E3=82=89=E6=89=8B=E5=8B=95=E3=81=A7=E5=87=BA=E6=9D=A5=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F=E3=80=82=202ch=20?= =?UTF-8?q?API=E3=81=AE=E8=AA=8D=E8=A8=BC=E9=96=93=E9=9A=94=E3=82=92?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=97=E3=81=9F=E3=80=82=20debug=E7=94=A8=E3=81=AE?= =?UTF-8?q?=E3=83=A1=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=81=8C=E5=87=BA?= =?UTF-8?q?=E3=81=A3=E3=81=B1=E3=81=AA=E3=81=97=E3=81=A0=E3=81=A3=E3=81=9F?= =?UTF-8?q?=E3=81=AE=E3=81=A7=E8=A8=AD=E5=AE=9A=E3=81=A7=E5=88=87=E3=82=8A?= =?UTF-8?q?=E6=9B=BF=E3=81=88=E3=82=8B=E3=81=93=E3=81=A8=E3=81=8C=E5=87=BA?= =?UTF-8?q?=E6=9D=A5=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_user_def.inc.php | 11 +++ lib/ThreadRead.php | 25 +++--- lib/auth2chapi.inc.php | 17 +++- rep2/auth2chapi.php | 162 +++++++++++++++++++++++++++++++++++++ rep2/edit_conf_user.php | 7 ++ rep2/setting.php | 1 + 6 files changed, 208 insertions(+), 15 deletions(-) create mode 100644 rep2/auth2chapi.php diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 7ba4dae49..55cfaeb4e 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -384,12 +384,23 @@ $conf_user_def['2chapi_rounin'] = 0; // (0) $conf_user_rad['2chapi_rounin'] = array('1' => 'する', '0' => 'しない'); +// 2ch API 認証する間隔(単位:時間) +$conf_user_def['2chapi_interval'] = 1; // (1) +$conf_user_rules['2chapi_interval'] = array('emptyToDef', 'notIntExceptMinusToDef'); + // APPKey $conf_user_def['2chapi_appkey'] = ""; // ("") // HMKey $conf_user_def['2chapi_hmkey'] = ""; // ("") +// AppName +$conf_user_def['2chapi_appname'] = ""; // ("") + +// デバッグ用の情報を出力する +$conf_user_def['2chapi_debug_print'] = 0; // (0) +$conf_user_rad['2chapi_debug_print'] = array('1' => 'する', '0' => 'しない'); + // }}} // {{{ ETC diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index e6e13f5c5..68d4b7b9c 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -116,18 +116,16 @@ public function downloadDat() $this->_downloadDat2chMaru($uaMona, $SID2ch, 'shirokuma'); //2ch はAPI経由で落とす } elseif (P2Util::isHost2chs($this->host) && $_conf['2chapi_use'] == 1 && empty($_GET['olddat'])) { - $AppKey = $_conf['2chapi_appkey']; - $HMKey = $_conf['2chapi_hmkey']; - // ログインしてなければ or ログイン後、55分以上経過していたら自動再ログイン + // ログインしてなければ or ログイン後、設定した時間経過していたら自動再ログイン if (!file_exists($_conf['sid2chapi_php']) || !empty($_REQUEST['relogin2chapi']) || - (filemtime($_conf['sid2chapi_php']) < time() - 60*55)) + (filemtime($_conf['sid2chapi_php']) < time() - 60*60*$_conf['2chapi_interval'])) { if (!function_exists('authenticate_2chapi')) { include P2_LIB_DIR . '/auth2chapi.inc.php'; } - if (!authenticate_2chapi($AppKey,$HMKey)) { + if (!authenticate_2chapi()) { $this->getdat_error_msg_ht .= $this->get2chDatError(); $this->diedat = true; return false; @@ -135,7 +133,7 @@ public function downloadDat() } include $_conf['sid2chapi_php']; - $this->_downloadDat2chAPI($AppKey,$HMKey,$SID2chAPI,$this->length); + $this->_downloadDat2chAPI($SID2chAPI,$this->length); } else { //2ch 以外の外部板 // DATを差分DLする @@ -152,11 +150,14 @@ public function downloadDat() * * @return mix 取得できたか、更新がなかった場合はtrueを返す */ - protected function _downloadDat2chAPI($AppKey,$HMKey,$sid,$from_bytes) + protected function _downloadDat2chAPI($sid,$from_bytes) { global $_conf; global $debug; + $AppKey = $_conf['2chapi_appkey']; + $AppName = $_conf['2chapi_appname']; + $HMKey = $_conf['2chapi_hmkey']; if (!($this->host && $this->bbs && $this->key)) { return false; } @@ -181,7 +182,7 @@ protected function _downloadDat2chAPI($AppKey,$HMKey,$sid,$from_bytes) $message = '/v1/'.$serverName[0].'/'.$this->bbs.'/'.$this->key.$sid.$AppKey; $HB = hash_hmac("sha256", $message, $HMKey); - $headers = "User-Agent: Mozilla/3.0 (compatible; JaneStyle/3.80β)\r\n"; + $headers = "User-Agent: Mozilla/3.0 (compatible; ${AppName})\r\n"; $headers .= "Connection: close\r\n"; $headers .= "Content-Type: application/x-www-form-urlencoded\r\n"; @@ -278,7 +279,7 @@ protected function _downloadDat2chAPI($AppKey,$HMKey,$sid,$from_bytes) fclose($fp); $this->onbytes = 0; $this->modified = null; - return $this->_downloadDat2chAPI($AppKey,$HMKey,$sid,0); // あぼーん検出。全部取り直し。 + return $this->_downloadDat2chAPI($sid,0); // あぼーん検出。全部取り直し。 } $body = substr($body, 1); } @@ -299,7 +300,7 @@ protected function _downloadDat2chAPI($AppKey,$HMKey,$sid,$from_bytes) $this->modified = null; P2Util::pushInfoHtml("

        rep2 info: {$this->onbytes}/{$this->length} ファイルサイズが変なので、datを再取得

        "); //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("dat_size_check"); - return $this->_downloadDat2chAPI($AppKey,$HMKey,$sid,0); //datサイズは不正。全部取り直し。 + return $this->_downloadDat2chAPI($sid,0); //datサイズは不正。全部取り直し。 // サイズが同じならそのまま } elseif ($this->onbytes == $this->length) { @@ -336,7 +337,7 @@ protected function _downloadDat2chAPI($AppKey,$HMKey,$sid,$from_bytes) fclose($fp); $this->old_host = $this->host; $this->host = $new_host; - return $this->_downloadDat2chAPI($AppKey,$HMKey,$sid,$from_bytes); + return $this->_downloadDat2chAPI($sid,$from_bytes); } else { fclose($fp); return $this->_downloadDat2chNotFound($code); @@ -352,7 +353,7 @@ protected function _downloadDat2chAPI($AppKey,$HMKey,$sid,$from_bytes) fclose($fp); $this->onbytes = 0; $this->modified = null; - return $this->_downloadDat2chAPI($AppKey,$HMKey,$sid,0); // あぼーん検出。全部取り直し。 + return $this->_downloadDat2chAPI($sid,0); // あぼーん検出。全部取り直し。 } else { fclose($fp); diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index dc697b8c6..8739ff377 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -11,16 +11,24 @@ * * @return mix 取得できた場合はSIDを返す */ - function authenticate_2chapi($AppKey, $HMKey) + function authenticate_2chapi() { global $_conf; $url = 'https://api.2ch.net/v1/auth/'; $CT = time(); + $AppKey = $_conf['2chapi_appkey']; + $AppName = $_conf['2chapi_appname']; + $HMKey = $_conf['2chapi_hmkey']; $login2chID = ""; $login2chPW = ""; $message = $AppKey.$CT; $HB = hash_hmac("sha256", $message, $HMKey); + if(empty($AppKey) || empty($AppName) || empty($HMKey)) { + P2Util::pushInfoHtml("

        p2 Error: 2ch API の認証に必要な情報が設定されていません。

        "); + return ''; + } + if ($_conf['2chapi_rounin'] == 1&& $array = P2Util::readIdPw2ch()) { list($login2chID, $login2chPW, $autoLogin2ch) = $array; } @@ -37,7 +45,7 @@ function authenticate_2chapi($AppKey, $HMKey) 'method' => 'POST', 'header' => implode("\r\n", array( 'User-Agent: Monazilla/1.3', - 'X-2ch-UA: JaneStyle/3.80', + 'X-2ch-UA: '.$AppName, 'Content-Type: application/x-www-form-urlencoded', )), 'content' => http_build_query($values), @@ -60,7 +68,10 @@ function authenticate_2chapi($AppKey, $HMKey) { $sid = explode(':', $response); - P2Util::pushInfoHtml($response); + if($_conf['2chapi_debug_print']==1) + { + P2Util::pushInfoHtml($response); + } if($sid[0]!='SESSION-ID=Monazilla/1.00') { P2Util::pushInfoHtml("

        p2 Error: 2ch API のSessionIDを取得出来ませんでした。

        "); diff --git a/rep2/auth2chapi.php b/rep2/auth2chapi.php new file mode 100644 index 000000000..e415cffc5 --- /dev/null +++ b/rep2/auth2chapi.php @@ -0,0 +1,162 @@ +authorize(); // ユーザ認証 + +//================================================================ +// 変数 +//================================================================ +global $_conf; +$AppKey = $_conf['2chapi_appkey']; +$AppName = $_conf['2chapi_appname']; +$HMKey = $_conf['2chapi_hmkey']; + +//============================================================== +// 2chログイン処理 +//============================================================== +if (isset($_GET['login2chapi'])) { + if ($_GET['login2chapi'] == "in") { + require_once P2_LIB_DIR . '/auth2chapi.inc.php'; + authenticate_2chapi(); + } elseif ($_GET['login2chapi'] == "out") { + if (file_exists($_conf['sid2chapi_php'])) { + unlink($_conf['sid2chapi_php']); + } + } +} + +//================================================================ +// ヘッダ +//================================================================ +if ($_conf['ktai']) { + $login_st = "ログイン"; + $logout_st = "ログアウト"; + $password_st = "パスワード"; +} else { + $login_st = "ログイン"; + $logout_st = "ログアウト"; + $password_st = "パスワード"; +} + +if (file_exists($_conf['sid2chapi_php'])) { // 2ch●書き込み + $ptitle = "●2ch API 認証管理"; +} else { + $ptitle = "2ch API 認証管理"; +} + +P2Util::header_nocache(); +echo $_conf['doctype']; +echo << + + + + + + {$_conf['extra_headers_ht']} + {$ptitle}\n +EOP; + +if (!$_conf['ktai']) { + echo << + + + \n +EOP; +} + +$body_at = ($_conf['ktai']) ? $_conf['k_colors'] : ' onload="setWinTitle();"'; + +if (!$_conf['ktai']) { + echo <<ログイン管理 > {$ptitle}

        +EOP; +} + +P2Util::printInfoHtml(); + +//================================================================ +// 2ch API ログインフォーム +//================================================================ + +// ログイン中なら +if (file_exists($_conf['sid2chapi_php'])) { + $idsub_str = "再認証する"; + $form_now_log = << + 現在、2ちゃんねる API 認証中です + {$_conf['k_input_ht']} + + + \n +EOFORM; + +} else { + $idsub_str = "認証する"; + $form_now_log = "2ちゃんねる API 認証していません

        "; +} + +if ($autoLogin2ch) { + $autoLogin2ch_checked = ' checked="checked"'; +} else { + $autoLogin2ch_checked = ''; +} + +$tora3_url = "http://2ch.tora3.net/"; +$tora3_url_r = P2Util::throughIme($tora3_url); + +if (!$_conf['ktai']) { + $id_input_size_at = " size=\"30\""; + $pass_input_size_at = " size=\"24\""; +} + +// プリント ================================= +echo "
        "; +echo $form_now_log; +echo "
        "; + +if ($_conf['ktai']) { + echo "
        "; +} + +echo << + {$_conf['k_input_ht']} + AppKey: "{$AppKey}"
        + HMKey: "{$HMKey}"
        + AppName: "{$AppName}"
        + 認証情報はユーザ設定編集で変更できます。
        + + +\n +EOFORM; + +if ($_conf['ktai']) { + echo "
        "; +} + +//================================================================ +// フッタHTML表示 +//================================================================ + +if ($_conf['ktai']) { + echo "
        {$_conf['k_to_index_ht']}
        "; +} + +echo ''; + +/* + * Local Variables: + * mode: php + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ +// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index 11a52d760..d4eee2a71 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -371,8 +371,15 @@ $conflist = array( array('2chapi_use','2ch API を使用する'), array('2chapi_rounin','2ch API 認証時に●(浪人)IDを送信する(人柱機能)'), + array('2chapi_interval','2ch API 認証する間隔(単位:時間)'), + //'API キー', + 'API認証情報', array('2chapi_appkey','AppKey'), array('2chapi_hmkey','HMkey'), + array('2chapi_appname','AppName APIに送信するアプリケーション名 例:Hoge/1.00'), + 'デバッグ用', + array('2chapi_debug_print','デバッグ用の情報を出力する'), + '認証情報を変更した場合再認証してください', ); printEditConfGroupHtml($groupname, $conflist, $flags); } diff --git a/rep2/setting.php b/rep2/setting.php index 743daa377..e4b86d094 100644 --- a/rep2/setting.php +++ b/rep2/setting.php @@ -90,6 +90,7 @@ EOP; From 4111e7e537e9dceb6304850485d2172c458c714b Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 5 Mar 2015 08:38:49 +0900 Subject: [PATCH 029/339] =?UTF-8?q?=E3=82=B9=E3=83=AC=E3=82=BF=E3=82=A4?= =?UTF-8?q?=E6=A4=9C=E7=B4=A2=E3=81=A7=E8=A1=A8=E7=A4=BA=E4=BB=B6=E6=95=B0?= =?UTF-8?q?=E3=81=8C=E6=8C=87=E5=AE=9A=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84?= =?UTF-8?q?=E3=81=AA=E3=81=84=E3=81=A8=E3=81=8D=E3=81=AF50=E4=BB=B6?= =?UTF-8?q?=E3=81=A8=E8=A6=8B=E3=81=AA=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/tgrepc.php | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/rep2/tgrepc.php b/rep2/tgrepc.php index 71df610fc..e1d4ac85b 100644 --- a/rep2/tgrepc.php +++ b/rep2/tgrepc.php @@ -45,7 +45,11 @@ $query_params['q'] = mb_convert_kana($_GET['Q'], 's'); $query_params['n'] = $limit = ($_conf['ktai'] || $_conf['iphone']) ? '25' : '100'; if (isset($_GET['AndOr'])) { $query_params['AndOr'] = $_GET['AndOr'];} - if (isset($_GET['maxResult'])) { $query_params['maxResult'] = $_GET['maxResult'];} + if (isset($_GET['maxResult'])) { + $query_params['maxResult'] = $_GET['maxResult']; + } else { + $query_params['maxResult'] = '50'; + } if (isset($_GET['Sort'])) { $query_params['Sort'] = $_GET['Sort'];} if (isset($_GET['Link'])) { $query_params['Link'] = $_GET['Link'];} if (isset($_GET['924'])) { $query_params['924'] = $_GET['924'];} @@ -348,23 +352,23 @@ function tgrep_search($query) { global $_conf; if (!$_conf['test.search_dig2ch']) { - $client = new HTTP_Client(); - $client->setDefaultHeader('User-Agent', 'p2-tgrep-client'); - $code = $client->get($_conf['expack.tgrep_url'] . '?' . $query); - if (PEAR::isError($code)) { - p2die($code->getMessage()); - } elseif ($code != 200) { - p2die("HTTP Error - {$code}"); - } - $response = $client->currentResponse(); - $result = unserialize($response['body']); - if (!$result) { - p2die('Error: 検索結果の展開に失敗しました。'); - } - return $result; + $client = new HTTP_Client(); + $client->setDefaultHeader('User-Agent', 'p2-tgrep-client'); + $code = $client->get($_conf['expack.tgrep_url'] . '?' . $query); + if (PEAR::isError($code)) { + p2die($code->getMessage()); + } elseif ($code != 200) { + p2die("HTTP Error - {$code}"); + } + $response = $client->currentResponse(); + $result = unserialize($response['body']); + if (!$result) { + p2die('Error: 検索結果の展開に失敗しました。'); + } + return $result; } else { - require_once './dig2ch.php'; - return dig2chsearch($query); // 追加 + require_once './dig2ch.php'; + return dig2chsearch($query); // 追加 } } From ebfa7b1c55e5333c13df8d5ace23b862a799b683 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 5 Mar 2015 09:24:23 +0900 Subject: [PATCH 030/339] =?UTF-8?q?=E3=82=B9=E3=83=AC=E3=82=BF=E3=82=A4?= =?UTF-8?q?=E6=A4=9C=E7=B4=A2=E3=83=9A=E3=83=BC=E3=82=B8=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E3=81=AE=E6=A4=9C=E7=B4=A2=E3=83=9C=E3=82=BF=E3=83=B3=E3=82=92?= =?UTF-8?q?=E3=82=AF=E3=83=AA=E3=83=83=E3=82=AF=E3=81=97=E3=81=9F=E3=81=A8?= =?UTF-8?q?=E3=81=8D=E3=81=AB=E5=B7=A6=E3=83=A1=E3=83=8B=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E3=81=8B=E3=82=89=E6=8C=87=E5=AE=9A=E3=81=97=E3=81=9F=E6=A4=9C?= =?UTF-8?q?=E7=B4=A2=E6=9D=A1=E4=BB=B6=E3=82=92=E5=BC=95=E3=81=8D=E7=B6=99?= =?UTF-8?q?=E3=81=90=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4=20dig2ch?= =?UTF-8?q?=E3=81=AE=E5=BA=83=E5=91=8A=E8=A1=A8=E7=A4=BA=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E3=82=92=E6=9C=AB=E5=B0=BE=E3=81=AB=E5=A4=89=E6=9B=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/expack/tgrep/view.inc.php | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/expack/tgrep/view.inc.php b/lib/expack/tgrep/view.inc.php index 7b3ca63ee..25f23fb0a 100644 --- a/lib/expack/tgrep/view.inc.php +++ b/lib/expack/tgrep/view.inc.php @@ -61,6 +61,10 @@ function sf() {
        /> + + + +
        @@ -91,12 +95,6 @@ function sf() { - - - - - -
        @@ -179,6 +177,13 @@ function sf() { + + + + + + +
        @@ -189,6 +194,10 @@ function sf() {
        /> + + + +
        From 359294ddfae4cae4c2aa8fab8ba0ede70d1b1017 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 5 Mar 2015 13:02:42 +0900 Subject: [PATCH 031/339] =?UTF-8?q?=E3=81=97=E3=81=9F=E3=82=89=E3=81=B0?= =?UTF-8?q?=E3=81=AE=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=81=BF=E3=81=AB=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/post.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rep2/post.php b/rep2/post.php index d8ed63d59..ce42e20c2 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -398,7 +398,8 @@ function postIt($host, $bbs, $key, $post) $request = "{$method} {$send_path} HTTP/1.0\r\n"; $request .= "Host: {$URL['host']}\r\n"; $request .= "User-Agent: Monazilla/1.00 ({$_conf['p2ua']})\r\n"; - $request .= "Referer: http://{$URL['host']}/\r\n"; + //$request .= "Referer: http://{$URL['host']}/\r\n"; + $request .= "Referer: http://{$host}/{$bbs}/{$key}/\r\n"; // クッキー $cookies_to_send = ''; From 51ee1a36d7feee21e47695f6473ea50d4e092bf5 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 5 Mar 2015 23:49:20 +0900 Subject: [PATCH 032/339] =?UTF-8?q?=E3=82=B9=E3=83=AC=E3=83=83=E3=83=89?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=88=E3=83=AB=E3=81=8B=E3=82=89=E8=91=97?= =?UTF-8?q?=E4=BD=9C=E6=A8=A9=E8=A1=A8=E8=A8=98=E3=82=92=E5=89=8A=E9=99=A4?= =?UTF-8?q?=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=9F=20=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E2=86=92subject=E3=81=8B=E3=82=89ON=E3=81=AB=E3=81=99?= =?UTF-8?q?=E3=82=8B=E5=BF=85=E8=A6=81=E3=81=8C=E3=81=82=E3=82=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_user_def.inc.php | 8 ++++++++ lib/Thread.php | 8 ++++++++ rep2/edit_conf_user.php | 2 ++ 3 files changed, 18 insertions(+) diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 55cfaeb4e..54ec25c95 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -101,6 +101,14 @@ $conf_user_def['cmp_title_norm'] = 0; // (0) $conf_user_rad['cmp_title_norm'] = array('1' => 'する', '0' => 'しない'); +// スレッドのタイトルから著作権表記を削除する +$conf_user_def['delete_copyright'] = 0; // (0) +$conf_user_rad['delete_copyright'] = array('1' => 'する', '0' => 'しない'); + +//削除する著作権表記の文字列(カンマ区切り) +$conf_user_def['delete_copyright.list'] = "[転載禁止],©2ch.net"; +$conf_user_rules['delete_copyright.list'] = array('emptyToDef'); + // 携帯閲覧時、一度に表示するスレの数 $conf_user_def['mobile.sb_disp_range'] = 30; // (30) $conf_user_rules['mobile.sb_disp_range'] = array('emptyToDef', 'notIntExceptMinusToDef'); diff --git a/lib/Thread.php b/lib/Thread.php index 88dcb57b6..de6838704 100644 --- a/lib/Thread.php +++ b/lib/Thread.php @@ -156,6 +156,14 @@ public function __set($name, $value) */ public function setTtitle($ttitle) { + global $_conf; + + //著作権表記を除去 + if ($_conf['delete_copyright']==1) { + foreach (explode (',',$_conf['delete_copyright.list']) as $value) { + $ttitle = str_replace($value,'',$ttitle); + } + } $this->ttitle = $ttitle; } diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index d4eee2a71..23f0b43bf 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -282,6 +282,8 @@ array('cmp_dayres_midoku', '勢いソート時に新着レスのあるスレを優先'), array('cmp_title_norm', 'タイトルソート時に全角半角・大文字小文字を無視'), array('viewall_kitoku', '既得スレは表示件数に関わらず表示'), + array('delete_copyright', 'スレッドのタイトルから著作権表記を削除する'), + array('delete_copyright.list', '削除する著作権表記の文字列(カンマ区切り)'), ); printEditConfGroupHtml($groupname, $conflist, $flags); } From b26c63be5031a6404772f0811ce9381e5b3cfa45 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 6 Mar 2015 00:56:48 +0900 Subject: [PATCH 033/339] =?UTF-8?q?+live=E3=81=AE=E5=AE=9F=E6=B3=81?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=E3=81=8B=E3=82=89=E3=81=97=E3=81=9F=E3=82=89?= =?UTF-8?q?=E3=81=B0=E3=81=AB=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=82=81=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/live_post.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rep2/live_post.php b/rep2/live_post.php index 2387c29f4..bc6ae69ae 100755 --- a/rep2/live_post.php +++ b/rep2/live_post.php @@ -401,7 +401,7 @@ function postIt($host, $bbs, $key, $post) $request = "{$method} {$send_path} HTTP/1.0\r\n"; $request .= "Host: {$URL['host']}\r\n"; $request .= "User-Agent: Monazilla/1.00 ({$_conf['p2ua']})\r\n"; - $request .= "Referer: http://{$URL['host']}/\r\n"; + $request .= "Referer: http://{$host}/{$bbs}/{$key}/\r\n"; // クッキー $cookies_to_send = ''; From fef53f142dcac7a55e21606096e1e775adf3ae82 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 6 Mar 2015 00:54:30 +0900 Subject: [PATCH 034/339] =?UTF-8?q?+live=E3=81=AE=E3=83=9C=E3=82=BF?= =?UTF-8?q?=E3=83=B3ON/OFF=E3=81=AE=E8=A8=AD=E5=AE=9A=E3=82=92=E4=BD=9C?= =?UTF-8?q?=E3=81=A3=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_user_def_live.inc.php | 14 ++++++++++++++ rep2/edit_conf_user.php | 6 ++++++ 2 files changed, 20 insertions(+) diff --git a/conf/conf_user_def_live.inc.php b/conf/conf_user_def_live.inc.php index b42464f73..9ef4c138d 100755 --- a/conf/conf_user_def_live.inc.php +++ b/conf/conf_user_def_live.inc.php @@ -4,6 +4,20 @@ */ // {{{ ■表示設定 +// 実況板 +$conf_user_def['live.livebbs_list'] = "livesaturn,livevenus,liveuranus,endless,weekly,livewar,livefield,liveelection,livewkwest,livenhk,liveetv,liventv,livetbs,livecx,liveanb,livetx,livemx,livebs,livebs2,livewowow,liveskyp,liveradio,liveanime,kokkai,dome,livebase,livefoot,oonna,ootoko,dancesite,festival,jasmine,liveanarchy,livesangyou,livemarket1,livemarket2"; // ("livesaturn,livevenus,liveuranus,endless,weekly,livewar,livefield,liveelection,livewkwest,livenhk,liveetv,liventv,livetbs,livecx,liveanb,livetx,livemx,livebs,livebs2,livewowow,liveskyp,liveradio,liveanime,kokkai,dome,livebase,livefoot,oonna,ootoko,dancesite,festival,jasmine,liveanarchy,livesangyou,livemarket1,livemarket2") + +// スレッド一覧に実況表示へのリンクを表示する +$conf_user_def['live.livelink_subject'] = "2"; // ("2") +$conf_user_sel['live.livelink_subject'] = array('2' => '全ての板で表示', '1' => '実況板のみ表示', '0' => '表示しない'); + +// 'レス表示のヘッダとフッターに実況表示へのリンクを表示 +$conf_user_def['live.livelink_thread'] = "2"; // ("2") +$conf_user_sel['live.livelink_thread'] = array('2' => '全ての板で表示', '1' => '実況板のみ表示', '0' => '表示しない'); + +// 実況板のスレッドを常に実況用表示で開く +$conf_user_def['live.livebbs_forcelive'] = 0; // (0) +$conf_user_rad['live.livebbs_forcelive'] = array('1' => 'する', '0' => 'しない'); // レス表示の種類 $conf_user_def['live.view_type'] = "1"; // ("1") diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index 23f0b43bf..e1ce27bfb 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -860,6 +860,12 @@ $keep_old = true; } else { $conflist = array( + array('live.livebbs_list', '実況板(カンマ区切り)'), + '実況用表示へのリンク', + array('live.livelink_subject', 'スレッド一覧に実況用表示へのリンクを表示する'), + array('live.livelink_thread', 'レス表示のヘッダとフッターに実況用表示へのリンクを表示する'), + array('live.livebbs_forcelive', '実況板のスレッドを常に実況用表示で開く'), + 'レス表示', array('live.view_type', 'レス表示の種類'), array('live.id_b', 'ID末尾の O (携帯) P (公式p2) Q (フルブラウザ) i (iPhone)を太字に'), array('live.highlight_chain', '連鎖ハイライト (連鎖範囲は ngaborn_chain_all にて設定)'), From 7c71d4827db5e8a4ab0728d707440780f7336417 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 6 Mar 2015 11:55:33 +0900 Subject: [PATCH 035/339] =?UTF-8?q?=E3=82=B9=E3=83=AC=E3=83=83=E3=83=89?= =?UTF-8?q?=E4=B8=80=E8=A6=A7=E3=81=AE=E5=AE=9F=E6=B3=81=E3=83=9C=E3=82=BF?= =?UTF-8?q?=E3=83=B3=E5=88=87=E3=82=8A=E6=9B=BF=E3=81=88=E6=A9=9F=E8=83=BD?= =?UTF-8?q?=E3=81=A8=E5=AE=9F=E6=B3=81=E6=9D=BF=E3=81=8C=E5=B8=B8=E3=81=AB?= =?UTF-8?q?=E5=AE=9F=E6=B3=81=E3=83=A2=E3=83=BC=E3=83=89=E3=81=AB=E3=81=AA?= =?UTF-8?q?=E3=82=8B=E6=A9=9F=E8=83=BD=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/sb_print.inc.php | 48 +++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/lib/sb_print.inc.php b/lib/sb_print.inc.php index d7be3ebac..d738749d0 100644 --- a/lib/sb_print.inc.php +++ b/lib/sb_print.inc.php @@ -45,6 +45,17 @@ function sb_print($aThreadList) $ita_name_bool = false; } + // 実況版のみ発動する機能がONの時は板が実況板かどうか判断 + $livebbs_bool = false; + if($_conf['live.livelink_subject']==1||$_conf['live.livebbs_forcelive']==1) { + foreach (explode (',',$_conf['live.livebbs_list']) as $value) { + if(strpos($aThreadList->bbs, $value) !== false) { + $livebbs_bool = true; + break; + } + } + } + $norefresh_q = '&norefresh=true'; $td = array('edit' => '', 'offrec' => '', 'unum' => '', 'rescount' => '', @@ -362,12 +373,16 @@ function sb_print($aThreadList) } $thre_url = "{$_conf['read_php']}?{$host_bbs_key_q}{$rescount_q}{$offline_q}{$word_q}{$anum_ht}"; - // +live リンク表示切替 - $ttitle_en = UrlSafeBase64::encode($aThread->ttitle); - $ttitle_urlen = rawurlencode($ttitle_en); - $ttitle_en_q ="&ttitle_en=".$ttitle_urlen; + // +live リンク表示切替 + if($_conf['live.livelink_subject']==2||$livebbs_bool) + { + $ttitle_en = UrlSafeBase64::encode($aThread->ttitle); + $ttitle_urlen = rawurlencode($ttitle_en); + $ttitle_en_q ="&ttitle_en=".$ttitle_urlen; - $live_url = "live_frame.php?{$host_bbs_key_q}&live=1{$ttitle_en_q}{$rescount_q}{$anum_ht}"; + $live_url = "live_frame.php?{$host_bbs_key_q}&live=1{$ttitle_en_q}{$rescount_q}{$anum_ht}"; + + } // オンリー>>1 if ($only_one_bool) { @@ -441,22 +456,31 @@ function sb_print($aThreadList) $birthday = date('y/m/d', $aThread->key); // (y/m/d H:i) $td['birth'] = "{$birthday}\n"; + // +live 実況ボタンの処理 + // +live スレのリンク先を実況に書き換える + if($_conf['live.livebbs_forcelive']==1&&$livebbs_bool) { + $thre_url = $live_url; + } elseif (isset($live_url)) { + // +live 実況中ic2のサムネイル作成をonoff + if ($_conf['expack.ic2.enabled'] + && (!$_conf['live.ic2_onoff'])) { + $live_ic2_off = "onclick=\"javascript:parent.menu.ic2_menu_switch(0);\""; + } + $livelink_body = <<+live  +EOP; + } + //==================================================================================== // スレッド一覧 table ボディ HTMLプリント //==================================================================================== - // +live 実況中ic2のサムネイル作成をonoff - if ($_conf['expack.ic2.enabled'] - && (!$_conf['live.ic2_onoff'])) { - $live_ic2_off = "onclick=\"javascript:parent.menu.ic2_menu_switch(0);\""; - } - // ボディ echo << {$td['edit']}{$td['offrec']}{$td['unum']}{$td['rescount']}{$td['one']}{$td['checkbox']}{$torder_ht}
        {$moto_thre_ht} -+live  +{$livelink_body} {$ttitle_ht}
        {$td['ita']}{$td['spd']}{$td['ikioi']}{$td['birth']}{$td['fav']}\n EOR; From 1ab5ba3b473a8898201e0988595f797476a75296 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 6 Mar 2015 13:27:20 +0900 Subject: [PATCH 036/339] =?UTF-8?q?=E3=82=B9=E3=83=AC=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=81=AE=E3=83=98=E3=83=83=E3=83=80=E3=81=A8=E3=83=95=E3=83=83?= =?UTF-8?q?=E3=82=BF=E3=81=AB=E5=AE=9F=E6=B3=81=E3=83=AA=E3=83=B3=E3=82=AF?= =?UTF-8?q?=E3=82=92=E8=A1=A8=E7=A4=BA=E5=87=BA=E6=9D=A5=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F=E3=80=82=20=E7=B7=8F?= =?UTF-8?q?=E4=BB=95=E4=B8=8A=E3=81=92=E3=82=82=E5=90=AB=E3=82=80=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/read_header.inc.php | 24 +++++++++++++++++++++++- lib/sb_print.inc.php | 21 +++++++++------------ 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/lib/read_header.inc.php b/lib/read_header.inc.php index 844a56324..104d781b9 100755 --- a/lib/read_header.inc.php +++ b/lib/read_header.inc.php @@ -180,6 +180,28 @@ {$siml_thre_st} EOTOOLBAR; +// +live 実況リンク表示 + +// 実況表示では無いときのみ表示 +if(empty($_GET['live'])) { + $livebbs_bool = false; + // 実況板のみ発動か確認 + if($_conf['live.livelink_thread']==1) { + foreach (explode (',',$_conf['live.livebbs_list']) as $value) { + if(strpos($aThread->bbs, $value) !== false) { + $livebbs_bool = true; + break; + } + } + } + //実況板or全ての板で表示する設定になってたら表示 + if($_conf['live.livelink_thread']==2||$livebbs_bool) + { + $toolbar_right_ht .= <<実況 +EOTOOLBAR; + } +} //===================================== echo $_conf['doctype']; echo << //実況フレーム 2ペインで開く | + document.writeln('実況フレーム 2ペインで開く<' + '/a> |'); } //]]> \n diff --git a/lib/sb_print.inc.php b/lib/sb_print.inc.php index d738749d0..c6f93b4d2 100644 --- a/lib/sb_print.inc.php +++ b/lib/sb_print.inc.php @@ -376,12 +376,8 @@ function sb_print($aThreadList) // +live リンク表示切替 if($_conf['live.livelink_subject']==2||$livebbs_bool) { - $ttitle_en = UrlSafeBase64::encode($aThread->ttitle); - $ttitle_urlen = rawurlencode($ttitle_en); - $ttitle_en_q ="&ttitle_en=".$ttitle_urlen; - - $live_url = "live_frame.php?{$host_bbs_key_q}&live=1{$ttitle_en_q}{$rescount_q}{$anum_ht}"; - + // $ttitle_en_q は節減省略 + $live_url = "live_frame.php?{$host_bbs_key_q}&live=1{$rescount_q}{$anum_ht}"; } // オンリー>>1 @@ -457,15 +453,16 @@ function sb_print($aThreadList) $td['birth'] = "{$birthday}\n"; // +live 実況ボタンの処理 + // +live 実況中ic2のサムネイル作成をonoff + if ($_conf['expack.ic2.enabled'] + && (!$_conf['live.ic2_onoff'])) { + $live_ic2_off = "onclick=\"javascript:parent.menu.ic2_menu_switch(0);\""; + } // +live スレのリンク先を実況に書き換える if($_conf['live.livebbs_forcelive']==1&&$livebbs_bool) { + $thre_addtag = $live_ic2_off."target=\"_blank\""; $thre_url = $live_url; } elseif (isset($live_url)) { - // +live 実況中ic2のサムネイル作成をonoff - if ($_conf['expack.ic2.enabled'] - && (!$_conf['live.ic2_onoff'])) { - $live_ic2_off = "onclick=\"javascript:parent.menu.ic2_menu_switch(0);\""; - } $livelink_body = <<+live  EOP; @@ -481,7 +478,7 @@ function sb_print($aThreadList) {$td['edit']}{$td['offrec']}{$td['unum']}{$td['rescount']}{$td['one']}{$td['checkbox']}{$torder_ht}
        {$moto_thre_ht} {$livelink_body} -{$ttitle_ht}
        +{$ttitle_ht}
        {$td['ita']}{$td['spd']}{$td['ikioi']}{$td['birth']}{$td['fav']}\n EOR; From 235dee2f31532be040c154650fc1d2cc3e50f657 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 6 Mar 2015 14:08:20 +0900 Subject: [PATCH 037/339] =?UTF-8?q?.gitignore=E3=81=ABdata=E3=83=87?= =?UTF-8?q?=E3=82=A3=E3=83=AC=E3=82=AF=E3=83=88=E3=83=AA=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=80=82=20https://github.com/rsky/p2-php/pull/26?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6c82ac0c5..25c8fe038 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ composer.lock composer.phar ttf vendor +data # Compiled source # ################### From 284e849e379dbea8e066e11729a5c12acdb4b978 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 6 Mar 2015 17:48:00 +0900 Subject: [PATCH 038/339] =?UTF-8?q?view=5Fk.inc.php=E3=81=AEtypo=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/expack/tgrep/view_k.inc.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/expack/tgrep/view_k.inc.php b/lib/expack/tgrep/view_k.inc.php index 73f7c3a93..daa0a6670 100644 --- a/lib/expack/tgrep/view_k.inc.php +++ b/lib/expack/tgrep/view_k.inc.php @@ -23,9 +23,9 @@
        最大件表示

        最大件表示
        '. $plugin_ht . ''; - } else { - $plugin_ht = ''; - } - $plugin_ht .= 'から'; - } else { - $plugin_ht = ''; - } - $plugin_ht = << - - - - - - {$_conf['k_input_ht']} -{$plugin_ht} - -EOP; + $plugin_ht = $this->_generateWikiDatLink(); $moritori_ht = $this->_generateMoritapoDatLink(); $dat_response_msg = "

        2ch info - このスレッドは過去ログ倉庫に格納されています。{$marutori_ht}{$moritori_ht}{$plugin_ht}

        "; @@ -2076,6 +2048,60 @@ private function setDatochiResiduums() } // }}} + // {{{ _generateWikiDatLink() + + /** + * +WikiのDAT取得プラグインでdatを取得するためのリンクを生成する。 + * + * @param void + * @return string + */ + protected function _generateWikiDatLink() + { + global $_conf; + + // +Wiki + if ($_GET['plugin']) { + $datPlugin = new DatPluginCtl(); + $datPlugin->load(); + foreach ($datPlugin->getData() as $v){ + if (preg_match('{'. $v['match'] . '}', $read_url)) { + $replace = @preg_replace('{'. $v['match'] . '}', $v['replace'], $read_url); + $code = P2UtilWiki::getResponseCode($replace); + if($code == 200) { + $code = '○' . $code; + } else { + $code = '×' . $code; + } + $plugin_ht .= " \n"; + } + } + if ($plugin_ht) { + $plugin_ht = ''; + } else { + $plugin_ht = ''; + } + $plugin_ht .= 'から'; + } else { + $plugin_ht = ''; + } + $plugin_ht = << + + + + + + {$_conf['k_input_ht']} +{$plugin_ht} + +EOP; + + return $plugin_ht; + } + + // }}} + } // }}} From 50389327c5b5f0d8b1f5730e1de40fdd93dd07de Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 13 Mar 2015 13:56:33 +0900 Subject: [PATCH 056/339] =?UTF-8?q?=E3=82=B9=E3=83=AC=E3=82=92=E8=AA=AD?= =?UTF-8?q?=E3=81=BF=E8=BE=BC=E3=82=80=E3=81=A8=E3=81=8D=E3=81=AB2ch?= =?UTF-8?q?=E3=81=8B=E3=82=89DAT=E3=82=92=E5=88=A9=E7=94=A8=E3=81=A7?= =?UTF-8?q?=E3=81=8D=E3=81=AA=E3=81=84=E6=97=A8=E3=81=AE=E3=83=A1=E3=83=83?= =?UTF-8?q?=E3=82=BB=E3=83=BC=E3=82=B8=E3=82=92=E5=8F=97=E4=BF=A1=E3=81=97?= =?UTF-8?q?=E3=81=9F=E5=A0=B4=E5=90=88=E3=81=AFDAT=E7=A0=B4=E6=90=8D?= =?UTF-8?q?=E5=AF=BE=E7=AD=96=E3=81=AE=E3=81=9F=E3=82=81=E3=81=AE=E3=82=A8?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E3=82=92=E5=87=BA=E3=81=99=E3=80=82=20Socket?= =?UTF-8?q?=E9=96=89=E3=81=98=E5=BF=98=E3=82=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 66badc474..682ffe5a8 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -265,9 +265,11 @@ protected function _downloadDat2chAPI($sid,$from_bytes) } $this->getdat_error_msg_ht .= "

        rep2 error: API経由でのスレッド取得に失敗しました。".trim($firstmsg)."

        "; $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&relogin2chapi=true\">APIで再取得を試みる]"; + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&olddat=true\">旧datで再取得を試みる]"; $this->diedat = true; return false; } elseif (strpos($firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2")===0) { + fclose($fp); $this->getdat_error_msg_ht .= "

        rep2 error: API経由でのスレッド取得に失敗しました。
        rep2 info: スレッドが存在しないか過去ログに格納されています。

        "; $marutori_ht = " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&maru=true{$_conf['k_at_a']}\">●IDでrep2に取り込む]"; $marutori_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&shirokuma=true{$_conf['k_at_a']}\">offlaw経由でrep2に取り込む]"; @@ -510,6 +512,18 @@ protected function _downloadDat2ch($from_bytes) return false; } + //ホストが2chの時にDATを利用できない旨のメッセージが出たらエラーとする(DAT破損対策) + if (P2Util::isHost2chs($this->host)) + { + $firstmsg = substr($body, 0, 100); + if (strpos($firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2")===0) { + $this->getdat_error_msg_ht .= "

        rep2 error: 2ちゃんねるのDAT提供は終了しました。

        "; + $this->diedat = true; + fclose($fp); + return false; + } + } + // 末尾の改行であぼーんチェック if (!$zero_read) { if (substr($body, 0, 1) != "\n") { From 06f71b36961835b3c27355fbf2c24f0500c701c9 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 13 Mar 2015 14:05:49 +0900 Subject: [PATCH 057/339] =?UTF-8?q?API=E3=81=AE=E8=AA=AC=E6=98=8E=E3=82=92?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- doc/README-API.txt | 2 ++ rep2/edit_conf_user.php | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 48b03c517..802803e29 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ ### Git & Composer縺ァ 1. 譛ャ菴薙rclone -
        git clone git://github.com/pluslive/p2-php.git
        +  
        git clone git://github.com/2ch774/p2-php.git
           cd p2-php
        2. 萓晏ュ倥Λ繧、繝悶Λ繝ェ繧偵ム繧ヲ繝ウ繝ュ繝シ繝 @@ -103,6 +103,7 @@ Web繝悶Λ繧ヲ繧カ縺九i螟画峩縺ァ縺阪↑縺鬆逶ョ縺ッ [conf/conf_admin.inc.php](https * **unpush** https://github.com/unpush/p2-php/ * **thermon** https://github.com/thermon/p2-php/ * **part32縺ョ892** *(+live)* https://github.com/pluslive/p2-php/ +* **orzisun** https://github.com/orzisun/p2-php * **2ch p2/rep2繧ケ繝ャ縺ョ>>1-1000** diff --git a/doc/README-API.txt b/doc/README-API.txt index ce80d0528..449c813c2 100644 --- a/doc/README-API.txt +++ b/doc/README-API.txt @@ -5,6 +5,8 @@ API 2ch APIを使用したdatの取得に対応しています。 +PHPがOpenSSLに対応している必要があります。 + ●設定方法 「設定管理」→「ユーザー設定編集」→「rep2基本設定」→「2ch API」から設定変更できます。 diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index e1ce27bfb..48a4e6d64 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -375,7 +375,7 @@ array('2chapi_rounin','2ch API 認証時に●(浪人)IDを送信する(人柱機能)'), array('2chapi_interval','2ch API 認証する間隔(単位:時間)'), //'API キー', - 'API認証情報', + 'API認証情報(全て必須)', array('2chapi_appkey','AppKey'), array('2chapi_hmkey','HMkey'), array('2chapi_appname','AppName APIに送信するアプリケーション名 例:Hoge/1.00'), From 2d112be5d05fee19b25ec1f023e32807addbe1ee Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 13 Mar 2015 16:50:17 +0900 Subject: [PATCH 058/339] =?UTF-8?q?ID=E3=82=92HTML=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=8F=9B=E3=81=99=E3=82=8B=E5=87=A6=E7=90=86=E3=81=8C=E4=BA=8C?= =?UTF-8?q?=E9=87=8D=E3=81=AB=E5=AE=9F=E8=A1=8C=E3=81=95=E3=82=8C=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=81=9F=E3=81=AE=E3=81=A7=E4=BF=AE=E6=AD=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 1 + lib/live/default_view.inc.php | 5 ----- rep2/read.php | 27 +++++++++------------------ 3 files changed, 10 insertions(+), 23 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 682ffe5a8..e9a741d12 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -522,6 +522,7 @@ protected function _downloadDat2ch($from_bytes) fclose($fp); return false; } + unset($firstmsg); } // 末尾の改行であぼーんチェック diff --git a/lib/live/default_view.inc.php b/lib/live/default_view.inc.php index 1e416996f..b102be925 100755 --- a/lib/live/default_view.inc.php +++ b/lib/live/default_view.inc.php @@ -45,11 +45,6 @@ } } - // IDフィルタ - if ($_conf['flex_idpopup'] == 1 && $id && $this->thread->idcount[$id] > 1) { - $date_id = str_replace($idstr, $this->idFilter($idstr, $id), $date_id); - } - $tores .= $date_id; // 日付とID if ($this->am_side_of_id) { $tores .= ' ' . $this->activeMona->getMona($msg_id); diff --git a/rep2/read.php b/rep2/read.php index 8437024ee..5b28a55f9 100644 --- a/rep2/read.php +++ b/rep2/read.php @@ -307,23 +307,13 @@ } $res1 = $aShowThread->quoteOne(); // >>1ポップアップ用 - if ($_conf['coloredid.enable'] > 0 && $_conf['coloredid.click'] > 0 && - $_conf['coloredid.rate.type'] > 0) { - if ($_GET['showbl']) { - $mainhtml = $aShowThread->datToHtml_resFrom(true); - } else { - $mainhtml .= $aShowThread->datToHtml(true); - } - $mainhtml .= $res1['q']; + + if ($_GET['showbl']) { + $mainhtml = $aShowThread->datToHtml_resFrom(true); } else { - if ($_GET['showbl']) { - $aShowThread->datToHtml_resFrom(); - } else { - $aShowThread->datToHtml(); - } - echo $res1['q']; + $mainhtml .= $aShowThread->datToHtml(true); } - + $mainhtml .= $res1['q']; // レス追跡カラー if ($_conf['backlink_coloring_track']) { @@ -333,11 +323,12 @@ // IDカラーリング if ($_conf['coloredid.enable'] > 0 && $_conf['coloredid.click'] > 0) { echo $aShowThread->getIdColorJs(); - // ブラウザ負荷軽減のため、CSS書き換えスクリプトの後でコンテンツを - // レンダリングさせる - echo $mainhtml; } + // ブラウザ負荷軽減のため、CSS書き換えスクリプトの後でコンテンツを + // レンダリングさせる + echo $mainhtml; + // 外部ツール $pluswiki_js = ''; From 6dbaddb6d7b983ca15107d27ae7d84c045ddfe2e Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 13 Mar 2015 22:49:41 +0900 Subject: [PATCH 059/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=E5=90=91?= =?UTF-8?q?=E3=81=91=E3=83=88=E3=83=83=E3=83=97=E3=83=9A=E3=83=BC=E3=82=B8?= =?UTF-8?q?=E3=81=AECSS=E3=82=92=E6=9C=AC=E5=AE=B6=E3=80=8C=E9=A2=A8?= =?UTF-8?q?=E3=80=8D=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/iui/backButton.png | Bin 816 -> 541 bytes rep2/iui/iui.css | 49 +++++++++++++++++++++++----------------- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/rep2/iui/backButton.png b/rep2/iui/backButton.png index e27ea8cdf9a4f3b35c78f6bb0a407a4047e72e12..70b416f99d29f521d2ab54a57aec9b3165c0b587 100644 GIT binary patch delta 527 zcmV+q0`UE?2Au?u8Gi-<006b>=iUGS00eVFNmK|32nc)#WQYI&010qNS#tmY3labT z3lag+-G2N40010xMObuGZ)S9NVRB^vL1b@YWgtdra%FdKa%*!SLsKZvtrW>3JCtO_av`g$~W_h21hpQ@eBfT7kicVC^%O#=s+HM0ru zD7kd^C_aC|ZfDIbp)~phqyhZY(#!K4GrIuRlsUb0_jNd1)f79spfvgrqfw|Xu;kPx z+ESPuv+bt<*ZLtu$F3Wwz~1zH1B^n>0aff`pnf`&?0-{ETG4QjS$CfTOUa=InP{jg zuoU>v`d;yfg375&gUpI;9HPl@<U>+8MIu R)c^nh00>D%PDHLkV1kxS?Ii#J delta 804 zcmV+<1Ka$a1h58>8Gix*0026OaESl_02y>eSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM00PoUL_t(|+Qe6FPt#BsZM$x4(J=;f!)=J;Wr8>a$6ycxLqdeamk<6& z4JHQ76p104ppisCL-36lMG0@o#uixs4)# z5!%^WfA(amZ(u0WKSUUy6W48TZOkO5WAXd$3tpSuVX?53aX44Uc>}E<=4UvMmqqvl z27NO|%7 zySIJu2Y@Z0Ra$@|h{{KDF!wUiay4ePIl$1|oy7p)(0_%mtDj_GgPvy9to8&XY6lE* z0>8Yt*fn$qa7h}oKpbHAO(6RFL;Vcv&~)?KA8PPe-re5Rpyabv&;Xaf=cI6F>v>ky zRfQ@tGq1?|2k%!ZlN%ZA(ZwW%!Av6#G{7Yiyr{$n!@10knWL$ggK}v)Fs!Y&BOvi9 zvvW{}C@D?;i+;{tkc3M2#t7^+*5eFtDG-tFD}N4J($&fiN==nHckK}u%C(ymMq<}N zN`Y3WlmHkjLMq(RdUzK8E%HoF@zUgIlrE&@TpD!E(EE@ac~MAhM7!HmOtYuOo?Mm5 zY<^<2@5|cn^^NVUXqY2*dySWK^+Y0wqBBCCJ>xdeG}zqDwgsDRghN)=u)j94H(61W inH`)`C`$WRfB^uXx!j#d-gDys0000 *:not(.toolbar) { body > *[selected="true"] { display: block; } - +/* a[selected], a:active { background-color: #194fdb !important; background-image: url(listArrowSel.png), url(selection.png) !important; @@ -42,7 +42,7 @@ a[selected], a:active { a[selected="progress"] { background-image: url(loading.gif), url(selection.png) !important; } - +*/ /************************************************************************************************/ body > .toolbar { @@ -50,10 +50,10 @@ body > .toolbar { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; border-bottom: 1px solid #2d3642; - border-top: 1px solid #6d84a2; - padding: 10px; + border-top: 1px solid #333; /* 初期値 #6d84a2 */ + padding: 6px; height: 45px; - background: url(toolbar.png) #6d84a2 repeat-x; + background: #333; /* url(toolbar.png) #6d84a2 repeat-x; */ } .toolbar > h1 { @@ -84,9 +84,10 @@ body[orient="landscape"] > .toolbar > h1 { right: 6px; margin: 0; border-width: 0 5px; - padding: 0 3px; + padding: 1px 4px 0 4px; width: auto; height: 30px; + line-height: 30px; font-family: inherit; font-size: 12px; @@ -96,14 +97,18 @@ body[orient="landscape"] > .toolbar > h1 { text-overflow: ellipsis; text-decoration: none; white-space: nowrap; - background: none; - -webkit-border-image: url(toolButton.png) 0 5 0 5; + background: #444; border-radius: 5px; + /* background: none; + -webkit-border-image: url(toolButton.png) 0 5 0 5; */ + display:block; } +/* .blueButton { -webkit-border-image: url(blueButton.png) 0 5 0 5; border-width: 0 5px; } +*/ .leftButton { left: 6px; @@ -112,10 +117,10 @@ body[orient="landscape"] > .toolbar > h1 { #backButton { display: none; - left: 6px; - right: auto; - padding: 0; - max-width: 55px; + left: 6px; right: auto; + padding-right: 0px; padding-left: 0px; + width: auto; max-width: 55px; + font-family: Helvetica; border-width: 0 8px 0 14px; -webkit-border-image: url(backButton.png) 0 8 0 14; } @@ -163,13 +168,13 @@ body > ul > li { body > ul > li.group { position: relative; - top: -1px; - margin-bottom: -2px; + /* top: -1px; + margin-bottom: -2px; */ border-top: 1px solid #7d7d7d; border-bottom: 1px solid #999999; - padding: 1px 10px; - background: url(listGroup.png) repeat-x; - font-size: 17px; + padding: 2px 10px 0px 10px; + /* background: url(listGroup.png) repeat-x; */ background:#aaa; + font-size: 16px; font-weight: bold; text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0; color: #FFFFFF; @@ -220,12 +225,12 @@ body > .dialog { border: none; border-top: 1px solid #6d84a2; padding: 10px 6px; - background: url(toolbar.png) #7388a5 repeat-x; + background: #333; } .dialog > fieldset > h1 { margin: 0 10px 0 10px; - padding: 0; + padding-top: 2px; font-size: 20px; font-weight: bold; color: #FFFFFF; @@ -238,14 +243,16 @@ body > .dialog { margin: 16px 0 0 6px; font-size: 14px; color: #999999; + text-align: left; + width: 5em; } -input:not(input[type|=radio]):not(input[type|=checkbox]) { +input:not([type|="submit"]):not([type|="radio"]):not([type|="checkbox"]) { box-sizing: border-box; -webkit-box-sizing: border-box; width: 100%; margin: 8px 0 0 0; - padding: 6px 6px 6px 44px; + padding: 6px 6px 6px 5em; font-size: 16px; font-weight: normal; } From 1bde17b62d57abd9ef3de1259d0a3635c5029e01 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sat, 14 Mar 2015 13:32:57 +0900 Subject: [PATCH 060/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=E5=90=91?= =?UTF-8?q?=E3=81=91Subject=E3=81=A8Read=E3=81=AECSS=E3=82=92=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=20=E6=8A=BC=E3=81=9B=E3=81=AA=E3=81=84=E3=83=9C?= =?UTF-8?q?=E3=82=BF=E3=83=B3=E3=81=A8=E3=81=8A=E6=B0=97=E3=81=AB=E5=85=A5?= =?UTF-8?q?=E3=82=8A=E3=81=AA=E3=81=A9=E3=81=AE=E3=83=9C=E3=82=BF=E3=83=B3?= =?UTF-8?q?=E3=81=8C=E8=A6=8B=E5=88=86=E3=81=91=E3=82=84=E3=81=99=E3=81=8F?= =?UTF-8?q?=E3=81=AA=E3=81=A3=E3=81=9F=E3=81=AF=E3=81=9A=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/css/iphone.css | 26 ++++++++++-------- rep2/img/glyphish/icons2/01-refresh.png | Bin 535 -> 657 bytes rep2/img/glyphish/icons2/02-redo.png | Bin 564 -> 721 bytes rep2/img/glyphish/icons2/03-loopback.png | Bin 539 -> 743 bytes rep2/img/glyphish/icons2/04-squiggle.png | Bin 449 -> 510 bytes rep2/img/glyphish/icons2/05-shuffle.png | Bin 430 -> 576 bytes .../glyphish/icons2/06-magnifying-glass.png | Bin 476 -> 650 bytes rep2/img/glyphish/icons2/07-map-marker.png | Bin 411 -> 524 bytes rep2/img/glyphish/icons2/08-chat.png | Bin 318 -> 407 bytes rep2/img/glyphish/icons2/09-chat2.png | Bin 363 -> 455 bytes rep2/img/glyphish/icons2/10-medical.png | Bin 251 -> 295 bytes rep2/img/glyphish/icons2/100-coffee.png | Bin 293 -> 337 bytes rep2/img/glyphish/icons2/101-gameplan.png | Bin 505 -> 693 bytes rep2/img/glyphish/icons2/102-walk.png | Bin 517 -> 621 bytes rep2/img/glyphish/icons2/103-map.png | Bin 536 -> 640 bytes rep2/img/glyphish/icons2/104-index-cards.png | Bin 228 -> 260 bytes rep2/img/glyphish/icons2/105-piano.png | Bin 186 -> 211 bytes rep2/img/glyphish/icons2/106-sliders.png | Bin 245 -> 271 bytes rep2/img/glyphish/icons2/107-widescreen.png | Bin 312 -> 383 bytes rep2/img/glyphish/icons2/108-badge.png | Bin 429 -> 504 bytes rep2/img/glyphish/icons2/109-chicken.png | Bin 337 -> 429 bytes rep2/img/glyphish/icons2/11-clock.png | Bin 588 -> 746 bytes rep2/img/glyphish/icons2/110-bug.png | Bin 601 -> 730 bytes rep2/img/glyphish/icons2/111-user.png | Bin 301 -> 354 bytes rep2/img/glyphish/icons2/112-group.png | Bin 510 -> 536 bytes rep2/img/glyphish/icons2/113-navigation.png | Bin 387 -> 517 bytes rep2/img/glyphish/icons2/114-balloon.png | Bin 402 -> 498 bytes .../img/glyphish/icons2/115-bow-and-arrow.png | Bin 526 -> 676 bytes rep2/img/glyphish/icons2/116-controller.png | Bin 459 -> 599 bytes rep2/img/glyphish/icons2/117-todo.png | Bin 288 -> 397 bytes rep2/img/glyphish/icons2/118-coathanger.png | Bin 367 -> 496 bytes rep2/img/glyphish/icons2/119-piggybank.png | Bin 384 -> 492 bytes rep2/img/glyphish/icons2/12-eye.png | Bin 386 -> 564 bytes rep2/img/glyphish/icons2/120-headphones.png | Bin 328 -> 414 bytes rep2/img/glyphish/icons2/121-landscape.png | Bin 298 -> 375 bytes rep2/img/glyphish/icons2/122-stats.png | Bin 312 -> 435 bytes rep2/img/glyphish/icons2/123-id-card.png | Bin 276 -> 334 bytes rep2/img/glyphish/icons2/124-bullhorn.png | Bin 298 -> 334 bytes rep2/img/glyphish/icons2/125-food.png | Bin 409 -> 450 bytes rep2/img/glyphish/icons2/126-moon.png | Bin 350 -> 425 bytes rep2/img/glyphish/icons2/127-sock.png | Bin 342 -> 386 bytes rep2/img/glyphish/icons2/128-bone.png | Bin 221 -> 270 bytes rep2/img/glyphish/icons2/129-golf.png | Bin 443 -> 493 bytes rep2/img/glyphish/icons2/13-target.png | Bin 686 -> 1004 bytes rep2/img/glyphish/icons2/130-dice.png | Bin 374 -> 508 bytes rep2/img/glyphish/icons2/14-tag.png | Bin 401 -> 516 bytes rep2/img/glyphish/icons2/15-tags.png | Bin 576 -> 643 bytes rep2/img/glyphish/icons2/16-line-chart.png | Bin 601 -> 633 bytes rep2/img/glyphish/icons2/17-bar-chart.png | Bin 215 -> 236 bytes rep2/img/glyphish/icons2/18-envelope.png | Bin 320 -> 401 bytes rep2/img/glyphish/icons2/19-gear.png | Bin 467 -> 681 bytes rep2/img/glyphish/icons2/20-gear2.png | Bin 471 -> 623 bytes rep2/img/glyphish/icons2/21-skull.png | Bin 439 -> 573 bytes .../glyphish/icons2/22-skull-n-crossbones.png | Bin 783 -> 1037 bytes rep2/img/glyphish/icons2/23-bird.png | Bin 435 -> 540 bytes rep2/img/glyphish/icons2/24-gift.png | Bin 406 -> 518 bytes rep2/img/glyphish/icons2/25-weather.png | Bin 422 -> 528 bytes rep2/img/glyphish/icons2/26-bandaid.png | Bin 359 -> 505 bytes rep2/img/glyphish/icons2/27-planet.png | Bin 563 -> 601 bytes rep2/img/glyphish/icons2/28-star.png | Bin 436 -> 512 bytes rep2/img/glyphish/icons2/29-heart.png | Bin 337 -> 419 bytes rep2/img/glyphish/icons2/30-key.png | Bin 325 -> 402 bytes rep2/img/glyphish/icons2/31-ipod.png | Bin 365 -> 465 bytes rep2/img/glyphish/icons2/32-iphone.png | Bin 217 -> 260 bytes rep2/img/glyphish/icons2/33-cabinet.png | Bin 194 -> 248 bytes rep2/img/glyphish/icons2/34-coffee.png | Bin 354 -> 460 bytes rep2/img/glyphish/icons2/35-shopping-bag.png | Bin 284 -> 351 bytes rep2/img/glyphish/icons2/36-toolbox.png | Bin 292 -> 347 bytes rep2/img/glyphish/icons2/37-suitcase.png | Bin 258 -> 306 bytes rep2/img/glyphish/icons2/38-airplane.png | Bin 305 -> 390 bytes rep2/img/glyphish/icons2/39-spraycan.png | Bin 285 -> 359 bytes rep2/img/glyphish/icons2/40-inbox.png | Bin 371 -> 476 bytes rep2/img/glyphish/icons2/41-picture-frame.png | Bin 254 -> 313 bytes rep2/img/glyphish/icons2/42-photos.png | Bin 179 -> 214 bytes rep2/img/glyphish/icons2/43-film-roll.png | Bin 345 -> 403 bytes rep2/img/glyphish/icons2/44-shoebox.png | Bin 381 -> 435 bytes rep2/img/glyphish/icons2/45-movie1.png | Bin 252 -> 283 bytes rep2/img/glyphish/icons2/46-movie2.png | Bin 360 -> 377 bytes rep2/img/glyphish/icons2/47-fuel.png | Bin 415 -> 494 bytes .../img/glyphish/icons2/48-fork-and-knife.png | Bin 209 -> 250 bytes rep2/img/glyphish/icons2/49-battery.png | Bin 218 -> 254 bytes rep2/img/glyphish/icons2/50-beaker.png | Bin 210 -> 234 bytes rep2/img/glyphish/icons2/51-outlet.png | Bin 299 -> 351 bytes rep2/img/glyphish/icons2/52-pinetree.png | Bin 295 -> 386 bytes rep2/img/glyphish/icons2/53-house.png | Bin 224 -> 281 bytes rep2/img/glyphish/icons2/54-lock.png | Bin 309 -> 371 bytes rep2/img/glyphish/icons2/55-network.png | Bin 322 -> 424 bytes rep2/img/glyphish/icons2/56-cloud.png | Bin 294 -> 372 bytes rep2/img/glyphish/icons2/57-download.png | Bin 251 -> 283 bytes rep2/img/glyphish/icons2/58-bookmark.png | Bin 186 -> 237 bytes rep2/img/glyphish/icons2/59-flag.png | Bin 298 -> 340 bytes rep2/img/glyphish/icons2/60-signpost.png | Bin 181 -> 240 bytes rep2/img/glyphish/icons2/61-brightness.png | Bin 291 -> 459 bytes rep2/img/glyphish/icons2/62-contrast.png | Bin 459 -> 555 bytes rep2/img/glyphish/icons2/63-runner.png | Bin 426 -> 516 bytes rep2/img/glyphish/icons2/64-zap.png | Bin 364 -> 412 bytes rep2/img/glyphish/icons2/65-note.png | Bin 314 -> 381 bytes rep2/img/glyphish/icons2/66-microphone.png | Bin 314 -> 371 bytes rep2/img/glyphish/icons2/67-tshirt.png | Bin 277 -> 352 bytes rep2/img/glyphish/icons2/68-paperclip.png | Bin 336 -> 437 bytes rep2/img/glyphish/icons2/69-display.png | Bin 314 -> 354 bytes rep2/img/glyphish/icons2/70-tv.png | Bin 391 -> 453 bytes rep2/img/glyphish/icons2/71-compass.png | Bin 422 -> 673 bytes rep2/img/glyphish/icons2/72-pin.png | Bin 265 -> 316 bytes rep2/img/glyphish/icons2/73-radar.png | Bin 938 -> 1008 bytes rep2/img/glyphish/icons2/74-location.png | Bin 361 -> 523 bytes rep2/img/glyphish/icons2/75-phone.png | Bin 363 -> 496 bytes rep2/img/glyphish/icons2/76-baby.png | Bin 448 -> 515 bytes rep2/img/glyphish/icons2/77-ekg.png | Bin 434 -> 512 bytes rep2/img/glyphish/icons2/78-stopwatch.png | Bin 458 -> 590 bytes rep2/img/glyphish/icons2/79-medical-bag.png | Bin 288 -> 363 bytes rep2/img/glyphish/icons2/80-shopping-cart.png | Bin 279 -> 361 bytes rep2/img/glyphish/icons2/81-dashboard.png | Bin 601 -> 823 bytes rep2/img/glyphish/icons2/82-dogpaw.png | Bin 475 -> 577 bytes rep2/img/glyphish/icons2/83-calendar.png | Bin 214 -> 258 bytes rep2/img/glyphish/icons2/84-lightbulb.png | Bin 342 -> 421 bytes rep2/img/glyphish/icons2/85-trophy.png | Bin 423 -> 515 bytes rep2/img/glyphish/icons2/86-camera.png | Bin 382 -> 457 bytes rep2/img/glyphish/icons2/87-wineglass.png | Bin 342 -> 382 bytes rep2/img/glyphish/icons2/88-beermug.png | Bin 434 -> 470 bytes rep2/img/glyphish/icons2/89-dumbbell.png | Bin 248 -> 323 bytes rep2/img/glyphish/icons2/90-lifebuoy.png | Bin 521 -> 610 bytes rep2/img/glyphish/icons2/91-beaker2.png | Bin 446 -> 482 bytes rep2/img/glyphish/icons2/92-testtube.png | Bin 286 -> 326 bytes rep2/img/glyphish/icons2/93-thermometer.png | Bin 392 -> 442 bytes rep2/img/glyphish/icons2/94-pill.png | Bin 404 -> 479 bytes rep2/img/glyphish/icons2/95-equalizer.png | Bin 282 -> 331 bytes rep2/img/glyphish/icons2/96-book.png | Bin 407 -> 464 bytes rep2/img/glyphish/icons2/97-puzzle.png | Bin 561 -> 725 bytes rep2/img/glyphish/icons2/98-palette.png | Bin 530 -> 599 bytes rep2/img/glyphish/icons2/99-umbrella.png | Bin 392 -> 449 bytes rep2/img/gp0-more.png | Bin 309 -> 115 bytes rep2/img/gp1-up.png | Bin 377 -> 133 bytes rep2/img/gp2-down.png | Bin 382 -> 135 bytes rep2/img/gp3-prev.png | Bin 330 -> 143 bytes rep2/img/gp4-next.png | Bin 320 -> 144 bytes rep2/img/gp5-info.png | Bin 496 -> 410 bytes 137 files changed, 15 insertions(+), 11 deletions(-) diff --git a/rep2/css/iphone.css b/rep2/css/iphone.css index 2b2eb7cab..8bba736b7 100644 --- a/rep2/css/iphone.css +++ b/rep2/css/iphone.css @@ -602,7 +602,7 @@ div.ntoolbar { min-width: 320px; margin: 0; padding: 0; - background-color: #000; + background-color: #333; color: #fff; } @@ -720,7 +720,7 @@ div.ntoolbar a:visited { } div.ntoolbar a.inactive { - color: #888; + color: #fff; } div.ntoolbar span.unavailable { @@ -731,7 +731,7 @@ div.ntoolbar a.hover, div.ntoolbar a.active, div.ntoolbar a:hover, div.ntoolbar a:active { - color: #9cf; + color: #b4b4b4; } div.ntoolbar td > a > span.badge { @@ -776,24 +776,28 @@ div.ntoolbar td > a:active > span.badge { background-color: #36f; } -div.ntoolbar a:link > img, -div.ntoolbar a:visited > img { - background-color: #fff; -} - div.ntoolbar a.inactive > img { - background-color: #888; + filter: alpha(opacity=50); + -ms-filter: "alpha(opacity=50)"; + -moz-opacity:0.5; + opacity:0.5; } div.ntoolbar span.unavailable > img { - background-color: #555; + filter: alpha(opacity=20); + -ms-filter: "alpha(opacity=20)"; + -moz-opacity:0.2; + opacity:0.2; } div.ntoolbar a.hover > img, div.ntoolbar a.active > img, div.ntoolbar a:hover > img, div.ntoolbar a:active > img { - background-color: #9cf; + filter: alpha(opacity=70); + -ms-filter: "alpha(opacity=70)"; + -moz-opacity:0.7; + opacity:0.7; } div.ntoolbar td > select { diff --git a/rep2/img/glyphish/icons2/01-refresh.png b/rep2/img/glyphish/icons2/01-refresh.png index f6f4da9b222684a214e138811b4d010b4d1e1f5a..a17882c9f48e63779b21594f44482ff634eb3b2b 100644 GIT binary patch delta 633 zcmV-<0*3vU1d#=hBYyx1a7bBm000XT000XT0n*)m`~Uy~LrFwIR9J=W*iT55K^VvJ zj~RRFB-kYogl?e_MGypg2!p7LVHAN-BpyQW(8X(>79!}HbOqn@PE+*kMIV=y$Ie*0fRUd>^eTldZSXR7H|nq@dMxRA^Poz9`r_4 z0?yzaUf>1>x|FSBrlNW)5ipInG7&M~@v-CG7S7{t1@)r5fLYnFsD*qJ_i+M8aXKoy zfKj|IS?3=VUVla-#_%A@zsFU4?kKl~TUaSkS1zdnYO*iiAM&fXAnSonMzNDv&tFL$ zLNnSc$yZ#ld*kV0<4G5AGqUGp6Lw!n5io?2U^nrkveqP!BH&zPugD)dMHtY1@5m)Z zz_G~QOsTYkI=+NdFY25kpg*#!n4n{_Rjr1zMV(Uw#D9%W>h=x>b7Jp_6agENUHFUb zLL6fww^R-(0#>yr?uhn^ltS$PGsG@Lihw3wM)`XQF?RD^maw9wZe;WL73^_LCd8Nw zzCx_|l!l}VSi@qJe~gI&{u9Bc#bStAm@>!dJ6I2P4NG{a`^q#B$}DLg!Pi5qB+4A8 zo46>uB61!N?`CluuR>}at%qdm{g~`(*0+T%NqWn5Qs zGpyoDxr56g?PVOVMdeHH> z%S#eKmw$}ps0r9&EMNef#9g2pvjMCCPjTgsi})LGCl)FL9Do0H0aaiNm>?KY??xm^ zZh=A{(thmyB>~4kst3tQV97U^1ui2bZ!O@^M=%ZS0}rx*!4A-ln7oyMbG+AZ0ciB_ z%K}$15VsQWWr(?0208)0ajd$vfCE8(3g^mj9Y~AL!KwVW0dC-Uqj?$l+RDUR^>t_mfZz$)-4 z<}$!KumQ}Oxfh)K{sQUo^gv)U`cA zz3>d2;{17dHFLATJg|xPL&zF&2pB5H|3*iRUq)#DeMzG#?*IS*07*qoM6N<$g0h0; A=l}o! diff --git a/rep2/img/glyphish/icons2/02-redo.png b/rep2/img/glyphish/icons2/02-redo.png index 4becb66abd06f23e3bd553f81df9e03a4b6e5f74..5ddfc495461db748c9ae237d1ab39fb341f3db12 100644 GIT binary patch delta 698 zcmV;r0!96_1knYMBYyx1a7bBm000XT000XT0n*)m`~Uy~gGod|R9J=W*k5GTVI0Tt z*Q%QshcRMwwcBNhCC1W4N*5`cQc5vR=_<-ecO!O{h%(ky>SoiF(#3QU-89k|k)o?H z4x_6vQWwwf?EH3i&d%@oonL13=HYps^Zfff&-Zt}&-dvV9e*9Qli9W13uu=eFJMoW zMiUbgvEv>=U#h%}C47z?1g?EB^MN@=;UwDD}h(0qon)HQUJj^qB z9s$EP+k778h108Y0sXOq#0u!b<0N&(PS$`~yiJvF#tslGU{bKv?j&CXuOz>eh|(QZh&hy!?pOR4&O zNgCRs@2ti?Ac~?QvdcIqJeM@`tW_#_BAnb=ku(1|jVSV6Xh9Id=7+6S;j{{Q3rf@R g|8aMl+3^DY0){Ygy+fFFH~;_u07*qoM6N<$g3v@#a{vGU delta 540 zcmV+%0^|MB1+)Z^BYy$=Nklg*rj>f|i`0S;2Zzd%qFw3DE2-5gxnip9Z6>W~C3Ka6>~OH00Ra7pgHZ@!mz z_ueH349GCXM*RZ1$h?5@l>9yd&&qWfm<3kSAR8EJEuaqMBY(I`z#;HtkXPG5AE=6^ z%*Gz@rOTglRcK%rxb)qd0XBdM=lT=42i`-*T>xu3FQEGcEXCJ4a2ql94%qbZ7lF10 zzmX6+$6f<*ZJNNOB4Qrsj7mV#)&dHOi0ZHeG@WKb#1&p7*_}j#d)QlH$?2OAv84!T zq%EMLkW~x`Xn!d_^T2mn0-6M2DwO6FpVw&!a6`urQ=wE-e4a>b;}&!KKsV%m*LkLk zveNHJjU_X6tk@k1ZU0+Se#Ba1(sFuQ>AwkW!*Gh7iTx-#&tgF`V-JemlF&A-%|S%= zgLlRxqICK8jq;DxDNkbks9NkrCA1QakAN=aHGqaNPu zna3{7;@Y=?Gwf1)Bm&$}@^68wM3(|jz>YFryPncLQoaJ)1am?eSO6BWkCh+54Z$O& zMX;n6L-!N*@zyeNVUhe4W+a5d!lOobW_3{l4v0QC4>g4Tg8#?X6n5rbHcgb4fT1Dt e|3)(};1w4!_Cvps$io@{00000x$iW1m^{iBYyx1a7bBm000XT000XT0n*)m`~Uy~nMp)JR9J=Wn9*k(Q5431 z+r<6>O9)FTp_HYyYpYdKtv*yjrH`#VME0@tDJ-czM9NZ1w2v*N`jD4aR^CeGZKd`h zET!}*EG6U*SY7SIJ=ffsOy-`M3}e}k;mpjr=X~F}ckVr=)PHKVm}Fckn!rUd6;L!L zUcju+q0{MT;?#h_h1tZQ-EJqo&ua$yz$Q@6DV`d62`B^G7$LO;zb5cj{Qk<-muJl^ ziL(lb60xWeKN}U`3vdWL1M0wxTy=SNC_a@mM7-ZX1Qp;tu#(_oXX6_16sQ6Rz=9(F z3Z@8mfuV*_ntvInVycux9$*B#0@g5M_6U>z2;9dMZ&vIN&ie%!qxzn-0(?X)20#ON zAwr&GmI%NYc!Ux5UGB$Xx8&VeeCskcHvv8(w(1Rn?Q{m%aAI_TZbFW(_*iU6j6`Sz zXo$E~x3~q&i9H0i6uGtt*8ZHtNQ6d!hDh8YcGa=J5q}nU9!BCD7b6xL0a=JZAR6G0 zatwrbpLw6NMnF~~Sx@DvW1sk(H3Hlq-ikQ5;@HQ^F=gPMbN|yfKqKInV?RJw*(i~? zZzQhe*aR+%eFF4+i8KOw1hY_;BtE!Ah7lrVdEbwWS&GDdO>i!p3ypxW1arwPCHO~) zymN@yUVmwuU?vwa?a4mDzJCPlD7dK)vKW%xv^TRm+0000J5`x9f#Jl6j%>LkNvL~5jcITd%bLQ^+Kn>XNk5MmM zKweY^%0^{CVNp;&sZo@H6W|(H71UoUYzinEZD777?h)t%$A83=S6B7EYRfcs7LqAM zA^@&{NW^~t9goTEsMwtu@D&2kRh%Vo=*dCFE_Y$TS4aR1h%*ooXG!85m;!56ra;e# zIVPFG+y-1iG|V+H5^Z&0yk(3r$3G7^J5L*D*FB zZN9D)de&Vi{Vt@@5<cQn1*@N-)hz3K1-}F|GI+tgHkD@eQ?H376+FfroW&bF!k3zQDdX|DR4+A9ljpb_9bd;~T);sMy%SwaXkE6lc~)^RjH~oc zbTx2@VHi)b9ci0kAL~~O^iEV6Six)j4cjlg#8$zzfABSTZ(jdUqPL>Tz^1Hb=d9xv z-eKb;0tlRIdw*k z%Jd?xVZUK4Xr6&X#Z7pGXJK5W7ttzs+Lchg3E#?A@L-AlKBu23gZ{rzVtNCq=?$c& bH;|ft&?!)D@1w&200000NkvXXu0mjfai`){ delta 424 zcmV;Z0ayP11Hl83BYy#iNkl5 zP78y*A%*%%(g=YRHX%j+R7!${z5pvlQi&vIie0(!*t`8Rhm(W-!jGNZXJ&Suo%u1d z9o(5aAf`2||ab8i6ji|<#hRJi%)qT|&35v5j&=MfsQUy<18oQOl@WR)$_yOi zD7e4EAy#oVjsfJHHf>mDU=hm&&u?(h^rZ#7!j1;BQf6QVU-XmaW1uzuYB|?I`44un zpm=!>rEU^G4S&kLp|z^L^Ot^Z{m!4A;UzX@vs}5e$D~`L_ppyQDtx3A2Hs;Eb0g|> z@j-?0r7$pscev2ct^1`pFWXD@WV>~x&YE(KPr?06O+92nkKOwTzv<6bs8c5B=8~6v}j_zB+ SNuv`00000m}~nVLB>nT_)>X1;m9XWr*A?>FCT8qH?Y|9^}Pbqgqqk%77~GEg@* z=AGDXxBo@{X}n7dv|6oP52*VM+(ieI!#<#H18^Geabg&95d-6RiXSP*R~*aWP2h0` zZ(p1B@oWyf%$}6gffwx%tLwo{@*qXR^EsDyE zE)L*ZUP2KA-+yrkje%ndU*eo?f{8Jqrf($p^C{fr7+b*^%*N~7sA3U+#3`)B@iKM^ zrPId}u4M4L*o}o@lIPwB{(@(Mz@xa0mwwgppur?A;dPnBRenb21)&{mkM~w_Jf71~ zN<7u?1Glh0Uaw&epDNDr8>%#L0p}9qtLWhkwq$Uo%YP=V%D_R~NsR9ci?f5B@jRBo zTNkawjwoV0j$h%tAiOVZMkuc|)ZR*bNC^Ebe9L=ygzE|Z2^7fNMPiTO!0h@P&P*rOpbx z@(f%rxqmQ#0Y?0^zyOz7&?&Gj!tVg@4o}gUQ3Ehp&_fYE z0iG(}BPzhD2!G!O?y+sO764bw>jHZ=c7ZpCXR;~)BVb*GKf!jVPWFA#AyywHWKghe zbcTI=qy`QESbhM~PPUp|;ZgQy;7bKwAxfw!Q%{fvSmF^$s~400000NkvXXu0mjf&KaqB diff --git a/rep2/img/glyphish/icons2/06-magnifying-glass.png b/rep2/img/glyphish/icons2/06-magnifying-glass.png index 95be7e1290c7b93ea930d5628ec4486f54faf138..854cc6705e0d8ffb27b3ae9cadc6e96630d73951 100644 GIT binary patch delta 626 zcmV-&0*(FL1BwNZBYyx1a7bBm000XT000XT0n*)m`~Uy~JV``BR9J=Wn6Yb9Q51*2 z7zuPO2!)7)ZM= z5C{~y3J(Gf?>ydVUa!eHH}DYh!6WzH^E>a}AGz;w-mSD+Er0%JE|k51SY`&w=At#B z+wGn=Tn8QkH-Lup`@k;xC~U}cU8tSnvz#@&Rf81;5GT;6JP^a z0(#_oy)XSGiGL4eyeaup!DFBftgHTW{=K&oi9b_g>%bMq+yy)a*2uTOchZM*61GH- zbG3dYs50O&&`|9IW3JXWf+_x$H1v-Ti@wg ze;QO7@EAB&?PX)G)*lB|20RA#RQriBSL^qJDgzz^+kfQm{A;AI)k#Ti-3Yt?|hD)CJ5sfFIJ%D$*n14zM8O3(`N5xUPTh%N32coKApS zoGs`Ufv*$hSAkEY_0g_#4M1EueF9tu-ZH+%Pk_(l1s$X&z5sV4))4(k`3HCjTqWIB z2f#pL18eDbB>n)n$CORPevxJLNlWI9F}fb9i5>EXJ~J_txQQ}8>N69g|HKY((|WVA zP9;JnK3H#5=CR6oCWZlRkh0H(dcbYc2YvuNvfiLFI~y&TnSrwT3ljBbCbOat)c^nh M07*qoM6N<$f+*f1IsgCw delta 451 zcmV;!0X+VS1>6IWBYy#-Nkl6^}5QaYx6kSDHk3yiTNYT7QAESa);OGk= z8Xf@Apem|r`YMP6L49*1-7Yhs0wk1J)zAqP)fFJL zd;!dXSD*{r0~Pt~%J*|m>tre^aK*qgP(QIoUE<<`>t$We#(yR7V0u(({PGe2;*8{5 zz!ZoiCX#t81H$KDR04f^_gKmJ8jAM4s!zr!AkN9Ha+6Qu}#J6hvWAy6y z+uSIFTmYJC{C{oq>iA|}kVP&4JvDwadUbp+H_9mM!I`nU@5g8Q#>x}44kV1VP|7aN#~_6$GtZ1VR)^&^quRL_0xT2tp79LKH0mAqWDu{sWCD>^Tz4(w8(bk^=;7=ABvJ_Ya^`yx-2EB8v7r#qaOM|4dIB$P z)}nl4Lm{Bf&oasaZ$J@PH=}55_G5Dh-1-Lh?uCF4MwvXYY#HEwhF=5t^bM~1C%*h6 zpI=Z3cm|p=_)X*E4P`f4jln%v1yu@|cNdyKR~1zKK5Q^gW@Xt2y?`#WTM1eAA^mHSZXk93jtzs#C6|Q1n96VDCbZ p>_b=qAnJFbkoZ5`T`-njz&BO5NTrG_C8z)Z002ovPDHLkV1gVo)`9>4 delta 385 zcmV-{0e=3B1e*hpBYy#6Nkl;?Emv;?6u?$U}!PAO&1W0 zqX7@Lz%4KUPHYV9+EzgiBN+EUFQC=4Ig*+pBwxU|M$^W2Pk%B7u4@!u;3gFVFZ_O& zE`T}kW@B#G%IE@{6b!iC?*n^J-X6%DT!|?}6ZD;;@<8r`lbfYr;LIuNBar*)Ij|Ji#GVjrQI!A(L`=(R4P{NhHK4}S@Y7tx9Df6Q} f0d*YzjW&%RbZ0($rz6tB00000NkvXXu0mjfeT}Ne diff --git a/rep2/img/glyphish/icons2/08-chat.png b/rep2/img/glyphish/icons2/08-chat.png index e50edf2558b68f89e32c85166b9dee2f916a0e82..6f20159fcee01bbe654c331fb5a0463f0c0d4e78 100644 GIT binary patch delta 381 zcmV-@0fPR%0+$1jBYyx1a7bBm000XT000XT0n*)m`~Uy}Nl8ROR9J=Wn6XO3P!xv0 ziu5IXhC+v;IO!@l3OczMIy>eOvI>IW8wec*XF(7OPFcHlbrOUwI^0tQ5zP6M(-_DH zfd+E^o-etlxpa_a8C_n1Rki@{7=S~>3xclz!Vq>b$>CkY!`~asZbM^ ztqAN2HDTH63`DV!8TeQ90&SxRtQzm)n>TNPBJd*ARHgJ5C<1pvO<1-faD#BCDo|Rs z3v~vLXjY=MOm_EtslP%?U;~D?8SF{Bqqpa8BCyH%=Xa zD!h`G#ysi^B41<+V2{A&Ax>aUYJL%v|3!qr3^*h$pKzKMxCYKhgS!z1{a=eM(+jjs b=LJ3iV)QWQQ8mZ{00000NkvXXu0mjf{-U4i delta 292 zcmV+<0o(qU1HJ-~BYyz}NklZ6rb$}h0&IX8kOP@;<*s() zda0=t>i~>=Hhp2_dTO$W3(i0hFnmqndYcQZ4Z_!~V+fRn0)M46PgYw9$npH>KG5a< z8hwpMAQN6MMU*G$bD$L@DbNj`;z3_ppb;1=YQ9B$KxzaQiW<}2$&C{AFc(syAmT9h z{3KSu)FXK5dT8#vx4_$GZ|DKr!23iK7yvuN@TLMoU~e4WOke^WBZM~*m;+ZQNz=b4n^zqG0000=Z8BYyx1a7bBm000XT000XT0n*)m`~Uy}c}YY;R9J=Wn6XL&K@>$# zRPqgi-w;R<6e}$iECsD>45=;i3EK)nK=K1ZO2IlH2mz~Y(*~`qgupgh%tTgQP2SxZ zmW3P`m>qI&-p#)3Ow#CfyVRMDstYK~IzZLbKERe$kR-`s+J6Lkz$viruPtQ26EFg9 z{Wbl5-(+GA;MoE0fwrgz7x=)BOW*{USxuA{Y61_GEB+^K?`ge@Qh*-N5_HRGd2bU+ zfHOf8&07huD`=v5tKWe|up*-inYi|A`u1kd2$TkDbB|-!k0^5EJ zORP&MEtK)SSAUNvZUgH&z`L~=QSiDsaDhAb2Pec%{2y<))|kY4 zgP1=lr?~S@wBjLNfC;YnX(azIVgwighq(5MPUrwPxF-|lJh1PdG}eDDR?Ip;)zm(~ YCx^a975;VqwEzGB07*qoM6N<$f)WtDd;kCd delta 337 zcmV-X0j~bX1M32iBYy!hNklWOL> z7Q{Gix+jdNmQiaYr%+S;0{Av<;V}LvcPp&dT!Z4~S>Z4)(&OVIyLjr0ah-t`)t4+x zUpg+*)3;6h3H;auNS4r-Af_$W7o^0%Mi8T#dvK*hNmY3HG?5Unn7f^c9ru@!4XMc? z`SQ*N+8nU}V@hD}`8~l5OsGl*E%B-brocg2yqbYIa0(z^#lRZ)4J6*Xfh}+jC|*6N7wQFX16^|k8{;Jy6Jav#00000NkvXXu0mjfcQ%;_ diff --git a/rep2/img/glyphish/icons2/10-medical.png b/rep2/img/glyphish/icons2/10-medical.png index d8bd7ab83dc1decab0decab36782118582129485..0fad9fb42428132bfe984e4bb621a518f8a14eb2 100644 GIT binary patch delta 268 zcmV+n0rUR*0jC0xB!3BTNLh0L01FZT01FZU(%pXi0002lNkl$IwsklIC z%nK}(P}g-ea0E6$lemXF&;yqc!fR|;5&+IX5VJ82um|SAZhvf8ZK180%U)9zScM^qSIft0v`rD7qjI} SZFm3x002ovP6b4+LSTYaLvINH delta 223 zcmV<503iRT0{a1wB!9w5L_t(oh3%Iy4ul{OML!#lKw;wLw(ta2CVO&i+=eaI5F#HY z?V+>MVmqio`jLi1cHt&~0!5ZF(KzE7c?SO!L7uzgPny%KZns15yo5HLSo)&MWa|Co(PN24Dd&wj@rBX|0XP!nTyR!F&~R0d33+ Zd;u>4UMjc-n$Z9N002ovPDHLkV1i!0U|;|M diff --git a/rep2/img/glyphish/icons2/100-coffee.png b/rep2/img/glyphish/icons2/100-coffee.png index 91f2086494fc6806ce892fac1d27a7792895e1da..f0c4e8c2149af066bb60ae9ec615107ca648f6c3 100644 GIT binary patch delta 310 zcmV-60m=TQ0?`7HB!3BTNLh0L01FZT01FZU(%pXi00034NklAJq})y!V$1w?5EO0%CT9LI6pJ;iO}FlV@fVHlDI$dSOJkbf3|1aORVyiV;aOI%F- zOB{YP&Js7%b88|7?tgec^Sd3M;Rs#IBK~g?OWd*CL=!l`N3ey68hDE?AWDuJcrK*H zA21Lp;x*TJNYp+?C(n_T94SAXWnrE%F$6FQi4jPblRy$#RS5xCh__ z^DQ+iTtz3YJ}-e>2A+1L*`OVx6RRC*HmE*{U1XqAQ*W=Fy&Ev6DtmU1%Ffr?${^LDu7mLmi_Xb|Z0mDBgj;e^O>gEg&}@KG9Vj5a-%b Q00000NkvXXt^-0~f+)mlsQ>@~ diff --git a/rep2/img/glyphish/icons2/101-gameplan.png b/rep2/img/glyphish/icons2/101-gameplan.png index a4fe28668da88d353e36a99ab2581bc36c3669b6..0e0bc143d643b397b2c641a81deb714dd01122f3 100644 GIT binary patch delta 670 zcmV;P0%8661GNQ^BYyx1a7bBm000XT000XT0n*)m`~Uy~XGugsR9J=Wn9Xt9Fc5`5 zXL66y0aJmQ4wMQ)S73TZ1yDELMBQ|=IuKle=?bI{!c<^(5Ot6ob`gRUX^|#K$1`~| z9Q+E{2fSSXx>_t2yk~rPYXgSjW7m$`?bg?v0T2VXz#VXG>VLFatvU_XnSck(fwiU< z`Orb9lu!=LYIUcfgAO4O)XK4bwk@f(pQx_*vB%i0=tJNakZOJg{BX(u*T5bz{1K6h zyW+8a23P`x)+ahvsO414ozTYzHo(0a8mIv~r+ujg-)s3Rr9?ul&$XW`oeXj4141rA zoZCBrof`evV1J;+PbVKz>VB_vcMZQOfNwf(f)FxYjp`$z86t~ZzXRpATZ7kXK(2X^ zl@HbUwx|;!(aC6j-_q|4eZ#1gfHln3_!?PFyZr%G-DelZULw2v1bpvmP#*#(s@kmU z^ae5dKo%#81qeh1inzd58&KC><#x5m+woB82e3Z zFMz3*?G1JVe5Q2b`t!3hrv6`Ou4zh1uBf&3!qfx;P2K2J)Y4v* z@StgoL?HX`!>b$^rYDe6y(d{e===h!<09Q$us6Wt5rP6dwC#)_zB+X#=28 z@9y{dJu?DV06(fN+v{`>flfVtk#gUs>d!EcU@12EUX-=r%6|YErF+p1}tu|yJtQru{GDj%KG%EK6-!i?p3_`$A$@NC`GjQ&A3fPiwiy?X( zX?(YQg44HhGK$3?8=-Qu#+Gw;NHVQ27Ue9@7um#ufobGaP#D4@Q7z^-K~$ zoHB_F)9pqw1Uv!f6PH|-9LAMMpDCgu;4yCc^g&2V8CfdIm1nmTnBYyx1a7bBm000XT000XT0n*)m`~Uy~A4x<(R9J=W*iVF&Q5eVZ z&omi^p>4E^h=?ecS(PYJo3>?g<7ySrA8tmfsWh92XkA0QXwxWV(rD2ir6I<&Yty2l z)iA`U#X0ZHd$0FK?(-T$UtZ_D_qpER`JHo~^Pck#v|26enSTvy-GF}C81azF$;rQk zw__7NV7VM zXM6l7Jb{TbP=ECNJshlv&){2-RtHfAiWk&n{Hln53DoK!>Y*d0`cOrD0Uxm=NNQ`+tw?7h#i9%pjb7>zU&gIc`ApEV8fBoEHdXVVvO7U?##C?3nZ@h>Qjv9e|*n>rk;T5iw;(sHUl2)rH(iS6xI+D1Fm-#wk z^$;^Eoex5ZHqek(8@PjM>D^FpwG8_5l_Zc#5!Av;EvzKsKZvo&p4l9GSY*a*zz4(K?JWD| z&F;=F7X#{aF?u>3K)d)00XIMy_|hV%E8335lLcxD9I65aLx0ISljhJ~LPMeNVGR=L ztk-}Ipah%)BQ$0rufV0UgqE!2%mEdpz*PjSS(4cSl-4VVQUgt$dE(|{T4*;p7k)9(OCn>ML?k;oufU;?NDPrz14 zKtFJ6`kor|s*Ku}2Z}T*l8p>qa-9y&gd$L&b)V(h99vyL$qF`Q+P1B>IB?;!fMqM# z6RUk8BusKCi4F8dvl^uwzF=tqT>B`%zR(>z`~}Ou?`5Na87up)B~qoip;vqpaAyVQ z%6?!|rcc^80YS}AMr1#*oaq;*aqad-K*9ue^h>`AO_U_KC2yliTFa#i<23&jl_f}H im}%%%{QunTG`<1<%v}KoP={y$00001R9J=W*gI%cK@aj9PZ38^UwM3*>mp9b`1^=T7St{RkZ`T=m@A9D_+2w zl*uC_Ba039VhDZc!7S>yjaLcue|Uz6hkJ@HN)ph5n&9wIY`3Bt{m~kNka}#V@DxI- zfPS2cn-)P0qtWVkgs~DlOCnXk{fxc(qK#$p{DZ2Kcy7Tn8C42sV5bm~BN!+{QdYnv z%-|Tll;o%hxqmSrL}0WGNvePgcqsgqH{%xG;$xZ3g(!5#XT1zTY7*axYgWhpF5EyD zwk2{ka2*pub?QxAk8}a+7W5~u2M0^+UBh(b{DHOcxp0rR$VuW~*cz=YYC`1B;3__) z666RtCnWN|W#;|Fy8?W7BVQ771l+UqmvkQAg+!mlX@8+wy==qx8P8Ll$PsWBZx$J! z#|fc2y~h^35R&$Bobzpwb?b35)rlMdPw@d)FeOwHcz{VExi_@T-!D`h!keBE@~DaF z$diP!r_m-3VXqMWW@)`xVBK*ccb?%1cH=cJr#g@;U{kd1((CvXz6y7Sqc~8;fm{K( z*od34y8m4v|BGs7&DPB;+?z$3s~a<)^sm0aweBj=7;(S`;(Ls z`9hXJt(Y|u0RVU<2?|mHQL!h`2ml{Q;$OSa1$R$uONu&=OkpblYT@Qf&J$o3?k<62 z!=Atq?lziRH=uAc^1ILNll@){|OY zw~Up*YGLyumkBTnAD6(`a3(Oqy+*5b0~R#F0OrS`zSeySQ$h3Goh*0}4DWzAuA6bL1b5 zuDd&rYg>fkvJEU{4iiLGo0}G`$U1qZO;3S~^}-VI8+(P%ypffS-Ou_dDEsTQ&0Cn$ zukSmy_h-&t&6oWGtQP_pctJ$(Z%xAmf2ZgRitbonuW4|8d4qYp+F!v%3{qSR7J>-D hI^Cv)470v4i8m)nh`znO;R?`244$rjF6*2UngGX1NaFwi delta 158 zcmcc2xQlUuN`0fJi(^Pc>)Yv$Tn7|*SSDX8|9+wWdN!Y_s@n~{Hw_Aci<=u4%)Xg? zMCJu|$wUUJs>WjHKI=2<-D*0gihnRjdwsQHnttoP7L^7!rVKD~=hgql8;1A4ohwTF zsB`~$suk162eBW8zNo4&ng}^4gNV(SI_p{ga(giFitjzZ@ctLS^X3_1a~XiZ)78&q Iol`;+0Qn(APyhe` diff --git a/rep2/img/glyphish/icons2/106-sliders.png b/rep2/img/glyphish/icons2/106-sliders.png index 77daa27954e41d217d839344b13dd69925a9d6b0..7e91a3bf78dcbf926fe59e4f5ab92fa3154cb2d9 100644 GIT binary patch delta 243 zcmVe9gs%7faY`H4@%>n%_)CyCTvT0;JCR@4|%^hOXo%e zoN08~{8dH-^wQh8OJ)h6G+x<+wR1~v;u5SjDKSgHYa3j>h13h+uu$nMsy9{*hX9%o tt46(rmK1RJj_06xZD;>Rg)srrd;$GC8>=4l;@JQI002ovPDHLkV1ieeYLWl| delta 217 zcmV;~04D#B0`&oqB!9d~L_t(oh3%N#3V<*OgDoT=+4 z5Ya(~nOX~w;s$!)0FOmc%Yy0&gb#73rIrEGW4?vl0NwpqGggdOpf%f0n2Ydprz&r4$ zeb`kX6c#uDADlwBQwq%~V1XmB2R8lK`4*i+phI?g3%nr`!H6kvMA~D6^tX+%NN9nf zO?JRD@Ey4R1tA4mq)pb$5PTqnK!^193it|8&j}v^iv(UG$6%BmA7iRO3%nq^?tK*c zFhyVwJRwJ8a$Q^nR{fQvU4Fw=U>PNa2d)C^C@DP93e?QsHnnDwR=}WmH$UV214tFf zmC&yeTj2JOd!`?Ez+I>Xi~M6NF{1ae@oxcUUSdYfz&c4O3bog`K@>xG-%+_HQ{ zjn@`vfd;tPKD<;w3N_Z=F^6`_5>wzcbcYG;Jw##%DCW?6>3^Cb1!_!tbeR4QGP0!w zrZ#DTBd`(P{{u;ZDfo#9!C#B|qA3$6k+=Ht{PK2Ny_G{6}% z8k4hBKx01AY)-K*0$K4lr_p}gFeX<2AR*uE_3b{$Pm#310eJja(*k#?f+>1ilx)VK jD@7nRMIbe+7Z!K|GomD3)V;!s00000NkvXXu0mjfqLzWm diff --git a/rep2/img/glyphish/icons2/108-badge.png b/rep2/img/glyphish/icons2/108-badge.png index f8b66a6f78a518fe1a6a860f2de54289946b3dd2..7ca2febb40fccb7e5e12b7feb02d7012625116d0 100644 GIT binary patch delta 479 zcmV<50U-XZ1NZ}wBYyx1a7bBm000XT000XT0n*)m`~Uy}s!2paR9J=Wm_JLyKp2Og ziU>}Epo<^~>Q+H;DL6=R5F9!Qf@@YMp>!-xgCD($@akz@++HY2vLwDaaik}1F=FbRll zD6OiAl)r)?<}OK1-t+`U`yuq6puH42VQ|T7K#UbfE;iKtjKr` z*p+_O$G;AI{eK!i0YmA30ynr&b4wSX4O{~cz>Y?~2m1_M03FRbjMhL0I0PD+`3=d} zE*{Jm@enBBz5?TjIb-n`_<4=AWosv{0VhB|#Mc*J&C-3X9wl19AjC5epEcP8*aos8 zo~-z+$tHl`$@3$kPg`*URDn&V_l186unOd*-@{#~MOfUOwy9z=|^dv|#KkVmw-{zXKgWYIOjq)il6u!|OK=@YwMBYJY(Bin)8QT{b>QT7a#J zxo59kHa+=zojfBCi>M10H~3P4PqVS>-eZaKNYrU}T)n6kt|Ue6E=#faPYcXy>^W z=!=#mz_r&u2HvEt@~LHUD;NA;?Hyp^%}-<;@hyzl;=he4^(ANDc1*0000~%zBf|;9`ZePqJ*U zW_IV>-?Ne@MN#mdxd>grSfYT?L;<0R0zwl7gk~xYtn2!(Ykw?&63Bo#u#+TJRVA8S z^9C|t4}98lawdKTyxAkOW96Bg#O8_72-pCry-s^Y`N%PaFFfPRWs#ElRr&w95FcJu=`HV=JGv yb{I>x7!hJ7@vlT+qJYpu0ilTkLK6jq<_jbHIRDXdI1TFn0000e35B_ay_Gjr;B4qMC;pW2YH(u1YG5hF=;ezR`=e(;-hmwXw3mJokk%I$Mwbi`*1>lan23u-Ww#=*>Q5AREoqDmeE)0f!FYYWpn29;!n=1Yu=_dJV4v-uC6DUO zPW)OksVZ-W-CBd4wj%dS>LWcLC#^ZMKQMO@BNVyiKj5?aCu=-I>z*XazkwR?0mxbHpMYPgeiL}8>UV(8z++%HNdQR%)PSz49|Ny}_rTu}ei3*AJOc_C z(On=fW4z!yg@3A;e?GtfxC=B14<2c63U8p=-;!WD`3T6$LxX8E1nvVPi}w=vC#A+n z_(RKI)*}`#0c${6>=WP-Fb?50tWskv<4&Yr7QfE$5wNA~CT5KfL(VE~907V`*_y$N zgsXrXKt=2^2|hkSo9WxDh<_)z3MebPk6C$=;8^^G`G21at^$^oZGW`B(0-O@vSz?l zfS%8>=Ng4>MBi^^=iS0_7jUZVr5Nt6vTMv1ab4MAt63ym1sp2-Rt&e!c@b|yc-qfl zNPi?;1q_va4|6=2g$d_HtXrI-_zCkr7hDC5m>vVNz(x!|5Yd);+v?w7x&sgJSQvaZ zG9APV&VME@VVD3Sf61lVM{ zB2|E|#J`CECE*7<`UKdP(iy(T={`n8fK}iCGbLty*hT3-5PpDd;EQJ*i4vM1uYHHv z;0nMi`2`u-sr1y;kYSPu~mWFjHmjdm&e3F7HMcj7tHF#(xLJd*j82ipu~1002ovPDHLk FV1g`;Ooadd delta 564 zcmV-40?YmC1D>WNoAKR4{LI|<2G6=FMoK3Fl&bqU+ZV+-{V0Q1Bd*|%joxcp= zvcquxx&yY@c>#M{@c9Wm18?Hp5l{v8w-66Ep>hw@H^izdUVlw7vKM^qIu?D1ok9ba zU(iDZ7)5M5QhW~%cIjl?U;&gx2g<-KfY(&^W`J!L;A4@N0GT>@V65SJBb3$H$Ev-D zZdwB5@VCPp3xDW1Ey1azAz&l|=76cCfT{B1A?knhQ%tuKFQQ&!eMT`wLHP;t9|@)c zhN6CK8cYM}XQ*XqU@AZ^SO*5}&O&U5qW)#p9diM4?*G`pZHRggy@+>F&uKWJF!^cv zqFrqRcftBL;W~gP|AD??f2?L92mQ7|CnE2&PgurEg7-pUWyb1AmPm0gV0d`2kR5r18|A{M3z-H-HEINoLj^PEY$OxPDR6*MG`s_Cm}$l zRO+`9wk;_X1bHtsXPGKnyBFGqfK;*bSBw7w{um4- diff --git a/rep2/img/glyphish/icons2/110-bug.png b/rep2/img/glyphish/icons2/110-bug.png index 4a0c9c2ea910b0482bf33e1d6ba0459efba7d1fd..c2e1bbf1e8963d6a505f3078499e60fdb4ff91ba 100644 GIT binary patch delta 707 zcmV;!0zCcM1lk3VBYyx1a7bBm000XT000XT0n*)m`~Uy~j7da6R9J=W*uQHOK^VsI zPc%v_6cq%EV4-LdP*ey(OAE0OR3g}jAR%h2f*7z+6eMDy|AB?3v{MlaTcb(guOeEA zMN$b-5Q9+*i+Pt@qjz5B7D6Cj7;fL4cV^#bcjld$Ya1LKw11dcw$K5z%94PErah<8 z@bGZiyoIy4fuUx*z(w4~x#H%~P_xZzWC@tVCCo-Z$FUhd>-es~2Xsn;ueSQ|Du&RE z^yYh{z+N=)eGxuA(PpOAhgb0h3MQ}@&#)gG&=qy>@Cm!ZXQHZyRw)2RrQn{_shqrQCiT4WCu`KHorc1$@U#DXXlIW>r=qWU2TyBRXt(qhk70}SRSI@SX+#&^iPTja#ihLP%!2z{lmrW}Iy73%m)Xze5cb#SXwRDzvuJQhq@(DmuxHdi z#Wkdrh3rg}f+y0VR-Tld{+{q7YUhP}QL?G}JUnm`V-4!Z!lyE-7Vt|N)7PYhs$e?q p^@UGmv@QL$xWFt4SZEf#fZtF)dIBlWxUm2L002ovPDHLkV1nu6RLcMW delta 577 zcmV-H0>1s)1=$3UBYy%QNkl3>t`oM&+O$7E(4XnnXl| zBWW0p6C@ji5PgVfVuNrh7)`7XkT@wKQX4jkAc9Dglx%SKrK|WJ&vQ?`0vBv9=g(ei z?{m*S_np^;E&nkNbUJ{#*iWF-$dSM}x-hv1pULnU&!BIsrhl#CZgBNuqs82fm?L~v zGw9bQC~YYM8*DLWFy<`f((Nj<$bu1}D+LbF9Z$1J`gY+FxS)ZN+~C@52W1Ix&t~dvFHV zaV|l(fg8cm@gnX^NT4T&c6Wj>yu){NE4Iz2%Ghw&LRd4b2hTb-aRjGRf=PO974#{# zQHeWv5YJZV#jU!rq#mQyEpr0jD(wY))q3?QPOYC!IDhwq95ryh33tDuQ18XFzcO|^ zhjxzpz$`vC85>d@w};|6R2h4LXLZHvB(RJNcx?O1R4I(vxA2@?W ze85$^@8O++mF+%UR-8hM!L^wfOY;63!$H44MDx3FH>-j9@Oc{Tqc!5lQpBZ=wy|KN znKiSLZ93Rqs5>#F^_{un36yqU@u4cw8-3Zea^H#nI`;qA>NNHf=rn!-<{d$8-zBFY P00000NkvXXu0mjfe^8)OAWpx_W82xB`JnMi(}ecw6v*^cuw$@82s zGmTw9Uy^~?jNZV^H=(X;7g+_Y0VC}ju#5U5ciWoZjz6eGJTjtrWADwomR}a<`tj zZ-f{yyk@bW-#{!H8RNNn-eZLr*r2?Rg^bVdh@XTQC<1Z@8#^7Nv6-YlbCF2~Vv`KS Z<_?+9Czl!3{doWY002ovPDHLkV1i$cjD-LI delta 274 zcmV+t0qy?c0<8j&B!BctL_t(oh3%Hn4T3NfMGsC;HedxeU<8=J6_@}=aTFcF4HyA7 zzz=I;j8s}~X-s;O{_tM=-c8#}3t;AtIizl2D_KBlvVaB7KnWCfl=fQ`X7T79wfYG4 zq>GJ!aR@LrM^;mPgzmuPh)*_0hFZW?l(U-bLa9*;IEr#sQ-7d+%uPH!-^DMd@ z2521d24V9M=MJ0#V?n5o(EGaIkk`sC^uY~i9r4!YNKw3hE=GJo|Q2iUK4GE1M$w-XWq<_s=@nW|^N$YDET9r%p@8@6zEBm^=xXKG;t z^5(GB`<50zwyZc2;}kN_c3%c`Kl+^^I)y^-fmM*Uiz)>!$vG%fo({E zWB%`nP}>XOjC`p~5Nu$OzlE+4+?rc_wN;q|?-YCsg%J2P+9$*b-b4d90=|kEg%Ef( z+C!^W99#o8MGPwco4E1>YWsiYO2(c*+1L{(8-LLgOf0%&B@h4r002ovPDHLkV1nM+ BJJTEK<_=BRE5 z{z?---82E@a0hgOmXxma?S)OnW#*V`wukvD75fGPM*xA0sef!v?G}oGNJ^RouyWX~ zWK5bwC)PM}tgwlJ2VgDjK5!%TxrhB6m`ME*_>_7FxCPo}oYAbng01t2151U@lCATI zW_EQ7(F71#`o0u8HXEC^ld99`X+>ka(FD-5^d*^R;$feRv1Kcpwi8VNqfEO445c0b zQ-|%8t>Z(nb$@9Wq6r|tWS)c`yP4zKVVi!|X7`Qvai1Ypv{@*fv$MIqXa&+b=`$ln zk%e0L{m>*%E-)vljV@*jobh{WB&>nZQ)h(7iueQ&0xv~ELIiw}e=ZDxF);AdyTrVZ zTzmp3x<$qqhu?5tBhm!G1ty@PllR{BP;-??SYh6F_FkLtwS5L&FTBYyx1a7bBm000XT000XT0n*)m`~Uy}w@E}nR9J=Wm_JGbK@^9- zh^1aYuo1y42wp-&Y@I+rEbVduA+0CKt35+nZDOkj(8AKjN((KrLxv@reQ)LsLGTAl zUS{Xd@5{X1$;@Ch8u6F4wP^#T+SXQ_OeWU8r$A_80fv^wYjX^nwu z0JP0V1u8&z19X{>3OGY}0`!@W3OGV|0cg!f1)Lx}0IcSt0uB(R0PD%`{nO}n~rwgk&RLq@0q%fTV6VAOdfEpJ>13IKps4cz zJSN|tfFncubS%{@#>FM&rPt`J8vu z>yl7l9(?u#x#=Vnng_ofnH55CFb}?aVl9N=WFGuaCHf!)NApnUT&N2|a5fM1PUhMW iLIv{xga6a%4eJ+VSx+%-Eqg)$00000AZDxJd00000NkvXX Hu0mjf6I7XR diff --git a/rep2/img/glyphish/icons2/114-balloon.png b/rep2/img/glyphish/icons2/114-balloon.png index f8d594e3c07c1759911d938de2584a2ee6d71e24..344dedab8390693c06873e38af971c1b0f865a23 100644 GIT binary patch delta 473 zcmV;~0Ve*E1M&lqBYyx1a7bBm000XT000XT0n*)m`~Uy}q)9|UR9J=Wn89trKoCVA zQ7$>fB_tg<9gt&AfeHc=$`y0t2HdzMB|rsnDhR0{lt2kCA%|In4Fr~%iI63pWbN9! zGoHWR^^V=>^?KBqt8)inrS<}@wT9E_^slBS&<|x&x?TV|FnN{)gJS@*fKYn-oNabrDYxAzB6)Mjz|~3M6$d6t-O? zdo|(l8eIa9#EV#qo;lpxZ68915K_omXd}7(Yq)j;e22Ci-Bde> zrvQ*_^ci>x=M887J9wuO8PyM+v9tdjyanV`(}G)P|2s4;KX=be?FIY-$$CKPr2@}; P00000NkvXXu0mjfG2zMi delta 376 zcmV-;0f+wb1Cj%fBYy!|Nkle`e)Z4&FqU3J5Vqe-3=&7Ogo5mMukAS372vpIo=OYQ@-Q&M7qA8vKqcA& z*qr`1#Tm5&&_>qW0!O2|CWCwfb)@(}V`Rcyd`J9BG^Gt3fq$hCv=`5tNE3ZY1HBNk z%@7ZM^)y>aHT!|3c%C9Y5LRwh1MedOQfQ zmP#pjNS2OA7AnoH7|1z#0iA(X(bsG&je!?M-yv_B&bi0vK~q%FDm19R0}h{mG}QPs zTg<>Pji$0!)^S%GaO7QPti+obNHtO8V~0guGXoC)Qomji-(hzbcA(2bm-qyBr{BN8 z3V6nw)1=jln9T-$cDsqjo_q^A&M!3D`|j0dorTu?j|D%*IB^+ngyWkIj_P( zpi713`CCE~&3|m~5$l22?ItD&3jq)d)SS=W9ig2-?DLES?(q~8fRzBqr0r4xgy5aq zA0c+xA*2dK2~eeaAq9agud7fK+ND59RlpLhT)mNk0CcO6Ber=#2|&0$91tr;Ar*lw zlI44MoS}h_kcu>M*8zM;G_ILIv#P8S8+}0nFA;cbI35Jq1*LAn7GRBTYXK}KMLsuNIkf{Z{m z$Ow#(Zr~~lWQ6nwcja(^CfI>+k`>vG?R)pxXR`v%EZCk#jClrD^7{sS0^c#6y4B7% zmUYiO2~Ys15p#x=n+Kc(A_qQz)B{;h3^Hm^A&#n(&a_!Ys((iXP!)=f_QF%7d_;gQ z6>K@s-dbG{mCSLN3!qO0+rJrrs7zl1Y^MhJPX#R&!jE=h`tmsd)QLV7R0-WqsfoUy zz4mhflvk*5Fpg@}bL#AsNqy}4!2s8&;An3b=fMq)odlpy1t*clL>l6z)@TzY)Hm~4 zK-BS+=0el9&3~f+*sM~Db04Bc(h=#sQDIhqJxw0ZXf7qh`JpYMRt@~;?f{uMx}kah zXdT*zv}-Jkzqq1pA$3FnG@>cPmy$w;WS+k==7UDuWbi*9j{`p!t+(+-i&z&!y}mC9?^ zvoiMaHW`3MJ2Q1hV{Qomz6zz(lZb2F6~I>^6M%e40QxPU(YJ~$0^m&Z3Wd1aXEK1w r0F+AvaN>L#d+wD|EY(7v60_Sc%IYeA-DMR900000NkvXXu0mjfA|>dQ diff --git a/rep2/img/glyphish/icons2/116-controller.png b/rep2/img/glyphish/icons2/116-controller.png index 0b8a117022b88ea221a65af4bd2fcb6eee4a4325..189b0bbfe87a4704fa5632273b072b77957872b7 100644 GIT binary patch delta 575 zcmV-F0>J&t1J?wQBYyx1a7bBm000XT000XT0n*)m`~Uy~2}wjjR9J=Wn6Xa7Fc5~n zA||H30eu4sJOE+pND))FB2{!{V5nHCZXFoP%0jnJh%$ET3jlqD@CKb&Vemm**Kuqb zh>-G0QJk~y&cAa_oK`xW4*!|0q9?E^rGTO-1r*J;&!FLOXn&fTKp&_Z_9ZX{o}@h& zdjwR06Y;GYehXkAzTfnEz0A3J2{32__bGi<>2C+dtOJk0IWP`!3@xFE^vUPJz2xvF zR6t*A&w(yblcP&gGA^?G`lf@6kP@nqtj-*`0-k{vu^q_u4e6^mm+{xY4ln}l48KTn z#Xge?xdTnDJ%5p;0Q+(vwuvLg1ULhBflJM9`sulxga|m&+B4KjerUE2vCSMYW~fzv zle5`p%jG0QKol_6#Ryd*Bh+1pS-l%UxqJoGS$%dlP&HrCY!$IJ9C6IPOOkTZ`>L$J zW2}S-&}jjO(tec#v9%m=bU#SS>A~XXCBXM7v}asLsDG!%1UMDjg-jxH#L@j`sF&A! zil3R&imw3MYDAW#KKT0mY6<-Xxt5T*`EoHP+04aatC4Kx+Ii;u$!0E%1!^<4u=K@p zo&vY1Jx?xoHLvf1CF;j)o4mOWzHo{lHIK>|P z0b+@pCOE2JV23ms`gbAp~r^0;!)s;NH^~0jZEje*OG@+=c)G z7G8mppMPB=ma!(3LQbzhrQ#ML1k45!pjXw2@#AJg3)m|nr)(iVufLsi+}^^?dXasq z_bu=t&+ZT-zJF~?9zPD?NytCe#Oa!iu<kCN3dN8+BM4xtS(ehz*Uz$gT4M9t);} z9P#%cHX-UzcnLfRfqU^CfG^+;c*M9K|4z1KZ%b z);QA=m;!IWXHT03HZQ`*N)v#VzyX-`teFERKX!D|0eD7v0;(jY3qJe7+OMSJl>7f` z4wy=(g*Aa4O-}5@eTT7hT4*ICvG)CpCUIAcB%K!41Wt4n=gIfESkp>p0laEAw3bj< zaiAd~rSsv(GHWLW!J0tLHHmP}`MCp^&xXMmqY8aTBCI+KtIftLqmsl1qpBleox~w( z;C@8^z#sS?`1b^kzVCY*l`XVYK}+C)VSyaItr}VSu@xDKKx`xev2pVR&Lv(%fe*bh QR{#J207*qoM6N<$f)mH6Z~y=R delta 260 zcmV+f0sH=q1E2zsB!A~gL_t(oh3%K&4T3NbgOR9I@txbj!qJR0e!bv4QgJB=p+%49FaCU zNd%e&iM8mQOBC=65|R zQU3?nSOvQK(?t$hYsPYjLa)=B4zE{i+99U%_h*1k6<|{Z*jxe7S1GOC(|}k20000< KMNUMnLSTaI0Bgel diff --git a/rep2/img/glyphish/icons2/118-coathanger.png b/rep2/img/glyphish/icons2/118-coathanger.png index 5bdc2f3b2132463868f242ee39ad9dcbea5e4dc2..3f783fcde45764fd93f212fbf9b423c28ff00510 100644 GIT binary patch delta 471 zcmV;|0Vw|O0`LQnBYyx1a7bBm000XT000XT0n*)m`~Uy}qDe$SR9J=Wn89s>FcgNr zR2_g3=mum1vOzmRRVnu-H*TS~+|mu&PS9k6WP@gdFajg=;Afen&=`0Yt;8o;U~K&S zzvpKxCiD56|IE$M6X?q*U}#1GLvwqr!+O2$GVVRF0b;2az<(0hwjC(TvR~UnL?8w} zag%R)ra}k-&vGq+nUwOPO^px&61lzuhf1losc|(2IkUZqTNODL7TD$(dGAfevtGtBY9QpmHqX!QCv z^bwGA?)5Fs>rL2b*fUWoW8_^Y(M3QaMpsfVfd?st$NNR4zui_>GG^;&v=I>DylxF` zfjc^!GHc$oj>*NA7rp{g&b?mn(~DiGi=K@}>N9|kfKZ(Ct?zOjYjBxAvDnP7z33yL z>hed;_ugfP70;YWAy@Fn`)hidXi&;00000NkvXXu0mjfYy6u< diff --git a/rep2/img/glyphish/icons2/119-piggybank.png b/rep2/img/glyphish/icons2/119-piggybank.png index 3e1fc746d59448ed6818dc84451636abba63d5dc..4209a2a0df2fe508326cc6e25f5b2b4d3713afd0 100644 GIT binary patch delta 467 zcmV;^0WAK21MCBkBYyx1a7bBm000XT000XT0n*)m`~Uy}o=HSOR9J=Wm{Cr`KoEw% z8V`Us@Ca}M*-8_*lz!z^iOY2E3zSxovRO-gpA zJO9pfXG<`dO!&`S_zu98PJnMZ0lvAkHJs1qf0^`v5EueC=6`pVEf52rz^dv&)9KVU ztVS}>17^SvumHvsg9o@aV-c`3J{w?fuCUJJ))^?F4}6&501{vgd?PEKwHqP=Km@*I z#$)5B#zjCMS;6dTUzON?0ZXK`HYdh!5%Fp?CDhB^M-)pXL^84?EsZ@=UJ)YT6bnTh zM`$vz0PfBG6MvF{JW+}7HPtmfHsf0)Th?eY5R$Ioon{hCBBZ?DG)@`;F;X5g(wDXk z9yG=p0k0Hy5ASFMtdK0671~BN;><*71th?L<0jQKt-Zuq-fQ|*F#-bMQR7rsz>;Q5 zX^nFKKTuadf;6>S?LS9M+91`qoJO4{&M?AZAzY8sO-y9K=^1T(k(~;v39$v*$UuS| ztApG%u=H2qDj-I7qyq`?Tw=S;jaAuN6LkN~d8QNKn@)glegT|QOiH?>kMIBh002ov JPDHLkV1hhB$m{?B delta 358 zcmV-s0h#{n1AqgNBYy!$NkllEAo8#c6>go}2?7|1aE2k{QNlokY8PmJ47m?Tj?l^GNO2>ZG8F@MQlS7-#-?g| z@brxW7E*(qW8zKF_cbv02)Y~DO=n+a07*qoM6N<$ Eg8nn3V*mgE diff --git a/rep2/img/glyphish/icons2/12-eye.png b/rep2/img/glyphish/icons2/12-eye.png index b99d2f6d2d95459ecff1226ae013c505e5759952..7949ddc7feae9df6889c02e2e94275a7ba06dcc1 100644 GIT binary patch delta 540 zcmV+%0^|LH1GEH?BYyx1a7bBm000XT000XT0n*)m`~Uy}=1D|BR9J=Wn6XO&Q5?rV zW{Z;$2nH>IYhVZmL2^w&Oa28xgAhtvi-V(sOH*KL(9-NAL7*f>PJ*k@6x`(MBs9F= z<#pbf_wL{b?gNi|{NDTh{C(wj@AouStycNZY{i{GSP}tolYa<^n?yj|YzK8{x7&Yh zF@Q^X?u+dc7y%FR^rg{g1j;9{fHfQe9iZs3wgZ%a8ZZXxznBFWJrvh zZW6izvcL;aaDUkcKy!^>6BxQ|1&Ni_Nkm6L26zSzJl2}PLgps$A;T2g0&jr_5;O2S zp(CKfYT4LK9P=mHXUN=U?Bi=l>_F%UNN>1rvB6w7_76G&uJCV0&a$ckmJH{wrjn2E zNMZ*@5XOJ{3O0Fwloo;zt`J}4EERkJU&lwV zvOX+Me1>Zei^IaoMu|m6SY^$vn@uLdelV~M^Y2?`GMf&N^Tz0E7f=u7-T%f#e$)IOH3MZK%AJ1Dt@l>unjBihr*vfjy8}iW>tf;8$cN zx<_OZLxsQ}kXnjbl=v(x_Nl~bl)w?_TZ$P2mlD4VFtYgdC1xW8PT1Q9U}M;QiCrdV zQ*T3t-%PyhFnLk{+}~ni=o3SKEb*VbT93~jI6K;P9nQY7?@(6@ttoCkk#lQWCumWbl7)YdzrEeu;Qpp_XmOhKGz&mDDYhVf7 zVpes>&n;3*Um;_b(l?bFYJ3C=z9&Be);+Ro$ykX(I|;2oirMpERQ|6o4 z8k3GOtqlIJL=*^(ufS2-Mv>h#@@oF-6S)7U%rCBf3k4?%gyw1mKAiV&iW+Xlt$7hi id@>i9C=i+`5SlMWT{r#&z~-U=00000&p!BHpxj7XS6>;|-C1F=coz%gL1H-I~U2Y@Fnj-ho1 zZ~;(;Dm(^Q&B}&K(uAn362I`htB#5q>**Sg>*-p>;*A&gcYgz}`4WI#p|hBtn2BYe zVa*Q${lH9U#z{Onu6U~`-m;q@9VL;-Qeo}mA2E%gmFT74fsT$hp`PP%bhA-EkQ#7% zyqS$!hRfl9Hx^NV=18D}P#ZK~^1l+CF2*d%Y@0|f~OxNs5^H2?qr07*qoM6N<$g8Soz AvH$=8 diff --git a/rep2/img/glyphish/icons2/121-landscape.png b/rep2/img/glyphish/icons2/121-landscape.png index df91c4598b7f856e8597dc8035891b1be20429e2..2e7f300305d6d7a83b756ccbe3d73a98f4416bd9 100644 GIT binary patch delta 348 zcmV-i0i*t^0`~%tB!3BTNLh0L01FZT01FZU(%pXi0003gNkl04)GNRaMPh5`TOu5K25i;hNxFfdQEy z_ZBCgq{;6AEdvYSNVked8;^pPfjwaCx3TdkXc;gM;$UbQXdlGE&@%AKMRaT9QP48* z3C!qztuq_{rvMIg8~p_AG$xju11|L9hkN54_yay91CMbI+!Eij26D;Z8U_s4t?>)2 z=+1&A_r>=tB~_D4TgU+4T(4pdY#hdT1Gc^bq!l#1$CD5p)Aaa0Euc z4#?_C(eH}1T zZZ~l9b4>N39e7Pl_B|jK;0e@>vsh2}$#89A+qmjWvl7yc+JD4@<=GMm-JeL6knIa3 zK`OwVkLhZRtFOWHApk&e}dD^jDPgfHoz7HYI>IZ%(5Y VNmR4Zq5uE@00>D%PDHLkV1l-zc&7jW diff --git a/rep2/img/glyphish/icons2/122-stats.png b/rep2/img/glyphish/icons2/122-stats.png index 73ecde83a05f7b2f5a401bc618f7536bf4430415..c85420e13577ccbf8276c846e05f1fa4544cdfc6 100644 GIT binary patch delta 409 zcmV;K0cQTV0SakKCe8&~Cs8@d#|tj=%=(!L|ghX>32J6^TzmabCdh{XG8$ zr8pjs+%k8$3y`u4$jvSwH}|0@c3rnc{u1bc+I&|))3)sxI)6d#4or*3jQf}gato*f zV~gY#AZ9HAC2#@0&2cfYYpB53B5MgqUCXXW1vD{685NGu-K6EJvUBg;N`H@_+1Ly~w60X2FlOtHoL%=~1o8G&bMa;X6OBn5pZ3v(RM zU8$IhD1oyXzkdN=!u(v+;)-W$v5&63C7cm}C z{O*DZxXzk+6Jk2B>77ia*#Fqd%q}1|yMWx>ynr7wT@pb*H45a#00000NkvXXu0mjf Djk>sn delta 285 zcmV+&0pk9%1GoZ^B!B-&L_t(oh3%K!4TCTYgfE?-qjUs!la9~{ScOqKLPuZ(x&eI& zk`*QV#HLrIoRk;KB=;Q_5dpx26YIh@U{wQPs{ydZ2KWHD0|;^5V{Mlv;*yLX*|SFg z_Z|p^`esk;5i-jQpmvsJV{K8)S-xeS8F!xT0#Fl97kjQ1rhn-GLo^Nmz4dGlfOHhr zl9kva9^qLxcoobef~63>>KWJoqcZzQ>hoLC5W2r}FmDEsg`_paY#OTH!@LRLsm#3# zJvwnMVE~NCfA9OX0}A>%K+gP@QTQ8xS|d4dITJuSdIHpDW7NgfVxbdptz{X=6` j`=Md00kG8o*cSQ%_i9!~9yTL%00000NkvXXu0mjf=T&=4 diff --git a/rep2/img/glyphish/icons2/123-id-card.png b/rep2/img/glyphish/icons2/123-id-card.png index c7a79f5cc8d60a7421b3badc31bab99728e9a157..aa1da76722396ba612ac2048eb610882d11588e5 100644 GIT binary patch delta 307 zcmV-30nGlC0?q=EB!3BTNLh0L01FZT01FZU(%pXi00031NklP*EjfK+Ym84(NKwn_-IfT08d(gXq0j9$RB?|?K-AHdo{EC6|uB%3}1Ofujqcz>h0M}LHD2q=LAu&ke@ z!Y9%+V|v$sf<17n-=Dw-xVC)07S>T>L%>_p2mLM^3$$^B7Mea(0sd>o*vP<%YKLFI z95^a`oMpgtcCWt! zUGVl6>bkJEH7p>GiGbXC6a(gt!ha!Qf&giP0BM2%X?{+~EqtL4I2`~0002ovPDHLk FV1krMhi3o) delta 248 zcmVp`Ta`4UQD zU;ysG>-!uw*6fvn3TXz`Osn_PKlNOdn*rQ*=8LEh(YZ=dLUGTXIm`k>Lxr}4mJB>d zlY!nwrC7lI4C@h9Wf!uZHCraK>CqT)o;6M=D%yZH1EFtYvm(-y;v6_awsSyh;ONHL yI@c+G=5pT$M8t%+Do$BKRnZNUrW+_t^9DZEue{ZUtHF%`0000MetP>b_U;%F&^~TWwygPsc$OgI*9tu(}0;TY!Nnb+RG^PDs`kO{+n&LAH z=>WzO1f&T9(s(bh9Qs3^=PvtCfHklKjzE%SSu~`9!2%;#0e=b|^uEdiysI>^X>>{f zMH6fS#8Y(QN+3oDyhR7A9JSktjX((;XaZK~=^=vc2)vv|F#_+m(I6m=_X4(y*y~-W zKI#jjtgO--9-IUJI2(Dz3@7oFYoI`n$O+gOWf5Tscsfpa%x% z2IY_x6)xn*traPs6s4^q=X$W;ZvoGynhq00>D%PDHLkV1jg;c1-{P diff --git a/rep2/img/glyphish/icons2/125-food.png b/rep2/img/glyphish/icons2/125-food.png index e78d8484c95895968264174a8f4c4ff01209a05f..35f583278b13959f239440a6dd42b530f3bbcbe9 100644 GIT binary patch delta 425 zcmV;a0apH*1HuE4BYyx1a7bBm000XT000XT0n*)m`~Uy}bV)=(R9J=Wm_bg%Fc3w5 zQ1^rz^a#BIdyqH+NZF(AvO!3!vf~JdBcO5s_Xa&eI6-p*SlE$FV7C0GbFkX<}udWme|_J_ElB-7MLVl+Yf)DRBQ8z=NCH!VKYz*?Mn4(QlCa20i0p8!;Z6CN5KYQSc4t?2f~d$ zMDEs6#5l|iktMb-Dk1ja8VE0O|~yG=HM$;k@j$mnnSVY|DYQp<8j=7G0G0z| z?*LAI?0{}dZAo1-Y!1}k+`!n*zrOkLFO0aA*c?~_I48!gz4vDfKdB-}lK4CEd8k6` z2Yy9h16bi_xeWBbeR#i>dPPF4Wi$@T8MV|f9j_H?wxq7v*eCEJ3_$9yru1p_2%tgw zpf_ZVpGUzqvUuRj5;Qd(ysz;qISzB?MOct*A+|ZiejCWPPq2+(U3A7fQqM(mEM%=h z0AE>Hzbr@scvkqm3iM;>d6Fb<6n-B9eHD@bG)Y{%jFxU>E#$uqY6y-ll1BC?ng7_D dnmK@}xdW@hh&oxHExiB$002ovPDHLkV1o7it>XXy diff --git a/rep2/img/glyphish/icons2/126-moon.png b/rep2/img/glyphish/icons2/126-moon.png index a6ca515387fd3cb212e6c4ec7b963bb6d9b69c1a..d38d8df5f4af2812e160af81da20efa2e364ce27 100644 GIT binary patch delta 400 zcmV;B0dM}^0;vO#BYyx1a7bBm000XT000XT0n*)m`~Uy}TS-JgR9J=Wn9EJWKoCG* z5CymdmylF|(}AfVAo&hQU%B}R6&NbO9gtK&O4t(I0UQRSAlA{wGpm&)ze}X-Z=Pnq zUR71aoViLJfR;rdHM1AEp4zZ!nz5n+*!}$Gz!BI2{aAy#u79V7FkblyVmvR}MSM^Ag>8^%ksZne zt$;%$F5wPY7hi~w?3X314Ep^ZcLov&Flrp=Kq8&J7hq^AG3%pK+0?&HnV{NZomOp0U59X>Hza} zG)hqcrk8u!Ue}sqC{&VMTd{pkfyJvBxDE)ntN%*fK;>9@fPdl#;v4B9KHxr}TVZZ5 zBnED6xX1;$y^$EWsHqSj-GS&x3_OMRRS4Ni+ymzB$Y^Wn#IfJ7Utw37RUzaK)WA7l z{*I|1k=!G9@Lou=1IFW-8rYL)H(HLEV@}(>@qr z7u$d}F{R!wfjvhG2JGu(Mu^{`Q)1N&*eLnD=lOu>95^Ch^)4i>L=w#Zg<>-sh|L?l WTGI#G?mGDo_|`DC3S;YmVYTN{PPt6o}6?cpbA`D z)bz!STH*>=)bz!ST2B5Ujsl^H0-=cl7M%OM`7s2Zfg7Oh&)pa4EB zYqv!na3tbFV2Zs2n8vSwTc9Q8%L3Krm>oE;02;uhm@f;AH|OO6bKdz8?uz-cKndJq znzE%3Gk@XYEn!pwLtwz)D^US+2btfvdX2sTk3a|L0h2v-uRGV38tmgc@B&<5WbQC> z0Bc~iQ#(e)=Z9>G*;*aU_L^>uRhVa|R6~;ZZ!|DbAT(cesn+Lc40Ny$ulgzKZGPOlW#sI^IlS5Y>8RvyMQR!K;Nte z^NR*CNoVZeci^;>DgqQ@E$;ml${lDBlZW^xvVp$I2Kpu&Xn(*{YJqX!Xu<}r@fy^c zTSICCsf~n^hZrniJm>W2+fxWsykoP(g|6kY5C6>f0r_fC}9?LhOJt~Ro-mE{GGIGz)CICEb{g;VUr zN4Qs;xl)^hEj4V<#Et}s{*g7|4G*RVwp15iMIZhb29lD$M*C*z4SWKzq@$FXG@ktc O00007>$bNug5E s>Mo?x4*n`Z#tpD>18m#?8#ln_1WisIoU+uHOaK4?07*qoM6N<$f~E6n6#xJL delta 193 zcmV;y06zbY0^I?SB!8qyL_t(oh3%HX5`Z8GM3<%y@e}R;4|eUMQb5SaoAK1RvgHy4 zpdm1acL7q;fH!Htn>66fRt7Er^jMc-9U|?;{_Y3sysU_?)xnV2nCH5&V>JoJdOMdG@mP~8Y2(e`wojMY}jY_+aMmEISUw`=; vV}w|n8{%czCIico2E0iF-lPFYB(2SM4#00000NkvXXu0mjfQ?FGt diff --git a/rep2/img/glyphish/icons2/129-golf.png b/rep2/img/glyphish/icons2/129-golf.png index c013d3b8f5745e8d740d7a0f58c9e95438d76e2b..ef49e97a1dd7dc4a5f9ceb188eac7fea4c161463 100644 GIT binary patch delta 468 zcmV;_0W1Ey1MLHlBYyx1a7bBm000XT000XT0n*)m`~Uy}pGibPR9J=Wm@iMmKp2Og z5kw_&va)ir5*%_kBw_-I+(($3L=GHsd;=tIm32(cQCSD#*JWc2_TKJpO9M}GX>w~X z@9*BfS!Xa9&}L4KZGbPW7jSBMX*3#bZhZh#;JJBLVa7R0!s-hsP9f2As3IBQFK^kboy7 z%0#RX%279V9e*cM;D+yB`jHp{`oN{f_g&;U6QKnxLm|XDCPE6x2sgAHJcPPLoH&0Y zL>0>Mi}`JsM-x{83A$~7Yqr<*5WHAlv zna7oKZFyaaRX~ACTaGHvu8^r%mBMOmEm-AH5IX;V?jD)e3-|=yi%Vs*=DErM0000< KMNUMnLSTXw8P1>p delta 418 zcmV;T0bTy>1G@u|BYy#cNkl>?p-!5H}K8u+)R_Z?tgc?dzS=Q5HVYucAzbPRzLzA z1J}UZ%$qz7$DVKC8CQMm=f+hzzec+Dy#+M_-&b=#!+D@V1^vpET{*1BUS=lk*%|K zEYfJ3fNi3ueSgtcK#9yYz=ZGfx&?>Y7qtRPBs1JsetXjU_7BseY1#*@-egyQ9xR@aq z8ec}pY-hBb6rZzDfuziW)tRS_qg&Pw6g(i9dA6Bh3B5JDmqT4f2Lwbe?L&83wHiBwDVP^x>1P*Q5Ednrp-qq(${(n}AOO0*g(kx*GG z(MU9evP2Fcgs|kaM3)}sedg`Te*4Y0sVMz3zBe;(-prft&3}7urYV(5@h{`dX)mBr zGzVqO<#IvTdVo>jIuHXcO8X{I0+xW!z*ap$>2x~Kx&kXu2cy7qAYP+CA>V7jGoS!u zfZ0YTZq$UjfEC~qwHJRJ;=qiI?P_EJjVO==egeI!tq8mUMu5whKin+zi1ZZ|f3L_$ zhFwHh1(Lub(0?lR5|9JV17pA(umO~%Y)IRf@Z@9+B4d$|N`z719Om~&rM?gJ15bd% z0OJpZw_nC0vSviK6T&F)9%vJK54Z}fss1?d5?BX*OIepTeNNV7?4H!yM79%L6}W}* zBmhUiO<-5`Phf0%0^@liQW8~t9(F~>k<_or9D(7gKz~-zQ`nu40`r(%j`@s_3C}#% z1lL5?adXs#ivmfk2^<2Gs_z9bpz3*y*EuU?MA|$IVB&^{N$mNF<8Yu|6wnL&igkxQ zz_{wmVGigV#=iH2?w39f4}or>i@=8(bNRwW0qyTUD*6G&&cW<*#z#g5_%3ur#(G$& zF_$k~6o2SebV1R2w=x*N55^3BNbyXfOr?T)>_&~beBqJ{wJ3UD(b{+GByAdKS9FKa zn~JAX(FZl=^2Ogwr^^B8h@zu}fQte;%C;+7$AKP2r!aqNUuX{rMeDKpZv=_xfSUrp z6s;qwK73j1t}bBArbF>WsPywoHDv0!eBq+Ns(+$&w0ukD!SxG7S!^UP1MgIyKG1qD zU$`iscX}9m(6%sXvWGOVEIjQ}hNVqkvtDBleG70`_31z33l}ex$GFe9Oqj-Gl>m=` z3)o#u;vY>HfXAwy#%@Rf_!e|gu3kv{a4%s4lZ*{w6e(2?QYZ<}AU1(ZV50JIbJT^a z0)MmENE!vcQ0YCUfJ^e#{(iHn&qJrk@DjjP9Pi0tF7@{@ciA>szzT31o0%3cyIc=f zFqar_0}gDv)r&uoe!OQ+j`(a5_{9#CV`)7b2>6_Z+z*BVrXRp1Vl5!nfi=0dwb zAMU^3Gs8X_SUjBE%iOG#1SV+tJuP}qE+>Mf|F6@hj6d=C#W_IJK*0b2002ovPDHLk FV1g0z&cOfx delta 663 zcmV;I0%-m02d)K>BYy&QNkl? z%=>S4=bd+E3y9fZwASrFUEFF|-zVTD@D}(5d@%d~xD7l6o__%Mnlu_W&|U%k5;pt5 ztRdUAgfD<$3CCRwjgGYh5CS`nLp#6-2!J_oZQ9&$qa2xV)d7S+Tb$?sQy?lJ8=1Ks zk#E-sqO`y_pex3Ez)1x?Cq~wyYjk@LU|)>hVfi2a0!)DWBx$;3`V%vzb1#ezi+$e# z%*0qbW96Td{(m)Gbj%$0OX%-dHanG?tf_J;{1tHcAIDuB8W}4;m9f6B075ac4P46D zk>lV2N!D4I78p)35&27_)1u6VE<90J>8bGNq)U=%K^-mNvy6=j>Zlxmu3#X%uKoc@ z-p|uGEuvfzIJsNu0+OknJgj143 x>kaUm^wVMocmzBqx#Ty3rUO_xHvV<`ALRy23J{nw70dtt002ovPDHLkV1iINIcER> diff --git a/rep2/img/glyphish/icons2/130-dice.png b/rep2/img/glyphish/icons2/130-dice.png index 2981a6c997c27ff21f150dc49397085e04a1a04d..0bff011167d378cd096ccb8d732498f16b9f63cc 100644 GIT binary patch delta 483 zcmV<90UZAJ0{jDzBYyx1a7bBm000XT000XT0n*)m`~Uy}u1Q2eR9J=Wm_bg%Fc3vw z5eMK5thf#0296X$5u0{JcI;4h%>tnc7G#aM5Vzn2ltpdfShg9v#1W`ZisH;P$)C)O z6L(hEHGi3-sRiuIamcY+tsa1zjB9qlGFy>{wrzvHSO#*$1AieG=R$iif=%pjuQ#c^7>6DR*o!e$53GT$-qwld4w#|`UI1ks zFMt!EO1utGz6V_K2Bm$;l8K)_*uuHlKm9K_SdUECUV0CzDF7=I4R2jX5`(326zXvc_NY0GE323U~eJ zYkUw{UyK!iyC$$}9)==eC*EY+?TH1E0RHcia!)#jS!jTn9=lK9wYmN-cB8QZShD*( zP?pUVw$b}}zz@*#!}@xx0N{J}P#)g~xVDacGf|J=U0g7B4^&!6?7lt?J;E2+m>Dqm zG7;;Eo`f&c5&?ieh)~TZeO8y8MnmOf=*d_UlztC{g6J7}LGznb4CnTaOz{A-!@tuL Z^99rIVCZzskr)5~002ovPDHLkV1gy|*_{9Y delta 348 zcmV-i0i*u>1NH)tBYy!sNklwnI=tYp$`Va;V{J zyz$JDLM33R2ZoT36_L#Y68RVrDgk>-@~F&f$gge0ib(DOihSktS1}@_w-EJoG}t)p z6@ZQyQ!?#0Iy+Z|Q1|=7c=oMrNHB_hl8|o*GF;93`kN^Pe8a7Iisahqr#unlf!Saw zAtsDK7Wi`$`&C5L&KORFhJ11loIs0sGVM2vovT916Oc|K`BfsfCql?)72p#QLO#0y uPDCjANd)xx{7(4Z^I}N9Rc3+NUnO2-(0?OFdj1mt0000-YmeXs zE@L|w_cu`iaDSzDjlxm9l+Mgff!MV)vSWCSvn8D63b-GPJBK$o6ZDfU-~sO7Me1CT>aPGnW(6PR!>zh@OEbxG5%LUJ@~vV_f18cW@ow0zMY7nqye13cbQr zX|%}YOO8>=GWu3(QeQJ{J6O*NTDlKxOHFE=r`eItQDjy{tD=$ZNFqLuu(qFkb`hwm z6Tim_J{_nJxF?m_b+HlT4`!x+ hE!NCbK;2BdfL{nWM$1dy?KS`a002ovPDHLkV1i~G>N@}c delta 375 zcmV--0f_#D1d#)fBYy!{Nkl!$DwTzZ*x95CDMBD%AwGbOodFq($q@+`yxZN$UPykJ;+DIc`Sx!ASvCQLJys)j z0lqo{#MZ$ABqicDKz*eo4pBx8;NJ25m1^+?NP$bBy#-=aXMcbcn6JjZS0I~e0*`eC z$Tr6B3IKA57YhJi7g_+zKiAVO_bq`Q@ambbP`+y*1BSpA|GQcWj2&~D{6a1|1t$9p z0MG(vF#(1FAkJ7j*vBGtwOk(z@dff2qds3%ec;D2XHWn^n^cwA?4ujOXp6Wgrl`+b7jFh2 zXp=fOF5VPCfOpjAt%^4X5VT2kjf$5fr!dwRaD&?HfPkkVy8L{ diff --git a/rep2/img/glyphish/icons2/15-tags.png b/rep2/img/glyphish/icons2/15-tags.png index b924dca81a196f5c1923825b06bfb58e8db3e241..ba55b843b1a433743a86b906b1cfa7e3fcc1c095 100644 GIT binary patch delta 619 zcmV-x0+jv01cL>TBYyx1a7bBm000XT000XT0n*)m`~Uy~HAzH4R9J=W*v(5+Q5XjB zpPG^p7(t7QBuk2dplBfkK@dc3il{KCR!J>`R2yh9KxtT zycK7#rv$zW(5x+V3kUE3zl2Jh6)ICIQUy%oH9q~b-iABaD^wyE(U0E5oHa-hFpWMO z#STHpe6-;%dVlaxt%#iod25g&;H|j_a|X8;vFQ-VZ^mOmL_5x7dqVENND;7GAedwS z5_TN|`3-7CTtIh1exwQL$p~G+4P2{Z+lePwhibOgj*Hlqz#;h|K8~BXF6{4mSdZtK zT`rcUI>G$&#$E@4Ydz!(8nV-n57Mt_Xq2cBkYxrnZ!!D0jq3uT{; z@XfJFsKi%1%hoz^uxOyzEp$(4g)@=0r%Cm(<0~=MD%5` z3J-j#4{;Tz@I4_$uh5F$$2gbKgjc zU$csH5@b4B*$3GNLB!_mC-x5n9PxD5J3E{PJa*=zbk*B${&_^83 zzH^jHp0tCk5ljm2#+QXQJ0fiaS%8++|3;S?s{)oAe*lurY$>dSUl9NR002ovPDHLk FV1h@)6lnke delta 552 zcmV+@0@wY61;7N5BYy%1NklmsqOp-A*^nX|G$g+kvOt=WjLc*4eQxfZ=9>FF=bo8v`PAt?ozC-o zKkw&!&-b3^G*B2|4K25UR1G}9iiCSl_b}!Fb|l1DRJmv1CV!sg4A78g5x>GDeqk7g zusuVZS~Jk-p*;|$NAMfhG2I8h3!14q1C1WW4B>*v|7!wb1c$M$V!TBIrKpMB*f_6$ z4#)69%*3!rr%Aj{jMT{F5U`|cFo}^-r=B5h&KswJCp*j)8B=;5+@cIGb>8z zC+rsxKXFBXC4VagU|JY#>1mg7vlz!Woe-DtAt64}7x9>Q!!L1Gq)j(9aR;k$qwHIS z>7R zxQLmm532)k3YTi$+tO$3#X9UO`@Z9G)d$rzaRgUI`G2gdkJy6^0!DdVSw%vdk_G`= z@kRV8*71-8P~eux=MU>>|rWi<_fmVAc>U>pAh}~-4xP1dC@I4Oz`Xw@-1)#ul|1OFBGM^2g5Z?%!Gn>x}P~bhbWHevoI+bYG49<%( qds3f|av_!iAgc!cXz@S5a_bNDG;h(zNrV3Y0000S`E(00w8qku5E%jWq;!|k37%1U3_Dj^%Yy)f2S!H|= zHsdsE=6y^v4fNt3&Q`2j!l9`DIwfec4D7=ltj9JSj^=ivJ8S>MSW4iODwKx~oD>Yi z9K{DrT4?48W`9x^SV{w3xGJPhnYnDu63$};J=xq0o~AC+XbP>t#{bM6w@~~`9KpA& z-zn@)nP>QwDxeVq9k_-If{~bRA-Bs6;WEDBqOcP&GZ@VyBCmlCToFp&1{|xH?~7u; zsSr0U+|V)O_>o6Q9s}*TgssuoL2Sy}T|!+iGh8Lc7=I?R_8cDP(1COVB_U@i2CE$CENo&IDx&<{DVbe%?dj?o2X#{sXOpC zYLDUu?nh$>g!==g@V-X8&*rOAE>d@3BKu9RP+17Id$)hf=}05O>Lt&E>_tWYH?HGu z6mMF{|5_!dsI$;VJc{}c3yNElA`f%J_##x6R|Uphlp@bUbHbB(U4b!cQuJYNs^EAv vSuU@Xxk=f9y1o)Lo3_<&qb+9DK&$x!?AKBdQ>M$R00000NkvXXu0mjfhwTu> delta 577 zcmV-H0>1tE1la_TBYy%QNkl&QL#}hL@X>)h=f!@B!#3B2_ag{VkXNaceA&5 zm%x3^&3kY7=6y47-_C6p{#wE4Zg&EWq9dT)sMI-cq^Vgfj(^LwCe$kcwl$DQ5qzy@ z(uyykJi*{x=xI9b8HwY^8v4oWU&%cXN7iVaoa zIEcO3xPoH^@<6(PIiUnTRq@{z#EoXZgf7#!2-g*C!he3OP0ZszQoGPFK1TKc-U-jZ z1n%Q?6hFBHSC6n6J&8FiKQC2zjPFNksZj{-9kG(YrgjTg!*qf%DM|}#_`BLQ4()WlzEvO!UmzU>@Jaa zNtAgPsyg5rewD~s*P>;jzhu6eST27l3nS$O>iSC1YINy*8*MK-0@{s#H#Jx5qS1Ui P00000NkvXXu0mjfzf}zw diff --git a/rep2/img/glyphish/icons2/17-bar-chart.png b/rep2/img/glyphish/icons2/17-bar-chart.png index ce72952f888c6397643d390ced55ac3fc1e29e40..1b69f45435ffc4e02791d6189d2c3994943803ac 100644 GIT binary patch delta 208 zcmV;>05AX70qg;gB!3BTNLh0L01FZT01FZU(%pXi0001BRztpT_@Am=w}S3nqjZ6R-CW#*18xgpulv;B^Cm$2}w51ci%$p1$vx;u01dL zWd(-r@E7hYKmjxqKtlmEHU9y5_gjA#@v91`UkXMN_%;fL0%&el#1CKYskGE$cS delta 187 zcmV;s07U=n0oMVLB!8YsL_t(oh3%NZ4S*mFML))YT)~YTg^gUnjr3}Wi62U-jeRE% z)%4L%3?u+295Y!rASDE>naR4W+Ql;)Q^X1Yz|z=A3kO^1K0+a2P0b$Y#d>?*r5}q4 z5OiJfk{$xm21W0?kC1x-jXj{6`I28wVCV|J;eG-kU`+^E6Ep(WBybm78RO5y)S=$} p1Zw`o^i9D?*a&?V_Yn#KYc7&_4jaGS+MNIZ002ovPDHLkV1l=@P&@zt diff --git a/rep2/img/glyphish/icons2/18-envelope.png b/rep2/img/glyphish/icons2/18-envelope.png index f99067781208fc26fc2d38b0a51e96569c9e38ea..4964e8114bcc0e67c50d39e9de4e62510733fffd 100644 GIT binary patch delta 375 zcmV--0f_#<0+9odBYyx1a7bBm000XT000XT0n*)m`~Uy}LrFwIR9J=Wn89tsFbqXs ziVWZlvO>B+SMUVM!3*T(Tj85;UcsHfD|7>Ag>K*xdXNY=LJ~(50il52(GUrKke>v+ zYnq1t%vAAVtb5JhRR^+#bFmc$NEPs?c%gdo-9$u+ zfUV-UFcF~@kXpQuEJ7o|s(2wugk}rL6*b%CtRm{IhatQ2Unnz0KyHeF+!O)1`2|&a VNxayRnl}Id002ovPDHLkV1j1vs89d^ delta 294 zcmV+>0oneM1Hb~1BYy!0NklRbcBv#H)-M`_64Fb z{NxI9HRUA6L~+Ef8;s(>~}1U^6yG?|ayj4fsn9xd zo|v$TfR%_9_dtBhsR>w#FKc0L8BJSktBLaDe397|=z*DartS6Fv>h#aFS%;qy$fdd z`o1X<}IDf&MrG|wuFEmEbP90@6CIeH2|xUGS`+JKz}SNpTPAH<$k{(qJ9Xp zlGg4DrcaTabGHBB(PSpEQpu{ZUIB!7tpcf&wvAu{(-zp=!or5e5nXp z0~S?GjW^}_Gw=r30O}bw4}ovM6gc6stTsjd2$+QiqD|l?&~Ri$>%2}n$)@-`4-G_H zLg&CXFjv~UY=5H&9^%%(K5*=j&wvlW7H~tZEs^<3=n7A{&z4?@x&6sbX4*SNONQD)3IOBDBPp zsvpwMz<(OBr?mC4hw^l$P2ex-wqe5Jn#f{GdIuYe&tS9(%rIXWMwt424cr6PG27tC zV>6O>>%e`nnTz~6iqjaxt${zl1K>7rX2}N<)Ne<>&ElbDA9EHsBZ4wo310xd)0Iya s6+B#RFEq%wFO|ywkGo4|a9f|lHjKGnw2f##p4n{x$c|a0*hd8_q74=jAm;x#AMwu3cJf|{eV%af< zPR370Ff(A^puZO#9r0KMwniXR;LyVEKz%2+LlgLhr|KLm)Kg$9auW%EPn+sKG0K%vA2VMT+0jD4mLfJ=r*Z$R(t!1a k=b-3w2L{3Y+vwQ%1qU@}E4CD2ivR!s07*qoM6N<$f-YmlK>z>% diff --git a/rep2/img/glyphish/icons2/20-gear2.png b/rep2/img/glyphish/icons2/20-gear2.png index bcd50966cb694a7d1f1f63c4fd113aea60dfd34b..38d1a1331cbd407b0663bc5726f01f5cf975df3f 100644 GIT binary patch delta 599 zcmV-d0;v7h1MdWoBYyx1a7bBm000XT000XT0n*)m`~Uy~AxT6*R9J=WnBQ&VFbu|j zKHLBqLEXT&L9#)*feU1Tyk&&Eb%e_X?FP9G>Jc5XO|?b9;c%F&JAY>fR)DL}cd}+tSP85c zy!`>RB5O$rx$N18tXY&qRR{^xcs1?}_-L+h3`X|^@3*4A0WOAje}ZKP^3YMkuAwFM zx?{mzun_Q!d$5&4IpP#5?c={F3WQWHCI~$(dj!(2|DDJMc_O%8M)} zk*}ML+9W>9-G62B{m7aUl?9{TRjfY9$!j14zB7 z1 zA+!%Z(({pAd#9eXk6Kf%Et6r*0X5taysrh#$=qkp;wEk-zoC`AA%tYr?pO)vi)xaw zC**+66~762Q}thA4uKN(O!H)(=$+iFPp72`+%iCSO^rXvy^Gf0Ercxi8;wuEOEmAI ztC{+P-%zfZn~R1aVLL+D5RFfyyK)ovCXjys=(6Yf0bp_-JSv2GLINXWQ-5^t9nb=( l<4(pe7z*2;C3J# z>~-LMY#3t%HNfimW*7wl^GNbQ3jiZ7jE}PoNJVY}4S<45lX-40QV9G4u!{bc#$?AB zQJw%Q040E)+Ij$n&1=N7lEyqE-x(^=#ygavF5!ssdQKAR0e^!qNQ;u@IE?@g2_Gti zJ;FooR05;N$S<+71GPzVIgL;9fHXeTSCYu;fx@xa38(EAa|s)R>b z9fZnV9_$H=P);O!;POX_o3ejRSBoix9&~R4V=VP?Fe`ndaOotDCE$ze%gN|vH?m>H z_&vyal!#HG5`Xg~)E?#x(iUKW80NW-(;bz=bHI_1@mwD}7&R5wz3RtQyCuDn`-fY&cTnOyG% om)U~uN9>c|18YpCYbxZlhX_jviBfu4J+#MOwp2^B?6H(mT0*IoYAMwvT0-bCrKcQo zSW5qZ5K0gGu1;cSvh%*f2>WHs`_B7&o_T&V-kEo1rqk&-%YU4!yMR=t2I}T~Oi-`a z%Nx3gb+pjLwQ&3=2H3`X{2mwF?RHDoQq>)3;w29746FVZFSJ*~*g?=Xt2l8L23pv| z9W*A;H-dIA#3qqyppCDXkBFTQvF(%sQVcBM9cB}9%!V8bu?bQPyue&S{D`@bD~ebH zEi7gFeO$+duz&B5i7C=7iJT9y2G%m|FId439EJS~K9tm~#}pE4Aba&6$0yN55o=(OX+O!)JSwRf-yTp4sv^47s96G4Kl;1>@N(|Fl525pqQlI|oL5E*Se(L5@>7^PiMc1Nc)@EUGc^ zIw5u|_2j9O7#!w_8?BkCfx7tz^yFB)dlo9b00000NkvXXu0mjfD`W*A delta 414 zcmV;P0b%~V1h)f_BYy#YNkl!IAQy%}a^Jjrlgyi!B!HsF7{wOg ziorl^9C@Da2Y3bEfp6eb&R+rnn6?;4C|G&MdW9 z1?h_zU_n_~lz$u-H8-k>lZQ00t`S&=nT$4AhcuvQw~=jSG$Hs#rf6;@W*YbE054iA zp(qV0}{u0r~JMDq#O)j_ci7t7Vu->(INKULw=_!q$nG*73H6X z40r;bYx2CvwM@7x%uQafGTLP7M20W1|58SyVyHr~(HDCIzc@fxZw_e~1ONa407*qo IM6N<$g3$)Mq5uE@ diff --git a/rep2/img/glyphish/icons2/22-skull-n-crossbones.png b/rep2/img/glyphish/icons2/22-skull-n-crossbones.png index d11ac2d6673706a6d579425108e621b4ec7e887e..b3c9415661f9a761df1ec4a7783ebf672b39524a 100644 GIT binary patch delta 1016 zcmV@3Yq0>wjaPz1Cjm&gkv!)eeJ$ zgKcFp=)y`|g^MtWgZKa=m@cZQzrVk&%t>WDYlE4125T`R!M{fcrVlT6(r72pg>kHt zcD{yLcmZ#B$Zp31_!O6vkY9;cJ7KsJ0rcTA{DwQQ2pe)Thcdi@NV`kOlS=4B4m=pg z>##4*zZTB>Q-AS!8NST%HsJx>TE%$PH!u(9;&*lDYj`J)N7S9Kp_T(HD%!6c!1-}J z6Q}2R-Elmt1@F|VK2!~0GBe+XljHnCJeT3U*Me90UPz&84t$lFFU3*(to~+dxTXp3 zn~L@;zkzAIk)vfD{7|SsDIVeCtAtLK(c?{c>#(s2Z+{FgS2f;=0Di(v3HlDeU)LjZ?lXyPf%{&j`YJ8rP z`xl$lH|Ufczt%7HU`w3Oi@Gls0xE>E0W3+-mf_=s-YZ(@`8BgPWutHaWslHAf;Jw< zfeh`noPW$e!d)OIJFXEa8%RV?*5fasjII)zx#c)pD6c(n zZ64dzbE_@N1hBaYy$5@QUZ@)%MfxV3hB?CS|0yK}Ml-Y>!j3ofEv!p7vWAlhtusTDm!6T-J`E4+?{!fuWx_@j}x zFv_;V5e0ALGC6RAdIy=sD>w&t;y?jC2XUh8oVYfRgV9zYlnG!jRww9V8vFesI270B zu{zo+gtE=t`~>a1k~*?TRhyKJrYIZ0HjV!x43*T8#hbb3>1d-c$_8*)XxN6aRj4fa mKeWnVU(~TR>g-nXIQ|C%V#GAumXP@X0000^&UH|pfd1NS`U z415Xr4xCOuXN)(SfIbKE5hj~Oz-=Ma0XzgYfLn@eA?CXoYhP&w0UbhSO|{>N5nWI4 z`B+Ms25$Mihq{L(!Mi|77zeeEQE&$cc3KPZw3J$Ed?0Kr?fY>o8wBKlbHG`#o&*8Q zhIpGUoN|T$HoP#jEdhh7?Kkks5+^#nmlASxr6uHgkbkuq+Ir<0uW=?+pX0!#*zc%T z>ZKN@99E=#T#pjQ4-zhg0C)>Lm-`vQQlUV&wkw1)zC(5S=qDE;dbhm31NEL(f6B!3 z($|I--vTOzB&`X_i@=;A#vI9~v?*4_r+@$$RtX*e+rV|gT}R_2;WC<$dySlo-4=0i z3_I{j-G6bP@a3BX7L{+0@FmV0h-&1e@1BaW2wasM`$r)ljlIEM`xK;)&zz|{ZV`SK z=>w*f?adv$Q2&k2ZH_W&tZeryE8#{UH#d$!Qmp&`Wp0000F+&mhM zqI?IifmQs(SKPtY_=e$dSjk`|0S#aSS4#ckSiw2GtYfh45bBq%FW~{Yc!pjbgKY{p zTKvX1iNnQp7f&%?)o7an&QJ8O;zFsvDD6lkv~>o$xHd7igEhQ~7;b9^F8ecl;FX~B zv?E{5qYDD+{=VyAi?(JdrBW+NgR4?%_p* zu!JqCoCu++faf?HC6%)9X?%|wsw$u_wgWp-7_Q+*z6cAosT(C4E4l8Yd>fbF7vmy00x2hB>+Zc4lG z4Uh4uDT15=j!AigRMd?NyCvMvz{d>C&HfvmGG+p%jb8&ZJ}AN>1~vcy002ovPDHLk FV1haE>skN+ delta 410 zcmV;L0cHN21hWH>BYy#UNkl1vUI7x?2PHs{W2PY~10u@~y1VLO} z6#NA)(m_fG@i#a-2~G|wh=RYsK@`- z;}y6i-1{u@y_}8$hsd;yQ-J=_PyoBGJY0X!OsTo*%D^>1vc54>Y%V1{F%#Ig$MWoWD_r-Ho@IWP9fJ&N@$gywn}Ncv`Q&GR4a#`mYgcrrH5SimWJM2dWs%;>7mL}S|Xu@Qt}6s zkke91sq`@K%2*MbcebXh`|$Z@-g%yH-sk(?Z)QxR-ENy?oPVi1fvT8z17|a$Zns-L zoy97y-~d~Ai(f;sSvKoc(&v%7#D z+(AEhEk#KU#(zkm>I!^`{5=mXeC%ngJ%$GRxc&2y)-HX^aJg$24aTw_161Ej}e>WO@ zjQ&xy0d{b84EIi#&^iu>TJsp*t!Tq&9;08+B$73-l4jJMgw#h_*1)->?j+1*L=*ol zG&N8+rUvRp_C?nC%lwh?->$&nh`hnfpO!x|CVmB`2I|Jtz!;JGGx0AOn8}E;2A(H% jV;{3I{kdB+Cf>jw@<&U7u)s_j00000NkvXXu0mjft90r| delta 380 zcmV-?0fYXA1eODkBYy#1Nkl4B-ZGw#mx;Ah0u}m>LGcsA20|U#QH}Bn>gzRnsH1wFg)CNN7 zeSrN4JwAauU=0j`bD#naEOigS6YvI{0k@XA&NKn*3z%4Xo__+hs;fn7Gm#!49)b?9 z#K;J^2j;-BXhYx`c#&&lZ!WbX(N-w~EX72nv@KAoPxwNvOW8AZmFUZq0oGz-0Bn@L z0S@`2z5gm2(j!@b2DlL;C%~i9rz*fy>9y1%XG7-)H`oGWW%deKs9?tE0=QP%IKu2G z0n9SLd(EY+Hg#phxn7567E?BUhd40v@ltdcpg96Q9O_K(!l8BmymvL?8^Fa7bPJ&C zo$39vP!5oq93VBm|3W)M@4o@xH?n*mh(!*Nnj9b^US4)7z_-sK-vF*JH2>Z+--%Px a`v5=mt2gGs7UQJ=0000V(b{(^Aoa^D_O$xdGB7o z&)AHn(d895B^=q zM!?lz?E)AZ?0+$_4cG~I?@43~d?0;(LO*hSY*%0-U(q6v`*+2aZ$F7 zV4Fe{<*ZI)&)dr?`Gdu}3{?Ct0ur3#F{2Q;S(b*0)^fjsfohCM4Jt#lDr+N0SC zTLC(9?RQ2q`J5Z^ykXuNzT0Sq5G`usDN+xqXMaJ?fp8p2m33`AM(Sek(^;s4>|Smc zz?V-)A-{?1PkM($=IGOrk0Nfufm;i`0B<;Un|lZmfjLsFWvd+%h&=d@K#cVJBSOCL tZ2u2@3)mv*;x*6PF#7*<_rVyvfL|;~QSZH(0?_~f002ovPDHLkV1o7PMn2H{6-$qFgX-PuV|`6NqKYv_|U|n20EY#fEr*s5#Fm^(m)8WRexn+D7*`WzJO~3cqlD{ zsR}(B)(*9^EY6vv5@{1!yg-_y5^d)&P-ZkxN_jL%T%@8sAra3-_Ck^))B*>=8u9Ve z7`UGZasW2KC$MK4+>~ekkTi*7jauX8gwW5#cS76TscLTrJd6POGB{Rhy@{bp_bgRs zYH20B-U5&cxPJp)N9I+|!21B+d?{*nKzhkFiQ|}$&~IbU@!uY*a=)Fu0iPqMc4Lz= zR<4Vz1a3yYuYlXs!E)`uutKRTO=M&-&;;N$$LfW}K@f*O zj89_F%EAYrSQDSYj!H_k&_XH;sw;%zpp`E@yxsEM&h^$fSlqP zSC01k66dJ_a(*hWafA4j1V{-`Ca;a(GN^oV zd5{D2fD4O_<}XB&2l*h|5!h-1hgp=1q#bw@*aiORp)T14HV z?qZ7&2Eoz))ft2NAR-LTdw*oUx&SPH9LuQza$^=y#tS$CTi^_QawfAQw@ZNIs+@0B z_%4#nTgw75co**$1>TA90EgBDT;?B%0;`q;{AH6Ov2R7d!G9Z}#Ipr~KD-r3TomuB zo_W6yNp#BhjgonP>`Q3jiweXt@AodG|NSZgshRi3Ihije;1?;A*q4CM76=t7L;cKW z3&e_)3G^l5)dHc7S?o)chF1xM_VYs$wcy19&j@@-q87YZV4o<^m#7IZ7FY=cAiqdO zoAgk>6Fl1iYewPxs*o6`o~&vw8}$;h{B93gfmaC(Noe--lL)xwbOJW~4&wI-;O)X$ f{A1sT1la_TBYyx1a7bBm000XT000XT0n*)m`~Uy~3rR#lR9J=W*s*IWw`*PpA=bqnr_vD^rrQL2@WG>Cyfq$wj1tVSwLs(`iF?;G#a6TA@)vpgew7b1R`o4;x7c*fgkr!+;Acy;3Q zo^b&;h%Kvcns^Xf^B=Yjg#c6{Rlu=OpRC80XE%49Mf#>tDoo=D+bTw%bOC+Axt34@ z=Q$Pj_c|-#RK17;Gjg6{TPWKi)7Un{A2g|~EdSV=GfM&UW+`CaEWCif2Nq;Ci_fc2 P00000NkvXXu0mjf;#v=k delta 539 zcmV+$0_6SK1hWK?BYy$m||In}tQVFAUG_?Cw0z z@0r(aVC+BUP~8FKG8a%ca{+ZT7cj*JZejtALRpCQ8x{N0P=C!nFvK-!0ba!e{K6=f zA6P^aOX#LLu0p_;5d7B?-*j*X#}9aZ6qiyO$`vrgc|k;3j^Qni6zX>HIbPpNX(V?J zJT_bK@C`47Y){IGvW?{Qzz`>+os~AeL_5OsXuDWRX&|Qu*5m~*e!qsFSQmnC;#_J2 zhcldi%=os*W`DGk;IBlR#4G|vcq3#jmyR&@N5W)YjdjVC6)?c-=rETHxQvz{VpWOE zPbedx7<_XUXOXV3D|hfo*uavO%>76eFtQu`qL3|kTEf?|ko8kSG9ICiXC>O$L+UcR z5uG)0J=&pg#`zm9oW(^U;{&|Hhxoj>jLt-A5A>rgj(^iO?%~PQyDgj+GJYo3ZTmCu z33p`#Px(o_Gj)I4?g6eF%jA4Bz$G+t{v-p75f`k^+Qt|^MB&HnG2|! dxq!O)4HUK`K@i4& z@kFrAGuTE*W3V!fa$uDp2&wNOt`GtN;ocxsoJ_Vctoi%&zBZ$uw>agngx)62v6mVZ+tHPInI-8R>lsa|z642py z2}Nu#Y2-^luVS4uv;_pfm6UDd^?_zUQvors1inkk5_qM!lYzYZi(h>kwh)j2Z6Gz| zRY59k8=Y5dQh#UyG=Z@Nw+v%xb7D%godZ+g2IvEsWg9vA($>_5>^g}D4#D$}FmUOB z#wzrJ`S7cyq1G~*0z(7;AxaB@=00%i$#*BT1O%AM5qN4x+002ovPDHLkV1j72*!utg delta 411 zcmV;M0c8Gw1hfN?BYy#VNklJ|`+ zLjXIlu_A*yfP3IpNpPfe4ovNNsv>Bh+l5xZvDM#!mV!i?LVs6$2C=fb1j+y|x76K{ z3d$SM%y2ZV&7Dg%1K0fAJ~!4Tfno-RIXpuVm#eb`cqD&qMfNVKGl0n!abAdwLplR< zpeqpHHQ$w_&?_)<6hAVbm9K#@;VCr^)DXOg9)Qjs!aKm71AnlC6nFs!CBzTR#)I3% zNy_)hvk0bMynmis;*F^9PI!z&0<=qTwsHEPdCkBR5a+bF$o~(B%_bOL0pz7bA9%LX zFKDwDJW{Ba@fQIXz&i7OZEe{B>p5`;J6L2yo$&i{U~YZBu=ooBOiauym z!A%mt88F+!Zf3SY{2sRwG3B;UFIzx+tx^dNccXRV0~BuaK!#5G{*M3v002ovPDHLk FV1jPZz-j;h diff --git a/rep2/img/glyphish/icons2/29-heart.png b/rep2/img/glyphish/icons2/29-heart.png index 18ec259d8ca575bb681e96524a079268d8b32d02..27b5c3fa19af5b4122dac845c57a41d6d9d4051c 100644 GIT binary patch delta 394 zcmV;50d@Y-0;272@=zvcbpOtgYi`{38YvDdf<() z5|H>zl4>E-JpVM6X{%FooN^_$^}IB=?fqmk*cw|2#aJHNv1wydsXL4Lq+G(*xcwrN o4s z9mEfU!;BA--3{o#o!Kw4H|Gw4BpKlNV{PUJ&}t1Zw-z7Z4D5kyP+OpWGq(26hGX~M zLnSAyYQ(n$ZobNqv6X@&3H&g`7`!$_bVC~mBvCs>fJ4Fnhksa}tWOc4%!>AdqIeen z8=YN?46w6?(0EG%90ff|y(ODR=;jooQph4|x&XN$eC|Cb3*dm0VStl@L)_?q2Hl&; zy@!TD)vQ@gnq^}ezyVj{KJ3!>Sj=r=;^@x(RRDbD$6C#6X4F^n1-?lzpShuC?s`d0>%~a z3=F;82FQV>xE7$jg)V>vf1AfXFKk|pQeX=7EPe-`Y{c?YVJ(MJVC==0z{JMTybPtl zz>9wZ^SwasXp{mkUc3SxfmbhA32Ql&0y7S0{tURW5zEhnwH!);3bgPZRS+gOU5U7(W z7wh&wYElSDH*pgJnH>)?7H{$j+;WhSZRA)2-?cFsu>|gbHE)xto~Q3+wvI@Pd z>#pMP7L3(E>TRT!W&-SJrcf#vOC^PJejnm|>;_64l+nPr5aa3|~fF^8t0@GNyu;V8;Le002ovPDHLkV1nn;eY*ev diff --git a/rep2/img/glyphish/icons2/31-ipod.png b/rep2/img/glyphish/icons2/31-ipod.png index 222319ee54b01f913f03cb74fcb3f9485806932e..41c68bcfe047aac9d83c78c7d9b4b1db91549afc 100644 GIT binary patch delta 440 zcmV;p0Z0Dr0?`AIBYyx1a7bBm000XT000XT0n*)m`~Uy}gGod|R9J=Wn6XO3P!xv0 zh)bbsp(wca0R%e=PEM|ZlS7uSX@?d>5gamT5G+1|k5Leu#JLY3GzhK*C&8h&7_JFv zbN?Cw`5=Uodk*LP$;ss;p6~lqnQfQgFbw-Z0PGY9kAY}79Dm-q)Uf3eO!49|ae-rg zX93IN2Y|Q6F|gtb<0@dux^3XpHc3BVENca5J6rGODI&GDHU zKN%_k@4z@=H-A`+%x~u0NUV*GzXa7gFtO|#e!sT%%{jUEPk?hpV$~D)u& z6VSHommFKRrK(!!$g)SkH;X&}3|v_2$D+J40eiq1@MP>Svge&s<1azEjot&D9G?#G zAj~Nh&|z1^Ik2Jd1Qy=H z+TOz67z=w#ELaSgXb@*`G4hiQncW#?|AyW9O8{j2FnY@P6%YZz2Q6~(YGjHQDszX* z{F#68DIc6-2K^JdJ} zZ~;vT41r^X|4h;OwUPkjMQZ)RcTEG8xG6O{BG*D8a3S24TChbpdc%^p2W;QG30%bUr2WbMmhO|&D(hkEp3&VRw`&R cSM4+FVRexOUrPOYfL>tmboFyt=akR{0KVg9_5c6? delta 189 zcmV;u07CzS0@(qOB!8euL_t(oh3%L@3cw%?1lQ7s>5u$*`vZHi&`Z_2mL-q@Z^mQ{ z9!vmGV3qGKCV<_X$rX_kvlHP&mZtYe(cGOeN_I?DPn{`##8ytKjMAS zIkUIOcF%qXTtJNrsBr-`E}+H*)VP2e7f@qfVAY3){+P^SzBU7Y3-l%zG~NNU2V3_P rZYFjZcCd9!77}Z$e6S_O{2RCcW0#@o^O6fUf02}d|9e@Xb z7$fNd?hA01$32@l3y@#n#xv*Ha0DD;TU~x WP8jT@muOJ{0000)WZ0Tn7|*Sj?C5U;b}@O0LRJJIz(B?7-p~8P_-&m=DD) z=U(xMjiH2L;|{BbH9d#2T0TcFZEL9Lcz@{Lg3ynfN+$As%+ykz^3j~@%Ej9k877E( z{x>M=xp19#bMyN7jMWVtwhEoL6B78(D53D=f!s>|6Z;!#nE8!n>)MA@9N=aE0#8>z Jmvv4FO#tQyMn?bu diff --git a/rep2/img/glyphish/icons2/34-coffee.png b/rep2/img/glyphish/icons2/34-coffee.png index 56f338f53a8893f971d90e83614857e9e00a5725..6d50d49f4ac8a2849405ed28e63ad9564f03a6b0 100644 GIT binary patch delta 435 zcmV;k0Zjhl0?Y%DBYyx1a7bBm000XT000XT0n*)m`~Uy}en~_@R9J=Wn9)(fKoEw% zI2I5)paiTysX**NXY$VEEpNfMyr~ta6%Z?c4xof|KswNeO$N|}VK0l9%=pdhOai&P z{mI_$9zhgE44Dhx4s>Pk0xq=!vMf9H^%S@P#+8ND=fSD-Cx1zz@<%P8g*h-o9Nqvc z-~%WsI~!I4QpC|GM8F0pjpjaz)gE|61f;+c*jBa#9*ov##7e+BFafSAy9aXM7I-sS zqYPsn$x@@g6n|hzh}4NSyUeA+w}6@uDS9LAK%W98NU^I4kuh{ZANM74AX3qX5CU<2g2VCC zw}299yRVTpT#e5VGU-@d-auinZh=G2Z^A`DY_M*O(JX<-ML>?U0ENTYg5T{!CxZV! dcRe$B0pDDYO_rdsOz!{y002ovPDHLkV1n58!ASrB delta 328 zcmV-O0k{6l1L6XZBYy!YNkly^h$UzR+JPkqHed-6 z8xSkd4zvU9AU<5g5Dn;MjEro1{4@ZuWJHrVO~IA9B&64fpcm1(w}Th zGg0sruptm00b^hY_=+WgNV%Lk1!a@vc>zdz+4W z7JOprYr3mz>&(u7!MK9?U|_)qhIzrLQ=FeWB{lpFjDdCYhbu z#54cp4!s4sjt5NdahK$(Pf5+>>THym!I=Egnn5~&_0Fq$HF4L((EhCrjdB}U+vNWW zXL2WSg+y^@**O_*cpO>7y2K$qN~_knvvaH1Rgn{oj0H?W31>II@OmfwK*Mn7wMDa- zig)TYo}T`(yJzq5ZEnE{D%Wd$&t&I>2q(Kvp8g|GV*kGh%Ii)F-xPWL*G_;XMi_=3 z?{%2GxW)Er*#G>0g<@IW7Thxfe#=}rao0tG`5f=FnHJu8+KWD9Uo-?e-iD#-m#X`R SPaS;>K;Y@>=d#Wzp$Py>B!zGQ delta 256 zcmV+b0ssEr0-OSnB!A;cL_t(oh3%Iy4uU`sMIXjUr8VII7KVZYkZ?%6gt4&nM3fXJ zHqv0>*cimHj2Vpcl1<3&XXgKe4Z9K0@xv^v4NS!YSmObDXn{RY0TBDKvfG$#Dz9+(v#z?wVQ0npo71zU^&0000D~!On%o6?ylA75{PGTqnnZ-@;7ZsL+nc$LT08jUpo^Lf;3H;GYi)R znBoPv#tU%GO5&X7d7pU=T!9S`b@)7iJ8%MCT^nUtHo7K}fPVpQz<$6d0*=5EIM_&P zvxTl_#{0X~%U;|MHg2FfoKwerA-#d-$w}?D34s zn>wZfbcfJ*csVO(-$Gu1YjgyZ)~hhsTSve}C(#H>wYP}C|Cw`)7vLH%z%?IkE;J67 S{uJy00000JhJTiwy^HVYWzVv`lJDe2FEw#)j<%F^ zM81T0DJ?&3K>~mU6?5}mKrT&yH%)*ymI7t~4*)%Ya58$bnGNG&F&d*F=4cq#%uz>+ zn||0#WYby24VwxB0)12dxOOb0J@5iB;Cp>P=ZLl-5xY9T(SrLiYCCD>IJMebCr^y-_U~q P0000nf diff --git a/rep2/img/glyphish/icons2/37-suitcase.png b/rep2/img/glyphish/icons2/37-suitcase.png index a3e94776dd53207ed37f5c334ecb5e28f8d6c4e8..124703b70f9abf757dd6af0142a68ec5842e3126 100644 GIT binary patch delta 279 zcmV+y0qFjM0-B!3BTNLh0L01FZT01FZU(%pXi0002wNklzIto8%lGz#^T6VihecH7D^Zo+RQKY_wS+1d{BS4a34b7^5;PykfbOIVrHg2 zz*tN`o9G1=lIE(a`i_^t4cGwdj-D5A2Ts7d>p^8%de0;h7=Pdb><4;M;0VltLx|9j zuh7=5IgoTz-s&AqNP*O?kDi|2*(y}1RA2|xz{eG>ee=4j+I`J^?J~TP3Y>vVc#nk4 zWq2bMm~!~PGNS(un1D7Wpp6M=V*=WkfHo$eja1+{$rK|pqykrIfRLxl@FuZei^`aQ dHqi@w0mD@%1Q7fpRxtno002ovPDHLkV1lV@dinqW delta 230 zcmV2JBQOAIX6%6za5vOtG8$)v=D|?cEYYqM zH@=A(OU%|vH$7b#kjnK_zTUVlv}fST>mEnU>-F4_arJyC8eb|juPis7U5d<+H8p9s zP!j8@aZgJtM|Vx}9q=X$coPP^2?O4Q0dK;9H>)!sf2Y5JT0_$hT!esiKah)tOH1j( g>dwH=5eB?@06W@`lRgS0RsaA107*qoM6N<$g1G!-Q~&?~ diff --git a/rep2/img/glyphish/icons2/38-airplane.png b/rep2/img/glyphish/icons2/38-airplane.png index 09cbee24c01f32e183d374690b3e62ac4dbb38a9..5d593670e7cac448df2fb6e0a1bfa0f83d897966 100644 GIT binary patch delta 363 zcmV-x0hIo+0)_*SB!3BTNLh0L01FZT01FZU(%pXi0003vNklk>3pDr>9mN{U1+4_e4M?4xpU0vq_4m&qpGCpJRl2qz$flxuhDT9dI6s0 z8jMz;P|kBPm1GGf@5COSX2zmfLf{QJI^sv^GsRM1&2W(4|1)MUW7bxSS_<@B9^Stg zewbTnkCgn~3)E=;g?x;A!aMLii64Lm;1%O96s!DgG%;BqH9x9!I%GF};8Fkp002ov JPDHLkV1nYbqR{{V delta 278 zcmV+x0qOpR1F-^-B!BoxL_t(oh3%K&5rQxbg}*uhqsRtsB5dFUtiTLTzzS}F8!&<+ z;1BadxkhVAsowS7!*e%|Z@RUy| zH;RDVC<1b$2=L$v)SmTPeCC)9tqb7mj5$p%8G(IZ!jQe=uYU*#$+`xMYHXHu4Qs1m zn)M23fWhM%#8)Y2W2+H&NC{fov*gjlY$iYpI#hrr=IdC>|3Ge}5^xDzGePY5(yV{O z)hFOHyXeNF89$+sy(YZYP5j)r2jD2rXI?)c(}uPzX9b*q$>W>E7d0+5OF2e2K^ddD c@%IAmct(3dCJ%aQLjV8(07*qoM6N<$g4v6J)c^nh diff --git a/rep2/img/glyphish/icons2/39-spraycan.png b/rep2/img/glyphish/icons2/39-spraycan.png index 819fcd83e0107dff75ff91d5f915f1e7dbe97006..f9b8645ccebfd79ed4f7b832c7ea29f4cf7c9c89 100644 GIT binary patch delta 332 zcmV-S0ki&{0_OsdB!3BTNLh0L01FZT01FZU(%pXi0003QNkl9cgC`uU@#~-;nk;4uz2XcH_*k(&Gp|4pZ3^gO+*prs zihCU53U7`5j`_C`L>mG|=4~@YuVL@iwyO4-;1Wj`Rrwbcxc#NiyG2!ALX)>4U@yRD z5}G`p#A_%b#YO!_%!902T1OGJ^(~YIq$UeUP0T5@kx?2;!14$skI~g+0jbFXQd8uA eqlw7^Qu773dL_t(oh3%KI4Z<)G0MCdb9f*nn7$gl1LYXBc6%{2NBQQZ~ z#4a=}zyhHmQe++x$#&k6{-iXC^Zxs{Y}o-V6K1BJKqw}lji$g0IE4loTi^klfi18A zmNA01iJv=g05;ydC9sbWKYGF)S77z0c$b_7THpyBfwho)NqS}-xB*o!!Rqs_``!RM zPa=yB)IxQA>fZQ%SF-3pF+iaB@oy74zw0ala0ADM&LcAUlX#veZjx$Cq!NJdrDaP< z!UVK20c}$5LZfV@sRX3c*|t#$6VS#4w25&aP-XHRFad4edW-Vgggs7@00000NkvXX Hu0mjf(iUzj diff --git a/rep2/img/glyphish/icons2/40-inbox.png b/rep2/img/glyphish/icons2/40-inbox.png index a089f06dd217314b0382ee77e3e008b3bb704b13..5cf46ee7e313e41cded73fe72376dcf68d2a5bd9 100644 GIT binary patch delta 451 zcmV;!0X+Wm0^9?TBYyx1a7bBm000XT000XT0n*)m`~Uy}j!8s8R9J=Wn6YZYKp4k= zsYMXF3Vi@4A3$*G1Gsh-Is~VRP$*<|3ls{1;Og$&HxNo6pf0|EQzxf_*dbpa4HwOQ z7deFdKoal1|KIy-?s72*!;ov{#`geRsRQ`t)>aV5aoN&i?tgtyMifPn)p)M{7pNjY z1K5&$5GRN*8neaTmX9u-Ci_V4;3x}y1)SV1?CFLcIV0002ovPDHLkV1fva%6I?( delta 345 zcmV-f0jB=k1M>oqBYy!pNklQumOD6d~;V1l+$!ev%Iu{^$4EV4wm53s&tNV5$m$w^kXwtKM;zXKnE- zFbBX7u;Du6U5n}VnvH5FD@<(1h^M9RIK%jp4Ymq%=o=>{>VKfVtvA3)L7stj1VF1A z|RJx5spTHr;4e#K0U;e$MoXMZQl0$|<4E#bQsdzWMZc-3H^7IQ=R zATQ*d9U!GQ;8K#Pz37^hTmb;~iQ2uP-W{L@&I5I4oxAr1JStCR40Ws2=kgpHm8bmB rc&h+-s{nZGk!|!}Y4Iyi0KD}JuYm`B9KQWC00000NkvXXu0mjfu`r>3 diff --git a/rep2/img/glyphish/icons2/41-picture-frame.png b/rep2/img/glyphish/icons2/41-picture-frame.png index cee8bf06e08adf477a29692f1e28f748604a4a2a..983a79855f389deed7df134b9aac660decbcca42 100644 GIT binary patch delta 286 zcmV+(0pb4s0l5N@B!3BTNLh0L01FZT01FZU(%pXi0002%NklpKM47^Y46_*=4guUDrg`X6Xd93Jl1X&60D5Pu#3)8t1boFJ?LJ|#aY z;Q*1n3jrsfRL*<&@;>oiGqWYBKq-iE^A5j_N?K^Dok>^ kBsAW|dbzu>!WRR)03T~6OQWq;d>x_33WAKy-q7Gb5(lA_dsv77|7ltEU}gUg?7Oq cOX#QY0r26nOC3qv;Q#;t07*qoM6N<$f?=g)4gdfE diff --git a/rep2/img/glyphish/icons2/42-photos.png b/rep2/img/glyphish/icons2/42-photos.png index 827d9a1bb577ac9133dc79824064d3f2b672ab53..23a9be7b75c2383d63488a0c45b3cd2029be2795 100644 GIT binary patch delta 186 zcmV;r07d_^0oDPKB!3BTNLh0L01FZT01FZU(%pXi0001pNkl_!V zZi%Ykuz(k@_=PBeUo!EA@)177$ZbR#EQl| z>IGD>fSMN^m!$d2{TrLW2fBl-1j_;_w5yvXAnU~V4*WUZiS`LtK#c{|SU}Bq0otPs zWqbm1+6%BBbH_V@3S9G-)cy!rKuyL)=NX}W0v1rS0pyVgOAu*z2P^;p002ovPDHLk FV1h;vKG*;N diff --git a/rep2/img/glyphish/icons2/43-film-roll.png b/rep2/img/glyphish/icons2/43-film-roll.png index 07c11055cca34f2eaf7b2cdcaf2b87799baea937..62734e8cb7855ca0e5d5bb0af56a7ca8bc9993e4 100644 GIT binary patch delta 377 zcmV-<0fzqB0+R!fBYyx1a7bBm000XT000XT0n*)m`~Uy}MM*?KR9J=Wm@!VnPz;8@ zAa20MLOB2u5))#eT{uUENUX4BW6j7BdX6p$17bp|)B{i!HtxXiQZ=9k{5w*gBHp+7 z4R)S?+li%QMNu$j4q_)Tlq4WFqZe?fI9F8#kOSAi1eo@?Hh;hxcmn2XQe|11eI)_F z8zJ#7H^6gyz5*6(h2_8la4Ozo=6{V4p^`b@M`*FbuVKIlDX0RbgoNf|Oe5Z7Mio#K zD%$|>zzX>M;d2C>0VjmyCqU*;@pn`K5E9D8m|E~%0{2#D^(B79KMpgaJy#y;`3fx^ zF|h5zUsl31LUJB9)vY_{J|rQd-vdcNY?6T3j9$RLKBINdc`*CzfOQi~cmznRzJqlW zOPgLDp*zukgR8n0)DEm2cX(pVs2#WkE`bZ+xV5`@1wLB);?B-MmVPZpCJBhm=mmTM X8+$b?E~*lC00000NkvXXu0mjfU3Z-W delta 319 zcmV-F0l@x~1K9$QBYy!PNkl(Po&iu?Kvx$H!0aNpxz_(Nad=tEYx?#>7SOEuM zS>TfZF)#pzh8Pl8!Qwab7r^Cii#PXUF@|KpZ=ndi56lU83x8#zzjcnYsTGLGpKJoO zfHu&0@i_x~;7DGfgBU}?BEUi-_;!GatF!tNkHlo2$sEU>vZz{t@qL^sLC{5KpIve+ zjm*L$p_I?brOLv=_kl`)Zz=)430^>1pV747`fJLpfNLj~un3S^{S&F<*ijZO>oE7T z)2Ld3*bu`q$2b}FC7uCmU;~_hZGm4GXaYT;Z_dsE%P-|$5qux01o$R+0XNVhfSdG< Ru&Mw6002ovPDHLkV1gZUkXir$ diff --git a/rep2/img/glyphish/icons2/44-shoebox.png b/rep2/img/glyphish/icons2/44-shoebox.png index 6e2053c332d94560ff39c905da751682eac8c82f..d3ef328e7c3457575cfbff7050d069ed9f33d645 100644 GIT binary patch delta 410 zcmV;L0cHOE0Kq&u6{mLJ|`C|jb2DB5qS%)zij*f=jxJ}* zuI=l!Sy`6MnX9P-NM%W2YG$9nwbh`mYkkatuaV+d0S!P^RevVKlnN9Hwxjt*bXF#|S0XRhK_XF)eBionA-`N_7H-U}lhLAvJu-Cl@ z@sZP3;oTaDw}tMa0KncpaT}=**Bp2&P>4Q8YeU;d(Kb5LR3cN2(vX9PX)AB57C;neU$h#dL+!&U_2FAi{AI{ zvf=(d@D4G+NA#?pWCJ|WeMedWZ-g0wa2mN7`!<>b+n)DZeg~h-C9c!A{6CBvc{eI4 zE!4-e$is%=z%Iz^lA|) z4YUc|Y+5M|yjY&I+lrN#?`gS_V+L+5duusPI(_y;*K7tGiFEA+3XJg~YFC7ty;@?Gq5JvjCn+SO?x| ziwo@p{(f|k-iMd3SSU0wvq(L}f)2piTa03%SIbTG&TF55V50_j0=8ZOWd=Si-wE7f z2wJU|sGI}Uz+70(Zab`xjQ7Aj!*?H7J-KhAJ+K-WUy*QeJA`vwr{6ie7}qwI6}c^x z14S+L=a?EOjj4gs7<~ikAKAab=x1PRpfpC`zz-iuj~f7jaYg_D002ovPDHLkV1hVj BovQ!< diff --git a/rep2/img/glyphish/icons2/45-movie1.png b/rep2/img/glyphish/icons2/45-movie1.png index 2817f5987e9ccec03faf6b9c130b7aaa7830062f..d1ea25ea82cbc396e0835b0ce1811b05e6115f7c 100644 GIT binary patch delta 255 zcmVM5CBzu9Wp=$U(8}fu z?Ac(>`Qvqolu}@`bb-RTysrQbD{}XrEKO?x%LL$9aqi~$&3NVlCo_)#hKkI%kfmuY za53`);8Bs87P2&+J1_%yR%GUdERE+5%m7}M=iKnzfp>YBERE+5to6d*?SMSMAP<;X z9$=6M%q$Nu$O8s>fI%K8Z+U=49x!tk4+Q-i?TiZa<_o|9P+LgwotLMxA7jH+$(HtV{hvLv{^6& zi|qd&Hi3Cf!jd5w_`|>^;6uj@TR*@{_Xb9XHif;yF~%MP0QY6R0nZh>OQAL6HITCd z9u?=Vfp@wM%-MbdP8FKzkJe1WK7VBf-oUFucLol{wVa&p9> zw}?y>y2LGefzkb3$pOI$4mwTTVs<@8o>VW9(0u>o^km~7se+NAp+C~uV&ffj>g^rQ zb@^W2qocoM-Rqu@FBt89_{JZM@_uo_-t7&;>I7Sc2UG6V2Y=8^Vvk_YW=~l1WnGhh z;>-ZPgf(B}z^vJfdQg#NU;2Qoxfhl^-FH&eBzI?i5U1#c`3{OdM5b|CzQ|Adzt2NU zkv(Dgmp=@is$2TMX#UDynDF+)Ud#GI@fxnz;xoS)R*BVcoo?}BC|+7F3}JCEEf~Tpz%ZG8s}Eq#w9{p3+lOkes=}h$zbMno_|7!(`}FW jO0WM*znxLnu&$Ch?St8!cT?BdFaUw4tDnm{r-UW|$+(l< delta 334 zcmV-U0kQu10_XyeBYy!eNkl{JmRWoA`zT82F1Pj)WLde~o9h!;iQZ%2pr|!RXnz7eb{sbpLKFH9oXq%5 zs)^7m@FaRKf%Br)6++XD-=x|Iy^FpSAQVE6z`f|b0j`Q#bA&eNhd6yN!Xb1k`a&Y) zRda;?#9e3D2ghFVS0B19PlWHRL3_OV5Yv7`& zb%jtm?4b}^0Y@*QFMYAy2zdi6vbJRh7F&A>s(qbS1BARzkHDSiOFIziE##GH9-aUp g)cvo;{{XG^4Qno4TX)sVGynhq07*qoM6N<$f=uO@0{{R3 diff --git a/rep2/img/glyphish/icons2/47-fuel.png b/rep2/img/glyphish/icons2/47-fuel.png index 6af5342b4573fc5c4115824b9f96a0022902f831..350bb08a8bc3166812891eda004780486dbb3850 100644 GIT binary patch delta 469 zcmV;`0V@8V1MUNmBYyx1a7bBm000XT000XT0n*)m`~Uy}ph-kQR9J=WnBPsqFc62o zA_jmB!UpLEVFQ?eAY}k}>s#Bmz7-}Y8&D=78;}j^5wbyfu%oz9XwFHMD^foxit9hu z`{`_-ok^Bu{AaGT9T>_*fHv3Cj;qzGDlUL|;QuV$I5D%?On=m`PXt1p?>k1skSVkT zCLPamsDoV$5wPglCk7Jt3`V>LPDBL!c)v^F9e8u)U^I3i-_aZF`q%+4eTf#hSo;G3G9mw6q&+B&I;_>Vk5{5CL;w z-|_g)e7m|G@PE*-RbZo0kw~4;m_iZo$#EyeTk4nsZaJLu&8ZT5<3lXruo@M&7r#{@hQahPq z&q*8X_E}=@3nD@UoZ`zuWupY{v6p`1wdby09D&K@+o&=Z0owcm(kW6U0nv+g00000 LNkvXXu0mjf7Btmf delta 389 zcmV;00eb%K1D^wsBYy#ANklfjufM8H?ils^MkIj;lHwqouU&3_T9r^|Q7*@7`jeS{zX z_O~V=ESD&NuU8;2Fy3~f5fK)dtO=;m0TolkL?Iag7YU#0whDpJGTJ_nJ29A08%3LO5hYym_sFrAw~lr zmG4Xdb^vpHJ^(DvxwEu})*ZMPkC=DKhOGtW%&}~`zXK}3Mpp&c)Dj4Z{5ikxz*aa{ z4XMD2=jQ_A*ecvRi{Bq1I;{l^-j7@{+5t8yz(xhwr~n%kU{gzAOXOPXlNkNEOQw5) Y3&xTY|5^&%F#rGn07*qoM6N<$f`C|B3IG5A delta 181 zcmV;m080P*0nq`FB!8GmL_t(oh3(c+3VBT&AH?SXrMO;DG7{YlVEG6b- zp+Q87{Mdz_fYLT#g3yG10a`>9@YDUPPcuxj06=lRhyhtNE5*87&rpzif=EzjZj ze*lgF&={Z!M*X?tS0FFm+s3<*>2Wk`Om1W?2AI?y0^PU*Xf6zZ#sFvxfW`o5y8>jR j-qqi<>o^U=PYCS+IbSvLy4fL500000NkvXXu0mjfU#?Zg diff --git a/rep2/img/glyphish/icons2/49-battery.png b/rep2/img/glyphish/icons2/49-battery.png index 707d6f55f24a04535aede4ac58eaa25c3a80451b..eae0d9ed8f3bc00f2cc610f6f34376ae5bb28dee 100644 GIT binary patch delta 226 zcmV<803H9@0saAyB!3BTNLh0L01FZT01FZU(%pXi00026NklO*_<(wIrhj#;3Lcp64@FoPj8D3zL z6xUi`z}l#n1=s*eDVIai3AAcny|!oqCz3Mvk3$>O3IM#7xm%}U&mVd_#0T(^1bPzy zm?gzM3Wx{+Z+aBiCB>F&v<2e##UgO)eXd0-pnf^;MtTO8CS4fTPVuecObB=r0^Wpx cH^U2j0sI~hyueXI_W%F@07*qoM6N<$f-<9B!2kdN delta 190 zcmV;v073u$0onnOB!8hvL_t(oh3%Hn4Z|P|1Ej^dN} z1I!`dVZfIQvt%z|mKMmS1+r;@Y;Gqo01IlvBVcGrY@Q+l@~_}=R-ql-8{-uKSe@hE z6E**+c8LvmDFdnr0DP3r6$K<(Ae)K;Po?wBGa7-MFWw}M3OBOTk~sQHaTxUuY$2q0^VQ_gvrnKk+XRwy8v=>=?-;ack@9@F6XJ6lQ_ zoqe%7pnfrGhsl8kiyLZ?0^BYwK?*p4yShQP(Ec1(kPe){T}R#g`#aDe|?NAb4=qn3$oP z*=dDYvL66N0ym7}`km$g% kV>pmX`ENi1vMDd%0&+MLOQr-OL;wH)07*qoM6N<$f0Fpcq&QIfH2{1{ObJNww7YFYQJY19Kr~Fl}`PhQh2p`im?Y2#xtE z(Zby`Zf5iyPz<=fi}2A_43vg*Yu;X(J!;n|GjO5XmA~axkOQtAwM{4;ICVT%e%be- zU8Byxp~JcR$31G}z@KISU=Q5H+$L_7rWw_M1C|Iw*FafmIVCxXf93)c4TL5d2+adU W!7Gg@xX$B!BWrL_t(oh3%K&4TB&QgpZ~JID&5ANN(gP?Fya1Zr~{N4>Z;` zz&o%&VG2)`ue@pkMaoqLU|0j z#`yZ%F+rUAA}fOG16&j9x%PHQUrhBYzy#=1n~2e70*r!jH&c>1Vx$+@9H_f&<}878 zX2Q>5kGZc81t5ORF#$9xe@@#~sQQP-?rZAM?HKWSUPQ$_=8EE!7ggdFr)VUVg?}nwe0m;TotzW`O77Mv zJ#`XNSm*}S!0)WSPS9485vYLcLj9ElHc|^HfiufidG#(DrGStQ%0;LIOdSicNQF>@ zO29O6Yj*tf4_5LLs073RglV z=ItrIvo@}r#9$3!zAlLyu|-q@Djs|P5Kf4;6$$}U23m_G6Db75=Jjb!Fkuxi0tdtQ z2aK7>dLHQbKaoAXj@ZFlL_ zuX$&2t@UvhmcS<0bf5psr?e@zLTd|A$ZsFx925Su=tMG)1 z1WMp8JOP(L2<(O@pb}Dnr{M|M!IlVc!xIn*u7ET=A(r4);#F1Ua3n!B)@mhIf#8Kq zvllw2=a0rm+_%#qU`+^E69U$_7s&Bz(U=gh#=XD~6r(HpTa`VN00000NkvXXu0mjf D7h-SR delta 196 zcmV;#06YJg0^k9VB!8z#L_t(oh3%JN3Vx0He478y8Rrxl9{ay@l%FNm=j0>I6#2nCrdk)ygl yEt>e}G#eLS;{t44fQ{u({Vyzk0xrO2d4UUs(h&p|#k>Rn0000C;ge7<-!>Stg;)f+p`N&gID_P~L^DpkNS^kAzB zy!OT|sg~F#%uIjIj16qfTMCw#q2+1cP-!qbYgwFD>fB-(k2li;3;6O*j zg>HhF0vxasb5U1f)mXI>Q+#l4A1;_RaDDO>`iFPV*p!$83eVV-e1%dI^DPA9*1??F qS0F^dr&$&OdoA+6(Zpl{srdyf$}`B`z%^e00000Gnf~Y|qJI_dZSfR(Ft4%bu)c%b zItzRCj%ate23ct&0S5f0Yzm#gbZuz|t_jI+fSQrQ@^R`GsshUZ4uFp<=OvGg#`N97 zCt7diqxlvB>`uTX+ME_*`LKSBF13$n57B%JH6P$^Twi-yuW0@RBmtgkE(Eo-{?HWT g)Gbs6%?J1bA``_9^XNjM^8f$<07*qoM6N<$f>FhT^Z)<= diff --git a/rep2/img/glyphish/icons2/55-network.png b/rep2/img/glyphish/icons2/55-network.png index b1ca76d5eb181be5e115794f985f0787a665ad44..0aa28d6923449cbb87496949acf6113150488011 100644 GIT binary patch delta 399 zcmV;A0dW4p0;mI!BYyx1a7bBm000XT000XT0n*)m`~Uy}T1iAfR9J=Wn9Fg4Fcd`( znH1o303D=+lt6l5mu$Ram&uNuH`%8ID8(J164HUQKpD$SWLbLpOeUNeMxSTkU8Hwm zTy{eFPK{ZEN(LbkGfsQ zyeP4SCYHig#+=e~(=WfjN-6;@Fasxj%v@UJ1T@CDAs~53BOt2JyGS7*s?WQS7V!)4 zVTsv%{v^ET1%J{NuqE%qtK{TZHd-0|nd?4p7O$8T?}4a3??SSLo-FfGecnZ=fEM^P z#x|dCfCmIV?;=EikIyTX@1JCZ2*~R5E<%d9)~(IwcO-u5CMn*;*^-B_6;MR{o|h6L tAgj;22-!keecna2{Wn^eO+abB0ct8u1m05O_y7O^00>D%PDHLkV1kJjxN`si delta 296 zcmV+@0oVSh1HuB3BYy!2NklO9c*_gm4&V%6;CALdmFC86TJSO{)@u$x zZ1%#2Cw>NxZ5rU6h<3OutJdtkh=DzYR=4hpSRiC4B=Q>bW`6*=21O622lH)Hv@Pi00e@9aWXQm z2FNw|#P0000>FCi(4f`4Wd zx&bRuAT&`RG*KWlV`)NN*OKrBFb5_N&rZM=sNN-%Whv@ssDBYifdjCn-8}Ao>Hbfx zFX~GmrQOUP$U1T|7iYpMkh&($?%H#o8ePpdWPF%PzE}lzK>l!_bDtg(W|ju50=Y3C zUe|~Si$G<0abLBx0te(%LmWutWxhtc%u=xc*I=Y)%8qMyM;zzqsSSowssdfD)PEG@}pe{U<#~I4EY-_ ruGUnOoW$=!fr$d4i2|XC0-?D9jFuSBa{sofr&Z-tk6vvfxa}AD^bNi zaV;c&QeF_Y?-XpA0^q=fxkU@Gk_Mtl1JR^`XuJ(P0Zaf2ITL_wWRb(+>;UFY-TD2V zwbn4fR7_7iH4$oH2e1%93xJg=zOhCcpyIXMEgDL5p`;jMDSv7WmMOFuVu$9^TphPb zC1@L393X8{$>*VIXmLOlivJX1P^Ee_P0VfFv%H*GkshyA;+F`^#5+Y}fb$8py{Gp~ zllu#efrlc-HMi#&l{E3+#wZ=9y({M!s4(n9)>R^${3DAd4MdX$qPe_*7aGnZw=v6g RGXMYp07*qoLsM diff --git a/rep2/img/glyphish/icons2/57-download.png b/rep2/img/glyphish/icons2/57-download.png index eb5a82c69b6c5057025e99b6d09daa152402ae66..e2b0a6955d67da2f0050b410bd1b60e0bf18cad6 100644 GIT binary patch delta 255 zcmV z>I{(iv_TqGuGPe2dVnn8G_DLAN<CrE2~{pOR9|1MMAXky8&dizPlIIaCtw$(oP{TN_<>PZL<@ zfGK(Sfgt;90gDm`Q5}hZ8F)#Wvt6r53Z%Fjbw&vA#v55V9g(LhdjS9d002ovPDHLk FV1f$gW*7hf delta 223 zcmV<503iRH0{a1wB!9w5L_t(oh3%NZ3d0}}L}x?K={^0-{zre=UL+7{Y3j_P8+{mL;6(yYq>K^zdPCm>$ zn)sW@P?NY6>mnZTjZrJUE_lxYSMk6F2HDUCHjxIZ4rAa6{$*mzb*f=rCAwhf9_WJb Z2HxrQCg0@H>+Apk002ovPDHLkV1f|!YAXN$ diff --git a/rep2/img/glyphish/icons2/58-bookmark.png b/rep2/img/glyphish/icons2/58-bookmark.png index aab3fce7e1d52802c28f5dc6a06cde9d518a5547..7303ee3b58b62dc5f69a18db4bbaa3b4d1f63bec 100644 GIT binary patch delta 209 zcmdnR_?B^kNwh{&oZ+zd%~?TG zYpbICAL#zMKI?qQekY*>Wkxe}!YkpiZos$4Z719%w^KP=c@On;>n8WNAzK5I_ yJdpZ#!1Yj7Ynn~FJqJV8>9$_G@{=L@8yG!*2!wb#Due;u%HZkh=d#Wzp$Py8F;MRS delta 158 zcmaFMxQlUuN`0fJi(^Pc>)RQQTn7|*Sj_*<-EOD&|9{KgEdfmn65d4JXxy8jAQ`|f z)zBqhyn%g&D^nxW0V~a!yu3Th53s$yRP~Bu<3t8&&JE~<1N;8XQ)bPu__O()cJ(@e z56A9BCuKKY`w*BE-Dtcr&Elqf^!&x?;#1DDrbcW&s8h>P!~g`Iu6{1-oD!M<>dQhx diff --git a/rep2/img/glyphish/icons2/59-flag.png b/rep2/img/glyphish/icons2/59-flag.png index 9ab9fc7c3ce244a70ce45c378667e65b1c1e72f8..57a33ed7d1d9a7062ee54440160ee89418bf8f6d 100644 GIT binary patch delta 313 zcmV-90mlBS0@MPKB!3BTNLh0L01FZT01FZU(%pXi00037NklPi6hI%w z0qAUX0&xRJUu{l=2%r@aayu>R>u(rSf;d`PfPy<_O5>0^} z&H5Liy@bSQ3T${*Bx_s=oGoHPAeT<;O5g-6fIa=zbW*% delta 271 zcmV+q0r39R0;&R#B!BTqL_t(oh3%HH4Z<)GMPCpDWQ4E)f`&R9zz9r$#0X4)L`BC4 ztiT3DEC4kP*&r0y5&}|$Z#W|Sq$`rhclYE=;smH@F&*m$RQ_Hdabd>a?|^3w6oGOz zq8ljB85jaNFa`$hejX@)EujQFI~R3iE>fTm^xSo>6s?5tEPsUhnbN~Ayu=%2v9-Vi zaeOQVQedeju@snbn|}%G5t6YKSOF(BNhpEQ8*55n9-?@N|3C%ofho=BdaLx1JT%f2 ze-eF_qvZK~Q~(#?aQ8d~j!FZc68H-7D`ZU+uqFyv69ue^0@kQU33FP%1FaXh0?F4{ V0}1TGJ^%m!00>D%PDHLkV1h70Z6g2x diff --git a/rep2/img/glyphish/icons2/60-signpost.png b/rep2/img/glyphish/icons2/60-signpost.png index 4808b9e5dbfdbba330ac47e2c72ca33be72c7128..3d993c3191eda9e8456928776cb0ec81441f77ee 100644 GIT binary patch delta 212 zcmV;_04x8s0q_BkB!3BTNLh0L01FZT01FZU(%pXi0001@NkllyDND#>hp0-hu8C%SjTe887hbAUitS zyRZTl#RI&6&FSrokcC8oY(au-MFiADKurYHj2B1}t9bzFsS*r3k1*F|00000NkvXX Hu0mjf7fVAt diff --git a/rep2/img/glyphish/icons2/61-brightness.png b/rep2/img/glyphish/icons2/61-brightness.png index 529a82f8cfc4be755ef324c7e41533e7f7a9e649..e0592e7af65d4797f5545e6a4bcdf4df79a494ea 100644 GIT binary patch delta 433 zcmV;i0Z#s-0?PxCB!3BTNLh0L01FZT01FZU(%pXi0004fNklXR)@3Qp_f_;XNm0+HyI59cOb{<%9>0x9d|5}l6Fvld%2)#LVr6Si4Hp3g%@!#v zeoiw&n_+ zACYz2QRg|KafmN8MYY?5t^(`cDVAI(w4OqjiShRtIVzp_{zc~8E)Nl`|I97SDqv|= b0Za1(J!?ztkGIQY00000NkvXXu0mjf=~}~o delta 264 zcmV+j0r&pP1ET_vB!B8jL_t(oh3!{S4uc>JeJneGN8kwT^-*(FIsTTfmD<4FS5xXrQOs8d4Q_16WS@FEmF4YokpR zCjpp?cZn;u2(AQY{?f;&>x;~N zD>3~bB-E&R= diff --git a/rep2/img/glyphish/icons2/62-contrast.png b/rep2/img/glyphish/icons2/62-contrast.png index 473b17a3aa43c7dc754b83d500357b895119c535..d517726ea0390ecf6f4f5e4831eb84ad85cef902 100644 GIT binary patch delta 531 zcmV+u0_^?E1FHm(BYyx1a7bBm000XT000XT0n*)m`~Uy}-AP12R9J=W*u9GrK^VvJ zPkd_>#ZI_`<7zFm3Mg0T3H}#0rq4A80R0roI18uog9%?pst{mS73(AIKs_%eTaQww#RsmYuLmc zYzRUgqK!#P@Kga;@LouMf~OcRi18Dj@B#O5KiV8wyjrIw^$~g@PrhwF`B_>xk9T;5 z<7k`oIHd?!6Mr5B!pwgz5%W7<$LntNRf!Y6JmcX z_^RZjD%s{csA%89mx8a-)KLfKic$%Fqy|6ptwbFHDxV;@o*Fzwz$lJYH{gj-oo9WO zCPhHDd8@vYPKDND)>mm#1nk9eOJ2}U%T#D7HVVE#fm8v%geEQ%F~A!bF5XOHo+Spoog;*bVjUX1DjragQgJ7Gp z6A=pwIj;0tLGV391ho>Z)LMkZ%1$lRcovx>ag}hp6A6KQuuQ`4{Q20O*;x-5QejM# z9e@@!fwEB(C>uo+h=4B820UZ5WiBe%C&Pk9VBs?;(68FSD}T_;1lIvhfKcZ5fh}Mi zn9HndimuAPH)7$47hnmv2d04@zjtDfx|s6KU-aP*gH)5+9JX z5O2UD`8(kQQ@|B)419|2p)!VQx6?%ssQiN_J3b%707*qoM6N<$f<*DgO#lD@ diff --git a/rep2/img/glyphish/icons2/63-runner.png b/rep2/img/glyphish/icons2/63-runner.png index 89cd1b1cf0963098ebc0524687e8d3cb0e9e9e53..3e6aabaf7771f4aa7e7c51e5bb4eef48f57a5575 100644 GIT binary patch delta 491 zcmV;}#C^DbFqH-*EA--b<8#6+F-5r+Amg zF9xh#2+E0=5`S8dN~ei!C!1f!;{oe01mrv>Lcn!g#-8LdN4%0ss7f;+=P?lix{@8< zlpF?D_1AtkpBMGJ)7V70&K#luGP=KEkNu zO}t)-5AmgjJgC2wIFw52o78=VQ@4OM>DgGq4qp2YZDjN;y10g|96yo%6NFKRfGd@F zUvi*lIbMxSRx045eotRHW$jV#f2lC%Uz7?stFx^7dw1ZfLQ3BQjgVawF!P^P<^rZo hWBzS)%FG2!n?J@uMd?W=Sq%UH002ovPDHLkV1mXQ3i+ct; zJ6}NIp1{gN@BwVC^eUf1EIcaH$!9gNV|#Wffvi31>QmerhjgswG#VZNZCSnz`*bh zj2#+NG{Fa8zocM8VNS6?ALvb41!4kbDiT(~F>np!=qiKWu;JcvK}=ks zkJxAQ{C@zvOOr_V<Bjf8gNkGxh$|qo4;ICD{Z}7E>xPZ`U vv`j>Fbk{0%qxAw(U#p0t^()W`s2g9r97O*T;n^+#015yANkvXXu0mjfxG=is diff --git a/rep2/img/glyphish/icons2/64-zap.png b/rep2/img/glyphish/icons2/64-zap.png index 64fd017de5c0f43925803e17bf738a868ec09b71..0567a6f0a6e41b637277617ec9fa00d023600be7 100644 GIT binary patch delta 386 zcmV-|0e$}L0-OVoBYyx1a7bBm000XT000XT0n*)m`~Uy}PDw;TR9J=Wm@!VnFcgNr zAS4C`=C%y19HKi@2au|69msvf?{7O4|c2X4{A3FrkX^$OtzbYLk%3bN8T9{RsV zNckm8@w4UMpOWV%CyL{k|E#0BH?Xf7fVy?8S}09ZxBCgSJbzQafs-UjB)%4Jpo@R= z08^!z1;A}!e4;c{1DpcGit!ncDGk*Cp`!9C_LBoV1jgUQeo}xg&Pku&wwYjnFWCFD7^x{)MjdcA$c(? zY7DHzUVt9px_czH1fIn{e^LUR1HF>?nb2cLN`Mk_4Xh|@fB^=H>&g<~9atEy57+{jC9bQe g`8Qg#8i2a>1G~T}+}>6INdN!<07*qoM6N<$f|i}A+5i9m delta 338 zcmV-Y0j>U=1MC8jBYy!iNklzF{LE;f7JG+Q6l_2dEmZ z01rSE7YR83?d6 zXvqV-1@~ diff --git a/rep2/img/glyphish/icons2/65-note.png b/rep2/img/glyphish/icons2/65-note.png index 70e807da5235b5f17c006145c80923fa3c6c76ed..0354f8940891052702a6e33eebad89d5d2eea1a1 100644 GIT binary patch delta 355 zcmV-p0i6E20{sGzBYyx1a7bBm000XT000XT0n*)m`~Uy}FG)l}R9J=Wn9YsCFc5`5 z5Cx=!?Ep$(JJ_vYgOmc`mK%G_ElUMZ0wqvF=ztQ^0UT_^k64J}7mtwgNl{|idd`bI z<531#mhsLEtzRIN-hefuP=TT-o^>DneFkjqJM%mboj%$M{C{*M9LvBIn0Fx@GX_c^ zRg1 delta 288 zcmV+*0pI@p0=fc_BYyz_Nkl2=08m>OAh8qK1pvU!qJYcKxV0vrjppOHv?gHi)e}Bb0)IlxJ|(u+Rl+Y%SqII# zP{AP467WRYmHviS5qFFj8aq$|Xh1qb4r!*CaHDULI7cGa8{d2XD~``Z?pZL-dX44Q zC{|}%37U+FN{mqhCjk9Q0dz3BP`_eML5MSnTy3|0000VFNi7mwACAp(UGuza&` zFr&|bBp^1U7a;qLdVB?%_XVYZo7oTk7O(@ZR-Y+?Dg`*P-&=&pfqT!fUW`78lYkD^ zJ;!>X6wvH%M}7PBsdy%^EEkjlPG+~jhTkG8>)U$1gHa0DnRUP!H~^nk4%X*9-@z!) zfeZCh{s!h|yHePguLN}x@2Q`7*A_Y1*j^bh#9gT3x&I$#vjA~`bPmKvDPTdpW!j~| r?_a2bDg~Sa`Tk3m{*6W^35d-PaTGBw0l&JJ00000NkvXXu0mjfO9Ga| delta 288 zcmV+*0pI@f0=fc_BYyz_NklN-xJoCnn{))-z!7wV z^q&h25pnswcH0B)eXTQVt90=E4 zCi^BX1|qyqK05`|Kqa3u)-QAOVl4&MG1>;jjSCZ2a=!4Es7u?Z4+?$)=m2~qI>~wZ ze>C8v&^-*^)#ypd;AJ*^iS4|Qn8D03h+OalXc|3diiEb{|Pl-UCh9KUJq mUAqsX-NfpY9vMhY_6EMpeh4=p$Il@E0000$~W1womE&h~;mqIHHpGcQg55>!|JKik_mA|%xHjLur_8Qwx0 z)HoxA_a5*PzO(IZdN^lJY2mZMW)*9UjyxGTEH{rC* z^Oek7tP28BHR3DfpxHAvvzI^L@ RZW99#c)I$ztaD0e0szu#id6sr delta 249 zcmV4Z|P|gpW>;5t0ouN+)VYX*Xh&b_4pyNEAU^ z8%q|7KM5sL$oVe35&$Gj%*EQkC?3EX4`9vd13Un107B7@Fa3|I??xI!Btg3aSUY+P zfY^8^(z6yTX-d4P8Lva!$aJLpp83%rtj_b0>8{D^j-Z2Xx;ge20)LD)M{5EyvTwfu5H=KrI1OZO*|06iTE!?jQU zD`AcYu*L&e;{mMEI>^kJegr&#H6Fm4=>xn0n3JogJh!^(00000NkvXXu0mjf(C2a7 diff --git a/rep2/img/glyphish/icons2/68-paperclip.png b/rep2/img/glyphish/icons2/68-paperclip.png index fb28a7fc90696d2b54d100371790e191a57f9b5d..ba2f85a791a2854d30b8c65a789445df7f839b91 100644 GIT binary patch delta 412 zcmV;N0b~Bq0<{B>BYyx1a7bBm000XT000XT0n*)m`~Uy}XGugsR9J=Wn4wO?P!xv0 z64XHO2>9VJ2s+IJpa}_8QwT_END8V60u+9pAf`|VsK9S~4+O&waZhQ}bPLdbX`0+G zSa zGe&?)K;DTBfV&lWBZ?BL>)!s1Y7dNn2v_&#xKoH*;KSlOxSlw)>&)(HjB*nn0na!Q z`Kd%5ndM4QZsIv^(xc-^k*H;xNRlIKwgWJcb!_|?vw(t{JUDztM8S&^(SHaqOb*}VXjn{uvJ(D^ zVhyeFe~VvD{)~pkmjJU5cqh+5XtIFNWC5Yc0z#9#fUW2JC(ro-$o@``bgvzCH2Fr! z+R{ttLf121kC+vW@fa~AW}u~9&5GEDVq2lwB1wAoKwQU4V>=et$0WdB_Zq-}=iz>E z_@(NKCAz`=@-NzGij7VHUrx27@fvc==3!EY`d}o#6DKd=4jj6ogMv4VBLDyZ07*qo IM6N<$f|q8DG5`Po diff --git a/rep2/img/glyphish/icons2/69-display.png b/rep2/img/glyphish/icons2/69-display.png index 14a67ad69eb104c301a0335cd809362d29df098a..b9b4668e4fb15f703c232407fd3bb6e98abef9b0 100644 GIT binary patch delta 328 zcmV-O0k{6T0^$OYBYyx1a7bBm000XT000XT0n*)m`~Uy}6iGxuR9J=Wm|bdvKomxg zX~~MRBp2aZ$2WJB4VBVR8q*L`nx-}n&Oi}U;+=aP0&_s{;{1GvQJAqP%aVI$kvc#u zSs*o8AT^JYPEFG|;7Ku>t_AiS3WT0XX~m zC1!FBf#r?uj=&!H_Vt6p+_MOL0q?-c*DApSmI58H1wMSO8a!YnZ~!*I4@SWQ+5#PY z@SU$s!-KBCC-6-F&YK4hXbH6R;X7sw4>|&Gz^lKXeQ%{9uvQpDOss%-3!sH`$!paV z5o1bM!1?PxhC#ba3u%>a;2LgFn+V+fiOfo1>~Lan2r?098UH?DZEz)rx zErABuVI@R6?jtQwVS}r7-9=KM1`gO+SM9oslt70KUy-5fE)oJ;?ASo&@Q{9#kbV+p zKT2qwiGqnejUGi)B-}H0ghDuZYYk~t0e`$y>iq2+*)RO@8Tu|6jS<=a*MZ+!;38Q} ma}Q);-UFqX1sO^+d4U)3ydzj?K>euz0000R12K?x z$WzhrhR*;-zyg>9NrOBQ*+O)^;4^>jNFjQXAmOMef{fJfj~X?HKSOPR}>Y^im^52B0mUpR90w04@VfPmoSRXCP=31H2pU&4kWC@FuoqAb1mh812o3&VU)q zTPOuKz^8I-=>FNM!jge))0LfCze(}Wx5)~VG%0W5&sf$^P;6*AW=uiHZVmVX1cJ(0Ea{vb_rhnU~rDRC+8wqd8EbuV5*$;TmC|3QGk_;2wBZ z#ySQkRC>;p$wQXF6L6`FdjVF4yx*`G0KND=+kxjFliI)=-L{FwYT(Kk zp933t-qIOTk!HFA8@^s*h^U6uz=bj1OzH}lUt-HS&;suZu{?+80*?00000 LNkvXXu0mjf;Pk42 diff --git a/rep2/img/glyphish/icons2/71-compass.png b/rep2/img/glyphish/icons2/71-compass.png index d5d11f3ce3804da5c25d3b47c5e36444cc01e30c..5fb3238461a624556a04dd2cc7aeb3a2db5326fe 100644 GIT binary patch delta 650 zcmV;50(JeS1EB?wBYyx1a7bBm000XT000XT0n*)m`~Uy~Q%OWYR9J=Wn8A(PFc3wb zgDt@BK-lS#% z%xnvs2X<%a%f-f~P$52o5ksKDqys>Snc@D1=X$X%~~LJSFuznF+_pRbR&J4^nZoOtrIaTu%7Av!Z^==OM7`b z-{R{kLJ0KIrW0csI{O)B6IXKYl3eSnci2oKgg__ll;phvf6%~xp!Ja}&#kY{VKa#k z0#@=e#;RctxED+cZ7^rRwGEn}ish2#NrVt+(WM?1VF{*4duCcH=U{#GI9_z-5W0zT zY3J&iTYpiYm!>sHG!#PvBXJSV${P{n;Fw}&=5Tfz0@yNN^}_YiTIig$PT&fT;0SgDM{xv4 z@ct+#JtdSYN-*5?BqXgpAMbO(0BwMkitXoY0Y~i%aJJ;ZRoCW(xIuxB>iMkljS2a716WtgZtz`z4rrCgP^VLJ z9tH??F(ll2!o`Mwzsza~E<1qO67jKwt&ISS6$6NMzvbC!AEY~ww-`Xj`%(~ymiVj{ z2lymLx-Z`c=YMY_Ig2hK;|hgd;z4y^KDSPMtoub@VjJnG;khx1@a_-cTXJRx__UGf zE)EI#W|gnVMy8jMK1%dE1r$F@to(z++)CxgX&F|DsO~}&nh6n9&6QHdM8%hSJ*3Ma r7{hCJvej&aqE`F*`JW)dCr_! zSP$S=T!1w$z?!Az$EvF89s^JSsq`D57C&WKs^wG_Al!j$;D1Yj6R-m|n#r_FD9{f6 z0&K%fl1sGu#NtNFvgj>V`DV+{ZtrA0@31{$T9$!H6xm0~6nV;6dS zdH>+gcOhu^`7@uT(uhy>41joxI7oX*e-$au{O>|8z#11|jSH|Q);X{T*1diJp1@5z n(d=g+@jr9MxEcU!T!1xi4_Y3?01*5G00000NkvXXu0mjfOhbHJ delta 237 zcmV%S!@@imhJ<1Nd?vfu1S~Yn&bxts2?O4Q0dK4fOh6B$9DROg!Xl30i`HPE zCtYmJjh=yf&NZV_GZhyidSK4Y7mig;2Rv1R>OC;$e68|Yjb;S(1k%PjnWlOIov3Cr zY6BNh%}>NJx)LLwpGt@L_$;B`#5HA8n`y*d$eS?WO&IW|c>{Z+b#K7q?Rf$Yz)3CC n`~1PxZp+N9eR6au28Ty31nuS&Fug^)7M zLOR2OFk;~#h)N(1iePc><=vUYBzM9R7d-HI_nvnj?|;tupMUety;CbIEAD4`;H&|h zRvtX*!u9p_%K&}sr18JX+S=MlVV&H7BczR`bRS?Bn;2p>jR)!ZJgy2u zw$lAna#{mA8bCdV1InK73(#$0a2MOcz=>s21Ev#z8GI(ZK9jEBj(N8)jGf0ao=Nk) zNq|h6#9aZlCx5`-!msJNB@Aq*wXHNCmtA~;YxrpM?&U}ky-xa9mI?rNfP(LJm}jJ5>Xkdjt8 z$vbK7U-(#XozY~^y8TKFBT{2PZi%xDlkV!6u74*Qwd+ZD4d3Bg{GD_U3u^5bIwAsh zD=<|V&`-ch*%q{!DRcutq1+~K;XS+~D6}Z3w>0)1Jcc_Jn5qoe(fo}|-9RL5Nw1-% zY3rx?K0Yv7=dXxp5Z=FluPZQBQ>ZUIS4vNKvg@En$K}x@p3MpG-!lr)?5IjA4K+Wl z>wlu-9N!bSl73Y*a#`+({%A%-;G;@B)n&9Vc)x6PKQI&}c0nZdYVl4t-E&8}BPf@9 zqi2OvK2^zoCfm?#YW@K|qx*uLbmcaqo7V3bZT5(q_(bf+zBj>UhRL^-JyFxU4pt@t zY(I?$4uY57ds*~KZ%l||;!S;~Oh?e6?^NW+ByG(x%$c1^WZ4vd-z5=^d@j^4*5rh4 z3$N#{w&y=^E<^(+pUll0Ew#A;%w_nv{dAQ~{eQT7#&X{q@DBsU(eACaXMX?y002ov JPDHLkV1g_E;|c%( delta 917 zcmV;G18V&62dW2j(-B1JG8gZ#tAfM^`~>D zr%-`4YzUBx0%!v(cvJu`@S`y9PMk{prjltru!^q)pyzi1)J*!e09^=!Kg9ibWEudI z8ZbZ?eLN>ty`P?i{~6mxM|k5?{F1(pP6A}oAnppV9RYqBx1?uT7+9pfz4SdQi+CF6 z@xp{SCW?Vo5r3>5!(f~n>GQgXfvU8yB!U>W@D6^$&v*u}W@5=Upb*?GX;Yo2DjR|- z%OW-!_!{4fczGOW@q6mu7gRcjlNorjDYTXVRKXAMaOL}q@nCM^NxXuqVzoCa?F%@D z4>Iv&8PH3AdTK=9#Z%Z8-h6A1Ic~d+M2i^=zp|t$uVHvFd0>Kn|M~8^Mlkz z&~9MJ`Cgji3jV5$Ifi+BmVqg28!gnSL-6_@^{ulfyi&>+_!58Pa?;J?R$NNIr7Yl^ z3`|)b*i>KrLDDUa=(@tt(@FOPe!%CrR_S}2@Jdy8R3?RT6IpME_v)Tsh*(%m?bq-= z{!Qw%XIlUE^fLUq?!7m4n)Sk*Uh zhoH(u99QT31>7Y9mY?HP}ntd?tpP*8x(9sDn1tsnjq`TJMTOO0PalFX>mr8K9JtqCV;i z<9}Yv#51$=Kq>1YsCPTm&-^?<7?As{;Ozu-r}k~(sWaltyuC}mU-6JA1}DLBebOUk zN9^fc<2w^Ut9E*C8b6&$<316!(zyw7Onj(s;3Yw)kK|pG6o%I@Q{PG)A4Y8>dj r&@2on<D-B3C7m%E4Ffd2qqRsi={O%CZ>00000NkvXXu0mjfeXYiz diff --git a/rep2/img/glyphish/icons2/74-location.png b/rep2/img/glyphish/icons2/74-location.png index c286d2ce1a627c5db4f1e9ae0be790ba1a810e67..cffb2968a3d986c3c0dfddeb6c478b1c44b12f7e 100644 GIT binary patch delta 498 zcmV80V1lwiy8(29W`i<9IzfBzOKpY3B7T-4qo6V-Kc?isbG4NQqmVW~$U=N(D9hb{xP#iIz zz!vxhGA@Hh+A`5>fh5MHF$^TY7bZA>0@wjlN3)i;LVjn!kq9QV1`-LRyyFL81T26L zNB1giBheszj>`Gf23FYMU!)YxatcR>^xbL#&=?qEm(2ltXI%zTs<`@0#tK4XU@mom zSsra!V4v39Cx7&zF))_;fPdLEQDC3KxLM{$W1w97KZ-FvD`T}L#x}YFex+PXseji_ ze)FkB3b%707*qoM6N<$f?mJgO#lD@ delta 335 zcmV-V0kHmy1nB~hBYy!fNkl79U4;?s0U*B+(a|rkg?8%7n4q_$Y)NPbQz>=3>68sJE zw;BZKE&wN#5=h>-Vvegw*#x%aH0>}Q4l1W9iP#?+iM(P2yjfS=T3f8#oR!SUkrIbM hmJ-^?1hjE_0w1!Z7BZ$dak2ma002ovPDHLkV1jxilPCZH diff --git a/rep2/img/glyphish/icons2/75-phone.png b/rep2/img/glyphish/icons2/75-phone.png index ed58adc9f86abfe740a6fec11974adced18fa38d..9353db473ed1d3b3bdade9218bc82764a5e83698 100644 GIT binary patch delta 471 zcmV;|0Vw|K0`LQnBYyx1a7bBm000XT000XT0n*)m`~Uy}qDe$SR9J=Wm_1U%Fc3yx z7!Hslzzxg|?2Zy{AkUZ@=v+eQ4sKx4(S;JK_y*(#xT4MxC=?UNk&}4k$S~t?CX-~9 zX!luvyP70P!hhDu&;ht=1Q=SUUH_0}S@kgo6rh2)uYl4t?SJ%p=?FYwf@k%f3;S`F z1mF&MZ`c$AK}Y~@fmh(NVOIc}q=@!=Ek^mGI+Z4!v3p@r7GJuyBySHgmmvjV5i(LVMLo6am7jawakYlEkH%S2s z;LTzWfH@u^Tz|IF82f?^Fu9T!2p51QaNW|T*gu^@2j9PPJ;(~$*TWU<(;i*#ic|rYY;EJ!AVIRKTayai1k+3_R~>SD0y~S&u-a z03k%*HSs-%m6sYj#JsD+V-)q8!xB2pHbmIf*|BaV3Q*u2`(am?W)q@WTkO>_uT`pZ zBEp_KRni!U2>9sg#K*l*fffftg_C*$4dz#0LD)(?K?N_pcy%T)jX N002ovPDHLkV1mon%klsK delta 337 zcmV-X0j~b=1M32iBYy!hNklgx3SMlu{t|gPMnuPeM5$5I_73iU&aGICrfVP?{T{bxHuwz%c(djVRhn zFo#plQ=_dO@CFq|M`rX?i!Qzn)!-hrh(8bPQBp75tnEN(+Y(cn}mfqz0d z#AE>=z()p=DknGhI|~2-UNeXtKX=;&{iTR%wHPiejKi1JXQZ#>608Oge*e))r6!^( zK*+xnmkt_|qqK*`*K%OMvsIG5!HDDd+!pz&XSPm_6_g9JTWf ji=x+D^_Mvl=^pS6*C1iuZ-lK(00000NkvXXu0mjfqh^o- diff --git a/rep2/img/glyphish/icons2/76-baby.png b/rep2/img/glyphish/icons2/76-baby.png index cf00694d52a386679be012f5b2007553708afda9..7f0671dde3f24cca5cb27082db98dcaf2149b855 100644 GIT binary patch delta 490 zcmVDoa{@w1#TCK{2wlpQloXzo?TH;ZyR(Wc@g>Xl z&aU!byfeG@Xt7u@WL;g_K&S=}a2+x@&-1QO3cLXmx!(aZV1L`zIm6v=1o)&f z-_>TK7ywHkX=zU+W~vwfsb|bfF#rypF)zgcc=e2VDF(m>ShuvVC1$FiGI~Pqzz^_H zyKgO_p|S=@D9fcz);l?GfhmT$U^#`l%-5AlpSCjVB`bhF=ABF-EC9|i?_>rM3ZTvR zncJ?92}CG>Hh(|uF{Ylx4#HcZ0NQ+?QmHFZ(Dovhdx9Ahdl zpR(I2tF6Q{$K~(|xRvW~6-#8yEcAyhS7NO><MzF%ya5}hePcE$atJsSD)KPOA%DONpA=gsO{|c{i}R5ihKsGUnG%35Y}Ch22%DtnJX4&QOGqmyzqh z?j^53a~3)#A}4vN08d24ZYas`1L`|*yglAp*^*x%z987EGx6X!|2KMSd;?9U3;ui$ RLR$a;002ovPDHLkV1j|t#uNYm diff --git a/rep2/img/glyphish/icons2/77-ekg.png b/rep2/img/glyphish/icons2/77-ekg.png index f9b0e0afc8e71455cabdca018ef69279ed2472a7..71329e7eb5c90aaa7426bcb36ae39961a2c5d8fb 100644 GIT binary patch delta 487 zcmVYi9}z3o9**#ZJuZ z#kfo67y|iW`RD8mGw0v4J9~Chxm=D;Mo+sZ&?>qD+KrAE(0`jGxKt{|37ZA3#hwSQ z63&TyJ|8>Q#R{w_`@=zgA6y7nRCd}yejls_q=6ANo;J=Og0+CfB!zZXK@bbUPAr3d5;&kpFy=47TEIy( zpEc$$z*@j@G#?uCCowi0Ip)MJ8uJ&1rFo z*R6<}lJE{;@9XxeSqrdip$D-Wz-zSjD0T$g7{&x_Dv@fL9JfqbCx`XMHX+%R<9L2jzD4tOk071`mX*KY z6~t3OUHLB62VVgrh zZWM<%P(lJc1HY`Ufu;041973h4a}rp1=S+nfJl-^DmXWCrN9GliVYLn0kh{+f1hdQ5azQH~lD5267I9Iq&pkXFBl2*Z*kvj4 zS+Ku$^^ij?hd+1!8GA3_56X98(_v%{RsaA107*qoM6N<$ Ef|aiRy8r+H delta 433 zcmV;i0Z#tT1j+-DBYy#rNkl*bcUnJw`dD zgxwsX9HE0v2T2Fn4#SEGt>eSZRGKuiOifG2A%*ThZ; z*XNOX2hZ}H0UO}4W%nw!UmbpKsYwk+$j%=uKPj;9v1Tu}HlBfRWe!2IX%b1PckiF` zj!inXNL*SwIsxNJ-bJ8I!c0xT)~ZW3E&`358Wd9!$R%jzbM7Hfi4RbIg|z2DDff+X zy^Y34=`wObRev^ttL$%<-MhoC2+3v4R^q`L-;Wh!?S&jDI>ynVc?U9CyYtxfiLn!# zOp}YY0!Hpfk6nR(_ZuI^W#odU0(Me;`k$`LKFGA~ggUs9z^+!pbVDls2IpG6)pz$z{Fu*6BAY23YX8QY4fwU`&_X0i_V|Koi`wP62s@V zsmtY35A6I31W5zFk$wmA%Joc>6XRbi5dEs~zYG-35;vr`P?h|LwO_cbz*fAA7PX`B iXU;RhfNz2U-#h`M3oQ|CX2ui%0000z0-yqrB!A~gL_t(oh3%Iy4udcZMSpq#cHl6*5li=Sg08(!C+@^hx;R6l z2JGO}isUCn5z>$CPn;kEfDH|Eu`b{&ZonEhV2!4M6~GNZ404FXg_0e30vPdq zyF_xgPda|-M~W>*dT@r4BuoZrJtZv^jwJwqSMq#it`pVcUt(*tTPSUt9DD8LEz}gv z8}MtC$-7qIe;KHjr)CS4QoV&91#7Cs*8HI{q4{gn4Ors_toZmY@=2AQ$V&2Lr*To1CAQ2i z^#P=00jbFXQnTj-TWkBkGy%A)oMylnvpANUfhI6V%r#Wu3V%2`U#)(c2v{XF@XJC4 z;5_)D(vnat4U}ABx131H0?f=7oL0hG>rcG_95@>;;A)I{EDe_aMr+3>CF`y^i!=il z08h?_GqeDXYyL)kYHv(J>#sM9R6q;e%Up2}pwUXy-k2h7XsuZ^1iZX4McM{H$K8C5 z48+1NA0X}}_DAW!csaG%d^@cv;D&Ec)DON^>?E23XvCMsPLfN=fku33>?EvS=pV@? gl$tCcHCaGvJ|#X#qt{A20000007*qoM6N<$f_=!2d;kCd delta 251 zcmV75gdUDx|1&82pz#uI+Fd-Hlao+ zkGpyyy)U^432^s(hy(x|I_6?sfD{*CjSH}b6%Y<$)-H-=BVtroLp$gR_gBPT1-xU) zxS>IH9g>eY-A+Y00wU# zkRM~Ye?to^n_uH95qJGlPar_v!7hp~I0v=Vr{>~txsTBYK002ovPDHLkV1hT5 BYR&)v diff --git a/rep2/img/glyphish/icons2/81-dashboard.png b/rep2/img/glyphish/icons2/81-dashboard.png index 4f3e0984b30476f188263aa9c8da35819dcb1ac0..79312f524cbb0b21bfdf1aaa6075bbdd4536ba22 100644 GIT binary patch delta 801 zcmV++1K#}E1h)o|BYyx1a7bBm000XT000XT0n*)m`~Uy~=}AOER9J=WnB8sTFbv0k zJ=_592E7T+ognE1bvHC@JOs)0 z85T%@C*TMyfs9k(l`a#Sqs*zJi$bsk8j#fpvcv82!J|!a*2!c%lKxoc^ujp`EP;D7 zUH~haU1Klb6PY)c{#M@4`Uuh2g{<%g;2Ov|75*rXwNN3n*OXSe7oO4Rqd-Pg_#0_6 z;Dgddn&v8voqvn)Y@1t)SOqj-F#_nWr_v4#{V#b6@0-#VRF#Mh>{tbsW`QwPmsyE0 z3-hk95s_7zNaSca*z)M`;a30sNs`iGKr5=sPn{^TD8YMh#*V7)twM z-t9O&KA&;B`$p9=J__8~Z;j7B&jW?cu(K=_6hr8=#$8H zl*ghfk>Y~6YjM3F486Gs&tTtI^i5>Bv>FSqBG|fVf`P`0&CUzL4uBJ!lZkU&AZjcm zBGhlfeyc#~lF>V_IQPHM4i}J1%1cN_*yVgf^-$=A&nV_}7cVL6`#PcY!ZH)u=zy)m f#Tx&=)8CB0<#@l&GHXnG00000NkvXXu0mjfOCN=s delta 577 zcmV-H0>1sX2H6CVBYy%QNklFB7~(=+Qjzx^;djZ0Udvsu72BqsWc~mZ{Q7h0B(Sl zTQ~CTO?YRcZsKZzDr4VDWGC&vVpWHlTEqkw@%M9 zaUN}j*V1-^9g~eOfhNFL$m#>ua2};x5Xl02XMF4K?*{;Qp4Ne|vWoy{#UO8d$0;qg zj^FZV<-a)%qyHei72f1!I)xn;l=WHPsz&+z{+md7Sw6F_K?}J0HM1W!= zphk~*#~KuBuVYaz5@g~Tg*07!hv@^m9^mPE^!T)zHHAFg%IZs%C%Jxc9O7OAI=+pb zELv)uesup|7utvG39{|Lvtrai2<`w{^9MhRU_LL?Nhe@84nN^}el zb86U_jy|9l8Rj$!p>evF`!P|h-Mx#A(;eXhO%8yIA82g4SP%{ADddloIh`yUfCmBT zMQkb8_&WdnS;gjcm9cNd3?H`U0APXaI6v@M(gVwGCc|e*pi~oDS$9P6z1#N8%p1akG!ya0fUQKnFktBo)LZxP%;b9Ghir*s&#q#4lOwYi8%4 z*~cuS>2%6Hd~t?}$Duv{+Ny4FA}p8ugUgc-MF}h9dClXqy3ne4kg!c*A=MwIFC|A9wV($#`L?2>d8y4ns_=CGd_} z*OAn7pmdBYZq`(G9fF0)aDL6lMGHL>u)i;;+wdkmHrM|{!_JF-1 zW8e!Dg*_%Z1%I`N!5Dl1LTN8B9*-TmQy*hA1YDbMf-%0}+}jnlR(*1%?oJG~i9<(y z4IF`ADZ9q>h9&~Vg~JErAlnwcmj`N{94$6X)`4=RSLkHxCV?0?Z>m r;&iQ7jv~lWV)XcL^u~A)xHbL&Jr!Tn$E#dm00000NkvXXu0mjforM47 delta 450 zcmV;z0X_b~1lt3UBYy#+Nkl3uFaGV1$m) zc7k*Rx&drJJ}eH`CpTEA5bpBse1K(3Nb-~I3_yxjPeEdWL780k07*qoM6N<$fDu5gDCPpSu|9JCZ g-A>;|nNb1U9P1%6hzoHjSpWb407*qoM6N<$f;R(P-2eap delta 186 zcmV;r07d_T0@eYLB!8VrL_t(oh3%C~3V<*WLsRiYUch6ycV}L^Fz%hgM0a}rO#G2~s-Xe0q8b&|_5VE?+$Diu0Hxg%|1T4%(z19t=e+NRj zg{JyV8i`FNVoo>QJK+8nVt%2EJ^P*;$0*!8AOY66zl9WHYcnLk8in|VLd+lm*0>Kb o9#K8z^`zh0SU0?1a?Cmnx;H$@c;k-07*qoM6N<$g5NMx)&Kwi diff --git a/rep2/img/glyphish/icons2/84-lightbulb.png b/rep2/img/glyphish/icons2/84-lightbulb.png index 9f658ef2025cee70d24ba5f12e8414fe0cb0ee52..6fadc828fb899061a7cfbc4acdefac4082a60623 100644 GIT binary patch delta 396 zcmV;70dxM=0;L0xBYyx1a7bBm000XT000XT0n*)m`~Uy}S4l)cR9J=W*gr}GQ4q)R zPgE2OK}8S|D^H+!fTXtZ2ns>%V!9k5ow3x$D+D}1QrX&Bc>oU}mTHkFgapl>on;B^ zw|TqsX6DV0c?-i<>h-!sW~t}`vQi2tnuQmz5|O0cZV$g!(SN|%h+7wT=>Hm8tybo< zqdRbmp7G)(TQB*95z>LgBhK-TH|*g6t0R6l*u+J|p-~;E8WjJECw$=0c=5lSrV_6@<9k~>HFVLUh+x}kWgb9RVPrEV4!M(fed!Q6fmhV zwa?@v!m)JFTZ%Phfo3+rE-(aoKr6?@?B5K;HnBc12gW&xzkd@ev{idx1+;+ykA1aw ze5W)9O(!-yN@fI{fvw|vrL~o((9O;VVa%^64P5M8TLUNH3LJ$oolu-Y6C0~jKzAb2 zmL8);kQ}2b0|{SqZ*B zJ}16$YzFiBoWG2lt_ie7FQ9AO+6JuG>$2{X5Hf)Ig;E~a1rngOo5=p762<0X|whd>08yrO(nM#Tm)=UPtmMvlWYj=O5%3pOV5mn zC1=xe`-ST&6n_C@<Didn(s}^Ak@CJ~}3rT#*YAR{;qyLrwdEbFG`?wCy1Grbz9t zZ8PeZ+e)-qMn7fHH!hdSNAl(JMV{cD#OzTow-b42zZXh`zyq)_h?Fg}p%Jr?m{#P$ z--j#(-chqsd|6Fs!C8gf8oqa<8H(U5d6Jp*c_k0m*<(s%z>74!S-Zc&IKV$R5A*`M zMlYai^a2b7z%%MYb|Qb?)xUS*6Zjg`mw+eWh}sv8Yy8IIbCj6Y@F5_;?aUkFVI~Is gf1@3v7tl3+0HVrV=IF60KL7v#07*qoM6N<$f~4TzXaE2J delta 398 zcmV;90df9=1g8U#BYy#INkl=n#y-D5MMm!4Rq< zNEx^c2EqH0v+Aby7QfiCBITr~#2@dyJAWn(0E-Rdtu}$R*ag(ad!{&z&~NqrYXm{0 zWS1g|k8}xLn8;ZSEiDE=#zjIT*Aj~1i_gze2_!Rc0B~E__kV-71UJS`fNnRN{88*>0{S3l;pe5nC--y@!;Mxq!TEHjS!D1T4&MVJ}seq3P z2z6~8V@kM)oJNv3vD`<<89ZicF0yC+iRI9&6%$|q3>?+gd-us{JobQ|iB$Ayy>}@O zv7?)b4zCEE{ePjl4)T%DBEXr!G{S#fTE37T&xb&D0nUE@5z(?w&YW3;IT7D@-V=&- zxyf6}$6N~BhhMQAoBto!1=Pkapf+{^9_|3n0FIcBPygT9m5=Om&zLvMg)#{84w-VV s4qyc29n9MNrElWm*f())Y+k@G`$vZGqPe#B00000Ne4wvM6N<$g33U=vH$=8 diff --git a/rep2/img/glyphish/icons2/86-camera.png b/rep2/img/glyphish/icons2/86-camera.png index 1ea2cb80e9afdca44ea704110152ed82b4dba966..47fffaa1041d51eac6cedbc3e6ab302805be9463 100644 GIT binary patch delta 432 zcmV;h0Z;z^0?7lABYyx1a7bBm000XT000XT0n*)m`~Uy}dr3q=R9J=Wm_1IzKoCZs z5r=?~G8HX|CIv?bjjN=zat3!MozIXuNJyq2hoEr54Jd<@TbN?U!dmQv-Sui^$xj+t znVnh9w?AVmQIaGKnTyZ`xH1X|%_tx=gBNgVnvmzY?s^9nntyK(JlPbKrm0bUA3LBI z-{tdyjetj>1S+vEDnlz}ZX=A35bz3IS>&DLLFT?TNwN`8%5w_bS>&I>cwt=bzybK| z7^{FC5CapjSbX}i+dI@?wF6BK{N05L*oZZG6Z--(AVL+tlX0ty?<$~;7gX^RV2xUN zfCAXc*bG?lTYt25*YfcqtB=GQwbHj@nfRJ9;Mj6~2>6g^+%gtxG0qJBQ^JRUxjc)O zu|kV+#>XXIpt{Xge(RUGj_Cy-0+y&&xdEQVnq(5w3$6mDExrg<I*wZt^87A zdcj4&sZWUr)#q0Z^ZyGQ0r$X7--QU@rU^D(C;^TZc`4^O%G^do;~!gr83lx96cC!h a3-|#x=tR~k@~4{s0000+=b3* zQqiN-T!1zRZea?K1sScA%+8t>(mrXl%Fh0L<6V0u70~gIxymiTO9>!1C4k(N0DvV> zDO)C3_aZ9%d7v8U|C9U@a{{lxoS&yXhCY>ZHkY-{bVjRVHh;O0+N$R|Vv~Dm55SvK zu;$A;!SfQ|0Cy++YoG-_#aijpEF2mD`xRO!3$Zydf1|{=Y8|VdT@+y~GAw_=U- zbsV3BUL$(|t&D2|zD9g)z!w$36q)!z+HJtMRb$+gQX;@!+Eu`}Qe)i2dW2w`!phpf_CcF$7c2sMhIF1F7WR4sYa6{mtkWdLya5Rz*>(Of2=l=! zmigbj`C)e6&SphXaLwGrUO*_xKx|ryNvf*)ydTbO88`u>2KtfZ1fw#r0tOBA1Ir0UWnc;PE&jsmmWskE16zv;kpH5~ zP2=^!C|}|SpbgCV*+gz*ZPQ9n9-~L#4%h%Mz#7=wSRc3tK1_2|6;&Dl*a1D@8JOa> z3%C>K6<8oTeO)|i1K<`ov+&WFR)lKx~qM*r*KL;yUjeaKJUN^Gmyb zKA2`|Il-tp@rHW$fv&|Ecm#%_g|qZ;G&0FRY`y>i%q=?uVER}90000fD`lzNZbO6 zJ9K7dtvCW*+o?Aw1IoZshPqPQ0kz4CtVsS#9^!m{&!23^F9WRgn6umyXiG7WoAaPJ zgNEZ;pT8&roIaVRruQgYXouIpSVt3SpbCt2G`-(KQ3fhZPk+!)1+7?=fk(_v(9hDC z)-48&EVOWfiLFStB-U*iow_`-EW(nter z_Vzt~@qnAuzrY7B@QG1iPV3;d!n6IaOqKdp(fOiR;E-*-(^-ykk>#cs$W1Yjn_?h0 zQ3k#-!4rly7d6=KPy6rE5w^RlOVt+uSk_CxH82GBWv&mj5FuHxC?WUo0GmJ+*pR0n zbEIPGj$dOUDl--W(p{h+V-Z+Q&ABlVUn`)dNp4j_JIa`C$9~i#UZgJ6*KD#7aOKzu zldkd(ya6v_kAGw>abkvIPibkATa?flaO(K4z=`9Rfd;T8{uAK#;Y%4acOcLUxB;3o z<~uSrfLpN#z@Fo$*S*k|P}3s01-{>bNS{4;F!;A#J{{sq;Hz@d^Oersu|-ez6q@b95(R#Lsfu7--K2_>Zg=|BjeBf n5vw=Q3$;JW|J)7C(hK+iYA!iNLTr2400000NkvXXu0mjfycNUq delta 409 zcmV;K0cQTz1F{29{dzqb9=U2ps^Yt~~_SfhXV__C+DW1zt}4`Mf#h|&Z$Tsz}KPfD7PV z*zAk>U018(h=0pX3fTdA1>;Aqz67>idkc6J{rtQa+8pRvIJdwziLNklb6}7k)kLtO(rDs5)u+W-}y|CsI=ConG<&bR3rd5 z5`Y^Cz>NgpruqQqRAJxuu}3cejh!0+?Sa(@;AZC&fa{j1>wmhWx=K1Q0{GbR#8N!G z!uIerjrDMTV{S1e0sI0k1?xk6kCYAgfqDiMaXr~1`3zugamYPUw@2vV)+Yt4{wtId zKw-Tr!;UUCLPC$2ZWC$;{?S2_N6BL2&EJ%lZ+MufDndzs7E7BSm@lK80({M6J)Gas uCAdP#PdzgdfFTNgpMgnkCeSj|)Z62lPX_R6B0000$f?I^!^Z*>3gD{sa43?FkIBxZb z>QA!7;J+u!4hg`4fqAeS@Dc*pga9@nfK3Qs69NFt0Mcnoga0D@=P%U9VYDn_*N%J| znIl{K>6ySLzW0uJjm)uCy($d90}1WF)9IIu6lm&e_z749lvS4Sb>Y{##5zaKuZVX7 zZ)dzaM~?t`MxUPIg&eu+b%FIA&^D z8!1A62qY)x{Q3XfB=_9Z27>|r8GG9n5R09GZDT*QU^E)}PJj1+GoTG5*0~gz0Z+ix zMKBx=gY*O&aG(uLSQni~0$jH-h=#oI`vrWgqlH(I1MnY?#P4>(mAf zJMaR0NW2MjfPX`vp5r+Xj+Ss9hYHb*K#!jn)|fCO@dk{6J75lc$u^hRSaNLf2xsv7 zpfPY}9UBv$z$38q)Gj6Gli%W9+#8`W&@PCz$Q~P?c!Q8hbz~`?SF*Ez^ov)Ae*EbCF&cJTQp-A zaeJXL@MImE_Mi@&<2TWeoI1sAht0hanpR>;Hq;60z0DDDL%CMM^iF0%OYtmpT+sGH zeX@SOs4=^yc#?v3!+8^ZjS%fuXeJl5#TT^)dDy)Z!l7QB#e7DefmhitBi_I^@hV&@ z#IA{_WJ7n*wAW=}O!SEm57kU$&%gy?-|$pwqQpaWeU_|MVte-K-02z2|NMs{3Kss09-rragO}1 z!AA-_0E-Ii7k^@Fx@uilK0YxpGK|eo*Tr`7I+|iTGt8NM?}T&Wuwd%oV;YN(PYfiM z@ekm*qK{AD#4_i^=TOXPnE#UPR`>|WEaNWO)Mjh*ZH143OT$=-I@M)`^-Hley+%#G zx57ujRjFSjvK1;xZ4*%>vK8jCqwISp{$(ivD&gE=E@{ll<$(@cG1mtk@wh_10zjSU z*g(WazJN)@1?nGjM#yWl1GMG2DtW}F&vz-_#*=)3T7Oc;5U`=Y1*n}j{b1s>ywgb=-6KI=jU&HZu>=J$dVVc-B2ZMoE9Dm*koFKs@(G1kKr{>~Y zC??Q0F@d&;30Rl_Tg(1dWI+j?Knj$=$RZnwEDd>J$OJmT3|IhDi+n1wndk-~0BYy#fNklLYaQ0?L#vQD2~p-NM){9ekCbg+P6#2#HTZGWh(T58v4&9&lp7T=YEwEn@(E zbJ>BW*U;~@<~-MeXLLL9HTV=71L&JEfW8?6sNf!$Ry?0dpMP^s4zENsql&&r`Vz-J zoe3QQ9|+Fa1Y&b^<=5q>LUci@H$Vt18*F#LE3gL^TF0&e zxCJucPVQ4+EA15~b&5P=QYk@+i(M$jOgJn&+t#$d31v*Ib*>E{$K>(?nEhegOvbE5 z!y0V>5%59z?SF$wo2qt^P{u|z{jJc{Kn`4Cc9x*QHl?~IQs51Er~2?~M6&`h@JV^s zd6MfVbv3aRjo5Y)ngBMKJf0{tCZe&i70?`H8Nc)Up~iMaIfaT`W6lOEv?p=fw;xbn zCz=&hrH~K2U{=DGOf-CjhV_Tkp61=B4S{G`&7-ToRUZD0@fTU&3_gG_TV}8kyWPom P00000NkvXXu0mjfS(m{- diff --git a/rep2/img/glyphish/icons2/92-testtube.png b/rep2/img/glyphish/icons2/92-testtube.png index 001e76c336f00676abc9fe621e53e76a1c3006cf..87335ac1c85d5dbd4271fac02fff189e02fdc389 100644 GIT binary patch delta 299 zcmV+`0o4AU0>%Q6B!3BTNLh0L01FZT01FZU(%pXi0002^Nklc9>Ip*Qc6lJxe=7!z|tdd11(sii6V$IZYJ565H{>)W`E`nS#WutW0^(h z4g89E0ZXYsRaITTSzi=|lgKM30C2$7-#;;B&1B45C<+Ko6n_vJ^8zGaqjyS$n1jR$ zjIaSRKW>3WI)QctvVpM}<}IWxpdA>Cq1^)w3ci0vs{#jqsbjtev@CQ~iu=MpDxhko zXrT$H+DW4V>CCxVNDJr~7tl#2lon6}Yan?um-x9_GNE)2l)x6)0Vm+%pQrSjKO_9T xpwYxD`c3Y6oFqUy`erVrlezeFH!$V}+yIRn9hL$KJd*$b002ovPDHLkV1fogdIA6d delta 258 zcmV+d0sa2Q0-gepB!A^eL_t(oh3%Lz3c^4TMc;}C$Pp}UZ7f4hl+sdrPbDdBY%Npf z7O`*z#e|snCt+Y8EDSqgWPdULw@?zW zG)chHxEG*&2VR^EYW9*QFu(<fKV*;jjN*4M7Q#)Bqpq`kUgjztxuz*b2P%WSYu0Yd~YhtccHdOys z0oVa|U=M8KUd{9HTi_<{M{BT-d|D-od-7fu6POkE?|^#&56b#RDDD8&?EnA(07*qo IM6N<$g7`XgLjV8( diff --git a/rep2/img/glyphish/icons2/93-thermometer.png b/rep2/img/glyphish/icons2/93-thermometer.png index 0f78d2ebe243e8c247fed5e93f5df8355a1c0ee8..627e333bbfd81c4faf75d53177a9d874159ab4d3 100644 GIT binary patch delta 417 zcmV;S0bc%y1G)o{BYyx1a7bBm000XT000XT0n*)m`~Uy}Y)M2xR9J=Wm@!VnFcgNr zASNbXpi;K3^awCBlsiOphAA7$mZ_cDxIsBV%Mr4&Md|^XiM0%VrUpVN%6qCR<&!Ks z`JZh6$#W7X$+C=7=Iq!L=*ziQM`c;Yhf`nyq;gyX_rOaC$ba)(Wn7CpFa?(ECy%t3 zqN!qGU?Ft{+)AmwX=;SAIlV)0e6P|149aR@+8F+>l89)NTCkQ(+6w~3@LO7+6FF_Vh%>rKnkp- z{obO7b88eotA8~OJOU0s(RqtL7tKkm3YrGOc5wx4TJ()*acpli4LGUaI%0z6I%59C z@Dz#&yRLCZOwiPJXqpDX2L2itwdfMxI#JLjYG$`00000 LNkvXXu0mjfY7Vzn delta 366 zcmV-!0g?W?1Be5VBYy!;Nkl;t z63PTw!KvNYfCq@Gv`V2PLiU`NYZN?|q>Wt4xCG>>wECX>n4 z?FPo^W9@;poM4J=9KvWcYOR!IAn_b~Si(2_#E(?=`<8mUneD&CP<)(C9OP8WHLxMX zf5$#n@C)x!`HnEQipMk8+t|fxe8Lxe#a8O;g)|ZmVPKpD?&A&C(agl0<5U=HM1C#d zV@unAmpAwzMt@_B_ie&*lejOY&595YJ@Mst((?t*@JE<971OLMjWE^E3C=aJmc%qT zPVbKY9e!_)WG)h2lK6_xcc?Qra!23jvF+XjFLj0zTJ%DaWd>}TLu1ASs wX55XVL=Fq}uS8+0fznh1rKtu=Qw@~n64Jj%(3Ex+ssI2007*qoM6N<$f|Ov`@&Et; delta 378 zcmV-=0fqkG1C#@hBYy!~NklH_+^0++r2A9M(}wYTtIUri$>R#D6vB@rGFpVI;XX@J-%g zVEqg1qJdLPha`mx++hZzm`f%Z#C~#rRV>y>#!Kq=)Hih(ae@_85n&r=xWeR539R7| z%Q(h^cn4ln0`G0cWk1h9m7HD`g%a_MnFs}N7%t*R$yosdJ;eJ zD(cC#di(I6nR7_y%%s1I;>%s+N*s4PXmT>9oPn#!^xScMA1cwT2 ziC?#K`AU4Y(MB?7CcS>h#sl)Qx=@50@oUrZhm3!8l=zkW`O|1AP&B1L(Uby3QwkK# Y2U6~G@)A~)+W-In07*qoM6N<$g7*)ueEw9Y8KaKx>{UoxS%z zcO{}vq+52IbMA6XXa-_IlxmBD3Ro+*Md^MGbT1%j5fjnD{C_PxjZ!QSsRD?IcILkn zV#t~lM8FKZa|S#qcM$-86A>_>g9%g>5F0F~mf=a!&H!4=RWq;@2n5bR>Op3Ly_wIM znQ@L_8}m5}vm~@n;)&TmJ2TGNq=+CTBq5bhiS1WifKb7chV6kcTo1mV#QptuZQ4Ue z1pvS#?q3c*n1aFxn29+#=%6qHKE#|HbWoyXfDVeM081^0$#(!-%T)!u3pipb%Z0GV z#xnr83Bzh^@4F_Sym#VR*qTY$ma{S_f5ViJhE@tCRt<807*qoM6N<$ Ef{cM|R{#J2 diff --git a/rep2/img/glyphish/icons2/96-book.png b/rep2/img/glyphish/icons2/96-book.png index 4f1856fa6fa28625202b24e8226064c7529d109b..16948c17afc8ba2b3e5fd0fc712691ee9d1e94ee 100644 GIT binary patch delta 439 zcmV;o0Z9Ir1JDDIBYyx1a7bBm000XT000XT0n*)m`~Uy}f=NU{R9J=W*gt3#K@@=T z->I#jg|UiJD+>z`Y{VvTU|}PvY;)mC!Ny`s1%)dFJFyV%2nd3OCm5nd;8I!URM5i4 z%0dvY30~u$V&+JpDC}$)7Wae4?85HO`(_@yylwS*J$2?l?tcVQslC9Vl$-ng{`~L= z2Dpq*7-2h(|D-62(m7PI1Lv@VC7j1qyv7>7;3-ydvVysOBWVYO#O~oS?&6{#@&UK; z4aaZ^*KiPHJd0y8sR9GM!hNBPzQ;Hd1HNJdPw)e0aUBowR*)H%O(0bOF5nHe@KUJ# zDNYDwa~z#`?SBmKaR<9Njps58%<0%m^fT54sWA=<$u6QD18$~Hx?iu+1>C?U-l4!x zVYMF#rBn%3?!ezzi2*GYE?n(DWQ{;>8iCw20=a1fa?=RprV+@^e=pD#x~XY;D&t$CLm7 delta 381 zcmV-@0fPR}1D6AkBYy#2Nkl;uCVJ3IS6 z^WU9eYAF1})N==jr4s1!9jkbPalFA!qOl(&g}^ap(7_=-VSgGQ&=kbl-TTR@iTjD$ z!fdZ$6Z^QtBqlJ7ulRyp{J|?McdyaJ3e+%*E&RfnFw;LveVTYF$kcI)&p5$zL8cWG zAXeaxc`RZMqe3M*xGwb>!W5oi1m{?a$&gZ@%u{S&0b}?fguTK|so%TU41*HrWd-ZP zC)2<-eoG+G=yvzPN3!GZvRVk?lTdABxv2zlQwijz639&@kef;%HqK`46C&dz_o b3T5XOA7GFlDNpT;00000NkvXXu0mjfj6JQL diff --git a/rep2/img/glyphish/icons2/97-puzzle.png b/rep2/img/glyphish/icons2/97-puzzle.png index 328d4ca0ae22f52c2d047005af7f47c53823bd76..53bf45dde844dec62eb279d37b01105258b894cb 100644 GIT binary patch delta 702 zcmV;v0zv(;1l0wQBYyx1a7bBm000XT000XT0n*)m`~Uy~he`s+$p~n_ZPT0BzDAAbGh;EuY6Q~v2Ucm0O z152e+t#fr@4r^%!kB*L}a{50a(1F)@i*xmM-bev$c!V+%rLZlOEtM5*^cMyyI+=^J>8CG5d_6eIUXa5wEl^@>1S?DrEKDSyT{Z7UuN z0tfv~o)C$+zkfv3Dxekj@Iy$CC>C*15D`Z=-UulcM+*+8C6G6TnuRK!rrfrRm$8U0V;UE0BU1Qb=0r+U~=qJI;A^TMY7hz0!2LMG21 z7{}Kt_I~u1zwg5}yh!111|`hONS=HGR&lk8y?~eajelQ4nzf|xH;jWhcp!fjdR4ya zfr2157iuY^BT^pBQlJk<^E_CKfCWsX7`K9(IEGXBk}&Rp4CQkjd8$ymP>J?SE}iRG z5=cjT!7M(h%=;oPU@{AttOD)}?LX~Gombh&mIab`V)g~0duKwH6e9uN2AU=UZLLW%-|4(E|p+%vA#dCKOL&DzZjolk8 ze-6d$GuSI9=_s;9U`?ndQG5`}DWSPlBQ%I-Dw|r(BYy$-Nkl?TF`QAS9fVuZfU8RSj@}7dYP6>1M?HJQ8x4Qr1Fp_-(8QI(-)LUr!8wP5y$$ z%5yZaIPBtE;D7qpz_kx}GooGtS8+!EVosz6N*#eNP6g`JuvK_|;i>pe)UW#!WSDvl zY>g3YT-C5QYk&+FON6*I4}g|(4})K34UoytI-^v_qaxrtoR0V!5_X?y0NO>6rhMp! zX$?CA&v%430eD$8z+Gw6CN?cXM~L+y{!##T5`y>iBY#qByU%m10GjleJ+`qG30W6k z3wI*5-WS1d;pc?GlK~Ed=WZ`#Y+H>%l=WegWZoDEcNTw&dwcR9rI4=l`O0p|4{XYZ zz8MJhAOcX6f8;C#z_8ZA$${{fO?On7DM0@;Ye@SrSr~u}Z)XrZL$=bRSXLeWwK#7r bJ-|O>EfPHy38gi!00000NkvXXu0mjfp+fnq diff --git a/rep2/img/glyphish/icons2/98-palette.png b/rep2/img/glyphish/icons2/98-palette.png index 45623531047836c997ada1c1111483f4eb908eb7..f2cfd475e2b5f1d393710250c3d9e4683e75a0b7 100644 GIT binary patch delta 575 zcmV-F0>J%}1lI(RBYyx1a7bBm000XT000XT0n*)m`~Uy~2}wjjR9J=W*guOCK^O+` zUqnO*2igdBXJe~^g;uAPm3n>xPe`9Tut;~NOCxfnAS5=5m52BN;s=mRea&5Ug;hiZ zv9g$5cU|*uXQQi-2ZouPM00f>-FZD zoWmwIa5X7K4Dk|!;)717Q;N?rJ+O{Gj*@yyM*cfK;!E=TR?c>_%A(5>@I)Z9C3v8S zp&;OWp?@83lW|d4hJXX?Che!Vj(a%F*{mh?nOxsjyu&BK8&RI9D&RmCCWm;Pv`_Fj zXLl2KlagW&FMrS$#Pm(}-b_>xkS7lpWjjq4@A>CN52W>xKz_R{iC6*8{GMIb@En(u zvRfQfKtdqr$=4#xdUDn~+sD1mdq2oacrtSg1f<#G3eF0#d#4JCDu@jsrr)xE76011(0_i}0m~9_8x3@)JRf4Tz&v|p z7hZ;dfk05MPBFqILEtsh1rm0@IDRf-1mqVPV`qkK*RL6BIN8hyk0Q842}s>M7It=A zVr+Xt-zZ|9pNPpq`$9MzFR*A|xZpnHp)7-?7>L~Y6fpvrejtne)822!0`byWr-)^z z(Xsglu{bLn?8@Z%Gxxv)le5td&I=zuQSm+rjnzMMHDe{9Zma~N z`NohStpZ!XMxXf;SKn!*Pz5-W_xr#t&;rWJnh$yXQpTo%HDC^rZWpcul0-gG_9;v9 zk+n2G^N3W6a3I&5NijaqvE`8D1S-J2^81CKNW<@Ze0}F^R$T~0uTmv_@&Jn2t&{M{&__&-vQ(l)5 zI_kRnCO1z_xZ)5I0`=MzV z3mo=|!R6TQFh@*}un+7aQm16_U3c`KD1`=DXT+fSB>x|fi2(f_F`$O00000NkvXXu0mjfc+2K{ diff --git a/rep2/img/glyphish/icons2/99-umbrella.png b/rep2/img/glyphish/icons2/99-umbrella.png index 4c645daa3544182fb5fd12d94ec4704efe4847d4..2907049230ed5f8c38090be365c01b4d42ef7a9d 100644 GIT binary patch delta 424 zcmV;Z0ayNr1Hl83BYyx1a7bBm000XT000XT0n*)m`~Uy}b4f%&R9J=Wn9*&6Fc5}6 zst!OmV1$m~PSA{yO1zi6F#>Ni6EH&Apcx?>G#i8s(g!;N0g3SWQiQ}OMG3w;`+m-` zF;SYPESaad69{GT0-k*XilUh68Uw%X_si6vJkP!I@fP4o{D0v7)u+$~sIYhb+-bkK zw#xaap;ZBcO)k0PlK@-yIRPKQA#`Ak3Y5SP_ml6FxR^3@@K6C2kOjnNt`9LG0!r+3 z2xUt^C8PojVRyby=KAzTDj=xrnte(HZ1DTTP9;IG#7YFb3t}GDw`3nMKm+V)*Kq@U z((b%h`^8;HH-GH?c;lOlL_iF@0mn|;0jRNSI~{vhz?l73{A45o_PxQc9GwjX`(z{n zzJxXn`v8f6MrhNp4_N$xW)(0us{lvLKO7&&&^nQMAKtalu7K&ZnNd$=v;>^ocZp5h z&>m7w18+sNrqB-f23{FH&+L@O7)7fBHTEq-cPDLJTOqA9#wgMHa(8AHFW?W%(??A> SO`8k=0000i>rc7m`0 zBXopjfhzrxiwKcZarPZnr93G@+{JhI*#@60pywa+RJwp%Rsny|0Wb2n@$4C#L4+&T zEARpAfi1T)Ux{rm@0ijXJS`9uIfIO`$ekVFs3?5Sv9y3)Mt|`myHWyjW`0i2N+j=j zYf^s`NrQrefbb{*Cx_xkPTG1>&Vf&pQjKC)$TBF{GMumn;8kob@W%Dzt;N5Q?>`Iv z`S=?6Qr4s1LN#!S*e~Ln`lmT!{@8d`Jt@7=0caxjMtm6f?Hq)$ M07*qoM6N<$g81pJUjP6A diff --git a/rep2/img/gp0-more.png b/rep2/img/gp0-more.png index 0e0f2ca5f7526f2e8fb716067de5527c7b764721..919198183014efcf12b88ceebd138787cddeb3a5 100644 GIT binary patch delta 85 zcmV-b0IL7B0&|cgPdZ6NK~#9!?bERd05AvyK=+^39g-?#x(FKX!0ti6FaiJo#>vce rraDu4{B8NGi~?U482QK$!8;-MT+OL75WQh?3y^w370~ zqErUQl>DSr1-Hzi)bjkI>|zDyU=y}YmlpuliGtKQ7o{eaWaj57gk*lZC*}l3 zDNcI3V!zR6?x~_t7moMWzBzs1%vbFa^|;?X_u3F9aqPIsa8~$GhwJ9;8}0zz#^CAd K=d#Wzp$PzfM{VB# diff --git a/rep2/img/gp1-up.png b/rep2/img/gp1-up.png index a918cde412628f38b400c538ecd27d887da9cb41..ed5c8d25b1212e7953f40901f8285e7b1359933f 100644 GIT binary patch delta 104 zcmey#)XF$PCDF&z#WAGf*4y(3IT;j04hMXn|MmTX3Q-r^n+|ec?rl-?oHS+Ss$X*$ z?awDGUtoM)8N*_gP%bA}XeBS-$hX5*Ub>O5!d70qksoLlZ>&?h$9chT$_zl@>FVdQ I&MBb@01$O39RL6T delta 350 zcmZo={K+&yrJkkO$uool2x>S|Iv5xjI14-?iy0WWg+Q3`(%rg0KtY)j*NBqf{Irtt z#G+IN$CUh}R0X%pqSW&IqU>S?=U@}IO_vt{)ro@CITxiSmSpDVDTHL^rZN~B=vn9) z8d@lQjsYsTRU&?!s!LvY?Ipa9PEyISgC5+Q6jyzJ>?sbQe=i^VV2RbGE z8YN7g6IdD)D*8Px{=8b#G$Wen2S3Aou7s+5J4YW~hF|&(`^paN0Ln;Yv+6MH;&Bka zAHJ4Ppw3j^B&=H`viB^H%gT*WOHO3vq%qX!Hk{o!v(dsP%=?WK^U2%u_~#be&a1xk m&O@)bzVk0X)ETqbZ5U$pcDfdxnEnRnKL$@%KbLh*2~7a0RDlct diff --git a/rep2/img/gp2-down.png b/rep2/img/gp2-down.png index fed33c282bcf0e5a95eab586dea38c7e1ad2953b..bcc85d365c321d50e8ff48cbe158f862a2637f7e 100644 GIT binary patch delta 106 zcmeyz)Xq3TCE3r@#WAGf*4rxwIT;jqj$U|YpIv@oHM^rm$Fe7l-{k|8RXl}a()vyr zK1gNxC$;cC(?7$-^-IKc00K`} KKbLh*2~7aMXDws^ delta 355 zcmZo?{KqswrJkkO$uool2x>S|Iv5xjI14-?iy0WWg+Q3`(%rg0KtY)j*NBqf{Irtt z#G+IN$CUh}R0X%pqSW&IqU>S?=U@}IO_vt{)ro@CITxiSmSpDVDTHL^rZN~B=vn9) z8d@lQjsYsT?&;zf64Cm0`fbi;2Lac9#rpr#9+V|%ZcE^Nc_c{Zs8GrC6;$`}4&nab!>W($hRI(pYvee|o~*E5EgCo!MrNnyXs7Zk6_ngL^&hmK4`v1c06ydH z>pa=vashF;R6sU<{9 delta 303 zcmeBYJjFCYrJkkO$uool2x>S|Iv5xjI14-?iy0WWg+Q3`(%rg0KtY)j*NBqf{Irtt z#G+IN$CUh}R0X%pqSW&IqU>S?=U@}IO_vt{)ro@CITxiSmSpDVDTHL^rZN~B=vn9) z8d@lQjsYrI?CIhd64Cm0+CkoC0|A!fne`1q9_pH{K`}xllY)W{Jx%58`Ppzdb*Xgb z{xo;1V!sB(GlzE{2z5FzTi}Bl%O1|g$vOu%Ur#JczIWjC8H3Gn_xCOR!9K&Q(6o_< zr?ir_QBorM=>OORET}h#P~M=W_SkRhMSogz77J+ Vhe$254j=#k002ovPDHLkV1l9_Fd_f| delta 293 zcmbQhcz|hwNrMq>1fPyk5t`Q}{`DrEP ziAAXljw$&`sS0kHMXBZaMcKs)&cP;Zn=UT^suKmNb1q6vEXmBzQwYh-O=U1N(6i7p zG_+9q90OD^)6>N(WU%St?v=X$DoDc{6}wnP~|V; zt(|ax2{TV()qD0msw{gr8S|YE%ogzQIS{up-0<7BGd#x3Ga47Woo`yDKA}_RfTs2Y z6}E(_q9bP0l+XkKtO09i diff --git a/rep2/img/gp5-info.png b/rep2/img/gp5-info.png index a4e5253596e50b3a8bb0ae0b00bfffcec9e1c258..8fe68102d7f011aa4732ec111f42d6790aa1751a 100644 GIT binary patch delta 384 zcmV-`0e}AR1DXSnBYy#5Nkl*| zklq0@z!fk6*aQRJzX0|k5k|$Jr@OAZ%}5JD>tYdkc&1+je1G&T@VE*Cz2__m(dGG* zihPnJW1i=tNZgG^0&`xKHbqg4u#_Pr>9jKZ zz`p)N;Vu?5%?*7b;7^Y#VnGlvS^m!u=@t;n2!&zDT-SY)_dM?#0kLiYk*sj>%DrEf zF`8dmjZTyg$%h%Iwy9)4S1WBsO~dbVG7wVRUJ4ZXi@?ZDjy4FfKSQF)=tI^IQM`0338hSaefwW^{L9a%BKPWN%_+ zAVz6&Wp{6KYjYq&Q#1y$)1UwV0ZBzKoZ6bwQ4{RdrZB(|D-RucYz&>`hCfKX4Ie{+1**D;2=6z>P zpce^V!Gb^+Nubr{LryNFDUQy22(-ZG z)KCCPe$={&Z-95;R-aFm>;QFkV0SV1LoGjQ5kQ@e4WGX!Ksbp9mGd2+Ba)LiCkO65 zV|T!{_MiC)sg${bNZkS7MfRaGgZ4u?;4=J3Ruq0OB~Zrkf$-}0nLcDG3-iTX%lRk` z!MvCg{y{nY9ZoFtgJ#+s=fZ3*tU4WYC2ck%i=|@yD`Ab5fHf9R;0sm;cfuuVv}^zX N002ovPDHLkV1h_mzd`^2 From 844c91559a035faf4b39b21e835ac6e5c60c55fb Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 15 Mar 2015 01:20:59 +0900 Subject: [PATCH 061/339] =?UTF-8?q?=E6=9C=AC=E5=AE=B6=E3=81=8B=E3=82=89be?= =?UTF-8?q?=E3=81=AE=E3=83=AD=E3=82=B0=E3=82=A4=E3=83=B3=E9=83=A8=E5=88=86?= =?UTF-8?q?=E3=82=92=E7=A7=BB=E6=A4=8D=E3=81=97=E3=81=9F=20+live=E3=81=AEl?= =?UTF-8?q?ive=5Fpost.php=E3=81=A8post.php=E3=82=92=E5=90=88=E4=BD=93?= =?UTF-8?q?=E3=81=95=E3=81=9B=E3=81=9F=20BE2.0=E3=81=AB=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=E3=81=95=E3=81=9B=E3=81=9F=20http://anago.2ch.net/test/read.cg?= =?UTF-8?q?i/software/1425420543/507=20=E6=97=A2=E5=8F=96=E5=BE=97?= =?UTF-8?q?=E3=82=B9=E3=83=AC=E3=81=A7=E3=82=82=E3=82=B9=E3=83=AC=E4=B8=80?= =?UTF-8?q?=E8=A6=A7=E3=81=AB=E5=85=83=E3=82=B9=E3=83=AC=E3=81=AE=E3=83=AA?= =?UTF-8?q?=E3=83=B3=E3=82=AF=E3=82=92=E8=A1=A8=E7=A4=BA=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F=20http://anago.2c?= =?UTF-8?q?h.net/test/read.cgi/software/1425420543/527=20proxy=E9=80=9A?= =?UTF-8?q?=E3=81=99=E3=81=A8api=E8=AA=8D=E8=A8=BC=E3=81=A7=E3=81=A7?= =?UTF-8?q?=E3=81=8D=E3=81=AA=E3=81=84=E4=BB=B6=E3=82=92=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=20http://anago.2ch.net/test/read.cgi/software/1425420543/493?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- conf/conf_user_def.inc.php | 14 +- lib/P2Util.php | 126 ++++ lib/ThreadRead.php | 9 +- lib/auth2chapi.inc.php | 1 + lib/live/live_post_form.inc.php | 3 +- lib/post_form_options.inc.php | 2 +- lib/sb_print.inc.php | 2 +- rep2/edit_conf_user.php | 11 +- rep2/live_post.php | 1012 ------------------------------- rep2/post.php | 33 +- rep2/setting.php | 8 +- 12 files changed, 186 insertions(+), 1037 deletions(-) delete mode 100755 rep2/live_post.php diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 0695b9592..45cea0766 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150307.1230', // rep2のバージョン + 'p2version' => '150315.0117', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index ca616871f..191767882 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -7,12 +7,18 @@ // {{{ be.2ch.netアカウント -// be.2ch.netの認証コード(パスワードではない) -$conf_user_def['be_2ch_code'] = ""; // ("") +// be.2ch.netの認証パスワード(認証コードは使えなくなりました) +$conf_user_def['be_2ch_password'] = ""; // ("") // be.2ch.netの登録メールアドレス $conf_user_def['be_2ch_mail'] = ""; // ("") +// be.2ch.netのDMDM(手動設定する場合のみ入力) +$conf_user_def['be_2ch_DMDM'] = ""; // ("") + +// be.2ch.netのMDMD(手動設定する場合のみ入力) +$conf_user_def['be_2ch_MDMD'] = ""; // ("") + // }}} // {{{ p2.2ch.netアカウント @@ -59,9 +65,9 @@ // スレッド一覧の自動更新間隔。(分指定。0なら自動更新しない。) $conf_user_def['refresh_time'] = 0; // (0) -// スレッド一覧で未取得スレに対して元スレへのリンク(・)を表示 (する:1, しない:0) +// スレッド一覧で未取得スレに対して元スレへのリンク(・)を表示 (する:1, しない:0, 既取得スレでもする:2) $conf_user_def['sb_show_motothre'] = 1; // (1) -$conf_user_rad['sb_show_motothre'] = array('1' => 'する', '0' => 'しない'); +$conf_user_rad['sb_show_motothre'] = array('1' => 'する', '0' => 'しない', '2' => '既取得スレでも'); // PC閲覧時、スレッド一覧(板表示)で プレビュー>>1 を表示 (する:1, しない:0, ニュース系のみ:2) $conf_user_def['sb_show_one'] = 0; // (0) diff --git a/lib/P2Util.php b/lib/P2Util.php index 4cf6a8370..d74543d0d 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -2097,6 +2097,132 @@ static public function rawurlencodeCallback(array $m) return rawurlencode($m[0]); } + // }}} + // {{{ + /** + * beが使用可能な設定か調べる + * @access public + * @return boolean + */ + function isEnableBe2ch() + { + global $_conf; + + if ( + strlen($_conf['be_2ch_password']) && $_conf['be_2ch_mail'] + || strlen($_conf['be_2ch_DMDM']) && $_conf['be_2ch_MDMD'] + //|| isset($_COOKIE['DMDM']) && isset($_COOKIE['MDMD']) + ) { + return true; + } + return false; + } + + // }}} + // {{{ + /** + * ユーザー設定したアカウントで、be.2ch.netにログインしてDMDM, MDMDを取得する + * (認証コードはurlencodeされたままの状態) + * + * @access public + * @return array|false|null 認証コード配列|認証できなかった|無設定だった + */ + function getBe2chCodeWithUserConf() + { + global $_conf; + + if ($_conf['be_2ch_mail'] && strlen($_conf['be_2ch_password'])) { + $r = P2Util::getBe2chCodeByMailPass($_conf['be_2ch_mail'], $_conf['be_2ch_password']); + if (is_array($r)) { + return $r; + } + return false; + } + return null; + } + + // }}} + // {{{ + /** + * be.2ch.netにログインしてDMDM, MDMDを取得する + * (認証コードはurlencodeされたままの状態) + * + * @access private + * @return array|string 成功|エラーメッセージ + */ + function getBe2chCodeByMailPass($mail, $pass) + { + global $_conf; + + //require_once 'HTTP/Request.php'; + + $params = array('timeout' => $_conf['fsockopen_timeout']); + + if (!empty($GLOBALS['_conf']['proxy_use'])) { + $params['proxy_host'] = $GLOBALS['_conf']['proxy_host']; + $params['proxy_port'] = $GLOBALS['_conf']['proxy_port']; + } + + $req = new HTTP_Request('http://be.2ch.net/index.php', $params); + + $req->setMethod(HTTP_REQUEST_METHOD_POST); + $req->addPostData('mail', $mail); + $req->addPostData('pass', $pass); + $req->addPostData('login', 'ログインする'); + + //var_dump($req); + // If-Modified-Since => gmdate('D, d M Y H:i:s', time()) . ' GMT'; + + /* + if ($headers) { + foreach ($headers as $k => $v) { + $req->addHeader($k, $v); + } + } + */ + $response = $req->sendRequest(); // $saveBody = true +//var_dump($req->getResponseHeader()); +//var_dump($req->getResponseCookies()); +//var_dump($req->getResponseCode()); +//var_dump(mb_convert_encoding($req->getResponseBody(), 'SJIS-win', 'eucJP-win')); + + if (PEAR::isError($response)) { + $error_msg = $response->getMessage(); + + } else { + $code = $req->getResponseCode(); + // 成功とみなすコード + if ($code == 302) { + //return $req->getResponseBody(); + if ($cookies = $req->getResponseCookies()) { // urlencodeされた状態 + $r = array(); + foreach ($cookies as $cookie) { + if (in_array($cookie['name'], array('DMDM', 'MDMD'))) { + $r[$cookie['name']] = $cookie['value']; + } + } + if (!empty($r['DMDM']) && !empty($r['MDMD'])) { + return $r; + } + } + + //$error_msg = mb_convert_encoding($req->getResponseBody(), 'SJIS-win', 'eucJP-win'); + + /* + // 更新がなければnullを返す + } elseif ($code == 304) { + // 304の時は、$req->getResponseBody() は空文字""となる + return null; + */ + } else { + //var_dump($req->getResponseHeader()); + $error_msg = $code; + } + } + + return false; // $error_msg + } + // }}} // {{{ debug() /* diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index e9a741d12..dbdff8349 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -207,7 +207,7 @@ protected function _downloadDat2chAPI($sid,$from_bytes) 'appkey' => $AppKey, ); - $http = array( + $options['http'] = array( 'method' => 'POST', 'header' => $headers, 'ignore_errors'=> true, @@ -216,12 +216,11 @@ protected function _downloadDat2chAPI($sid,$from_bytes) // プロキシ if ($_conf['proxy_use']) { - $http += array('proxy' => 'tcp://'.$_conf['proxy_host'].":".$_conf['proxy_port']); - $http += array('request_fulluri' => true); + $options['http'] += array('proxy' => 'tcp://'.$_conf['proxy_host'].":".$_conf['proxy_port']); + $options['http'] += array('request_fulluri' => true); + $options['ssl'] = array('SNI_enabled' => false); } - $options = array('http' => $http); - // WEBサーバへ接続 $fp = @fopen($url, 'r', false, stream_context_create($options)); if (!$fp) { diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index 8739ff377..32390cf1c 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -55,6 +55,7 @@ function authenticate_2chapi() if ($_conf['proxy_use']) { $options['http'] += array('proxy' => 'tcp://'.$_conf['proxy_host'].":".$_conf['proxy_port']); $options['http'] += array('request_fulluri' => true); + $options['ssl'] = array('SNI_enabled' => false); } $response = ''; diff --git a/lib/live/live_post_form.inc.php b/lib/live/live_post_form.inc.php index 81b762e1d..5d9b579e2 100755 --- a/lib/live/live_post_form.inc.php +++ b/lib/live/live_post_form.inc.php @@ -118,7 +118,7 @@ $htm['post_form'] = << -
        +  {$ttitle_pfi}  {$htm['maru_post']} @@ -156,6 +156,7 @@ + {$newthread_hidden_ht}{$readnew_hidden_ht} {$_conf['detect_hint_input_ht']}
        diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index b8b66e76f..1ee73342f 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -174,7 +174,7 @@ function setHiddenValue(button) { } // Be -if (P2Util::isHost2chs($host) and $_conf['be_2ch_code'] && $_conf['be_2ch_mail']) { +if (P2Util::isHost2chs($host) and P2Util::isEnableBe2ch()) { $htm['beres'] = '' . ''; } diff --git a/lib/sb_print.inc.php b/lib/sb_print.inc.php index c6f93b4d2..137a06bd0 100644 --- a/lib/sb_print.inc.php +++ b/lib/sb_print.inc.php @@ -347,7 +347,7 @@ function sb_print($aThreadList) // 元スレ $moto_thre_ht = ''; if ($_conf['sb_show_motothre']) { - if (!$aThread->isKitoku()) { + if ($_conf['sb_show_motothre'] == 2 || !$aThread->isKitoku()) { $moto_thre_ht = ''; diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index 48a4e6d64..4b7512d1b 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -227,8 +227,12 @@ $keep_old = true; } else { $conflist = array( - array('be_2ch_code', 'be.2ch.netの認証コード(パスワードではない)', P2_EDIT_CONF_USER_LONGTEXT), + 'be', array('be_2ch_mail', 'be.2ch.netの登録メールアドレス', P2_EDIT_CONF_USER_LONGTEXT), + array('be_2ch_password', 'be.2ch.netのパスワード(認証コードは使えなくなりました)', P2_EDIT_CONF_USER_LONGTEXT), + array('be_2ch_DMDM', 'be.2ch.netのDMDM(手動設定する場合のみ入力)', P2_EDIT_CONF_USER_LONGTEXT), + array('be_2ch_MDMD', 'be.2ch.netのMDMD(手動設定する場合のみ入力)', P2_EDIT_CONF_USER_LONGTEXT), + '公式p2', array('p2_2ch_host', '公式p2 (p2.2ch.net) で割り当てられているサーバー', P2_EDIT_CONF_USER_LONGTEXT), array('p2_2ch_mail', '公式p2の登録メールアドレス', P2_EDIT_CONF_USER_LONGTEXT), array('p2_2ch_pass', '公式p2のログインパスワード', P2_EDIT_CONF_USER_LONGTEXT | P2_EDIT_CONF_USER_PASSWORD), @@ -374,10 +378,9 @@ array('2chapi_use','2ch API を使用する'), array('2chapi_rounin','2ch API 認証時に●(浪人)IDを送信する(人柱機能)'), array('2chapi_interval','2ch API 認証する間隔(単位:時間)'), - //'API キー', 'API認証情報(全て必須)', - array('2chapi_appkey','AppKey'), - array('2chapi_hmkey','HMkey'), + array('2chapi_appkey','AppKey', P2_EDIT_CONF_USER_LONGTEXT), + array('2chapi_hmkey','HMkey', P2_EDIT_CONF_USER_LONGTEXT), array('2chapi_appname','AppName APIに送信するアプリケーション名 例:Hoge/1.00'), 'デバッグ用', array('2chapi_debug_print','デバッグ用の情報を出力する'), diff --git a/rep2/live_post.php b/rep2/live_post.php deleted file mode 100755 index a12aa8947..000000000 --- a/rep2/live_post.php +++ /dev/null @@ -1,1012 +0,0 @@ -authorize(); // ユーザ認証 - -if (!empty($_conf['disable_res'])) { - p2die('書き込み機能は無効です。'); -} - -// 引数エラー -if (empty($_POST['host'])) { - p2die('引数の指定が変です'); -} - -$el = error_reporting(E_ALL & ~E_NOTICE); -$salt = 'post' . $_POST['host'] . $_POST['bbs'] . $_POST['key']; -error_reporting($el); - -if (!isset($_POST['csrfid']) or $_POST['csrfid'] != P2Util::getCsrfId($salt)) { - p2die('不正なポストです'); -} - -if ($_conf['expack.aas.enabled'] && !empty($_POST['PREVIEW_AAS'])) { - include P2_BASE_DIR . '/aas.php'; - exit; -} - -//================================================================ -// 変数 -//================================================================ -$newtime = date('gis'); - -$post_param_keys = array('bbs', 'key', 'time', 'FROM', 'mail', 'MESSAGE', 'subject', 'submit'); -$post_internal_keys = array('host', 'sub', 'popup', 'rescount', 'ttitle_en'); -$post_optional_keys = array('newthread', 'beres', 'p2res', 'from_read_new', 'maru', 'csrfid'); -$post_p2_flag_keys = array('b', 'p2_post_confirm_cookie'); - -foreach ($post_param_keys as $pk) { - ${$pk} = (isset($_POST[$pk])) ? $_POST[$pk] : ''; -} -foreach ($post_internal_keys as $pk) { - ${$pk} = (isset($_POST[$pk])) ? $_POST[$pk] : ''; -} - -if (!isset($ttitle)) { - if ($ttitle_en) { - $ttitle = UrlSafeBase64::decode($ttitle_en); - } elseif ($subject) { - $ttitle = $subject; - } else { - $ttitle = ''; - } -} - -//$MESSAGE = rtrim($MESSAGE); - -// {{{ ソースコードがきれいに再現されるように変換 - -if (!empty($_POST['fix_source'])) { - // タブをスペースに - $MESSAGE = tab2space($MESSAGE); - // 特殊文字を実体参照に - $MESSAGE = p2h($MESSAGE); - // 自動URLリンク回避 - $MESSAGE = str_replace('tp://', 'tp://', $MESSAGE); - // 行頭のスペースを実体参照に - $MESSAGE = preg_replace('/^ /m', ' ', $MESSAGE); - // 二つ続くスペースの一つ目を実体参照に - $MESSAGE = preg_replace('/(? $v) { - if (!array_key_exists($k, $post) && !in_array($k, $post_ignore_keys)) { - $post[$k] = $v; - } - } -} - -if (!empty($_POST['newthread'])) { - $ptitle = 'rep2 - 新規スレッド作成'; -} else { - $ptitle = 'rep2 - レス書き込み'; -} - -$post_backup_key = PostDataStore::getKeyForBackup($host, $bbs, $key, !empty($_REQUEST['newthread'])); -$post_config_key = PostDataStore::getKeyForConfig($host, $bbs); - -// 設定を保存 -PostDataStore::set($post_config_key, array( - 'beres' => !empty($_REQUEST['beres']), - 'p2res' => !empty($_REQUEST['p2res']), -)); - -//================================================================ -// 書き込み処理 -//================================================================ - -// 書き込みを一時的に保存 -PostDataStore::set($post_backup_key, $post_cache); - -// ポスト実行 -if (!empty($_POST['p2res']) && empty($_POST['newthread'])) { - // 公式p2で書き込み - $posted = postIt2($host, $bbs, $key, $FROM, $mail, $MESSAGE); -} else { - // cookie 読み込み - $cookie_key = $_login->user_u . '/' . P2Util::normalizeHostName(P2Util::isHostBbsPink($host) ? 'www.bbspink.com' : P2Util::isHost2chs($host) ? 'www.2ch.net' : $host); // 忍法帳対応 - if ($p2cookies = CookieDataStore::get($cookie_key)) { - if (is_array($p2cookies)) { - if (array_key_exists('expires', $p2cookies)) { - // 期限切れなら破棄 - if (time() > strtotime($p2cookies['expires'])) { - CookieDataStore::delete($cookie_key); - $p2cookies = null; - } - } - } else { - CookieDataStore::delete($cookie_key); - $p2cookies = null; - } - } else { - $p2cookies = null; - } - - // 直接書き込み - $posted = postIt($host, $bbs, $key, $post); - - // cookie 保存 - if ($p2cookies) { - CookieDataStore::set($cookie_key, $p2cookies); - } -} - -// 投稿失敗記録を削除 -if ($posted) { - PostDataStore::delete($post_backup_key); -} - -//============================================= -// スレ立て成功なら、subjectからkeyを取得 -//============================================= -if (!empty($_POST['newthread']) && $posted) { - sleep(1); - $key = getKeyInSubject(); -} - -//============================================= -// key.idx 保存 -//============================================= -// <> を外す。。 -$tag_rec['FROM'] = str_replace('<>', '', $FROM); -$tag_rec['mail'] = str_replace('<>', '', $mail); - -// 名前とメール、空白時は P2NULL を記録 -$tag_rec_n['FROM'] = ($tag_rec['FROM'] == '') ? 'P2NULL' : $tag_rec['FROM']; -$tag_rec_n['mail'] = ($tag_rec['mail'] == '') ? 'P2NULL' : $tag_rec['mail']; - -if ($host && $bbs && $key) { - $keyidx = P2Util::idxDirOfHostBbs($host, $bbs) . $key . '.idx'; - - // 読み込み - if ($keylines = FileCtl::file_read_lines($keyidx, FILE_IGNORE_NEW_LINES)) { - $akeyline = explode('<>', $keylines[0]); - } - $sar = array($akeyline[0], $akeyline[1], $akeyline[2], $akeyline[3], $akeyline[4], - $akeyline[5], $akeyline[6], $tag_rec_n['FROM'], $tag_rec_n['mail'], $akeyline[9], - $akeyline[10], $akeyline[11], $akeyline[12]); - P2Util::recKeyIdx($keyidx, $sar); // key.idxに記録 -} - -//============================================= -// 書き込み履歴 -//============================================= -if (empty($posted)) { - exit; -} - -if ($host && $bbs && $key) { - - $lock = new P2Lock($_conf['res_hist_idx'], false); - - FileCtl::make_datafile($_conf['res_hist_idx']); // なければ生成 - - $lines = FileCtl::file_read_lines($_conf['res_hist_idx'], FILE_IGNORE_NEW_LINES); - - $neolines = array(); - - // {{{ 最初に重複要素を削除しておく - - if (is_array($lines)) { - foreach ($lines as $line) { - $lar = explode('<>', $line); - // 重複回避, keyのないものは不正データ - if (!$lar[1] || $lar[1] == $key) { - continue; - } - $neolines[] = $line; - } - } - - // }}} - - // 新規データ追加 - $newdata = "{$ttitle}<>{$key}<><><><><><>{$tag_rec['FROM']}<>{$tag_rec['mail']}<><>{$host}<>{$bbs}"; - array_unshift($neolines, $newdata); - while (sizeof($neolines) > $_conf['res_hist_rec_num']) { - array_pop($neolines); - } - - // {{{ 書き込む - - if ($neolines) { - $cont = ''; - foreach ($neolines as $l) { - $cont .= $l . "\n"; - } - - if (FileCtl::file_write_contents($_conf['res_hist_idx'], $cont) === false) { - p2die('cannot write file.'); - } - } - - // }}} - - $lock->free(); -} - -//============================================= -// 書き込みログ記録 -//============================================= -if ($_conf['res_write_rec']) { - - // データPHP形式(p2_res_hist.dat.php, タブ区切り)の書き込み履歴を、dat形式(p2_res_hist.dat, <>区切り)に変換する - P2Util::transResHistLogPhpToDat(); - - $date_and_id = date('y/m/d H:i'); - $message = htmlspecialchars($MESSAGE, ENT_NOQUOTES, 'Shift_JIS'); - $message = preg_replace('/\\r\\n|\\r|\\n/', '
        ', $message); - - FileCtl::make_datafile($_conf['res_hist_dat']); // なければ生成 - - $resnum = ''; - if (!empty($_POST['newthread'])) { - $resnum = 1; - } else { - if ($rescount) { - $resnum = $rescount + 1; - } - } - - // 新規データ - $newdata = "{$tag_rec['FROM']}<>{$tag_rec['mail']}<>{$date_and_id}<>{$message}<>{$ttitle}<>{$host}<>{$bbs}<>{$key}<>{$resnum}"; - - // まずタブを全て外して(2chの書き込みではタブは削除される 2004/12/13) - $newdata = str_replace("\t", '', $newdata); - // <>をタブに変換して - //$newdata = str_replace('<>', "\t", $newdata); - - $cont = $newdata."\n"; - - // 書き込み処理 - if (FileCtl::file_write_contents($_conf['res_hist_dat'], $cont, FILE_APPEND) === false) { - trigger_error('rep2 error: 書き込みログの保存に失敗しました', E_USER_WARNING); - // これは実際は表示されないけれども - //P2Util::pushInfoHtml('

        rep2 error: 書き込みログの保存に失敗しました

        '); - } -} - -//=========================================================== -// 関数 -//=========================================================== -// {{{ postIt() - -/** - * レスを書き込む - * - * @return boolean 書き込み成功なら true、失敗なら false - */ -function postIt($host, $bbs, $key, $post) -{ - global $_conf, $post_result, $post_error2ch, $p2cookies, $host, $bbs, $key, $popup, $rescount, $ttitle_en; - global $bbs_cgi; - - $method = 'POST'; - $bbs_cgi_url = 'http://' . $host . $bbs_cgi; - - $URL = parse_url($bbs_cgi_url); // URL分解 - if (isset($URL['query'])) { // クエリー - $URL['query'] = '?' . $URL['query']; - } else { - $URL['query'] = ''; - } - - // プロキシ - if ($_conf['proxy_use']) { - $send_host = $_conf['proxy_host']; - $send_port = $_conf['proxy_port']; - $send_path = $bbs_cgi_url; - } else { - $send_host = $URL['host']; - $send_port = isset($URL['port']) ? $URL['port'] : 80; - $send_path = $URL['path'] . $URL['query']; - } - - if (!$send_port) { $send_port = 80; } // デフォルトを80 - - $request = "{$method} {$send_path} HTTP/1.0\r\n"; - $request .= "Host: {$URL['host']}\r\n"; - - // APIを使用する設定で相手が2chだったらAPIのUAを送る - if(P2Util::isHost2chs($URL['host']) && $_conf['2chapi_use'] == 1) { - if($_conf['2chapi_appname'] != "") { - $request .= "User-Agent: Monazilla/1.00 ({$_conf['2chapi_appname']})\r\n"; - } else { - showPostMsg(false, "p2 Error: 2chと通信するために必要な情報が設定されていません。

        ", false); - return false; - } - } else { - $request .= "User-Agent: Monazilla/1.00 ({$_conf['p2ua']})\r\n"; - } - - $request .= "Referer: http://{$host}/{$bbs}/{$key}/\r\n"; - - // クッキー - $cookies_to_send = ''; - if ($p2cookies) { - foreach ($p2cookies as $cname => $cvalue) { - if ($cname != 'expires') { - $cookies_to_send .= " {$cname}={$cvalue};"; - } - } - } - - // be.2ch.net 認証クッキー - if (P2Util::isHostBe2chNet($host) || !empty($_REQUEST['beres'])) { - $cookies_to_send .= ' MDMD='.$_conf['be_2ch_code'].';'; // be.2ch.netの認証コード(パスワードではない) - $cookies_to_send .= ' DMDM='.$_conf['be_2ch_mail'].';'; // be.2ch.netの登録メールアドレス - } - - if (!$cookies_to_send) { $cookies_to_send = ' ;'; } - $request .= 'Cookie:'.$cookies_to_send."\r\n"; - //$request .= 'Cookie: PON='.$SPID.'; NAME='.$FROM.'; MAIL='.$mail."\r\n"; - - $request .= "Connection: Close\r\n"; - - // {{{ POSTの時はヘッダを追加して末尾にURLエンコードしたデータを添付 - - if (strcasecmp($method, 'POST') == 0) { - $post_enc = array(); - while (list($name, $value) = each($post)) { - - // したらば or be.2ch.netなら、EUCに変換 - if (P2Util::isHostJbbsShitaraba($host) || P2Util::isHostBe2chNet($host)) { - $value = mb_convert_encoding($value, 'CP51932', 'CP932'); - } - - $post_enc[] = $name . '=' . rawurlencode($value); - } - $postdata = implode("&", $post_enc); - $request .= "Content-Type: application/x-www-form-urlencoded\r\n"; - $request .= "Content-Length: ".strlen($postdata)."\r\n"; - $request .= "\r\n"; - $request .= $postdata; - - } else { - $request .= "\r\n"; - } - // }}} - - // WEBサーバへ接続 - $fp = fsockopen($send_host, $send_port, $errno, $errstr, $_conf['http_conn_timeout']); - if (!$fp) { - $errstr = p2h($errstr); - showPostMsg(false, "サーバ接続エラー: $errstr ($errno)
        p2 Error: 板サーバへの接続に失敗しました", false); - return false; - } - stream_set_timeout($fp, $_conf['http_read_timeout'], 0); - - //echo '

        $request

        ' . $request . "

        "; //for debug - fputs($fp, $request); - - $start_here = false; - $post_seikou = false; - - while (!p2_stream_eof($fp, $timed_out)) { - - if ($start_here) { - $wr = ''; - while (!p2_stream_eof($fp, $timed_out)) { - $wr .= fread($fp, 164000); - } - $response = $wr; - break; - - } else { - $l = fgets($fp, 164000); - //echo $l .'
        '; // for debug - // クッキーキタ - if (preg_match('/Set-Cookie: (.+?)\\r\\n/', $l, $matches)) { - //echo '

        ' . $matches[0] . '

        '; // - $cgroups = explode(';', $matches[1]); - if ($cgroups) { - foreach ($cgroups as $v) { - if (preg_match('/(.+)=(.*)/', $v, $m)) { - $k = ltrim($m[1]); - if ($k != 'path') { - if (!$p2cookies) { - $p2cookies = array(); - } - $p2cookies[$k] = $m[2]; - } - } - } - } - if ($p2cookies) { - $cookies_to_send = ''; - foreach ($p2cookies as $cname => $cvalue) { - if ($cname != 'expires') { - $cookies_to_send .= " {$cname}={$cvalue};"; - } - } - $newcookies = "Cookie:{$cookies_to_send}\r\n"; - - $request = preg_replace('/Cookie: .*?\\r\\n/', $newcookies, $request); - } - - // 転送は書き込み成功と判断 - } elseif (preg_match('/^Location: /', $l, $matches)) { - $post_seikou = true; - } - if ($l == "\r\n") { - $start_here = true; - } - } - - } - fclose($fp); - - // be.2ch.net or JBBSしたらば 文字コード変換 EUC→SJIS - if (P2Util::isHostBe2chNet($host) || P2Util::isHostJbbsShitaraba($host)) { - $response = mb_convert_encoding($response, 'CP932', 'CP51932'); - - // - $response = preg_replace( - '{(.*?)(.*)}is', - '$1$2', - $response); - } - - $kakikonda_match = '{.*(?:書きこみました|■ 書き込みました ■|書き込み終了 - SubAll BBS).*}is'; - $cookie_kakunin_match = '{|■ 書き込み確認 ■|>書き込み確認。<}'; - - if (preg_match('/<.+>/s', $response, $matches)) { - $response = $matches[0]; - } - - // カキコミ成功 - if ($post_seikou || preg_match($kakikonda_match, $response)) { - $reload = empty($_POST['from_read_new']); - showPostMsg(true, '書きこみが終わりました。', $reload); - - // +Wiki sambaタイマー - if ($_conf['wiki.samba_timer']) { - require_once P2_LIB_DIR . '/wiki/Samba.php'; - $samba = new Samba(); - $samba->setWriteTime($host, $bbs); - $samba->save(); - } - - return true; - //$response_ht = p2h($response); - //echo "
        {$response_ht}
        "; - - // cookie確認(post再チャレンジ) - } elseif (preg_match($cookie_kakunin_match, $response)) { - showCookieConfirmation($host, $response); - return false; - - // その他はレスポンスをそのまま表示 - } else { - echo preg_replace('@こちらでリロードしてください。 GO!
        @', '', $response); - return false; - } -} - -// }}} -// {{{ postIt2() - -/** - * 公式p2でレスを書き込む - * - * @return boolean 書き込み成功なら true、失敗なら false - */ -function postIt2($host, $bbs, $key, $FROM, $mail, $MESSAGE) -{ - if (P2Util::isHostBe2chNet($host) || !empty($_REQUEST['beres'])) { - $beRes = true; - } else { - $beRes = false; - } - - try { - $posted = P2Util::getP2Client()->post($host, $bbs, $key, - $FROM, $mail, $MESSAGE, - $beRes, $response); - } catch (P2Exception $e) { - p2die('公式p2ポスト失敗', $e->getMessage()); - } - - if ($posted) { - $reload = empty($_POST['from_read_new']); - showPostMsg(true, '書きこみが終わりました。', $reload); - } else { - $result_msg = '公式p2ポスト失敗

        ' - . '
        ' . p2h($response['body']) . '
        ' - . '

        -'; - showPostMsg(false, $result_msg, false); - } - - return $posted; -} - -// }}} -// {{{ showPostMsg() - -/** - * 書き込み処理結果表示する - * - * @return void - */ -function showPostMsg($isDone, $result_msg, $reload) -{ - global $_conf, $location_ht, $popup, $ttitle, $ptitle; - global $STYLE, $skin_en; - - // プリント用変数 =============== - if (!$_conf['ktai']) { - $class_ttitle = ' class="thre_title"'; - } else { - $class_ttitle = ''; - } - $ttitle_ht = "{$ttitle}"; - - $popup_ht = ''; - if ($isDone) { - // 2005/03/01 aki: jigブラウザに対応するため、& ではなく & で - // 2005/04/25 rsk: -EOJS; - } else { - $_conf['extra_headers_ht'] .= << -EOP; - } - } - - // プリント ============== - echo $_conf['doctype']; - echo << - - - - - - {$_conf['extra_headers_ht']} -EOHEADER; - - if ($isDone) { - echo " rep2 - 書きこみました。"; - } else { - echo " {$ptitle}"; - } - - if (!$_conf['ktai']) { - echo << - - \n -EOP; - if ($popup) { - echo << - // - -EOSCRIPT; - } - if ($reload) { - echo $popup_ht; - } - $kakunin_ht = ''; - } else { - $kakunin_ht = <<確認

        -EOP; - } - - echo "\n"; - echo "\n"; - - P2Util::printInfoHtml(); - - echo <<{$ttitle_ht}

        -

        {$result_msg}

        -{$kakunin_ht} - - -EOP; -} - -// }}} -// {{{ showCookieConfirmation() - -/** - * Cookie確認HTMLを表示する - * - * @param string $host ホスト名 - * @param string $response レスポンスボディ - * @return void - */ -function showCookieConfirmation($host, $response) -{ - global $_conf, $post_param_keys, $post_send_keys, $post_optional_keys; - global $popup, $rescount, $ttitle_en; - global $STYLE, $skin_en; - - // HTMLをDOMで解析 - $doc = P2Util::getHtmlDom($response, 'Shift_JIS', false); - if (!$doc) { - showUnexpectedResponse($response, __LINE__); - return; - } - - $xpath = new DOMXPath($doc); - $heads = $doc->getElementsByTagName('head'); - $bodies = $doc->getElementsByTagName('body'); - if ($heads->length != 1 || $bodies->length != 1) { - showUnexpectedResponse($response, __LINE__); - return; - } - - $head = $heads->item(0); - $body = $bodies->item(0); - $xpath = new DOMXPath($doc); - - // フォームを探索 - $forms = $xpath->query(".//form[(@method = 'POST' or @method = 'post') - and (starts-with(@action, '../test/bbs.cgi') or starts-with(@action, '../test/subbbs.cgi'))]", $body); - if ($forms->length != 1) { - showUnexpectedResponse($response, __LINE__); - return; - } - $form = $forms->item(0); - - if (!preg_match('{^\\.\\./test/(sub)?bbs\\.cgi(?:\\?guid=ON)?$}', $form->getAttribute('action'), $matches)) { - showUnexpectedResponse($response, __LINE__); - return; - } - - if (array_key_exists(1, $matches) && strlen($matches[1])) { - $subbbs = $matches[1]; - } else { - $subbbs = false; - } - - // form要素の属性値を書き換える - // method属性とaction属性以外の属性は削除し、accept-charset属性を追加する - // DOMNamedNodeMapのイテレーションと、それに含まれるノードの削除は別に行う - $rmattrs = array(); - foreach ($form->attributes as $name => $node) { - switch ($name) { - case 'method': - //$node->value = 'POST'; - break; - case 'action': - $node->value = './live_post.php'; - break; - default: - $rmattrs[] = $name; - } - } - foreach ($rmattrs as $name) { - $form->removeAttribute($name); - } - $form->setAttribute('accept-charset', $_conf['accept_charset']); - - // POSTする値を再設定 - foreach (array_combine($post_send_keys, $post_param_keys) as $key => $name) { - if (array_key_exists($name, $_POST)) { - $nodes = $xpath->query("./input[@type = 'hidden' and @name = '{$key}']"); - if ($nodes->length) { - $elem = $nodes->item(0); - if ($key != $name) { - $elem->setAttribute('name', $name); - } - $elem->setAttribute('value', mb_convert_encoding($_POST[$name], 'UTF-8', 'CP932')); - } - } - } - - // 各種隠しパラメータを追加 - $hidden = $doc->createElement('input'); - $hidden->setAttribute('type', 'hidden'); - - // rep2が使用する変数その1 - foreach (array('host', 'popup', 'rescount', 'ttitle_en') as $name) { - $elem = $hidden->cloneNode(); - $elem->setAttribute('name', $name); - $elem->setAttribute('value', $$name); - $form->appendChild($elem); - } - - // rep2が使用する変数その2 - foreach ($post_optional_keys as $name) { - if (array_key_exists($name, $_POST)) { - $elem = $hidden->cloneNode(); - $elem->setAttribute('name', $name); - $elem->setAttribute('value', mb_convert_encoding($_POST[$name], 'UTF-8', 'CP932')); - $form->appendChild($elem); - } - } - - // POST先がsubbbs.cgi - if ($subbbs !== false) { - $elem = $hidden->cloneNode(); - $elem->setAttribute('name', 'sub'); - $elem->setAttribute('value', $subbbs); - $form->appendChild($elem); - } - - // ソースコード補正 - if (!empty($_POST['fix_source'])) { - $elem = $hidden->cloneNode(); - $elem->setAttribute('name', 'fix_source'); - $elem->setAttribute('value', '1'); - $form->appendChild($elem); - } - - // 強制ビュー指定 - if ($_conf['b'] != $_conf['client_type']) { - $elem = $hidden->cloneNode(); - $elem->setAttribute('name', 'b'); - $elem->setAttribute('value', $_conf['b']); - $form->appendChild($elem); - } - - // Cookie確認フラグ - $elem = $hidden->cloneNode(); - $elem->setAttribute('name', 'p2_post_confirm_cookie'); - $elem->setAttribute('value', '1'); - $form->appendChild($elem); - - // エンコーディング判定のヒント - $hidden->setAttribute('name', '_hint'); - $hidden->setAttribute('value', mb_convert_encoding($_conf['detect_hint'], 'UTF-8', 'CP932')); - $form->insertBefore($hidden, $form->firstChild); - - // ヘッダに要素を追加 - if (!$_conf['ktai']) { - $skin_q = str_replace('&', '&', $skin_en); - $link = $doc->createElement('link'); - $link->setAttribute('rel', 'stylesheet'); - $link->setAttribute('type', 'text/css'); - $link->setAttribute('href', "css.php?css=style&skin={$skin_q}"); - $link = $head->appendChild($link)->cloneNode(); - $link->setAttribute('href', "css.php?css=post&skin={$skin_q}"); - $head->appendChild($link); - - if ($popup) { - $mado_okisa = explode(',', $STYLE['post_pop_size']); - $script = $doc->createElement('script'); - $script->setAttribute('type', 'text/javascript'); - $head->appendChild($script)->appendChild($doc->createCDATASection( - sprintf('resizeTo(%d,%d);', $mado_okisa[0], $mado_okisa[1] + 200) - )); - } - } - - // 構文修正 - // li要素を直接の子要素として含まないul要素をblockquote要素で置換 - // DOMNodeListのイテレーションと、それに含まれるノードの削除は別に行う - $nodes = array(); - foreach ($xpath->query('.//ul[count(./li)=0]', $body) as $node) { - $nodes[] = $node; - } - foreach ($nodes as $node) { - $children = array(); - foreach ($node->childNodes as $child) { - $children[] = $child; - } - $elem = $doc->createElement('blockquote'); - foreach ($children as $child) { - $elem->appendChild($node->removeChild($child)); - } - $node->parentNode->replaceChild($elem, $node); - } - - // libxml2内部の文字列エンコーディングはUTF-8であるが、saveHTML()等の - // メソッドでは読み込んだ文書のエンコーディングに再変換して出力される - // (DOMDocumentのencodingプロパティを変更することで変られる) - echo $doc->saveHTML(); -} - -// }}} -// {{{ showUnexpectedResponse() - -/** - * サーバから予期しないレスポンスが返ってきた旨を表示する - * - * @param string $response レスポンスボディ - * @param int $line 行番号 - * @return void - */ -function showUnexpectedResponse($response, $line = null) -{ - echo 'p2 ERROR'; - echo '

        p2 ERROR

        サーバからのレスポンスが変です。'; - if (is_numeric($line)) { - echo "({$line})"; - } - echo '

        ';
        -    echo p2h($response);
        -    echo '
        '; -} - -// }}} -// {{{ getKeyInSubject() - -/** - * subjectからkeyを取得する - * - * @return string|false - */ -function getKeyInSubject() -{ - global $host, $bbs, $ttitle; - - $aSubjectTxt = new SubjectTxt($host, $bbs); - - foreach ($aSubjectTxt->subject_lines as $l) { - if (strpos($l, $ttitle) !== false) { - if (preg_match("/^([0-9]+)\.(dat|cgi)(,|<>)(.+) ?(\(|()([0-9]+)(\)|))/", $l, $matches)) { - return $key = $matches[1]; - } - } - } - - return false; -} - -// }}} -// {{{ tab2space() - -/** - * 整形を維持しながら、タブをスペースに置き換える - * - * @param string $in_str 対象文字列 - * @param int $tabwidth タブ幅 - * @param string $linebreak 改行文字(列) - * @return string - */ -function tab2space($in_str, $tabwidth = 4, $linebreak = "\n") -{ - $out_str = ''; - $lines = preg_split('/\\r\\n|\\r|\\n/', $in_str); - $ln = count($lines); - $i = 0; - - while ($i < $ln) { - $parts = explode("\t", rtrim($lines[$i])); - $pn = count($parts); - - for ($j = 0; $j < $pn; $j++) { - if ($j == 0) { - $l = $parts[$j]; - } else { - //$t = $tabwidth - (strlen($l) % $tabwidth); - $sn = $tabwidth - (mb_strwidth($l) % $tabwidth); // UTF-8でも全角文字幅を2とカウントする - for ($k = 0; $k < $sn; $k++) { - $l .= ' '; - } - $l .= $parts[$j]; - } - } - - $out_str .= $l; - if (++$i < $ln) { - $out_str .= $linebreak; - } - } - - return $out_str; -} - -// }}} - -/* - * Local Variables: - * mode: php - * coding: cp932 - * tab-width: 4 - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End: - */ -// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/rep2/post.php b/rep2/post.php index 83c76b6b5..d07f7a907 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -123,7 +123,13 @@ $location_ht = "{$_conf['subject_php']}?host={$host}&bbs={$bbs}{$_conf['k_at_a']}"; } else { unset($post[$subject_k]); - $location_ht = "{$_conf['read_php']}?host={$host}&bbs={$bbs}&key={$key}&ls={$rescount}-&refresh=1&nt={$newtime}{$_conf['k_at_a']}"; + if (empty($_POST['live'])) { + $location_ht = "{$_conf['read_php']}?host={$host}&bbs={$bbs}&key={$key}&ls={$rescount}-&refresh=1&nt={$newtime}{$_conf['k_at_a']}"; + } else { + $ttitle_urlen = rawurlencode($ttitle_en); + $ttitle_en_q = "&ttitle_en=" . $ttitle_urlen; + $location_ht = "live_post_form.php?host={$host}&bbs={$bbs}&key={$key}{$ttitle_en_q}&w_reg=1{$_conf['k_at_a']}"; + } if (!$_conf['iphone']) { $location_ht .= "#r{$rescount}"; } @@ -413,23 +419,36 @@ function postIt($host, $bbs, $key, $post) $request .= "Referer: http://{$host}/{$bbs}/{$key}/\r\n"; // クッキー - $cookies_to_send = ''; + $cookies_to_send = array(); if ($p2cookies) { foreach ($p2cookies as $cname => $cvalue) { if ($cname != 'expires') { - $cookies_to_send .= " {$cname}={$cvalue};"; + $cookies_to_send[$cname] = $cvalue; } } } // be.2ch.net 認証クッキー if (P2Util::isHostBe2chNet($host) || !empty($_REQUEST['beres'])) { - $cookies_to_send .= ' MDMD='.$_conf['be_2ch_code'].';'; // be.2ch.netの認証コード(パスワードではない) - $cookies_to_send .= ' DMDM='.$_conf['be_2ch_mail'].';'; // be.2ch.netの登録メールアドレス + if ($_conf['be_2ch_DMDM'] && $_conf['be_2ch_MDMD']) { + $cookies_to_send['DMDM'] = urlencode(rawurldecode($_conf['be_2ch_DMDM'])); + $cookies_to_send['MDMD'] = urlencode(rawurldecode($_conf['be_2ch_MDMD'])); + } else { + $ar = P2Util::getBe2chCodeWithUserConf(); // urlencodeされたままの状態 + if (is_array($ar)) { + $cookies_to_send['DMDM'] = $ar['DMDM']; + $cookies_to_send['MDMD'] = $ar['MDMD']; + } + } } - if (!$cookies_to_send) { $cookies_to_send = ' ;'; } - $request .= 'Cookie:'.$cookies_to_send."\r\n"; + if ($cookies_to_send) { + $cstrs = array(); + foreach ($cookies_to_send as $k => $v) { + $cstrs[] = "$k=$v"; + } + $request .= 'Cookie: ' . implode('; ', $cstrs) . "\r\n"; + } //$request .= 'Cookie: PON='.$SPID.'; NAME='.$FROM.'; MAIL='.$mail."\r\n"; $request .= "Connection: Close\r\n"; diff --git a/rep2/setting.php b/rep2/setting.php index e4b86d094..b9943452b 100644 --- a/rep2/setting.php +++ b/rep2/setting.php @@ -90,9 +90,15 @@ EOP; +} +echo '
      '; + if ($_conf['ktai']) { echo '
      '; From dfc1bcb377d97e3eb3f4384e0add3be030851211 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 16 Mar 2015 10:40:20 +0900 Subject: [PATCH 062/339] =?UTF-8?q?>>1=E3=82=92=E3=83=97=E3=83=AC=E3=83=93?= =?UTF-8?q?=E3=83=A5=E3=83=BC=E3=81=99=E3=82=8B=E6=A9=9F=E8=83=BD=E3=81=A7?= =?UTF-8?q?API=E3=82=92=E4=BD=BF=E7=94=A8=E3=81=97=E3=81=A6=E3=81=84?= =?UTF-8?q?=E3=81=AA=E3=81=8B=E3=81=A3=E3=81=9F=E3=81=AE=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 162 +++++++++++++-------------------------------- rep2/read.php | 5 ++ 2 files changed, 51 insertions(+), 116 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index dbdff8349..2a6bbf5a6 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -161,7 +161,12 @@ protected function _downloadDat2chAPI($sid,$from_bytes) if (!($this->host && $this->bbs && $this->key)) { return false; } - + + //>>1プレビューの時は差分取得しなくて良いので常にtrue(新着無し)を返す + if (is_readable($this->keydat) && !empty($_GET['one'])) { + return true; + } + if ($sid == '') { return false; } @@ -188,7 +193,10 @@ protected function _downloadDat2chAPI($sid,$from_bytes) $purl = parse_url($url); // URL分解 - if (!$zero_read) { + if(!empty($_GET['one'])) { + //>>1プレビューの時はサーバーに最初の部分だけ請求 + $headers .= "Range: bytes=0-8192\r\n"; + } elseif (!$zero_read) { $headers .= "Range: bytes={$from_bytes}-\r\n"; } @@ -241,7 +249,16 @@ protected function _downloadDat2chAPI($sid,$from_bytes) if ($code == '200' || $code == '206') { while (!p2_stream_eof($fp, $timed_out)) { - $body .= fread($fp, 4096); + //>>1をプレビューする用 + if (!empty($_GET['one'])) { + $line = fgets($fp, 32800); //改行単位で読込み + if (strstr($line, "\n")) {//改行が有れば保存; + $body .= $line; + } + unset($line); + } else { + $body .= fread($fp, 4096); //通常取得はあぼーん判定を行うためこっちで保存する + } } if ($timed_out) { @@ -418,6 +435,11 @@ protected function _downloadDat2ch($from_bytes) return false; } + //>>1プレビューの時は差分取得しなくて良いので常にtrue(新着無し)を返す + if (is_readable($this->keydat) && !empty($_GET['one'])) { + return true; + } + $from_bytes = intval($from_bytes); if ($from_bytes == 0) { @@ -461,9 +483,14 @@ protected function _downloadDat2ch($from_bytes) //$request .= "Accept-Encoding: gzip, deflate\r\n"; $request .= "Accept-Language: ja, en\r\n"; $request .= "User-Agent: Monazilla/1.00 ({$_conf['p2ua']})\r\n"; - if (!$zero_read) { + + if(!empty($_GET['one'])) { + //>>1プレビューの時はサーバーに最初の部分だけ請求 + $headers .= "Range: bytes=0-8192\r\n"; + } elseif (!$zero_read) { $request .= "Range: bytes={$from_bytes}-\r\n"; } + $request .= "Referer: http://{$purl['host']}/{$this->bbs}/\r\n"; if ($this->modified) { @@ -501,7 +528,16 @@ protected function _downloadDat2ch($from_bytes) if ($code == '200' || $code == '206') { while (!p2_stream_eof($fp, $timed_out)) { - $body .= fread($fp, 4096); + //>>1をプレビューする用 + if (!empty($_GET['one'])) { + $line = fgets($fp, 32800); //改行単位で読込み + if (strstr($line, "\n")) {//改行が有れば保存; + $body .= $line; + } + unset($line); + } else { + $body .= fread($fp, 4096); //通常取得はあぼーん判定を行うためこっちで保存する + } } if ($timed_out) { @@ -1198,6 +1234,9 @@ public function previewOne() if (!($this->host && $this->bbs && $this->key)) { return false; } + //通常と同じようにDATの取得を試みる。$_GET['one']がセットされていれば2ch互換は>>1だけ落とす + $this->downloadDat(); + // ローカルdatから取得 if (is_readable($this->keydat)) { $fd = fopen($this->keydat, 'rb'); @@ -1220,114 +1259,8 @@ public function previewOne() $this->setTtitle($d[4]); } - // ローカルdatなければオンラインから - if (!$first_line) { - - $method = 'GET'; - $url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; - - $purl = parse_url($url); // URL分解 - if (isset($purl['query'])) { // クエリー - $purl['query'] = '?' . $purl['query']; - } else { - $purl['query'] = ''; - } - - // プロキシ - if ($_conf['proxy_use']) { - $send_host = $_conf['proxy_host']; - $send_port = $_conf['proxy_port']; - $send_path = $url; - } else { - $send_host = $purl['host']; - $send_port = $purl['port']; - $send_path = $purl['path'] . $purl['query']; - } - - if (!$send_port) {$send_port = 80;} // デフォルトを80 - - $request = "{$method} {$send_path} HTTP/1.0\r\n"; - $request .= "Host: {$purl['host']}\r\n"; - $request .= "User-Agent: Monazilla/1.00 ({$_conf['p2ua']})\r\n"; - // $request .= "Range: bytes={$from_bytes}-\r\n"; - - // Basic認証用のヘッダ - if (isset($purl['user']) && isset($purl['pass'])) { - $request .= "Authorization: Basic ".base64_encode($purl['user'].":".$purl['pass'])."\r\n"; - } - - $request .= "Connection: Close\r\n"; - $request .= "\r\n"; - - // WEBサーバへ接続 - $fp = @fsockopen($send_host, $send_port, $errno, $errstr, $_conf['http_conn_timeout']); - if (!$fp) { - self::_pushInfoConnectFailed($url, $errno, $errstr); - $this->diedat = true; - return false; - } - stream_set_timeout($fp, $_conf['http_read_timeout'], 0); - - fputs($fp, $request); - - $code = null; - $start_here = false; - - while (!p2_stream_eof($fp, $timed_out)) { - - if ($start_here) { - - if ($code == '200') { - $first_line = fgets($fp, 32800); - break; - } else { - fclose($fp); - return $this->previewOneNotFound($code); - } - } else { - $l = rtrim(fgets($fp, 32800), "\r\n"); - //echo $l."
      ";// for debug - if (preg_match('@^HTTP/1\\.\\d (\\d+) (.+)@i', $l, $matches)) { // ex) HTTP/1.1 304 Not Modified - $code = $matches[1]; - - if ($code == '200') { - ; - } else { - fclose($fp); - return $this->previewOneNotFound($code); - } - - } elseif ($l === '') { - $start_here = true; - } - } - - } - fclose($fp); - - // be.2ch.net ならEUC→SJIS変換 - if (P2Util::isHostBe2chNet($this->host)) { - $first_line = mb_convert_encoding($first_line, 'CP932', 'CP51932'); - } - - $first_datline = rtrim($first_line); - - if (strpos($first_datline, '<>') !== false) { - $datline_sepa = '<>'; - } else { - $datline_sepa = ','; - $this->dat_type = '2ch_old'; - } - $d = explode($datline_sepa, $first_datline); - $this->setTtitle($d[4]); - - $this->onthefly = true; - - } else { - // 便宜上 - if (!$this->readnum) { - $this->readnum = 1; - } + if (!$this->readnum) { + $this->readnum = 1; } if ($_conf['ktai']) { @@ -1338,9 +1271,6 @@ public function previewOne() } $body = ''; - if ($this->onthefly) { - $body .= "
      on the fly
      \n"; - } $body .= "
      \n"; $res = $aShowThread->transRes($first_line, 1); // 1を表示 $body .= is_array($res) ? $res['body'] . $res['q'] : $res; diff --git a/rep2/read.php b/rep2/read.php index 5b28a55f9..1e497f2ba 100644 --- a/rep2/read.php +++ b/rep2/read.php @@ -122,6 +122,11 @@ include READ_HEADER_INC_PHP; echo $preview; + echo <<
      +EOP; include READ_FOOTER_INC_PHP; return; From 2fcdf744030aea30551f5ae8222a9a2abf840270 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 16 Mar 2015 11:28:33 +0900 Subject: [PATCH 063/339] =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E3=81=8B=E3=82=893?= =?UTF-8?q?=E3=83=9A=E3=82=A4=E3=83=B3=E8=A1=A8=E7=A4=BA=E3=81=AE=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E3=82=92=E5=A4=89=E6=9B=B4=E3=81=A7=E3=81=8D=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F=20Be=E3=81=AE?= =?UTF-8?q?=E3=82=A2=E3=82=A4=E3=82=B3=E3=83=B3=E3=82=92=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=9F=20http://anago.2ch.net/test/read.cgi/software/1425420?= =?UTF-8?q?543/570?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- conf/conf_user_def.inc.php | 3 +++ lib/ShowThread.php | 13 +++++++++++++ lib/ShowThreadPc.php | 6 ++++++ rep2/edit_conf_user.php | 1 + rep2/index.php | 10 ++++++++-- 6 files changed, 32 insertions(+), 3 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 45cea0766..5078177e0 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150315.0117', // rep2のバージョン + 'p2version' => '150316.1120', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 191767882..0721d16fb 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -523,6 +523,9 @@ // フレーム右下 スレ本文 の表示幅 $conf_user_def['frame_read_width'] = "60%"; // ("40%") +// 3ペイン画面のフレームの並べ方 +$conf_user_def['pane_mode'] = 0; // (0) +$conf_user_rad['pane_mode'] = array('0' => '標準(に形)', '1' => '横一列(川形)'); // ●ログインを、まずはopensslで試みる。※PHP 4.3.0以降で、OpenSSLが静的にリンクされている必要がある $conf_user_def['precede_openssl'] = 0; // (0) diff --git a/lib/ShowThread.php b/lib/ShowThread.php index ed7d41383..68b2d2f10 100644 --- a/lib/ShowThread.php +++ b/lib/ShowThread.php @@ -694,6 +694,19 @@ public function replaceBeId($date_id, $i) return $date_id; } + // }}} + // {{{ replaceSsspIcon() + + /** + * BE&絵文字アイコンリンク変換 + */ + public function replaceSsspIcon($msg) + { + //sssp://img.2ch.net/ico/miyabi.gif + //sssp://img.2ch.net/emoji/2ch-cry.gif + return preg_replace("{sssp(://[-_.!~*()0-9A-Za-z;/:@&=+\$,%]+?\.(?:gif|png|jpe|jpe?g|ico|bmp|tif|mng|j2k)(?:[?#][-_.!~*()0-9A-Za-z;/?:@&=+\$,%#]*|))}", "", $msg); + } + // }}} // {{{ _ngAbornCheck() diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index c3133a180..5f7cc9290 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -224,6 +224,9 @@ public function transRes($ares, $i, $pattern = null) // BEプロファイルリンク変換 $date_id = $this->replaceBeId($date_id, $i); + // BE&絵文字アイコンリンク変換 + $msg = $this->replaceSsspIcon($msg); + // HTMLポップアップ if ($_conf['iframe_popup']) { $date_id = preg_replace_callback("{((\?#*)|(Lv\.\d+))}", array($this, 'iframePopupCallback'), $date_id); @@ -388,6 +391,9 @@ public function qRes($ares, $i) // BEプロファイルリンク変換 $date_id = $this->replaceBeId($date_id, $i); + // BE&絵文字アイコンリンク変換 + $msg = $this->replaceSsspIcon($msg); + // HTMLポップアップ if ($_conf['iframe_popup']) { $date_id = preg_replace_callback("{((\?#*)|(Lv\.\d+))}", array($this, 'iframePopupCallback'), $date_id); diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index 4b7512d1b..f8b9273d5 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -402,6 +402,7 @@ array('frame_menu_width', 'フレーム左 板メニュー の表示幅'), array('frame_subject_width', 'フレーム右上 スレ一覧 の表示幅'), array('frame_read_width', 'フレーム右下 スレ本文 の表示幅'), + array('pane_mode', '3ペイン画面のフレームの並べ方'), array('my_FROM', 'レス書き込み時のデフォルトの名前'), array('my_mail', 'レス書き込み時のデフォルトのmail'), diff --git a/rep2/index.php b/rep2/index.php index 12df2b2ba..95ee4e89d 100644 --- a/rep2/index.php +++ b/rep2/index.php @@ -52,8 +52,14 @@ } // デフォルトのペイン分割 - $panes = 'default'; - $direction = 'rows'; + if(!$_conf['pane_mode']) + { + $panes = 'default'; + $direction = 'rows'; + } else { + $panes = 'v3'; + $direction = 'cols'; + } $_SESSION['use_narrow_toolbars'] = false; // index.php?panes={v3,v2,h2} or index.php?sidebar=1 でペイン指定 From 31f6e80fbeee3f5d9b67561f40d3bc303df6769b Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 16 Mar 2015 13:12:52 +0900 Subject: [PATCH 064/339] =?UTF-8?q?=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1?= =?UTF-8?q?=E3=83=B3=E3=83=88=E3=82=92=E6=9B=B4=E6=96=B0=20=E3=82=B9?= =?UTF-8?q?=E3=83=9E=E3=83=9B=E5=90=91=E3=81=91CSS=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/README-774.txt | 36 ++++++++++++++++++++++++++++++++---- doc/README-API.txt | 1 + rep2/css/iphone.css | 2 +- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/doc/README-774.txt b/doc/README-774.txt index fcc67d110..e4958c057 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -9,14 +9,16 @@ rep2-expack test https://github.com/orzisun/p2-php 独自の改良も行っています。 -●機能 +●主な機能 ・「ユーザー設定編集」から+liveリンクの表示設定を変更可能 -・実況板のスレ一覧からスレを開いたときに自動的に実況モードでスレを開く -・スレッドタイトルから著作権表記を削除可能 +・実況板のスレ一覧からスレを開いたときに自動的に実況モードでスレを開く設定を追加 +・3ペイン表示の配置を変更できる設定を追加 +・スレッドタイトルから著作権表記を削除する設定を追加 ・ローカル板一覧用.brdファイルの置き場所をrep2/boardから$_conf['data_dir']/brardに変更 +・cronとかで最近読んだスレなどのdatをDL出来るスクリプト追加 +・本家からbeのログイン部分を移植してBE2.0に対応 ・その他今時のアレに合わせた修正等gitのコミットログも確認してください。 - ●免責 本ソフトウェアの使用により直接および間接的に生じたいかなる損害も補償いたしません。 @@ -32,3 +34,29 @@ rep2-expack test https://github.com/orzisun/p2-php ●ライセンス 本家p2と同じく、X11ライセンスです。 + +●ChangeLog +150316.1120 +・3ペイン表示の配置を変更できる設定を追加 +・Beのアイコンを表示できるようにした +・その他諸々 + +150315.0117 +・youtu.beとnico.(ms|sc)のプレビューに対応 +・YouTubeの埋め込み方法をobjectからiframeに変更 +・cronとかで最近読んだスレなどのdatをDL出来るスクリプト追加 +・一部の画面デザインを本家っぽいデザインに変更 +・一部のレスの改行が削除される不具合を修正 +・IDを色づけしない設定の際にIDの表示がおかしくなる不具合を修正 +・2chのDAT提供終了に伴うログ破損対策を追加 +・本家からbeのログイン部分を移植してBE2.0に対応 +・既取得スレでもスレ一覧に元スレのリンクを表示できる設定を追加 +・その他諸々 + +150307.1230 +・docディレクトリに各機能のReadme.txtを作成 +・「ユーザー設定編集」から+liveリンクの表示設定を変更可能 +・実況板のスレ一覧からスレを開いたときに自動的に実況モードでスレを開く設定を追加 +・スレッドタイトルから著作権表記を削除する設定を追加 +・ローカル板一覧用.brdファイルの置き場所をrep2/boardから$_conf['data_dir']/brardに変更 +・その他諸々 \ No newline at end of file diff --git a/doc/README-API.txt b/doc/README-API.txt index 449c813c2..da6edf1cc 100644 --- a/doc/README-API.txt +++ b/doc/README-API.txt @@ -2,6 +2,7 @@ API ●何? あくまで非公式な実験機能です。 +機能を使用するためには設定が必要になります。 2ch APIを使用したdatの取得に対応しています。 diff --git a/rep2/css/iphone.css b/rep2/css/iphone.css index 8bba736b7..3d4d105b1 100644 --- a/rep2/css/iphone.css +++ b/rep2/css/iphone.css @@ -816,7 +816,7 @@ div.mtoolbar { min-width: 320px; margin: 0; padding: 0; - background-color: #000; + background-color: #333; color: #fff; } From a7d89638b40608cf65586c09c37a0e29d0dd8853 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 17 Mar 2015 09:03:29 +0900 Subject: [PATCH 065/339] =?UTF-8?q?lib/ThreadRead.php=E3=81=AEDAT=E3=83=80?= =?UTF-8?q?=E3=82=A6=E3=83=B3=E3=83=AD=E3=83=BC=E3=83=89=E9=83=A8=E5=88=86?= =?UTF-8?q?=E3=82=92=E6=9C=AC=E5=AE=B6=E3=81=AE=E3=82=BD=E3=83=BC=E3=82=B9?= =?UTF-8?q?=E3=82=92=E4=BD=BF=E3=81=A3=E3=81=A6=E4=BD=9C=E3=82=8A=E6=9B=BF?= =?UTF-8?q?=E3=81=88=E3=81=9F=E3=80=82=20subject.php=E3=81=AEDAT=E5=89=8A?= =?UTF-8?q?=E9=99=A4=E3=83=AA=E3=83=B3=E3=82=AF=E3=81=ABtarget=3D"=5Fself"?= =?UTF-8?q?=E3=82=92=E4=BB=98=E3=81=91=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 1195 ++++++++++++++++++++++-------------------- lib/sb_print.inc.php | 6 +- 2 files changed, 621 insertions(+), 580 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 2a6bbf5a6..31f4e0fcf 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -11,137 +11,117 @@ /** * スレッドリードクラス */ -class ThreadRead extends Thread -{ +class ThreadRead extends Thread { // {{{ properties - public $datlines; // datから読み込んだラインを格納する配列 - public $resrange; // array('start' => i, 'to' => i, 'nofirst' => bool) - public $onbytes; // サーバから取得したdatサイズ public $diedat; // サーバからdat取得しようとしてできなかった時にtrueがセットされる public $onthefly; // ローカルにdat保存しないオンザフライ読み込みならtrue - - public $idp; // レス番号をキー、IDの前の文字列 ("ID:", " " 等) を値とする連想配列 - public $ids; // レス番号をキー、IDを値とする連想配列 + public $idp; // レス番号をキー、IDの前の文字列 ("ID:", " " 等) を値とする連想配列 + public $ids; // レス番号をキー、IDを値とする連想配列 public $idcount; // IDをキー、出現回数を値とする連想配列 - public $getdat_error_msg_ht; // dat取得に失敗した時に表示されるメッセージ(HTML) - - public $old_host; // ホスト移転検出時、移転前のホストを保持する - + public $old_host; // ホスト移転検出時、移転前のホストを保持する private $getdat_error_body; // dat取得に失敗した時に203で取得できたBODY public $datochi_residuums; // dat取得に失敗した時に203で取得できたdatlineの配列(レス番=>datline) // }}} // {{{ constructor - + /** * コンストラクタ */ - public function __construct() - { - parent::__construct(); + public function __construct() { + parent::__construct (); $this->getdat_error_msg_ht = ""; } - + // }}} // {{{ downloadDat() - + /** * DATをダウンロードする */ - public function downloadDat() - { + public function downloadDat() { global $_conf; - + // まちBBS - if (P2Util::isHostMachiBbs($this->host)) { - return DownloadDatMachiBbs::invoke($this); - // JBBS@したらば - } elseif (P2Util::isHostJbbsShitaraba($this->host)) { - if (!function_exists('shitarabaDownload')) { + if (P2Util::isHostMachiBbs ( $this->host )) { + return DownloadDatMachiBbs::invoke ( $this ); + // JBBS@したらば + } elseif (P2Util::isHostJbbsShitaraba ( $this->host )) { + if (! function_exists ( 'shitarabaDownload' )) { include P2_LIB_DIR . '/read_shitaraba.inc.php'; } - return shitarabaDownload($this); - - // 2ch系 + return shitarabaDownload ( $this ); + + // 2ch系 } else { - $this->getDatBytesFromLocalDat(); // $aThread->length をset + $this->getDatBytesFromLocalDat (); // $aThread->length をset $pinktest = "/\w+\.bbspink.com/"; - + // 2ch bbspink●読み - if (P2Util::isHost2chs($this->host) && !empty($_GET['maru'])) { - // ログインしてなければ or ログイン後、24時間以上経過していたら自動再ログイン - if (!file_exists($_conf['sid2ch_php']) || - !empty($_REQUEST['relogin2ch']) || - (filemtime($_conf['sid2ch_php']) < time() - 60*60*24)) - { - if (!function_exists('login2ch')) { - include P2_LIB_DIR . '/login2ch.inc.php'; - } - if (!login2ch()) { - $this->getdat_error_msg_ht .= $this->get2chDatError(); - $this->diedat = true; - return false; - } + if (P2Util::isHost2chs ( $this->host ) && ! empty ( $_GET ['maru'] )) { + // ログインしてなければ or ログイン後、24時間以上経過していたら自動再ログイン + if (! file_exists ( $_conf ['sid2ch_php'] ) || ! empty ( $_REQUEST ['relogin2ch'] ) || (filemtime ( $_conf ['sid2ch_php'] ) < time () - 60 * 60 * 24)) { + if (! function_exists ( 'login2ch' )) { + include P2_LIB_DIR . '/login2ch.inc.php'; + } + if (! login2ch ()) { + $this->getdat_error_msg_ht .= $this->get2chDatError (); + $this->diedat = true; + return false; } - - include $_conf['sid2ch_php']; - return $this->_downloadDat2chMaru($uaMona, $SID2ch); - - // 2ch bbspink モリタポ読み - } elseif (P2Util::isHost2chs($this->host) && !empty($_GET['moritapodat']) && - $_conf['p2_2ch_mail'] && $_conf['p2_2ch_pass']) - { - if (!array_key_exists('csrfid', $_GET) || - $this->_getCsrfIdForMoritapoDat() != $_GET['csrfid']) - { - p2die('不正なリクエストです'); } - return $this->_downloadDat2chMoritapo(); - - // 2chの過去ログ倉庫読み - } elseif (!empty($_GET['kakolog']) && !empty($_GET['kakoget'])) { - if ($_GET['kakoget'] == 1) { + + include $_conf ['sid2ch_php']; + return $this->_downloadDat2chMaru ( $uaMona, $SID2ch ); + + // 2ch bbspink モリタポ読み + } elseif (P2Util::isHost2chs ( $this->host ) && ! empty ( $_GET ['moritapodat'] ) && $_conf ['p2_2ch_mail'] && $_conf ['p2_2ch_pass']) { + if (! array_key_exists ( 'csrfid', $_GET ) || $this->_getCsrfIdForMoritapoDat () != $_GET ['csrfid']) { + p2die ( '不正なリクエストです' ); + } + return $this->_downloadDat2chMoritapo (); + + // 2chの過去ログ倉庫読み + } elseif (! empty ( $_GET ['kakolog'] ) && ! empty ( $_GET ['kakoget'] )) { + if ($_GET ['kakoget'] == 1) { $ext = '.dat.gz'; - } elseif ($_GET['kakoget'] == 2) { + } elseif ($_GET ['kakoget'] == 2) { $ext = '.dat'; } - return $this->_downloadDat2chKako($_GET['kakolog'], $ext); - - // 2ch or 2ch互換 - } elseif (P2Util::isHost2chs($this->host) && !empty($_GET['shirokuma'])) { - return $this->_downloadDat2chMaru($uaMona, $SID2ch, 'shirokuma'); - //2ch はAPI経由で落とす - } elseif (P2Util::isHost2chs($this->host) && $_conf['2chapi_use'] == 1 && empty($_GET['olddat'])) { + return $this->_downloadDat2chKako ( $_GET ['kakolog'], $ext ); + + // 2ch or 2ch互換 + } elseif (P2Util::isHost2chs ( $this->host ) && ! empty ( $_GET ['shirokuma'] )) { + return $this->_downloadDat2chMaru ( $uaMona, $SID2ch, 'shirokuma' ); + // 2ch はAPI経由で落とす + } elseif (P2Util::isHost2chs ( $this->host ) && $_conf ['2chapi_use'] == 1 && empty ( $_GET ['olddat'] )) { // ログインしてなければ or ログイン後、設定した時間経過していたら自動再ログイン - if (!file_exists($_conf['sid2chapi_php']) || - !empty($_REQUEST['relogin2chapi']) || - (filemtime($_conf['sid2chapi_php']) < time() - 60*60*$_conf['2chapi_interval'])) - { - if (!function_exists('authenticate_2chapi')) { + if (! file_exists ( $_conf ['sid2chapi_php'] ) || ! empty ( $_REQUEST ['relogin2chapi'] ) || (filemtime ( $_conf ['sid2chapi_php'] ) < time () - 60 * 60 * $_conf ['2chapi_interval'])) { + if (! function_exists ( 'authenticate_2chapi' )) { include P2_LIB_DIR . '/auth2chapi.inc.php'; } - if (!authenticate_2chapi()) { - $this->getdat_error_msg_ht .= $this->get2chDatError(); + if (! authenticate_2chapi ()) { + $this->getdat_error_msg_ht .= $this->get2chDatError (); $this->diedat = true; return false; } } - - include $_conf['sid2chapi_php']; - return $this->_downloadDat2chAPI($SID2chAPI,$this->length); + + include $_conf ['sid2chapi_php']; + return $this->_downloadDat2chAPI ( $SID2chAPI, $this->length ); } else { - //2ch 以外の外部板 + // 2ch 以外の外部板 // DATを差分DLする - return $this->_downloadDat2ch($this->length); + return $this->_downloadDat2ch ( $this->length ); } } } - + // }}} // {{{ _downloadDat2chAPI() @@ -150,266 +130,257 @@ public function downloadDat() * * @return mix 取得できたか、更新がなかった場合はtrueを返す */ - protected function _downloadDat2chAPI($sid,$from_bytes) - { + protected function _downloadDat2chAPI($sid, $from_bytes) { global $_conf; global $debug; - - $AppKey = $_conf['2chapi_appkey']; - $AppName = $_conf['2chapi_appname']; - $HMKey = $_conf['2chapi_hmkey']; - if (!($this->host && $this->bbs && $this->key)) { + + $AppKey = $_conf ['2chapi_appkey']; + $AppName = $_conf ['2chapi_appname']; + $HMKey = $_conf ['2chapi_hmkey']; + if (! ($this->host && $this->bbs && $this->key)) { return false; } - - //>>1プレビューの時は差分取得しなくて良いので常にtrue(新着無し)を返す - if (is_readable($this->keydat) && !empty($_GET['one'])) { + + // >>1プレビューの時は差分取得しなくて良いので常にtrue(新着無し)を返す + if (is_readable ( $this->keydat ) && ! empty ( $_GET ['one'] )) { return true; } - + if ($sid == '') { return false; } - - $from_bytes = intval($from_bytes); - + + $from_bytes = intval ( $from_bytes ); + if ($from_bytes == 0) { $zero_read = true; } else { $zero_read = false; $from_bytes = $from_bytes - 1; } - - $serverName = explode('.', $this->host); - //$url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; - //$url="http://news2.2ch.net/test/read.cgi?bbs=newsplus&key=1038486598"; - $url = 'https://api.2ch.net/v1/'.$serverName[0].'/'.$this->bbs.'/'.$this->key; - $message = '/v1/'.$serverName[0].'/'.$this->bbs.'/'.$this->key.$sid.$AppKey; - $HB = hash_hmac("sha256", $message, $HMKey); - + + $serverName = explode ( '.', $this->host ); + // $url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; + // $url="http://news2.2ch.net/test/read.cgi?bbs=newsplus&key=1038486598"; + $url = 'https://api.2ch.net/v1/' . $serverName [0] . '/' . $this->bbs . '/' . $this->key; + $message = '/v1/' . $serverName [0] . '/' . $this->bbs . '/' . $this->key . $sid . $AppKey; + $HB = hash_hmac ( "sha256", $message, $HMKey ); + $headers = "User-Agent: Mozilla/3.0 (compatible; ${AppName})\r\n"; $headers .= "Connection: close\r\n"; $headers .= "Content-Type: application/x-www-form-urlencoded\r\n"; - $purl = parse_url($url); // URL分解 - - if(!empty($_GET['one'])) { - //>>1プレビューの時はサーバーに最初の部分だけ請求 + $purl = parse_url ( $url ); // URL分解 + + if (! empty ( $_GET ['one'] )) { + // >>1プレビューの時はサーバーに最初の部分だけ請求 $headers .= "Range: bytes=0-8192\r\n"; - } elseif (!$zero_read) { + } elseif (! $zero_read) { $headers .= "Range: bytes={$from_bytes}-\r\n"; } - + if ($this->modified) { $headers .= "If-Modified-Since: {$this->modified}\r\n"; } - + // Basic認証用のヘッダ - if (isset($purl['user']) && isset($purl['pass'])) { - $headers .= "Authorization: Basic ".base64_encode($purl['user'].":".$purl['pass'])."\r\n"; + if (isset ( $purl ['user'] ) && isset ( $purl ['pass'] )) { + $headers .= "Authorization: Basic " . base64_encode ( $purl ['user'] . ":" . $purl ['pass'] ) . "\r\n"; } - $post_values = array( - 'sid' => $sid, - 'hobo' => $HB, - 'appkey' => $AppKey, + $post_values = array ( + 'sid' => $sid, + 'hobo' => $HB, + 'appkey' => $AppKey ); - $options['http'] = array( - 'method' => 'POST', - 'header' => $headers, - 'ignore_errors'=> true, - 'content' => http_build_query($post_values), + $options ['http'] = array ( + 'method' => 'POST', + 'header' => $headers, + 'ignore_errors' => true, + 'content' => http_build_query ( $post_values ) ); // プロキシ - if ($_conf['proxy_use']) { - $options['http'] += array('proxy' => 'tcp://'.$_conf['proxy_host'].":".$_conf['proxy_port']); - $options['http'] += array('request_fulluri' => true); - $options['ssl'] = array('SNI_enabled' => false); + if ($_conf ['proxy_use']) { + $options ['http'] += array ( + 'proxy' => 'tcp://' . $_conf ['proxy_host'] . ":" . $_conf ['proxy_port'] + ); + $options ['http'] += array ( + 'request_fulluri' => true + ); + $options ['ssl'] = array ( + 'SNI_enabled' => false + ); } - + // WEBサーバへ接続 - $fp = @fopen($url, 'r', false, stream_context_create($options)); - if (!$fp) { - self::_pushInfoConnectFailed($url, $errno, $errstr); + $fp = @fopen ( $url, 'r', false, stream_context_create ( $options ) ); + if (! $fp) { + self::_pushInfoConnectFailed ( $url, $errno, $errstr ); $this->diedat = true; return false; } - stream_set_timeout($fp, $_conf['http_read_timeout'], 0); - - $body = ''; + stream_set_timeout ( $fp, $_conf ['http_read_timeout'], 0 ); + $code = null; - $start_here = false; - - while (!p2_stream_eof($fp, $timed_out)) { - - if ($start_here) { - - if ($code == '200' || $code == '206') { - - while (!p2_stream_eof($fp, $timed_out)) { - //>>1をプレビューする用 - if (!empty($_GET['one'])) { - $line = fgets($fp, 32800); //改行単位で読込み - if (strstr($line, "\n")) {//改行が有れば保存; - $body .= $line; - } - unset($line); - } else { - $body .= fread($fp, 4096); //通常取得はあぼーん判定を行うためこっちで保存する - } - } - - if ($timed_out) { - self::_pushInfoReadTimedOut($url); - $this->diedat = true; - fclose($fp); - return false; - } - //1行目を少し切り出す - $firstmsg = substr($body, 0, 100); - if(strpos($firstmsg, 'ng ')===0) { - //ngで始まってたらapiのエラー - fclose($fp); - if (strstr($firstmsg, "not valid")) { - //sidが無効になった可能性。もう一回認証するため最初からやり直し。 - if (empty($_REQUEST['relogin2chapi'])) { - $_REQUEST['relogin2chapi'] = true; - return $this->downloadDat(); - } - } - $this->getdat_error_msg_ht .= "

      rep2 error: API経由でのスレッド取得に失敗しました。".trim($firstmsg)."

      "; - $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&relogin2chapi=true\">APIで再取得を試みる]"; - $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&olddat=true\">旧datで再取得を試みる]"; - $this->diedat = true; - return false; - } elseif (strpos($firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2")===0) { - fclose($fp); - $this->getdat_error_msg_ht .= "

      rep2 error: API経由でのスレッド取得に失敗しました。
      rep2 info: スレッドが存在しないか過去ログに格納されています。

      "; - $marutori_ht = " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&maru=true{$_conf['k_at_a']}\">●IDでrep2に取り込む]"; - $marutori_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&shirokuma=true{$_conf['k_at_a']}\">offlaw経由でrep2に取り込む]"; - $plugin_ht = $this->_generateWikiDatLink(); - $moritori_ht = $this->_generateMoritapoDatLink(); - $this->getdat_error_msg_ht .= "{$marutori_ht}{$moritori_ht}{$plugin_ht}"; - $this->diedat = true; - return false; - } - unset($firstmsg); - - // 末尾の改行であぼーんチェック - if (!$zero_read) { - if (substr($body, 0, 1) != "\n") { - //echo "あぼーん検出"; - fclose($fp); - $this->onbytes = 0; - $this->modified = null; - return $this->_downloadDat2chAPI($sid,0); // あぼーん検出。全部取り直し。 - } - $body = substr($body, 1); - } - - $file_append = ($zero_read) ? 0 : FILE_APPEND; - - if (FileCtl::file_write_contents($this->keydat, $body, $file_append) === false) { - p2die('cannot write file.'); - } - - //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("dat_size_check"); - // 取得後サイズチェック - if ($zero_read == false && $this->onbytes) { - $this->getDatBytesFromLocalDat(); // $aThread->length をset - if ($this->onbytes != $this->length) { - fclose($fp); - $this->onbytes = 0; - $this->modified = null; - P2Util::pushInfoHtml("

      rep2 info: {$this->onbytes}/{$this->length} ファイルサイズが変なので、datを再取得

      "); - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("dat_size_check"); - return $this->_downloadDat2chAPI($sid,0); //datサイズは不正。全部取り直し。 - - // サイズが同じならそのまま - } elseif ($this->onbytes == $this->length) { - fclose($fp); - $this->isonline = true; - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('dat_size_check'); - return true; - } + $meta = stream_get_meta_data ( $fp ); + foreach ( $meta ['wrapper_data'] as $l ) { + // ex) HTTP/1.1 304 Not Modified + if (preg_match ( '@^HTTP/1\\.\\d (\\d+) (.+)@i', $l, $matches )) { + $code = $matches [1]; + + if ($code == '200' || $code == '206') { // Partial Content + ; + } elseif ($code == '302') { // Found + + // ホストの移転を追跡 + $new_host = BbsMap::getCurrentHost ( $this->host, $this->bbs ); + if ($new_host != $this->host) { + fclose ( $fp ); + $this->old_host = $this->host; + $this->host = $new_host; + return $this->_downloadDat2chAPI ( $sid, $from_bytes ); + } else { + fclose ( $fp ); + return $this->_downloadDat2chNotFound ( $code ); } - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('dat_size_check'); - - // スレッドがないと判断 + } elseif ($code == '304') { // Not Modified + fclose ( $fp ); + $this->isonline = true; + return '304 Not Modified'; + } elseif ($code == '416') { // Requested Range Not Satisfiable + // echo "あぼーん検出"; + fclose ( $fp ); + $this->onbytes = 0; + $this->modified = null; + return $this->_downloadDat2chAPI ( $sid, 0 ); // あぼーん検出。全部取り直し。 } else { - fclose($fp); - return $this->_downloadDat2chNotFound($code); + fclose ( $fp ); + return $this->_downloadDat2chNotFound ( $code ); + } + } + + if ($zero_read) { + if (preg_match ( '/^Content-Length: ([0-9]+)/i', $l, $matches )) { + $this->onbytes = intval ( $matches [1] ); } - } else { - $meta = stream_get_meta_data($fp); - foreach($meta['wrapper_data'] as $l) - { - // ex) HTTP/1.1 304 Not Modified - if (preg_match('@^HTTP/1\\.\\d (\\d+) (.+)@i', $l, $matches)) { - $code = $matches[1]; - - if ($code == '200' || $code == '206') { // Partial Content - ; - - } elseif ($code == '302') { // Found - - // ホストの移転を追跡 - $new_host = BbsMap::getCurrentHost($this->host, $this->bbs); - if ($new_host != $this->host) { - fclose($fp); - $this->old_host = $this->host; - $this->host = $new_host; - return $this->_downloadDat2chAPI($sid,$from_bytes); - } else { - fclose($fp); - return $this->_downloadDat2chNotFound($code); - } - - } elseif ($code == '304') { // Not Modified - fclose($fp); - $this->isonline = true; - return '304 Not Modified'; - - } elseif ($code == '416') { // Requested Range Not Satisfiable - //echo "あぼーん検出"; - fclose($fp); - $this->onbytes = 0; - $this->modified = null; - return $this->_downloadDat2chAPI($sid,0); // あぼーん検出。全部取り直し。 - - } else { - fclose($fp); - return $this->_downloadDat2chNotFound($code); - } + + if (preg_match ( '@^Content-Range: bytes ([^/]+)/([0-9]+)@i', $l, $matches )) { + $this->onbytes = intval ( $matches [2] ); + } + } + + if (preg_match ( '/^Last-Modified: (.+)/i', $l, $matches )) { + // echo $matches[1] . '
      '; //debug + $this->modified = $matches [1]; + } + } + + $body = ''; + + if ($code == '200' || $code == '206') { + + while ( ! p2_stream_eof ( $fp, $timed_out ) ) { + // >>1をプレビューする用 + if (! empty ( $_GET ['one'] )) { + $line = fgets ( $fp, 32800 ); // 改行単位で読込み + if (strstr ( $line, "\n" )) { // 改行が有れば保存; + $body .= $line; } - - if ($zero_read) { - if (preg_match('/^Content-Length: ([0-9]+)/i', $l, $matches)) { - $this->onbytes = intval($matches[1]); - } - } else { - - if (preg_match('@^Content-Range: bytes ([^/]+)/([0-9]+)@i', $l, $matches)) { - $this->onbytes = intval($matches[2]); + unset ( $line ); + } else { + $body .= fread ( $fp, 4096 ); // 通常取得はあぼーん判定を行うためこっちで保存する + } + } + + if ($timed_out) { + self::_pushInfoReadTimedOut ( $url ); + $this->diedat = true; + fclose ( $fp ); + return false; + } + // 1行目を少し切り出す + $firstmsg = trim ( substr ( $body, 0, 100 ) ); + if (strpos ( $firstmsg, 'ng ' ) === 0) { + // ngで始まってたらapiのエラーの可能性 + if (preg_match ( "/^ng \((.*)\)$/", $firstmsg )) { + // 誤判定防止のためpreg_matchで二重チェックする + fclose ( $fp ); + if (strstr ( $firstmsg, "not valid" )) { + // sidが無効になった可能性。もう一回認証するため最初からやり直し。 + if (empty ( $_REQUEST ['relogin2chapi'] )) { + $_REQUEST ['relogin2chapi'] = true; + return $this->downloadDat (); } - - } - - if (preg_match('/^Last-Modified: (.+)/i', $l, $matches)) { - //echo $matches[1] . '
      '; //debug - $this->modified = $matches[1]; } + $this->getdat_error_msg_ht .= "

      rep2 error: API経由でのスレッド取得に失敗しました。" . $firstmsg . "

      "; + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&relogin2chapi=true\">APIで再取得を試みる]"; + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&olddat=true\">旧datで再取得を試みる]"; + $this->diedat = true; + return false; + } + } elseif (strpos ( $firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2" ) === 0) { + fclose ( $fp ); + $this->getdat_error_msg_ht .= "

      rep2 error: API経由でのスレッド取得に失敗しました。
      rep2 info: スレッドが存在しないか過去ログに格納されています。

      "; + $marutori_ht = " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&maru=true{$_conf['k_at_a']}\">●IDでrep2に取り込む]"; + $marutori_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&shirokuma=true{$_conf['k_at_a']}\">offlaw経由でrep2に取り込む]"; + $plugin_ht = $this->_generateWikiDatLink (); + $moritori_ht = $this->_generateMoritapoDatLink (); + $this->getdat_error_msg_ht .= "{$marutori_ht}{$moritori_ht}{$plugin_ht}"; + $this->diedat = true; + return false; + } + unset ( $firstmsg ); + + // 末尾の改行であぼーんチェック + if (! $zero_read) { + if (substr ( $body, 0, 1 ) != "\n") { + // echo "あぼーん検出"; + fclose ( $fp ); + $this->onbytes = 0; + $this->modified = null; + return $this->_downloadDat2chAPI ( $sid, 0 ); // あぼーん検出。全部取り直し。 + } + $body = substr ( $body, 1 ); + } + + $file_append = ($zero_read) ? 0 : FILE_APPEND; + + if (FileCtl::file_write_contents ( $this->keydat, $body, $file_append ) === false) { + p2die ( 'cannot write file.' ); + } + + // $GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("dat_size_check"); + // 取得後サイズチェック + if ($zero_read == false && $this->onbytes) { + $this->getDatBytesFromLocalDat (); // $aThread->length をset + if ($this->onbytes != $this->length) { + fclose ( $fp ); + $this->onbytes = 0; + $this->modified = null; + P2Util::pushInfoHtml ( "

      rep2 info: {$this->onbytes}/{$this->length} ファイルサイズが変なので、datを再取得

      " ); + // $GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("dat_size_check"); + return $this->_downloadDat2chAPI ( $sid, 0 ); // datサイズは不正。全部取り直し。 + + // サイズが同じならそのまま + } elseif ($this->onbytes == $this->length) { + fclose ( $fp ); + $this->isonline = true; + // $GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('dat_size_check'); + return true; } - $start_here = true; } + } else { + // スレッドがないと判断 + fclose ( $fp ); + return $this->_downloadDat2chNotFound ( $code ); } - - fclose($fp); + + fclose ( $fp ); if ($timed_out) { - self::_pushInfoReadTimedOut($url); + self::_pushInfoReadTimedOut ( $url ); $this->diedat = true; return false; } else { @@ -418,6 +389,83 @@ protected function _downloadDat2chAPI($sid,$from_bytes) } } + // }}} + // {{{ _freadHttpHeader() + /** + * HTTPヘッダレスポンスを読み込む + * + * @access private + * @param resource $fp fsockopen で開いたファイルポインタ + * @return array|false + */ + function _freadHttpHeader($fp) + { + $h = array(); + + while (!feof($fp)) { + $l = fgets($fp, 8192); + + // ex) HTTP/1.1 304 Not Modified + if (preg_match("|HTTP/1\.\d (\d+) (.+)\r\n|", $l, $matches)) { + $h['code'] = $matches[1]; + $h['message'] = $matches[2]; + $h['HTTP'] = rtrim($l); + } + + if (preg_match('/^(.+?): (.+)\r\n/', $l, $matches)) { + $h['headers'][$matches[1]] = $matches[2]; + + } elseif ($l == "\r\n") { + if (!isset($h['code'])) { + return false; + } + return $h; + } + } + + return false; + } + // }}} + // {{{ _pushInfoHtmlFreadHttpHeaderError() + /** + * HTTPヘッダレスポンスの取得エラーを P2Util::pushInfoHtml() する + * + * @access private + * @return void + */ + function _pushInfoHtmlFreadHttpHeaderError($url) + { + P2Util::pushInfoHtml(sprintf('

      p2 info: %s からヘッダレスポンスを取得できませんでした。

      ',$url)); + } + // }}} + // {{{ _getOnbytesFromHeader() + /** + * HTTPヘッダレスポンスからファイルサイズを取得する + * + * @access private + * @param array $headers + * @param boolean $zero_read + * @return integer|false + */ + function _getOnbytesFromHeader($headers, $zero_read = true) + { + if ($zero_read) { + if (isset($headers['Content-Length'])) { + if (preg_match("/^([0-9]+)/", $headers['Content-Length'], $matches)) { + return $onbytes = $matches[1]; + } + } + + } else { + if (isset($headers['Content-Range'])) { + if (preg_match("/^bytes ([^\/]+)\/([0-9]+)/", $headers['Content-Range'], $matches)) { + return $onbytes = $matches[2]; + } + } + } + + return false; + } // }}} // {{{ _downloadDat2ch() @@ -517,156 +565,142 @@ protected function _downloadDat2ch($from_bytes) fputs($fp, $request); - $body = ''; $code = null; - $start_here = false; - - while (!p2_stream_eof($fp, $timed_out)) { - - if ($start_here) { - - if ($code == '200' || $code == '206') { - - while (!p2_stream_eof($fp, $timed_out)) { - //>>1をプレビューする用 - if (!empty($_GET['one'])) { - $line = fgets($fp, 32800); //改行単位で読込み - if (strstr($line, "\n")) {//改行が有れば保存; - $body .= $line; - } - unset($line); - } else { - $body .= fread($fp, 4096); //通常取得はあぼーん判定を行うためこっちで保存する - } - } - - if ($timed_out) { - self::_pushInfoReadTimedOut($url); - $this->diedat = true; - fclose($fp); - return false; - } - - //ホストが2chの時にDATを利用できない旨のメッセージが出たらエラーとする(DAT破損対策) - if (P2Util::isHost2chs($this->host)) - { - $firstmsg = substr($body, 0, 100); - if (strpos($firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2")===0) { - $this->getdat_error_msg_ht .= "

      rep2 error: 2ちゃんねるのDAT提供は終了しました。

      "; - $this->diedat = true; - fclose($fp); - return false; - } - unset($firstmsg); - } - - // 末尾の改行であぼーんチェック - if (!$zero_read) { - if (substr($body, 0, 1) != "\n") { - //echo "あぼーん検出"; - fclose($fp); - $this->onbytes = 0; - $this->modified = null; - return $this->_downloadDat2ch(0); // あぼーん検出。全部取り直し。 - } - $body = substr($body, 1); - } - - $file_append = ($zero_read) ? 0 : FILE_APPEND; - - if (FileCtl::file_write_contents($this->keydat, $body, $file_append) === false) { - p2die('cannot write file.'); - } - - //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("dat_size_check"); - // 取得後サイズチェック - if ($zero_read == false && $this->onbytes) { - $this->getDatBytesFromLocalDat(); // $aThread->length をset - if ($this->onbytes != $this->length) { - fclose($fp); - $this->onbytes = 0; - $this->modified = null; - P2Util::pushInfoHtml("

      rep2 info: {$this->onbytes}/{$this->length} ファイルサイズが変なので、datを再取得

      "); - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("dat_size_check"); - return $this->_downloadDat2ch(0); //datサイズは不正。全部取り直し。 - - // サイズが同じならそのまま - } elseif ($this->onbytes == $this->length) { - fclose($fp); - $this->isonline = true; - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('dat_size_check'); - return true; - } + + // HTTPヘッダレスポンスを取得する + $h = $this->_freadHttpHeader($fp); + if ($h === false) { + fclose($fp); + $this->_pushInfoHtmlFreadHttpHeaderError($url); + $this->diedat = true; + return false; + } + $code = $h['code']; + + if ($code == '200' || $code == '206') { // Partial Content + ; + + } elseif ($code == '302') { // Found + + // ホストの移転を追跡 + $new_host = BbsMap::getCurrentHost($this->host, $this->bbs); + if ($new_host != $this->host) { + fclose($fp); + $this->old_host = $this->host; + $this->host = $new_host; + return $this->_downloadDat2ch($from_bytes); + } else { + fclose($fp); + return $this->_downloadDat2chNotFound($code); + } + + } elseif ($code == '304') { // Not Modified + fclose($fp); + $this->isonline = true; + return '304 Not Modified'; + + } elseif ($code == '416') { // Requested Range Not Satisfiable + //echo "あぼーん検出"; + fclose($fp); + $this->onbytes = 0; + $this->modified = null; + return $this->_downloadDat2ch(0); // あぼーん検出。全部取り直し。 + + } else { + fclose($fp); + return $this->_downloadDat2chNotFound($code); + } + + $r = $this->_getOnbytesFromHeader($h['headers'], $zero_read); + if ($r !== false) { + $this->onbytes = $r; + } + + if (isset($h['headers']['Last-Modified'])) { + $this->modified = $h['headers']['Last-Modified']; + } + + // bodyを読む + $body = ''; + if ($code == '200' || $code == '206') { + + while (!p2_stream_eof($fp, $timed_out)) { + //>>1をプレビューする用 + if (!empty($_GET['one'])) { + $line = fgets($fp, 32800); //改行単位で読込み + if (strstr($line, "\n")) {//改行が有れば保存; + $body .= $line; } - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('dat_size_check'); - - // スレッドがないと判断 + unset($line); } else { - fclose($fp); - return $this->_downloadDat2chNotFound($code); + $body .= fread($fp, 4096); //通常取得はあぼーん判定を行うためこっちで保存する } - - } else { - $l = rtrim(fgets($fp, 32800), "\r\n"); - // ex) HTTP/1.1 304 Not Modified - if (preg_match('@^HTTP/1\\.\\d (\\d+) (.+)@i', $l, $matches)) { - $code = $matches[1]; - - if ($code == '200' || $code == '206') { // Partial Content - ; - - } elseif ($code == '302') { // Found - - // ホストの移転を追跡 - $new_host = BbsMap::getCurrentHost($this->host, $this->bbs); - if ($new_host != $this->host) { - fclose($fp); - $this->old_host = $this->host; - $this->host = $new_host; - return $this->_downloadDat2ch($from_bytes); - } else { - fclose($fp); - return $this->_downloadDat2chNotFound($code); - } - - } elseif ($code == '304') { // Not Modified - fclose($fp); - $this->isonline = true; - return '304 Not Modified'; - - } elseif ($code == '416') { // Requested Range Not Satisfiable - //echo "あぼーん検出"; - fclose($fp); - $this->onbytes = 0; - $this->modified = null; - return $this->_downloadDat2ch(0); // あぼーん検出。全部取り直し。 - - } else { - fclose($fp); - return $this->_downloadDat2chNotFound($code); - } + } + + if ($timed_out) { + self::_pushInfoReadTimedOut($url); + $this->diedat = true; + fclose($fp); + return false; + } + + //ホストが2chの時にDATを利用できない旨のメッセージが出たらエラーとする(DAT破損対策) + if (P2Util::isHost2chs($this->host)) + { + $firstmsg = substr($body, 0, 100); + if (strpos($firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2")===0) { + $this->getdat_error_msg_ht .= "

      rep2 error: 2ちゃんねるのDAT提供は終了しました。

      "; + $this->diedat = true; + fclose($fp); + return false; } - - if ($zero_read) { - if (preg_match('/^Content-Length: ([0-9]+)/i', $l, $matches)) { - $this->onbytes = intval($matches[1]); - } - } else { - - if (preg_match('@^Content-Range: bytes ([^/]+)/([0-9]+)@i', $l, $matches)) { - $this->onbytes = intval($matches[2]); - } - + unset($firstmsg); + } + + // 末尾の改行であぼーんチェック + if (!$zero_read) { + if (substr($body, 0, 1) != "\n") { + //echo "あぼーん検出"; + fclose($fp); + $this->onbytes = 0; + $this->modified = null; + return $this->_downloadDat2ch(0); // あぼーん検出。全部取り直し。 } - - if (preg_match('/^Last-Modified: (.+)/i', $l, $matches)) { - //echo $matches[1] . '
      '; //debug - $this->modified = $matches[1]; - - } elseif ($l === '') { - $start_here = true; + $body = substr($body, 1); + } + + $file_append = ($zero_read) ? 0 : FILE_APPEND; + + if (FileCtl::file_write_contents($this->keydat, $body, $file_append) === false) { + p2die('cannot write file.'); + } + + //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("dat_size_check"); + // 取得後サイズチェック + if ($zero_read == false && $this->onbytes) { + $this->getDatBytesFromLocalDat(); // $aThread->length をset + if ($this->onbytes != $this->length) { + fclose($fp); + $this->onbytes = 0; + $this->modified = null; + P2Util::pushInfoHtml("

      rep2 info: {$this->onbytes}/{$this->length} ファイルサイズが変なので、datを再取得

      "); + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("dat_size_check"); + return $this->_downloadDat2ch(0); //datサイズは不正。全部取り直し。 + + // サイズが同じならそのまま + } elseif ($this->onbytes == $this->length) { + fclose($fp); + $this->isonline = true; + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('dat_size_check'); + return true; } } + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('dat_size_check'); + + } else { + // スレッドがないと判断 + fclose($fp); + return $this->_downloadDat2chNotFound($code); } fclose($fp); @@ -781,99 +815,106 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma) $chunked = false; $is_gzip = false; $start_here = false; + + // HTTPヘッダレスポンスを取得する + $h = $this->_freadHttpHeader($fp); + if ($h === false) { + fclose($fp); + $this->_pushInfoHtmlFreadHttpHeaderError($url); + $this->diedat = true; + return false; + } + + // {{{ HTTPコードをチェック + + $code = $h['code']; + + if ($code == '200') { + ; + } elseif ($code == '304') { + fclose($fp); + //$this->isonline = true; + return '304 Not Modified'; + } else { + fclose($fp); + return $this->_downloadDat2chMaruNotFound(); + } + + if (isset($h['headers']['Content-Encoding'])) { + if (preg_match("/^(x-)?gzip/", $h['headers']['Content-Encoding'], $matches)) { + $isGzip = true; + } + } + if (isset($h['headers']['Content-Length'])) { + if (preg_match("/^([0-9]+)/", $h['headers']['Content-Length'], $matches)) { + $this->onbytes = $h['headers']['Content-Length']; + } + } + if (isset($h['headers']['Transfer-Encoding'])) { + if ($h['headers']['Transfer-Encoding'] == 'chunked') { + $chunked = true; + } + } + if (isset($h['headers']['Last-Modified'])) { + $this->modified = $h['headers']['Last-Modified']; + } - while (!p2_stream_eof($fp, $timed_out)) { - - if ($start_here) { - - if ($code == '200') { - - while (!p2_stream_eof($fp, $timed_out)) { - $body .= fread($fp, 4096); - } - - if ($timed_out) { - self::_pushInfoReadTimedOut($url); - //$this->diedat = true; - fclose($fp); - return false; - } - - // gzip圧縮なら - if ($is_gzip) { - $body = self::_decodeGzip($body, $url); - if ($body === null) { - //$this->diedat = true; - fclose($fp); - return false; - } - } - - if (FileCtl::file_write_contents($this->keydat, $body) === false) { - p2die('cannot write file. downloadDat2chMaru()'); - } - - // クリーニング ===== - if ($marudatlines = FileCtl::file_read_lines($this->keydat)) { - if (!$shirokuma) { - $firstline = array_shift($marudatlines); - // チャンクとか - if (strpos($firstline, 'Success') === false) { // 浪人(rokka)対応 - $secondline = array_shift($marudatlines); - } - } - $cont = ''; - foreach ($marudatlines as $aline) { - // チャンクエンコーディングが欲しいところ(HTTP 1.0でしのぐ) - if ($chunked) { - $cont .= $aline; - } else { - $cont .= $aline; - } - } - if (FileCtl::file_write_contents($this->keydat, $cont) === false) { - p2die('cannot write file. downloadDat2chMaru()'); - } - } - - // dat.gzはなかったと判断 - } else { + if ($code == '200') { + + while (!p2_stream_eof($fp, $timed_out)) { + $body .= fread($fp, 4096); + } + + if ($timed_out) { + self::_pushInfoReadTimedOut($url); + //$this->diedat = true; + fclose($fp); + return false; + } + + // gzip圧縮なら + if ($is_gzip) { + $body = self::_decodeGzip($body, $url); + if ($body === null) { + //$this->diedat = true; fclose($fp); - return $this->_downloadDat2chMaruNotFound(); + return false; } - - // ヘッダの処理 - } else { - $l = rtrim(fgets($fp, 128000), "\r\n"); - //echo $l.'
      ';// for debug - // ex) HTTP/1.1 304 Not Modified - if (preg_match('@^HTTP/1\\.\\d (\\d+) (.+)@', $l, $matches)) { - $code = $matches[1]; - - if ($code == '200') { - ; - } elseif ($code == '304') { - fclose($fp); - //$this->isonline = true; - return '304 Not Modified'; - } else { - fclose($fp); - return $this->_downloadDat2chMaruNotFound(); + } + + if (FileCtl::file_write_contents($this->keydat, $body) === false) { + p2die('cannot write file. downloadDat2chMaru()'); + } + + // クリーニング ===== + if ($marudatlines = FileCtl::file_read_lines($this->keydat)) { + if (!$shirokuma) { + $firstline = array_shift($marudatlines); + // チャンクとか + if (strpos($firstline, 'Success') === false) { // 浪人(rokka)対応 + $secondline = array_shift($marudatlines); } - - } elseif (preg_match('/^Content-Encoding: (?:x-)?gzip/i', $l)) { - $is_gzip = true; - } elseif (preg_match('/^Transfer-Encoding: (.+)/i', $l, $matches)) { // Transfer-Encoding: chunked - $t_enco = $matches[1]; - if ($t_enco == 'chunked') { - $chunked = true; + } + $cont = ''; + foreach ($marudatlines as $aline) { + // チャンクエンコーディングが欲しいところ(HTTP 1.0でしのぐ) + if ($chunked) { + $cont .= $aline; + } else { + $cont .= $aline; } - } elseif ($l === '') { - $start_here = true; + } + if (FileCtl::file_write_contents($this->keydat, $cont) === false) { + p2die('cannot write file. downloadDat2chMaru()'); } } - + + } else { + // dat.gzはなかったと判断 + fclose($fp); + return $this->_downloadDat2chMaruNotFound(); } + fclose($fp); //$this->isonline = true; //$this->datochiok = 1; @@ -967,68 +1008,68 @@ protected function _downloadDat2chKako($uri, $ext) $code = null; $is_gzip = false; $start_here = false; + + // HTTPヘッダレスポンスを取得する + $h = $this->_freadHttpHeader($fp); + if ($h === false) { + fclose($fp); + $this->_pushInfoHtmlFreadHttpHeaderError($url); + $this->diedat = true; + return false; + } + + // {{{ HTTPコードをチェック + + $code = $h['code']; + + if ($code == '200') { + ; + } elseif ($code == '304') { + fclose($fp); + //$this->isonline = true; + return '304 Not Modified'; + } else { + fclose($fp); + return $this->_downloadDat2chMaruNotFound(); + } + + if (isset($h['headers']['Content-Encoding'])) { + if (preg_match("/^(x-)?gzip/", $h['headers']['Content-Encoding'], $matches)) { + $isGzip = true; + } + } - while (!p2_stream_eof($fp, $timed_out)) { - - if ($start_here) { - - if ($code == '200') { - - while (!p2_stream_eof($fp, $timed_out)) { - $body .= fread($fp, 4096); - } - - if ($timed_out) { - self::_pushInfoReadTimedOut($url); - $this->diedat = true; - fclose($fp); - return false; - } - - if ($is_gzip) { - $body = self::_decodeGzip($body, $url); - if ($body === null) { - $this->diedat = true; - fclose($fp); - return false; - } - } - - if (FileCtl::file_write_contents($this->keydat, $body) === false) { - p2die('cannot write file. downloadDat2chKako()'); - } - - // なかったと判断 - } else { + if ($code == '200') { + + while (!p2_stream_eof($fp, $timed_out)) { + $body .= fread($fp, 4096); + } + + if ($timed_out) { + self::_pushInfoReadTimedOut($url); + $this->diedat = true; + fclose($fp); + return false; + } + + if ($is_gzip) { + $body = self::_decodeGzip($body, $url); + if ($body === null) { + $this->diedat = true; fclose($fp); - return $this->_downloadDat2chKakoNotFound($uri, $ext); - - } - - } else { - $l = rtrim(fgets($fp, 128000), "\r\n"); - if (preg_match('@^HTTP/1\\.\\d (\\d+) (.+)@', $l, $matches)) { // ex) HTTP/1.1 304 Not Modified - $code = $matches[1]; - - if ($code == '200') { - ; - } elseif ($code == '304') { - fclose($fp); - //$this->isonline = true; - return '304 Not Modified'; - } else { - fclose($fp); - return $this->_downloadDat2chKakoNotFound($uri, $ext); - } - - } elseif (preg_match('/^Content-Encoding: (?:x-)?gzip/i', $l)) { - $is_gzip = true; - } elseif ($l === '') { - $start_here = true; + return false; } } - + + if (FileCtl::file_write_contents($this->keydat, $body) === false) { + p2die('cannot write file. downloadDat2chKako()'); + } + } else { + // なかったと判断 + fclose($fp); + return $this->_downloadDat2chKakoNotFound($uri, $ext); } + fclose($fp); //$this->isonline = true; return !$timed_out; diff --git a/lib/sb_print.inc.php b/lib/sb_print.inc.php index 137a06bd0..6a668b804 100644 --- a/lib/sb_print.inc.php +++ b/lib/sb_print.inc.php @@ -256,7 +256,7 @@ function sb_print($aThreadList) $row_class .= ' r_offline'; // JavaScriptでの確認ダイアログあり $unum_ht_c = <<- +- EOP; $row_class = ' nosubject'; @@ -265,13 +265,13 @@ function sb_print($aThreadList) $row_class .= ' r_new'; $midoku_ari = true; $unum_ht_c = <<{$aThread->unum} +{$aThread->unum} EOP; // subject.txtにはあるが、新着なし } else { $unum_ht_c = <<{$aThread->unum} +{$aThread->unum} EOP; } } From 9562e704597d01a3ebe5f560ba02b9e15ae2a7f2 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 17 Mar 2015 12:15:58 +0900 Subject: [PATCH 066/339] =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E9=A0=85=E7=9B=AE?= =?UTF-8?q?=E3=82=92=E5=A2=97=E3=82=84=E3=81=97=E3=81=9F=20Mango=E6=9D=BF?= =?UTF-8?q?=E3=81=AE=E3=82=B9=E3=83=AC=E3=83=83=E3=83=89=E3=82=BF=E3=82=A4?= =?UTF-8?q?=E3=83=88=E3=83=AB=E8=A3=85=E9=A3=BE=E3=81=8C=E5=8F=8D=E6=98=A0?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=9F=20http://anago.2ch.net/test/read.cgi/software/1425420?= =?UTF-8?q?543/769?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- conf/conf_user_def.inc.php | 16 ++++++++++++++++ lib/Thread.php | 2 ++ lib/ThreadRead.php | 5 +++-- lib/auth2chapi.inc.php | 7 ++++--- rep2/edit_conf_user.php | 3 +++ 6 files changed, 29 insertions(+), 6 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 5078177e0..0eef511cf 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150316.1120', // rep2のバージョン + 'p2version' => '150317.1200', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 0721d16fb..547fab700 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -411,6 +411,22 @@ // AppName $conf_user_def['2chapi_appname'] = ""; // ("") +// API認証で使用するUser-Agent +$conf_user_def['2chapi_ua.auth'] = "Monazilla/1.3"; // ("Monazilla/1.3") +$conf_user_sel['2chapi_ua.auth'] = array( + 'DOLIB/1.00' => '1 DOLIB/1.00', + 'Monazilla/1.3' => '2 Monazilla/1.3', + 'Monazilla/1.00 (%s)' => '3 Monazilla/1.00 (AppName)', + 'Mozilla/3.0 (compatible; %s)' => '4 Mozilla/3.0 (compatible; AppName)', +); + +//DAT取得で使用するUser-Agent +$conf_user_def['2chapi_ua.read'] = "Mozilla/3.0 (compatible; %s)"; // ("Monazilla/1.3") +$conf_user_sel['2chapi_ua.read'] = array( + 'Monazilla/1.00 (%s)' => '1 Monazilla/1.00 (AppName)', + 'Mozilla/3.0 (compatible; %s)' => '2 Mozilla/3.0 (compatible; AppName)', +); + // デバッグ用の情報を出力する $conf_user_def['2chapi_debug_print'] = 0; // (0) $conf_user_rad['2chapi_debug_print'] = array('1' => 'する', '0' => 'しない'); diff --git a/lib/Thread.php b/lib/Thread.php index de6838704..a24bb0ae8 100644 --- a/lib/Thread.php +++ b/lib/Thread.php @@ -197,6 +197,8 @@ public function getTtitleHd() if ($this->_ttitle_hd === null) { // HTML表示用に htmlspecialchars() したもの $this->_ttitle_hd = p2h($this->ttitle, false); + // [隔離病棟]などをデコード + $this->_ttitle_hd = str_replace('</mark>', '', str_replace('<mark>', '', $this->_ttitle_hd)); } return $this->_ttitle_hd; } diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 31f4e0fcf..485886280 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -137,6 +137,8 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { $AppKey = $_conf ['2chapi_appkey']; $AppName = $_conf ['2chapi_appname']; $HMKey = $_conf ['2chapi_hmkey']; + $ReadUA = sprintf($_conf['2chapi_ua.read'],$AppName); + if (! ($this->host && $this->bbs && $this->key)) { return false; } @@ -166,7 +168,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { $message = '/v1/' . $serverName [0] . '/' . $this->bbs . '/' . $this->key . $sid . $AppKey; $HB = hash_hmac ( "sha256", $message, $HMKey ); - $headers = "User-Agent: Mozilla/3.0 (compatible; ${AppName})\r\n"; + $headers = "User-Agent: ${ReadUA}\r\n"; $headers .= "Connection: close\r\n"; $headers .= "Content-Type: application/x-www-form-urlencoded\r\n"; @@ -233,7 +235,6 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { if ($code == '200' || $code == '206') { // Partial Content ; } elseif ($code == '302') { // Found - // ホストの移転を追跡 $new_host = BbsMap::getCurrentHost ( $this->host, $this->bbs ); if ($new_host != $this->host) { diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index 32390cf1c..764403200 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -18,7 +18,8 @@ function authenticate_2chapi() $CT = time(); $AppKey = $_conf['2chapi_appkey']; $AppName = $_conf['2chapi_appname']; - $HMKey = $_conf['2chapi_hmkey']; + $HMKey = $_conf['2chapi_hmkey']; + $AuthUA = sprintf($_conf['2chapi_ua.auth'],$AppName); $login2chID = ""; $login2chPW = ""; $message = $AppKey.$CT; @@ -44,7 +45,7 @@ function authenticate_2chapi() 'ignore_errors' => true, 'method' => 'POST', 'header' => implode("\r\n", array( - 'User-Agent: Monazilla/1.3', + 'User-Agent: '.$AuthUA, 'X-2ch-UA: '.$AppName, 'Content-Type: application/x-www-form-urlencoded', )), @@ -71,7 +72,7 @@ function authenticate_2chapi() if($_conf['2chapi_debug_print']==1) { - P2Util::pushInfoHtml($response); + P2Util::pushInfoHtml($response."
      ".$AuthUA); } if($sid[0]!='SESSION-ID=Monazilla/1.00') { diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index f8b9273d5..3a6d23839 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -382,6 +382,9 @@ array('2chapi_appkey','AppKey', P2_EDIT_CONF_USER_LONGTEXT), array('2chapi_hmkey','HMkey', P2_EDIT_CONF_USER_LONGTEXT), array('2chapi_appname','AppName APIに送信するアプリケーション名 例:Hoge/1.00'), + 'User-Agent', + array('2chapi_ua.auth','API認証で使用するUser-Agent'), + array('2chapi_ua.read','DAT取得で使用するUser-Agent'), 'デバッグ用', array('2chapi_debug_print','デバッグ用の情報を出力する'), '認証情報を変更した場合再認証してください', From 1055715828374cc81ed27339e62362634710bead Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 17 Mar 2015 23:53:59 +0900 Subject: [PATCH 067/339] =?UTF-8?q?dig2ch=E3=82=92=E4=BF=AE=E6=AD=A3=20htt?= =?UTF-8?q?p://anago.2ch.net/test/read.cgi/software/1425420543/704?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/expack/tgrep/view.inc.php | 1 + rep2/dig2ch.php | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/expack/tgrep/view.inc.php b/lib/expack/tgrep/view.inc.php index 25f23fb0a..8112cece5 100644 --- a/lib/expack/tgrep/view.inc.php +++ b/lib/expack/tgrep/view.inc.php @@ -183,6 +183,7 @@ function sf() { + diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php index 75c95fbff..56b2b537a 100644 --- a/rep2/dig2ch.php +++ b/rep2/dig2ch.php @@ -50,6 +50,7 @@ function dig2chsearch($query) } foreach ($jsontest1[result] as $jsontest2) { + $result['threads'][$n1] = new stdClass; $result['threads'][$n1]->title = $jsontest2[subject]; $result['threads'][$n1]->host = $jsontest2[server]; $result['threads'][$n1]->bbs = $jsontest2[bbs]; @@ -59,7 +60,7 @@ function dig2chsearch($query) $result['threads'][$n1]->dayres = $jsontest2[ikioi]; $n1++; } - $result['modified'] = $response['body']['date']; + $result['modified'] = isset($response['body']['date'])? $response['body']['date'] : ''; $result['profile']['regex'] = '/(' . $jsontest1[query] .')/i'; $result['profile']['hits'] = $jsontest1[found]; $result['profile']['cm0'] = str_replace("a href=" , "a target=\"_blank\" href=", $jsontest1[cm0]); From b808ad83a8ee82f991d752364a80401210cb3712 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 18 Mar 2015 00:44:48 +0900 Subject: [PATCH 068/339] =?UTF-8?q?=E6=B6=88=E3=81=97=E3=81=A6=E3=82=82?= =?UTF-8?q?=E5=AE=9F=E6=B3=81=E3=81=AB=E5=BD=B1=E9=9F=BF=E3=81=AA=E3=81=95?= =?UTF-8?q?=E3=81=9D=E3=81=86=E3=81=AA=E3=81=AE=E3=81=A7live/live=5FShowTh?= =?UTF-8?q?read.php=E3=82=92=E5=89=8A=E9=99=A4=20live=5Fread.php=E3=81=8B?= =?UTF-8?q?=E3=82=89=E5=AE=9F=E6=B3=81=E3=81=AB=E4=BD=BF=E3=82=8F=E3=81=AA?= =?UTF-8?q?=E3=81=84=E9=83=A8=E5=88=86=E3=82=92=E5=89=8A=E9=99=A4=20?= =?UTF-8?q?=E5=AE=9F=E6=B3=81=E3=83=A2=E3=83=BC=E3=83=89=E3=81=8B=E3=82=89?= =?UTF-8?q?=E3=81=AE=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=81=BF=E3=81=A7Cookie?= =?UTF-8?q?=E7=A2=BA=E8=AA=8D=E3=81=8C=E7=99=BA=E7=94=9F=E3=81=97=E3=81=9F?= =?UTF-8?q?=E5=A0=B4=E5=90=88=E5=AE=9F=E6=B3=81=E3=83=A2=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=81=AB=E6=88=BB=E3=82=8C=E3=81=AA=E3=81=84=E4=B8=8D=E5=85=B7?= =?UTF-8?q?=E5=90=88=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/live/live_ShowThread.php | 2050 -------------------------------- lib/live/live_ShowThreadPc.php | 1999 ------------------------------- rep2/live_read.php | 209 +--- rep2/post.php | 8 + 4 files changed, 11 insertions(+), 4255 deletions(-) delete mode 100755 lib/live/live_ShowThread.php delete mode 100755 lib/live/live_ShowThreadPc.php diff --git a/lib/live/live_ShowThread.php b/lib/live/live_ShowThread.php deleted file mode 100755 index 9d205aedb..000000000 --- a/lib/live/live_ShowThread.php +++ /dev/null @@ -1,2050 +0,0 @@ -(<[Aa][ ].+?>)(.*?)()) # リンク(PCREの特性上、必ずこのパターンを最初に試行する) -| -(?: - (?P # 引用 - ((?:>|>){1,2}[ ]?) # 引用符 - ( - (?:[1-9]\\d{0,3}) # 1つ目の番号 - (?: - (?:[ ]?(?:[,=]|、)[ ]?[1-9]\\d{0,3})+ # 連続 - | - -(?:[1-9]\\d{0,3})? # 範囲 - )? - ) - (?=\\D|$) - ) # 引用ここまで -| # PHP 5.3縛りにするなら、↓の\'のエスケープを外し、NOWDOCにする - (?P(ftp|h?t?tps?)://([0-9A-Za-z][\\w;/?:@=&$\\-_.+!*\'(),#%\\[\\]^~]+)) # URL - ([^\\s<>]*) # URLの直後、タグorホワイトスペースが現れるまでの文字列 -| - (?PID:[ ]?([0-9A-Za-z/.+]{8,11})(?=[^0-9A-Za-z/.+]|$)) # ID(8,10桁 +PC/携帯識別フラグ) -) -}x'; - - /** - * リダイレクタの種類 - * - * @var int - */ - const REDIRECTOR_NONE = 0; - const REDIRECTOR_IMENU = 1; - const REDIRECTOR_PINKTOWER = 2; - const REDIRECTOR_MACHIBBS = 3; - - /** - * NGあぼーんの種類 - * - * @var int - */ - const ABORN = -1; - const NG_NONE = 0; - const NG_NAME = 1; - const NG_MAIL = 2; - const NG_ID = 4; - const NG_MSG = 8; - const NG_FREQ = 16; - const NG_CHAIN = 32; - const NG_AA = 64; - - // }}} - // {{{ static properties - - /** - * まとめ読みモード時のスレッド数 - * - * @var int - */ - static private $_matome_count = 0; - - /** - * 本文以外がNGあぼーんにヒットした総数 - * - * @var int - */ - static protected $_ngaborns_head_hits = 0; - - /** - * 本文がNGあぼーんにヒットした総数 - * - * @var int - */ - static protected $_ngaborns_body_hits = 0; - - /** - * getAnchorRegex() のキャッシュ - * - * @var array - */ - static private $_anchorRegexes = array(); - - /** - * _getAnchorRegexParts() のキャッシュ - * - * @var array - */ - static private $_anchorRegexParts = null; - - // }}} - // {{{ properties - - /** - * まとめ読みモード時のスレッド番号 - * - * @var int - */ - protected $_matome; - - /** - * URLを処理する関数・メソッド名などを格納する配列 - * (組み込み) - * - * @var array - */ - protected $_url_handlers; - - /** - * URLを処理する関数・メソッド名などを格納する配列 - * (ユーザ定義、組み込みのものより優先) - * - * @var array - */ - protected $_user_url_handlers; - - /** - * 頻出IDをあぼーんする - * - * @var bool - */ - protected $_ngaborn_frequent; - - /** - * NG or あぼーんレスがあるかどうか - * - * @var bool - */ - protected $_has_ngaborns; - - /** - * あぼーんレス番号およびNGレス番号を格納する配列 - * array_intersect()を効率よく行うため、該当するレス番号は文字列にキャストして格納する - * - * @var array - */ - protected $_aborn_nums; - protected $_ng_nums; - - /** - * リダイレクタの種類 - * - * @var int - */ - protected $_redirector; - - /** - * スレッドオブジェクト - * - * @var ThreadRead - */ - public $thread; - - /** - * アクティブモナー・オブジェクト - * - * @var ActiveMona - */ - public $activeMona; - - /** - * アクティブモナーが有効か否か - * - * @var bool - */ - public $am_enabled = false; - - /** - * 引用しているレス番号を登録した配列 - * - * @var array - */ - protected $_quote_res_nums; - - - /** - * 引用チェック済みレス番号の配列 - * - * @var array - */ - protected $_quote_res_nums_checked; - - /** - * 引用変換済みレス番号の配列 - * - * @var array - */ - protected $_quote_res_nums_done; - - /** - * レス番号チェックの再帰の深さ - * - * @var int - */ - private $_quote_check_depth; - - /** - * デフォルトの名前 - * - * @var string - */ - protected $_nanashiName = null; - - /** - * 被アンカーを集計した配列(範囲アンカー含む) // [被参照レス番 : [参照レス番, ...], ...) - * - * @var array - */ - protected $_quote_from = null; - - /** - * アンカーを集計した配列(範囲アンカー除く) // [レス番 : [参照先レス番, ...], ...) - * - * @var array - */ - protected $_quote_to = null; - - /** - * お気に自動ランク - * - * @var bool - */ - private $_auto_fav_rank = false; - - /** - * リンクするサムネイルを生成するクラスのインスタンス - * - * @var ImageCache2_Thumbnailer - */ - public $thumbnailer; - - /** - * インライン表示するサムネイルを生成するクラスのインスタンス - * - * @var ImageCache2_Thumbnailer - */ - public $inline_prvw; - - /** - * インラインサムネイルのID属性接尾辞 - * - * @var string - */ - public $thumb_id_suffix; - - /** - * 画像に付加するメモ - * - * @var string - */ - public $img_memo; - - /** - * 画像にメモを付けるためのクエリ文字列 - * - * @var string - */ - public $img_memo_query; - - /** - * 画像解像度 - * - * @var float - */ - public $img_dpr = 1.0; - - /** - * 画像解像度を指定するクエリ文字列 - * - * @var string - */ - public $img_dpr_query; - - // }}} - // {{{ constructor - - /** - * コンストラクタ - */ - protected function __construct(ThreadRead $aThread, $matome = false) - { - global $_conf; - - // スレッドオブジェクトを登録 - $this->thread = $aThread; - $this->str_to_link_regex = $this->_buildStrToLinkRegex(); - - // まとめ読みモードか否か - if ($matome) { - $this->_matome = ++self::$_matome_count; - } else { - $this->_matome = false; - } - - $this->_url_handlers = array(); - $this->_user_url_handlers = array(); - - $this->_ngaborn_frequent = 0; - if ($_conf['ngaborn_frequent']) { - if ($_conf['ngaborn_frequent_dayres'] == 0) { - $this->_ngaborn_frequent = $_conf['ngaborn_frequent']; - } elseif ($this->thread->setDayRes() && $this->thread->dayres < $_conf['ngaborn_frequent_dayres']) { - $this->_ngaborn_frequent = $_conf['ngaborn_frequent']; - } - } - - $this->_has_ngaborns = false; - $this->_aborn_nums = array(); - $this->_ng_nums = array(); - - if (P2Util::isHostBbsPink($this->thread->host)) { - $this->_redirector = self::REDIRECTOR_PINKTOWER; - } elseif (P2Util::isHost2chs($this->thread->host)) { - $this->_redirector = self::REDIRECTOR_IMENU; - } elseif (P2Util::isHostMachiBbs($this->thread->host)) { - $this->_redirector = self::REDIRECTOR_MACHIBBS; - } else { - $this->_redirector = self::REDIRECTOR_NONE; - } - - $this->_quote_res_nums = array(); - $this->_quote_res_nums_checked = array(); - $this->_quote_res_nums_done = array(); - } - - // }}} - - /** - * @param void - * @return void - */ - protected function setBbsNonameName() - { - $st = new SettingTxt($this->thread->host, $this->thread->bbs); - $st->setSettingArray(); - if (array_key_exists('BBS_NONAME_NAME', $st->setting_array)) { - $BBS_NONAME_NAME = $st->setting_array['BBS_NONAME_NAME']; - if (strlen($BBS_NONAME_NAME)) { - $this->_nanashiName = $BBS_NONAME_NAME; - } - } - } - - // {{{ getDatToHtml() - - /** - * DatをHTML変換したものを取得する - * - * @param bool $is_fragment - * @return bool|string - */ - public function getDatToHtml($is_fragment = false) - { - return $this->datToHtml(true, $is_fragment); - } - public function getDatToHtml_resFrom($is_fragment = false) - { - return $this->datToHtml_resFrom(true, $is_fragment); - } - - // }}} - // {{{ datToHtml() - - /** - * DatをHTMLに変換して表示する - * - * @param bool $capture trueなら変換結果を出力せずに返す - * @param bool $is_fragment trueなら
      で囲まない - * @return bool|string - */ - public function datToHtml($capture = false, $is_fragment = false) - { - global $_conf, $filter_hits, $last_hit_resnum; - - $aThread = $this->thread; - - // 表示レス範囲が指定されていなければ - if (!$aThread->resrange) { - $error = '

      p2 error: {$this->resrange} is false at datToHtml()

      '; - if ($capture) { - return $error; - } else { - echo $error; - return false; - } - } - - $start = $aThread->resrange['start']; - $to = $aThread->resrange['to']; - $nofirst = $aThread->resrange['nofirst']; - - $is_ktai = $_conf['ktai']; - $resFilter = ResFilter::getFilter(); - if ($resFilter && $resFilter->hasWord()) { - $do_filtering = true; - $nofirst = true; - } else { - $do_filtering = false; - } - - $datlines = $aThread->datlines; - $count = count($datlines); - - $buf['body'] = $is_fragment ? '' : "
      \n"; - $buf['q'] = ''; - - // まず 1 を表示 - if (!$nofirst) { - $res = $this->transRes($datlines[0], 1); - if (is_array($res)) { - $buf['body'] .= $res['body']; - $buf['q'] .= $res['q'] ? $res['q'] : ''; - } else { - $buf['body'] .= $res; - } - } - - // 連鎖のため、範囲外のNGあぼーんチェック - if ($_conf['ngaborn_chain_all'] && empty($_GET['nong'])) { - $pre = min($count, $start); - for ($i = ($nofirst) ? 0 : 1; $i < $pre; $i++) { - $n = $i + 1; - list($name, $mail, $date_id, $msg) = $aThread->explodeDatLine($datlines[$i]); - if (($id = $aThread->ids[$n]) !== null) { - $date_id = str_replace($aThread->idp[$n] . $id, "ID:$id", $date_id); - } - $this->_ngAbornCheck($n, strip_tags($name), $mail, $date_id, $id, $msg); - } - } - - // フィルタリング - if ($do_filtering) { - $datlines = $resFilter->apply($this); - $filter_hits = $resFilter->hits; - $last_hit_resnum = $resFilter->last_hit_resnum; - } - - // 指定範囲を表示 - $i = 0; - $n = 0; - $rn = 0; - - if ($do_filtering) { - if (!empty($resFilter->range)) { - $start = $resFilter->range['start']; - $to = $resFilter->range['to']; - } - $pattern = $resFilter->getPattern(); - } else { - $pattern = null; - } - - foreach ($datlines as $i => $ares) { - if ($ares === null) { - continue; - } - $n++; - if ($i === 0 && !$nofirst) { - continue; - } - if ($n < $start) { - continue; - } - if ($n > $to) { - break; - } - $rn = $i + 1; - $res = $this->transRes($ares, $rn, $pattern); - if (is_array($res)) { - $buf['body'] .= $res['body']; - $buf['q'] .= $res['q'] ? $res['q'] : ''; - } else { - $buf['body'] .= $res; - } - if (!$capture && $n % 10 == 0) { - echo $buf['body']; - if ($do_filtering && !$is_ktai) { - echo "\n"; - } - flush(); - $buf['body'] = ''; - } - } - - if ($this->thread->readnum < $rn) { - $this->thread->readnum = $rn; - } - - if ($do_filtering && !$is_ktai) { - $buf['body'] .= "\n"; - } - -// +live オートリロードされるスレ内容の表示部 -echo <<
      \n -LIVE; - - if (!$is_fragment) { - $buf['body'] .= "
      \n"; - } - - if ($capture) { - return $buf['body'] . $buf['q']; - } else { - echo $buf['body']; - echo $buf['q']; - flush(); - return true; - } - } - - /** - * 指定の書込みへのレスをHTMLに変換して表示する - * - * @param bool $capture trueなら変換結果を出力せずに返す - * @param bool $is_fragment trueなら
      で囲まない - * @param bool $show_rootres trueなら指定の書込みも結果に含める - * @return bool|string - */ - public function datToHtml_resFrom($capture = false, $is_fragment = false, $show_rootres = false) - { - global $_conf; - - $aThread = $this->thread; - - // 表示レスが指定されていなければ - $target = $aThread->resrange['start']; - if (!$aThread->resrange || $target != $aThread->resrange['to']) { - $error = '

      p2 error: {$this->resrange} is false at datToHtml()

      '; - if ($capture) { - return $error; - } else { - echo $error; - return false; - } - } - - $datlines = $aThread->datlines; - $count = count($datlines); - - $buf['body'] = $is_fragment ? '' : "
      \n"; - $buf['q'] = ''; - - // 連鎖のため、範囲外のNGあぼーんチェック - if ($_conf['ngaborn_chain_all'] && empty($_GET['nong'])) { - $pre = min($count, $start); - for ($i = ($nofirst) ? 0 : 1; $i < $pre; $i++) { - $n = $i + 1; - list($name, $mail, $date_id, $msg) = $aThread->explodeDatLine($datlines[$i]); - if (($id = $aThread->ids[$n]) !== null) { - $date_id = str_replace($aThread->idp[$n] . $id, "ID:$id", $date_id); - } - $this->_ngAbornCheck($n, strip_tags($name), $mail, $date_id, $id, $msg); - } - } - - // レス展開 - $datlines = array_fill(0, count($aThread->datlines), null); - if ($show_rootres) { - $datlines[$target - 1] = $aThread->datlines[$target - 1]; - } - list($name, $mail, $date_id, $msg) = - $aThread->explodeDatLine($aThread->datlines[$target - 1]); - foreach ($this->checkQuoteResNums($target, $name, $msg, false, true, false) as $rn) { - $ri = $rn - 1; - if ($datlines[$ri] === null) { - $datlines[$ri] = $aThread->datlines[$ri]; - } - } - - // 表示 - $i = 0; - $n = 0; - $rn = 0; - foreach ($datlines as $i => $ares) { - if ($ares === null) { - continue; - } - $n++; - $rn = $i + 1; - $res = $this->transRes($ares, $rn); - if (is_array($res)) { - $buf['body'] .= $res['body']; - $buf['q'] .= $res['q'] ? $res['q'] : ''; - } else { - $buf['body'] .= $res; - } - if (!$capture && $n % 10 == 0) { - echo $buf['body']; - flush(); - $buf['body'] = ''; - } - } - - if (!$is_fragment) { - $buf['body'] .= "
      \n"; - } - - if ($capture) { - return $buf['body'] . $buf['q']; - } else { - echo $buf['body']; - echo $buf['q']; - flush(); - return true; - } - } - - // }}} - // {{{ transRes() - - /** - * DatレスをHTMLレスに変換する - * - * @param string $ares datの1ライン - * @param int $i レス番号 - * @return string - */ - abstract public function transRes($ares, $i); - - // }}} - // {{{ transName() - - /** - * 名前をHTML用に変換する - * - * @param string $name 名前 - * @return string - */ - abstract public function transName($name); - - // }}} - // {{{ transMsg() - - /** - * datのレスメッセージをHTML表示用メッセージに変換する - * - * @param string $msg メッセージ - * @param int $mynum レス番号 - * @return string - */ - abstract public function transMsg($msg, $mynum); - - // }}} - // {{{ replaceBeId() - - /** - * BEプロファイルリンク変換 - */ - public function replaceBeId($date_id, $i) - { - global $_conf; - - $beid_replace = "thread->host}/test/read.cgi/{$this->thread->bbs}/{$this->thread->key}/{$i}\"{$_conf['ext_win_target_at']}>Lv.\$2"; - - // - $be_match = '||i'; - if (preg_match($be_match, $date_id)) { - $date_id = preg_replace($be_match, $beid_replace, $date_id); - - } else { - - $beid_replace = "thread->host}/test/read.cgi/{$this->thread->bbs}/{$this->thread->key}/{$i}\"{$_conf['ext_win_target_at']}>?\$2"; - $date_id = preg_replace('|BE: ?(\d+)-(#*)|i', $beid_replace, $date_id); - } - - return $date_id; - } - - // }}} - // {{{ _ngAbornCheck() - - /** - * NGあぼーんチェック - * - * @param int $i レス番号 - * @param string $name 名前欄 - * @param string $mail メール欄 - * @param string $date_id 日付・ID欄 - * @param string $id ID - * @param string $msg レス本文 - * @param bool $nong NGチェックをするかどうか - * @param array &$info NGの理由が格納される変数の参照 - * @return int NGタイプ。ShowThread::NG_XXX のビット和か ShowThread::ABORN - */ - protected function _ngAbornCheck($i, $name, $mail, $date_id, $id, $msg, $nong = false, &$info = null) - { - global $_conf, $ngaborns_hits; - - $info = array(); - $type = self::NG_NONE; - - // {{{ 頻出IDチェック - - if ($this->_ngaborn_frequent && $id && $this->thread->idcount[$id] >= $_conf['ngaborn_frequent_num']) { - if (!$_conf['ngaborn_frequent_one'] && $id == $this->thread->ids[1]) { - // >>1 はそのまま表示 - } elseif ($this->_ngaborn_frequent == 1) { - $ngaborns_hits['aborn_freq']++; - return $this->_markNgAborn($i, self::ABORN, false); - } elseif (!$nong) { - $ngaborns_hits['ng_freq']++; - $type |= $this->_markNgAborn($i, self::NG_FREQ, false); - $info[] = sprintf('頻出ID:%s(%d)', $id, $this->thread->idcount[$id]); - } - } - - // }}} - // {{{ 連鎖チェック - - if ($_conf['ngaborn_chain'] && $this->_has_ngaborns && - preg_match_all('/(?:>|>)([1-9][0-9\\-,]*)/', $msg, $matches) - ) { - $references = array_unique(preg_split('/[-,]+/', - trim(implode(',', $matches[1]), '-,'), - -1, - PREG_SPLIT_NO_EMPTY)); - $intersections = array_intersect($references, $this->_aborn_nums); - $info_suffix = ''; - - if ($intersections) { - if ($_conf['ngaborn_chain'] == 1) { - $ngaborns_hits['aborn_chain']++; - return $this->_markNgAborn($i, self::ABORN, true); - } - if ($nong) { - $intersections = null; - } else { - $info_suffix = '(' . (($_conf['ktai']) ? 'アボン' : 'あぼーん') . ')'; - } - } elseif (!$nong) { - $intersections = array_intersect($references, $this->_ng_nums); - } - - if ($intersections) { - $ngaborns_hits['ng_chain']++; - $type |= $this->_markNgAborn($i, self::NG_CHAIN, true); - $info[] = sprintf('連鎖NG:>>%d%s', current($intersections), $info_suffix); - } - } - - // }}} - // {{{ あぼーんチェック - - // あぼーんレス - if ($this->abornResCheck($i) !== false) { - $ngaborns_hits['aborn_res']++; - return $this->_markNgAborn($i, self::ABORN, false); - } - - // あぼーんネーム - if ($this->ngAbornCheck('aborn_name', $name) !== false) { - $ngaborns_hits['aborn_name']++; - return $this->_markNgAborn($i, self::ABORN, false); - } - - // あぼーんメール - if ($this->ngAbornCheck('aborn_mail', $mail) !== false) { - $ngaborns_hits['aborn_mail']++; - return $this->_markNgAborn($i, self::ABORN, false); - } - - // あぼーんID - if ($this->ngAbornCheck('aborn_id', $date_id) !== false) { - $ngaborns_hits['aborn_id']++; - return $this->_markNgAborn($i, self::ABORN, false); - } - - // あぼーんメッセージ - if ($this->ngAbornCheck('aborn_msg', $msg) !== false) { - $ngaborns_hits['aborn_msg']++; - return $this->_markNgAborn($i, self::ABORN, true); - } - - // }}} - - if ($nong) { - return $type; - } - - // {{{ NGチェック - - // NGネームチェック - if ($this->ngAbornCheck('ng_name', $name) !== false) { - $ngaborns_hits['ng_name']++; - $type |= $this->_markNgAborn($i, self::NG_NAME, false); - } - - // NGメールチェック - if ($this->ngAbornCheck('ng_mail', $mail) !== false) { - $ngaborns_hits['ng_mail']++; - $type |= $this->_markNgAborn($i, self::NG_MAIL, false); - } - - // NGIDチェック - if ($this->ngAbornCheck('ng_id', $date_id) !== false) { - $ngaborns_hits['ng_id']++; - $type |= $this->_markNgAborn($i, self::NG_ID, false); - } - - // NGメッセージチェック - $a_ng_msg = $this->ngAbornCheck('ng_msg', $msg); - if ($a_ng_msg !== false) { - $ngaborns_hits['ng_msg']++; - $type |= $this->_markNgAborn($i, self::NG_MSG, true); - $info[] = sprintf('NG%s:%s', - ($_conf['ktai']) ? 'ワード' : 'ワード', - p2h($a_ng_msg)); - } - - // }}} - - return $type; - } - - // }}} - // {{{ _markNgAborn() - - /** - * NGあぼーんにヒットしたレス番号を記録する - * - * @param int $num レス番号 - * @param int $type NGあぼーんの種類 - * @param bool $isBody 本文にヒットしたかどうか - * @return int $typeと同じ値 - */ - protected function _markNgAborn($num, $type, $isBody) - { - if ($type) { - if ($isBody) { - self::$_ngaborns_body_hits++; - } else { - self::$_ngaborns_head_hits++; - } - - // array_intersect()を効率よく行うため、レス番号を文字列型にキャストする - $str = (string)$num; - if ($type == self::ABORN) { - $this->_aborn_nums[$num] = $str; - } else { - $this->_ng_nums[$num] = $str; - } - - $this->_has_ngaborns = true; - } - - return $type; - } - - // }}} - // {{{ ngAbornCheck() - - /** - * NGあぼーんチェック - */ - public function ngAbornCheck($code, $resfield, $ic = false) - { - global $ngaborns; - - //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection('ngAbornCheck()'); - - if (isset($ngaborns[$code]['data']) && is_array($ngaborns[$code]['data'])) { - // +Wiki:BEあぼーん - if ($code == 'aborn_be' || $code == 'ng_be') { - // プロフィールIDを抜き出す - if (preg_match('/BE:(\\d+)/', $resfield, $matches)) { - $beId = P2UtilWiki::calcBeId((int)$matches[1]); - if ($beId === 0) { - return false; - } - $resfield = (string)$beId; - } else { - return false; - } - } - - $bbs = $this->thread->bbs; - $title = $this->thread->ttitle_hc; - - foreach ($ngaborns[$code]['data'] as $k => $v) { - // 板チェック - if (isset($v['bbs']) && in_array($bbs, $v['bbs']) == false) { - continue; - } - - // タイトルチェック - if (isset($v['title']) && stripos($title, $v['title']) === false) { - continue; - } - - // ワードチェック - // 正規表現 - if ($v['regex']) { - $re_method = $v['regex']; - /*if ($re_method($v['word'], $resfield, $matches)) { - $this->ngAbornUpdate($code, $k); - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); - return p2h($matches[0]); - }*/ - if ($re_method($v['word'], $resfield)) { - $this->ngAbornUpdate($code, $k); - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); - return $v['cond']; - } - // +Wiki:BEあぼーん(完全一致) - } elseif ($code == 'aborn_be' || $code == 'ng_be') { - if ($resfield == $v['word']) { - $this->ngAbornUpdate($code, $k); - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); - return $v['cond']; - } - // 大文字小文字を無視 - } elseif ($ic || $v['ignorecase']) { - if (stripos($resfield, $v['word']) !== false) { - $this->ngAbornUpdate($code, $k); - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); - return $v['cond']; - } - // 単純に文字列が含まれるかどうかをチェック - } else { - if (strpos($resfield, $v['word']) !== false) { - $this->ngAbornUpdate($code, $k); - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); - return $v['cond']; - } - } - } - } - - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); - return false; - } - - // }}} - // {{{ abornResCheck() - - /** - * 特定レスの透明あぼーんチェック - */ - public function abornResCheck($resnum) - { - global $ngaborns; - - $target = $this->thread->host . '/' . $this->thread->bbs . '/' . $this->thread->key . '/' . $resnum; - - if (isset($ngaborns['aborn_res']['data']) && is_array($ngaborns['aborn_res']['data'])) { - foreach ($ngaborns['aborn_res']['data'] as $k => $v) { - if ($ngaborns['aborn_res']['data'][$k]['word'] == $target) { - $this->ngAbornUpdate('aborn_res', $k); - return true; - } - } - } - return false; - } - - // }}} - // {{{ ngAbornUpdate() - - /** - * NG/あぼ〜ん日時と回数を更新 - */ - public function ngAbornUpdate($code, $k) - { - global $ngaborns; - - if (isset($ngaborns[$code]['data'][$k])) { - $ngaborns[$code]['data'][$k]['lasttime'] = date('Y/m/d G:i'); // HIT時間を更新 - if (empty($ngaborns[$code]['data'][$k]['hits'])) { - $ngaborns[$code]['data'][$k]['hits'] = 1; // 初HIT - } else { - $ngaborns[$code]['data'][$k]['hits']++; // HIT回数を更新 - } - } - } - - // }}} - // {{{ addURLHandler() - - /** - * ユーザ定義URLハンドラ(メッセージ中のURLを書き換える関数)を追加する - * - * ハンドラは最初に追加されたものから順番に試行される - * URLはハンドラの返り値(文字列)で置換される - * falseを帰した場合は次のハンドラに処理が委ねられる - * - * ユーザ定義URLハンドラの引数は - * 1. string $url URL - * 2. array $purl URLをparse_url()したもの - * 3. string $str パターンにマッチした文字列、URLと同じことが多い - * 4. object $aShowThread 呼び出し元のオブジェクト - * である - * 常にfalseを返し、内部で処理するだけの関数を登録してもよい - * - * @param callback $function コールバックメソッド - * @return void - * @access public - * @todo ユーザ定義URLハンドラのオートロード機能を実装 - */ - public function addURLHandler($function) - { - $this->_user_url_handlers[] = $function; - } - - // }}} - // {{{ stripLineBreaks() - - /** - * 文末の改行と連続する改行を取り除く - * - * @param string $msg - * @param string $replacement - * @return string - */ - public function stripLineBreaks($msg, $replacement = '

      ') - { - if (P2_MBREGEX_AVAILABLE) { - $msg = mb_ereg_replace('(?:[\\s ]*
      )+[\\s ]*$', '', $msg); - $msg = mb_ereg_replace('(?:[\\s ]*
      ){3,}', $replacement, $msg); - } else { - mb_convert_variables('UTF-8', 'CP932', $msg, $replacement); - $msg = preg_replace('/(?:[\\s\\x{3000}]*
      )+[\\s\\x{3000}]*$/u', '', $msg); - $msg = preg_replace('/(?:[\\s\\x{3000}]*
      ){3,}/u', $replacement, $msg); - $msg = mb_convert_encoding($msg, 'CP932', 'UTF-8'); - } - - return $msg; - } - - // }}} - // {{{ transLink() - - /** - * リンク対象文字列を変換する - * - * @param string $str - * @return string - */ - public function transLink($str) - { - return preg_replace_callback($this->str_to_link_regex, array($this, 'transLinkDo'), $str); - } - - // }}} - // {{{ transLinkDo() - - /** - * リンク対象文字列の種類を判定して対応した関数/メソッドに渡す - * - * @param array $s - * @return string - */ - public function transLinkDo(array $s) - { - global $_conf; - - $orig = $s[0]; - $following = ''; - - // PHP 5.2.7 未満の preg_replace_callback() では名前付き捕獲式集合が使えないので - /* - if (!array_key_exists('link', $s)) { - $s['link'] = $s[1]; - $s['quote'] = $s[5]; - $s['url'] = $s[8]; - $s['id'] = $s[11]; - } - */ - - // マッチしたサブパターンに応じて分岐 - // リンク - if ($s['link']) { - if (preg_match('{ href=(["\'])?(.+?)(?(1)\\1)(?=[ >])}i', $s[2], $m)) { - $url = $m[2]; - $str = $s[3]; - } else { - return $s[3]; - } - - // 引用 - } elseif ($s['quote']) { - return preg_replace_callback( - self::getAnchorRegex('/(%prefix%)?(%a_range%)/'), - array($this, '_quoteResCallback'), $s['quote']); - - // http or ftp のURL - } elseif ($s['url']) { - if ($_conf['ktai'] && $s[9] == 'ftp') { - return $orig; - } - $url = preg_replace('/^t?(tps?)$/', 'ht$1', $s[9]) . '://' . $s[10]; - $str = $s['url']; - $following = $s[11]; - if (strlen($following) > 0) { - // ウィキペディア日本語版のURLで、SJISの2バイト文字の上位バイト - // (0x81-0x9F,0xE0-0xEF)が続くとき - if (P2Util::isUrlWikipediaJa($url)) { - $leading = ord($following); - if ((($leading ^ 0x90) < 32 && $leading != 0x80) || ($leading ^ 0xE0) < 16) { - $url .= rawurlencode(mb_convert_encoding($following, 'UTF-8', 'CP932')); - $str .= $following; - $following = ''; - } - } elseif (strpos($following, 'tp://') !== false) { - // 全角スペース+URL等の場合があるので再チェック - $following = $this->transLink($following); - } - } - - // ID - } elseif ($s['id'] && $_conf['flex_idpopup']) { // && $_conf['flex_idlink_k'] - return $this->idFilter($s['id'], $s[12]); - - // その他(予備) - } else { - return strip_tags($orig); - } - - // リダイレクタを外す - switch ($this->_redirector) { - case self::REDIRECTOR_IMENU: - $url = preg_replace('{^([a-z]+://)ime\\.nu/}', '$1', $url); - break; - case self::REDIRECTOR_PINKTOWER: - $url = preg_replace('{^([a-z]+://)pinktower\\.com/}', '$1', $url); - break; - case self::REDIRECTOR_MACHIBBS: - $url = preg_replace('{^[a-z]+://machi(?:bbs\\.com|\\.to)/bbs/link\\.cgi\\?URL=}', '', $url); - break; - } - - // エスケープされていない特殊文字をエスケープ - $url = p2h($url, false); - $str = p2h($str, false); - // 実態参照・数値参照を完全にデコードしようとすると負荷が大きいし、 - // "&"以外の特殊文字はほとんどの場合URLエンコードされているはずなので - // 中途半端に凝った処理はせず、"&"→"&"のみ再変換する。 - $raw_url = str_replace('&', '&', $url); - - // URLをパース・ホストを検証 - $purl = @parse_url($raw_url); - if (!$purl || !array_key_exists('host', $purl) || - strpos($purl['host'], '.') === false || - $purl['host'] == '127.0.0.1' || - //HostCheck::isAddressLocal($purl['host']) || - //HostCheck::isAddressPrivate($purl['host']) || - P2Util::isHostExample($purl['host'])) - { - return $orig; - } - // URLのマッチングで"&"を考慮しなくて済むように、生のURLを登録しておく - $purl[0] = $raw_url; - - // URLを処理 - foreach ($this->_user_url_handlers as $handler) { - if (false !== ($link = call_user_func($handler, $url, $purl, $str, $this))) { - return $link . $following; - } - } - foreach ($this->_url_handlers as $handler) { - if (false !== ($link = $this->$handler($url, $purl, $str))) { - return $link . $following; - } - } - - return $orig; - } - - // }}} - // {{{ idFilter() - - /** - * IDフィルタリング変換 - * - * @param string $idstr ID:xxxxxxxxxx - * @param string $id xxxxxxxxxx - * @return string - */ - abstract public function idFilter($idstr, $id); - - // }}} - // {{{ _idFilterCallback() - - /** - * IDフィルタリング変換 - * - * @param array $s 正規表現にマッチした要素の配列 - * @return string - */ - protected function _idFilterCallback(array $s) - { - return $this->idFilter($s[0], $s[1]); - } - - // }}} - // {{{ _quoteNameCallback() - - /** - * @param array $s - * @return string HTML - */ - protected function _quoteNameCallback($s) - { - return preg_replace_callback( - self::getAnchorRegex('/(%prefix%)?(%a_num%)/'), - array($this, '_quoteResCallback'), $s[0] - ); - } - - // }}} - // {{{ quoteRes() - - /** - * 引用変換(単独) - * - * @param string $full >>1 - * @param string $qsign >> - * @param string $appointed_num 1 - * @return string - */ - abstract public function quoteRes($full, $qsign, $appointed_num); - - // }}} - // {{{ _quoteResCallback() - - /** - * 引用変換(単独) - * - * @param array $s 正規表現にマッチした要素の配列 - * @return string - */ - protected function _quoteResCallback(array $s) - { - return $this->quoteRes($s[0], $s[1], $s[2]); - } - - // }}} - // {{{ quoteResRange() - - /** - * 引用変換(範囲) - * - * @param string $full >>1-100 - * @param string $qsign >> - * @param string $appointed_num 1-100 - * @return string - */ - abstract public function quoteResRange($full, $qsign, $appointed_num); - - // }}} - // {{{ _quoteResRangeCallback() - - /** - * 引用変換(範囲) - * - * @param array $s 正規表現にマッチした要素の配列 - * @return string - */ - protected function _quoteResRangeCallback(array $s) - { - return $this->quoteResRange($s[0], $s[1], $s[2]); - } - - // }}} - // {{{ checkQuoteResNums() - - /** - * HTMLメッセージ中の引用レスの番号を再帰チェックする - */ - public function checkQuoteResNums($res_num, $name, $msg, - $with_quotes = true, - $with_backlinks = null, - $cascade = true) - { - global $_conf; - - $this->_quote_check_depth = 0; - - if ($with_backlinks === null) { - $with_backlinks = ($_conf['backlink_list'] > 0 || $_conf['backlink_block'] > 0) ? true : false; - } - - if ($with_backlinks) { - return $this->checkQuoteResNumsFromSummary( - $res_num == 0 ? 1 : $res_num, $with_quotes, $with_backlinks); - } - - return $this->_checkQuoteResNums($res_num, $name, $msg); - } - - // }}} - // {{{ _checkQuoteResNums() - - /** - * HTMLメッセージ中の引用レスの番号を再帰チェックする - */ - protected function _checkQuoteResNums($res_num, $name, $msg) - { - // 再帰リミッタ - if ($this->_quote_check_depth > 30) { - return array(); - } else { - $this->_quote_check_depth++; - } - - if (array_key_exists($res_num, $this->_quote_res_nums)) { - return $this->_quote_res_nums[$res_num]; - } - - $aThread = $this->thread; - - $quote_res_nums = array(); - - $name = preg_replace('/(◆.*)/', '', $name, 1); - - // 名前 - if ($matches = $this->getQuoteResNumsName($name)) { - foreach ($matches as $a_quote_res_num) { - if ($a_quote_res_num) { - $quote_res_nums[] = $a_quote_res_num; - $a_quote_res_idx = $a_quote_res_num - 1; - - // 自分自身の番号と同一でなければ、 - if ($a_quote_res_num != $res_num) { - // チェックしていない番号を再帰チェック - if (!isset($this->_quote_res_nums_checked[$a_quote_res_num])) { - $this->_quote_res_nums_checked[$a_quote_res_num] = true; - if (isset($aThread->datlines[$a_quote_res_idx])) { - $datalinear = $aThread->explodeDatLine($aThread->datlines[$a_quote_res_idx]); - $quote_name = $datalinear[0]; - $quote_msg = $aThread->datlines[$a_quote_res_idx]; - $quote_res_nums = array_merge($quote_res_nums, - $this->_checkQuoteResNums($a_quote_res_num, - $quote_name, - $quote_msg)); - } - } - } - } - // $name=preg_replace("/([0-9]+)/", "", $name, 1); - } - } - - // >>1のリンクをいったん外す - // >>1 - $msg = preg_replace('{<[Aa] .+?>(>>[1-9][\\d\\-]*)}', '$1', $msg); - - //echo $msg; - if (preg_match_all(self::getAnchorRegex('/%full%/'), $msg, $out, PREG_PATTERN_ORDER)) { - foreach ($out[2] as $numberq) { - if ($matches=preg_split(self::getAnchorRegex('/%delimiter%/'), $numberq)) { - foreach ($matches as $a_quote_res_num) { - if (preg_match(self::getAnchorRegex('/%range_delimiter%/'),$a_quote_res_num)) { continue;} - $a_quote_res_num = (int) (mb_convert_kana($a_quote_res_num, 'n')); - $a_quote_res_idx = $a_quote_res_num - 1; - - //echo $a_quote_res_num; - - if (!$a_quote_res_num) {break;} - $quote_res_nums[] = $a_quote_res_num; - - // 自分自身の番号と同一でなければ、 - if ($a_quote_res_num != $res_num) { - // チェックしていない番号を再帰チェック - if (!isset($this->_quote_res_nums_checked[$a_quote_res_num])) { - $this->_quote_res_nums_checked[$a_quote_res_num] = true; - if (isset($aThread->datlines[$a_quote_res_idx])) { - $datalinear = $aThread->explodeDatLine($aThread->datlines[$a_quote_res_idx]); - $quote_name = $datalinear[0]; - $quote_msg = $aThread->datlines[$a_quote_res_idx]; - $quote_res_nums = array_merge($quote_res_nums, - $this->_checkQuoteResNums($a_quote_res_num, - $quote_name, - $quote_msg)); - } - } - } - - } - - } - - } - - } - - if (count($quote_res_nums)) { - sort($quote_res_nums, SORT_NUMERIC); - $this->_quote_res_nums[$res_num] = array_unique($quote_res_nums); - $quote_res_nums = $this->_quote_res_nums[$res_num]; - } - - return $quote_res_nums; - } - - // }}} - // {{{ checkQuoteResNumsFromSummary() - - /** - * 引用レス集計結果からポップアップ用に用意すべき番号を再帰チェックする - */ - public function checkQuoteResNumsFromSummary($res_num, $with_quotes, $with_backlinks) - { - // 再帰リミッタ - if ($this->_quote_check_depth > 3000) { - return array(); - } else { - $this->_quote_check_depth++; - } - - $ret = array(); - - // 参照レス - if ($with_quotes) { - $ret = array_merge($ret, - $this->_checkQuoteResNumsFromSummary( - $res_num, $this->getQuoteTo(), $with_quotes, $with_backlinks)); - } - // 被参照レス - if ($with_backlinks) { - $ret = array_merge($ret, - $this->_checkQuoteResNumsFromSummary( - $res_num, $this->getQuoteFrom(), $with_quotes, $with_backlinks)); - } - return $ret; - } - - // }}} - // {{{ _checkQuoteResNumsFromSummary() - - protected function _checkQuoteResNumsFromSummary($res_num, $quotes, $with_quotes, $with_backlinks) - { - $ret = array(); - if (array_key_exists($res_num, $quotes)) { - foreach ($quotes[$res_num] as $quote_num) { - $ret[] = $quote_num; - if ($quote_num != $res_num) { - if (!isset($this->_quote_res_nums_checked[$quote_num])) { - $this->_quote_res_nums_checked[$quote_num] = true; - $ret = array_merge($ret, - $this->checkQuoteResNumsFromSummary($quote_num, $with_quotes, $with_backlinks)); - } - } - } - } - return $ret; - } - - // }}} - // {{{ getQuoteResNumsName() - - public function getQuoteResNumsName($name) - { - if (strlen(trim($name)) == 0 || $name == $this->_nanashiName) { - return false; - } - - // トリップを除去 - $name = preg_replace('/◆.*/', '', $name, 1); - $name = strip_tags($name); - - /* - //if (preg_match('/[0-9]+/', $name, $m)) { - return (int)$m[0]; - } - */ - - if (preg_match_all(self::getAnchorRegex('/(?:^|%prefix%)(%nums%)/'), $name, $matches)) { - foreach ($matches[1] as $a_quote_res_num) { - $quote_res_nums[] = (int)mb_convert_kana($a_quote_res_num, 'n'); - } - return array_unique($quote_res_nums); - } - - return false; - } - - // }}} - // {{{ _wikipediaFilter() - - /** - * [[語句]]があった時にWikipediaへ自動リンク - * - * @param string $msg メッセージ - * @return string - * - * original code: - * http://akid.s17.xrea.com/p2puki/index.phtml?%A5%E6%A1%BC%A5%B6%A1%BC%A5%AB%A5%B9%A5%BF%A5%DE%A5%A4%A5%BA%28rep2%20Ver%201.7.0%A1%C1%29#led2c85d - */ - protected function _wikipediaFilter($msg) - { - if (strpos($msg, '[[') === false) { - return $msg; - } - - $msg = preg_replace_callback('/\\[\\[([^\\[\\]\\n<>]+)\\]\\]+/u', - array($this, '_linkToWikipeidaCallback'), - mb_convert_encoding($msg, 'UTF-8', 'CP932')); - - return mb_convert_encoding($msg, 'CP932', 'UTF-8'); - } - - // }}} - // {{{ _linkToWikipeidaCallback() - - /** - * Wikipediaの語句をリンクに変換して返す. - * - * @param array $matches - * @return string - */ - protected function _linkToWikipeidaCallback($matches) - { - return '[[' . $this->_linkToWikipeida($matches[1]) . ']]'; - } - - // }}} - // {{{ _linkToWikipeida() - - /** - * Wikipediaの語句をリンクに変換して返す. - * - * @param string $word 語句 - * @return string - */ - abstract protected function _linkToWikipeida($word); - - // }}} - // {{{ _makeQuotes() - - /** - * レスデータを集計して$this->_quote_toと$this->_quote_fromに保存. - */ - protected function _makeQuotes() - { - global $_conf; - - $this->_quote_to = array(); - $this->_quote_from = array(); - - if (!$this->thread->datlines) { - return; - } - - foreach ($this->thread->datlines as $num => $line) { - list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($line); - - // NGあぼーんチェック - if (($id = $this->thread->ids[$num + 1]) !== null) { - $date_id = str_replace($this->thread->idp[$i] . $id, 'ID:' . $id, $date_id); - } - $ng_type = $this->_ngAbornCheck($num + 1, strip_tags($name), $mail, $date_id, $id, $msg); - if ($ng_type == self::ABORN) { - continue; - } - - // 名前 - if ($nmatches = $this->getQuoteResNumsName($name)) { - foreach ($nmatches as $a_quote_res_num) { - if ($a_quote_res_num) { - if (!array_key_exists($a_quote_res_num, $this->_quote_from) || $this->_quote_from[$a_quote_res_num] === null) { - $this->_quote_from[$a_quote_res_num] = array(); - } - if (!in_array($num + 1, $this->_quote_from[$a_quote_res_num])) { - $this->_quote_from[$a_quote_res_num][] = $num + 1; - } - - if (!array_key_exists($num + 1, $this->_quote_to) || $this->_quote_to[$num + 1] === null) { - $this->_quote_to[$num + 1] = array(); - } - if (!in_array($a_quote_res_num, $this->_quote_to[$num + 1])) { - $this->_quote_to[$num + 1][] = $a_quote_res_num; - } - } - } - } - - - // >>1のリンクをいったん外す - // >>1 - $msg = preg_replace('{<[Aa] .+?>(>>[1-9][\\d\\-]*)}', '$1', $msg); - if (!preg_match_all(self::getAnchorRegex('/%full%/'), $msg, $out, PREG_PATTERN_ORDER)) { - continue; - } - foreach ($out[2] as $numberq) { - if (!preg_match_all(self::getAnchorRegex('/(?:%prefix%)?(%a_range%)/'), $numberq, $anchors, PREG_PATTERN_ORDER)) continue; - foreach ($anchors[1] as $anchor) { - if (preg_match(self::getAnchorRegex('/(%a_num%)%range_delimiter%(?:%prefix%)?(%a_num%)/'), $anchor, $matches)) { - $from = intval(mb_convert_kana($matches[1], 'n')); - $to = intval(mb_convert_kana($matches[2], 'n')); - if ($from < 1 || $to < 1 || $from > $to - || ($to - $from + 1) > sizeof($this->thread->datlines)) { - continue; - } - if ($_conf['backlink_list_range_anchor_limit'] != 0) { - if ($to - $from >= $_conf['backlink_list_range_anchor_limit']) { - continue; - } - } - for ($i = $from; $i <= $to; $i++) { - if ($i > sizeof($this->thread->datlines)) { - break; - } - if ($_conf['backlink_list_future_anchor'] == 0) { - // レス番号以降のアンカーは無視する - if ($i >= $num + 1) { - continue; - } - } - if (!array_key_exists($i, $this->_quote_from) || $this->_quote_from[$i] === null) { - $this->_quote_from[$i] = array(); - } - if (!in_array($num + 1, $this->_quote_from[$i])) { - $this->_quote_from[$i][] = $num + 1; - } - } - } elseif (preg_match(self::getAnchorRegex('/(%a_num%)/'), $anchor, $matches)) { - $quote_num = intval(mb_convert_kana($matches[1], 'n')); - if (!array_key_exists($num + 1, $this->_quote_to) || $this->_quote_to[$num + 1] === null) { - $this->_quote_to[$num + 1] = array(); - } - if (!in_array($quote_num, $this->_quote_to[$num + 1])) { - $this->_quote_to[$num + 1][] = $quote_num; - } - - if ($_conf['backlink_list_future_anchor'] == 0) { - // レス番号以降のアンカーは無視する - if ($quote_num >= $num + 1) { - continue; - } - } - if (!array_key_exists($quote_num, $this->_quote_from) || $this->_quote_from[$quote_num] === null) { - $this->_quote_from[$quote_num] = array(); - } - if (!in_array($num + 1, $this->_quote_from[$quote_num])) { - $this->_quote_from[$quote_num][] = $num + 1; - } - } - } - } - } - } - - // }}} - // {{{ getQuoteFrom() - - /** - * 被レスリストを返す. - * - * @return array - */ - public function getQuoteFrom() - { - if ($this->_quote_from === null) { - $this->_makeQuotes(); // 被レスデータ集計 - } - return $this->_quote_from; - } - - // }}} - // {{{ getQuoteTo() - - /** - * レスリストを返す. - * - * @return array - */ - public function getQuoteTo() - { - if ($this->_quote_to === null) { - $this->_makeQuotes(); // レスデータ集計 - } - return $this->_quote_to; - } - - // }}} - // {{{ _quotebackListHtml() - - /** - * 被レスリストをHTMLで整形して返す. - * - * @param int $resnum レス番号 - * @param int $type 1:縦形式 2:横形式 3:展開用ブロック用文字列 - * @param bool $popup 横形式でのポップアップ処理(true:ポップアップする、false:挿入する) - * @return string - */ - protected function _quotebackListHtml($resnum, $type, $popup=true) - { - $quote_from = $this->getQuoteFrom(); - if (!array_key_exists($resnum, $quote_from)) return $ret; - - $anchors = $quote_from[$resnum]; - sort($anchors); - - if ($type == 1) { - return $this->_quotebackVerticalListHtml($anchors, $resnum); - } elseif ($type == 2) { - return $this->_quotebackHorizontalListHtml($anchors, $resnum); - } elseif ($type == 3) { - return $this->_quotebackResData($anchors, $resnum); - } - } - - // }}} - // {{{ _quotebackVerticalListHtml() - - protected function _quotebackVerticalListHtml($anchors, $resnum) - { - $ret = '
        '; - $anchor_cnt = 1; - foreach ($anchors as $anchor) { - if ($anchor_cnt > 1) { - $ret .= '
      • '; - } - if ($anchor_cnt < count($anchors)) { - $ret .= '
      • ├'; - } else { - $ret .= '
      • └'; - } - $ret .= ($anchor == $resnum) - ? $anchor - : $this->quoteRes($anchor, '', $anchor, true); - $anchor_cnt++; - } - $ret .= '
      '; - return $ret; - } - - // }}} - // {{{ _quotebackHorizontalListHtml() - - protected function _quotebackHorizontalListHtml($anchors, $resnum) - { - $ret = '
      '; - $count = 0; - - foreach ($anchors as $idx => $anchor) { - if ($anchor == $resnum) { - continue; - } - $anchor_link= $this->quoteRes('>>' . $anchor, '>>', $anchor); - $qres_id = ($this->_matome ? "t{$this->_matome}" : '') ."qr{$anchor}"; - $ret .= '
      '; - $ret .= sprintf('
      【参照レス:%s】
      ',$anchor_link); - $ret .= '
      '; - $count++; - } - $ret .= '
      '; - - return $ret; - } - - // }}} - // {{{ _quotebackResData() - - protected function _quotebackResData($anchors, $resnum) - { - $ret = array(); - foreach ($anchors as $idx => $anchor) { - if ($anchor == $resnum) { - continue; - } - $ret[] = ($this->_matome ? "t{$this->_matome}" : '') ."qr{$anchor}"; - } - - return join('/', $ret); - } - - // }}} - // {{{ getDatochiResiduums() - - /** - * DAT落ちの際に取得できた>>1と最後のレスをHTMLで返す. - * - * @return string|false - */ - public function getDatochiResiduums() - { - $ret = ''; - $elines = $this->thread->datochi_residuums; - if (!count($elines)) { - return $ret; - } - - $this->thread->onthefly = true; - $ret = "
      on the fly
      \n"; - $ret .= "
      \n"; - - foreach($elines as $num => $line) { - $res = $this->transRes($line, $num); - if (is_array($res)) { - $ret .= $res['body'] . $res['q']; - } else { - $ret .= $res; - } - } - - $ret .= "
      \n"; - - return $ret; - } - - // }}} - // {{{ getAutoFavRanks() - - /** - * 自動ランク設定を返す. - * - * @return array - */ - public function getAutoFavRank() - { - global $_conf; - - if ($this->_auto_fav_rank !== false) { - return $this->_auto_fav_rank; - } - - $ranks = explode(',', strtr($_conf['expack.ic2.fav_auto_rank_setting'], ' ', '')); - $ret = null; - if ($_conf['expack.misc.multi_favs']) { - $idx = 0; - if (!is_array($this->thread->favs)) { - return null; - } - foreach ($this->thread->favs as $fav) { - if ($fav) { - $rank = $ranks[$idx]; - if (is_numeric($rank)) { - $rank = intval($rank); - if ($ret === null) { - $ret = $rank; - } else { - $ret = max($ret, $rank); - } - } - } - $idx++; - } - } else { - if ($this->thread->fav && is_numeric($ranks[0])) { - $ret = intval($ranks[0]); - } - } - $this->_auto_fav_rank = $ret; - - return $ret; - } - - // }}} - // {{{ isAutoFavRankOverride() - - /** - * 自動ランク設定でランクを上書きすべきか返す. - * - * @param int $now 現在のランク - * @param int $new 自動ランク - * @return bool - */ - static public function isAutoFavRankOverride($now, $new) - { - global $_conf; - - switch ($_conf['expack.ic2.fav_auto_rank_override']) { - case 0: - return false; - break; - case 1: - return $now != $new; - break; - case 2: - return $now == 0 && $now != $new; - break; - case 3: - return $now < $new; - break; - default: - return false; - } - return false; - } - - // }}} - // {{{ getAnchorRegex() - - /** - * アンカーの正規表現を返す - * - * @param string $pattern ex)'/%full%/' - * @param boolean $unicode - * @return string - */ - static public function getAnchorRegex($pattern, $unicode = false) - { - if (!array_key_exists($pattern, self::$_anchorRegexes)) { - self::$_anchorRegexes[$pattern] = strtr($pattern, self::_getAnchorRegexParts()); - // 大差はないが compileMobile2chUriCallBack() のように preg_relplace_callback()してもいいかも。 - } - if ($unicode) { - return StrSjis::toUnicodePattern($_anchorRegexes[$pattern]); - } - return self::$_anchorRegexes[$pattern]; - } - - // }}} - // {{{ _getAnchorRegexParts() - - /** - * アンカーの構成要素(正規表現パーツの配列)を返す - * - * @param void - * @return string - */ - static private function _getAnchorRegexParts() - { - if (!is_null(self::$_anchorRegexParts)) { - return self::$_anchorRegexParts; - } - - $anchor = array(); - - // アンカーの構成要素(正規表現パーツの配列) - - // 空白文字 - $anchor_space = '(?:[ ]| )'; - //$anchor[' '] = ''; - - // アンカー引用子 >> - $anchor['prefix'] = "(?:(?:>|>|<|<|〉){1,2}|(?:\)){2}|》|≫){$anchor_space}*\.?"; - - // 数字 - $anchor['a_digit'] = '(?:\\d|0|1|2|3|4|5|6|7|8|9)'; - /* - $anchor[0] = '(?:0|0)'; - $anchor[1] = '(?:1|1)'; - $anchor[2] = '(?:2|2)'; - $anchor[3] = '(?:3|3)'; - $anchor[4] = '(?:4|4)'; - $anchor[5] = '(?:5|5)'; - $anchor[6] = '(?:6|6)'; - $anchor[7] = '(?:7|7)'; - $anchor[8] = '(?:8|8)'; - $anchor[9] = '(?:9|9)'; - */ - - // 範囲指定子 - // -|‐|ー = HYPHEN-MINUS | HYPHEN | KATAKANA-HIRAGANA PROLONGED SOUND MARK - $anchor['range_delimiter'] = '(?:-|\\x81\\x5d|\\x81\\x5b)'; // [\\-\\x{2010}\\x{30fc}] - - // 列挙指定子 - $anchor['delimiter'] = "{$anchor_space}?(?:[\.,=+]|、|・|=|,){$anchor_space}?"; - - // あぼーん用アンカー引用子 - //$anchor['prefix_abon'] = ">{1,2}{$anchor_space}?"; - - // レス番号 - $anchor['a_num'] = sprintf('%s{1,4}', $anchor['a_digit']); - - // レス範囲 - /* - $anchor['a_range'] = sprintf('%s(?:%s%s)?', - $anchor['a_num'], $anchor['range_delimiter'], $anchor['a_num'] - ); - */ - $anchor['a_range'] = sprintf('%s(?:%s(?:%s)?%s)?', - $anchor['a_num'], $anchor['range_delimiter'], $anchor['prefix'], $anchor['a_num'] - ); - - // レス範囲の列挙 - $anchor['ranges'] = sprintf('%s(?:%s%s)*(?!%s)', - $anchor['a_range'], $anchor['delimiter'], $anchor['a_range'], $anchor['a_digit'] - ); - - // レス番号の列挙 - $anchor['nums'] = sprintf('%s(?:%s%s)*(?!%s)', - $anchor['a_num'], $anchor['delimiter'], $anchor['a_num'], $anchor['a_digit'] - ); - - // アンカー全体 - $anchor['full'] = sprintf('(%s)(%s)', $anchor['prefix'], $anchor['ranges']); - - // getAnchorRegex() の strtr() 置換用にkeyを '%key%' に変換する - foreach ($anchor as $k => $v) { - $anchor['%' . $k . '%'] = $v; - unset($anchor[$k]); - } - - self::$_anchorRegexParts = $anchor; - - return self::$_anchorRegexParts; - } - - // }}} - // {{{_buildStrToLinkRegex() - - /** - * リンクとして扱うパターンを返す - * - * @param void - * @return string - */ - static protected function _buildStrToLinkRegex() - { - return '{' - . '(?P(<[Aa] .+?>)(.*?)())' // リンク(PCREの特性上、必ずこのパターンを最初に試行する) - . '|' - . '(?:' - . '(?P' // 引用 - . self::getAnchorRegex('%full%') - . ')' - . '|' - . '(?P' - . '(ftp|h?ttps?|tps?)://([0-9A-Za-z][\\w!#%&+*,\\-./:;=?@\\[\\]^~]+)' // URL - . ')' - . '|' - . '(?PID: ?([0-9A-Za-z/.+]{8,11})(?=[^0-9A-Za-z/.+]|$))' // ID(8,10桁 +PC/携帯識別フラグ) - . ')' - . '}'; - } - - // }}} -} - -// }}} - -/* - * Local Variables: - * mode: php - * coding: cp932 - * tab-width: 4 - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End: - */ -// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/lib/live/live_ShowThreadPc.php b/lib/live/live_ShowThreadPc.php deleted file mode 100755 index 7c2f12102..000000000 --- a/lib/live/live_ShowThreadPc.php +++ /dev/null @@ -1,1999 +0,0 @@ -_url_handlers = array( - 'plugin_linkThread', - 'plugin_link2chSubject', - ); - // +Wiki - if (isset($GLOBALS['linkPluginCtl'])) { - $this->_url_handlers[] = 'plugin_linkPlugin'; - } - if (isset($GLOBALS['replaceImageUrlCtl'])) { - $this->_url_handlers[] = 'plugin_replaceImageUrl'; - } - if (P2_IMAGECACHE_AVAILABLE == 2) { - $this->_url_handlers[] = 'plugin_imageCache2'; - } elseif ($_conf['preview_thumbnail']) { - $this->_url_handlers[] = 'plugin_viewImage'; - } - if ($_conf['link_youtube']) { - $this->_url_handlers[] = 'plugin_linkYouTube'; - } - if ($_conf['link_niconico']) { - $this->_url_handlers[] = 'plugin_linkNicoNico'; - } - $this->_url_handlers[] = 'plugin_linkURL'; - - // imepitaのURLを加工してImageCache2させるプラグインを登録 - if (P2_IMAGECACHE_AVAILABLE == 2) { - $this->addURLHandler(array($this, 'plugin_imepitaToImageCache2')); - } - - // サムネイル表示制限数を設定 - if (!isset($GLOBALS['pre_thumb_unlimited']) || !isset($GLOBALS['pre_thumb_limit'])) { - if (isset($_conf['pre_thumb_limit']) && $_conf['pre_thumb_limit'] > 0) { - $GLOBALS['pre_thumb_limit'] = $_conf['pre_thumb_limit']; - $GLOBALS['pre_thumb_unlimited'] = false; - } else { - $GLOBALS['pre_thumb_limit'] = null; // ヌル値だとisset()はfalseを返す - $GLOBALS['pre_thumb_unlimited'] = true; - } - } - $GLOBALS['pre_thumb_ignore_limit'] = false; - - // アクティブモナー初期化 - if (P2_ACTIVEMONA_AVAILABLE) { - ExpackLoader::initActiveMona($this); - } - - // ImageCache2初期化 - if (P2_IMAGECACHE_AVAILABLE == 2) { - ExpackLoader::initImageCache($this); - } - - // 非同期レスポップアップ・SPM初期化 - $js_id = sprintf('%u', crc32($this->thread->keydat)); - if ($this->_matome) { - $this->asyncObjName = "t{$this->_matome}asp{$js_id}"; - $this->spmObjName = "t{$this->_matome}spm{$js_id}"; - } else { - $this->asyncObjName = "asp{$js_id}"; - $this->spmObjName = "spm{$js_id}"; - } - - // 名無し初期化 - $this->setBbsNonameName(); - } - - // }}} - // {{{ transRes() - - /** - * DatレスをHTMLレスに変換する - * - * @param string $ares datの1ライン - * @param int $i レス番号 - * @param string $pattern ハイライト用正規表現 - * @return string - */ - public function transRes($ares, $i, $pattern = null) - { - global $_conf, $STYLE, $mae_msg; - - list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($ares); - if (($id = $this->thread->ids[$i]) !== null) { - $idstr = 'ID:' . $id; - $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $date_id); - } else { - $idstr = null; - } - - // +Wiki:置換ワード - if (isset($GLOBALS['replaceWordCtl'])) { - $replaceWordCtl = $GLOBALS['replaceWordCtl']; - $name = $replaceWordCtl->replace('name', $this->thread, $ares, $i); - $mail = $replaceWordCtl->replace('mail', $this->thread, $ares, $i); - $date_id = $replaceWordCtl->replace('date', $this->thread, $ares, $i); - $msg = $replaceWordCtl->replace('msg', $this->thread, $ares, $i); - } - - $tores = ''; - $rpop = ''; - if ($this->_matome) { - $res_id = "t{$this->_matome}r{$i}"; - $msg_id = "t{$this->_matome}m{$i}"; - } else { - $res_id = "r{$i}"; - $msg_id = "m{$i}"; - } - $msg_class = 'message'; - - // NGあぼーんチェック - $ng_type = $this->_ngAbornCheck($i, strip_tags($name), $mail, $date_id, $id, $msg, false, $ng_info); - if ($ng_type == self::ABORN) { - return $this->_abornedRes($res_id); - } - if ($ng_type != self::NG_NONE) { - $ngaborns_head_hits = self::$_ngaborns_head_hits; - $ngaborns_body_hits = self::$_ngaborns_body_hits; - } - - // AA判定 - if ($this->am_autodetect && $this->activeMona->detectAA($msg)) { - $msg_class .= ' ActiveMona'; - } - - //============================================================= - // レスをポップアップ表示 - //============================================================= - if ($_conf['quote_res_view']) { - $quote_res_nums = $this->checkQuoteResNums($i, $name, $msg); - - foreach ($quote_res_nums as $rnv) { - if (!isset($this->_quote_res_nums_done[$rnv])) { - $this->_quote_res_nums_done[$rnv] = true; - if (isset($this->thread->datlines[$rnv-1])) { - if ($this->_matome) { - $qres_id = "t{$this->_matome}qr{$rnv}"; - } else { - $qres_id = "qr{$rnv}"; - } - $ds = $this->qRes($this->thread->datlines[$rnv-1], $rnv); - $onPopUp_at = " onmouseover=\"showResPopUp('{$qres_id}',event)\" onmouseout=\"hideResPopUp('{$qres_id}')\""; - $rpop .= "
      \n{$ds}
      \n"; - } - } - } - } - - //============================================================= - // まとめて出力 - //============================================================= - - $name = $this->transName($name); // 名前HTML変換 - $msg = $this->transMsg($msg, $i); // メッセージHTML変換 - - - // BEプロファイルリンク変換 - $date_id = $this->replaceBeId($date_id, $i); - - // HTMLポップアップ - if ($_conf['iframe_popup']) { - $date_id = preg_replace_callback("{((\?#*)|(Lv\.\d+))}", array($this, 'iframePopupCallback'), $date_id); - } - - // NGメッセージ変換 - if ($ng_type != self::NG_NONE && count($ng_info)) { - $ng_info = implode(', ', $ng_info); - $msg = <<{$ng_info} -
      {$msg}
      -EOMSG; - } - - // NGネーム変換 - if ($ng_type & self::NG_NAME) { - $name = <<{$name} -EONAME; - $msg = <<{$msg}
    -EOMSG; - - // NGメール変換 - } elseif ($ng_type & self::NG_MAIL) { - $mail = <<{$mail} -EOMAIL; - $msg = <<{$msg}
    -EOMSG; - - // NGID変換 - } elseif ($ng_type & self::NG_ID) { - $date_id = <<{$date_id} -EOID; - $msg = <<{$msg} -EOMSG; - - } - - /* - //「ここから新着」画像を挿入 - if ($i == $this->thread->readnum +1) { - $tores .= <<新着レス -EOP; - } - */ - - // SPM - if ($_conf['expack.spm.enabled']) { - $spmeh = " onmouseover=\"{$this->spmObjName}.show({$i},'{$msg_id}',event)\""; - $spmeh .= " onmouseout=\"{$this->spmObjName}.hide(event)\""; - } else { - $spmeh = ''; - } - - // +live スレ内容表示部削除 - - /*if ($_conf['expack.am.enabled'] == 2) { - $tores .= << -// -\n -EOJS; - }*/ - - // まとめてフィルタ色分け - if ($pattern) { - $tores = StrCtl::filterMarking($pattern, $tores); - } - - return array('body' => $tores, 'q' => $rpop); - } - - // }}} - // {{{ quoteOne() - - /** - * >>1 を表示する (引用ポップアップ用) - */ - public function quoteOne() - { - global $_conf; - - if (!$_conf['quote_res_view']) { - return false; - } - - $rpop = ''; - $quote_res_nums = $this->checkQuoteResNums(0, '1', ''); - if (array_search(1, $quote_res_nums) === false) { - $quote_res_nums[] = 1; - } - - foreach ($quote_res_nums as $rnv) { - if (!isset($this->_quote_res_nums_done[$rnv])) { - $this->_quote_res_nums_done[$rnv] = true; - if (isset($this->thread->datlines[$rnv-1])) { - if ($this->_matome) { - $qres_id = "t{$this->_matome}qr{$rnv}"; - } else { - $qres_id = "qr{$rnv}"; - } - $ds = $this->qRes($this->thread->datlines[$rnv-1], $rnv); - $onPopUp_at = " onmouseover=\"showResPopUp('{$qres_id}',event)\" onmouseout=\"hideResPopUp('{$qres_id}')\""; - $rpop .= "
    \n{$ds}
    \n"; - } - } - } - - $res1['q'] = $rpop; - $res1['body'] = $this->transMsg('>>1', 1); - - return $res1; - } - - // }}} - // {{{ qRes() - - /** - * レス引用HTML - */ - public function qRes($ares, $i) - { - global $_conf; - - $resar = $this->thread->explodeDatLine($ares); - $name = $this->transName($resar[0]); - $mail = $resar[1]; - if (($id = $this->thread->ids[$i]) !== null) { - $idstr = 'ID:' . $id; - $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $resar[2]); - } else { - $idstr = null; - $date_id = $resar[2]; - } - $msg = $this->transMsg($resar[3], $i); - - $tores = ''; - - if ($this->_matome) { - $qmsg_id = "t{$this->_matome}qm{$i}"; - } else { - $qmsg_id = "qm{$i}"; - } - - // >>1 - if ($i == 1) { - $tores = "

    {$this->thread->ttitle_hd}

    "; - } - - // BEプロファイルリンク変換 - $date_id = $this->replaceBeId($date_id, $i); - - // HTMLポップアップ - if ($_conf['iframe_popup']) { - $date_id = preg_replace_callback("{((\?#*)|(Lv\.\d+))}", array($this, 'iframePopupCallback'), $date_id); - } - // - - // IDフィルタ - if ($_conf['flex_idpopup'] == 1 && $id && $this->thread->idcount[$id] > 1) { - $date_id = str_replace($idstr, $this->idFilter($idstr, $id), $date_id); - } - - $msg_class = 'message'; - - // AA 判定 - if ($this->am_autodetect && $this->activeMona->detectAA($msg)) { - $msg_class .= ' ActiveMona'; - } - - // SPM - if ($_conf['expack.spm.enabled']) { - $spmeh = " onmouseover=\"{$this->spmObjName}.show({$i},'{$qmsg_id}',event)\""; - $spmeh .= " onmouseout=\"{$this->spmObjName}.hide(event)\""; - } else { - $spmeh = ''; - } - - // $toresにまとめて出力 - $tores .= '
    '; - $tores .= "{$i} : "; // 番号 - $tores .= preg_replace('{[ ]*}i', '', "{$name} : "); - if ($mail) { - $tores .= $mail . ' : '; // メール - } - $tores .= $date_id; // 日付とID - if ($this->am_side_of_id) { - $tores .= ' ' . $this->activeMona->getMona($qmsg_id); - } - $tores .= "
    \n"; - - // 被レスリスト(縦形式) - if ($_conf['backlink_list'] == 1 || $_conf['backlink_list'] > 2) { - $tores .= $this->_quotebackListHtml($i, 1); - } - - $tores .= "
    {$msg}
    \n"; // 内容 - // 被レスリスト(横形式) - if ($_conf['backlink_list'] == 2 || $_conf['backlink_list'] > 2) { - $tores .= $this->_quotebackListHtml($i, 2); - } - - // 被参照ブロック用データ - if ($_conf['backlink_block'] > 0) { - $tores .= $this->_getBacklinkComment($i); - } - - return $tores; - } - - // }}} - // {{{ _getBacklinkComment() - - protected function _getBacklinkComment($i) - { - $backlinks = $this->_quotebackListHtml($i, 3); - if (strlen($backlinks)) { - return ''; - } - return ''; - } - - // }}} - // {{{ transName() - - /** - * 名前をHTML用に変換する - * - * @param string $name 名前 - * @return string - */ - public function transName($name) - { - global $_conf; - - // トリップやホスト付きなら分解する - if (($pos = strpos($name, '◆')) !== false) { - $trip = substr($name, $pos); - $name = substr($name, 0, $pos); - } else { - $trip = null; - } - - // 数字を引用レスポップアップリンク化 - if ($_conf['quote_res_view']) { - if (strlen($name) && $name != $this->_nanashiName) { - $name = preg_replace_callback( - self::getAnchorRegex('/(?:^|%prefix%)(%nums%)/'), - array($this, '_quoteNameCallback'), $name - ); - } - } - - if ($trip) { - $name .= $trip; - } elseif ($name) { - // 文字化け回避 - $name = $name . ' '; - //if (in_array(0xF0 & ord(substr($name, -1)), array(0x80, 0x90, 0xE0))) { - // $name .= ' '; - //} - } - - return $name; - } - - // }}} - // {{{ transMsg() - - /** - * datのレスメッセージをHTML表示用メッセージに変換する - * - * @param string $msg メッセージ - * @param int $mynum レス番号 - * @return string - */ - public function transMsg($msg, $mynum) - { - global $_conf; - global $pre_thumb_ignore_limit; - - // 2ch旧形式のdat - if ($this->thread->dat_type == '2ch_old') { - $msg = str_replace('@`', ',', $msg); - $msg = preg_replace('/&(?=[^;])/', '&', $msg); - } - - // &補正 - $msg = preg_replace('/&(?!#?\\w+;)/', '&', $msg); - - // Safariから投稿されたリンク中チルダの文字化け補正 - //$msg = preg_replace('{(h?t?tp://[\w\.\-]+/)〜([\w\.\-%]+/?)}', '$1~$2', $msg); - - // >>1のリンクをいったん外す - // >>1 - $msg = preg_replace('{<[Aa] .+?>(>>\\d[\\d\\-]*)}', '$1', $msg); - - // 本来は2chのDAT時点でなされていないとエスケープの整合性が取れない気がする。(URLリンクのマッチで副作用が出てしまう) - //$msg = str_replace(array('"', "'"), array('"', '''), $msg); - - // 2006/05/06 ノートンの誤反応対策 body onload=window() - $msg = str_replace('onload=window()', 'onload=window()', $msg); - - // 新着レスの画像は表示制限を無視する設定なら - if ($mynum > $this->thread->readnum && $_conf['expack.ic2.newres_ignore_limit']) { - $pre_thumb_ignore_limit = true; - } - - // 文末の改行と連続する改行を除去 - if ($_conf['strip_linebreaks']) { - $msg = $this->stripLineBreaks($msg /*, '
    ***
    '*/); - } - - // 引用やURLなどをリンク - $msg = $this->transLink($msg); - - // Wikipedia記法への自動リンク - if ($_conf['_linkToWikipeida']) { - $msg = $this->_wikipediaFilter($msg); - } - - return $msg; - } - - // }}} - // {{{ _abornedRes() - - /** - * あぼーんレスのHTMLを取得する - * - * @param string $res_id - * @return string - */ - protected function _abornedRes($res_id) - { - global $_conf; - - if ($_conf['ngaborn_purge_aborn']) { - return ''; - } - - return << -
     
    -
     
    -\n -EOP; - } - - // }}} - // {{{ idFilter() - - /** - * IDフィルタリングポップアップ変換 - * - * @param string $idstr ID:xxxxxxxxxx - * @param string $id xxxxxxxxxx - * @return string - */ - public function idFilter($idstr, $id) - { - global $_conf; - - // IDは8桁または10桁(+携帯/PC識別子)と仮定して - /* - if (strlen($id) % 2 == 1) { - $id = substr($id, 0, -1); - } - */ - $num_ht = ''; - if (isset($this->thread->idcount[$id]) && $this->thread->idcount[$id] > 0) { - $num = (string) $this->thread->idcount[$id]; - if ($_conf['iframe_popup'] == 3) { - $num_ht = ' '; - $num_ht .= preg_replace('/\\d/', '', $num); - $num_ht .= ' '; - } else { - $num_ht = '('.$num.')'; - } - } else { - return $idstr; - } - - if ($_conf['coloredid.enable'] > 0 && preg_match("|^ID:[ ]?[0-9A-Za-z/.+]{8,11}|",$idstr)) { - if ($this->_ids_for_render === null) { - $this->_ids_for_render = array(); - } - $this->_ids_for_render[substr($id, 0, 8)] = $this->thread->idcount[$id]; - if ($_conf['coloredid.click'] > 0) { - $num_ht = '' . $num_ht . ''; - } - $idstr = $this->_coloredIdStr( - $idstr, $id, $_conf['coloredid.click'] > 0 ? true : false); - } - - $filter_url = $_conf['read_php'] . '?' . http_build_query(array( - 'host' => $this->thread->host, - 'bbs' => $this->thread->bbs, - 'key' => $this->thread->key, - 'ls' => 'all', - 'offline' => '1', - 'idpopup' => '1', - 'rf' => array( - 'field' => ResFilter::FIELD_ID, - 'method' => ResFilter::METHOD_JUST, - 'match' => ResFilter::MATCH_ON, - 'include' => ResFilter::INCLUDE_NONE, - 'word' => $id, - ), - ), '', '&') . $_conf['k_at_a']; - - if ($_conf['iframe_popup']) { - return $this->iframePopup($filter_url, $idstr, $_conf['bbs_win_target_at']) . $num_ht; - } - return "{$idstr}{$num_ht}"; - } - - // }}} - // {{{ _linkToWikipeida() - - /** - * @see ShowThread - */ - protected function _linkToWikipeida($word) - { - global $_conf; - - $link = 'http://ja.wikipedia.org/wiki/' . rawurlencode($word); - if ($_conf['through_ime']) { - $link = P2Util::throughIme($link); - } - - return "{$word}"; - } - - // }}} - // {{{ quoteRes() - - /** - * 引用変換(単独) - * - * @param string $full >>1-100 - * @param string $qsign >> - * @param string $appointed_num 1-100 - * @param bool $anchor_jump - * @return string - */ - public function quoteRes($full, $qsign, $appointed_num, $anchor_jump = false) - { - global $_conf; - - $appointed_num = mb_convert_kana($appointed_num, 'n'); // 全角数字を半角数字に変換 - if (preg_match('/\\D/', $appointed_num)) { - $appointed_num = preg_replace('/\\D+/', '-', $appointed_num); - return $this->quoteResRange($full, $qsign, $appointed_num); - } - if (preg_match('/^0/', $appointed_num)) { - return $full; - } - - $qnum = intval($appointed_num); - if ($qnum < 1 || $qnum > sizeof($this->thread->datlines)) { - return $full; - } - - // あぼーんレスへのアンカー - if ($_conf['quote_res_view_aborn'] == 0 && - in_array($qnum, $this->_aborn_nums)) { - return '' . "{$full}"; - } - - if ($anchor_jump && $qnum >= $this->thread->resrange['start'] && $qnum <= $this->thread->resrange['to']) { - $read_url = '#' . ($this->_matome ? "t{$this->_matome}" : '') . "r{$qnum}"; - } else { - $read_url = "{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&offline=1&ls={$appointed_num}"; - } - $attributes = $_conf['bbs_win_target_at']; - if ($_conf['quote_res_view'] && ($_conf['quote_res_view_ng'] != 0 || - !in_array($qnum, $this->_ng_nums))) { - if ($this->_matome) { - $qres_id = "t{$this->_matome}qr{$qnum}"; - } else { - $qres_id = "qr{$qnum}"; - } - $attributes .= " onmouseover=\"showResPopUp('{$qres_id}',event)\""; - $attributes .= " onmouseout=\"hideResPopUp('{$qres_id}')\""; - } - return "_aborn_nums) ? ' class="abornanchor"' : - (in_array($qnum, $this->_ng_nums) ? ' class="nganchor"' : '')) - . ">{$full}"; - } - - // }}} - // {{{ quoteResRange() - - /** - * 引用変換(範囲) - * - * @param string $full >>1-100 - * @param string $qsign >> - * @param string $appointed_num 1-100 - * @return string - */ - public function quoteResRange($full, $qsign, $appointed_num) - { - global $_conf; - - if ($appointed_num == '-') { - return $full; - } - - $read_url = "{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&offline=1&ls={$appointed_num}n"; - - if ($_conf['iframe_popup']) { - $pop_url = $read_url . "&renzokupop=true"; - return $this->iframePopup(array($read_url, $pop_url), $full, $_conf['bbs_win_target_at'], 1); - } - - // 普通にリンク - return "{$full}"; - - // 1つ目を引用レスポップアップ - /* - $qnums = explode('-', $appointed_num); - $qlink = $this->quoteRes($qsign . $qnum[0], $qsign, $qnum[0]) . '-'; - if (isset($qnums[1])) { - $qlink .= $qnums[1]; - } - return $qlink; - */ - } - - // }}} - // {{{ iframePopup() - - /** - * HTMLポップアップ変換 - * - * @param string|array $url - * @param string|array $str - * @param string $attr - * @param int|null $mode - * @param bool $marker - * @return string - */ - public function iframePopup($url, $str, $attr = '', $mode = null, $marker = false) - { - global $_conf; - - // リンク用URLとポップアップ用URL - if (is_array($url)) { - $link_url = $url[0]; - $pop_url = $url[1]; - } else { - $link_url = $url; - $pop_url = $url; - } - - // リンク文字列とポップアップの印 - if (is_array($str)) { - $link_str = $str[0]; - $pop_str = $str[1]; - } else { - $link_str = $str; - $pop_str = null; - } - - // リンクの属性 - if (is_array($attr)) { - $_attr = $attr; - $attr = ''; - foreach ($_attr as $key => $value) { - $attr .= ' ' . $key . '="' . p2h($value) . '"'; - } - } elseif ($attr !== '' && substr($attr, 0, 1) != ' ') { - $attr = ' ' . $attr; - } - - // リンクの属性にHTMLポップアップ用のイベントハンドラを加える - $pop_attr = $attr; - if ($_conf['iframe_popup_event'] == 1) { - $pop_attr .= " onclick=\"stophide=true; showHtmlPopUp('{$pop_url}',event,0" . ($marker ? ' ,this' : '') . "); return false;\""; - } else { - $pop_attr .= " onmouseover=\"showHtmlPopUp('{$pop_url}',event,{$_conf['iframe_popup_delay']}" . ($marker ? ' ,this' : '') . ")\""; - } - $pop_attr .= " onmouseout=\"offHtmlPopUp()\""; - - // 最終調整 - if (is_null($mode)) { - $mode = $_conf['iframe_popup']; - } - if ($mode == 2 && !is_null($pop_str)) { - $mode = 3; - } elseif ($mode == 3 && is_null($pop_str)) { - global $skin, $STYLE; - - $custom_pop_img = "skin/{$skin}/pop.png"; - if (file_exists($custom_pop_img)) { - $pop_img = p2h($custom_pop_img); - $x = $STYLE['iframe_popup_mark_width']; - $y = $STYLE['iframe_popup_mark_height']; - } else { - $pop_img = 'img/pop.png'; - $y = $x = 12; - } - $pop_str = "\"\""; - } - - // リンク作成 - switch ($mode) { - // マーク無し - case 1: - return "{$link_str}"; - // (p)マーク - case 2: - return "(p){$link_str}"; - // [p]画像、サムネイルなど - case 3: - return "{$pop_str}{$link_str}"; - // ポップアップしない - default: - return "{$link_str}"; - } - } - - // }}} - // {{{ iframePopupCallback() - - /** - * HTMLポップアップ変換(コールバック用インターフェース) - * - * @param array $s 正規表現にマッチした要素の配列 - * @return string - */ - public function iframePopupCallback($s) - { - return $this->iframePopup(p2h($s[1], false), p2h($s[3], false), $s[2]); - } - - // }}} - // {{{ _coloredIdStr() - - /** - * Merged from http://jiyuwiki.com/index.php?cmd=read&page=rep2%A4%C7%A3%C9%A3%C4%A4%CE%C7%D8%B7%CA%BF%A7%CA%D1%B9%B9&alias%5B%5D=pukiwiki%B4%D8%CF%A2 - * - * @return string - */ - protected function _coloredIdStr($idstr, $id, $classed = false) - { - global $_conf; - - if (!(isset($this->thread->idcount[$id]) - && $this->thread->idcount[$id] > 1)) { - return $idstr; - } - if ($classed) { - return $this->_coloredIdStrClassed($idstr, $id); - } - - switch ($_conf['coloredid.rate.type']) { - case 1: - $rate = $_conf['coloredid.rate.times']; - break; - case 2: - $rate = $this->getIdCountRank(10); - break; - case 3: - $rate = $this->getIdCountAverage(); - break; - default: - return $idstr; - } - - if ($rate > 1 && $this->thread->idcount[$id] >= $rate) { - switch ($_conf['coloredid.coloring.type']) { - case 0: - return $this->_coloredIdStr0($idstr, $id); - break; - case 1: - return $this->_coloredIdStr1($idstr, $id); - break; - default: - return $idstr; - } - } - - return $idstr; - } - - // }}} - // {{{ _coloredIdStrClassed() - - private function _coloredIdStrClassed($idstr, $id) - { - $ret = array(); - $arr = explode(':', $idstr); - foreach ($arr as $i => $str) { - if ($i == 0 || $i == 1) { - $ret[] = '' . $str . ''; - } else { - $ret[] = $str; - } - } - return implode(':', $ret); - } - - // }}} - // {{{ _coloredIdStr0() - - /** - * IDカラー オリジナル着色用 - */ - private function _coloredIdStr0($idstr, $id) - { - if (!function_exists('coloredIdStyle0')) { - require P2_LIB_DIR . '/color/coloredIdStyle0.inc.php'; - } - - if (isset($this->idstyles[$id])) { - $colored = $this->idstyles[$id]; - } else { - $colored = coloredIdStyle0($id, $this->thread->idcount[$id]); - $this->idstyles[$id] = $colored; - } - $ret = array(); - foreach ($arr = explode(':', $idstr) as $i => $str) { - if ($colored[$i]) { - $ret[] = "{$str}"; - } else { - $ret[] = $str; - } - } - return implode(':', $ret); - } - - // }}} - // {{{ _coloredIdStr1() - - /** - * IDカラー thermon版用 - */ - private function _coloredIdStr1($idstr, $id) - { - if (!function_exists('coloredIdStyle')) { - require P2_LIB_DIR . '/color/coloredIdStyle.inc.php'; - } - - $colored = coloredIdStyle($idstr, $id, $this->thread->idcount[$id]); - $idstr2 = preg_split('/:/',$idstr,2); // コロンでID文字列を分割 - $ret = array_shift($idstr2).':'; - if ($colored[1]) { - $idstr2[1] = substr($idstr2[0], 4); - $idstr2[0] = substr($idstr2[0], 0, 4); - } - foreach ($idstr2 as $i => $str) { - if ($colored[$i]) { - $ret .= "{$str}"; - } else { - $ret .= $str; - } - } - return $ret; - } - - // }}} - // {{{ cssClassedId() - - /** - * IDカラーに使用するCSSクラス名をID文字列から算出して返す. - */ - static public function cssClassedId($id) - { - return 'idcss-' . bin2hex( - base64_decode(str_replace('.', '+', substr($id, 0, 8)))); - } - - // }}} - // {{{ ユーティリティメソッド - // {{{ imageHtmlPopup() - - /** - * 画像をHTMLポップアップ&ポップアップウインドウサイズに合わせる - */ - public function imageHtmlPopup($img_url, $img_tag, $link_str) - { - global $_conf; - - if ($_conf['expack.ic2.enabled'] && $_conf['expack.ic2.fitimage']) { - $popup_url = 'ic2_fitimage.php?url=' . rawurlencode(str_replace('&', '&', $img_url)); - } else { - $popup_url = $img_url; - } - - $pops = ($_conf['iframe_popup'] == 1) ? $img_tag . $link_str : array($link_str, $img_tag); - return $this->iframePopup(array($img_url, $popup_url), $pops, $_conf['ext_win_target_at'], null, true); - } - - // }}} - // {{{ respopToAsync() - - /** - * レスポップアップを非同期モードに加工する - */ - public function respopToAsync($str) - { - $respop_regex = '/(onmouseover)=\"(showResPopUp\(\'(q(\d+)of\d+)\',event\).*?)\"/'; - $respop_replace = '$1="loadResPopUp(' . $this->asyncObjName . ', $4);$2"'; - return preg_replace($respop_regex, $respop_replace, $str); - } - - // }}} - // {{{ getASyncObjJs() - - /** - * 非同期読み込みで利用するJavaScriptオブジェクトを生成する - */ - public function getASyncObjJs() - { - global $_conf; - static $done = array(); - - if (isset($done[$this->asyncObjName])) { - return; - } - $done[$this->asyncObjName] = true; - - $code = << -//asyncObjName} = { - host:"{$this->thread->host}", bbs:"{$this->thread->bbs}", key:"{$this->thread->key}", - readPhp:"{$_conf['read_php']}", readTarget:"{$_conf['bbs_win_target']}" -}; -//]]> -\n -EOJS; - return $code; - } - - // }}} - // {{{ getSpmObjJs() - - /** - * スマートポップアップメニューを生成するJavaScriptコードを生成する - */ - public function getSpmObjJs($retry = false) - { - global $_conf, $STYLE; - - if (isset(self::$_spm_objects[$this->spmObjName])) { - return $retry ? self::$_spm_objects[$this->spmObjName] : ''; - } - - $ttitle_en = UrlSafeBase64::encode($this->thread->ttitle); - - if ($_conf['expack.spm.filter_target'] == '' || $_conf['expack.spm.filter_target'] == 'read') { - $_conf['expack.spm.filter_target'] = '_self'; - } - - $motothre_url = $this->thread->getMotoThread(); - $motothre_url = substr($motothre_url, 0, strlen($this->thread->ls) * -1); - - $_spmOptions = array( - 'null', - ((!$_conf['disable_res'] && $_conf['expack.spm.kokores']) ? (($_conf['expack.spm.kokores_orig']) ? '2' : '1') : '0'), - (($_conf['expack.spm.ngaborn']) ? (($_conf['expack.spm.ngaborn_confirm']) ? '2' : '1') : '0'), - (($_conf['expack.spm.filter']) ? '1' : '0'), - (($this->am_on_spm) ? '1' : '0'), - (($_conf['expack.aas.enabled']) ? '1' : '0'), - ); - $spmOptions = implode(',', $_spmOptions); - - // エスケープ - $_spm_title = StrCtl::toJavaScript($this->thread->ttitle_hc); - $_spm_url = addslashes($motothre_url); - $_spm_host = addslashes($this->thread->host); - $_spm_bbs = addslashes($this->thread->bbs); - $_spm_key = addslashes($this->thread->key); - $_spm_ls = addslashes($this->thread->ls); - - $code = << -//spmObjName} = { - 'objName':'{$this->spmObjName}', - 'rc':'{$this->thread->rescount}', - 'title':'{$_spm_title}', - 'ttitle_en':'{$ttitle_en}', - 'url':'{$_spm_url}', - 'host':'{$_spm_host}', - 'bbs':'{$_spm_bbs}', - 'key':'{$_spm_key}', - 'ls':'{$_spm_ls}', - 'spmOption':[{$spmOptions}] -}; -SPM.init({$this->spmObjName}); -//]]> -\n -EOJS; - - self::$_spm_objects[$this->spmObjName] = $code; - - return $code; - } - - // }}} - // }}} - // {{{ transLinkDo()から呼び出されるURL書き換えメソッド - /** - * これらのメソッドは引数が処理対象パターンに合致しないとfalseを返し、 - * transLinkDo()はfalseが返ってくると$_url_handlersに登録されている次の関数/メソッドに処理させようとする。 - */ - // {{{ plugin_linkURL() - - /** - * URLリンク - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_linkURL($url, $purl, $str) - { - global $_conf; - - if (isset($purl['scheme'])) { - // ime - if ($_conf['through_ime']) { - $link_url = P2Util::throughIme($purl[0]); - } else { - $link_url = $url; - } - - $is_http = ($purl['scheme'] == 'http' || $purl['scheme'] == 'https'); - - // HTMLポップアップ - if ($_conf['iframe_popup'] && $is_http) { - // *pm 指定の場合のみ、特別に手動転送指定を追加する - if (substr($_conf['through_ime'], -2) == 'pm') { - $pop_url = P2Util::throughIme($purl[0], -1); - } else { - $pop_url = $link_url; - } - $link = $this->iframePopup(array($link_url, $pop_url), $str, $_conf['ext_win_target_at']); - } else { - $link = "{$str}"; - } - - // ブラクラチェッカ - if ($_conf['brocra_checker_use'] && $_conf['brocra_checker_url'] && $is_http) { - if (strlen($_conf['brocra_checker_query'])) { - $brocra_checker_url = $_conf['brocra_checker_url'] . '?' . $_conf['brocra_checker_query'] . '=' . rawurlencode($purl[0]); - } else { - $brocra_checker_url = rtrim($_conf['brocra_checker_url'], '/') . '/' . $url; - } - $brocra_checker_url_orig = $brocra_checker_url; - // ブラクラチェッカ・ime - if ($_conf['through_ime']) { - $brocra_checker_url = P2Util::throughIme($brocra_checker_url); - } - $check_mark = 'チェック'; - $check_mark_prefix = '['; - $check_mark_suffix = ']'; - // ブラクラチェッカ・HTMLポップアップ - if ($_conf['iframe_popup']) { - // *pm 指定の場合のみ、特別に手動転送指定を追加する - if (substr($_conf['through_ime'], -2) == 'pm') { - $brocra_checker_url = P2Util::throughIme($brocra_checker_url_orig, -1); - } else { - $brocra_pop_url = $brocra_checker_url; - } - if ($_conf['iframe_popup'] == 3) { - $check_mark = ''; - $check_mark_prefix = ''; - $check_mark_suffix = ''; - } - $brocra_checker_link = $this->iframePopup(array($brocra_checker_url, $brocra_pop_url), $check_mark, $_conf['ext_win_target_at']); - } else { - $brocra_checker_link = "{$check_mark}"; - } - $link .= $check_mark_prefix . $brocra_checker_link . $check_mark_suffix; - } - - return $link; - } - return false; - } - - // }}} - // {{{ plugin_link2chSubject() - - /** - * 2ch bbspink 板リンク - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_link2chSubject($url, $purl, $str) - { - global $_conf; - - if (preg_match('{^http://(\\w+\\.(?:2ch\\.net|bbspink\\.com))/(\\w+)/$}', $purl[0], $m)) { - $subject_url = "{$_conf['subject_php']}?host={$m[1]}&bbs={$m[2]}"; - return "{$str} [板をp2で開く]"; - } - return false; - } - - // }}} - // {{{ plugin_linkThread() - - /** - * スレッドリンク - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_linkThread($url, $purl, $str) - { - global $_conf; - - list($nama_url, $host, $bbs, $key, $ls) = P2Util::detectThread($purl[0]); - if ($host && $bbs && $key) { - $read_url = "{$_conf['read_php']}?host={$host}&bbs={$bbs}&key={$key}&ls={$ls}"; - if ($_conf['iframe_popup']) { - if ($ls && preg_match('/^[0-9\\-n]+$/', $ls)) { - $pop_url = $read_url; - } else { - $pop_url = $read_url . '&one=true'; - } - return $this->iframePopup(array($read_url, $pop_url), $str, $_conf['bbs_win_target_at']); - } - return "{$str}"; - } - - return false; - } - - // }}} - // {{{ plugin_linkYouTube() - - /** - * YouTubeリンク変換プラグイン - * - * Zend_Gdata_Youtubeを使えばサムネイルその他の情報を簡単に取得できるが... - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_linkYouTube($url, $purl, $str) - { - global $_conf; - - // http://www.youtube.com/watch?v=Mn8tiFnAUAI - // http://m.youtube.com/watch?v=OhcX0xJsDK8&client=mv-google&gl=JP&hl=ja&guid=ON&warned=True - if (preg_match('{^http://(www|jp|m)\\.youtube\\.com/watch\\?(?:.+&)?v=([0-9a-zA-Z_\\-]+)}', $url, $m)) { - // ime - if ($_conf['through_ime']) { - $link_url = P2Util::throughIme($url); - } else { - $link_url = $url; - } - - // HTMLポップアップ - if ($_conf['iframe_popup']) { - $link = $this->iframePopup($link_url, $str, $_conf['ext_win_target_at']); - } else { - $link = "{$str}"; - } - - $subd = $m[1]; - $id = $m[2]; - - if ($_conf['link_youtube'] == 2) { - return << -EOP; - } else { - return << -EOP; - } - } - return false; - } - - // }}} - // {{{ plugin_linkNicoNico() - - /** - * ニコニコ動画変換プラグイン - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_linkNicoNico($url, $purl, $str) - { - global $_conf; - - // http://www.nicovideo.jp/watch?v=utbrYUJt9CSl0 - // http://www.nicovideo.jp/watch/utvWwAM30N0No - // http://m.nicovideo.jp/watch/sm7044684 - if (preg_match('{^http://(?:www|m)\\.nicovideo\\.jp/watch(?:/|(?:\\?v=))([0-9a-zA-Z_-]+)}', $url, $m)) { - // ime - if ($_conf['through_ime']) { - $link_url = P2Util::throughIme($purl[0]); - } else { - $link_url = $url; - } - - // HTMLポップアップ - if ($_conf['iframe_popup']) { - $link = $this->iframePopup($link_url, $str, $_conf['ext_win_target_at']); - } else { - $link = "{$str}"; - } - - $id = $m[1]; - - if ($_conf['link_niconico'] == 2) { - return << -EOP; - } else { - return << -EOP; - } - } - return false; - } - - // }}} - // {{{ plugin_viewImage() - - /** - * 画像ポップアップ変換 - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_viewImage($url, $purl, $str) - { - global $_conf; - global $pre_thumb_unlimited, $pre_thumb_limit; - - if (P2Util::isUrlWikipediaJa($url)) { - return false; - } - - // 表示制限 - if (!$pre_thumb_unlimited && empty($pre_thumb_limit)) { - return false; - } - - if (preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $purl[0]) && empty($purl['query'])) { - $pre_thumb_limit--; // 表示制限カウンタを下げる - $img_tag = ""; - - if ($_conf['iframe_popup']) { - $view_img = $this->imageHtmlPopup($url, $img_tag, $str); - } else { - $view_img = "{$img_tag}{$str}"; - } - - // ブラクラチェッカ (プレビューとは相容れないのでコメントアウト) - /*if ($_conf['brocra_checker_use']) { - $link_url_en = rawurlencode($url); - if ($_conf['iframe_popup'] == 3) { - $check_mark = ''; - $check_mark_prefix = ''; - $check_mark_suffix = ''; - } else { - $check_mark = 'チェック'; - $check_mark_prefix = '['; - $check_mark_suffix = ']'; - } - $view_img .= $check_mark_prefix . "{$check_mark}" . $check_mark_suffix; - }*/ - - return $view_img; - } - - return false; - } - - // }}} - // {{{ plugin_imageCache2() - - /** - * ImageCache2サムネイル変換 - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_imageCache2($url, $purl, $str, - $force = false, - $referer = null) - { - static $serial = 0; - - global $_conf; - global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit; - - if (P2Util::isUrlWikipediaJa($url)) { - return false; - } - - if ((preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $purl[0]) && empty($purl['query'])) || $force) { - // 準備 - $serial++; - $thumb_id = 'thumbs' . $serial . $this->thumb_id_suffix; - $tmp_thumb = './img/ic_load.png'; - $url_ht = $url; - $url = $purl[0]; - $url_en = rawurlencode($url) . - ($referer ? '&ref=' . rawurlencode($referer) : ''); - $img_id = null; - - $icdb = new ImageCache2_DataObject_Images(); - - // r=0:リンク;r=1:リダイレクト;r=2:PHPで表示 - // t=0:オリジナル;t=1:PC用サムネイル;t=2:携帯用サムネイル;t=3:中間イメージ - $img_url = 'ic2.php?r=1&uri=' . $url_en; - $thumb_url = 'ic2.php?r=1&t=1&uri=' . $url_en; - // お気にスレ自動画像ランク - $rank = null; - if ($_conf['expack.ic2.fav_auto_rank']) { - $rank = $this->getAutoFavRank(); - if ($rank !== null) { - $thumb_url .= '&rank=' . $rank; - } - } - - // DBに画像情報が登録されていたとき - if ($icdb->get($url)) { - $img_id = $icdb->id; - - // ウィルスに感染していたファイルのとき - if ($icdb->mime == 'clamscan/infected') { - return " {$str}"; - } - // あぼーん画像のとき - if ($icdb->rank < 0) { - return " {$str}"; - } - - // オリジナルがキャッシュされているときは画像を直接読み込む - $_img_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); - if (file_exists($_img_url)) { - $img_url = $_img_url; - $cached = true; - } else { - $cached = false; - } - - // サムネイルが作成されていているときは画像を直接読み込む - $_thumb_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); - if (file_exists($_thumb_url)) { - $thumb_url = $_thumb_url; - // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 - if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false){ - $update = new ImageCache2_DataObject_Images(); - if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { - $update->memo = $this->img_memo . ' ' . $icdb->memo; - } else { - $update->memo = $this->img_memo; - } - $update->whereAddQuoted('uri', '=', $url); - } - - // expack.ic2.fav_auto_rank_override の設定とランク条件がOKなら - // お気にスレ自動画像ランクを上書き更新 - if ($rank !== null && - self::isAutoFavRankOverride($icdb->rank, $rank)) { - if ($update === null) { - $update = new ImageCache2_DataObject_Images(); - $update->whereAddQuoted('uri', '=', $url); - } - $update->rank = $rank; - } - - if ($update !== null) { - $update->update(); - } - } - - // サムネイルの画像サイズ - $thumb_size = $this->thumbnailer->calc($icdb->width, $icdb->height); - $thumb_size = preg_replace('/(\d+)x(\d+)/', 'width="$1" height="$2"', $thumb_size); - $tmp_thumb = './img/ic_load1.png'; - - $orig_img_url = $img_url; - $orig_thumb_url = $thumb_url; - - // 画像がキャッシュされていないとき - // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める - } else { - // 画像がブラックリストorエラーログにあるか確認 - if (false !== ($errcode = $icdb->ic2_isError($url))) { - return " {$str}"; - } - - $cached = false; - - $orig_img_url = $img_url; - $orig_thumb_url = $thumb_url; - $img_url .= $this->img_memo_query; - $thumb_url .= $this->img_memo_query; - $thumb_size = ''; - $tmp_thumb = './img/ic_load2.png'; - } - - // キャッシュされておらず、表示数制限が有効のとき - if (!$cached && !$pre_thumb_unlimited && !$pre_thumb_ignore_limit) { - // 表示制限を超えていたら、表示しない - // 表示制限を超えていなければ、表示制限カウンタを下げる - if ($pre_thumb_limit <= 0) { - $show_thumb = false; - } else { - $show_thumb = true; - $pre_thumb_limit--; - } - } else { - $show_thumb = true; - } - - // 表示モード - if ($show_thumb) { - $img_tag = ""; - if ($_conf['iframe_popup']) { - $view_img = $this->imageHtmlPopup($img_url, $img_tag, $str); - } else { - $view_img = "{$img_tag}{$str}"; - } - } else { - $img_tag = ""; - $view_img = "{$img_tag}{$str}"; - } - - // ソースへのリンクをime付きで表示 - if ($_conf['expack.ic2.enabled'] && $_conf['expack.ic2.through_ime']) { - $ime_url = P2Util::throughIme($url); - if ($_conf['iframe_popup'] == 3) { - $ime_mark = ''; - } else { - $ime_mark = '[ime]'; - } - $view_img .= " {$ime_mark}"; - } - - $view_img .= ''; - - return $view_img; - } - - return false; - } - - // }}} - // {{{ plugin_replaceImageUrl() - - /** - * 置換画像URL+ImageCache2 - */ - public function plugin_replaceImageUrl($url, $purl, $str) - { - static $serial = 0; - - global $_conf; - global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit; - - // +Wiki - global $replaceImageUrlCtl; - - $url = $purl[0]; - $replaced = $replaceImageUrlCtl->replaceImageUrl($url); - if (!$replaced[0]) { - return false; - } - - foreach ($replaced as $v) { - $url_en = rawurlencode($v['url']); - $url_ht = p2h($v['url']); - $ref_en = $v['referer'] ? '&ref=' . rawurlencode($v['referer']) : ''; - - // 準備 - $serial++; - $thumb_id = 'thumbs' . $serial . $this->thumb_id_suffix; - $tmp_thumb = './img/ic_load.png'; - - $icdb = new ImageCache2_DataObject_Images(); - - // r=0:リンク;r=1:リダイレクト;r=2:PHPで表示 - // t=0:オリジナル;t=1:PC用サムネイル;t=2:携帯用サムネイル;t=3:中間イメージ - // +Wiki - $img_url = 'ic2.php?r=1&uri=' . $url_en . $ref_en; - $thumb_url = 'ic2.php?r=1&t=1&uri=' . $url_en . $ref_en; - // お気にスレ自動画像ランク - $rank = null; - if ($_conf['expack.ic2.fav_auto_rank']) { - $rank = $this->getAutoFavRank(); - if ($rank !== null) $thumb_url .= '&rank=' . $rank; - } - - // DBに画像情報が登録されていたとき - if ($icdb->get($v['url'])) { - - // ウィルスに感染していたファイルのとき - if ($icdb->mime == 'clamscan/infected') { - $result .= ""; - continue; - } - // あぼーん画像のとき - if ($icdb->rank < 0) { - $result .= ""; - continue; - } - - // オリジナルがキャッシュされているときは画像を直接読み込む - $_img_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); - if (file_exists($_img_url)) { - $img_url = $_img_url; - $cached = true; - } else { - $cached = false; - } - - // サムネイルが作成されていているときは画像を直接読み込む - $_thumb_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); - if (file_exists($_thumb_url)) { - $thumb_url = $_thumb_url; - // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 - if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false){ - $update = new ImageCache2_DataObject_Images(); - if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { - $update->memo = $this->img_memo . ' ' . $icdb->memo; - } else { - $update->memo = $this->img_memo; - } - $update->whereAddQuoted('uri', '=', $v['url']); - } - - // expack.ic2.fav_auto_rank_override の設定とランク条件がOKなら - // お気にスレ自動画像ランクを上書き更新 - if ($rank !== null && - self::isAutoFavRankOverride($icdb->rank, $rank)) { - if ($update === null) { - $update = new ImageCache2_DataObject_Images(); - $update->whereAddQuoted('uri', '=', $v['url']); - } - $update->rank = $rank; - } - - if ($update !== null) { - $update->update(); - } - } - - // サムネイルの画像サイズ - $thumb_size = $this->thumbnailer->calc($icdb->width, $icdb->height); - $thumb_size = preg_replace('/(\d+)x(\d+)/', 'width="$1" height="$2"', $thumb_size); - $tmp_thumb = './img/ic_load1.png'; - - $orig_img_url = $img_url; - $orig_thumb_url = $thumb_url; - - // 画像がキャッシュされていないとき - // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める - } else { - // 画像がブラックリストorエラーログにあるか確認 - if (false !== ($errcode = $icdb->ic2_isError($v['url']))) { - $result .= ""; - continue; - } - - $cached = false; - - $orig_img_url = $img_url; - $orig_thumb_url = $thumb_url; - $img_url .= $this->img_memo_query; - $thumb_url .= $this->img_memo_query; - $thumb_size = ''; - $tmp_thumb = './img/ic_load2.png'; - } - - // キャッシュされておらず、表示数制限が有効のとき - if (!$cached && !$pre_thumb_unlimited && !$pre_thumb_ignore_limit) { - // 表示制限を超えていたら、表示しない - // 表示制限を超えていなければ、表示制限カウンタを下げる - if ($pre_thumb_limit <= 0) { - $show_thumb = false; - } else { - $show_thumb = true; - $pre_thumb_limit--; - } - } else { - $show_thumb = true; - } - - // 表示モード - if ($show_thumb) { - $img_tag = ""; - if ($_conf['iframe_popup']) { - $view_img = $this->imageHtmlPopup($img_url, $img_tag, ''); - } else { - $view_img = "{$img_tag}"; - } - } else { - $img_tag = ""; - $view_img = "{$img_tag}"; - } - - $view_img .= '"; - . "'{$url_ht}', event)\">"; - - $result .= $view_img; - } - // ソースへのリンクをime付きで表示 - $ime_url = P2Util::throughIme($url); - $result .= "{$str}"; - return $result; - } - - /** - * +Wiki:リンクプラグイン - */ - public function plugin_linkPlugin($url, $purl, $str) - { - return $GLOBALS['linkPluginCtl']->replaceLinkToHTML($url, $str); - } - - // }}} - // {{{ plugin_imepitaToImageCache2() - - /** - * imepitaのURLを加工してImageCache2させるプラグイン - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_imepitaToImageCache2($url, $purl, $str) - { - if (preg_match('{^https?://imepita\.jp/(?:image/)?(\d{8}/\d{6})}i', - $purl[0], $m) && empty($purl['query'])) { - $_url = 'http://imepita.jp/image/' . $m[1]; - $_purl = @parse_url($_url); - $_purl[0] = $_url; - return $this->plugin_imageCache2($_url, $_purl, $str, true, $url); - } - return false; - } - - // }}} - // }}} - // {{{ getQuotebacksJson() - - public function getQuotebacksJson() - { - $ret = array(); - foreach ($this->getQuoteFrom() as $resnum => $quote_from) { - if (!$quote_from) { - continue; - } - if ($resnum != 1 && ($resnum < $this->thread->resrange['start'] || $resnum > $this->thread->resrange['to'])) { - continue; - } - $tmp = array(); - foreach ($quote_from as $quote) { - if ($quote != 1 && ($quote < $this->thread->resrange['start'] || $quote > $this->thread->resrange['to'])) { - continue; - } - $tmp[] = $quote; - } - if ($tmp) $ret[] = "{$resnum}:[" . join(',', $tmp) . "]"; - } - return '{' . join(',', $ret) . '}'; - } - - // }}} - // {{{ getResColorJs() - - public function getResColorJs() - { - global $_conf, $STYLE; - - $fontstyle_bold = empty($STYLE['fontstyle_bold']) ? 'normal' : $STYLE['fontstyle_bold']; - $fontweight_bold = empty($STYLE['fontweight_bold']) ? 'normal' : $STYLE['fontweight_bold']; - $fontfamily_bold = $STYLE['fontfamily_bold']; - $backlinks = $this->getQuotebacksJson(); - $colors = array(); - $backlink_colors = join(',', - array_map(create_function('$x', 'return "\'{$x}\'";'), - explode(',', $_conf['backlink_coloring_track_colors'])) - ); - $prefix = $this->_matome ? "t{$this->_matome}" : ''; - return << -if (typeof rescolObjs == 'undefined') rescolObjs = []; -rescolObjs.push((function() { - var obj = new BacklinkColor('{$prefix}'); - obj.colors = [{$backlink_colors}]; - obj.highlightStyle = {fontStyle :'{$fontstyle_bold}', fontWeight : '{$fontweight_bold}', fontFamily : '{$fontfamily_bold}'}; - obj.backlinks = {$backlinks}; - return obj; -})()); - -EOJS; - } - - // }}} - // {{{ getIdsForRenderJson() - - public function getIdsForRenderJson() - { - $ret = array(); - if ($this->_ids_for_render) { - foreach ($this->_ids_for_render as $id => $count) { - $ret[] = "'{$id}':{$count}"; - } - } - return '{' . join(',', $ret) . '}'; - } - - // }}} - // {{{ getIdColorJs() - - public function getIdColorJs() - { - global $_conf, $STYLE; - - if ($_conf['coloredid.enable'] < 1 || $_conf['coloredid.click'] < 1) { - return ''; - } - if (count($this->thread->idcount) < 1) { - return ''; - } - - $idslist = $this->getIdsForRenderJson(); - - $rate = $_conf['coloredid.rate.times']; - $tops = $this->getIdCountRank(10); - $average = $this->getIdCountAverage(); - $color_init = ''; - if ($_conf['coloredid.rate.type'] > 0) { - switch($_conf['coloredid.rate.type']) { - case 2: - $init_rate = $tops; - break; - case 3: - $init_rate = $average; - break; - case 1: - $init_rate = $rate; - default: - } - if ($init_rate > 1) - $color_init .= 'idCol.initColor(' . $init_rate . ', idslist);'; - } - $color_init .= "idCol.rate = {$rate};"; - if (!$this->_matome) { - $color_init .= "idCol.tops = {$tops};"; - $color_init .= "idCol.average = {$average};"; - } - $hissiCount = $_conf['coloredid.rate.hissi.times']; - $mark_colors = join(',', - array_map(create_function('$x', 'return "\'{$x}\'";'), - explode(',', $_conf['coloredid.marking.colors'])) - ); - $fontstyle_bold = empty($STYLE['fontstyle_bold']) ? 'normal' : $STYLE['fontstyle_bold']; - $fontweight_bold = empty($STYLE['fontweight_bold']) ? 'normal' : $STYLE['fontweight_bold']; - $fontfamily_bold = $STYLE['fontfamily_bold']; - $uline = $STYLE['a_underline_none'] != 1 - ? 'idCol.colorStyle["textDecoration"] = "underline"' : ''; - return << -(function() { -var idslist = {$idslist}; -if (typeof idCol == 'undefined') { - idCol = new IDColorChanger(idslist, {$hissiCount}); - idCol.colors = [{$mark_colors}]; -{$uline}; - idCol.highlightStyle = {fontStyle :'{$fontstyle_bold}', fontWeight : '{$fontweight_bold}', fontFamily : '{$fontfamily_bold}', fontSize : '104%'}; -} else idCol.addIdlist(idslist); -{$color_init} -idCol.setupSPM('{$this->spmObjName}'); -})(); - -EOJS; - } - - // }}} - // {{{ getIdCountAverage() - - public function getIdCountAverage() - { - if ($this->_idcount_average !== null) { - return $this->_idcount_average; - } - - $sum = 0; - $param = 0; - - foreach ($this->thread->idcount as $count) { - if ($count > 1) { - $sum += $count; - $param++; - } - } - - $result = ($param < 1) ? 0 : intval(ceil($sum / $param)); - $this->_idcount_average = $result; - - return $result; - } - - // }}} - // {{{ getIdCountRank() - - public function getIdCountRank($rank) - { - if ($this->_idcount_tops !== null) { - return $this->_idcount_tops; - } - - $ranking = array(); - - foreach ($this->thread->idcount as $count) { - if ($count > 1) { - $ranking[] = $count; - } - } - - if (count($ranking) == 0) { - return 0; - } - - rsort($ranking); - $rcount = count($ranking); - - $result = ($rcount >= $rank) ? $ranking[$rank - 1] : $ranking[$rcount - 1]; - $this->_idcount_tops = $result; - - return $result; - } - - // }}} -} - -// }}} - -/* - * Local Variables: - * mode: php - * coding: cp932 - * tab-width: 4 - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End: - */ -// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/rep2/live_read.php b/rep2/live_read.php index e9f9b1650..e3d9bb49a 100755 --- a/rep2/live_read.php +++ b/rep2/live_read.php @@ -1,6 +1,6 @@ getThreadInfoFromIdx(); -//========================================================== -// preview >>1 -//========================================================== - -//if (!empty($_GET['onlyone'])) { -if (!empty($_GET['one'])) { - $aThread->ls = '1'; - $aThread->resrange = array('start' => 1, 'to' => 1, 'nofirst' => false); - - // 必ずしも正確ではないが便宜的に - //if (!isset($aThread->rescount) && !empty($_GET['rc'])) { - if (!isset($aThread->rescount) && !empty($_GET['rescount'])) { - //$aThread->rescount = $_GET['rc']; - $aThread->rescount = (int)$_GET['rescount']; - } - - $preview = $aThread->previewOne(); - $ptitle_ht = p2h($aThread->itaj) . ' / ' . $aThread->ttitle_hd; - - include READ_HEADER_INC_PHP; - echo $preview; - include READ_FOOTER_INC_PHP; - - return; -} - //=========================================================== // DATのダウンロード //=========================================================== @@ -284,99 +258,10 @@ //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("datToHtml"); if ($aThread->rescount) { - $mainhtml = ''; - require_once P2_LIB_DIR . '/live/live_ShowThreadPc.php'; - $aShowThread = new ShowThreadPc($aThread); - - if ($_conf['expack.spm.enabled']) { - echo $aShowThread->getSpmObjJs(); - } - - $res1 = $aShowThread->quoteOne(); // >>1ポップアップ用 - if ($_conf['coloredid.enable'] > 0 && $_conf['coloredid.click'] > 0 && - $_conf['coloredid.rate.type'] > 0) { - if ($_GET['showbl']) { - $mainhtml = $aShowThread->datToHtml_resFrom(true); - } else { - $mainhtml .= $aShowThread->datToHtml(true); - } - $mainhtml .= $res1['q']; - } else { - if ($_GET['showbl']) { - $aShowThread->datToHtml_resFrom(); - } else { - $aShowThread->datToHtml(); - } - echo $res1['q']; - } - - - // レス追跡カラー - if ($_conf['backlink_coloring_track']) { - echo $aShowThread->getResColorJs(); - } - - // IDカラーリング - if ($_conf['coloredid.enable'] > 0 && $_conf['coloredid.click'] > 0) { - echo $aShowThread->getIdColorJs(); - // ブラウザ負荷軽減のため、CSS書き換えスクリプトの後でコンテンツを - // レンダリングさせる - echo $mainhtml; - } - - // 外部ツール - $pluswiki_js = ''; - - if ($_conf['wiki.idsearch.spm.mimizun.enabled']) { - if (!class_exists('Mimizun', false)) { - require P2_PLUGIN_DIR . '/mimizun/Mimizun.php'; - } - $mimizun = new Mimizun(); - $mimizun->host = $aThread->host; - $mimizun->bbs = $aThread->bbs; - if ($mimizun->isEnabled()) { - $pluswiki_js .= "WikiTools.addMimizun({$aShowThread->spmObjName});"; - } - } - - if ($_conf['wiki.idsearch.spm.hissi.enabled']) { - if (!class_exists('Hissi', false)) { - require P2_PLUGIN_DIR . '/hissi/Hissi.php'; - } - $hissi = new Hissi(); - $hissi->host = $aThread->host; - $hissi->bbs = $aThread->bbs; - if ($hissi->isEnabled()) { - $pluswiki_js .= "WikiTools.addHissi({$aShowThread->spmObjName});"; - } - } - - if ($_conf['wiki.idsearch.spm.stalker.enabled']) { - if (!class_exists('Stalker', false)) { - require P2_PLUGIN_DIR . '/stalker/Stalker.php'; - } - $stalker = new Stalker(); - $stalker->host = $aThread->host; - $stalker->bbs = $aThread->bbs; - if ($stalker->isEnabled()) { - $pluswiki_js .= "WikiTools.addStalker({$aShowThread->spmObjName});"; - } - } - - if ($pluswiki_js !== '') { - echo << -// - -EOP; - } + echo '
    '; } elseif ($aThread->diedat && count($aThread->datochi_residuums) > 0) { - require_once P2_LIB_DIR . '/ShowThreadPc.php'; - $aShowThread = new ShowThreadPc($aThread); - echo $aShowThread->getDatochiResiduums(); + echo '過去ログ又はDATを取得出来ないスレッドは実況できません'; } //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("datToHtml"); @@ -404,37 +289,6 @@ } flush(); -//=========================================================== -// idxの値を設定、記録 -//=========================================================== -if ($aThread->rescount) { - - // 検索の時は、既読数を更新しない - if ((isset($GLOBALS['word']) && strlen($GLOBALS['word']) > 0) || $is_ajax) { - $aThread->readnum = $idx_data[5]; - } else { - $aThread->readnum = min($aThread->rescount, max(0, $idx_data[5], $aThread->resrange['to'])); - } - $newline = $aThread->readnum + 1; // $newlineは廃止予定だが、旧互換用に念のため - - $sar = array($aThread->ttitle, $aThread->key, $idx_data[2], $aThread->rescount, '', - $aThread->readnum, $idx_data[6], $idx_data[7], $idx_data[8], $newline, - $idx_data[10], $idx_data[11], $aThread->datochiok); - P2Util::recKeyIdx($aThread->keyidx, $sar); // key.idxに記録 -} - -//=========================================================== -// 履歴を記録 -//=========================================================== -if ($aThread->rescount && !$is_ajax) { - recRecent(implode('<>', array($aThread->ttitle, $aThread->key, $idx_data[2], '', '', - $aThread->readnum, $idx_data[6], $idx_data[7], $idx_data[8], $newline, - $aThread->host, $aThread->bbs))); -} - -// NGあぼーんを記録 -NgAbornCtl::saveNgAborns(); - // 以上 --------------------------------------------------------------- exit; @@ -462,63 +316,6 @@ function detectThread() } } -// }}} -// {{{ recRecent() - -/** - * 履歴を記録する - */ -function recRecent($data) -{ - global $_conf; - - $lock = new P2Lock($_conf['recent_idx'], false); - - // $_conf['recent_idx'] ファイルがなければ生成 - FileCtl::make_datafile($_conf['recent_idx']); - - $lines = FileCtl::file_read_lines($_conf['recent_idx'], FILE_IGNORE_NEW_LINES); - $neolines = array(); - - // {{{ 最初に重複要素を削除しておく - - if (is_array($lines)) { - foreach ($lines as $l) { - $lar = explode('<>', $l); - $data_ar = explode('<>', $data); - if ($lar[1] == $data_ar[1]) { continue; } // keyで重複回避 - if (!$lar[1]) { continue; } // keyのないものは不正データ - $neolines[] = $l; - } - } - - // }}} - - // 新規データ追加 - array_unshift($neolines, $data); - - while (sizeof($neolines) > $_conf['rct_rec_num']) { - array_pop($neolines); - } - - // {{{ 書き込む - - if ($neolines) { - $cont = ''; - foreach ($neolines as $l) { - $cont .= $l . "\n"; - } - - if (FileCtl::file_write_contents($_conf['recent_idx'], $cont) === false) { - p2die('cannot write file.'); - } - } - - // }}} - - return true; -} - // }}} /* diff --git a/rep2/post.php b/rep2/post.php index d07f7a907..0902dde02 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -858,6 +858,14 @@ function showCookieConfirmation($host, $response) $form->appendChild($elem); } + // 実況モード + if (!empty($_POST['live'])) { + $elem = $hidden->cloneNode(); + $elem->setAttribute('name', 'live'); + $elem->setAttribute('value', '1'); + $form->appendChild($elem); + } + // 強制ビュー指定 if ($_conf['b'] != $_conf['client_type']) { $elem = $hidden->cloneNode(); From 97ad2e4c9ee4a6201fe7fd65604c05517f7a7d0f Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 18 Mar 2015 11:01:42 +0900 Subject: [PATCH 069/339] =?UTF-8?q?=E4=B8=8B=E6=9B=B8=E3=81=8D=E4=BF=9D?= =?UTF-8?q?=E5=AD=98(expack.editor.savedraft)=E3=81=8C=E7=84=A1=E5=8A=B9?= =?UTF-8?q?=E3=81=AA=E3=81=A8=E3=81=8D=E3=81=AB=E5=AE=9F=E6=B3=81=E3=83=A2?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=81=8B=E3=82=89=E6=9B=B8=E3=81=8D=E8=BE=BC?= =?UTF-8?q?=E3=82=81=E3=81=AA=E3=81=84=E4=B8=8D=E5=85=B7=E5=90=88=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/live_post_form.php | 103 ++++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 52 deletions(-) diff --git a/rep2/live_post_form.php b/rep2/live_post_form.php index 7214d3bce..14182b32a 100755 --- a/rep2/live_post_form.php +++ b/rep2/live_post_form.php @@ -124,61 +124,60 @@ echo << EOP; +} +// +live 書込規制用タイマー +if ($_GET['w_reg'] && $_conf['live.write_regulation']) { + $load_control = "cd_on()"; + if ($_conf['live.write_regulation'] == 3) { + $count_down_second = "31"; + } else if ($_conf['live.write_regulation'] == 2) { + $count_down_second = "21"; + } else if ($_conf['live.write_regulation'] == 1) { + $count_down_second = "11"; + } +} else { + $load_control = "cd_off()"; + $count_down_second = "0"; +} - // +live 書込規制用タイマー - if ($_GET['w_reg'] && $_conf['live.write_regulation']) { - $load_control = "cd_on()"; - if ($_conf['live.write_regulation'] == 3) { - $count_down_second = "31"; - } else if ($_conf['live.write_regulation'] == 2) { - $count_down_second = "21"; - } else if ($_conf['live.write_regulation'] == 1) { - $count_down_second = "11"; - } - } else { - $load_control = "cd_off()"; - $count_down_second = "0"; - } - - echo << - - -LIVE; +echo << + + +LIVE; + $body_on_load = << Date: Wed, 18 Mar 2015 22:58:40 +0900 Subject: [PATCH 070/339] =?UTF-8?q?Revert=20"=E6=B6=88=E3=81=97=E3=81=A6?= =?UTF-8?q?=E3=82=82=E5=AE=9F=E6=B3=81=E3=81=AB=E5=BD=B1=E9=9F=BF=E3=81=AA?= =?UTF-8?q?=E3=81=95=E3=81=9D=E3=81=86=E3=81=AA=E3=81=AE=E3=81=A7live/live?= =?UTF-8?q?=5FShowThread.php=E3=82=92=E5=89=8A=E9=99=A4"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit b808ad83a8ee82f991d752364a80401210cb3712. 谺。縺ッ谿コ縺吶ょソ縺壽ョコ縺吶 --- lib/live/live_ShowThread.php | 2050 ++++++++++++++++++++++++++++++++ lib/live/live_ShowThreadPc.php | 1999 +++++++++++++++++++++++++++++++ rep2/live_read.php | 209 +++- rep2/post.php | 8 - rep2/read.php | 4 +- rep2/read_async.php | 8 - 6 files changed, 4257 insertions(+), 21 deletions(-) create mode 100755 lib/live/live_ShowThread.php create mode 100755 lib/live/live_ShowThreadPc.php diff --git a/lib/live/live_ShowThread.php b/lib/live/live_ShowThread.php new file mode 100755 index 000000000..9d205aedb --- /dev/null +++ b/lib/live/live_ShowThread.php @@ -0,0 +1,2050 @@ +(<[Aa][ ].+?>)(.*?)()) # リンク(PCREの特性上、必ずこのパターンを最初に試行する) +| +(?: + (?P # 引用 + ((?:>|>){1,2}[ ]?) # 引用符 + ( + (?:[1-9]\\d{0,3}) # 1つ目の番号 + (?: + (?:[ ]?(?:[,=]|、)[ ]?[1-9]\\d{0,3})+ # 連続 + | + -(?:[1-9]\\d{0,3})? # 範囲 + )? + ) + (?=\\D|$) + ) # 引用ここまで +| # PHP 5.3縛りにするなら、↓の\'のエスケープを外し、NOWDOCにする + (?P(ftp|h?t?tps?)://([0-9A-Za-z][\\w;/?:@=&$\\-_.+!*\'(),#%\\[\\]^~]+)) # URL + ([^\\s<>]*) # URLの直後、タグorホワイトスペースが現れるまでの文字列 +| + (?PID:[ ]?([0-9A-Za-z/.+]{8,11})(?=[^0-9A-Za-z/.+]|$)) # ID(8,10桁 +PC/携帯識別フラグ) +) +}x'; + + /** + * リダイレクタの種類 + * + * @var int + */ + const REDIRECTOR_NONE = 0; + const REDIRECTOR_IMENU = 1; + const REDIRECTOR_PINKTOWER = 2; + const REDIRECTOR_MACHIBBS = 3; + + /** + * NGあぼーんの種類 + * + * @var int + */ + const ABORN = -1; + const NG_NONE = 0; + const NG_NAME = 1; + const NG_MAIL = 2; + const NG_ID = 4; + const NG_MSG = 8; + const NG_FREQ = 16; + const NG_CHAIN = 32; + const NG_AA = 64; + + // }}} + // {{{ static properties + + /** + * まとめ読みモード時のスレッド数 + * + * @var int + */ + static private $_matome_count = 0; + + /** + * 本文以外がNGあぼーんにヒットした総数 + * + * @var int + */ + static protected $_ngaborns_head_hits = 0; + + /** + * 本文がNGあぼーんにヒットした総数 + * + * @var int + */ + static protected $_ngaborns_body_hits = 0; + + /** + * getAnchorRegex() のキャッシュ + * + * @var array + */ + static private $_anchorRegexes = array(); + + /** + * _getAnchorRegexParts() のキャッシュ + * + * @var array + */ + static private $_anchorRegexParts = null; + + // }}} + // {{{ properties + + /** + * まとめ読みモード時のスレッド番号 + * + * @var int + */ + protected $_matome; + + /** + * URLを処理する関数・メソッド名などを格納する配列 + * (組み込み) + * + * @var array + */ + protected $_url_handlers; + + /** + * URLを処理する関数・メソッド名などを格納する配列 + * (ユーザ定義、組み込みのものより優先) + * + * @var array + */ + protected $_user_url_handlers; + + /** + * 頻出IDをあぼーんする + * + * @var bool + */ + protected $_ngaborn_frequent; + + /** + * NG or あぼーんレスがあるかどうか + * + * @var bool + */ + protected $_has_ngaborns; + + /** + * あぼーんレス番号およびNGレス番号を格納する配列 + * array_intersect()を効率よく行うため、該当するレス番号は文字列にキャストして格納する + * + * @var array + */ + protected $_aborn_nums; + protected $_ng_nums; + + /** + * リダイレクタの種類 + * + * @var int + */ + protected $_redirector; + + /** + * スレッドオブジェクト + * + * @var ThreadRead + */ + public $thread; + + /** + * アクティブモナー・オブジェクト + * + * @var ActiveMona + */ + public $activeMona; + + /** + * アクティブモナーが有効か否か + * + * @var bool + */ + public $am_enabled = false; + + /** + * 引用しているレス番号を登録した配列 + * + * @var array + */ + protected $_quote_res_nums; + + + /** + * 引用チェック済みレス番号の配列 + * + * @var array + */ + protected $_quote_res_nums_checked; + + /** + * 引用変換済みレス番号の配列 + * + * @var array + */ + protected $_quote_res_nums_done; + + /** + * レス番号チェックの再帰の深さ + * + * @var int + */ + private $_quote_check_depth; + + /** + * デフォルトの名前 + * + * @var string + */ + protected $_nanashiName = null; + + /** + * 被アンカーを集計した配列(範囲アンカー含む) // [被参照レス番 : [参照レス番, ...], ...) + * + * @var array + */ + protected $_quote_from = null; + + /** + * アンカーを集計した配列(範囲アンカー除く) // [レス番 : [参照先レス番, ...], ...) + * + * @var array + */ + protected $_quote_to = null; + + /** + * お気に自動ランク + * + * @var bool + */ + private $_auto_fav_rank = false; + + /** + * リンクするサムネイルを生成するクラスのインスタンス + * + * @var ImageCache2_Thumbnailer + */ + public $thumbnailer; + + /** + * インライン表示するサムネイルを生成するクラスのインスタンス + * + * @var ImageCache2_Thumbnailer + */ + public $inline_prvw; + + /** + * インラインサムネイルのID属性接尾辞 + * + * @var string + */ + public $thumb_id_suffix; + + /** + * 画像に付加するメモ + * + * @var string + */ + public $img_memo; + + /** + * 画像にメモを付けるためのクエリ文字列 + * + * @var string + */ + public $img_memo_query; + + /** + * 画像解像度 + * + * @var float + */ + public $img_dpr = 1.0; + + /** + * 画像解像度を指定するクエリ文字列 + * + * @var string + */ + public $img_dpr_query; + + // }}} + // {{{ constructor + + /** + * コンストラクタ + */ + protected function __construct(ThreadRead $aThread, $matome = false) + { + global $_conf; + + // スレッドオブジェクトを登録 + $this->thread = $aThread; + $this->str_to_link_regex = $this->_buildStrToLinkRegex(); + + // まとめ読みモードか否か + if ($matome) { + $this->_matome = ++self::$_matome_count; + } else { + $this->_matome = false; + } + + $this->_url_handlers = array(); + $this->_user_url_handlers = array(); + + $this->_ngaborn_frequent = 0; + if ($_conf['ngaborn_frequent']) { + if ($_conf['ngaborn_frequent_dayres'] == 0) { + $this->_ngaborn_frequent = $_conf['ngaborn_frequent']; + } elseif ($this->thread->setDayRes() && $this->thread->dayres < $_conf['ngaborn_frequent_dayres']) { + $this->_ngaborn_frequent = $_conf['ngaborn_frequent']; + } + } + + $this->_has_ngaborns = false; + $this->_aborn_nums = array(); + $this->_ng_nums = array(); + + if (P2Util::isHostBbsPink($this->thread->host)) { + $this->_redirector = self::REDIRECTOR_PINKTOWER; + } elseif (P2Util::isHost2chs($this->thread->host)) { + $this->_redirector = self::REDIRECTOR_IMENU; + } elseif (P2Util::isHostMachiBbs($this->thread->host)) { + $this->_redirector = self::REDIRECTOR_MACHIBBS; + } else { + $this->_redirector = self::REDIRECTOR_NONE; + } + + $this->_quote_res_nums = array(); + $this->_quote_res_nums_checked = array(); + $this->_quote_res_nums_done = array(); + } + + // }}} + + /** + * @param void + * @return void + */ + protected function setBbsNonameName() + { + $st = new SettingTxt($this->thread->host, $this->thread->bbs); + $st->setSettingArray(); + if (array_key_exists('BBS_NONAME_NAME', $st->setting_array)) { + $BBS_NONAME_NAME = $st->setting_array['BBS_NONAME_NAME']; + if (strlen($BBS_NONAME_NAME)) { + $this->_nanashiName = $BBS_NONAME_NAME; + } + } + } + + // {{{ getDatToHtml() + + /** + * DatをHTML変換したものを取得する + * + * @param bool $is_fragment + * @return bool|string + */ + public function getDatToHtml($is_fragment = false) + { + return $this->datToHtml(true, $is_fragment); + } + public function getDatToHtml_resFrom($is_fragment = false) + { + return $this->datToHtml_resFrom(true, $is_fragment); + } + + // }}} + // {{{ datToHtml() + + /** + * DatをHTMLに変換して表示する + * + * @param bool $capture trueなら変換結果を出力せずに返す + * @param bool $is_fragment trueなら
    で囲まない + * @return bool|string + */ + public function datToHtml($capture = false, $is_fragment = false) + { + global $_conf, $filter_hits, $last_hit_resnum; + + $aThread = $this->thread; + + // 表示レス範囲が指定されていなければ + if (!$aThread->resrange) { + $error = '

    p2 error: {$this->resrange} is false at datToHtml()

    '; + if ($capture) { + return $error; + } else { + echo $error; + return false; + } + } + + $start = $aThread->resrange['start']; + $to = $aThread->resrange['to']; + $nofirst = $aThread->resrange['nofirst']; + + $is_ktai = $_conf['ktai']; + $resFilter = ResFilter::getFilter(); + if ($resFilter && $resFilter->hasWord()) { + $do_filtering = true; + $nofirst = true; + } else { + $do_filtering = false; + } + + $datlines = $aThread->datlines; + $count = count($datlines); + + $buf['body'] = $is_fragment ? '' : "
    \n"; + $buf['q'] = ''; + + // まず 1 を表示 + if (!$nofirst) { + $res = $this->transRes($datlines[0], 1); + if (is_array($res)) { + $buf['body'] .= $res['body']; + $buf['q'] .= $res['q'] ? $res['q'] : ''; + } else { + $buf['body'] .= $res; + } + } + + // 連鎖のため、範囲外のNGあぼーんチェック + if ($_conf['ngaborn_chain_all'] && empty($_GET['nong'])) { + $pre = min($count, $start); + for ($i = ($nofirst) ? 0 : 1; $i < $pre; $i++) { + $n = $i + 1; + list($name, $mail, $date_id, $msg) = $aThread->explodeDatLine($datlines[$i]); + if (($id = $aThread->ids[$n]) !== null) { + $date_id = str_replace($aThread->idp[$n] . $id, "ID:$id", $date_id); + } + $this->_ngAbornCheck($n, strip_tags($name), $mail, $date_id, $id, $msg); + } + } + + // フィルタリング + if ($do_filtering) { + $datlines = $resFilter->apply($this); + $filter_hits = $resFilter->hits; + $last_hit_resnum = $resFilter->last_hit_resnum; + } + + // 指定範囲を表示 + $i = 0; + $n = 0; + $rn = 0; + + if ($do_filtering) { + if (!empty($resFilter->range)) { + $start = $resFilter->range['start']; + $to = $resFilter->range['to']; + } + $pattern = $resFilter->getPattern(); + } else { + $pattern = null; + } + + foreach ($datlines as $i => $ares) { + if ($ares === null) { + continue; + } + $n++; + if ($i === 0 && !$nofirst) { + continue; + } + if ($n < $start) { + continue; + } + if ($n > $to) { + break; + } + $rn = $i + 1; + $res = $this->transRes($ares, $rn, $pattern); + if (is_array($res)) { + $buf['body'] .= $res['body']; + $buf['q'] .= $res['q'] ? $res['q'] : ''; + } else { + $buf['body'] .= $res; + } + if (!$capture && $n % 10 == 0) { + echo $buf['body']; + if ($do_filtering && !$is_ktai) { + echo "\n"; + } + flush(); + $buf['body'] = ''; + } + } + + if ($this->thread->readnum < $rn) { + $this->thread->readnum = $rn; + } + + if ($do_filtering && !$is_ktai) { + $buf['body'] .= "\n"; + } + +// +live オートリロードされるスレ内容の表示部 +echo <<
    \n +LIVE; + + if (!$is_fragment) { + $buf['body'] .= "\n"; + } + + if ($capture) { + return $buf['body'] . $buf['q']; + } else { + echo $buf['body']; + echo $buf['q']; + flush(); + return true; + } + } + + /** + * 指定の書込みへのレスをHTMLに変換して表示する + * + * @param bool $capture trueなら変換結果を出力せずに返す + * @param bool $is_fragment trueなら
    で囲まない + * @param bool $show_rootres trueなら指定の書込みも結果に含める + * @return bool|string + */ + public function datToHtml_resFrom($capture = false, $is_fragment = false, $show_rootres = false) + { + global $_conf; + + $aThread = $this->thread; + + // 表示レスが指定されていなければ + $target = $aThread->resrange['start']; + if (!$aThread->resrange || $target != $aThread->resrange['to']) { + $error = '

    p2 error: {$this->resrange} is false at datToHtml()

    '; + if ($capture) { + return $error; + } else { + echo $error; + return false; + } + } + + $datlines = $aThread->datlines; + $count = count($datlines); + + $buf['body'] = $is_fragment ? '' : "
    \n"; + $buf['q'] = ''; + + // 連鎖のため、範囲外のNGあぼーんチェック + if ($_conf['ngaborn_chain_all'] && empty($_GET['nong'])) { + $pre = min($count, $start); + for ($i = ($nofirst) ? 0 : 1; $i < $pre; $i++) { + $n = $i + 1; + list($name, $mail, $date_id, $msg) = $aThread->explodeDatLine($datlines[$i]); + if (($id = $aThread->ids[$n]) !== null) { + $date_id = str_replace($aThread->idp[$n] . $id, "ID:$id", $date_id); + } + $this->_ngAbornCheck($n, strip_tags($name), $mail, $date_id, $id, $msg); + } + } + + // レス展開 + $datlines = array_fill(0, count($aThread->datlines), null); + if ($show_rootres) { + $datlines[$target - 1] = $aThread->datlines[$target - 1]; + } + list($name, $mail, $date_id, $msg) = + $aThread->explodeDatLine($aThread->datlines[$target - 1]); + foreach ($this->checkQuoteResNums($target, $name, $msg, false, true, false) as $rn) { + $ri = $rn - 1; + if ($datlines[$ri] === null) { + $datlines[$ri] = $aThread->datlines[$ri]; + } + } + + // 表示 + $i = 0; + $n = 0; + $rn = 0; + foreach ($datlines as $i => $ares) { + if ($ares === null) { + continue; + } + $n++; + $rn = $i + 1; + $res = $this->transRes($ares, $rn); + if (is_array($res)) { + $buf['body'] .= $res['body']; + $buf['q'] .= $res['q'] ? $res['q'] : ''; + } else { + $buf['body'] .= $res; + } + if (!$capture && $n % 10 == 0) { + echo $buf['body']; + flush(); + $buf['body'] = ''; + } + } + + if (!$is_fragment) { + $buf['body'] .= "
    \n"; + } + + if ($capture) { + return $buf['body'] . $buf['q']; + } else { + echo $buf['body']; + echo $buf['q']; + flush(); + return true; + } + } + + // }}} + // {{{ transRes() + + /** + * DatレスをHTMLレスに変換する + * + * @param string $ares datの1ライン + * @param int $i レス番号 + * @return string + */ + abstract public function transRes($ares, $i); + + // }}} + // {{{ transName() + + /** + * 名前をHTML用に変換する + * + * @param string $name 名前 + * @return string + */ + abstract public function transName($name); + + // }}} + // {{{ transMsg() + + /** + * datのレスメッセージをHTML表示用メッセージに変換する + * + * @param string $msg メッセージ + * @param int $mynum レス番号 + * @return string + */ + abstract public function transMsg($msg, $mynum); + + // }}} + // {{{ replaceBeId() + + /** + * BEプロファイルリンク変換 + */ + public function replaceBeId($date_id, $i) + { + global $_conf; + + $beid_replace = "thread->host}/test/read.cgi/{$this->thread->bbs}/{$this->thread->key}/{$i}\"{$_conf['ext_win_target_at']}>Lv.\$2"; + + // + $be_match = '||i'; + if (preg_match($be_match, $date_id)) { + $date_id = preg_replace($be_match, $beid_replace, $date_id); + + } else { + + $beid_replace = "thread->host}/test/read.cgi/{$this->thread->bbs}/{$this->thread->key}/{$i}\"{$_conf['ext_win_target_at']}>?\$2"; + $date_id = preg_replace('|BE: ?(\d+)-(#*)|i', $beid_replace, $date_id); + } + + return $date_id; + } + + // }}} + // {{{ _ngAbornCheck() + + /** + * NGあぼーんチェック + * + * @param int $i レス番号 + * @param string $name 名前欄 + * @param string $mail メール欄 + * @param string $date_id 日付・ID欄 + * @param string $id ID + * @param string $msg レス本文 + * @param bool $nong NGチェックをするかどうか + * @param array &$info NGの理由が格納される変数の参照 + * @return int NGタイプ。ShowThread::NG_XXX のビット和か ShowThread::ABORN + */ + protected function _ngAbornCheck($i, $name, $mail, $date_id, $id, $msg, $nong = false, &$info = null) + { + global $_conf, $ngaborns_hits; + + $info = array(); + $type = self::NG_NONE; + + // {{{ 頻出IDチェック + + if ($this->_ngaborn_frequent && $id && $this->thread->idcount[$id] >= $_conf['ngaborn_frequent_num']) { + if (!$_conf['ngaborn_frequent_one'] && $id == $this->thread->ids[1]) { + // >>1 はそのまま表示 + } elseif ($this->_ngaborn_frequent == 1) { + $ngaborns_hits['aborn_freq']++; + return $this->_markNgAborn($i, self::ABORN, false); + } elseif (!$nong) { + $ngaborns_hits['ng_freq']++; + $type |= $this->_markNgAborn($i, self::NG_FREQ, false); + $info[] = sprintf('頻出ID:%s(%d)', $id, $this->thread->idcount[$id]); + } + } + + // }}} + // {{{ 連鎖チェック + + if ($_conf['ngaborn_chain'] && $this->_has_ngaborns && + preg_match_all('/(?:>|>)([1-9][0-9\\-,]*)/', $msg, $matches) + ) { + $references = array_unique(preg_split('/[-,]+/', + trim(implode(',', $matches[1]), '-,'), + -1, + PREG_SPLIT_NO_EMPTY)); + $intersections = array_intersect($references, $this->_aborn_nums); + $info_suffix = ''; + + if ($intersections) { + if ($_conf['ngaborn_chain'] == 1) { + $ngaborns_hits['aborn_chain']++; + return $this->_markNgAborn($i, self::ABORN, true); + } + if ($nong) { + $intersections = null; + } else { + $info_suffix = '(' . (($_conf['ktai']) ? 'アボン' : 'あぼーん') . ')'; + } + } elseif (!$nong) { + $intersections = array_intersect($references, $this->_ng_nums); + } + + if ($intersections) { + $ngaborns_hits['ng_chain']++; + $type |= $this->_markNgAborn($i, self::NG_CHAIN, true); + $info[] = sprintf('連鎖NG:>>%d%s', current($intersections), $info_suffix); + } + } + + // }}} + // {{{ あぼーんチェック + + // あぼーんレス + if ($this->abornResCheck($i) !== false) { + $ngaborns_hits['aborn_res']++; + return $this->_markNgAborn($i, self::ABORN, false); + } + + // あぼーんネーム + if ($this->ngAbornCheck('aborn_name', $name) !== false) { + $ngaborns_hits['aborn_name']++; + return $this->_markNgAborn($i, self::ABORN, false); + } + + // あぼーんメール + if ($this->ngAbornCheck('aborn_mail', $mail) !== false) { + $ngaborns_hits['aborn_mail']++; + return $this->_markNgAborn($i, self::ABORN, false); + } + + // あぼーんID + if ($this->ngAbornCheck('aborn_id', $date_id) !== false) { + $ngaborns_hits['aborn_id']++; + return $this->_markNgAborn($i, self::ABORN, false); + } + + // あぼーんメッセージ + if ($this->ngAbornCheck('aborn_msg', $msg) !== false) { + $ngaborns_hits['aborn_msg']++; + return $this->_markNgAborn($i, self::ABORN, true); + } + + // }}} + + if ($nong) { + return $type; + } + + // {{{ NGチェック + + // NGネームチェック + if ($this->ngAbornCheck('ng_name', $name) !== false) { + $ngaborns_hits['ng_name']++; + $type |= $this->_markNgAborn($i, self::NG_NAME, false); + } + + // NGメールチェック + if ($this->ngAbornCheck('ng_mail', $mail) !== false) { + $ngaborns_hits['ng_mail']++; + $type |= $this->_markNgAborn($i, self::NG_MAIL, false); + } + + // NGIDチェック + if ($this->ngAbornCheck('ng_id', $date_id) !== false) { + $ngaborns_hits['ng_id']++; + $type |= $this->_markNgAborn($i, self::NG_ID, false); + } + + // NGメッセージチェック + $a_ng_msg = $this->ngAbornCheck('ng_msg', $msg); + if ($a_ng_msg !== false) { + $ngaborns_hits['ng_msg']++; + $type |= $this->_markNgAborn($i, self::NG_MSG, true); + $info[] = sprintf('NG%s:%s', + ($_conf['ktai']) ? 'ワード' : 'ワード', + p2h($a_ng_msg)); + } + + // }}} + + return $type; + } + + // }}} + // {{{ _markNgAborn() + + /** + * NGあぼーんにヒットしたレス番号を記録する + * + * @param int $num レス番号 + * @param int $type NGあぼーんの種類 + * @param bool $isBody 本文にヒットしたかどうか + * @return int $typeと同じ値 + */ + protected function _markNgAborn($num, $type, $isBody) + { + if ($type) { + if ($isBody) { + self::$_ngaborns_body_hits++; + } else { + self::$_ngaborns_head_hits++; + } + + // array_intersect()を効率よく行うため、レス番号を文字列型にキャストする + $str = (string)$num; + if ($type == self::ABORN) { + $this->_aborn_nums[$num] = $str; + } else { + $this->_ng_nums[$num] = $str; + } + + $this->_has_ngaborns = true; + } + + return $type; + } + + // }}} + // {{{ ngAbornCheck() + + /** + * NGあぼーんチェック + */ + public function ngAbornCheck($code, $resfield, $ic = false) + { + global $ngaborns; + + //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection('ngAbornCheck()'); + + if (isset($ngaborns[$code]['data']) && is_array($ngaborns[$code]['data'])) { + // +Wiki:BEあぼーん + if ($code == 'aborn_be' || $code == 'ng_be') { + // プロフィールIDを抜き出す + if (preg_match('/BE:(\\d+)/', $resfield, $matches)) { + $beId = P2UtilWiki::calcBeId((int)$matches[1]); + if ($beId === 0) { + return false; + } + $resfield = (string)$beId; + } else { + return false; + } + } + + $bbs = $this->thread->bbs; + $title = $this->thread->ttitle_hc; + + foreach ($ngaborns[$code]['data'] as $k => $v) { + // 板チェック + if (isset($v['bbs']) && in_array($bbs, $v['bbs']) == false) { + continue; + } + + // タイトルチェック + if (isset($v['title']) && stripos($title, $v['title']) === false) { + continue; + } + + // ワードチェック + // 正規表現 + if ($v['regex']) { + $re_method = $v['regex']; + /*if ($re_method($v['word'], $resfield, $matches)) { + $this->ngAbornUpdate($code, $k); + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); + return p2h($matches[0]); + }*/ + if ($re_method($v['word'], $resfield)) { + $this->ngAbornUpdate($code, $k); + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); + return $v['cond']; + } + // +Wiki:BEあぼーん(完全一致) + } elseif ($code == 'aborn_be' || $code == 'ng_be') { + if ($resfield == $v['word']) { + $this->ngAbornUpdate($code, $k); + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); + return $v['cond']; + } + // 大文字小文字を無視 + } elseif ($ic || $v['ignorecase']) { + if (stripos($resfield, $v['word']) !== false) { + $this->ngAbornUpdate($code, $k); + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); + return $v['cond']; + } + // 単純に文字列が含まれるかどうかをチェック + } else { + if (strpos($resfield, $v['word']) !== false) { + $this->ngAbornUpdate($code, $k); + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); + return $v['cond']; + } + } + } + } + + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); + return false; + } + + // }}} + // {{{ abornResCheck() + + /** + * 特定レスの透明あぼーんチェック + */ + public function abornResCheck($resnum) + { + global $ngaborns; + + $target = $this->thread->host . '/' . $this->thread->bbs . '/' . $this->thread->key . '/' . $resnum; + + if (isset($ngaborns['aborn_res']['data']) && is_array($ngaborns['aborn_res']['data'])) { + foreach ($ngaborns['aborn_res']['data'] as $k => $v) { + if ($ngaborns['aborn_res']['data'][$k]['word'] == $target) { + $this->ngAbornUpdate('aborn_res', $k); + return true; + } + } + } + return false; + } + + // }}} + // {{{ ngAbornUpdate() + + /** + * NG/あぼ〜ん日時と回数を更新 + */ + public function ngAbornUpdate($code, $k) + { + global $ngaborns; + + if (isset($ngaborns[$code]['data'][$k])) { + $ngaborns[$code]['data'][$k]['lasttime'] = date('Y/m/d G:i'); // HIT時間を更新 + if (empty($ngaborns[$code]['data'][$k]['hits'])) { + $ngaborns[$code]['data'][$k]['hits'] = 1; // 初HIT + } else { + $ngaborns[$code]['data'][$k]['hits']++; // HIT回数を更新 + } + } + } + + // }}} + // {{{ addURLHandler() + + /** + * ユーザ定義URLハンドラ(メッセージ中のURLを書き換える関数)を追加する + * + * ハンドラは最初に追加されたものから順番に試行される + * URLはハンドラの返り値(文字列)で置換される + * falseを帰した場合は次のハンドラに処理が委ねられる + * + * ユーザ定義URLハンドラの引数は + * 1. string $url URL + * 2. array $purl URLをparse_url()したもの + * 3. string $str パターンにマッチした文字列、URLと同じことが多い + * 4. object $aShowThread 呼び出し元のオブジェクト + * である + * 常にfalseを返し、内部で処理するだけの関数を登録してもよい + * + * @param callback $function コールバックメソッド + * @return void + * @access public + * @todo ユーザ定義URLハンドラのオートロード機能を実装 + */ + public function addURLHandler($function) + { + $this->_user_url_handlers[] = $function; + } + + // }}} + // {{{ stripLineBreaks() + + /** + * 文末の改行と連続する改行を取り除く + * + * @param string $msg + * @param string $replacement + * @return string + */ + public function stripLineBreaks($msg, $replacement = '

    ') + { + if (P2_MBREGEX_AVAILABLE) { + $msg = mb_ereg_replace('(?:[\\s ]*
    )+[\\s ]*$', '', $msg); + $msg = mb_ereg_replace('(?:[\\s ]*
    ){3,}', $replacement, $msg); + } else { + mb_convert_variables('UTF-8', 'CP932', $msg, $replacement); + $msg = preg_replace('/(?:[\\s\\x{3000}]*
    )+[\\s\\x{3000}]*$/u', '', $msg); + $msg = preg_replace('/(?:[\\s\\x{3000}]*
    ){3,}/u', $replacement, $msg); + $msg = mb_convert_encoding($msg, 'CP932', 'UTF-8'); + } + + return $msg; + } + + // }}} + // {{{ transLink() + + /** + * リンク対象文字列を変換する + * + * @param string $str + * @return string + */ + public function transLink($str) + { + return preg_replace_callback($this->str_to_link_regex, array($this, 'transLinkDo'), $str); + } + + // }}} + // {{{ transLinkDo() + + /** + * リンク対象文字列の種類を判定して対応した関数/メソッドに渡す + * + * @param array $s + * @return string + */ + public function transLinkDo(array $s) + { + global $_conf; + + $orig = $s[0]; + $following = ''; + + // PHP 5.2.7 未満の preg_replace_callback() では名前付き捕獲式集合が使えないので + /* + if (!array_key_exists('link', $s)) { + $s['link'] = $s[1]; + $s['quote'] = $s[5]; + $s['url'] = $s[8]; + $s['id'] = $s[11]; + } + */ + + // マッチしたサブパターンに応じて分岐 + // リンク + if ($s['link']) { + if (preg_match('{ href=(["\'])?(.+?)(?(1)\\1)(?=[ >])}i', $s[2], $m)) { + $url = $m[2]; + $str = $s[3]; + } else { + return $s[3]; + } + + // 引用 + } elseif ($s['quote']) { + return preg_replace_callback( + self::getAnchorRegex('/(%prefix%)?(%a_range%)/'), + array($this, '_quoteResCallback'), $s['quote']); + + // http or ftp のURL + } elseif ($s['url']) { + if ($_conf['ktai'] && $s[9] == 'ftp') { + return $orig; + } + $url = preg_replace('/^t?(tps?)$/', 'ht$1', $s[9]) . '://' . $s[10]; + $str = $s['url']; + $following = $s[11]; + if (strlen($following) > 0) { + // ウィキペディア日本語版のURLで、SJISの2バイト文字の上位バイト + // (0x81-0x9F,0xE0-0xEF)が続くとき + if (P2Util::isUrlWikipediaJa($url)) { + $leading = ord($following); + if ((($leading ^ 0x90) < 32 && $leading != 0x80) || ($leading ^ 0xE0) < 16) { + $url .= rawurlencode(mb_convert_encoding($following, 'UTF-8', 'CP932')); + $str .= $following; + $following = ''; + } + } elseif (strpos($following, 'tp://') !== false) { + // 全角スペース+URL等の場合があるので再チェック + $following = $this->transLink($following); + } + } + + // ID + } elseif ($s['id'] && $_conf['flex_idpopup']) { // && $_conf['flex_idlink_k'] + return $this->idFilter($s['id'], $s[12]); + + // その他(予備) + } else { + return strip_tags($orig); + } + + // リダイレクタを外す + switch ($this->_redirector) { + case self::REDIRECTOR_IMENU: + $url = preg_replace('{^([a-z]+://)ime\\.nu/}', '$1', $url); + break; + case self::REDIRECTOR_PINKTOWER: + $url = preg_replace('{^([a-z]+://)pinktower\\.com/}', '$1', $url); + break; + case self::REDIRECTOR_MACHIBBS: + $url = preg_replace('{^[a-z]+://machi(?:bbs\\.com|\\.to)/bbs/link\\.cgi\\?URL=}', '', $url); + break; + } + + // エスケープされていない特殊文字をエスケープ + $url = p2h($url, false); + $str = p2h($str, false); + // 実態参照・数値参照を完全にデコードしようとすると負荷が大きいし、 + // "&"以外の特殊文字はほとんどの場合URLエンコードされているはずなので + // 中途半端に凝った処理はせず、"&"→"&"のみ再変換する。 + $raw_url = str_replace('&', '&', $url); + + // URLをパース・ホストを検証 + $purl = @parse_url($raw_url); + if (!$purl || !array_key_exists('host', $purl) || + strpos($purl['host'], '.') === false || + $purl['host'] == '127.0.0.1' || + //HostCheck::isAddressLocal($purl['host']) || + //HostCheck::isAddressPrivate($purl['host']) || + P2Util::isHostExample($purl['host'])) + { + return $orig; + } + // URLのマッチングで"&"を考慮しなくて済むように、生のURLを登録しておく + $purl[0] = $raw_url; + + // URLを処理 + foreach ($this->_user_url_handlers as $handler) { + if (false !== ($link = call_user_func($handler, $url, $purl, $str, $this))) { + return $link . $following; + } + } + foreach ($this->_url_handlers as $handler) { + if (false !== ($link = $this->$handler($url, $purl, $str))) { + return $link . $following; + } + } + + return $orig; + } + + // }}} + // {{{ idFilter() + + /** + * IDフィルタリング変換 + * + * @param string $idstr ID:xxxxxxxxxx + * @param string $id xxxxxxxxxx + * @return string + */ + abstract public function idFilter($idstr, $id); + + // }}} + // {{{ _idFilterCallback() + + /** + * IDフィルタリング変換 + * + * @param array $s 正規表現にマッチした要素の配列 + * @return string + */ + protected function _idFilterCallback(array $s) + { + return $this->idFilter($s[0], $s[1]); + } + + // }}} + // {{{ _quoteNameCallback() + + /** + * @param array $s + * @return string HTML + */ + protected function _quoteNameCallback($s) + { + return preg_replace_callback( + self::getAnchorRegex('/(%prefix%)?(%a_num%)/'), + array($this, '_quoteResCallback'), $s[0] + ); + } + + // }}} + // {{{ quoteRes() + + /** + * 引用変換(単独) + * + * @param string $full >>1 + * @param string $qsign >> + * @param string $appointed_num 1 + * @return string + */ + abstract public function quoteRes($full, $qsign, $appointed_num); + + // }}} + // {{{ _quoteResCallback() + + /** + * 引用変換(単独) + * + * @param array $s 正規表現にマッチした要素の配列 + * @return string + */ + protected function _quoteResCallback(array $s) + { + return $this->quoteRes($s[0], $s[1], $s[2]); + } + + // }}} + // {{{ quoteResRange() + + /** + * 引用変換(範囲) + * + * @param string $full >>1-100 + * @param string $qsign >> + * @param string $appointed_num 1-100 + * @return string + */ + abstract public function quoteResRange($full, $qsign, $appointed_num); + + // }}} + // {{{ _quoteResRangeCallback() + + /** + * 引用変換(範囲) + * + * @param array $s 正規表現にマッチした要素の配列 + * @return string + */ + protected function _quoteResRangeCallback(array $s) + { + return $this->quoteResRange($s[0], $s[1], $s[2]); + } + + // }}} + // {{{ checkQuoteResNums() + + /** + * HTMLメッセージ中の引用レスの番号を再帰チェックする + */ + public function checkQuoteResNums($res_num, $name, $msg, + $with_quotes = true, + $with_backlinks = null, + $cascade = true) + { + global $_conf; + + $this->_quote_check_depth = 0; + + if ($with_backlinks === null) { + $with_backlinks = ($_conf['backlink_list'] > 0 || $_conf['backlink_block'] > 0) ? true : false; + } + + if ($with_backlinks) { + return $this->checkQuoteResNumsFromSummary( + $res_num == 0 ? 1 : $res_num, $with_quotes, $with_backlinks); + } + + return $this->_checkQuoteResNums($res_num, $name, $msg); + } + + // }}} + // {{{ _checkQuoteResNums() + + /** + * HTMLメッセージ中の引用レスの番号を再帰チェックする + */ + protected function _checkQuoteResNums($res_num, $name, $msg) + { + // 再帰リミッタ + if ($this->_quote_check_depth > 30) { + return array(); + } else { + $this->_quote_check_depth++; + } + + if (array_key_exists($res_num, $this->_quote_res_nums)) { + return $this->_quote_res_nums[$res_num]; + } + + $aThread = $this->thread; + + $quote_res_nums = array(); + + $name = preg_replace('/(◆.*)/', '', $name, 1); + + // 名前 + if ($matches = $this->getQuoteResNumsName($name)) { + foreach ($matches as $a_quote_res_num) { + if ($a_quote_res_num) { + $quote_res_nums[] = $a_quote_res_num; + $a_quote_res_idx = $a_quote_res_num - 1; + + // 自分自身の番号と同一でなければ、 + if ($a_quote_res_num != $res_num) { + // チェックしていない番号を再帰チェック + if (!isset($this->_quote_res_nums_checked[$a_quote_res_num])) { + $this->_quote_res_nums_checked[$a_quote_res_num] = true; + if (isset($aThread->datlines[$a_quote_res_idx])) { + $datalinear = $aThread->explodeDatLine($aThread->datlines[$a_quote_res_idx]); + $quote_name = $datalinear[0]; + $quote_msg = $aThread->datlines[$a_quote_res_idx]; + $quote_res_nums = array_merge($quote_res_nums, + $this->_checkQuoteResNums($a_quote_res_num, + $quote_name, + $quote_msg)); + } + } + } + } + // $name=preg_replace("/([0-9]+)/", "", $name, 1); + } + } + + // >>1のリンクをいったん外す + // >>1 + $msg = preg_replace('{<[Aa] .+?>(>>[1-9][\\d\\-]*)}', '$1', $msg); + + //echo $msg; + if (preg_match_all(self::getAnchorRegex('/%full%/'), $msg, $out, PREG_PATTERN_ORDER)) { + foreach ($out[2] as $numberq) { + if ($matches=preg_split(self::getAnchorRegex('/%delimiter%/'), $numberq)) { + foreach ($matches as $a_quote_res_num) { + if (preg_match(self::getAnchorRegex('/%range_delimiter%/'),$a_quote_res_num)) { continue;} + $a_quote_res_num = (int) (mb_convert_kana($a_quote_res_num, 'n')); + $a_quote_res_idx = $a_quote_res_num - 1; + + //echo $a_quote_res_num; + + if (!$a_quote_res_num) {break;} + $quote_res_nums[] = $a_quote_res_num; + + // 自分自身の番号と同一でなければ、 + if ($a_quote_res_num != $res_num) { + // チェックしていない番号を再帰チェック + if (!isset($this->_quote_res_nums_checked[$a_quote_res_num])) { + $this->_quote_res_nums_checked[$a_quote_res_num] = true; + if (isset($aThread->datlines[$a_quote_res_idx])) { + $datalinear = $aThread->explodeDatLine($aThread->datlines[$a_quote_res_idx]); + $quote_name = $datalinear[0]; + $quote_msg = $aThread->datlines[$a_quote_res_idx]; + $quote_res_nums = array_merge($quote_res_nums, + $this->_checkQuoteResNums($a_quote_res_num, + $quote_name, + $quote_msg)); + } + } + } + + } + + } + + } + + } + + if (count($quote_res_nums)) { + sort($quote_res_nums, SORT_NUMERIC); + $this->_quote_res_nums[$res_num] = array_unique($quote_res_nums); + $quote_res_nums = $this->_quote_res_nums[$res_num]; + } + + return $quote_res_nums; + } + + // }}} + // {{{ checkQuoteResNumsFromSummary() + + /** + * 引用レス集計結果からポップアップ用に用意すべき番号を再帰チェックする + */ + public function checkQuoteResNumsFromSummary($res_num, $with_quotes, $with_backlinks) + { + // 再帰リミッタ + if ($this->_quote_check_depth > 3000) { + return array(); + } else { + $this->_quote_check_depth++; + } + + $ret = array(); + + // 参照レス + if ($with_quotes) { + $ret = array_merge($ret, + $this->_checkQuoteResNumsFromSummary( + $res_num, $this->getQuoteTo(), $with_quotes, $with_backlinks)); + } + // 被参照レス + if ($with_backlinks) { + $ret = array_merge($ret, + $this->_checkQuoteResNumsFromSummary( + $res_num, $this->getQuoteFrom(), $with_quotes, $with_backlinks)); + } + return $ret; + } + + // }}} + // {{{ _checkQuoteResNumsFromSummary() + + protected function _checkQuoteResNumsFromSummary($res_num, $quotes, $with_quotes, $with_backlinks) + { + $ret = array(); + if (array_key_exists($res_num, $quotes)) { + foreach ($quotes[$res_num] as $quote_num) { + $ret[] = $quote_num; + if ($quote_num != $res_num) { + if (!isset($this->_quote_res_nums_checked[$quote_num])) { + $this->_quote_res_nums_checked[$quote_num] = true; + $ret = array_merge($ret, + $this->checkQuoteResNumsFromSummary($quote_num, $with_quotes, $with_backlinks)); + } + } + } + } + return $ret; + } + + // }}} + // {{{ getQuoteResNumsName() + + public function getQuoteResNumsName($name) + { + if (strlen(trim($name)) == 0 || $name == $this->_nanashiName) { + return false; + } + + // トリップを除去 + $name = preg_replace('/◆.*/', '', $name, 1); + $name = strip_tags($name); + + /* + //if (preg_match('/[0-9]+/', $name, $m)) { + return (int)$m[0]; + } + */ + + if (preg_match_all(self::getAnchorRegex('/(?:^|%prefix%)(%nums%)/'), $name, $matches)) { + foreach ($matches[1] as $a_quote_res_num) { + $quote_res_nums[] = (int)mb_convert_kana($a_quote_res_num, 'n'); + } + return array_unique($quote_res_nums); + } + + return false; + } + + // }}} + // {{{ _wikipediaFilter() + + /** + * [[語句]]があった時にWikipediaへ自動リンク + * + * @param string $msg メッセージ + * @return string + * + * original code: + * http://akid.s17.xrea.com/p2puki/index.phtml?%A5%E6%A1%BC%A5%B6%A1%BC%A5%AB%A5%B9%A5%BF%A5%DE%A5%A4%A5%BA%28rep2%20Ver%201.7.0%A1%C1%29#led2c85d + */ + protected function _wikipediaFilter($msg) + { + if (strpos($msg, '[[') === false) { + return $msg; + } + + $msg = preg_replace_callback('/\\[\\[([^\\[\\]\\n<>]+)\\]\\]+/u', + array($this, '_linkToWikipeidaCallback'), + mb_convert_encoding($msg, 'UTF-8', 'CP932')); + + return mb_convert_encoding($msg, 'CP932', 'UTF-8'); + } + + // }}} + // {{{ _linkToWikipeidaCallback() + + /** + * Wikipediaの語句をリンクに変換して返す. + * + * @param array $matches + * @return string + */ + protected function _linkToWikipeidaCallback($matches) + { + return '[[' . $this->_linkToWikipeida($matches[1]) . ']]'; + } + + // }}} + // {{{ _linkToWikipeida() + + /** + * Wikipediaの語句をリンクに変換して返す. + * + * @param string $word 語句 + * @return string + */ + abstract protected function _linkToWikipeida($word); + + // }}} + // {{{ _makeQuotes() + + /** + * レスデータを集計して$this->_quote_toと$this->_quote_fromに保存. + */ + protected function _makeQuotes() + { + global $_conf; + + $this->_quote_to = array(); + $this->_quote_from = array(); + + if (!$this->thread->datlines) { + return; + } + + foreach ($this->thread->datlines as $num => $line) { + list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($line); + + // NGあぼーんチェック + if (($id = $this->thread->ids[$num + 1]) !== null) { + $date_id = str_replace($this->thread->idp[$i] . $id, 'ID:' . $id, $date_id); + } + $ng_type = $this->_ngAbornCheck($num + 1, strip_tags($name), $mail, $date_id, $id, $msg); + if ($ng_type == self::ABORN) { + continue; + } + + // 名前 + if ($nmatches = $this->getQuoteResNumsName($name)) { + foreach ($nmatches as $a_quote_res_num) { + if ($a_quote_res_num) { + if (!array_key_exists($a_quote_res_num, $this->_quote_from) || $this->_quote_from[$a_quote_res_num] === null) { + $this->_quote_from[$a_quote_res_num] = array(); + } + if (!in_array($num + 1, $this->_quote_from[$a_quote_res_num])) { + $this->_quote_from[$a_quote_res_num][] = $num + 1; + } + + if (!array_key_exists($num + 1, $this->_quote_to) || $this->_quote_to[$num + 1] === null) { + $this->_quote_to[$num + 1] = array(); + } + if (!in_array($a_quote_res_num, $this->_quote_to[$num + 1])) { + $this->_quote_to[$num + 1][] = $a_quote_res_num; + } + } + } + } + + + // >>1のリンクをいったん外す + // >>1 + $msg = preg_replace('{<[Aa] .+?>(>>[1-9][\\d\\-]*)}', '$1', $msg); + if (!preg_match_all(self::getAnchorRegex('/%full%/'), $msg, $out, PREG_PATTERN_ORDER)) { + continue; + } + foreach ($out[2] as $numberq) { + if (!preg_match_all(self::getAnchorRegex('/(?:%prefix%)?(%a_range%)/'), $numberq, $anchors, PREG_PATTERN_ORDER)) continue; + foreach ($anchors[1] as $anchor) { + if (preg_match(self::getAnchorRegex('/(%a_num%)%range_delimiter%(?:%prefix%)?(%a_num%)/'), $anchor, $matches)) { + $from = intval(mb_convert_kana($matches[1], 'n')); + $to = intval(mb_convert_kana($matches[2], 'n')); + if ($from < 1 || $to < 1 || $from > $to + || ($to - $from + 1) > sizeof($this->thread->datlines)) { + continue; + } + if ($_conf['backlink_list_range_anchor_limit'] != 0) { + if ($to - $from >= $_conf['backlink_list_range_anchor_limit']) { + continue; + } + } + for ($i = $from; $i <= $to; $i++) { + if ($i > sizeof($this->thread->datlines)) { + break; + } + if ($_conf['backlink_list_future_anchor'] == 0) { + // レス番号以降のアンカーは無視する + if ($i >= $num + 1) { + continue; + } + } + if (!array_key_exists($i, $this->_quote_from) || $this->_quote_from[$i] === null) { + $this->_quote_from[$i] = array(); + } + if (!in_array($num + 1, $this->_quote_from[$i])) { + $this->_quote_from[$i][] = $num + 1; + } + } + } elseif (preg_match(self::getAnchorRegex('/(%a_num%)/'), $anchor, $matches)) { + $quote_num = intval(mb_convert_kana($matches[1], 'n')); + if (!array_key_exists($num + 1, $this->_quote_to) || $this->_quote_to[$num + 1] === null) { + $this->_quote_to[$num + 1] = array(); + } + if (!in_array($quote_num, $this->_quote_to[$num + 1])) { + $this->_quote_to[$num + 1][] = $quote_num; + } + + if ($_conf['backlink_list_future_anchor'] == 0) { + // レス番号以降のアンカーは無視する + if ($quote_num >= $num + 1) { + continue; + } + } + if (!array_key_exists($quote_num, $this->_quote_from) || $this->_quote_from[$quote_num] === null) { + $this->_quote_from[$quote_num] = array(); + } + if (!in_array($num + 1, $this->_quote_from[$quote_num])) { + $this->_quote_from[$quote_num][] = $num + 1; + } + } + } + } + } + } + + // }}} + // {{{ getQuoteFrom() + + /** + * 被レスリストを返す. + * + * @return array + */ + public function getQuoteFrom() + { + if ($this->_quote_from === null) { + $this->_makeQuotes(); // 被レスデータ集計 + } + return $this->_quote_from; + } + + // }}} + // {{{ getQuoteTo() + + /** + * レスリストを返す. + * + * @return array + */ + public function getQuoteTo() + { + if ($this->_quote_to === null) { + $this->_makeQuotes(); // レスデータ集計 + } + return $this->_quote_to; + } + + // }}} + // {{{ _quotebackListHtml() + + /** + * 被レスリストをHTMLで整形して返す. + * + * @param int $resnum レス番号 + * @param int $type 1:縦形式 2:横形式 3:展開用ブロック用文字列 + * @param bool $popup 横形式でのポップアップ処理(true:ポップアップする、false:挿入する) + * @return string + */ + protected function _quotebackListHtml($resnum, $type, $popup=true) + { + $quote_from = $this->getQuoteFrom(); + if (!array_key_exists($resnum, $quote_from)) return $ret; + + $anchors = $quote_from[$resnum]; + sort($anchors); + + if ($type == 1) { + return $this->_quotebackVerticalListHtml($anchors, $resnum); + } elseif ($type == 2) { + return $this->_quotebackHorizontalListHtml($anchors, $resnum); + } elseif ($type == 3) { + return $this->_quotebackResData($anchors, $resnum); + } + } + + // }}} + // {{{ _quotebackVerticalListHtml() + + protected function _quotebackVerticalListHtml($anchors, $resnum) + { + $ret = '
      '; + $anchor_cnt = 1; + foreach ($anchors as $anchor) { + if ($anchor_cnt > 1) { + $ret .= '
    • '; + } + if ($anchor_cnt < count($anchors)) { + $ret .= '
    • ├'; + } else { + $ret .= '
    • └'; + } + $ret .= ($anchor == $resnum) + ? $anchor + : $this->quoteRes($anchor, '', $anchor, true); + $anchor_cnt++; + } + $ret .= '
    '; + return $ret; + } + + // }}} + // {{{ _quotebackHorizontalListHtml() + + protected function _quotebackHorizontalListHtml($anchors, $resnum) + { + $ret = '
    '; + $count = 0; + + foreach ($anchors as $idx => $anchor) { + if ($anchor == $resnum) { + continue; + } + $anchor_link= $this->quoteRes('>>' . $anchor, '>>', $anchor); + $qres_id = ($this->_matome ? "t{$this->_matome}" : '') ."qr{$anchor}"; + $ret .= '
    '; + $ret .= sprintf('
    【参照レス:%s】
    ',$anchor_link); + $ret .= '
    '; + $count++; + } + $ret .= '
    '; + + return $ret; + } + + // }}} + // {{{ _quotebackResData() + + protected function _quotebackResData($anchors, $resnum) + { + $ret = array(); + foreach ($anchors as $idx => $anchor) { + if ($anchor == $resnum) { + continue; + } + $ret[] = ($this->_matome ? "t{$this->_matome}" : '') ."qr{$anchor}"; + } + + return join('/', $ret); + } + + // }}} + // {{{ getDatochiResiduums() + + /** + * DAT落ちの際に取得できた>>1と最後のレスをHTMLで返す. + * + * @return string|false + */ + public function getDatochiResiduums() + { + $ret = ''; + $elines = $this->thread->datochi_residuums; + if (!count($elines)) { + return $ret; + } + + $this->thread->onthefly = true; + $ret = "
    on the fly
    \n"; + $ret .= "
    \n"; + + foreach($elines as $num => $line) { + $res = $this->transRes($line, $num); + if (is_array($res)) { + $ret .= $res['body'] . $res['q']; + } else { + $ret .= $res; + } + } + + $ret .= "
    \n"; + + return $ret; + } + + // }}} + // {{{ getAutoFavRanks() + + /** + * 自動ランク設定を返す. + * + * @return array + */ + public function getAutoFavRank() + { + global $_conf; + + if ($this->_auto_fav_rank !== false) { + return $this->_auto_fav_rank; + } + + $ranks = explode(',', strtr($_conf['expack.ic2.fav_auto_rank_setting'], ' ', '')); + $ret = null; + if ($_conf['expack.misc.multi_favs']) { + $idx = 0; + if (!is_array($this->thread->favs)) { + return null; + } + foreach ($this->thread->favs as $fav) { + if ($fav) { + $rank = $ranks[$idx]; + if (is_numeric($rank)) { + $rank = intval($rank); + if ($ret === null) { + $ret = $rank; + } else { + $ret = max($ret, $rank); + } + } + } + $idx++; + } + } else { + if ($this->thread->fav && is_numeric($ranks[0])) { + $ret = intval($ranks[0]); + } + } + $this->_auto_fav_rank = $ret; + + return $ret; + } + + // }}} + // {{{ isAutoFavRankOverride() + + /** + * 自動ランク設定でランクを上書きすべきか返す. + * + * @param int $now 現在のランク + * @param int $new 自動ランク + * @return bool + */ + static public function isAutoFavRankOverride($now, $new) + { + global $_conf; + + switch ($_conf['expack.ic2.fav_auto_rank_override']) { + case 0: + return false; + break; + case 1: + return $now != $new; + break; + case 2: + return $now == 0 && $now != $new; + break; + case 3: + return $now < $new; + break; + default: + return false; + } + return false; + } + + // }}} + // {{{ getAnchorRegex() + + /** + * アンカーの正規表現を返す + * + * @param string $pattern ex)'/%full%/' + * @param boolean $unicode + * @return string + */ + static public function getAnchorRegex($pattern, $unicode = false) + { + if (!array_key_exists($pattern, self::$_anchorRegexes)) { + self::$_anchorRegexes[$pattern] = strtr($pattern, self::_getAnchorRegexParts()); + // 大差はないが compileMobile2chUriCallBack() のように preg_relplace_callback()してもいいかも。 + } + if ($unicode) { + return StrSjis::toUnicodePattern($_anchorRegexes[$pattern]); + } + return self::$_anchorRegexes[$pattern]; + } + + // }}} + // {{{ _getAnchorRegexParts() + + /** + * アンカーの構成要素(正規表現パーツの配列)を返す + * + * @param void + * @return string + */ + static private function _getAnchorRegexParts() + { + if (!is_null(self::$_anchorRegexParts)) { + return self::$_anchorRegexParts; + } + + $anchor = array(); + + // アンカーの構成要素(正規表現パーツの配列) + + // 空白文字 + $anchor_space = '(?:[ ]| )'; + //$anchor[' '] = ''; + + // アンカー引用子 >> + $anchor['prefix'] = "(?:(?:>|>|<|<|〉){1,2}|(?:\)){2}|》|≫){$anchor_space}*\.?"; + + // 数字 + $anchor['a_digit'] = '(?:\\d|0|1|2|3|4|5|6|7|8|9)'; + /* + $anchor[0] = '(?:0|0)'; + $anchor[1] = '(?:1|1)'; + $anchor[2] = '(?:2|2)'; + $anchor[3] = '(?:3|3)'; + $anchor[4] = '(?:4|4)'; + $anchor[5] = '(?:5|5)'; + $anchor[6] = '(?:6|6)'; + $anchor[7] = '(?:7|7)'; + $anchor[8] = '(?:8|8)'; + $anchor[9] = '(?:9|9)'; + */ + + // 範囲指定子 + // -|‐|ー = HYPHEN-MINUS | HYPHEN | KATAKANA-HIRAGANA PROLONGED SOUND MARK + $anchor['range_delimiter'] = '(?:-|\\x81\\x5d|\\x81\\x5b)'; // [\\-\\x{2010}\\x{30fc}] + + // 列挙指定子 + $anchor['delimiter'] = "{$anchor_space}?(?:[\.,=+]|、|・|=|,){$anchor_space}?"; + + // あぼーん用アンカー引用子 + //$anchor['prefix_abon'] = ">{1,2}{$anchor_space}?"; + + // レス番号 + $anchor['a_num'] = sprintf('%s{1,4}', $anchor['a_digit']); + + // レス範囲 + /* + $anchor['a_range'] = sprintf('%s(?:%s%s)?', + $anchor['a_num'], $anchor['range_delimiter'], $anchor['a_num'] + ); + */ + $anchor['a_range'] = sprintf('%s(?:%s(?:%s)?%s)?', + $anchor['a_num'], $anchor['range_delimiter'], $anchor['prefix'], $anchor['a_num'] + ); + + // レス範囲の列挙 + $anchor['ranges'] = sprintf('%s(?:%s%s)*(?!%s)', + $anchor['a_range'], $anchor['delimiter'], $anchor['a_range'], $anchor['a_digit'] + ); + + // レス番号の列挙 + $anchor['nums'] = sprintf('%s(?:%s%s)*(?!%s)', + $anchor['a_num'], $anchor['delimiter'], $anchor['a_num'], $anchor['a_digit'] + ); + + // アンカー全体 + $anchor['full'] = sprintf('(%s)(%s)', $anchor['prefix'], $anchor['ranges']); + + // getAnchorRegex() の strtr() 置換用にkeyを '%key%' に変換する + foreach ($anchor as $k => $v) { + $anchor['%' . $k . '%'] = $v; + unset($anchor[$k]); + } + + self::$_anchorRegexParts = $anchor; + + return self::$_anchorRegexParts; + } + + // }}} + // {{{_buildStrToLinkRegex() + + /** + * リンクとして扱うパターンを返す + * + * @param void + * @return string + */ + static protected function _buildStrToLinkRegex() + { + return '{' + . '(?P(<[Aa] .+?>)(.*?)())' // リンク(PCREの特性上、必ずこのパターンを最初に試行する) + . '|' + . '(?:' + . '(?P' // 引用 + . self::getAnchorRegex('%full%') + . ')' + . '|' + . '(?P' + . '(ftp|h?ttps?|tps?)://([0-9A-Za-z][\\w!#%&+*,\\-./:;=?@\\[\\]^~]+)' // URL + . ')' + . '|' + . '(?PID: ?([0-9A-Za-z/.+]{8,11})(?=[^0-9A-Za-z/.+]|$))' // ID(8,10桁 +PC/携帯識別フラグ) + . ')' + . '}'; + } + + // }}} +} + +// }}} + +/* + * Local Variables: + * mode: php + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ +// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/lib/live/live_ShowThreadPc.php b/lib/live/live_ShowThreadPc.php new file mode 100755 index 000000000..7c2f12102 --- /dev/null +++ b/lib/live/live_ShowThreadPc.php @@ -0,0 +1,1999 @@ +_url_handlers = array( + 'plugin_linkThread', + 'plugin_link2chSubject', + ); + // +Wiki + if (isset($GLOBALS['linkPluginCtl'])) { + $this->_url_handlers[] = 'plugin_linkPlugin'; + } + if (isset($GLOBALS['replaceImageUrlCtl'])) { + $this->_url_handlers[] = 'plugin_replaceImageUrl'; + } + if (P2_IMAGECACHE_AVAILABLE == 2) { + $this->_url_handlers[] = 'plugin_imageCache2'; + } elseif ($_conf['preview_thumbnail']) { + $this->_url_handlers[] = 'plugin_viewImage'; + } + if ($_conf['link_youtube']) { + $this->_url_handlers[] = 'plugin_linkYouTube'; + } + if ($_conf['link_niconico']) { + $this->_url_handlers[] = 'plugin_linkNicoNico'; + } + $this->_url_handlers[] = 'plugin_linkURL'; + + // imepitaのURLを加工してImageCache2させるプラグインを登録 + if (P2_IMAGECACHE_AVAILABLE == 2) { + $this->addURLHandler(array($this, 'plugin_imepitaToImageCache2')); + } + + // サムネイル表示制限数を設定 + if (!isset($GLOBALS['pre_thumb_unlimited']) || !isset($GLOBALS['pre_thumb_limit'])) { + if (isset($_conf['pre_thumb_limit']) && $_conf['pre_thumb_limit'] > 0) { + $GLOBALS['pre_thumb_limit'] = $_conf['pre_thumb_limit']; + $GLOBALS['pre_thumb_unlimited'] = false; + } else { + $GLOBALS['pre_thumb_limit'] = null; // ヌル値だとisset()はfalseを返す + $GLOBALS['pre_thumb_unlimited'] = true; + } + } + $GLOBALS['pre_thumb_ignore_limit'] = false; + + // アクティブモナー初期化 + if (P2_ACTIVEMONA_AVAILABLE) { + ExpackLoader::initActiveMona($this); + } + + // ImageCache2初期化 + if (P2_IMAGECACHE_AVAILABLE == 2) { + ExpackLoader::initImageCache($this); + } + + // 非同期レスポップアップ・SPM初期化 + $js_id = sprintf('%u', crc32($this->thread->keydat)); + if ($this->_matome) { + $this->asyncObjName = "t{$this->_matome}asp{$js_id}"; + $this->spmObjName = "t{$this->_matome}spm{$js_id}"; + } else { + $this->asyncObjName = "asp{$js_id}"; + $this->spmObjName = "spm{$js_id}"; + } + + // 名無し初期化 + $this->setBbsNonameName(); + } + + // }}} + // {{{ transRes() + + /** + * DatレスをHTMLレスに変換する + * + * @param string $ares datの1ライン + * @param int $i レス番号 + * @param string $pattern ハイライト用正規表現 + * @return string + */ + public function transRes($ares, $i, $pattern = null) + { + global $_conf, $STYLE, $mae_msg; + + list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($ares); + if (($id = $this->thread->ids[$i]) !== null) { + $idstr = 'ID:' . $id; + $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $date_id); + } else { + $idstr = null; + } + + // +Wiki:置換ワード + if (isset($GLOBALS['replaceWordCtl'])) { + $replaceWordCtl = $GLOBALS['replaceWordCtl']; + $name = $replaceWordCtl->replace('name', $this->thread, $ares, $i); + $mail = $replaceWordCtl->replace('mail', $this->thread, $ares, $i); + $date_id = $replaceWordCtl->replace('date', $this->thread, $ares, $i); + $msg = $replaceWordCtl->replace('msg', $this->thread, $ares, $i); + } + + $tores = ''; + $rpop = ''; + if ($this->_matome) { + $res_id = "t{$this->_matome}r{$i}"; + $msg_id = "t{$this->_matome}m{$i}"; + } else { + $res_id = "r{$i}"; + $msg_id = "m{$i}"; + } + $msg_class = 'message'; + + // NGあぼーんチェック + $ng_type = $this->_ngAbornCheck($i, strip_tags($name), $mail, $date_id, $id, $msg, false, $ng_info); + if ($ng_type == self::ABORN) { + return $this->_abornedRes($res_id); + } + if ($ng_type != self::NG_NONE) { + $ngaborns_head_hits = self::$_ngaborns_head_hits; + $ngaborns_body_hits = self::$_ngaborns_body_hits; + } + + // AA判定 + if ($this->am_autodetect && $this->activeMona->detectAA($msg)) { + $msg_class .= ' ActiveMona'; + } + + //============================================================= + // レスをポップアップ表示 + //============================================================= + if ($_conf['quote_res_view']) { + $quote_res_nums = $this->checkQuoteResNums($i, $name, $msg); + + foreach ($quote_res_nums as $rnv) { + if (!isset($this->_quote_res_nums_done[$rnv])) { + $this->_quote_res_nums_done[$rnv] = true; + if (isset($this->thread->datlines[$rnv-1])) { + if ($this->_matome) { + $qres_id = "t{$this->_matome}qr{$rnv}"; + } else { + $qres_id = "qr{$rnv}"; + } + $ds = $this->qRes($this->thread->datlines[$rnv-1], $rnv); + $onPopUp_at = " onmouseover=\"showResPopUp('{$qres_id}',event)\" onmouseout=\"hideResPopUp('{$qres_id}')\""; + $rpop .= "
    \n{$ds}
    \n"; + } + } + } + } + + //============================================================= + // まとめて出力 + //============================================================= + + $name = $this->transName($name); // 名前HTML変換 + $msg = $this->transMsg($msg, $i); // メッセージHTML変換 + + + // BEプロファイルリンク変換 + $date_id = $this->replaceBeId($date_id, $i); + + // HTMLポップアップ + if ($_conf['iframe_popup']) { + $date_id = preg_replace_callback("{((\?#*)|(Lv\.\d+))}", array($this, 'iframePopupCallback'), $date_id); + } + + // NGメッセージ変換 + if ($ng_type != self::NG_NONE && count($ng_info)) { + $ng_info = implode(', ', $ng_info); + $msg = <<{$ng_info} +
    {$msg}
    +EOMSG; + } + + // NGネーム変換 + if ($ng_type & self::NG_NAME) { + $name = <<{$name} +EONAME; + $msg = <<{$msg} +EOMSG; + + // NGメール変換 + } elseif ($ng_type & self::NG_MAIL) { + $mail = <<{$mail} +EOMAIL; + $msg = <<{$msg} +EOMSG; + + // NGID変換 + } elseif ($ng_type & self::NG_ID) { + $date_id = <<{$date_id} +EOID; + $msg = <<{$msg} +EOMSG; + + } + + /* + //「ここから新着」画像を挿入 + if ($i == $this->thread->readnum +1) { + $tores .= <<新着レス +EOP; + } + */ + + // SPM + if ($_conf['expack.spm.enabled']) { + $spmeh = " onmouseover=\"{$this->spmObjName}.show({$i},'{$msg_id}',event)\""; + $spmeh .= " onmouseout=\"{$this->spmObjName}.hide(event)\""; + } else { + $spmeh = ''; + } + + // +live スレ内容表示部削除 + + /*if ($_conf['expack.am.enabled'] == 2) { + $tores .= << +// +\n +EOJS; + }*/ + + // まとめてフィルタ色分け + if ($pattern) { + $tores = StrCtl::filterMarking($pattern, $tores); + } + + return array('body' => $tores, 'q' => $rpop); + } + + // }}} + // {{{ quoteOne() + + /** + * >>1 を表示する (引用ポップアップ用) + */ + public function quoteOne() + { + global $_conf; + + if (!$_conf['quote_res_view']) { + return false; + } + + $rpop = ''; + $quote_res_nums = $this->checkQuoteResNums(0, '1', ''); + if (array_search(1, $quote_res_nums) === false) { + $quote_res_nums[] = 1; + } + + foreach ($quote_res_nums as $rnv) { + if (!isset($this->_quote_res_nums_done[$rnv])) { + $this->_quote_res_nums_done[$rnv] = true; + if (isset($this->thread->datlines[$rnv-1])) { + if ($this->_matome) { + $qres_id = "t{$this->_matome}qr{$rnv}"; + } else { + $qres_id = "qr{$rnv}"; + } + $ds = $this->qRes($this->thread->datlines[$rnv-1], $rnv); + $onPopUp_at = " onmouseover=\"showResPopUp('{$qres_id}',event)\" onmouseout=\"hideResPopUp('{$qres_id}')\""; + $rpop .= "
    \n{$ds}
    \n"; + } + } + } + + $res1['q'] = $rpop; + $res1['body'] = $this->transMsg('>>1', 1); + + return $res1; + } + + // }}} + // {{{ qRes() + + /** + * レス引用HTML + */ + public function qRes($ares, $i) + { + global $_conf; + + $resar = $this->thread->explodeDatLine($ares); + $name = $this->transName($resar[0]); + $mail = $resar[1]; + if (($id = $this->thread->ids[$i]) !== null) { + $idstr = 'ID:' . $id; + $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $resar[2]); + } else { + $idstr = null; + $date_id = $resar[2]; + } + $msg = $this->transMsg($resar[3], $i); + + $tores = ''; + + if ($this->_matome) { + $qmsg_id = "t{$this->_matome}qm{$i}"; + } else { + $qmsg_id = "qm{$i}"; + } + + // >>1 + if ($i == 1) { + $tores = "

    {$this->thread->ttitle_hd}

    "; + } + + // BEプロファイルリンク変換 + $date_id = $this->replaceBeId($date_id, $i); + + // HTMLポップアップ + if ($_conf['iframe_popup']) { + $date_id = preg_replace_callback("{((\?#*)|(Lv\.\d+))}", array($this, 'iframePopupCallback'), $date_id); + } + // + + // IDフィルタ + if ($_conf['flex_idpopup'] == 1 && $id && $this->thread->idcount[$id] > 1) { + $date_id = str_replace($idstr, $this->idFilter($idstr, $id), $date_id); + } + + $msg_class = 'message'; + + // AA 判定 + if ($this->am_autodetect && $this->activeMona->detectAA($msg)) { + $msg_class .= ' ActiveMona'; + } + + // SPM + if ($_conf['expack.spm.enabled']) { + $spmeh = " onmouseover=\"{$this->spmObjName}.show({$i},'{$qmsg_id}',event)\""; + $spmeh .= " onmouseout=\"{$this->spmObjName}.hide(event)\""; + } else { + $spmeh = ''; + } + + // $toresにまとめて出力 + $tores .= '
    '; + $tores .= "{$i} : "; // 番号 + $tores .= preg_replace('{[ ]*}i', '', "{$name} : "); + if ($mail) { + $tores .= $mail . ' : '; // メール + } + $tores .= $date_id; // 日付とID + if ($this->am_side_of_id) { + $tores .= ' ' . $this->activeMona->getMona($qmsg_id); + } + $tores .= "
    \n"; + + // 被レスリスト(縦形式) + if ($_conf['backlink_list'] == 1 || $_conf['backlink_list'] > 2) { + $tores .= $this->_quotebackListHtml($i, 1); + } + + $tores .= "
    {$msg}
    \n"; // 内容 + // 被レスリスト(横形式) + if ($_conf['backlink_list'] == 2 || $_conf['backlink_list'] > 2) { + $tores .= $this->_quotebackListHtml($i, 2); + } + + // 被参照ブロック用データ + if ($_conf['backlink_block'] > 0) { + $tores .= $this->_getBacklinkComment($i); + } + + return $tores; + } + + // }}} + // {{{ _getBacklinkComment() + + protected function _getBacklinkComment($i) + { + $backlinks = $this->_quotebackListHtml($i, 3); + if (strlen($backlinks)) { + return ''; + } + return ''; + } + + // }}} + // {{{ transName() + + /** + * 名前をHTML用に変換する + * + * @param string $name 名前 + * @return string + */ + public function transName($name) + { + global $_conf; + + // トリップやホスト付きなら分解する + if (($pos = strpos($name, '◆')) !== false) { + $trip = substr($name, $pos); + $name = substr($name, 0, $pos); + } else { + $trip = null; + } + + // 数字を引用レスポップアップリンク化 + if ($_conf['quote_res_view']) { + if (strlen($name) && $name != $this->_nanashiName) { + $name = preg_replace_callback( + self::getAnchorRegex('/(?:^|%prefix%)(%nums%)/'), + array($this, '_quoteNameCallback'), $name + ); + } + } + + if ($trip) { + $name .= $trip; + } elseif ($name) { + // 文字化け回避 + $name = $name . ' '; + //if (in_array(0xF0 & ord(substr($name, -1)), array(0x80, 0x90, 0xE0))) { + // $name .= ' '; + //} + } + + return $name; + } + + // }}} + // {{{ transMsg() + + /** + * datのレスメッセージをHTML表示用メッセージに変換する + * + * @param string $msg メッセージ + * @param int $mynum レス番号 + * @return string + */ + public function transMsg($msg, $mynum) + { + global $_conf; + global $pre_thumb_ignore_limit; + + // 2ch旧形式のdat + if ($this->thread->dat_type == '2ch_old') { + $msg = str_replace('@`', ',', $msg); + $msg = preg_replace('/&(?=[^;])/', '&', $msg); + } + + // &補正 + $msg = preg_replace('/&(?!#?\\w+;)/', '&', $msg); + + // Safariから投稿されたリンク中チルダの文字化け補正 + //$msg = preg_replace('{(h?t?tp://[\w\.\-]+/)〜([\w\.\-%]+/?)}', '$1~$2', $msg); + + // >>1のリンクをいったん外す + // >>1 + $msg = preg_replace('{<[Aa] .+?>(>>\\d[\\d\\-]*)}', '$1', $msg); + + // 本来は2chのDAT時点でなされていないとエスケープの整合性が取れない気がする。(URLリンクのマッチで副作用が出てしまう) + //$msg = str_replace(array('"', "'"), array('"', '''), $msg); + + // 2006/05/06 ノートンの誤反応対策 body onload=window() + $msg = str_replace('onload=window()', 'onload=window()', $msg); + + // 新着レスの画像は表示制限を無視する設定なら + if ($mynum > $this->thread->readnum && $_conf['expack.ic2.newres_ignore_limit']) { + $pre_thumb_ignore_limit = true; + } + + // 文末の改行と連続する改行を除去 + if ($_conf['strip_linebreaks']) { + $msg = $this->stripLineBreaks($msg /*, '
    ***
    '*/); + } + + // 引用やURLなどをリンク + $msg = $this->transLink($msg); + + // Wikipedia記法への自動リンク + if ($_conf['_linkToWikipeida']) { + $msg = $this->_wikipediaFilter($msg); + } + + return $msg; + } + + // }}} + // {{{ _abornedRes() + + /** + * あぼーんレスのHTMLを取得する + * + * @param string $res_id + * @return string + */ + protected function _abornedRes($res_id) + { + global $_conf; + + if ($_conf['ngaborn_purge_aborn']) { + return ''; + } + + return << +
     
    +
     
    +\n +EOP; + } + + // }}} + // {{{ idFilter() + + /** + * IDフィルタリングポップアップ変換 + * + * @param string $idstr ID:xxxxxxxxxx + * @param string $id xxxxxxxxxx + * @return string + */ + public function idFilter($idstr, $id) + { + global $_conf; + + // IDは8桁または10桁(+携帯/PC識別子)と仮定して + /* + if (strlen($id) % 2 == 1) { + $id = substr($id, 0, -1); + } + */ + $num_ht = ''; + if (isset($this->thread->idcount[$id]) && $this->thread->idcount[$id] > 0) { + $num = (string) $this->thread->idcount[$id]; + if ($_conf['iframe_popup'] == 3) { + $num_ht = ' '; + $num_ht .= preg_replace('/\\d/', '', $num); + $num_ht .= ' '; + } else { + $num_ht = '('.$num.')'; + } + } else { + return $idstr; + } + + if ($_conf['coloredid.enable'] > 0 && preg_match("|^ID:[ ]?[0-9A-Za-z/.+]{8,11}|",$idstr)) { + if ($this->_ids_for_render === null) { + $this->_ids_for_render = array(); + } + $this->_ids_for_render[substr($id, 0, 8)] = $this->thread->idcount[$id]; + if ($_conf['coloredid.click'] > 0) { + $num_ht = '' . $num_ht . ''; + } + $idstr = $this->_coloredIdStr( + $idstr, $id, $_conf['coloredid.click'] > 0 ? true : false); + } + + $filter_url = $_conf['read_php'] . '?' . http_build_query(array( + 'host' => $this->thread->host, + 'bbs' => $this->thread->bbs, + 'key' => $this->thread->key, + 'ls' => 'all', + 'offline' => '1', + 'idpopup' => '1', + 'rf' => array( + 'field' => ResFilter::FIELD_ID, + 'method' => ResFilter::METHOD_JUST, + 'match' => ResFilter::MATCH_ON, + 'include' => ResFilter::INCLUDE_NONE, + 'word' => $id, + ), + ), '', '&') . $_conf['k_at_a']; + + if ($_conf['iframe_popup']) { + return $this->iframePopup($filter_url, $idstr, $_conf['bbs_win_target_at']) . $num_ht; + } + return "{$idstr}{$num_ht}"; + } + + // }}} + // {{{ _linkToWikipeida() + + /** + * @see ShowThread + */ + protected function _linkToWikipeida($word) + { + global $_conf; + + $link = 'http://ja.wikipedia.org/wiki/' . rawurlencode($word); + if ($_conf['through_ime']) { + $link = P2Util::throughIme($link); + } + + return "{$word}"; + } + + // }}} + // {{{ quoteRes() + + /** + * 引用変換(単独) + * + * @param string $full >>1-100 + * @param string $qsign >> + * @param string $appointed_num 1-100 + * @param bool $anchor_jump + * @return string + */ + public function quoteRes($full, $qsign, $appointed_num, $anchor_jump = false) + { + global $_conf; + + $appointed_num = mb_convert_kana($appointed_num, 'n'); // 全角数字を半角数字に変換 + if (preg_match('/\\D/', $appointed_num)) { + $appointed_num = preg_replace('/\\D+/', '-', $appointed_num); + return $this->quoteResRange($full, $qsign, $appointed_num); + } + if (preg_match('/^0/', $appointed_num)) { + return $full; + } + + $qnum = intval($appointed_num); + if ($qnum < 1 || $qnum > sizeof($this->thread->datlines)) { + return $full; + } + + // あぼーんレスへのアンカー + if ($_conf['quote_res_view_aborn'] == 0 && + in_array($qnum, $this->_aborn_nums)) { + return '' . "{$full}"; + } + + if ($anchor_jump && $qnum >= $this->thread->resrange['start'] && $qnum <= $this->thread->resrange['to']) { + $read_url = '#' . ($this->_matome ? "t{$this->_matome}" : '') . "r{$qnum}"; + } else { + $read_url = "{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&offline=1&ls={$appointed_num}"; + } + $attributes = $_conf['bbs_win_target_at']; + if ($_conf['quote_res_view'] && ($_conf['quote_res_view_ng'] != 0 || + !in_array($qnum, $this->_ng_nums))) { + if ($this->_matome) { + $qres_id = "t{$this->_matome}qr{$qnum}"; + } else { + $qres_id = "qr{$qnum}"; + } + $attributes .= " onmouseover=\"showResPopUp('{$qres_id}',event)\""; + $attributes .= " onmouseout=\"hideResPopUp('{$qres_id}')\""; + } + return "_aborn_nums) ? ' class="abornanchor"' : + (in_array($qnum, $this->_ng_nums) ? ' class="nganchor"' : '')) + . ">{$full}"; + } + + // }}} + // {{{ quoteResRange() + + /** + * 引用変換(範囲) + * + * @param string $full >>1-100 + * @param string $qsign >> + * @param string $appointed_num 1-100 + * @return string + */ + public function quoteResRange($full, $qsign, $appointed_num) + { + global $_conf; + + if ($appointed_num == '-') { + return $full; + } + + $read_url = "{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&offline=1&ls={$appointed_num}n"; + + if ($_conf['iframe_popup']) { + $pop_url = $read_url . "&renzokupop=true"; + return $this->iframePopup(array($read_url, $pop_url), $full, $_conf['bbs_win_target_at'], 1); + } + + // 普通にリンク + return "{$full}"; + + // 1つ目を引用レスポップアップ + /* + $qnums = explode('-', $appointed_num); + $qlink = $this->quoteRes($qsign . $qnum[0], $qsign, $qnum[0]) . '-'; + if (isset($qnums[1])) { + $qlink .= $qnums[1]; + } + return $qlink; + */ + } + + // }}} + // {{{ iframePopup() + + /** + * HTMLポップアップ変換 + * + * @param string|array $url + * @param string|array $str + * @param string $attr + * @param int|null $mode + * @param bool $marker + * @return string + */ + public function iframePopup($url, $str, $attr = '', $mode = null, $marker = false) + { + global $_conf; + + // リンク用URLとポップアップ用URL + if (is_array($url)) { + $link_url = $url[0]; + $pop_url = $url[1]; + } else { + $link_url = $url; + $pop_url = $url; + } + + // リンク文字列とポップアップの印 + if (is_array($str)) { + $link_str = $str[0]; + $pop_str = $str[1]; + } else { + $link_str = $str; + $pop_str = null; + } + + // リンクの属性 + if (is_array($attr)) { + $_attr = $attr; + $attr = ''; + foreach ($_attr as $key => $value) { + $attr .= ' ' . $key . '="' . p2h($value) . '"'; + } + } elseif ($attr !== '' && substr($attr, 0, 1) != ' ') { + $attr = ' ' . $attr; + } + + // リンクの属性にHTMLポップアップ用のイベントハンドラを加える + $pop_attr = $attr; + if ($_conf['iframe_popup_event'] == 1) { + $pop_attr .= " onclick=\"stophide=true; showHtmlPopUp('{$pop_url}',event,0" . ($marker ? ' ,this' : '') . "); return false;\""; + } else { + $pop_attr .= " onmouseover=\"showHtmlPopUp('{$pop_url}',event,{$_conf['iframe_popup_delay']}" . ($marker ? ' ,this' : '') . ")\""; + } + $pop_attr .= " onmouseout=\"offHtmlPopUp()\""; + + // 最終調整 + if (is_null($mode)) { + $mode = $_conf['iframe_popup']; + } + if ($mode == 2 && !is_null($pop_str)) { + $mode = 3; + } elseif ($mode == 3 && is_null($pop_str)) { + global $skin, $STYLE; + + $custom_pop_img = "skin/{$skin}/pop.png"; + if (file_exists($custom_pop_img)) { + $pop_img = p2h($custom_pop_img); + $x = $STYLE['iframe_popup_mark_width']; + $y = $STYLE['iframe_popup_mark_height']; + } else { + $pop_img = 'img/pop.png'; + $y = $x = 12; + } + $pop_str = "\"\""; + } + + // リンク作成 + switch ($mode) { + // マーク無し + case 1: + return "{$link_str}"; + // (p)マーク + case 2: + return "(p){$link_str}"; + // [p]画像、サムネイルなど + case 3: + return "{$pop_str}{$link_str}"; + // ポップアップしない + default: + return "{$link_str}"; + } + } + + // }}} + // {{{ iframePopupCallback() + + /** + * HTMLポップアップ変換(コールバック用インターフェース) + * + * @param array $s 正規表現にマッチした要素の配列 + * @return string + */ + public function iframePopupCallback($s) + { + return $this->iframePopup(p2h($s[1], false), p2h($s[3], false), $s[2]); + } + + // }}} + // {{{ _coloredIdStr() + + /** + * Merged from http://jiyuwiki.com/index.php?cmd=read&page=rep2%A4%C7%A3%C9%A3%C4%A4%CE%C7%D8%B7%CA%BF%A7%CA%D1%B9%B9&alias%5B%5D=pukiwiki%B4%D8%CF%A2 + * + * @return string + */ + protected function _coloredIdStr($idstr, $id, $classed = false) + { + global $_conf; + + if (!(isset($this->thread->idcount[$id]) + && $this->thread->idcount[$id] > 1)) { + return $idstr; + } + if ($classed) { + return $this->_coloredIdStrClassed($idstr, $id); + } + + switch ($_conf['coloredid.rate.type']) { + case 1: + $rate = $_conf['coloredid.rate.times']; + break; + case 2: + $rate = $this->getIdCountRank(10); + break; + case 3: + $rate = $this->getIdCountAverage(); + break; + default: + return $idstr; + } + + if ($rate > 1 && $this->thread->idcount[$id] >= $rate) { + switch ($_conf['coloredid.coloring.type']) { + case 0: + return $this->_coloredIdStr0($idstr, $id); + break; + case 1: + return $this->_coloredIdStr1($idstr, $id); + break; + default: + return $idstr; + } + } + + return $idstr; + } + + // }}} + // {{{ _coloredIdStrClassed() + + private function _coloredIdStrClassed($idstr, $id) + { + $ret = array(); + $arr = explode(':', $idstr); + foreach ($arr as $i => $str) { + if ($i == 0 || $i == 1) { + $ret[] = '' . $str . ''; + } else { + $ret[] = $str; + } + } + return implode(':', $ret); + } + + // }}} + // {{{ _coloredIdStr0() + + /** + * IDカラー オリジナル着色用 + */ + private function _coloredIdStr0($idstr, $id) + { + if (!function_exists('coloredIdStyle0')) { + require P2_LIB_DIR . '/color/coloredIdStyle0.inc.php'; + } + + if (isset($this->idstyles[$id])) { + $colored = $this->idstyles[$id]; + } else { + $colored = coloredIdStyle0($id, $this->thread->idcount[$id]); + $this->idstyles[$id] = $colored; + } + $ret = array(); + foreach ($arr = explode(':', $idstr) as $i => $str) { + if ($colored[$i]) { + $ret[] = "{$str}"; + } else { + $ret[] = $str; + } + } + return implode(':', $ret); + } + + // }}} + // {{{ _coloredIdStr1() + + /** + * IDカラー thermon版用 + */ + private function _coloredIdStr1($idstr, $id) + { + if (!function_exists('coloredIdStyle')) { + require P2_LIB_DIR . '/color/coloredIdStyle.inc.php'; + } + + $colored = coloredIdStyle($idstr, $id, $this->thread->idcount[$id]); + $idstr2 = preg_split('/:/',$idstr,2); // コロンでID文字列を分割 + $ret = array_shift($idstr2).':'; + if ($colored[1]) { + $idstr2[1] = substr($idstr2[0], 4); + $idstr2[0] = substr($idstr2[0], 0, 4); + } + foreach ($idstr2 as $i => $str) { + if ($colored[$i]) { + $ret .= "{$str}"; + } else { + $ret .= $str; + } + } + return $ret; + } + + // }}} + // {{{ cssClassedId() + + /** + * IDカラーに使用するCSSクラス名をID文字列から算出して返す. + */ + static public function cssClassedId($id) + { + return 'idcss-' . bin2hex( + base64_decode(str_replace('.', '+', substr($id, 0, 8)))); + } + + // }}} + // {{{ ユーティリティメソッド + // {{{ imageHtmlPopup() + + /** + * 画像をHTMLポップアップ&ポップアップウインドウサイズに合わせる + */ + public function imageHtmlPopup($img_url, $img_tag, $link_str) + { + global $_conf; + + if ($_conf['expack.ic2.enabled'] && $_conf['expack.ic2.fitimage']) { + $popup_url = 'ic2_fitimage.php?url=' . rawurlencode(str_replace('&', '&', $img_url)); + } else { + $popup_url = $img_url; + } + + $pops = ($_conf['iframe_popup'] == 1) ? $img_tag . $link_str : array($link_str, $img_tag); + return $this->iframePopup(array($img_url, $popup_url), $pops, $_conf['ext_win_target_at'], null, true); + } + + // }}} + // {{{ respopToAsync() + + /** + * レスポップアップを非同期モードに加工する + */ + public function respopToAsync($str) + { + $respop_regex = '/(onmouseover)=\"(showResPopUp\(\'(q(\d+)of\d+)\',event\).*?)\"/'; + $respop_replace = '$1="loadResPopUp(' . $this->asyncObjName . ', $4);$2"'; + return preg_replace($respop_regex, $respop_replace, $str); + } + + // }}} + // {{{ getASyncObjJs() + + /** + * 非同期読み込みで利用するJavaScriptオブジェクトを生成する + */ + public function getASyncObjJs() + { + global $_conf; + static $done = array(); + + if (isset($done[$this->asyncObjName])) { + return; + } + $done[$this->asyncObjName] = true; + + $code = << +//asyncObjName} = { + host:"{$this->thread->host}", bbs:"{$this->thread->bbs}", key:"{$this->thread->key}", + readPhp:"{$_conf['read_php']}", readTarget:"{$_conf['bbs_win_target']}" +}; +//]]> +\n +EOJS; + return $code; + } + + // }}} + // {{{ getSpmObjJs() + + /** + * スマートポップアップメニューを生成するJavaScriptコードを生成する + */ + public function getSpmObjJs($retry = false) + { + global $_conf, $STYLE; + + if (isset(self::$_spm_objects[$this->spmObjName])) { + return $retry ? self::$_spm_objects[$this->spmObjName] : ''; + } + + $ttitle_en = UrlSafeBase64::encode($this->thread->ttitle); + + if ($_conf['expack.spm.filter_target'] == '' || $_conf['expack.spm.filter_target'] == 'read') { + $_conf['expack.spm.filter_target'] = '_self'; + } + + $motothre_url = $this->thread->getMotoThread(); + $motothre_url = substr($motothre_url, 0, strlen($this->thread->ls) * -1); + + $_spmOptions = array( + 'null', + ((!$_conf['disable_res'] && $_conf['expack.spm.kokores']) ? (($_conf['expack.spm.kokores_orig']) ? '2' : '1') : '0'), + (($_conf['expack.spm.ngaborn']) ? (($_conf['expack.spm.ngaborn_confirm']) ? '2' : '1') : '0'), + (($_conf['expack.spm.filter']) ? '1' : '0'), + (($this->am_on_spm) ? '1' : '0'), + (($_conf['expack.aas.enabled']) ? '1' : '0'), + ); + $spmOptions = implode(',', $_spmOptions); + + // エスケープ + $_spm_title = StrCtl::toJavaScript($this->thread->ttitle_hc); + $_spm_url = addslashes($motothre_url); + $_spm_host = addslashes($this->thread->host); + $_spm_bbs = addslashes($this->thread->bbs); + $_spm_key = addslashes($this->thread->key); + $_spm_ls = addslashes($this->thread->ls); + + $code = << +//spmObjName} = { + 'objName':'{$this->spmObjName}', + 'rc':'{$this->thread->rescount}', + 'title':'{$_spm_title}', + 'ttitle_en':'{$ttitle_en}', + 'url':'{$_spm_url}', + 'host':'{$_spm_host}', + 'bbs':'{$_spm_bbs}', + 'key':'{$_spm_key}', + 'ls':'{$_spm_ls}', + 'spmOption':[{$spmOptions}] +}; +SPM.init({$this->spmObjName}); +//]]> +\n +EOJS; + + self::$_spm_objects[$this->spmObjName] = $code; + + return $code; + } + + // }}} + // }}} + // {{{ transLinkDo()から呼び出されるURL書き換えメソッド + /** + * これらのメソッドは引数が処理対象パターンに合致しないとfalseを返し、 + * transLinkDo()はfalseが返ってくると$_url_handlersに登録されている次の関数/メソッドに処理させようとする。 + */ + // {{{ plugin_linkURL() + + /** + * URLリンク + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_linkURL($url, $purl, $str) + { + global $_conf; + + if (isset($purl['scheme'])) { + // ime + if ($_conf['through_ime']) { + $link_url = P2Util::throughIme($purl[0]); + } else { + $link_url = $url; + } + + $is_http = ($purl['scheme'] == 'http' || $purl['scheme'] == 'https'); + + // HTMLポップアップ + if ($_conf['iframe_popup'] && $is_http) { + // *pm 指定の場合のみ、特別に手動転送指定を追加する + if (substr($_conf['through_ime'], -2) == 'pm') { + $pop_url = P2Util::throughIme($purl[0], -1); + } else { + $pop_url = $link_url; + } + $link = $this->iframePopup(array($link_url, $pop_url), $str, $_conf['ext_win_target_at']); + } else { + $link = "{$str}"; + } + + // ブラクラチェッカ + if ($_conf['brocra_checker_use'] && $_conf['brocra_checker_url'] && $is_http) { + if (strlen($_conf['brocra_checker_query'])) { + $brocra_checker_url = $_conf['brocra_checker_url'] . '?' . $_conf['brocra_checker_query'] . '=' . rawurlencode($purl[0]); + } else { + $brocra_checker_url = rtrim($_conf['brocra_checker_url'], '/') . '/' . $url; + } + $brocra_checker_url_orig = $brocra_checker_url; + // ブラクラチェッカ・ime + if ($_conf['through_ime']) { + $brocra_checker_url = P2Util::throughIme($brocra_checker_url); + } + $check_mark = 'チェック'; + $check_mark_prefix = '['; + $check_mark_suffix = ']'; + // ブラクラチェッカ・HTMLポップアップ + if ($_conf['iframe_popup']) { + // *pm 指定の場合のみ、特別に手動転送指定を追加する + if (substr($_conf['through_ime'], -2) == 'pm') { + $brocra_checker_url = P2Util::throughIme($brocra_checker_url_orig, -1); + } else { + $brocra_pop_url = $brocra_checker_url; + } + if ($_conf['iframe_popup'] == 3) { + $check_mark = ''; + $check_mark_prefix = ''; + $check_mark_suffix = ''; + } + $brocra_checker_link = $this->iframePopup(array($brocra_checker_url, $brocra_pop_url), $check_mark, $_conf['ext_win_target_at']); + } else { + $brocra_checker_link = "{$check_mark}"; + } + $link .= $check_mark_prefix . $brocra_checker_link . $check_mark_suffix; + } + + return $link; + } + return false; + } + + // }}} + // {{{ plugin_link2chSubject() + + /** + * 2ch bbspink 板リンク + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_link2chSubject($url, $purl, $str) + { + global $_conf; + + if (preg_match('{^http://(\\w+\\.(?:2ch\\.net|bbspink\\.com))/(\\w+)/$}', $purl[0], $m)) { + $subject_url = "{$_conf['subject_php']}?host={$m[1]}&bbs={$m[2]}"; + return "{$str} [板をp2で開く]"; + } + return false; + } + + // }}} + // {{{ plugin_linkThread() + + /** + * スレッドリンク + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_linkThread($url, $purl, $str) + { + global $_conf; + + list($nama_url, $host, $bbs, $key, $ls) = P2Util::detectThread($purl[0]); + if ($host && $bbs && $key) { + $read_url = "{$_conf['read_php']}?host={$host}&bbs={$bbs}&key={$key}&ls={$ls}"; + if ($_conf['iframe_popup']) { + if ($ls && preg_match('/^[0-9\\-n]+$/', $ls)) { + $pop_url = $read_url; + } else { + $pop_url = $read_url . '&one=true'; + } + return $this->iframePopup(array($read_url, $pop_url), $str, $_conf['bbs_win_target_at']); + } + return "{$str}"; + } + + return false; + } + + // }}} + // {{{ plugin_linkYouTube() + + /** + * YouTubeリンク変換プラグイン + * + * Zend_Gdata_Youtubeを使えばサムネイルその他の情報を簡単に取得できるが... + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_linkYouTube($url, $purl, $str) + { + global $_conf; + + // http://www.youtube.com/watch?v=Mn8tiFnAUAI + // http://m.youtube.com/watch?v=OhcX0xJsDK8&client=mv-google&gl=JP&hl=ja&guid=ON&warned=True + if (preg_match('{^http://(www|jp|m)\\.youtube\\.com/watch\\?(?:.+&)?v=([0-9a-zA-Z_\\-]+)}', $url, $m)) { + // ime + if ($_conf['through_ime']) { + $link_url = P2Util::throughIme($url); + } else { + $link_url = $url; + } + + // HTMLポップアップ + if ($_conf['iframe_popup']) { + $link = $this->iframePopup($link_url, $str, $_conf['ext_win_target_at']); + } else { + $link = "{$str}"; + } + + $subd = $m[1]; + $id = $m[2]; + + if ($_conf['link_youtube'] == 2) { + return << +EOP; + } else { + return << +EOP; + } + } + return false; + } + + // }}} + // {{{ plugin_linkNicoNico() + + /** + * ニコニコ動画変換プラグイン + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_linkNicoNico($url, $purl, $str) + { + global $_conf; + + // http://www.nicovideo.jp/watch?v=utbrYUJt9CSl0 + // http://www.nicovideo.jp/watch/utvWwAM30N0No + // http://m.nicovideo.jp/watch/sm7044684 + if (preg_match('{^http://(?:www|m)\\.nicovideo\\.jp/watch(?:/|(?:\\?v=))([0-9a-zA-Z_-]+)}', $url, $m)) { + // ime + if ($_conf['through_ime']) { + $link_url = P2Util::throughIme($purl[0]); + } else { + $link_url = $url; + } + + // HTMLポップアップ + if ($_conf['iframe_popup']) { + $link = $this->iframePopup($link_url, $str, $_conf['ext_win_target_at']); + } else { + $link = "{$str}"; + } + + $id = $m[1]; + + if ($_conf['link_niconico'] == 2) { + return << +EOP; + } else { + return << +EOP; + } + } + return false; + } + + // }}} + // {{{ plugin_viewImage() + + /** + * 画像ポップアップ変換 + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_viewImage($url, $purl, $str) + { + global $_conf; + global $pre_thumb_unlimited, $pre_thumb_limit; + + if (P2Util::isUrlWikipediaJa($url)) { + return false; + } + + // 表示制限 + if (!$pre_thumb_unlimited && empty($pre_thumb_limit)) { + return false; + } + + if (preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $purl[0]) && empty($purl['query'])) { + $pre_thumb_limit--; // 表示制限カウンタを下げる + $img_tag = ""; + + if ($_conf['iframe_popup']) { + $view_img = $this->imageHtmlPopup($url, $img_tag, $str); + } else { + $view_img = "{$img_tag}{$str}"; + } + + // ブラクラチェッカ (プレビューとは相容れないのでコメントアウト) + /*if ($_conf['brocra_checker_use']) { + $link_url_en = rawurlencode($url); + if ($_conf['iframe_popup'] == 3) { + $check_mark = ''; + $check_mark_prefix = ''; + $check_mark_suffix = ''; + } else { + $check_mark = 'チェック'; + $check_mark_prefix = '['; + $check_mark_suffix = ']'; + } + $view_img .= $check_mark_prefix . "{$check_mark}" . $check_mark_suffix; + }*/ + + return $view_img; + } + + return false; + } + + // }}} + // {{{ plugin_imageCache2() + + /** + * ImageCache2サムネイル変換 + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_imageCache2($url, $purl, $str, + $force = false, + $referer = null) + { + static $serial = 0; + + global $_conf; + global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit; + + if (P2Util::isUrlWikipediaJa($url)) { + return false; + } + + if ((preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $purl[0]) && empty($purl['query'])) || $force) { + // 準備 + $serial++; + $thumb_id = 'thumbs' . $serial . $this->thumb_id_suffix; + $tmp_thumb = './img/ic_load.png'; + $url_ht = $url; + $url = $purl[0]; + $url_en = rawurlencode($url) . + ($referer ? '&ref=' . rawurlencode($referer) : ''); + $img_id = null; + + $icdb = new ImageCache2_DataObject_Images(); + + // r=0:リンク;r=1:リダイレクト;r=2:PHPで表示 + // t=0:オリジナル;t=1:PC用サムネイル;t=2:携帯用サムネイル;t=3:中間イメージ + $img_url = 'ic2.php?r=1&uri=' . $url_en; + $thumb_url = 'ic2.php?r=1&t=1&uri=' . $url_en; + // お気にスレ自動画像ランク + $rank = null; + if ($_conf['expack.ic2.fav_auto_rank']) { + $rank = $this->getAutoFavRank(); + if ($rank !== null) { + $thumb_url .= '&rank=' . $rank; + } + } + + // DBに画像情報が登録されていたとき + if ($icdb->get($url)) { + $img_id = $icdb->id; + + // ウィルスに感染していたファイルのとき + if ($icdb->mime == 'clamscan/infected') { + return " {$str}"; + } + // あぼーん画像のとき + if ($icdb->rank < 0) { + return " {$str}"; + } + + // オリジナルがキャッシュされているときは画像を直接読み込む + $_img_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); + if (file_exists($_img_url)) { + $img_url = $_img_url; + $cached = true; + } else { + $cached = false; + } + + // サムネイルが作成されていているときは画像を直接読み込む + $_thumb_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); + if (file_exists($_thumb_url)) { + $thumb_url = $_thumb_url; + // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 + if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false){ + $update = new ImageCache2_DataObject_Images(); + if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { + $update->memo = $this->img_memo . ' ' . $icdb->memo; + } else { + $update->memo = $this->img_memo; + } + $update->whereAddQuoted('uri', '=', $url); + } + + // expack.ic2.fav_auto_rank_override の設定とランク条件がOKなら + // お気にスレ自動画像ランクを上書き更新 + if ($rank !== null && + self::isAutoFavRankOverride($icdb->rank, $rank)) { + if ($update === null) { + $update = new ImageCache2_DataObject_Images(); + $update->whereAddQuoted('uri', '=', $url); + } + $update->rank = $rank; + } + + if ($update !== null) { + $update->update(); + } + } + + // サムネイルの画像サイズ + $thumb_size = $this->thumbnailer->calc($icdb->width, $icdb->height); + $thumb_size = preg_replace('/(\d+)x(\d+)/', 'width="$1" height="$2"', $thumb_size); + $tmp_thumb = './img/ic_load1.png'; + + $orig_img_url = $img_url; + $orig_thumb_url = $thumb_url; + + // 画像がキャッシュされていないとき + // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める + } else { + // 画像がブラックリストorエラーログにあるか確認 + if (false !== ($errcode = $icdb->ic2_isError($url))) { + return " {$str}"; + } + + $cached = false; + + $orig_img_url = $img_url; + $orig_thumb_url = $thumb_url; + $img_url .= $this->img_memo_query; + $thumb_url .= $this->img_memo_query; + $thumb_size = ''; + $tmp_thumb = './img/ic_load2.png'; + } + + // キャッシュされておらず、表示数制限が有効のとき + if (!$cached && !$pre_thumb_unlimited && !$pre_thumb_ignore_limit) { + // 表示制限を超えていたら、表示しない + // 表示制限を超えていなければ、表示制限カウンタを下げる + if ($pre_thumb_limit <= 0) { + $show_thumb = false; + } else { + $show_thumb = true; + $pre_thumb_limit--; + } + } else { + $show_thumb = true; + } + + // 表示モード + if ($show_thumb) { + $img_tag = ""; + if ($_conf['iframe_popup']) { + $view_img = $this->imageHtmlPopup($img_url, $img_tag, $str); + } else { + $view_img = "{$img_tag}{$str}"; + } + } else { + $img_tag = ""; + $view_img = "{$img_tag}{$str}"; + } + + // ソースへのリンクをime付きで表示 + if ($_conf['expack.ic2.enabled'] && $_conf['expack.ic2.through_ime']) { + $ime_url = P2Util::throughIme($url); + if ($_conf['iframe_popup'] == 3) { + $ime_mark = ''; + } else { + $ime_mark = '[ime]'; + } + $view_img .= " {$ime_mark}"; + } + + $view_img .= ''; + + return $view_img; + } + + return false; + } + + // }}} + // {{{ plugin_replaceImageUrl() + + /** + * 置換画像URL+ImageCache2 + */ + public function plugin_replaceImageUrl($url, $purl, $str) + { + static $serial = 0; + + global $_conf; + global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit; + + // +Wiki + global $replaceImageUrlCtl; + + $url = $purl[0]; + $replaced = $replaceImageUrlCtl->replaceImageUrl($url); + if (!$replaced[0]) { + return false; + } + + foreach ($replaced as $v) { + $url_en = rawurlencode($v['url']); + $url_ht = p2h($v['url']); + $ref_en = $v['referer'] ? '&ref=' . rawurlencode($v['referer']) : ''; + + // 準備 + $serial++; + $thumb_id = 'thumbs' . $serial . $this->thumb_id_suffix; + $tmp_thumb = './img/ic_load.png'; + + $icdb = new ImageCache2_DataObject_Images(); + + // r=0:リンク;r=1:リダイレクト;r=2:PHPで表示 + // t=0:オリジナル;t=1:PC用サムネイル;t=2:携帯用サムネイル;t=3:中間イメージ + // +Wiki + $img_url = 'ic2.php?r=1&uri=' . $url_en . $ref_en; + $thumb_url = 'ic2.php?r=1&t=1&uri=' . $url_en . $ref_en; + // お気にスレ自動画像ランク + $rank = null; + if ($_conf['expack.ic2.fav_auto_rank']) { + $rank = $this->getAutoFavRank(); + if ($rank !== null) $thumb_url .= '&rank=' . $rank; + } + + // DBに画像情報が登録されていたとき + if ($icdb->get($v['url'])) { + + // ウィルスに感染していたファイルのとき + if ($icdb->mime == 'clamscan/infected') { + $result .= ""; + continue; + } + // あぼーん画像のとき + if ($icdb->rank < 0) { + $result .= ""; + continue; + } + + // オリジナルがキャッシュされているときは画像を直接読み込む + $_img_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); + if (file_exists($_img_url)) { + $img_url = $_img_url; + $cached = true; + } else { + $cached = false; + } + + // サムネイルが作成されていているときは画像を直接読み込む + $_thumb_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); + if (file_exists($_thumb_url)) { + $thumb_url = $_thumb_url; + // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 + if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false){ + $update = new ImageCache2_DataObject_Images(); + if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { + $update->memo = $this->img_memo . ' ' . $icdb->memo; + } else { + $update->memo = $this->img_memo; + } + $update->whereAddQuoted('uri', '=', $v['url']); + } + + // expack.ic2.fav_auto_rank_override の設定とランク条件がOKなら + // お気にスレ自動画像ランクを上書き更新 + if ($rank !== null && + self::isAutoFavRankOverride($icdb->rank, $rank)) { + if ($update === null) { + $update = new ImageCache2_DataObject_Images(); + $update->whereAddQuoted('uri', '=', $v['url']); + } + $update->rank = $rank; + } + + if ($update !== null) { + $update->update(); + } + } + + // サムネイルの画像サイズ + $thumb_size = $this->thumbnailer->calc($icdb->width, $icdb->height); + $thumb_size = preg_replace('/(\d+)x(\d+)/', 'width="$1" height="$2"', $thumb_size); + $tmp_thumb = './img/ic_load1.png'; + + $orig_img_url = $img_url; + $orig_thumb_url = $thumb_url; + + // 画像がキャッシュされていないとき + // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める + } else { + // 画像がブラックリストorエラーログにあるか確認 + if (false !== ($errcode = $icdb->ic2_isError($v['url']))) { + $result .= ""; + continue; + } + + $cached = false; + + $orig_img_url = $img_url; + $orig_thumb_url = $thumb_url; + $img_url .= $this->img_memo_query; + $thumb_url .= $this->img_memo_query; + $thumb_size = ''; + $tmp_thumb = './img/ic_load2.png'; + } + + // キャッシュされておらず、表示数制限が有効のとき + if (!$cached && !$pre_thumb_unlimited && !$pre_thumb_ignore_limit) { + // 表示制限を超えていたら、表示しない + // 表示制限を超えていなければ、表示制限カウンタを下げる + if ($pre_thumb_limit <= 0) { + $show_thumb = false; + } else { + $show_thumb = true; + $pre_thumb_limit--; + } + } else { + $show_thumb = true; + } + + // 表示モード + if ($show_thumb) { + $img_tag = ""; + if ($_conf['iframe_popup']) { + $view_img = $this->imageHtmlPopup($img_url, $img_tag, ''); + } else { + $view_img = "{$img_tag}"; + } + } else { + $img_tag = ""; + $view_img = "{$img_tag}"; + } + + $view_img .= '"; + . "'{$url_ht}', event)\">"; + + $result .= $view_img; + } + // ソースへのリンクをime付きで表示 + $ime_url = P2Util::throughIme($url); + $result .= "{$str}"; + return $result; + } + + /** + * +Wiki:リンクプラグイン + */ + public function plugin_linkPlugin($url, $purl, $str) + { + return $GLOBALS['linkPluginCtl']->replaceLinkToHTML($url, $str); + } + + // }}} + // {{{ plugin_imepitaToImageCache2() + + /** + * imepitaのURLを加工してImageCache2させるプラグイン + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_imepitaToImageCache2($url, $purl, $str) + { + if (preg_match('{^https?://imepita\.jp/(?:image/)?(\d{8}/\d{6})}i', + $purl[0], $m) && empty($purl['query'])) { + $_url = 'http://imepita.jp/image/' . $m[1]; + $_purl = @parse_url($_url); + $_purl[0] = $_url; + return $this->plugin_imageCache2($_url, $_purl, $str, true, $url); + } + return false; + } + + // }}} + // }}} + // {{{ getQuotebacksJson() + + public function getQuotebacksJson() + { + $ret = array(); + foreach ($this->getQuoteFrom() as $resnum => $quote_from) { + if (!$quote_from) { + continue; + } + if ($resnum != 1 && ($resnum < $this->thread->resrange['start'] || $resnum > $this->thread->resrange['to'])) { + continue; + } + $tmp = array(); + foreach ($quote_from as $quote) { + if ($quote != 1 && ($quote < $this->thread->resrange['start'] || $quote > $this->thread->resrange['to'])) { + continue; + } + $tmp[] = $quote; + } + if ($tmp) $ret[] = "{$resnum}:[" . join(',', $tmp) . "]"; + } + return '{' . join(',', $ret) . '}'; + } + + // }}} + // {{{ getResColorJs() + + public function getResColorJs() + { + global $_conf, $STYLE; + + $fontstyle_bold = empty($STYLE['fontstyle_bold']) ? 'normal' : $STYLE['fontstyle_bold']; + $fontweight_bold = empty($STYLE['fontweight_bold']) ? 'normal' : $STYLE['fontweight_bold']; + $fontfamily_bold = $STYLE['fontfamily_bold']; + $backlinks = $this->getQuotebacksJson(); + $colors = array(); + $backlink_colors = join(',', + array_map(create_function('$x', 'return "\'{$x}\'";'), + explode(',', $_conf['backlink_coloring_track_colors'])) + ); + $prefix = $this->_matome ? "t{$this->_matome}" : ''; + return << +if (typeof rescolObjs == 'undefined') rescolObjs = []; +rescolObjs.push((function() { + var obj = new BacklinkColor('{$prefix}'); + obj.colors = [{$backlink_colors}]; + obj.highlightStyle = {fontStyle :'{$fontstyle_bold}', fontWeight : '{$fontweight_bold}', fontFamily : '{$fontfamily_bold}'}; + obj.backlinks = {$backlinks}; + return obj; +})()); + +EOJS; + } + + // }}} + // {{{ getIdsForRenderJson() + + public function getIdsForRenderJson() + { + $ret = array(); + if ($this->_ids_for_render) { + foreach ($this->_ids_for_render as $id => $count) { + $ret[] = "'{$id}':{$count}"; + } + } + return '{' . join(',', $ret) . '}'; + } + + // }}} + // {{{ getIdColorJs() + + public function getIdColorJs() + { + global $_conf, $STYLE; + + if ($_conf['coloredid.enable'] < 1 || $_conf['coloredid.click'] < 1) { + return ''; + } + if (count($this->thread->idcount) < 1) { + return ''; + } + + $idslist = $this->getIdsForRenderJson(); + + $rate = $_conf['coloredid.rate.times']; + $tops = $this->getIdCountRank(10); + $average = $this->getIdCountAverage(); + $color_init = ''; + if ($_conf['coloredid.rate.type'] > 0) { + switch($_conf['coloredid.rate.type']) { + case 2: + $init_rate = $tops; + break; + case 3: + $init_rate = $average; + break; + case 1: + $init_rate = $rate; + default: + } + if ($init_rate > 1) + $color_init .= 'idCol.initColor(' . $init_rate . ', idslist);'; + } + $color_init .= "idCol.rate = {$rate};"; + if (!$this->_matome) { + $color_init .= "idCol.tops = {$tops};"; + $color_init .= "idCol.average = {$average};"; + } + $hissiCount = $_conf['coloredid.rate.hissi.times']; + $mark_colors = join(',', + array_map(create_function('$x', 'return "\'{$x}\'";'), + explode(',', $_conf['coloredid.marking.colors'])) + ); + $fontstyle_bold = empty($STYLE['fontstyle_bold']) ? 'normal' : $STYLE['fontstyle_bold']; + $fontweight_bold = empty($STYLE['fontweight_bold']) ? 'normal' : $STYLE['fontweight_bold']; + $fontfamily_bold = $STYLE['fontfamily_bold']; + $uline = $STYLE['a_underline_none'] != 1 + ? 'idCol.colorStyle["textDecoration"] = "underline"' : ''; + return << +(function() { +var idslist = {$idslist}; +if (typeof idCol == 'undefined') { + idCol = new IDColorChanger(idslist, {$hissiCount}); + idCol.colors = [{$mark_colors}]; +{$uline}; + idCol.highlightStyle = {fontStyle :'{$fontstyle_bold}', fontWeight : '{$fontweight_bold}', fontFamily : '{$fontfamily_bold}', fontSize : '104%'}; +} else idCol.addIdlist(idslist); +{$color_init} +idCol.setupSPM('{$this->spmObjName}'); +})(); + +EOJS; + } + + // }}} + // {{{ getIdCountAverage() + + public function getIdCountAverage() + { + if ($this->_idcount_average !== null) { + return $this->_idcount_average; + } + + $sum = 0; + $param = 0; + + foreach ($this->thread->idcount as $count) { + if ($count > 1) { + $sum += $count; + $param++; + } + } + + $result = ($param < 1) ? 0 : intval(ceil($sum / $param)); + $this->_idcount_average = $result; + + return $result; + } + + // }}} + // {{{ getIdCountRank() + + public function getIdCountRank($rank) + { + if ($this->_idcount_tops !== null) { + return $this->_idcount_tops; + } + + $ranking = array(); + + foreach ($this->thread->idcount as $count) { + if ($count > 1) { + $ranking[] = $count; + } + } + + if (count($ranking) == 0) { + return 0; + } + + rsort($ranking); + $rcount = count($ranking); + + $result = ($rcount >= $rank) ? $ranking[$rank - 1] : $ranking[$rcount - 1]; + $this->_idcount_tops = $result; + + return $result; + } + + // }}} +} + +// }}} + +/* + * Local Variables: + * mode: php + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ +// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/rep2/live_read.php b/rep2/live_read.php index e3d9bb49a..e9f9b1650 100755 --- a/rep2/live_read.php +++ b/rep2/live_read.php @@ -1,6 +1,6 @@ getThreadInfoFromIdx(); +//========================================================== +// preview >>1 +//========================================================== + +//if (!empty($_GET['onlyone'])) { +if (!empty($_GET['one'])) { + $aThread->ls = '1'; + $aThread->resrange = array('start' => 1, 'to' => 1, 'nofirst' => false); + + // 必ずしも正確ではないが便宜的に + //if (!isset($aThread->rescount) && !empty($_GET['rc'])) { + if (!isset($aThread->rescount) && !empty($_GET['rescount'])) { + //$aThread->rescount = $_GET['rc']; + $aThread->rescount = (int)$_GET['rescount']; + } + + $preview = $aThread->previewOne(); + $ptitle_ht = p2h($aThread->itaj) . ' / ' . $aThread->ttitle_hd; + + include READ_HEADER_INC_PHP; + echo $preview; + include READ_FOOTER_INC_PHP; + + return; +} + //=========================================================== // DATのダウンロード //=========================================================== @@ -258,10 +284,99 @@ //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("datToHtml"); if ($aThread->rescount) { - echo '
    '; + $mainhtml = ''; + require_once P2_LIB_DIR . '/live/live_ShowThreadPc.php'; + $aShowThread = new ShowThreadPc($aThread); + + if ($_conf['expack.spm.enabled']) { + echo $aShowThread->getSpmObjJs(); + } + + $res1 = $aShowThread->quoteOne(); // >>1ポップアップ用 + if ($_conf['coloredid.enable'] > 0 && $_conf['coloredid.click'] > 0 && + $_conf['coloredid.rate.type'] > 0) { + if ($_GET['showbl']) { + $mainhtml = $aShowThread->datToHtml_resFrom(true); + } else { + $mainhtml .= $aShowThread->datToHtml(true); + } + $mainhtml .= $res1['q']; + } else { + if ($_GET['showbl']) { + $aShowThread->datToHtml_resFrom(); + } else { + $aShowThread->datToHtml(); + } + echo $res1['q']; + } + + + // レス追跡カラー + if ($_conf['backlink_coloring_track']) { + echo $aShowThread->getResColorJs(); + } + + // IDカラーリング + if ($_conf['coloredid.enable'] > 0 && $_conf['coloredid.click'] > 0) { + echo $aShowThread->getIdColorJs(); + // ブラウザ負荷軽減のため、CSS書き換えスクリプトの後でコンテンツを + // レンダリングさせる + echo $mainhtml; + } + + // 外部ツール + $pluswiki_js = ''; + + if ($_conf['wiki.idsearch.spm.mimizun.enabled']) { + if (!class_exists('Mimizun', false)) { + require P2_PLUGIN_DIR . '/mimizun/Mimizun.php'; + } + $mimizun = new Mimizun(); + $mimizun->host = $aThread->host; + $mimizun->bbs = $aThread->bbs; + if ($mimizun->isEnabled()) { + $pluswiki_js .= "WikiTools.addMimizun({$aShowThread->spmObjName});"; + } + } + + if ($_conf['wiki.idsearch.spm.hissi.enabled']) { + if (!class_exists('Hissi', false)) { + require P2_PLUGIN_DIR . '/hissi/Hissi.php'; + } + $hissi = new Hissi(); + $hissi->host = $aThread->host; + $hissi->bbs = $aThread->bbs; + if ($hissi->isEnabled()) { + $pluswiki_js .= "WikiTools.addHissi({$aShowThread->spmObjName});"; + } + } + + if ($_conf['wiki.idsearch.spm.stalker.enabled']) { + if (!class_exists('Stalker', false)) { + require P2_PLUGIN_DIR . '/stalker/Stalker.php'; + } + $stalker = new Stalker(); + $stalker->host = $aThread->host; + $stalker->bbs = $aThread->bbs; + if ($stalker->isEnabled()) { + $pluswiki_js .= "WikiTools.addStalker({$aShowThread->spmObjName});"; + } + } + + if ($pluswiki_js !== '') { + echo << +// + +EOP; + } } elseif ($aThread->diedat && count($aThread->datochi_residuums) > 0) { - echo '過去ログ又はDATを取得出来ないスレッドは実況できません'; + require_once P2_LIB_DIR . '/ShowThreadPc.php'; + $aShowThread = new ShowThreadPc($aThread); + echo $aShowThread->getDatochiResiduums(); } //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("datToHtml"); @@ -289,6 +404,37 @@ } flush(); +//=========================================================== +// idxの値を設定、記録 +//=========================================================== +if ($aThread->rescount) { + + // 検索の時は、既読数を更新しない + if ((isset($GLOBALS['word']) && strlen($GLOBALS['word']) > 0) || $is_ajax) { + $aThread->readnum = $idx_data[5]; + } else { + $aThread->readnum = min($aThread->rescount, max(0, $idx_data[5], $aThread->resrange['to'])); + } + $newline = $aThread->readnum + 1; // $newlineは廃止予定だが、旧互換用に念のため + + $sar = array($aThread->ttitle, $aThread->key, $idx_data[2], $aThread->rescount, '', + $aThread->readnum, $idx_data[6], $idx_data[7], $idx_data[8], $newline, + $idx_data[10], $idx_data[11], $aThread->datochiok); + P2Util::recKeyIdx($aThread->keyidx, $sar); // key.idxに記録 +} + +//=========================================================== +// 履歴を記録 +//=========================================================== +if ($aThread->rescount && !$is_ajax) { + recRecent(implode('<>', array($aThread->ttitle, $aThread->key, $idx_data[2], '', '', + $aThread->readnum, $idx_data[6], $idx_data[7], $idx_data[8], $newline, + $aThread->host, $aThread->bbs))); +} + +// NGあぼーんを記録 +NgAbornCtl::saveNgAborns(); + // 以上 --------------------------------------------------------------- exit; @@ -316,6 +462,63 @@ function detectThread() } } +// }}} +// {{{ recRecent() + +/** + * 履歴を記録する + */ +function recRecent($data) +{ + global $_conf; + + $lock = new P2Lock($_conf['recent_idx'], false); + + // $_conf['recent_idx'] ファイルがなければ生成 + FileCtl::make_datafile($_conf['recent_idx']); + + $lines = FileCtl::file_read_lines($_conf['recent_idx'], FILE_IGNORE_NEW_LINES); + $neolines = array(); + + // {{{ 最初に重複要素を削除しておく + + if (is_array($lines)) { + foreach ($lines as $l) { + $lar = explode('<>', $l); + $data_ar = explode('<>', $data); + if ($lar[1] == $data_ar[1]) { continue; } // keyで重複回避 + if (!$lar[1]) { continue; } // keyのないものは不正データ + $neolines[] = $l; + } + } + + // }}} + + // 新規データ追加 + array_unshift($neolines, $data); + + while (sizeof($neolines) > $_conf['rct_rec_num']) { + array_pop($neolines); + } + + // {{{ 書き込む + + if ($neolines) { + $cont = ''; + foreach ($neolines as $l) { + $cont .= $l . "\n"; + } + + if (FileCtl::file_write_contents($_conf['recent_idx'], $cont) === false) { + p2die('cannot write file.'); + } + } + + // }}} + + return true; +} + // }}} /* diff --git a/rep2/post.php b/rep2/post.php index 0902dde02..d07f7a907 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -858,14 +858,6 @@ function showCookieConfirmation($host, $response) $form->appendChild($elem); } - // 実況モード - if (!empty($_POST['live'])) { - $elem = $hidden->cloneNode(); - $elem->setAttribute('name', 'live'); - $elem->setAttribute('value', '1'); - $form->appendChild($elem); - } - // 強制ビュー指定 if ($_conf['b'] != $_conf['client_type']) { $elem = $hidden->cloneNode(); diff --git a/rep2/read.php b/rep2/read.php index 1e497f2ba..2d9b277fb 100644 --- a/rep2/read.php +++ b/rep2/read.php @@ -314,9 +314,9 @@ $res1 = $aShowThread->quoteOne(); // >>1ポップアップ用 if ($_GET['showbl']) { - $mainhtml = $aShowThread->datToHtml_resFrom(true); + $mainhtml = $aShowThread->getDatToHtml_resFrom(); } else { - $mainhtml .= $aShowThread->datToHtml(true); + $mainhtml .= $aShowThread->getDatToHtml(); } $mainhtml .= $res1['q']; diff --git a/rep2/read_async.php b/rep2/read_async.php index 5c8c43ab3..7f633a2a2 100644 --- a/rep2/read_async.php +++ b/rep2/read_async.php @@ -145,14 +145,6 @@ exit; } - -// テレビ番組欄@2chなどはログ・idx・履歴を保存しない -if (P2Util::isHostNoCacheData($aThread->host)) { - //@unlink($aThread->keydat); // ThreadRead::readDat()で削除する - exit; -} - - //=========================================================== // idxの値を設定、記録 //=========================================================== From f7a579d3c42d13277e67bfc74b7db9725c7930ab Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 18 Mar 2015 23:01:13 +0900 Subject: [PATCH 071/339] =?UTF-8?q?=E5=AE=9F=E6=B3=81=E3=83=A2=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=81=8B=E3=82=89=E3=81=AE=E6=9B=B8=E3=81=8D=E8=BE=BC?= =?UTF-8?q?=E3=81=BF=E3=81=A7Cookie=E7=A2=BA=E8=AA=8D=E3=81=8C=E7=99=BA?= =?UTF-8?q?=E7=94=9F=E3=81=97=E3=81=9F=E5=A0=B4=E5=90=88=E5=AE=9F=E6=B3=81?= =?UTF-8?q?=E3=83=A2=E3=83=BC=E3=83=89=E3=81=AB=E6=88=BB=E3=82=8C=E3=81=AA?= =?UTF-8?q?=E3=81=84=E4=B8=8D=E5=85=B7=E5=90=88=E3=82=92=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=20=E6=8E=83=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThread.php | 74 ++++----------------------------- lib/live/live_post_form.inc.php | 58 -------------------------- rep2/post.php | 8 ++++ 3 files changed, 17 insertions(+), 123 deletions(-) diff --git a/lib/ShowThread.php b/lib/ShowThread.php index 68b2d2f10..47ae65f4b 100644 --- a/lib/ShowThread.php +++ b/lib/ShowThread.php @@ -378,29 +378,10 @@ protected function setBbsNonameName() /** * DatをHTML変換したものを取得する * - * @param bool $is_fragment - * @return bool|string - */ - public function getDatToHtml($is_fragment = false) - { - return $this->datToHtml(true, $is_fragment); - } - public function getDatToHtml_resFrom($is_fragment = false) - { - return $this->datToHtml_resFrom(true, $is_fragment); - } - - // }}} - // {{{ datToHtml() - - /** - * DatをHTMLに変換して表示する - * - * @param bool $capture trueなら変換結果を出力せずに返す * @param bool $is_fragment trueなら
    で囲まない * @return bool|string */ - public function datToHtml($capture = false, $is_fragment = false) + public function getDatToHtml($is_fragment = false) { global $_conf, $filter_hits, $last_hit_resnum; @@ -408,13 +389,8 @@ public function datToHtml($capture = false, $is_fragment = false) // 表示レス範囲が指定されていなければ if (!$aThread->resrange) { - $error = '

    p2 error: {$this->resrange} is false at datToHtml()

    '; - if ($capture) { - return $error; - } else { - echo $error; - return false; - } + $error = '

    p2 error: {$this->resrange} is false at getDatToHtml()

    '; + return $error; } $start = $aThread->resrange['start']; @@ -504,14 +480,6 @@ public function datToHtml($capture = false, $is_fragment = false) } else { $buf['body'] .= $res; } - if (!$capture && $n % 10 == 0) { - echo $buf['body']; - if ($do_filtering && !$is_ktai) { - echo "\n"; - } - flush(); - $buf['body'] = ''; - } } if ($this->thread->readnum < $rn) { @@ -526,25 +494,18 @@ public function datToHtml($capture = false, $is_fragment = false) $buf['body'] .= "\n"; } - if ($capture) { - return $buf['body'] . $buf['q']; - } else { - echo $buf['body']; - echo $buf['q']; - flush(); - return true; - } + return $buf['body'] . $buf['q']; + } /** - * 指定の書込みへのレスをHTMLに変換して表示する + * 指定の書込みへのレスをHTMLに変換したものを取得する * - * @param bool $capture trueなら変換結果を出力せずに返す * @param bool $is_fragment trueなら
    で囲まない * @param bool $show_rootres trueなら指定の書込みも結果に含める * @return bool|string */ - public function datToHtml_resFrom($capture = false, $is_fragment = false, $show_rootres = false) + public function getDatToHtml_resFrom($is_fragment = false, $show_rootres = false) { global $_conf; @@ -554,12 +515,7 @@ public function datToHtml_resFrom($capture = false, $is_fragment = false, $show_ $target = $aThread->resrange['start']; if (!$aThread->resrange || $target != $aThread->resrange['to']) { $error = '

    p2 error: {$this->resrange} is false at datToHtml()

    '; - if ($capture) { - return $error; - } else { - echo $error; - return false; - } + return $error; } $datlines = $aThread->datlines; @@ -612,25 +568,13 @@ public function datToHtml_resFrom($capture = false, $is_fragment = false, $show_ } else { $buf['body'] .= $res; } - if (!$capture && $n % 10 == 0) { - echo $buf['body']; - flush(); - $buf['body'] = ''; - } } if (!$is_fragment) { $buf['body'] .= "\n"; } - if ($capture) { - return $buf['body'] . $buf['q']; - } else { - echo $buf['body']; - echo $buf['q']; - flush(); - return true; - } + return $buf['body'] . $buf['q']; } // }}} diff --git a/lib/live/live_post_form.inc.php b/lib/live/live_post_form.inc.php index 5d9b579e2..68b917bba 100755 --- a/lib/live/live_post_form.inc.php +++ b/lib/live/live_post_form.inc.php @@ -18,40 +18,6 @@ $htm['p2res'] = ''; } -/*if ($_conf['ktai']) { - $htm['k_br'] = '
    '; - $htm['kaiko_on_js'] = ''; - $htm['kaiko_set_hidden_js'] = ''; - $htm['table_begin'] = ''; - $htm['table_break1'] = ''; - $htm['table_break2'] = ''; - $htm['table_end'] = '
    '; - if ($_conf['iphone']) { - $htm['options'] .= << - - - - -EOP; - $htm['name_label'] = '名前:'; - $htm['mail_label'] = 'E-mail:'; - $htm['name_extra_at'] = ' autocorrect="off" autocapitalize="off"'; - $htm['mail_extra_at'] = ' autocorrect="off" autocapitalize="off"'; - $htm['msg_extra_at'] = ' autocorrect="off" autocapitalize="off"'; - $htm['submit_extra_at'] = ''; - if ($_conf['expack.editor.mobile.savedraft'] != '0' && $_conf['expack.editor.mobile.savedraft.interval'] > 0) { - $htm['kaiko_on_js'] = ' onfocus="DraftKakiko.startAutoSave(this.form, ' . ($_conf['expack.editor.mobile.savedraft.interval'] * 1000) . ')"'; - } - } else { - $htm['name_label'] = '名前:'; - $htm['mail_label'] = 'E-mail:'; - $htm['name_extra_at'] = ''; - $htm['mail_extra_at'] = ''; - $htm['msg_extra_at'] = ''; - $htm['submit_extra_at'] = ''; - } -} else {*/ // レスアンカー if ($q_resnum) { $hd['MESSAGE'] = ">>" . $q_resnum . "\r\n"; @@ -62,18 +28,6 @@ } else { $htm['kaiko_on_js_fmt'] = ' onfocus="%1$s" onkeyup="if(%2$s){%1$s}"'; } -/* $htm['kaiko_on_js_func'] = sprintf("adjustTextareaRows(this,%d,2)", $STYLE['post_msg_rows']); - if ($_conf['expack.editor.savedraft'] != '0' && $_conf['expack.editor.savedraft.interval'] > 0) { - $htm['kaiko_on_js_func'] = 'DraftKakiko.startAutoSave(this.form, ' . ($_conf['expack.editor.savedraft.interval'] * 1000) . '); ' . $htm['kaiko_on_js_func']; - } - $htm['kaiko_on_js_cond'] = '!event||((event.keyCode&&(event.keyCode==8||event.keyCode==13))||event.ctrlKey||event.metaKey||event.altKey)'; - $htm['kaiko_on_js'] = sprintf($htm['kaiko_on_js_fmt'], $htm['kaiko_on_js_func'], p2h($htm['kaiko_on_js_cond'])); - //$htm['kaiko_on_js'] .= ' ondblclick="this.rows=this.value.split(/\r\n|\r|\n/).length+1"'; - $htm['kaiko_set_hidden_js'] = ' onclick="setHiddenValue(this);"'; - $htm['table_begin'] = '
    '; - $htm['table_break1'] = '
    '; - $htm['table_break2'] = ''; - $htm['table_end'] = '
    ';*/ $htm['name_label'] = ':'; $htm['mail_label'] = ':'; $htm['name_extra_at'] = ' tabindex="1"'; @@ -116,31 +70,20 @@ // 文字コード判定用文字列を先頭に仕込むことでmb_convert_variables()の自動判定を助ける $htm['post_form'] = << -
    -  {$ttitle_pfi}  {$htm['maru_post']} {$htm['name_label']} {$htm['mail_label']} {$htm['sage_cb']} {$htm['options']} - - - - - {$htm['src_fix']} {$htm['block_submit']} - - {$htm['beres']} {$htm['p2res']} - {$htm['samba']} {$htm['k_br']}{$savedraft} {$upload_form} @@ -160,7 +103,6 @@ {$newthread_hidden_ht}{$readnew_hidden_ht} {$_conf['detect_hint_input_ht']}
    - EOP; /* diff --git a/rep2/post.php b/rep2/post.php index d07f7a907..0902dde02 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -858,6 +858,14 @@ function showCookieConfirmation($host, $response) $form->appendChild($elem); } + // 実況モード + if (!empty($_POST['live'])) { + $elem = $hidden->cloneNode(); + $elem->setAttribute('name', 'live'); + $elem->setAttribute('value', '1'); + $form->appendChild($elem); + } + // 強制ビュー指定 if ($_conf['b'] != $_conf['client_type']) { $elem = $hidden->cloneNode(); From e570117263d6035433a931a8dbfffc152b5b0666 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 19 Mar 2015 01:59:14 +0900 Subject: [PATCH 072/339] =?UTF-8?q?rep2/live=5Fread.php=E3=81=A7=E6=9C=AC?= =?UTF-8?q?=E4=BD=93=E3=81=AElib/ShowThreadP=EF=BD=83.php=E3=82=92?= =?UTF-8?q?=E4=BD=BF=E3=81=86=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/live/live_ShowThread.php | 2050 -------------------------------- lib/live/live_ShowThreadPc.php | 1999 ------------------------------- rep2/live_read.php | 118 +- 3 files changed, 16 insertions(+), 4151 deletions(-) delete mode 100755 lib/live/live_ShowThread.php delete mode 100755 lib/live/live_ShowThreadPc.php diff --git a/lib/live/live_ShowThread.php b/lib/live/live_ShowThread.php deleted file mode 100755 index 9d205aedb..000000000 --- a/lib/live/live_ShowThread.php +++ /dev/null @@ -1,2050 +0,0 @@ -(<[Aa][ ].+?>)(.*?)()) # リンク(PCREの特性上、必ずこのパターンを最初に試行する) -| -(?: - (?P # 引用 - ((?:>|>){1,2}[ ]?) # 引用符 - ( - (?:[1-9]\\d{0,3}) # 1つ目の番号 - (?: - (?:[ ]?(?:[,=]|、)[ ]?[1-9]\\d{0,3})+ # 連続 - | - -(?:[1-9]\\d{0,3})? # 範囲 - )? - ) - (?=\\D|$) - ) # 引用ここまで -| # PHP 5.3縛りにするなら、↓の\'のエスケープを外し、NOWDOCにする - (?P(ftp|h?t?tps?)://([0-9A-Za-z][\\w;/?:@=&$\\-_.+!*\'(),#%\\[\\]^~]+)) # URL - ([^\\s<>]*) # URLの直後、タグorホワイトスペースが現れるまでの文字列 -| - (?PID:[ ]?([0-9A-Za-z/.+]{8,11})(?=[^0-9A-Za-z/.+]|$)) # ID(8,10桁 +PC/携帯識別フラグ) -) -}x'; - - /** - * リダイレクタの種類 - * - * @var int - */ - const REDIRECTOR_NONE = 0; - const REDIRECTOR_IMENU = 1; - const REDIRECTOR_PINKTOWER = 2; - const REDIRECTOR_MACHIBBS = 3; - - /** - * NGあぼーんの種類 - * - * @var int - */ - const ABORN = -1; - const NG_NONE = 0; - const NG_NAME = 1; - const NG_MAIL = 2; - const NG_ID = 4; - const NG_MSG = 8; - const NG_FREQ = 16; - const NG_CHAIN = 32; - const NG_AA = 64; - - // }}} - // {{{ static properties - - /** - * まとめ読みモード時のスレッド数 - * - * @var int - */ - static private $_matome_count = 0; - - /** - * 本文以外がNGあぼーんにヒットした総数 - * - * @var int - */ - static protected $_ngaborns_head_hits = 0; - - /** - * 本文がNGあぼーんにヒットした総数 - * - * @var int - */ - static protected $_ngaborns_body_hits = 0; - - /** - * getAnchorRegex() のキャッシュ - * - * @var array - */ - static private $_anchorRegexes = array(); - - /** - * _getAnchorRegexParts() のキャッシュ - * - * @var array - */ - static private $_anchorRegexParts = null; - - // }}} - // {{{ properties - - /** - * まとめ読みモード時のスレッド番号 - * - * @var int - */ - protected $_matome; - - /** - * URLを処理する関数・メソッド名などを格納する配列 - * (組み込み) - * - * @var array - */ - protected $_url_handlers; - - /** - * URLを処理する関数・メソッド名などを格納する配列 - * (ユーザ定義、組み込みのものより優先) - * - * @var array - */ - protected $_user_url_handlers; - - /** - * 頻出IDをあぼーんする - * - * @var bool - */ - protected $_ngaborn_frequent; - - /** - * NG or あぼーんレスがあるかどうか - * - * @var bool - */ - protected $_has_ngaborns; - - /** - * あぼーんレス番号およびNGレス番号を格納する配列 - * array_intersect()を効率よく行うため、該当するレス番号は文字列にキャストして格納する - * - * @var array - */ - protected $_aborn_nums; - protected $_ng_nums; - - /** - * リダイレクタの種類 - * - * @var int - */ - protected $_redirector; - - /** - * スレッドオブジェクト - * - * @var ThreadRead - */ - public $thread; - - /** - * アクティブモナー・オブジェクト - * - * @var ActiveMona - */ - public $activeMona; - - /** - * アクティブモナーが有効か否か - * - * @var bool - */ - public $am_enabled = false; - - /** - * 引用しているレス番号を登録した配列 - * - * @var array - */ - protected $_quote_res_nums; - - - /** - * 引用チェック済みレス番号の配列 - * - * @var array - */ - protected $_quote_res_nums_checked; - - /** - * 引用変換済みレス番号の配列 - * - * @var array - */ - protected $_quote_res_nums_done; - - /** - * レス番号チェックの再帰の深さ - * - * @var int - */ - private $_quote_check_depth; - - /** - * デフォルトの名前 - * - * @var string - */ - protected $_nanashiName = null; - - /** - * 被アンカーを集計した配列(範囲アンカー含む) // [被参照レス番 : [参照レス番, ...], ...) - * - * @var array - */ - protected $_quote_from = null; - - /** - * アンカーを集計した配列(範囲アンカー除く) // [レス番 : [参照先レス番, ...], ...) - * - * @var array - */ - protected $_quote_to = null; - - /** - * お気に自動ランク - * - * @var bool - */ - private $_auto_fav_rank = false; - - /** - * リンクするサムネイルを生成するクラスのインスタンス - * - * @var ImageCache2_Thumbnailer - */ - public $thumbnailer; - - /** - * インライン表示するサムネイルを生成するクラスのインスタンス - * - * @var ImageCache2_Thumbnailer - */ - public $inline_prvw; - - /** - * インラインサムネイルのID属性接尾辞 - * - * @var string - */ - public $thumb_id_suffix; - - /** - * 画像に付加するメモ - * - * @var string - */ - public $img_memo; - - /** - * 画像にメモを付けるためのクエリ文字列 - * - * @var string - */ - public $img_memo_query; - - /** - * 画像解像度 - * - * @var float - */ - public $img_dpr = 1.0; - - /** - * 画像解像度を指定するクエリ文字列 - * - * @var string - */ - public $img_dpr_query; - - // }}} - // {{{ constructor - - /** - * コンストラクタ - */ - protected function __construct(ThreadRead $aThread, $matome = false) - { - global $_conf; - - // スレッドオブジェクトを登録 - $this->thread = $aThread; - $this->str_to_link_regex = $this->_buildStrToLinkRegex(); - - // まとめ読みモードか否か - if ($matome) { - $this->_matome = ++self::$_matome_count; - } else { - $this->_matome = false; - } - - $this->_url_handlers = array(); - $this->_user_url_handlers = array(); - - $this->_ngaborn_frequent = 0; - if ($_conf['ngaborn_frequent']) { - if ($_conf['ngaborn_frequent_dayres'] == 0) { - $this->_ngaborn_frequent = $_conf['ngaborn_frequent']; - } elseif ($this->thread->setDayRes() && $this->thread->dayres < $_conf['ngaborn_frequent_dayres']) { - $this->_ngaborn_frequent = $_conf['ngaborn_frequent']; - } - } - - $this->_has_ngaborns = false; - $this->_aborn_nums = array(); - $this->_ng_nums = array(); - - if (P2Util::isHostBbsPink($this->thread->host)) { - $this->_redirector = self::REDIRECTOR_PINKTOWER; - } elseif (P2Util::isHost2chs($this->thread->host)) { - $this->_redirector = self::REDIRECTOR_IMENU; - } elseif (P2Util::isHostMachiBbs($this->thread->host)) { - $this->_redirector = self::REDIRECTOR_MACHIBBS; - } else { - $this->_redirector = self::REDIRECTOR_NONE; - } - - $this->_quote_res_nums = array(); - $this->_quote_res_nums_checked = array(); - $this->_quote_res_nums_done = array(); - } - - // }}} - - /** - * @param void - * @return void - */ - protected function setBbsNonameName() - { - $st = new SettingTxt($this->thread->host, $this->thread->bbs); - $st->setSettingArray(); - if (array_key_exists('BBS_NONAME_NAME', $st->setting_array)) { - $BBS_NONAME_NAME = $st->setting_array['BBS_NONAME_NAME']; - if (strlen($BBS_NONAME_NAME)) { - $this->_nanashiName = $BBS_NONAME_NAME; - } - } - } - - // {{{ getDatToHtml() - - /** - * DatをHTML変換したものを取得する - * - * @param bool $is_fragment - * @return bool|string - */ - public function getDatToHtml($is_fragment = false) - { - return $this->datToHtml(true, $is_fragment); - } - public function getDatToHtml_resFrom($is_fragment = false) - { - return $this->datToHtml_resFrom(true, $is_fragment); - } - - // }}} - // {{{ datToHtml() - - /** - * DatをHTMLに変換して表示する - * - * @param bool $capture trueなら変換結果を出力せずに返す - * @param bool $is_fragment trueなら
    で囲まない - * @return bool|string - */ - public function datToHtml($capture = false, $is_fragment = false) - { - global $_conf, $filter_hits, $last_hit_resnum; - - $aThread = $this->thread; - - // 表示レス範囲が指定されていなければ - if (!$aThread->resrange) { - $error = '

    p2 error: {$this->resrange} is false at datToHtml()

    '; - if ($capture) { - return $error; - } else { - echo $error; - return false; - } - } - - $start = $aThread->resrange['start']; - $to = $aThread->resrange['to']; - $nofirst = $aThread->resrange['nofirst']; - - $is_ktai = $_conf['ktai']; - $resFilter = ResFilter::getFilter(); - if ($resFilter && $resFilter->hasWord()) { - $do_filtering = true; - $nofirst = true; - } else { - $do_filtering = false; - } - - $datlines = $aThread->datlines; - $count = count($datlines); - - $buf['body'] = $is_fragment ? '' : "
    \n"; - $buf['q'] = ''; - - // まず 1 を表示 - if (!$nofirst) { - $res = $this->transRes($datlines[0], 1); - if (is_array($res)) { - $buf['body'] .= $res['body']; - $buf['q'] .= $res['q'] ? $res['q'] : ''; - } else { - $buf['body'] .= $res; - } - } - - // 連鎖のため、範囲外のNGあぼーんチェック - if ($_conf['ngaborn_chain_all'] && empty($_GET['nong'])) { - $pre = min($count, $start); - for ($i = ($nofirst) ? 0 : 1; $i < $pre; $i++) { - $n = $i + 1; - list($name, $mail, $date_id, $msg) = $aThread->explodeDatLine($datlines[$i]); - if (($id = $aThread->ids[$n]) !== null) { - $date_id = str_replace($aThread->idp[$n] . $id, "ID:$id", $date_id); - } - $this->_ngAbornCheck($n, strip_tags($name), $mail, $date_id, $id, $msg); - } - } - - // フィルタリング - if ($do_filtering) { - $datlines = $resFilter->apply($this); - $filter_hits = $resFilter->hits; - $last_hit_resnum = $resFilter->last_hit_resnum; - } - - // 指定範囲を表示 - $i = 0; - $n = 0; - $rn = 0; - - if ($do_filtering) { - if (!empty($resFilter->range)) { - $start = $resFilter->range['start']; - $to = $resFilter->range['to']; - } - $pattern = $resFilter->getPattern(); - } else { - $pattern = null; - } - - foreach ($datlines as $i => $ares) { - if ($ares === null) { - continue; - } - $n++; - if ($i === 0 && !$nofirst) { - continue; - } - if ($n < $start) { - continue; - } - if ($n > $to) { - break; - } - $rn = $i + 1; - $res = $this->transRes($ares, $rn, $pattern); - if (is_array($res)) { - $buf['body'] .= $res['body']; - $buf['q'] .= $res['q'] ? $res['q'] : ''; - } else { - $buf['body'] .= $res; - } - if (!$capture && $n % 10 == 0) { - echo $buf['body']; - if ($do_filtering && !$is_ktai) { - echo "\n"; - } - flush(); - $buf['body'] = ''; - } - } - - if ($this->thread->readnum < $rn) { - $this->thread->readnum = $rn; - } - - if ($do_filtering && !$is_ktai) { - $buf['body'] .= "\n"; - } - -// +live オートリロードされるスレ内容の表示部 -echo <<
    \n -LIVE; - - if (!$is_fragment) { - $buf['body'] .= "\n"; - } - - if ($capture) { - return $buf['body'] . $buf['q']; - } else { - echo $buf['body']; - echo $buf['q']; - flush(); - return true; - } - } - - /** - * 指定の書込みへのレスをHTMLに変換して表示する - * - * @param bool $capture trueなら変換結果を出力せずに返す - * @param bool $is_fragment trueなら
    で囲まない - * @param bool $show_rootres trueなら指定の書込みも結果に含める - * @return bool|string - */ - public function datToHtml_resFrom($capture = false, $is_fragment = false, $show_rootres = false) - { - global $_conf; - - $aThread = $this->thread; - - // 表示レスが指定されていなければ - $target = $aThread->resrange['start']; - if (!$aThread->resrange || $target != $aThread->resrange['to']) { - $error = '

    p2 error: {$this->resrange} is false at datToHtml()

    '; - if ($capture) { - return $error; - } else { - echo $error; - return false; - } - } - - $datlines = $aThread->datlines; - $count = count($datlines); - - $buf['body'] = $is_fragment ? '' : "
    \n"; - $buf['q'] = ''; - - // 連鎖のため、範囲外のNGあぼーんチェック - if ($_conf['ngaborn_chain_all'] && empty($_GET['nong'])) { - $pre = min($count, $start); - for ($i = ($nofirst) ? 0 : 1; $i < $pre; $i++) { - $n = $i + 1; - list($name, $mail, $date_id, $msg) = $aThread->explodeDatLine($datlines[$i]); - if (($id = $aThread->ids[$n]) !== null) { - $date_id = str_replace($aThread->idp[$n] . $id, "ID:$id", $date_id); - } - $this->_ngAbornCheck($n, strip_tags($name), $mail, $date_id, $id, $msg); - } - } - - // レス展開 - $datlines = array_fill(0, count($aThread->datlines), null); - if ($show_rootres) { - $datlines[$target - 1] = $aThread->datlines[$target - 1]; - } - list($name, $mail, $date_id, $msg) = - $aThread->explodeDatLine($aThread->datlines[$target - 1]); - foreach ($this->checkQuoteResNums($target, $name, $msg, false, true, false) as $rn) { - $ri = $rn - 1; - if ($datlines[$ri] === null) { - $datlines[$ri] = $aThread->datlines[$ri]; - } - } - - // 表示 - $i = 0; - $n = 0; - $rn = 0; - foreach ($datlines as $i => $ares) { - if ($ares === null) { - continue; - } - $n++; - $rn = $i + 1; - $res = $this->transRes($ares, $rn); - if (is_array($res)) { - $buf['body'] .= $res['body']; - $buf['q'] .= $res['q'] ? $res['q'] : ''; - } else { - $buf['body'] .= $res; - } - if (!$capture && $n % 10 == 0) { - echo $buf['body']; - flush(); - $buf['body'] = ''; - } - } - - if (!$is_fragment) { - $buf['body'] .= "
    \n"; - } - - if ($capture) { - return $buf['body'] . $buf['q']; - } else { - echo $buf['body']; - echo $buf['q']; - flush(); - return true; - } - } - - // }}} - // {{{ transRes() - - /** - * DatレスをHTMLレスに変換する - * - * @param string $ares datの1ライン - * @param int $i レス番号 - * @return string - */ - abstract public function transRes($ares, $i); - - // }}} - // {{{ transName() - - /** - * 名前をHTML用に変換する - * - * @param string $name 名前 - * @return string - */ - abstract public function transName($name); - - // }}} - // {{{ transMsg() - - /** - * datのレスメッセージをHTML表示用メッセージに変換する - * - * @param string $msg メッセージ - * @param int $mynum レス番号 - * @return string - */ - abstract public function transMsg($msg, $mynum); - - // }}} - // {{{ replaceBeId() - - /** - * BEプロファイルリンク変換 - */ - public function replaceBeId($date_id, $i) - { - global $_conf; - - $beid_replace = "thread->host}/test/read.cgi/{$this->thread->bbs}/{$this->thread->key}/{$i}\"{$_conf['ext_win_target_at']}>Lv.\$2"; - - // - $be_match = '||i'; - if (preg_match($be_match, $date_id)) { - $date_id = preg_replace($be_match, $beid_replace, $date_id); - - } else { - - $beid_replace = "thread->host}/test/read.cgi/{$this->thread->bbs}/{$this->thread->key}/{$i}\"{$_conf['ext_win_target_at']}>?\$2"; - $date_id = preg_replace('|BE: ?(\d+)-(#*)|i', $beid_replace, $date_id); - } - - return $date_id; - } - - // }}} - // {{{ _ngAbornCheck() - - /** - * NGあぼーんチェック - * - * @param int $i レス番号 - * @param string $name 名前欄 - * @param string $mail メール欄 - * @param string $date_id 日付・ID欄 - * @param string $id ID - * @param string $msg レス本文 - * @param bool $nong NGチェックをするかどうか - * @param array &$info NGの理由が格納される変数の参照 - * @return int NGタイプ。ShowThread::NG_XXX のビット和か ShowThread::ABORN - */ - protected function _ngAbornCheck($i, $name, $mail, $date_id, $id, $msg, $nong = false, &$info = null) - { - global $_conf, $ngaborns_hits; - - $info = array(); - $type = self::NG_NONE; - - // {{{ 頻出IDチェック - - if ($this->_ngaborn_frequent && $id && $this->thread->idcount[$id] >= $_conf['ngaborn_frequent_num']) { - if (!$_conf['ngaborn_frequent_one'] && $id == $this->thread->ids[1]) { - // >>1 はそのまま表示 - } elseif ($this->_ngaborn_frequent == 1) { - $ngaborns_hits['aborn_freq']++; - return $this->_markNgAborn($i, self::ABORN, false); - } elseif (!$nong) { - $ngaborns_hits['ng_freq']++; - $type |= $this->_markNgAborn($i, self::NG_FREQ, false); - $info[] = sprintf('頻出ID:%s(%d)', $id, $this->thread->idcount[$id]); - } - } - - // }}} - // {{{ 連鎖チェック - - if ($_conf['ngaborn_chain'] && $this->_has_ngaborns && - preg_match_all('/(?:>|>)([1-9][0-9\\-,]*)/', $msg, $matches) - ) { - $references = array_unique(preg_split('/[-,]+/', - trim(implode(',', $matches[1]), '-,'), - -1, - PREG_SPLIT_NO_EMPTY)); - $intersections = array_intersect($references, $this->_aborn_nums); - $info_suffix = ''; - - if ($intersections) { - if ($_conf['ngaborn_chain'] == 1) { - $ngaborns_hits['aborn_chain']++; - return $this->_markNgAborn($i, self::ABORN, true); - } - if ($nong) { - $intersections = null; - } else { - $info_suffix = '(' . (($_conf['ktai']) ? 'アボン' : 'あぼーん') . ')'; - } - } elseif (!$nong) { - $intersections = array_intersect($references, $this->_ng_nums); - } - - if ($intersections) { - $ngaborns_hits['ng_chain']++; - $type |= $this->_markNgAborn($i, self::NG_CHAIN, true); - $info[] = sprintf('連鎖NG:>>%d%s', current($intersections), $info_suffix); - } - } - - // }}} - // {{{ あぼーんチェック - - // あぼーんレス - if ($this->abornResCheck($i) !== false) { - $ngaborns_hits['aborn_res']++; - return $this->_markNgAborn($i, self::ABORN, false); - } - - // あぼーんネーム - if ($this->ngAbornCheck('aborn_name', $name) !== false) { - $ngaborns_hits['aborn_name']++; - return $this->_markNgAborn($i, self::ABORN, false); - } - - // あぼーんメール - if ($this->ngAbornCheck('aborn_mail', $mail) !== false) { - $ngaborns_hits['aborn_mail']++; - return $this->_markNgAborn($i, self::ABORN, false); - } - - // あぼーんID - if ($this->ngAbornCheck('aborn_id', $date_id) !== false) { - $ngaborns_hits['aborn_id']++; - return $this->_markNgAborn($i, self::ABORN, false); - } - - // あぼーんメッセージ - if ($this->ngAbornCheck('aborn_msg', $msg) !== false) { - $ngaborns_hits['aborn_msg']++; - return $this->_markNgAborn($i, self::ABORN, true); - } - - // }}} - - if ($nong) { - return $type; - } - - // {{{ NGチェック - - // NGネームチェック - if ($this->ngAbornCheck('ng_name', $name) !== false) { - $ngaborns_hits['ng_name']++; - $type |= $this->_markNgAborn($i, self::NG_NAME, false); - } - - // NGメールチェック - if ($this->ngAbornCheck('ng_mail', $mail) !== false) { - $ngaborns_hits['ng_mail']++; - $type |= $this->_markNgAborn($i, self::NG_MAIL, false); - } - - // NGIDチェック - if ($this->ngAbornCheck('ng_id', $date_id) !== false) { - $ngaborns_hits['ng_id']++; - $type |= $this->_markNgAborn($i, self::NG_ID, false); - } - - // NGメッセージチェック - $a_ng_msg = $this->ngAbornCheck('ng_msg', $msg); - if ($a_ng_msg !== false) { - $ngaborns_hits['ng_msg']++; - $type |= $this->_markNgAborn($i, self::NG_MSG, true); - $info[] = sprintf('NG%s:%s', - ($_conf['ktai']) ? 'ワード' : 'ワード', - p2h($a_ng_msg)); - } - - // }}} - - return $type; - } - - // }}} - // {{{ _markNgAborn() - - /** - * NGあぼーんにヒットしたレス番号を記録する - * - * @param int $num レス番号 - * @param int $type NGあぼーんの種類 - * @param bool $isBody 本文にヒットしたかどうか - * @return int $typeと同じ値 - */ - protected function _markNgAborn($num, $type, $isBody) - { - if ($type) { - if ($isBody) { - self::$_ngaborns_body_hits++; - } else { - self::$_ngaborns_head_hits++; - } - - // array_intersect()を効率よく行うため、レス番号を文字列型にキャストする - $str = (string)$num; - if ($type == self::ABORN) { - $this->_aborn_nums[$num] = $str; - } else { - $this->_ng_nums[$num] = $str; - } - - $this->_has_ngaborns = true; - } - - return $type; - } - - // }}} - // {{{ ngAbornCheck() - - /** - * NGあぼーんチェック - */ - public function ngAbornCheck($code, $resfield, $ic = false) - { - global $ngaborns; - - //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection('ngAbornCheck()'); - - if (isset($ngaborns[$code]['data']) && is_array($ngaborns[$code]['data'])) { - // +Wiki:BEあぼーん - if ($code == 'aborn_be' || $code == 'ng_be') { - // プロフィールIDを抜き出す - if (preg_match('/BE:(\\d+)/', $resfield, $matches)) { - $beId = P2UtilWiki::calcBeId((int)$matches[1]); - if ($beId === 0) { - return false; - } - $resfield = (string)$beId; - } else { - return false; - } - } - - $bbs = $this->thread->bbs; - $title = $this->thread->ttitle_hc; - - foreach ($ngaborns[$code]['data'] as $k => $v) { - // 板チェック - if (isset($v['bbs']) && in_array($bbs, $v['bbs']) == false) { - continue; - } - - // タイトルチェック - if (isset($v['title']) && stripos($title, $v['title']) === false) { - continue; - } - - // ワードチェック - // 正規表現 - if ($v['regex']) { - $re_method = $v['regex']; - /*if ($re_method($v['word'], $resfield, $matches)) { - $this->ngAbornUpdate($code, $k); - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); - return p2h($matches[0]); - }*/ - if ($re_method($v['word'], $resfield)) { - $this->ngAbornUpdate($code, $k); - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); - return $v['cond']; - } - // +Wiki:BEあぼーん(完全一致) - } elseif ($code == 'aborn_be' || $code == 'ng_be') { - if ($resfield == $v['word']) { - $this->ngAbornUpdate($code, $k); - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); - return $v['cond']; - } - // 大文字小文字を無視 - } elseif ($ic || $v['ignorecase']) { - if (stripos($resfield, $v['word']) !== false) { - $this->ngAbornUpdate($code, $k); - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); - return $v['cond']; - } - // 単純に文字列が含まれるかどうかをチェック - } else { - if (strpos($resfield, $v['word']) !== false) { - $this->ngAbornUpdate($code, $k); - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); - return $v['cond']; - } - } - } - } - - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('ngAbornCheck()'); - return false; - } - - // }}} - // {{{ abornResCheck() - - /** - * 特定レスの透明あぼーんチェック - */ - public function abornResCheck($resnum) - { - global $ngaborns; - - $target = $this->thread->host . '/' . $this->thread->bbs . '/' . $this->thread->key . '/' . $resnum; - - if (isset($ngaborns['aborn_res']['data']) && is_array($ngaborns['aborn_res']['data'])) { - foreach ($ngaborns['aborn_res']['data'] as $k => $v) { - if ($ngaborns['aborn_res']['data'][$k]['word'] == $target) { - $this->ngAbornUpdate('aborn_res', $k); - return true; - } - } - } - return false; - } - - // }}} - // {{{ ngAbornUpdate() - - /** - * NG/あぼ〜ん日時と回数を更新 - */ - public function ngAbornUpdate($code, $k) - { - global $ngaborns; - - if (isset($ngaborns[$code]['data'][$k])) { - $ngaborns[$code]['data'][$k]['lasttime'] = date('Y/m/d G:i'); // HIT時間を更新 - if (empty($ngaborns[$code]['data'][$k]['hits'])) { - $ngaborns[$code]['data'][$k]['hits'] = 1; // 初HIT - } else { - $ngaborns[$code]['data'][$k]['hits']++; // HIT回数を更新 - } - } - } - - // }}} - // {{{ addURLHandler() - - /** - * ユーザ定義URLハンドラ(メッセージ中のURLを書き換える関数)を追加する - * - * ハンドラは最初に追加されたものから順番に試行される - * URLはハンドラの返り値(文字列)で置換される - * falseを帰した場合は次のハンドラに処理が委ねられる - * - * ユーザ定義URLハンドラの引数は - * 1. string $url URL - * 2. array $purl URLをparse_url()したもの - * 3. string $str パターンにマッチした文字列、URLと同じことが多い - * 4. object $aShowThread 呼び出し元のオブジェクト - * である - * 常にfalseを返し、内部で処理するだけの関数を登録してもよい - * - * @param callback $function コールバックメソッド - * @return void - * @access public - * @todo ユーザ定義URLハンドラのオートロード機能を実装 - */ - public function addURLHandler($function) - { - $this->_user_url_handlers[] = $function; - } - - // }}} - // {{{ stripLineBreaks() - - /** - * 文末の改行と連続する改行を取り除く - * - * @param string $msg - * @param string $replacement - * @return string - */ - public function stripLineBreaks($msg, $replacement = '

    ') - { - if (P2_MBREGEX_AVAILABLE) { - $msg = mb_ereg_replace('(?:[\\s ]*
    )+[\\s ]*$', '', $msg); - $msg = mb_ereg_replace('(?:[\\s ]*
    ){3,}', $replacement, $msg); - } else { - mb_convert_variables('UTF-8', 'CP932', $msg, $replacement); - $msg = preg_replace('/(?:[\\s\\x{3000}]*
    )+[\\s\\x{3000}]*$/u', '', $msg); - $msg = preg_replace('/(?:[\\s\\x{3000}]*
    ){3,}/u', $replacement, $msg); - $msg = mb_convert_encoding($msg, 'CP932', 'UTF-8'); - } - - return $msg; - } - - // }}} - // {{{ transLink() - - /** - * リンク対象文字列を変換する - * - * @param string $str - * @return string - */ - public function transLink($str) - { - return preg_replace_callback($this->str_to_link_regex, array($this, 'transLinkDo'), $str); - } - - // }}} - // {{{ transLinkDo() - - /** - * リンク対象文字列の種類を判定して対応した関数/メソッドに渡す - * - * @param array $s - * @return string - */ - public function transLinkDo(array $s) - { - global $_conf; - - $orig = $s[0]; - $following = ''; - - // PHP 5.2.7 未満の preg_replace_callback() では名前付き捕獲式集合が使えないので - /* - if (!array_key_exists('link', $s)) { - $s['link'] = $s[1]; - $s['quote'] = $s[5]; - $s['url'] = $s[8]; - $s['id'] = $s[11]; - } - */ - - // マッチしたサブパターンに応じて分岐 - // リンク - if ($s['link']) { - if (preg_match('{ href=(["\'])?(.+?)(?(1)\\1)(?=[ >])}i', $s[2], $m)) { - $url = $m[2]; - $str = $s[3]; - } else { - return $s[3]; - } - - // 引用 - } elseif ($s['quote']) { - return preg_replace_callback( - self::getAnchorRegex('/(%prefix%)?(%a_range%)/'), - array($this, '_quoteResCallback'), $s['quote']); - - // http or ftp のURL - } elseif ($s['url']) { - if ($_conf['ktai'] && $s[9] == 'ftp') { - return $orig; - } - $url = preg_replace('/^t?(tps?)$/', 'ht$1', $s[9]) . '://' . $s[10]; - $str = $s['url']; - $following = $s[11]; - if (strlen($following) > 0) { - // ウィキペディア日本語版のURLで、SJISの2バイト文字の上位バイト - // (0x81-0x9F,0xE0-0xEF)が続くとき - if (P2Util::isUrlWikipediaJa($url)) { - $leading = ord($following); - if ((($leading ^ 0x90) < 32 && $leading != 0x80) || ($leading ^ 0xE0) < 16) { - $url .= rawurlencode(mb_convert_encoding($following, 'UTF-8', 'CP932')); - $str .= $following; - $following = ''; - } - } elseif (strpos($following, 'tp://') !== false) { - // 全角スペース+URL等の場合があるので再チェック - $following = $this->transLink($following); - } - } - - // ID - } elseif ($s['id'] && $_conf['flex_idpopup']) { // && $_conf['flex_idlink_k'] - return $this->idFilter($s['id'], $s[12]); - - // その他(予備) - } else { - return strip_tags($orig); - } - - // リダイレクタを外す - switch ($this->_redirector) { - case self::REDIRECTOR_IMENU: - $url = preg_replace('{^([a-z]+://)ime\\.nu/}', '$1', $url); - break; - case self::REDIRECTOR_PINKTOWER: - $url = preg_replace('{^([a-z]+://)pinktower\\.com/}', '$1', $url); - break; - case self::REDIRECTOR_MACHIBBS: - $url = preg_replace('{^[a-z]+://machi(?:bbs\\.com|\\.to)/bbs/link\\.cgi\\?URL=}', '', $url); - break; - } - - // エスケープされていない特殊文字をエスケープ - $url = p2h($url, false); - $str = p2h($str, false); - // 実態参照・数値参照を完全にデコードしようとすると負荷が大きいし、 - // "&"以外の特殊文字はほとんどの場合URLエンコードされているはずなので - // 中途半端に凝った処理はせず、"&"→"&"のみ再変換する。 - $raw_url = str_replace('&', '&', $url); - - // URLをパース・ホストを検証 - $purl = @parse_url($raw_url); - if (!$purl || !array_key_exists('host', $purl) || - strpos($purl['host'], '.') === false || - $purl['host'] == '127.0.0.1' || - //HostCheck::isAddressLocal($purl['host']) || - //HostCheck::isAddressPrivate($purl['host']) || - P2Util::isHostExample($purl['host'])) - { - return $orig; - } - // URLのマッチングで"&"を考慮しなくて済むように、生のURLを登録しておく - $purl[0] = $raw_url; - - // URLを処理 - foreach ($this->_user_url_handlers as $handler) { - if (false !== ($link = call_user_func($handler, $url, $purl, $str, $this))) { - return $link . $following; - } - } - foreach ($this->_url_handlers as $handler) { - if (false !== ($link = $this->$handler($url, $purl, $str))) { - return $link . $following; - } - } - - return $orig; - } - - // }}} - // {{{ idFilter() - - /** - * IDフィルタリング変換 - * - * @param string $idstr ID:xxxxxxxxxx - * @param string $id xxxxxxxxxx - * @return string - */ - abstract public function idFilter($idstr, $id); - - // }}} - // {{{ _idFilterCallback() - - /** - * IDフィルタリング変換 - * - * @param array $s 正規表現にマッチした要素の配列 - * @return string - */ - protected function _idFilterCallback(array $s) - { - return $this->idFilter($s[0], $s[1]); - } - - // }}} - // {{{ _quoteNameCallback() - - /** - * @param array $s - * @return string HTML - */ - protected function _quoteNameCallback($s) - { - return preg_replace_callback( - self::getAnchorRegex('/(%prefix%)?(%a_num%)/'), - array($this, '_quoteResCallback'), $s[0] - ); - } - - // }}} - // {{{ quoteRes() - - /** - * 引用変換(単独) - * - * @param string $full >>1 - * @param string $qsign >> - * @param string $appointed_num 1 - * @return string - */ - abstract public function quoteRes($full, $qsign, $appointed_num); - - // }}} - // {{{ _quoteResCallback() - - /** - * 引用変換(単独) - * - * @param array $s 正規表現にマッチした要素の配列 - * @return string - */ - protected function _quoteResCallback(array $s) - { - return $this->quoteRes($s[0], $s[1], $s[2]); - } - - // }}} - // {{{ quoteResRange() - - /** - * 引用変換(範囲) - * - * @param string $full >>1-100 - * @param string $qsign >> - * @param string $appointed_num 1-100 - * @return string - */ - abstract public function quoteResRange($full, $qsign, $appointed_num); - - // }}} - // {{{ _quoteResRangeCallback() - - /** - * 引用変換(範囲) - * - * @param array $s 正規表現にマッチした要素の配列 - * @return string - */ - protected function _quoteResRangeCallback(array $s) - { - return $this->quoteResRange($s[0], $s[1], $s[2]); - } - - // }}} - // {{{ checkQuoteResNums() - - /** - * HTMLメッセージ中の引用レスの番号を再帰チェックする - */ - public function checkQuoteResNums($res_num, $name, $msg, - $with_quotes = true, - $with_backlinks = null, - $cascade = true) - { - global $_conf; - - $this->_quote_check_depth = 0; - - if ($with_backlinks === null) { - $with_backlinks = ($_conf['backlink_list'] > 0 || $_conf['backlink_block'] > 0) ? true : false; - } - - if ($with_backlinks) { - return $this->checkQuoteResNumsFromSummary( - $res_num == 0 ? 1 : $res_num, $with_quotes, $with_backlinks); - } - - return $this->_checkQuoteResNums($res_num, $name, $msg); - } - - // }}} - // {{{ _checkQuoteResNums() - - /** - * HTMLメッセージ中の引用レスの番号を再帰チェックする - */ - protected function _checkQuoteResNums($res_num, $name, $msg) - { - // 再帰リミッタ - if ($this->_quote_check_depth > 30) { - return array(); - } else { - $this->_quote_check_depth++; - } - - if (array_key_exists($res_num, $this->_quote_res_nums)) { - return $this->_quote_res_nums[$res_num]; - } - - $aThread = $this->thread; - - $quote_res_nums = array(); - - $name = preg_replace('/(◆.*)/', '', $name, 1); - - // 名前 - if ($matches = $this->getQuoteResNumsName($name)) { - foreach ($matches as $a_quote_res_num) { - if ($a_quote_res_num) { - $quote_res_nums[] = $a_quote_res_num; - $a_quote_res_idx = $a_quote_res_num - 1; - - // 自分自身の番号と同一でなければ、 - if ($a_quote_res_num != $res_num) { - // チェックしていない番号を再帰チェック - if (!isset($this->_quote_res_nums_checked[$a_quote_res_num])) { - $this->_quote_res_nums_checked[$a_quote_res_num] = true; - if (isset($aThread->datlines[$a_quote_res_idx])) { - $datalinear = $aThread->explodeDatLine($aThread->datlines[$a_quote_res_idx]); - $quote_name = $datalinear[0]; - $quote_msg = $aThread->datlines[$a_quote_res_idx]; - $quote_res_nums = array_merge($quote_res_nums, - $this->_checkQuoteResNums($a_quote_res_num, - $quote_name, - $quote_msg)); - } - } - } - } - // $name=preg_replace("/([0-9]+)/", "", $name, 1); - } - } - - // >>1のリンクをいったん外す - // >>1 - $msg = preg_replace('{<[Aa] .+?>(>>[1-9][\\d\\-]*)}', '$1', $msg); - - //echo $msg; - if (preg_match_all(self::getAnchorRegex('/%full%/'), $msg, $out, PREG_PATTERN_ORDER)) { - foreach ($out[2] as $numberq) { - if ($matches=preg_split(self::getAnchorRegex('/%delimiter%/'), $numberq)) { - foreach ($matches as $a_quote_res_num) { - if (preg_match(self::getAnchorRegex('/%range_delimiter%/'),$a_quote_res_num)) { continue;} - $a_quote_res_num = (int) (mb_convert_kana($a_quote_res_num, 'n')); - $a_quote_res_idx = $a_quote_res_num - 1; - - //echo $a_quote_res_num; - - if (!$a_quote_res_num) {break;} - $quote_res_nums[] = $a_quote_res_num; - - // 自分自身の番号と同一でなければ、 - if ($a_quote_res_num != $res_num) { - // チェックしていない番号を再帰チェック - if (!isset($this->_quote_res_nums_checked[$a_quote_res_num])) { - $this->_quote_res_nums_checked[$a_quote_res_num] = true; - if (isset($aThread->datlines[$a_quote_res_idx])) { - $datalinear = $aThread->explodeDatLine($aThread->datlines[$a_quote_res_idx]); - $quote_name = $datalinear[0]; - $quote_msg = $aThread->datlines[$a_quote_res_idx]; - $quote_res_nums = array_merge($quote_res_nums, - $this->_checkQuoteResNums($a_quote_res_num, - $quote_name, - $quote_msg)); - } - } - } - - } - - } - - } - - } - - if (count($quote_res_nums)) { - sort($quote_res_nums, SORT_NUMERIC); - $this->_quote_res_nums[$res_num] = array_unique($quote_res_nums); - $quote_res_nums = $this->_quote_res_nums[$res_num]; - } - - return $quote_res_nums; - } - - // }}} - // {{{ checkQuoteResNumsFromSummary() - - /** - * 引用レス集計結果からポップアップ用に用意すべき番号を再帰チェックする - */ - public function checkQuoteResNumsFromSummary($res_num, $with_quotes, $with_backlinks) - { - // 再帰リミッタ - if ($this->_quote_check_depth > 3000) { - return array(); - } else { - $this->_quote_check_depth++; - } - - $ret = array(); - - // 参照レス - if ($with_quotes) { - $ret = array_merge($ret, - $this->_checkQuoteResNumsFromSummary( - $res_num, $this->getQuoteTo(), $with_quotes, $with_backlinks)); - } - // 被参照レス - if ($with_backlinks) { - $ret = array_merge($ret, - $this->_checkQuoteResNumsFromSummary( - $res_num, $this->getQuoteFrom(), $with_quotes, $with_backlinks)); - } - return $ret; - } - - // }}} - // {{{ _checkQuoteResNumsFromSummary() - - protected function _checkQuoteResNumsFromSummary($res_num, $quotes, $with_quotes, $with_backlinks) - { - $ret = array(); - if (array_key_exists($res_num, $quotes)) { - foreach ($quotes[$res_num] as $quote_num) { - $ret[] = $quote_num; - if ($quote_num != $res_num) { - if (!isset($this->_quote_res_nums_checked[$quote_num])) { - $this->_quote_res_nums_checked[$quote_num] = true; - $ret = array_merge($ret, - $this->checkQuoteResNumsFromSummary($quote_num, $with_quotes, $with_backlinks)); - } - } - } - } - return $ret; - } - - // }}} - // {{{ getQuoteResNumsName() - - public function getQuoteResNumsName($name) - { - if (strlen(trim($name)) == 0 || $name == $this->_nanashiName) { - return false; - } - - // トリップを除去 - $name = preg_replace('/◆.*/', '', $name, 1); - $name = strip_tags($name); - - /* - //if (preg_match('/[0-9]+/', $name, $m)) { - return (int)$m[0]; - } - */ - - if (preg_match_all(self::getAnchorRegex('/(?:^|%prefix%)(%nums%)/'), $name, $matches)) { - foreach ($matches[1] as $a_quote_res_num) { - $quote_res_nums[] = (int)mb_convert_kana($a_quote_res_num, 'n'); - } - return array_unique($quote_res_nums); - } - - return false; - } - - // }}} - // {{{ _wikipediaFilter() - - /** - * [[語句]]があった時にWikipediaへ自動リンク - * - * @param string $msg メッセージ - * @return string - * - * original code: - * http://akid.s17.xrea.com/p2puki/index.phtml?%A5%E6%A1%BC%A5%B6%A1%BC%A5%AB%A5%B9%A5%BF%A5%DE%A5%A4%A5%BA%28rep2%20Ver%201.7.0%A1%C1%29#led2c85d - */ - protected function _wikipediaFilter($msg) - { - if (strpos($msg, '[[') === false) { - return $msg; - } - - $msg = preg_replace_callback('/\\[\\[([^\\[\\]\\n<>]+)\\]\\]+/u', - array($this, '_linkToWikipeidaCallback'), - mb_convert_encoding($msg, 'UTF-8', 'CP932')); - - return mb_convert_encoding($msg, 'CP932', 'UTF-8'); - } - - // }}} - // {{{ _linkToWikipeidaCallback() - - /** - * Wikipediaの語句をリンクに変換して返す. - * - * @param array $matches - * @return string - */ - protected function _linkToWikipeidaCallback($matches) - { - return '[[' . $this->_linkToWikipeida($matches[1]) . ']]'; - } - - // }}} - // {{{ _linkToWikipeida() - - /** - * Wikipediaの語句をリンクに変換して返す. - * - * @param string $word 語句 - * @return string - */ - abstract protected function _linkToWikipeida($word); - - // }}} - // {{{ _makeQuotes() - - /** - * レスデータを集計して$this->_quote_toと$this->_quote_fromに保存. - */ - protected function _makeQuotes() - { - global $_conf; - - $this->_quote_to = array(); - $this->_quote_from = array(); - - if (!$this->thread->datlines) { - return; - } - - foreach ($this->thread->datlines as $num => $line) { - list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($line); - - // NGあぼーんチェック - if (($id = $this->thread->ids[$num + 1]) !== null) { - $date_id = str_replace($this->thread->idp[$i] . $id, 'ID:' . $id, $date_id); - } - $ng_type = $this->_ngAbornCheck($num + 1, strip_tags($name), $mail, $date_id, $id, $msg); - if ($ng_type == self::ABORN) { - continue; - } - - // 名前 - if ($nmatches = $this->getQuoteResNumsName($name)) { - foreach ($nmatches as $a_quote_res_num) { - if ($a_quote_res_num) { - if (!array_key_exists($a_quote_res_num, $this->_quote_from) || $this->_quote_from[$a_quote_res_num] === null) { - $this->_quote_from[$a_quote_res_num] = array(); - } - if (!in_array($num + 1, $this->_quote_from[$a_quote_res_num])) { - $this->_quote_from[$a_quote_res_num][] = $num + 1; - } - - if (!array_key_exists($num + 1, $this->_quote_to) || $this->_quote_to[$num + 1] === null) { - $this->_quote_to[$num + 1] = array(); - } - if (!in_array($a_quote_res_num, $this->_quote_to[$num + 1])) { - $this->_quote_to[$num + 1][] = $a_quote_res_num; - } - } - } - } - - - // >>1のリンクをいったん外す - // >>1 - $msg = preg_replace('{<[Aa] .+?>(>>[1-9][\\d\\-]*)}', '$1', $msg); - if (!preg_match_all(self::getAnchorRegex('/%full%/'), $msg, $out, PREG_PATTERN_ORDER)) { - continue; - } - foreach ($out[2] as $numberq) { - if (!preg_match_all(self::getAnchorRegex('/(?:%prefix%)?(%a_range%)/'), $numberq, $anchors, PREG_PATTERN_ORDER)) continue; - foreach ($anchors[1] as $anchor) { - if (preg_match(self::getAnchorRegex('/(%a_num%)%range_delimiter%(?:%prefix%)?(%a_num%)/'), $anchor, $matches)) { - $from = intval(mb_convert_kana($matches[1], 'n')); - $to = intval(mb_convert_kana($matches[2], 'n')); - if ($from < 1 || $to < 1 || $from > $to - || ($to - $from + 1) > sizeof($this->thread->datlines)) { - continue; - } - if ($_conf['backlink_list_range_anchor_limit'] != 0) { - if ($to - $from >= $_conf['backlink_list_range_anchor_limit']) { - continue; - } - } - for ($i = $from; $i <= $to; $i++) { - if ($i > sizeof($this->thread->datlines)) { - break; - } - if ($_conf['backlink_list_future_anchor'] == 0) { - // レス番号以降のアンカーは無視する - if ($i >= $num + 1) { - continue; - } - } - if (!array_key_exists($i, $this->_quote_from) || $this->_quote_from[$i] === null) { - $this->_quote_from[$i] = array(); - } - if (!in_array($num + 1, $this->_quote_from[$i])) { - $this->_quote_from[$i][] = $num + 1; - } - } - } elseif (preg_match(self::getAnchorRegex('/(%a_num%)/'), $anchor, $matches)) { - $quote_num = intval(mb_convert_kana($matches[1], 'n')); - if (!array_key_exists($num + 1, $this->_quote_to) || $this->_quote_to[$num + 1] === null) { - $this->_quote_to[$num + 1] = array(); - } - if (!in_array($quote_num, $this->_quote_to[$num + 1])) { - $this->_quote_to[$num + 1][] = $quote_num; - } - - if ($_conf['backlink_list_future_anchor'] == 0) { - // レス番号以降のアンカーは無視する - if ($quote_num >= $num + 1) { - continue; - } - } - if (!array_key_exists($quote_num, $this->_quote_from) || $this->_quote_from[$quote_num] === null) { - $this->_quote_from[$quote_num] = array(); - } - if (!in_array($num + 1, $this->_quote_from[$quote_num])) { - $this->_quote_from[$quote_num][] = $num + 1; - } - } - } - } - } - } - - // }}} - // {{{ getQuoteFrom() - - /** - * 被レスリストを返す. - * - * @return array - */ - public function getQuoteFrom() - { - if ($this->_quote_from === null) { - $this->_makeQuotes(); // 被レスデータ集計 - } - return $this->_quote_from; - } - - // }}} - // {{{ getQuoteTo() - - /** - * レスリストを返す. - * - * @return array - */ - public function getQuoteTo() - { - if ($this->_quote_to === null) { - $this->_makeQuotes(); // レスデータ集計 - } - return $this->_quote_to; - } - - // }}} - // {{{ _quotebackListHtml() - - /** - * 被レスリストをHTMLで整形して返す. - * - * @param int $resnum レス番号 - * @param int $type 1:縦形式 2:横形式 3:展開用ブロック用文字列 - * @param bool $popup 横形式でのポップアップ処理(true:ポップアップする、false:挿入する) - * @return string - */ - protected function _quotebackListHtml($resnum, $type, $popup=true) - { - $quote_from = $this->getQuoteFrom(); - if (!array_key_exists($resnum, $quote_from)) return $ret; - - $anchors = $quote_from[$resnum]; - sort($anchors); - - if ($type == 1) { - return $this->_quotebackVerticalListHtml($anchors, $resnum); - } elseif ($type == 2) { - return $this->_quotebackHorizontalListHtml($anchors, $resnum); - } elseif ($type == 3) { - return $this->_quotebackResData($anchors, $resnum); - } - } - - // }}} - // {{{ _quotebackVerticalListHtml() - - protected function _quotebackVerticalListHtml($anchors, $resnum) - { - $ret = '
      '; - $anchor_cnt = 1; - foreach ($anchors as $anchor) { - if ($anchor_cnt > 1) { - $ret .= '
    • '; - } - if ($anchor_cnt < count($anchors)) { - $ret .= '
    • ├'; - } else { - $ret .= '
    • └'; - } - $ret .= ($anchor == $resnum) - ? $anchor - : $this->quoteRes($anchor, '', $anchor, true); - $anchor_cnt++; - } - $ret .= '
    '; - return $ret; - } - - // }}} - // {{{ _quotebackHorizontalListHtml() - - protected function _quotebackHorizontalListHtml($anchors, $resnum) - { - $ret = '
    '; - $count = 0; - - foreach ($anchors as $idx => $anchor) { - if ($anchor == $resnum) { - continue; - } - $anchor_link= $this->quoteRes('>>' . $anchor, '>>', $anchor); - $qres_id = ($this->_matome ? "t{$this->_matome}" : '') ."qr{$anchor}"; - $ret .= '
    '; - $ret .= sprintf('
    【参照レス:%s】
    ',$anchor_link); - $ret .= '
    '; - $count++; - } - $ret .= '
    '; - - return $ret; - } - - // }}} - // {{{ _quotebackResData() - - protected function _quotebackResData($anchors, $resnum) - { - $ret = array(); - foreach ($anchors as $idx => $anchor) { - if ($anchor == $resnum) { - continue; - } - $ret[] = ($this->_matome ? "t{$this->_matome}" : '') ."qr{$anchor}"; - } - - return join('/', $ret); - } - - // }}} - // {{{ getDatochiResiduums() - - /** - * DAT落ちの際に取得できた>>1と最後のレスをHTMLで返す. - * - * @return string|false - */ - public function getDatochiResiduums() - { - $ret = ''; - $elines = $this->thread->datochi_residuums; - if (!count($elines)) { - return $ret; - } - - $this->thread->onthefly = true; - $ret = "
    on the fly
    \n"; - $ret .= "
    \n"; - - foreach($elines as $num => $line) { - $res = $this->transRes($line, $num); - if (is_array($res)) { - $ret .= $res['body'] . $res['q']; - } else { - $ret .= $res; - } - } - - $ret .= "
    \n"; - - return $ret; - } - - // }}} - // {{{ getAutoFavRanks() - - /** - * 自動ランク設定を返す. - * - * @return array - */ - public function getAutoFavRank() - { - global $_conf; - - if ($this->_auto_fav_rank !== false) { - return $this->_auto_fav_rank; - } - - $ranks = explode(',', strtr($_conf['expack.ic2.fav_auto_rank_setting'], ' ', '')); - $ret = null; - if ($_conf['expack.misc.multi_favs']) { - $idx = 0; - if (!is_array($this->thread->favs)) { - return null; - } - foreach ($this->thread->favs as $fav) { - if ($fav) { - $rank = $ranks[$idx]; - if (is_numeric($rank)) { - $rank = intval($rank); - if ($ret === null) { - $ret = $rank; - } else { - $ret = max($ret, $rank); - } - } - } - $idx++; - } - } else { - if ($this->thread->fav && is_numeric($ranks[0])) { - $ret = intval($ranks[0]); - } - } - $this->_auto_fav_rank = $ret; - - return $ret; - } - - // }}} - // {{{ isAutoFavRankOverride() - - /** - * 自動ランク設定でランクを上書きすべきか返す. - * - * @param int $now 現在のランク - * @param int $new 自動ランク - * @return bool - */ - static public function isAutoFavRankOverride($now, $new) - { - global $_conf; - - switch ($_conf['expack.ic2.fav_auto_rank_override']) { - case 0: - return false; - break; - case 1: - return $now != $new; - break; - case 2: - return $now == 0 && $now != $new; - break; - case 3: - return $now < $new; - break; - default: - return false; - } - return false; - } - - // }}} - // {{{ getAnchorRegex() - - /** - * アンカーの正規表現を返す - * - * @param string $pattern ex)'/%full%/' - * @param boolean $unicode - * @return string - */ - static public function getAnchorRegex($pattern, $unicode = false) - { - if (!array_key_exists($pattern, self::$_anchorRegexes)) { - self::$_anchorRegexes[$pattern] = strtr($pattern, self::_getAnchorRegexParts()); - // 大差はないが compileMobile2chUriCallBack() のように preg_relplace_callback()してもいいかも。 - } - if ($unicode) { - return StrSjis::toUnicodePattern($_anchorRegexes[$pattern]); - } - return self::$_anchorRegexes[$pattern]; - } - - // }}} - // {{{ _getAnchorRegexParts() - - /** - * アンカーの構成要素(正規表現パーツの配列)を返す - * - * @param void - * @return string - */ - static private function _getAnchorRegexParts() - { - if (!is_null(self::$_anchorRegexParts)) { - return self::$_anchorRegexParts; - } - - $anchor = array(); - - // アンカーの構成要素(正規表現パーツの配列) - - // 空白文字 - $anchor_space = '(?:[ ]| )'; - //$anchor[' '] = ''; - - // アンカー引用子 >> - $anchor['prefix'] = "(?:(?:>|>|<|<|〉){1,2}|(?:\)){2}|》|≫){$anchor_space}*\.?"; - - // 数字 - $anchor['a_digit'] = '(?:\\d|0|1|2|3|4|5|6|7|8|9)'; - /* - $anchor[0] = '(?:0|0)'; - $anchor[1] = '(?:1|1)'; - $anchor[2] = '(?:2|2)'; - $anchor[3] = '(?:3|3)'; - $anchor[4] = '(?:4|4)'; - $anchor[5] = '(?:5|5)'; - $anchor[6] = '(?:6|6)'; - $anchor[7] = '(?:7|7)'; - $anchor[8] = '(?:8|8)'; - $anchor[9] = '(?:9|9)'; - */ - - // 範囲指定子 - // -|‐|ー = HYPHEN-MINUS | HYPHEN | KATAKANA-HIRAGANA PROLONGED SOUND MARK - $anchor['range_delimiter'] = '(?:-|\\x81\\x5d|\\x81\\x5b)'; // [\\-\\x{2010}\\x{30fc}] - - // 列挙指定子 - $anchor['delimiter'] = "{$anchor_space}?(?:[\.,=+]|、|・|=|,){$anchor_space}?"; - - // あぼーん用アンカー引用子 - //$anchor['prefix_abon'] = ">{1,2}{$anchor_space}?"; - - // レス番号 - $anchor['a_num'] = sprintf('%s{1,4}', $anchor['a_digit']); - - // レス範囲 - /* - $anchor['a_range'] = sprintf('%s(?:%s%s)?', - $anchor['a_num'], $anchor['range_delimiter'], $anchor['a_num'] - ); - */ - $anchor['a_range'] = sprintf('%s(?:%s(?:%s)?%s)?', - $anchor['a_num'], $anchor['range_delimiter'], $anchor['prefix'], $anchor['a_num'] - ); - - // レス範囲の列挙 - $anchor['ranges'] = sprintf('%s(?:%s%s)*(?!%s)', - $anchor['a_range'], $anchor['delimiter'], $anchor['a_range'], $anchor['a_digit'] - ); - - // レス番号の列挙 - $anchor['nums'] = sprintf('%s(?:%s%s)*(?!%s)', - $anchor['a_num'], $anchor['delimiter'], $anchor['a_num'], $anchor['a_digit'] - ); - - // アンカー全体 - $anchor['full'] = sprintf('(%s)(%s)', $anchor['prefix'], $anchor['ranges']); - - // getAnchorRegex() の strtr() 置換用にkeyを '%key%' に変換する - foreach ($anchor as $k => $v) { - $anchor['%' . $k . '%'] = $v; - unset($anchor[$k]); - } - - self::$_anchorRegexParts = $anchor; - - return self::$_anchorRegexParts; - } - - // }}} - // {{{_buildStrToLinkRegex() - - /** - * リンクとして扱うパターンを返す - * - * @param void - * @return string - */ - static protected function _buildStrToLinkRegex() - { - return '{' - . '(?P(<[Aa] .+?>)(.*?)())' // リンク(PCREの特性上、必ずこのパターンを最初に試行する) - . '|' - . '(?:' - . '(?P' // 引用 - . self::getAnchorRegex('%full%') - . ')' - . '|' - . '(?P' - . '(ftp|h?ttps?|tps?)://([0-9A-Za-z][\\w!#%&+*,\\-./:;=?@\\[\\]^~]+)' // URL - . ')' - . '|' - . '(?PID: ?([0-9A-Za-z/.+]{8,11})(?=[^0-9A-Za-z/.+]|$))' // ID(8,10桁 +PC/携帯識別フラグ) - . ')' - . '}'; - } - - // }}} -} - -// }}} - -/* - * Local Variables: - * mode: php - * coding: cp932 - * tab-width: 4 - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End: - */ -// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/lib/live/live_ShowThreadPc.php b/lib/live/live_ShowThreadPc.php deleted file mode 100755 index 7c2f12102..000000000 --- a/lib/live/live_ShowThreadPc.php +++ /dev/null @@ -1,1999 +0,0 @@ -_url_handlers = array( - 'plugin_linkThread', - 'plugin_link2chSubject', - ); - // +Wiki - if (isset($GLOBALS['linkPluginCtl'])) { - $this->_url_handlers[] = 'plugin_linkPlugin'; - } - if (isset($GLOBALS['replaceImageUrlCtl'])) { - $this->_url_handlers[] = 'plugin_replaceImageUrl'; - } - if (P2_IMAGECACHE_AVAILABLE == 2) { - $this->_url_handlers[] = 'plugin_imageCache2'; - } elseif ($_conf['preview_thumbnail']) { - $this->_url_handlers[] = 'plugin_viewImage'; - } - if ($_conf['link_youtube']) { - $this->_url_handlers[] = 'plugin_linkYouTube'; - } - if ($_conf['link_niconico']) { - $this->_url_handlers[] = 'plugin_linkNicoNico'; - } - $this->_url_handlers[] = 'plugin_linkURL'; - - // imepitaのURLを加工してImageCache2させるプラグインを登録 - if (P2_IMAGECACHE_AVAILABLE == 2) { - $this->addURLHandler(array($this, 'plugin_imepitaToImageCache2')); - } - - // サムネイル表示制限数を設定 - if (!isset($GLOBALS['pre_thumb_unlimited']) || !isset($GLOBALS['pre_thumb_limit'])) { - if (isset($_conf['pre_thumb_limit']) && $_conf['pre_thumb_limit'] > 0) { - $GLOBALS['pre_thumb_limit'] = $_conf['pre_thumb_limit']; - $GLOBALS['pre_thumb_unlimited'] = false; - } else { - $GLOBALS['pre_thumb_limit'] = null; // ヌル値だとisset()はfalseを返す - $GLOBALS['pre_thumb_unlimited'] = true; - } - } - $GLOBALS['pre_thumb_ignore_limit'] = false; - - // アクティブモナー初期化 - if (P2_ACTIVEMONA_AVAILABLE) { - ExpackLoader::initActiveMona($this); - } - - // ImageCache2初期化 - if (P2_IMAGECACHE_AVAILABLE == 2) { - ExpackLoader::initImageCache($this); - } - - // 非同期レスポップアップ・SPM初期化 - $js_id = sprintf('%u', crc32($this->thread->keydat)); - if ($this->_matome) { - $this->asyncObjName = "t{$this->_matome}asp{$js_id}"; - $this->spmObjName = "t{$this->_matome}spm{$js_id}"; - } else { - $this->asyncObjName = "asp{$js_id}"; - $this->spmObjName = "spm{$js_id}"; - } - - // 名無し初期化 - $this->setBbsNonameName(); - } - - // }}} - // {{{ transRes() - - /** - * DatレスをHTMLレスに変換する - * - * @param string $ares datの1ライン - * @param int $i レス番号 - * @param string $pattern ハイライト用正規表現 - * @return string - */ - public function transRes($ares, $i, $pattern = null) - { - global $_conf, $STYLE, $mae_msg; - - list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($ares); - if (($id = $this->thread->ids[$i]) !== null) { - $idstr = 'ID:' . $id; - $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $date_id); - } else { - $idstr = null; - } - - // +Wiki:置換ワード - if (isset($GLOBALS['replaceWordCtl'])) { - $replaceWordCtl = $GLOBALS['replaceWordCtl']; - $name = $replaceWordCtl->replace('name', $this->thread, $ares, $i); - $mail = $replaceWordCtl->replace('mail', $this->thread, $ares, $i); - $date_id = $replaceWordCtl->replace('date', $this->thread, $ares, $i); - $msg = $replaceWordCtl->replace('msg', $this->thread, $ares, $i); - } - - $tores = ''; - $rpop = ''; - if ($this->_matome) { - $res_id = "t{$this->_matome}r{$i}"; - $msg_id = "t{$this->_matome}m{$i}"; - } else { - $res_id = "r{$i}"; - $msg_id = "m{$i}"; - } - $msg_class = 'message'; - - // NGあぼーんチェック - $ng_type = $this->_ngAbornCheck($i, strip_tags($name), $mail, $date_id, $id, $msg, false, $ng_info); - if ($ng_type == self::ABORN) { - return $this->_abornedRes($res_id); - } - if ($ng_type != self::NG_NONE) { - $ngaborns_head_hits = self::$_ngaborns_head_hits; - $ngaborns_body_hits = self::$_ngaborns_body_hits; - } - - // AA判定 - if ($this->am_autodetect && $this->activeMona->detectAA($msg)) { - $msg_class .= ' ActiveMona'; - } - - //============================================================= - // レスをポップアップ表示 - //============================================================= - if ($_conf['quote_res_view']) { - $quote_res_nums = $this->checkQuoteResNums($i, $name, $msg); - - foreach ($quote_res_nums as $rnv) { - if (!isset($this->_quote_res_nums_done[$rnv])) { - $this->_quote_res_nums_done[$rnv] = true; - if (isset($this->thread->datlines[$rnv-1])) { - if ($this->_matome) { - $qres_id = "t{$this->_matome}qr{$rnv}"; - } else { - $qres_id = "qr{$rnv}"; - } - $ds = $this->qRes($this->thread->datlines[$rnv-1], $rnv); - $onPopUp_at = " onmouseover=\"showResPopUp('{$qres_id}',event)\" onmouseout=\"hideResPopUp('{$qres_id}')\""; - $rpop .= "
    \n{$ds}
    \n"; - } - } - } - } - - //============================================================= - // まとめて出力 - //============================================================= - - $name = $this->transName($name); // 名前HTML変換 - $msg = $this->transMsg($msg, $i); // メッセージHTML変換 - - - // BEプロファイルリンク変換 - $date_id = $this->replaceBeId($date_id, $i); - - // HTMLポップアップ - if ($_conf['iframe_popup']) { - $date_id = preg_replace_callback("{((\?#*)|(Lv\.\d+))}", array($this, 'iframePopupCallback'), $date_id); - } - - // NGメッセージ変換 - if ($ng_type != self::NG_NONE && count($ng_info)) { - $ng_info = implode(', ', $ng_info); - $msg = <<{$ng_info} -
    {$msg}
    -EOMSG; - } - - // NGネーム変換 - if ($ng_type & self::NG_NAME) { - $name = <<{$name} -EONAME; - $msg = <<{$msg} -EOMSG; - - // NGメール変換 - } elseif ($ng_type & self::NG_MAIL) { - $mail = <<{$mail} -EOMAIL; - $msg = <<{$msg} -EOMSG; - - // NGID変換 - } elseif ($ng_type & self::NG_ID) { - $date_id = <<{$date_id} -EOID; - $msg = <<{$msg} -EOMSG; - - } - - /* - //「ここから新着」画像を挿入 - if ($i == $this->thread->readnum +1) { - $tores .= <<新着レス -EOP; - } - */ - - // SPM - if ($_conf['expack.spm.enabled']) { - $spmeh = " onmouseover=\"{$this->spmObjName}.show({$i},'{$msg_id}',event)\""; - $spmeh .= " onmouseout=\"{$this->spmObjName}.hide(event)\""; - } else { - $spmeh = ''; - } - - // +live スレ内容表示部削除 - - /*if ($_conf['expack.am.enabled'] == 2) { - $tores .= << -// -\n -EOJS; - }*/ - - // まとめてフィルタ色分け - if ($pattern) { - $tores = StrCtl::filterMarking($pattern, $tores); - } - - return array('body' => $tores, 'q' => $rpop); - } - - // }}} - // {{{ quoteOne() - - /** - * >>1 を表示する (引用ポップアップ用) - */ - public function quoteOne() - { - global $_conf; - - if (!$_conf['quote_res_view']) { - return false; - } - - $rpop = ''; - $quote_res_nums = $this->checkQuoteResNums(0, '1', ''); - if (array_search(1, $quote_res_nums) === false) { - $quote_res_nums[] = 1; - } - - foreach ($quote_res_nums as $rnv) { - if (!isset($this->_quote_res_nums_done[$rnv])) { - $this->_quote_res_nums_done[$rnv] = true; - if (isset($this->thread->datlines[$rnv-1])) { - if ($this->_matome) { - $qres_id = "t{$this->_matome}qr{$rnv}"; - } else { - $qres_id = "qr{$rnv}"; - } - $ds = $this->qRes($this->thread->datlines[$rnv-1], $rnv); - $onPopUp_at = " onmouseover=\"showResPopUp('{$qres_id}',event)\" onmouseout=\"hideResPopUp('{$qres_id}')\""; - $rpop .= "
    \n{$ds}
    \n"; - } - } - } - - $res1['q'] = $rpop; - $res1['body'] = $this->transMsg('>>1', 1); - - return $res1; - } - - // }}} - // {{{ qRes() - - /** - * レス引用HTML - */ - public function qRes($ares, $i) - { - global $_conf; - - $resar = $this->thread->explodeDatLine($ares); - $name = $this->transName($resar[0]); - $mail = $resar[1]; - if (($id = $this->thread->ids[$i]) !== null) { - $idstr = 'ID:' . $id; - $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $resar[2]); - } else { - $idstr = null; - $date_id = $resar[2]; - } - $msg = $this->transMsg($resar[3], $i); - - $tores = ''; - - if ($this->_matome) { - $qmsg_id = "t{$this->_matome}qm{$i}"; - } else { - $qmsg_id = "qm{$i}"; - } - - // >>1 - if ($i == 1) { - $tores = "

    {$this->thread->ttitle_hd}

    "; - } - - // BEプロファイルリンク変換 - $date_id = $this->replaceBeId($date_id, $i); - - // HTMLポップアップ - if ($_conf['iframe_popup']) { - $date_id = preg_replace_callback("{((\?#*)|(Lv\.\d+))}", array($this, 'iframePopupCallback'), $date_id); - } - // - - // IDフィルタ - if ($_conf['flex_idpopup'] == 1 && $id && $this->thread->idcount[$id] > 1) { - $date_id = str_replace($idstr, $this->idFilter($idstr, $id), $date_id); - } - - $msg_class = 'message'; - - // AA 判定 - if ($this->am_autodetect && $this->activeMona->detectAA($msg)) { - $msg_class .= ' ActiveMona'; - } - - // SPM - if ($_conf['expack.spm.enabled']) { - $spmeh = " onmouseover=\"{$this->spmObjName}.show({$i},'{$qmsg_id}',event)\""; - $spmeh .= " onmouseout=\"{$this->spmObjName}.hide(event)\""; - } else { - $spmeh = ''; - } - - // $toresにまとめて出力 - $tores .= '
    '; - $tores .= "{$i} : "; // 番号 - $tores .= preg_replace('{[ ]*}i', '', "{$name} : "); - if ($mail) { - $tores .= $mail . ' : '; // メール - } - $tores .= $date_id; // 日付とID - if ($this->am_side_of_id) { - $tores .= ' ' . $this->activeMona->getMona($qmsg_id); - } - $tores .= "
    \n"; - - // 被レスリスト(縦形式) - if ($_conf['backlink_list'] == 1 || $_conf['backlink_list'] > 2) { - $tores .= $this->_quotebackListHtml($i, 1); - } - - $tores .= "
    {$msg}
    \n"; // 内容 - // 被レスリスト(横形式) - if ($_conf['backlink_list'] == 2 || $_conf['backlink_list'] > 2) { - $tores .= $this->_quotebackListHtml($i, 2); - } - - // 被参照ブロック用データ - if ($_conf['backlink_block'] > 0) { - $tores .= $this->_getBacklinkComment($i); - } - - return $tores; - } - - // }}} - // {{{ _getBacklinkComment() - - protected function _getBacklinkComment($i) - { - $backlinks = $this->_quotebackListHtml($i, 3); - if (strlen($backlinks)) { - return ''; - } - return ''; - } - - // }}} - // {{{ transName() - - /** - * 名前をHTML用に変換する - * - * @param string $name 名前 - * @return string - */ - public function transName($name) - { - global $_conf; - - // トリップやホスト付きなら分解する - if (($pos = strpos($name, '◆')) !== false) { - $trip = substr($name, $pos); - $name = substr($name, 0, $pos); - } else { - $trip = null; - } - - // 数字を引用レスポップアップリンク化 - if ($_conf['quote_res_view']) { - if (strlen($name) && $name != $this->_nanashiName) { - $name = preg_replace_callback( - self::getAnchorRegex('/(?:^|%prefix%)(%nums%)/'), - array($this, '_quoteNameCallback'), $name - ); - } - } - - if ($trip) { - $name .= $trip; - } elseif ($name) { - // 文字化け回避 - $name = $name . ' '; - //if (in_array(0xF0 & ord(substr($name, -1)), array(0x80, 0x90, 0xE0))) { - // $name .= ' '; - //} - } - - return $name; - } - - // }}} - // {{{ transMsg() - - /** - * datのレスメッセージをHTML表示用メッセージに変換する - * - * @param string $msg メッセージ - * @param int $mynum レス番号 - * @return string - */ - public function transMsg($msg, $mynum) - { - global $_conf; - global $pre_thumb_ignore_limit; - - // 2ch旧形式のdat - if ($this->thread->dat_type == '2ch_old') { - $msg = str_replace('@`', ',', $msg); - $msg = preg_replace('/&(?=[^;])/', '&', $msg); - } - - // &補正 - $msg = preg_replace('/&(?!#?\\w+;)/', '&', $msg); - - // Safariから投稿されたリンク中チルダの文字化け補正 - //$msg = preg_replace('{(h?t?tp://[\w\.\-]+/)〜([\w\.\-%]+/?)}', '$1~$2', $msg); - - // >>1のリンクをいったん外す - // >>1 - $msg = preg_replace('{<[Aa] .+?>(>>\\d[\\d\\-]*)}', '$1', $msg); - - // 本来は2chのDAT時点でなされていないとエスケープの整合性が取れない気がする。(URLリンクのマッチで副作用が出てしまう) - //$msg = str_replace(array('"', "'"), array('"', '''), $msg); - - // 2006/05/06 ノートンの誤反応対策 body onload=window() - $msg = str_replace('onload=window()', 'onload=window()', $msg); - - // 新着レスの画像は表示制限を無視する設定なら - if ($mynum > $this->thread->readnum && $_conf['expack.ic2.newres_ignore_limit']) { - $pre_thumb_ignore_limit = true; - } - - // 文末の改行と連続する改行を除去 - if ($_conf['strip_linebreaks']) { - $msg = $this->stripLineBreaks($msg /*, '
    ***
    '*/); - } - - // 引用やURLなどをリンク - $msg = $this->transLink($msg); - - // Wikipedia記法への自動リンク - if ($_conf['_linkToWikipeida']) { - $msg = $this->_wikipediaFilter($msg); - } - - return $msg; - } - - // }}} - // {{{ _abornedRes() - - /** - * あぼーんレスのHTMLを取得する - * - * @param string $res_id - * @return string - */ - protected function _abornedRes($res_id) - { - global $_conf; - - if ($_conf['ngaborn_purge_aborn']) { - return ''; - } - - return << -
     
    -
     
    -\n -EOP; - } - - // }}} - // {{{ idFilter() - - /** - * IDフィルタリングポップアップ変換 - * - * @param string $idstr ID:xxxxxxxxxx - * @param string $id xxxxxxxxxx - * @return string - */ - public function idFilter($idstr, $id) - { - global $_conf; - - // IDは8桁または10桁(+携帯/PC識別子)と仮定して - /* - if (strlen($id) % 2 == 1) { - $id = substr($id, 0, -1); - } - */ - $num_ht = ''; - if (isset($this->thread->idcount[$id]) && $this->thread->idcount[$id] > 0) { - $num = (string) $this->thread->idcount[$id]; - if ($_conf['iframe_popup'] == 3) { - $num_ht = ' '; - $num_ht .= preg_replace('/\\d/', '', $num); - $num_ht .= ' '; - } else { - $num_ht = '('.$num.')'; - } - } else { - return $idstr; - } - - if ($_conf['coloredid.enable'] > 0 && preg_match("|^ID:[ ]?[0-9A-Za-z/.+]{8,11}|",$idstr)) { - if ($this->_ids_for_render === null) { - $this->_ids_for_render = array(); - } - $this->_ids_for_render[substr($id, 0, 8)] = $this->thread->idcount[$id]; - if ($_conf['coloredid.click'] > 0) { - $num_ht = '' . $num_ht . ''; - } - $idstr = $this->_coloredIdStr( - $idstr, $id, $_conf['coloredid.click'] > 0 ? true : false); - } - - $filter_url = $_conf['read_php'] . '?' . http_build_query(array( - 'host' => $this->thread->host, - 'bbs' => $this->thread->bbs, - 'key' => $this->thread->key, - 'ls' => 'all', - 'offline' => '1', - 'idpopup' => '1', - 'rf' => array( - 'field' => ResFilter::FIELD_ID, - 'method' => ResFilter::METHOD_JUST, - 'match' => ResFilter::MATCH_ON, - 'include' => ResFilter::INCLUDE_NONE, - 'word' => $id, - ), - ), '', '&') . $_conf['k_at_a']; - - if ($_conf['iframe_popup']) { - return $this->iframePopup($filter_url, $idstr, $_conf['bbs_win_target_at']) . $num_ht; - } - return "{$idstr}{$num_ht}"; - } - - // }}} - // {{{ _linkToWikipeida() - - /** - * @see ShowThread - */ - protected function _linkToWikipeida($word) - { - global $_conf; - - $link = 'http://ja.wikipedia.org/wiki/' . rawurlencode($word); - if ($_conf['through_ime']) { - $link = P2Util::throughIme($link); - } - - return "{$word}"; - } - - // }}} - // {{{ quoteRes() - - /** - * 引用変換(単独) - * - * @param string $full >>1-100 - * @param string $qsign >> - * @param string $appointed_num 1-100 - * @param bool $anchor_jump - * @return string - */ - public function quoteRes($full, $qsign, $appointed_num, $anchor_jump = false) - { - global $_conf; - - $appointed_num = mb_convert_kana($appointed_num, 'n'); // 全角数字を半角数字に変換 - if (preg_match('/\\D/', $appointed_num)) { - $appointed_num = preg_replace('/\\D+/', '-', $appointed_num); - return $this->quoteResRange($full, $qsign, $appointed_num); - } - if (preg_match('/^0/', $appointed_num)) { - return $full; - } - - $qnum = intval($appointed_num); - if ($qnum < 1 || $qnum > sizeof($this->thread->datlines)) { - return $full; - } - - // あぼーんレスへのアンカー - if ($_conf['quote_res_view_aborn'] == 0 && - in_array($qnum, $this->_aborn_nums)) { - return '' . "{$full}"; - } - - if ($anchor_jump && $qnum >= $this->thread->resrange['start'] && $qnum <= $this->thread->resrange['to']) { - $read_url = '#' . ($this->_matome ? "t{$this->_matome}" : '') . "r{$qnum}"; - } else { - $read_url = "{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&offline=1&ls={$appointed_num}"; - } - $attributes = $_conf['bbs_win_target_at']; - if ($_conf['quote_res_view'] && ($_conf['quote_res_view_ng'] != 0 || - !in_array($qnum, $this->_ng_nums))) { - if ($this->_matome) { - $qres_id = "t{$this->_matome}qr{$qnum}"; - } else { - $qres_id = "qr{$qnum}"; - } - $attributes .= " onmouseover=\"showResPopUp('{$qres_id}',event)\""; - $attributes .= " onmouseout=\"hideResPopUp('{$qres_id}')\""; - } - return "_aborn_nums) ? ' class="abornanchor"' : - (in_array($qnum, $this->_ng_nums) ? ' class="nganchor"' : '')) - . ">{$full}"; - } - - // }}} - // {{{ quoteResRange() - - /** - * 引用変換(範囲) - * - * @param string $full >>1-100 - * @param string $qsign >> - * @param string $appointed_num 1-100 - * @return string - */ - public function quoteResRange($full, $qsign, $appointed_num) - { - global $_conf; - - if ($appointed_num == '-') { - return $full; - } - - $read_url = "{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&offline=1&ls={$appointed_num}n"; - - if ($_conf['iframe_popup']) { - $pop_url = $read_url . "&renzokupop=true"; - return $this->iframePopup(array($read_url, $pop_url), $full, $_conf['bbs_win_target_at'], 1); - } - - // 普通にリンク - return "{$full}"; - - // 1つ目を引用レスポップアップ - /* - $qnums = explode('-', $appointed_num); - $qlink = $this->quoteRes($qsign . $qnum[0], $qsign, $qnum[0]) . '-'; - if (isset($qnums[1])) { - $qlink .= $qnums[1]; - } - return $qlink; - */ - } - - // }}} - // {{{ iframePopup() - - /** - * HTMLポップアップ変換 - * - * @param string|array $url - * @param string|array $str - * @param string $attr - * @param int|null $mode - * @param bool $marker - * @return string - */ - public function iframePopup($url, $str, $attr = '', $mode = null, $marker = false) - { - global $_conf; - - // リンク用URLとポップアップ用URL - if (is_array($url)) { - $link_url = $url[0]; - $pop_url = $url[1]; - } else { - $link_url = $url; - $pop_url = $url; - } - - // リンク文字列とポップアップの印 - if (is_array($str)) { - $link_str = $str[0]; - $pop_str = $str[1]; - } else { - $link_str = $str; - $pop_str = null; - } - - // リンクの属性 - if (is_array($attr)) { - $_attr = $attr; - $attr = ''; - foreach ($_attr as $key => $value) { - $attr .= ' ' . $key . '="' . p2h($value) . '"'; - } - } elseif ($attr !== '' && substr($attr, 0, 1) != ' ') { - $attr = ' ' . $attr; - } - - // リンクの属性にHTMLポップアップ用のイベントハンドラを加える - $pop_attr = $attr; - if ($_conf['iframe_popup_event'] == 1) { - $pop_attr .= " onclick=\"stophide=true; showHtmlPopUp('{$pop_url}',event,0" . ($marker ? ' ,this' : '') . "); return false;\""; - } else { - $pop_attr .= " onmouseover=\"showHtmlPopUp('{$pop_url}',event,{$_conf['iframe_popup_delay']}" . ($marker ? ' ,this' : '') . ")\""; - } - $pop_attr .= " onmouseout=\"offHtmlPopUp()\""; - - // 最終調整 - if (is_null($mode)) { - $mode = $_conf['iframe_popup']; - } - if ($mode == 2 && !is_null($pop_str)) { - $mode = 3; - } elseif ($mode == 3 && is_null($pop_str)) { - global $skin, $STYLE; - - $custom_pop_img = "skin/{$skin}/pop.png"; - if (file_exists($custom_pop_img)) { - $pop_img = p2h($custom_pop_img); - $x = $STYLE['iframe_popup_mark_width']; - $y = $STYLE['iframe_popup_mark_height']; - } else { - $pop_img = 'img/pop.png'; - $y = $x = 12; - } - $pop_str = "\"\""; - } - - // リンク作成 - switch ($mode) { - // マーク無し - case 1: - return "{$link_str}"; - // (p)マーク - case 2: - return "(p){$link_str}"; - // [p]画像、サムネイルなど - case 3: - return "{$pop_str}{$link_str}"; - // ポップアップしない - default: - return "{$link_str}"; - } - } - - // }}} - // {{{ iframePopupCallback() - - /** - * HTMLポップアップ変換(コールバック用インターフェース) - * - * @param array $s 正規表現にマッチした要素の配列 - * @return string - */ - public function iframePopupCallback($s) - { - return $this->iframePopup(p2h($s[1], false), p2h($s[3], false), $s[2]); - } - - // }}} - // {{{ _coloredIdStr() - - /** - * Merged from http://jiyuwiki.com/index.php?cmd=read&page=rep2%A4%C7%A3%C9%A3%C4%A4%CE%C7%D8%B7%CA%BF%A7%CA%D1%B9%B9&alias%5B%5D=pukiwiki%B4%D8%CF%A2 - * - * @return string - */ - protected function _coloredIdStr($idstr, $id, $classed = false) - { - global $_conf; - - if (!(isset($this->thread->idcount[$id]) - && $this->thread->idcount[$id] > 1)) { - return $idstr; - } - if ($classed) { - return $this->_coloredIdStrClassed($idstr, $id); - } - - switch ($_conf['coloredid.rate.type']) { - case 1: - $rate = $_conf['coloredid.rate.times']; - break; - case 2: - $rate = $this->getIdCountRank(10); - break; - case 3: - $rate = $this->getIdCountAverage(); - break; - default: - return $idstr; - } - - if ($rate > 1 && $this->thread->idcount[$id] >= $rate) { - switch ($_conf['coloredid.coloring.type']) { - case 0: - return $this->_coloredIdStr0($idstr, $id); - break; - case 1: - return $this->_coloredIdStr1($idstr, $id); - break; - default: - return $idstr; - } - } - - return $idstr; - } - - // }}} - // {{{ _coloredIdStrClassed() - - private function _coloredIdStrClassed($idstr, $id) - { - $ret = array(); - $arr = explode(':', $idstr); - foreach ($arr as $i => $str) { - if ($i == 0 || $i == 1) { - $ret[] = '' . $str . ''; - } else { - $ret[] = $str; - } - } - return implode(':', $ret); - } - - // }}} - // {{{ _coloredIdStr0() - - /** - * IDカラー オリジナル着色用 - */ - private function _coloredIdStr0($idstr, $id) - { - if (!function_exists('coloredIdStyle0')) { - require P2_LIB_DIR . '/color/coloredIdStyle0.inc.php'; - } - - if (isset($this->idstyles[$id])) { - $colored = $this->idstyles[$id]; - } else { - $colored = coloredIdStyle0($id, $this->thread->idcount[$id]); - $this->idstyles[$id] = $colored; - } - $ret = array(); - foreach ($arr = explode(':', $idstr) as $i => $str) { - if ($colored[$i]) { - $ret[] = "{$str}"; - } else { - $ret[] = $str; - } - } - return implode(':', $ret); - } - - // }}} - // {{{ _coloredIdStr1() - - /** - * IDカラー thermon版用 - */ - private function _coloredIdStr1($idstr, $id) - { - if (!function_exists('coloredIdStyle')) { - require P2_LIB_DIR . '/color/coloredIdStyle.inc.php'; - } - - $colored = coloredIdStyle($idstr, $id, $this->thread->idcount[$id]); - $idstr2 = preg_split('/:/',$idstr,2); // コロンでID文字列を分割 - $ret = array_shift($idstr2).':'; - if ($colored[1]) { - $idstr2[1] = substr($idstr2[0], 4); - $idstr2[0] = substr($idstr2[0], 0, 4); - } - foreach ($idstr2 as $i => $str) { - if ($colored[$i]) { - $ret .= "{$str}"; - } else { - $ret .= $str; - } - } - return $ret; - } - - // }}} - // {{{ cssClassedId() - - /** - * IDカラーに使用するCSSクラス名をID文字列から算出して返す. - */ - static public function cssClassedId($id) - { - return 'idcss-' . bin2hex( - base64_decode(str_replace('.', '+', substr($id, 0, 8)))); - } - - // }}} - // {{{ ユーティリティメソッド - // {{{ imageHtmlPopup() - - /** - * 画像をHTMLポップアップ&ポップアップウインドウサイズに合わせる - */ - public function imageHtmlPopup($img_url, $img_tag, $link_str) - { - global $_conf; - - if ($_conf['expack.ic2.enabled'] && $_conf['expack.ic2.fitimage']) { - $popup_url = 'ic2_fitimage.php?url=' . rawurlencode(str_replace('&', '&', $img_url)); - } else { - $popup_url = $img_url; - } - - $pops = ($_conf['iframe_popup'] == 1) ? $img_tag . $link_str : array($link_str, $img_tag); - return $this->iframePopup(array($img_url, $popup_url), $pops, $_conf['ext_win_target_at'], null, true); - } - - // }}} - // {{{ respopToAsync() - - /** - * レスポップアップを非同期モードに加工する - */ - public function respopToAsync($str) - { - $respop_regex = '/(onmouseover)=\"(showResPopUp\(\'(q(\d+)of\d+)\',event\).*?)\"/'; - $respop_replace = '$1="loadResPopUp(' . $this->asyncObjName . ', $4);$2"'; - return preg_replace($respop_regex, $respop_replace, $str); - } - - // }}} - // {{{ getASyncObjJs() - - /** - * 非同期読み込みで利用するJavaScriptオブジェクトを生成する - */ - public function getASyncObjJs() - { - global $_conf; - static $done = array(); - - if (isset($done[$this->asyncObjName])) { - return; - } - $done[$this->asyncObjName] = true; - - $code = << -//asyncObjName} = { - host:"{$this->thread->host}", bbs:"{$this->thread->bbs}", key:"{$this->thread->key}", - readPhp:"{$_conf['read_php']}", readTarget:"{$_conf['bbs_win_target']}" -}; -//]]> -\n -EOJS; - return $code; - } - - // }}} - // {{{ getSpmObjJs() - - /** - * スマートポップアップメニューを生成するJavaScriptコードを生成する - */ - public function getSpmObjJs($retry = false) - { - global $_conf, $STYLE; - - if (isset(self::$_spm_objects[$this->spmObjName])) { - return $retry ? self::$_spm_objects[$this->spmObjName] : ''; - } - - $ttitle_en = UrlSafeBase64::encode($this->thread->ttitle); - - if ($_conf['expack.spm.filter_target'] == '' || $_conf['expack.spm.filter_target'] == 'read') { - $_conf['expack.spm.filter_target'] = '_self'; - } - - $motothre_url = $this->thread->getMotoThread(); - $motothre_url = substr($motothre_url, 0, strlen($this->thread->ls) * -1); - - $_spmOptions = array( - 'null', - ((!$_conf['disable_res'] && $_conf['expack.spm.kokores']) ? (($_conf['expack.spm.kokores_orig']) ? '2' : '1') : '0'), - (($_conf['expack.spm.ngaborn']) ? (($_conf['expack.spm.ngaborn_confirm']) ? '2' : '1') : '0'), - (($_conf['expack.spm.filter']) ? '1' : '0'), - (($this->am_on_spm) ? '1' : '0'), - (($_conf['expack.aas.enabled']) ? '1' : '0'), - ); - $spmOptions = implode(',', $_spmOptions); - - // エスケープ - $_spm_title = StrCtl::toJavaScript($this->thread->ttitle_hc); - $_spm_url = addslashes($motothre_url); - $_spm_host = addslashes($this->thread->host); - $_spm_bbs = addslashes($this->thread->bbs); - $_spm_key = addslashes($this->thread->key); - $_spm_ls = addslashes($this->thread->ls); - - $code = << -//spmObjName} = { - 'objName':'{$this->spmObjName}', - 'rc':'{$this->thread->rescount}', - 'title':'{$_spm_title}', - 'ttitle_en':'{$ttitle_en}', - 'url':'{$_spm_url}', - 'host':'{$_spm_host}', - 'bbs':'{$_spm_bbs}', - 'key':'{$_spm_key}', - 'ls':'{$_spm_ls}', - 'spmOption':[{$spmOptions}] -}; -SPM.init({$this->spmObjName}); -//]]> -\n -EOJS; - - self::$_spm_objects[$this->spmObjName] = $code; - - return $code; - } - - // }}} - // }}} - // {{{ transLinkDo()から呼び出されるURL書き換えメソッド - /** - * これらのメソッドは引数が処理対象パターンに合致しないとfalseを返し、 - * transLinkDo()はfalseが返ってくると$_url_handlersに登録されている次の関数/メソッドに処理させようとする。 - */ - // {{{ plugin_linkURL() - - /** - * URLリンク - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_linkURL($url, $purl, $str) - { - global $_conf; - - if (isset($purl['scheme'])) { - // ime - if ($_conf['through_ime']) { - $link_url = P2Util::throughIme($purl[0]); - } else { - $link_url = $url; - } - - $is_http = ($purl['scheme'] == 'http' || $purl['scheme'] == 'https'); - - // HTMLポップアップ - if ($_conf['iframe_popup'] && $is_http) { - // *pm 指定の場合のみ、特別に手動転送指定を追加する - if (substr($_conf['through_ime'], -2) == 'pm') { - $pop_url = P2Util::throughIme($purl[0], -1); - } else { - $pop_url = $link_url; - } - $link = $this->iframePopup(array($link_url, $pop_url), $str, $_conf['ext_win_target_at']); - } else { - $link = "{$str}"; - } - - // ブラクラチェッカ - if ($_conf['brocra_checker_use'] && $_conf['brocra_checker_url'] && $is_http) { - if (strlen($_conf['brocra_checker_query'])) { - $brocra_checker_url = $_conf['brocra_checker_url'] . '?' . $_conf['brocra_checker_query'] . '=' . rawurlencode($purl[0]); - } else { - $brocra_checker_url = rtrim($_conf['brocra_checker_url'], '/') . '/' . $url; - } - $brocra_checker_url_orig = $brocra_checker_url; - // ブラクラチェッカ・ime - if ($_conf['through_ime']) { - $brocra_checker_url = P2Util::throughIme($brocra_checker_url); - } - $check_mark = 'チェック'; - $check_mark_prefix = '['; - $check_mark_suffix = ']'; - // ブラクラチェッカ・HTMLポップアップ - if ($_conf['iframe_popup']) { - // *pm 指定の場合のみ、特別に手動転送指定を追加する - if (substr($_conf['through_ime'], -2) == 'pm') { - $brocra_checker_url = P2Util::throughIme($brocra_checker_url_orig, -1); - } else { - $brocra_pop_url = $brocra_checker_url; - } - if ($_conf['iframe_popup'] == 3) { - $check_mark = ''; - $check_mark_prefix = ''; - $check_mark_suffix = ''; - } - $brocra_checker_link = $this->iframePopup(array($brocra_checker_url, $brocra_pop_url), $check_mark, $_conf['ext_win_target_at']); - } else { - $brocra_checker_link = "{$check_mark}"; - } - $link .= $check_mark_prefix . $brocra_checker_link . $check_mark_suffix; - } - - return $link; - } - return false; - } - - // }}} - // {{{ plugin_link2chSubject() - - /** - * 2ch bbspink 板リンク - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_link2chSubject($url, $purl, $str) - { - global $_conf; - - if (preg_match('{^http://(\\w+\\.(?:2ch\\.net|bbspink\\.com))/(\\w+)/$}', $purl[0], $m)) { - $subject_url = "{$_conf['subject_php']}?host={$m[1]}&bbs={$m[2]}"; - return "{$str} [板をp2で開く]"; - } - return false; - } - - // }}} - // {{{ plugin_linkThread() - - /** - * スレッドリンク - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_linkThread($url, $purl, $str) - { - global $_conf; - - list($nama_url, $host, $bbs, $key, $ls) = P2Util::detectThread($purl[0]); - if ($host && $bbs && $key) { - $read_url = "{$_conf['read_php']}?host={$host}&bbs={$bbs}&key={$key}&ls={$ls}"; - if ($_conf['iframe_popup']) { - if ($ls && preg_match('/^[0-9\\-n]+$/', $ls)) { - $pop_url = $read_url; - } else { - $pop_url = $read_url . '&one=true'; - } - return $this->iframePopup(array($read_url, $pop_url), $str, $_conf['bbs_win_target_at']); - } - return "{$str}"; - } - - return false; - } - - // }}} - // {{{ plugin_linkYouTube() - - /** - * YouTubeリンク変換プラグイン - * - * Zend_Gdata_Youtubeを使えばサムネイルその他の情報を簡単に取得できるが... - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_linkYouTube($url, $purl, $str) - { - global $_conf; - - // http://www.youtube.com/watch?v=Mn8tiFnAUAI - // http://m.youtube.com/watch?v=OhcX0xJsDK8&client=mv-google&gl=JP&hl=ja&guid=ON&warned=True - if (preg_match('{^http://(www|jp|m)\\.youtube\\.com/watch\\?(?:.+&)?v=([0-9a-zA-Z_\\-]+)}', $url, $m)) { - // ime - if ($_conf['through_ime']) { - $link_url = P2Util::throughIme($url); - } else { - $link_url = $url; - } - - // HTMLポップアップ - if ($_conf['iframe_popup']) { - $link = $this->iframePopup($link_url, $str, $_conf['ext_win_target_at']); - } else { - $link = "{$str}"; - } - - $subd = $m[1]; - $id = $m[2]; - - if ($_conf['link_youtube'] == 2) { - return << -EOP; - } else { - return << -EOP; - } - } - return false; - } - - // }}} - // {{{ plugin_linkNicoNico() - - /** - * ニコニコ動画変換プラグイン - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_linkNicoNico($url, $purl, $str) - { - global $_conf; - - // http://www.nicovideo.jp/watch?v=utbrYUJt9CSl0 - // http://www.nicovideo.jp/watch/utvWwAM30N0No - // http://m.nicovideo.jp/watch/sm7044684 - if (preg_match('{^http://(?:www|m)\\.nicovideo\\.jp/watch(?:/|(?:\\?v=))([0-9a-zA-Z_-]+)}', $url, $m)) { - // ime - if ($_conf['through_ime']) { - $link_url = P2Util::throughIme($purl[0]); - } else { - $link_url = $url; - } - - // HTMLポップアップ - if ($_conf['iframe_popup']) { - $link = $this->iframePopup($link_url, $str, $_conf['ext_win_target_at']); - } else { - $link = "{$str}"; - } - - $id = $m[1]; - - if ($_conf['link_niconico'] == 2) { - return << -EOP; - } else { - return << -EOP; - } - } - return false; - } - - // }}} - // {{{ plugin_viewImage() - - /** - * 画像ポップアップ変換 - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_viewImage($url, $purl, $str) - { - global $_conf; - global $pre_thumb_unlimited, $pre_thumb_limit; - - if (P2Util::isUrlWikipediaJa($url)) { - return false; - } - - // 表示制限 - if (!$pre_thumb_unlimited && empty($pre_thumb_limit)) { - return false; - } - - if (preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $purl[0]) && empty($purl['query'])) { - $pre_thumb_limit--; // 表示制限カウンタを下げる - $img_tag = ""; - - if ($_conf['iframe_popup']) { - $view_img = $this->imageHtmlPopup($url, $img_tag, $str); - } else { - $view_img = "{$img_tag}{$str}"; - } - - // ブラクラチェッカ (プレビューとは相容れないのでコメントアウト) - /*if ($_conf['brocra_checker_use']) { - $link_url_en = rawurlencode($url); - if ($_conf['iframe_popup'] == 3) { - $check_mark = ''; - $check_mark_prefix = ''; - $check_mark_suffix = ''; - } else { - $check_mark = 'チェック'; - $check_mark_prefix = '['; - $check_mark_suffix = ']'; - } - $view_img .= $check_mark_prefix . "{$check_mark}" . $check_mark_suffix; - }*/ - - return $view_img; - } - - return false; - } - - // }}} - // {{{ plugin_imageCache2() - - /** - * ImageCache2サムネイル変換 - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_imageCache2($url, $purl, $str, - $force = false, - $referer = null) - { - static $serial = 0; - - global $_conf; - global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit; - - if (P2Util::isUrlWikipediaJa($url)) { - return false; - } - - if ((preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $purl[0]) && empty($purl['query'])) || $force) { - // 準備 - $serial++; - $thumb_id = 'thumbs' . $serial . $this->thumb_id_suffix; - $tmp_thumb = './img/ic_load.png'; - $url_ht = $url; - $url = $purl[0]; - $url_en = rawurlencode($url) . - ($referer ? '&ref=' . rawurlencode($referer) : ''); - $img_id = null; - - $icdb = new ImageCache2_DataObject_Images(); - - // r=0:リンク;r=1:リダイレクト;r=2:PHPで表示 - // t=0:オリジナル;t=1:PC用サムネイル;t=2:携帯用サムネイル;t=3:中間イメージ - $img_url = 'ic2.php?r=1&uri=' . $url_en; - $thumb_url = 'ic2.php?r=1&t=1&uri=' . $url_en; - // お気にスレ自動画像ランク - $rank = null; - if ($_conf['expack.ic2.fav_auto_rank']) { - $rank = $this->getAutoFavRank(); - if ($rank !== null) { - $thumb_url .= '&rank=' . $rank; - } - } - - // DBに画像情報が登録されていたとき - if ($icdb->get($url)) { - $img_id = $icdb->id; - - // ウィルスに感染していたファイルのとき - if ($icdb->mime == 'clamscan/infected') { - return " {$str}"; - } - // あぼーん画像のとき - if ($icdb->rank < 0) { - return " {$str}"; - } - - // オリジナルがキャッシュされているときは画像を直接読み込む - $_img_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); - if (file_exists($_img_url)) { - $img_url = $_img_url; - $cached = true; - } else { - $cached = false; - } - - // サムネイルが作成されていているときは画像を直接読み込む - $_thumb_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); - if (file_exists($_thumb_url)) { - $thumb_url = $_thumb_url; - // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 - if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false){ - $update = new ImageCache2_DataObject_Images(); - if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { - $update->memo = $this->img_memo . ' ' . $icdb->memo; - } else { - $update->memo = $this->img_memo; - } - $update->whereAddQuoted('uri', '=', $url); - } - - // expack.ic2.fav_auto_rank_override の設定とランク条件がOKなら - // お気にスレ自動画像ランクを上書き更新 - if ($rank !== null && - self::isAutoFavRankOverride($icdb->rank, $rank)) { - if ($update === null) { - $update = new ImageCache2_DataObject_Images(); - $update->whereAddQuoted('uri', '=', $url); - } - $update->rank = $rank; - } - - if ($update !== null) { - $update->update(); - } - } - - // サムネイルの画像サイズ - $thumb_size = $this->thumbnailer->calc($icdb->width, $icdb->height); - $thumb_size = preg_replace('/(\d+)x(\d+)/', 'width="$1" height="$2"', $thumb_size); - $tmp_thumb = './img/ic_load1.png'; - - $orig_img_url = $img_url; - $orig_thumb_url = $thumb_url; - - // 画像がキャッシュされていないとき - // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める - } else { - // 画像がブラックリストorエラーログにあるか確認 - if (false !== ($errcode = $icdb->ic2_isError($url))) { - return " {$str}"; - } - - $cached = false; - - $orig_img_url = $img_url; - $orig_thumb_url = $thumb_url; - $img_url .= $this->img_memo_query; - $thumb_url .= $this->img_memo_query; - $thumb_size = ''; - $tmp_thumb = './img/ic_load2.png'; - } - - // キャッシュされておらず、表示数制限が有効のとき - if (!$cached && !$pre_thumb_unlimited && !$pre_thumb_ignore_limit) { - // 表示制限を超えていたら、表示しない - // 表示制限を超えていなければ、表示制限カウンタを下げる - if ($pre_thumb_limit <= 0) { - $show_thumb = false; - } else { - $show_thumb = true; - $pre_thumb_limit--; - } - } else { - $show_thumb = true; - } - - // 表示モード - if ($show_thumb) { - $img_tag = ""; - if ($_conf['iframe_popup']) { - $view_img = $this->imageHtmlPopup($img_url, $img_tag, $str); - } else { - $view_img = "{$img_tag}{$str}"; - } - } else { - $img_tag = ""; - $view_img = "{$img_tag}{$str}"; - } - - // ソースへのリンクをime付きで表示 - if ($_conf['expack.ic2.enabled'] && $_conf['expack.ic2.through_ime']) { - $ime_url = P2Util::throughIme($url); - if ($_conf['iframe_popup'] == 3) { - $ime_mark = ''; - } else { - $ime_mark = '[ime]'; - } - $view_img .= " {$ime_mark}"; - } - - $view_img .= ''; - - return $view_img; - } - - return false; - } - - // }}} - // {{{ plugin_replaceImageUrl() - - /** - * 置換画像URL+ImageCache2 - */ - public function plugin_replaceImageUrl($url, $purl, $str) - { - static $serial = 0; - - global $_conf; - global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit; - - // +Wiki - global $replaceImageUrlCtl; - - $url = $purl[0]; - $replaced = $replaceImageUrlCtl->replaceImageUrl($url); - if (!$replaced[0]) { - return false; - } - - foreach ($replaced as $v) { - $url_en = rawurlencode($v['url']); - $url_ht = p2h($v['url']); - $ref_en = $v['referer'] ? '&ref=' . rawurlencode($v['referer']) : ''; - - // 準備 - $serial++; - $thumb_id = 'thumbs' . $serial . $this->thumb_id_suffix; - $tmp_thumb = './img/ic_load.png'; - - $icdb = new ImageCache2_DataObject_Images(); - - // r=0:リンク;r=1:リダイレクト;r=2:PHPで表示 - // t=0:オリジナル;t=1:PC用サムネイル;t=2:携帯用サムネイル;t=3:中間イメージ - // +Wiki - $img_url = 'ic2.php?r=1&uri=' . $url_en . $ref_en; - $thumb_url = 'ic2.php?r=1&t=1&uri=' . $url_en . $ref_en; - // お気にスレ自動画像ランク - $rank = null; - if ($_conf['expack.ic2.fav_auto_rank']) { - $rank = $this->getAutoFavRank(); - if ($rank !== null) $thumb_url .= '&rank=' . $rank; - } - - // DBに画像情報が登録されていたとき - if ($icdb->get($v['url'])) { - - // ウィルスに感染していたファイルのとき - if ($icdb->mime == 'clamscan/infected') { - $result .= ""; - continue; - } - // あぼーん画像のとき - if ($icdb->rank < 0) { - $result .= ""; - continue; - } - - // オリジナルがキャッシュされているときは画像を直接読み込む - $_img_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); - if (file_exists($_img_url)) { - $img_url = $_img_url; - $cached = true; - } else { - $cached = false; - } - - // サムネイルが作成されていているときは画像を直接読み込む - $_thumb_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); - if (file_exists($_thumb_url)) { - $thumb_url = $_thumb_url; - // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 - if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false){ - $update = new ImageCache2_DataObject_Images(); - if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { - $update->memo = $this->img_memo . ' ' . $icdb->memo; - } else { - $update->memo = $this->img_memo; - } - $update->whereAddQuoted('uri', '=', $v['url']); - } - - // expack.ic2.fav_auto_rank_override の設定とランク条件がOKなら - // お気にスレ自動画像ランクを上書き更新 - if ($rank !== null && - self::isAutoFavRankOverride($icdb->rank, $rank)) { - if ($update === null) { - $update = new ImageCache2_DataObject_Images(); - $update->whereAddQuoted('uri', '=', $v['url']); - } - $update->rank = $rank; - } - - if ($update !== null) { - $update->update(); - } - } - - // サムネイルの画像サイズ - $thumb_size = $this->thumbnailer->calc($icdb->width, $icdb->height); - $thumb_size = preg_replace('/(\d+)x(\d+)/', 'width="$1" height="$2"', $thumb_size); - $tmp_thumb = './img/ic_load1.png'; - - $orig_img_url = $img_url; - $orig_thumb_url = $thumb_url; - - // 画像がキャッシュされていないとき - // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める - } else { - // 画像がブラックリストorエラーログにあるか確認 - if (false !== ($errcode = $icdb->ic2_isError($v['url']))) { - $result .= ""; - continue; - } - - $cached = false; - - $orig_img_url = $img_url; - $orig_thumb_url = $thumb_url; - $img_url .= $this->img_memo_query; - $thumb_url .= $this->img_memo_query; - $thumb_size = ''; - $tmp_thumb = './img/ic_load2.png'; - } - - // キャッシュされておらず、表示数制限が有効のとき - if (!$cached && !$pre_thumb_unlimited && !$pre_thumb_ignore_limit) { - // 表示制限を超えていたら、表示しない - // 表示制限を超えていなければ、表示制限カウンタを下げる - if ($pre_thumb_limit <= 0) { - $show_thumb = false; - } else { - $show_thumb = true; - $pre_thumb_limit--; - } - } else { - $show_thumb = true; - } - - // 表示モード - if ($show_thumb) { - $img_tag = ""; - if ($_conf['iframe_popup']) { - $view_img = $this->imageHtmlPopup($img_url, $img_tag, ''); - } else { - $view_img = "{$img_tag}"; - } - } else { - $img_tag = ""; - $view_img = "{$img_tag}"; - } - - $view_img .= '"; - . "'{$url_ht}', event)\">"; - - $result .= $view_img; - } - // ソースへのリンクをime付きで表示 - $ime_url = P2Util::throughIme($url); - $result .= "{$str}"; - return $result; - } - - /** - * +Wiki:リンクプラグイン - */ - public function plugin_linkPlugin($url, $purl, $str) - { - return $GLOBALS['linkPluginCtl']->replaceLinkToHTML($url, $str); - } - - // }}} - // {{{ plugin_imepitaToImageCache2() - - /** - * imepitaのURLを加工してImageCache2させるプラグイン - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_imepitaToImageCache2($url, $purl, $str) - { - if (preg_match('{^https?://imepita\.jp/(?:image/)?(\d{8}/\d{6})}i', - $purl[0], $m) && empty($purl['query'])) { - $_url = 'http://imepita.jp/image/' . $m[1]; - $_purl = @parse_url($_url); - $_purl[0] = $_url; - return $this->plugin_imageCache2($_url, $_purl, $str, true, $url); - } - return false; - } - - // }}} - // }}} - // {{{ getQuotebacksJson() - - public function getQuotebacksJson() - { - $ret = array(); - foreach ($this->getQuoteFrom() as $resnum => $quote_from) { - if (!$quote_from) { - continue; - } - if ($resnum != 1 && ($resnum < $this->thread->resrange['start'] || $resnum > $this->thread->resrange['to'])) { - continue; - } - $tmp = array(); - foreach ($quote_from as $quote) { - if ($quote != 1 && ($quote < $this->thread->resrange['start'] || $quote > $this->thread->resrange['to'])) { - continue; - } - $tmp[] = $quote; - } - if ($tmp) $ret[] = "{$resnum}:[" . join(',', $tmp) . "]"; - } - return '{' . join(',', $ret) . '}'; - } - - // }}} - // {{{ getResColorJs() - - public function getResColorJs() - { - global $_conf, $STYLE; - - $fontstyle_bold = empty($STYLE['fontstyle_bold']) ? 'normal' : $STYLE['fontstyle_bold']; - $fontweight_bold = empty($STYLE['fontweight_bold']) ? 'normal' : $STYLE['fontweight_bold']; - $fontfamily_bold = $STYLE['fontfamily_bold']; - $backlinks = $this->getQuotebacksJson(); - $colors = array(); - $backlink_colors = join(',', - array_map(create_function('$x', 'return "\'{$x}\'";'), - explode(',', $_conf['backlink_coloring_track_colors'])) - ); - $prefix = $this->_matome ? "t{$this->_matome}" : ''; - return << -if (typeof rescolObjs == 'undefined') rescolObjs = []; -rescolObjs.push((function() { - var obj = new BacklinkColor('{$prefix}'); - obj.colors = [{$backlink_colors}]; - obj.highlightStyle = {fontStyle :'{$fontstyle_bold}', fontWeight : '{$fontweight_bold}', fontFamily : '{$fontfamily_bold}'}; - obj.backlinks = {$backlinks}; - return obj; -})()); - -EOJS; - } - - // }}} - // {{{ getIdsForRenderJson() - - public function getIdsForRenderJson() - { - $ret = array(); - if ($this->_ids_for_render) { - foreach ($this->_ids_for_render as $id => $count) { - $ret[] = "'{$id}':{$count}"; - } - } - return '{' . join(',', $ret) . '}'; - } - - // }}} - // {{{ getIdColorJs() - - public function getIdColorJs() - { - global $_conf, $STYLE; - - if ($_conf['coloredid.enable'] < 1 || $_conf['coloredid.click'] < 1) { - return ''; - } - if (count($this->thread->idcount) < 1) { - return ''; - } - - $idslist = $this->getIdsForRenderJson(); - - $rate = $_conf['coloredid.rate.times']; - $tops = $this->getIdCountRank(10); - $average = $this->getIdCountAverage(); - $color_init = ''; - if ($_conf['coloredid.rate.type'] > 0) { - switch($_conf['coloredid.rate.type']) { - case 2: - $init_rate = $tops; - break; - case 3: - $init_rate = $average; - break; - case 1: - $init_rate = $rate; - default: - } - if ($init_rate > 1) - $color_init .= 'idCol.initColor(' . $init_rate . ', idslist);'; - } - $color_init .= "idCol.rate = {$rate};"; - if (!$this->_matome) { - $color_init .= "idCol.tops = {$tops};"; - $color_init .= "idCol.average = {$average};"; - } - $hissiCount = $_conf['coloredid.rate.hissi.times']; - $mark_colors = join(',', - array_map(create_function('$x', 'return "\'{$x}\'";'), - explode(',', $_conf['coloredid.marking.colors'])) - ); - $fontstyle_bold = empty($STYLE['fontstyle_bold']) ? 'normal' : $STYLE['fontstyle_bold']; - $fontweight_bold = empty($STYLE['fontweight_bold']) ? 'normal' : $STYLE['fontweight_bold']; - $fontfamily_bold = $STYLE['fontfamily_bold']; - $uline = $STYLE['a_underline_none'] != 1 - ? 'idCol.colorStyle["textDecoration"] = "underline"' : ''; - return << -(function() { -var idslist = {$idslist}; -if (typeof idCol == 'undefined') { - idCol = new IDColorChanger(idslist, {$hissiCount}); - idCol.colors = [{$mark_colors}]; -{$uline}; - idCol.highlightStyle = {fontStyle :'{$fontstyle_bold}', fontWeight : '{$fontweight_bold}', fontFamily : '{$fontfamily_bold}', fontSize : '104%'}; -} else idCol.addIdlist(idslist); -{$color_init} -idCol.setupSPM('{$this->spmObjName}'); -})(); - -EOJS; - } - - // }}} - // {{{ getIdCountAverage() - - public function getIdCountAverage() - { - if ($this->_idcount_average !== null) { - return $this->_idcount_average; - } - - $sum = 0; - $param = 0; - - foreach ($this->thread->idcount as $count) { - if ($count > 1) { - $sum += $count; - $param++; - } - } - - $result = ($param < 1) ? 0 : intval(ceil($sum / $param)); - $this->_idcount_average = $result; - - return $result; - } - - // }}} - // {{{ getIdCountRank() - - public function getIdCountRank($rank) - { - if ($this->_idcount_tops !== null) { - return $this->_idcount_tops; - } - - $ranking = array(); - - foreach ($this->thread->idcount as $count) { - if ($count > 1) { - $ranking[] = $count; - } - } - - if (count($ranking) == 0) { - return 0; - } - - rsort($ranking); - $rcount = count($ranking); - - $result = ($rcount >= $rank) ? $ranking[$rank - 1] : $ranking[$rcount - 1]; - $this->_idcount_tops = $result; - - return $result; - } - - // }}} -} - -// }}} - -/* - * Local Variables: - * mode: php - * coding: cp932 - * tab-width: 4 - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End: - */ -// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/rep2/live_read.php b/rep2/live_read.php index e9f9b1650..03695eb95 100755 --- a/rep2/live_read.php +++ b/rep2/live_read.php @@ -1,6 +1,6 @@ getThreadInfoFromIdx(); -//========================================================== -// preview >>1 -//========================================================== - -//if (!empty($_GET['onlyone'])) { -if (!empty($_GET['one'])) { - $aThread->ls = '1'; - $aThread->resrange = array('start' => 1, 'to' => 1, 'nofirst' => false); - - // 必ずしも正確ではないが便宜的に - //if (!isset($aThread->rescount) && !empty($_GET['rc'])) { - if (!isset($aThread->rescount) && !empty($_GET['rescount'])) { - //$aThread->rescount = $_GET['rc']; - $aThread->rescount = (int)$_GET['rescount']; - } - - $preview = $aThread->previewOne(); - $ptitle_ht = p2h($aThread->itaj) . ' / ' . $aThread->ttitle_hd; - - include READ_HEADER_INC_PHP; - echo $preview; - include READ_FOOTER_INC_PHP; - - return; -} - //=========================================================== // DATのダウンロード //=========================================================== @@ -202,62 +176,11 @@ $ptitle_ht = p2h($aThread->itaj) . ' / ' . $aThread->ttitle_hd; if ($_conf['ktai']) { + include READ_HEADER_INC_PHP; - if ($resFilter && $resFilter->hasWord() && $aThread->rescount) { - $GLOBALS['filter_hits'] = 0; - } else { - $GLOBALS['filter_hits'] = null; - } - - $aShowThread = new ShowThreadK($aThread); - - if ($is_ajax) { - $response = trim(mb_convert_encoding($aShowThread->getDatToHtml(true), 'UTF-8', 'CP932')); - if (isset($_GET['respop_id'])) { - $response = preg_replace('/<[^<>]+? id="/u', sprintf('$0_respop%d_', $_GET['respop_id']), $response); - } - /*if ($_conf['iphone']) { - // HTMLの断片をXMLとして渡してもDOMでidやclassが期待通りに反映されない - header('Content-Type: application/xml; charset=UTF-8'); - //$responseId = 'ajaxResponse' . time(); - $doc = new DOMDocument(); - $err = error_reporting(E_ALL & ~E_WARNING); - $html = '' - . '' - . '' - . $response - . ''; - $doc->loadHTML($html); - error_reporting($err); - echo ''; - echo $doc->saveXML($doc->getElementsByTagName('div')->item(0)); - } else {*/ - // よって、HTMLの断片をそのまま返してinnterHTMLに代入しないといけない。 - // (根本的にレスポンスのフォーマットとクライアント側での処理を変えない限りは) - header('Content-Type: text/html; charset=UTF-8'); - echo $response; - //} - } else { - if ($aThread->rescount) { - if ($_GET['showbl']) { - $content = $aShowThread->getDatToHtml_resFrom(); - } else { - $content = $aShowThread->getDatToHtml(); - } - } elseif ($aThread->diedat && count($aThread->datochi_residuums) > 0) { - $content = $aShowThread->getDatochiResiduums(); - } - - include READ_HEADER_INC_PHP; - - if ($_conf['iphone'] && $_conf['expack.spm.enabled']) { - echo $aShowThread->getSpmObjJs(); - } - - echo $content; + echo "PCのみ実況できます。"; - include READ_FOOTER_INC_PHP; - } + include READ_FOOTER_INC_PHP; } else { @@ -284,8 +207,8 @@ //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("datToHtml"); if ($aThread->rescount) { - $mainhtml = ''; - require_once P2_LIB_DIR . '/live/live_ShowThreadPc.php'; + //どうせ表示しないので本体のShowThreadPcを使う + //require_once P2_LIB_DIR . '/live/live_ShowThreadPc.php'; $aShowThread = new ShowThreadPc($aThread); if ($_conf['expack.spm.enabled']) { @@ -293,24 +216,14 @@ } $res1 = $aShowThread->quoteOne(); // >>1ポップアップ用 - if ($_conf['coloredid.enable'] > 0 && $_conf['coloredid.click'] > 0 && - $_conf['coloredid.rate.type'] > 0) { - if ($_GET['showbl']) { - $mainhtml = $aShowThread->datToHtml_resFrom(true); - } else { - $mainhtml .= $aShowThread->datToHtml(true); - } - $mainhtml .= $res1['q']; + + //呼ばないとIDカラーなどが反映されないので呼ぶが結果は表示しない + if ($_GET['showbl']) { + $aShowThread->getDatToHtml_resFrom(); } else { - if ($_GET['showbl']) { - $aShowThread->datToHtml_resFrom(); - } else { - $aShowThread->datToHtml(); - } - echo $res1['q']; + $aShowThread->getDatToHtml(); } - // レス追跡カラー if ($_conf['backlink_coloring_track']) { echo $aShowThread->getResColorJs(); @@ -319,11 +232,13 @@ // IDカラーリング if ($_conf['coloredid.enable'] > 0 && $_conf['coloredid.click'] > 0) { echo $aShowThread->getIdColorJs(); - // ブラウザ負荷軽減のため、CSS書き換えスクリプトの後でコンテンツを - // レンダリングさせる - echo $mainhtml; } + // 本文の代わり + echo <<\n +LIVE; + // 外部ツール $pluswiki_js = ''; @@ -374,7 +289,6 @@ } } elseif ($aThread->diedat && count($aThread->datochi_residuums) > 0) { - require_once P2_LIB_DIR . '/ShowThreadPc.php'; $aShowThread = new ShowThreadPc($aThread); echo $aShowThread->getDatochiResiduums(); } From ea112fb0a2fb3e0af1bb000e749679b9b825ff96 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 19 Mar 2015 02:10:59 +0900 Subject: [PATCH 073/339] =?UTF-8?q?rep2/info.php=E3=81=A7Mango=E6=9D=BF?= =?UTF-8?q?=E3=81=AE=E3=82=B9=E3=83=AC=E3=83=83=E3=83=89=E3=82=BF=E3=82=A4?= =?UTF-8?q?=E3=83=88=E3=83=AB=E8=A3=85=E9=A3=BE=E3=81=8C=E5=8F=8D=E6=98=A0?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=9F=20http://anago.2ch.net/test/read.cgi/software/1425420?= =?UTF-8?q?543/769?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/info.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rep2/info.php b/rep2/info.php index 0cd0f8a69..8362de0e7 100644 --- a/rep2/info.php +++ b/rep2/info.php @@ -336,7 +336,7 @@ P2Util::printInfoHtml(); echo "

    \n"; -echo "{$hd['ttitle_name']}\n"; +echo "",(isset($title_msg) ? $hd['ttitle_name'] : $aThread->ttitle_hd),"\n";echo "

    \n"; echo "

    \n"; // 携帯なら冒頭で表示 From ea38f48531e8595c900e3a7ab6ed4e6bc65edce5 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 19 Mar 2015 12:52:54 +0900 Subject: [PATCH 074/339] =?UTF-8?q?=E5=89=8A=E9=99=A4=E3=81=97=E3=81=9Fliv?= =?UTF-8?q?e=5FShowThreadPc.php=E3=82=92=E5=9F=BA=E3=81=ABlive=5FShowThrea?= =?UTF-8?q?dLive.php=E3=82=92=E4=BD=9C=E6=88=90=20=E6=9C=AC=E4=BD=93?= =?UTF-8?q?=E3=81=AEShowThreadPc=E3=82=92=E7=B6=99=E6=89=BF=E3=81=97?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=82=8B=E3=81=9F=E3=82=81=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=86=E3=83=8A=E3=83=B3=E3=82=B9=E3=81=8C=E3=82=AF=E3=83=83?= =?UTF-8?q?=E3=82=BD=E6=A5=BD=E3=81=AB=E3=81=AA=E3=82=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/live/live_ShowThreadLive.php | 207 +++++++++++++++++++++++++++++++ rep2/live_read.php | 9 +- 2 files changed, 212 insertions(+), 4 deletions(-) create mode 100644 lib/live/live_ShowThreadLive.php diff --git a/lib/live/live_ShowThreadLive.php b/lib/live/live_ShowThreadLive.php new file mode 100644 index 000000000..64815d13c --- /dev/null +++ b/lib/live/live_ShowThreadLive.php @@ -0,0 +1,207 @@ +thread->explodeDatLine($ares); + if (($id = $this->thread->ids[$i]) !== null) { + $idstr = 'ID:' . $id; + $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $date_id); + } else { + $idstr = null; + } + + // +Wiki:置換ワード + if (isset($GLOBALS['replaceWordCtl'])) { + $replaceWordCtl = $GLOBALS['replaceWordCtl']; + $name = $replaceWordCtl->replace('name', $this->thread, $ares, $i); + $mail = $replaceWordCtl->replace('mail', $this->thread, $ares, $i); + $date_id = $replaceWordCtl->replace('date', $this->thread, $ares, $i); + $msg = $replaceWordCtl->replace('msg', $this->thread, $ares, $i); + } + + $tores = ''; + $rpop = ''; + if ($this->_matome) { + $res_id = "t{$this->_matome}r{$i}"; + $msg_id = "t{$this->_matome}m{$i}"; + } else { + $res_id = "r{$i}"; + $msg_id = "m{$i}"; + } + $msg_class = 'message'; + + // NGあぼーんチェック + $ng_type = $this->_ngAbornCheck($i, strip_tags($name), $mail, $date_id, $id, $msg, false, $ng_info); + if ($ng_type == self::ABORN) { + return $this->_abornedRes($res_id); + } + if ($ng_type != self::NG_NONE) { + $ngaborns_head_hits = self::$_ngaborns_head_hits; + $ngaborns_body_hits = self::$_ngaborns_body_hits; + } + + // AA判定 + if ($this->am_autodetect && $this->activeMona->detectAA($msg)) { + $msg_class .= ' ActiveMona'; + } + + //============================================================= + // レスをポップアップ表示 + //============================================================= + if ($_conf['quote_res_view']) { + $quote_res_nums = $this->checkQuoteResNums($i, $name, $msg); + + foreach ($quote_res_nums as $rnv) { + if (!isset($this->_quote_res_nums_done[$rnv])) { + $this->_quote_res_nums_done[$rnv] = true; + if (isset($this->thread->datlines[$rnv-1])) { + if ($this->_matome) { + $qres_id = "t{$this->_matome}qr{$rnv}"; + } else { + $qres_id = "qr{$rnv}"; + } + $ds = $this->qRes($this->thread->datlines[$rnv-1], $rnv); + $onPopUp_at = " onmouseover=\"showResPopUp('{$qres_id}',event)\" onmouseout=\"hideResPopUp('{$qres_id}')\""; + $rpop .= "
    \n{$ds}
    \n"; + } + } + } + } + + //============================================================= + // まとめて出力 + //============================================================= + + $name = $this->transName($name); // 名前HTML変換 + $msg = $this->transMsg($msg, $i); // メッセージHTML変換 + + + // BEプロファイルリンク変換 + $date_id = $this->replaceBeId($date_id, $i); + + // HTMLポップアップ + if ($_conf['iframe_popup']) { + $date_id = preg_replace_callback("{((\?#*)|(Lv\.\d+))}", array($this, 'iframePopupCallback'), $date_id); + } + + // NGメッセージ変換 + if ($ng_type != self::NG_NONE && count($ng_info)) { + $ng_info = implode(', ', $ng_info); + $msg = <<{$ng_info} +
    {$msg}
    +EOMSG; + } + + // NGネーム変換 + if ($ng_type & self::NG_NAME) { + $name = <<{$name} +EONAME; + $msg = <<{$msg} +EOMSG; + + // NGメール変換 + } elseif ($ng_type & self::NG_MAIL) { + $mail = <<{$mail} +EOMAIL; + $msg = <<{$msg} +EOMSG; + + // NGID変換 + } elseif ($ng_type & self::NG_ID) { + $date_id = <<{$date_id} +EOID; + $msg = <<{$msg} +EOMSG; + + } + + /* + //「ここから新着」画像を挿入 + if ($i == $this->thread->readnum +1) { + $tores .= <<新着レス +EOP; + } + */ + + // SPM + if ($_conf['expack.spm.enabled']) { + $spmeh = " onmouseover=\"{$this->spmObjName}.show({$i},'{$msg_id}',event)\""; + $spmeh .= " onmouseout=\"{$this->spmObjName}.hide(event)\""; + } else { + $spmeh = ''; + } + + // +live スレ内容表示部削除 + + /*if ($_conf['expack.am.enabled'] == 2) { + $tores .= << +// +\n +EOJS; + }*/ + + // まとめてフィルタ色分け + if ($pattern) { + $tores = StrCtl::filterMarking($pattern, $tores); + } + + return array('body' => $tores, 'q' => $rpop); + } + + // }}} +} + +// }}} + +/* + * Local Variables: + * mode: php + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ +// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/rep2/live_read.php b/rep2/live_read.php index 03695eb95..3b7c485c7 100755 --- a/rep2/live_read.php +++ b/rep2/live_read.php @@ -207,9 +207,10 @@ //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("datToHtml"); if ($aThread->rescount) { - //どうせ表示しないので本体のShowThreadPcを使う - //require_once P2_LIB_DIR . '/live/live_ShowThreadPc.php'; - $aShowThread = new ShowThreadPc($aThread); + // どうせ表示しないので本体のShowThreadPcを使う + // 表示しない内容を全部作るのもアレなので最低限の出力のShowThreadLiveに変更 + require_once P2_LIB_DIR . '/live/live_ShowThreadLive.php'; + $aShowThread = new ShowThreadLive($aThread); if ($_conf['expack.spm.enabled']) { echo $aShowThread->getSpmObjJs(); @@ -217,7 +218,7 @@ $res1 = $aShowThread->quoteOne(); // >>1ポップアップ用 - //呼ばないとIDカラーなどが反映されないので呼ぶが結果は表示しない + // 呼ばないとIDカラーなどが反映されないので呼ぶが結果は表示しない if ($_GET['showbl']) { $aShowThread->getDatToHtml_resFrom(); } else { From d9900c1d5643345d76d9d99be9f396c89a93f967 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 20 Mar 2015 10:57:19 +0900 Subject: [PATCH 075/339] =?UTF-8?q?=E3=83=9D=E3=83=83=E3=83=97=E3=82=A2?= =?UTF-8?q?=E3=83=83=E3=83=97=E3=81=8B=E3=82=89=E6=9B=B8=E3=81=8D=E8=BE=BC?= =?UTF-8?q?=E3=81=BF=E6=88=90=E5=8A=9F=E3=81=97=E3=81=9F=E5=BE=8C=E3=81=AB?= =?UTF-8?q?=E3=82=B9=E3=83=AC=E3=82=92=E5=86=8D=E8=AA=AD=E3=81=BF=E8=BE=BC?= =?UTF-8?q?=E3=81=BF=E3=81=97=E3=81=AA=E3=81=84=E8=A8=AD=E5=AE=9A=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- conf/conf_user_def.inc.php | 4 ++++ doc/README-774.txt | 11 +++++++++++ rep2/edit_conf_user.php | 1 + rep2/info.php | 1 - rep2/post.php | 7 +++++++ 6 files changed, 24 insertions(+), 2 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 0eef511cf..a95f4c705 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150317.1200', // rep2のバージョン + 'p2version' => '150320.1020', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 547fab700..d00defce8 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -459,6 +459,10 @@ $conf_user_def['res_write_rec'] = 1; // (1) $conf_user_rad['res_write_rec'] = array('1' => 'する', '0' => 'しない'); +// ポップアップから書き込み成功したらスレを再読み込みする(する:1, しない:0) +$conf_user_def['res_popup_reload'] = 1; // (1) +$conf_user_rad['res_popup_reload'] = array('1' => 'する', '0' => 'しない'); + // 外部URLジャンプする際に通すゲート // 「直接」でもCookieが使えない端末では gate.php を通す $conf_user_def['through_ime'] = "exm"; // ("exm") diff --git a/doc/README-774.txt b/doc/README-774.txt index e4958c057..8674088d1 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -36,6 +36,17 @@ rep2-expack test https://github.com/orzisun/p2-php 本家p2と同じく、X11ライセンスです。 ●ChangeLog +150320.1020 +・ポップアップから書き込み成功した後にスレを再読み込みしない設定を追加 +・実況モードからの書き込みでCookie確認が発生した場合実況モードに戻れない不具合を修正 +・メンテナンス性を向上させるためlive_ShowThreadPc.phpとlive_ShowThread.phpの代わりに +live_ShowThreadLive.phpと本体のShowThread.phpを使用するように変更 +・下書き保存(expack.editor.savedraft)が無効なときに実況モードから書き込めない不具合を修正 +・スレタイ検索でWarningが出る不具合を修正 + +150317.1200 +・その他諸々 + 150316.1120 ・3ペイン表示の配置を変更できる設定を追加 ・Beのアイコンを表示できるようにした diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index 3a6d23839..3c3a59e9a 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -416,6 +416,7 @@ array('rct_rec_num', '最近読んだスレの記録数'), array('res_hist_rec_num', '書き込み履歴の記録数'), array('res_write_rec', '書き込み内容ログを記録'), + array('res_popup_reload', 'ポップアップから書き込み成功したらスレを再読み込みする'), array('through_ime', '外部URLジャンプする際に通すゲート
    「直接」でもCookieが使えない端末では gate.php を通す'), array('through_ime_http_only', ' HTTPSでアクセスしているときは外部URLゲートを通さない
    (最近のWebブラウザの多くは https → http の遷移でRefererを送出しませんが、
    「HTTPSでは直」にする場合は、お使いのブラウザの仕様を確認してください)'), array('ime_manual_ext', 'ゲートで自動転送しない拡張子(カンマ区切りで、拡張子の前のピリオドは不要)'), diff --git a/rep2/info.php b/rep2/info.php index 8362de0e7..7fbe15e64 100644 --- a/rep2/info.php +++ b/rep2/info.php @@ -337,7 +337,6 @@ echo "

    \n"; echo "",(isset($title_msg) ? $hd['ttitle_name'] : $aThread->ttitle_hd),"\n";echo "

    \n"; -echo "

    \n"; // 携帯なら冒頭で表示 if ($_conf['ktai']) { diff --git a/rep2/post.php b/rep2/post.php index 0902dde02..f9ac31fb8 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -660,7 +660,14 @@ function showPostMsg($isDone, $result_msg, $reload) $popup_ht = << // From a69d8a571931f37ed50171c957912ed30f657e5e Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sat, 21 Mar 2015 22:45:52 +0900 Subject: [PATCH 076/339] =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E3=81=AE=E3=82=B5=E3=83=B3=E3=83=97=E3=83=AB?= =?UTF-8?q?=E9=81=94=E3=82=92=E6=9B=B4=E6=96=B0=E3=81=97=E3=81=A6Readme?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/data/Readme.txt | 15 +++++++++++++++ doc/data/p2_replace_msg.txt | 2 ++ 2 files changed, 17 insertions(+) create mode 100644 doc/data/Readme.txt create mode 100644 doc/data/p2_replace_msg.txt diff --git a/doc/data/Readme.txt b/doc/data/Readme.txt new file mode 100644 index 000000000..7df6aa584 --- /dev/null +++ b/doc/data/Readme.txt @@ -0,0 +1,15 @@ ++Wiki設定ファイルのサンプル集 + +標準設定の場合はdata/pref/に入れると機能します。 +詳しい説明はdoc/wiki/内のテキストに記載されています。 + +p2_plugin_dat.txt DAT取得プラグイン +p2_plugin_link.txt リンクプラグイン +p2_replace_imageurl.txt 置換画像URL(JaneのImageViewURLReplace.dat相当) + +下記のファイルは直接編集する必要があります。 +編集方法はdoc/wiki/内のテキストをよく読んでください。 +p2_replace_mail.txt メール +p2_replace_name.txt 名前 +p2_replace_date.txt 日付・ID等 +p2_replace_msg.txt 本文 diff --git a/doc/data/p2_replace_msg.txt b/doc/data/p2_replace_msg.txt new file mode 100644 index 000000000..b90bb9c49 --- /dev/null +++ b/doc/data/p2_replace_msg.txt @@ -0,0 +1,2 @@ +//Jimがファビョって付け足したフッターを除去 +
    .* From 0f1559463100d98b8f5de62790a80c1b85bc474c Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 22 Mar 2015 10:21:50 +0900 Subject: [PATCH 077/339] =?UTF-8?q?dig2ch=E3=81=AE=E9=AF=96=E3=81=AB?= =?UTF-8?q?=E8=BB=BD=E5=BE=AE=E3=81=AA=E4=B8=8D=E5=85=B7=E5=90=88=E3=81=8C?= =?UTF-8?q?=E7=99=BA=E7=94=9F=E3=81=97=E3=81=9F=E3=81=A8=E3=81=8D=E3=81=AE?= =?UTF-8?q?=E5=AF=BE=E7=AD=96=E3=82=92=E8=AC=9B=E3=81=98=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/dig2ch.php | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php index 56b2b537a..87fc80681 100644 --- a/rep2/dig2ch.php +++ b/rep2/dig2ch.php @@ -10,7 +10,7 @@ function dig2chsearch($query) $query_arry['q'] = urlencode($query_arry['q']); $client = new HTTP_Client(); - $client->setDefaultHeader('User-Agent', 'p2-tgrep-client'); + $client->setDefaultHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.4; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko'); $code = $client->get($_conf['test.dig2ch_url'] . '?AndOr=' . $query_arry['AndOr'] . '&maxResult=' . $query_arry['maxResult'] . '&atLeast=1&Sort=' . $query_arry['Sort'] . '&Link=1&Bbs=all&924=' . $query_arry['924'] . '&json=1&keywords=' . $query_arry['q']); if (PEAR::isError($code)) { p2die($code->getMessage()); @@ -19,34 +19,38 @@ function dig2chsearch($query) } $response = $client->currentResponse(); - $jsontest1 = json_decode($response['body'], true); + // 先方の鯖で何か障害が発生したらJSONにHTMLのコメントが混ざるのでその対策 + $body = preg_replace("/<\!--.*-->/", "", $response['body']); + + $jsontest1 = json_decode($body, true); //mb_convert_variables('SHIFT-JIS','UTF-8',$jsontest1); - /* switch (json_last_error()) { + $jsonerror = ""; + switch (json_last_error()) { case JSON_ERROR_NONE: - echo ' - No errors'; + $jsonerror = ' - No errors'; break; case JSON_ERROR_DEPTH: - echo ' - Maximum stack depth exceeded'; + $jsonerror = ' - Maximum stack depth exceeded'; break; case JSON_ERROR_STATE_MISMATCH: - echo ' - Underflow or the modes mismatch'; + $jsonerror = ' - Underflow or the modes mismatch'; break; case JSON_ERROR_CTRL_CHAR: - echo ' - Unexpected control character found'; + $jsonerror = ' - Unexpected control character found'; break; case JSON_ERROR_SYNTAX: - echo ' - Syntax error, malformed JSON'; + $jsonerror = ' - Syntax error, malformed JSON'; break; case JSON_ERROR_UTF8: - echo ' - Malformed UTF-8 characters, possibly incorrectly encoded'; + $jsonerror = ' - Malformed UTF-8 characters, possibly incorrectly encoded'; break; default: - echo ' - Unknown error'; + $jsonerror = ' - Unknown error'; break; - } */ + } if ($jsontest1 === NULL) { - p2die("検索結果の取得に失敗しました"); + p2die("検索結果の取得に失敗しました".$jsonerror); } foreach ($jsontest1[result] as $jsontest2) { From cfa904dabc97eb79f97eb5224a40360282862641 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 23 Mar 2015 00:06:40 +0900 Subject: [PATCH 078/339] =?UTF-8?q?=E7=BD=AE=E6=8F=9B=E3=83=AF=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=82=92=E3=83=9D=E3=83=83=E3=83=97=E3=82=A2=E3=83=83?= =?UTF-8?q?=E3=83=97=E3=81=AB=E3=82=82=E5=8A=B9=E3=81=8F=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4=E3=80=82=20=E7=BD=AE=E6=8F=9B?= =?UTF-8?q?=E3=83=AF=E3=83=BC=E3=83=89=E3=81=AE=E5=87=A6=E7=90=86=E3=82=92?= =?UTF-8?q?strtr=E3=81=AB=E3=81=97=E3=81=9F=E3=80=82=E3=80=80http://anago.?= =?UTF-8?q?2ch.net/test/read.cgi/software/1426940268/27=20dig2ch=E3=81=A7?= =?UTF-8?q?=E6=A4=9C=E7=B4=A2=E7=B5=90=E6=9E=9C=E3=81=AE=E7=95=AA=E5=8F=B7?= =?UTF-8?q?=E3=81=8C1=E3=81=8B=E3=82=89=E8=A1=A8=E7=A4=BA=E3=81=95?= =?UTF-8?q?=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=20dig2ch=E3=81=AEjson=E3=82=A8=E3=83=A9=E3=83=BC=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=82=92=E5=A4=89=E6=9B=B4=20dig2ch.php=E3=81=AE?= =?UTF-8?q?=E3=82=BF=E3=83=96=E3=82=92=E3=82=B9=E3=83=9A=E3=83=BC=E3=82=B9?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 22 ++++++ lib/ShowThreadPc.php | 13 +++- lib/expack/tgrep/view.inc.php | 2 +- lib/wiki/ReplaceWordCtl.php | 24 +++--- rep2/dig2ch.php | 139 ++++++++++++++++++---------------- 5 files changed, 118 insertions(+), 82 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index d74543d0d..adda081ba 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -58,6 +58,11 @@ class P2Util */ static private $_hostIsVip2ch = array(); + /** + * isHost2chSc()のキャッシュ + */ + static private $_hostIs2chSc = array(); + /** * P2Imeオブジェクト * @@ -977,6 +982,23 @@ static public function adjustHostJbbs($in_str) //return preg_replace('<(^|/)jbbs\\.(?:shitaraba\\.com|livedoor\\.(?:com|jp))(/|$)>', '\\1rentalbbs.livedoor.com\\2', $in_str, 1); } + // }}} + // {{{ isHost2chSc() + + /** + * host が 2ch.sc なら true を返す + * + * @param string $host + * @return boolean + */ + static public function isHost2chSc($host) + { + if (!array_key_exists($host, self::$_hostIs2chSc)) { + self::$_hostIs2chSc[$host] = (bool)preg_match('/\\.(2ch\\.sc)$/', $host); + } + return self::$_hostIs2chSc[$host]; + } + // }}} // {{{ header_nocache() diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index 5f7cc9290..d628add09 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -364,7 +364,7 @@ public function qRes($ares, $i) global $_conf; $resar = $this->thread->explodeDatLine($ares); - $name = $this->transName($resar[0]); + $name = $resar[0]; $mail = $resar[1]; if (($id = $this->thread->ids[$i]) !== null) { $idstr = 'ID:' . $id; @@ -375,6 +375,17 @@ public function qRes($ares, $i) } $msg = $this->transMsg($resar[3], $i); + // +Wiki:置換ワード + if (isset($GLOBALS['replaceWordCtl'])) { + $replaceWordCtl = $GLOBALS['replaceWordCtl']; + $name = $replaceWordCtl->replace('name', $this->thread, $ares, $i); + $mail = $replaceWordCtl->replace('mail', $this->thread, $ares, $i); + $date_id = $replaceWordCtl->replace('date', $this->thread, $ares, $i); + $msg = $replaceWordCtl->replace('msg', $this->thread, $ares, $i); + } + + $name = $this->transName($name); // 名前HTML変換 + $tores = ''; if ($this->_matome) { diff --git a/lib/expack/tgrep/view.inc.php b/lib/expack/tgrep/view.inc.php index 8112cece5..9c93c96a0 100644 --- a/lib/expack/tgrep/view.inc.php +++ b/lib/expack/tgrep/view.inc.php @@ -161,7 +161,7 @@ function sf() { - + title; ?> ita; ?> tkey); ?> diff --git a/lib/wiki/ReplaceWordCtl.php b/lib/wiki/ReplaceWordCtl.php index 02396f040..7e75136e7 100644 --- a/lib/wiki/ReplaceWordCtl.php +++ b/lib/wiki/ReplaceWordCtl.php @@ -119,7 +119,7 @@ public function replace($cont, $aThread, $ares, $i) $mail = $resar[1]; $date_id = $resar[2]; $msg = $resar[3]; - + switch ($cont) { case 'name': $word = $name; @@ -169,19 +169,15 @@ public function replace($cont, $aThread, $ares, $i) これ自体に正規表現が入っていたらどうしよう。 実質的に使うのは$i, $host, $bbs, $key, $date_idくらいだから問題ないだろうけど。 */ - $v['replace'] = str_replace ('$ttitle_hd', $aThread->ttitle_hd, $v['replace']); - $v['replace'] = str_replace ('$ttitle', $aThread->ttitle, $v['replace']); - $v['replace'] = str_replace ('$host', $aThread->host, $v['replace']); - $v['replace'] = str_replace ('$bbs', $aThread->bbs, $v['replace']); - $v['replace'] = str_replace ('$key', $aThread->key, $v['replace']); - // $v['replace'] = str_replace ('$name', $name, $v['replace']); - // $v['replace'] = str_replace ('$mail', $mail, $v['replace']); - // $v['replace'] = str_replace ('$date_id', $date_id, $v['replace']); - // $v['replace'] = str_replace ('$msg', $msg, $v['replace']); - $v['replace'] = str_replace ('$id_base64', base64_encode($id), $v['replace']); - $v['replace'] = str_replace ('$id', $id, $v['replace']); - $v['replace'] = str_replace ('$i', $i, $v['replace']); - + $v['replace'] = strtr($v['replace'], array( + '$ttitle_hd' => $aThread->ttitle_hd, + '$host' => $aThread->host, + '$bbs' => $aThread->bbs, + '$key' => $aThread->key, + '$id' => $id, + '$id_base64' => base64_encode($id), + '$i' => $i + )); $word = @preg_replace ('{'.$v['match'].'}', $v['replace'], $word); } diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php index 87fc80681..6eb8e04f9 100644 --- a/rep2/dig2ch.php +++ b/rep2/dig2ch.php @@ -2,83 +2,90 @@ // {{{ dig2chsearch() function dig2chsearch($query) { - global $_conf; + global $_conf; - parse_str($query, $query_arry); + parse_str($query, $query_arry); - //$query_q = preg_replace('/(\s+)/' , '\+' ,$query_arry['q']); - $query_arry['q'] = urlencode($query_arry['q']); + //$query_q = preg_replace('/(\s+)/' , '\+' ,$query_arry['q']); + $query_arry['q'] = urlencode($query_arry['q']); - $client = new HTTP_Client(); - $client->setDefaultHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.4; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko'); - $code = $client->get($_conf['test.dig2ch_url'] . '?AndOr=' . $query_arry['AndOr'] . '&maxResult=' . $query_arry['maxResult'] . '&atLeast=1&Sort=' . $query_arry['Sort'] . '&Link=1&Bbs=all&924=' . $query_arry['924'] . '&json=1&keywords=' . $query_arry['q']); - if (PEAR::isError($code)) { - p2die($code->getMessage()); - } elseif ($code != 200) { - p2die("HTTP Error - {$code}"); - } - $response = $client->currentResponse(); + $client = new HTTP_Client(); + $client->setDefaultHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.4; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko'); + $code = $client->get($_conf['test.dig2ch_url'] . '?AndOr=' . $query_arry['AndOr'] . '&maxResult=' . $query_arry['maxResult'] . '&atLeast=1&Sort=' . $query_arry['Sort'] . '&Link=1&Bbs=all&924=' . $query_arry['924'] . '&json=1&keywords=' . $query_arry['q']); + if (PEAR::isError($code)) { + p2die($code->getMessage()); + } elseif ($code != 200) { + p2die("HTTP Error - {$code}"); + } + $response = $client->currentResponse(); + $body = $response['body']; // 先方の鯖で何か障害が発生したらJSONにHTMLのコメントが混ざるのでその対策 - $body = preg_replace("/<\!--.*-->/", "", $response['body']); + if (strpos($body,"/", "", $body); + } - $jsontest1 = json_decode($body, true); + $jsontest1 = json_decode($body, true); + unset($body); - //mb_convert_variables('SHIFT-JIS','UTF-8',$jsontest1); - $jsonerror = ""; - switch (json_last_error()) { - case JSON_ERROR_NONE: - $jsonerror = ' - No errors'; - break; - case JSON_ERROR_DEPTH: - $jsonerror = ' - Maximum stack depth exceeded'; - break; - case JSON_ERROR_STATE_MISMATCH: - $jsonerror = ' - Underflow or the modes mismatch'; - break; - case JSON_ERROR_CTRL_CHAR: - $jsonerror = ' - Unexpected control character found'; - break; - case JSON_ERROR_SYNTAX: - $jsonerror = ' - Syntax error, malformed JSON'; - break; - case JSON_ERROR_UTF8: - $jsonerror = ' - Malformed UTF-8 characters, possibly incorrectly encoded'; - break; - default: - $jsonerror = ' - Unknown error'; - break; - } - if ($jsontest1 === NULL) { - p2die("検索結果の取得に失敗しました".$jsonerror); - } + //mb_convert_variables('SHIFT-JIS','UTF-8',$jsontest1); - foreach ($jsontest1[result] as $jsontest2) { + if ($jsontest1 === NULL) { + + $jsonerror = ""; + switch (json_last_error()) { + case JSON_ERROR_NONE: + $jsonerror = ' - No errors'; + break; + case JSON_ERROR_DEPTH: + $jsonerror = ' - Maximum stack depth exceeded'; + break; + case JSON_ERROR_STATE_MISMATCH: + $jsonerror = ' - Underflow or the modes mismatch'; + break; + case JSON_ERROR_CTRL_CHAR: + $jsonerror = ' - Unexpected control character found'; + break; + case JSON_ERROR_SYNTAX: + $jsonerror = ' - Syntax error, malformed JSON'; + break; + case JSON_ERROR_UTF8: + $jsonerror = ' - Malformed UTF-8 characters, possibly incorrectly encoded'; + break; + default: + $jsonerror = ' - Unknown error'; + break; + } + p2die("検索結果の取得に失敗しました".$jsonerror); + } + + foreach ($jsontest1[result] as $jsontest2) { $result['threads'][$n1] = new stdClass; - $result['threads'][$n1]->title = $jsontest2[subject]; - $result['threads'][$n1]->host = $jsontest2[server]; - $result['threads'][$n1]->bbs = $jsontest2[bbs]; - $result['threads'][$n1]->tkey = $jsontest2[key]; - $result['threads'][$n1]->resnum = $jsontest2[resno]; - $result['threads'][$n1]->ita = $jsontest2[ita]; - $result['threads'][$n1]->dayres = $jsontest2[ikioi]; - $n1++; - } - $result['modified'] = isset($response['body']['date'])? $response['body']['date'] : ''; - $result['profile']['regex'] = '/(' . $jsontest1[query] .')/i'; - $result['profile']['hits'] = $jsontest1[found]; - $result['profile']['cm0'] = str_replace("a href=" , "a target=\"_blank\" href=", $jsontest1[cm0]); - if (strstr($result['profile']['cm0'] , "rounin")) { $result['profile']['cm0'] = str_replace("src=\"" , "src=\"http://dig.2ch.net", $result['profile']['cm0']);} - $result['profile']['cm0'] = str_replace("
    " , "", $result['profile']['cm0']); + $result['threads'][$n1]->title = $jsontest2[subject]; + $result['threads'][$n1]->host = $jsontest2[server]; + $result['threads'][$n1]->bbs = $jsontest2[bbs]; + $result['threads'][$n1]->tkey = $jsontest2[key]; + $result['threads'][$n1]->resnum = $jsontest2[resno]; + $result['threads'][$n1]->ita = $jsontest2[ita]; + $result['threads'][$n1]->dayres = $jsontest2[ikioi]; + $n1++; + } + $result['modified'] = isset($response['body']['date'])? $response['body']['date'] : ''; + $result['profile']['regex'] = '/(' . $jsontest1[query] .')/i'; + $result['profile']['hits'] = $jsontest1[found]; + $result['profile']['cm0'] = str_replace("a href=" , "a target=\"_blank\" href=", $jsontest1[cm0]); + if (strstr($result['profile']['cm0'] , "rounin")) { $result['profile']['cm0'] = str_replace("src=\"" , "src=\"http://dig.2ch.net", $result['profile']['cm0']);} + $result['profile']['cm0'] = str_replace("
    " , "", $result['profile']['cm0']); - $result['profile']['cm1'] = str_replace("a href=" , "a target=\"_blank\" href=", $jsontest1[cm1]); - if (strstr($result['profile']['cm1'] , "rounin")) { $result['profile']['cm1'] = str_replace("src=\"" , "src=\"http://dig.2ch.net", $result['profile']['cm1']);} - $result['profile']['cm1'] = str_replace("
    " , "", $result['profile']['cm1']); + $result['profile']['cm1'] = str_replace("a href=" , "a target=\"_blank\" href=", $jsontest1[cm1]); + if (strstr($result['profile']['cm1'] , "rounin")) { $result['profile']['cm1'] = str_replace("src=\"" , "src=\"http://dig.2ch.net", $result['profile']['cm1']);} + $result['profile']['cm1'] = str_replace("
    " , "", $result['profile']['cm1']); - $result['profile']['cm2'] = str_replace("a href=" , "a target=\"_blank\" href=", $jsontest1[cm2]); - if (strstr($result['profile']['cm2'] , "rounin")) { $result['profile']['cm2'] = str_replace("src=\"" , "src=\"http://dig.2ch.net", $result['profile']['cm2']);} - $result['profile']['cm2'] = str_replace("
    " , "", $result['profile']['cm2']); + $result['profile']['cm2'] = str_replace("a href=" , "a target=\"_blank\" href=", $jsontest1[cm2]); + if (strstr($result['profile']['cm2'] , "rounin")) { $result['profile']['cm2'] = str_replace("src=\"" , "src=\"http://dig.2ch.net", $result['profile']['cm2']);} + $result['profile']['cm2'] = str_replace("
    " , "", $result['profile']['cm2']); - return $result; + return $result; } From 0419bdb7ab399ad9344ad56f3905e1ac4e17dd46 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 23 Mar 2015 10:37:15 +0900 Subject: [PATCH 079/339] =?UTF-8?q?=E3=83=9D=E3=83=83=E3=83=97=E3=82=A2?= =?UTF-8?q?=E3=83=83=E3=83=97=E5=86=85=E3=81=AE=E3=83=AC=E3=82=B9=E3=82=A2?= =?UTF-8?q?=E3=83=B3=E3=82=AB=E3=83=BC=E3=83=AA=E3=83=B3=E3=82=AF=E5=85=88?= =?UTF-8?q?=E3=81=8C=E3=81=8A=E3=81=8B=E3=81=97=E3=81=8F=E3=81=AA=E3=82=8B?= =?UTF-8?q?=E4=B8=8D=E5=85=B7=E5=90=88=E3=82=92=E4=BF=AE=E6=AD=A3=E3=80=82?= =?UTF-8?q?=20+Wiki:=E7=BD=AE=E6=8F=9B=E3=83=AF=E3=83=BC=E3=83=89=E3=82=92?= =?UTF-8?q?=E3=83=9D=E3=83=83=E3=83=97=E3=82=A2=E3=83=83=E3=83=97=E3=81=AB?= =?UTF-8?q?=E9=81=A9=E7=94=A8=E3=81=99=E3=82=8B=E6=99=82=E3=81=AB=E3=83=9F?= =?UTF-8?q?=E3=82=B9=E3=81=A3=E3=81=A6=E3=81=84=E3=81=9F=E6=A8=A1=E6=A7=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThreadPc.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index d628add09..3784c1c31 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -363,17 +363,13 @@ public function qRes($ares, $i) { global $_conf; - $resar = $this->thread->explodeDatLine($ares); - $name = $resar[0]; - $mail = $resar[1]; + list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($ares); if (($id = $this->thread->ids[$i]) !== null) { $idstr = 'ID:' . $id; - $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $resar[2]); + $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $date_id); } else { $idstr = null; - $date_id = $resar[2]; } - $msg = $this->transMsg($resar[3], $i); // +Wiki:置換ワード if (isset($GLOBALS['replaceWordCtl'])) { @@ -385,6 +381,7 @@ public function qRes($ares, $i) } $name = $this->transName($name); // 名前HTML変換 + $msg = $this->transMsg($msg, $i); // メッセージHTML変換 $tores = ''; From a3ce5857fd3f2bfd2afb03acb79f8b8c4cf01544 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 23 Mar 2015 11:13:35 +0900 Subject: [PATCH 080/339] =?UTF-8?q?=E3=83=AC=E3=82=B9=E3=82=92=E3=83=9D?= =?UTF-8?q?=E3=83=83=E3=83=97=E3=82=A2=E3=83=83=E3=83=97(quote=5Fres=5Fvie?= =?UTF-8?q?w)=E3=81=8C=E7=84=A1=E5=8A=B9=E3=81=AA=E3=81=A8=E3=81=8D?= =?UTF-8?q?=E3=81=AB=E5=AE=9F=E6=B3=81=E3=83=A2=E3=83=BC=E3=83=89=E3=81=AE?= =?UTF-8?q?ID=E8=89=B2=E3=81=A5=E3=81=91(coloredid)=E3=81=8C=E5=8A=B9?= =?UTF-8?q?=E3=81=8B=E3=81=AA=E3=81=84=E4=B8=8D=E5=85=B7=E5=90=88=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20=E3=83=AC=E3=82=B9=E3=82=92HTML=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=8F=9B=E3=81=99=E3=82=8B=E9=9A=9B=E3=81=AB=E3=83=AF?= =?UTF-8?q?=E3=83=BC=E3=83=89=E7=BD=AE=E6=8F=9B=E3=81=8C=E6=9C=89=E5=8A=B9?= =?UTF-8?q?=E3=81=A0=E3=81=A8explodeDatLine=E3=81=8C=E5=BF=85=E8=A6=81?= =?UTF-8?q?=E4=BB=A5=E4=B8=8A=E3=81=AB=E5=AE=9F=E8=A1=8C=E3=81=95=E3=82=8C?= =?UTF-8?q?=E3=82=8B=E4=B8=8D=E5=85=B7=E5=90=88=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThreadPc.php | 34 ++++++++++++----------- lib/live/live_ShowThreadLive.php | 46 ++++++++++---------------------- 2 files changed, 32 insertions(+), 48 deletions(-) diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index 3784c1c31..a13ea0b63 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -136,14 +136,6 @@ public function transRes($ares, $i, $pattern = null) { global $_conf, $STYLE, $mae_msg, $highlight_msgs, $highlight_chain_nums; - list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($ares); - if (($id = $this->thread->ids[$i]) !== null) { - $idstr = 'ID:' . $id; - $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $date_id); - } else { - $idstr = null; - } - // +Wiki:置換ワード if (isset($GLOBALS['replaceWordCtl'])) { $replaceWordCtl = $GLOBALS['replaceWordCtl']; @@ -151,6 +143,15 @@ public function transRes($ares, $i, $pattern = null) $mail = $replaceWordCtl->replace('mail', $this->thread, $ares, $i); $date_id = $replaceWordCtl->replace('date', $this->thread, $ares, $i); $msg = $replaceWordCtl->replace('msg', $this->thread, $ares, $i); + } else { + list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($ares); + } + + if (($id = $this->thread->ids[$i]) !== null) { + $idstr = 'ID:' . $id; + $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $date_id); + } else { + $idstr = null; } // +live (live.bbs_noname) 用 @@ -363,14 +364,6 @@ public function qRes($ares, $i) { global $_conf; - list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($ares); - if (($id = $this->thread->ids[$i]) !== null) { - $idstr = 'ID:' . $id; - $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $date_id); - } else { - $idstr = null; - } - // +Wiki:置換ワード if (isset($GLOBALS['replaceWordCtl'])) { $replaceWordCtl = $GLOBALS['replaceWordCtl']; @@ -378,6 +371,15 @@ public function qRes($ares, $i) $mail = $replaceWordCtl->replace('mail', $this->thread, $ares, $i); $date_id = $replaceWordCtl->replace('date', $this->thread, $ares, $i); $msg = $replaceWordCtl->replace('msg', $this->thread, $ares, $i); + } else { + list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($ares); + } + + if (($id = $this->thread->ids[$i]) !== null) { + $idstr = 'ID:' . $id; + $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $date_id); + } else { + $idstr = null; } $name = $this->transName($name); // 名前HTML変換 diff --git a/lib/live/live_ShowThreadLive.php b/lib/live/live_ShowThreadLive.php index 64815d13c..248369e1b 100644 --- a/lib/live/live_ShowThreadLive.php +++ b/lib/live/live_ShowThreadLive.php @@ -33,14 +33,6 @@ public function transRes($ares, $i, $pattern = null) { global $_conf, $STYLE, $mae_msg; - list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($ares); - if (($id = $this->thread->ids[$i]) !== null) { - $idstr = 'ID:' . $id; - $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $date_id); - } else { - $idstr = null; - } - // +Wiki:置換ワード if (isset($GLOBALS['replaceWordCtl'])) { $replaceWordCtl = $GLOBALS['replaceWordCtl']; @@ -48,6 +40,15 @@ public function transRes($ares, $i, $pattern = null) $mail = $replaceWordCtl->replace('mail', $this->thread, $ares, $i); $date_id = $replaceWordCtl->replace('date', $this->thread, $ares, $i); $msg = $replaceWordCtl->replace('msg', $this->thread, $ares, $i); + } else { + list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($ares); + } + + if (($id = $this->thread->ids[$i]) !== null) { + $idstr = 'ID:' . $id; + $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $date_id); + } else { + $idstr = null; } $tores = ''; @@ -76,29 +77,6 @@ public function transRes($ares, $i, $pattern = null) $msg_class .= ' ActiveMona'; } - //============================================================= - // レスをポップアップ表示 - //============================================================= - if ($_conf['quote_res_view']) { - $quote_res_nums = $this->checkQuoteResNums($i, $name, $msg); - - foreach ($quote_res_nums as $rnv) { - if (!isset($this->_quote_res_nums_done[$rnv])) { - $this->_quote_res_nums_done[$rnv] = true; - if (isset($this->thread->datlines[$rnv-1])) { - if ($this->_matome) { - $qres_id = "t{$this->_matome}qr{$rnv}"; - } else { - $qres_id = "qr{$rnv}"; - } - $ds = $this->qRes($this->thread->datlines[$rnv-1], $rnv); - $onPopUp_at = " onmouseover=\"showResPopUp('{$qres_id}',event)\" onmouseout=\"hideResPopUp('{$qres_id}')\""; - $rpop .= "
    \n{$ds}
    \n"; - } - } - } - } - //============================================================= // まとめて出力 //============================================================= @@ -106,10 +84,14 @@ public function transRes($ares, $i, $pattern = null) $name = $this->transName($name); // 名前HTML変換 $msg = $this->transMsg($msg, $i); // メッセージHTML変換 - // BEプロファイルリンク変換 $date_id = $this->replaceBeId($date_id, $i); + // IDフィルタ + if ($_conf['flex_idpopup'] == 1 && $id && $this->thread->idcount[$id] > 1) { + $date_id = str_replace($idstr, $this->idFilter($idstr, $id), $date_id); + } + // HTMLポップアップ if ($_conf['iframe_popup']) { $date_id = preg_replace_callback("{((\?#*)|(Lv\.\d+))}", array($this, 'iframePopupCallback'), $date_id); From 24e8da597d5970f51cc92f46e5c632887ef9dd8b Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 23 Mar 2015 11:26:30 +0900 Subject: [PATCH 081/339] =?UTF-8?q?=E6=90=BA=E5=B8=AF=E5=90=91=E3=81=91IC2?= =?UTF-8?q?=E3=81=AEimg=E3=82=BF=E3=82=B0=E3=81=AB=E3=82=B5=E3=82=A4?= =?UTF-8?q?=E3=82=BA=E6=8C=87=E5=AE=9A=E3=82=92=E4=BB=98=E3=81=91=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThreadK.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/ShowThreadK.php b/lib/ShowThreadK.php index d346c3eb3..549c8517a 100644 --- a/lib/ShowThreadK.php +++ b/lib/ShowThreadK.php @@ -1093,7 +1093,7 @@ public function plugin_imageCache2($url, $purl, $str) } else { $prv_onload = ''; } - $img_str = ""; + $img_str = ""; } $inline_preview_done = true; } else { @@ -1137,7 +1137,7 @@ public function plugin_imageCache2($url, $purl, $str) // インラインプレビューが有効で、サムネイル表示制限数以内なら if ($this->thumbnailer->ini['General']['inline'] == 1 && $inline_preview_flag) { $rank_str = ($rank !== null) ? '&rank=' . $rank : ''; - $img_str = "img_memo_query}{$rank_str}\">"; + $img_str = "img_memo_query}{$rank_str}\" width=\"{$prvw_size[0]}\" height=\"{$prvw_size[1]}\">"; $inline_preview_done = true; } else { $img_url .= $this->img_memo_query; @@ -1288,7 +1288,7 @@ public function plugin_replaceImageUrl($url, $purl, $str) } else { $prv_onload = ''; } - $img_str = ""; + $img_str = ""; } $inline_preview_done = true; } else { @@ -1333,7 +1333,7 @@ public function plugin_replaceImageUrl($url, $purl, $str) // インラインプレビューが有効で、サムネイル表示制限数以内なら if ($this->thumbnailer->ini['General']['inline'] == 1 && $inline_preview_flag) { $rank_str = ($rank !== null) ? '&rank=' . $rank : ''; - $img_str = "img_memo_query}{$rank_str}{$ref_en}\">"; + $img_str = "img_memo_query}{$rank_str}{$ref_en}\" width=\"{$prvw_size[0]}\" height=\"{$prvw_size[1]}\">"; $inline_preview_done = true; } else { $img_url .= $this->img_memo_query; From 4163e37eda6b37ddaf743659293b700f48bbe346 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 23 Mar 2015 23:41:17 +0900 Subject: [PATCH 082/339] =?UTF-8?q?lib/ThreadRead.php=E3=82=92=E3=81=84?= =?UTF-8?q?=E3=82=8D=E3=81=84=E3=82=8D=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 246 +++++++++++++++++++++++---------------------- 1 file changed, 125 insertions(+), 121 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 485886280..7cf16338a 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -28,7 +28,7 @@ class ThreadRead extends Thread { // }}} // {{{ constructor - + /** * コンストラクタ */ @@ -36,16 +36,16 @@ public function __construct() { parent::__construct (); $this->getdat_error_msg_ht = ""; } - + // }}} // {{{ downloadDat() - + /** * DATをダウンロードする */ public function downloadDat() { global $_conf; - + // まちBBS if (P2Util::isHostMachiBbs ( $this->host )) { return DownloadDatMachiBbs::invoke ( $this ); @@ -55,12 +55,12 @@ public function downloadDat() { include P2_LIB_DIR . '/read_shitaraba.inc.php'; } return shitarabaDownload ( $this ); - + // 2ch系 } else { $this->getDatBytesFromLocalDat (); // $aThread->length をset $pinktest = "/\w+\.bbspink.com/"; - + // 2ch bbspink●読み if (P2Util::isHost2chs ( $this->host ) && ! empty ( $_GET ['maru'] )) { // ログインしてなければ or ログイン後、24時間以上経過していたら自動再ログイン @@ -74,17 +74,17 @@ public function downloadDat() { return false; } } - + include $_conf ['sid2ch_php']; return $this->_downloadDat2chMaru ( $uaMona, $SID2ch ); - + // 2ch bbspink モリタポ読み } elseif (P2Util::isHost2chs ( $this->host ) && ! empty ( $_GET ['moritapodat'] ) && $_conf ['p2_2ch_mail'] && $_conf ['p2_2ch_pass']) { if (! array_key_exists ( 'csrfid', $_GET ) || $this->_getCsrfIdForMoritapoDat () != $_GET ['csrfid']) { p2die ( '不正なリクエストです' ); } return $this->_downloadDat2chMoritapo (); - + // 2chの過去ログ倉庫読み } elseif (! empty ( $_GET ['kakolog'] ) && ! empty ( $_GET ['kakoget'] )) { if ($_GET ['kakoget'] == 1) { @@ -93,13 +93,13 @@ public function downloadDat() { $ext = '.dat'; } return $this->_downloadDat2chKako ( $_GET ['kakolog'], $ext ); - + // 2ch or 2ch互換 } elseif (P2Util::isHost2chs ( $this->host ) && ! empty ( $_GET ['shirokuma'] )) { - return $this->_downloadDat2chMaru ( $uaMona, $SID2ch, 'shirokuma' ); + return $this->_downloadDat2chMaru ( $uaMona, $SID2ch, true); // 2ch はAPI経由で落とす } elseif (P2Util::isHost2chs ( $this->host ) && $_conf ['2chapi_use'] == 1 && empty ( $_GET ['olddat'] )) { - + // ログインしてなければ or ログイン後、設定した時間経過していたら自動再ログイン if (! file_exists ( $_conf ['sid2chapi_php'] ) || ! empty ( $_REQUEST ['relogin2chapi'] ) || (filemtime ( $_conf ['sid2chapi_php'] ) < time () - 60 * 60 * $_conf ['2chapi_interval'])) { if (! function_exists ( 'authenticate_2chapi' )) { @@ -111,7 +111,7 @@ public function downloadDat() { return false; } } - + include $_conf ['sid2chapi_php']; return $this->_downloadDat2chAPI ( $SID2chAPI, $this->length ); } else { @@ -121,10 +121,10 @@ public function downloadDat() { } } } - + // }}} // {{{ _downloadDat2chAPI() - + /** * 2chAPIで DAT を差分ダウンロードする * @@ -133,89 +133,89 @@ public function downloadDat() { protected function _downloadDat2chAPI($sid, $from_bytes) { global $_conf; global $debug; - + $AppKey = $_conf ['2chapi_appkey']; $AppName = $_conf ['2chapi_appname']; $HMKey = $_conf ['2chapi_hmkey']; $ReadUA = sprintf($_conf['2chapi_ua.read'],$AppName); - + if (! ($this->host && $this->bbs && $this->key)) { return false; } - + // >>1プレビューの時は差分取得しなくて良いので常にtrue(新着無し)を返す if (is_readable ( $this->keydat ) && ! empty ( $_GET ['one'] )) { return true; } - + if ($sid == '') { return false; } - + $from_bytes = intval ( $from_bytes ); - + if ($from_bytes == 0) { $zero_read = true; } else { $zero_read = false; $from_bytes = $from_bytes - 1; } - + $serverName = explode ( '.', $this->host ); // $url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; // $url="http://news2.2ch.net/test/read.cgi?bbs=newsplus&key=1038486598"; $url = 'https://api.2ch.net/v1/' . $serverName [0] . '/' . $this->bbs . '/' . $this->key; $message = '/v1/' . $serverName [0] . '/' . $this->bbs . '/' . $this->key . $sid . $AppKey; $HB = hash_hmac ( "sha256", $message, $HMKey ); - + $headers = "User-Agent: ${ReadUA}\r\n"; $headers .= "Connection: close\r\n"; $headers .= "Content-Type: application/x-www-form-urlencoded\r\n"; - + $purl = parse_url ( $url ); // URL分解 - + if (! empty ( $_GET ['one'] )) { // >>1プレビューの時はサーバーに最初の部分だけ請求 $headers .= "Range: bytes=0-8192\r\n"; } elseif (! $zero_read) { $headers .= "Range: bytes={$from_bytes}-\r\n"; } - + if ($this->modified) { $headers .= "If-Modified-Since: {$this->modified}\r\n"; } - + // Basic認証用のヘッダ if (isset ( $purl ['user'] ) && isset ( $purl ['pass'] )) { $headers .= "Authorization: Basic " . base64_encode ( $purl ['user'] . ":" . $purl ['pass'] ) . "\r\n"; } - + $post_values = array ( 'sid' => $sid, 'hobo' => $HB, - 'appkey' => $AppKey + 'appkey' => $AppKey ); - + $options ['http'] = array ( 'method' => 'POST', 'header' => $headers, 'ignore_errors' => true, - 'content' => http_build_query ( $post_values ) + 'content' => http_build_query ( $post_values ) ); - + // プロキシ if ($_conf ['proxy_use']) { $options ['http'] += array ( - 'proxy' => 'tcp://' . $_conf ['proxy_host'] . ":" . $_conf ['proxy_port'] + 'proxy' => 'tcp://' . $_conf ['proxy_host'] . ":" . $_conf ['proxy_port'] ); $options ['http'] += array ( - 'request_fulluri' => true + 'request_fulluri' => true ); $options ['ssl'] = array ( - 'SNI_enabled' => false + 'SNI_enabled' => false ); } - + // WEBサーバへ接続 $fp = @fopen ( $url, 'r', false, stream_context_create ( $options ) ); if (! $fp) { @@ -224,14 +224,14 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { return false; } stream_set_timeout ( $fp, $_conf ['http_read_timeout'], 0 ); - + $code = null; $meta = stream_get_meta_data ( $fp ); foreach ( $meta ['wrapper_data'] as $l ) { // ex) HTTP/1.1 304 Not Modified if (preg_match ( '@^HTTP/1\\.\\d (\\d+) (.+)@i', $l, $matches )) { $code = $matches [1]; - + if ($code == '200' || $code == '206') { // Partial Content ; } elseif ($code == '302') { // Found @@ -261,28 +261,28 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { return $this->_downloadDat2chNotFound ( $code ); } } - + if ($zero_read) { if (preg_match ( '/^Content-Length: ([0-9]+)/i', $l, $matches )) { $this->onbytes = intval ( $matches [1] ); } } else { - + if (preg_match ( '@^Content-Range: bytes ([^/]+)/([0-9]+)@i', $l, $matches )) { $this->onbytes = intval ( $matches [2] ); } } - + if (preg_match ( '/^Last-Modified: (.+)/i', $l, $matches )) { // echo $matches[1] . '
    '; //debug $this->modified = $matches [1]; } } - + $body = ''; - + if ($code == '200' || $code == '206') { - + while ( ! p2_stream_eof ( $fp, $timed_out ) ) { // >>1をプレビューする用 if (! empty ( $_GET ['one'] )) { @@ -295,7 +295,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { $body .= fread ( $fp, 4096 ); // 通常取得はあぼーん判定を行うためこっちで保存する } } - + if ($timed_out) { self::_pushInfoReadTimedOut ( $url ); $this->diedat = true; @@ -325,8 +325,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { } elseif (strpos ( $firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2" ) === 0) { fclose ( $fp ); $this->getdat_error_msg_ht .= "

    rep2 error: API経由でのスレッド取得に失敗しました。
    rep2 info: スレッドが存在しないか過去ログに格納されています。

    "; - $marutori_ht = " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&maru=true{$_conf['k_at_a']}\">●IDでrep2に取り込む]"; - $marutori_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&shirokuma=true{$_conf['k_at_a']}\">offlaw経由でrep2に取り込む]"; + $marutori_ht = $this->_generateMarutoriLink(); $plugin_ht = $this->_generateWikiDatLink (); $moritori_ht = $this->_generateMoritapoDatLink (); $this->getdat_error_msg_ht .= "{$marutori_ht}{$moritori_ht}{$plugin_ht}"; @@ -334,7 +333,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { return false; } unset ( $firstmsg ); - + // 末尾の改行であぼーんチェック if (! $zero_read) { if (substr ( $body, 0, 1 ) != "\n") { @@ -346,13 +345,13 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { } $body = substr ( $body, 1 ); } - + $file_append = ($zero_read) ? 0 : FILE_APPEND; - + if (FileCtl::file_write_contents ( $this->keydat, $body, $file_append ) === false) { p2die ( 'cannot write file.' ); } - + // $GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("dat_size_check"); // 取得後サイズチェック if ($zero_read == false && $this->onbytes) { @@ -364,7 +363,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { P2Util::pushInfoHtml ( "

    rep2 info: {$this->onbytes}/{$this->length} ファイルサイズが変なので、datを再取得

    " ); // $GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("dat_size_check"); return $this->_downloadDat2chAPI ( $sid, 0 ); // datサイズは不正。全部取り直し。 - + // サイズが同じならそのまま } elseif ($this->onbytes == $this->length) { fclose ( $fp ); @@ -378,7 +377,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { fclose ( $fp ); return $this->_downloadDat2chNotFound ( $code ); } - + fclose ( $fp ); if ($timed_out) { self::_pushInfoReadTimedOut ( $url ); @@ -402,20 +401,20 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { function _freadHttpHeader($fp) { $h = array(); - + while (!feof($fp)) { $l = fgets($fp, 8192); - + // ex) HTTP/1.1 304 Not Modified if (preg_match("|HTTP/1\.\d (\d+) (.+)\r\n|", $l, $matches)) { $h['code'] = $matches[1]; $h['message'] = $matches[2]; $h['HTTP'] = rtrim($l); } - + if (preg_match('/^(.+?): (.+)\r\n/', $l, $matches)) { $h['headers'][$matches[1]] = $matches[2]; - + } elseif ($l == "\r\n") { if (!isset($h['code'])) { return false; @@ -423,7 +422,7 @@ function _freadHttpHeader($fp) return $h; } } - + return false; } // }}} @@ -436,7 +435,7 @@ function _freadHttpHeader($fp) */ function _pushInfoHtmlFreadHttpHeaderError($url) { - P2Util::pushInfoHtml(sprintf('

    p2 info: %s からヘッダレスポンスを取得できませんでした。

    ',$url)); + P2Util::pushInfoHtml(sprintf('

    p2 info: %s からヘッダレスポンスを取得できませんでした。

    ',self::_urlToAnchor($url))); } // }}} // {{{ _getOnbytesFromHeader() @@ -456,7 +455,7 @@ function _getOnbytesFromHeader($headers, $zero_read = true) return $onbytes = $matches[1]; } } - + } else { if (isset($headers['Content-Range'])) { if (preg_match("/^bytes ([^\/]+)\/([0-9]+)/", $headers['Content-Range'], $matches)) { @@ -464,7 +463,7 @@ function _getOnbytesFromHeader($headers, $zero_read = true) } } } - + return false; } // }}} @@ -567,7 +566,7 @@ protected function _downloadDat2ch($from_bytes) fputs($fp, $request); $code = null; - + // HTTPヘッダレスポンスを取得する $h = $this->_freadHttpHeader($fp); if ($h === false) { @@ -577,12 +576,12 @@ protected function _downloadDat2ch($from_bytes) return false; } $code = $h['code']; - + if ($code == '200' || $code == '206') { // Partial Content ; - + } elseif ($code == '302') { // Found - + // ホストの移転を追跡 $new_host = BbsMap::getCurrentHost($this->host, $this->bbs); if ($new_host != $this->host) { @@ -594,37 +593,37 @@ protected function _downloadDat2ch($from_bytes) fclose($fp); return $this->_downloadDat2chNotFound($code); } - + } elseif ($code == '304') { // Not Modified fclose($fp); $this->isonline = true; return '304 Not Modified'; - + } elseif ($code == '416') { // Requested Range Not Satisfiable //echo "あぼーん検出"; fclose($fp); $this->onbytes = 0; $this->modified = null; return $this->_downloadDat2ch(0); // あぼーん検出。全部取り直し。 - + } else { fclose($fp); return $this->_downloadDat2chNotFound($code); } - + $r = $this->_getOnbytesFromHeader($h['headers'], $zero_read); if ($r !== false) { $this->onbytes = $r; } - + if (isset($h['headers']['Last-Modified'])) { $this->modified = $h['headers']['Last-Modified']; } - + // bodyを読む $body = ''; if ($code == '200' || $code == '206') { - + while (!p2_stream_eof($fp, $timed_out)) { //>>1をプレビューする用 if (!empty($_GET['one'])) { @@ -637,14 +636,14 @@ protected function _downloadDat2ch($from_bytes) $body .= fread($fp, 4096); //通常取得はあぼーん判定を行うためこっちで保存する } } - + if ($timed_out) { self::_pushInfoReadTimedOut($url); $this->diedat = true; fclose($fp); return false; } - + //ホストが2chの時にDATを利用できない旨のメッセージが出たらエラーとする(DAT破損対策) if (P2Util::isHost2chs($this->host)) { @@ -657,7 +656,7 @@ protected function _downloadDat2ch($from_bytes) } unset($firstmsg); } - + // 末尾の改行であぼーんチェック if (!$zero_read) { if (substr($body, 0, 1) != "\n") { @@ -669,13 +668,13 @@ protected function _downloadDat2ch($from_bytes) } $body = substr($body, 1); } - + $file_append = ($zero_read) ? 0 : FILE_APPEND; - + if (FileCtl::file_write_contents($this->keydat, $body, $file_append) === false) { p2die('cannot write file.'); } - + //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("dat_size_check"); // 取得後サイズチェック if ($zero_read == false && $this->onbytes) { @@ -687,7 +686,7 @@ protected function _downloadDat2ch($from_bytes) P2Util::pushInfoHtml("

    rep2 info: {$this->onbytes}/{$this->length} ファイルサイズが変なので、datを再取得

    "); //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("dat_size_check"); return $this->_downloadDat2ch(0); //datサイズは不正。全部取り直し。 - + // サイズが同じならそのまま } elseif ($this->onbytes == $this->length) { fclose($fp); @@ -739,11 +738,11 @@ protected function _downloadDat2chNotFound($code = null) * * @param string $uaMona * @param string $SID2ch - * @param string $shirokuma + * @param bool $shirokuma trueならofflaw2で取得 * @return bool * @see lib/login2ch.inc.php */ - protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma) + protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma = false) { global $_conf; @@ -816,7 +815,7 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma) $chunked = false; $is_gzip = false; $start_here = false; - + // HTTPヘッダレスポンスを取得する $h = $this->_freadHttpHeader($fp); if ($h === false) { @@ -825,11 +824,11 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma) $this->diedat = true; return false; } - + // {{{ HTTPコードをチェック - + $code = $h['code']; - + if ($code == '200') { ; } elseif ($code == '304') { @@ -840,7 +839,7 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma) fclose($fp); return $this->_downloadDat2chMaruNotFound(); } - + if (isset($h['headers']['Content-Encoding'])) { if (preg_match("/^(x-)?gzip/", $h['headers']['Content-Encoding'], $matches)) { $isGzip = true; @@ -861,18 +860,18 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma) } if ($code == '200') { - + while (!p2_stream_eof($fp, $timed_out)) { $body .= fread($fp, 4096); } - + if ($timed_out) { self::_pushInfoReadTimedOut($url); //$this->diedat = true; fclose($fp); return false; } - + // gzip圧縮なら if ($is_gzip) { $body = self::_decodeGzip($body, $url); @@ -882,11 +881,11 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma) return false; } } - + if (FileCtl::file_write_contents($this->keydat, $body) === false) { p2die('cannot write file. downloadDat2chMaru()'); } - + // クリーニング ===== if ($marudatlines = FileCtl::file_read_lines($this->keydat)) { if (!$shirokuma) { @@ -909,13 +908,13 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma) p2die('cannot write file. downloadDat2chMaru()'); } } - + } else { // dat.gzはなかったと判断 fclose($fp); return $this->_downloadDat2chMaruNotFound(); } - + fclose($fp); //$this->isonline = true; //$this->datochiok = 1; @@ -933,12 +932,11 @@ protected function _downloadDat2chMaruNotFound() global $_conf; // 再チャレンジがまだなら、再チャレンジする。SIDが変更されてしまっている場合がある時のための自動チャレンジ。 - if (empty($_REQUEST['relogin2ch'])) { + if (empty($_REQUEST['relogin2ch']) && empty($_REQUEST['shirokuma'])) { $_REQUEST['relogin2ch'] = true; return $this->downloadDat(); } else { - $remarutori_ht = " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&maru=true&relogin2ch=true{$_conf['k_at_a']}\">再取得を試みる]"; - $remarutori_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&shirokuma=true{$_conf['k_at_a']}\">offlaw経由でrep2に取り込む]"; + $remarutori_ht = $this->_generateMarutoriLink(true); $moritori_ht = $this->_generateMoritapoDatLink(); $this->getdat_error_msg_ht .= "

    rep2 info: ●IDでのスレッド取得に失敗しました。{$remarutori_ht}{$moritori_ht}

    "; $this->diedat = true; @@ -1009,7 +1007,7 @@ protected function _downloadDat2chKako($uri, $ext) $code = null; $is_gzip = false; $start_here = false; - + // HTTPヘッダレスポンスを取得する $h = $this->_freadHttpHeader($fp); if ($h === false) { @@ -1018,11 +1016,11 @@ protected function _downloadDat2chKako($uri, $ext) $this->diedat = true; return false; } - + // {{{ HTTPコードをチェック - + $code = $h['code']; - + if ($code == '200') { ; } elseif ($code == '304') { @@ -1033,7 +1031,7 @@ protected function _downloadDat2chKako($uri, $ext) fclose($fp); return $this->_downloadDat2chMaruNotFound(); } - + if (isset($h['headers']['Content-Encoding'])) { if (preg_match("/^(x-)?gzip/", $h['headers']['Content-Encoding'], $matches)) { $isGzip = true; @@ -1041,18 +1039,18 @@ protected function _downloadDat2chKako($uri, $ext) } if ($code == '200') { - + while (!p2_stream_eof($fp, $timed_out)) { $body .= fread($fp, 4096); } - + if ($timed_out) { self::_pushInfoReadTimedOut($url); $this->diedat = true; fclose($fp); return false; } - + if ($is_gzip) { $body = self::_decodeGzip($body, $url); if ($body === null) { @@ -1061,7 +1059,7 @@ protected function _downloadDat2chKako($uri, $ext) return false; } } - + if (FileCtl::file_write_contents($this->keydat, $body) === false) { p2die('cannot write file. downloadDat2chKako()'); } @@ -1190,19 +1188,7 @@ public function get2chDatError($code = null) // if ($reason === 'datochi' || preg_match($kakosoko_match, $read_response_html, $matches) || preg_match($kakosoko_match2, $read_response_html, $matches)) { $dat_response_status = "このスレッドは過去ログ倉庫に格納されています。"; - //if (file_exists($_conf['idpw2ch_php']) || file_exists($_conf['sid2ch_php'])) { - //if ( preg_match($kakosoko_match2, $read_response_html, $matches)) { - $marutori_ht = " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&maru=true{$_conf['k_at_a']}\">●IDでrep2に取り込む]"; - //$kakolog_url_en = rawurlencode("http://{$this->host}/{$this->bbs}/kako/".substr($this->key, 0, 4)."/".substr($this->key, 0, 5)."/{$this->key}"); - //$read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; - //$marutori_ht .= "

    2ch info - 隊長! 過去ログ倉庫で、スレッド {$matches[3]}.html を発見しました。 [rep2に取り込んで読む]

    "; - //} else { - $marutori_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&shirokuma=true{$_conf['k_at_a']}\">offlaw経由でrep2に取り込む]"; - //} - //} else { - // $marutori_ht = " [●IDログイン]"; - //} - + $marutori_ht = $this->_generateMarutoriLink(); $plugin_ht = $this->_generateWikiDatLink(); $moritori_ht = $this->_generateMoritapoDatLink(); $dat_response_msg = "

    2ch info - このスレッドは過去ログ倉庫に格納されています。{$marutori_ht}{$moritori_ht}{$plugin_ht}

    "; @@ -1224,7 +1210,7 @@ public function get2chDatError($code = null) } elseif (preg_match($waithtml_match, $read_response_html, $matches)) { $dat_response_status = "隊長! スレッドはhtml化されるのを待っているようです。"; - $marutori_ht = " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&maru=true{$_conf['k_at_a']}\">●IDでrep2に取り込む]"; + $marutori_ht = $this->_generateMarutoriLink(); $moritori_ht = $this->_generateMoritapoDatLink(); $dat_response_msg = "

    2ch info - 隊長! スレッドはhtml化されるのを待っているようです。{$marutori_ht}{$moritori_ht}

    "; @@ -1757,7 +1743,7 @@ protected function _downloadDat2chMoritapoNotFound() $ls_ht = p2h($this->ls); $query_ht = p2h("host={$host_en}&bbs={$bbs_en}&key={$key_en}&ls={$ls_en}&maru=true"); - $marutori_ht = " [●IDでrep2に取り込む]"; + $marutori_ht = $this->_generateMarutoriLink(); if ($hosts = $this->scanOriginalHosts()) { $hostlist_ht = '
    datから他のホスト候補を検出しました。'; @@ -2087,7 +2073,25 @@ protected function _generateWikiDatLink() } // }}} - + // {{{ _generateMarutoriHtml() + /** + * ●とofflawでdatを取得するためのリンクを生成する。 + * + * @param bool $retry + * @return string HTML + */ + protected function _generateMarutoriLink($retry = false) { + if($retry) { + $retry_q = "&relogin2ch=true"; + $atext = "●IDで再取得する"; + } else { + $atext = "●IDでrep2に取り込む"; + } + $marutori_ht = " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&maru=true{$retry_q}{$_conf['k_at_a']}\">{$atext}]"; + $marutori_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&shirokuma=true{$_conf['k_at_a']}\">offlaw経由でrep2に取り込む]"; + return $marutori_ht; + } + // }}} } // }}} From a0e218cb7cce49122b56f7dda34ec6455a290deb Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 24 Mar 2015 22:31:23 +0900 Subject: [PATCH 083/339] =?UTF-8?q?dig2ch.php=E3=81=8C=E3=83=97=E3=83=AD?= =?UTF-8?q?=E3=82=AD=E3=82=B7=E8=A8=AD=E5=AE=9A(proxy=5Fuse)=E3=81=AB?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=E3=81=97=E3=81=A6=E3=81=84=E3=81=AA=E3=81=84?= =?UTF-8?q?=E4=B8=8D=E5=85=B7=E5=90=88=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/dig2ch.php | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php index 6eb8e04f9..25bc445f1 100644 --- a/rep2/dig2ch.php +++ b/rep2/dig2ch.php @@ -9,21 +9,35 @@ function dig2chsearch($query) //$query_q = preg_replace('/(\s+)/' , '\+' ,$query_arry['q']); $query_arry['q'] = urlencode($query_arry['q']); - $client = new HTTP_Client(); - $client->setDefaultHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.4; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko'); - $code = $client->get($_conf['test.dig2ch_url'] . '?AndOr=' . $query_arry['AndOr'] . '&maxResult=' . $query_arry['maxResult'] . '&atLeast=1&Sort=' . $query_arry['Sort'] . '&Link=1&Bbs=all&924=' . $query_arry['924'] . '&json=1&keywords=' . $query_arry['q']); - if (PEAR::isError($code)) { - p2die($code->getMessage()); - } elseif ($code != 200) { - p2die("HTTP Error - {$code}"); + $url = $_conf['test.dig2ch_url'] . '?AndOr=' . $query_arry['AndOr'] . '&maxResult=' . $query_arry['maxResult'] . '&atLeast=1&Sort=' . $query_arry['Sort'] . '&Link=1&Bbs=all&924=' . $query_arry['924'] . '&json=1&keywords=' . $query_arry['q']; + $params = array(); + $params['timeout'] = $_conf['http_conn_timeout']; + $params['readTimeout'] = array($_conf['http_read_timeout'], 0); + if ($_conf['proxy_use']) { + $params['proxy_host'] = $_conf['proxy_host']; + $params['proxy_port'] = $_conf['proxy_port']; } - $response = $client->currentResponse(); - $body = $response['body']; + $req = new HTTP_Request($url, $params); + $req->addHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.4; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko'); + + $response = $req->sendRequest(); + + if (PEAR::isError($response)) { + p2die($response->getMessage()); + } else { + $code = $req->getResponseCode(); + if ($code != 200) { + p2die("HTTP Error - {$code}"); + } + } + + $body = $req->getResponseBody(); + // 先方の鯖で何か障害が発生したらJSONにHTMLのコメントが混ざるのでその対策 if (strpos($body,"/", "", $body); + $body = preg_replace("/<\!--.*?-->/", "", $body); } $jsontest1 = json_decode($body, true); From a7483eac6a39d9e5649d78442abe2ea9ca6a2420 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 24 Mar 2015 22:56:45 +0900 Subject: [PATCH 084/339] =?UTF-8?q?dig2ch=E3=81=A7=E3=81=A7=E3=80=8C?= =?UTF-8?q?=E6=9D=BF=E3=81=A7=E7=B5=9E=E3=82=8A=E8=BE=BC=E3=82=80=E3=80=8D?= =?UTF-8?q?=E3=81=AB=E5=AF=BE=E5=BF=9C=E3=81=97=E3=81=9F=20http://anago.2c?= =?UTF-8?q?h.net/test/read.cgi/software/1426940268/98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/dig2ch.php | 228 ++++++++++++++++++++++++++---------------------- 1 file changed, 123 insertions(+), 105 deletions(-) diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php index 25bc445f1..38c55a10f 100644 --- a/rep2/dig2ch.php +++ b/rep2/dig2ch.php @@ -1,105 +1,123 @@ -addHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.4; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko'); - - $response = $req->sendRequest(); - - if (PEAR::isError($response)) { - p2die($response->getMessage()); - } else { - $code = $req->getResponseCode(); - if ($code != 200) { - p2die("HTTP Error - {$code}"); - } - } - - $body = $req->getResponseBody(); - - // 先方の鯖で何か障害が発生したらJSONにHTMLのコメントが混ざるのでその対策 - if (strpos($body,"/", "", $body); - } - - $jsontest1 = json_decode($body, true); - unset($body); - - //mb_convert_variables('SHIFT-JIS','UTF-8',$jsontest1); - - if ($jsontest1 === NULL) { - - $jsonerror = ""; - switch (json_last_error()) { - case JSON_ERROR_NONE: - $jsonerror = ' - No errors'; - break; - case JSON_ERROR_DEPTH: - $jsonerror = ' - Maximum stack depth exceeded'; - break; - case JSON_ERROR_STATE_MISMATCH: - $jsonerror = ' - Underflow or the modes mismatch'; - break; - case JSON_ERROR_CTRL_CHAR: - $jsonerror = ' - Unexpected control character found'; - break; - case JSON_ERROR_SYNTAX: - $jsonerror = ' - Syntax error, malformed JSON'; - break; - case JSON_ERROR_UTF8: - $jsonerror = ' - Malformed UTF-8 characters, possibly incorrectly encoded'; - break; - default: - $jsonerror = ' - Unknown error'; - break; - } - p2die("検索結果の取得に失敗しました".$jsonerror); - } - - foreach ($jsontest1[result] as $jsontest2) { - $result['threads'][$n1] = new stdClass; - $result['threads'][$n1]->title = $jsontest2[subject]; - $result['threads'][$n1]->host = $jsontest2[server]; - $result['threads'][$n1]->bbs = $jsontest2[bbs]; - $result['threads'][$n1]->tkey = $jsontest2[key]; - $result['threads'][$n1]->resnum = $jsontest2[resno]; - $result['threads'][$n1]->ita = $jsontest2[ita]; - $result['threads'][$n1]->dayres = $jsontest2[ikioi]; - $n1++; - } - $result['modified'] = isset($response['body']['date'])? $response['body']['date'] : ''; - $result['profile']['regex'] = '/(' . $jsontest1[query] .')/i'; - $result['profile']['hits'] = $jsontest1[found]; - $result['profile']['cm0'] = str_replace("a href=" , "a target=\"_blank\" href=", $jsontest1[cm0]); - if (strstr($result['profile']['cm0'] , "rounin")) { $result['profile']['cm0'] = str_replace("src=\"" , "src=\"http://dig.2ch.net", $result['profile']['cm0']);} - $result['profile']['cm0'] = str_replace("
    " , "", $result['profile']['cm0']); - - $result['profile']['cm1'] = str_replace("a href=" , "a target=\"_blank\" href=", $jsontest1[cm1]); - if (strstr($result['profile']['cm1'] , "rounin")) { $result['profile']['cm1'] = str_replace("src=\"" , "src=\"http://dig.2ch.net", $result['profile']['cm1']);} - $result['profile']['cm1'] = str_replace("
    " , "", $result['profile']['cm1']); - - $result['profile']['cm2'] = str_replace("a href=" , "a target=\"_blank\" href=", $jsontest1[cm2]); - if (strstr($result['profile']['cm2'] , "rounin")) { $result['profile']['cm2'] = str_replace("src=\"" , "src=\"http://dig.2ch.net", $result['profile']['cm2']);} - $result['profile']['cm2'] = str_replace("
    " , "", $result['profile']['cm2']); - - return $result; -} - +addHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.4; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko'); + + $response = $req->sendRequest(); + + if (PEAR::isError($response)) { + p2die($response->getMessage()); + } else { + $code = $req->getResponseCode(); + if ($code != 200) { + p2die("HTTP Error - {$code}"); + } + } + + $body = $req->getResponseBody(); + + // 先方の鯖で何か障害が発生したらJSONにHTMLのコメントが混ざるのでその対策 + if (strpos($body,"/", "", $body); + } + + $jsontest1 = json_decode($body, true); + unset($body); + + //mb_convert_variables('SHIFT-JIS','UTF-8',$jsontest1); + + if ($jsontest1 === NULL) { + + $jsonerror = ""; + switch (json_last_error()) { + case JSON_ERROR_NONE: + $jsonerror = ' - No errors'; + break; + case JSON_ERROR_DEPTH: + $jsonerror = ' - Maximum stack depth exceeded'; + break; + case JSON_ERROR_STATE_MISMATCH: + $jsonerror = ' - Underflow or the modes mismatch'; + break; + case JSON_ERROR_CTRL_CHAR: + $jsonerror = ' - Unexpected control character found'; + break; + case JSON_ERROR_SYNTAX: + $jsonerror = ' - Syntax error, malformed JSON'; + break; + case JSON_ERROR_UTF8: + $jsonerror = ' - Malformed UTF-8 characters, possibly incorrectly encoded'; + break; + default: + $jsonerror = ' - Unknown error'; + break; + } + p2die("検索結果の取得に失敗しました".$jsonerror); + } + + $boards = array(); + $hits = array(); + $names = array(); + foreach ($jsontest1[result] as $jsontest2) { + $result['threads'][$n1] = new stdClass; + $result['threads'][$n1]->title = $jsontest2[subject]; + $result['threads'][$n1]->host = $jsontest2[server]; + $result['threads'][$n1]->bbs = $jsontest2[bbs]; + $result['threads'][$n1]->tkey = $jsontest2[key]; + $result['threads'][$n1]->resnum = $jsontest2[resno]; + $result['threads'][$n1]->ita = $jsontest2[ita]; + $result['threads'][$n1]->dayres = $jsontest2[ikioi]; + $n1++; + $bkey = md5($jsontest2['server'].'-'.$jsontest2['bbs'].'-'.$jsontest2['ita']); + if (! isset($boards[$bkey])) { + $board = new stdClass; + $board->host = $jsontest2['server']; + $board->bbs = $jsontest2['bbs']; + $names[$bkey] = $board->name = $jsontest2['ita']; + $hits[$bkey] = $board->hits = 1; + $boards[$bkey] = $board; + } else { + $hits[$bkey] = ++$boards[$bkey]->hits; + $names[$bkey] = $boards[$bkey]->name; + } + } + $result['modified'] = isset($response['body']['date'])? $response['body']['date'] : ''; + $result['profile']['regex'] = '/(' . $jsontest1[query] .')/i'; + $result['profile']['hits'] = $jsontest1[found]; + $result['profile']['cm0'] = str_replace("a href=" , "a target=\"_blank\" href=", $jsontest1[cm0]); + if (strstr($result['profile']['cm0'] , "rounin")) { $result['profile']['cm0'] = str_replace("src=\"" , "src=\"http://dig.2ch.net", $result['profile']['cm0']);} + $result['profile']['cm0'] = str_replace("
    " , "", $result['profile']['cm0']); + + $result['profile']['cm1'] = str_replace("a href=" , "a target=\"_blank\" href=", $jsontest1[cm1]); + if (strstr($result['profile']['cm1'] , "rounin")) { $result['profile']['cm1'] = str_replace("src=\"" , "src=\"http://dig.2ch.net", $result['profile']['cm1']);} + $result['profile']['cm1'] = str_replace("
    " , "", $result['profile']['cm1']); + + $result['profile']['cm2'] = str_replace("a href=" , "a target=\"_blank\" href=", $jsontest1[cm2]); + if (strstr($result['profile']['cm2'] , "rounin")) { $result['profile']['cm2'] = str_replace("src=\"" , "src=\"http://dig.2ch.net", $result['profile']['cm2']);} + $result['profile']['cm2'] = str_replace("
    " , "", $result['profile']['cm2']); + array_multisort($hits, SORT_DESC, $names, $boards); + $result['profile']['boards'] = $boards; + unset($boards,$hits,$names); + + return $result; +} + From b448cea8c2b9f0ad3c92fee8e3c409a9ce2964a9 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 25 Mar 2015 06:49:10 +0900 Subject: [PATCH 085/339] =?UTF-8?q?P2Util::fileDownload=E3=82=92HTTP=5FReq?= =?UTF-8?q?uest2=E3=81=AB=E3=81=97=E3=81=9F=20dig2ch=E3=82=92HTTP=5FReques?= =?UTF-8?q?t2=E3=81=AB=E3=81=97=E3=81=9F=20P2Util::getP2UA=E3=82=92?= =?UTF-8?q?=E5=AE=9F=E8=A3=85=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 2 + lib/BrdCtl.php | 8 +-- lib/DownloadDatMachiBbs.php | 7 +- lib/P2HttpExt.php | 4 +- lib/P2Util.php | 118 ++++++++++++++++++++++------------ lib/SettingTxt.php | 13 +--- lib/SubjectTxt.php | 12 +--- lib/expack/rss/parser.inc.php | 2 +- lib/login2ch.inc.php | 2 +- lib/post_form_options.inc.php | 2 +- lib/read_shitaraba.inc.php | 3 +- lib/setfav.inc.php | 2 +- rep2/dig2ch.php | 39 ++++++----- 13 files changed, 119 insertions(+), 95 deletions(-) diff --git a/composer.json b/composer.json index c9e7b7141..6dff89b60 100644 --- a/composer.json +++ b/composer.json @@ -24,8 +24,10 @@ "pear-pear.php.net/html_quickform": "3.2.13", "pear-pear.php.net/http_client": "1.2.1", "pear-pear.php.net/http_request": "1.4.4", + "pear-pear.php.net/http_request2": "2.2.1", "pear-pear.php.net/net_socket": "1.0.10", "pear-pear.php.net/net_url": "1.0.15", + "pear-pear.php.net/net_url2": "2.1.1", "pear-pear.php.net/net_useragent_mobile": "1.0.0", "pear-pear.php.net/validate": "0.8.5", "pear-pear.php.net/var_dump": "1.0.4", diff --git a/lib/BrdCtl.php b/lib/BrdCtl.php index b73482b4b..6080c47b5 100644 --- a/lib/BrdCtl.php +++ b/lib/BrdCtl.php @@ -86,15 +86,13 @@ static public function read_brd_online() } } - // DLしない - if ($noDL) { - ; // DLする - } else { + if (!$noDL) { //echo "DL!
    ";// $brdfile_online_res = P2Util::fileDownload($_conf['brdfile_online'], $cachefile); - if ($brdfile_online_res->isSuccess() && $brdfile_online_res->code != 304) { + if (isset($brdfile_online_res) && $brdfile_online_res->getStatus() != 304) { $isNewDL = true; + unset($brdfile_online_res); } } diff --git a/lib/DownloadDatMachiBbs.php b/lib/DownloadDatMachiBbs.php index 7a8566356..f39357f80 100644 --- a/lib/DownloadDatMachiBbs.php +++ b/lib/DownloadDatMachiBbs.php @@ -64,12 +64,11 @@ static public function invoke(ThreadRead $thread) } $response = P2Util::fileDownload($url, $tempfile); - if ($response->isError()) { - if (304 != $response->code) { - $thread->diedat = true; - } + if (empty($response)) { + $thread->diedat = true; return false; } + unset($response); // }}} // {{{ ダウンロードした各行をチェックしつつローカルdatに書き込み diff --git a/lib/P2HttpExt.php b/lib/P2HttpExt.php index ce35a77d6..1ac35f065 100644 --- a/lib/P2HttpExt.php +++ b/lib/P2HttpExt.php @@ -246,7 +246,9 @@ public function __construct($url, } if (!isset($options['useragent'])) { - $options['useragent'] = "Monazilla/1.00 ({$_conf['p2ua']})"; + $purl = parse_url($url); // URL分解 + $options['useragent'] = P2Util::getP2UA(true,P2Util::isHost2chs($purl['host'])); + unset($purl); } if ($_conf['proxy_use'] && !isset($options['proxyhost']) && !empty($_conf['proxy_host'])) { diff --git a/lib/P2Util.php b/lib/P2Util.php index adda081ba..1f2cf44ac 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -261,48 +261,58 @@ static public function fileDownload($url, $localfile, $modified = false; } - // DL - $wap_ua = new WapUserAgent(); - $wap_ua->setTimeout($_conf['http_conn_timeout'], $_conf['http_read_timeout']); - $wap_ua->setAtFsockopen(true); - $wap_req = new WapRequest(); - $wap_req->setUrl($url); - $wap_req->setModified($modified); - if ($_conf['proxy_use']) { - $wap_req->setProxy($_conf['proxy_host'], $_conf['proxy_port']); - } - $wap_res = $wap_ua->request($wap_req); - - // 1段階だけリダイレクトを追跡 - if ($wap_res->isRedirect() && array_key_exists('Location', $wap_res->headers) && - ($trace_redirection === true || $trace_redirection == $wap_res->code)) - { - $wap_req->setUrl($wap_res->headers['Location']); - $wap_res = $wap_ua->request($wap_req); - } - - // エラーメッセージを設定 - if ($wap_res->isError() && $disp_error) { - $url_t = self::throughIme($wap_req->url); - $info_msg_ht = "

    Error: {$wap_res->code} {$wap_res->message}
    "; - if ($wap_res->isRedirect() && array_key_exists('Location', $wap_res->headers)) { - $location = $wap_res->headers['Location']; - $location_ht = p2h($location); - $location_t = self::throughIme($location); - $info_msg_ht .= "Location: {$location_ht}
    "; + try { + // DL + $req = new HTTP_Request2($url, HTTP_Request2::METHOD_GET); + $purl = parse_url($url); // URL分解 + $req->setHeader('User-Agent', self::getP2UA(true,self::isHost2chs($purl['host']))); + unset($purl); + + $req->setConfig(array( + 'connect_timeout' => $_conf['http_conn_timeout'], + 'timeout' => $_conf['http_read_timeout'], + 'follow_redirects' => $trace_redirection, + )); + + if ($_conf['proxy_use']) { + $req->setConfig(array( + ‘proxy_host’ => $_conf['proxy_host'], + ‘proxy_port’ => $_conf['proxy_port'], + )); + } + + $response = $req->send(); + + $code = $response->getStatus(); + if (!($code == 200 || $code == 206 || $code == 304)) { + $error_msg = $code; + } + $body = $response->getBody(); + + } catch (Exception $e) { + $error_msg = $e->getMessage(); + } + + // エラーが出たらnullを返して終わり + if (isset($error_msg) && strlen($error_msg) > 0) { + // エラーメッセージを設定 + if ($disp_error) { + $url_t = P2Util::throughIme($url); + $info_msg_ht = "

    Error: {$error_msg}
    "; + $info_msg_ht .= "rep2 info: {$url} に接続できませんでした。

    "; + P2Util::pushInfoHtml($info_msg_ht); } - $info_msg_ht .= "rep2 info: {$wap_req->url} に接続できませんでした。

    "; - self::pushInfoHtml($info_msg_ht); + return null; } - // 更新されていたら - if ($wap_res->isSuccess() && $wap_res->code != 304) { - if (FileCtl::file_write_contents($localfile, $wap_res->content) === false) { + // 更新されていたら保存 + if ($code != 304) { + if (FileCtl::file_write_contents($localfile, $body) === false) { p2die('cannot write file.'); } } - return $wap_res; + return $response; } // }}} @@ -2120,16 +2130,44 @@ static public function rawurlencodeCallback(array $m) } // }}} - // {{{ + // {{{ getP2UA() + /** + * p2又はAPIのUAを返す + * @param bool $withMonazilla trueならMonazilla/1.00を付ける + * @param bool $apiUA trueで尚且つAPIが利用可能なときにAPIのUAを返す + * @return string + */ + static public function getP2UA($withMonazilla = true,$apiUA = false) + { + global $_conf; + + // APIを使用する設定の場合はAPIのUAを返す + if ($apiUA && $_conf['2chapi_use'] == 1) { + if ($_conf['2chapi_appname'] != "") { + $p2ua = $_conf['2chapi_appname']; + } else { + p2die("2chと通信するために必要な情報が設定されていません。"); + } + + } else { + $p2ua = $_conf['p2ua']; + } + + if ($withMonazilla) { + $p2ua = 'Monazilla/1.00' . ' (' . $p2ua . ')'; + } + return $p2ua; + } + // {{{ isEnableBe2ch() /** * beが使用可能な設定か調べる * @access public * @return boolean */ - function isEnableBe2ch() + static public function isEnableBe2ch() { global $_conf; - + if ( strlen($_conf['be_2ch_password']) && $_conf['be_2ch_mail'] || strlen($_conf['be_2ch_DMDM']) && $_conf['be_2ch_MDMD'] @@ -2149,7 +2187,7 @@ function isEnableBe2ch() * @access public * @return array|false|null 認証コード配列|認証できなかった|無設定だった */ - function getBe2chCodeWithUserConf() + static public function getBe2chCodeWithUserConf() { global $_conf; @@ -2172,7 +2210,7 @@ function getBe2chCodeWithUserConf() * @access private * @return array|string 成功|エラーメッセージ */ - function getBe2chCodeByMailPass($mail, $pass) + static public function getBe2chCodeByMailPass($mail, $pass) { global $_conf; diff --git a/lib/SettingTxt.php b/lib/SettingTxt.php index 875660b2d..e261753c7 100644 --- a/lib/SettingTxt.php +++ b/lib/SettingTxt.php @@ -104,18 +104,7 @@ public function downloadSettingTxt() $req = new HTTP_Request($this->_url, $params); $modified && $req->addHeader('If-Modified-Since', $modified); - // APIを使用する設定で相手が2chだったらAPIのUAを送る - if(P2Util::isHost2chs($this->_host) && $_conf['2chapi_use'] == 1) { - if($_conf['2chapi_appname'] != "") { - $req->addHeader('User-Agent', "Monazilla/1.00 ({$_conf['2chapi_appname']})"); - } else { - $info_msg_ht = "

    Error: 2chと通信するために必要な情報が設定されていません。

    "; - P2Util::pushInfoHtml($info_msg_ht); - return false; - } - } else { - $req->addHeader('User-Agent', "Monazilla/1.00 ({$_conf['p2ua']})"); - } + $req->addHeader('User-Agent', P2Util::getP2UA(true,P2Util::isHost2chs($this->host))); $response = $req->sendRequest(); diff --git a/lib/SubjectTxt.php b/lib/SubjectTxt.php index 8b65142bd..f7f81d733 100644 --- a/lib/SubjectTxt.php +++ b/lib/SubjectTxt.php @@ -97,17 +97,7 @@ public function downloadSubject() $modified && $req->addHeader("If-Modified-Since", $modified); // APIを使用する設定で相手が2chだったらAPIのUAを送る - if(P2Util::isHost2chs($this->host) && $_conf['2chapi_use'] == 1) { - if($_conf['2chapi_appname'] != "") { - $req->addHeader('User-Agent', "Monazilla/1.00 ({$_conf['2chapi_appname']})"); - } else { - $info_msg_ht = "

    Error: 2ch と通信するために必要な情報が設定されていません。

    "; - P2Util::pushInfoHtml($info_msg_ht); - return; - } - } else { - $req->addHeader('User-Agent', "Monazilla/1.00 ({$_conf['p2ua']})"); - } + $req->addHeader('User-Agent', P2Util::getP2UA(true,P2Util::isHost2chs($this->host))); $response = $req->sendRequest(); diff --git a/lib/expack/rss/parser.inc.php b/lib/expack/rss/parser.inc.php index f7198faad..3677416bf 100644 --- a/lib/expack/rss/parser.inc.php +++ b/lib/expack/rss/parser.inc.php @@ -59,7 +59,7 @@ function p2GetRSS($remotefile, $atom = 0) // キャッシュが更新されなかったか、ダウンロード成功ならRSSをパース if (file_exists($localpath) && (!isset($dl) || $dl->isSuccess())) { if ($atom) { - $atom = (isset($dl) && $dl->code == 200) ? 2 : 1; + $atom = (isset($dl) && $dl->getStatus() == 200) ? 2 : 1; } $rss = p2ParseRSS($localpath, $atom); return $rss; diff --git a/lib/login2ch.inc.php b/lib/login2ch.inc.php index dcfd1660e..b466fa06c 100644 --- a/lib/login2ch.inc.php +++ b/lib/login2ch.inc.php @@ -36,7 +36,7 @@ function login2ch() return false; } } else { - $x_2ch_ua = 'X-2ch-UA: ' . $_conf['p2ua']; + $x_2ch_ua = 'X-2ch-UA: ' . P2Util::getP2UA(false,false); } // 念のためあらかじめtempファイルを除去しておく diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index 1ee73342f..908b6ff4c 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -343,7 +343,7 @@ function setHiddenValue(button) { $upload_multiple = 'multiple'; $upload_name = 'upload[]'; } - $upload_token = sha1($_conf['p2ua'] . microtime()); + $upload_token = sha1(P2Util::getP2UA(false,false) . microtime()); $_SESSION['upload_token'] = $upload_token; $upload_form = << diff --git a/lib/read_shitaraba.inc.php b/lib/read_shitaraba.inc.php index 093b4c55e..b6e7d4615 100644 --- a/lib/read_shitaraba.inc.php +++ b/lib/read_shitaraba.inc.php @@ -48,10 +48,11 @@ function shitarabaDownload(ThreadRead $aThread) FileCtl::mkdirFor($tempfile); $machiurl_res = P2Util::fileDownload($machiurl, $tempfile); - if ($machiurl_res->isError()) { + if (empty($machiurl_res)) { $aThread->diedat = true; return false; } + unset($machiurl_res); // {{{ したらばならEUCをSJISに変換 if (P2Util::isHostJbbsShitaraba($aThread->host)) { diff --git a/lib/setfav.inc.php b/lib/setfav.inc.php index 38edc8c84..a9241bad1 100644 --- a/lib/setfav.inc.php +++ b/lib/setfav.inc.php @@ -189,7 +189,7 @@ function postFavRank($post) $request = "{$method} {$send_path} HTTP/1.0\r\n"; $request .= "Host: {$URL['host']}\r\n"; - $request .= "User-Agent: Monazilla/1.00 ({$_conf['p2ua']})\r\n"; + $request .= "User-Agent: ".P2Util::getP2UA(ture)."\r\n"; $request .= "Connection: Close\r\n"; /* POSTの時はヘッダを追加して末尾にURLエンコードしたデータを添付 */ diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php index 38c55a10f..59c66e819 100644 --- a/rep2/dig2ch.php +++ b/rep2/dig2ch.php @@ -10,29 +10,34 @@ function dig2chsearch($query) $query_arry['q'] = urlencode($query_arry['q']); $url = $_conf['test.dig2ch_url'] . '?AndOr=' . $query_arry['AndOr'] . '&maxResult=' . $query_arry['maxResult'] . '&atLeast=1&Sort=' . $query_arry['Sort'] . '&Link=1&Bbs=all&924=' . $query_arry['924'] . '&json=1&keywords=' . $query_arry['q']; - $params = array(); - $params['timeout'] = $_conf['http_conn_timeout']; - $params['readTimeout'] = array($_conf['http_read_timeout'], 0); - if ($_conf['proxy_use']) { - $params['proxy_host'] = $_conf['proxy_host']; - $params['proxy_port'] = $_conf['proxy_port']; - } - $req = new HTTP_Request($url, $params); - $req->addHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.4; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko'); + try { + $req = new HTTP_Request2($url, HTTP_Request2::METHOD_GET); + $req->setHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.4; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko'); + + $req->setConfig(array( + 'connect_timeout' => $_conf['http_conn_timeout'], + 'timeout' => $_conf['http_read_timeout'], + )); + + if ($_conf['proxy_use']) { + $req->setConfig(array( + ‘proxy_host’ => $_conf['proxy_host'], + ‘proxy_port’ => $_conf['proxy_port'], + )); + } - $response = $req->sendRequest(); + $response = $req->send(); - if (PEAR::isError($response)) { - p2die($response->getMessage()); - } else { - $code = $req->getResponseCode(); + $code = $response->getStatus(); if ($code != 200) { p2die("HTTP Error - {$code}"); } - } - $body = $req->getResponseBody(); + $body = $response->getBody(); + } catch (Exception $e) { + p2die($e->getMessage()); + } // 先方の鯖で何か障害が発生したらJSONにHTMLのコメントが混ざるのでその対策 if (strpos($body,"|■ 書き込み確認 ■|>書き込み確認。<}'; - if (preg_match('/<.+>/s', $response, $matches)) { - $response = $matches[0]; + if (preg_match('/<.+>/s', $body, $matches)) { + $body = $matches[0]; } // カキコミ成功 - if ($post_seikou || preg_match($kakikonda_match, $response)) { + if ($post_seikou || preg_match($kakikonda_match, $body)) { $reload = empty($_POST['from_read_new']); showPostMsg(true, '書きこみが終わりました。', $reload); @@ -582,13 +493,13 @@ function postIt($host, $bbs, $key, $post) //echo "
    {$response_ht}
    "; // cookie確認(post再チャレンジ) - } elseif (preg_match($cookie_kakunin_match, $response)) { - showCookieConfirmation($host, $response); + } elseif (preg_match($cookie_kakunin_match, $body)) { + showCookieConfirmation($host, $body); return false; // その他はレスポンスをそのまま表示 } else { - echo preg_replace('@こちらでリロードしてください。 GO!
    @', '', $response); + echo preg_replace('@こちらでリロードしてください。 GO!
    @', '', $body); return false; } } From d2c48649bfc218ed3bda40fa0a246194b61fbf04 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 26 Mar 2015 02:46:42 +0900 Subject: [PATCH 087/339] =?UTF-8?q?=E8=AA=8D=E8=A8=BC=E7=B3=BB=E3=81=AE?= =?UTF-8?q?=E6=A9=9F=E8=83=BD=E3=82=92HTTP=5FRequest2=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=20HTTP=5FRequest2=E3=82=92=E4=BD=BF=E3=81=A3=E3=81=9F?= =?UTF-8?q?SSL=E9=80=9A=E4=BF=A1=E3=81=AEopenSSL=E3=81=A8cRUL=E3=82=92?= =?UTF-8?q?=E5=88=87=E3=82=8A=E6=9B=BF=E3=81=88=E3=82=8B=E3=81=93=E3=81=A8?= =?UTF-8?q?=E3=81=8C=E5=87=BA=E6=9D=A5=E3=82=8B=E8=A8=AD=E5=AE=9A=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=20=E3=82=B3=E3=83=9E=E3=83=B3=E3=83=89?= =?UTF-8?q?=E3=83=A9=E3=82=A4=E3=83=B3=E7=89=88curl=E3=81=AE=E3=82=B5?= =?UTF-8?q?=E3=83=9D=E3=83=BC=E3=83=88=E3=82=92=E5=89=8A=E9=99=A4=20?= =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E7=89=88=E3=81=AA=E3=81=AE=E3=81=A7?= =?UTF-8?q?=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7=E3=83=B3=E7=95=AA=E5=8F=B7?= =?UTF-8?q?=EF=BC=88=E6=99=82=E5=88=BB=EF=BC=89=E3=81=AF=E9=81=A9=E5=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- conf/conf_user_def.inc.php | 10 +- lib/auth2chapi.inc.php | 95 ++++++++------- lib/login2ch.inc.php | 234 +++++-------------------------------- rep2/edit_conf_user.php | 3 +- 5 files changed, 89 insertions(+), 255 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index a95f4c705..69dff7c1e 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150320.1020', // rep2のバージョン + 'p2version' => '150326.1020', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index d00defce8..f7039b4bf 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -547,13 +547,9 @@ $conf_user_def['pane_mode'] = 0; // (0) $conf_user_rad['pane_mode'] = array('0' => '標準(に形)', '1' => '横一列(川形)'); -// ●ログインを、まずはopensslで試みる。※PHP 4.3.0以降で、OpenSSLが静的にリンクされている必要がある -$conf_user_def['precede_openssl'] = 0; // (0) -$conf_user_rad['precede_openssl'] = array('1' => 'Yes', '0' => 'No'); - -// curlを使う時、コマンドライン版とPHP関数版どちらを優先するか (コマンドライン版:0, PHP関数版:1) -$conf_user_def['precede_phpcurl'] = 0; // (0) -$conf_user_rad['precede_phpcurl'] = array('0' => 'コマンドライン版', '1' => 'PHP関数版'); +// SSL通信(●ログイン等)に使用する関数 ※該当する拡張をインストールする必要がある +$conf_user_def['ssl_function'] = "socket"; // (socket) +$conf_user_sel['ssl_function'] = array('socket' => 'OpenSSL', 'curl' => 'cURL'); // }}} // {{{ 拡張パックとiPhone diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index 764403200..479f614a5 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -24,71 +24,86 @@ function authenticate_2chapi() $login2chPW = ""; $message = $AppKey.$CT; $HB = hash_hmac("sha256", $message, $HMKey); - + if(empty($AppKey) || empty($AppName) || empty($HMKey)) { P2Util::pushInfoHtml("

    p2 Error: 2ch API の認証に必要な情報が設定されていません。

    "); return ''; } - + if ($_conf['2chapi_rounin'] == 1&& $array = P2Util::readIdPw2ch()) { list($login2chID, $login2chPW, $autoLogin2ch) = $array; } - - $values = array( - 'ID' => $login2chID, - 'PW' => $login2chPW, - 'KY' => $AppKey, - 'CT' => $CT, - 'HB' => $HB, - ); - $options = array('http' => array( - 'ignore_errors' => true, - 'method' => 'POST', - 'header' => implode("\r\n", array( - 'User-Agent: '.$AuthUA, - 'X-2ch-UA: '.$AppName, - 'Content-Type: application/x-www-form-urlencoded', - )), - 'content' => http_build_query($values), - )); - - // プロキシ - if ($_conf['proxy_use']) { - $options['http'] += array('proxy' => 'tcp://'.$_conf['proxy_host'].":".$_conf['proxy_port']); - $options['http'] += array('request_fulluri' => true); - $options['ssl'] = array('SNI_enabled' => false); + + try { + $req = new HTTP_Request2($url,HTTP_Request2::METHOD_POST); + $req->setHeader('User-Agent', $AuthUA); + $req->setHeader('X-2ch-UA', $AppName); + $req->setAdapter($_conf['ssl_function']); + // プロキシ + if ($_conf['proxy_use']) { + $req->setConfig(array( + ‘proxy_host’ => $_conf['proxy_host'], + ‘proxy_port’ => $_conf['proxy_port'], + )); + } + $req->addPostParameter('ID', $login2chID); + $req->addPostParameter('PW', $login2chPW); + $req->addPostParameter('KY', $AppKey); + $req->addPostParameter('CT', $CT); + $req->addPostParameter('HB', $HB); + + // POSTデータの送信 + $res = $req->send(); + + $code = $res->getStatus(); + if ($code =! 200) { + P2Util::pushInfoHtml("

    p2 Error: HTTP Error({$code})

    "); + } else { + $body = $res->getBody(); + } + } catch (Exception $e) { + P2Util::pushInfoHtml("

    p2 Error: 2ch API の認証サーバに接続出来ませんでした。({$e->getMessage()})

    "); } - - $response = ''; - $response = file_get_contents($url, false, stream_context_create($options)); - + if(file_exists($_conf['sid2chapi_php'])) { unlink($_conf['sid2chapi_php']); } - - if (strpos($response, ':') != false) + + // 接続失敗ならば + if (empty($body)) { + P2Util::pushInfoHtml('

    p2 info: 2ちゃんねるのAPIを使用するには、PHPのcURL関数又はOpenSSL関数が有効である必要があります。

    '); + + P2Util::pushInfoHtml("

    p2 error: 2ch API認証に失敗しました。{$curl_msg}

    "); + return false; + } + + if (strpos($body, ':') != false) { - $sid = explode(':', $response); - + $sid = explode(':', $body); + if($_conf['2chapi_debug_print']==1) { - P2Util::pushInfoHtml($response."
    ".$AuthUA); + P2Util::pushInfoHtml($body."
    ".$AuthUA); } - + if($sid[0]!='SESSION-ID=Monazilla/1.00') { - P2Util::pushInfoHtml("

    p2 Error: 2ch API のSessionIDを取得出来ませんでした。

    "); + P2Util::pushInfoHtml("

    p2 Error: レスポンスからSessionIDを取得出来ませんでした。

    "); return ''; } - + $cont = sprintf('p2 Error: {$_conf['sid2chapi_php']} を保存できませんでした。ログイン登録失敗。

    "); return ''; } - + return $sid[1]; } - + return ''; } // }}} diff --git a/lib/login2ch.inc.php b/lib/login2ch.inc.php index b466fa06c..74054782e 100644 --- a/lib/login2ch.inc.php +++ b/lib/login2ch.inc.php @@ -24,9 +24,7 @@ function login2ch() } $auth2ch_url = 'https://2chv.tora3.net/futen.cgi'; - $postf = 'ID=' . $login2chID . '&PW=' . $login2chPW; $dolib2ch = 'DOLIB/1.00'; - $tempfile = $_conf['tmp_dir'] . '/p2temp.php'; if($_conf['2chapi_use'] == 1) { if($_conf['2chapi_appname'] != "") { @@ -39,73 +37,54 @@ function login2ch() $x_2ch_ua = 'X-2ch-UA: ' . P2Util::getP2UA(false,false); } - // 念のためあらかじめtempファイルを除去しておく - if (file_exists($tempfile)) { - unlink($tempfile); - } - - $curl_msg = ''; - - // まずはfsockopenでSSL接続する - // ただしPHPコンパイル時にOpenSSLサポートが有効になっていないと利用できず、 - // DSO版(openssl.{so,dll}等)ではエラーが出る。 - // @see http://jp.php.net/manual/ja/function.fsockopen.php - if ($_conf['precede_openssl']) { - if (!extension_loaded('openssl')) { - $curl_msg .= "「PHPのopenssl」は使えないようです"; - } elseif (!$r = getAuth2chWithOpenSSL($login2chID, $login2chPW, $auth2ch_url, $x_2ch_ua, $dolib2ch)) { - $curl_msg .= "「PHPのopenssl」で実行失敗。"; + try { + $req = new HTTP_Request2($auth2ch_url,HTTP_Request2::METHOD_POST); + $req->setHeader('User-Agent', $dolib2ch); + $req->setHeader('X-2ch-UA', $x_2ch_ua); + $req->setAdapter($_conf['ssl_function']); + // プロキシ + if ($_conf['proxy_use']) { + $req->setConfig(array( + ‘proxy_host’ => $_conf['proxy_host'], + ‘proxy_port’ => $_conf['proxy_port'], + )); } - } - - if (empty($r)) { + $req->addPostParameter('ID', $login2chID); + $req->addPostParameter('PW', $login2chPW); - // コマンドCURL優先 - if (empty($_conf['precede_phpcurl'])) { - if (!$r = getAuth2chWithCommandCurl($login2chID, $login2chPW, $tempfile, $auth2ch_url, $x_2ch_ua, $dolib2ch)) { - $curl_msg .= "「systemのcurlコマンド」で実行失敗。"; - if (!extension_loaded('curl')) { - $curl_msg .= "「PHPのcurl」は使えないようです"; - } elseif (!$r = getAuth2chWithPhpCurl($tempfile, $auth2ch_url, $x_2ch_ua, $dolib2ch, $postf)) { - $curl_msg .= "「PHPのcurl」で実行失敗。"; - } - } + // POSTデータの送信 + $res = $req->send(); - // PHP CURL優先 + $code = $res->getStatus(); + if ($code =! 200) { + P2Util::pushInfoHtml("

    p2 Error: HTTP Error({$code})

    "); } else { - if (!extension_loaded('curl')) { - $curl_msg .= "「PHPのcurl」は使えないようです"; - } elseif (!$r = getAuth2chWithPhpCurl($tempfile, $auth2ch_url, $x_2ch_ua, $dolib2ch, $postf)) { - $curl_msg .= "「PHPのcurl」で実行失敗。"; - } - - if (empty($r)) { - if (!$r = getAuth2chWithCommandCurl($login2chID, $login2chPW, $tempfile, $auth2ch_url, $x_2ch_ua, $dolib2ch)) { - $curl_msg .= "「systemのcurlコマンド」で実行失敗。"; - } - } + $body = $res->getBody(); } + } catch (Exception $e) { + P2Util::pushInfoHtml("

    p2 Error: ●の認証サーバに接続出来ませんでした。({$e->getMessage()})

    "); } // 接続失敗ならば - if (empty($r)) { + if (empty($body)) { if (file_exists($_conf['idpw2ch_php'])) { unlink($_conf['idpw2ch_php']); } if (file_exists($_conf['sid2ch_php'])) { unlink($_conf['sid2ch_php']); } - P2Util::pushInfoHtml("

    p2 info: 2ちゃんねるへの●IDログインを行うには、systemでcurlコマンドが使用可能であるか、PHPのCURL関数が有効である必要があります。

    "); + P2Util::pushInfoHtml('

    p2 info: 2ちゃんねるへの●IDログインを行うには、PHPのcURL関数又はOpenSSL関数が有効である必要があります。

    '); P2Util::pushInfoHtml("

    p2 error: 2chログイン処理に失敗しました。{$curl_msg}

    "); return false; } - // tempファイルはすぐに捨てる - if (file_exists($tempfile)) { unlink($tempfile); } - - $r = rtrim($r); + $body = rtrim($body); // 分解 - if (preg_match('/SESSION-ID=(.+?):(.+)/', $r, $matches)) { + if (preg_match('/SESSION-ID=(.+?):(.+)/', $body, $matches)) { $uaMona = $matches[1]; $SID2ch = $matches[1] . ':' . $matches[2]; } else { @@ -122,8 +101,6 @@ function login2ch() return false; } - //echo $r;// - // SIDの記録保持 $cont = sprintf('setAgent($dolib2ch); - $wap_ua->setTimeout($_conf['http_conn_timeout'], $_conf['http_read_timeout']); - - $wap_req = new WapRequest(); - $wap_req->setMethod('POST'); - $wap_req->post['ID'] = $login2chID; - $wap_req->post['PW'] = $login2chPW; - $wap_req->setHeaders($x_2ch_ua . "\r\n"); - $wap_req->setUrl($auth2ch_url); - if ($_conf['proxy_use']) { - $wap_req->setProxy($_conf['proxy_host'], $_conf['proxy_port']); - } - - // futen.cgiの仕様か、それともテスト環境のPHPがおかしいのか、 - // とにかく●ログインではPOSTする文字列をURLエンコードしていると失敗する - $wap_req->setNoUrlencodePost(true); - - $wap_res = $wap_ua->request($wap_req); - - //P2Util::pushInfoHtml(Var_Dump::display(array($wap_ua, $wap_req, $wap_res), true)); - - if (!$wap_res || $wap_res->isError()) { - return false; - } - - return $wap_res->content; -} - // }}} /* diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index 3c3a59e9a..4eb605f21 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -432,8 +432,7 @@ array('proxy_use', 'プロキシを利用'), array('proxy_host', 'プロキシホスト ex)"127.0.0.1", "p2proxy.example"'), array('proxy_port', 'プロキシポート ex)"8080"'), - array('precede_openssl', '●ログインを、まずはopensslで試みる
    (OpenSSLが静的にリンクされている必要がある)'), - array('precede_phpcurl', 'curlを使う時、コマンドライン版とPHP関数版どちらを優先するか'), + array('ssl_function', 'SSL通信(●ログイン等)に使用する関数
    (関数に該当する拡張をインストールする必要がある)'), ); printEditConfGroupHtml($groupname, $conflist, $flags); } From 59a81e7901d81a34c5fc21d16bf3cb99db650643 Mon Sep 17 00:00:00 2001 From: Killer4989 Date: Sat, 28 Mar 2015 21:35:17 +0900 Subject: [PATCH 088/339] =?UTF-8?q?=E5=88=9D=E6=9C=9F=E8=A8=AD=E5=AE=9A?= =?UTF-8?q?=E6=99=82=E3=81=AB=E3=83=87=E3=82=A3=E3=83=AC=E3=82=AF=E3=83=88?= =?UTF-8?q?=E3=83=AA=E3=81=8C=E3=81=AA=E3=81=84=E5=A0=B4=E5=90=88=E3=81=AF?= =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- lib/bootstrap.php | 9 +++++++++ rep2/ic2.php | 9 +++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index a95f4c705..af93efed6 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150320.1020', // rep2のバージョン + 'p2version' => '150328.2132', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/lib/bootstrap.php b/lib/bootstrap.php index ea88eae8c..73d09cae0 100644 --- a/lib/bootstrap.php +++ b/lib/bootstrap.php @@ -49,6 +49,15 @@ $save_conf_user = false; } } else { + // 設定ファイルが保存されるディレクトリがない場合は新規で作成 + if(!file_exists($_conf['pref_dir'])){ + FileCtl::mkdirFor($_conf['conf_user_file']) + } + if(!is_writable($_conf['pref_dir'])){ + // 書き込み権限を得られなかった場合はパーミッションの注意喚起をする + p2die("親ディレクトリのパーミッションを見直して下さい。"); + } + // デフォルト設定を読み込み、マージ include P2_CONFIG_DIR . '/conf_user_def.inc.php'; $_conf = array_merge($_conf, $conf_user_def); diff --git a/rep2/ic2.php b/rep2/ic2.php index 1dc843b7c..0793389ba 100644 --- a/rep2/ic2.php +++ b/rep2/ic2.php @@ -49,6 +49,15 @@ ic2_error('x06', 'URLまたはファイル名がありません。', false); } +// 保存ディレクトリがない場合は新規で作成 +if(!file_exists($ini['General']['cachedir'])){ + FileCtl::mkdirRecursive($ini['General']['cachedir']); +} +if(!is_writable($ini['General']['cachedir'])){ + // 書き込み権限を得られなかった場合はパーミッションの注意喚起をする + p2die("親ディレクトリのパーミッションを見直して下さい。"); +} + if (!is_dir($_conf['tmp_dir'])) { FileCtl::mkdirRecursive($_conf['tmp_dir']); } From a21c3efdad2504d07d5160df123332426ca70e1b Mon Sep 17 00:00:00 2001 From: Killer4989 Date: Sat, 28 Mar 2015 21:50:34 +0900 Subject: [PATCH 089/339] Not has ";" --- lib/bootstrap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/bootstrap.php b/lib/bootstrap.php index 73d09cae0..24e3b80f4 100644 --- a/lib/bootstrap.php +++ b/lib/bootstrap.php @@ -51,7 +51,7 @@ } else { // 設定ファイルが保存されるディレクトリがない場合は新規で作成 if(!file_exists($_conf['pref_dir'])){ - FileCtl::mkdirFor($_conf['conf_user_file']) + FileCtl::mkdirFor($_conf['conf_user_file']); } if(!is_writable($_conf['pref_dir'])){ // 書き込み権限を得られなかった場合はパーミッションの注意喚起をする From 36c0ea87598e11c9044e717152f05030122b69c0 Mon Sep 17 00:00:00 2001 From: Killer4989 Date: Sat, 28 Mar 2015 21:54:12 +0900 Subject: [PATCH 090/339] =?UTF-8?q?ng=20=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=81=AE=E5=88=87=E3=82=8A=E5=87=BA=E3=81=97=E6=96=B9=E3=82=92?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 7cf16338a..ab0ed5bb7 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -303,8 +303,9 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { return false; } // 1行目を少し切り出す - $firstmsg = trim ( substr ( $body, 0, 100 ) ); - if (strpos ( $firstmsg, 'ng ' ) === 0) { + $posLF = strpos ( $body, "\n" ); + $firstmsg = substr ( $body, 0, $posLF === false ? strlen($body) : $posLF ); + if (preg_match ( "/^ng \((.*)\)$/", $firstmsg ) ) { // ngで始まってたらapiのエラーの可能性 if (preg_match ( "/^ng \((.*)\)$/", $firstmsg )) { // 誤判定防止のためpreg_matchで二重チェックする From d891630f44afc680e151419d4043803e8f68e0e7 Mon Sep 17 00:00:00 2001 From: Killer4989 Date: Sat, 28 Mar 2015 22:04:38 +0900 Subject: [PATCH 091/339] =?UTF-8?q?ImageCache2=20=E3=81=AE=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E3=83=87=E3=82=A3=E3=83=AC=E3=82=AF=E3=83=88=E3=83=AA?= =?UTF-8?q?=E3=81=8C=E3=81=AA=E3=81=8B=E3=81=A3=E3=81=9F=E9=9A=9B=E3=81=AE?= =?UTF-8?q?=E3=83=91=E3=83=BC=E3=83=9F=E3=83=83=E3=82=B7=E3=83=A7=E3=83=B3?= =?UTF-8?q?=E3=82=92=E6=8C=87=E5=AE=9A=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- rep2/ic2.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index af93efed6..ca4a1ed82 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150328.2132', // rep2のバージョン + 'p2version' => '150328.2202', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/rep2/ic2.php b/rep2/ic2.php index 0793389ba..0f0271c54 100644 --- a/rep2/ic2.php +++ b/rep2/ic2.php @@ -51,7 +51,7 @@ // 保存ディレクトリがない場合は新規で作成 if(!file_exists($ini['General']['cachedir'])){ - FileCtl::mkdirRecursive($ini['General']['cachedir']); + FileCtl::mkdirRecursive($ini['General']['cachedir'], 0777); } if(!is_writable($ini['General']['cachedir'])){ // 書き込み権限を得られなかった場合はパーミッションの注意喚起をする From a824d66db5729a52b6b7c1ff51457f89ff37e02a Mon Sep 17 00:00:00 2001 From: Killer4989 Date: Sat, 28 Mar 2015 22:17:56 +0900 Subject: [PATCH 092/339] =?UTF-8?q?ng=20=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=81=AE=E5=88=A4=E5=AE=9A=E3=82=92=E8=A4=87=E6=95=B0=E3=82=84?= =?UTF-8?q?=E3=81=A3=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=81=A7=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index ab0ed5bb7..793dcda86 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -302,27 +302,26 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { fclose ( $fp ); return false; } - // 1行目を少し切り出す + // 1行目を切り出す $posLF = strpos ( $body, "\n" ); $firstmsg = substr ( $body, 0, $posLF === false ? strlen($body) : $posLF ); - if (preg_match ( "/^ng \((.*)\)$/", $firstmsg ) ) { - // ngで始まってたらapiのエラーの可能性 - if (preg_match ( "/^ng \((.*)\)$/", $firstmsg )) { - // 誤判定防止のためpreg_matchで二重チェックする - fclose ( $fp ); - if (strstr ( $firstmsg, "not valid" )) { - // sidが無効になった可能性。もう一回認証するため最初からやり直し。 - if (empty ( $_REQUEST ['relogin2chapi'] )) { - $_REQUEST ['relogin2chapi'] = true; - return $this->downloadDat (); - } + + // ngで始まってたらapiのエラーの可能性 + if (preg_match ( "/^ng \((.*)\)$/", $firstmsg )) { + fclose ( $fp ); + if (strstr ( $firstmsg, "not valid" )) { + // sidが無効になった可能性。もう一回認証するため最初からやり直し。 + if (empty ( $_REQUEST ['relogin2chapi'] )) { + $_REQUEST ['relogin2chapi'] = true; + return $this->downloadDat (); } - $this->getdat_error_msg_ht .= "

    rep2 error: API経由でのスレッド取得に失敗しました。" . $firstmsg . "

    "; - $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&relogin2chapi=true\">APIで再取得を試みる]"; - $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&olddat=true\">旧datで再取得を試みる]"; - $this->diedat = true; - return false; } + $this->getdat_error_msg_ht .= "

    rep2 error: API経由でのスレッド取得に失敗しました。" . $firstmsg . "

    "; + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&relogin2chapi=true\">APIで再取得を試みる]"; + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&olddat=true\">旧datで再取得を試みる]"; + $this->diedat = true; + return false; + } elseif (strpos ( $firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2" ) === 0) { fclose ( $fp ); $this->getdat_error_msg_ht .= "

    rep2 error: API経由でのスレッド取得に失敗しました。
    rep2 info: スレッドが存在しないか過去ログに格納されています。

    "; From 589d4dd78a8e32be73b793656f6d06d05694615f Mon Sep 17 00:00:00 2001 From: Killer4989 Date: Sat, 28 Mar 2015 21:54:12 +0900 Subject: [PATCH 093/339] =?UTF-8?q?ng=20=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=81=AE=E5=88=87=E3=82=8A=E5=87=BA=E3=81=97=E6=96=B9=E3=82=92?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 7cf16338a..ab0ed5bb7 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -303,8 +303,9 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { return false; } // 1行目を少し切り出す - $firstmsg = trim ( substr ( $body, 0, 100 ) ); - if (strpos ( $firstmsg, 'ng ' ) === 0) { + $posLF = strpos ( $body, "\n" ); + $firstmsg = substr ( $body, 0, $posLF === false ? strlen($body) : $posLF ); + if (preg_match ( "/^ng \((.*)\)$/", $firstmsg ) ) { // ngで始まってたらapiのエラーの可能性 if (preg_match ( "/^ng \((.*)\)$/", $firstmsg )) { // 誤判定防止のためpreg_matchで二重チェックする From 522f00ee1c191eaa92d3a0b0bf228d914d9f6daf Mon Sep 17 00:00:00 2001 From: Killer4989 Date: Sat, 28 Mar 2015 22:17:56 +0900 Subject: [PATCH 094/339] =?UTF-8?q?ng=20=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=81=AE=E5=88=A4=E5=AE=9A=E3=82=92=E8=A4=87=E6=95=B0=E3=82=84?= =?UTF-8?q?=E3=81=A3=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=81=A7=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index ab0ed5bb7..793dcda86 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -302,27 +302,26 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { fclose ( $fp ); return false; } - // 1行目を少し切り出す + // 1行目を切り出す $posLF = strpos ( $body, "\n" ); $firstmsg = substr ( $body, 0, $posLF === false ? strlen($body) : $posLF ); - if (preg_match ( "/^ng \((.*)\)$/", $firstmsg ) ) { - // ngで始まってたらapiのエラーの可能性 - if (preg_match ( "/^ng \((.*)\)$/", $firstmsg )) { - // 誤判定防止のためpreg_matchで二重チェックする - fclose ( $fp ); - if (strstr ( $firstmsg, "not valid" )) { - // sidが無効になった可能性。もう一回認証するため最初からやり直し。 - if (empty ( $_REQUEST ['relogin2chapi'] )) { - $_REQUEST ['relogin2chapi'] = true; - return $this->downloadDat (); - } + + // ngで始まってたらapiのエラーの可能性 + if (preg_match ( "/^ng \((.*)\)$/", $firstmsg )) { + fclose ( $fp ); + if (strstr ( $firstmsg, "not valid" )) { + // sidが無効になった可能性。もう一回認証するため最初からやり直し。 + if (empty ( $_REQUEST ['relogin2chapi'] )) { + $_REQUEST ['relogin2chapi'] = true; + return $this->downloadDat (); } - $this->getdat_error_msg_ht .= "

    rep2 error: API経由でのスレッド取得に失敗しました。" . $firstmsg . "

    "; - $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&relogin2chapi=true\">APIで再取得を試みる]"; - $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&olddat=true\">旧datで再取得を試みる]"; - $this->diedat = true; - return false; } + $this->getdat_error_msg_ht .= "

    rep2 error: API経由でのスレッド取得に失敗しました。" . $firstmsg . "

    "; + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&relogin2chapi=true\">APIで再取得を試みる]"; + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&olddat=true\">旧datで再取得を試みる]"; + $this->diedat = true; + return false; + } elseif (strpos ( $firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2" ) === 0) { fclose ( $fp ); $this->getdat_error_msg_ht .= "

    rep2 error: API経由でのスレッド取得に失敗しました。
    rep2 info: スレッドが存在しないか過去ログに格納されています。

    "; From 158df2d785f249e60102b67f73c8851f6b7150b9 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 30 Mar 2015 11:13:06 +0900 Subject: [PATCH 095/339] =?UTF-8?q?lib/ThreadRead.php=E3=82=92HTTP=5FReque?= =?UTF-8?q?st2=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 1883 +++++++++++++++++--------------------------- 1 file changed, 722 insertions(+), 1161 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 793dcda86..215c31075 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -47,14 +47,14 @@ public function downloadDat() { global $_conf; // まちBBS - if (P2Util::isHostMachiBbs ( $this->host )) { - return DownloadDatMachiBbs::invoke ( $this ); + if (P2Util::isHostMachiBbs ($this->host)) { + return DownloadDatMachiBbs::invoke ($this); // JBBS@したらば - } elseif (P2Util::isHostJbbsShitaraba ( $this->host )) { - if (! function_exists ( 'shitarabaDownload' )) { + } elseif (P2Util::isHostJbbsShitaraba ($this->host)) { + if (! function_exists ('shitarabaDownload')) { include P2_LIB_DIR . '/read_shitaraba.inc.php'; } - return shitarabaDownload ( $this ); + return shitarabaDownload ($this); // 2ch系 } else { @@ -62,10 +62,10 @@ public function downloadDat() { $pinktest = "/\w+\.bbspink.com/"; // 2ch bbspink●読み - if (P2Util::isHost2chs ( $this->host ) && ! empty ( $_GET ['maru'] )) { + if (P2Util::isHost2chs ($this->host) && ! empty ($_GET['maru'])) { // ログインしてなければ or ログイン後、24時間以上経過していたら自動再ログイン - if (! file_exists ( $_conf ['sid2ch_php'] ) || ! empty ( $_REQUEST ['relogin2ch'] ) || (filemtime ( $_conf ['sid2ch_php'] ) < time () - 60 * 60 * 24)) { - if (! function_exists ( 'login2ch' )) { + if (! file_exists ($_conf['sid2ch_php']) || ! empty ($_REQUEST['relogin2ch']) || (filemtime ($_conf['sid2ch_php']) < time () - 60 * 60 * 24)) { + if (! function_exists ('login2ch')) { include P2_LIB_DIR . '/login2ch.inc.php'; } if (! login2ch ()) { @@ -75,34 +75,34 @@ public function downloadDat() { } } - include $_conf ['sid2ch_php']; - return $this->_downloadDat2chMaru ( $uaMona, $SID2ch ); + include $_conf['sid2ch_php']; + return $this->_downloadDat2chMaru ($uaMona, $SID2ch); // 2ch bbspink モリタポ読み - } elseif (P2Util::isHost2chs ( $this->host ) && ! empty ( $_GET ['moritapodat'] ) && $_conf ['p2_2ch_mail'] && $_conf ['p2_2ch_pass']) { - if (! array_key_exists ( 'csrfid', $_GET ) || $this->_getCsrfIdForMoritapoDat () != $_GET ['csrfid']) { - p2die ( '不正なリクエストです' ); + } elseif (P2Util::isHost2chs ($this->host) && ! empty ($_GET['moritapodat']) && $_conf['p2_2ch_mail'] && $_conf['p2_2ch_pass']) { + if (! array_key_exists ('csrfid', $_GET) || $this->_getCsrfIdForMoritapoDat () != $_GET['csrfid']) { + p2die ('不正なリクエストです'); } return $this->_downloadDat2chMoritapo (); // 2chの過去ログ倉庫読み - } elseif (! empty ( $_GET ['kakolog'] ) && ! empty ( $_GET ['kakoget'] )) { - if ($_GET ['kakoget'] == 1) { + } elseif (! empty ($_GET['kakolog']) && ! empty ($_GET['kakoget'])) { + if ($_GET['kakoget'] == 1) { $ext = '.dat.gz'; - } elseif ($_GET ['kakoget'] == 2) { + } elseif ($_GET['kakoget'] == 2) { $ext = '.dat'; } - return $this->_downloadDat2chKako ( $_GET ['kakolog'], $ext ); + return $this->_downloadDat2chKako ($_GET['kakolog'], $ext); // 2ch or 2ch互換 - } elseif (P2Util::isHost2chs ( $this->host ) && ! empty ( $_GET ['shirokuma'] )) { - return $this->_downloadDat2chMaru ( $uaMona, $SID2ch, true); + } elseif (P2Util::isHost2chs ($this->host) && ! empty ($_GET['shirokuma'])) { + return $this->_downloadDat2chMaru ($uaMona, $SID2ch, true); // 2ch はAPI経由で落とす - } elseif (P2Util::isHost2chs ( $this->host ) && $_conf ['2chapi_use'] == 1 && empty ( $_GET ['olddat'] )) { + } elseif (P2Util::isHost2chs ($this->host) && $_conf['2chapi_use'] == 1 && empty ($_GET['olddat'])) { // ログインしてなければ or ログイン後、設定した時間経過していたら自動再ログイン - if (! file_exists ( $_conf ['sid2chapi_php'] ) || ! empty ( $_REQUEST ['relogin2chapi'] ) || (filemtime ( $_conf ['sid2chapi_php'] ) < time () - 60 * 60 * $_conf ['2chapi_interval'])) { - if (! function_exists ( 'authenticate_2chapi' )) { + if (! file_exists ($_conf['sid2chapi_php']) || ! empty ($_REQUEST['relogin2chapi']) || (filemtime ($_conf['sid2chapi_php']) < time () - 60 * 60 * $_conf['2chapi_interval'])) { + if (! function_exists ('authenticate_2chapi')) { include P2_LIB_DIR . '/auth2chapi.inc.php'; } if (! authenticate_2chapi ()) { @@ -112,12 +112,12 @@ public function downloadDat() { } } - include $_conf ['sid2chapi_php']; - return $this->_downloadDat2chAPI ( $SID2chAPI, $this->length ); + include $_conf['sid2chapi_php']; + return $this->_downloadDat2chAPI ($SID2chAPI, $this->length); } else { // 2ch 以外の外部板 // DATを差分DLする - return $this->_downloadDat2ch ( $this->length ); + return $this->_downloadDat2ch ($this->length); } } } @@ -134,17 +134,17 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { global $_conf; global $debug; - $AppKey = $_conf ['2chapi_appkey']; - $AppName = $_conf ['2chapi_appname']; - $HMKey = $_conf ['2chapi_hmkey']; - $ReadUA = sprintf($_conf['2chapi_ua.read'],$AppName); + $AppKey = $_conf['2chapi_appkey']; + $AppName = $_conf['2chapi_appname']; + $HMKey = $_conf['2chapi_hmkey']; + $ReadUA = sprintf ($_conf['2chapi_ua.read'], $AppName); if (! ($this->host && $this->bbs && $this->key)) { return false; } // >>1プレビューの時は差分取得しなくて良いので常にtrue(新着無し)を返す - if (is_readable ( $this->keydat ) && ! empty ( $_GET ['one'] )) { + if (is_readable ($this->keydat) && ! empty ($_GET['one'])) { return true; } @@ -152,7 +152,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { return false; } - $from_bytes = intval ( $from_bytes ); + $from_bytes = intval ($from_bytes); if ($from_bytes == 0) { $zero_read = true; @@ -161,311 +161,173 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { $from_bytes = $from_bytes - 1; } - $serverName = explode ( '.', $this->host ); + $serverName = explode ('.', $this->host); // $url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; // $url="http://news2.2ch.net/test/read.cgi?bbs=newsplus&key=1038486598"; - $url = 'https://api.2ch.net/v1/' . $serverName [0] . '/' . $this->bbs . '/' . $this->key; - $message = '/v1/' . $serverName [0] . '/' . $this->bbs . '/' . $this->key . $sid . $AppKey; - $HB = hash_hmac ( "sha256", $message, $HMKey ); + $url = 'https://api.2ch.net/v1/' . $serverName[0] . '/' . $this->bbs . '/' . $this->key; + $message = '/v1/' . $serverName[0] . '/' . $this->bbs . '/' . $this->key . $sid . $AppKey; + $HB = hash_hmac ("sha256", $message, $HMKey); - $headers = "User-Agent: ${ReadUA}\r\n"; - $headers .= "Connection: close\r\n"; - $headers .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $purl = parse_url ($url); // URL分解 - $purl = parse_url ( $url ); // URL分解 - - if (! empty ( $_GET ['one'] )) { - // >>1プレビューの時はサーバーに最初の部分だけ請求 - $headers .= "Range: bytes=0-8192\r\n"; - } elseif (! $zero_read) { - $headers .= "Range: bytes={$from_bytes}-\r\n"; - } - - if ($this->modified) { - $headers .= "If-Modified-Since: {$this->modified}\r\n"; - } - - // Basic認証用のヘッダ - if (isset ( $purl ['user'] ) && isset ( $purl ['pass'] )) { - $headers .= "Authorization: Basic " . base64_encode ( $purl ['user'] . ":" . $purl ['pass'] ) . "\r\n"; - } + try { + $req = new HTTP_Request2 ($url, HTTP_Request2::METHOD_POST); + // ヘッダ + $req->setHeader ('User-Agent', $ReadUA); + + if (! empty ($_GET['one'])) { + // >>1プレビューの時はサーバーに最初の部分だけ請求 + $req->setHeader ('Range', "bytes=0-8192"); + } elseif (! $zero_read) { + $req->setHeader ('Range', "bytes=" . $from_bytes); + } - $post_values = array ( - 'sid' => $sid, - 'hobo' => $HB, - 'appkey' => $AppKey - ); - - $options ['http'] = array ( - 'method' => 'POST', - 'header' => $headers, - 'ignore_errors' => true, - 'content' => http_build_query ( $post_values ) - ); - - // プロキシ - if ($_conf ['proxy_use']) { - $options ['http'] += array ( - 'proxy' => 'tcp://' . $_conf ['proxy_host'] . ":" . $_conf ['proxy_port'] - ); - $options ['http'] += array ( - 'request_fulluri' => true - ); - $options ['ssl'] = array ( - 'SNI_enabled' => false - ); - } + if ($this->modified) { + $req->setHeader ('If-Modified-Since', $this->modified); + } - // WEBサーバへ接続 - $fp = @fopen ( $url, 'r', false, stream_context_create ( $options ) ); - if (! $fp) { - self::_pushInfoConnectFailed ( $url, $errno, $errstr ); - $this->diedat = true; - return false; - } - stream_set_timeout ( $fp, $_conf ['http_read_timeout'], 0 ); - - $code = null; - $meta = stream_get_meta_data ( $fp ); - foreach ( $meta ['wrapper_data'] as $l ) { - // ex) HTTP/1.1 304 Not Modified - if (preg_match ( '@^HTTP/1\\.\\d (\\d+) (.+)@i', $l, $matches )) { - $code = $matches [1]; - - if ($code == '200' || $code == '206') { // Partial Content - ; - } elseif ($code == '302') { // Found - // ホストの移転を追跡 - $new_host = BbsMap::getCurrentHost ( $this->host, $this->bbs ); - if ($new_host != $this->host) { - fclose ( $fp ); - $this->old_host = $this->host; - $this->host = $new_host; - return $this->_downloadDat2chAPI ( $sid, $from_bytes ); - } else { - fclose ( $fp ); - return $this->_downloadDat2chNotFound ( $code ); - } - } elseif ($code == '304') { // Not Modified - fclose ( $fp ); - $this->isonline = true; - return '304 Not Modified'; - } elseif ($code == '416') { // Requested Range Not Satisfiable - // echo "あぼーん検出"; - fclose ( $fp ); - $this->onbytes = 0; - $this->modified = null; - return $this->_downloadDat2chAPI ( $sid, 0 ); // あぼーん検出。全部取り直し。 - } else { - fclose ( $fp ); - return $this->_downloadDat2chNotFound ( $code ); - } + // Basic認証用のヘッダ + if (isset ($purl['user']) && isset ($purl['pass'])) { + $req->setAuth ($purl['user'], $purl['pass'], HTTP_Request2::AUTH_BASIC); } - if ($zero_read) { - if (preg_match ( '/^Content-Length: ([0-9]+)/i', $l, $matches )) { - $this->onbytes = intval ( $matches [1] ); - } - } else { + $req->setConfig (array ( + 'connect_timeout' => $_conf['http_conn_timeout'], + 'timeout' => $_conf['http_read_timeout'], + 'follow_redirects' => false + )); - if (preg_match ( '@^Content-Range: bytes ([^/]+)/([0-9]+)@i', $l, $matches )) { - $this->onbytes = intval ( $matches [2] ); - } + // プロキシ + if ($_conf['proxy_use']) { + $req->setConfig (array ( + ‘proxy_host’ => $_conf['proxy_host'], + ‘proxy_port’ => $_conf['proxy_port'] + )); } - if (preg_match ( '/^Last-Modified: (.+)/i', $l, $matches )) { - // echo $matches[1] . '
    '; //debug - $this->modified = $matches [1]; - } - } + // POSTする内容 + $req->addPostParameter (array ( + 'sid' => $sid, + 'hobo' => $HB, + 'appkey' => $AppKey + )); - $body = ''; + // POSTデータの送信 + $response = $req->send (); - if ($code == '200' || $code == '206') { + $code = $response->getStatus (); - while ( ! p2_stream_eof ( $fp, $timed_out ) ) { - // >>1をプレビューする用 - if (! empty ( $_GET ['one'] )) { - $line = fgets ( $fp, 32800 ); // 改行単位で読込み - if (strstr ( $line, "\n" )) { // 改行が有れば保存; - $body .= $line; - } - unset ( $line ); - } else { - $body .= fread ( $fp, 4096 ); // 通常取得はあぼーん判定を行うためこっちで保存する - } - } + if ($code == '200' || $code == '206') { // Partial Content + $body = $response->getBody (); - if ($timed_out) { - self::_pushInfoReadTimedOut ( $url ); - $this->diedat = true; - fclose ( $fp ); - return false; - } - // 1行目を切り出す - $posLF = strpos ( $body, "\n" ); - $firstmsg = substr ( $body, 0, $posLF === false ? strlen($body) : $posLF ); - - // ngで始まってたらapiのエラーの可能性 - if (preg_match ( "/^ng \((.*)\)$/", $firstmsg )) { - fclose ( $fp ); - if (strstr ( $firstmsg, "not valid" )) { - // sidが無効になった可能性。もう一回認証するため最初からやり直し。 - if (empty ( $_REQUEST ['relogin2chapi'] )) { - $_REQUEST ['relogin2chapi'] = true; - return $this->downloadDat (); + if (! empty ($_GET['one'])) { + $cut = mb_strrpos ($body, "\n"); + $body = mb_substr ($body, 0, $cut === false ? mb_strlen ($body) : $cut + 1); + $this->onbytes = strlen ($body); + } elseif ($zero_read) { + $this->onbytes = intval ($response->getHeader ('Content-Length')); + } else { + if (preg_match ('@^bytes ([^/]+)/([0-9]+)@i', $response->getHeader ('Content-Range'), $matches)) { + $this->onbytes = intval ($matches[2]); } } - $this->getdat_error_msg_ht .= "

    rep2 error: API経由でのスレッド取得に失敗しました。" . $firstmsg . "

    "; - $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&relogin2chapi=true\">APIで再取得を試みる]"; - $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&olddat=true\">旧datで再取得を試みる]"; - $this->diedat = true; - return false; - } elseif (strpos ( $firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2" ) === 0) { - fclose ( $fp ); - $this->getdat_error_msg_ht .= "

    rep2 error: API経由でのスレッド取得に失敗しました。
    rep2 info: スレッドが存在しないか過去ログに格納されています。

    "; - $marutori_ht = $this->_generateMarutoriLink(); - $plugin_ht = $this->_generateWikiDatLink (); - $moritori_ht = $this->_generateMoritapoDatLink (); - $this->getdat_error_msg_ht .= "{$marutori_ht}{$moritori_ht}{$plugin_ht}"; - $this->diedat = true; - return false; - } - unset ( $firstmsg ); - - // 末尾の改行であぼーんチェック - if (! $zero_read) { - if (substr ( $body, 0, 1 ) != "\n") { - // echo "あぼーん検出"; - fclose ( $fp ); - $this->onbytes = 0; - $this->modified = null; - return $this->_downloadDat2chAPI ( $sid, 0 ); // あぼーん検出。全部取り直し。 - } - $body = substr ( $body, 1 ); - } + $this->modified = $response->getHeader ('Last-Modified'); - $file_append = ($zero_read) ? 0 : FILE_APPEND; - - if (FileCtl::file_write_contents ( $this->keydat, $body, $file_append ) === false) { - p2die ( 'cannot write file.' ); - } + // 1行目を切り出す + $posLF = mb_strpos ($body, "\n"); + $firstmsg = mb_substr ($body, 0, $posLF === false ? mb_strlen ($body) : $posLF); - // $GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("dat_size_check"); - // 取得後サイズチェック - if ($zero_read == false && $this->onbytes) { - $this->getDatBytesFromLocalDat (); // $aThread->length をset - if ($this->onbytes != $this->length) { - fclose ( $fp ); - $this->onbytes = 0; - $this->modified = null; - P2Util::pushInfoHtml ( "

    rep2 info: {$this->onbytes}/{$this->length} ファイルサイズが変なので、datを再取得

    " ); - // $GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("dat_size_check"); - return $this->_downloadDat2chAPI ( $sid, 0 ); // datサイズは不正。全部取り直し。 - - // サイズが同じならそのまま - } elseif ($this->onbytes == $this->length) { - fclose ( $fp ); - $this->isonline = true; - // $GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('dat_size_check'); - return true; + // ngで始まってたらapiのエラーの可能性 + if (preg_match ("/^ng \((.*)\)$/", $firstmsg)) { + if (strstr ($firstmsg, "not valid")) { + // sidが無効になった可能性。もう一回認証するため最初からやり直し。 + if (empty ($_REQUEST['relogin2chapi'])) { + $_REQUEST['relogin2chapi'] = true; + return $this->downloadDat (); + } + } + $this->getdat_error_msg_ht .= "

    rep2 error: API経由でのスレッド取得に失敗しました。" . $firstmsg . "

    "; + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&relogin2chapi=true\">APIで再取得を試みる]"; + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&olddat=true\">旧datで再取得を試みる]"; + $this->diedat = true; + return false; + } elseif (mb_strpos ($firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2") === 0) { + $this->getdat_error_msg_ht .= "

    rep2 error: API経由でのスレッド取得に失敗しました。
    rep2 info: スレッドが存在しないか過去ログに格納されています。

    "; + $marutori_ht = $this->_generateMarutoriLink (); + $plugin_ht = $this->_generateWikiDatLink (); + $moritori_ht = $this->_generateMoritapoDatLink (); + $this->getdat_error_msg_ht .= "{$marutori_ht}{$moritori_ht}{$plugin_ht}"; + $this->diedat = true; + return false; + } + unset ($firstmsg); + + // 末尾の改行であぼーんチェック + if (! $zero_read) { + if (substr ($body, 0, 1) != "\n") { + // echo "あぼーん検出"; + $this->onbytes = 0; + $this->modified = null; + return $this->_downloadDat2chAPI ($sid, 0); // あぼーん検出。全部取り直し。 + } + $body = substr ($body, 1); } - } - } else { - // スレッドがないと判断 - fclose ( $fp ); - return $this->_downloadDat2chNotFound ( $code ); - } - - fclose ( $fp ); - if ($timed_out) { - self::_pushInfoReadTimedOut ( $url ); - $this->diedat = true; - return false; - } else { - $this->isonline = true; - return true; - } - } - // }}} - // {{{ _freadHttpHeader() - /** - * HTTPヘッダレスポンスを読み込む - * - * @access private - * @param resource $fp fsockopen で開いたファイルポインタ - * @return array|false - */ - function _freadHttpHeader($fp) - { - $h = array(); - - while (!feof($fp)) { - $l = fgets($fp, 8192); - - // ex) HTTP/1.1 304 Not Modified - if (preg_match("|HTTP/1\.\d (\d+) (.+)\r\n|", $l, $matches)) { - $h['code'] = $matches[1]; - $h['message'] = $matches[2]; - $h['HTTP'] = rtrim($l); - } + $file_append = ($zero_read) ? 0 : FILE_APPEND; - if (preg_match('/^(.+?): (.+)\r\n/', $l, $matches)) { - $h['headers'][$matches[1]] = $matches[2]; + if (FileCtl::file_write_contents ($this->keydat, $body, $file_append) === false) { + p2die ('cannot write file.'); + } - } elseif ($l == "\r\n") { - if (!isset($h['code'])) { - return false; + // $GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("dat_size_check"); + // 取得後サイズチェック + if ($zero_read == false && $this->onbytes) { + $this->getDatBytesFromLocalDat (); // $aThread->length をset + if ($this->onbytes != $this->length) { + $this->onbytes = 0; + $this->modified = null; + P2Util::pushInfoHtml ("

    rep2 info: {$this->onbytes}/{$this->length} ファイルサイズが変なので、datを再取得

    "); + // $GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("dat_size_check"); + return $this->_downloadDat2chAPI ($sid, 0); // datサイズは不正。全部取り直し。 + } } - return $h; - } - } - return false; - } - // }}} - // {{{ _pushInfoHtmlFreadHttpHeaderError() - /** - * HTTPヘッダレスポンスの取得エラーを P2Util::pushInfoHtml() する - * - * @access private - * @return void - */ - function _pushInfoHtmlFreadHttpHeaderError($url) - { - P2Util::pushInfoHtml(sprintf('

    p2 info: %s からヘッダレスポンスを取得できませんでした。

    ',self::_urlToAnchor($url))); - } - // }}} - // {{{ _getOnbytesFromHeader() - /** - * HTTPヘッダレスポンスからファイルサイズを取得する - * - * @access private - * @param array $headers - * @param boolean $zero_read - * @return integer|false - */ - function _getOnbytesFromHeader($headers, $zero_read = true) - { - if ($zero_read) { - if (isset($headers['Content-Length'])) { - if (preg_match("/^([0-9]+)/", $headers['Content-Length'], $matches)) { - return $onbytes = $matches[1]; + $this->isonline = true; + return true; + } elseif ($code == '302') { // Found + // ホストの移転を追跡 + $new_host = BbsMap::getCurrentHost ($this->host, $this->bbs); + if ($new_host != $this->host) { + $this->old_host = $this->host; + $this->host = $new_host; + return $this->_downloadDat2chAPI ($sid, $from_bytes); + } else { + return $this->_downloadDat2chNotFound ($code); } + } elseif ($code == '304') { + $this->isonline = true; + return '304 Not Modified'; + } elseif ($code == '416') { // Requested Range Not Satisfiable + // echo "あぼーん検出"; + $this->onbytes = 0; + $this->modified = null; + return $this->_downloadDat2chAPI ($sid, 0); // あぼーん検出。全部取り直し。 + } else { + return $this->_downloadDat2chNotFound ($code); } - } else { - if (isset($headers['Content-Range'])) { - if (preg_match("/^bytes ([^\/]+)\/([0-9]+)/", $headers['Content-Range'], $matches)) { - return $onbytes = $matches[2]; - } + if ($response->getHeader ('Location')) { + $post_seikou = true; } + } catch (Exception $e) { + $this->getdat_error_msg_ht .= "

    サーバ接続エラー: " . $e->getMessage (); + $this->getdat_error_msg_ht .= "
    rep2 error: 板サーバへの接続に失敗しました。

    "; + $this->diedat = true; + return false; } - - return false; } + // }}} // {{{ _downloadDat2ch() @@ -474,21 +336,20 @@ function _getOnbytesFromHeader($headers, $zero_read = true) * * @return mix 取得できたか、更新がなかった場合はtrueを返す */ - protected function _downloadDat2ch($from_bytes) - { + protected function _downloadDat2ch($from_bytes) { global $_conf; global $debug; - if (!($this->host && $this->bbs && $this->key)) { + if (! ($this->host && $this->bbs && $this->key)) { return false; } - //>>1プレビューの時は差分取得しなくて良いので常にtrue(新着無し)を返す - if (is_readable($this->keydat) && !empty($_GET['one'])) { + // >>1プレビューの時は差分取得しなくて良いので常にtrue(新着無し)を返す + if (is_readable ($this->keydat) && ! empty ($_GET['one'])) { return true; } - $from_bytes = intval($from_bytes); + $from_bytes = intval ($from_bytes); if ($from_bytes == 0) { $zero_read = true; @@ -497,220 +358,147 @@ protected function _downloadDat2ch($from_bytes) $from_bytes = $from_bytes - 1; } - $method = 'GET'; - $url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; - //$url="http://news2.2ch.net/test/read.cgi?bbs=newsplus&key=1038486598"; - - $purl = parse_url($url); // URL分解 - if (isset($purl['query'])) { // クエリー - $purl['query'] = '?' . $purl['query']; - } else { - $purl['query'] = ''; - } - - // プロキシ - if ($_conf['proxy_use']) { - $send_host = $_conf['proxy_host']; - $send_port = $_conf['proxy_port']; - $send_path = $url; - } else { - $send_host = $purl['host']; - $send_port = isset($purl['port']) ? $purl['port'] : 80; - $send_path = $purl['path'] . $purl['query']; - } - - if (!$send_port) { - $send_port = 80; // デフォルトを80 - } - - $request = "{$method} {$send_path} HTTP/1.0\r\n"; - $request .= "Host: {$purl['host']}\r\n"; - $request .= "Accept: */*\r\n"; - //$request .= "Accept-Charset: Shift_JIS\r\n"; - //$request .= "Accept-Encoding: gzip, deflate\r\n"; - $request .= "Accept-Language: ja, en\r\n"; - $request .= "User-Agent: Monazilla/1.00 ({$_conf['p2ua']})\r\n"; - - if(!empty($_GET['one'])) { - //>>1プレビューの時はサーバーに最初の部分だけ請求 - $headers .= "Range: bytes=0-8192\r\n"; - } elseif (!$zero_read) { - $request .= "Range: bytes={$from_bytes}-\r\n"; - } - - $request .= "Referer: http://{$purl['host']}/{$this->bbs}/\r\n"; - - if ($this->modified) { - $request .= "If-Modified-Since: {$this->modified}\r\n"; - } - - // Basic認証用のヘッダ - if (isset($purl['user']) && isset($purl['pass'])) { - $request .= "Authorization: Basic ".base64_encode($purl['user'].":".$purl['pass'])."\r\n"; - } - - $request .= "Connection: Close\r\n"; + // $url="http://news2.2ch.net/test/read.cgi?bbs=newsplus&key=1038486598"; - $request .= "\r\n"; + $purl = parse_url ($url); // URL分解 + // $request .= "Accept-Charset: Shift_JIS\r\n"; + // $request .= "Accept-Encoding: gzip, deflate\r\n"; - // WEBサーバへ接続 - $fp = @fsockopen($send_host, $send_port, $errno, $errstr, $_conf['http_conn_timeout']); - if (!$fp) { - self::_pushInfoConnectFailed($url, $errno, $errstr); - $this->diedat = true; - return false; - } - stream_set_timeout($fp, $_conf['http_read_timeout'], 0); + try { + $req = new HTTP_Request2 ($url, HTTP_Request2::METHOD_GET); + // ヘッダ + $req->setHeader ('User-Agent', P2Util::getP2UA (true)); + $req->setHeader ('Referer', "http://{$purl['host']}/{$this->bbs}/"); + + if (! empty ($_GET['one'])) { + // >>1プレビューの時はサーバーに最初の部分だけ請求 + $req->setHeader ('Range', "bytes=0-8192"); + } elseif (! $zero_read) { + $req->setHeader ('Range', "bytes=" . $from_bytes); + } - fputs($fp, $request); + if ($this->modified) { + $req->setHeader ('If-Modified-Since', $this->modified); + } - $code = null; + // Basic認証用のヘッダ + if (isset ($purl['user']) && isset ($purl['pass'])) { + $req->setAuth ($purl['user'], $purl['pass'], HTTP_Request2::AUTH_BASIC); + } - // HTTPヘッダレスポンスを取得する - $h = $this->_freadHttpHeader($fp); - if ($h === false) { - fclose($fp); - $this->_pushInfoHtmlFreadHttpHeaderError($url); - $this->diedat = true; - return false; - } - $code = $h['code']; + $req->setConfig (array ( + 'connect_timeout' => $_conf['http_conn_timeout'], + 'timeout' => $_conf['http_read_timeout'], + 'follow_redirects' => false + )); - if ($code == '200' || $code == '206') { // Partial Content - ; + // プロキシ + if ($_conf['proxy_use']) { + $req->setConfig (array ( + ‘proxy_host’ => $_conf['proxy_host'], + ‘proxy_port’ => $_conf['proxy_port'] + )); + } - } elseif ($code == '302') { // Found + // Requestの送信 + $response = $req->send (); - // ホストの移転を追跡 - $new_host = BbsMap::getCurrentHost($this->host, $this->bbs); - if ($new_host != $this->host) { - fclose($fp); - $this->old_host = $this->host; - $this->host = $new_host; - return $this->_downloadDat2ch($from_bytes); - } else { - fclose($fp); - return $this->_downloadDat2chNotFound($code); - } + $code = $response->getStatus (); - } elseif ($code == '304') { // Not Modified - fclose($fp); - $this->isonline = true; - return '304 Not Modified'; + if ($code == '200' || $code == '206') { // Partial Content + $body = $response->getBody (); - } elseif ($code == '416') { // Requested Range Not Satisfiable - //echo "あぼーん検出"; - fclose($fp); - $this->onbytes = 0; - $this->modified = null; - return $this->_downloadDat2ch(0); // あぼーん検出。全部取り直し。 + if (! empty ($_GET['one'])) { + $cut = mb_strrpos ($body, "\n"); + $body = mb_substr ($body, 0, $cut === false ? mb_strlen ($body) : $cut + 1); + $this->onbytes = strlen ($body); + } elseif ($zero_read) { + $this->onbytes = intval ($response->getHeader ('Content-Length')); + } else { + if (preg_match ('@^bytes ([^/]+)/([0-9]+)@i', $response->getHeader ('Content-Range'), $matches)) { + $this->onbytes = intval ($matches[2]); + } + } - } else { - fclose($fp); - return $this->_downloadDat2chNotFound($code); - } + $this->modified = $response->getHeader ('Last-Modified'); - $r = $this->_getOnbytesFromHeader($h['headers'], $zero_read); - if ($r !== false) { - $this->onbytes = $r; - } + // 1行目を切り出す + $posLF = mb_strpos ($body, "\n"); + $firstmsg = mb_substr ($body, 0, $posLF === false ? mb_strlen ($body) : $posLF); - if (isset($h['headers']['Last-Modified'])) { - $this->modified = $h['headers']['Last-Modified']; - } + // ホストが2chの時にDATを利用できない旨のメッセージが出たらエラーとする(DAT破損対策) + if (P2Util::isHost2chs ($this->host)) { + if (mb_strpos ($firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2") === 0) { + $this->getdat_error_msg_ht .= "

    rep2 error: API経由でのスレッド取得に失敗しました。
    rep2 info: スレッドが存在しないか過去ログに格納されています。

    "; + $marutori_ht = $this->_generateMarutoriLink (); + $plugin_ht = $this->_generateWikiDatLink (); + $moritori_ht = $this->_generateMoritapoDatLink (); + $this->getdat_error_msg_ht .= "{$marutori_ht}{$moritori_ht}{$plugin_ht}"; + $this->diedat = true; + return false; + } + unset ($firstmsg); + } - // bodyを読む - $body = ''; - if ($code == '200' || $code == '206') { - - while (!p2_stream_eof($fp, $timed_out)) { - //>>1をプレビューする用 - if (!empty($_GET['one'])) { - $line = fgets($fp, 32800); //改行単位で読込み - if (strstr($line, "\n")) {//改行が有れば保存; - $body .= $line; + // 末尾の改行であぼーんチェック + if (! $zero_read) { + if (substr ($body, 0, 1) != "\n") { + // echo "あぼーん検出"; + $this->onbytes = 0; + $this->modified = null; + return $this->_downloadDat2chAPI ($sid, 0); // あぼーん検出。全部取り直し。 } - unset($line); - } else { - $body .= fread($fp, 4096); //通常取得はあぼーん判定を行うためこっちで保存する + $body = substr ($body, 1); } - } - if ($timed_out) { - self::_pushInfoReadTimedOut($url); - $this->diedat = true; - fclose($fp); - return false; - } + $file_append = ($zero_read) ? 0 : FILE_APPEND; - //ホストが2chの時にDATを利用できない旨のメッセージが出たらエラーとする(DAT破損対策) - if (P2Util::isHost2chs($this->host)) - { - $firstmsg = substr($body, 0, 100); - if (strpos($firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2")===0) { - $this->getdat_error_msg_ht .= "

    rep2 error: 2ちゃんねるのDAT提供は終了しました。

    "; - $this->diedat = true; - fclose($fp); - return false; + if (FileCtl::file_write_contents ($this->keydat, $body, $file_append) === false) { + p2die ('cannot write file.'); } - unset($firstmsg); - } - // 末尾の改行であぼーんチェック - if (!$zero_read) { - if (substr($body, 0, 1) != "\n") { - //echo "あぼーん検出"; - fclose($fp); - $this->onbytes = 0; - $this->modified = null; - return $this->_downloadDat2ch(0); // あぼーん検出。全部取り直し。 + // $GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("dat_size_check"); + // 取得後サイズチェック + if ($zero_read == false && $this->onbytes) { + $this->getDatBytesFromLocalDat (); // $aThread->length をset + if ($this->onbytes != $this->length) { + $this->onbytes = 0; + $this->modified = null; + P2Util::pushInfoHtml ("

    rep2 info: {$this->onbytes}/{$this->length} ファイルサイズが変なので、datを再取得

    "); + // $GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("dat_size_check"); + return $this->_downloadDat2chAPI ($sid, 0); // datサイズは不正。全部取り直し。 + } } - $body = substr($body, 1); - } - - $file_append = ($zero_read) ? 0 : FILE_APPEND; - - if (FileCtl::file_write_contents($this->keydat, $body, $file_append) === false) { - p2die('cannot write file.'); - } - //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("dat_size_check"); - // 取得後サイズチェック - if ($zero_read == false && $this->onbytes) { - $this->getDatBytesFromLocalDat(); // $aThread->length をset - if ($this->onbytes != $this->length) { - fclose($fp); - $this->onbytes = 0; - $this->modified = null; - P2Util::pushInfoHtml("

    rep2 info: {$this->onbytes}/{$this->length} ファイルサイズが変なので、datを再取得

    "); - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("dat_size_check"); - return $this->_downloadDat2ch(0); //datサイズは不正。全部取り直し。 - - // サイズが同じならそのまま - } elseif ($this->onbytes == $this->length) { - fclose($fp); - $this->isonline = true; - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('dat_size_check'); - return true; + $this->isonline = true; + return true; + } elseif ($code == '302') { // Found + // ホストの移転を追跡 + $new_host = BbsMap::getCurrentHost ($this->host, $this->bbs); + if ($new_host != $this->host) { + $this->old_host = $this->host; + $this->host = $new_host; + return $this->_downloadDat2chAPI ($sid, $from_bytes); + } else { + return $this->_downloadDat2chNotFound ($code); } + } elseif ($code == '304') { + $this->isonline = true; + return '304 Not Modified'; + } elseif ($code == '416') { // Requested Range Not Satisfiable + // echo "あぼーん検出"; + $this->onbytes = 0; + $this->modified = null; + return $this->_downloadDat2chAPI ($sid, 0); // あぼーん検出。全部取り直し。 + } else { + return $this->_downloadDat2chNotFound ($code); } - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('dat_size_check'); - - } else { - // スレッドがないと判断 - fclose($fp); - return $this->_downloadDat2chNotFound($code); - } - - fclose($fp); - if ($timed_out) { - self::_pushInfoReadTimedOut($url); + } catch (Exception $e) { + $this->getdat_error_msg_ht .= "

    サーバ接続エラー: " . $e->getMessage (); + $this->getdat_error_msg_ht .= "
    rep2 error: 板サーバへの接続に失敗しました。

    "; $this->diedat = true; return false; - } else { - $this->isonline = true; - return true; } } @@ -720,11 +508,10 @@ protected function _downloadDat2ch($from_bytes) /** * 2ch DATをダウンロードできなかったときに呼び出される */ - protected function _downloadDat2chNotFound($code = null) - { + protected function _downloadDat2chNotFound($code = null) { // 2ch, bbspink ならread.cgiで確認 - if (P2Util::isHost2chs($this->host) || P2Util::isHostVip2ch($this->host)) { - $this->getdat_error_msg_ht .= $this->get2chDatError($code); + if (P2Util::isHost2chs ($this->host) || P2Util::isHostVip2ch ($this->host)) { + $this->getdat_error_msg_ht .= $this->get2chDatError ($code); } $this->diedat = true; return false; @@ -738,187 +525,96 @@ protected function _downloadDat2chNotFound($code = null) * * @param string $uaMona * @param string $SID2ch - * @param bool $shirokuma trueならofflaw2で取得 + * @param bool $shirokuma + * trueならofflaw2で取得 * @return bool * @see lib/login2ch.inc.php */ - protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma = false) - { + protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma = false) { global $_conf; - if (!($this->host && $this->bbs && $this->key && $this->keydat)) { + if (! ($this->host && $this->bbs && $this->key && $this->keydat)) { return false; } - $method = 'GET'; - - // GET /test/offlaw.cgi?bbs=板名&key=スレッド番号&sid=セッションID HTTP/1.1 - //$url = "http://{$this->host}/test/offlaw.cgi/{$this->bbs}/{$this->key}/?raw=0.0&sid="; - if (!$shirokuma) { + // GET /test/offlaw.cgi?bbs=板名&key=スレッド番号&sid=セッションID HTTP/1.1 + // $url = "http://{$this->host}/test/offlaw.cgi/{$this->bbs}/{$this->key}/?raw=0.0&sid="; + if (! $shirokuma) { // 浪人対応 - $rokkasystem = explode(".", $this->host , 2); + $rokkasystem = explode (".", $this->host, 2); $url = "http://rokka.$rokkasystem[1]/$rokkasystem[0]/{$this->bbs}/{$this->key}/?raw=0.0&sid="; - $url .= rawurlencode($SID2ch); + $url .= rawurlencode ($SID2ch); } else { - $url ="http://{$this->host}/test/offlaw2.so?shiro=kuma&bbs={$this->bbs}&key={$this->key}&sid=ERROR"; - } - $purl = parse_url($url); // URL分解 - if (isset($purl['query'])) { // クエリー - $purl['query'] = '?'.$purl['query']; - } else { - $purl['query'] = ''; - } - - // プロキシ - if ($_conf['proxy_use']) { - $send_host = $_conf['proxy_host']; - $send_port = $_conf['proxy_port']; - $send_path = $url; - } else { - $send_host = $purl['host']; - $send_port = $purl['port']; - $send_path = $purl['path'].$purl['query']; - } - - if (!$send_port) { - $send_port = 80; // デフォルトを80 - } - - $request = $method." ".$send_path." HTTP/1.0\r\n"; - $request .= "Host: ".$purl['host']."\r\n"; - $request .= "Accept-Encoding: gzip, deflate\r\n"; - //$request .= "Accept-Language: ja, en\r\n"; - $request .= "User-Agent: {$uaMona} ({$_conf['p2ua']})\r\n"; - //$request .= "X-2ch-UA: {$_conf['p2ua']}\r\n"; - //$request .= "Range: bytes={$from_bytes}-\r\n"; - $request .= "Connection: Close\r\n"; - /* - if ($modified) { - $request .= "If-Modified-Since: $modified\r\n"; - } - */ - $request .= "\r\n"; - - // WEBサーバへ接続 - $fp = @fsockopen($send_host, $send_port, $errno, $errstr, $_conf['http_conn_timeout']); - if (!$fp) { - self::_pushInfoConnectFailed($url, $errno, $errstr); - $this->diedat = true; - return false; - } - stream_set_timeout($fp, $_conf['http_read_timeout'], 0); - - fputs($fp, $request); - - $body = ''; - $code = null; - $chunked = false; - $is_gzip = false; - $start_here = false; - - // HTTPヘッダレスポンスを取得する - $h = $this->_freadHttpHeader($fp); - if ($h === false) { - fclose($fp); - $this->_pushInfoHtmlFreadHttpHeaderError($url); - $this->diedat = true; - return false; + $url = "http://{$this->host}/test/offlaw2.so?shiro=kuma&bbs={$this->bbs}&key={$this->key}&sid=ERROR"; } + $purl = parse_url ($url); // URL分解 - // {{{ HTTPコードをチェック + try { + $req = new HTTP_Request2 ($url, HTTP_Request2::METHOD_GET); + // ヘッダ + $req->setHeader ('User-Agent', "{$uaMona} ({$_conf['p2ua']})"); + $req->setHeader ('Accept-Encoding', "gzip, deflate"); + + $req->setConfig (array ( + 'connect_timeout' => $_conf['http_conn_timeout'], + 'timeout' => $_conf['http_read_timeout'], + 'follow_redirects' => false + )); + + // プロキシ + if ($_conf['proxy_use']) { + $req->setConfig (array ( + ‘proxy_host’ => $_conf['proxy_host'], + ‘proxy_port’ => $_conf['proxy_port'] + )); + } - $code = $h['code']; + // Requestの送信 + $response = $req->send (); - if ($code == '200') { - ; - } elseif ($code == '304') { - fclose($fp); - //$this->isonline = true; - return '304 Not Modified'; - } else { - fclose($fp); - return $this->_downloadDat2chMaruNotFound(); - } + $code = $response->getStatus (); - if (isset($h['headers']['Content-Encoding'])) { - if (preg_match("/^(x-)?gzip/", $h['headers']['Content-Encoding'], $matches)) { - $isGzip = true; - } - } - if (isset($h['headers']['Content-Length'])) { - if (preg_match("/^([0-9]+)/", $h['headers']['Content-Length'], $matches)) { - $this->onbytes = $h['headers']['Content-Length']; - } - } - if (isset($h['headers']['Transfer-Encoding'])) { - if ($h['headers']['Transfer-Encoding'] == 'chunked') { - $chunked = true; - } - } - if (isset($h['headers']['Last-Modified'])) { - $this->modified = $h['headers']['Last-Modified']; - } + if ($code == '200' || $code == '206') { // Partial Content + $body = $response->getBody (); - if ($code == '200') { + $this->onbytes = intval ($response->getHeader ('Content-Length')); - while (!p2_stream_eof($fp, $timed_out)) { - $body .= fread($fp, 4096); - } - - if ($timed_out) { - self::_pushInfoReadTimedOut($url); - //$this->diedat = true; - fclose($fp); - return false; - } + $this->modified = $response->getHeader ('Last-Modified'); - // gzip圧縮なら - if ($is_gzip) { - $body = self::_decodeGzip($body, $url); - if ($body === null) { - //$this->diedat = true; - fclose($fp); - return false; + if (FileCtl::file_write_contents ($this->keydat, $body, $file_append) === false) { + p2die ('cannot write file. downloadDat2chMaru()'); } - } - - if (FileCtl::file_write_contents($this->keydat, $body) === false) { - p2die('cannot write file. downloadDat2chMaru()'); - } - // クリーニング ===== - if ($marudatlines = FileCtl::file_read_lines($this->keydat)) { - if (!$shirokuma) { - $firstline = array_shift($marudatlines); - // チャンクとか - if (strpos($firstline, 'Success') === false) { // 浪人(rokka)対応 - $secondline = array_shift($marudatlines); + // クリーニング ===== + if ($marudatlines = FileCtl::file_read_lines ($this->keydat)) { + if (! $shirokuma) { + $firstline = array_shift ($marudatlines); + // チャンクとか + if (strpos ($firstline, 'Success') === false) { // 浪人(rokka)対応 + $secondline = array_shift ($marudatlines); + } } - } - $cont = ''; - foreach ($marudatlines as $aline) { - // チャンクエンコーディングが欲しいところ(HTTP 1.0でしのぐ) - if ($chunked) { - $cont .= $aline; - } else { + $cont = ''; + foreach ($marudatlines as $aline) { $cont .= $aline; } + if (FileCtl::file_write_contents ($this->keydat, $cont) === false) { + p2die ('cannot write file. downloadDat2chMaru()'); + } } - if (FileCtl::file_write_contents($this->keydat, $cont) === false) { - p2die('cannot write file. downloadDat2chMaru()'); - } - } - } else { - // dat.gzはなかったと判断 - fclose($fp); - return $this->_downloadDat2chMaruNotFound(); + return true; + } elseif ($code == '304') { + return '304 Not Modified'; + } else { + return $this->_downloadDat2chMaruNotFound ($code); + } + } catch (Exception $e) { + $this->getdat_error_msg_ht .= "

    サーバ接続エラー: " . $e->getMessage (); + $this->getdat_error_msg_ht .= "
    rep2 error: 板サーバへの接続に失敗しました。

    "; + $this->diedat = true; + return false; } - - fclose($fp); - //$this->isonline = true; - //$this->datochiok = 1; - return !$timed_out; } // }}} @@ -927,17 +623,16 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma = false) /** * ●IDでの取得ができなかったときに呼び出される */ - protected function _downloadDat2chMaruNotFound() - { + protected function _downloadDat2chMaruNotFound() { global $_conf; // 再チャレンジがまだなら、再チャレンジする。SIDが変更されてしまっている場合がある時のための自動チャレンジ。 - if (empty($_REQUEST['relogin2ch']) && empty($_REQUEST['shirokuma'])) { + if (empty ($_REQUEST['relogin2ch']) && empty ($_REQUEST['shirokuma'])) { $_REQUEST['relogin2ch'] = true; - return $this->downloadDat(); + return $this->downloadDat (); } else { - $remarutori_ht = $this->_generateMarutoriLink(true); - $moritori_ht = $this->_generateMoritapoDatLink(); + $remarutori_ht = $this->_generateMarutoriLink (true); + $moritori_ht = $this->_generateMoritapoDatLink (); $this->getdat_error_msg_ht .= "

    rep2 info: ●IDでのスレッド取得に失敗しました。{$remarutori_ht}{$moritori_ht}

    "; $this->diedat = true; return false; @@ -950,128 +645,61 @@ protected function _downloadDat2chMaruNotFound() /** * 2chの過去ログ倉庫からdat.gzをダウンロード&解凍する */ - protected function _downloadDat2chKako($uri, $ext) - { + protected function _downloadDat2chKako($uri, $ext) { global $_conf; - $url = $uri.$ext; - - $method = 'GET'; - - $purl = parse_url($url); // URL分解 - // クエリー - if (isset($purl['query'])) { - $purl['query'] = "?".$purl['query']; - } else { - $purl['query'] = ""; - } - - // プロキシ - if ($_conf['proxy_use']) { - $send_host = $_conf['proxy_host']; - $send_port = $_conf['proxy_port']; - $send_path = $url; - } else { - $send_host = $purl['host']; - $send_port = $purl['port']; - $send_path = $purl['path'].$purl['query']; - } - // デフォルトを80 - if (!$send_port) { - $send_port = 80; - } - - $request = "{$method} {$send_path} HTTP/1.0\r\n"; - $request .= "Host: {$purl['host']}\r\n"; - $request .= "User-Agent: Monazilla/1.00 ({$_conf['p2ua']})\r\n"; - $request .= "Connection: Close\r\n"; - //$request .= "Accept-Encoding: gzip\r\n"; - /* - if ($modified) { - $request .= "If-Modified-Since: $modified\r\n"; - } - */ - $request .= "\r\n"; - - // WEBサーバへ接続 - $fp = @fsockopen($send_host, $send_port, $errno, $errstr, $_conf['http_conn_timeout']); - if (!$fp) { - self::_pushInfoConnectFailed($url, $errno, $errstr); - return false; - } - stream_set_timeout($fp, $_conf['http_read_timeout'], 0); + $url = $uri . $ext; - fputs($fp, $request); + $purl = parse_url ($url); // URL分解 - $body = ''; - $code = null; - $is_gzip = false; - $start_here = false; - - // HTTPヘッダレスポンスを取得する - $h = $this->_freadHttpHeader($fp); - if ($h === false) { - fclose($fp); - $this->_pushInfoHtmlFreadHttpHeaderError($url); - $this->diedat = true; - return false; - } + try { + $req = new HTTP_Request2 ($url, HTTP_Request2::METHOD_GET); + // ヘッダ + $req->setHeader ('User-Agent', P2Util::getP2UA(true)); + $req->setHeader ('Accept-Encoding', "gzip, deflate"); + + $req->setConfig (array ( + 'connect_timeout' => $_conf['http_conn_timeout'], + 'timeout' => $_conf['http_read_timeout'], + 'follow_redirects' => false + )); + + // プロキシ + if ($_conf['proxy_use']) { + $req->setConfig (array ( + ‘proxy_host’ => $_conf['proxy_host'], + ‘proxy_port’ => $_conf['proxy_port'] + )); + } - // {{{ HTTPコードをチェック + // Requestの送信 + $response = $req->send (); - $code = $h['code']; + $code = $response->getStatus (); - if ($code == '200') { - ; - } elseif ($code == '304') { - fclose($fp); - //$this->isonline = true; - return '304 Not Modified'; - } else { - fclose($fp); - return $this->_downloadDat2chMaruNotFound(); - } + if ($code == '200' || $code == '206') { // Partial Content + $body = $response->getBody (); - if (isset($h['headers']['Content-Encoding'])) { - if (preg_match("/^(x-)?gzip/", $h['headers']['Content-Encoding'], $matches)) { - $isGzip = true; - } - } + $this->onbytes = intval ($response->getHeader ('Content-Length')); - if ($code == '200') { + $this->modified = $response->getHeader ('Last-Modified'); - while (!p2_stream_eof($fp, $timed_out)) { - $body .= fread($fp, 4096); - } - - if ($timed_out) { - self::_pushInfoReadTimedOut($url); - $this->diedat = true; - fclose($fp); - return false; - } - - if ($is_gzip) { - $body = self::_decodeGzip($body, $url); - if ($body === null) { - $this->diedat = true; - fclose($fp); - return false; + if (FileCtl::file_write_contents ($this->keydat, $body, $file_append) === false) { + p2die ('cannot write file. downloadDat2chMaru()'); } - } - if (FileCtl::file_write_contents($this->keydat, $body) === false) { - p2die('cannot write file. downloadDat2chKako()'); + return true; + } elseif ($code == '304') { + return '304 Not Modified'; + } else { + return $this->_downloadDat2chKakoNotFound ($uri, $ext); } - } else { - // なかったと判断 - fclose($fp); - return $this->_downloadDat2chKakoNotFound($uri, $ext); + } catch (Exception $e) { + $this->getdat_error_msg_ht .= "

    サーバ接続エラー: " . $e->getMessage (); + $this->getdat_error_msg_ht .= "
    rep2 error: 板サーバへの接続に失敗しました。

    "; + $this->diedat = true; + return false; } - - fclose($fp); - //$this->isonline = true; - return !$timed_out; } // }}} @@ -1080,16 +708,15 @@ protected function _downloadDat2chKako($uri, $ext) /** * 過去ログを取得できなかったときに呼び出される */ - protected function _downloadDat2chKakoNotFound($uri, $ext) - { + protected function _downloadDat2chKakoNotFound($uri, $ext) { global $_conf; if ($ext == ".dat.gz") { - //.dat.gzがなかったら.datでもう一度 - return $this->_downloadDat2chKako($uri, ".dat"); + // .dat.gzがなかったら.datでもう一度 + return $this->_downloadDat2chKako ($uri, ".dat"); } - if (!empty($_GET['kakolog'])) { - $kako_html_url = p2h($_GET['kakolog'] . '.html'); + if (! empty ($_GET['kakolog'])) { + $kako_html_url = p2h ($_GET['kakolog'] . '.html'); $kakolog_ht = "

    {$kako_html_url}

    "; } $this->getdat_error_msg_ht = "

    rep2 info: 2ちゃんねる過去ログ倉庫からのスレッド取り込みに失敗しました。

    "; @@ -1104,32 +731,31 @@ protected function _downloadDat2chKakoNotFound($uri, $ext) /** * 2chのdatを取得できなかった原因を返す * - * @return string エラーメッセージ(原因がわからない場合は空で返す) + * @return string エラーメッセージ(原因がわからない場合は空で返す) */ - public function get2chDatError($code = null) - { + public function get2chDatError($code = null) { global $_conf; // ホスト移転検出で変更したホストを元に戻す - if (!empty($this->old_host)) { + if (! empty ($this->old_host)) { $this->host = $this->old_host; $this->old_host = null; } $reason = null; if ($code == '302') { - $body203 = $this->_get2ch203Body(); - if ($body203 !== false && preg_match('/過去ログ ★/', $body203)) { + $body203 = $this->_get2ch203Body (); + if ($body203 !== false && preg_match ('/過去ログ ★/', $body203)) { $this->getdat_error_body = $body203; - if (preg_match('/このスレッドは過去ログ倉庫に格.{1,2}されています/', $body203)) { + if (preg_match ('/このスレッドは過去ログ倉庫に格.{1,2}されています/', $body203)) { $reason = 'datochi'; - $this->setDatochiResiduums(); - } elseif (preg_match('{http://[^/]+/[^/]+/kako/\\d+(/\\d+)?/(\\d+)\\.html}', $body203, $matches)) { + $this->setDatochiResiduums (); + } elseif (preg_match ('{http://[^/]+/[^/]+/kako/\\d+(/\\d+)?/(\\d+)\\.html}', $body203, $matches)) { $reason = 'kakohtml'; } } - } elseif (P2Util::isHost2chs($this->host) && $code == '404') { - //APIの為404だったら過去ログと決めつけとく(fix Here) + } elseif (P2Util::isHost2chs ($this->host) && $code == '404') { + // APIの為404だったら過去ログと決めつけとく(fix Here) $reason = 'datochi'; } @@ -1138,29 +764,49 @@ public function get2chDatError($code = null) // {{{ read.cgi からHTMLを取得 $read_response_html = ''; - if (!$reason) { - $wap_ua = new WapUserAgent(); - $wap_ua->setAgent($_conf['p2ua']); // ここは、"Monazilla/" をつけるとNG - $wap_ua->setTimeout($_conf['http_conn_timeout'], $_conf['http_read_timeout']); - $wap_req = new WapRequest(); - $wap_req->setUrl($read_url); - if ($_conf['proxy_use']) { - $wap_req->setProxy($_conf['proxy_host'], $_conf['proxy_port']); - } - $wap_res = $wap_ua->request($wap_req); - - $test403 = "/403\.dat/"; - if ($wap_res->code == 302 || preg_match( $test403, $wap_res->content, $test403)) { - $read_response_html = $wap_res->content; - } elseif ($wap_res->isError()) { - $url_t = P2Util::throughIme($wap_req->url); - $info_msg_ht = "

    Error: {$wap_res->code} {$wap_res->message}
    "; - $info_msg_ht .= "rep2 info: {$wap_req->url} に接続できませんでした。

    "; - P2Util::pushInfoHtml($info_msg_ht); - } else { - $read_response_html = $wap_res->content; + if (! $reason) { + try { + $req = new HTTP_Request2 ($read_url, HTTP_Request2::METHOD_GET); + // ヘッダ + $req->setHeader ('User-Agent', P2Util::getP2UA(false)); // ここは、"Monazilla/" をつけるとNG + $req->setHeader ('Accept-Encoding', "gzip, deflate"); + + $req->setConfig (array ( + 'connect_timeout' => $_conf['http_conn_timeout'], + 'timeout' => $_conf['http_read_timeout'], + 'follow_redirects' => false + )); + + // プロキシ + if ($_conf['proxy_use']) { + $req->setConfig (array ( + ‘proxy_host’ => $_conf['proxy_host'], + ‘proxy_port’ => $_conf['proxy_port'] + )); + } + + // Requestの送信 + $response = $req->send (); + + $res_code = $response->getStatus (); + + $test403 = "/403\.dat/"; + if ($res_code == '200' || $res_code == '206') { // Partial Content + $read_response_html = $response->getBody (); + } elseif ($res_code == '302' || preg_match ($test403, $response->getBody (), $test403)) { + $read_response_html = $response->getBody (); + } else { + $url_t = P2Util::throughIme ($read_url); + $info_msg_ht = "

    Error: {$code}
    "; + $info_msg_ht .= "rep2 info: {$read_url} に接続できませんでした。

    "; + P2Util::pushInfoHtml ($info_msg_ht); + } + } catch (Exception $e) { + $this->getdat_error_msg_ht .= "

    サーバ接続エラー: " . $e->getMessage (); + $this->getdat_error_msg_ht .= "
    rep2 error: 板サーバへの接続に失敗しました。

    "; + $this->diedat = true; } - unset($wap_ua, $wap_req, $wap_res); + unset ($req, $response); } // }}} @@ -1174,58 +820,51 @@ public function get2chDatError($code = null) $kakosoko_match2 = "/http:\/\/turing1000\.nttec\.com\/?(403|404|500)\.dat/"; $naidesu_match = "/そんな板orスレッドないです。<\/title>/"; - $error3939_match = "{<title>2ちゃんねる error 3939}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) + $error3939_match = "{2ちゃんねる error 3939}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) - // - // - //$kakohtml_match = "{}"; + // + // + // $kakohtml_match = "{}"; $kakohtml_match = "{/([^/]+/kako/\d+(/\d+)?/(\d+)).html\">}"; $waithtml_match = "/html化されるのを待っているようです。/"; $vip2ch_kakodat_match = "{/([^/]+/kako/\d+(/\d+)?/(\d+)).dat\">}"; // vip2ch.com用 - // // がこのスレッドは過去ログ倉庫に - // - if ($reason === 'datochi' || preg_match($kakosoko_match, $read_response_html, $matches) || preg_match($kakosoko_match2, $read_response_html, $matches)) { + if ($reason === 'datochi' || preg_match ($kakosoko_match, $read_response_html, $matches) || preg_match ($kakosoko_match2, $read_response_html, $matches)) { $dat_response_status = "このスレッドは過去ログ倉庫に格納されています。"; - $marutori_ht = $this->_generateMarutoriLink(); - $plugin_ht = $this->_generateWikiDatLink(); - $moritori_ht = $this->_generateMoritapoDatLink(); + $marutori_ht = $this->_generateMarutoriLink (); + $plugin_ht = $this->_generateWikiDatLink (); + $moritori_ht = $this->_generateMoritapoDatLink (); $dat_response_msg = "<p>2ch info - このスレッドは過去ログ倉庫に格納されています。{$marutori_ht}{$moritori_ht}{$plugin_ht}</p>"; - // // <title>がそんな板orスレッドないです。or error 3939 - // - } elseif ($reason === 'kakohtml' or preg_match($naidesu_match, $read_response_html, $matches) || preg_match($error3939_match, $read_response_html, $matches) ||preg_match($vip2ch_kakosoko_match, $read_response_html, $matches)) { + } elseif ($reason === 'kakohtml' or preg_match ($naidesu_match, $read_response_html, $matches) || preg_match ($error3939_match, $read_response_html, $matches) || preg_match ($vip2ch_kakosoko_match, $read_response_html, $matches)) { - if ($reason === 'kakohtml' or preg_match($kakohtml_match, $read_response_html, $matches)) { + if ($reason === 'kakohtml' or preg_match ($kakohtml_match, $read_response_html, $matches)) { if ($reason === 'kakohtml') { - preg_match('{/([^/]+/kako/\d+(/\d+)?/(\d+)).html}', $this->getdat_error_body, $matches); + preg_match ('{/([^/]+/kako/\d+(/\d+)?/(\d+)).html}', $this->getdat_error_body, $matches); } $dat_response_status = "隊長! 過去ログ倉庫で、html化されたスレッドを発見しました。"; $kakolog_uri = "http://{$this->host}/{$matches[1]}"; - $kakolog_url_en = rawurlencode($kakolog_uri); + $kakolog_url_en = rawurlencode ($kakolog_uri); $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; $dat_response_msg = "<p>2ch info - 隊長! 過去ログ倉庫で、<a href=\"{$kakolog_uri}.html\"{$_conf['bbs_win_target_at']}>スレッド {$matches[3]}.html</a> を発見しました。 [<a href=\"{$read_kako_url}\">rep2に取り込んで読む</a>]</p>"; - - } elseif (preg_match($waithtml_match, $read_response_html, $matches)) { + } elseif (preg_match ($waithtml_match, $read_response_html, $matches)) { $dat_response_status = "隊長! スレッドはhtml化されるのを待っているようです。"; - $marutori_ht = $this->_generateMarutoriLink(); - $moritori_ht = $this->_generateMoritapoDatLink(); + $marutori_ht = $this->_generateMarutoriLink (); + $moritori_ht = $this->_generateMoritapoDatLink (); $dat_response_msg = "<p>2ch info - 隊長! スレッドはhtml化されるのを待っているようです。{$marutori_ht}{$moritori_ht}</p>"; - - } elseif (preg_match($vip2ch_kakodat_match, $read_response_html, $matches)) { - $dat_response_status = "隊長! 過去ログ倉庫で、datを発見しました。"; - $kakolog_uri = "http://{$this->host}/{$matches[1]}"; - $kakolog_url_en = rawurlencode($kakolog_uri); - $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; - $dat_response_msg = "<p>2ch info - 隊長! 過去ログ倉庫で、<a href=\"{$kakolog_uri}.html\"{$_conf['bbs_win_target_at']}>スレッド {$this->key}.html</a> を発見しました。 [<a href=\"{$read_kako_url}\">rep2に取り込んで読む</a>]</p>"; - + } elseif (preg_match ($vip2ch_kakodat_match, $read_response_html, $matches)) { + $dat_response_status = "隊長! 過去ログ倉庫で、datを発見しました。"; + $kakolog_uri = "http://{$this->host}/{$matches[1]}"; + $kakolog_url_en = rawurlencode ($kakolog_uri); + $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; + $dat_response_msg = "<p>2ch info - 隊長! 過去ログ倉庫で、<a href=\"{$kakolog_uri}.html\"{$_conf['bbs_win_target_at']}>スレッド {$this->key}.html</a> を発見しました。 [<a href=\"{$read_kako_url}\">rep2に取り込んで読む</a>]</p>"; } else { - if (!empty($_GET['kakolog'])) { + if (! empty ($_GET['kakolog'])) { $dat_response_status = 'そんな板orスレッドないです。'; - $kako_html_url = p2h($_GET['kakolog'] . '.html'); - $kakolog_query = rawurlencode($_GET['kakolog']); + $kako_html_url = p2h ($_GET['kakolog'] . '.html'); + $kakolog_query = rawurlencode ($_GET['kakolog']); $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_query}&kakoget=1"; $dat_response_msg = '<p>2ch info - そんな板orスレッドないです。</p>'; $dat_response_msg .= "<p><a href=\"{$kako_html_url}\"{$_conf['bbs_win_target_at']}>{$kako_html_url}</a> [<a href=\"{$read_kako_url}\">rep2にログを取り込んで読む</a>]</p>"; @@ -1236,13 +875,12 @@ public function get2chDatError($code = null) } // 原因が分からない場合でも、とりあえず過去ログ取り込みのリンクを維持している。と思う。あまり覚えていない 2005/2/27 aki - } elseif (!empty($_GET['kakolog'])) { + } elseif (! empty ($_GET['kakolog'])) { $dat_response_status = ''; - $kako_html_url = p2h($_GET['kakolog'] . '.html'); - $kakolog_query = rawurlencode($_GET['kakolog']); + $kako_html_url = p2h ($_GET['kakolog'] . '.html'); + $kakolog_query = rawurlencode ($_GET['kakolog']); $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_query}&kakoget=1"; $dat_response_msg = "<p><a href=\"{$kako_html_url}\"{$_conf['bbs_win_target_at']}>{$kako_html_url}</a> [<a href=\"{$read_kako_url}\">rep2にログを取り込んで読む</a>]</p>"; - } // }}} @@ -1256,52 +894,53 @@ public function get2chDatError($code = null) /** * >>1のみをプレビューする */ - public function previewOne() - { + public function previewOne() { global $_conf; - if (!($this->host && $this->bbs && $this->key)) { return false; } + if (! ($this->host && $this->bbs && $this->key)) { + return false; + } - //通常と同じようにDATの取得を試みる。$_GET['one']がセットされていれば2ch互換は>>1だけ落とす - $this->downloadDat(); + // 通常と同じようにDATの取得を試みる。$_GET['one']がセットされていれば2ch互換は>>1だけ落とす + $this->downloadDat (); // ローカルdatから取得 - if (is_readable($this->keydat)) { - $fd = fopen($this->keydat, 'rb'); - $first_line = fgets($fd, 32800); + if (is_readable ($this->keydat)) { + $fd = fopen ($this->keydat, 'rb'); + $first_line = fgets ($fd, 32800); fclose ($fd); // be.2ch.net ならEUC→SJIS変換 - if (P2Util::isHostBe2chNet($this->host)) { - $first_line = mb_convert_encoding($first_line, 'CP932', 'CP51932'); + if (P2Util::isHostBe2chNet ($this->host)) { + $first_line = mb_convert_encoding ($first_line, 'CP932', 'CP51932'); } - $first_datline = rtrim($first_line); - if (strpos($first_datline, '<>') !== false) { + $first_datline = rtrim ($first_line); + if (strpos ($first_datline, '<>') !== false) { $datline_sepa = "<>"; } else { $datline_sepa = ','; $this->dat_type = '2ch_old'; } - $d = explode($datline_sepa, $first_datline); - $this->setTtitle($d[4]); + $d = explode ($datline_sepa, $first_datline); + $this->setTtitle ($d[4]); } - if (!$this->readnum) { + if (! $this->readnum) { $this->readnum = 1; } if ($_conf['ktai']) { - $aShowThread = new ShowThreadK($this); + $aShowThread = new ShowThreadK ($this); $aShowThread->am_autong = false; } else { - $aShowThread = new ShowThreadPc($this); + $aShowThread = new ShowThreadPc ($this); } $body = ''; $body .= "<div class=\"thread\">\n"; - $res = $aShowThread->transRes($first_line, 1); // 1を表示 - $body .= is_array($res) ? $res['body'] . $res['q'] : $res; + $res = $aShowThread->transRes ($first_line, 1); // 1を表示 + $body .= is_array ($res) ? $res['body'] . $res['q'] : $res; $body .= "</div>\n"; return $body; @@ -1313,26 +952,25 @@ public function previewOne() /** * >>1をプレビューでスレッドデータが見つからなかったときに呼び出される */ - public function previewOneNotFound($code = null) - { + public function previewOneNotFound($code = null) { global $_conf; $this->diedat = true; // 2ch, bbspink, vip2ch ならread.cgiで確認 - if (P2Util::isHost2chs($this->host) || P2Util::isHostVip2ch($this->host)) { - $this->getdat_error_msg_ht = $this->get2chDatError($code); - if (count($this->datochi_residuums)) { + if (P2Util::isHost2chs ($this->host) || P2Util::isHostVip2ch ($this->host)) { + $this->getdat_error_msg_ht = $this->get2chDatError ($code); + if (count ($this->datochi_residuums)) { if ($_conf['ktai']) { - $aShowThread = new ShowThreadK($this); + $aShowThread = new ShowThreadK ($this); $aShowThread->am_autong = false; } else { - $aShowThread = new ShowThreadPc($this); + $aShowThread = new ShowThreadPc ($this); } $this->onthefly = true; $body = "<div><span class=\"onthefly\">on the fly</span></div>\n"; $body .= "<div class=\"thread\">\n"; - $res = $aShowThread->transRes($this->datochi_residuums[1], 1); - $body .= is_array($res) ? $res['body'] . $res['q'] : $res; + $res = $aShowThread->transRes ($this->datochi_residuums[1], 1); + $body .= is_array ($res) ? $res['body'] . $res['q'] : $res; $body .= "</div>\n"; return $body; } @@ -1346,8 +984,7 @@ public function previewOneNotFound($code = null) /** * $lsを分解してstartとtoとnofirstを求める */ - public function lsToPoint() - { + public function lsToPoint() { global $_conf; $start = 1; @@ -1355,18 +992,18 @@ public function lsToPoint() $nofirst = false; // nを含んでいる場合は、>>1を表示しない($nofirst) - if (strpos($this->ls, 'n') !== false) { + if (strpos ($this->ls, 'n') !== false) { $nofirst = true; - $this->ls = str_replace('n', '', $this->ls); + $this->ls = str_replace ('n', '', $this->ls); } // 範囲指定で分割 - $n = explode('-', $this->ls); + $n = explode ('-', $this->ls); // 範囲指定がなければ - if (sizeof($n) == 1) { + if (sizeof ($n) == 1) { // l指定があれば - if (substr($n[0], 0, 1) === 'l') { - $ln = intval(substr($n[0], 1)); + if (substr ($n[0], 0, 1) === 'l') { + $ln = intval (substr ($n[0], 1)); if ($_conf['ktai']) { if ($ln > $_conf['mobile.rnum_range']) { $ln = $_conf['mobile.rnum_range']; @@ -1381,84 +1018,82 @@ public function lsToPoint() } elseif ($this->ls === 'all') { $start = 1; $to = $this->rescount; - } else { // レス番指定 - if (intval($this->ls) > 0) { - $this->ls = intval($this->ls); + if (intval ($this->ls) > 0) { + $this->ls = intval ($this->ls); $start = $this->ls; $to = $this->ls; $nofirst = true; - // 指定がない or 不正な場合は、allと同じ表示にする + // 指定がない or 不正な場合は、allと同じ表示にする } else { $start = 1; $to = $this->rescount; } } - // 範囲指定があれば + // 範囲指定があれば } else { - if (!$start = intval($n[0])) { + if (! $start = intval ($n[0])) { $start = 1; } - if (!$to = intval($n[1])) { + if (! $to = intval ($n[1])) { $to = $this->rescount; } } // 新着まとめ読みの表示数制限 - if (isset($GLOBALS['rnum_all_range']) and $GLOBALS['rnum_all_range'] > 0) { + if (isset ($GLOBALS['rnum_all_range']) and $GLOBALS['rnum_all_range'] > 0) { /* - ■携帯の新着まとめ読みが、ちょっきしで終わった時に、の「続きor更新」判定問題 - - リミット < スレの表示範囲 - 次リミットは 0 - スレの表示範囲を終える前にリミット数消化 - →続き - - リミット > スレの表示範囲 - 次リミットは + - リミット数が残っている間に、スレの表示範囲を終えた - →更新 - - リミット = スレの表示範囲 - 次リミットは 0 - スレの表示範囲丁度でリミットを消化した - →続き? 更新? - 続きの場合も更新の場合もある。逐次処理のため、 - 他のスレの残り新着数があるかどうかが不明で判定できない。 - */ + * ■携帯の新着まとめ読みが、ちょっきしで終わった時に、の「続きor更新」判定問題 + * + * リミット < スレの表示範囲 + * 次リミットは 0 + * スレの表示範囲を終える前にリミット数消化 + * →続き + * + * リミット > スレの表示範囲 + * 次リミットは + + * リミット数が残っている間に、スレの表示範囲を終えた + * →更新 + * + * リミット = スレの表示範囲 + * 次リミットは 0 + * スレの表示範囲丁度でリミットを消化した + * →続き? 更新? + * 続きの場合も更新の場合もある。逐次処理のため、 + * 他のスレの残り新着数があるかどうかが不明で判定できない。 + */ // リミットがスレの表示範囲より小さい場合は、スレの表示範囲をリミットに合わせる - $limit_to = $start + $GLOBALS['rnum_all_range'] -1; + $limit_to = $start + $GLOBALS['rnum_all_range'] - 1; if ($limit_to < $to) { $to = $limit_to; - // スレの表示範囲丁度でリミットを消化した場合 + // スレの表示範囲丁度でリミットを消化した場合 } elseif ($limit_to == $to) { $GLOBALS['limit_to_eq_to'] = true; } // 次のリミットは、今回のスレの表示範囲分を減らした数 - $GLOBALS['rnum_all_range'] = $GLOBALS['rnum_all_range'] - ($to - $start) -1; - - //print_r("$start, $to, {$GLOBALS['rnum_all_range']}"); + $GLOBALS['rnum_all_range'] = $GLOBALS['rnum_all_range'] - ($to - $start) - 1; + // print_r("$start, $to, {$GLOBALS['rnum_all_range']}"); } else { // 携帯用 if ($_conf['ktai']) { // 表示数制限 /* - if ($start + $_conf['mobile.rnum_range'] -1 <= $to) { - $to = $start + $_conf['mobile.rnum_range'] -1; - } - */ + * if ($start + $_conf['mobile.rnum_range'] -1 <= $to) { + * $to = $start + $_conf['mobile.rnum_range'] -1; + * } + */ // 次X件では、前一つを含み、実質+1となるので、1つおまけする if ($start + $_conf['mobile.rnum_range'] <= $to) { $to = $start + $_conf['mobile.rnum_range']; } - if (ResFilter::getWord() !== null) { + if (ResFilter::getWord () !== null) { $start = 1; $to = $this->rescount; $nofirst = false; @@ -1466,7 +1101,7 @@ public function lsToPoint() } } - $this->resrange = compact('start', 'to', 'nofirst'); + $this->resrange = compact ('start', 'to', 'nofirst'); return $this->resrange; } @@ -1477,22 +1112,21 @@ public function lsToPoint() * Datを読み込む * $this->datlines を set する */ - public function readDat() - { + public function readDat() { global $_conf; - if (file_exists($this->keydat)) { - if ($this->datlines = FileCtl::file_read_lines($this->keydat)) { + if (file_exists ($this->keydat)) { + if ($this->datlines = FileCtl::file_read_lines ($this->keydat)) { // be.2ch.net ならEUC→SJIS変換 // 念のためSJISとUTF-8も文字コード判定の候補に入れておく // ・・・が、文字化けしたタイトルのスレッドで誤判定があったので、指定しておく - if (P2Util::isHostBe2chNet($this->host)) { - //mb_convert_variables('CP932', 'CP51932,CP932,UTF-8', $this->datlines); - mb_convert_variables('CP932', 'CP51932', $this->datlines); + if (P2Util::isHostBe2chNet ($this->host)) { + // mb_convert_variables('CP932', 'CP51932,CP932,UTF-8', $this->datlines); + mb_convert_variables ('CP932', 'CP51932', $this->datlines); } - if (strpos($this->datlines[0], '<>') === false) { + if (strpos ($this->datlines[0], '<>') === false) { $this->dat_type = '2ch_old'; } } @@ -1500,12 +1134,10 @@ public function readDat() return false; } - $this->rescount = sizeof($this->datlines); + $this->rescount = sizeof ($this->datlines); - if ($_conf['flex_idpopup'] || $_conf['ngaborn_chain'] || $_conf['ngaborn_frequent'] || - ($_conf['ktai'] && ($_conf['mobile.clip_unique_id'] || $_conf['mobile.underline_id']))) - { - $this->_setIdCount(); + if ($_conf['flex_idpopup'] || $_conf['ngaborn_chain'] || $_conf['ngaborn_frequent'] || ($_conf['ktai'] && ($_conf['mobile.clip_unique_id'] || $_conf['mobile.underline_id']))) { + $this->_setIdCount (); } return true; @@ -1517,20 +1149,19 @@ public function readDat() /** * 一つのスレ内でのID出現数をセットする */ - protected function _setIdCount() - { - if (!$this->datlines) { + protected function _setIdCount() { + if (! $this->datlines) { return; } $i = 0; - $idp = array_fill(1, $this->rescount, null); - $ids = array_fill(1, $this->rescount, null); + $idp = array_fill (1, $this->rescount, null); + $ids = array_fill (1, $this->rescount, null); foreach ($this->datlines as $l) { - $lar = explode('<>', $l); - $i++; - if (preg_match('<(ID: ?| )([0-9A-Za-z/.+]{8,11})(?=[^0-9A-Za-z/.+]|$)>', $lar[2], $m)) { + $lar = explode ('<>', $l); + $i ++; + if (preg_match ('<(ID: ?| )([0-9A-Za-z/.+]{8,11})(?=[^0-9A-Za-z/.+]|$)>', $lar[2], $m)) { $idp[$i] = $m[1]; $ids[$i] = $m[2]; } @@ -1538,7 +1169,7 @@ protected function _setIdCount() $this->idp = $idp; $this->ids = $ids; - $this->idcount = array_count_values(array_filter($ids, 'is_string')); + $this->idcount = array_count_values (array_filter ($ids, 'is_string')); } // }}} @@ -1547,18 +1178,17 @@ protected function _setIdCount() /** * datlineをexplodeする */ - public function explodeDatLine($aline) - { - $aline = rtrim($aline); + public function explodeDatLine($aline) { + $aline = rtrim ($aline); if ($this->dat_type === '2ch_old') { - $parts = explode(',', $aline); + $parts = explode (',', $aline); } else { - $parts = explode('<>', $aline); + $parts = explode ('<>', $aline); } // iframe を削除。2chが正常化して必要なくなったらこのコードは外したい。2005/05/19 - $parts[3] = preg_replace('{<(iframe|script)( .*?)?>.*?</\\1>}i', '', $parts[3]); + $parts[3] = preg_replace ('{<(iframe|script)( .*?)?>.*?</\\1>}i', '', $parts[3]); return $parts; } @@ -1569,29 +1199,26 @@ public function explodeDatLine($aline) /** * datを走査してスレ立て時のホスト候補を検出する * - * @param void + * @param + * void * @return array */ - public function scanOriginalHosts() - { - if (P2Util::isHost2chs($this->host) && - file_exists($this->keydat) && - ($dat = file_get_contents($this->keydat))) - { - $bbs_re = preg_quote($this->bbs, '@'); + public function scanOriginalHosts() { + if (P2Util::isHost2chs ($this->host) && file_exists ($this->keydat) && ($dat = file_get_contents ($this->keydat))) { + $bbs_re = preg_quote ($this->bbs, '@'); $pattern = "@/(\\w+\\.(?:2ch\\.net|bbspink\\.com))(?:/test/read\\.cgi)?/{$bbs_re}\\b@"; - if (preg_match_all($pattern, $dat, $matches, PREG_PATTERN_ORDER)) { - $hosts = array_unique($matches[1]); - $arKey = array_search($this->host, $hosts); - if ($arKey !== false && array_key_exists($arKey, $hosts)) { - unset($hosts[$arKey]); + if (preg_match_all ($pattern, $dat, $matches, PREG_PATTERN_ORDER)) { + $hosts = array_unique ($matches[1]); + $arKey = array_search ($this->host, $hosts); + if ($arKey !== false && array_key_exists ($arKey, $hosts)) { + unset ($hosts[$arKey]); } return $hosts; } } - return array(); + return array (); } // }}} @@ -1600,18 +1227,16 @@ public function scanOriginalHosts() /** * デフォルトのdat取得失敗エラーメッセージHTMLを取得する * - * @param void + * @param + * void * @return string */ - public function getDefaultGetDatErrorMessageHTML() - { + public function getDefaultGetDatErrorMessageHTML() { global $_conf; $diedat_msg = '<p><b>rep2 info: 板サーバから最新のスレッド情報を取得できませんでした。</b>'; - if ($hosts = $this->scanOriginalHosts()) { - $common_q = '&bbs=' . rawurldecode($this->bbs) - . '&key=' . rawurldecode($this->key) - . '&ls=' . rawurldecode($this->ls); + if ($hosts = $this->scanOriginalHosts ()) { + $common_q = '&bbs=' . rawurldecode ($this->bbs) . '&key=' . rawurldecode ($this->key) . '&ls=' . rawurldecode ($this->ls); $diedat_msg .= '<br>datから他のホスト候補を検出しました。'; foreach ($hosts as $host) { $diedat_msg .= " [<a href=\"{$_conf['read_php']}?host={$host}{$common_q}{$_conf['k_at_a']}\">{$host}</a>]"; @@ -1628,21 +1253,16 @@ public function getDefaultGetDatErrorMessageHTML() /** * 公式p2で(dat取得権限がない場合はモリタポを消費して)datを取得するためのリンクを生成する。 * - * @param void + * @param + * void * @return string */ - protected function _generateMoritapoDatLink() - { + protected function _generateMoritapoDatLink() { global $_conf; if ($_conf['p2_2ch_mail'] && $_conf['p2_2ch_pass']) { - $csrfid = $this->_getCsrfIdForMoritapoDat(); - $query = p2h('host=' . rawurlencode($this->host) - . '&bbs=' . rawurlencode($this->bbs) - . '&key=' . rawurlencode($this->key) - . '&ls=' . rawurlencode($this->ls) - . '&moritapodat=true' - . '&csrfid=' . rawurlencode($csrfid)); + $csrfid = $this->_getCsrfIdForMoritapoDat (); + $query = p2h ('host=' . rawurlencode ($this->host) . '&bbs=' . rawurlencode ($this->bbs) . '&key=' . rawurlencode ($this->key) . '&ls=' . rawurlencode ($this->ls) . '&moritapodat=true' . '&csrfid=' . rawurlencode ($csrfid)); return " [<a href=\"{$_conf['read_php']}?{$query}{$_conf['k_at_a']}\">モリタポでrep2に取り込む</a>]"; } else { return ''; @@ -1655,67 +1275,67 @@ protected function _generateMoritapoDatLink() /** * 公式p2で(dat取得権限がない場合はモリタポを消費して)datを取得する * - * @param void + * @param + * void * @return bool */ - protected function _downloadDat2chMoritapo() - { - global $_conf; + protected function _downloadDat2chMoritapo() { + global $_conf; // datをダウンロード try { - $client = P2Util::getP2Client(); - $body = $client->downloadDat($this->host, $this->bbs, $this->key, $response); + $client = P2Util::getP2Client (); + $body = $client->downloadDat ($this->host, $this->bbs, $this->key, $response); // DEBUG /* - $GLOBALS['_downloadDat2chMoritapo_response_dump'] = '<pre>' . p2h(print_r($response, true)) . '</pre>'; - register_shutdown_function(create_function('', 'echo $GLOBALS[\'_downloadDat2chMoritapo_response_dump\'];')); - */ + * $GLOBALS['_downloadDat2chMoritapo_response_dump'] = '<pre>' . p2h(print_r($response, true)) . '</pre>'; + * register_shutdown_function(create_function('', 'echo $GLOBALS[\'_downloadDat2chMoritapo_response_dump\'];')); + */ } catch (P2Exception $e) { - p2die($e->getMessage()); + p2die ($e->getMessage ()); } // データ検証その1 - if (!$body || (strpos($body, '<>') === false && strpos($body, ',') === false)) { - return $this->_downloadDat2chMoritapoNotFound(); + if (! $body || (strpos ($body, '<>') === false && strpos ($body, ',') === false)) { + return $this->_downloadDat2chMoritapoNotFound (); } // 改行位置を検出 - $posCR = strpos($body, "\r"); - $posLF = strpos($body, "\n"); + $posCR = strpos ($body, "\r"); + $posLF = strpos ($body, "\n"); if ($posCR === false && $posLF === false) { - $pos = strlen($body); + $pos = strlen ($body); } elseif ($posCR === false) { $pos = $posLF; } elseif ($posLF === false) { $pos = $posCR; } else { - $pos = min($posLF, $posCR); + $pos = min ($posLF, $posCR); } // 1行目の取得とデータ検証その2 - $firstLine = rtrim(substr($body, 0, $pos)); - if (strpos($firstLine, '<>') !== false) { + $firstLine = rtrim (substr ($body, 0, $pos)); + if (strpos ($firstLine, '<>') !== false) { $this->dat_type = '2ch'; - } elseif (strpos($firstLine, ',') !== false) { + } elseif (strpos ($firstLine, ',') !== false) { $this->dat_type = '2ch_old'; } else { - return $this->_downloadDat2chMoritapoNotFound(); + return $this->_downloadDat2chMoritapoNotFound (); } // データ検証その3 (タイトル = $ar[4]) - $ar = $this->explodeDatLine($firstLine); - if (count($ar) < 5) { - return $this->_downloadDat2chMoritapoNotFound(); + $ar = $this->explodeDatLine ($firstLine); + if (count ($ar) < 5) { + return $this->_downloadDat2chMoritapoNotFound (); } // ローカルdatに書き込み - if (FileCtl::file_write_contents($this->keydat, $body) === false) { - p2die('cannot write file. downloadDat2chMoritapo()'); + if (FileCtl::file_write_contents ($this->keydat, $body) === false) { + p2die ('cannot write file. downloadDat2chMoritapo()'); } return true; - } + } // }}} // {{{ _downloadDat2chMoritapoNotFound() @@ -1723,29 +1343,29 @@ protected function _downloadDat2chMoritapo() /** * モリタポでの取得ができなかったときに呼び出される * - * @param void + * @param + * void * @return bool */ - protected function _downloadDat2chMoritapoNotFound() - { + protected function _downloadDat2chMoritapoNotFound() { global $_conf; - $csrfid = $this->_getCsrfIdForMoritapoDat(); + $csrfid = $this->_getCsrfIdForMoritapoDat (); - $host_en = rawurlencode($this->host); - $bbs_en = rawurlencode($this->bbs); - $key_en = rawurlencode($this->key); - $ls_en = rawurlencode($this->ls); + $host_en = rawurlencode ($this->host); + $bbs_en = rawurlencode ($this->bbs); + $key_en = rawurlencode ($this->key); + $ls_en = rawurlencode ($this->ls); - $host_ht = p2h($this->host); - $bbs_ht = p2h($this->bbs); - $key_ht = p2h($this->key); - $ls_ht = p2h($this->ls); + $host_ht = p2h ($this->host); + $bbs_ht = p2h ($this->bbs); + $key_ht = p2h ($this->key); + $ls_ht = p2h ($this->ls); - $query_ht = p2h("host={$host_en}&bbs={$bbs_en}&key={$key_en}&ls={$ls_en}&maru=true"); - $marutori_ht = $this->_generateMarutoriLink(); + $query_ht = p2h ("host={$host_en}&bbs={$bbs_en}&key={$key_en}&ls={$ls_en}&maru=true"); + $marutori_ht = $this->_generateMarutoriLink (); - if ($hosts = $this->scanOriginalHosts()) { + if ($hosts = $this->scanOriginalHosts ()) { $hostlist_ht = '<br>datから他のホスト候補を検出しました。'; foreach ($hosts as $host) { $hostlist_ht .= " [<a href=\"#\" onclick=\"this.parentNode.elements['host'].value='{$host}';return false;\">{$host}</a>]"; @@ -1780,62 +1400,12 @@ protected function _downloadDat2chMoritapoNotFound() /** * 公式p2からdatを取得する際に使うCSRF防止トークンを生成する * - * @param void + * @param + * void * @return string */ - protected function _getCsrfIdForMoritapoDat() - { - return P2Util::getCsrfId('moritapodat' . $this->host . $this->bbs . $this->key); - } - - // }}} - // {{{ _decodeGzip() - - /** - * Gzip圧縮されたレスポンスボディをデコードする - * - * @param string $body - * @param string $caller - * @return string - */ - static protected function _decodeGzip($body, $url) - { - global $_conf; - - if (function_exists('http_inflate')) { - // pecl_http の http_inflate() で展開 - $body = http_inflate($body); - } else { - // gzip tempファイルに保存・PHPで解凍読み込み - if (!is_dir($_conf['tmp_dir'])) { - FileCtl::mkdirRecursive($_conf['tmp_dir']); - } - - $gztempfile = tempnam($_conf['tmp_dir'], 'gz_'); - if (false === $gztempfile) { - p2die('一時ファイルを作成できませんでした。'); - } - - if (false === file_put_contents($gztempfile, $body)) { - unlink($gztempfile); - p2die('一時ファイルに書き込めませんでした。'); - } - - $body = file_get_contents('compress.zlib://' . $gztempfile); - if (false === $body) { - $body = null; - } - - unlink($gztempfile); - } - - if (is_null($body)) { - $summary = 'gzip展開エラー'; - $description = self::_urlToAnchor($url) . ' をgzipデコードできませんでした。'; - self::_pushInfoMessage($summary, $description); - } - - return $body; + protected function _getCsrfIdForMoritapoDat() { + return P2Util::getCsrfId ('moritapodat' . $this->host . $this->bbs . $this->key); } // }}} @@ -1844,50 +1414,45 @@ static protected function _decodeGzip($body, $url) /** * 情報メッセージをプッシュする * - * @param string $summary - * @param string $description - * @return void + * @param string $summary + * @param string $description + * @return void */ - static protected function _pushInfoMessage($summary, $description) - { + static protected function _pushInfoMessage($summary, $description) { $message = '<p class="info-msg">' . $summary . '<br>rep2 info: ' . $description . '</p>'; - P2Util::pushInfoHtml($message); + P2Util::pushInfoHtml ($message); } - // }}} // {{{ _pushInfoConnectFailed() /** * 接続に失敗した旨のメッセージをプッシュする * - * @param string $url - * @param int $errno - * @param string $errstr - * @return void + * @param string $url + * @param int $errno + * @param string $errstr + * @return void */ - static protected function _pushInfoConnectFailed($url, $errno, $errstr) - { - $summary = sprintf('HTTP接続エラー (%d) %s', $errno, $errstr); - $description = self::_urlToAnchor($url) . ' に接続できませんでした。'; - self::_pushInfoMessage($summary, $description); + static protected function _pushInfoConnectFailed($url, $errno, $errstr) { + $summary = sprintf ('HTTP接続エラー (%d) %s', $errno, $errstr); + $description = self::_urlToAnchor ($url) . ' に接続できませんでした。'; + self::_pushInfoMessage ($summary, $description); } - // }}} // {{{ _pushInfoReadTimedOut() /** * 読み込みがタイムアウトした旨のメッセージをプッシュする * - * @param string $url - * @return void + * @param string $url + * @return void */ - static protected function _pushInfoReadTimedOut($url) - { + static protected function _pushInfoReadTimedOut($url) { $summary = 'HTTP接続タイムアウト'; - $description = self::_urlToAnchor($url) . ' を読み込み完了できませんでした。'; - self::_pushInfoMessage($summary, $description); + $description = self::_urlToAnchor ($url) . ' を読み込み完了できませんでした。'; + self::_pushInfoMessage ($summary, $description); } // }}} @@ -1896,16 +1461,15 @@ static protected function _pushInfoReadTimedOut($url) /** * HTTPエラーのメッセージをプッシュする * - * @param string $url - * @param int $errno - * @param string $errstr + * @param string $url + * @param int $errno + * @param string $errstr * @return void */ - static protected function _pushInfoHttpError($url, $errno, $errstr) - { - $summary = sprintf('HTTP %d %s', $errno, $errstr); - $description = self::_urlToAnchor($url) . ' を読み込めませんでした。'; - self::_pushInfoMessage($summary, $description); + static protected function _pushInfoHttpError($url, $errno, $errstr) { + $summary = sprintf ('HTTP %d %s', $errno, $errstr); + $description = self::_urlToAnchor ($url) . ' を読み込めませんでした。'; + self::_pushInfoMessage ($summary, $description); } // }}} @@ -1914,17 +1478,13 @@ static protected function _pushInfoHttpError($url, $errno, $errstr) /** * _pushInfo系メソッド用にURLをアンカーに変換する * - * @param string $url - * @return string + * @param string $url + * @return string */ - static protected function _urlToAnchor($url) - { + static protected function _urlToAnchor($url) { global $_conf; - return sprintf('<a href="%s"%s>%s</a>', - P2Util::throughIme($url), - $_conf['ext_win_target_at'], - p2h($url)); + return sprintf ('<a href="%s"%s>%s</a>', P2Util::throughIme ($url), $_conf['ext_win_target_at'], p2h ($url)); } // }}} @@ -1941,30 +1501,32 @@ private function _get2ch203Body() { // 仕様の確証が取れていないので、このような判断でよいのかはっきりしない。 // 203 Non-Authoritative Information // 過去ログ ★ - /* - 名無し募集中。。。<><>2007/06/10(日) 13:29:51.68 0<> http://mlb.yahoo.co.jp/headlines/?a=2279 <br> くわわ>>>>>>>>>>>>>>>>>>>>>井川 <>★くわわメジャー昇格おめ 売上議論14001★ - 1001, 131428 (総レス数, サイズ)<><>1181480550000000 (最終更新)<><div style="color:navy;font-size:smaller;">|<br />| 中略<br />|</div><> - 1001<><>Over 1000 Thread<> このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <> - 過去ログ ★<><>[過去ログ]<><div style="color:red;text-align:center;">■ このスレッドは過去ログ倉庫に格納されています</div><hr /><br />IE等普通のブラウザで見る場合 http://tubo.80.kg/tubo_and_maru.html<br />専用のブラウザで見る場合 http://www.monazilla.org/<br /><br />2ちゃんねる Viewer を使うと、すぐに読めます。 http://2ch.tora3.net/<br /><div style="color:navy;">この Viewer(通称●) の売上で、2ちゃんねるは設備を増強しています。<br />●が売れたら、新しいサーバを投入できるという事です。</div><br />よくわからない場合はソフトウェア板へGo http://pc11.2ch.net/software/<br /><br />モリタポ ( http://find.2ch.net/faq/faq2.php#c1 ) を持っていれば、50モリタポで表示できます。<br />    こちらから → http://find.2ch.net/index.php?STR=dat:http://ex23.2ch.net/test/read.cgi/morningcoffee/1181449791/<br /><br /><hr /><> - */ - $params = array(); - $params['timeout'] = $_conf['fsockopen_time_limit']; - if ($_conf['proxy_use']) { - $params['proxy_host'] = $_conf['proxy_host']; - $params['proxy_port'] = $_conf['proxy_port']; - } - $url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; - $req = new HTTP_Request($url, $params); - $req->setMethod('GET'); - $err = $req->sendRequest(true); + /* + * 名無し募集中。。。<><>2007/06/10(日) 13:29:51.68 0<> http://mlb.yahoo.co.jp/headlines/?a=2279 <br> くわわ>>>>>>>>>>>>>>>>>>>>>井川 <>★くわわメジャー昇格おめ 売上議論14001★ + * 1001, 131428 (総レス数, サイズ)<><>1181480550000000 (最終更新)<><div style="color:navy;font-size:smaller;">|<br />| 中略<br />|</div><> + * 1001<><>Over 1000 Thread<> このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <> + * 過去ログ ★<><>[過去ログ]<><div style="color:red;text-align:center;">■ このスレッドは過去ログ倉庫に格納されています</div><hr /><br />IE等普通のブラウザで見る場合 http://tubo.80.kg/tubo_and_maru.html<br />専用のブラウザで見る場合 http://www.monazilla.org/<br /><br />2ちゃんねる Viewer を使うと、すぐに読めます。 http://2ch.tora3.net/<br /><div style="color:navy;">この Viewer(通称●) の売上で、2ちゃんねるは設備を増強しています。<br />●が売れたら、新しいサーバを投入できるという事です。</div><br />よくわからない場合はソフトウェア板へGo http://pc11.2ch.net/software/<br /><br />モリタポ ( http://find.2ch.net/faq/faq2.php#c1 ) を持っていれば、50モリタポで表示できます。<br />    こちらから → http://find.2ch.net/index.php?STR=dat:http://ex23.2ch.net/test/read.cgi/morningcoffee/1181449791/<br /><br /><hr /><> + */ + try { + $params = array (); + $params['timeout'] = $_conf['fsockopen_time_limit']; + if ($_conf['proxy_use']) { + $params['proxy_host'] = $_conf['proxy_host']; + $params['proxy_port'] = $_conf['proxy_port']; + } + $url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; + $req = new HTTP_Request2 ($url,HTTP_Request2::METHOD_GET, $params); + $res = $req->send (); - if (!PEAR::isError($err)) { // レスポンスコードを検証 - if ('203' == $req->getResponseCode()) { - return $req->getResponseBody(); + if ('203' == $res->getStatus ()) { + return $res->getBody (); } + + return false; + } catch (Exception $exp) { + return false; } - return false; } // }}} @@ -1975,43 +1537,42 @@ private function _get2ch203Body() { * 保存する(レス番 => datline の配列) * $this->getdat_error_bodyの内容から構築. * - * @return boolean 正常に終了した場合はtrue + * @return boolean 正常に終了した場合はtrue */ - private function setDatochiResiduums() - { - $this->datochi_residuums = array(); - if (!$this->getdat_error_body || strlen($this->getdat_error_body) === 0) { + private function setDatochiResiduums() { + $this->datochi_residuums = array (); + if (! $this->getdat_error_body || strlen ($this->getdat_error_body) === 0) { return false; } - $lines = explode("\n", $this->getdat_error_body); - if (count($lines) < 3) { + $lines = explode ("\n", $this->getdat_error_body); + if (count ($lines) < 3) { return false; } $first_line = $lines[0]; - $first_datline = rtrim($first_line); - if (strpos($first_datline, '<>') !== false) { + $first_datline = rtrim ($first_line); + if (strpos ($first_datline, '<>') !== false) { $datline_sepa = '<>'; } else { $datline_sepa = ','; $this->dat_type = '2ch_old'; } - $d = explode($datline_sepa, $first_datline); - $this->setTtitle($d[4]); + $d = explode ($datline_sepa, $first_datline); + $this->setTtitle ($d[4]); $this->datochi_residuums[1] = $first_line; $second_line = $lines[1]; - if (strpos($second_line, '<>') === false) { + if (strpos ($second_line, '<>') === false) { return false; } - $d = explode('<>', $second_line); - if (count($d) < 1) { + $d = explode ('<>', $second_line); + if (count ($d) < 1) { return false; } - list($lastn, $size) = explode(',', $d[0]); - $lastn = intval(trim($lastn)); - if (!$lastn) { + list ($lastn, $size) = explode (',', $d[0]); + $lastn = intval (trim ($lastn)); + if (! $lastn) { return false; } @@ -2025,22 +1586,22 @@ private function setDatochiResiduums() /** * +WikiのDAT取得プラグインでdatを取得するためのリンクを生成する。 * - * @param void + * @param + * void * @return string */ - protected function _generateWikiDatLink() - { + protected function _generateWikiDatLink() { global $_conf; // +Wiki if ($_GET['plugin']) { - $datPlugin = new DatPluginCtl(); - $datPlugin->load(); - foreach ($datPlugin->getData() as $v){ - if (preg_match('{'. $v['match'] . '}', $read_url)) { - $replace = @preg_replace('{'. $v['match'] . '}', $v['replace'], $read_url); - $code = P2UtilWiki::getResponseCode($replace); - if($code == 200) { + $datPlugin = new DatPluginCtl (); + $datPlugin->load (); + foreach ($datPlugin->getData () as $v) { + if (preg_match ('{' . $v['match'] . '}', $read_url)) { + $replace = @preg_replace ('{' . $v['match'] . '}', $v['replace'], $read_url); + $code = P2UtilWiki::getResponseCode ($replace); + if ($code == 200) { $code = '○' . $code; } else { $code = '×' . $code; @@ -2049,7 +1610,7 @@ protected function _generateWikiDatLink() } } if ($plugin_ht) { - $plugin_ht = '<select size=1 name="kakolog">'. $plugin_ht . '</select>'; + $plugin_ht = '<select size=1 name="kakolog">' . $plugin_ht . '</select>'; } else { $plugin_ht = '<input type="text" name="kakolog" size="64">'; } @@ -2077,11 +1638,11 @@ protected function _generateWikiDatLink() /** * ●とofflawでdatを取得するためのリンクを生成する。 * - * @param bool $retry - * @return string HTML + * @param bool $retry + * @return string HTML */ protected function _generateMarutoriLink($retry = false) { - if($retry) { + if ($retry) { $retry_q = "&relogin2ch=true"; $atext = "●IDで再取得する"; } else { From 85ff3e6b649aa8a03845c1cf0ea44803d3bffd36 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 30 Mar 2015 12:52:22 +0900 Subject: [PATCH 096/339] =?UTF-8?q?HTTP=5FRequest2=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=E3=81=97=E3=81=9F=E9=83=A8=E5=88=86=E3=82=92=E8=AA=8D?= =?UTF-8?q?=E8=A8=BC=E4=BB=98=E3=83=97=E3=83=AD=E3=82=AD=E3=82=B7=E3=81=AB?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=E3=81=95=E3=81=9B=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- conf/conf_user_def.inc.php | 6 ++++ lib/P2Util.php | 8 +++-- lib/ThreadRead.php | 64 ++++++++++++++++++++++---------------- lib/auth2chapi.inc.php | 8 +++-- lib/login2ch.inc.php | 8 +++-- rep2/dig2ch.php | 8 +++-- rep2/edit_conf_user.php | 21 ++++++++----- rep2/post.php | 6 ++-- 9 files changed, 83 insertions(+), 48 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 69dff7c1e..180943746 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150326.1020', // rep2のバージョン + 'p2version' => '150330.1220', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index f7039b4bf..7df8aacdf 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -534,6 +534,12 @@ // プロキシポート ex)"8080" $conf_user_def['proxy_port'] = ""; // ("") +// プロキシユーザー名 (使用する場合のみ) +$conf_user_def['proxy_user'] = ""; // ("") + +// プロキシパスワード (使用する場合のみ) +$conf_user_def['proxy_password'] = ""; // ("") + // フレーム左 板メニュー の表示幅 $conf_user_def['frame_menu_width'] = "158"; // ("158") diff --git a/lib/P2Util.php b/lib/P2Util.php index 1f2cf44ac..73d368eb7 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -275,9 +275,11 @@ static public function fileDownload($url, $localfile, )); if ($_conf['proxy_use']) { - $req->setConfig(array( - ‘proxy_host’ => $_conf['proxy_host'], - ‘proxy_port’ => $_conf['proxy_port'], + $req->setConfig (array ( + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] )); } diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 215c31075..da5f7515e 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -179,7 +179,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { // >>1プレビューの時はサーバーに最初の部分だけ請求 $req->setHeader ('Range', "bytes=0-8192"); } elseif (! $zero_read) { - $req->setHeader ('Range', "bytes=" . $from_bytes); + $req->setHeader ('Range', sprintf ('bytes=%d-', $from_bytes) ); } if ($this->modified) { @@ -200,8 +200,10 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { // プロキシ if ($_conf['proxy_use']) { $req->setConfig (array ( - ‘proxy_host’ => $_conf['proxy_host'], - ‘proxy_port’ => $_conf['proxy_port'] + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] )); } @@ -317,9 +319,6 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { return $this->_downloadDat2chNotFound ($code); } - if ($response->getHeader ('Location')) { - $post_seikou = true; - } } catch (Exception $e) { $this->getdat_error_msg_ht .= "<p>サーバ接続エラー: " . $e->getMessage (); $this->getdat_error_msg_ht .= "<br>rep2 error: 板サーバへの接続に失敗しました。</p>"; @@ -375,7 +374,7 @@ protected function _downloadDat2ch($from_bytes) { // >>1プレビューの時はサーバーに最初の部分だけ請求 $req->setHeader ('Range', "bytes=0-8192"); } elseif (! $zero_read) { - $req->setHeader ('Range', "bytes=" . $from_bytes); + $req->setHeader ('Range', sprintf ('bytes=%d-', $from_bytes) ); } if ($this->modified) { @@ -396,8 +395,10 @@ protected function _downloadDat2ch($from_bytes) { // プロキシ if ($_conf['proxy_use']) { $req->setConfig (array ( - ‘proxy_host’ => $_conf['proxy_host'], - ‘proxy_port’ => $_conf['proxy_port'] + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] )); } @@ -423,12 +424,12 @@ protected function _downloadDat2ch($from_bytes) { $this->modified = $response->getHeader ('Last-Modified'); - // 1行目を切り出す - $posLF = mb_strpos ($body, "\n"); - $firstmsg = mb_substr ($body, 0, $posLF === false ? mb_strlen ($body) : $posLF); - // ホストが2chの時にDATを利用できない旨のメッセージが出たらエラーとする(DAT破損対策) if (P2Util::isHost2chs ($this->host)) { + // 1行目を切り出す + $posLF = mb_strpos ($body, "\n"); + $firstmsg = mb_substr ($body, 0, $posLF === false ? mb_strlen ($body) : $posLF); + if (mb_strpos ($firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2") === 0) { $this->getdat_error_msg_ht .= "<p>rep2 error: API経由でのスレッド取得に失敗しました。<br />rep2 info: スレッドが存在しないか過去ログに格納されています。</p>"; $marutori_ht = $this->_generateMarutoriLink (); @@ -564,8 +565,10 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma = false) { // プロキシ if ($_conf['proxy_use']) { $req->setConfig (array ( - ‘proxy_host’ => $_conf['proxy_host'], - ‘proxy_port’ => $_conf['proxy_port'] + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] )); } @@ -667,8 +670,10 @@ protected function _downloadDat2chKako($uri, $ext) { // プロキシ if ($_conf['proxy_use']) { $req->setConfig (array ( - ‘proxy_host’ => $_conf['proxy_host'], - ‘proxy_port’ => $_conf['proxy_port'] + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] )); } @@ -780,8 +785,10 @@ public function get2chDatError($code = null) { // プロキシ if ($_conf['proxy_use']) { $req->setConfig (array ( - ‘proxy_host’ => $_conf['proxy_host'], - ‘proxy_port’ => $_conf['proxy_port'] + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] )); } @@ -1508,14 +1515,19 @@ private function _get2ch203Body() { * 過去ログ ★<><>[過去ログ]<><div style="color:red;text-align:center;">■ このスレッドは過去ログ倉庫に格納されています</div><hr /><br />IE等普通のブラウザで見る場合 http://tubo.80.kg/tubo_and_maru.html<br />専用のブラウザで見る場合 http://www.monazilla.org/<br /><br />2ちゃんねる Viewer を使うと、すぐに読めます。 http://2ch.tora3.net/<br /><div style="color:navy;">この Viewer(通称●) の売上で、2ちゃんねるは設備を増強しています。<br />●が売れたら、新しいサーバを投入できるという事です。</div><br />よくわからない場合はソフトウェア板へGo http://pc11.2ch.net/software/<br /><br />モリタポ ( http://find.2ch.net/faq/faq2.php#c1 ) を持っていれば、50モリタポで表示できます。<br />    こちらから → http://find.2ch.net/index.php?STR=dat:http://ex23.2ch.net/test/read.cgi/morningcoffee/1181449791/<br /><br /><hr /><> */ try { - $params = array (); - $params['timeout'] = $_conf['fsockopen_time_limit']; - if ($_conf['proxy_use']) { - $params['proxy_host'] = $_conf['proxy_host']; - $params['proxy_port'] = $_conf['proxy_port']; - } $url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; - $req = new HTTP_Request2 ($url,HTTP_Request2::METHOD_GET, $params); + $req = new HTTP_Request2 ($url,HTTP_Request2::METHOD_GET); + + // プロキシ + if ($_conf['proxy_use']) { + $req->setConfig (array ( + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] + )); + } + $res = $req->send (); // レスポンスコードを検証 diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index 479f614a5..3e0d86916 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -41,9 +41,11 @@ function authenticate_2chapi() $req->setAdapter($_conf['ssl_function']); // プロキシ if ($_conf['proxy_use']) { - $req->setConfig(array( - ‘proxy_host’ => $_conf['proxy_host'], - ‘proxy_port’ => $_conf['proxy_port'], + $req->setConfig (array ( + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] )); } $req->addPostParameter('ID', $login2chID); diff --git a/lib/login2ch.inc.php b/lib/login2ch.inc.php index 74054782e..92606e86d 100644 --- a/lib/login2ch.inc.php +++ b/lib/login2ch.inc.php @@ -44,9 +44,11 @@ function login2ch() $req->setAdapter($_conf['ssl_function']); // プロキシ if ($_conf['proxy_use']) { - $req->setConfig(array( - ‘proxy_host’ => $_conf['proxy_host'], - ‘proxy_port’ => $_conf['proxy_port'], + $req->setConfig (array ( + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] )); } $req->addPostParameter('ID', $login2chID); diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php index 59c66e819..f48ae6ca2 100644 --- a/rep2/dig2ch.php +++ b/rep2/dig2ch.php @@ -21,9 +21,11 @@ function dig2chsearch($query) )); if ($_conf['proxy_use']) { - $req->setConfig(array( - ‘proxy_host’ => $_conf['proxy_host'], - ‘proxy_port’ => $_conf['proxy_port'], + $req->setConfig (array ( + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] )); } diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index 4eb605f21..da8df807c 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -229,7 +229,7 @@ $conflist = array( 'be', array('be_2ch_mail', 'be.2ch.netの登録メールアドレス', P2_EDIT_CONF_USER_LONGTEXT), - array('be_2ch_password', '<a href="http://be.2ch.net/" target="_blank">be.2ch.net</a>のパスワード(認証コードは使えなくなりました)', P2_EDIT_CONF_USER_LONGTEXT), + array('be_2ch_password', '<a href="http://be.2ch.net/" target="_blank">be.2ch.net</a>のパスワード(認証コードは使えなくなりました)', P2_EDIT_CONF_USER_PASSWORD), array('be_2ch_DMDM', '<a href="http://be.2ch.net/" target="_blank">be.2ch.net</a>のDMDM(手動設定する場合のみ入力)', P2_EDIT_CONF_USER_LONGTEXT), array('be_2ch_MDMD', '<a href="http://be.2ch.net/" target="_blank">be.2ch.net</a>のMDMD(手動設定する場合のみ入力)', P2_EDIT_CONF_USER_LONGTEXT), '公式p2', @@ -402,11 +402,12 @@ $keep_old = true; } else { $conflist = array( + '3ペイン画面', array('frame_menu_width', 'フレーム左 板メニュー の表示幅'), array('frame_subject_width', 'フレーム右上 スレ一覧 の表示幅'), array('frame_read_width', 'フレーム右下 スレ本文 の表示幅'), array('pane_mode', '3ペイン画面のフレームの並べ方'), - + '書き込み', array('my_FROM', 'レス書き込み時のデフォルトの名前'), array('my_mail', 'レス書き込み時のデフォルトのmail'), @@ -417,21 +418,27 @@ array('res_hist_rec_num', '書き込み履歴の記録数'), array('res_write_rec', '書き込み内容ログを記録'), array('res_popup_reload', 'ポップアップから書き込み成功したらスレを再読み込みする'), + '外部URL・ブラクラチェッカ', array('through_ime', '外部URLジャンプする際に通すゲート<br>「直接」でもCookieが使えない端末では gate.php を通す'), array('through_ime_http_only', ' HTTPSでアクセスしているときは外部URLゲートを通さない<br>(最近のWebブラウザの多くは https → http の遷移でRefererを送出しませんが、<br>「HTTPSでは直」にする場合は、お使いのブラウザの仕様を確認してください)'), array('ime_manual_ext', 'ゲートで自動転送しない拡張子(カンマ区切りで、拡張子の前のピリオドは不要)'), + array('brocra_checker_use', 'ブラクラチェッカ (つける, つけない)'), + array('brocra_checker_url', 'ブラクラチェッカURL'), + array('brocra_checker_query', 'ブラクラチェッカのクエリー (空の場合、PATH_INFOでURLを渡す)'), + '板メニュー・お気に板', array('join_favrank', '<a href="http://akid.s17.xrea.com/favrank/favrank.html" target="_blank">お気にスレ共有</a>に参加'), array('merge_favita', 'お気に板のスレ一覧をまとめて表示 (お気に板の数によっては処理に時間がかかる)'), array('favita_order_dnd', 'ドラッグ&ドロップでお気に板を並べ替える'), array('enable_menu_new', '板メニューに新着数を表示'), array('menu_refresh_time', '板メニュー部分の自動更新間隔 (分指定。0なら自動更新しない)'), array('menu_hide_brds', '板カテゴリ一覧を閉じた状態にする'), - array('brocra_checker_use', 'ブラクラチェッカ (つける, つけない)'), - array('brocra_checker_url', 'ブラクラチェッカURL'), - array('brocra_checker_query', 'ブラクラチェッカのクエリー (空の場合、PATH_INFOでURLを渡す)'), + 'プロキシ', array('proxy_use', 'プロキシを利用'), - array('proxy_host', 'プロキシホスト ex)"127.0.0.1", "p2proxy.example"'), - array('proxy_port', 'プロキシポート ex)"8080"'), + array('proxy_host', 'プロキシホスト ex)"127.0.0.1", "p2proxy.example"'), + array('proxy_port', 'プロキシポート ex)"8080"'), + array('proxy_user', 'プロキシユーザー名 (使用する場合のみ)'), + array('proxy_password', 'プロキシパスワード (使用する場合のみ)'), + '通信設定', array('ssl_function', 'SSL通信(●ログイン等)に使用する関数<br>(関数に該当する拡張をインストールする必要がある)'), ); printEditConfGroupHtml($groupname, $conflist, $flags); diff --git a/rep2/post.php b/rep2/post.php index 146a4ec12..35f98cb97 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -394,8 +394,10 @@ function postIt($host, $bbs, $key, $post) // プロキシ if ($_conf['proxy_use']) { $req->setConfig(array( - ‘proxy_host’ => $_conf['proxy_host'], - ‘proxy_port’ => $_conf['proxy_port'], + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] )); } From 8d4c34c07f10710674e2e39e4ede7b76099491f3 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 31 Mar 2015 10:11:15 +0900 Subject: [PATCH 097/339] =?UTF-8?q?DAT=E8=90=BD=E3=81=A1=E5=88=A4=E5=AE=9A?= =?UTF-8?q?=E3=82=92=E5=A4=89=E6=9B=B4=20ID=E3=81=AE=E4=BB=95=E6=A7=98?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=E3=81=AB=E5=AF=BE=E5=BF=9C=20DAT=E3=82=92?= =?UTF-8?q?=E5=8F=96=E5=BE=97=E3=81=99=E3=82=8B=E9=9A=9B=E3=81=ABgzip?= =?UTF-8?q?=E3=81=A7=E5=8F=96=E5=BE=97=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThread.php | 4 ++-- lib/ShowThreadPc.php | 2 +- lib/ThreadRead.php | 27 ++++++++------------------- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/lib/ShowThread.php b/lib/ShowThread.php index 47ae65f4b..5f0676026 100644 --- a/lib/ShowThread.php +++ b/lib/ShowThread.php @@ -36,7 +36,7 @@ abstract class ShowThread (?P<url>(ftp|h?t?tps?)://([0-9A-Za-z][\\w;/?:@=&$\\-_.+!*\'(),#%\\[\\]^~]+)) # URL ([^\\s<>]*) # URLの直後、タグorホワイトスペースが現れるまでの文字列 | - (?P<id>ID:[ ]?([0-9A-Za-z/.+]{8,11})(?=[^0-9A-Za-z/.+]|$)) # ID(8,10桁 +PC/携帯識別フラグ) + (?P<id>ID:[ ]?([0-9A-Za-z/.+]{8,14})(?=[^0-9A-Za-z/.+]|$)) # ID(8,10桁 +PC/携帯識別フラグ) ) }x'; @@ -2023,7 +2023,7 @@ static protected function _buildStrToLinkRegex() . '(ftp|h?ttps?|tps?)://([0-9A-Za-z][\\w!#%&+*,\\-./:;=?@\\[\\]^~]+)' // URL . ')' . '|' - . '(?P<id>ID: ?([0-9A-Za-z/.+]{8,11})(?=[^0-9A-Za-z/.+]|$))' // ID(8,10桁 +PC/携帯識別フラグ) + . '(?P<id>ID: ?([0-9A-Za-z/.+]{8,14})(?=[^0-9A-Za-z/.+]|$))' // ID(8,10桁 +PC/携帯識別フラグ) . ')' . '}'; } diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index a13ea0b63..5b635c3eb 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -640,7 +640,7 @@ public function idFilter($idstr, $id) return $idstr; } - if ($_conf['coloredid.enable'] > 0 && preg_match("|^ID:[ ]?[0-9A-Za-z/.+]{8,11}|",$idstr)) { + if ($_conf['coloredid.enable'] > 0 && preg_match("|^ID: ?[0-9A-Za-z/.+]+|",$idstr)) { if ($this->_ids_for_render === null) { $this->_ids_for_render = array(); } diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index da5f7515e..3d7e7080d 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -174,6 +174,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { $req = new HTTP_Request2 ($url, HTTP_Request2::METHOD_POST); // ヘッダ $req->setHeader ('User-Agent', $ReadUA); + $req->setHeader ('Accept-Encoding', "gzip, deflate"); if (! empty ($_GET['one'])) { // >>1プレビューの時はサーバーに最初の部分だけ請求 @@ -255,13 +256,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { $this->diedat = true; return false; } elseif (mb_strpos ($firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2") === 0) { - $this->getdat_error_msg_ht .= "<p>rep2 error: API経由でのスレッド取得に失敗しました。<br />rep2 info: スレッドが存在しないか過去ログに格納されています。</p>"; - $marutori_ht = $this->_generateMarutoriLink (); - $plugin_ht = $this->_generateWikiDatLink (); - $moritori_ht = $this->_generateMoritapoDatLink (); - $this->getdat_error_msg_ht .= "{$marutori_ht}{$moritori_ht}{$plugin_ht}"; - $this->diedat = true; - return false; + return $this->_downloadDat2chNotFound ('404'); } unset ($firstmsg); @@ -369,6 +364,7 @@ protected function _downloadDat2ch($from_bytes) { // ヘッダ $req->setHeader ('User-Agent', P2Util::getP2UA (true)); $req->setHeader ('Referer', "http://{$purl['host']}/{$this->bbs}/"); + $req->setHeader ('Accept-Encoding', "gzip, deflate"); if (! empty ($_GET['one'])) { // >>1プレビューの時はサーバーに最初の部分だけ請求 @@ -431,11 +427,7 @@ protected function _downloadDat2ch($from_bytes) { $firstmsg = mb_substr ($body, 0, $posLF === false ? mb_strlen ($body) : $posLF); if (mb_strpos ($firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2") === 0) { - $this->getdat_error_msg_ht .= "<p>rep2 error: API経由でのスレッド取得に失敗しました。<br />rep2 info: スレッドが存在しないか過去ログに格納されています。</p>"; - $marutori_ht = $this->_generateMarutoriLink (); - $plugin_ht = $this->_generateWikiDatLink (); - $moritori_ht = $this->_generateMoritapoDatLink (); - $this->getdat_error_msg_ht .= "{$marutori_ht}{$moritori_ht}{$plugin_ht}"; + $this->getdat_error_msg_ht .= "<p>rep2 error: 板サーバから接続を拒否されました<br>rep2 info: 2ちゃんねるのDAT提供は終了しました</p>"; $this->diedat = true; return false; } @@ -759,12 +751,9 @@ public function get2chDatError($code = null) { $reason = 'kakohtml'; } } - } elseif (P2Util::isHost2chs ($this->host) && $code == '404') { - // APIの為404だったら過去ログと決めつけとく(fix Here) - $reason = 'datochi'; } - $read_url = "http://{$this->host}/test/read.cgi/{$this->bbs}/{$this->key}/"; + $read_url = "http://{$this->host}/test/read.cgi/{$this->bbs}/{$this->key}/1"; // {{{ read.cgi からHTMLを取得 @@ -773,7 +762,7 @@ public function get2chDatError($code = null) { try { $req = new HTTP_Request2 ($read_url, HTTP_Request2::METHOD_GET); // ヘッダ - $req->setHeader ('User-Agent', P2Util::getP2UA(false)); // ここは、"Monazilla/" をつけるとNG + $req->setHeader ('User-Agent', P2Util::getP2UA(false,P2Util::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG $req->setHeader ('Accept-Encoding', "gzip, deflate"); $req->setConfig (array ( @@ -805,7 +794,7 @@ public function get2chDatError($code = null) { } else { $url_t = P2Util::throughIme ($read_url); $info_msg_ht = "<p class=\"info-msg\">Error: {$code}<br>"; - $info_msg_ht .= "rep2 info: <a href=\"{$url_t}\"{$_conf['ext_win_target_at']}>{$read_url}</a> に接続できませんでした。</p>"; + $info_msg_ht .= "rep2 info: <a href=\"{$url_t}\"{$_conf['ext_win_target_at']}>{$read_url}</a> のHTMLを取得出来ませんでした。</p>"; P2Util::pushInfoHtml ($info_msg_ht); } } catch (Exception $e) { @@ -1168,7 +1157,7 @@ protected function _setIdCount() { foreach ($this->datlines as $l) { $lar = explode ('<>', $l); $i ++; - if (preg_match ('<(ID: ?| )([0-9A-Za-z/.+]{8,11})(?=[^0-9A-Za-z/.+]|$)>', $lar[2], $m)) { + if (preg_match ('<(ID: ?)([0-9A-Za-z/.+]+)(?=[^0-9A-Za-z/.+]|$)>', $lar[2], $m)) { $idp[$i] = $m[1]; $ids[$i] = $m[2]; } From 325ddc9a5b09939f70e164d1ce4f6bff3b6e8223 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 31 Mar 2015 10:55:51 +0900 Subject: [PATCH 098/339] =?UTF-8?q?HTTP=5FRequest2=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=E3=81=AE=E3=81=9F=E3=82=81Wap.php=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/Wap.php | 689 ------------------------------------------ lib/startup.funcs.php | 7 +- 2 files changed, 1 insertion(+), 695 deletions(-) delete mode 100644 lib/Wap.php diff --git a/lib/Wap.php b/lib/Wap.php deleted file mode 100644 index 77206a660..000000000 --- a/lib/Wap.php +++ /dev/null @@ -1,689 +0,0 @@ -<?php -/** - * WWW Access on PHP - * http://member.nifty.ne.jp/hippo2000/perltips/LWP.html を参考にしつつ似たような簡易のものを - * - * @author aki - */ - -// 2005/04/20 aki このクラスは役割終了にして、PEAR利用に移行したい(HTTP_Clientなど) - -// {{{ WapUserAgent - -/** - * UserAgent クラス - */ -class WapUserAgent -{ - // {{{ constants - - const CRLF = "\r\n"; - - // }}} - // {{{ properties - - /** - * User-Agent - * - * @var string - */ - private $_agent = null; - - /** - * fsockopen() 時のタイムアウト秒 - * - * @var int - */ - private $_timeout = -1; - - /** - * fread() 時のタイムアウト秒 - * - * @var int - */ - private $_readTimeout = -1; - - /** - * fsockopen() に@演算子を付けて、エラーを抑制するならtrue - * - * @var bool - */ - private $_atFsockopen = false; - - /** - * @var int - */ - private $_maxRedirect = 3; - - /** - * @var int - */ - private $_redirectCount = 0; - - /** - * @var array - */ - private $_redirectCache = array(); - - // }}} - // {{{ constructor - - /** - * コンストラクタ - * - * @param string $agent_name - */ - public function __construct($agent_name = null) - { - if ($agent_name !== null) { - $this->setAgent($agent_name); - } - } - - // }}} - // {{{ setAgent() - - /** - * setAgent - * - * @param string $agent_name - * @return void - */ - public function setAgent($agent_name) - { - $this->_agent = $agent_name; - } - - // }}} - // {{{ setTimeout() - - /** - * set timeout - * - * @param int $timeout - * @param int $readTimeout - * @return void - */ - public function setTimeout($timeout, $readTimeout) - { - $this->_timeout = $timeout; - $this->_readTimeout = $readTimeout; - } - - // }}} - // {{{ setAtFsockopen() - - /** - * set atFsockopen - * - * @param bool $atFsockopen - * @return void - */ - public function setAtFsockopen($atFsockopen) - { - $this->_atFsockopen = $atFsockopen; - } - - // }}} - // {{{ header() - - /** - * HTTPリクエストをサーバに送信して、ヘッダレスポンス(WapResponseオブジェクト)を取得する - * - * @param WapRequest $req - * @return WapResponse - * @see WapUserAgent::request() - */ - public function header(WapRequest $req) - { - return $this->request($req, array('onlyHeader' => true)); - } - - // }}} - // {{{ request() - - /** - * HTTPリクエストをサーバに送信して、レスポンス(WapResponseオブジェクト)を取得する - * - * @thanks http://www.spencernetwork.org/memo/tips-3.php - * - * @param WapRequest $req - * @param array $options - * @return WapResponse - */ - public function request(WapRequest $req, array $options = array()) - { - if (!empty($options['onlyHeader'])) { - $req->setOnlyHeader($options['onlyHeader']); - } - - if (!$purl = parse_url($req->url)) { - $res = new WapResponse(); - $res->message = 'parse_url() failed'; - return $res; - } - - if (isset($purl['query'])) { - $purl['query'] = '?' . $purl['query']; - } else { - $purl['query'] = ''; - } - $default_port = ($purl['scheme'] == 'https') ? 443 : 80; - - // プロキシ - if ($req->proxy) { - $send_host = $req->proxy['host']; - $send_port = isset($req->proxy['port']) ? $req->proxy['port'] : $default_port; - $send_path = $req->url; - } else { - $send_host = $purl['host']; - $send_port = isset($purl['port']) ? $purl['port'] : $default_port; - $send_path = $purl['path'] . $purl['query']; - } - - // SSL - if ($purl['scheme'] == 'https') { - $send_host = 'ssl://' . $send_host; - } - - $request = $req->method . ' ' . $send_path . ' HTTP/1.0' . self::CRLF; - $request .= 'Host: ' . $purl['host'] . self::CRLF; - if ($this->_agent) { - $request .= 'User-Agent: '. $this->_agent . self::CRLF; - } - $request .= 'Connection: Close' . self::CRLF; - //$request .= 'Accept-Encoding: gzip' . self::CRLF; - - if ($req->modified) { - $request .= 'If-Modified-Since: ' . $req->modified . self::CRLF; - } - - // Basic認証用のヘッダ - if (isset($purl['user']) && isset($purl['pass'])) { - $request .= 'Authorization: Basic ' . base64_encode($purl['user'] . ':' . $purl['pass']) . self::CRLF; - } - - // 追加ヘッダ - if ($req->headers) { - $request .= $req->headers; - } - - // POSTの時はヘッダを追加して末尾にURLエンコードしたデータを添付 - if (strtoupper($req->method) == 'POST') { - // 通常はURLエンコードする - if (empty($req->noUrlencodePost)) { - foreach ($req->post as $name => $value) { - $POST[] = $name . '=' . rawurlencode($value); - } - $postdata_content_type = 'application/x-www-form-urlencoded'; - - // ●ログインのときなどはURLエンコードしない - } else { - foreach ($req->post as $name => $value) { - $POST[] = $name . '=' . $value; - } - $postdata_content_type = 'text/plain'; - } - $postdata = implode('&', $POST); - $request .= 'Content-Type: ' . $postdata_content_type . self::CRLF; - $request .= 'Content-Length: ' . strlen($postdata) . self::CRLF; - $request .= self::CRLF; - $request .= $postdata; - } else { - $request .= self::CRLF; - } - - $res = new WapResponse(); - - // WEBサーバへ接続 - if ($this->_timeout > 0) { - if ($this->_atFsockopen) { - $fp = @fsockopen($send_host, $send_port, $errno, $errstr, $this->_timeout); - } else { - $fp = fsockopen($send_host, $send_port, $errno, $errstr, $this->_timeout); - } - } else { - if ($this->_atFsockopen) { - $fp = @fsockopen($send_host, $send_port, $errno, $errstr); - } else { - $fp = fsockopen($send_host, $send_port, $errno, $errstr); - } - } - - if (!$fp) { - $res->code = $errno; // ex) 602 - $res->message = $errstr; // ex) "Connection Failed" - return $res; - } - - if ($this->_readTimeout > 0) { - stream_set_timeout($fp, $this->_readTimeout, 0); - } - - fputs($fp, $request); - $body = ''; - - // header response - while (!p2_stream_eof($fp, $timed_out)) { - $l = fgets($fp,128000); - //echo $l."<br>"; // - // ex) HTTP/1.1 304 Not Modified - if (preg_match('/^(.+?): (.+)\\r\\n/', $l, $matches)) { - $res->headers[$matches[1]] = $matches[2]; - } elseif (preg_match('/HTTP\\/1\\.\\d (\\d+) (.+)\\r\\n/', $l, $matches)) { - $res->code = (int)$matches[1]; - $res->message = $matches[2]; - $res->headers['HTTP'] = rtrim($l); - } elseif ($l == self::CRLF) { - break; - } - } - - // body response - if (!$req->onlyHeader) { - while (!p2_stream_eof($fp, $timed_out)) { - $body .= fread($fp, 4096); - } - $res->setContent($body); - } - - fclose($fp); - - // リダイレクト(301 Moved, 302 Found)を追跡 - // RFC2616 - Section 10.3 - /*if ($GLOBALS['trace_http_redirect']) { - if ($res->code == 301 || ($res->code == 302 && $req->isSafeMethod())) { - if (!$this->_redirectCache) { - $this->_maxRedirect = 5; - $this->_redirectCount = 0; - $this->_redirectCache = array(); - } - while ($res->isRedirect() && isset($res->headers['Location']) && $this->_redirectCount < $this->_maxRedirect) { - $this->_redirectCache[] = $res; - $req->setUrl($res->headers['Location']); - $res = $this->request($req); - $this->_redirectCount++; - } - } - } elseif ($res->isRedirect() && isset($res->headers['Location'])) { - $res->message .= " (Location: <a href=\"{$res->headers['Location']}\">{$res->headers['Location']}</a>)"; - }*/ - - return $res; - } - - // }}} -} - -// }}} -// {{{ WapRequest - -/** - * Request クラス - */ -class WapRequest -{ - // {{{ constants - - const CRLF = "\r\n"; - - // }}} - // {{{ properties - - /** - * GET, POST, HEADのいずれか(デフォルトはGET、PUT,DELETE等はなし) - * - * @var string - */ - public $method = 'GET'; - - /** - * http://から始まるURL( http://user:pass@host:port/path?query ) - * - * @var string - */ - public $url = null; - - /** - * 任意の追加ヘッダ - * - * @var string - */ - public $headers = null; - - /** - * POSTの時に送信するデータを格納した配列("変数名"=>"値") - * - * @var array - */ - public $post = array(); - - /** - * ('host'=>"", 'port'=>"") - * - * @var array - */ - public $proxy = array(); - - /** - * If-Modified-Since - * - * @var string - */ - public $modified = null; - - /** - * ヘッダだけを取得するならtrue - * - * @var bool - */ - public $onlyHeader = false; - - /** - * POSTデータをurlencodeしないならtrue。通常はurlencodeするのでfalse - * - * @var bool - */ - public $noUrlencodePost = false; - - // }}} - // {{{ constructor - - /** - * コンストラクタ - * - * @param string $url - * @param string $method - * @param array $options - */ - public function __construct($url = null, $method = null, array $options = null) - { - if ($url) { - $this->setUrl($url); - } - if ($method) { - $this->setMethod($method); - } - if (!$options) { - return; - } - if (array_key_exists('headers', $options)) { - $this->setHeaders($options['headers']); - } - if (array_key_exists('proxy', $options)) { - $this->setProxy($options['proxy']); - } - if (array_key_exists('modified', $options)) { - $this->setModified($options['modified']); - } - if (array_key_exists('onlyHeader', $options)) { - $this->setOnlyHeader($options['onlyHeader']); - } - if (array_key_exists('noUrlencodePost', $options)) { - $this->setNoUrlencodePost($options['noUrlencodePost']); - } - } - - // }}} - // {{{ setProxy() - - /** - * set proxy - * - * @param string $host - * @param string $port - * @return void - */ - public function setProxy($host, $port) - { - $this->proxy['host'] = $host; - $this->proxy['port'] = $port; - } - - // }}} - // {{{ setMethod() - - /** - * set method - * - * @param string $method - * @return void - */ - public function setMethod($method) - { - $this->method = $method; - } - - // }}} - // {{{ setUrl() - - /** - * set url - * - * @param string $url - * @return void - */ - public function setUrl($url) - { - $this->url = $url; - } - - // }}} - // {{{ setModified() - - /** - * set modified - * - * @param string|int $modified - * @return void - */ - public function setModified($modified) - { - if (is_numeric($modified)) { - $this->modified = http_date((int)$modified); - } else { - $this->modified = $modified; - } - } - - // }}} - // {{{ setOnlyHeader() - - /** - * set onlyHeader - * - * @param bool $onlyHeader - * @return void - */ - public function setOnlyHeader($onlyHeader) - { - $this->onlyHeader = $onlyHeader; - } - - // }}} - // {{{ setHeaders() - - /** - * set noUrlencodePost - * - * @param bool $noUrlencodePost - * @return void - */ - public function setNoUrlencodePost($noUrlencodePost) - { - $this->noUrlencodePost = $noUrlencodePost; - } - - // }}} - // {{{ setHeaders() - - /** - * set headers - * - * @param string $headers - * @return void - */ - public function setHeaders($headers) - { - $this->headers = $headers; - } - - // }}} - // {{{ isSafeMethod() - - /** - * is safe method? - * - * @return bool - */ - public function isSafeMethod() - { - $method = strtoupper($this->method); - // RFC2616 - Section 9 - if ($method == 'GET' || $method == 'HEAD'){ - return true; - } else { - return false; - } - } - - // }}} -} - -// }}} -// {{{ WapResponse - -/** - * Response クラス - */ -class WapResponse -{ - // {{{ properties - - /** - * リクエストの結果を示す数値 - * - * @var int - */ - public $code = false; - - /** - * codeに対応する人間が読める短い文字列 - * - * @var string - */ - public $message = ''; - - /** - * 配列 - * - * @var array - */ - public $headers = array(); - - /** - * 内容。任意のデータの固まり - * - * @var string - */ - public $content = null; - - // }}} - // {{{ setContent() - - /** - * set content - * - * @param string $content - * @return void - */ - public function setContent($content) - { - $this->content = $content; - } - - // }}} - // {{{ isSuccess() - - /** - * is success? - * - * @return bool - */ - public function isSuccess() - { - return in_array($this->code, array(200, 206, 304)); - } - - // }}} - // {{{ isError() - - /** - * is error ? - * - * @return bool - */ - public function isError() - { - if (!$this->code) { - return true; - } - return !$this->isSuccess(); - } - - // }}} - // {{{ isRedirect() - - /** - * is redirect? - * - * @return bool - */ - public function isRedirect() - { - return in_array($this->code, array(301, 302)); - } - - // }}} - // {{{ HTTP Status Codes (note) -/* - 000, 'Unknown Error', - 200, 'OK', - 201, 'CREATED', - 202, 'Accepted', - 203, 'Partial Information', - 204, 'No Response', - 206, 'Partial Content', - 301, 'Moved', - 302, 'Found', - 303, 'Method', - 304, 'Not Modified', - 400, 'Bad Request', - 401, 'Unauthorized', - 402, 'Payment Required', - 403, 'Forbidden', - 404, 'Not Found', - 500, 'Internal Error', - 501, 'Not Implemented', - 502, 'Bad Response', - 503, 'Too Busy', - 600, 'Bad Request in Client', - 601, 'Not Implemented in Client', - 602, 'Connection Failed', - 603, 'Timed Out', -*/ - // }}} -} - -// }}} - -/* - * Local Variables: - * mode: php - * coding: cp932 - * tab-width: 4 - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End: - */ -// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/lib/startup.funcs.php b/lib/startup.funcs.php index 26887bde7..7edaa0dc0 100644 --- a/lib/startup.funcs.php +++ b/lib/startup.funcs.php @@ -40,14 +40,9 @@ function p2_load_class($name) Thread(?:List|Read)? | UA | UrlSafeBase64 | - Wap(?:UserAgent|Request|Response) )$/x', $name)) { - if (strncmp($name, 'Wap', 3) === 0) { - include P2_LIB_DIR . '/Wap.php'; - } else { - include P2_LIB_DIR . '/' . $name . '.php'; - } + include P2_LIB_DIR . '/' . $name . '.php'; } elseif (preg_match('/^[A-Z][A-Za-z]*DataStore$/', $name)) { include P2_LIB_DIR . '/P2DataStore/' . $name . '.php'; } From 6e1c7a0c6594e2fba44f7c551009e6ee4a17c97d Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 1 Apr 2015 07:18:54 +0900 Subject: [PATCH 099/339] =?UTF-8?q?BbsMap::=5FgetMapping=E3=81=AB10?= =?UTF-8?q?=E5=88=86=E9=96=93=E9=9A=94=E3=81=A72ch=E3=81=AB=E3=82=A2?= =?UTF-8?q?=E3=82=AF=E3=82=BB=E3=82=B9=E3=81=99=E3=82=8B=E6=A9=9F=E8=83=BD?= =?UTF-8?q?=E3=81=8C=E3=81=82=E3=81=A3=E3=81=9F=E3=81=AE=E3=81=A7=E3=82=A2?= =?UTF-8?q?=E3=82=AF=E3=82=BB=E3=82=B9=E9=96=93=E9=9A=94=E3=82=92=E6=9C=80?= =?UTF-8?q?=E4=BD=8E=E4=B8=80=E6=99=82=E9=96=93=E9=96=93=E9=9A=94=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=20Subject.txt=E3=81=A8SETTING.TXT=E3=81=AEDL?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=82=92HTTP=5FRequest2=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/BbsMap.php | 92 ++++++++--------------------------------- lib/BrdCtl.php | 3 +- lib/SettingTxt.php | 100 ++++++++++++++++++++++----------------------- lib/SubjectTxt.php | 81 ++++++++++++++++++------------------ 4 files changed, 110 insertions(+), 166 deletions(-) diff --git a/lib/BbsMap.php b/lib/BbsMap.php index df29457cb..a1d3a57ee 100644 --- a/lib/BbsMap.php +++ b/lib/BbsMap.php @@ -265,13 +265,8 @@ static private function _getMapping() global $_conf; // {{{ 設定 - - $bbsmenu_url = 'http://menu.2ch.net/bbsmenu.html'; // 公式メニューの URL - $altmenu_url = 'http://www.2ch.se/bbsmenu.html'; // 代替メニューの URL $map_cache_path = $_conf['cache_dir'] . '/host_bbs_map.txt'; - $map_cache_lifetime = 600; // TTLは少し短めに - $err_fmt = '<p>rep2 error: BbsMap: %s - %s をダウンロードできませんでした。</p>'; - $use_alt = false; + $map_cache_lifetime = 60 * 60 * 30; // 30分おきに更新があるか確認するがBrdCtl側で最低1時間はアクセスしない。 // }}} // {{{ キャッシュ確認 @@ -294,77 +289,26 @@ static private function _getMapping() // }}} // {{{ メニューをダウンロード - - $params = array(); - $params['timeout'] = $_conf['http_conn_timeout']; - $params['readTimeout'] = array($_conf['http_read_timeout'], 0); - if (isset($mtime)) { - $params['requestHeaders'] = array('If-Modified-Since' => http_date($mtime)); - } - if ($_conf['proxy_use']) { - $params['proxy_host'] = $_conf['proxy_host']; - $params['proxy_port'] = $_conf['proxy_port']; - } - $req = new HTTP_Request($bbsmenu_url, $params); - $req->setMethod('GET'); - $err = $req->sendRequest(true); - - // エラーのとき、代わりのメニューを使ってみる - if (PEAR::isError($err) && $use_alt) { - P2Util::pushInfoHtml(sprintf($err_fmt, p2h($err->getMessage()), p2h($bbsmenu_url))); - P2Util::pushInfoHtml(sprintf("<p>代わりに %s をダウンロードします。</p>", p2h($altmenu_url))); - $bbsmenu_url = $altmenu_url; - unset ($req, $err); - $req = new HTTP_Request($bbsmenu_url, $params); - $req->setMethod('GET'); - $err = $req->sendRequest(true); - } - - // エラーを検証 - if (PEAR::isError($err)) { - P2Util::pushInfoHtml(sprintf($err_fmt, p2h($err->getMessage()), p2h($bbsmenu_url))); - if (file_exists($map_cache_path)) { - return unserialize(file_get_contents($map_cache_path)); - } else { - return false; - } - } - - // レスポンスコードを検証 - $code = $req->getResponseCode(); - if ($code == 304) { - $map_cahce = file_get_contents($map_cache_path); - self::$_map = unserialize($map_cahce); - return self::$_map; - } elseif ($code != 200) { - P2Util::pushInfoHtml(sprintf($err_fmt, p2h(strval($code)), p2h($bbsmenu_url))); - if (file_exists($map_cache_path)) { - return unserialize(file_get_contents($map_cache_path)); - } else { - return false; - } - } - - $res_body = $req->getResponseBody(); - - // }}} - // {{{ パース - - $regex = '!<A HREF=http://(\w+\.(?:2ch\.net|bbspink\.com|machi\.to|mathibbs\.com))/(\w+)/(?: TARGET=_blank)?>(.+?)</A>!'; - preg_match_all($regex, $res_body, $matches, PREG_SET_ORDER); - + $brd_menus_online = BrdCtl::read_brd_online(); $map = array(); - foreach ($matches as $match) { - $host = $match[1]; - $bbs = $match[2]; - $itaj = $match[3]; - $type = self::_detectHostType($host); - if (!isset($map[$type])) { - $map[$type] = array(); + + foreach ($brd_menus_online as $a_brd_menu) { + foreach ($a_brd_menu->categories as $cate) { + if ($cate->num > 0) { + foreach ($cate->menuitas as $mita) { + $host = $mita->host; + $bbs = $mita->bbs; + $itaj = $mita->itaj; + $type = self::_detectHostType($host); + if (!isset($map[$type])) { + $map[$type] = array(); + } + $map[$type][$bbs] = array('host' => $host, 'itaj' => $itaj); + } + } } - $map[$type][$bbs] = array('host' => $host, 'itaj' => $itaj); } - + unset ($brd_menus_online); // }}} // {{{ キャッシュする diff --git a/lib/BrdCtl.php b/lib/BrdCtl.php index 6080c47b5..51f8a1288 100644 --- a/lib/BrdCtl.php +++ b/lib/BrdCtl.php @@ -92,8 +92,9 @@ static public function read_brd_online() $brdfile_online_res = P2Util::fileDownload($_conf['brdfile_online'], $cachefile); if (isset($brdfile_online_res) && $brdfile_online_res->getStatus() != 304) { $isNewDL = true; - unset($brdfile_online_res); } + + unset($brdfile_online_res); } // html形式なら diff --git a/lib/SettingTxt.php b/lib/SettingTxt.php index e261753c7..94224ad6f 100644 --- a/lib/SettingTxt.php +++ b/lib/SettingTxt.php @@ -94,39 +94,64 @@ public function downloadSettingTxt() } // DL - $params = array(); - $params['timeout'] = $_conf['http_conn_timeout']; - $params['readTimeout'] = array($_conf['http_read_timeout'], 0); - if ($_conf['proxy_use']) { - $params['proxy_host'] = $_conf['proxy_host']; - $params['proxy_port'] = $_conf['proxy_port']; - } - $req = new HTTP_Request($this->_url, $params); - $modified && $req->addHeader('If-Modified-Since', $modified); - - $req->addHeader('User-Agent', P2Util::getP2UA(true,P2Util::isHost2chs($this->host))); - - $response = $req->sendRequest(); + try { + $req = new HTTP_Request2($this->_url, HTTP_Request2::METHOD_GET); + $modified && $req->setHeader("If-Modified-Since", $modified); + + // APIを使用する設定で相手が2chだったらAPIのUAを送る + $req->setHeader('User-Agent', P2Util::getP2UA(true,P2Util::isHost2chs($this->host))); + $req->setConfig (array ( + 'connect_timeout' => $_conf['http_conn_timeout'], + 'timeout' => $_conf['http_read_timeout'], + 'follow_redirects' => false + )); + + // プロキシ + if ($_conf['proxy_use']) { + $req->setConfig (array ( + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] + )); + } - if (PEAR::isError($response)) { - $error_msg = $response->getMessage(); - } else { - $code = $req->getResponseCode(); + $response = $req->send(); + $code = $response->getStatus(); if ($code == 302) { // ホストの移転を追跡 - $new_host = BbsMap::getCurrentHost($this->_host, $this->_bbs); - if ($new_host != $this->_host) { + $new_host = BbsMap::getCurrentHost($this->host, $this->bbs); + if ($new_host != $this->host) { $aNewSettingTxt = new SettingTxt($new_host, $this->_bbs); - $body = $aNewSettingTxt->downloadSettingTxt(); - return true; + return $aNewSettingTxt->downloadSettingTxt(); } - } - - if (!($code == 200 || $code == 206 || $code == 304)) { + } elseif ($code == 200 || $code == 206) { //var_dump($req->getResponseHeader()); + $body = $response->getBody(); + // したらば or be.2ch.net ならEUCをSJISに変換 + if (P2Util::isHostJbbsShitaraba($this->host) || P2Util::isHostBe2chNet($this->host)) { + $body = mb_convert_encoding($body, 'CP932', 'CP51932'); + } + if (FileCtl::file_write_contents($this->_setting_txt, $body) === false) { + p2die('cannot write file'); + } + // パースしてキャッシュを保存する + if (!$this->cacheParsedSettingTxt()) { + return false; + } + } elseif ($code == 304) { + // touchすることで更新インターバルが効くので、しばらく再チェックされなくなる + // (変更がないのに修正時間を更新するのは、少し気が進まないが、ここでは特に問題ないだろう) + touch($this->_setting_txt); + // 同時にキャッシュもtouchしないと、_setting_txtと_setting_srdで更新時間がずれ、 + // 毎回ここまで処理が来る(サーバへのヘッダリクエストが飛ぶ)場合がある。 + touch($this->_setting_srd); + } else { $error_msg = $code; } + } catch (Exception $e) { + $error_msg = $e->getMessage(); } // DLエラー @@ -140,33 +165,6 @@ public function downloadSettingTxt() } - $body = $req->getResponseBody(); - - // DL成功して かつ 更新されていたら保存 - if ($body && $code != '304') { - - // したらば or be.2ch.net ならEUCをSJISに変換 - if (P2Util::isHostJbbsShitaraba($this->_host) || P2Util::isHostBe2chNet($this->_host)) { - $body = mb_convert_encoding($body, 'CP932', 'CP51932'); - } - - if (FileCtl::file_write_contents($this->_setting_txt, $body) === false) { - p2die('cannot write file'); - } - - // パースしてキャッシュを保存する - if (!$this->cacheParsedSettingTxt()) { - return false; - } - - } else { - // touchすることで更新インターバルが効くので、しばらく再チェックされなくなる - touch($this->_setting_txt); - // 同時にキャッシュもtouchしないと、_setting_txtと_setting_srdで更新時間がずれ、 - // 毎回ここまで処理が来る(サーバへのヘッダリクエストが飛ぶ)場合がある。 - touch($this->_setting_srd); - } - return true; } diff --git a/lib/SubjectTxt.php b/lib/SubjectTxt.php index f7f81d733..1bb025d54 100644 --- a/lib/SubjectTxt.php +++ b/lib/SubjectTxt.php @@ -86,25 +86,31 @@ public function downloadSubject() } // DL - $params = array(); - $params['timeout'] = $_conf['http_conn_timeout']; - $params['readTimeout'] = array($_conf['http_read_timeout'], 0); - if ($_conf['proxy_use']) { - $params['proxy_host'] = $_conf['proxy_host']; - $params['proxy_port'] = $_conf['proxy_port']; - } - $req = new HTTP_Request($this->subject_url, $params); - $modified && $req->addHeader("If-Modified-Since", $modified); - - // APIを使用する設定で相手が2chだったらAPIのUAを送る - $req->addHeader('User-Agent', P2Util::getP2UA(true,P2Util::isHost2chs($this->host))); + try { + $req = new HTTP_Request2($this->subject_url, HTTP_Request2::METHOD_GET); + $modified && $req->setHeader("If-Modified-Since", $modified); + + // APIを使用する設定で相手が2chだったらAPIのUAを送る + $req->setHeader('User-Agent', P2Util::getP2UA(true,P2Util::isHost2chs($this->host))); + $req->setConfig (array ( + 'connect_timeout' => $_conf['http_conn_timeout'], + 'timeout' => $_conf['http_read_timeout'], + 'follow_redirects' => false + )); + + // プロキシ + if ($_conf['proxy_use']) { + $req->setConfig (array ( + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] + )); + } - $response = $req->sendRequest(); + $response = $req->send(); - if (PEAR::isError($response)) { - $error_msg = $response->getMessage(); - } else { - $code = $req->getResponseCode(); + $code = $response->getStatus(); if ($code == 302) { // ホストの移転を追跡 $new_host = BbsMap::getCurrentHost($this->host, $this->bbs); @@ -113,11 +119,27 @@ public function downloadSubject() $body = $aNewSubjectTxt->downloadSubject(); return $body; } - } - if (!($code == 200 || $code == 206 || $code == 304)) { + } elseif ($code == 200 || $code == 206) { //var_dump($req->getResponseHeader()); + $body = $response->getBody(); + // したらば or be.2ch.net ならEUCをSJISに変換 + if (P2Util::isHostJbbsShitaraba($this->host) || P2Util::isHostBe2chNet($this->host)) { + $body = mb_convert_encoding($body, 'CP932', 'CP51932'); + } + if (FileCtl::file_write_contents($this->subject_file, $body) === false) { + p2die('cannot write file'); + } + } elseif ($code == 304) { + // touchすることで更新インターバルが効くので、しばらく再チェックされなくなる + // (変更がないのに修正時間を更新するのは、少し気が進まないが、ここでは特に問題ないだろう) + if ($this->storage === 'file') { + touch($this->subject_file); + } + } else { $error_msg = $code; } + } catch (Exception $e) { + $error_msg = $e->getMessage(); } if (isset($error_msg) && strlen($error_msg) > 0) { @@ -126,27 +148,6 @@ public function downloadSubject() $info_msg_ht .= "rep2 info: <a href=\"{$url_t}\"{$_conf['ext_win_target_at']}>{$this->subject_url}</a> に接続できませんでした。</p>"; P2Util::pushInfoHtml($info_msg_ht); $body = ''; - } else { - $body = $req->getResponseBody(); - } - - // ■ DL成功して かつ 更新されていたら - if ($body && $code != "304") { - - // したらば or be.2ch.net ならEUCをSJISに変換 - if (P2Util::isHostJbbsShitaraba($this->host) || P2Util::isHostBe2chNet($this->host)) { - $body = mb_convert_encoding($body, 'CP932', 'CP51932'); - } - - if (FileCtl::file_write_contents($this->subject_file, $body) === false) { - p2die('cannot write file'); - } - } else { - // touchすることで更新インターバルが効くので、しばらく再チェックされなくなる - // (変更がないのに修正時間を更新するのは、少し気が進まないが、ここでは特に問題ないだろう) - if ($this->storage === 'file') { - touch($this->subject_file); - } } return $body; From cdf59c016099addd42aebb9ebe1a484e15336b78 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 1 Apr 2015 07:49:14 +0900 Subject: [PATCH 100/339] =?UTF-8?q?Be=E3=83=AD=E3=82=B0=E3=82=A4=E3=83=B3?= =?UTF-8?q?=E3=82=92HTTP=5FRequest2=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 49 +++++++++++-------------------------------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index 73d368eb7..ccffd03c1 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -2225,38 +2225,20 @@ static public function getBe2chCodeByMailPass($mail, $pass) $params['proxy_port'] = $GLOBALS['_conf']['proxy_port']; } - $req = new HTTP_Request('http://be.2ch.net/index.php', $params); - - $req->setMethod(HTTP_REQUEST_METHOD_POST); - $req->addPostData('mail', $mail); - $req->addPostData('pass', $pass); - $req->addPostData('login', 'ログインする'); + try { + $req = new HTTP_Request2('http://be.2ch.net/index.php', HTTP_Request2::METHOD_POST); - //var_dump($req); - // If-Modified-Since => gmdate('D, d M Y H:i:s', time()) . ' GMT'; + $req->addPostParameter('mail', $mail); + $req->addPostParameter('pass', $pass); + $req->addPostParameter('login', 'ログインする'); - /* - if ($headers) { - foreach ($headers as $k => $v) { - $req->addHeader($k, $v); - } - } - */ - $response = $req->sendRequest(); // $saveBody = true -//var_dump($req->getResponseHeader()); -//var_dump($req->getResponseCookies()); -//var_dump($req->getResponseCode()); -//var_dump(mb_convert_encoding($req->getResponseBody(), 'SJIS-win', 'eucJP-win')); - - if (PEAR::isError($response)) { - $error_msg = $response->getMessage(); + $response = $req->send(); - } else { - $code = $req->getResponseCode(); + $code = $response->getStatus(); // 成功とみなすコード if ($code == 302) { //return $req->getResponseBody(); - if ($cookies = $req->getResponseCookies()) { // urlencodeされた状態 + if ($cookies = $response->getCookies()) { // urlencodeされた状態 $r = array(); foreach ($cookies as $cookie) { if (in_array($cookie['name'], array('DMDM', 'MDMD'))) { @@ -2267,19 +2249,10 @@ static public function getBe2chCodeByMailPass($mail, $pass) return $r; } } - - //$error_msg = mb_convert_encoding($req->getResponseBody(), 'SJIS-win', 'eucJP-win'); - - /* - // 更新がなければnullを返す - } elseif ($code == 304) { - // 304の時は、$req->getResponseBody() は空文字""となる - return null; - */ - } else { - //var_dump($req->getResponseHeader()); - $error_msg = $code; } + + } catch (Exception $e) { + return false; // $error_msg } return false; // $error_msg From 25ff4b23fe53ec0de49807e44ead3bdae4aa639e Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 1 Apr 2015 07:56:43 +0900 Subject: [PATCH 101/339] =?UTF-8?q?HTTP=5FClient=E3=82=92HTTP=5FRequest2?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 12 ++++++++++++ lib/wiki/P2UtilWiki.php | 26 +++++++++++++++++++------- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index ccffd03c1..345d91262 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -2228,6 +2228,18 @@ static public function getBe2chCodeByMailPass($mail, $pass) try { $req = new HTTP_Request2('http://be.2ch.net/index.php', HTTP_Request2::METHOD_POST); + $req->setHeader('User-Agent', P2Util::getP2UA(true,true)); + + // プロキシ + if ($_conf['proxy_use']) { + $req->setConfig(array( + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] + )); + } + $req->addPostParameter('mail', $mail); $req->addPostParameter('pass', $pass); $req->addPostParameter('login', 'ログインする'); diff --git a/lib/wiki/P2UtilWiki.php b/lib/wiki/P2UtilWiki.php index 8350828f5..86f867b66 100644 --- a/lib/wiki/P2UtilWiki.php +++ b/lib/wiki/P2UtilWiki.php @@ -39,14 +39,26 @@ public static function isUrlImepita($url) public static function getResponseCode($url) { - $client = new HTTP_Client(); - $client->setRequestParameter('timeout', $timeout); - $client->setDefaultHeader('User-Agent', 'Monazilla/1.00'); - if (!empty($_conf['proxy_use'])) { - $client->setRequestParameter('proxy_host', $_conf['proxy_host']); - $client->setRequestParameter('proxy_port', $_conf['proxy_port']); + try { + $req = new HTTP_Request2($url, HTTP_Request2::METHOD_HEAD); + + $req->setHeader('User-Agent', 'Monazilla/1.00'); + + // プロキシ + if ($_conf['proxy_use']) { + $req->setConfig(array( + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] + )); + } + + return $response->getStatus(); + + } catch (Exception $e) { + return false; // $error_msg } - return $client->head($url); } /** From 90387f08bfd7d92d85905da0f329c439787018b6 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 1 Apr 2015 23:37:58 +0900 Subject: [PATCH 102/339] =?UTF-8?q?ThreadRead.php=E3=81=ABssl=5Ffunction?= =?UTF-8?q?=E3=81=8C=E5=AE=9F=E8=A3=85=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84?= =?UTF-8?q?=E3=81=AA=E3=81=84=E4=B8=8D=E5=85=B7=E5=90=88=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=20=E8=A8=AD=E5=AE=9A=E9=A0=85=E7=9B=AEssl=5Fcapath?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- conf/conf_user_def.inc.php | 15 +++++++++------ lib/ThreadRead.php | 8 ++++++++ lib/auth2chapi.inc.php | 7 +++++++ lib/login2ch.inc.php | 7 +++++++ rep2/edit_conf_user.php | 7 ++++--- 6 files changed, 36 insertions(+), 10 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 180943746..f0d91e866 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150330.1220', // rep2のバージョン + 'p2version' => '150401.2321', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 7df8aacdf..9333c77f4 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -40,7 +40,7 @@ // {{{ PATH // 右下部分に最初に表示されるページ。オンラインURLも可。 -$conf_user_def['first_page'] = "first_cont.php"; // ("first_cont.php") +$conf_user_def['first_page'] = "first_cont.php"; // ("first_cont.php") /* 板リストはオンラインとローカルの両方から読み込める @@ -92,7 +92,7 @@ // 板表示のスレッド一覧でのデフォルトのソート指定 $conf_user_def['sb_sort_ita'] = 'ikioi'; // ('ikioi') $conf_user_sel['sb_sort_ita'] = array( - 'midoku' => '新着', 'res' => 'レス', 'no' => 'No.', 'title' => 'タイトル', // 'spd' => 'すばやさ', + 'midoku' => '新着', 'res' => 'レス', 'no' => 'No.', 'title' => 'タイトル', // 'spd' => 'すばやさ', 'ikioi' => '勢い', 'bd' => 'Birthday'); // , 'fav' => 'お気にスレ' // 新着ソートでの「既得なし」の「新着数ゼロ」に対するソート優先順位 (上位:0.1, 混在:0, 下位:-0.1) @@ -465,7 +465,7 @@ // 外部URLジャンプする際に通すゲート // 「直接」でもCookieが使えない端末では gate.php を通す -$conf_user_def['through_ime'] = "exm"; // ("exm") +$conf_user_def['through_ime'] = "exm"; // ("exm") $conf_user_sel['through_ime'] = array( '' => '直接', 'p2' => 'p2 ime (自動転送)', @@ -483,7 +483,7 @@ $conf_user_rad['through_ime_http_only'] = array('1' => 'HTTPSでは直', '0' => '常に通す'); // ゲートで自動転送しない拡張子(カンマ区切りで、拡張子の前のピリオドは不要) -$conf_user_def['ime_manual_ext'] = "exe,zip"; // ("exe,zip") +$conf_user_def['ime_manual_ext'] = "exe,zip"; // ("exe,zip") // お気にスレ共有に参加(する:1, しない:0) $conf_user_def['join_favrank'] = 0; // (0) @@ -521,7 +521,7 @@ $conf_user_def['brocra_checker_query'] = ""; // ("") // 携帯閲覧時、パケット量を減らすため、全角英数・カナ・スペースを半角に変換 (する:1, しない:0) -$conf_user_def['mobile.save_packet'] = 1; // (1) +$conf_user_def['mobile.save_packet'] = 1; // (1) $conf_user_rad['mobile.save_packet'] = array('1' => 'する', '0' => 'しない'); // プロキシを利用(する:1, しない:0) @@ -547,7 +547,7 @@ $conf_user_def['frame_subject_width'] = "40%"; // ("40%") // フレーム右下 スレ本文 の表示幅 -$conf_user_def['frame_read_width'] = "60%"; // ("40%") +$conf_user_def['frame_read_width'] = "60%"; // ("60%") // 3ペイン画面のフレームの並べ方 $conf_user_def['pane_mode'] = 0; // (0) @@ -557,6 +557,9 @@ $conf_user_def['ssl_function'] = "socket"; // (socket) $conf_user_sel['ssl_function'] = array('socket' => 'OpenSSL', 'curl' => 'cURL'); +// SSL通信の接続先を検証するために使用する証明書が格納されたディレクトリ ※検証できない時のみ指定 +$conf_user_def['ssl_capath'] = ""; // () + // }}} // {{{ 拡張パックとiPhone diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 3d7e7080d..c8b2b8f2d 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -172,6 +172,14 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { try { $req = new HTTP_Request2 ($url, HTTP_Request2::METHOD_POST); + + $req->setAdapter($_conf['ssl_function']); + + if($_conf['ssl_capath']) + { + $req->setConfig ('ssl_capath', $_conf['ssl_capath']); + } + // ヘッダ $req->setHeader ('User-Agent', $ReadUA); $req->setHeader ('Accept-Encoding', "gzip, deflate"); diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index 3e0d86916..740ee9dec 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -38,7 +38,14 @@ function authenticate_2chapi() $req = new HTTP_Request2($url,HTTP_Request2::METHOD_POST); $req->setHeader('User-Agent', $AuthUA); $req->setHeader('X-2ch-UA', $AppName); + $req->setAdapter($_conf['ssl_function']); + + if($_conf['ssl_capath']) + { + $req->setConfig ('ssl_capath', $_conf['ssl_capath']); + } + // プロキシ if ($_conf['proxy_use']) { $req->setConfig (array ( diff --git a/lib/login2ch.inc.php b/lib/login2ch.inc.php index 92606e86d..b1cf64fcf 100644 --- a/lib/login2ch.inc.php +++ b/lib/login2ch.inc.php @@ -41,7 +41,14 @@ function login2ch() $req = new HTTP_Request2($auth2ch_url,HTTP_Request2::METHOD_POST); $req->setHeader('User-Agent', $dolib2ch); $req->setHeader('X-2ch-UA', $x_2ch_ua); + $req->setAdapter($_conf['ssl_function']); + + if($_conf['ssl_capath']) + { + $req->setConfig ('ssl_capath', $_conf['ssl_capath']); + } + // プロキシ if ($_conf['proxy_use']) { $req->setConfig (array ( diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index da8df807c..b75eb9f74 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -433,13 +433,14 @@ array('menu_refresh_time', '板メニュー部分の自動更新間隔 (分指定。0なら自動更新しない)'), array('menu_hide_brds', '板カテゴリ一覧を閉じた状態にする'), 'プロキシ', - array('proxy_use', 'プロキシを利用'), + array('proxy_use', 'プロキシを利用'), array('proxy_host', 'プロキシホスト ex)"127.0.0.1", "p2proxy.example"'), array('proxy_port', 'プロキシポート ex)"8080"'), - array('proxy_user', 'プロキシユーザー名 (使用する場合のみ)'), + array('proxy_user', 'プロキシユーザー名 (使用する場合のみ)'), array('proxy_password', 'プロキシパスワード (使用する場合のみ)'), '通信設定', array('ssl_function', 'SSL通信(●ログイン等)に使用する関数<br>(関数に該当する拡張をインストールする必要がある)'), + array('ssl_capath', 'SSL通信で接続先を検証するための証明書があるディレクトリ ex)"/etc/ssl/certs"<br>設定なして動く場合は設定不要<br>ssl_functionに対応した形式の証明書が必要'), ); printEditConfGroupHtml($groupname, $conflist, $flags); } @@ -1050,7 +1051,7 @@ function applyRules() } } -// }}} +// }}} // {{{ フィルタ関数 // emptyToDef() などのフィルタはEditConfFiterクラスなどにまとめる予定 // {{{ emptyToDef() From 7f22f65ff0a201079291f55c76ea1f3e9c66dbd9 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 1 Apr 2015 23:43:06 +0900 Subject: [PATCH 103/339] =?UTF-8?q?dig.2ch.net=E3=81=AB=E9=80=81=E3=82=8B?= =?UTF-8?q?=E3=83=98=E3=83=83=E3=83=80=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/dig2ch.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php index f48ae6ca2..2649cda26 100644 --- a/rep2/dig2ch.php +++ b/rep2/dig2ch.php @@ -13,7 +13,8 @@ function dig2chsearch($query) try { $req = new HTTP_Request2($url, HTTP_Request2::METHOD_GET); - $req->setHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.4; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko'); + $req->setHeader('User-Agent', $_SERVER['HTTP_USER_AGENT']); + $req->setHeader('Acecpt-Language', 'ja'); $req->setConfig(array( 'connect_timeout' => $_conf['http_conn_timeout'], From bdb264f4cc9301cdee9b7a663107fd0d7181f0ab Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 1 Apr 2015 23:59:19 +0900 Subject: [PATCH 104/339] =?UTF-8?q?HttpRequest=E3=82=92=E8=AA=8D=E8=A8=BC?= =?UTF-8?q?=E3=83=97=E3=83=AD=E3=82=AD=E3=82=B7=E3=81=AB=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=E3=81=95=E3=81=9B=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2HttpExt.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/P2HttpExt.php b/lib/P2HttpExt.php index 1ac35f065..e101ecc8b 100644 --- a/lib/P2HttpExt.php +++ b/lib/P2HttpExt.php @@ -258,6 +258,12 @@ public function __construct($url, } elseif (strpos($_conf['proxy_host'], ':') === false) { $options['proxyport'] = 80; } + + if ($_conf['proxy_user'] && $_conf['proxy_password']) + { + $options['proxy_auth'] = sprintf('%s:%s', $_conf['proxy_user'], $_conf['proxy_password']); + $options['proxyauthtype'] = HTTP_AUTH_BASIC; + } /* $options['proxytype'] = HTTP_PROXY_HTTP; if (isset($_conf['proxy_type'])) { From 2fd5af6f509f6d44e53e53a1d50811a13b6eba3b Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 2 Apr 2015 00:34:05 +0900 Subject: [PATCH 105/339] v150401.2321 --- doc/README-774.txt | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/doc/README-774.txt b/doc/README-774.txt index 8674088d1..ad331c03b 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -36,11 +36,26 @@ rep2-expack test https://github.com/orzisun/p2-php 本家p2と同じく、X11ライセンスです。 ●ChangeLog +150401.2321 +・認証付プロキシに対応(BASIC認証のみ) +・SSL通信のopenSSLとcURLを切り替えることが出来る設定を追加 +・dig.2ch.netに送るヘッダを変更 +・2chとの通信をHTTP_Request2に変更 + +150328.2132 +・dig2chの鯖に軽微な不具合が発生したときの対策を講じた +・dig2chで検索結果の番号が1から表示されるように修正 +・dig2chのjsonエラー処理を変更 +・dig2chがプロキシ設定(proxy_use)に対応していない不具合を修正 +・dig2chで「板で絞り込む」に対応した +・置換ワードをポップアップにも効くように変更 +・レスをポップアップ(quote_res_view)が無効なときに実況モードのID色づけ(coloredid)が効かない不具合を修正 + 150320.1020 ・ポップアップから書き込み成功した後にスレを再読み込みしない設定を追加 ・実況モードからの書き込みでCookie確認が発生した場合実況モードに戻れない不具合を修正 ・メンテナンス性を向上させるためlive_ShowThreadPc.phpとlive_ShowThread.phpの代わりに -live_ShowThreadLive.phpと本体のShowThread.phpを使用するように変更 +・live_ShowThreadLive.phpと本体のShowThread.phpを使用するように変更 ・下書き保存(expack.editor.savedraft)が無効なときに実況モードから書き込めない不具合を修正 ・スレタイ検索でWarningが出る不具合を修正 From 3e8d2ee1e17198fd26f2f0b1b83c2be5746ee85a Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 2 Apr 2015 13:00:36 +0900 Subject: [PATCH 106/339] =?UTF-8?q?ssl=5Ffunction=E3=81=AE=E3=83=87?= =?UTF-8?q?=E3=83=95=E3=82=A9=E3=83=AB=E3=83=88=E8=A8=AD=E5=AE=9A=E3=82=92?= =?UTF-8?q?cURL=E3=81=AB=E5=A4=89=E6=9B=B4=20new=20HTTP=5FRequest2?= =?UTF-8?q?=E3=82=92=E5=85=B1=E9=80=9A=E5=8C=96=E3=81=97=E3=81=A6SSL?= =?UTF-8?q?=E9=80=9A=E4=BF=A1=E4=BB=A5=E5=A4=96=E3=81=A7=E3=82=82SSL?= =?UTF-8?q?=E3=81=AE=E8=A8=AD=E5=AE=9A=E3=81=8C=E5=8F=8D=E6=98=A0=E3=81=95?= =?UTF-8?q?=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=20=E4=B8=8A=E8=A8=98=E5=A4=89=E6=9B=B4=E3=81=AE=E3=81=9F?= =?UTF-8?q?=E3=82=81cURL=E5=BF=85=E9=A0=88=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_user_def.inc.php | 2 +- conf/setup_info.php | 1 + lib/P2Util.php | 109 +++++++++++++++++++----------------- lib/SettingTxt.php | 17 +----- lib/SubjectTxt.php | 17 +----- lib/ThreadRead.php | 110 +++---------------------------------- lib/auth2chapi.inc.php | 19 +------ lib/login2ch.inc.php | 21 ++----- lib/wiki/P2UtilWiki.php | 12 +--- rep2/dig2ch.php | 16 +----- rep2/post.php | 18 +----- 11 files changed, 79 insertions(+), 263 deletions(-) diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 9333c77f4..e1ddfbee2 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -554,7 +554,7 @@ $conf_user_rad['pane_mode'] = array('0' => '標準(に形)', '1' => '横一列(川形)'); // SSL通信(●ログイン等)に使用する関数 ※該当する拡張をインストールする必要がある -$conf_user_def['ssl_function'] = "socket"; // (socket) +$conf_user_def['ssl_function'] = "curl"; // (socket) $conf_user_sel['ssl_function'] = array('socket' => 'OpenSSL', 'curl' => 'cURL'); // SSL通信の接続先を検証するために使用する証明書が格納されたディレクトリ ※検証できない時のみ指定 diff --git a/conf/setup_info.php b/conf/setup_info.php index 5b0340329..96d379355 100644 --- a/conf/setup_info.php +++ b/conf/setup_info.php @@ -9,6 +9,7 @@ // 必須拡張モジュール $p2_required_extensions = array( + 'curl', 'dom', 'json', 'libxml', diff --git a/lib/P2Util.php b/lib/P2Util.php index 345d91262..5596ae0b8 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -263,26 +263,11 @@ static public function fileDownload($url, $localfile, try { // DL - $req = new HTTP_Request2($url, HTTP_Request2::METHOD_GET); + $req = self::getHTTPRequest2($url, HTTP_Request2::METHOD_GET); $purl = parse_url($url); // URL分解 $req->setHeader('User-Agent', self::getP2UA(true,self::isHost2chs($purl['host']))); unset($purl); - $req->setConfig(array( - 'connect_timeout' => $_conf['http_conn_timeout'], - 'timeout' => $_conf['http_read_timeout'], - 'follow_redirects' => $trace_redirection, - )); - - if ($_conf['proxy_use']) { - $req->setConfig (array ( - 'proxy_host' => $_conf['proxy_host'], - 'proxy_port' => $_conf['proxy_port'], - 'proxy_user' => $_conf['proxy_user'], - 'proxy_password' => $_conf['proxy_password'] - )); - } - $response = $req->send(); $code = $response->getStatus(); @@ -299,10 +284,10 @@ static public function fileDownload($url, $localfile, if (isset($error_msg) && strlen($error_msg) > 0) { // エラーメッセージを設定 if ($disp_error) { - $url_t = P2Util::throughIme($url); + $url_t = self::throughIme($url); $info_msg_ht = "<p class=\"info-msg\">Error: {$error_msg}<br>"; $info_msg_ht .= "rep2 info: <a href=\"{$url_t}\"{$_conf['ext_win_target_at']}>{$url}</a> に接続できませんでした。</p>"; - P2Util::pushInfoHtml($info_msg_ht); + self::pushInfoHtml($info_msg_ht); } return null; } @@ -1709,30 +1694,19 @@ static public function mkTrip2($key) */ static public function getWebPage($url, &$error_msg, $timeout = 15) { - $params = array("timeout" => $timeout); - - if (!empty($_conf['proxy_use'])) { - $params['proxy_host'] = $_conf['proxy_host']; - $params['proxy_port'] = $_conf['proxy_port']; - } - - $req = new HTTP_Request($url, $params); - //$req->addHeader("X-PHP-Version", phpversion()); + try { + $req = self::getHTTPRequest2($url, HTTP_Request2::METHOD_GET); + //$req->addHeader("X-PHP-Version", phpversion()); - $response = $req->sendRequest(); + $response = $req->send(); - if (PEAR::isError($response)) { - $error_msg = $response->getMessage(); - } else { - $code = $req->getResponseCode(); + $code = $response->getStatus(); if ($code == 200 || $code == 206) { // || $code == 304) { - return $req->getResponseBody(); - } else { - //var_dump($req->getResponseHeader()); - $error_msg = $code; + return $response->getBody(); } + } catch (Exception $e) { + return false; } - return false; } @@ -2194,7 +2168,7 @@ static public function getBe2chCodeWithUserConf() global $_conf; if ($_conf['be_2ch_mail'] && strlen($_conf['be_2ch_password'])) { - $r = P2Util::getBe2chCodeByMailPass($_conf['be_2ch_mail'], $_conf['be_2ch_password']); + $r = self::getBe2chCodeByMailPass($_conf['be_2ch_mail'], $_conf['be_2ch_password']); if (is_array($r)) { return $r; } @@ -2226,19 +2200,9 @@ static public function getBe2chCodeByMailPass($mail, $pass) } try { - $req = new HTTP_Request2('http://be.2ch.net/index.php', HTTP_Request2::METHOD_POST); - - $req->setHeader('User-Agent', P2Util::getP2UA(true,true)); - - // プロキシ - if ($_conf['proxy_use']) { - $req->setConfig(array( - 'proxy_host' => $_conf['proxy_host'], - 'proxy_port' => $_conf['proxy_port'], - 'proxy_user' => $_conf['proxy_user'], - 'proxy_password' => $_conf['proxy_password'] - )); - } + $req = self::getHTTPRequest2 ('http://be.2ch.net/index.php', HTTP_Request2::METHOD_POST); + + $req->setHeader('User-Agent', self::getP2UA(true,true)); $req->addPostParameter('mail', $mail); $req->addPostParameter('pass', $pass); @@ -2270,6 +2234,49 @@ static public function getBe2chCodeByMailPass($mail, $pass) return false; // $error_msg } + // }}} + // {{{ getHTTPRequest2() + + /** + * HTTP_Request2クラスのインスタンスを生成する + * + * @param $url HTTP_Request2と同じ + * @param $method HTTP_Request2と同じ + * @return HTTP_Request2 + */ + static public function getHTTPRequest2($url , $method = HTTP_Request2::METHOD_GET) + { + global $_conf; + + $req = new HTTP_Request2($url, $method); + + // タイムアウトの設定 + $req->setConfig (array ( + 'connect_timeout' => $_conf['http_conn_timeout'], + 'timeout' => $_conf['http_read_timeout'], + )); + + // SSLの設定 + $req->setAdapter($_conf['ssl_function']); + + if($_conf['ssl_capath']) + { + $req->setConfig ('ssl_capath', $_conf['ssl_capath']); + } + + // プロキシ + if ($_conf['proxy_use']) { + $req->setConfig (array ( + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] + )); + } + + return $req; + } + // }}} // {{{ debug() /* diff --git a/lib/SettingTxt.php b/lib/SettingTxt.php index 94224ad6f..1a9d7466a 100644 --- a/lib/SettingTxt.php +++ b/lib/SettingTxt.php @@ -95,26 +95,11 @@ public function downloadSettingTxt() // DL try { - $req = new HTTP_Request2($this->_url, HTTP_Request2::METHOD_GET); + $req = P2Util::getHTTPRequest2($this->_url, HTTP_Request2::METHOD_GET); $modified && $req->setHeader("If-Modified-Since", $modified); // APIを使用する設定で相手が2chだったらAPIのUAを送る $req->setHeader('User-Agent', P2Util::getP2UA(true,P2Util::isHost2chs($this->host))); - $req->setConfig (array ( - 'connect_timeout' => $_conf['http_conn_timeout'], - 'timeout' => $_conf['http_read_timeout'], - 'follow_redirects' => false - )); - - // プロキシ - if ($_conf['proxy_use']) { - $req->setConfig (array ( - 'proxy_host' => $_conf['proxy_host'], - 'proxy_port' => $_conf['proxy_port'], - 'proxy_user' => $_conf['proxy_user'], - 'proxy_password' => $_conf['proxy_password'] - )); - } $response = $req->send(); diff --git a/lib/SubjectTxt.php b/lib/SubjectTxt.php index 1bb025d54..3b412d5fc 100644 --- a/lib/SubjectTxt.php +++ b/lib/SubjectTxt.php @@ -87,26 +87,11 @@ public function downloadSubject() // DL try { - $req = new HTTP_Request2($this->subject_url, HTTP_Request2::METHOD_GET); + $req = P2Util::getHTTPRequest2($this->subject_url, HTTP_Request2::METHOD_GET); $modified && $req->setHeader("If-Modified-Since", $modified); // APIを使用する設定で相手が2chだったらAPIのUAを送る $req->setHeader('User-Agent', P2Util::getP2UA(true,P2Util::isHost2chs($this->host))); - $req->setConfig (array ( - 'connect_timeout' => $_conf['http_conn_timeout'], - 'timeout' => $_conf['http_read_timeout'], - 'follow_redirects' => false - )); - - // プロキシ - if ($_conf['proxy_use']) { - $req->setConfig (array ( - 'proxy_host' => $_conf['proxy_host'], - 'proxy_port' => $_conf['proxy_port'], - 'proxy_user' => $_conf['proxy_user'], - 'proxy_password' => $_conf['proxy_password'] - )); - } $response = $req->send(); diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index c8b2b8f2d..7ece08944 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -171,14 +171,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { $purl = parse_url ($url); // URL分解 try { - $req = new HTTP_Request2 ($url, HTTP_Request2::METHOD_POST); - - $req->setAdapter($_conf['ssl_function']); - - if($_conf['ssl_capath']) - { - $req->setConfig ('ssl_capath', $_conf['ssl_capath']); - } + $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_POST); // ヘッダ $req->setHeader ('User-Agent', $ReadUA); @@ -200,22 +193,6 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { $req->setAuth ($purl['user'], $purl['pass'], HTTP_Request2::AUTH_BASIC); } - $req->setConfig (array ( - 'connect_timeout' => $_conf['http_conn_timeout'], - 'timeout' => $_conf['http_read_timeout'], - 'follow_redirects' => false - )); - - // プロキシ - if ($_conf['proxy_use']) { - $req->setConfig (array ( - 'proxy_host' => $_conf['proxy_host'], - 'proxy_port' => $_conf['proxy_port'], - 'proxy_user' => $_conf['proxy_user'], - 'proxy_password' => $_conf['proxy_password'] - )); - } - // POSTする内容 $req->addPostParameter (array ( 'sid' => $sid, @@ -368,7 +345,7 @@ protected function _downloadDat2ch($from_bytes) { // $request .= "Accept-Encoding: gzip, deflate\r\n"; try { - $req = new HTTP_Request2 ($url, HTTP_Request2::METHOD_GET); + $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_GET); // ヘッダ $req->setHeader ('User-Agent', P2Util::getP2UA (true)); $req->setHeader ('Referer', "http://{$purl['host']}/{$this->bbs}/"); @@ -390,22 +367,6 @@ protected function _downloadDat2ch($from_bytes) { $req->setAuth ($purl['user'], $purl['pass'], HTTP_Request2::AUTH_BASIC); } - $req->setConfig (array ( - 'connect_timeout' => $_conf['http_conn_timeout'], - 'timeout' => $_conf['http_read_timeout'], - 'follow_redirects' => false - )); - - // プロキシ - if ($_conf['proxy_use']) { - $req->setConfig (array ( - 'proxy_host' => $_conf['proxy_host'], - 'proxy_port' => $_conf['proxy_port'], - 'proxy_user' => $_conf['proxy_user'], - 'proxy_password' => $_conf['proxy_password'] - )); - } - // Requestの送信 $response = $req->send (); @@ -551,27 +512,11 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma = false) { $purl = parse_url ($url); // URL分解 try { - $req = new HTTP_Request2 ($url, HTTP_Request2::METHOD_GET); + $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_GET); // ヘッダ $req->setHeader ('User-Agent', "{$uaMona} ({$_conf['p2ua']})"); $req->setHeader ('Accept-Encoding', "gzip, deflate"); - $req->setConfig (array ( - 'connect_timeout' => $_conf['http_conn_timeout'], - 'timeout' => $_conf['http_read_timeout'], - 'follow_redirects' => false - )); - - // プロキシ - if ($_conf['proxy_use']) { - $req->setConfig (array ( - 'proxy_host' => $_conf['proxy_host'], - 'proxy_port' => $_conf['proxy_port'], - 'proxy_user' => $_conf['proxy_user'], - 'proxy_password' => $_conf['proxy_password'] - )); - } - // Requestの送信 $response = $req->send (); @@ -656,27 +601,12 @@ protected function _downloadDat2chKako($uri, $ext) { $purl = parse_url ($url); // URL分解 try { - $req = new HTTP_Request2 ($url, HTTP_Request2::METHOD_GET); + $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_GET); + // ヘッダ $req->setHeader ('User-Agent', P2Util::getP2UA(true)); $req->setHeader ('Accept-Encoding', "gzip, deflate"); - $req->setConfig (array ( - 'connect_timeout' => $_conf['http_conn_timeout'], - 'timeout' => $_conf['http_read_timeout'], - 'follow_redirects' => false - )); - - // プロキシ - if ($_conf['proxy_use']) { - $req->setConfig (array ( - 'proxy_host' => $_conf['proxy_host'], - 'proxy_port' => $_conf['proxy_port'], - 'proxy_user' => $_conf['proxy_user'], - 'proxy_password' => $_conf['proxy_password'] - )); - } - // Requestの送信 $response = $req->send (); @@ -768,27 +698,11 @@ public function get2chDatError($code = null) { $read_response_html = ''; if (! $reason) { try { - $req = new HTTP_Request2 ($read_url, HTTP_Request2::METHOD_GET); + $req = P2Util::getHTTPRequest2 ($read_url, HTTP_Request2::METHOD_GET); // ヘッダ $req->setHeader ('User-Agent', P2Util::getP2UA(false,P2Util::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG $req->setHeader ('Accept-Encoding', "gzip, deflate"); - $req->setConfig (array ( - 'connect_timeout' => $_conf['http_conn_timeout'], - 'timeout' => $_conf['http_read_timeout'], - 'follow_redirects' => false - )); - - // プロキシ - if ($_conf['proxy_use']) { - $req->setConfig (array ( - 'proxy_host' => $_conf['proxy_host'], - 'proxy_port' => $_conf['proxy_port'], - 'proxy_user' => $_conf['proxy_user'], - 'proxy_password' => $_conf['proxy_password'] - )); - } - // Requestの送信 $response = $req->send (); @@ -1513,17 +1427,7 @@ private function _get2ch203Body() { */ try { $url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; - $req = new HTTP_Request2 ($url,HTTP_Request2::METHOD_GET); - - // プロキシ - if ($_conf['proxy_use']) { - $req->setConfig (array ( - 'proxy_host' => $_conf['proxy_host'], - 'proxy_port' => $_conf['proxy_port'], - 'proxy_user' => $_conf['proxy_user'], - 'proxy_password' => $_conf['proxy_password'] - )); - } + $req = P2Util::getHTTPRequest2 ($url,HTTP_Request2::METHOD_GET); $res = $req->send (); diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index 740ee9dec..030c0f2cb 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -35,26 +35,11 @@ function authenticate_2chapi() } try { - $req = new HTTP_Request2($url,HTTP_Request2::METHOD_POST); + $req = P2Util::getHTTPRequest2($url,HTTP_Request2::METHOD_POST); + $req->setHeader('User-Agent', $AuthUA); $req->setHeader('X-2ch-UA', $AppName); - $req->setAdapter($_conf['ssl_function']); - - if($_conf['ssl_capath']) - { - $req->setConfig ('ssl_capath', $_conf['ssl_capath']); - } - - // プロキシ - if ($_conf['proxy_use']) { - $req->setConfig (array ( - 'proxy_host' => $_conf['proxy_host'], - 'proxy_port' => $_conf['proxy_port'], - 'proxy_user' => $_conf['proxy_user'], - 'proxy_password' => $_conf['proxy_password'] - )); - } $req->addPostParameter('ID', $login2chID); $req->addPostParameter('PW', $login2chPW); $req->addPostParameter('KY', $AppKey); diff --git a/lib/login2ch.inc.php b/lib/login2ch.inc.php index b1cf64fcf..5bcd50d37 100644 --- a/lib/login2ch.inc.php +++ b/lib/login2ch.inc.php @@ -38,26 +38,13 @@ function login2ch() } try { - $req = new HTTP_Request2($auth2ch_url,HTTP_Request2::METHOD_POST); + $req = P2Util::getHTTPRequest2($auth2ch_url,HTTP_Request2::METHOD_POST); + + // ヘッダー $req->setHeader('User-Agent', $dolib2ch); $req->setHeader('X-2ch-UA', $x_2ch_ua); - $req->setAdapter($_conf['ssl_function']); - - if($_conf['ssl_capath']) - { - $req->setConfig ('ssl_capath', $_conf['ssl_capath']); - } - - // プロキシ - if ($_conf['proxy_use']) { - $req->setConfig (array ( - 'proxy_host' => $_conf['proxy_host'], - 'proxy_port' => $_conf['proxy_port'], - 'proxy_user' => $_conf['proxy_user'], - 'proxy_password' => $_conf['proxy_password'] - )); - } + // POSTデータ $req->addPostParameter('ID', $login2chID); $req->addPostParameter('PW', $login2chPW); diff --git a/lib/wiki/P2UtilWiki.php b/lib/wiki/P2UtilWiki.php index 86f867b66..52d31c5ad 100644 --- a/lib/wiki/P2UtilWiki.php +++ b/lib/wiki/P2UtilWiki.php @@ -40,20 +40,10 @@ public static function isUrlImepita($url) public static function getResponseCode($url) { try { - $req = new HTTP_Request2($url, HTTP_Request2::METHOD_HEAD); + $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_HEAD); $req->setHeader('User-Agent', 'Monazilla/1.00'); - // プロキシ - if ($_conf['proxy_use']) { - $req->setConfig(array( - 'proxy_host' => $_conf['proxy_host'], - 'proxy_port' => $_conf['proxy_port'], - 'proxy_user' => $_conf['proxy_user'], - 'proxy_password' => $_conf['proxy_password'] - )); - } - return $response->getStatus(); } catch (Exception $e) { diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php index 2649cda26..9747d8828 100644 --- a/rep2/dig2ch.php +++ b/rep2/dig2ch.php @@ -12,24 +12,10 @@ function dig2chsearch($query) $url = $_conf['test.dig2ch_url'] . '?AndOr=' . $query_arry['AndOr'] . '&maxResult=' . $query_arry['maxResult'] . '&atLeast=1&Sort=' . $query_arry['Sort'] . '&Link=1&Bbs=all&924=' . $query_arry['924'] . '&json=1&keywords=' . $query_arry['q']; try { - $req = new HTTP_Request2($url, HTTP_Request2::METHOD_GET); + $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_GET); $req->setHeader('User-Agent', $_SERVER['HTTP_USER_AGENT']); $req->setHeader('Acecpt-Language', 'ja'); - $req->setConfig(array( - 'connect_timeout' => $_conf['http_conn_timeout'], - 'timeout' => $_conf['http_read_timeout'], - )); - - if ($_conf['proxy_use']) { - $req->setConfig (array ( - 'proxy_host' => $_conf['proxy_host'], - 'proxy_port' => $_conf['proxy_port'], - 'proxy_user' => $_conf['proxy_user'], - 'proxy_password' => $_conf['proxy_password'] - )); - } - $response = $req->send(); $code = $response->getStatus(); diff --git a/rep2/post.php b/rep2/post.php index 35f98cb97..55246b821 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -381,25 +381,11 @@ function postIt($host, $bbs, $key, $post) $bbs_cgi_url = 'http://' . $host . $bbs_cgi; try { - $req = new HTTP_Request2($bbs_cgi_url,HTTP_Request2::METHOD_POST); + $req = P2Util::getHTTPRequest2 ($bbs_cgi_url,HTTP_Request2::METHOD_POST); + // ヘッダ $req->setHeader('User-Agent', P2Util::getP2UA(true,P2Util::isHost2chs($host))); $req->setHeader('Referer', "http://{$host}/{$bbs}/{$key}/"); - $req->setConfig(array( - 'connect_timeout' => $_conf['http_conn_timeout'], - 'timeout' => $_conf['http_read_timeout'], - //'follow_redirects' => true, - )); - - // プロキシ - if ($_conf['proxy_use']) { - $req->setConfig(array( - 'proxy_host' => $_conf['proxy_host'], - 'proxy_port' => $_conf['proxy_port'], - 'proxy_user' => $_conf['proxy_user'], - 'proxy_password' => $_conf['proxy_password'] - )); - } // クッキー if ($p2cookies) { From 7084915b9f205c9f98ca0d27ea6bbe0944426bb4 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 2 Apr 2015 13:44:07 +0900 Subject: [PATCH 107/339] =?UTF-8?q?=E6=8E=A5=E7=B6=9A=E5=85=88=E3=81=8C2ch?= =?UTF-8?q?.net=E3=81=AA=E3=82=89=E3=81=B0SSL=E9=80=9A=E4=BF=A1=E3=82=92?= =?UTF-8?q?=E8=A1=8C=E3=81=86=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= =?UTF-8?q?(pink=E3=81=AF=E5=AF=BE=E5=BF=9C=E3=81=97=E3=81=A6=E3=81=84?= =?UTF-8?q?=E3=81=AA=E3=81=84=E3=81=AE=E3=81=A7=E3=81=97=E3=81=AA=E3=81=84?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/SettingTxt.php | 7 ++++++- lib/SubjectTxt.php | 12 ++++++++++-- rep2/post.php | 7 ++++++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/SettingTxt.php b/lib/SettingTxt.php index 1a9d7466a..ce6b95975 100644 --- a/lib/SettingTxt.php +++ b/lib/SettingTxt.php @@ -37,7 +37,12 @@ public function __construct($host, $bbs) $this->_setting_txt = $dat_host_bbs_dir_s . 'SETTING.TXT'; $this->_setting_srd = $dat_host_bbs_dir_s . 'p2_kb_setting.srd'; - $this->_url = 'http://' . $host . '/' . $bbs . '/SETTING.TXT'; + // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) + if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host)) { + $this->_url = 'https://' . $host . '/' . $bbs . '/SETTING.TXT'; + } else { + $this->_url = 'http://' . $host . '/' . $bbs . '/SETTING.TXT'; + } //$this->_url = P2Util::adjustHostJbbs($this->_url); // したらばのlivedoor移転に対応。読込先をlivedoorとする。 $this->setting_array = array(); diff --git a/lib/SubjectTxt.php b/lib/SubjectTxt.php index 3b412d5fc..995fde7e1 100644 --- a/lib/SubjectTxt.php +++ b/lib/SubjectTxt.php @@ -29,10 +29,18 @@ public function __construct($host, $bbs) $this->storage = 'file'; $this->subject_file = P2Util::datDirOfHostBbs($host, $bbs) . 'subject.txt'; - $this->subject_url = 'http://' . $host . '/' . $bbs . '/subject.txt'; + // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) + if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host)) { + $this->subject_url = 'https://' . $host . '/' . $bbs . '/subject.txt'; + } else { + $this->subject_url = 'http://' . $host . '/' . $bbs . '/subject.txt'; + } // したらばのlivedoor移転に対応。読込先をlivedoorとする。 - $this->subject_url = P2Util::adjustHostJbbs($this->subject_url); + if(P2Util::isHostJbbsShitaraba($host)) + { + $this->subject_url = P2Util::adjustHostJbbs($this->subject_url); + } // subject.txtをダウンロード&セットする $this->dlAndSetSubject(); diff --git a/rep2/post.php b/rep2/post.php index 55246b821..71809c1ee 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -378,7 +378,12 @@ function postIt($host, $bbs, $key, $post) global $_conf, $post_result, $post_error2ch, $p2cookies, $popup, $rescount, $ttitle_en; global $bbs_cgi; - $bbs_cgi_url = 'http://' . $host . $bbs_cgi; + // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) + if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host)) { + $bbs_cgi_url = 'https://' . $host . $bbs_cgi; + } else { + $bbs_cgi_url = 'http://' . $host . $bbs_cgi; + } try { $req = P2Util::getHTTPRequest2 ($bbs_cgi_url,HTTP_Request2::METHOD_POST); From bc8fbdee868e2ef32e872a0b45481dacdfe862e5 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 2 Apr 2015 14:07:44 +0900 Subject: [PATCH 108/339] v150402.1350 --- conf/conf.inc.php | 2 +- doc/README-774.txt | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index f0d91e866..36c180d3c 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150401.2321', // rep2のバージョン + 'p2version' => '150402.1350', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index ad331c03b..8e789d442 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -36,6 +36,12 @@ rep2-expack test https://github.com/orzisun/p2-php 本家p2と同じく、X11ライセンスです。 ●ChangeLog +150402.1350 +・接続先が2ch.netならばSSL通信を行うように変更(pinkとbeログイン認証は対応していないのでしない) +・ssl_functionのデフォルト設定をcURLに変更 +・SSL通信以外でもSSLの設定が反映されるように変更 +・上記変更のためcURL必須に変更 + 150401.2321 ・認証付プロキシに対応(BASIC認証のみ) ・SSL通信のopenSSLとcURLを切り替えることが出来る設定を追加 From d8b870508aa4a8f88046cdf583cc799831c612c6 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 3 Apr 2015 00:57:12 +0900 Subject: [PATCH 109/339] =?UTF-8?q?http://page2.skr.jp/rep2/=20=E3=81=8C?= =?UTF-8?q?=E6=B6=88=E6=BB=85=E3=81=97=E3=81=A6=E3=81=97=E3=81=BE=E3=81=A3?= =?UTF-8?q?=E3=81=9F=E3=81=AE=E3=81=A7gate.php=E3=81=AE=E4=BB=A3=E6=9B=BF?= =?UTF-8?q?=E3=82=92=E4=BD=9C=E6=88=90=E3=81=97=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 8 ++++---- rep2/title.php | 9 +++++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 36c180d3c..d1554ef84 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -75,12 +75,12 @@ function p2_init() $_conf['p2web_url'] = 'http://akid.s17.xrea.com/'; $_conf['p2ime_url'] = 'http://akid.s17.xrea.com/p2ime.php'; $_conf['favrank_url'] = 'http://akid.s17.xrea.com/favrank/favrank.php'; - $_conf['expack.web_url'] = 'http://page2.skr.jp/rep2/'; - $_conf['expack.download_url'] = 'http://page2.skr.jp/rep2/downloads.html'; - $_conf['expack.history_url'] = 'http://page2.skr.jp/rep2/history.html'; + $_conf['expack.web_url'] = 'http://2ch774.github.io/p2-php/'; + $_conf['expack.download_url'] = 'https://github.com/2ch774/p2-php/releases'; + $_conf['expack.history_url'] = 'https://github.com/2ch774/p2-php/blob/master/doc/ChangeLog.txt'; $_conf['expack.tgrep_url'] = 'http://page2.xrea.jp/tgrep/search'; $_conf['test.dig2ch_url'] = 'http://dig.2ch.net/'; - $_conf['expack.gate_php'] = 'http://page2.skr.jp/gate.php'; + $_conf['expack.gate_php'] = 'http://2ch774.github.io/p2-php/gate.html'; $_conf['menu_php'] = 'menu.php'; $_conf['subject_php'] = 'subject.php'; $_conf['read_php'] = 'read.php'; diff --git a/rep2/title.php b/rep2/title.php index c9bddb914..fdff4a7ed 100644 --- a/rep2/title.php +++ b/rep2/title.php @@ -20,6 +20,10 @@ $expack_dl_url_r = P2Util::throughIme($_conf['expack.download_url']); $expack_hist_url_r = P2Util::throughIme($_conf['expack.history_url']); +// rskさんのサイトへのリンクを表示するため by 2ch774 +$rsk_expack_url = "http://rsky.github.io/p2-php/"; +$rsk_expack_url_r = P2Util::throughIme($rsk_expack_url); + // {{{ データ保存ディレクトリのパーミッションの注意を喚起する P2Util::checkDirWritable($_conf['dat_dir']); @@ -54,9 +58,9 @@ //========================================================= // 最新版チェック $newversion_found = ''; -/*if (!empty($_conf['updatan_haahaa'])) { +if (!empty($_conf['updatan_haahaa'])) { $newversion_found = checkUpdatan(); -}*/ +} // ログインユーザ情報 $htm['auth_user'] = "<p>ログインユーザ: {$_login->user_u} - " . date("Y/m/d (D) G:i") . "</p>\n"; @@ -173,6 +177,7 @@ </td><td style="padding-left:30px;"> <p>{$_conf['p2name']} ver.{$_conf['p2version']} +live<br> <a href="{$expack_url_r}"{$_conf['ext_win_target_at']}>{$_conf['expack.web_url']}</a><br> + <a href="{$rsk_expack_url_r}"{$_conf['ext_win_target_at']}>{$rsk_expack_url}</a><br> <a href="{$p2web_url_r}"{$_conf['ext_win_target_at']}>{$_conf['p2web_url']}</a></p> <ul> <li><a href="viewtxt.php?file=doc/README.txt">README.txt</a></li> From 9ab35292b76d427d6e50f1e6f2b590e01ae87215 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 3 Apr 2015 22:10:38 +0900 Subject: [PATCH 110/339] =?UTF-8?q?2ch=E3=81=A8=E3=81=AESSL=E9=80=9A?= =?UTF-8?q?=E4=BF=A1=E3=82=92API=E4=BD=BF=E7=94=A8=E6=99=82=E3=81=AE?= =?UTF-8?q?=E3=81=BF=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/SettingTxt.php | 3 ++- lib/SubjectTxt.php | 3 ++- rep2/post.php | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/SettingTxt.php b/lib/SettingTxt.php index ce6b95975..a3c6558e6 100644 --- a/lib/SettingTxt.php +++ b/lib/SettingTxt.php @@ -28,6 +28,7 @@ class SettingTxt */ public function __construct($host, $bbs) { + global $_conf; $this->_cache_interval = 60 * 60 * 12; // キャッシュは12時間有効 $this->_host = $host; @@ -38,7 +39,7 @@ public function __construct($host, $bbs) $this->_setting_srd = $dat_host_bbs_dir_s . 'p2_kb_setting.srd'; // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) - if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host)) { + if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host) && $_conf['2chapi_use'] == 1) { $this->_url = 'https://' . $host . '/' . $bbs . '/SETTING.TXT'; } else { $this->_url = 'http://' . $host . '/' . $bbs . '/SETTING.TXT'; diff --git a/lib/SubjectTxt.php b/lib/SubjectTxt.php index 995fde7e1..6a00345c4 100644 --- a/lib/SubjectTxt.php +++ b/lib/SubjectTxt.php @@ -24,13 +24,14 @@ class SubjectTxt */ public function __construct($host, $bbs) { + global $_conf; $this->host = $host; $this->bbs = $bbs; $this->storage = 'file'; $this->subject_file = P2Util::datDirOfHostBbs($host, $bbs) . 'subject.txt'; // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) - if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host)) { + if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host) && $_conf['2chapi_use'] == 1) { $this->subject_url = 'https://' . $host . '/' . $bbs . '/subject.txt'; } else { $this->subject_url = 'http://' . $host . '/' . $bbs . '/subject.txt'; diff --git a/rep2/post.php b/rep2/post.php index 71809c1ee..1288a9187 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -379,7 +379,7 @@ function postIt($host, $bbs, $key, $post) global $bbs_cgi; // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) - if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host)) { + if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host) && $_conf['2chapi_use'] == 1) { $bbs_cgi_url = 'https://' . $host . $bbs_cgi; } else { $bbs_cgi_url = 'http://' . $host . $bbs_cgi; From ca6328ba6d11f8d0b79de6611d573dd6a7cfb954 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sat, 4 Apr 2015 08:13:39 +0900 Subject: [PATCH 111/339] =?UTF-8?q?HTTP=E6=8E=A5=E7=B6=9A=E3=81=A7?= =?UTF-8?q?=E3=81=AFSSL=E9=96=A2=E4=BF=82=E3=81=AE=E8=A8=AD=E5=AE=9A?= =?UTF-8?q?=E3=82=92=E7=84=A1=E8=A6=96=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index 5596ae0b8..38e29d96c 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -2240,7 +2240,7 @@ static public function getBe2chCodeByMailPass($mail, $pass) /** * HTTP_Request2クラスのインスタンスを生成する * - * @param $url HTTP_Request2と同じ + * @param string $url 文字列のURL(絶対に必須) * @param $method HTTP_Request2と同じ * @return HTTP_Request2 */ @@ -2248,6 +2248,13 @@ static public function getHTTPRequest2($url , $method = HTTP_Request2::METHOD_GE { global $_conf; + $protocol = parse_url($url, PHP_URL_SCHEME); + + if(empty($url) || $protocol === false) + { + throw new InvalidArgumentException("URLの指定が変です。"); + } + $req = new HTTP_Request2($url, $method); // タイムアウトの設定 @@ -2257,11 +2264,13 @@ static public function getHTTPRequest2($url , $method = HTTP_Request2::METHOD_GE )); // SSLの設定 - $req->setAdapter($_conf['ssl_function']); + if($protocol == 'https') { + $req->setAdapter($_conf['ssl_function']); - if($_conf['ssl_capath']) - { - $req->setConfig ('ssl_capath', $_conf['ssl_capath']); + if($_conf['ssl_capath']) + { + $req->setConfig ('ssl_capath', $_conf['ssl_capath']); + } } // プロキシ From 5c53324135570ab94d6be51d5b2fa9569184cdcb Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sat, 4 Apr 2015 11:27:42 +0900 Subject: [PATCH 112/339] =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E3=81=ABCookie=E3=82=84=E3=81=9D=E3=81=AE=E4=BB=96=E3=81=AE?= =?UTF-8?q?=E5=B1=A5=E6=AD=B4=E3=82=92=E5=89=8A=E9=99=A4=E5=87=BA=E6=9D=A5?= =?UTF-8?q?=E3=82=8B=E6=A9=9F=E8=83=BD=E3=82=92=E8=BF=BD=E5=8A=A0=E3=80=82?= =?UTF-8?q?=20rep2/editpref.php=E3=81=ABlib/wiki/editpref.inc.php=E3=82=92?= =?UTF-8?q?=E7=B5=B1=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/wiki/editpref.inc.php | 16 ----- rep2/editpref.php | 126 +++++++++++++++++++++++++++++++++++++- 2 files changed, 123 insertions(+), 19 deletions(-) delete mode 100644 lib/wiki/editpref.inc.php diff --git a/lib/wiki/editpref.inc.php b/lib/wiki/editpref.inc.php deleted file mode 100644 index 3fac320ef..000000000 --- a/lib/wiki/editpref.inc.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php - -// +Wiki -// {{{ PC - +Wiki -echo "<td>\n\n"; -echo <<<EOP -<fieldset> -<legend>+Wiki</legend> - <a href="edit_link_plugin.php{$_conf['k_at_q']}">リンクプラグイン編集</a> | - <a href="edit_dat_plugin.php{$_conf['k_at_q']}">DAT取得プラグイン編集</a> | - <a href="edit_replace_imageurl.php{$_conf['k_at_q']}">置換画像URLプラグイン編集</a> -</fieldset>\n -EOP; -echo "</td></tr>\n\n"; - -// }}} \ No newline at end of file diff --git a/rep2/editpref.php b/rep2/editpref.php index 778ce4c33..83f84ff63 100644 --- a/rep2/editpref.php +++ b/rep2/editpref.php @@ -88,6 +88,39 @@ // お気に入りセット変更があれば、設定ファイルを書き換える } elseif ($_conf['expack.misc.multi_favs'] && isset($_POST['favsetlist'])) { updateFavSetList(); + +} elseif (isset($_POST['delete']) && isset($_POST['submit'])) { // 履歴の削除処理 + switch ($_POST['delete']) { + case cookie: + // cookie + $delflag = CookieDataStore::clear() === flase ? false : true; + break; + case matome: + // 新着まとめ読み + $delflag = MatomeCacheList::trim(0) === flase ? false : true; + break; + case recent: + // 最近読んだスレ + $delflag = deleteFile($_conf['recent_idx']); + break; + case reshist: + // 書込履歴 + if(deleteFile($_conf['res_hist_idx']) && + deleteFile($_conf['res_hist_dat']) && + deleteFile($_conf['res_hist_dat_php']) ) { + $delflag = true; + } + break; + default: + $delflag = false; + P2Util::pushInfoHtml("<p>p2 error: 引数 {$_POST['delete']} が不正です。 "); + break; + } + if ($delflag) { + P2Util::pushInfoHtml("<p>p2 info: {$_POST['submit']}を削除しました。"); + } else { + P2Util::pushInfoHtml("<p>p2 error: {$_POST['submit']}の削除に失敗しました。"); + } } // }}} @@ -267,7 +300,7 @@ // }}} // {{{ PC - +live ハイライトワード編集 - echo "<td>\n\n"; + echo "<tr><td>\n\n"; echo <<<EOP <fieldset> @@ -281,9 +314,41 @@ </fieldset>\n EOP; - echo "</td></tr>"; + echo "</td>"; // }}} + // {{{ PC - 2ch774 履歴・キャッシュの削除 + + echo "<td>\n\n"; + + echo <<<EOP +<fieldset> +<legend>履歴・キャッシュの削除</legend>\n +<script type="text/javascript"> +//<![CDATA[ +function deleteCheck(submit){ + if(window.confirm(submit + 'を全て削除してよろしいですか?')){ + return true; + } + else{ + return false; // 送信を中止 + } +} +//]]> +</script> + +EOP; + echo getDeleteHistoryFormHt('cookie', 'Cookie'); + echo getDeleteHistoryFormHt('matome', '新着まとめ読み'); + echo getDeleteHistoryFormHt('reshist', '書込履歴'); + echo getDeleteHistoryFormHt('recent', '最近読んだスレ'); + echo <<<EOP +</fieldset>\n +EOP; + + echo "</td></tr>"; + + // }}} // {{{ PC - ホストの同期 HTMLのセット echo <<<EOP @@ -335,7 +400,20 @@ echo "</td></tr>\n\n"; } - include_once P2_LIB_DIR . '/wiki/editpref.inc.php'; + // }}} + // +Wiki + // {{{ PC - +Wiki + echo "<tr><td>\n\n"; + echo <<<EOP +<fieldset> +<legend>+Wiki</legend> + <a href="edit_link_plugin.php{$_conf['k_at_q']}" target="_self">リンクプラグイン編集</a> | + <a href="edit_dat_plugin.php{$_conf['k_at_q']}" target="_self">DAT取得プラグイン編集</a> | + <a href="edit_replace_imageurl.php{$_conf['k_at_q']}" target="_self">置換画像URLプラグイン編集</a> +</fieldset>\n +EOP; + echo "</td></tr>\n\n"; + // }}} } @@ -587,6 +665,34 @@ function getSyncFavoritesFormHt($path_value, $submit_value) return $ht; } +// }}} +// {{{ getDeleteHistoryFormHt() + +/** + * 履歴削除用フォームのHTMLを取得する + * + * @param string $path_value 削除するファイルの種類 + * @param string $submit_value submitボタンの値 + * @return string + */ +function getDeleteHistoryFormHt($path_value, $submit_value) +{ + global $_conf; + + $ht = <<<EOFORM +<form action="editpref.php" method="POST" target="_self" class="inline-form" onSubmit="return deleteCheck('{$submit_value}')"> + {$_conf['k_input_ht']} + <input type="hidden" name="delete" value="{$path_value}"> + <input type="submit" name="submit" value="{$submit_value}"> +</form>\n +EOFORM; + + if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) { + $ht = ' ' . preg_replace('/>\s+</', '><', $ht); + } + return $ht; +} + // }}} // {{{ getFavSetListFormHt() @@ -740,6 +846,20 @@ function compareSkinNames($a, $b) return strcmp($a, $b); } +// }}} +// {{{ deleteFile() + +/** + * ファイルを削除する。 + * + * @param string ファイル名 + * @return boolean 既に無いか削除に成功したらtrue + */ +function deleteFile($filename) +{ + return file_exists($filename) ? unlink($filename) : true; +} + // }}} /* From b11e66f55cb47a71db6616c8c8e87100478e1e62 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sat, 4 Apr 2015 13:31:31 +0900 Subject: [PATCH 113/339] =?UTF-8?q?=E5=90=8D=E7=84=A1=E3=81=97=E3=81=8C?= =?UTF-8?q?=E7=AF=80=E7=A9=B4=E3=81=AB=E3=81=AA=E3=82=8B=E6=9D=BF=E3=81=AF?= =?UTF-8?q?=E8=AD=A6=E5=91=8A=E3=82=92=E5=87=BA=E3=81=99=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=97=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/post_form_options.inc.php | 27 ++++++++++++++++++++++++--- rep2/js/post_form.js | 13 +++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index 908b6ff4c..dafe87791 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -223,6 +223,7 @@ function setHiddenValue(button) { $_dpreview_noname = $_dpreview_st->setting_array['BBS_NONAME_NAME']; $_dpreview_noname = '"' . StrCtl::toJavaScript($_dpreview_noname) . '"'; } + unset($_dpreview_st); } $_dpreview_hide = 'false'; if ($_conf['expack.editor.dpreview'] == 2) { @@ -315,11 +316,31 @@ function setHiddenValue(button) { $onsubmit_at = ''; -if (!$_conf['ktai']) { +if (!$_conf['ktai'] || $_conf['iphone']) { if (!preg_match('{NetFront|AVE-?Front/}', $_SERVER['HTTP_USER_AGENT'])) { - $onsubmit_at = sprintf(' onsubmit="if (validateAll(%s,%s)) { switchBlockSubmit(true); return true; } else { return false }"', + + // 名無しで書くと節穴になる板をチェックして警告を出す。 + $confirmNanashi = false; + $_st = new SettingTxt($host, $bbs); + $_st->setSettingArray(); + + // 名無しが節穴 + if (strpos($_st->setting_array['BBS_NONAME_NAME'], "fusianasan")) { + $confirmNanashi = true; + } + + // 名無しで書けない + if($_st->setting_array['BBS_NANASHI_CHECK']=='1') + { + $confirmNanashi = true; + } + + unset($_st); + + $onsubmit_at = sprintf(' onsubmit="if (validateAll(%s,%s) && confirmNanashi(%s)) { switchBlockSubmit(true); return true; } else { return false }"', (($_conf['expack.editor.check_message']) ? 'true' : 'false'), - (($_conf['expack.editor.check_sage']) ? 'true' : 'false')); + (($_conf['expack.editor.check_sage']) ? 'true' : 'false'), + ($confirmNanashi ? 'true' : 'false')); } } diff --git a/rep2/js/post_form.js b/rep2/js/post_form.js index 5fafa002a..95ea1f1fe 100644 --- a/rep2/js/post_form.js +++ b/rep2/js/post_form.js @@ -194,3 +194,16 @@ function validateSage() { } return true; } + +// 引数にtrueを指定したら名無しで書込するかどうか確認する +function confirmNanashi(doconfirmNanashi) { + // 引数がtrueで名前欄が0文字(名無し)ならば + if (doconfirmNanashi && document.getElementById('FROM').value.length == 0) { + if(window.confirm('この板は名無しでの書き込みが制限されているか\n名無しに fusianasan が含まれています。\n名無しで書き込みますか?')) { + return true; + } else { + return false; + } + } + return true; +} \ No newline at end of file From a36dc7432cfa56ea04c7597f02231b6859ab113c Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sat, 4 Apr 2015 14:18:44 +0900 Subject: [PATCH 114/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=E5=90=91?= =?UTF-8?q?=E3=81=91=E8=A1=A8=E7=A4=BA=E3=81=A7=E7=AF=80=E7=A9=B4=E6=9D=BF?= =?UTF-8?q?=E3=82=92=E8=AD=A6=E5=91=8A=E3=81=99=E3=82=8B=E6=A9=9F=E8=83=BD?= =?UTF-8?q?=E3=81=8C=E5=8B=95=E4=BD=9C=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/post_form.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rep2/post_form.php b/rep2/post_form.php index 8c47d1009..f3230d454 100644 --- a/rep2/post_form.php +++ b/rep2/post_form.php @@ -110,6 +110,8 @@ if ($_conf['expack.editor.dpreview']) { echo "<link rel=\"stylesheet\" href=\"css.php?css=prvw&skin={$skin_en}\" type=\"text/css\">\n"; } +} +if (!$_conf['ktai'] || $_conf['iphone']) { echo <<<EOP <link rel="shortcut icon" type="image/x-icon" href="favicon.ico"> <script type="text/javascript" src="js/basic.js?{$_conf['p2_version_id']}"></script> From b5b3ac047853be56a4336b2a91bb625a0224348b Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 6 Apr 2015 11:32:21 +0900 Subject: [PATCH 115/339] v150406.1111 --- conf/conf.inc.php | 2 +- conf/conf_user_def.inc.php | 20 +++++++ doc/README-774.txt | 107 ++++++++++++++++++++----------------- doc/README-API.txt | 5 ++ lib/P2Util.php | 3 +- lib/SettingTxt.php | 2 +- lib/SubjectTxt.php | 2 +- lib/ThreadRead.php | 21 +++++--- lib/auth2chapi.inc.php | 9 +++- lib/login2ch.inc.php | 9 +++- rep2/edit_conf_user.php | 12 +++-- rep2/post.php | 7 +-- 12 files changed, 131 insertions(+), 68 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index d1554ef84..0332cfea4 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150402.1350', // rep2のバージョン + 'p2version' => '150406.1111', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index e1ddfbee2..47fd3d13f 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -427,6 +427,14 @@ 'Mozilla/3.0 (compatible; %s)' => '2 Mozilla/3.0 (compatible; AppName)', ); +// API認証にSSLを使用する +$conf_user_def['2chapi_ssl.auth'] = 1; // (1) +$conf_user_rad['2chapi_ssl.auth'] = array('1' => 'する', '0' => 'しない'); + +// DAT取得にSSLを使用する +$conf_user_def['2chapi_ssl.read'] = 1; // (1) +$conf_user_rad['2chapi_ssl.read'] = array('1' => 'する', '0' => 'しない'); + // デバッグ用の情報を出力する $conf_user_def['2chapi_debug_print'] = 0; // (0) $conf_user_rad['2chapi_debug_print'] = array('1' => 'する', '0' => 'しない'); @@ -560,6 +568,18 @@ // SSL通信の接続先を検証するために使用する証明書が格納されたディレクトリ ※検証できない時のみ指定 $conf_user_def['ssl_capath'] = ""; // () +// 2ch.netの●ログインにSSLを使用する +$conf_user_def['2ch_ssl.maru'] = 1; // (1) +$conf_user_rad['2ch_ssl.maru'] = array('1' => 'する', '0' => 'しない'); + +// 2ch.netのsubjec.txtとSETTING.TXTの取得にSSLを使用する +$conf_user_def['2ch_ssl.subject'] = 0; // (0) +$conf_user_rad['2ch_ssl.subject'] = array('1' => 'する', '0' => 'しない'); + +// 2ch.netの書き込みにSSLを使用する +$conf_user_def['2ch_ssl.post'] = 0; // (0) +$conf_user_rad['2ch_ssl.post'] = array('1' => 'する', '0' => 'しない'); + // }}} // {{{ 拡張パックとiPhone diff --git a/doc/README-774.txt b/doc/README-774.txt index 8e789d442..b73c70909 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -10,14 +10,14 @@ rep2-expack test https://github.com/orzisun/p2-php ●主な機能 -・「ユーザー設定編集」から+liveリンクの表示設定を変更可能 -・実況板のスレ一覧からスレを開いたときに自動的に実況モードでスレを開く設定を追加 -・3ペイン表示の配置を変更できる設定を追加 -・スレッドタイトルから著作権表記を削除する設定を追加 -・ローカル板一覧用.brdファイルの置き場所をrep2/boardから$_conf['data_dir']/brardに変更 -・cronとかで最近読んだスレなどのdatをDL出来るスクリプト追加 -・本家からbeのログイン部分を移植してBE2.0に対応 -・その他今時のアレに合わせた修正等gitのコミットログも確認してください。 +* 「ユーザー設定編集」から+liveリンクの表示設定を変更可能 +* 実況板のスレ一覧からスレを開いたときに自動的に実況モードでスレを開く設定を追加 +* 3ペイン表示の配置を変更できる設定を追加 +* スレッドタイトルから著作権表記を削除する設定を追加 +* ローカル板一覧用.brdファイルの置き場所をrep2/boardから$_conf['data_dir']/brardに変更 +* cronとかで最近読んだスレなどのdatをDL出来るスクリプト追加 +* 本家からbeのログイン部分を移植してBE2.0に対応 +* その他今時のアレに合わせた修正等gitのコミットログも確認してください。 ●免責 @@ -36,59 +36,68 @@ rep2-expack test https://github.com/orzisun/p2-php 本家p2と同じく、X11ライセンスです。 ●ChangeLog +150406.1111 +* 名無しが節穴になる板に名無しで書き込むときに警告を出す機能を追加 +* 設定管理にCookieやその他の履歴を削除出来る機能を追加 +* http://page2.skr.jp/rep2/ が消滅してしまったのでgate.phpの代替を追加 +* HTTP接続ではSSL関係の設定を無視するように変更 +* 2ch.netとのSSL通信を設定で選べるように変更 +* 書き込みで例外が発生した際にエラーメッセージが表示されない不具合を修正 +* その他諸々 + 150402.1350 -・接続先が2ch.netならばSSL通信を行うように変更(pinkとbeログイン認証は対応していないのでしない) -・ssl_functionのデフォルト設定をcURLに変更 -・SSL通信以外でもSSLの設定が反映されるように変更 -・上記変更のためcURL必須に変更 +* 接続先が2ch.netならばSSL通信を行うように変更(pinkとbeログイン認証は対応していないのでしない) +* ssl_functionのデフォルト設定をcURLに変更 +* SSL通信以外でもSSLの設定が反映されるように変更 +* 上記変更のためcURL必須に変更 150401.2321 -・認証付プロキシに対応(BASIC認証のみ) -・SSL通信のopenSSLとcURLを切り替えることが出来る設定を追加 -・dig.2ch.netに送るヘッダを変更 -・2chとの通信をHTTP_Request2に変更 +* 認証付プロキシに対応(BASIC認証のみ) +* SSL通信のopenSSLとcURLを切り替えることが出来る設定を追加 +* dig.2ch.netに送るヘッダを変更 +* 2chとの通信をHTTP_Request2に変更 150328.2132 -・dig2chの鯖に軽微な不具合が発生したときの対策を講じた -・dig2chで検索結果の番号が1から表示されるように修正 -・dig2chのjsonエラー処理を変更 -・dig2chがプロキシ設定(proxy_use)に対応していない不具合を修正 -・dig2chで「板で絞り込む」に対応した -・置換ワードをポップアップにも効くように変更 -・レスをポップアップ(quote_res_view)が無効なときに実況モードのID色づけ(coloredid)が効かない不具合を修正 +* dig2chの鯖に軽微な不具合が発生したときの対策を講じた +* dig2chで検索結果の番号が1から表示されるように修正 +* dig2chのjsonエラー処理を変更 +* dig2chがプロキシ設定(proxy_use)に対応していない不具合を修正 +* dig2chで「板で絞り込む」に対応した +* 置換ワードをポップアップにも効くように変更 +* レスをポップアップ(quote_res_view)が無効なときに実況モードのID色づけ(coloredid)が効かない不具合を修正 150320.1020 -・ポップアップから書き込み成功した後にスレを再読み込みしない設定を追加 -・実況モードからの書き込みでCookie確認が発生した場合実況モードに戻れない不具合を修正 -・メンテナンス性を向上させるためlive_ShowThreadPc.phpとlive_ShowThread.phpの代わりに -・live_ShowThreadLive.phpと本体のShowThread.phpを使用するように変更 -・下書き保存(expack.editor.savedraft)が無効なときに実況モードから書き込めない不具合を修正 -・スレタイ検索でWarningが出る不具合を修正 +* ポップアップから書き込み成功した後にスレを再読み込みしない設定を追加 +* 実況モードからの書き込みでCookie確認が発生した場合実況モードに戻れない不具合を修正 +* メンテナンス性を向上させるためlive_ShowThreadPc.phpとlive_ShowThread.phpの代わりに +* live_ShowThreadLive.phpと本体のShowThread.phpを使用するように変更 +* 下書き保存(expack.editor.savedraft)が無効なときに実況モードから書き込めない不具合を修正 +* スレタイ検索でWarningが出る不具合を修正 150317.1200 -・その他諸々 +* その他諸々 150316.1120 -・3ペイン表示の配置を変更できる設定を追加 -・Beのアイコンを表示できるようにした -・その他諸々 +* 3ペイン表示の配置を変更できる設定を追加 +* Beのアイコンを表示できるようにした +* その他諸々 150315.0117 -・youtu.beとnico.(ms|sc)のプレビューに対応 -・YouTubeの埋め込み方法をobjectからiframeに変更 -・cronとかで最近読んだスレなどのdatをDL出来るスクリプト追加 -・一部の画面デザインを本家っぽいデザインに変更 -・一部のレスの改行が削除される不具合を修正 -・IDを色づけしない設定の際にIDの表示がおかしくなる不具合を修正 -・2chのDAT提供終了に伴うログ破損対策を追加 -・本家からbeのログイン部分を移植してBE2.0に対応 -・既取得スレでもスレ一覧に元スレのリンクを表示できる設定を追加 -・その他諸々 +* youtu.beとnico.(ms|sc)のプレビューに対応 +* YouTubeの埋め込み方法をobjectからiframeに変更 +* cronとかで最近読んだスレなどのdatをDL出来るスクリプト追加 +* 一部の画面デザインを本家っぽいデザインに変更 +* 一部のレスの改行が削除される不具合を修正 +* IDを色づけしない設定の際にIDの表示がおかしくなる不具合を修正 +* 2chのDAT提供終了に伴うログ破損対策を追加 +* 本家からbeのログイン部分を移植してBE2.0に対応 +* 既取得スレでもスレ一覧に元スレのリンクを表示できる設定を追加 +* その他諸々 150307.1230 -・docディレクトリに各機能のReadme.txtを作成 -・「ユーザー設定編集」から+liveリンクの表示設定を変更可能 -・実況板のスレ一覧からスレを開いたときに自動的に実況モードでスレを開く設定を追加 -・スレッドタイトルから著作権表記を削除する設定を追加 -・ローカル板一覧用.brdファイルの置き場所をrep2/boardから$_conf['data_dir']/brardに変更 -・その他諸々 \ No newline at end of file +* docディレクトリに各機能のReadme.txtを作成 +* 「ユーザー設定編集」から+liveリンクの表示設定を変更可能 +* 実況板のスレ一覧からスレを開いたときに自動的に実況モードでスレを開く設定を追加 +* スレッドタイトルから著作権表記を削除する設定を追加 +* ローカル板一覧用.brdファイルの置き場所をrep2/boardから$_conf['data_dir']/brardに変更 +* その他諸々 \ No newline at end of file diff --git a/doc/README-API.txt b/doc/README-API.txt index da6edf1cc..74a835536 100644 --- a/doc/README-API.txt +++ b/doc/README-API.txt @@ -20,6 +20,11 @@ dat 「する」に設定した場合はAPI 認証時に●(浪人)を送信します。 送信したら何が起こるのか判らないため切り替えることが出来るようになっています。 +2chapi_ssl.auth +2chapi_ssl.read +この設定はSSL通信がエラーとなる環境向けの設定です。 +2chapi_use が「しない」の場合は無視されます。 + 2chapi_interval 2ch API 認証する間隔です。SessionIDがどれくらいの期間持つのか不明なためとりあえず1時間にしています。 diff --git a/lib/P2Util.php b/lib/P2Util.php index 38e29d96c..4bc5c2fd0 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -2130,8 +2130,9 @@ static public function getP2UA($withMonazilla = true,$apiUA = false) } if ($withMonazilla) { - $p2ua = 'Monazilla/1.00' . ' (' . $p2ua . ')'; + $p2ua = sprintf('Monazilla/1.00 (%s)', $p2ua); } + return $p2ua; } // {{{ isEnableBe2ch() diff --git a/lib/SettingTxt.php b/lib/SettingTxt.php index a3c6558e6..215b4c3db 100644 --- a/lib/SettingTxt.php +++ b/lib/SettingTxt.php @@ -39,7 +39,7 @@ public function __construct($host, $bbs) $this->_setting_srd = $dat_host_bbs_dir_s . 'p2_kb_setting.srd'; // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) - if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host) && $_conf['2chapi_use'] == 1) { + if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host) && $_conf['2ch_ssl.subject']) { $this->_url = 'https://' . $host . '/' . $bbs . '/SETTING.TXT'; } else { $this->_url = 'http://' . $host . '/' . $bbs . '/SETTING.TXT'; diff --git a/lib/SubjectTxt.php b/lib/SubjectTxt.php index 6a00345c4..a3c84573c 100644 --- a/lib/SubjectTxt.php +++ b/lib/SubjectTxt.php @@ -31,7 +31,7 @@ public function __construct($host, $bbs) $this->subject_file = P2Util::datDirOfHostBbs($host, $bbs) . 'subject.txt'; // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) - if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host) && $_conf['2chapi_use'] == 1) { + if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host) && $_conf['2ch_ssl.subject']) { $this->subject_url = 'https://' . $host . '/' . $bbs . '/subject.txt'; } else { $this->subject_url = 'http://' . $host . '/' . $bbs . '/subject.txt'; diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 7ece08944..eb4c533d1 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -78,14 +78,14 @@ public function downloadDat() { include $_conf['sid2ch_php']; return $this->_downloadDat2chMaru ($uaMona, $SID2ch); - // 2ch bbspink モリタポ読み + // 2ch bbspink モリタポ読み } elseif (P2Util::isHost2chs ($this->host) && ! empty ($_GET['moritapodat']) && $_conf['p2_2ch_mail'] && $_conf['p2_2ch_pass']) { if (! array_key_exists ('csrfid', $_GET) || $this->_getCsrfIdForMoritapoDat () != $_GET['csrfid']) { p2die ('不正なリクエストです'); } return $this->_downloadDat2chMoritapo (); - // 2chの過去ログ倉庫読み + // 2chの過去ログ倉庫読み } elseif (! empty ($_GET['kakolog']) && ! empty ($_GET['kakoget'])) { if ($_GET['kakoget'] == 1) { $ext = '.dat.gz'; @@ -94,11 +94,12 @@ public function downloadDat() { } return $this->_downloadDat2chKako ($_GET['kakolog'], $ext); - // 2ch or 2ch互換 + // 2ch or 2ch互換 } elseif (P2Util::isHost2chs ($this->host) && ! empty ($_GET['shirokuma'])) { return $this->_downloadDat2chMaru ($uaMona, $SID2ch, true); - // 2ch はAPI経由で落とす - } elseif (P2Util::isHost2chs ($this->host) && $_conf['2chapi_use'] == 1 && empty ($_GET['olddat'])) { + + // 2ch はAPI経由で落とす + } elseif (P2Util::isHost2chs ($this->host) && $_conf['2chapi_use'] && empty ($_GET['olddat'])) { // ログインしてなければ or ログイン後、設定した時間経過していたら自動再ログイン if (! file_exists ($_conf['sid2chapi_php']) || ! empty ($_REQUEST['relogin2chapi']) || (filemtime ($_conf['sid2chapi_php']) < time () - 60 * 60 * $_conf['2chapi_interval'])) { @@ -115,6 +116,7 @@ public function downloadDat() { include $_conf['sid2chapi_php']; return $this->_downloadDat2chAPI ($SID2chAPI, $this->length); } else { + // 2ch 以外の外部板 // DATを差分DLする return $this->_downloadDat2ch ($this->length); @@ -164,7 +166,14 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { $serverName = explode ('.', $this->host); // $url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; // $url="http://news2.2ch.net/test/read.cgi?bbs=newsplus&key=1038486598"; - $url = 'https://api.2ch.net/v1/' . $serverName[0] . '/' . $this->bbs . '/' . $this->key; + + if($_conf['2chapi_ssl.read']) { + $url = 'https://api.2ch.net/v1/'; + } else { + $url = 'http://api.2ch.net/v1/'; + } + + $url .= $serverName[0] . '/' . $this->bbs . '/' . $this->key; $message = '/v1/' . $serverName[0] . '/' . $this->bbs . '/' . $this->key . $sid . $AppKey; $HB = hash_hmac ("sha256", $message, $HMKey); diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index 030c0f2cb..8fe81d949 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -14,7 +14,14 @@ function authenticate_2chapi() { global $_conf; - $url = 'https://api.2ch.net/v1/auth/'; + + if ($_conf['2chapi_ssl.auth']) + { + $url = 'https://api.2ch.net/v1/auth/'; + } else { + $url = 'http://api.2ch.net/v1/auth/'; + } + $CT = time(); $AppKey = $_conf['2chapi_appkey']; $AppName = $_conf['2chapi_appname']; diff --git a/lib/login2ch.inc.php b/lib/login2ch.inc.php index 5bcd50d37..dbf04884a 100644 --- a/lib/login2ch.inc.php +++ b/lib/login2ch.inc.php @@ -23,8 +23,13 @@ function login2ch() return false; } - $auth2ch_url = 'https://2chv.tora3.net/futen.cgi'; - $dolib2ch = 'DOLIB/1.00'; + if ($_conf['2ch_ssl.maru']) { + $auth2ch_url = 'https://2chv.tora3.net/futen.cgi'; + } else { + $auth2ch_url = 'http://2chv.tora3.net/futen.cgi'; + } + + $dolib2ch = 'DOLIB/1.00'; if($_conf['2chapi_use'] == 1) { if($_conf['2chapi_appname'] != "") { diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index b75eb9f74..adb229a2f 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -383,8 +383,11 @@ array('2chapi_hmkey','HMkey', P2_EDIT_CONF_USER_LONGTEXT), array('2chapi_appname','AppName APIに送信するアプリケーション名 例:Hoge/1.00'), 'User-Agent', - array('2chapi_ua.auth','API認証で使用するUser-Agent'), - array('2chapi_ua.read','DAT取得で使用するUser-Agent'), + array('2chapi_ua.auth','API認証に使用するUser-Agent'), + array('2chapi_ua.read','DAT取得に使用するUser-Agent'), + 'SSL通信設定', + array('2chapi_ssl.auth','API認証にSSLを使用する'), + array('2chapi_ssl.read','DAT取得にSSLを使用する'), 'デバッグ用', array('2chapi_debug_print','デバッグ用の情報を出力する'), '認証情報を変更した場合再認証してください', @@ -438,9 +441,12 @@ array('proxy_port', 'プロキシポート ex)"8080"'), array('proxy_user', 'プロキシユーザー名 (使用する場合のみ)'), array('proxy_password', 'プロキシパスワード (使用する場合のみ)'), - '通信設定', + 'SSL通信設定', array('ssl_function', 'SSL通信(●ログイン等)に使用する関数<br>(関数に該当する拡張をインストールする必要がある)'), array('ssl_capath', 'SSL通信で接続先を検証するための証明書があるディレクトリ ex)"/etc/ssl/certs"<br>設定なして動く場合は設定不要<br>ssl_functionに対応した形式の証明書が必要'), + array('2ch_ssl.maru', '2ch.netの●ログインにSSLを使用する'), + array('2ch_ssl.subject', '2ch.netのsubjec.txtとSETTING.TXTの取得にSSLを使用する'), + array('2ch_ssl.post', '2ch.netの書き込みにSSLを使用する'), ); printEditConfGroupHtml($groupname, $conflist, $flags); } diff --git a/rep2/post.php b/rep2/post.php index 1288a9187..d90508a03 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -379,7 +379,7 @@ function postIt($host, $bbs, $key, $post) global $bbs_cgi; // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) - if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host) && $_conf['2chapi_use'] == 1) { + if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host) && $_conf['2ch_ssl.post']) { $bbs_cgi_url = 'https://' . $host . $bbs_cgi; } else { $bbs_cgi_url = 'http://' . $host . $bbs_cgi; @@ -389,7 +389,7 @@ function postIt($host, $bbs, $key, $post) $req = P2Util::getHTTPRequest2 ($bbs_cgi_url,HTTP_Request2::METHOD_POST); // ヘッダ - $req->setHeader('User-Agent', P2Util::getP2UA(true,P2Util::isHost2chs($host))); + $req->setHeader('User-Agent', P2Util::getP2UA(true, P2Util::isHost2chs($host))); $req->setHeader('Referer', "http://{$host}/{$bbs}/{$key}/"); // クッキー @@ -447,7 +447,8 @@ function postIt($host, $bbs, $key, $post) } } catch (Exception $e) { - showPostMsg(false, "サーバ接続エラー: $e->getMessage()<br>p2 Error: 板サーバへの接続に失敗しました", false); + $error_msg = $e->getMessage(); + showPostMsg(false, "サーバ接続エラー: {$error_msg}<br>p2 Error: 板サーバへの接続に失敗しました", false); } // be.2ch.net or JBBSしたらば 文字コード変換 EUC→SJIS From 46748ebeb687533b2fac1e166df4b9cbc80d69b1 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 6 Apr 2015 22:11:58 +0900 Subject: [PATCH 116/339] =?UTF-8?q?=E7=AF=80=E7=A9=B4=E6=9D=BF=E3=81=A8?= =?UTF-8?q?=E5=90=8D=E7=84=A1=E3=81=97=E3=81=A7=E6=9B=B8=E3=81=8D=E8=BE=BC?= =?UTF-8?q?=E3=81=BF=E3=81=A7=E3=81=8D=E3=81=AA=E3=81=84=E6=9D=BF=E3=81=AE?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E3=82=92=E6=AD=A3=E3=81=97=E3=81=8F=E5=8B=95?= =?UTF-8?q?=E4=BD=9C=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=20=E5=90=8D=E7=84=A1=E3=81=97=E3=81=A7=E6=9B=B8?= =?UTF-8?q?=E8=BE=BC=E5=87=BA=E6=9D=A5=E3=81=AA=E3=81=84=E6=9D=BF=E3=81=AF?= =?UTF-8?q?=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=81=BF=E7=B6=9A=E8=A1=8C=E3=81=A7?= =?UTF-8?q?=E3=81=8D=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=20expack=E3=81=AEsage=E3=83=81=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=82=AF=E6=A9=9F=E8=83=BD=E3=81=A8=E6=9C=AC=E6=96=87=E3=81=8C?= =?UTF-8?q?=E7=A9=BA=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E6=A9=9F=E8=83=BD?= =?UTF-8?q?=E3=81=AE=E3=83=87=E3=83=95=E3=82=A9=E3=83=AB=E3=83=88=E5=80=A4?= =?UTF-8?q?=E3=82=92ON=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_user_def_ex.inc.php | 4 ++-- lib/post_form_options.inc.php | 14 ++++---------- rep2/js/post_form.js | 12 +++++++++++- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/conf/conf_user_def_ex.inc.php b/conf/conf_user_def_ex.inc.php index 112a88d63..58fa1757f 100644 --- a/conf/conf_user_def_ex.inc.php +++ b/conf/conf_user_def_ex.inc.php @@ -141,11 +141,11 @@ $conf_user_rad['expack.editor.dpreview_chkaa'] = array('1' => 'する', '0' => 'しない'); // 本文が空でないかチェック -$conf_user_def['expack.editor.check_message'] = 0; // (0) +$conf_user_def['expack.editor.check_message'] = 1; // (1) $conf_user_rad['expack.editor.check_message'] = array('1' => 'する', '0' => 'しない'); // sage チェック -$conf_user_def['expack.editor.check_sage'] = 0; // (0) +$conf_user_def['expack.editor.check_sage'] = 1; // (1) $conf_user_rad['expack.editor.check_sage'] = array('1' => 'する', '0' => 'しない'); // 下書き保存 diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index dafe87791..8741a329f 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -320,27 +320,21 @@ function setHiddenValue(button) { if (!preg_match('{NetFront|AVE-?Front/}', $_SERVER['HTTP_USER_AGENT'])) { // 名無しで書くと節穴になる板をチェックして警告を出す。 - $confirmNanashi = false; $_st = new SettingTxt($host, $bbs); $_st->setSettingArray(); // 名無しが節穴 - if (strpos($_st->setting_array['BBS_NONAME_NAME'], "fusianasan")) { - $confirmNanashi = true; - } + $confirmNanashi = ( (strpos($_st->setting_array['BBS_NONAME_NAME'], "fusianasan") !== false)); // 名無しで書けない - if($_st->setting_array['BBS_NANASHI_CHECK']=='1') - { - $confirmNanashi = true; - } + $blockNanashi = ($_st->setting_array['BBS_NANASHI_CHECK'] == '1' || $_st->setting_array['NANASHI_CHECK'] == '1'); unset($_st); - $onsubmit_at = sprintf(' onsubmit="if (validateAll(%s,%s) && confirmNanashi(%s)) { switchBlockSubmit(true); return true; } else { return false }"', + $onsubmit_at = sprintf(' onsubmit="if (validateAll(%s,%s) && confirmNanashi(%s) && blockNanashi(%s)) { switchBlockSubmit(true); return true; } else { return false }"', (($_conf['expack.editor.check_message']) ? 'true' : 'false'), (($_conf['expack.editor.check_sage']) ? 'true' : 'false'), - ($confirmNanashi ? 'true' : 'false')); + ($confirmNanashi ? 'true' : 'false'), ($blockNanashi ? 'true' : 'false')); } } diff --git a/rep2/js/post_form.js b/rep2/js/post_form.js index 95ea1f1fe..60065fcb3 100644 --- a/rep2/js/post_form.js +++ b/rep2/js/post_form.js @@ -199,11 +199,21 @@ function validateSage() { function confirmNanashi(doconfirmNanashi) { // 引数がtrueで名前欄が0文字(名無し)ならば if (doconfirmNanashi && document.getElementById('FROM').value.length == 0) { - if(window.confirm('この板は名無しでの書き込みが制限されているか\n名無しに fusianasan が含まれています。\n名無しで書き込みますか?')) { + if(window.confirm('この板は名無しに fusianasan が含まれています。\n名無しで書き込みますか?')) { return true; } else { return false; } } return true; +} + +//引数にtrueを指定したら名無しで書込出来ない +function blockNanashi(blockNanashi) { + // 引数がtrueで名前欄が0文字(名無し)ならば + if (blockNanashi && document.getElementById('FROM').value.length == 0) { + alert('この板は名無しの書き込みが制限されているので名無しで書き込むことが出来ません。'); + return false; + } + return true; } \ No newline at end of file From 5d69ff9bae32a7c5726696f5799c7e4f63bf171b Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 6 Apr 2015 22:14:47 +0900 Subject: [PATCH 117/339] v150406.2211 --- conf/conf.inc.php | 2 +- doc/README-774.txt | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 0332cfea4..04b38cf6f 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150406.1111', // rep2のバージョン + 'p2version' => '150406.2211', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index b73c70909..c3755f301 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -17,6 +17,7 @@ rep2-expack test https://github.com/orzisun/p2-php * ローカル板一覧用.brdファイルの置き場所をrep2/boardから$_conf['data_dir']/brardに変更 * cronとかで最近読んだスレなどのdatをDL出来るスクリプト追加 * 本家からbeのログイン部分を移植してBE2.0に対応 +* 名無しが節穴になる板に名無しで書き込むときに警告を出す機能を追加 * その他今時のアレに合わせた修正等gitのコミットログも確認してください。 ●免責 @@ -36,6 +37,11 @@ rep2-expack test https://github.com/orzisun/p2-php 本家p2と同じく、X11ライセンスです。 ●ChangeLog +150406.2211 +* 節穴板と名無しで書き込みできない板の条件を正しく動作するように修正 +* 名無しで書込出来ない板は書き込み続行できないように変更 +* expackのsageチェック機能と本文が空チェック機能のデフォルト値をONに変更 + 150406.1111 * 名無しが節穴になる板に名無しで書き込むときに警告を出す機能を追加 * 設定管理にCookieやその他の履歴を削除出来る機能を追加 From 7617af6a3ae60eec71527cdc7bc126ce678fcd5d Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 7 Apr 2015 01:22:51 +0900 Subject: [PATCH 118/339] =?UTF-8?q?dig.2ch.net=E3=81=AB=E9=80=81=E3=82=8B?= =?UTF-8?q?=E3=83=98=E3=83=83=E3=83=80=E3=83=BC=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=20dig2ch.php=E3=81=A7=E8=A7=A3=E6=9E=90=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E3=81=8C=E7=99=BA=E7=94=9F=E3=81=97=E3=81=9F=E9=9A=9B?= =?UTF-8?q?=E3=81=AB=E8=A9=B3=E7=B4=B0=E6=83=85=E5=A0=B1=E3=82=92=E5=87=BA?= =?UTF-8?q?=E3=81=99=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/dig2ch.php | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php index 9747d8828..ed015569c 100644 --- a/rep2/dig2ch.php +++ b/rep2/dig2ch.php @@ -15,6 +15,7 @@ function dig2chsearch($query) $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_GET); $req->setHeader('User-Agent', $_SERVER['HTTP_USER_AGENT']); $req->setHeader('Acecpt-Language', 'ja'); + $req->setHeader('Accept', '*/*'); $response = $req->send(); @@ -35,7 +36,6 @@ function dig2chsearch($query) } $jsontest1 = json_decode($body, true); - unset($body); //mb_convert_variables('SHIFT-JIS','UTF-8',$jsontest1); @@ -65,7 +65,26 @@ function dig2chsearch($query) $jsonerror = ' - Unknown error'; break; } - p2die("検索結果の取得に失敗しました".$jsonerror); + if (true) { // 本来はconf_admin.phpで切り替えることが出来るようにするが強制ON + echo "<b>PHPが動作しているOSのuname</b><br>". php_uname() ."<br>"; + echo "<b>PHPのバージョン</b><br>". phpversion() ."<br>"; + if ($_conf['proxy_use']) + { + echo '<font color="red"><b>この環境は串が設定されています(2chとの通信に介入する串を使用している場合はおま環)</b></font><br>'; + echo "{$_conf['proxy_host']}:{$_conf['proxy_port']}<br>"; + } + echo "<b>dig2chに送信したURL(ブラウザでアクセスを試してみてください。)</b><br>{$url}<br>"; + // 表示のためSJIS化 + $body = mb_convert_encoding($body, "SJIS", "UTF-8"); + echo '<b>dig2chからのレスポンス(http://jsonlint.com/ でエラーが無ければおま環)</b><br><textarea readonly rows="30" cols="100" wrap="off">'.$body.'</textarea><br>'; + echo '<b>HTTP_Requestのvar_dump</b><br>'; + var_dump($req); + echo '<b>HTTP_Responseのvar_dump</b><br>'; + var_dump($response); + } + p2die("検索結果の解析に失敗しました".$jsonerror); + } else { + unset ($body); } $boards = array(); From cb6331f68d5d3c172fb87fbd223ab2961efe02c9 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 7 Apr 2015 08:34:39 +0900 Subject: [PATCH 119/339] =?UTF-8?q?HTTP=E9=80=9A=E4=BF=A1=E3=81=AE?= =?UTF-8?q?=E3=83=98=E3=83=83=E3=83=80=E3=82=92=E8=A6=8B=E7=9B=B4=E3=81=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 20 +++++++++++++------- lib/SettingTxt.php | 3 --- lib/SubjectTxt.php | 3 --- lib/ThreadRead.php | 9 --------- lib/wiki/P2UtilWiki.php | 3 --- rep2/dig2ch.php | 7 ++++--- rep2/post.php | 1 - 7 files changed, 17 insertions(+), 29 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index 4bc5c2fd0..7f8ad804d 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -264,9 +264,6 @@ static public function fileDownload($url, $localfile, try { // DL $req = self::getHTTPRequest2($url, HTTP_Request2::METHOD_GET); - $purl = parse_url($url); // URL分解 - $req->setHeader('User-Agent', self::getP2UA(true,self::isHost2chs($purl['host']))); - unset($purl); $response = $req->send(); @@ -2249,15 +2246,22 @@ static public function getHTTPRequest2($url , $method = HTTP_Request2::METHOD_GE { global $_conf; - $protocol = parse_url($url, PHP_URL_SCHEME); + $purl = parse_url ($url); - if(empty($url) || $protocol === false) + if(empty($url) || $purl === false) { - throw new InvalidArgumentException("URLの指定が変です。"); + throw new InvalidArgumentException ("URLの指定が変です。"); } $req = new HTTP_Request2($url, $method); + // よく使うヘッダを指定 + // p2のHTTP通信は特に指定の無い限りMonazillaを名乗るようにする + $req->setHeader ('User-Agent', self::getP2UA(true,self::isHost2chs($purl['host']))); + $req->setHeader ('Acecpt-Language', 'ja,en-us;q=0.7,en;q=0.3'); + $req->setHeader ('Accept', '*/*'); + $req->setHeader ('Accept-Encoding', 'gzip, deflate'); + // タイムアウトの設定 $req->setConfig (array ( 'connect_timeout' => $_conf['http_conn_timeout'], @@ -2265,7 +2269,7 @@ static public function getHTTPRequest2($url , $method = HTTP_Request2::METHOD_GE )); // SSLの設定 - if($protocol == 'https') { + if($purl['scheme'] == 'https') { $req->setAdapter($_conf['ssl_function']); if($_conf['ssl_capath']) @@ -2284,6 +2288,8 @@ static public function getHTTPRequest2($url , $method = HTTP_Request2::METHOD_GE )); } + unset ($purl); + return $req; } diff --git a/lib/SettingTxt.php b/lib/SettingTxt.php index 215b4c3db..4c4202378 100644 --- a/lib/SettingTxt.php +++ b/lib/SettingTxt.php @@ -104,9 +104,6 @@ public function downloadSettingTxt() $req = P2Util::getHTTPRequest2($this->_url, HTTP_Request2::METHOD_GET); $modified && $req->setHeader("If-Modified-Since", $modified); - // APIを使用する設定で相手が2chだったらAPIのUAを送る - $req->setHeader('User-Agent', P2Util::getP2UA(true,P2Util::isHost2chs($this->host))); - $response = $req->send(); $code = $response->getStatus(); diff --git a/lib/SubjectTxt.php b/lib/SubjectTxt.php index a3c84573c..5519933aa 100644 --- a/lib/SubjectTxt.php +++ b/lib/SubjectTxt.php @@ -99,9 +99,6 @@ public function downloadSubject() $req = P2Util::getHTTPRequest2($this->subject_url, HTTP_Request2::METHOD_GET); $modified && $req->setHeader("If-Modified-Since", $modified); - // APIを使用する設定で相手が2chだったらAPIのUAを送る - $req->setHeader('User-Agent', P2Util::getP2UA(true,P2Util::isHost2chs($this->host))); - $response = $req->send(); $code = $response->getStatus(); diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index eb4c533d1..a54169200 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -184,7 +184,6 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { // ヘッダ $req->setHeader ('User-Agent', $ReadUA); - $req->setHeader ('Accept-Encoding', "gzip, deflate"); if (! empty ($_GET['one'])) { // >>1プレビューの時はサーバーに最初の部分だけ請求 @@ -356,9 +355,7 @@ protected function _downloadDat2ch($from_bytes) { try { $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_GET); // ヘッダ - $req->setHeader ('User-Agent', P2Util::getP2UA (true)); $req->setHeader ('Referer', "http://{$purl['host']}/{$this->bbs}/"); - $req->setHeader ('Accept-Encoding', "gzip, deflate"); if (! empty ($_GET['one'])) { // >>1プレビューの時はサーバーに最初の部分だけ請求 @@ -524,7 +521,6 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma = false) { $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_GET); // ヘッダ $req->setHeader ('User-Agent', "{$uaMona} ({$_conf['p2ua']})"); - $req->setHeader ('Accept-Encoding', "gzip, deflate"); // Requestの送信 $response = $req->send (); @@ -612,10 +608,6 @@ protected function _downloadDat2chKako($uri, $ext) { try { $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_GET); - // ヘッダ - $req->setHeader ('User-Agent', P2Util::getP2UA(true)); - $req->setHeader ('Accept-Encoding', "gzip, deflate"); - // Requestの送信 $response = $req->send (); @@ -710,7 +702,6 @@ public function get2chDatError($code = null) { $req = P2Util::getHTTPRequest2 ($read_url, HTTP_Request2::METHOD_GET); // ヘッダ $req->setHeader ('User-Agent', P2Util::getP2UA(false,P2Util::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG - $req->setHeader ('Accept-Encoding', "gzip, deflate"); // Requestの送信 $response = $req->send (); diff --git a/lib/wiki/P2UtilWiki.php b/lib/wiki/P2UtilWiki.php index 52d31c5ad..d79c6316c 100644 --- a/lib/wiki/P2UtilWiki.php +++ b/lib/wiki/P2UtilWiki.php @@ -41,9 +41,6 @@ public static function getResponseCode($url) { try { $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_HEAD); - - $req->setHeader('User-Agent', 'Monazilla/1.00'); - return $response->getStatus(); } catch (Exception $e) { diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php index ed015569c..063d88896 100644 --- a/rep2/dig2ch.php +++ b/rep2/dig2ch.php @@ -13,9 +13,10 @@ function dig2chsearch($query) try { $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_GET); - $req->setHeader('User-Agent', $_SERVER['HTTP_USER_AGENT']); - $req->setHeader('Acecpt-Language', 'ja'); - $req->setHeader('Accept', '*/*'); + // $req->setHeader('User-Agent', $_SERVER['HTTP_USER_AGENT']); やっぱMonazilla名乗っといた方が良さそうか + $req->setHeader('Accept-Charset', 'utf-8'); + $req->setHeader('Cache-Control', 'no-cache'); + $req->setHeader('Accept', 'application/json'); $response = $req->send(); diff --git a/rep2/post.php b/rep2/post.php index d90508a03..a35b337b8 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -389,7 +389,6 @@ function postIt($host, $bbs, $key, $post) $req = P2Util::getHTTPRequest2 ($bbs_cgi_url,HTTP_Request2::METHOD_POST); // ヘッダ - $req->setHeader('User-Agent', P2Util::getP2UA(true, P2Util::isHost2chs($host))); $req->setHeader('Referer', "http://{$host}/{$bbs}/{$key}/"); // クッキー From 214b4a99d95308632b21066bcfe16c39d99964fa Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 7 Apr 2015 11:49:28 +0900 Subject: [PATCH 120/339] =?UTF-8?q?NG=E3=81=82=E3=81=BC=E3=83=BC=E3=82=93?= =?UTF-8?q?=E3=81=AE=E5=AF=BE=E8=B1=A1=E3=81=AB=E3=81=AA=E3=81=A3=E3=81=9F?= =?UTF-8?q?=E3=83=AC=E3=82=B9=E3=81=AEID=E3=82=92=E8=87=AA=E5=8B=95?= =?UTF-8?q?=E7=9A=84=E3=81=ABNG=E3=81=82=E3=81=BC=E3=83=BC=E3=82=93?= =?UTF-8?q?=E3=81=99=E3=82=8B=E6=A9=9F=E8=83=BD=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- conf/conf_user_def.inc.php | 4 +++ lib/NgAbornCtl.php | 58 +++++++++++++++++++++++++++++--------- lib/ShowThread.php | 45 +++++++++++++++++++++++++++++ rep2/edit_conf_user.php | 1 + rep2/editpref.php | 11 ++++++-- 6 files changed, 104 insertions(+), 17 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 04b38cf6f..fcb695736 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150406.2211', // rep2のバージョン + 'p2version' => '150407.1000', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 47fd3d13f..970660c4c 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -374,6 +374,10 @@ $conf_user_def['ngaborn_chain'] = 0; // (0) $conf_user_rad['ngaborn_chain'] = array('1' => 'する', '0' => 'しない', '2' => 'すべてNGにする'); +// NGあぼーんの対象になったレスのIDを自動的にNGあぼーんする(する:1, しない:0 NGにする:2) +$conf_user_def['ngaborn_auto'] = 0; // (0) +$conf_user_rad['ngaborn_auto'] = array('1' => 'する', '0' => 'しない'); + // 表示範囲外のレスも連鎖NGあぼーんの対象にする(する:1, しない:0) // 処理を軽くするため、デフォルトではしない $conf_user_def['ngaborn_chain_all'] = 0; // (0) diff --git a/lib/NgAbornCtl.php b/lib/NgAbornCtl.php index c16402b8f..cee8c5e03 100644 --- a/lib/NgAbornCtl.php +++ b/lib/NgAbornCtl.php @@ -14,12 +14,14 @@ 'aborn_name' => 0, 'aborn_res' => 0, 'aborn_thread' => 0, + 'aborn_auto' => 0, 'ng_chain' => 0, 'ng_freq' => 0, 'ng_id' => 0, 'ng_mail' => 0, 'ng_msg' => 0, 'ng_name' => 0, + 'ng_auto' => 0, 'highlight_chain' => 0, 'highlight_id' => 0, 'highlight_mail' => 0, @@ -30,8 +32,7 @@ // }}} // {{{ NgAbornCtl -class NgAbornCtl -{ +class NgAbornCtl { // {{{ saveNgAborns() /** @@ -40,8 +41,7 @@ class NgAbornCtl * @param void * @return void */ - static public function saveNgAborns() - { + static public function saveNgAborns() { global $ngaborns, $ngaborns_hits; global $_conf; @@ -116,8 +116,7 @@ static public function saveNgAborns() * @param array $aborn_threads * @return void */ - static public function saveAbornThreads(array $aborn_threads) - { + static public function saveAbornThreads(array $aborn_threads) { if (array_key_exists('ngaborns', $GLOBALS)) { $orig_ngaborns = $GLOBALS['ngaborns']; $restore_ngaborns = true; @@ -141,8 +140,7 @@ static public function saveAbornThreads(array $aborn_threads) /** * NGあぼーんHIT記録を更新時間でソートする */ - static public function cmpLastTime($a, $b) - { + static public function cmpLastTime($a, $b) { if (empty($a['lasttime']) || empty($b['lasttime'])) { return strcmp($a['lasttime'], $b['lasttime']); } @@ -161,8 +159,8 @@ static public function cmpLastTime($a, $b) * @param void * @return array */ - static public function loadNgAborns() - { + static public function loadNgAborns() { + global $_conf; $ngaborns = array(); $ngaborns['aborn_res'] = self::_readNgAbornFromFile('p2_aborn_res.txt'); // これだけ少し性格が異なる @@ -183,6 +181,12 @@ static public function loadNgAborns() $ngaborns['highlight_msg'] = self::_readNgAbornFromFile('p2_highlight_msg.txt'); $ngaborns['highlight_id'] = self::_readNgAbornFromFile('p2_highlight_id.txt'); + if ($_conf['ngaborn_auto']) { + // 自動NG + $ngaborns['aborn_auto'] = self::_readNgAbornFromFile('p2_aborn_auto.txt'); + $ngaborns['ng_auto'] = self::_readNgAbornFromFile('p2_ng_auto.txt'); + } + return $ngaborns; } @@ -195,19 +199,45 @@ static public function loadNgAborns() * @param void * @return array */ - static public function loadAbornThreads() - { + static public function loadAbornThreads() { return self::_readNgAbornFromFile('p2_aborn_thread.txt'); } + // }}} + // {{{ ngAbornAdd() + /** + * あぼーん&NGワード設定を追加する + * + * @param string どこに追加するか + * @param string 追加する内容 + * @return bool 登録されたらtrue + */ + static public function ngAbornAdd($code, $word) { + global $ngaborns; + foreach ($ngaborns[$code]['data'] as $data) { + if ($data['cond'] === $word) { + return false; //見つかったら追加せずに抜ける + } + } + + // 追加 + $ngaborns[$code]['data'][] = array( + 'cond' => $word, // 検索条件 + 'word' => $word, // 対象文字列 + 'lasttime' => null, // 最後にHITした時間 + 'hits' => 0, // HIT回数 + 'regex' => false, // パターンマッチ関数 + 'ignorecase' => false, // 大文字小文字を無視 + ); + return; + } // }}} // {{{ _readNgAbornFromFile() /** * readNgAbornFromFile */ - static protected function _readNgAbornFromFile($filename) - { + static protected function _readNgAbornFromFile($filename) { global $_conf; $file = $_conf['pref_dir'] . '/' . $filename; diff --git a/lib/ShowThread.php b/lib/ShowThread.php index 5f0676026..a4fc233a2 100644 --- a/lib/ShowThread.php +++ b/lib/ShowThread.php @@ -726,20 +726,40 @@ protected function _ngAbornCheck($i, $name, $mail, $date_id, $id, $msg, $nong = // }}} // {{{ あぼーんチェック + if ($_conf['ngaborn_auto']) {//自動あぼーん + // 自動あぼーんID + if ($this->ngAbornCheck('aborn_auto', $date_id) !== false) { + $ngaborns_hits['aborn_auto']++; + return $this->_markNgAborn($i, self::ABORN, false); + } + } + // あぼーんレス if ($this->abornResCheck($i) !== false) { + if ($_conf['ngaborn_auto']) { + //自動あぼーんならIDを追加 + NgAbornCtl::ngAbornAdd('aborn_auto', $id); + } $ngaborns_hits['aborn_res']++; return $this->_markNgAborn($i, self::ABORN, false); } // あぼーんネーム if ($this->ngAbornCheck('aborn_name', $name) !== false) { + if ($_conf['ngaborn_auto']) { + //自動あぼーんならIDを追加 + NgAbornCtl::ngAbornAdd('aborn_auto', $id); + } $ngaborns_hits['aborn_name']++; return $this->_markNgAborn($i, self::ABORN, false); } // あぼーんメール if ($this->ngAbornCheck('aborn_mail', $mail) !== false) { + if ($_conf['ngaborn_auto']) { + //自動あぼーんならIDを追加 + NgAbornCtl::ngAbornAdd('aborn_auto', $id); + } $ngaborns_hits['aborn_mail']++; return $this->_markNgAborn($i, self::ABORN, false); } @@ -752,6 +772,10 @@ protected function _ngAbornCheck($i, $name, $mail, $date_id, $id, $msg, $nong = // あぼーんメッセージ if ($this->ngAbornCheck('aborn_msg', $msg) !== false) { + if ($_conf['ngaborn_auto']) { + //自動あぼーんならIDを追加 + NgAbornCtl::ngAbornAdd('aborn_auto', $id); + } $ngaborns_hits['aborn_msg']++; return $this->_markNgAborn($i, self::ABORN, true); } @@ -764,14 +788,31 @@ protected function _ngAbornCheck($i, $name, $mail, $date_id, $id, $msg, $nong = // {{{ NGチェック + if ($_conf['ngaborn_auto']) {//自動あぼーん + // 自動NGIDを先にNGする + if ($this->ngAbornCheck('ng_auto', $date_id) !== false) { + $ngaborns_hits['ng_auto']++; + $type |= $this->_markNgAborn($i, self::NG_ID, false); + $autong_done = true; //自動NGIDの対象になったレスは意味が無いのでNGIDに追加しない + } + } + // NGネームチェック if ($this->ngAbornCheck('ng_name', $name) !== false) { + if ($_conf['ngaborn_auto'] && !$autong_done) { + //自動あぼーんならIDを追加 + $add_done = NgAbornCtl::ngAbornAdd('ng_auto', $id); + } $ngaborns_hits['ng_name']++; $type |= $this->_markNgAborn($i, self::NG_NAME, false); } // NGメールチェック if ($this->ngAbornCheck('ng_mail', $mail) !== false) { + if ($_conf['ngaborn_auto'] && !$autong_done && !$add_done) { + //自動あぼーんならIDを追加 + $add_done = NgAbornCtl::ngAbornAdd('ng_auto', $id); + } $ngaborns_hits['ng_mail']++; $type |= $this->_markNgAborn($i, self::NG_MAIL, false); } @@ -785,6 +826,10 @@ protected function _ngAbornCheck($i, $name, $mail, $date_id, $id, $msg, $nong = // NGメッセージチェック $a_ng_msg = $this->ngAbornCheck('ng_msg', $msg); if ($a_ng_msg !== false) { + if ($_conf['ngaborn_auto'] && !$autong_done && !$add_done) { + //自動あぼーんならIDを追加 + $add_done = NgAbornCtl::ngAbornAdd('ng_auto', $id); + } $ngaborns_hits['ng_msg']++; $type |= $this->_markNgAborn($i, self::NG_MSG, true); $info[] = sprintf('NG%s:%s', diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index adb229a2f..6eee5da17 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -358,6 +358,7 @@ array('ngaborn_frequent_num', '頻出IDあぼーんのしきい値 (出現回数がこれ以上のIDをあぼーん)'), array('ngaborn_frequent_dayres', '勢いの速いスレでは頻出IDあぼーんしない<br>(総レス数/スレ立てからの日数、0なら無効)'), array('ngaborn_chain', '連鎖NGあぼーん<br>「する」ならあぼーんレスへのレスはあぼーん、NGレスへのレスはNG。<br>「すべてNGにする」の場合、あぼーんレスへのレスもNGにする。'), + array('ngaborn_auto', 'NGあぼーんの対象になったレスのIDを自動的にNGあぼーんする<br>「する」ならあぼーんレスのIDはあぼーん、NGレスのIDはNG。'), array('ngaborn_chain_all', '表示範囲外のレスも連鎖NG/あぼーん/ハイライトの対象にする<br>(処理を軽くするため、デフォルトではしない)'), array('ngaborn_daylimit', 'この期間、NG/あぼーん/ハイライトにHITしなければ、登録ワードを自動的に外す (日数)'), array('ngaborn_purge_aborn', 'あぼーんレスは不可視divブロックも描画しない'), diff --git a/rep2/editpref.php b/rep2/editpref.php index 83f84ff63..20effc447 100644 --- a/rep2/editpref.php +++ b/rep2/editpref.php @@ -111,6 +111,12 @@ $delflag = true; } break; + case autong: + if(deleteFile($_conf['pref_dir'] . '/p2_aborn_auto.txt') && + deleteFile($_conf['pref_dir'] . '/p2_ng_auto.txt') ) { + $delflag = true; + } + break; default: $delflag = false; P2Util::pushInfoHtml("<p>p2 error: 引数 {$_POST['delete']} が不正です。 "); @@ -339,9 +345,10 @@ function deleteCheck(submit){ EOP; echo getDeleteHistoryFormHt('cookie', 'Cookie'); - echo getDeleteHistoryFormHt('matome', '新着まとめ読み'); + echo getDeleteHistoryFormHt('matome', 'まとめ読み'); echo getDeleteHistoryFormHt('reshist', '書込履歴'); - echo getDeleteHistoryFormHt('recent', '最近読んだスレ'); + echo getDeleteHistoryFormHt('recent', '閲覧履歴'); + echo getDeleteHistoryFormHt('autong', '自動NGアボーン'); echo <<<EOP </fieldset>\n EOP; From 220f8bc008c128fcf07de3f0124656544e8104f7 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 8 Apr 2015 12:44:10 +0900 Subject: [PATCH 121/339] v150408.1234 --- conf/conf.inc.php | 2 +- doc/README-774.txt | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index fcb695736..926142da6 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150407.1000', // rep2のバージョン + 'p2version' => '150408.1234', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index c3755f301..8ff07bb3a 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -18,6 +18,7 @@ rep2-expack test https://github.com/orzisun/p2-php * cronとかで最近読んだスレなどのdatをDL出来るスクリプト追加 * 本家からbeのログイン部分を移植してBE2.0に対応 * 名無しが節穴になる板に名無しで書き込むときに警告を出す機能を追加 +* NGあぼーんの対象になったレスのIDを自動的にNGあぼーんする機能を追加 * その他今時のアレに合わせた修正等gitのコミットログも確認してください。 ●免責 @@ -37,6 +38,11 @@ rep2-expack test https://github.com/orzisun/p2-php 本家p2と同じく、X11ライセンスです。 ●ChangeLog +150408.1234 +* NGあぼーんの対象になったレスのIDを自動的にNGあぼーんする機能を追加 +* HTTP通信のヘッダを見直し +* dig2ch.phpで解析エラーが発生した際に詳細情報を出すように変更 + 150406.2211 * 節穴板と名無しで書き込みできない板の条件を正しく動作するように修正 * 名無しで書込出来ない板は書き込み続行できないように変更 From 9227716b6a9650f49e562ba55166f405743c4477 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 9 Apr 2015 11:04:15 +0900 Subject: [PATCH 122/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=E5=90=91?= =?UTF-8?q?=E3=81=91=E6=94=B9=E8=89=AF=E3=81=AE=E4=B8=8B=E6=BA=96=E5=82=99?= =?UTF-8?q?=20lib/ShowThreadK.php=E3=81=8B=E3=82=89=20lib/ShowThreadI.php?= =?UTF-8?q?=E3=82=92=E7=8B=AC=E7=AB=8B=E3=81=95=E3=81=9B=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThreadI.php | 1437 +++++++++++++++++++++++++++++++++++++++++ lib/ShowThreadK.php | 239 ++----- lib/startup.funcs.php | 2 +- rep2/read.php | 8 +- 4 files changed, 1483 insertions(+), 203 deletions(-) create mode 100644 lib/ShowThreadI.php diff --git a/lib/ShowThreadI.php b/lib/ShowThreadI.php new file mode 100644 index 000000000..d85e0310d --- /dev/null +++ b/lib/ShowThreadI.php @@ -0,0 +1,1437 @@ +<?php +/** + * rep2 - 携帯用でスレッドを表示する クラス + */ + +require_once P2EX_LIB_DIR . '/ExpackLoader.php'; + +ExpackLoader::loadAAS(); +ExpackLoader::loadActiveMona(); +ExpackLoader::loadImageCache(); + +// {{{ ShowThreadI + +class ShowThreadI extends ShowThread +{ + // {{{ properties + + static private $_spm_objects = array(); + + public $am_autong = false; // 自動AA略をするか否か + + public $aas_rotate = '90°回転'; // AAS 回転リンク文字列 + + public $respopup_at = ' onclick="return iResPopUp(this, event);"'; // レスポップアップ・イベントハンドラ + public $target_at = ' target="_blank"'; // 引用、省略、ID、NG等のリンクターゲット + public $check_st = 'check'; // 省略、NG等のリンク文字列 + + public $spmObjName; // スマートポップアップメニュー用JavaScriptオブジェクト名 + + private $_dateIdPattern; // 日付書き換えの検索パターン + private $_dateIdReplace; // 日付書き換えの置換文字列 + + //private $_lineBreaksReplace; // 連続する改行の置換文字列 + + private $_kushiYakiName = null; // BBQに焼かれているときの名前接頭辞 + + // }}} + // {{{ constructor + + /** + * コンストラクタ + */ + public function __construct(ThreadRead $aThread, $matome = false) + { + parent::__construct($aThread, $matome); + + global $_conf, $STYLE; + + $this->_url_handlers = array( + 'plugin_linkThread', + 'plugin_link2chSubject', + ); + // +Wiki + if (isset($GLOBALS['replaceImageUrlCtl'])) { + $this->_url_handlers[] = 'plugin_replaceImageUrl'; + } + if (P2_IMAGECACHE_AVAILABLE == 2) { + $this->_url_handlers[] = 'plugin_imageCache2'; + } elseif ($_conf['mobile.use_picto']) { + $this->_url_handlers[] = 'plugin_viewImage'; + } + if ($_conf['mobile.link_youtube']) { + $this->_url_handlers[] = 'plugin_linkYouTube'; + } + $this->_url_handlers[] = 'plugin_linkURL'; + + if (!$_conf['mobile.bbs_noname_name']) { + $this->setBbsNonameName(); + } + + if (P2Util::isHost2chs($aThread->host)) { + $this->_kushiYakiName = ' </b>[―{}@{}@{}-]<b> '; + } + + if ($_conf['mobile.date_zerosuppress']) { + $this->_dateIdPattern = '~^(?:' . date('Y|y') . ')/(?:0(\\d)|(\\d\\d))?(?:(/)0)?~'; + $this->_dateIdReplace = '$1$2$3'; + } else { + $this->_dateIdPattern = '~^(?:' . date('Y|y') . ')/~'; + $this->_dateIdReplace = ''; + } + + // 連続する改行の置換文字列を設定 + /* + if ($_conf['mobile.strip_linebreaks']) { + $ngword_color = $GLOBALS['STYLE']['mobile_read_ngword_color']; + if (strpos($ngword_color, '\\') === false && strpos($ngword_color, '$') === false) { + $this->_lineBreaksReplace = " <br><s><font color=\"{$ngword_color}\">***</font></s><br> "; + } else { + $this->_lineBreaksReplace = ' <br><s>***</s><br> '; + } + } else { + $this->_lineBreaksReplace = null; + } + */ + + // サムネイル表示制限数を設定 + if (!isset($GLOBALS['pre_thumb_unlimited']) || !isset($GLOBALS['expack.ic2.pre_thumb_limit_k'])) { + if (isset($_conf['expack.ic2.pre_thumb_limit_k']) && $_conf['expack.ic2.pre_thumb_limit_k'] > 0) { + $GLOBALS['pre_thumb_limit_k'] = $_conf['expack.ic2.pre_thumb_limit_k']; + $GLOBALS['pre_thumb_unlimited'] = false; + } else { + $GLOBALS['pre_thumb_limit_k'] = null; // ヌル値だとisset()はfalseを返す + $GLOBALS['pre_thumb_unlimited'] = true; + } + } + $GLOBALS['pre_thumb_ignore_limit'] = false; + + // アクティブモナー初期化 + if (P2_ACTIVEMONA_AVAILABLE) { + ExpackLoader::initActiveMona($this); + } + + // ImageCache2初期化 + if (P2_IMAGECACHE_AVAILABLE == 2) { + ExpackLoader::initImageCache($this); + } + + // AAS 初期化 + if (P2_AAS_AVAILABLE) { + ExpackLoader::initAAS($this); + } + + // SPM初期化 + //if ($this->_matome) { + // $this->spmObjName = sprintf('t%dspm%u', $this->_matome, crc32($this->thread->keydat)); + //} else { + $this->spmObjName = sprintf('spm%u', crc32($this->thread->keydat)); + //} + } + + // }}} + // {{{ transRes() + + /** + * DatレスをHTMLレスに変換する + * + * @param string $ares datの1ライン + * @param int $i レス番号 + * @param string $pattern ハイライト用正規表現 + * @return string + */ + public function transRes($ares, $i, $pattern = null) + { + global $_conf, $STYLE, $mae_msg; + + list($name, $mail, $date_id, $msg) = $this->thread->explodeDatLine($ares); + if (($id = $this->thread->ids[$i]) !== null) { + $idstr = 'ID:' . $id; + $date_id = str_replace($this->thread->idp[$i] . $id, $idstr, $date_id); + } else { + $idstr = null; + } + + // +Wiki:置換ワード + if (isset($GLOBALS['replaceWordCtl'])) { + $replaceWordCtl = $GLOBALS['replaceWordCtl']; + $name = $replaceWordCtl->replace('name', $this->thread, $ares, $i); + $mail = $replaceWordCtl->replace('mail', $this->thread, $ares, $i); + $date_id = $replaceWordCtl->replace('date', $this->thread, $ares, $i); + $msg = $replaceWordCtl->replace('msg', $this->thread, $ares, $i); + } + + $tores = ''; + if ($this->_matome) { + $res_id = "t{$this->_matome}r{$i}"; + } else { + $res_id = "r{$i}"; + } + + // NGあぼーんチェック + $nong = !empty($_GET['nong']); + $ng_type = $this->_ngAbornCheck($i, strip_tags($name), $mail, $date_id, $id, $msg, $nong, $ng_info); + if ($ng_type == self::ABORN) { + return $this->_abornedRes($res_id); + } + if (!$nong && $this->am_autong && $this->activeMona->detectAA($msg)) { + $is_ng = array_key_exists($i, $this->_ng_nums); + $ng_type |= $this->_markNgAborn($i, self::NG_AA, true); + $ng_info[] = 'AA略'; + // AAを連鎖NG対象から外す場合 + if (!$is_ng && $_conf['expack.am.autong_k'] == 2) { + unset($this->_ng_nums[$i]); + } + } + if ($ng_type != self::NG_NONE) { + $ngaborns_head_hits = self::$_ngaborns_head_hits; + $ngaborns_body_hits = self::$_ngaborns_body_hits; + } + + // {{{ 名前と日付・IDを調整 + + // 串焼きマークを短縮 + if ($this->_kushiYakiName !== null && strpos($name, $this->_kushiYakiName) === 0) { + $name = substr($name, strlen($this->_kushiYakiName)); + // デフォルトの名前は省略 + if ($name === $this->_nanashiName) { + $name = '[串]'; + } else { + $name = '[串]' . $name; + } + // デフォルトの名前と同じなら省略 + } elseif ($name === $this->_nanashiName) { + $name = ''; + } + + // 現在の年号は省略カットする。月日の先頭0もカット。 + $date_id = preg_replace($this->_dateIdPattern, $this->_dateIdReplace, $date_id); + + // 曜日と時間の間を詰める + $date_id = str_replace(') ', ')', $date_id); + + // 秒もカット + if ($_conf['mobile.clip_time_sec']) { + $date_id = preg_replace('/(\\d\\d:\\d\\d):\\d\\d(?:\\.\\d\\d)?/', '$1', $date_id); + } + + // ID + if ($id !== null) { + $id_suffix = substr($id, -1); + + if ($_conf['mobile.underline_id'] && $id_suffix == 'O' && strlen($id) % 2) { + $do_underline_id_suffix = true; + } else { + $do_underline_id_suffix = false; + } + + if ($this->thread->idcount[$id] > 1) { + if ($_conf['flex_idpopup'] == 1) { + $date_id = str_replace($idstr, $this->idFilter($idstr, $id), $date_id); + } + if ($do_underline_id_suffix) { + $date_id = str_replace($idstr, substr($idstr, 0, -1) . '<u>' . $id_suffix . '</u>', $date_id); + } + } else { + if ($_conf['mobile.clip_unique_id']) { + if ($do_underline_id_suffix) { + $date_id = str_replace($idstr, 'ID:*<u>' . $id_suffix . '</u>', $date_id); + } else { + $date_id = str_replace($idstr, 'ID:*' . $id_suffix, $date_id); + } + } else { + if ($do_underline_id_suffix) { + $date_id = str_replace($idstr, substr($idstr, 0, -1) . '<u>' . $id_suffix . '</u>', $date_id); + } + } + } + } else { + if ($_conf['mobile.clip_unique_id']) { + $date_id = str_replace('ID:???', 'ID:?', $date_id); + } + } + + // }}} + + //============================================================= + // まとめて出力 + //============================================================= + + if ($name) { + $name = $this->transName($name); // 名前HTML変換 + } + $msg = $this->transMsg($msg, $i); // メッセージHTML変換 + + // BEプロファイルリンク変換 + $date_id = $this->replaceBeId($date_id, $i); + + // NGメッセージ変換 + if ($ng_type != self::NG_NONE && count($ng_info)) { + $ng_info = implode(', ', $ng_info); + if ($ng_type == self::NG_AA) { + $msg = <<<EOMSG +<a class="button" href="{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&ls={$i}&k_continue=1&nong=1{$_conf['k_at_a']}"{$this->respopup_at}{$this->target_at}>{$ng_info}</a> +EOMSG; + } else { + $msg = <<<EOMSG +<s><font color="{$STYLE['mobile_read_ngword_color']}">{$ng_info}</font></s> <a class="button" href="{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&ls={$i}&k_continue=1&nong=1{$_conf['k_at_a']}"{$this->respopup_at}{$this->target_at}>{$this->check_st}</a> +EOMSG; + } + + // AAS + if (($ng_type & self::NG_AA) && P2_AAS_AVAILABLE) { + $aas_url = "aas.php?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&resnum={$i}"; + if (P2_AAS_AVAILABLE == 2) { + $aas_txt = "<img src=\"{$aas_url}{$_conf['k_at_a']}&inline=1\">"; + } else { + $aas_txt = "AAS"; + } + $msg .= " <a class=\"aas limelight\" href=\"{$aas_url}&b=pc\" title=\">>{$i}\"{$this->target_at}>{$aas_txt}</a>"; + } + } + + // NGネーム変換 + if ($ng_type & self::NG_NAME) { + $name = <<<EONAME +<s><font color="{$STYLE['mobile_read_ngword_color']}">{$name}</font></s> +EONAME; + $msg = <<<EOMSG +<a class="button" href="{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&ls={$i}&k_continue=1&nong=1{$_conf['k_at_a']}"{$this->respopup_at}{$this->target_at}>{$this->check_st}</a> +EOMSG; + + // NGメール変換 + } elseif ($ng_type & self::NG_MAIL) { + $mail = <<<EOMAIL +<s class="ngword" onmouseover="document.getElementById('ngn{$ngaborns_head_hits}').style.display = 'block';">{$mail}</s> +EOMAIL; + $msg = <<<EOMSG +<div id="ngn{$ngaborns_head_hits}" style="display:none;">{$msg}</div> +EOMSG; + + // NGID変換 + } elseif ($ng_type & self::NG_ID) { + $date_id = <<<EOID +<s><font color="{$STYLE['mobile_read_ngword_color']}">{$date_id}</font></s> +EOID; + $msg = <<<EOMSG +<a class="button" href="{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&ls={$i}&k_continue=1&nong=1{$_conf['k_at_a']}"{$this->respopup_at}{$this->target_at}>{$this->check_st}</a> +EOMSG; + } + + /* + //「ここから新着」画像を挿入 + if ($i == $this->thread->readnum +1) { + $tores .= <<<EOP + <div><img src="img/image.png" alt="新着レス" border="0" vspace="4"></div> +EOP; + } + */ + + $tores .= "<div id=\"{$res_id}\" class=\"res\"><div class=\"res-header\">"; + + $no_class = 'no'; + $no_onclick = ''; + + // オンザフライ時 + if ($this->thread->onthefly) { + $GLOBALS['newres_to_show_flag'] = true; + $no_class .= ' onthefly'; + // 新着レス時 + } elseif ($i > $this->thread->readnum) { + $GLOBALS['newres_to_show_flag'] = true; + $no_class .= ' newres'; + } + + // SPM + if ($_conf['expack.spm.enabled']) { + $no_onclick = " onclick=\"{$this->spmObjName}.show({$i},'{$res_id}',event)\""; + } + + // 番号 + $tores .= "<span class=\"{$no_class}\"{$no_onclick}>{$i}</span>"; + // 名前 + $tores .= " <span class=\"name\">{$name}</span>"; + // メール + $tores .= " <span class=\"mail\">{$mail}</span>"; + // 日付とID + $tores .= " <span class=\"date-id\">{$date_id}</span></div>\n"; + // 内容 + $tores .= "<div class=\"message\">{$msg}</div>"; + // 被レスリスト + if ($_conf['mobile.backlink_list'] == 1) { + $linkstr = $this->_quotebackListHtml($i, 2); + if (strlen($linkstr)) { + $tores .= '<br>' . $linkstr; + } + } + $tores .= "</div>\n"; // 内容を閉じる + + // まとめてフィルタ色分け + if ($pattern) { + if (is_string($_conf['k_filter_marker'])) { + $tores = StrCtl::filterMarking($pattern, $tores, $_conf['k_filter_marker']); + } else { + $tores = StrCtl::filterMarking($pattern, $tores); + } + } + + // 全角英数スペースカナを半角に + if (!empty($_conf['mobile.save_packet'])) { + $tores = mb_convert_kana($tores, 'rnsk'); // CP932 だと ask で < を < に変換してしまうようだ + } + + return array('body' => $tores, 'q' => ''); + } + + // }}} + // {{{ transName() + + /** + * 名前をHTML用に変換する + * + * @param string $name 名前 + * @return string + */ + public function transName($name) + { + $name = strip_tags($name); + + // トリップやホスト付きなら分解する + if (($pos = strpos($name, '◆')) !== false) { + $trip = substr($name, $pos); + $name = substr($name, 0, $pos); + } else { + $trip = null; + } + + // 数字を引用レスポップアップリンク化 + if (strlen($name) && $name != $this->_nanashiName) { + $name = preg_replace_callback( + self::getAnchorRegex('/(?:^|%prefix%)%nums%/'), + array($this, '_quoteNameCallback'), $name + ); + } + + if ($trip) { + $name .= $trip; + } elseif ($name) { + // 文字化け回避 + $name = $name . ' '; + //if (in_array(0xF0 & ord(substr($name, -1)), array(0x80, 0x90, 0xE0))) { + // $name .= ' '; + //} + } + + return $name; + } + + // }}} + // {{{ transMsg() + + /** + * datのレスメッセージをHTML表示用メッセージに変換する + * + * @param string $msg メッセージ + * @param int $mynum レス番号 + * @return string + */ + public function transMsg($msg, $mynum) + { + global $_conf; + global $pre_thumb_ignore_limit; + + $ryaku = false; + + // 2ch旧形式のdat + if ($this->thread->dat_type == '2ch_old') { + $msg = str_replace('@`', ',', $msg); + $msg = preg_replace('/&(?=[^;])/', '&', $msg); + } + + // &補正 + $msg = preg_replace('/&(?!#?\\w+;)/', '&', $msg); + + // >>1のリンクをいったん外す + // <a href="../test/read.cgi/accuse/1001506967/1" target="_blank">>>1</a> + $msg = preg_replace('{<[Aa] .+?>(>>\\d[\\d\\-]*)</[Aa]>}', '$1', $msg); + + // 大きさ制限 + if (empty($_GET['k_continue']) && strlen($msg) > $_conf['mobile.res_size']) { + // <br>以外のタグを除去し、長さを切り詰める + $msg = strip_tags($msg, '<br>'); + $msg = mb_strcut($msg, 0, $_conf['mobile.ryaku_size']); + $msg = preg_replace('/ *<[^>]*$/', '', $msg); + + // >>1, >1, >1, >>1を引用レスポップアップリンク化 + $msg = preg_replace_callback( + self::getAnchorRegex('/%full%/'), + array($this, '_quoteResCallback'), $msg + ); + + $msg .= "<a href=\"{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&ls={$mynum}&k_continue=1&offline=1{$_conf['k_at_a']}\"{$this->respopup_at}{$this->target_at}>略</a>"; + return $msg; + } + + // 新着レスの画像は表示制限を無視する設定なら + if ($mynum > $this->thread->readnum && $_conf['expack.ic2.newres_ignore_limit_k']) { + $pre_thumb_ignore_limit = true; + } + + // 文末の改行と連続する改行を除去 + if ($_conf['mobile.strip_linebreaks']) { + $msg = $this->stripLineBreaks($msg /*, $this->_lineBreaksReplace*/); + } + + // 引用やURLなどをリンク + $msg = $this->transLink($msg); + + // Wikipedia記法への自動リンク + if ($_conf['mobile._linkToWikipeida']) { + $msg = $this->_wikipediaFilter($msg); + } + + return $msg; + } + + // }}} + // {{{ _abornedRes() + + /** + * あぼーんレスのHTMLを取得する + * + * @param string $res_id + * @return string + */ + protected function _abornedRes($res_id) + { + global $_conf; + + if ($_conf['ngaborn_purge_aborn']) { + return ''; + } + + return <<<EOP +<div id="{$res_id}" name="{$res_id}" class="res aborned"> </div>\n +EOP; + } + + // }}} + // {{{ getSpmObjJs() + + /** + * スマートポップアップメニューに必要なスレッド情報を格納したJavaScriptコードを取得 + */ + public function getSpmObjJs($retry = false) + { + global $_conf; + + if (isset(self::$_spm_objects[$this->spmObjName])) { + return $retry ? self::$_spm_objects[$this->spmObjName] : ''; + } + + $ttitle_en = UrlSafeBase64::encode($this->thread->ttitle); + + $motothre_url = $this->thread->getMotoThread(); + $motothre_url = substr($motothre_url, 0, strlen($this->thread->ls) * -1); + + // エスケープ + $_spm_title = StrCtl::toJavaScript($this->thread->ttitle_hc); + $_spm_url = addslashes($motothre_url); + $_spm_host = addslashes($this->thread->host); + $_spm_bbs = addslashes($this->thread->bbs); + $_spm_key = addslashes($this->thread->key); + $_spm_ls = addslashes($this->thread->ls); + $_spm_b = ($_conf['view_forced_by_query']) ? "&b={$_conf['b']}" : ''; + + $code = <<<EOJS +<script type="text/javascript"> +//<![CDATA[ +var {$this->spmObjName} = { + 'objName':'{$this->spmObjName}', + 'query':'&host={$_spm_host}&bbs={$_spm_bbs}&key={$_spm_key}&rescount={$this->thread->rescount}&ttitle_en={$ttitle_en}{$_spm_b}', + 'rc':'{$this->thread->rescount}', + 'title':'{$_spm_title}', + 'ttitle_en':'{$ttitle_en}', + 'url':'{$_spm_url}', + 'host':'{$_spm_host}', + 'bbs':'{$_spm_bbs}', + 'key':'{$_spm_key}', + 'ls':'{$_spm_ls}', + 'client':['{$_conf['b']}','{$_conf['client_type']}'] +}; +{$this->spmObjName}.show = (function(no,id,evt){SPM.show({$this->spmObjName},no,id,evt);}); +{$this->spmObjName}.hide = SPM.hide; // (function(evt){SPM.hide(evt);}); +//]]> +</script>\n +EOJS; + + self::$_spm_objects[$this->spmObjName] = $code; + + return $code; + } + + // }}} + // {{{ getSpmElementHtml() + + /** + * スマートポップアップメニュー用のHTMLを生成する + */ + static public function getSpmElementHtml() + { + global $_conf; + + return <<<EOP +<div id="spm"> +<div id="spm-reply"> + <span id="spm-reply-quote" onclick="SPM.replyTo(true)">>><span id="spm-num">???</span>にレス</span> + <span id="spm-reply-noquote" onclick="SPM.replyTo(false)">[引用なし]</span> +</div> +<div id="spm-action"><select id="spm-select-target"> + <option value="name">名前</option> + <option value="mail">メール</option> + <option value="id" selected>ID</option> + <option value="msg">本文</option> +</select>を<select id="spm-select-action"> + <option value="aborn" selected>あぼーん</option> + <option value="ng">NG</option> +<!-- <option value="search">検索</option> --> +</select><input type="button" onclick="SPM.doAction()" value="OK"></div> +<img id="spm-closer" src="img/iphone/close.png" width="24" height="26" onclick="SPM.hide(event)"> +</div> +EOP; + } + + // }}} + // {{{ idFilter() + + /** + * IDフィルタリングリンク変換 + * + * @param string $idstr ID:xxxxxxxxxx + * @param string $id xxxxxxxxxx + * @return string + */ + public function idFilter($idstr, $id) + { + global $_conf; + + //$idflag = ''; // 携帯/PC識別子 + // IDは8桁または10桁(+携帯/PC識別子)と仮定して + /* + if (strlen($id) % 2 == 1) { + $id = substr($id, 0, -1); + $idflag = substr($id, -1); + } elseif (isset($s[2])) { + $idflag = $s[2]; + } + */ + + $filter_url = $_conf['read_php'] . '?' . http_build_query(array( + 'host' => $this->thread->host, + 'bbs' => $this->thread->bbs, + 'key' => $this->thread->key, + 'ls' => 'all', + 'offline' => '1', + 'idpopup' => '1', + 'rf' => array( + 'field' => ResFilter::FIELD_ID, + 'method' => ResFilter::METHOD_JUST, + 'match' => ResFilter::MATCH_ON, + 'include' => ResFilter::INCLUDE_NONE, + 'word' => $id, + ), + ), '', '&') . $_conf['k_at_a']; + + if (isset($this->thread->idcount[$id]) && $this->thread->idcount[$id] > 0) { + $num_ht = "(<a href=\"{$filter_url}\"{$this->target_at}>{$this->thread->idcount[$id]}</a>)"; + } else { + return $idstr; + } + + return "{$idstr}{$num_ht}"; + } + + // }}} + // {{{ _linkToWikipeida() + + /** + * @see ShowThread + */ + protected function _linkToWikipeida($word) + { + global $_conf; + + $link = 'http://ja.wapedia.org/' . rawurlencode($word); + if ($_conf['through_ime']) { + $link = P2Util::throughIme($link); + } + + return "<a href=\"{$link}\">{$word}</a>"; + } + + // }}} + // {{{ quoteRes() + + /** + * 引用変換(単独) + * + * @param string $full >>1-100 + * @param string $qsign >> + * @param string $appointed_num 1-100 + * @return string + */ + public function quoteRes($full, $qsign, $appointed_num) + { + global $_conf, $STYLE; + + if ($appointed_num == '-') { + return $full; + } + + $appointed_num = mb_convert_kana($appointed_num, 'n'); // 全角数字を半角数字に変換 + if (preg_match('/\\D/', $appointed_num)) { + $appointed_num = preg_replace('/\\D+/', '-', $appointed_num); + return $this->quoteResRange($full, $qsign, $appointed_num); + } + if (preg_match('/^0/', $appointed_num)) { + return $full; + } + $qnum = intval($appointed_num); + if ($qnum < 1 || $qnum > $this->thread->rescount) { + return $full; + } + + $read_url = "{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&offline=1&ls={$appointed_num}"; + return "<a href=\"{$read_url}{$_conf['k_at_a']}\"{$this->respopup_at}{$this->target_at}>" + . (in_array($qnum, $this->_aborn_nums) ? "<s><font color=\"{$STYLE['mobile_read_ngword_color']}\">{$full}</font></s>" : + (in_array($qnum, $this->_ng_nums) ? "<s>{$full}</s>" : "{$full}")) . "</a>"; + } + + // }}} + // {{{ quoteResRange() + + /** + * 引用変換(範囲) + * + * @param string $full >>1-100 + * @param string $qsign >> + * @param string $appointed_num 1-100 + * @return string + */ + public function quoteResRange($full, $qsign, $appointed_num) + { + global $_conf; + + if ($appointed_num == '-') { + return $full; + } + + list($from, $to) = explode('-', $appointed_num); + if (!$from) { + $from = 1; + } elseif ($from < 1 || $from > $this->thread->rescount) { + return $full; + } + // read.phpで表示範囲を判定するので冗長ではある + if (!$to) { + $to = min($from + $_conf['mobile.rnum_range'] - 1, $this->thread->rescount); + } else { + $to = min($to, $from + $_conf['mobile.rnum_range'] - 1, $this->thread->rescount); + } + + $read_url = "{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&offline=1&ls={$from}-{$to}"; + + return "<a href=\"{$read_url}{$_conf['k_at_a']}\"{$this->target_at}>{$full}</a>"; + } + + // }}} + // {{{ ktaiExtUrl() + + /** + * 携帯用外部URL変換 + * + * @param string $full + * @param string $url + * @param string $str + * @return string + */ + public function ktaiExtUrl($full, $url, $str) + { + global $_conf; + + // 通勤ブラウザ + $tsukin_link = ''; + if ($_conf['mobile.use_tsukin']) { + $tsukin_url = 'http://www.sjk.co.jp/c/w.exe?y=' . rawurlencode($url); + if ($_conf['through_ime']) { + $tsukin_url = P2Util::throughIme($tsukin_url); + } + $tsukin_link = '<a href="' . $tsukin_url . '">通</a>'; + } + + // jigブラウザWEB http://bwXXXX.jig.jp/fweb/?_jig_= + $jig_link = ''; + /* + $jig_url = 'http://bwXXXX.jig.jp/fweb/?_jig_=' . rawurlencode($url); + if ($_conf['through_ime']) { + $jig_url = P2Util::throughIme($jig_url); + } + $jig_link = '<a href="'.$jig_url.'">j</a>'; + */ + + if ($tsukin_link || $jig_link) { + $ext_pre = '(' . $tsukin_link . (($tsukin_link && $jig_link) ? '|' : '') . $jig_link . ')'; + } else { + $ext_pre = ''; + } + + if ($_conf['through_ime']) { + $url = P2Util::throughIme($url); + } + return $ext_pre . '<a href="' . $url . '">' . $str . '</a>'; + } + + // }}} + // {{{ ktaiExtUrlCallback() + + /** + * 携帯用外部URL変換 + * + * @param array $s 正規表現にマッチした要素の配列 + * @return string + */ + public function ktaiExtUrlCallback(array $s) + { + return $this->ktaiExtUrl($s[0], $s[1], $s[2]); + } + + // }}} + // {{{ transLinkDo()から呼び出されるURL書き換えメソッド + /** + * これらのメソッドは引数が処理対象パターンに合致しないとfalseを返し、 + * transLinkDo()はfalseが返ってくると$_url_handlersに登録されている次の関数/メソッドに処理させようとする。 + */ + // {{{ plugin_linkURL() + + /** + * URLリンク + */ + public function plugin_linkURL($url, $purl, $str) + { + global $_conf; + + if (isset($purl['scheme'])) { + // 携帯用外部URL変換 + if ($_conf['mobile.use_tsukin']) { + return $this->ktaiExtUrl('', $purl[0], $str); + } + // ime + if ($_conf['through_ime']) { + $link_url = P2Util::throughIme($purl[0]); + } else { + $link_url = $url; + } + return "<a href=\"{$link_url}\">{$str}</a>"; + } + return false; + } + + // }}} + // {{{ plugin_link2chSubject() + + /** + * 2ch bbspink 板リンク + */ + public function plugin_link2chSubject($url, $purl, $str) + { + global $_conf; + + if (preg_match('{^http://(\\w+\\.(?:2ch\\.net|bbspink\\.com))/(\\w+)/$}', $purl[0], $m)) { + $subject_url = "{$_conf['subject_php']}?host={$m[1]}&bbs={$m[2]}"; + return "<a href=\"{$url}\">{$str}</a> [<a href=\"{$subject_url}{$_conf['k_at_a']}\">板をp2で開く</a>]"; + } + return false; + } + + // }}} + // {{{ plugin_linkThread() + + /** + * スレッドリンク + */ + public function plugin_linkThread($url, $purl, $str) + { + global $_conf; + + list($nama_url, $host, $bbs, $key, $ls) = P2Util::detectThread($purl[0]); + if ($host && $bbs && $key) { + $read_url = "{$_conf['read_php']}?host={$host}&bbs={$bbs}&key={$key}&ls={$ls}"; + return "<a href=\"{$read_url}{$_conf['k_at_a']}\">{$str}</a>"; + } + + return false; + } + + // }}} + // {{{ plugin_linkYouTube() + + /** + * YouTubeリンク変換プラグイン + * + * Zend_Gdata_Youtubeを使えばサムネイルその他の情報を簡単に取得できるが... + * + * @param string $url + * @param array $purl + * @param string $str + * @return string|false + */ + public function plugin_linkYouTube($url, $purl, $str) + { + global $_conf; + + // http://www.youtube.com/watch?v=Mn8tiFnAUAI + if (preg_match('{^http://(www|jp)\\.youtube\\.com/watch\\?v=([0-9A-Za-z_\\-]+)}', $purl[0], $m)) { + $subd = $m[1]; + $id = $m[2]; + + if ($_conf['mobile.link_youtube'] == 2) { + $link = $str; + } else { + $link = $this->plugin_linkURL($url, $purl, $str); + if ($link === false) { + // plugin_linkURL()がちゃんと機能している限りここには来ない + if ($_conf['through_ime']) { + $link_url = P2Util::throughIme($purl[0]); + } else { + $link_url = $url; + } + $link = "<a href=\"{$link_url}\">{$str}</a>"; + } + } + + return <<<EOP +{$link}<br><img src="http://img.youtube.com/vi/{$id}/default.jpg" alt="YouTube {$id}"> +EOP; + } + return false; + } + + // }}} + // {{{ plugin_viewImage() + + /** + * 画像リンク変換 + */ + public function plugin_viewImage($url, $purl, $str) + { + global $_conf; + + if (P2Util::isUrlWikipediaJa($url)) { + return false; + } + + if (preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $url) && empty($purl['query'])) { + $picto_url = 'http://pic.to/'.$purl['host'].$purl['path']; + $picto_tag = '<a href="'.$picto_url.'">(ピ)</a> '; + if ($_conf['through_ime']) { + $link_url = P2Util::throughIme($purl[0]); + $picto_url = P2Util::throughIme($picto_url); + } else { + $link_url = $url; + } + return "{$picto_tag}<a href=\"{$link_url}\">{$str}</a>"; + } + + return false; + } + + // }}} + // {{{ plugin_imageCache2() + + /** + * 画像URLのImageCache2変換 + */ + public function plugin_imageCache2($url, $purl, $str) + { + global $_conf; + global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit_k; + + if (P2Util::isUrlWikipediaJa($url)) { + return false; + } + + if (preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $purl[0]) && empty($purl['query'])) { + // インラインプレビューの有効判定 + if ($pre_thumb_unlimited || $pre_thumb_ignore_limit || $pre_thumb_limit_k > 0) { + $inline_preview_flag = true; + $inline_preview_done = false; + } else { + $inline_preview_flag = false; + $inline_preview_done = false; + } + + $url_ht = $url; + $url = $purl[0]; + $url_en = rawurlencode($url); + $img_str = null; + $img_id = null; + + $icdb = new ImageCache2_DataObject_Images(); + + // r=0:リンク;r=1:リダイレクト;r=2:PHPで表示 + // t=0:オリジナル;t=1:PC用サムネイル;t=2:携帯用サムネイル;t=3:中間イメージ + $img_url = 'ic2.php?r=0&t=2&uri=' . $url_en; + $img_url2 = 'ic2.php?r=0&t=2&id='; + $src_url = 'ic2.php?r=1&t=0&uri=' . $url_en; + $src_url2 = 'ic2.php?r=1&t=0&id='; + $src_exists = false; + + // お気にスレ自動画像ランク + $rank = null; + if ($_conf['expack.ic2.fav_auto_rank']) { + $rank = $this->getAutoFavRank(); + } + + // DBに画像情報が登録されていたとき + if ($icdb->get($url)) { + $img_id = $icdb->id; + + // ウィルスに感染していたファイルのとき + if ($icdb->mime == 'clamscan/infected') { + return '[IC2:ウィルス警告]'; + } + // あぼーん画像のとき + if ($icdb->rank < 0) { + return '[IC2:あぼーん画像]'; + } + + // オリジナルの有無を確認 + $_src_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); + if (file_exists($_src_url)) { + $src_exists = true; + $img_url = $img_url2 . $icdb->id; + $src_url = $_src_url; + } else { + $img_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); + $src_url = $src_url2 . $icdb->id; + } + + // インラインプレビューが有効のとき + $prv_url = null; + if ($this->thumbnailer->ini['General']['inline'] == 1) { + // PCでread_new_k.phpにアクセスしたとき等 + if (!isset($this->inline_prvw) || !is_object($this->inline_prvw)) { + $this->inline_prvw = $this->thumbnailer; + } + $prv_url = $this->inline_prvw->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); + + // サムネイル表示制限数以内のとき + if ($inline_preview_flag) { + // プレビュー画像が作られているかどうかでimg要素の属性を決定 + if (file_exists($prv_url)) { + $prv_size = explode('x', $this->inline_prvw->calc($icdb->width, $icdb->height)); + $img_str = "<img src=\"{$prv_url}\" width=\"{$prv_size[0]}\" height=\"{$prv_size[1]}\">"; + } else { + $r_type = ($this->thumbnailer->ini['General']['redirect'] == 1) ? 1 : 2; + if ($src_exists) { + $prv_url = "ic2.php?r={$r_type}&t=1&id={$icdb->id}"; + } else { + $prv_url = "ic2.php?r={$r_type}&t=1&uri={$url_en}"; + } + $prv_url .= $this->img_dpr_query; + if ($this->img_dpr === 1.5 || $this->img_dpr === 2.0) { + $prv_onload = sprintf(' onload="autoAdjustImgSize(this, %f);"', $this->img_dpr); + } else { + $prv_onload = ''; + } + $img_str = "<img src=\"{$prv_url}\"{$prv_onload} width=\"{$prv_size[0]}\" height=\"{$prv_size[1]}\">"; + } + $inline_preview_done = true; + } else { + $img_str = '[p2:既得画像(ランク:' . $icdb->rank . ')]'; + } + } + + // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 + if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false) { + $update = new ImageCache2_DataObject_Images(); + if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { + $update->memo = $this->img_memo . ' ' . $icdb->memo; + } else { + $update->memo = $this->img_memo; + } + $update->whereAddQuoted('uri', '=', $url); + } + + // expack.ic2.fav_auto_rank_override の設定とランク条件がOKなら + // お気にスレ自動画像ランクを上書き更新 + if ($rank !== null && self::isAutoFavRankOverride($icdb->rank, $rank)) { + if ($update === null) { + $update = new ImageCache2_DataObject_Images(); + $update->whereAddQuoted('uri', '=', $url); + } + $update->rank = $rank; + } + + if ($update !== null) { + $update->update(); + } + + // 画像がキャッシュされていないとき + // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める + } else { + // 画像がブラックリストorエラーログにあるか確認 + if (false !== ($errcode = $icdb->ic2_isError($url))) { + return "<s>[IC2:エラー({$errcode})]</s>"; + } + + // インラインプレビューが有効で、サムネイル表示制限数以内なら + if ($this->thumbnailer->ini['General']['inline'] == 1 && $inline_preview_flag) { + $rank_str = ($rank !== null) ? '&rank=' . $rank : ''; + $img_str = "<img src=\"ic2.php?r=2&t=1&uri={$url_en}{$this->img_memo_query}{$rank_str}\" width=\"{$prvw_size[0]}\" height=\"{$prvw_size[1]}\">"; + $inline_preview_done = true; + } else { + $img_url .= $this->img_memo_query; + } + } + + // 表示数制限をデクリメント + if ($inline_preview_flag && $inline_preview_done) { + $pre_thumb_limit_k--; + } + + if (!empty($_SERVER['REQUEST_URI'])) { + $backto = '&from=' . rawurlencode($_SERVER['REQUEST_URI']); + } else { + $backto = ''; + } + + if (is_null($img_str)) { + return sprintf('<a href="%s%s">[IC2:%s:%s]</a>', + $img_url, + $backto, + p2h($purl['host']), + p2h(basename($purl['path'])) + ); + } + + $img_title = p2h($purl['host']) + . ' ' + . p2h(basename($purl['path'])); + return "<a class=\"limelight\" href=\"{$src_url}\" title=\"{$img_title}\" target=\"_blank\">{$img_str}</a>" + //. ' <img class="ic2-show-info" src="img/s2a.png" width="16" height="16" onclick="ic2info.show(' + . ' <input type="button" class="ic2-show-info" value="i" onclick="ic2info.show(' + . (($img_id) ? $img_id : "'{$url_ht}'") . ', event)">'; + } + + return false; + } + + // }}} + // {{{ plugin_replaceImageUrl() + + public function plugin_replaceImageUrl($url, $purl, $str) + { + global $_conf; + global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit_k; + + if (P2Util::isUrlWikipediaJa($url)) { + return false; + } + + // if (preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $url) && empty($purl['query'])) { + // +Wiki + global $replaceImageUrlCtl; + + $url = $purl[0]; + $replaced = $replaceImageUrlCtl->replaceImageUrl($url); + if (!$replaced[0]) { + return false; + } + + foreach ($replaced as $v) { + // インラインプレビューの有効判定 + if ($pre_thumb_unlimited || $pre_thumb_ignore_limit || $pre_thumb_limit_k > 0) { + $inline_preview_flag = true; + $inline_preview_done = false; + } else { + $inline_preview_flag = false; + $inline_preview_done = false; + } + + // +Wiki + // $url_en = rawurlencode($url); + $url_ht = $url; + $url_en = rawurlencode($v['url']); + $ref_en = $v['referer'] ? '&ref=' . rawurlencode($v['referer']) : ''; + $img_str = null; + $img_id = null; + + $icdb = new ImageCache2_DataObject_Images(); + + // r=0:リンク;r=1:リダイレクト;r=2:PHPで表示 + // t=0:オリジナル;t=1:PC用サムネイル;t=2:携帯用サムネイル;t=3:中間イメージ + $img_url = 'ic2.php?r=0&t=2&uri=' . $url_en . $ref_en; + $img_url2 = 'ic2.php?r=0&t=2&id='; + $src_url = 'ic2.php?r=1&t=0&uri=' . $url_en . $ref_en; + $src_url2 = 'ic2.php?r=1&t=0&id='; + $src_exists = false; + + // お気にスレ自動画像ランク + $rank = null; + if ($_conf['expack.ic2.fav_auto_rank']) { + $rank = $this->getAutoFavRank(); + } + + // DBに画像情報が登録されていたとき + if ($icdb->get($v['url'])) { + $img_id = $icdb->id; + + // ウィルスに感染していたファイルのとき + if ($icdb->mime == 'clamscan/infected') { + return '[IC2:ウィルス警告]'; + } + // あぼーん画像のとき + if ($icdb->rank < 0) { + return '[IC2:あぼーん画像]'; + } + + // オリジナルの有無を確認 + $_src_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); + if (file_exists($_src_url)) { + $src_exists = true; + $img_url = $img_url2 . $icdb->id; + $src_url = $_src_url; + } else { + $img_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); + $src_url = $src_url2 . $icdb->id; + } + + // インラインプレビューが有効のとき + $prv_url = null; + if ($this->thumbnailer->ini['General']['inline'] == 1) { + // PCでread_new_k.phpにアクセスしたとき等 + if (!isset($this->inline_prvw) || !is_object($this->inline_prvw)) { + $this->inline_prvw = $this->thumbnailer; + } + $prv_url = $this->inline_prvw->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); + + // サムネイル表示制限数以内のとき + if ($inline_preview_flag) { + // プレビュー画像が作られているかどうかでimg要素の属性を決定 + if (file_exists($prv_url)) { + $prvw_size = explode('x', $this->inline_prvw->calc($icdb->width, $icdb->height)); + $img_str = "<img src=\"{$prv_url}\" width=\"{$prvw_size[0]}\" height=\"{$prvw_size[1]}\">"; + } else { + $r_type = ($this->thumbnailer->ini['General']['redirect'] == 1) ? 1 : 2; + if ($src_exists) { + $prv_url = "ic2.php?r={$r_type}&t=1&id={$icdb->id}"; + } else { + $prv_url = "ic2.php?r={$r_type}&t=1&uri={$url_en}"; + } + $prv_url .= $this->img_dpr_query; + if ($this->img_dpr === 1.5 || $this->img_dpr === 2.0) { + $prv_onload = sprintf(' onload="autoAdjustImgSize(this, %f);"', $this->img_dpr); + } else { + $prv_onload = ''; + } + $img_str = "<img src=\"{$prv_url}\"{$prv_onload} width=\"{$prvw_size[0]}\" height=\"{$prvw_size[1]}\">"; + } + $inline_preview_done = true; + } else { + $img_str = '[p2:既得画像(ランク:' . $icdb->rank . ')]'; + } + } + + // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 + if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false){ + $update = new ImageCache2_DataObject_Images(); + if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { + $update->memo = $this->img_memo . ' ' . $icdb->memo; + } else { + $update->memo = $this->img_memo; + } + $update->whereAddQuoted('uri', '=', $v['url']); + } + + // expack.ic2.fav_auto_rank_override の設定とランク条件がOKなら + // お気にスレ自動画像ランクを上書き更新 + if ($rank !== null && + self::isAutoFavRankOverride($icdb->rank, $rank)) { + if ($update === null) { + $update = new ImageCache2_DataObject_Images(); + $update->whereAddQuoted('uri', '=', $v['url']); + } + $update->rank = $rank; + + } + if ($update !== null) { + $update->update(); + } + + // 画像がキャッシュされていないとき + // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める + } else { + // 画像がブラックリストorエラーログにあるか確認 + if (false !== ($errcode = $icdb->ic2_isError($v['url']))) { + return "<s>[IC2:エラー({$errcode})]</s>"; + } + + // インラインプレビューが有効で、サムネイル表示制限数以内なら + if ($this->thumbnailer->ini['General']['inline'] == 1 && $inline_preview_flag) { + $rank_str = ($rank !== null) ? '&rank=' . $rank : ''; + $img_str = "<img src=\"ic2.php?r=2&t=1&uri={$url_en}{$this->img_memo_query}{$rank_str}{$ref_en}\" width=\"{$prvw_size[0]}\" height=\"{$prvw_size[1]}\">"; + $inline_preview_done = true; + } else { + $img_url .= $this->img_memo_query; + } + } + + // 表示数制限をデクリメント + if ($inline_preview_flag && $inline_preview_done) { + $pre_thumb_limit_k--; + } + + if (!empty($_SERVER['REQUEST_URI'])) { + $backto = '&from=' . rawurlencode($_SERVER['REQUEST_URI']); + } else { + $backto = ''; + } + + if (is_null($img_str)) { + $result .= sprintf('<a href="%s%s">[IC2:%s:%s]</a>', + $img_url, + $backto, + p2h($purl['host']), + p2h(basename($purl['path'])) + ); + } + + $img_title = p2h($purl['host']) + . ' ' + . p2h(basename($purl['path'])); + $result .= "<a class=\"limelight\" href=\"{$src_url}\" title=\"{$img_title}\" target=\"_blank\">{$img_str}</a>" + //. ' <img class="ic2-show-info" src="img/s2a.png" width="16" height="16" onclick="ic2info.show(' + . ' <input type="button" class="ic2-show-info" value="i" onclick="ic2info.show(' + . (($img_id) ? $img_id : "'{$v['url']}'") . ', event)">'; + } + + $linkUrlResult = $this->plugin_linkURL($url, $purl, $str); + if ($linkUrlResult !== false) { + $result .= $linkUrlResult; + } + + return $result; + } + + // }}} + // }}} + // {{{ _quotebackHorizontalListHtml() + + protected function _quotebackHorizontalListHtml($anchors, $resnum) + { + global $_conf; + + if ($_GET['showbl']) { + return ''; + } + $anchors = array_diff($anchors, array($resnum)); + if (!$anchors) { + return ''; + } + $ret = ''; + + $plus = array(); + foreach ($anchors as $num) { + $plus = array_merge($plus, $this->_getQuotebackCount($num)); + } + $plus = array_unique($plus); + $plus_cnt = count(array_diff($plus, $anchors)); + $plus_str = count($plus) > 0 ? '+' . ($plus_cnt > 0 ? $plus_cnt : '') : ''; + + $url = $_conf['read_php'] . '?' . http_build_query(array( + 'host' => $this->thread->host, + 'bbs' => $this->thread->bbs, + 'key' => $this->thread->key, + 'ls' => $resnum, + 'offline' => '1', + 'showbl' => '1', + ), '', '&') . $_conf['k_at_a']; + + $suppress = false; + $n = 0; + $reslist = array(); + foreach($anchors as $anchor) { + if ($anchor == $resnum) continue; + $n++; + if ($_conf['mobile.backlink_list.suppress'] > 0 + && $n > $_conf['mobile.backlink_list.suppress']) { + $suppress = true; + break; + } + $reslist[] = $this->quoteRes('>>'.$anchor, '>>', $anchor); + } + + $res_navi = ''; + if ($_conf['mobile.backlink_list.openres_navi'] == 1 + || ($_conf['mobile.backlink_list.openres_navi'] == 2 + && $suppress === true)) { + if (count($anchors) > 1 || $plus_str) { + $res_navi = "(<a href=\"{$url}\"{$this->target_at}>" + . (count($anchors) > 1 ? count($anchors) : '') + . $plus_str . '</a>)'; + } + } + + $res_count = count($reslist); + if ($res_count === 1 && $suppress === true && $_conf['mobile.backlink_list.suppress'] == 1) { + $ret .= sprintf('<div>【参照レス %s】</div>', $res_navi); + } elseif ($res_count === 1 && $suppress === false) { + $ret .= sprintf('<div>【参照レス %s%s】</div>', $reslist[0], $res_navi); + } else { + for ($n = 0; $n < $res_count; $n++) { + $ret .= '<div>【参照レス ' . $reslist[$n] . '】</div>'; + } + $ret .= '<div>' . ($suppress ? '略' : '') . $res_navi . '</div>'; + } + + return '<div class="reslist">' . $ret . '</div>'; + } + + // }}} + // {{{ _getQuotebackCount() + + protected function _getQuotebackCount($num, $checked = null) + { + $ret = array(); + if ($checked === null) { + $checked = array(); + } + $checked[] = $num; + $quotes = $this->getQuoteFrom(); + if ($quotes[$num]) { + $ret = $quotes[$num]; + foreach ($quotes[$num] as $quote_num) { + if ($quote_num != $num && !in_array($quote_num, $checked)) { + $ret = array_merge($ret, $this->_getQuotebackCount($quote_num, array_merge($ret, $checked))); + } + } + } + return $ret; + } + + // }}} +} + +// }}} + +/* + * Local Variables: + * mode: php + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ +// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/lib/ShowThreadK.php b/lib/ShowThreadK.php index 549c8517a..27f7a107a 100644 --- a/lib/ShowThreadK.php +++ b/lib/ShowThreadK.php @@ -46,12 +46,6 @@ public function __construct(ThreadRead $aThread, $matome = false) global $_conf, $STYLE; - if ($_conf['iphone']) { - $this->respopup_at = ' onclick="return iResPopUp(this, event);"'; - $this->target_at = ' target="_blank"'; - $this->check_st = 'check'; - } - $this->_url_handlers = array( 'plugin_linkThread', 'plugin_link2chSubject', @@ -274,15 +268,10 @@ public function transRes($ares, $i, $pattern = null) // NGメッセージ変換 if ($ng_type != self::NG_NONE && count($ng_info)) { $ng_info = implode(', ', $ng_info); - if ($ng_type == self::NG_AA && $_conf['iphone']) { - $msg = <<<EOMSG -<a class="button" href="{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&ls={$i}&k_continue=1&nong=1{$_conf['k_at_a']}"{$this->respopup_at}{$this->target_at}>{$ng_info}</a> -EOMSG; - } else { - $msg = <<<EOMSG + + $msg = <<<EOMSG <s><font color="{$STYLE['mobile_read_ngword_color']}">{$ng_info}</font></s> <a class="button" href="{$_conf['read_php']}?host={$this->thread->host}&bbs={$this->thread->bbs}&key={$this->thread->key}&ls={$i}&k_continue=1&nong=1{$_conf['k_at_a']}"{$this->respopup_at}{$this->target_at}>{$this->check_st}</a> EOMSG; - } // AAS if (($ng_type & self::NG_AA) && P2_AAS_AVAILABLE) { @@ -292,15 +281,10 @@ public function transRes($ares, $i, $pattern = null) } else { $aas_txt = "AAS"; } - if ($_conf['iphone']) { - //$img_title = p2h($this->thread->getMotoThread(true, $i)); - //$img_title = "{$this->thread->bbs}/{$this->thread->key}/{$i}"; - //$img_title = "{$this->thread->ttitle_hd} >>{$i}"; - $msg .= " <a class=\"aas limelight\" href=\"{$aas_url}&b=pc\" title=\">>{$i}\"{$this->target_at}>{$aas_txt}</a>"; - } else { - $msg .= " <a class=\"aas\" href=\"{$aas_url}{$_conf['k_at_a']}\"{$this->target_at}>{$aas_txt}</a>"; - $msg .= " <a class=\"button\" href=\"{$aas_url}{$_conf['k_at_a']}&rotate=1\"{$this->target_at}>{$this->aas_rotate}</a>"; - } + + $msg .= " <a class=\"aas\" href=\"{$aas_url}{$_conf['k_at_a']}\"{$this->target_at}>{$aas_txt}</a>"; + $msg .= " <a class=\"button\" href=\"{$aas_url}{$_conf['k_at_a']}&rotate=1\"{$this->target_at}>{$this->aas_rotate}</a>"; + } } @@ -341,80 +325,41 @@ public function transRes($ares, $i, $pattern = null) } */ - if ($_conf['iphone']) { - $tores .= "<div id=\"{$res_id}\" class=\"res\"><div class=\"res-header\">"; - - $no_class = 'no'; - $no_onclick = ''; - - // オンザフライ時 - if ($this->thread->onthefly) { - $GLOBALS['newres_to_show_flag'] = true; - $no_class .= ' onthefly'; - // 新着レス時 - } elseif ($i > $this->thread->readnum) { - $GLOBALS['newres_to_show_flag'] = true; - $no_class .= ' newres'; - } - - // SPM - if ($_conf['expack.spm.enabled']) { - $no_onclick = " onclick=\"{$this->spmObjName}.show({$i},'{$res_id}',event)\""; - } - - // 番号 - $tores .= "<span class=\"{$no_class}\"{$no_onclick}>{$i}</span>"; - // 名前 - $tores .= " <span class=\"name\">{$name}</span>"; - // メール - $tores .= " <span class=\"mail\">{$mail}</span>"; - // 日付とID - $tores .= " <span class=\"date-id\">{$date_id}</span></div>\n"; - // 内容 - $tores .= "<div class=\"message\">{$msg}</div>"; - // 被レスリスト - if ($_conf['mobile.backlink_list'] == 1) { - $linkstr = $this->_quotebackListHtml($i, 2); - if (strlen($linkstr)) { - $tores .= '<br>' . $linkstr; - } - } - $tores .= "</div>\n"; // 内容を閉じる - } else { - // 番号(オンザフライ時) - if ($this->thread->onthefly) { - $GLOBALS['newres_to_show_flag'] = true; - $tores .= "<div id=\"{$res_id}\" name=\"{$res_id}\">[<font color=\"{$STYLE['mobile_read_onthefly_color']}'\">{$i}</font>]"; + // 番号(オンザフライ時) + if ($this->thread->onthefly) { + $GLOBALS['newres_to_show_flag'] = true; + $tores .= "<div id=\"{$res_id}\" name=\"{$res_id}\">[<font color=\"{$STYLE['mobile_read_onthefly_color']}'\">{$i}</font>]"; // 番号(新着レス時) - } elseif ($i > $this->thread->readnum) { - $GLOBALS['newres_to_show_flag'] = true; - $tores .= "<div id=\"{$res_id}\" name=\"{$res_id}\">[<font color=\"{$STYLE['mobile_read_newres_color']}\">{$i}</font>]"; + } elseif ($i > $this->thread->readnum) { + $GLOBALS['newres_to_show_flag'] = true; + $tores .= "<div id=\"{$res_id}\" name=\"{$res_id}\">[<font color=\"{$STYLE['mobile_read_newres_color']}\">{$i}</font>]"; // 番号 - } else { - $tores .= "<div id=\"{$res_id}\" name=\"{$res_id}\">[{$i}]"; - } - - // 名前 - if ($name) { - $tores .= "{$name}: "; } - // メール - if ($mail) { - $tores .= "{$mail}: "; - } - // 日付とID - $tores .= "{$date_id}<br>\n"; - // 内容 - $tores .= "{$msg}</div>\n"; - // 被レスリスト - if ($_conf['mobile.backlink_list'] == 1) { - $linkstr = $this->_quotebackListHtml($i, 2); - if (strlen($linkstr)) { - $tores .= '<br>' . $linkstr; - } - } - $tores .= "<hr>\n"; + } else { + $tores .= "<div id=\"{$res_id}\" name=\"{$res_id}\">[{$i}]"; } + // 名前 + if ($name) { + $tores .= "{$name}: "; + } + + // メール + if ($mail) { + $tores .= "{$mail}: "; + } + // 日付とID + $tores .= "{$date_id}<br>\n"; + // 内容 + $tores .= "{$msg}</div>\n"; + // 被レスリスト + if ($_conf['mobile.backlink_list'] == 1) { + $linkstr = $this->_quotebackListHtml($i, 2); + if (strlen($linkstr)) { + $tores .= '<br>' . $linkstr; + } + } + $tores .= "<hr>\n"; + // まとめてフィルタ色分け if ($pattern) { if (is_string($_conf['k_filter_marker'])) { @@ -564,92 +509,6 @@ protected function _abornedRes($res_id) EOP; } - // }}} - // {{{ getSpmObjJs() - - /** - * スマートポップアップメニューに必要なスレッド情報を格納したJavaScriptコードを取得 - */ - public function getSpmObjJs($retry = false) - { - global $_conf; - - if (isset(self::$_spm_objects[$this->spmObjName])) { - return $retry ? self::$_spm_objects[$this->spmObjName] : ''; - } - - $ttitle_en = UrlSafeBase64::encode($this->thread->ttitle); - - $motothre_url = $this->thread->getMotoThread(); - $motothre_url = substr($motothre_url, 0, strlen($this->thread->ls) * -1); - - // エスケープ - $_spm_title = StrCtl::toJavaScript($this->thread->ttitle_hc); - $_spm_url = addslashes($motothre_url); - $_spm_host = addslashes($this->thread->host); - $_spm_bbs = addslashes($this->thread->bbs); - $_spm_key = addslashes($this->thread->key); - $_spm_ls = addslashes($this->thread->ls); - $_spm_b = ($_conf['view_forced_by_query']) ? "&b={$_conf['b']}" : ''; - - $code = <<<EOJS -<script type="text/javascript"> -//<![CDATA[ -var {$this->spmObjName} = { - 'objName':'{$this->spmObjName}', - 'query':'&host={$_spm_host}&bbs={$_spm_bbs}&key={$_spm_key}&rescount={$this->thread->rescount}&ttitle_en={$ttitle_en}{$_spm_b}', - 'rc':'{$this->thread->rescount}', - 'title':'{$_spm_title}', - 'ttitle_en':'{$ttitle_en}', - 'url':'{$_spm_url}', - 'host':'{$_spm_host}', - 'bbs':'{$_spm_bbs}', - 'key':'{$_spm_key}', - 'ls':'{$_spm_ls}', - 'client':['{$_conf['b']}','{$_conf['client_type']}'] -}; -{$this->spmObjName}.show = (function(no,id,evt){SPM.show({$this->spmObjName},no,id,evt);}); -{$this->spmObjName}.hide = SPM.hide; // (function(evt){SPM.hide(evt);}); -//]]> -</script>\n -EOJS; - - self::$_spm_objects[$this->spmObjName] = $code; - - return $code; - } - - // }}} - // {{{ getSpmElementHtml() - - /** - * スマートポップアップメニュー用のHTMLを生成する - */ - static public function getSpmElementHtml() - { - global $_conf; - - return <<<EOP -<div id="spm"> -<div id="spm-reply"> - <span id="spm-reply-quote" onclick="SPM.replyTo(true)">>><span id="spm-num">???</span>にレス</span> - <span id="spm-reply-noquote" onclick="SPM.replyTo(false)">[引用なし]</span> -</div> -<div id="spm-action"><select id="spm-select-target"> - <option value="name">名前</option> - <option value="mail">メール</option> - <option value="id" selected>ID</option> - <option value="msg">本文</option> -</select>を<select id="spm-select-action"> - <option value="aborn" selected>あぼーん</option> - <option value="ng">NG</option> -<!-- <option value="search">検索</option> --> -</select><input type="button" onclick="SPM.doAction()" value="OK"></div> -<img id="spm-closer" src="img/iphone/close.png" width="24" height="26" onclick="SPM.hide(event)"> -</div> -EOP; - } - // }}} // {{{ idFilter() @@ -1164,17 +1023,7 @@ public function plugin_imageCache2($url, $purl, $str) ); } - if ($_conf['iphone']) { - $img_title = p2h($purl['host']) - . ' ' - . p2h(basename($purl['path'])); - return "<a class=\"limelight\" href=\"{$src_url}\" title=\"{$img_title}\" target=\"_blank\">{$img_str}</a>" - //. ' <img class="ic2-show-info" src="img/s2a.png" width="16" height="16" onclick="ic2info.show(' - . ' <input type="button" class="ic2-show-info" value="i" onclick="ic2info.show(' - . (($img_id) ? $img_id : "'{$url_ht}'") . ', event)">'; - } else { - return "<a href=\"{$img_url}{$backto}\">{$img_str}</a>"; - } + return "<a href=\"{$img_url}{$backto}\">{$img_str}</a>"; } return false; @@ -1360,17 +1209,7 @@ public function plugin_replaceImageUrl($url, $purl, $str) ); } - if ($_conf['iphone']) { - $img_title = p2h($purl['host']) - . ' ' - . p2h(basename($purl['path'])); - $result .= "<a class=\"limelight\" href=\"{$src_url}\" title=\"{$img_title}\" target=\"_blank\">{$img_str}</a>" - //. ' <img class="ic2-show-info" src="img/s2a.png" width="16" height="16" onclick="ic2info.show(' - . ' <input type="button" class="ic2-show-info" value="i" onclick="ic2info.show(' - . (($img_id) ? $img_id : "'{$v['url']}'") . ', event)">'; - } else { - $result .= "<a href=\"{$img_url}{$backto}\">{$img_str}</a>"; - } + $result .= "<a href=\"{$img_url}{$backto}\">{$img_str}</a>"; } $linkUrlResult = $this->plugin_linkURL($url, $purl, $str); diff --git a/lib/startup.funcs.php b/lib/startup.funcs.php index 7edaa0dc0..2a183390b 100644 --- a/lib/startup.funcs.php +++ b/lib/startup.funcs.php @@ -33,7 +33,7 @@ function p2_load_class($name) Session | SettingTxt | ShowBrdMenu(?:K|Pc) | - ShowThread(?:K|Pc)? | + ShowThread(?:K|I|Pc)? | StrCtl | StrSjis | SubjectTxt | diff --git a/rep2/read.php b/rep2/read.php index 2d9b277fb..2b4195ba2 100644 --- a/rep2/read.php +++ b/rep2/read.php @@ -197,7 +197,7 @@ if (!$aThread->ls) { // +live レス表示数切替 if ($_GET['live']) { - $aThread->ls = l .$_conf['live.before_respointer']; + $aThread->ls = 'l' .$_conf['live.before_respointer']; } else { $aThread->ls = $_conf['get_new_res_l']; } @@ -224,7 +224,11 @@ $GLOBALS['filter_hits'] = null; } - $aShowThread = new ShowThreadK($aThread); + if ($_conf['iphone']) { + $aShowThread = new ShowThreadI($aThread); + } else { + $aShowThread = new ShowThreadK($aThread); + } if ($is_ajax) { $response = trim(mb_convert_encoding($aShowThread->getDatToHtml(true), 'UTF-8', 'CP932')); From e5c2321bcb0e1664971c4c2778a307447509e277 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 9 Apr 2015 11:31:43 +0900 Subject: [PATCH 123/339] =?UTF-8?q?=E3=83=8A=E3=83=93=E3=82=B2=E3=83=BC?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=8B=E3=82=89=E3=83=A9=E3=83=99?= =?UTF-8?q?=E3=83=AB=E3=82=92=E6=B6=88=E5=8E=BB=E3=81=A8=E5=88=A5=E3=81=AE?= =?UTF-8?q?=E3=82=AF=E3=83=A9=E3=82=B9=E3=82=92=E5=89=B2=E3=82=8A=E5=BD=93?= =?UTF-8?q?=E3=81=A6=E3=82=8B=E6=BA=96=E5=82=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/read_footer_i.inc.php | 25 +++++++++++-------------- lib/sb_footer_i.inc.php | 29 +++++++++++++---------------- lib/toolbar_i.inc.php | 2 +- 3 files changed, 25 insertions(+), 31 deletions(-) diff --git a/lib/read_footer_i.inc.php b/lib/read_footer_i.inc.php index 6213a3586..137789eb8 100644 --- a/lib/read_footer_i.inc.php +++ b/lib/read_footer_i.inc.php @@ -26,37 +26,34 @@ // 前のページ echo '<td>'; if ($read_navi_previous_url) { - echo toolbar_i_standard_button('img/gp3-prev.png', '前', $read_navi_previous_url); + echo toolbar_i_standard_button('img/gp3-prev.png', null, $read_navi_previous_url); } else { - echo toolbar_i_disabled_button('img/gp3-prev.png', '前'); + echo toolbar_i_disabled_button('img/gp3-prev.png', null); } echo '</td>'; +// ページ番号を直接指定 +echo '<td colspan="2">'; +echo get_read_jump($aThread, '', true); +echo '</td>'; + // 次のページ echo '<td>'; if ($read_navi_next_url) { - echo toolbar_i_standard_button('img/gp4-next.png', '次', $read_navi_next_url); + echo toolbar_i_standard_button('img/gp4-next.png', null, $read_navi_next_url); } else { - echo toolbar_i_disabled_button('img/gp4-next.png', '次'); -} -echo '</td>'; - -// ページ番号を直接指定 -echo '<td colspan="2">'; -echo get_read_jump($aThread, '', true); -if (empty($_conf['expack.iphone.toolbars.no_label'])) { - echo "<br>{$rescount_st}"; + echo toolbar_i_disabled_button('img/gp4-next.png', null); } echo '</td>'; // 上へ echo '<td>'; -echo toolbar_i_standard_button('img/gp1-up.png', '上', '#header'); +echo toolbar_i_standard_button('img/gp1-up.png', null, '#header'); echo '</td>'; // }}} -echo '</tr><tr>'; +echo '</tr><tr></tbody></div><div class="ntoolbar"></table><table><tbody>'; // {{{ その他ボタン類 diff --git a/lib/sb_footer_i.inc.php b/lib/sb_footer_i.inc.php index 6e81edcf4..d683536f6 100644 --- a/lib/sb_footer_i.inc.php +++ b/lib/sb_footer_i.inc.php @@ -156,38 +156,35 @@ echo '<td>'; if ($disp_navi['from'] > 1) { $escaped_url = "{$_conf['subject_php']}?{$paging_q}&from={$disp_navi['mae_from']}{$_conf['k_at_a']}"; - echo toolbar_i_standard_button('img/gp3-prev.png', '前', $escaped_url); + echo toolbar_i_standard_button('img/gp3-prev.png', null, $escaped_url); } else { - echo toolbar_i_disabled_button('img/gp3-prev.png', '前'); + echo toolbar_i_disabled_button('img/gp3-prev.png', null); } echo '</td>'; +// ページ番号を直接指定 +echo '<td colspan="2">'; +echo "{$k_sb_navi_ht}<span class=\"large\">/{$sb_all_pages}</span>"; +echo '</td>'; + // 次のページ echo '<td>'; if ($disp_navi['tugi_from'] <= $sb_disp_all_num) { $escaped_url = "{$_conf['subject_php']}?{$paging_q}&from={$disp_navi['tugi_from']}{$_conf['k_at_a']}"; - echo toolbar_i_standard_button('img/gp4-next.png', '次', $escaped_url); + echo toolbar_i_standard_button('img/gp4-next.png', null, $escaped_url); } else { - echo toolbar_i_disabled_button('img/gp4-next.png', '次'); -} -echo '</td>'; - -// ページ番号を直接指定 -echo '<td colspan="2">'; -echo "{$k_sb_navi_ht}<span class=\"large\">/{$sb_all_pages}</span>"; -if (empty($_conf['expack.iphone.toolbars.no_label'])) { - echo '<br>ページ'; + echo toolbar_i_disabled_button('img/gp4-next.png', null); } echo '</td>'; // 上へ echo '<td>'; -echo toolbar_i_standard_button('img/gp1-up.png', '上', '#header'); +echo toolbar_i_standard_button('img/gp1-up.png', null, '#header'); echo '</td>'; // }}} -echo '</tr><tr>'; +echo '</tr><tr></tbody></div><div class="ntoolbar"></table><table><tbody>'; // {{{ その他ボタン類 @@ -195,12 +192,12 @@ echo '<td>'; if ($ta_num) { $escaped_url = "{$_conf['subject_php']}?{$host_bbs_q}{$norefresh_q}&spmode=taborn{$_conf['k_at_a']}"; - echo toolbar_i_badged_button('img/glyphish/icons2/128-bone.png', 'あぼーん', $escaped_url, $ta_num); + echo toolbar_i_badged_button('img/glyphish/icons2/128-bone.png', 'あぼーんスレ', $escaped_url, $ta_num); } elseif ($aThreadList->spmode == 'taborn') { $escaped_url = "{$_conf['subject_php']}?{$host_bbs_q}{$_conf['k_at_a']}"; echo toolbar_i_standard_button('img/glyphish/icons2/63-runner.png', '板に戻る', $escaped_url); } else { - echo toolbar_i_disabled_button('img/glyphish/icons2/128-bone.png', 'あぼーん'); + echo toolbar_i_disabled_button('img/glyphish/icons2/128-bone.png', 'あぼーんスレ'); } echo '</td>'; diff --git a/lib/toolbar_i.inc.php b/lib/toolbar_i.inc.php index f1407a4fe..d7e93ce62 100644 --- a/lib/toolbar_i.inc.php +++ b/lib/toolbar_i.inc.php @@ -54,7 +54,7 @@ function _toolbar_i_button($icon, $label, $uri, $attrs = '') $attrs = str_replace('class="', 'class="hoverable ', $attrs); } - if (empty($_conf['expack.iphone.toolbars.no_label'])) { + if (empty($_conf['expack.iphone.toolbars.no_label']) && !empty($label) ) { $label = '<br>' . $label; } else { $label = ''; From c64a2ebb6d7489eefa7e0a9e4fc281f9f35990ad Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 9 Apr 2015 13:06:30 +0900 Subject: [PATCH 124/339] =?UTF-8?q?ThreadRead.php=E3=81=AB=E3=82=A8?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E3=81=8C=E3=81=82=E3=81=A3=E3=81=9F=E3=81=AE?= =?UTF-8?q?=E3=81=A7=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index a54169200..d095e14b3 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -415,7 +415,7 @@ protected function _downloadDat2ch($from_bytes) { // echo "あぼーん検出"; $this->onbytes = 0; $this->modified = null; - return $this->_downloadDat2chAPI ($sid, 0); // あぼーん検出。全部取り直し。 + return $this->_downloadDat2ch (0); // あぼーん検出。全部取り直し。 } $body = substr ($body, 1); } @@ -435,7 +435,7 @@ protected function _downloadDat2ch($from_bytes) { $this->modified = null; P2Util::pushInfoHtml ("<p>rep2 info: {$this->onbytes}/{$this->length} ファイルサイズが変なので、datを再取得</p>"); // $GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("dat_size_check"); - return $this->_downloadDat2chAPI ($sid, 0); // datサイズは不正。全部取り直し。 + return $this->_downloadDat2ch (0); // datサイズは不正。全部取り直し。 } } @@ -447,7 +447,7 @@ protected function _downloadDat2ch($from_bytes) { if ($new_host != $this->host) { $this->old_host = $this->host; $this->host = $new_host; - return $this->_downloadDat2chAPI ($sid, $from_bytes); + return $this->_downloadDat2ch ($from_bytes); } else { return $this->_downloadDat2chNotFound ($code); } @@ -458,7 +458,7 @@ protected function _downloadDat2ch($from_bytes) { // echo "あぼーん検出"; $this->onbytes = 0; $this->modified = null; - return $this->_downloadDat2chAPI ($sid, 0); // あぼーん検出。全部取り直し。 + return $this->_downloadDat2ch (0); // あぼーん検出。全部取り直し。 } else { return $this->_downloadDat2chNotFound ($code); } @@ -534,7 +534,7 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma = false) { $this->modified = $response->getHeader ('Last-Modified'); - if (FileCtl::file_write_contents ($this->keydat, $body, $file_append) === false) { + if (FileCtl::file_write_contents ($this->keydat, $body, 0) === false) { p2die ('cannot write file. downloadDat2chMaru()'); } @@ -620,7 +620,7 @@ protected function _downloadDat2chKako($uri, $ext) { $this->modified = $response->getHeader ('Last-Modified'); - if (FileCtl::file_write_contents ($this->keydat, $body, $file_append) === false) { + if (FileCtl::file_write_contents ($this->keydat, $body, 0) === false) { p2die ('cannot write file. downloadDat2chMaru()'); } @@ -751,7 +751,7 @@ public function get2chDatError($code = null) { if ($reason === 'datochi' || preg_match ($kakosoko_match, $read_response_html, $matches) || preg_match ($kakosoko_match2, $read_response_html, $matches)) { $dat_response_status = "このスレッドは過去ログ倉庫に格納されています。"; $marutori_ht = $this->_generateMarutoriLink (); - $plugin_ht = $this->_generateWikiDatLink (); + $plugin_ht = $this->_generateWikiDatLink ($read_url); $moritori_ht = $this->_generateMoritapoDatLink (); $dat_response_msg = "<p>2ch info - このスレッドは過去ログ倉庫に格納されています。{$marutori_ht}{$moritori_ht}{$plugin_ht}</p>"; @@ -1503,9 +1503,11 @@ private function setDatochiResiduums() { * void * @return string */ - protected function _generateWikiDatLink() { + protected function _generateWikiDatLink($read_url) { global $_conf; + $plugin_ht = ''; + // +Wiki if ($_GET['plugin']) { $datPlugin = new DatPluginCtl (); @@ -1555,6 +1557,8 @@ protected function _generateWikiDatLink() { * @return string HTML */ protected function _generateMarutoriLink($retry = false) { + global $_conf; + if ($retry) { $retry_q = "&relogin2ch=true"; $atext = "●IDで再取得する"; From 19fed41b1eece31bc60bc96a456e437b0680b2dd Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 9 Apr 2015 19:46:06 +0900 Subject: [PATCH 125/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=E5=90=91?= =?UTF-8?q?=E3=81=91SPM=E7=AD=89=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThread.php | 6 +++--- lib/read_footer_i.inc.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/ShowThread.php b/lib/ShowThread.php index a4fc233a2..f54573e67 100644 --- a/lib/ShowThread.php +++ b/lib/ShowThread.php @@ -1602,7 +1602,7 @@ protected function _makeQuotes() // NGあぼーんチェック if (($id = $this->thread->ids[$num + 1]) !== null) { - $date_id = str_replace($this->thread->idp[$i] . $id, 'ID:' . $id, $date_id); + $date_id = str_replace($this->thread->idp[$num] . $id, 'ID:' . $id, $date_id); } $ng_type = $this->_ngAbornCheck($num + 1, strip_tags($name), $mail, $date_id, $id, $msg); if ($ng_type == self::ABORN) { @@ -1742,7 +1742,7 @@ public function getQuoteTo() protected function _quotebackListHtml($resnum, $type, $popup=true) { $quote_from = $this->getQuoteFrom(); - if (!array_key_exists($resnum, $quote_from)) return $ret; + if (!array_key_exists($resnum, $quote_from)) return ''; $anchors = $quote_from[$resnum]; sort($anchors); @@ -1952,7 +1952,7 @@ static public function getAnchorRegex($pattern, $unicode = false) // 大差はないが compileMobile2chUriCallBack() のように preg_relplace_callback()してもいいかも。 } if ($unicode) { - return StrSjis::toUnicodePattern($_anchorRegexes[$pattern]); + return StrSjis::toUnicodePattern(self::$_anchorRegexes[$pattern]); } return self::$_anchorRegexes[$pattern]; } diff --git a/lib/read_footer_i.inc.php b/lib/read_footer_i.inc.php index 137789eb8..97037decb 100644 --- a/lib/read_footer_i.inc.php +++ b/lib/read_footer_i.inc.php @@ -119,7 +119,7 @@ // SPM if ($_conf['expack.spm.enabled']) { - echo ShowThreadK::getSpmElementHtml(); + echo ShowThreadI::getSpmElementHtml(); } // 最終レス番号を更新 From cffb61a9b29054a0a5d963368e42fbc539c90a65 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 9 Apr 2015 23:34:26 +0900 Subject: [PATCH 126/339] =?UTF-8?q?ShowThreadK=E3=81=A8ShowThreadI?= =?UTF-8?q?=E3=81=AE=E5=88=86=E9=9B=A2=E3=81=A7=E7=99=BA=E7=94=9F=E3=81=97?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=81=9F=E4=B8=8D=E5=85=B7=E5=90=88=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 6 +++++- rep2/read_new_k.php | 13 +++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index d095e14b3..8447c7743 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -849,7 +849,11 @@ public function previewOne() { } if ($_conf['ktai']) { - $aShowThread = new ShowThreadK ($this); + if ($_conf['iphone']) { + $aShowThread = new ShowThreadI($this); + } else { + $aShowThread = new ShowThreadK($this); + } $aShowThread->am_autong = false; } else { $aShowThread = new ShowThreadPc ($this); diff --git a/rep2/read_new_k.php b/rep2/read_new_k.php index d0d428d0d..6f8e80059 100644 --- a/rep2/read_new_k.php +++ b/rep2/read_new_k.php @@ -484,10 +484,15 @@ function readNew($aThread) $GLOBALS['newres_to_show_flag'] = false; $read_cont_ht = ''; if ($aThread->rescount) { - $aShowThread = new ShowThreadK($aThread, true); - if ($_conf['iphone'] && $_conf['expack.spm.enabled']) { - $read_cont_ht .= $aShowThread->getSpmObjJs(); + if ($_conf['iphone']) { + $aShowThread = new ShowThreadI($aThread); + if ($_conf['expack.spm.enabled']) { + $read_cont_ht .= $aShowThread->getSpmObjJs(); + } + + } else { + $aShowThread = new ShowThreadK($aThread); } $read_cont_ht .= $aShowThread->getDatToHtml(); @@ -688,7 +693,7 @@ function readNew($aThread) } // SPM if ($_conf['expack.spm.enabled']) { - echo ShowThreadK::getSpmElementHtml(); + echo ShowThreadI::getSpmElementHtml(); } } From 0fa760da8063f8aeb35c65d4acb2631bc45e4b7a Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Fri, 10 Apr 2015 17:43:34 +0900 Subject: [PATCH 127/339] =?UTF-8?q?=E3=82=B5=E3=83=A0=E3=83=8D=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E8=A1=A8=E7=A4=BA=E3=81=AB=E3=81=A6=20URL=20=E3=81=A7?= =?UTF-8?q?=E5=8F=82=E7=85=A7=E3=81=97=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE?= =?UTF-8?q?=E3=81=A7=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=83=91=E3=82=B9?= =?UTF-8?q?=E3=81=A7=E5=8F=82=E7=85=A7=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThreadPc.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index 5b635c3eb..41468a1ec 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -1544,18 +1544,16 @@ public function plugin_imageCache2($url, $purl, $str, } // オリジナルがキャッシュされているときは画像を直接読み込む - $_img_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); - if (file_exists($_img_url)) { - $img_url = $_img_url; + if (file_exists($this->thumbnailer->srcPath($icdb->size, $icdb->md5, $icdb->mime))) { + $img_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); $cached = true; } else { $cached = false; } // サムネイルが作成されていているときは画像を直接読み込む - $_thumb_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); - if (file_exists($_thumb_url)) { - $thumb_url = $_thumb_url; + if (file_exists($this->thumbnailer->thumbPath($icdb->size, $icdb->md5, $icdb->mime))) { + $thumb_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false){ $update = new ImageCache2_DataObject_Images(); From b56aeabc548b33a8811f75b6e7323d7327c43cb5 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Fri, 10 Apr 2015 17:45:00 +0900 Subject: [PATCH 128/339] =?UTF-8?q?=E6=9D=BF=E7=B5=9E=E8=BE=BC=E3=81=A7?= =?UTF-8?q?=E3=82=AF=E3=82=A8=E3=83=AA=E3=81=8C=E7=A9=BA=E7=99=BD=E3=81=A0?= =?UTF-8?q?=E3=81=A3=E3=81=9F=E5=A0=B4=E5=90=88=E3=81=AF=E9=81=B7=E7=A7=BB?= =?UTF-8?q?=E3=81=97=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/expack/tgrep/view.inc.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/expack/tgrep/view.inc.php b/lib/expack/tgrep/view.inc.php index 9c93c96a0..8b239f9ed 100644 --- a/lib/expack/tgrep/view.inc.php +++ b/lib/expack/tgrep/view.inc.php @@ -49,6 +49,12 @@ function setWinTitle() { function sf() { <?php if (strlen($htm['query']) == 0) { echo 'document.getElementById("Q").focus();'; } ?> } + function moveSubject(href, serachWord, query) { + if(query == ""){ + return ; + } + location.href = href + '?word=' + serachWord + query; + } //]]> </script> </head> @@ -113,7 +119,7 @@ function sf() { <?php foreach ($profile['categories'] as $c) { ?><option value="&C=<?php echo $c->id; ?>"<?php if ($c->id == $htm['category']) { echo ' selected="selected"'; } ?>><?php echo p2h($c->name); ?> (<?php echo $c->hits; ?>)</option><?php } ?> </select> | 板で絞り込む: -<select onchange="location.href=document.getElementById('h_subject_php').value+'?word='+document.getElementById('h_query_en').value+this.options[this.selectedIndex].value"> +<select onchange="moveSubject(document.getElementById('h_subject_php').value, document.getElementById('h_query_en').value, this.options[this.selectedIndex].value);"> <option value="">-</option> <?php $m = ($htm['category'] && isset($profile['categories'][$htm['category']])) ? $profile['categories'][$htm['category']]->member : null; ?> <?php foreach ($profile['boards'] as $n => $b) { if (!$m || in_array($n, $m)) { ?><option value="<?php printf('&host=%s&bbs=%s&itaj_en=%s', $b->host, $b->bbs, UrlSafeBase64::encode($b->name)); ?>"><?php echo p2h($b->name); ?> (<?php echo $b->hits; ?>)</option><?php } } ?> From ea93171e78e2a7318e344b23e86239a41caa4c95 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Fri, 10 Apr 2015 17:45:40 +0900 Subject: [PATCH 129/339] =?UTF-8?q?=E3=82=AB=E3=83=86=E3=82=B4=E3=83=AA?= =?UTF-8?q?=E3=81=8C=E3=81=AA=E3=81=84=E5=A0=B4=E5=90=88=E3=83=AB=E3=83=BC?= =?UTF-8?q?=E3=83=97=E3=82=92=E5=AE=9F=E8=A1=8C=E3=81=97=E3=81=AA=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/expack/tgrep/view.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/expack/tgrep/view.inc.php b/lib/expack/tgrep/view.inc.php index 8b239f9ed..352026687 100644 --- a/lib/expack/tgrep/view.inc.php +++ b/lib/expack/tgrep/view.inc.php @@ -116,7 +116,7 @@ function moveSubject(href, serachWord, query) { | カテゴリで絞り込む: <select onchange="location.href=document.getElementById('h_php_self').value+'?Q='+document.getElementById('h_query_en').value+this.options[this.selectedIndex].value"> <option value="">-</option> -<?php foreach ($profile['categories'] as $c) { ?><option value="&C=<?php echo $c->id; ?>"<?php if ($c->id == $htm['category']) { echo ' selected="selected"'; } ?>><?php echo p2h($c->name); ?> (<?php echo $c->hits; ?>)</option><?php } ?> +<?php if(isset($profile['categories'])){ foreach ($profile['categories'] as $c) { ?><option value="&C=<?php echo $c->id; ?>"<?php if ($c->id == $htm['category']) { echo ' selected="selected"'; } ?>><?php echo p2h($c->name); ?> (<?php echo $c->hits; ?>)</option><?php } } ?> </select> | 板で絞り込む: <select onchange="moveSubject(document.getElementById('h_subject_php').value, document.getElementById('h_query_en').value, this.options[this.selectedIndex].value);"> From db7752163557121fa57459b4e775befb193b5535 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Fri, 10 Apr 2015 17:47:02 +0900 Subject: [PATCH 130/339] VersionUP v150410.1746 --- conf/conf.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 926142da6..14c65d2f9 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150408.1234', // rep2のバージョン + 'p2version' => '150410.1746', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; From 3106d7c9177f9a28d8afb5730958d6ea321c24ca Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sat, 11 Apr 2015 03:00:51 +0900 Subject: [PATCH 131/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=E5=90=91?= =?UTF-8?q?=E3=81=91read=E3=81=AE=E3=83=87=E3=82=B6=E3=82=A4=E3=83=B3?= =?UTF-8?q?=E3=82=92=E6=9C=AC=E5=AE=B6=E9=A2=A8=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThreadI.php | 6 +--- lib/read_header_i.inc.php | 42 +++++++++++-------------- lib/sb_print.inc.php | 8 ++--- lib/toolbar_i.inc.php | 24 +++++++++++++- rep2/css/iphone.css | 66 +++++++++++++++++++++++++++++++++------ 5 files changed, 103 insertions(+), 43 deletions(-) diff --git a/lib/ShowThreadI.php b/lib/ShowThreadI.php index d85e0310d..c52b20ff1 100644 --- a/lib/ShowThreadI.php +++ b/lib/ShowThreadI.php @@ -361,7 +361,7 @@ public function transRes($ares, $i, $pattern = null) if ($_conf['mobile.backlink_list'] == 1) { $linkstr = $this->_quotebackListHtml($i, 2); if (strlen($linkstr)) { - $tores .= '<br>' . $linkstr; + $tores .= $linkstr; } } $tores .= "</div>\n"; // 内容を閉じる @@ -821,10 +821,6 @@ public function plugin_linkURL($url, $purl, $str) global $_conf; if (isset($purl['scheme'])) { - // 携帯用外部URL変換 - if ($_conf['mobile.use_tsukin']) { - return $this->ktaiExtUrl('', $purl[0], $str); - } // ime if ($_conf['through_ime']) { $link_url = P2Util::throughIme($purl[0]); diff --git a/lib/read_header_i.inc.php b/lib/read_header_i.inc.php index e87c9142d..f81779b9d 100644 --- a/lib/read_header_i.inc.php +++ b/lib/read_header_i.inc.php @@ -122,44 +122,34 @@ </head> <body class="nopad"> <div class="ntoolbar" id="header"> -<h1 class="ptitle hoverable">{$aThread->ttitle_hd}</h1> + EOP; // {{{ 各種ボタン類 - -echo '<table><tbody><tr>'; - // 板に戻る -echo '<td>'; $escaped_url = "{$_conf['subject_php']}?{$host_bbs_key_q}{$_conf['k_at_a']}"; -echo toolbar_i_standard_button('img/glyphish/icons2/104-index-cards.png', $itaj_hd, $escaped_url); -echo '</td>'; +echo toolbar_i_back_button($itaj_hd, $escaped_url); + +echo '<div id="read_toolbar_header">'; // レス検索 -echo '<td>'; -echo toolbar_i_showhide_button('img/glyphish/icons2/06-magnifying-glass.png', '検索', 'read_toolbar_filter'); -echo '</td>'; +echo toolbar_i_showhide_button('img/glyphish/icons2/06-magnifying-glass.png', null, 'read_toolbar_filter'); + // お気にスレ -echo '<td>'; if ($thread_info) { - echo toolbar_i_fav_button('img/glyphish/icons2/28-star.png', 'お気にスレ', $thread_info); + echo toolbar_i_fav_button('img/glyphish/icons2/28-star.png', null, $thread_info); } else { - echo toolbar_i_disabled_button('img/glyphish/icons2/28-star.png', 'お気にスレ'); + echo toolbar_i_disabled_button('img/glyphish/icons2/28-star.png', null); } -echo '</td>'; // その他 -echo '<td>'; -echo toolbar_i_showhide_button('img/gp0-more.png', 'その他', 'read_toolbar_extra'); -echo '</td>'; +echo toolbar_i_showhide_button('img/gp0-more.png', null, 'read_toolbar_extra'); // 下へ -echo '<td>'; -echo toolbar_i_standard_button('img/gp2-down.png', '下', '#footer'); -echo '</td>'; +echo toolbar_i_standard_button('img/gp2-down.png', null, '#footer'); -echo '</tr></tbody></table>'; +echo '</div>'; // }}} // {{{ その他のツール @@ -327,7 +317,7 @@ if ($do_filtering) { $htm['rf_field_names'] = array( ResFilter::FIELD_NUMBER => 'レス番号', - ResFilter::FIELD_HOLE => '全体', + ResFilter::FIELD_HOLE => '全体', ResFilter::FIELD_MESSAGE => '本文', ResFilter::FIELD_NAME => '名前', ResFilter::FIELD_MAIL => 'メール', @@ -352,7 +342,13 @@ echo '<div class="hits">' . p2h($aThread->resrange['start']) . 'へのレス</div>'; } -echo '</div>'; // end toolbar +echo <<<EOP +</div> + +<h4 class="thread_title hoverable">{$aThread->ttitle_hd}</h4> + +EOP; +// end toolbar // }}} diff --git a/lib/sb_print.inc.php b/lib/sb_print.inc.php index 6a668b804..bb6fe6da7 100644 --- a/lib/sb_print.inc.php +++ b/lib/sb_print.inc.php @@ -118,7 +118,7 @@ function sb_print($aThreadList) $sortq_ita = "&bbs={$aThreadList->bbs}"; } - $sortq_common = $sortq_spmode . $sortq_host . $sortq_ita; + $sortq_common = $sortq_spmode . $sortq_host . $sortq_ita . $_conf['k_at_a']; if (!empty($_REQUEST['find_cont']) && strlen($GLOBALS['word_fm']) > 0) { $word_q = '&word=' . rawurlencode($GLOBALS['word']) . '&method=' . rawurlencode($GLOBALS['sb_filter']['method']); @@ -226,7 +226,7 @@ function sb_print($aThreadList) $midoku_ari = false; $anum_ht = ''; // #r1 - $host_bbs_key_q = "host={$aThread->host}&bbs={$aThread->bbs}&key={$aThread->key}"; + $host_bbs_key_q = "host={$aThread->host}&bbs={$aThread->bbs}&key={$aThread->key}{$_conf['k_at_a']}"; if ($aThreadList->spmode != 'taborn') { if (!$aThread->torder) { $aThread->torder = $i; } @@ -285,7 +285,7 @@ function sb_print($aThreadList) if ($ita_name_bool) { $ita_name_ht = p2h($aThread->itaj ? $aThread->itaj : $aThread->bbs); $td['ita'] = <<<EOP -<td{$class_t}><a href="{$_conf['subject_php']}?host={$aThread->host}&bbs={$aThread->bbs}" target="_self">{$ita_name_ht}</a></td>\n +<td{$class_t}><a href="{$_conf['subject_php']}?host={$aThread->host}&bbs={$aThread->bbs}{$_conf['k_at_a']}" target="_self">{$ita_name_ht}</a></td>\n EOP; } @@ -371,7 +371,7 @@ function sb_print($aThreadList) $offline_q = '&offline=true'; $anum_ht = ''; } - $thre_url = "{$_conf['read_php']}?{$host_bbs_key_q}{$rescount_q}{$offline_q}{$word_q}{$anum_ht}"; + $thre_url = "{$_conf['read_php']}?{$host_bbs_key_q}{$rescount_q}{$offline_q}{$word_q}{$anum_ht}{$_conf['k_at_a']}"; // +live リンク表示切替 if($_conf['live.livelink_subject']==2||$livebbs_bool) diff --git a/lib/toolbar_i.inc.php b/lib/toolbar_i.inc.php index d7e93ce62..9d6c7b076 100644 --- a/lib/toolbar_i.inc.php +++ b/lib/toolbar_i.inc.php @@ -234,8 +234,12 @@ function toolbar_i_fav_button($icon, $label, $info, $setnum = 0) 'setnum' => $setnum, 'setfav' => 2, ), '', '&'); + if(isset($label)) // nullだったらlabel無しにするため + { + $label = $fav['title']; + } - return _toolbar_i_button($icon, $fav['title'], $uri, $attrs); + return _toolbar_i_button($icon, $label, $uri, $attrs); } // }}} @@ -378,6 +382,24 @@ function toolbar_i_action_thread_button($icon, $label, Thread $aThread) } // }}} +// {{{ toolbar_i_action_thread_button() + +/** + * 左上のバックボタン + * + * @param string $label + * @return string + */ +function toolbar_i_back_button($label, $uri) +{ + global $_conf; + + + return <<<EOS +<a href="{$uri}" id="backButton">{$label}</a> +EOS; +} + // {{{ _toolbar_i_client_type() /** diff --git a/rep2/css/iphone.css b/rep2/css/iphone.css index 3d4d105b1..ccdb4b2f2 100644 --- a/rep2/css/iphone.css +++ b/rep2/css/iphone.css @@ -40,6 +40,32 @@ a:link { color: #0000ff; } +/* 左上のTOPボタン */ +a#backButton { + position: absolute; + overflow: hidden; + top: 8px; + margin: 0; + left: 6px; right: auto; + height: 30px; + padding-right: 0px; padding-left: 0px; + width: auto; max-width: 100px; + font-family: Helvetica; + line-height: 30px; + font-size: 12px; + font-weight: bold; + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0; + text-overflow: ellipsis; + text-decoration: none; + white-space: nowrap; + color: #FFFFFF; + border-width: 0 8px 0 14px; + /* background: #333; border-radius: 5px; min-width:46px; text-align:center */ + background: none; + -webkit-border-image: url(../iui/backButton.png?14011419) 0 8 0 14; +} + + a:visited { color: #0080ff; } @@ -154,7 +180,7 @@ div#spm { left: 10px; z-index: 1000; margin: 5px 0 0 5px; - padding 0; + padding: 0; color: #ffffff; background-color: rgba(0, 0, 0, 0.8); -webkit-box-shadow: rgba(0, 0, 0, 0.7) 0 2px 5px; @@ -208,6 +234,16 @@ div#spm > img#spm-closer { /* }}} */ /* {{{ Read */ +div#read_toolbar_header { + text-align:right; + padding: 8px 0; +} + +h4.thread_title { + margin: 8px 4px; + color: #f40; +} + h3 > font[color], div > font[color] > b { color: #252525; } @@ -222,12 +258,13 @@ div:not(.res-header) > span.onthefly { div.res:not(.aborned) { margin: 0; padding: 0; - border-top: #808080 solid 1px; - background-color: #ffffff; + /*border-top: #fff solid 1px;*/ + border-top: #dcdcdc solid 1px; + /*background-color: #FAFAFA;*/ } div.thread > div.res:not(:first-child) { - border-top-width: 4px; +/* border-top-width: 4px;*/ } div.res.aborned { @@ -239,20 +276,29 @@ div.res.aborned { div.res > div.message { margin: 0; - padding: 10px; + padding: 5px 10px; + line-height: 140%; + word-break: break-all; +} + +div.res > div.reslist { + margin: 0; + padding: 5px 10px; line-height: 140%; word-break: break-all; } div.res > div.res-header { margin: 0; - padding: 8px 10px; + padding: 5px; line-height: 120%; - border-bottom: #808080 solid 1px; + color: #1144AA; + display: inline-block; + /*border-bottom: #808080 solid 1px;*/ } div.thread > div.res > div.res-header { - background-color: #fafafa; + /*background-color: #fafafa;*/ } div.res-header > span.no { @@ -461,7 +507,7 @@ div.popup-dialog { left: 10px; z-index: 1001; margin: 5px 0 0 5px; - padding 0; + padding: 0; max-width: 300px; color: #ffffff; background-color: rgba(0, 0, 0, 0.8); @@ -625,7 +671,7 @@ div.ntoolbar > h1.ptitle { } div.ntoolbar > h1.ptitle > span.thin { - font-weight: noraml; + font-weight: normal; font-size: 14px; } From be25e8c1d0b323ba90ab7bdbf3f1f6a20c320c32 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sat, 11 Apr 2015 14:31:32 +0900 Subject: [PATCH 132/339] =?UTF-8?q?DAT=E5=8F=96=E5=BE=97=E3=83=97=E3=83=A9?= =?UTF-8?q?=E3=82=B0=E3=82=A4=E3=83=B3=E3=81=8C=E5=8B=95=E4=BD=9C=E3=81=97?= =?UTF-8?q?=E3=81=AA=E3=81=84=E4=B8=8D=E5=85=B7=E5=90=88=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=20=E3=82=B9=E3=83=9E=E3=83=9B=E5=90=91=E3=81=91?= =?UTF-8?q?=E3=83=9A=E3=83=BC=E3=82=B8=E4=B8=8B=E9=83=A8=E3=81=AE=E3=83=9A?= =?UTF-8?q?=E3=83=BC=E3=82=B8=E3=83=A3=E3=81=AE=E3=83=87=E3=82=B6=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=82=92=E5=A4=89=E6=9B=B4=20CSS=E3=82=92=E5=BE=AE?= =?UTF-8?q?=E8=AA=BF=E6=95=B4=20read=5Fnew=5Fk.php=E3=81=AE=E4=BD=9C?= =?UTF-8?q?=E6=A5=AD=E3=82=92=E9=96=8B=E5=A7=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 2 +- lib/read_footer_i.inc.php | 6 ++++-- lib/read_header_i.inc.php | 2 +- lib/sb_footer_i.inc.php | 6 ++++-- lib/wiki/DatPluginCtl.php | 3 +-- lib/wiki/P2UtilWiki.php | 1 + rep2/css/iphone.css | 27 +++++++++++++++++++-------- rep2/read_new_k.php | 19 ++++++------------- 8 files changed, 37 insertions(+), 29 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 8447c7743..d0b076ea0 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -692,7 +692,7 @@ public function get2chDatError($code = null) { } } - $read_url = "http://{$this->host}/test/read.cgi/{$this->bbs}/{$this->key}/1"; + $read_url = "http://{$this->host}/test/read.cgi/{$this->bbs}/{$this->key}/"; // {{{ read.cgi からHTMLを取得 diff --git a/lib/read_footer_i.inc.php b/lib/read_footer_i.inc.php index 97037decb..42ba6efc3 100644 --- a/lib/read_footer_i.inc.php +++ b/lib/read_footer_i.inc.php @@ -18,7 +18,7 @@ // }}} // {{{ ツールバーを表示 -echo '<div class="ntoolbar" id="footer">'; +echo '<div class="ntoolbar" id="footer"><div class="ntoolbar" id="pager">'; echo '<table><tbody><tr>'; // {{{ ページャ @@ -53,10 +53,12 @@ // }}} -echo '</tr><tr></tbody></div><div class="ntoolbar"></table><table><tbody>'; +echo '</tr></tbody></table></div>'; // {{{ その他ボタン類 +echo '<table><tbody><tr>'; + // 新着 echo '<td>'; if (!$aThread->diedat) { diff --git a/lib/read_header_i.inc.php b/lib/read_header_i.inc.php index f81779b9d..0d3f955fb 100644 --- a/lib/read_header_i.inc.php +++ b/lib/read_header_i.inc.php @@ -130,7 +130,7 @@ $escaped_url = "{$_conf['subject_php']}?{$host_bbs_key_q}{$_conf['k_at_a']}"; echo toolbar_i_back_button($itaj_hd, $escaped_url); -echo '<div id="read_toolbar_header">'; +echo '<div id="toolbar_header">'; // レス検索 echo toolbar_i_showhide_button('img/glyphish/icons2/06-magnifying-glass.png', null, 'read_toolbar_filter'); diff --git a/lib/sb_footer_i.inc.php b/lib/sb_footer_i.inc.php index d683536f6..7ee7bdbdb 100644 --- a/lib/sb_footer_i.inc.php +++ b/lib/sb_footer_i.inc.php @@ -147,7 +147,7 @@ // }}} // {{{ ツールバーを表示 -echo '<div class="ntoolbar" id="footer">'; +echo '<div class="ntoolbar" id="footer"><div class="ntoolbar" id="pager">'; echo '<table><tbody><tr>'; // {{{ ページャ @@ -184,10 +184,12 @@ // }}} -echo '</tr><tr></tbody></div><div class="ntoolbar"></table><table><tbody>'; +echo '</tr></tbody></table></div>'; // {{{ その他ボタン類 +echo '<table><tbody><tr>'; + // あぼーん中のスレッド一覧を開く echo '<td>'; if ($ta_num) { diff --git a/lib/wiki/DatPluginCtl.php b/lib/wiki/DatPluginCtl.php index 16db5598b..ace65f379 100644 --- a/lib/wiki/DatPluginCtl.php +++ b/lib/wiki/DatPluginCtl.php @@ -26,9 +26,8 @@ public function load() { global $_conf; - $lines = array(); $path = $_conf['pref_dir'].'/'.$this->filename; - if ($lines = @file($path)) { + if ($lines = FileCtl::file_read_lines($path)) { foreach ($lines as $l) { $lar = explode("\t", trim($l)); if (strlen($lar[0]) == 0) { diff --git a/lib/wiki/P2UtilWiki.php b/lib/wiki/P2UtilWiki.php index d79c6316c..de75dd1f7 100644 --- a/lib/wiki/P2UtilWiki.php +++ b/lib/wiki/P2UtilWiki.php @@ -41,6 +41,7 @@ public static function getResponseCode($url) { try { $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_HEAD); + $response = $req->send(); return $response->getStatus(); } catch (Exception $e) { diff --git a/rep2/css/iphone.css b/rep2/css/iphone.css index ccdb4b2f2..3767537b5 100644 --- a/rep2/css/iphone.css +++ b/rep2/css/iphone.css @@ -65,6 +65,12 @@ a#backButton { -webkit-border-image: url(../iui/backButton.png?14011419) 0 8 0 14; } +div#toolbar_header { + text-align:right; + padding: 6px; + height: 45px; + -webkit-box-sizing: border-box; +} a:visited { color: #0080ff; @@ -234,11 +240,6 @@ div#spm > img#spm-closer { /* }}} */ /* {{{ Read */ -div#read_toolbar_header { - text-align:right; - padding: 8px 0; -} - h4.thread_title { margin: 8px 4px; color: #f40; @@ -652,13 +653,18 @@ div.ntoolbar { color: #fff; } +div.ntoolbar#pager { + background-color: #808080; + color: #fff; +} + div.ntoolbar#header { } div.ntoolbar#footer { } -div.ntoolbar > h1.ptitle { +h1.ptitle { margin: 0; padding: 10px; white-space: nowrap; @@ -670,7 +676,7 @@ div.ntoolbar > h1.ptitle { line-height: 16px; } -div.ntoolbar > h1.ptitle > span.thin { +h1.ptitle > span.thin { font-weight: normal; font-size: 14px; } @@ -715,7 +721,7 @@ div.ntoolbar td { width: 20%; min-width: 64px; margin: 0; - padding: 8px 0; + padding: 4px 0; text-align: center; vertical-align: middle; border-top: #808080 solid 1px; @@ -723,6 +729,11 @@ div.ntoolbar td { line-height: 11px; } +div.ntoolbar#pager td { + padding: 3px 0; + border-top: none; +} + div.ntoolbar td[colspan='2'] { width: 40%; } diff --git a/rep2/read_new_k.php b/rep2/read_new_k.php index 6f8e80059..35aed920e 100644 --- a/rep2/read_new_k.php +++ b/rep2/read_new_k.php @@ -187,24 +187,17 @@ echo <<<EOP <body class="nopad"> <div class="ntoolbar" id="header"> -<h1 class="ptitle hoverable">{$sb_ht} <span class="thin">(新まとめ)</span></h1> -<table><tbody><tr> EOP; // 板に戻る - echo '<td colspan="2">'; - echo toolbar_i_standard_button('img/glyphish/icons2/104-index-cards.png', $ptitle_hd, $ita_url); - echo '</td>'; - - // 予備x2 - echo '<td> </td><td> </td>'; + echo toolbar_i_back_button( $ptitle_hd, $ita_url); - // 下へ - echo '<td>'; - echo toolbar_i_standard_button('img/gp2-down.png', '下', '#footer'); - echo '</td>'; + echo '<div id="toolbar_header">'; + echo <<<EOP +<h1 class="ptitle hoverable">新着まとめ読み</span></h1> +</div> +EOP; - echo '</tr></tbody></table>'; $info_ht = P2Util::getInfoHtml(); if (strlen($info_ht)) { From 28746a12e1a4271ed189991dc5392328c78ce92f Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 12 Apr 2015 00:04:13 +0900 Subject: [PATCH 133/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=E5=90=91?= =?UTF-8?q?=E3=81=91read=E3=81=AB=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=81=BF?= =?UTF-8?q?=E3=83=95=E3=82=A9=E3=83=BC=E3=83=A0=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=20=E6=88=BB=E3=82=8B=E3=83=9C=E3=82=BF=E3=83=B3=E3=81=AE?= =?UTF-8?q?=E8=89=B2=E3=82=92=E7=99=BD=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/read_footer_i.inc.php | 39 ++++++++++++++++++++++++++++++++++++-- lib/read_header.inc.php | 10 +++++----- lib/read_header_i.inc.php | 8 ++++++++ rep2/css/iphone.css | 9 +++++++++ rep2/iui/backButton.png | Bin 541 -> 472 bytes rep2/js/iphone.js | 6 ++++++ 6 files changed, 65 insertions(+), 7 deletions(-) diff --git a/lib/read_footer_i.inc.php b/lib/read_footer_i.inc.php index 42ba6efc3..229cb6a60 100644 --- a/lib/read_footer_i.inc.php +++ b/lib/read_footer_i.inc.php @@ -55,6 +55,37 @@ echo '</tr></tbody></table></div>'; +// {{{書き込みフォーム +if ($_conf['bottom_res_form']) { + $bbs = $aThread->bbs; + $key = $aThread->key; + $host = $aThread->host; + $rescount = $aThread->rescount; + $ttitle_en = UrlSafeBase64::encode($aThread->ttitle); + + $submit_value = '書き込む'; + + $key_idx = $aThread->keyidx; + + // フォームのオプション読み込み + require_once P2_LIB_DIR . '/post_form_options.inc.php'; + + $htm['resform_ttitle'] = <<<EOP +<p><b class="thre_title">{$aThread->ttitle_hd}</b></p> +EOP; + + require_once P2_LIB_DIR . '/post_form.inc.php'; + + echo <<<EOP +<div id="kakiko" class="extra"> +{$htm['dpreview']} +{$htm['post_form']} +{$htm['dpreview2']} +</div>\n +EOP; +} +// }}} + // {{{ その他ボタン類 echo '<table><tbody><tr>'; @@ -89,8 +120,12 @@ echo '<td>'; if (!$aThread->diedat) { if (empty($_conf['disable_res'])) { - $escaped_url = "post_form.php?{$host_bbs_key_q}&rescount={$aThread->rescount}{$ttitle_en_q}{$_conf['k_at_a']}"; - echo toolbar_i_standard_button('img/glyphish/icons2/08-chat.png', '書込', $escaped_url); + if ($_conf['bottom_res_form']) { + echo toolbar_i_showhide_button('img/glyphish/icons2/08-chat.png', '書込', 'kakiko'); + } else { + $escaped_url = "post_form.php?{$host_bbs_key_q}&rescount={$aThread->rescount}{$ttitle_en_q}{$_conf['k_at_a']}"; + echo toolbar_i_standard_button('img/glyphish/icons2/08-chat.png', '書込', $escaped_url); + } } else { echo toolbar_i_opentab_button('img/glyphish/icons2/08-chat.png', '元スレ', $motothre_url); } diff --git a/lib/read_header.inc.php b/lib/read_header.inc.php index 104d781b9..248f8fd50 100755 --- a/lib/read_header.inc.php +++ b/lib/read_header.inc.php @@ -305,11 +305,6 @@ <script type="text/javascript" src="js/ic2_getcount.js?{$_conf['p2_version_id']}"></script> EOP; } -if ($_conf['expack.editor.savedraft'] != '0') { - echo <<<EOP - <script type="text/javascript" src="js/post_draft.js?{$_conf['p2_version_id']}"></script> -EOP; -} if ($_conf['wiki.idsearch.spm.mimizun.enabled'] || $_conf['wiki.idsearch.spm.hissi.enabled'] || $_conf['wiki.idsearch.spm.stalker.enabled']) { @@ -325,6 +320,11 @@ if ($_conf['expack.editor.dpreview']) { echo "\t<link rel=\"stylesheet\" type=\"text/css\" href=\"css.php?css=prvw&skin={$skin_en}\">\n"; } + if ($_conf['expack.editor.savedraft'] != '0') { + echo <<<EOP + <script type="text/javascript" src="js/post_draft.js?{$_conf['p2_version_id']}"></script> +EOP; + } echo "\t<script type=\"text/javascript\" src=\"js/post_form.js?{$_conf['p2_version_id']}\"></script>\n"; $onload_script .= 'checkSage();'; } diff --git a/lib/read_header_i.inc.php b/lib/read_header_i.inc.php index 0d3f955fb..1a9b0f309 100644 --- a/lib/read_header_i.inc.php +++ b/lib/read_header_i.inc.php @@ -106,6 +106,14 @@ EOS; } +if ($_conf['bottom_res_form']) { + $_conf['extra_headers_ht'] .= "\t<script type=\"text/javascript\" src=\"js/post_form.js?{$_conf['p2_version_id']}\"></script>\n"; + if ($_conf['expack.editor.savedraft'] != '0') { + $_conf['extra_headers_ht'] .= <<<EOP + <script type="text/javascript" src="js/post_draft.js?{$_conf['p2_version_id']}"></script> +EOP; + } +} // }}} // }}} // {{{ HTMLプリント diff --git a/rep2/css/iphone.css b/rep2/css/iphone.css index 3767537b5..b403ce2c3 100644 --- a/rep2/css/iphone.css +++ b/rep2/css/iphone.css @@ -107,6 +107,15 @@ p.empty { color: #333;; } +/* }}} * +/* {{{ Res */ +textarea#MESSAGE { + padding: 6px; + line-height: 132%; + width: 100%; + box-sizing: border-box; + -webkit-box-sizing: border-box; +} /* }}} * /* {{{ Forms */ diff --git a/rep2/iui/backButton.png b/rep2/iui/backButton.png index 70b416f99d29f521d2ab54a57aec9b3165c0b587..224da72080a65b64b9ba9c42d3175005e9d17141 100644 GIT binary patch delta 429 zcmV;e0aE^*1lR+RB#|@}e*ua~L_t(oh1HnBQNlnJhCgTkI?xWV1L=TtV4UF&-rf;z z@1|5>>>zX?9cTyIfp*}*9|%L(#6z;{ciKOb!#A1t-fng<pU?R(4FB@7yBF@BcjVGY zYgtL&0jsWLnrJ2K?l-`*;#YS%VH#!KeGHU}-$2%>QGhmIwgj%Uf6mS9qdT22L0NZy z0&W#IW>$vY@0yFU?w$b)#hsZg`%$_~t*jcVP>foqRnBD9Pz5m3qs+{rO@JzOU$y`y zTCdIQwKtmvPGsGE3Ct9?X140xD8ND1-KW5#;wO+t@Ch;maQADDgC7#A(<=KfTXJlu z2Qzz%<P)T>!KQsnf3#&UoAEnO0cP3|l4A&<{k|$#sE(83PzIW(YsC?#4VMHbHLJP0 zRh;M`lMHnYmILovFEoFX;7nHYHRsrHWh(Vsd+O4h-5&{)so#s|Su-nujbak@8~jty zfqSR8h&_MX{DW0DjHvUsQC1B%Rg7A{t?mufaQBMi?sUSmBfgPQ!@UskMrQDzF6Mp! XO0jRlU5e=@00000NkvXXu0mjf;Ly@O delta 496 zcmV<M0T2Gz1DynrBn<>}LP=Bz2nYy#2xN$nAs2rD9CSrkbW?9;ba!ELWdK2BZ(?O2 zMrm?ocW-iQb09-gHF34$HUIztmq|oHR9J=8n88)TKomtUHUJ%H2Veze^Vebp#tOs^ zpaP`=V+F$cFT@V81MNU6hzni_977TpVaB_fmy^XillOoAOfS!K{tIV+dD+Y|GfO-2 z(nx=6vod)LOuI7EL@TpqHUgd{zq_+jPor5g8vqN*4KVK1Q4MW&b^)Agox1yHcXsNj zHEU*1z?J0O-4}K5cTMkD>oT)3@GAN4?#Zc49iwt*RZy8^(46k`%d8421NwS2cK2W% zV4td;&48iSGk0H|%uNFanKiQs@F=--_b7ipf5C2N%`Blb`URu`{M6FR^Bgm~0M?W_ zy>$0=I9t^eJG-DX`Vga0s4lSN)F#?em>sk2rvTUbAw<Wn8>qnE^n3%1Le2qI>|&sP zI+N^EPFm4$kXd)10!zuE2AOE6DzFsz(E48Sh=R(gOM}dcZ5*P>Z{^gbK0A?&Ccjum zhi`Y!fVpH8`8_&(7ns?K^0aUh^0d(A47UHn$TUX;q0y`c??f_aep}resNn7-2i@7J mr}d4D3hsq~H!_U{785_-{e;>XvgXwQ0000<MNUMnLSTa2x8<P# diff --git a/rep2/js/iphone.js b/rep2/js/iphone.js index 6108d42ee..94f341e88 100644 --- a/rep2/js/iphone.js +++ b/rep2/js/iphone.js @@ -778,6 +778,12 @@ iutil.toolbarShowHide = function(element, event) { } } } + + // 書き込みフォームなら画面をスクロール(本家より) + if(id=='kakiko') { + var to = parseInt(target.offsetTop); + document.body.scrollTop = to - 60; + } } } } From 72d72f873e4f4847bc5a9fc9e203ff06c081568b Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Sun, 12 Apr 2015 11:27:19 +0900 Subject: [PATCH 134/339] =?UTF-8?q?pull=20request=20=E3=81=A7=E3=81=AE?= =?UTF-8?q?=E6=9A=AB=E5=AE=9A=E7=9A=84=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E3=82=A2=E3=83=83=E3=83=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 14c65d2f9..0a81f59a6 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150410.1746', // rep2のバージョン + 'p2version' => '150408.0001', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; From e6d596a96134ed65695190b1bf629d597f1f8c27 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 14 Apr 2015 09:30:28 +0900 Subject: [PATCH 135/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=E7=94=A8sub?= =?UTF-8?q?ject=E3=81=A8read=5Fnew=E3=82=92=E6=9C=AC=E5=AE=B6=E9=A2=A8UI?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4=20=E3=82=B9=E3=83=9E=E3=83=9B?= =?UTF-8?q?=E7=94=A8read=E3=82=92subject=E3=81=AB=E5=90=88=E3=82=8F?= =?UTF-8?q?=E3=81=9B=E3=81=9FUI=E3=81=AB=E5=A4=89=E6=9B=B4=20README.md?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E3=82=B9=E3=83=9E=E3=83=9B=E7=94=A8read?= =?UTF-8?q?=E3=81=8B=E3=82=89=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=82=80=E6=99=82?= =?UTF-8?q?=E3=81=AB=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=81=BF=E6=AC=84=E3=81=AB?= =?UTF-8?q?=E8=87=AA=E5=8B=95=E7=9A=84=E3=81=AB=E3=83=95=E3=82=A9=E3=83=BC?= =?UTF-8?q?=E3=82=AB=E3=82=B9=E3=81=8C=E7=A7=BB=E5=8B=95=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 + lib/read_header_i.inc.php | 20 +++++-- lib/sb_footer_i.inc.php | 12 +--- lib/sb_header_i.inc.php | 77 +++++++++++++------------ lib/toolbar_i.inc.php | 70 +++++++++++++++++++---- rep2/css/iphone.css | 115 ++++++++++++++++++++++++++++---------- rep2/js/iphone.js | 7 ++- 7 files changed, 208 insertions(+), 95 deletions(-) diff --git a/README.md b/README.md index 802803e29..a41092fe4 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,8 @@ Web繝悶Λ繧ヲ繧カ縺九i螟画峩縺ァ縺阪↑縺鬆逶ョ縺ッ [conf/conf_admin.inc.php](https * **thermon** https://github.com/thermon/p2-php/ * **part32縺ョ892** *(+live)* https://github.com/pluslive/p2-php/ * **orzisun** https://github.com/orzisun/p2-php +* **2ch774** https://github.com/2ch774/p2-php +* **killer4989** https://github.com/killer4989/p2-php * **2ch p2/rep2繧ケ繝ャ縺ョ>>1-1000** diff --git a/lib/read_header_i.inc.php b/lib/read_header_i.inc.php index 1a9b0f309..ca8a833fe 100644 --- a/lib/read_header_i.inc.php +++ b/lib/read_header_i.inc.php @@ -147,15 +147,11 @@ // お気にスレ if ($thread_info) { echo toolbar_i_fav_button('img/glyphish/icons2/28-star.png', null, $thread_info); -} else { - echo toolbar_i_disabled_button('img/glyphish/icons2/28-star.png', null); } // その他 echo toolbar_i_showhide_button('img/gp0-more.png', null, 'read_toolbar_extra'); -// 下へ -echo toolbar_i_standard_button('img/gp2-down.png', null, '#footer'); echo '</div>'; @@ -299,6 +295,20 @@ {$_conf['detect_hint_input_ht']}{$_conf['k_input_ht']} </form> </div> +<div class="ntoolbar" id="pager"> +<table><tbody><tr> +<td colspan="4" id="thread_title"><div> +{$aThread->ttitle_hd} +</div></td> +<td> +EOP; + +// 下へ +echo toolbar_i_standard_button('img/gp2-down.png', null, '#footer'); + +echo <<<EOP +</td> +</tr></tbody></table></div> EOP; // }}} @@ -353,8 +363,6 @@ echo <<<EOP </div> -<h4 class="thread_title hoverable">{$aThread->ttitle_hd}</h4> - EOP; // end toolbar diff --git a/lib/sb_footer_i.inc.php b/lib/sb_footer_i.inc.php index 7ee7bdbdb..5175abfb3 100644 --- a/lib/sb_footer_i.inc.php +++ b/lib/sb_footer_i.inc.php @@ -7,9 +7,7 @@ //================================================= //フッタプリント //================================================= -$bbs_q = '&bbs=' . $aThreadList->bbs; -$host_bbs_q = 'host=' . $aThreadList->host . $bbs_q; -$paging_q = $host_bbs_q . '&spmode=' . $aThreadList->spmode . $norefresh_q; + if (!empty($GLOBALS['wakati_words'])) { $paging_q .= '&method=similar&word=' . rawurlencode($GLOBALS['wakati_word']); @@ -195,10 +193,7 @@ if ($ta_num) { $escaped_url = "{$_conf['subject_php']}?{$host_bbs_q}{$norefresh_q}&spmode=taborn{$_conf['k_at_a']}"; echo toolbar_i_badged_button('img/glyphish/icons2/128-bone.png', 'あぼーんスレ', $escaped_url, $ta_num); -} elseif ($aThreadList->spmode == 'taborn') { - $escaped_url = "{$_conf['subject_php']}?{$host_bbs_q}{$_conf['k_at_a']}"; - echo toolbar_i_standard_button('img/glyphish/icons2/63-runner.png', '板に戻る', $escaped_url); -} else { +} else { echo toolbar_i_disabled_button('img/glyphish/icons2/128-bone.png', 'あぼーんスレ'); } echo '</td>'; @@ -208,9 +203,6 @@ if (!$aThreadList->spmode || $aThreadList->spmode == 'taborn') { $escaped_url = "{$_conf['subject_php']}?{$host_bbs_q}{$norefresh_q}&spmode=soko{$_conf['k_at_a']}"; echo toolbar_i_standard_button('img/glyphish/icons2/33-cabinet.png', 'dat倉庫', $escaped_url); -} elseif ($aThreadList->spmode == 'soko') { - $escaped_url = "{$_conf['subject_php']}?{$host_bbs_q}{$_conf['k_at_a']}"; - echo toolbar_i_standard_button('img/glyphish/icons2/63-runner.png', '板に戻る', $escaped_url); } else { echo toolbar_i_disabled_button('img/glyphish/icons2/33-cabinet.png', 'dat倉庫'); } diff --git a/lib/sb_header_i.inc.php b/lib/sb_header_i.inc.php index 6e1b7ca03..6c83f424d 100644 --- a/lib/sb_header_i.inc.php +++ b/lib/sb_header_i.inc.php @@ -9,6 +9,9 @@ //=============================================================== $newtime = date('gis'); $norefresh_q = '&norefresh=1'; +$bbs_q = '&bbs=' . $aThreadList->bbs; +$host_bbs_q = 'host=' . $aThreadList->host . $bbs_q; +$paging_q = $host_bbs_q . '&spmode=' . $aThreadList->spmode . $norefresh_q; // {{{ ページタイトル部分URL設定 @@ -103,16 +106,21 @@ </head> <body class="nopad"> <div class="ntoolbar" id="header"> -<h1 class="ptitle hoverable">{$ptitle_ht}</h1> EOP; // {{{ 各種ボタン類 -echo '<table><tbody><tr>'; - +// 戻る +if ($aThreadList->spmode == 'taborn' || $aThreadList->spmode == 'soko') { + $escaped_url = "{$_conf['subject_php']}?{$host_bbs_q}{$_conf['k_at_a']}"; + echo toolbar_i_back_button('板に戻る', $escaped_url); +} else { + echo toolbar_i_back_button('TOP', "index.php{$_conf['k_at_q']}"); +} +echo '<div id="toolbar_header">'; // 新着まとめ読み $shinchaku_norefresh_ht = ''; -echo '<td>'; + if ($aThreadList->spmode != 'soko') { $shinchaku_matome_url = "{$_conf['read_new_k_php']}?host={$aThreadList->host}&bbs={$aThreadList->bbs}&spmode={$aThreadList->spmode}&nt={$newtime}{$_conf['k_at_a']}"; @@ -122,45 +130,25 @@ if ($shinchaku_attayo) { $shinchaku_norefresh_ht = '<input type="hidden" name="norefresh" value="1">'; - echo toolbar_i_badged_button('img/glyphish/icons2/104-index-cards.png', '新まとめ', + echo toolbar_i_badged_button('img/glyphish/icons2/104-index-cards.png', null, $shinchaku_matome_url . $norefresh_q, $shinchaku_num); } else { - echo toolbar_i_standard_button('img/glyphish/icons2/104-index-cards.png', '新まとめ', $shinchaku_matome_url); + echo toolbar_i_standard_button('img/glyphish/icons2/104-index-cards.png', null, $shinchaku_matome_url); } -} else { - echo toolbar_i_disabled_button('img/glyphish/icons2/104-index-cards.png', '新まとめ'); } -echo '</td>'; // スレ検索 -echo '<td>'; -if (!$spmode_without_palace_or_favita) { - echo toolbar_i_showhide_button('img/glyphish/icons2/06-magnifying-glass.png', '検索', 'sb_toolbar_filter'); -} else { - echo toolbar_i_disabled_button('img/glyphish/icons2/06-magnifying-glass.png', '検索'); -} -echo '</td>'; +echo toolbar_i_showhide_button('img/glyphish/icons2/06-magnifying-glass.png', null, 'sb_toolbar_filter'); // お気に板 -echo '<td>'; if ($board_info) { - echo toolbar_i_favita_button('img/glyphish/icons2/28-star.png', 'お気に板', $board_info); -} else { - echo toolbar_i_disabled_button('img/glyphish/icons2/28-star.png', 'お気に板'); + echo toolbar_i_favita_button('img/glyphish/icons2/28-star.png', null, $board_info); } -echo '</td>'; // その他 -echo '<td>'; -echo toolbar_i_showhide_button('img/gp0-more.png', 'その他', 'sb_toolbar_extra'); -echo '</td>'; - -// 下へ -echo '<td>'; -echo toolbar_i_standard_button('img/gp2-down.png', '下', '#footer'); -echo '</td>'; +echo toolbar_i_showhide_button('img/gp0-more.png', null, 'sb_toolbar_extra'); -echo '</tr></tbody></table>'; +echo '</div>'; // }}} // {{{ その他のツール @@ -265,15 +253,13 @@ // }}} // {{{ スレ検索フォーム +if (array_key_exists('method', $sb_filter) && $sb_filter['method'] == 'or') { + $hd['method_checked_at'] = ' checked'; +} else { + $hd['method_checked_at'] = ''; +} -if (!$spmode_without_palace_or_favita) { - if (array_key_exists('method', $sb_filter) && $sb_filter['method'] == 'or') { - $hd['method_checked_at'] = ' checked'; - } else { - $hd['method_checked_at'] = ''; - } - - echo <<<EOP +echo <<<EOP <div id="sb_toolbar_filter" class="extra"> <form id="sb_filter" method="get" action="{$_conf['subject_php']}" accept-charset="{$_conf['accept_charset']}"> {$sb_form_hidden_ht}<input type="text" id="sb_filter_word" name="word" value="{$hd['word']}" size="15" autocorrect="off" autocapitalize="off"> @@ -281,8 +267,21 @@ <input type="submit" name="submit_kensaku" value="検索"> </form> </div> +<div class="ntoolbar" id="pager"> +<table><tbody><tr> +<td colspan="4" id="thread_title"><div> +{$ptitle_hd} +</div></td> +<td> +EOP; + +// 下へ +echo toolbar_i_standard_button('img/gp2-down.png', null, '#footer'); + +echo <<<EOP +</td> +</tr></tbody></table></div> EOP; -} // }}} // {{{ 各種通知 diff --git a/lib/toolbar_i.inc.php b/lib/toolbar_i.inc.php index 9d6c7b076..4454a0e16 100644 --- a/lib/toolbar_i.inc.php +++ b/lib/toolbar_i.inc.php @@ -54,16 +54,10 @@ function _toolbar_i_button($icon, $label, $uri, $attrs = '') $attrs = str_replace('class="', 'class="hoverable ', $attrs); } - if (empty($_conf['expack.iphone.toolbars.no_label']) && !empty($label) ) { - $label = '<br>' . $label; - } else { - $label = ''; - } - $icon = _toolbar_i_icon($icon); return <<<EOS -<a href="{$uri}"{$attrs}><img src="{$icon}" width="48" height="32" alt="">{$label}</a> +<span class="available"><a href="{$uri}"{$attrs}><img src="{$icon}" width="48" height="32" alt="">{$label}</a></span> EOS; } @@ -85,6 +79,12 @@ function toolbar_i_standard_button($icon, $label, $uri) } else { $attrs = ''; } + + if (empty($_conf['expack.iphone.toolbars.no_label']) && !empty($label) ) { + $label = '<br>' . $label; + } else { + $label = ''; + } return _toolbar_i_button($icon, $label, $uri, $attrs); } @@ -102,8 +102,13 @@ function toolbar_i_standard_button($icon, $label, $uri) */ function toolbar_i_badged_button($icon, $label, $uri, $badge) { + if (empty($_conf['expack.iphone.toolbars.no_label']) && !empty($label) ) { + $label = '<br>' . $label; + } else { + $label = ''; + } $label .= sprintf('<span class="badge l%d">%s</span>', min(strlen($badge), 4), $badge); - return _toolbar_i_button($icon, $label, $uri); + return '<div id="matome">'._toolbar_i_button($icon, $label, $uri).'</div>'; } // }}} @@ -119,6 +124,11 @@ function toolbar_i_badged_button($icon, $label, $uri, $badge) */ function toolbar_i_opentab_button($icon, $label, $uri) { + if (empty($_conf['expack.iphone.toolbars.no_label']) && !empty($label) ) { + $label = '<br>' . $label; + } else { + $label = ''; + } return _toolbar_i_button($icon, $label, $uri, ' target="_blank"'); } @@ -137,7 +147,7 @@ function toolbar_i_disabled_button($icon, $label) { global $_conf; - if (empty($_conf['expack.iphone.toolbars.no_label'])) { + if (empty($_conf['expack.iphone.toolbars.no_label']) && !empty($label)) { $label = '<br>' . $label; } else { $label = ''; @@ -164,6 +174,11 @@ function toolbar_i_disabled_button($icon, $label) function toolbar_i_showhide_button($icon, $label, $id) { $attrs = ' onclick="return iutil.toolbarShowHide(this, event);"'; + if (empty($_conf['expack.iphone.toolbars.no_label']) && !empty($label) ) { + $label = '<br>' . $label; + } else { + $label = ''; + } return _toolbar_i_button($icon, $label, "#{$id}", $attrs); } @@ -199,7 +214,17 @@ function toolbar_i_favita_button($icon, $label, $info, $setnum = 0) 'setfavita' => 2, ), '', '&'); - return _toolbar_i_button($icon, $fav['title'], $uri, $attrs); + if(isset($label)) // nullだったらlabel無しにするため + { + $label = $fav['title']; + } + + if (empty($_conf['expack.iphone.toolbars.no_label']) && !empty($label) ) { + $label = '<br>' . $label; + } else { + $label = ''; + } + return _toolbar_i_button($icon, $label, $uri, $attrs); } // }}} @@ -238,6 +263,11 @@ function toolbar_i_fav_button($icon, $label, $info, $setnum = 0) { $label = $fav['title']; } + if (empty($_conf['expack.iphone.toolbars.no_label']) && !empty($label) ) { + $label = '<br>' . $label; + } else { + $label = ''; + } return _toolbar_i_button($icon, $label, $uri, $attrs); } @@ -267,6 +297,11 @@ function toolbar_i_palace_button($icon, $label, $info) 'ttitle_en' => UrlSafeBase64::encode($info->ttitle), 'setpal' => 2, ), '', '&'); + if (empty($_conf['expack.iphone.toolbars.no_label']) && !empty($label) ) { + $label = '<br>' . $label; + } else { + $label = ''; + } return _toolbar_i_button($icon, $label, $uri, $attrs); } @@ -296,6 +331,11 @@ function toolbar_i_aborn_button($icon, $label, $info) 'ttitle_en' => UrlSafeBase64::encode($info->ttitle), 'taborn' => 2, ), '', '&'); + if (empty($_conf['expack.iphone.toolbars.no_label']) && !empty($label) ) { + $label = '<br>' . $label; + } else { + $label = ''; + } return _toolbar_i_button($icon, $label, $uri, $attrs); } @@ -336,6 +376,11 @@ function toolbar_i_action_board_button($icon, $label, ThreadList $aThreadList) if ($title !== '') { $label = p2h($title, false); } + if (empty($_conf['expack.iphone.toolbars.no_label']) && !empty($label) ) { + $label = '<br>' . $label; + } else { + $label = ''; + } return _toolbar_i_button($icon, $label, $uri); } @@ -377,6 +422,11 @@ function toolbar_i_action_thread_button($icon, $label, Thread $aThread) if ($title !== '') { $label = p2h($title, false); } + if (empty($_conf['expack.iphone.toolbars.no_label']) && !empty($label) ) { + $label = '<br>' . $label; + } else { + $label = ''; + } return _toolbar_i_button($icon, $label, $uri); } diff --git a/rep2/css/iphone.css b/rep2/css/iphone.css index b403ce2c3..d354ae31a 100644 --- a/rep2/css/iphone.css +++ b/rep2/css/iphone.css @@ -8,7 +8,7 @@ body { font-family: sans-serif; font-size: medium; line-height: 140%; - color: #000000; + color: #000; background-color: #fafafa; -webkit-text-size-adjust: none; } @@ -249,9 +249,46 @@ div#spm > img#spm-closer { /* }}} */ /* {{{ Read */ -h4.thread_title { - margin: 8px 4px; - color: #f40; +span.thread_title { + text-align: left; + font-weight: bold; + font-size: 16px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; + box-sizing: border-box; + display: inline-block; +} + +td#thread_title { + text-align: left; + font-weight: bold; + font-size: 14px; + line-height: 14px; +} + +td#thread_title > div { + padding: 0 0 0 8px; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +span.link_right_button { + position: absolute; + text-align: right; + right: 0; + top: 0; + padding: 3px 0; + display: inline-block; +} + +div.thread_title { + background-color: #808080; + position: relative; + padding: 4px 0px 4px 4px; } h3 > font[color], div > font[color] > b { @@ -444,17 +481,14 @@ ul.subject > li > a:visited { } ul.subject > li > a:active { - color: #ffffff; - background-color: #194fdb; - -webkit-tap-highlight-color: transparent; } ul.subject > li > a:link > span.new { - color: #ff0000; + color: #8C99B4; } ul.subject > li > a:visited > span.new { - color: #fa5825; + color: #8090B0; } ul.subject > li > a:active > span.new { @@ -467,14 +501,21 @@ ul.subject > li > a > span.info { ul.subject > li > a > span.title { word-break: break-all; - font-size: large; + font-size: 15px; + line-height: 127%; font-weight: bold; } ul.subject > li > a > span.ita { + white-space: nowrap; + color: #666; + font-size: 12px; } ul.subject > li > a > span.num { + white-space: nowrap; + color: #999999; + font-size: 14px; } ul.subject > li > a > span.unread { @@ -487,13 +528,16 @@ ul.subject > li > a > span.unread { ul.subject > li > a > span.unread.new { font-weight: bold; - background-color: #ff0000; + background-color: #8C99B4; } ul.subject > li > a > span.unread.offline { } ul.subject > li > a > span.count { + white-space: nowrap; + color: #999; + font-size: 14px; } ul.subject > li > a > span.count:before { @@ -505,6 +549,9 @@ ul.subject > li > a > span.count:after { } ul.subject > li > a > span.score { + white-space: nowrap; + color: #666; + font-size: 12px; } /* }}} */ @@ -571,7 +618,7 @@ div.popup-dialog > div.popup-dialog-buttons > input[type="button"] { ul.subject > li.info-pop { margin: 0; padding: 10px 5px; - background-color: #333333; + background-color: #333; color: #ffffff; font-size: 16px !important; font-weight: bold; @@ -723,6 +770,7 @@ div.ntoolbar table { padding: 0; border-collapse: collapse; empty-cells: show; + table-layout: fixed; } div.ntoolbar td { @@ -739,7 +787,7 @@ div.ntoolbar td { } div.ntoolbar#pager td { - padding: 3px 0; + padding: 0; border-top: none; } @@ -788,9 +836,12 @@ div.ntoolbar a:visited { div.ntoolbar a.inactive { color: #fff; } - +div.ntoolbar span.available { + display: inline-block; +} div.ntoolbar span.unavailable { color: #555; + display: inline-block; } div.ntoolbar a.hover, @@ -800,7 +851,14 @@ div.ntoolbar a:active { color: #b4b4b4; } -div.ntoolbar td > a > span.badge { +/* バッジの位置決めのためだけ */ +div#matome { + display: inline-block; + position: relative; +} + + +a > span.badge { display: inline-block; position: absolute; top: 0; @@ -811,34 +869,33 @@ div.ntoolbar td > a > span.badge { padding: 2px 5px; -webkit-border-radius: 8px; border-radius: 8px; - background-color: #f00; - background-color: rgba(255, 0, 0, 0.95); + background-color: #8C99B4; color: #fff; font-weight: bold; font-size: 12px; line-height: 12px; } -div.ntoolbar td > a > span.badge.l2 { +a > span.badge.l2 { right: 5px; } -div.ntoolbar td > a > span.badge.l3 { +a > span.badge.l3 { right: 3px; } -div.ntoolbar td > a > span.badge.l4 { +a > span.badge.l4 { right: 0px; } -div.ntoolbar td > a > span.badge.l0 { +a > span.badge.l0 { display: none; } -div.ntoolbar td > a.hover > span.badge, -div.ntoolbar td > a.active > span.badge, -div.ntoolbar td > a:hover > span.badge, -div.ntoolbar td > a:active > span.badge { +a.hover > span.badge, +a.active > span.badge, +a:hover > span.badge, +a:active > span.badge { background-color: #36f; } @@ -882,7 +939,7 @@ div.mtoolbar { min-width: 320px; margin: 0; padding: 0; - background-color: #333; + background-color: #808080; color: #fff; } @@ -966,7 +1023,7 @@ div.mtoolbar > .ttitle > span.btitle { div.ntoolbar td > a { width: 68px; } - div.ntoolbar td > a > span.badge { + a > span.badge { right: 8px !important; } } @@ -975,7 +1032,7 @@ div.mtoolbar > .ttitle > span.btitle { div.ntoolbar td > a { width: 76px; } - div.ntoolbar td > a > span.badge { + a > span.badge { right: 16px !important; } } @@ -984,7 +1041,7 @@ div.mtoolbar > .ttitle > span.btitle { div.ntoolbar td > a { width: 92px; } - div.ntoolbar td > a > span.badge { + a > span.badge { right: 24px !important; } } diff --git a/rep2/js/iphone.js b/rep2/js/iphone.js index 94f341e88..9df463121 100644 --- a/rep2/js/iphone.js +++ b/rep2/js/iphone.js @@ -780,9 +780,14 @@ iutil.toolbarShowHide = function(element, event) { } // 書き込みフォームなら画面をスクロール(本家より) - if(id=='kakiko') { + if (id=='kakiko') { var to = parseInt(target.offsetTop); document.body.scrollTop = to - 60; + // 書き込みフォームにキャレットを移す + var textbox = document.getElementById('MESSAGE'); + var len = textbox.value.length; + textbox.focus(); + textbox.setSelectionRange(len, len); } } } From 21c8e2fb60d54b1e7a89748712396ecd2aec0803 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 14 Apr 2015 09:40:58 +0900 Subject: [PATCH 136/339] =?UTF-8?q?=E3=81=93=E3=81=AE=E3=81=BE=E3=81=BE?= =?UTF-8?q?=E3=81=A0=E3=81=A8=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7=E3=83=B3?= =?UTF-8?q?=E3=81=8C=E5=B7=BB=E6=88=BB=E3=82=8B=E3=81=AE=E3=81=A7=E3=83=90?= =?UTF-8?q?=E3=83=BC=E3=82=B8=E3=83=A7=E3=83=B3=E7=95=AA=E5=8F=B7=E3=82=92?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=20=E4=B8=8B2=E6=A1=81=E3=81=8C61=EF=BD=9E99?= =?UTF-8?q?=E3=81=AF=E9=96=8B=E7=99=BA=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- doc/README-774.txt | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 0a81f59a6..9bc514236 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150408.0001', // rep2のバージョン + 'p2version' => '150414.0061', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index 8ff07bb3a..579e96579 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -38,6 +38,12 @@ rep2-expack test https://github.com/orzisun/p2-php 本家p2と同じく、X11ライセンスです。 ●ChangeLog +150414.???? +* スマホ用readに書き込みフォームを追加 +* スマホ用画面のデザインを変更 +* DAT取得プラグインが動作しない不具合を修正 +* その他諸々 + 150408.1234 * NGあぼーんの対象になったレスのIDを自動的にNGあぼーんする機能を追加 * HTTP通信のヘッダを見直し From 18a5132527ff2271c299aaf3093d00f646351d18 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 14 Apr 2015 23:34:33 +0900 Subject: [PATCH 137/339] v150414.2333 --- conf/conf.inc.php | 2 +- doc/README-774.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 9bc514236..6171b6acb 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150414.0061', // rep2のバージョン + 'p2version' => '150414.2333', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index 579e96579..dd84329c7 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -38,7 +38,7 @@ rep2-expack test https://github.com/orzisun/p2-php 本家p2と同じく、X11ライセンスです。 ●ChangeLog -150414.???? +150414.2333 * スマホ用readに書き込みフォームを追加 * スマホ用画面のデザインを変更 * DAT取得プラグインが動作しない不具合を修正 From 6f4d4601d66fe4c5d390da3d2163f5674d807d48 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 14 Apr 2015 23:44:04 +0900 Subject: [PATCH 138/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=E3=81=AErea?= =?UTF-8?q?d=E3=81=A7=E3=83=9D=E3=83=83=E3=83=97=E3=82=A2=E3=83=83?= =?UTF-8?q?=E3=83=97=E4=BB=A5=E5=A4=96=E3=82=92=E3=82=BF=E3=83=83=E3=83=97?= =?UTF-8?q?=E3=81=97=E3=81=9F=E3=81=A8=E3=81=8D=E3=81=AB=E3=83=9D=E3=83=83?= =?UTF-8?q?=E3=83=97=E3=82=A2=E3=83=83=E3=83=97=E3=82=92=E9=9D=9E=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E3=81=AB=E3=81=99=E3=82=8B=E3=82=B3=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0=20=E3=83=AC=E3=82=B9=E3=83=9D?= =?UTF-8?q?=E3=83=83=E3=83=97=E3=82=A2=E3=83=83=E3=83=97=E3=80=81SPM?= =?UTF-8?q?=E3=80=81IC2=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/read_header_i.inc.php | 3 +- rep2/iv2.php | 4 +++ rep2/js/ic2_iphone.js | 6 +++- rep2/js/jquery.skOuterClick.js | 50 ++++++++++++++++++++++++++++++++++ rep2/js/respopup_iphone.js | 46 ++++++++++++++++--------------- rep2/js/spm_iphone.js | 17 ++++++++---- rep2/read_new_k.php | 3 +- 7 files changed, 98 insertions(+), 31 deletions(-) create mode 100644 rep2/js/jquery.skOuterClick.js diff --git a/lib/read_header_i.inc.php b/lib/read_header_i.inc.php index ca8a833fe..41175a0ea 100644 --- a/lib/read_header_i.inc.php +++ b/lib/read_header_i.inc.php @@ -68,6 +68,8 @@ // {{{ ヘッダ要素 $_conf['extra_headers_ht'] .= <<<EOS +<script type="text/javascript" src="js/jquery-{$_conf['jquery_version']}.min.js"></script> +<script type="text/javascript" src="js/jquery.skOuterClick.js"></script> <script type="text/javascript" src="js/respopup_iphone.js?{$_conf['p2_version_id']}"></script> EOS; // ImageCache2 @@ -88,7 +90,6 @@ if ($_conf['expack.aas.enabled'] || $_conf['expack.ic2.enabled']) { $_conf['extra_headers_ht'] .= <<<EOS <link rel="stylesheet" type="text/css" href="css/limelight.css?{$_conf['p2_version_id']}"> -<script type="text/javascript" src="js/jquery-{$_conf['jquery_version']}.min.js"></script> <script type="text/javascript" src="js/limelight.js?{$_conf['p2_version_id']}"></script> <script type="text/javascript"> // <![CDATA[ diff --git a/rep2/iv2.php b/rep2/iv2.php index 553180c6f..46a8380e8 100644 --- a/rep2/iv2.php +++ b/rep2/iv2.php @@ -30,6 +30,8 @@ $_conf['extra_headers_ht'] .= <<<EOP \n<link rel="stylesheet" type="text/css" href="css/ic2_iphone.css?{$_conf['p2_version_id']}"> <link rel="stylesheet" type="text/css" href="css/iv2_iphone.css?{$_conf['p2_version_id']}"> +<script type="text/javascript" src="js/jquery-{$_conf['jquery_version']}.min.js"></script> +<script type="text/javascript" src="js/jquery.skOuterClick.js"></script> <script type="text/javascript" src="js/json2.js?{$_conf['p2_version_id']}"></script> <script type="text/javascript" src="js/ic2_iphone.js?{$_conf['p2_version_id']}"></script> <script type="text/javascript" src="js/iv2_iphone.js?{$_conf['p2_version_id']}"></script>\n @@ -37,6 +39,8 @@ $_conf['extra_headers_xht'] .= <<<EOP \n<link rel="stylesheet" type="text/css" href="css/ic2_iphone.css?{$_conf['p2_version_id']}" /> <link rel="stylesheet" type="text/css" href="css/iv2_iphone.css?{$_conf['p2_version_id']}" /> +<script type="text/javascript" src="js/jquery-{$_conf['jquery_version']}.min.js"></script> +<script type="text/javascript" src="js/jquery.skOuterClick.js"></script> <script type="text/javascript" src="js/json2.js?{$_conf['p2_version_id']}"></script> <script type="text/javascript" src="js/ic2_iphone.js?{$_conf['p2_version_id']}"></script> <script type="text/javascript" src="js/iv2_iphone.js?{$_conf['p2_version_id']}"></script>\n diff --git a/rep2/js/ic2_iphone.js b/rep2/js/ic2_iphone.js index 5bab24f4e..9164ce1d6 100644 --- a/rep2/js/ic2_iphone.js +++ b/rep2/js/ic2_iphone.js @@ -49,6 +49,9 @@ document.addEventListener('DOMContentLoaded', function(event) { * 画像情報を表示する */ ic2info.show = function(key, evt) { + // skOuterClickが発生しないようにする + evt.stopPropagation(); + var info = ic2info.get(key); while (_messageContainer.childNodes.length) { @@ -189,7 +192,8 @@ document.addEventListener('DOMContentLoaded', function(event) { // }}} - document.getElementById('ic2-info-closer').onclick = ic2info.hide; + $('#ic2-info-closer').click(ic2info.hide); + $('#ic2-info-body').skOuterClick(ic2info.hide); for (var i = 0; i < _ranks.length; i++) { _ranks[i].onclick = (function(n){ diff --git a/rep2/js/jquery.skOuterClick.js b/rep2/js/jquery.skOuterClick.js new file mode 100644 index 000000000..e052375e5 --- /dev/null +++ b/rep2/js/jquery.skOuterClick.js @@ -0,0 +1,50 @@ +/* + + skOuterClick - A simple event-binder-plugin to handle click events of outside elements. + Copyright (c) 2014 SUKOBUTO All rights reserved. + Licensed under the MIT license. + https://github.com/sukobuto/jquery.skOuterClick/blob/master/LICENSE + +*/ + +// touch対応改造済み +// http://tmpla.info/javascript/jquery/jquery%25e3%2581%25a7%25e6%258c%2587%25e5%25ae%259a%25e8%25a6%2581%25e7%25b4%25a0%25e4%25bb%25a5%25e5%25a4%2596%25e3%2581%25ae%25e3%2581%25a8%25e3%2581%2593%25e3%2582%258d%25e3%2582%2592%25e3%2582%25bf%25e3%2583%2583%25e3%2583%2597%25e3%2581%2595%25e3%2582%258c%25e3%2581%259f%25e3%2582%25a4%25e3%2583%2599%25e3%2583%25b3/ + +(function($){ + + $.fn.skOuterClick = function(method) { + var methods = { + init : function (handler) { + var inners = new Array(); + if (arguments.length > 1) for (i = 1; i < arguments.length; i++) { + inners.push(arguments[i]); + } + return this.each(function() { + var self = $(this); + var _this = this; + var isInner = false; + // Bind click event to suppress + function onInnerClick(e){ + isInner = true; + }; + self.on('click touchend', onInnerClick); + for (var i = 0; i < inners.length; i++) { + inners[i].on('click touchend',onInnerClick); + } + // Bind click elsewhere + $(document).on('click touchend', function(e){ + if (!isInner) handler.call(_this, e); + else isInner = false; + }); + }); + } + }; + if (methods[method]) { + return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); + } else if (typeof method === 'function') { + return methods.init.apply(this, arguments); + } else { + $.error('Method "' + method + '" does not exist in skOuterClick plugin!'); + } + }; +})(jQuery); diff --git a/rep2/js/respopup_iphone.js b/rep2/js/respopup_iphone.js index 6f3fb6c03..79e0fdc11 100644 --- a/rep2/js/respopup_iphone.js +++ b/rep2/js/respopup_iphone.js @@ -2,6 +2,7 @@ * rep2expack - iPhone用レスポップアップ * * iphone.jsの後に読み込む + * jQuery 必須になりました by 2ch774 */ // {{{ globals @@ -27,7 +28,7 @@ var ipoputil = {}; * @param {Element} obj * @return {String} */ -ipoputil.getZ = function(obj) { +ipoputil.getZ = function() { return (10 + _IRESPOPG.serial).toString(); }; @@ -57,11 +58,12 @@ ipoputil.getActivator = function(obj) { * @param {String} key * @return void */ -ipoputil.getDeactivator = function(obj, key) { +ipoputil.getDeactivator = function($obj, key) { return (function(){ delete _IRESPOPG.hash[key]; - obj.parentNode.removeChild(obj); - delete obj; + //obj.parentNode.removeChild(obj); + $obj.remove(); + delete $obj; }); }; @@ -79,36 +81,36 @@ ipoputil.getDeactivator = function(obj, key) { * @todo use asynchronous request */ ipoputil.callback = function(req, url, popid, yOffset) { - var container = document.createElement('div'); - var closer = document.createElement('img'); + var $container = $("<div/>"); + var $closer = $("<img/>"); + + $container.attr("id",popid); + $container.addClass("respop"); + $container.html(req.responseText); - container.id = popid; - container.className = 'respop'; - container.innerHTML = req.responseText; /* var rx = req.responseXML; while (rx.hasChildNodes()) { container.appendChild(document.importNode(rx.removeChild(rx.firstChild), true)); } */ - container.style.top = yOffset.toString() + 'px'; - container.style.zIndex = ipoputil.getZ(); - //container.onclick = ipoputil.getActivator(container); + $container.css('top',yOffset.toString() + 'px'); + $container.css('z-index',ipoputil.getZ()); + $container.skOuterClick(ipoputil.getDeactivator($container, url)); - closer.className = 'close-button'; - closer.setAttribute('src', 'img/iphone/close.png'); - closer.onclick = ipoputil.getDeactivator(container, url); + $closer.addClass('close-button'); + $closer.attr('src', 'img/iphone/close.png'); + $closer.click(ipoputil.getDeactivator($container, url)); - container.appendChild(closer); - document.body.appendChild(container); + $container.append($closer); + $(document.body).append($container); - //iutil.modifyInternalLink(container); - iutil.modifyExternalLink(container); + iutil.modifyExternalLink($container[0]); - _IRESPOPG.hash[url] = container; + _IRESPOPG.hash[url] = $container[0]; var lastres = document.evaluate('./div[@class="res" and position() = last()]', - container, + $container[0], null, XPathResult.ANY_UNORDERED_NODE_TYPE, null @@ -131,7 +133,7 @@ ipoputil.callback = function(req, url, popid, yOffset) { var i; for (i = 0; i < _IRESPOPG.callbacks.length; i++) { - _IRESPOPG.callbacks[i](container); + _IRESPOPG.callbacks[i]($container[0]); } }; diff --git a/rep2/js/spm_iphone.js b/rep2/js/spm_iphone.js index d2de17fea..f4543f1a8 100644 --- a/rep2/js/spm_iphone.js +++ b/rep2/js/spm_iphone.js @@ -23,6 +23,9 @@ var SPM = { */ SPM.show = (function(thread, no, id, evt) { + // skOuterClickが発生しないようにする + evt.stopPropagation(); + var spm = document.getElementById('spm'); if (!spm) { return; @@ -45,8 +48,14 @@ SPM.show = (function(thread, no, id, evt) } } - spm.style.display = 'block'; + //spm.style.display = 'block'; spm.style.top = (iutil.getPageY(evt) + 10) + 'px'; + $(spm).show(); + $(spm).skOuterClick(function(event){ + if (!$(spm).is(':hidden')) { + SPM.hide(event); + } + }); //document.body.addEventListener('touchmove', this.hide, true); }); @@ -64,12 +73,8 @@ SPM.hide = (function(evt) { //document.body.removeEventListener('touchmove', this.hide, true); - var spm = document.getElementById('spm'); - if (!spm) { - return; - } + $('#spm').hide(); - spm.style.display = 'none'; }); // }}} diff --git a/rep2/read_new_k.php b/rep2/read_new_k.php index 35aed920e..d14a4cf71 100644 --- a/rep2/read_new_k.php +++ b/rep2/read_new_k.php @@ -130,6 +130,8 @@ // iPhone if ($_conf['iphone']) { $_conf['extra_headers_ht'] .= <<<EOS +<script type="text/javascript" src="js/jquery-{$_conf['jquery_version']}.min.js"></script> +<script type="text/javascript" src="js/jquery.skOuterClick.js"></script> <script type="text/javascript" src="js/respopup_iphone.js?{$_conf['p2_version_id']}"></script> EOS; // ImageCache2 @@ -150,7 +152,6 @@ if ($_conf['expack.aas.enabled'] || $_conf['expack.ic2.enabled']) { $_conf['extra_headers_ht'] .= <<<EOS <link rel="stylesheet" type="text/css" href="css/limelight.css?{$_conf['p2_version_id']}"> -<script type="text/javascript" src="js/jquery-{$_conf['jquery_version']}.min.js"></script> <script type="text/javascript" src="js/limelight.js?{$_conf['p2_version_id']}"></script> <script type="text/javascript"> // <![CDATA[ From 30282ec015ba749dfde9c2bbc4074fa3f49861d9 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 15 Apr 2015 00:00:52 +0900 Subject: [PATCH 139/339] =?UTF-8?q?=E9=81=A9=E7=94=A8=E3=80=80http://anago?= =?UTF-8?q?.2ch.net/test/read.cgi/software/1426940268/711=20=E3=82=B9?= =?UTF-8?q?=E3=83=9E=E3=83=9B=E5=90=91=E3=81=91ic2=E3=81=AE=E3=83=9D?= =?UTF-8?q?=E3=83=83=E3=83=97=E3=82=A2=E3=83=83=E3=83=97=E3=81=AB=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E3=81=95=E3=82=8C=E3=82=8BURL=E3=82=92=E3=83=AA?= =?UTF-8?q?=E3=83=B3=E3=82=AF=E3=81=AB=E5=A4=89=E6=9B=B4=20=E3=82=B9?= =?UTF-8?q?=E3=83=9E=E3=83=9B=E5=90=91=E3=81=91ic2=E3=81=A7=E7=94=BB?= =?UTF-8?q?=E5=83=8F=E8=A1=A8=E7=A4=BA=E3=82=92=E3=83=80=E3=83=96=E3=83=AB?= =?UTF-8?q?=E3=82=BF=E3=83=83=E3=83=97=E3=81=99=E3=82=8B=E3=81=A8=E9=96=89?= =?UTF-8?q?=E3=81=98=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/js/ic2_iphone.js | 6 +++++- rep2/js/limelight.js | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/rep2/js/ic2_iphone.js b/rep2/js/ic2_iphone.js index 9164ce1d6..cc9c15c17 100644 --- a/rep2/js/ic2_iphone.js +++ b/rep2/js/ic2_iphone.js @@ -80,7 +80,11 @@ document.addEventListener('DOMContentLoaded', function(event) { _previewContainer.appendChild(edit).appendChild(thumb); } - _messageContainer.appendChild(document.createTextNode(info.uri)); + var aTag = document.createElement('a'); + aTag.appendChild(document.createTextNode(info.uri)); + aTag.href = info.uri; + aTag.target = '_blank'; + _messageContainer.appendChild(aTag); _messageContainer.appendChild(document.createElement('br')); _messageContainer.appendChild(document.createTextNode( info.width + 'x' + info.height + ' (' + _number_format(info.size) + ' bytes)' diff --git a/rep2/js/limelight.js b/rep2/js/limelight.js index f47063fdc..3576042d2 100644 --- a/rep2/js/limelight.js +++ b/rep2/js/limelight.js @@ -1156,7 +1156,7 @@ Limelight.prototype.init = function(options) { if (flags.title) { this.initTitlebar(); } - this.initTitlebar = null; + this.initTitlebar = null; if (flags.indicator) { this.initIndicator(); @@ -2203,7 +2203,7 @@ Limelight.prototype.onTouchEnd = function(event) { } else { this.focus(); if (now - this.endTime < this.doubleTapDuration) { - toolbar.peekaboo(); + this.deactivate(); } if (!this.locked) { this.setLastClicked(null); From a14f9cb9bd674415f16ea54f84d6390e0f5fc80c Mon Sep 17 00:00:00 2001 From: dgg712 <admin@alice3.do-gugan.com> Date: Wed, 15 Apr 2015 15:06:01 +0900 Subject: [PATCH 140/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=95=E3=82=A9?= =?UTF-8?q?=E7=94=A8=E3=82=A2=E3=82=A4=E3=82=B3=E3=83=B3=E7=94=BB=E5=83=8F?= =?UTF-8?q?=E3=81=AE@2x,@3x=E7=89=88=E3=82=92=E4=BD=9C=E6=88=90=E3=81=97?= =?UTF-8?q?=E3=80=81img=E3=82=BF=E3=82=B0=E3=81=AEsrcset=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=A6=E9=AB=98=E8=A7=A3?= =?UTF-8?q?=E5=83=8F=E5=BA=A6=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=8C?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E3=81=99=E3=82=8B=E5=A0=B4=E5=90=88=E3=81=AF?= =?UTF-8?q?=E8=AA=AD=E3=81=BF=E8=BE=BC=E3=82=80=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E3=81=97=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/toolbar_i.inc.php | 28 +- rep2/img/glyphish/icons2/01-refresh@2x.png | Bin 0 -> 899 bytes rep2/img/glyphish/icons2/01-refresh@3x.png | Bin 0 -> 2761 bytes .../icons2/06-magnifying-glass@2x.png | Bin 0 -> 947 bytes .../icons2/06-magnifying-glass@3x.png | Bin 0 -> 2964 bytes rep2/img/glyphish/icons2/08-chat@2x.png | Bin 0 -> 535 bytes rep2/img/glyphish/icons2/08-chat@3x.png | Bin 0 -> 1382 bytes .../glyphish/icons2/104-index-cards@2x.png | Bin 0 -> 547 bytes .../glyphish/icons2/104-index-cards@3x.png | Bin 0 -> 1812 bytes rep2/img/glyphish/icons2/108-badge.ai | 1582 +++++++++++++++++ rep2/img/glyphish/icons2/108-badge@2x.png | Bin 0 -> 791 bytes rep2/img/glyphish/icons2/108-badge@3x.png | Bin 0 -> 2427 bytes rep2/img/glyphish/icons2/12-eye@2x.png | Bin 0 -> 751 bytes rep2/img/glyphish/icons2/12-eye@3x.png | Bin 0 -> 2502 bytes rep2/img/glyphish/icons2/128-bone@2x.png | Bin 0 -> 687 bytes rep2/img/glyphish/icons2/128-bone@3x.png | Bin 0 -> 1838 bytes rep2/img/glyphish/icons2/28-star@2x.png | Bin 0 -> 792 bytes rep2/img/glyphish/icons2/28-star@3x.png | Bin 0 -> 2214 bytes rep2/img/glyphish/icons2/33-cabinet@2x.png | Bin 0 -> 456 bytes rep2/img/glyphish/icons2/33-cabinet@3x.png | Bin 0 -> 1420 bytes rep2/img/glyphish/icons2/53-house@2x.png | Bin 0 -> 549 bytes rep2/img/glyphish/icons2/53-house@3x.png | Bin 0 -> 2086 bytes rep2/img/glyphish/icons2/63-runner@2x.png | Bin 0 -> 905 bytes rep2/img/glyphish/icons2/63-runner@3x.png | Bin 0 -> 2242 bytes rep2/img/glyphish/icons2/64-zap@2x.png | Bin 0 -> 671 bytes rep2/img/glyphish/icons2/64-zap@3x.png | Bin 0 -> 1851 bytes rep2/img/gp0-more@2x.png | Bin 0 -> 428 bytes rep2/img/gp0-more@3x.png | Bin 0 -> 1306 bytes rep2/img/gp1-up@2x.png | Bin 0 -> 516 bytes rep2/img/gp1-up@3x.png | Bin 0 -> 950 bytes rep2/img/gp2-down@2x.png | Bin 0 -> 513 bytes rep2/img/gp2-down@3x.png | Bin 0 -> 1231 bytes rep2/img/gp3-prev@2x.png | Bin 0 -> 502 bytes rep2/img/gp3-prev@3x.png | Bin 0 -> 1206 bytes rep2/img/gp4-next@2x.png | Bin 0 -> 473 bytes rep2/img/gp4-next@3x.png | Bin 0 -> 1230 bytes rep2/img/gp5-info@2x.png | Bin 0 -> 837 bytes rep2/img/gp5-info@3x.png | Bin 0 -> 2449 bytes 38 files changed, 1608 insertions(+), 2 deletions(-) create mode 100644 rep2/img/glyphish/icons2/01-refresh@2x.png create mode 100644 rep2/img/glyphish/icons2/01-refresh@3x.png create mode 100644 rep2/img/glyphish/icons2/06-magnifying-glass@2x.png create mode 100644 rep2/img/glyphish/icons2/06-magnifying-glass@3x.png create mode 100644 rep2/img/glyphish/icons2/08-chat@2x.png create mode 100644 rep2/img/glyphish/icons2/08-chat@3x.png create mode 100644 rep2/img/glyphish/icons2/104-index-cards@2x.png create mode 100644 rep2/img/glyphish/icons2/104-index-cards@3x.png create mode 100644 rep2/img/glyphish/icons2/108-badge.ai create mode 100644 rep2/img/glyphish/icons2/108-badge@2x.png create mode 100644 rep2/img/glyphish/icons2/108-badge@3x.png create mode 100644 rep2/img/glyphish/icons2/12-eye@2x.png create mode 100644 rep2/img/glyphish/icons2/12-eye@3x.png create mode 100644 rep2/img/glyphish/icons2/128-bone@2x.png create mode 100644 rep2/img/glyphish/icons2/128-bone@3x.png create mode 100644 rep2/img/glyphish/icons2/28-star@2x.png create mode 100644 rep2/img/glyphish/icons2/28-star@3x.png create mode 100644 rep2/img/glyphish/icons2/33-cabinet@2x.png create mode 100644 rep2/img/glyphish/icons2/33-cabinet@3x.png create mode 100644 rep2/img/glyphish/icons2/53-house@2x.png create mode 100644 rep2/img/glyphish/icons2/53-house@3x.png create mode 100644 rep2/img/glyphish/icons2/63-runner@2x.png create mode 100644 rep2/img/glyphish/icons2/63-runner@3x.png create mode 100644 rep2/img/glyphish/icons2/64-zap@2x.png create mode 100644 rep2/img/glyphish/icons2/64-zap@3x.png create mode 100644 rep2/img/gp0-more@2x.png create mode 100644 rep2/img/gp0-more@3x.png create mode 100644 rep2/img/gp1-up@2x.png create mode 100644 rep2/img/gp1-up@3x.png create mode 100644 rep2/img/gp2-down@2x.png create mode 100644 rep2/img/gp2-down@3x.png create mode 100644 rep2/img/gp3-prev@2x.png create mode 100644 rep2/img/gp3-prev@3x.png create mode 100644 rep2/img/gp4-next@2x.png create mode 100644 rep2/img/gp4-next@3x.png create mode 100644 rep2/img/gp5-info@2x.png create mode 100644 rep2/img/gp5-info@3x.png diff --git a/lib/toolbar_i.inc.php b/lib/toolbar_i.inc.php index 4454a0e16..a1fae5177 100644 --- a/lib/toolbar_i.inc.php +++ b/lib/toolbar_i.inc.php @@ -31,6 +31,28 @@ function _toolbar_i_icon($icon) return $icon; } +/** + * imgタグに解像度毎の代替パスを指定するsrcset属性を生成 + * + * @param string $icon + * @return string + */ +function _toolbar_i_srcset($icon) +{ + + $srcset = "{$icon} 1x"; + $ratios = array(2,3); //指定するpixel ratioを列挙 + foreach($ratios as $ratio) { + //hoge.pngに対し、hoge@?x.pngが存在する時だけ(?は倍数) + if (file_exists(str_replace(".png", "@{$ratio}x.png", $icon))==TRUE) { + $srcset .= ", ".str_replace(".png", "@{$ratio}x.png", $icon)." {$ratio}x"; + } + } + return $srcset; +} + + + /** * ツールバーボタン (リンク) * @@ -55,9 +77,10 @@ function _toolbar_i_button($icon, $label, $uri, $attrs = '') } $icon = _toolbar_i_icon($icon); + $srcset = _toolbar_i_srcset($icon); return <<<EOS -<span class="available"><a href="{$uri}"{$attrs}><img src="{$icon}" width="48" height="32" alt="">{$label}</a></span> +<span class="available"><a href="{$uri}"{$attrs}><img src="{$icon}" srcset="{$srcset}" width="48" height="32" alt="">{$label}</a></span> EOS; } @@ -154,9 +177,10 @@ function toolbar_i_disabled_button($icon, $label) } $icon = _toolbar_i_icon($icon); + $srcset = _toolbar_i_srcset($icon); return <<<EOS -<span class="unavailable"><img src="{$icon}" width="48" height="32" alt="">{$label}</span> +<span class="unavailable"><img src="{$icon}" srcset="{$srcset}" width="48" height="32" alt="">{$label}</span> EOS; } diff --git a/rep2/img/glyphish/icons2/01-refresh@2x.png b/rep2/img/glyphish/icons2/01-refresh@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..48a508741addf525b26b8866af51e4df698bc7b0 GIT binary patch literal 899 zcmV-}1AP36P)<h;3K|Lk000e1NJLTq003YB002M;1^@s6<uq~*0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#B}qg<RCwC#T<wjUKoDIb|35mgI|v=b z9mE}k5|Ro+3Ah7XL7WN>ci^iarUPFE&g|WsWS!WB#V|7q^Q4s}+wvXn&DRdIB)8km zDERP2DNq4a0EG&m0w`1f6+oc^1mXIQoeIE*Cs=<#gd?m}1>nPXSeF>RVNN;V!yBrY zydjCD7X+kk;Ki=(-P^w%UvFULX`0q5z+<FavU4PTJ>VzyunG|3sse-&Z%Ho(k{*>e zh!OykXgLz`_jtA8OQI*Ngb;6&W`)(v*f_!3Nex3Q0pw>${?`et-p2n@auQw%Aiu^E zvTr;;<MLHOCye_St%4pWzd;YFJ`)PRaf{LF**ySbei!+nWJY845<*ZH`5}ojI;&?D z0Ia|0NVo?eGoQ27v*iG6C;an#<yWkhJQUQ;xT3@I7ezj)2Xt8f3y`0g1%lE8eh&Oh z1sDmrC-l@Rz_j6K>nS@+vtUqpz}6G{&nf_)07tWMPzjKEcEpPYNg3MGG<yStpF}-C z!HN}u^}FJK!+r7Cm2C@;SE}NGq8aDvXiAvfvE)Cuynpf(4snGbk0m`B1#b=zFu|5B zMSv!7f50t3JvRZ)LIrUB{ma}0a9I@FG&2qbte4^et_xZ-j+DDv;0@(1P7(pI5^4g8 zn9}+;@bbg)F=>B_vI=swoxkBQt`YFRbbS`J0F`+kA!)s6v`Px=w_>|yQ2$a-Sda;T zGd`tfQ#ScIFHF2X3oqur5i32pz|IQQQ;E=H6!O4vbBI&`^a5YfokRp|2>Qr>HB5s6 z<gEx0!B!dj4iQE>@raXn&&J<-Vmm*;IURjA-Dd)9SF#u~H4$*kiFF!}Q-F^N={^TD zUa*Qf`l=KRH9K5=jyZ+Qq0UQy0V3ST>(9wDHQ^_0_CP-SKp6WWJrtqz>`ceTTfznM zD<c46PDx_Yt<1DHYHTRWCCws<xhap;k=+d+CbD{)Y%^(tU{ViiZ?J;dJ?Ie)hPO)U zF;(%;ionohSJpGpo-nZ=V;Fl(Vta5awiMcS%9j|ADkb{lTus6%fI<aO0Te30BJp2< Z0RSbiShrT&*TVn+002ovPDHLkV1ln)hQt5> literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/01-refresh@3x.png b/rep2/img/glyphish/icons2/01-refresh@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..610888280094f57228e5883d3332a46ab3a0320a GIT binary patch literal 2761 zcmV;)3O4nLP)<h;3K|Lk000e1NJLTq0058x003YJ1^@s6^3?mG0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU+Ye_^wRCwC#oqvoRWf{lk_Q&jx7AU2* zN9oZBQo(Div{)#qQpM8L1fszRBxqtQ7W#+8h|y9lX^CjesRU7=C@Qr4QJR=o1^Xjd zn<5p9P@t$+TIr9YSNRdHce{JHKe~RNb`F<jZ|B{;Yj57!=SiOIyLU4?@4WA4zR&Z{ z%sbOkE|(oOwMH$XO`xU#sVP8e3Xqxtq^70-sVP8e3Xqxtq^70-sVP8e!L^t+L3JA# z7?{xC-@k-nXDXF?!gXD36jdN|E0@cKW5<rQ^SL^k&35GT`GmHL0#p}6cndxbUz*G1 zp6Ti7nU6AQ%P2r~K_r$!iDuzz0jUFs;@UI{P$TvMQ6qAr?WoZ;szwUXkk-=DlHsFR z<zJ#kv++kgHEQbYx<&6ud~ehx-U>J=zD^*4o<ZAumGb2^R?D*dE__8Ik=TMOKurY8 z1$6vXe4UBU0GRQ3lD|c~(;I1gEbdDMZFrdV)-c>(4nze7D1=7d;xH8dARWC3P(FiC zq<j|t8iOZCU=yN7FW{?yXj8MOQRo5k)Mg?3c`MLdLI<DgDa)xDww23WY-25I^gSTT zD?k>5gW}u>G)r*_SLdC^&5IiSH4=&ZBp#1Hl}si>3s5Yi;LHM=W%yh=auR;JtC5y4 zSu7Tx1)`_ItU$4_!Nbt{+o<Ydpt)!iz!?l<@1i`*P@X>mkfQ+EktAP;-$QYMmmH4< zI1b9Q$#vaT>2&%z;0gVREEWQAoI;^+JstNQx!lk)O0vWDvw*V#)maZX`@^n0p#Vri z765$-aPEeisl#DM)WaK4yoqP{t!{6`Hq}6NHZtP+A*!<jaQdAlvY5^AknadQ_t4Q( zh5^k>_%?>!&!Qk*0uNpw5s$Eq6#`}r)yYV>0-h(L(dd7gMRlwPNWzw<JPpCadT-MC zzXF=AB)f<B(_sL3rxE~0PzevFA#)wT`4Ot~OtYzu^#GMhrJEXohjk9p@ecsbp8@Ap zpgCGYH3XnY71ilOb-wSZ&faEJ9jgH%tjt9nme&K1rx+c8vo02k?ZWf*c6^2Ebf7xh zSYPkuuni#KNt5?{lg|8zX~K+Jy$CoRK(hhWIa)`eJ$Of=fYS>&KR|ibsp?n?keBz! zNx}uDLv`SJl412-0JO7#5n7yWrGRG#@T}xFo(7z}B4a5)gsu7B8RnEBJP!enB)R(< z8Qud<3B~#`@VtY1?N-&PZdP1OMR{aM{X6P<?O<5(f#+f1Sq40BH+pUeV56*CB4jBg zwkr^wc^iuGDU;CUg{_stf#-O`#9}4I!`}k0%P7wzp!hN{oM8aZbHKA4c)CXGLaG83 zFe?-aH^_}(2E*)b5?#5R@S?(_01c{70#&)rM16ql5t80NDLe|$dzR1V=K;pW2BB*g zq3dxH-kf%+Cei<=I}-Uk9}|5-mjgVj30<A4KB_>K;cGmjubDs*_X%CQWKI^#6|_4Q zpvv%d8E~|ks1Hi@x^|@k^gcsTuH@q!AAsIMeV*4#3<^*+fG%}T%nq#u(02R{?M4OY z<nT3?{AWt7q}U5zn;Cg^Yd0!DCnwNT$$!T9s85dYwYwQ+J}5x-hp#q1{I0rp0nt(I zLItRrjmQ0-yCb<zR=ZFEs%C9|3A6`LpLU@FRLx{Qmf!PHWC~8NcH!t+P%mZ3qvibW zbd&tY>hnJg6rzkcr;+o0jIY(E2FVS7MMj$Y;_>(^3Q!$+bTb^irBW&0*VlI)Bgwm+ z>T}Q{GTL-qceMgE@(Lu0c5;X#*A`0w&-u7q?;AJ7>54N^sIxT(s?QGKez#^wqJ5_2 zA|&;n?6b_f_<jYbKI=A67I|iK%5s2?KM~ev85wE5rU2Dvy-xLKG*?=Ckfq%y(K}K9 zc7t%9QGn_&;{HD!pL0Ak{&+?(t&C)B9f8R;zgB~Tpx0{;1<2GGaU3DBJn93GJl>_f zSS(ukq<E<}^`Gu{7p2U>r#=3w0M%j1WHKL%#a=J_%zC8p=h47ZYy^mUPxkJ4s-?tb z+ToD2hXPc87~AQbI9XT=pidSGg=w~hF{v;0{xJ2Q<FjZF?XWe_2SR`W+Te}GY60YC zGMP`8N~JM20YrV1)O()6!$6PF4qFtU#`2&}Wd4BPa?xn?i{um2ZBZeqC-rTo-k&oF zb4O^0e=9(Z<v}t(eH%w$#z%#wax`DVQEkOJA*m<zy_R}k?4!Ur_J2F=P*i{#KU&xE zamYZ0ZsDlDBIr*V@ziGy^<8AJ_yLyxb>IgBL9QG}piCB&i-;v36>7_7v$yp3_fH6N zC<C5xsL$8DJ1%Pq70bNJ{=cRG4Z~8YltA>5JUGEXg>C|(C3I3CLzz77jPSLHdfs5L z>|yr%7qb5f&@hb#-^|hYH;DiSN#{4{q=i8XWm2D9F85gg|E|d+j#y>~`@O}nzyc3Y zg$f<?Tb71DhfcbK&bl%v5K)g7sSkb!P@HYBd>8w>+6MKp0w7O?HUY=)DHaTtokM5+ z6rVHN5P8aTygt<H3WHS&?B^dubsbC03V`HjOe7NbQ~ZY^aI>Y;NUE=vs{x|~PfWJ& z!86-%wdWbO-)oEdSObs;QD;0J|2ZA=wjo596VBGqi8qp1pLM#_NVX%}W4n^nuQi27 z=J~UK_XE%#$0D=p*|j9ek0J5DaSU&!r}J9r$j5qmdhX<N8l4n9#qdOBJ8W+`pO3Qr zNrtOR=vu@6t#vFj>)x44$4Dowp?EzWH(ig>*`9PdeHTahb~^UpNIr~8+K}IG%jff- zAY`rN_dis}>T)n_KzSD9Jqpn2foL-RTZ&gZb<E)K-gmJTkUCt~{TF|d`;Ph=fyw(V zdHeGuz_~<5fBe=}4gA*AfO9i`*s;*8eQPrS&BgDdcxfY@kMGAH0j7<>BsXly9gs3r zT3*Cbs06`-MZ%xV0+AWBV}WKO(8y~S77gQNcP|6ZxA2XQrDpYOzX=x$1_lOJQJm>C zI7P|Z|GoI%@s|MQ4HEYKjQZXhT!w9oWm_`+<|4jM$3Ko=IE*kTmu6mI8+Wp;&5p%p z{d?o-*j76DVT$t||LM^6K=uBH8o8WFa-OZgvlMvtI+mODZxEpqy6KFYDL(Fu&|G<e z<zycrllrZrzF!FgJfTpa3MG<R4$CMmVV~Lpc5oa6Lb(+4puC({?sW=_g$AIC<ocud zy%aCQ&j>)3M0Iuo&F%QhPRJ~D0C^Be;(I&A+t|PJWYjbY)sWKzax>fmsLp+1Qk~EP zQ~^=~kiJfFG5dM0r%0#r$sf{~y?`U<bbbjqKLealzgsob09E8ia^B_(6mMmJ<t(vW ztxS$ko+S4v$vplX;K+5X2VK`)Pm-K*n!uU@pp!z|G>QV#LR_wo$;{Tc=K@r82$hnC zDtW-jjqY-?QPiaqe-dAh;_L})s8WEc1Lfkg0AU7SXW=qW>jM1zDvQe$qkYba$F1z9 z-ChBfzXW~OgaV`%Xwz2_t0_Qg3Xqxtq^1C=sVP8e3Xqxtq}CkvKLG{+m&qwANrLA; P00000NkvXXu0mjfTjx9= literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/06-magnifying-glass@2x.png b/rep2/img/glyphish/icons2/06-magnifying-glass@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2cabce9102652cf665d0302c615e5529c643d233 GIT binary patch literal 947 zcmV;k15EshP)<h;3K|Lk000e1NJLTq003YB002M;1^@s6<uq~*0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#RY^oaRCwC#oXc_BFc3g#rvS49DYx9D z4kT4z-Es`wfjTf<L6{269Fns-2vtBP^wBq|11b$DyEDtNk{Nu+5Wteyox$Khi6Hl3 z7r<h{o6F^rh=h|H0U!VbfQSGP03rfF0C19~Y35KZsr)NPD0P~qwE!4a>1(JmC|J)d z{&I#=LD>V0QULT<{1&RhQt2u=K`8-5E&#f@8SJ^M0dI>SG5}GH0l;lQ<)f>q2UdPU zR`dhzUx)>$mA`}Pvxla>LfL^eG-3g7%FjJ1ALSFdII(~$xAWYg_o5%Kpa&nX?vc_g zshu(1+1v~6kwpyv6t^UWniTegGa_5JK~M{e`#x}-s`><g1MWielNXx3)IIK<lB>Bl ztQnTq))dVcK)uwY{B_@zEm{kdEx9d~poQd7S^xkzY8F|o@|%I$DrxXl$$L&#aO<h} z&opi!8+e+yBdEITQMsV4=2|gyK#gGPl$^x|;9k@Fovc<V3~^A61r+p~J^;gumX24b zI=JgtEMTd*ws+Yuz}@$Ju1Nt%4Q|4<9J)T&)BvbV{p9KWRMX8>EC9MHW~}Xu4uFU! z0HIw#Xcx#9K)W63TISqclWPEVsJS=+p7nUHXaKkl31mH=%d0q#h8iNF8yD*V+8@An zRhu+yBBDNKLAn)b?x@Y3M)`-R!qJI7CbObV`XPHijxCRxpOl=Yp}sa`@TGN|B!leN zLOUO!`Ud5lYWfN7%sBz@wGcD)@@Lw(`5)zDfbF|R`7T`^Zvf<TpDZBkX#nl2d{pc& z!~6V<IxB({RavZp&*Y~I-C#+eG8%Agl6rq*+uTyxeFH$HA%unHUtVa=ehs2c%v$t# z1cbZh1i^c5XomzXSHcQHsN~$PmM~ceLBi3r7mRM?i=!r94cF27Dze7-0JIRG-~hTw zh6@j$X-)9~>oGuJb4HBT0a?;-ui!*0?!PiEEVHqLx+8X{Bq@xH$z1IT$%R7Ub@G<J zUK_x&g%HI#Va^buIjGGQLR2T^IYNl;Qw7{0MER|V4iKE5sEIN!h@zr4>x6u=3$c+v zm<xcg5E=mx7D6Ea{6WB&RGZF@^~OgEy?ik%um}JFAOJ)Q0zd$W2mk>f5<vb4FaZ6h Vs@S)73)TPt002ovPDHLkV1nBasD}Um literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/06-magnifying-glass@3x.png b/rep2/img/glyphish/icons2/06-magnifying-glass@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ed0dfb336f391de2a62914d8a4d9d149b6108df3 GIT binary patch literal 2964 zcmZ8jXE+-Q7fui(f?TUrs%ecHMeWgCf*{n2JzATfN~t{)il`N<YDZc{U8&J>ZEbB8 zRa&c|HR{?kHvQax-*bPQ^PcBC&pGe=>zp^q)L4%Vd<6^u0NC_VNV5whT!a%d<3-*X zJ1M;YzCazDKyyEjz!2vEcYvmwpNl(8|DiL+-OSzDEzG~)9S#7nD(NFNEkdW(iXsRC zmOP0O9vDo>e$JC_cnTqvMOfM+2R``pax7Fx<SF`A5|J^<=}?<lJk#uMm`(pLj!b6V zDy{2wx=Ai(q(kBuAiw51v>F-5lKBLV1#nJK^P=`X8J`-zYAiH}-z%D2&)b-J{My)P z*w<usI;#DgI!Zm5Nh^eheK9ka{6-3A9^-~7f>1_4Gjr_Ne`^ydC5zy<EiDm$Kb*dn zhP>f=cq|=xV+MQhljqR>Q1kSWQbCkz1`2L(Y5BDbUr4>-9L4)>bkuxgdO8Bs`DuRj z-u`0+hs8n#Qfm&STmXxwH|yC}j~-9%__VWmMD@T<ai#a>JikrPpuqdt5Vm!9;!V|- z?)kkqYYwM+l9qTwSoW~g*RNmsO<yT<7ZHF+t{~a1@7;5d$jilB#LK{ChLQr{vLHgO z6aW%{-E3?s=pL?-c~KbIv+HtIX9|FN02HqRfH(wLACcYtK_`!X0tzZ!s_AF-qu+Al z&np2SX2JX_D_*}Y{=s`ix4Z)xek(!GxUI2~>?V-V=*~H<)^9SjIhFHE_zk_(4M77a z2n-|F^~|l>7N(!b8t9)o?2zvGgZeN7@^p(~_-+%30{U50@cs#NanB;-aF`fgL>;l( zHBLl^u!BUNf*1t*!>npU-DS5_It4to{ne+LH-NFz(j-yUl$@5*=Ll*7n!^1IGrx<i ztYs#yY?qBSCDz$}BqQ6cVNAuFHGhAX*qTXOvsWshT9}*f&WFOI@fvOYvs0215^@;2 zxS;N;!`Vmr6!C+z?2cPkQYm8G!UL+nmyM?TqM(XGeI2<lBefz2J;3b!zRly~<7myT zc1K&=qZ^$9GOxVmCXf@xTreZOqW11!JMj0e`U>h0b}s}}0bkh_jBV`qGBb=j2TObb z!#hYvp+V4qeDeY1eQ5@gPQ}O${z!MRX-ap+UudQrkkh`LDM{|O+IU}{w6X>$^dqTF zo3cjS{-IhO_Mqlr1Te_HdtZ;At_X?SAUbG3gb?lP91M_AmBU@|lO-j}UUjXFkLgd< zAR-B!ydL~n_$)=vm)P2-i}4gT)8lHzW;timS!mJv-Q@179L__2deIk8v#h1PXIz3H zUW%`#XTOULaJ+5thNE_4iJQpDw`HgkrS3vfXZR%sJd*}SO+5(RfvJf@OLY&>Ceu!5 zb{7A<zWtgY10*&5oyTEK%Q#I%kQs_Ka>2!LF}VdzesnGq#L|<u#<3a@=5ud31&Q<c z1I9(0L^<r-UY%O3kn9h?vqdf!yu*flfQXmYjOT{Qq{hK>>%UsApiAc8y?e(&qFZ;j zFi7_B(Kv_F`Y%_Q%HPzhr(1Yvx?r38;1V0<c&K7nn#Cn=wE#5NL6_J+^nulsB*_ii z%ztA*`F!9{aP@8CSlLy<t?p^JE&3`OO>ROqD!<nHNr4F=L*opT1!u+~YktjXYhPNw z`SpThpK^!ZdpodY9r2Ly2i!0}vQPf4IC3R}cU1~?$DCR@8gqD<s41wB$>mO>TSzsk z4-k@|OhsnAJx@L@AH)FKo^Hz8yvyfW6ae+{-x&{R3PTap=C%*f9SV+NVW#=;f1Ya! z3cql<DUO)2X<LjwP&FcaiM~S+-lH2?9UC&@E4y}px){w8=&SDinQY~&lDhc`SKced zRu@2pbHh0PqBvdU`<%PCy`5sC-FM1J=od=bWz&>QbiZni9dKiUEZlEyIHsu^d;s{W z{*t{|6)`<<AyX+UgOf!=&@jx&yD8l|>(_zezbszn;rC;OKl<q&(2lB-{YA4fj_^Hv zfs$w}T%qa1N&pabY@m#(pY$#PDhxEN^U`D8MBi$I3Cg+e$pBU8(0jd;6@=~!uF6rv zxTx$}uakcjzJBfPsG}3lf~fcG5j`p6(~d&&Xdv1skL?@l>UP-nN3F2%no#%*2oXV5 z!}Oz===RaycDvUEu<(RmtFFF7xsdG)bwk9<+-*T6*Yxe5YC!@<J&Fhg{hkLoe1gjf zawW%~WG5P3$3hBtZtMynVgjU>sQI=23a*YKu#bb^BlUk5>yV!Mu9DPG(349%Fuz^m zxJp4;M8zt-`8RvymbwFZ<Xxxa$Dn7X>31Q<DZ)nMj$6i{zG*nB*yqh6wq-{0=U?gc zpTCgF<jS%HR6fN*f@T{~(k-g}v|`pbdY50)?bo2cb79#X)vA(uNU>z?Od!mT4S6XC ze1oaD3SGjJ9YcO^Vy58O;oiY6i74~xLB_W;L3O#pxw-~%o>!rY5k(e*`{GLmKWw#| zve;tk?R(zD`@f2qH70jX9t#7*$K)ckV!$^ty>XtetfBthJkBR2uO_|ATDKD}f%J_N zqyT|k;L@Y;Xrh~(YKHvT_`>B&JVa=VY0U}qga^!!O?TY7$zsX7DycaV80xF&(_n0w z801c>vacLob!O-rr-I#Dd2m@QkZ*M8)KX3(p+0`o7nMoKIW*;b-KSTYQ5Y>p^y<Ql zB4;|4)GhmhD;fcBuW^XLFD|Pr-`yE1wJj|?+KAi?KB|_tpELn@@q@SEvyPc9otQWT z5op(B31@*8_~-fT9%~I!sy+(B+N&EHf~)oltgr+0Bh0XHY_l|;Tb7NfWAzz-_M!a6 z<C0N1a1qwre6)k`Z@M1F-r3ip>~?xw#;q7}+vAM*oxZdFGQOCZABoGmc?EALAd-KF zKvXk7Hz*MZ+ll#p{JZ62&zuoS!NHJ6=ub8Qd@+OziOa7P#Cr^!J{dczGaF`7KtYo@ zqd@p#Fe?%lj*+mo-tj1WLq9B(No3scNkxi2(m8OF$jP5?6wJ}q!tG>N07aS;n;n-D zoj(LXSkXwmB;HbF3~MtdXg|uC@^w;b?6+vFa+%?e3BcBq)^37i<56Uq*pEi0qxD>@ zr#<01c#oeIL<&@+YCW#W9^4#c`7y!yp<ek)s=AfAdHof@%*xu@DPxe06$8?dy^b?} zuBeh7Rl@XAhO?`m!M{~c$6eLogk_)ohwZiW-VmC`tQO8?L1|F@_deZqwXS_KJ*hm7 z8C@|mwT4x=Mj(q2<hUk|=!Y^2=Xb%;DF6*76^#L=o3jG=4Kb}G2GT0dGvYH0ycjVL z5}s~wPx*Eew`@iy@xqq>YA!Bjb1c{H*yX^40P~||P#((J?Q;m+%)8f0t=5oV?9S|W zlQr1mT$ExUHNZ5v4X_kIR_h0^=A42~1HmT)0%Msni+TpW(gR&=az<4Dw80MGtLo?M zTkJ?ltf$u>su_qqLsJ;|PsE}e4&N27+8dI$doJsWH*Jd#3JStu#a@^0_bikJ(`d9R z+>!$^bowwQ4LOq>@TZ})qCB%QKM(N>;;rsXwhaI|kHc_5hr|wQL_ig%&@x=bI}|=z zUs{nm3>8O+#NrD*EdPKi0!M_R6Hq{jjBXcM94Z@?a4U!#IMN;c<f12qR2s7F;N$_1 z@CJ~?!2~6Yj;7n9M@`!`o~M!sFj^g{t6fyqf=_{H#;aEVDrwqdcFaht4MmnqVhHau zD2;B!plQ-GZzxL2HZYg&WpFcRwQf8EDf_PczK6mUYBiv;h#hUBtsMv9wb?ZWfBfwh z%edSb{Mp+2*%kHQ3K+!Ox)(2mlE2)l4Uj3$I7D6IYC1Z6d>)-UyHag3ALSwEjFHPL z)G`m^a_s$)h|e%&+vQ$y6-RiN$_?TE>plP9llra4&_MtyC%@VxTmKZlu-O289b+U} H%PIDMF~M~5 literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/08-chat@2x.png b/rep2/img/glyphish/icons2/08-chat@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3f8ea8ad955d7ad3af6afa9bf3a533c30ef0a617 GIT binary patch literal 535 zcmV+y0_gpTP)<h;3K|Lk000e1NJLTq003YB002M;1^@s6<uq~*0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzxk*GpRCwC#+tE>jKoG`pumP`wU<Fb_ zIxrm=JFtY5Knawf6-YY33XC0K1-Lif1CzJ-uy?!n-<cbpGLY{F3t=|xx~>hCuUY^A z0DuAj015yAC;$MUDg#)SrI*cKR?yzHtSN*rR|z1&pJa2Cwaa`Ge#;sK;#37dI^#!K zkA-!E&v-&;UlFPRDf~&+eW5M+C$>XP1T_E&Klb=b!QpQaIzd=8c6O)u#Rdc6H|ZD$ zS66_X{he&Sj6ESf$W?Ihas|8^d_-3{W-Wl;Ab`p-YqcPgKewd?wVrOm6aWBF002M% z000F502BZK06+u)0H9E3gV~%t0n7#gW={a4K>(Fw)|`rXlg*Qn@ZUoS2X6q3rQ`%i z2n=TB1lS<NcC;%j{5T_ea6OuM)sEuW$FV77I9Jx7)poK2Tw&~+zwz{Kb+VrSbMw6M z@iC64PdUGTk$=!gC?7X|>_x&f_qgljRfNg#y#SaE-vfZ@@T~)w58pC?i}0-ixC!4P zfUEGW0k{j_5`fF_tpK<U-vWT^@MD$wE-1dT?!AX!EI>^K0001x0ssI|002M%P+$ED ZFaVD{&h&tm%?SVi002ovPDHLkV1g@y*0TTr literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/08-chat@3x.png b/rep2/img/glyphish/icons2/08-chat@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..68be0d973ef1da90910d9330939af6ea51a5ed17 GIT binary patch literal 1382 zcmV-s1)2JZP)<h;3K|Lk000e1NJLTq0058x003YJ1^@s6^3?mG0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU%2uVaiRCwC#olA%uRTxI=(a(7}5(&6S zoG2~?<3?1BB7*K*h(d_26^%|zz=a?xg2cx{S8h}!x)s5dN+6m^m_;_CNJJtUB_>MH zpg0qq?&|8U^7}J2BpqB-6+KdqbKuf7vzWQ}>r?-|Rb6w(jpNt>$csk=fIxsifIxsi z00;yK1PBBO1b{$*K!8AiKmZ5?6Q)t6!Swt6O+gS`?Yi!$sC|s%*l)F3zjeFaKdO+q zTjuA1dcEGYgTdfF33Hde+^(_As1^RCP=AMNf9vpD^>;}^9h6W%A<+LP&dp&MzM#I} zqIQM8HC@tbI#l~dGOeh6*=#oVOQf$5Xye3jB+hf{^P^D|%`0@jD$}pV6nUO^N@IFo zBE2k;5NN{kY}NYaHTCy?g*;o;MXAPjUgP_?-EKcCiOwL<WaQZ*dEV9Gy=u)GT-=0e zi<0QEqDxeGfo$56JRj(Ar<(872fLE|ND@6%<mt>Sfjlqi@WGnN<0RvKK;z$UIUrD; zQ*bo8O%?KC9k!f$($e^MSq=!4qxuYo!zZ+$yw0gHHh$%>P}C|^Sb=ob-Keu~hf}e; z<vD05huf9MO$e0j%-f}xc?XR7Bo72iJAH*=c&9?^;?9MWsbhH*aT+V6K$`P6scdgX zor_o=mJ0%<JL9(MrGqwOw3A#AC<WK3P2tQKmd7>(N{3Y+A7{p}Jh}*!a>`E{jAs%d z5L5~T0t5mC0t5mC0ze=@AV45MAOHjc1OfyC1Oh0LK=$m5%iA-C>lE-AsiF$B;;j9B zI9$Z?SVo|9*oFc<oEgLN_!)sx5XZ3v)yJ7J0_AcVfl|<Jx6gZ?cNS+Zd83qv<$^#d zXti2SqtQ65Gj0WS);688JS-OkN=Xz&AL`|I^tr&fBo742P=!vbY#-C%pzc>+mV@#* zg+STXL5}bHZ>W5qsk1#A|1Zknb;|>RGSX}|zj0mnErr;xsXT#=UpX8vY99-~M`92J zwp+)W>gPh0w)IUR&&cHIcDs9vT73#%f!3!oh4`YvJP?<8Tm5YE#I|3wjl0P5l%fJ% zQi<kNiJn(~A5pkhRal-sHNN*G&nuGWucG(2R6ErV1_Nhxb@lN?qFbG6Jxvg4Twf%W z=bfTgo>B_5z9t$Dhu5pwzdN`?-?B|Ow<!2BRvUZyRqaQ+RBtpI2h>iMMV?X$beTxD zi`hMDJ9NBFLd`jAJK3)fDw0@s`}PL4D<}Bt&nma?oqUg1nCW(JXIZk?XMT3CYf;DN z$|O$d1^O?c!Z4gm_ElWp24y5RORTqbeD{Q^#tGl|Use0W$+v&Cr=QW&rTKChg}I!{ zY@us!hMGMuGxp4k7T!T$Ok#>Nc~m(Tv_?590UW5oBdvPV+mje)BF~<wsVU^ClRy)a z@Vi8wBglh5Sud@>wrLA_D!vBVfT|N|p?pwlr)N5y&I#l}piJ_p>KxKy`Duys1Boz& zWs*l#=a8nXeaM4AdF1(QdU_gpn8Gs4V~<Z9mOM{Mo|7bkK$+#4nVH#RpGA=fQ&?7c z7Lf;m^2&2W(-!hDh2@s#N!C16pgi&%MIHpo!$@rjc@QX<JgPoRS}^bCJ`VzA9cPR@ zETZ$uWB+^o`0VWLZe4954+5n}i)H&5{d39lDe`PUzBTz<Jzxz42m}ZOfIxsifIxsi ofIt8U1PBBO1PBC>iGKwc0H9nRVz#xZ<NyEw07*qoM6N<$f<LB&{{R30 literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/104-index-cards@2x.png b/rep2/img/glyphish/icons2/104-index-cards@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f0183371bde8795467877ba70fd394030b4d065c GIT binary patch literal 547 zcmV+;0^I$HP)<h;3K|Lk000e1NJLTq003YB002M;1^@s6<uq~*0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz#Ysd#RCwC#oH0toKoo{IVzXV2U?JEj zcmRvFQnc_2qNPm^AWF2cRIpX_0G5i|39(nuLueNp+xRO9E{nl6aWa|A_rqf#yYooi zmpA`}4I5-x)<gC*MF{`^00aO4AOHXW0RR99002M$003%6)20%qY5Jg{uXu5!7Eu_6 zkDUP^E#~8#BLHR;odQs3*@5DxHtzmU1*U$G(Gv8PSQi$s(%bET0?2#r2`=bOF=(PI zn%o8Tx!)~zKp~bSo&)^ufDuo))v)47ordb%)y{N)iXS;t{GQ2kWeLIq@PM}HNby>6 z?m)3IcI;g7R59OzV#_xGiHz>1qNmLMaQLc5zBL~KT<gNyoDUDc1I%i@#*%TWVQ1{{ zzVaPZ%(tf@rUU2zr#&E6zPRlG=m0w4?;fB#dsoBZFJHq05FUUBAOLu~1YIibD6u5~ z+JS8TQ>rt?bIE7(ifzO5y)of3T?poV$#!vRf&$i^@4W{k#Y<izg^TiINtO9|j!EZt zrUOoT7T&$&IpEt9BFfD+6ac6N0JIz(YZy9ICu8Rt@P9!pK>$Di0006201yBGfB*mh l1ONaa00001p!50=U;w<qhcEXL?S23N002ovPDHLkV1iWZ;qU+e literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/104-index-cards@3x.png b/rep2/img/glyphish/icons2/104-index-cards@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1e892454286c643299542bfc205e62143f497a85 GIT binary patch literal 1812 zcmV+v2kZEWP)<h;3K|Lk000e1NJLTq0058x003YJ1^@s6^3?mG0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU&wn;=mRCwC#om*%eRUF1=XJ<FNv$0K5 zsA#lEu{8CLU|*^ftcED{@*<*dh1M$32StqNL(rfPULNX`Ew$o96@-d-!AtQ%y-<-B ztYXwgEVZR3niOMpW_D+1*6)x>Nw(R|&d!|8?9TVWVbAVn&)GTWcm9`|vy()*TvjNm zQK=jPiU3grh$27~0iq}ZL=hm008s>pq6iR0fG7e)5g>{pKokL@2oObpD2f141c)L) zR0~Us!j~`%qt|hq5%1{?N+M?SAdWXtE|<SerBeH|*(?F_0nh4UvA7r2TfCQ?m@ejo z>$-O)lgUohcN3sG1<Rx3Vg0=CqABr}2`hAnF3i7d@9|#@;2xCIsHfs&eQ?Yc+}9Df zuTcWjpfHFtx~{(oGd>!#I7l3;qpE5Vg+X)xfXbStnE<H3{DuHE3emYGXj#_HwrxL@ zNF=&qK2JxnsD`4LokccaHBGapP$&!msQ$RGa*V-Eh>t{E_zD54Q>9W#$H1+D^_d$) zC9XGuz;XY8hl6xsexk}*aBOb?&%%5^3p4(E4Eb?UPGCGn2~guJ(1Z#92mt-cur*q0 zm7GzWC&_WTXn{fzg6j(qBR!7lh8WM?2~|~JfNTGU0QrMQM~3zcEYcvJrsJHP!KLQ_ z&>#WwA=|e50M8u=D&q`~muDnyWDMkg)VdVzV>-8<2#|j{UTRChjS(P<Sy*J2W4Szu z@}n}lt1%g3(-vIk29&-k{fhDns-kp+Y;C*I@20sk@&rg8JPI<Bmyp^XK)n>Qb+t>S z()Gn+aRd{2Rb{{Fbo$*?Dm8+-NU6iz$K;~FEZQ9~4CCb}Ley3k2$S5C%jJ&C7-+P) zqEIMwRJJXiyRNH>v*ajw8ON2+=WnA6lb@X_un-TRdI=_SJoL!jajr%m>#BfzD<=7E zSfSs-?iX-&1Kh1q-DuWU76^m9(zfmUP^3Xx<@GE8yImAX$HgGJ+3`@b;E6)N1SmXn zKh@FE@fKXzX$kSwMp(AH7n@K4j;3i}z=a)@a7=3~%X*M5tO-^plgaE7`-Wt!TErpO zAjVpUwy&)07vOw~es=)eladZ^9Q_YR(HgbYi9}3hQsS<~M2+!ED&d}Ys_ZwiKXGcS zEDWpk5mYaf<ic(cCleRz7p`p!z<nK-=rc(!Y&%_8bF#2*xS5@@g4r5bm;h`uK-w&$ zUuI#;V2zgJ^HI;32+-2z{!BWZ{unN7ve7mi$GHO5WQ*eCnwGG5=<_gK*w+${>0-F% z`{}}(kcA<Ie^q2*K?Yl7TX04DE3bLg>K7^eAzjzE1ES*+j!PWOI9&6i%);cmuCpNw zve;`>^4ae+%8aCAa<L%BqdMkom4zW&8N`ZR1&i=^fNX1{GJCt3y8DI2+M3Vj_rZOB zAi;&LH4Ni1ST_RHge+`5O#Lw2kd$nz)@K0T06-d$u`r?vPg`bTjR4Tf{W1nxcpsqn z%>V%koMni;7uk6hkq{A}`h~z#oU{2-Y(qu)1ocTyOY3OaW1vhXW8z^5*~T9zyAel7 zO<6sQcM9b{rS=6-v7vn>zE7{uadObd89Yuc(Y`ocAZ{>vX)FIoG7>>FAQA&U+yr+i zwqCrCY;7N&PAIjnau-o9avbMjl)7(ng^cNYlowGITRYNA0NRD`bT2Z;ZLJ!B$Lf~4 z0wBQijjrn-*83U5Fg77Y@2_`9BHAC#X0z|q3xs7^J@^~}k`$jM=hXv`u(-rwn&u7> zZ^07%scG6Vytd$`Rj@WI;7YGUbrmeb+CrglPra8$ye%dD`216_s-yVaNm!#J=lL$z z?G-01(bsAKx--h>d0G}AOtSci%*?#Fr4&ZHn5;g4u?rw6ot>ReW1^p5;J1p!%Q2~Y z#V;@#*-C-G7jQf`Jv}X4^Lx2m?ykze5f^Lm{u=_ER)!}MSy(l}LQG-;U&Cr0L;V2i ze}&cd92kpTzrt%a-kb2=58D1zmG{jc?b8C)7g&pjJ+^I+!BTvO!Oklb0rCqG%IBOW zx-g0WMd~~Aat8rwSRxkU4W=Rzg0$R;M5MhxBcT2Ysr_Y2fZt1bzuZ{t_*J|Y_#QuA z`_;}wCquaNzF0&*5g`A8wMf06Kz3#Wq-z@<eb*JK_NnveQPr7LDs>cXmx2N$&PrEF z<0sI^;eZ?E$ME?lmwP@EasB@j6tggj08s>pB0v;HfG7e)5g>{HQ4|592oObpC;~)L z1c)L)6ak_L5JeFniU3grh$27~MSv&*L@l5G7hnJjS)QEWW`&3V0000<MNUMnLSTX_ CQcS=A literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/108-badge.ai b/rep2/img/glyphish/icons2/108-badge.ai new file mode 100644 index 000000000..39c258115 --- /dev/null +++ b/rep2/img/glyphish/icons2/108-badge.ai @@ -0,0 +1,1582 @@ +%PDF-1.5 %粤マモ +1 0 obj <</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R 32 0 R 52 0 R]/Order 53 0 R/RBGroups[]>>/OCGs[5 0 R 32 0 R 52 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <</Length 37726/Subtype/XML/Type/Metadata>>stream +<?xpacket begin="サソ" id="W5M0MpCehiHzreSzNTczkc9d"?> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27 "> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <dc:format>application/pdf</dc:format> + <dc:title> + <rdf:Alt> + <rdf:li xml:lang="x-default">Print</rdf:li> + </rdf:Alt> + </dc:title> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"> + <xmp:MetadataDate>2015-04-15T13:57:29+09:00</xmp:MetadataDate> + <xmp:ModifyDate>2015-04-15T13:57:29+09:00</xmp:ModifyDate> + <xmp:CreateDate>2015-04-15T13:45:56+09:00</xmp:CreateDate> + <xmp:CreatorTool>Adobe Illustrator CS6 (Macintosh)</xmp:CreatorTool> + <xmp:Thumbnails> + <rdf:Alt> + <rdf:li rdf:parseType="Resource"> + <xmpGImg:width>256</xmpGImg:width> + <xmpGImg:height>172</xmpGImg:height> + <xmpGImg:format>JPEG</xmpGImg:format> + <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgArAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FVGb7f0YqsxQ7FV8P2/oxS6b7f0YqsxQ7FV8P2/oxS6b7f0YqsxQ7FV8P2/oxSr Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVGb7f0YqsxQ7FV8P2/oxS6b7f0Y qsxQ7FV8P2/oxS6b7f0YqsxQ7FV8P2/oxSrYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FVGb7f0YqsxQ7FV8P2/oxS6b7f0YqsxQ7FV8P2/oxS6b7f0YqsxQ7FV8P2/oxSrYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVGb7f0YqsxQ7FV8P2/oxS6b7f0YqsxQ7F V8P2/oxS6b7f0YqsxQ7FV8P2/oxSrYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FVGb7f0YqsxQ7FV8P2/oxS6b7f0Yqhb2X0rZ2HUii/M4odZS+rbIx6gUb5jFUVD9v6MUum+39GK rMUOxVfD9v6MUq2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVRm+39GKrMUOx VfD9v6MUum+39GKpRq8tWSIdvib5npih2kS0Z4j3+JfmOuKpvD9v6MUum+39GKrMUOxVfD9v6MUq 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVRm+39GKrMUOxVfD9v6MUum+19G KscuJfVneTsTt8u2KHW8vpTpJ2B3+XfFWRw/a+jFLpvt/RiqzFDsVXw/b+jFKtirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVaZA3Xr44qoMjL16eOKGsVXw/b+jFKH1WX04GI6sOI +n+zFUgxQ7FU/wBKl9SBSeqjifo/sxSiJvt/RiqzFDaozdOnjiquqBenXxxS3irsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdiqlNdW8JAlcITuK4qpnUrEf7uH4nFWjqdh/v0fcf6Yqovq Gn9Vl+ji39MVaTVLJWqX/wCFP9MVQOq3kdw6CI1RRuaU3OKoHFDsVR2lXkdu7iU0RhsaV3GKUc+q WTNUP/wp/piraahp/Vpfo4t/TFVYanYf79H3H+mKtjUrE/7uH4jFVSK6t5iRE4cjrTFVXFXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqsmgimjKSLyU/h8sVSK+0yW2Jdfjh/m7j54qgsUO xV2KuxV2KuxV2KuxV2KuxVG2OmS3JDt8EP8AN3PyxSnsMEUMYSNeKj8fniq/FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXEAih3BxVKb/R61kthQ9TF/wA04qlBBBIIoRsQcUOxV2Ku xV2KuxV2KuAJIAFSdgBiqb2Gj0pJcip6iL/mrFKbAACg2AxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxVCX2mxXI5D4Jezjv8APFUgngkglMcgowxQsxV2KuxV2Kr4IJJ5 RHGKscVT+x02G2HI/HL3c9vlilF4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYqxi8m9a5kk7FtvkNhihRxV2KuxV2Kq1nN6NzHJ0Abf5HY4qyfFLsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqHv5vRtJX70ovzO2KsaxQ7FW1VnYKo LMegG5xVzKyMVYFWHUHY4q1irsVZLYTetaRP3pRvmNsUojFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYqlWuzfDHCO/xt9GwxVJ8UIi0sZ7lqIKIPtOegxSntpYwWy/A KuernrirruxguV+MUcdHHXFUiu7Ge2ajiqH7LjocVQ+KE40Kb4ZIT2+Nfp2OKU1xV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ksc1KUzXslNwp4KPlt+vFUVY6MzUkuf hXtH3Pz8MVThEVFCoAqjoB0xVvFXYq06K6lXAZT1B6Yqk99ozLWS2+Je8fcfLxxVC6bKYb2OuwY8 GHz2/XirI8VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVablxPH7VPh r0riqFs9Oht/jPxzHq5/hiqLxV2KuxV2KuxV2KoS806G4+MfBMOjj+OKopeXEcvtU+KnSuKt4q7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq//9k=</xmpGImg:image> + </rdf:li> + </rdf:Alt> + </xmp:Thumbnails> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" + xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" + xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" + xmlns:stMfs="http://ns.adobe.com/xap/1.0/sType/ManifestItem#"> + <xmpMM:InstanceID>uuid:ec32ecb0-f02c-2a4c-b7eb-05a6aa4b7a7a</xmpMM:InstanceID> + <xmpMM:DocumentID>xmp.did:0680117407206811822AD3757CE76CAE</xmpMM:DocumentID> + <xmpMM:OriginalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</xmpMM:OriginalDocumentID> + <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass> + <xmpMM:DerivedFrom rdf:parseType="Resource"> + <stRef:instanceID>xmp.iid:0580117407206811822AD3757CE76CAE</stRef:instanceID> + <stRef:documentID>xmp.did:0580117407206811822AD3757CE76CAE</stRef:documentID> + <stRef:originalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</stRef:originalDocumentID> + <stRef:renditionClass>proof:pdf</stRef:renditionClass> + </xmpMM:DerivedFrom> + <xmpMM:History> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:0580117407206811822AD3757CE76CAE</stEvt:instanceID> + <stEvt:when>2015-04-15T13:44:37+09:00</stEvt:when> + <stEvt:softwareAgent>Adobe Illustrator CS6 (Macintosh)</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:0680117407206811822AD3757CE76CAE</stEvt:instanceID> + <stEvt:when>2015-04-15T13:45:56+09:00</stEvt:when> + <stEvt:softwareAgent>Adobe Illustrator CS6 (Macintosh)</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + </rdf:Seq> + </xmpMM:History> + <xmpMM:Manifest> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <stMfs:linkForm>EmbedByReference</stMfs:linkForm> + <stMfs:reference rdf:parseType="Resource"> + <stRef:filePath>/Volumes/home/rep2img/108-badge.png</stRef:filePath> + </stMfs:reference> + </rdf:li> + </rdf:Seq> + </xmpMM:Manifest> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/"> + <illustrator:Type>Document</illustrator:Type> + <illustrator:StartupProfile>Print</illustrator:StartupProfile> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" + xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" + xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"> + <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint> + <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency> + <xmpTPg:NPages>1</xmpTPg:NPages> + <xmpTPg:MaxPageSize rdf:parseType="Resource"> + <stDim:w>480.000000</stDim:w> + <stDim:h>320.000000</stDim:h> + <stDim:unit>Pixels</stDim:unit> + </xmpTPg:MaxPageSize> + <xmpTPg:PlateNames> + <rdf:Seq> + <rdf:li>Cyan</rdf:li> + <rdf:li>Magenta</rdf:li> + <rdf:li>Yellow</rdf:li> + <rdf:li>Black</rdf:li> + </rdf:Seq> + </xmpTPg:PlateNames> + <xmpTPg:SwatchGroups> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:groupName>蛻晄悄險ュ螳壹ョ繧ケ繧ヲ繧ゥ繝繝√げ繝ォ繝シ繝</xmpG:groupName> + <xmpG:groupType>0</xmpG:groupType> + <xmpG:Colorants> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>繝帙Ρ繧、繝</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>255</xmpG:green> + <xmpG:blue>255</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>繝悶Λ繝繧ッ</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>35</xmpG:red> + <xmpG:green>24</xmpG:green> + <xmpG:blue>21</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>CMYK 繝ャ繝繝</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>230</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>18</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>CMYK 繧、繧ィ繝ュ繝シ</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>241</xmpG:green> + <xmpG:blue>0</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>CMYK 繧ー繝ェ繝シ繝ウ</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>153</xmpG:green> + <xmpG:blue>68</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>CMYK 繧キ繧「繝ウ</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>160</xmpG:green> + <xmpG:blue>233</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>CMYK 繝悶Ν繝シ</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>29</xmpG:red> + <xmpG:green>32</xmpG:green> + <xmpG:blue>136</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>CMYK 繝槭ぞ繝ウ繧ソ</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>228</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>127</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=15 M=100 Y=90 K=10</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>195</xmpG:red> + <xmpG:green>13</xmpG:green> + <xmpG:blue>35</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=90 Y=85 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>232</xmpG:red> + <xmpG:green>56</xmpG:green> + <xmpG:blue>40</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=80 Y=95 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>234</xmpG:red> + <xmpG:green>85</xmpG:green> + <xmpG:blue>20</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=50 Y=100 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>243</xmpG:red> + <xmpG:green>152</xmpG:green> + <xmpG:blue>0</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=35 Y=85 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>248</xmpG:red> + <xmpG:green>182</xmpG:green> + <xmpG:blue>45</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=5 M=0 Y=90 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>250</xmpG:red> + <xmpG:green>238</xmpG:green> + <xmpG:blue>0</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=20 M=0 Y=100 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>218</xmpG:red> + <xmpG:green>224</xmpG:green> + <xmpG:blue>0</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=50 M=0 Y=100 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>143</xmpG:red> + <xmpG:green>195</xmpG:green> + <xmpG:blue>31</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=75 M=0 Y=100 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>34</xmpG:red> + <xmpG:green>172</xmpG:green> + <xmpG:blue>56</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=85 M=10 Y=100 K=10</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>145</xmpG:green> + <xmpG:blue>58</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=90 M=30 Y=95 K=30</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>105</xmpG:green> + <xmpG:blue>52</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=75 M=0 Y=75 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>19</xmpG:red> + <xmpG:green>174</xmpG:green> + <xmpG:blue>103</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=80 M=10 Y=45 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>162</xmpG:green> + <xmpG:blue>154</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=70 M=15 Y=0 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>46</xmpG:red> + <xmpG:green>167</xmpG:green> + <xmpG:blue>224</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=85 M=50 Y=0 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>3</xmpG:red> + <xmpG:green>110</xmpG:green> + <xmpG:blue>184</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=100 M=95 Y=5 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>23</xmpG:red> + <xmpG:green>42</xmpG:green> + <xmpG:blue>136</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=100 M=100 Y=25 K=25</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>23</xmpG:red> + <xmpG:green>28</xmpG:green> + <xmpG:blue>97</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=75 M=100 Y=0 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>96</xmpG:red> + <xmpG:green>25</xmpG:green> + <xmpG:blue>134</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=50 M=100 Y=0 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>146</xmpG:red> + <xmpG:green>7</xmpG:green> + <xmpG:blue>131</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=35 M=100 Y=35 K=10</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>164</xmpG:red> + <xmpG:green>11</xmpG:green> + <xmpG:blue>93</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=10 M=100 Y=50 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>215</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>81</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=95 Y=20 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>230</xmpG:red> + <xmpG:green>22</xmpG:green> + <xmpG:blue>115</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=25 M=25 Y=40 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>201</xmpG:red> + <xmpG:green>188</xmpG:green> + <xmpG:blue>156</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=40 M=45 Y=50 K=5</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>164</xmpG:red> + <xmpG:green>139</xmpG:green> + <xmpG:blue>120</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=50 M=50 Y=60 K=25</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>122</xmpG:red> + <xmpG:green>106</xmpG:green> + <xmpG:blue>86</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=55 M=60 Y=65 K=40</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>96</xmpG:red> + <xmpG:green>76</xmpG:green> + <xmpG:blue>63</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=25 M=40 Y=65 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>201</xmpG:red> + <xmpG:green>160</xmpG:green> + <xmpG:blue>99</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=30 M=50 Y=75 K=10</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>178</xmpG:red> + <xmpG:green>130</xmpG:green> + <xmpG:blue>71</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=35 M=60 Y=80 K=25</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>149</xmpG:red> + <xmpG:green>97</xmpG:green> + <xmpG:blue>52</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=40 M=65 Y=90 K=35</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>127</xmpG:red> + <xmpG:green>79</xmpG:green> + <xmpG:blue>33</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=40 M=70 Y=100 K=50</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>106</xmpG:red> + <xmpG:green>57</xmpG:green> + <xmpG:blue>6</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=50 M=70 Y=80 K=70</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>64</xmpG:red> + <xmpG:green>34</xmpG:green> + <xmpG:blue>15</xmpG:blue> + </rdf:li> + </rdf:Seq> + </xmpG:Colorants> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:groupName>繧ー繝ャ繝シ</xmpG:groupName> + <xmpG:groupType>1</xmpG:groupType> + <xmpG:Colorants> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=100</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>35</xmpG:red> + <xmpG:green>24</xmpG:green> + <xmpG:blue>21</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=90</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>62</xmpG:red> + <xmpG:green>58</xmpG:green> + <xmpG:blue>57</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=80</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>89</xmpG:red> + <xmpG:green>87</xmpG:green> + <xmpG:blue>87</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=70</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>114</xmpG:red> + <xmpG:green>113</xmpG:green> + <xmpG:blue>113</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=60</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>137</xmpG:red> + <xmpG:green>137</xmpG:green> + <xmpG:blue>137</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=50</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>159</xmpG:red> + <xmpG:green>160</xmpG:green> + <xmpG:blue>160</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=40</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>181</xmpG:red> + <xmpG:green>181</xmpG:green> + <xmpG:blue>182</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=30</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>201</xmpG:red> + <xmpG:green>202</xmpG:green> + <xmpG:blue>202</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=20</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>220</xmpG:red> + <xmpG:green>221</xmpG:green> + <xmpG:blue>221</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=10</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>239</xmpG:red> + <xmpG:green>239</xmpG:green> + <xmpG:blue>239</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=5</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>247</xmpG:red> + <xmpG:green>248</xmpG:green> + <xmpG:blue>248</xmpG:blue> + </rdf:li> + </rdf:Seq> + </xmpG:Colorants> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:groupName>霈昴″</xmpG:groupName> + <xmpG:groupType>1</xmpG:groupType> + <xmpG:Colorants> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=100 Y=100 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>230</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>18</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=75 Y=100 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>235</xmpG:red> + <xmpG:green>97</xmpG:green> + <xmpG:blue>0</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=10 Y=95 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>226</xmpG:green> + <xmpG:blue>0</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=85 M=10 Y=100 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>154</xmpG:green> + <xmpG:blue>62</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=100 M=90 Y=0 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>11</xmpG:red> + <xmpG:green>49</xmpG:green> + <xmpG:blue>143</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=60 M=90 Y=0 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>126</xmpG:red> + <xmpG:green>49</xmpG:green> + <xmpG:blue>142</xmpG:blue> + </rdf:li> + </rdf:Seq> + </xmpG:Colorants> + </rdf:li> + </rdf:Seq> + </xmpTPg:SwatchGroups> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:pdf="http://ns.adobe.com/pdf/1.3/"> + <pdf:Producer>Adobe PDF library 10.01</pdf:Producer> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> + + + + + + + + + + + + + + + + + + + + + +<?xpacket end="w"?> endstream endobj 3 0 obj <</Count 1/Kids[7 0 R]/Type/Pages>> endobj 7 0 obj <</ArtBox[148.953 48.9473 348.055 298.143]/BleedBox[0.0 0.0 497.008 337.008]/Contents 54 0 R/Group 9 0 R/LastModified(D:20150415135729+09'00')/MediaBox[0.0 0.0 497.008 337.008]/Parent 3 0 R/PieceInfo<</Illustrator 55 0 R>>/Resources<</ColorSpace<</CS0 56 0 R>>/ExtGState<</GS0 57 0 R>>/Properties<</MC0 52 0 R>>>>/Thumb 58 0 R/TrimBox[8.50389 8.50391 488.504 328.504]/Type/Page>> endobj 54 0 obj <</Filter/FlateDecode/Length 256>>stream +H瑛Q[N1 マ)|』c;ホ纓UhUR義承]UE速hlマL&テテテn ps;ニ�モkェュfル*,モエy9ツ|pテスMソ- &A蔓@ZアTJ0拿k撩」 +`Hヌ @R牲!。サソサWヤ3チ彜ケ_[95pQ=rn>7.gm゙ロTタ嬬Kハ[]3,ナ、ロ噪ヤY竏|カナミdkEユ0 +ト匪�「l」ム織ィ )E嚊ァ榔」カクヨセ}゚Hィ$Jネッ^:+vンソ �ge endstream endobj 9 0 obj <</CS 15 0 R/I false/K false/S/Transparency>> endobj 58 0 obj <</BitsPerComponent 8/ColorSpace 59 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 42/Length 171/Width 62>>stream +8;Z\s5n8Df$j?V1(N)?imheG!L,EZM`!^@Lk[C#W#V#/b8eA=d*6#!gs(AL9,P_pT +G`jq_<SJLBhLUs[a_Yc7-p8>dA%mP#Ct1M$rF;\Ipss*=$idSWPrlRhc'/ANZj3Z; +^%#77Cj+-"j15E(.e;E>If6RVG<X2)!*%`aSH~> endstream endobj 59 0 obj [/Indexed/DeviceRGB 255 60 0 R] endobj 60 0 obj <</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1 +VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH< +PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 52 0 obj <</Intent 61 0 R/Name(00、00� �1)/Type/OCG/Usage 62 0 R>> endobj 61 0 obj [/View/Design] endobj 62 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 16.0)/Subtype/Artwork>>>> endobj 57 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>> endobj 56 0 obj [/ICCBased 63 0 R] endobj 63 0 obj <</Filter/FlateDecode/Length 2574/N 3>>stream +H奥幌TSwヌoノ梵焚テc [ー5laQIBHリADED━2ヨmtFOE.ョcュヨ}メ08エラ持8G扼gヲモ9wン゚ス暎�'・ェオユ0 �斎マJ固b、 � + �2yュ.-;!熬ニKーZワ 京^進ス"Lハタ0-ラ �@8(鳩r;qョェ7鎰忱・&Qqカ4アj椰轎9レト +昂ウ)g截」0i弩ラ8#ゥ8wユゥ峯8_ナル・ハィQ腋ワォQハj@&サA)/ヌルgコ>'K�ネtユ;\ モ・$ユコFスZUnタワ(4T%)ォ0C&ッ秘丶Z」妬仭8ヲレbx巣E。チチBム;ッ崛Pヺホモ椴ケ暸 om?躙= +xッヘキカメ-�険タ觴嵳�0セセホ}ヲy)7taセセ>j・ワヌTミ7ソ@シマヌtワ幵`qハ2匈ハ呟&ッョェ6アZ扠ョト?秬yxg)ヒ配・省テァLュU硼ヨ*ヤuオSkSeリO4?ラククcッッリー.�キ �袵�Rエ ゚∇-葡25゚矗ワマ S>モ」Vュ嚥電藾r」セn~マY&+`怐;ツA4ノ 艢ーネA9ミ�=ィ-tーlテ`;サチ~p激消 Gp| ョー`Lョ`<ッ "A YA+Cb(括R。,ィ�*ゝ2B-ミ +ィ鼇。ミn顆ミQtコ}MA0モalサチセー氏Sx ャL&ク^チ」>0|>_'瘍,ツG!"F$H:R!z、颶漸d?r 9欺A&賎ネ 蝿rQ 「疉嚥ハムエEム]鐶4z截gミラチ籾E#H *B=。0HリIpp0MxJ$D1魯, V實ストュトト翔KトサトY嬰E"E脊I2秩ヤEレBレG荊4MzNヲネr!YK 締?%_&゚#ソ「ー(ョ0J:EAi、Qニ(ヌ()モ埜T6U@頃覬+ィヤ!黯麥肴D ・eメヤエ蟠!レh渾ヲh/コ']B/「鴉メ蒋ソ「?a0n敬F!テタXヌリヘ8ナ夾ワ渓訥&5S亰剄6サl露aコ2c婁儁フA!襴#衄腸dャVヨ(k模e筋駘 サ凌}枝櫃篋q9 +N'ホ)ホ].ツu覊クr + w哦 xR^ッ[゙oニ彡h枷゙`>b懐$盻・*~ :・戲桁メb最~桐マ,m,」-楓ン,ッYセエツャ箝*ュ6X梗ンアFュ=ュ3ュュキY浤~dテウ キ苔tロエケi ロzレfル6ロ~`{チvヨボ.ムNgキナ庇#{セ}エ}ァクjマ鎌c1X6敞fm克;'_9 徨:8ンqヲ:享ヒ廾:マク8ク、ケエクuケ飩qサ冥nv=フM燒カハmワセタR 4 +nサ3ワ」ワkワGンッz=ト[=セ=<ヒ=G</zチ^チ^jッュ^両 ゙。゙ZQBコ0FX'ワ+懿磊、t口<u-ン炮ヨオ_神捕倚-G,}鉐/ソタHh 8mW2p[燹クAiAォN#8$Xシ?AKHIネ{!7ト<qクWy(!46エ-耙aチaーヂW ソソ@ー@ケ`lチンァYト肢ノH,イ$ネノ(ヌ(Yヤhヤ7ムホム願旃b<b*bナ<寿琴ヌ~L&Y&9ト%ニuヌMトs龝繚譱NpJP%M露 JlN<曠HJIレ腎Cj'必wKg辰苧%櫻。ァdァ ァ|縄飭O=ァ%ァmLサスミu。v痊:H率oLソ!ネィノC&13#s$/Y「ャ脈ウルワ粮=ルOsbsrn蠎sO1岐v=ヒ祥マ歃莉hル「ヨ黷#、ツシツ揣ウ九oZ<]TヤUt}荏Iテ痴Kュ遊-、郎,+>TB(ノ/ルS,]6*-楓セW:#諒7ヒ*「ハeソ^YDYル}Uj」鵞yT`#オD=ャカ"ゥb{ナウハハ+ャハッ:!kJ4Gオm・tオ}uC%摎ョK7YVウゥfF泙゚Y ユ.ゥ=b珮?S乞ニ僻ゥコネコ村鋏yリ レ 込耕5%4ヲm7殕qlio兒ウlG+ヤZレzイヘケュウmzy糘]ヤハ?uuw|ソ"ナアNサホ蝮wW&ョワロeヨ・コア*|ユユ鑠皷5kカャyンュ「ヌッgー辯^ykEkヨクョlンD_p゚カトレラ7Dmリユマoソサ1m聶l{瓔Mナ嶄 n゚Lンlワ<9琵O�、[从$剞咨喇墸妝岷怏戈拇旆曄椣沂滯iリ。G。カ「&「魅」v」讀V、ヌ・8・ゥヲヲ協ァnァ爲Rィトゥ7ゥゥェェ将ォuォ鬯\ャミュDュクョ-ョ。ッッ恐�ーuーア`アヨイKイツウ8ウョエ%エ愀オ憾カyカキhキ犧YクムケJケツコ;コオサ.サァシ!シ嵜ス樟 +セ╂ソzソタpタチgチ翊_ツロテXテヤトQトホナKナネニFニテヌAヌソネ=ネシノ:ノケハ8ハキヒ6ヒカフ5フオヘ5ヘオホ6ホカマ7マクミ9ミコム<ムセメ?メチモDモニヤIヤヒユNユムヨUヨリラ\ラ獵dリ鞁lルレvレロワワ岸ン尤゙「゚)゚ッ6狄瓮睥禊籟緜肭舖蕈蜆 譁遨2霈颶鰔鷦褄p懣(エ@フX褥r候ァ4ツP゙m旗ィ8ヌW鍄w)コKワm � endstream endobj 55 0 obj <</LastModified(D:20150415135729+09'00')/Private 64 0 R>> endobj 64 0 obj <</AIMetaData 65 0 R/AIPrivateData1 66 0 R/AIPrivateData2 67 0 R/AIPrivateData3 68 0 R/AIPrivateData4 69 0 R/AIPrivateData5 70 0 R/ContainerVersion 11/CreatorVersion 16/NumBlock 5/RoundtripStreamType 1/RoundtripVersion 16>> endobj 65 0 obj <</Length 1037>>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.4 %%For: (\614\703\623c \610\752\613`) () %%Title: (108-badge.ai) %%CreationDate: 2015/04/15 13:57 %%Canvassize: 16383 %%BoundingBox: -1 -320 480 0 %%HiResBoundingBox: -0.001953 -319.998 479.998 -0.001465 %%DocumentProcessColors: Cyan Magenta Yellow Black %%DocumentFiles:/Volumes/home/rep2img/108-badge.png %AI5_FileFormat 12.0 %AI12_BuildNumber: 691 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([繝ャ繧ク繧ケ繝医Ξ繝シ繧キ繝ァ繝ウ]) %AI3_Cropmarks: 0 -320 480 0 %AI3_TemplateBox: 240.5 -160.5 240.5 -160.5 %AI3_TileBox: -163 -439.5 620 119.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -217 18 3.66 3349 1293 18 0 0 46 134 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 66 0 obj <</Length 4983>>stream +%%BoundingBox: -1 -320 480 0 %%HiResBoundingBox: -0.001953 -319.998 479.998 -0.001465 %AI7_Thumbnail: 128 88 8 %%BeginData: 4834 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFDFCFFFDFCFFFDFCFFFDBCFFA8FFFFFFA8FFFFFFA8FD07FF %A8FFFFFFA8FFFFFFA8FD07FFA8FFFFFFA8FFFFFFA8FDD5FFA8FFAFFFA8FF %AFFFA8FFAFFFA8FFFFFFA8FFAFFFA8FFAFFFA8FFAFFFA8FFFFFFA8FFAFFF %A8FFAFFFA8FFAFFFA8FDD3FFA8FFFFFFA8FFFFFFA8FD07FFA8FFFFFFA8FF %FFFFA8FD07FFA8FFFFFFA8FFFFFFA8FDD7FFAFFFA8FFAFFFA8FFAFFFA8FD %05FFAFFFA8FFAFFFA8FFAFFFA8FD05FFAFFFA8FFAFFFA8FFAFFFA8FDD7FF %A8FFFFFFA8FFFFFFA8FD07FFA8FFFFFFA8FFFFFFA8FD07FFA8FFFFFFA8FF %FFFFA8FDD5FFA8FFAFFFA8FFAFFFA8FFAFFFA8FFFFFFA8FFAFFFA8FFAFFF %A8FFAFFFA8FFFFFFA8FFAFFFA8FFAFFFA8FFAFFFA8FDD3FFA8FFFFFFA8FF %FFFFA8FD07FFA8FFFFFFA8FFFFFFA8FD07FFA8FFFFFFA8FFFFFFA8FDD7FF %AFFFA8FFAFFFA8FFAFFFA8FD05FFAFFFA8FFAFFFA8FFAFFFA8FD05FFAFFF %A8FFAFFFA8FFAFFFA8FDD7FFA8FFFFFFA8FFFFFFA8FD07FFA8FFFFFFA8FF %FFFFA8FD07FFA8FFFFFFA8FFFFFFA8FD6AFFA8FD6AFFA8FFAFFFA8FFAFFF %A8FFAFFFA8FFFFFFA8FFAFFFA8A8A8FFA8FFAFFFA8FFFFFFA8FFAFFFA8FF %AFFFA8FFAFFFA8FD68FFA8FFA8FD68FFA8FFFFFFA8FFFFFFA8FD07FFA8FF %FFFFA8FFA8FFA8FD07FFA8FFFFFFA8FFFFFFA8FD6CFFA8FFA8FD68FFA8FF %A8FFAFFFA8FFAFFFA8FD05FFA8FFA8FFFD05A8FFA8FD05FFA8FFA8FFAFFF %A8FFAFFFA8FD68FFA8FFA8FFA8FD6AFFA8FFFFFFA8FFFFFFA8FD07FFA8FF %A8A8A8FFA8FFA8FD07FFA8FFFFFFA8FFFFFFA8FD68FFA8FFA8FFA8FD68FF %A8FFAFFFA8FFAFFFA8FFAFFFA8FFFFFFA8FFFD07A8FFFFFFA8FFFFFFA8FF %AFFFA8FFAFFFA8FFAFFFA8FD66FFA8FFA8FFA8FFA8FD66FFA8FFFFFFA8FF %FFFFA8FD07FFAFFFA8A8A8FFA8A8A8FFA8FD05FFA8FFFFFFA8FFFFFFA8FD %68FFA8FFA8FFA8FFA8FFA8FD68FFA8FFA8FFA8FFAFFFA8FD05FFFD0BA8FD %05FFA8FFA8FFAFFFA8FD6AFFA8FFA8FFA8FFA8FFA8FD6CFFA8FFFFFFA8FD %05FFA8A8A8FFA8A8A8FFA8A8A8FD07FFA8FD6EFFA8FFA8FFA8FFA8FFA8FF %A8FD6CFFA8FFA8FFA8FFFFFFFD0DA8FFFFFFA8FFA8FFA8FD58FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD4CFFA8FFA8A8A8FFA8A8A8FF %A8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8 %A8FFA8A8A8FFFD05A8FD50FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD %52FFFD2DA8FD54FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD58FFA8AFA8A8A8FFA8A8 %A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FF %A8FD5AFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FD5CFFFD23A8FD60FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD62FFA8FFA8A8A8FF %A8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FD64FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD68FFFD19A8FD68FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD6CFFA8A8A8FFA8A8 %A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8FD6AFFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FD6AFFFD17A8FD6AFFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FD68FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FF %A8A8A8FFA8A8A8FD68FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FD68FFFD19A8FD66FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FD67FFA8A8FFA8A8A8FFA8A8A8AFA8FFFFFFA8A8A8 %FFA8A8A8FFA8A8A8FD66FFA8FFA8FFA8FFA8FFA8FFA8FD05FFA8FFA8FFA8 %FFA8FFA8FFA8FD64FFFD09A8FFAFFD07FFFD0AA8FD65FFA8FFA8FFA8FFA8 %FD0BFFA8FFA8FFA8FFA8FFA8FD64FFA8FFA8A8A8AFA8FD0DFFA8FFA8A8A8 %FFA8A8A8FD62FFA8FFA8FFA8FFA8FD11FFA8FFA8FFA8FD62FFA8AFFD05A8 %FD13FFFD05A8FD62FFA8FFA8FD17FFA8FFA8FD62FFA8A8A8FD19FFA8FFA8 %FD62FFA8FD1DFFA8FD60FFA8FD1DFFA8FFA8FDFCFFFDFCFFFDFCFFFDFCFF %FDFCFFFDFCFFFD46FFFF %%EndData endstream endobj 67 0 obj <</Length 65536>>stream +%AI12_CompressedDatax懍スK%ノ& ? ーェロモン(。唖8 僅颶sTJfEs:+ウ枢ナ6モフMマB A6AメH# YhF喀H?C鍄ホ1ssソ7Y オコ22 w;;ッ?淳ルァサ/^贊p9^ 77マ゙セ~ R/~蟾゚シ}メ~ノヒ離エムケヒ7゚シxモe?^冐*サォi ソハ><ソ塵羆ヲ蒟_|rスO荳_シxF師腋魃毳袁蟲渣;.粧゙ハ靨ヌ}.\A嗔タウWソ}ヘ7/ル ョ エo_}籃練ラ渕軌/<^炯ウ?ソf}トx9式、 コrYハ|'_s庄ユヘォキ?{ヘ7゚^ソ|譖\~ユナO栲)yvァ7/_セヒヒgマ「;褝ナヒ孃~_セ~)_ソo^u77__}蜑ソ~ o3}偲蠻}xヌサ9ロ/ソ」oソ詐メ\ネ疽゙ニ#ラ夕チ O+。|vュ<、ワ$?ワキ.Dカルwン゚ソソシ?スo'v7ッソル崛@Wォラ?粫ォッ_ハe8^&y_Xy4,;"d鰕ノ峭c}ロ7ル?z鵲゚フヘロマtィcGゥキ/o゙ォo3HE_ヘO^qR姉軅ソ|ニ7ツ譁毟タ/椰豁フェキ慳sスぞ?ン ニワ~ヘォ_シ%Sヲ 7_ヒ/BEョPp脇ツニvQキヤセムゥタフ剏澎゚シナォリMヘ/鵬暼ナャ?耀ッヤzォヤo゚゙シイ[麟tI7;ニヒ毫&Wシzナ磆Wx゚`ンネ・eニシ|・ュホソネ鱇~ュwマ淪(ヘ妓鑚#eg/ソ?ヘoソムォ?=|Oノ/o キ吹粐ァソ'Eクタッセト柔yaイメ _Dセケ_蠖Q四g 醸;/$跏B(gkウ7.ォp9]ゥクュ鼾ゥンujwロキ/?,鴉ユoo^セ趙ルォ/.ムウ7_゚;?{ユウ7、ッヲ^ソ[]ョスレサo鯢/~+y&C{訴オO!廐コ縲Oクミウキソ~z鼡oVマm7UレC訛ゥンンマ枋ムシケリソ已\糢累-クヌメegヘ珍シ&ャc杵u+? ッ~J贖 冴kマロお。w'ト數ムw゚ユョンミ゚跼衢_セyo^<ソ。]マキユ響ナwケKスャチ゚}ラ/_|ユヨ~ルマ「メョヘロマ_゙|サo゙゙|獻{qナ ル゙n皙wル_>{7?~7マ゙シクケ特aナォ/├|狭7 +"�| 碾箋゚<杖7ラ<ウヨa\ト×テモ;$宅ッコソヘウ/^!ソz+セ4メd8Guアbウ?テ^レPリ貪d-I詰A囓#レz%ネ二ルア扶ウエIZ゙'iQZ先・ケクwラメョ、ルz誅キ+メfi[末vq、yin7「斌iW衒v({6/溂蝪リ<q蓊8Pエ崇K*。粫j>ネ幌橦懈0ルMラモ<~*モ<MS堋艸iフラy檪橦粘勺1]・」<.ヘiJ)ナ苴禽J^ロ>8ヌ)ヲ」.\」シネ](a +y1狡隸Q^ヘホマ~ノGW\サ」;ク搏孀「9マrrシ|ム湲・ヘマd?キ゚マシッ忸オ姥暹S^鰕ル~kヤ砌゚ァ<ヤ(%/ ュXロオカoヘ訛<カvユレオカ4ヨ6$ラ垤Z禁飽nmイ6キVミキウカoミレムレヌ垣ョ(ユ s%,ウf黙ウ9t聖t扮ァQ゙ケ 蟯Y&ロ,渡'S0e^マ」シ4/モ2r7y枦Y"{匏G匳ラE-潰謀VO2キ,たフ」フkY*Nf雛囘-Lイカ堪舷ャケ Z魅兎'Yョ,ワ"kq/k(+ZVサ砥QWホヨ\サWXヒトq}コハ�3W謗 秡挧キ靼 [z躰迫"\G朖クョー?灣牌uク>\ヌ」ャ乾ャ膨HGy烏yQヌ剏`wワツ叢ニx%j疲、ォ -rx菴_MWョ0翡|セ6(乱 qM}リ剄歹YォSラヌ ォ;ヒ*殷リy 厳ュ.'w樔ワq<\@ナ」シ[瘁z9ャtマユ[/'(1ハ +W実コヤig」フq^.gテx刋MミdヌITルア萵5ン モOヒT)Nク^コ「 +迢4^毘RクNF「レ~hソ捜悼gt!KトヌNモ8Qチソニ(慢F眥<ハ W]ハイ顕ワロ#ヌ{屎]4輯f_ツ=イ墓ルヌ3>Sラ欄サ勗袱ゥ?スキ ]ーッ2JKjマ/+ヲアフシ"o]在M}dGr7c電ェ@Pe<+、+)ナヒ?e雹オ勒ェMロ~惴。簓u匿wンョ6クimCナ7mキieモヲMヒレKキュk 帶7m\キ夬jー_ョヌ罔コF mモハヲM繻6メイオd筥Mャイ0ルホZ2"暸@サ眺ネ-惆PX峪ハ"。(クyハ#r7イs^a[サ(ノクオホ碑&葬挾%ixラ 腆フΒキ*v総{磽ルマC嫐i募cロSワQzタup>UT"B トルハ8靭 +EニY6猫)e幇Ub+;R<@ャqr酩」狎p香「・7オエ+ +僭芋リ・!H{菲!t齲=C]2ム!Э骭dWアュNQ揄3 苺M.L、:qタヘ6ァ#ホ走[テ +ッョッチ-;ーHサォツ z眺:ノK +x�Y{胝Z:ハソ累セネエ詫 xnミヤvqUiホdェ0T_ィコゥイ@Y儁K岡娜/Q剛[@eDユ摺レU刪T'シヘYフW抬:O。XD據'醵エ 矼2ア0 赱);ェ:遒 ォ邑>rェ9ノT睚C媼市 +鯊ノTレ4栢@uLチチ堰sナq綿 8=trdN機ヲ9締ィ菩(ハ+_qニTqyDフoョq]モ]6-nZレエャmィソ\M6oZルエンヲオ ホチセ7mケ^キハdヒvCケ6-nZメ6ヤ_ョヲM6oZルエ攜。rス゚エテヲ7苹テUMホ<q*+PWタス蒹ワxΕ&PKTcネ@普2#フ@糠Ot礬ス謚マ0Rサqu廩-SョRpユX:抛0・・W[ェ簫ォ.Uy鰈S`,u0%ヲWcェ"SU竸勦鶚ッミT膚Jヘ@擱j5;-ェヨ話ウRm|[7吸3オゥマ)>リエョモキNモ:ャォ騰N「:Y龕ィcッ#-憔ノO8(2"{y-リ9ョeqワS"%66EFk/ッ(キ}Ivゥ ;\注k)a7ロォ#キDM*VR%串タ曰タu~G>R此LレォB醗ヌモソUNサk獎梏k燧Z妬ヌ{Nヲ+モ涯#ニヤN'フムt`ユ#'ヌトiア縹タ\ク,ト臓9諚叱師SZ!割`[ァ。籤u3Tミ8Rフ8PミPq」ナs'隶j5Wユ}ロqンラサpンΙコ ォXア|0W苗a*oテ|ニシサャl4オオ5!eW]嚀8顫ャkTWゥョS]ゥコV塾モクnk稔V庖チC惧イIwカュQ[柮!>忍;-侯ウ j磅F;pケホムョケレム<u0pル+ャtfュQソХヒォ軼 蕾+ヨ坊袰vハヘセリm⊥ヘzh;・咼4夥祟Nu:メカ[^Qf=Rn=リムR(テホ把ムイツBI゚ハ字ホd#。i俗ョ�ケ3:+D}VrP R酲ト6キヨkw謹キomム{スェ6孰+トゥホp^~;#ン}Q鍖J )宗)d塋ロP濠貶|轡。*3^Fl郵< レXD・戴ィ+NShョ# 3冕7 +ワ }lGョツ8澁)2xエvU1抓 O賽"Bロムヌ!B,"?"$コ」B タa貍ンcNvRInRノ"鐙DRe脱"ヘGIT((,2IC_婬R蜥數%&僉6フブ信D厦于7テ螻 ワー!阮 =フコ1 ワD'灼!ョネヘF慈8pソD8x.児{Gmj`ロ+4「ニ>e@ェA-jトツ ェオヌキコk_レ69ヽ9r&D<i2痔cZユョ1雜ュ�セテヌ添オtU{ラb壗 膿wレヌSpネ澎チタkJカ#迺」啓Fgx」"述リl埠ウフンvY/MNレ[;6ネ觜キメ。ゥヘ駒リ荏0'カヲ7アYΕア苓コマ2^ョ腰Bv樅 6〔ー残jcゥ?郤モ ・*エ[m8ァチ6 E侮ン$@we/ZヲS羲R+ HァK/ノユ謳ォ$銕[・Uエォ~カリォoxャ?tトs`ュサトンキo5Q=Rミン凰)フ"m ホカ`l ツNカールフニ令le gS、MmSシュ"nfリクィs3レー2リワpe�゙@ツD!オ蹤v +ル +6+ワ<窩e=沂ナ^ヘト4*=S>ォ-wma}/n[UTェSーQォェノljノFチ(rキ)ニs7P畍炙"ミ匡ァ「iLラbi'lヨネ 8 シY?F ラ湊sー横~%サナキdーy2qョd/kG縄l筬=・Y&ェbuヌチシPt7JコV6m>モヲヾ、-各ユ持bケ(練ヲCT擇bpg範。モ6 6ヤ゙瀲m購5]、9リ|8エYアッs」オ +aメ5絢BYラ�ンク[ラニウマキ-メxメ6`ー%ケS] ン懽抉�イB=zs玩tホーqェコ8ス6コ`9ヌ:Ct壤テ`xa1hg゚#ヲk捏|X ツス= 4lYカd[ヲ賢ク妍ケ尽ッMホ]$]E澣ヨ +テチ<qョBq^、ォ*ツ5巒 フsM+。」,、Rn6リ-tVl妬。ヨF*クUンSdス2c4Aエ姿jョ ウ<ワ C Yタ+廊ケvxウgュ&7ォモヤdr綸~Reモ玄CウロマスワQル5ロセYゥ8g?ォキ夫待セ聳ェ餾擶夸[e「QG~3q秧ミ疱サユtホn5倔ェィ驫゙rウ贇r5u+'B5込0xVロU3R、uiセ2ユ|bスコヲ�ー7」~uヘ~EAPxマ@qウア2%Z5V,。ミ兆OcムxeP蝪 -e#エ佇b%フ。y/VQe2,35竕YツォDイ7Id6|(寤3ワ6fWユN艮レソウ洪lヨムl゚Wf゙ロH磨9Uモ7Wュァ棯od%Cl・ワハキ +セ$3墜V侍7Bト"@lホ。ノ k臨砕ェ ヲル\簗{稗ミ9ア^ロヲェ遙゚tVvye杭フ纂耻Y ヘ3テハ>モロh謨・ヲキ-ヨサナXUヘacカ」禧mi。Yメ'クj?モK8ッコンU等セGシUyソ峭ン」、」1D[1F[ニSSモ$Uウ 拐柤bdクハィゥh「ミG{ミv:リ0`^ワリ 睚薩サカ2�6S疉 6.�3ゥソテ4ヤュj{�葭>晞遯插SQCqEWム1オリ俸ッxドカ�T侶暑zケrルfォッK$gD>\2T棋スラ釧スLdァセ/リ絵nラk浴;>tJcuン8シア1戴.{eーナv#ワ ナ九.エ8j�c:Tホヨ&W「災^ァ桴A$8筝"ス�┿2O@ワヨ揖ゥ|xoe皮ァO」#コク疝>ユe@AアdwY狠吶・フナ-湖ョJq承フ/ニ1ホ8ユej▽_8ヘqモ歃キサアヌ鴆胙|?マィ ~eYNツコ佑Tシ稙驍 !SIホIナ 震B゙*Gク"ヘ莓期ホ8e纉ニ%#・yオdV;ヲZ1UPレーイ +V褌!飜キスルf"\抜ナ陛尸=n\ムマzpィN6六贐掵クキ oュツスMxャ麭オv〇;mス6゙LUクホ0曁.ュ催w8*yネ!轎編-mィtニqi8^コュmス嗜iテC<q脅・ =qUタqエ�膰ミ^蜊@y謗萎オIka%ォフ榱ノmTLX/震チルz/xPッ^4t.Upヘ`V,c鷙廿Dレ5uニPンリカB"レgュW}ユ隗6丱Zオヘ�_スヤ麋ヲョ疲・カ3ナ觜峅67ェJQU*鷸C 6%ォ;mヌヨネIc(ス#@V-nZ>i儖[ケ・ir崚タタマミマc組ミノクテ^eェア}HA2サオ0トナRシ6^ ユ h.NユイW-ニユn巛ク窶ム0@エJ、Qムウルフパワ・囗ァSチツワ(鄭RミN7ネBケヲ-O譎]ヲ`柆87ミ2wチ樸>7・ヲ. +・ンマ。uエtZソユ裝BナhC#/11rヒ_黹ッ[pi酊nnPロ*|gAsァuチB蕉:|タ ヘJ~発アネ曠u"E\."T'コ扎薑ル@^fルア<姆ル〇i(#ア@ォネトaセセb邇リッセ@s霤E*ヨー ネ0|g径 ケキ`贈チxッミサoミフU$メどャミ倔68fAcフ5ィ J「ノ)ョPヤ{a 羃 セ黥_ヘヲ!.ヘij>5オア吃メv[<`jqO瀾O` xメカ〕テすキロ :wベ゚シ賤裳vX雫マ「メF)W"$賢D簒#ハ※痩%0\款枕ィ6X悁FゥUァミ懌オ錫エy1% キチ+゚\クマ雇H躍1届jtオ鎌,dIs3ルLGf<鸛eぬテYTy旺\p乕q梅.[D蠏a&ヌチ4擦C+レシ ホ・ケ絖ュ袒Zヲセ8dしu,f火ュ`*$ニ+\ [ヌ家Jマオテ=mッXテレamx閨dhテC{ワ矮カ莉ロ熔贔Fフ^Cェ^^;鴉スbs饂愡緻ov擡鍾ーノ 苞ωU3エY0ア] ァ&ヨ3FV3エカ廣>ス9 +垉獎e3チァ=X=Cヒ+-サミメwb\ア]pメ5<qリエ浹イ[レミ~ス3゚ムヲモ6恊キヤキa」[J|ワヤNhvニム喞津琶 +HAr9ヒヲホp7亦&ォニョ.Vォマ臨メキカ=Jwoヘ'掬ッアY%ラトzヤ4m9カ苡3ゥヘgMjSHハSHハSHハSHハSHハSHハSHハSHハSHハSHハュヘァ数ァ数ァ数ァ数ァ数ァ数ソ!)ス輊爾U瑠lョー8lメ層ン=溂C>sKァ.}エKヘラ」セ・ォ.wpュ!.活ラ與・ケホ5gaホョ!9ィ{莖4ユテj淀4TZムセ腰踈鮑!ウ励ィユa�:乍麸~ ヲ-ィツ漕p蟹e摸Iオタ [テ鳩ョi=トウヒリ埠;拉イワ(セォQ゚フ%膚モa}゙+ラP朖朶ィkK*クP5拜<2`t[Y還ヤ゚p、ホ箪k花 ?[:<t濛膀?sO=讀ク。Xフ揶ェ`L <)4'uユヌ xル4ヲ飃゚リィ/}翠{ヘ7ョホ{D-ヘ\ミ6ムm芭],駭ヘ"サMx{sウ1)。t%イ.ホ%セ:葺Gノ:mク&ロ雌9TwuサGu鰄7マ及1レw1F[6ElUマEノセ9ワ帷%悖q翻ア! k!ァハ8 錬コ,鴦笳ャサ_壞・シ>8甃オ3オ|\(s#iVv仍l徃釋ニ瘟.Mキ.=BOg_)g+Nウッt。'9ノュm]忿フ[3・・f&肌fムナTアカツヨ詳qメ|kXァZ +ャカ笂トトvFgr.ナ」;携Pロxメフ0牢エメ!'繦遇カエテニュ5ウ~ャ<d坡abネヌメ];tI#ヘヲ03Wャ 9ウウテt゚チェT ・BuェzJユQ哉nヌ麭y ェX遅Y{&reオ4-wェホL詁ケo k� V靼・籔2@cモ pcラLソ}dセTヘサ[ホ#_4惑ュhサヤツ7Vク牋kヒシ]@砒働YーxAムfW薙[|uメヨ"クョフリメ觚7ースk6ラ区ワシテェ俾r。ケrコ+fメヌミG"s&惑オエs倥カmモ]/ミッーj[ン-、;=捗jケk]Q。・鏖Sjスoッォ。ウ儀{h閧頬リR1ィq゚q_キトォスシL7-黜 xGヤe:[フ痔ニキ、5^g5エニ272cイヲケマヒホDヤTチ6iヤュP4踏.ヒト> 譽F顴ヨ47qソOc鰐オ彁姶アウ処骭ナctQサオ?[WホサUア。ナ線齧V-zヘヲgミLオト慌ッy」 ビbロトイリヨhkDKnXュアモtW'f[_ウハhヘナlX慢z墳=ハカndァ.c"v夕リy_ッ際ユヨy靫ミ殃wy7〔クUォV緞=オZ亮Mマ,T8W蓬|nメ 宰送ッx譏覡-ォBツトrィロル@ォノZC)mヤッリヲコa0/遶NWョBユ・{アgチタu琉ヒ@=クjチサョ闍FXDォ牝]P.>bjvハ}ト&$「駅G;9ルミv+ワル&メヲ搖、。オ*<頤斉銷襾W,LヒTャ橿-e 亦VュUサ:V・p R,睨~9&Kー e僞ナb盤ウレ<ェ!bqhホTUヲ+備v悧ヘkェ梯ヘ(・ュ禄0湾P-U壘゙黏�w\ォX兇献.i靤キEZ+R添セヨ渤6lTゥレケリ癜ェ5慝ソnk=@・vK棒フュェ;5 U差錬嵳欟ヌ5ヒ轍トホッレDK+、Y�ッZアフ・>fhFメ達ケ+Y喩`ュxケTコT4 ェ3ゥ=4oA斷i0Qj祉j\ユYセk3}゚ェOTu[lCW-mQ)CラE&u-ッZ哦篌捏イ゙ンム嗟?懾リ鞆眦レp濬:)ォ池[儚zw・($WK圻・$ナ。ヒ儕ホ:oヘZケ:ノ涓-エFO*� キ�ZZハ�Tネサ,ミ匁LナェzWlヨ飮 ィf<ォKア>LKヌ^ウシレエモZL蛄ー_コユ粧エS%z{�1蓉ィツ]9ノDヤV詢ct\オCラヲh6m裁捫NW>9ヤp゙}nユNシ隰smー_=チ瘍Cロ:ナホミ\<mvク.チ{キレ{1」j了イワ梔R4IJアト(G、Ciィテトl'j、ス^m遙ュレロ,s-|キoネ!Zh゚景SgFCエ-i^5ヨV\ハwコh逑ォy゙)q�葱ホ 菖尹_D會遥,%GZ$BZ惰。H +ヘ<Z.W.ヰoV +.E齲ム゚b【ャFpfFs(酷Z勗「VヲヨEHツG +jトタ慓竈ホ> +ワ ク#T鮑冀フeェソケカw珠ヘルスニルJTク,ォオイZ*ァf」;ンャ<}絅z烈h"ユSエ・ッ '寨 vZ疏.カuェuカ;ォキンrャ#[苟 ラノRQ,ッーVネ嫺rハ]=常yLナ3i。pサR緬8-N]イィVメョYツ1K7ラムGM犁ユ簗艇HュqZロ(-ム゙ツ8ャ*ョハ)bCヒ8 WU筱@>h。クモクァー顎ハ]レリエkヨ1OGヲ=Z/ `Yメ)ユX辛ッ3uhミlセ,ナ-ョィリD」1MW慧-)エ(ケリJマ8ヤツs「t0!#,。ク梔"rォ(「`?「ミナD5T,4lラトj畏7エD -ッー ェヤY蛄洵j゚ハニホヨ{.ァニ +、}`Lホ惶Eu觴J0ラ憬K0キテェ +%假ノ瘠イ暉ュ9膏9ュYテk|橘-ロユt?t-ア [r]Lヒq~_:ヤナヤB{csヤTヌ[  #ケ'^蒡h濯オ2羃Yヌ恟ゥロヒヘfセンニラロ�酋>ワニヲ|彪2リm ・オx}}ワNyヨ'ヤヘ^9カスrZハ電箋ォナ^ケ鷽i5ロ^yysh|wql総ヨ攫゙ >ツ擾コロ@譚Owチ%~TテヤツdN叨x~アr僵 ーセコ0Ocテuo蟷;ヒsキ颪カWロ^煩浤モn>b<G}Xフ瑙ワキ~E嫌クevyュィY旦ロト?ュeルルヘマュワ場裙ヨャ?サf=ヤウ哩ロGE鍼ュルm!jクトヲx攬嶌?U{k{o剤スモm剰t符魃エU/k;/笋Pク3ヒ<MエkオФ臨pク 9^ヌ'o゚6c}闕サリフ辟剥в*滕;ル、有テ"榔.Y<~醇罅、ゥレゥワb゚X,wYチ-マRux?]Kッ」?霧\ッロim鰛ウトmV)ンハアキbロ猖uセM1%Aオoナ1fスウlKレ゚Zヤ~隱レ渣オ_テjcMOヒネ/ AOユ畊Fタ7ォSシq砧ケ苡Gオl暸1躪 +ケUL^儻ゥミW枚s狙コノクY鑰軣サイ;苧^ ハ&k3咏メ錵ソ' wヤR~、゙dチ|^O4ナl宿E劵ツ羯ン霆QトY/=雖yハW髪)_ヘSセ圦|5Oj橙ユ<雖yハW髪)_ヘSセ圦|5Oj橙ユ<雖yハW髪)_ヘSセ圦|5Ojニユ、|9Eヘ#、罰誂<cM:;曇ハMzS5ョカ-9カNォbmー_カ(gYミ鰆Z^。躊ウAt^#~讃#_Ph1巻�g2608 レ[ィbャネ左ツ}ャbユwdヲ_ユ(ナ。モマホ場'ヒmルSイ^ャ>ナカoヲ 「:sobセj峽故SキY+簷,フ*我キ骼vRM[イヨェ餠ワ兔t'ーBuC-aキ僵コ{T姙`カ杼;t膺モO匯yル味ルサ嵋R *N拵ロDIォ)Rカュ' cィォ<f豆g-ヘ@クLネZCXUX寔濆機:Rッョア?5NCォe^?s゙ ゥヲe゚ヒ]美R}u[\オbZoopMメ、レ」RXYン|ォョ*_菽}アャVオ罷鹵ml。.+.婿bオ*Xロッ」夕rZア敘ッGyW]裹゚`d!x-湶x縉ヘe+Pモ嘩ラメュAコテ疹w +苙@エモ鎧/タ9唖 穃ヨオ5 '�チi。ッシカuセGc"�テX・vMュセンqミ 5t"鰛ノ悍2ゥ Mn4チ」ス・ハx?メ8メcH~オ1)ン>メァン頬n e゙簒]#} +茉iDo7ユ」W>ヨi矍ロゥ:{ホp雄辟慚ネ湘j瓔~コカoコア銘゙o+ンwO狢ミ/韆リテオユ|h>尻廡ラr矼#<vタレ3イ[ノ ユケ rシ"チム6完9誦\i]。熟+=}Qロr.3Jr;渙(マ」zyユモ 5xU盒)\氏aアカァサ蒋pホメ 4悳儡ufX2D了U妬ゥ$7jフー1胛ヨb:Dnムb&B}カ墓ヌfX95fワUP]G堽ホ4被ト牢Uf?P岔タレフZ!xヨv;t)hキ}一鳶*:y禿モs[ユ悳Tモoヨ醴「璧高ウ(;Yキ慯oLl- +趣D゙ヤD゙咀So>ェIsh\&ミーQqハ芽ロ+95R4ュワ 尠3リY`M(オgOsv<=v*0ヲLプfヘCt「セX[N蠱\:ァL>ウN枝u9ャ9ヘgムyK=?ヨモ`?,ウ�ソ姜Vモ`ムs+イ$nコ^7ゥェkタ榲Tソ�ョiケ5XxQ~4dXG8uュユ ーヘ膣5ン=苔C ム:銘66<ueス。' ]@ク9Z=:ゥ4|tVAZゥツテξ褓N。y%6キhツk゚フヲ!ン」 yリセマ9;筏:メゥ}覽擦'E゚ュ'暝C9アモ [Cヘテヤ辯M@r^U雌`xー竹1q^G>i.コ5z・?ノ$ホ�"W撥9燐IpX\]仏ヒVY鮒:u;Rカコ靱ム[%zクeワォ?(マ6zllォ=Oォ@t~lァタ!(ノテ゚<aウNヌユ猾ゥ}カεNセ[>o・=Cカfレオツ'ル!ш皓yヲX +マ1ネ.AI悛ーニオタyオムzx剴粤)゚ュサ蹴セマヨ泯zァU`~ンコ[カ^マッ[<i、臼8胡ェヘ驃レg屹9鰛ーI]xシキン贊lmィソク|サ=オ繚サO:モM詰温楞ウ゚9?タu!ャァカwクト5/Q徘ト鹹8Gャウ0{モz5|yラ ]s副Z.ォ%zSオラオ」&オ#nア_eカツワLッEoンオ慊jシサn゙}.疆(mオ肢ルo2wルs7サO \ラ2(ツ竍U迺メキヨV9vmeョマFz字孕ケヨ=Oウ樊ヘァュj肅ロ浚mテ)ゥkロ$ェhテス コス zツ゚F! +イ5;X25汪b哈・:トヨネH<0ヤahIv弖nー゙祕0;+コXs8-スVhケh"OGXャ劭&盟。テ」|マiーTマウ%y゙キ"族Q,撞zDGヒ [37ラ|ヘ5E3テ,ウナヘy 5 +pヘ]>7鯔鼡ナ,iッハトチ ヌXVヘヌ圖ュナ)ZQ3ウャレ`ソ、ヨI6m>モZba'wg;ゥ荊ョ ;ーx?<Z;ワノャ殞ハ卜8珮、晄 稜4エーフンI貅ン^コe放yリdばカtwレッゼ8ラ;レ6ンヘヲ 。エテサワHミ常爻テソEn特}Hコマuクウ) j"ク墻タm2W-アAYh'駱+蛙フ梓mチ.gリCJ6エコ]KユョZキk>ゥロ・`kイメ]オxラェ|ラミW鷙]_スォカ・ヘェ淡ラ3ワRヘォッァpョョラケ鷽l}%モモvZ゙_テル蛋) vK=苙Bbロvo螻ァe・a�Iソ套廼WX/\9Y腮"雉ャンUYヒャイ踴*kCWf kヒ ,ラ2kイVョャミZアRkjィ=:+ユAチメス綱 'ェ!モ(,ャ,ャィ% .鵤ソコM ZG~ 巵ッフ∠Bタ,レ,ヌ v0g�e1t. ィユ峡ン鋳姦s -!ス?。゙aUm)�ラキ罔抬メ*ォシサ;ロ<」カチ"レァM(d7=n;ワ畸ユュ9カ&jNテヲ塩帑998ヨ,{1劫撓゚核ーコG>cz懣4ニ%X]@エ梨Vコ亞_9ノイサェz"イニユy迴X?Iッノ ?^_ヲ3輟宿躇モ&q燒q讀pヨV辨?ミ.ケvンF* +w ャiンナャイコuエz Bュ$菊メ2v`yH+Zセdn檸4゙痙oレ:i遶、=0w0YEィdラ-耕Uヌj扎ェaッ63戛6カスー m-3hc�朏B +Kテ<"泡浚'_ヨイ4Nテ@宦VVノ$ル凩?ョ沙ヘナケャFルィリYx:lォ{カャ嵬0モ「゙^8蕾z牲ヒwサ?ォソ゚~{?ネスッスキsュムkルzカ\ サウ。ネCKレhMモオX);*vッuァU皸u魄ノォ謀JL。)Pn2キ0趙メウnノ;ッテ蛄キラハヨgeq粫4l}X4ッIレ桀"レ曳N程t+エ=、葹>ア訳@闢nラマ:糴45ShMメス行6tナ`fKSーア,ヨdIァェ%猝シメ7.饂ヘ宙Eワ,9トk鵐;7y蜂tレ凰拉'W襍0无~δ^斃=キェ貫%ロ判メr詣;9sO゙ゥa摶Aァリ僖twカロヲ莖Fbャソvl]馭ノ'z穡QS完シ*Nマコ」ヤK窈ヲqモ 0鼇]+ァ"|jュgウ|Mィ饑V!ト-Wァコラ0Krシッリs~ウ轤ハヌク必ワー;ォ;\uヌキ98<d頴`ホ蘓 yクュ 製ッ$P5[ユ/ヤ轎ウセ k名スソトワ6魃!0u)ー冂ク逵ァナ シロGャケウrワ>ヤ鼬o_Pf&aヨチb0jメ%v(樌58「ラ811アBヤ亂ケb-$b:36RZ[餅|^);痃ノ゙ィヘ艝]"スル`Iォ悋ョZキ7Ll9i[sロy」ロン&ク3mクモB`払sh淆クnSキェ卒rュOテ-NユョZオサ顆エウVK *コnY公5ヱE�%&t}ヤi~euヤヘPウ`マ2{ー レルrj4Wモ}ッ\&WK鑞闇J畜ネ~ヲィ\椶s イEh略5タ2礬oм╂エP”t肝BLVb5uPゥモヨ:8Uア踵R((ンYyQ浦エツ偶チ「ォ(w6ネ梍pイ把ネ耀 +}uノヌ鰕J^ホヘ ホ迄SゥЧコn諫R效マ励\V%/?ョ#スQ4Y゙骭b覓マム&。ZJ|ネ*オオV」抔ナ&セkヲツ{ムG゚ソッラwwンンソzン゚庠庠+ッゥヤ~ネrOAユ\TテcE*dタソ' テシNX荊ネニロ」」8~。テx0・怜n.j?オ沂レマE遒sQRb猴E.。頷uスo+Nq^趾|t懼! `*燐ヨoソト<AIgリ」A狗ンソ|゚�リ5マェ_X*wuU彬kU>鰭ラU厚噎ヌU」*セP8Fオオ[Z%ロ姪ォッeサォユl7汚ヲa滾鑛シ==MヒuワTーイT~ΙU渫Q73Z禝- nネhyDvチd2サ8{0チハ~^オヤ5yケo゙ユ」ーzホ}征キl値柯,寒Tm・ッUe9j,オ^UWシxゥXナQマ娉?Zイヲeワ-ラpRニクァ゚除oォ~qシlKNカ>#ロレgt=゙Rヲ夙ソ4リネJyxエヘ諫ツV 魑A、*}ヒEラ゙>ツァ:2ハc゚eQラなォ單ュ*S浹セョヘ8 ルm2ョユ<\'Eォoオ菟エCノヨLr嘲シー桜ミシo)90擣セ諤ュ。兒コュ棋>+ァ0s>用heオヨfョB-ー;Ud位ル-wp^ヨ莽fV 'n;W2 ヤaiメ $hホLu 悋轡楜蕕9ハ排Lサ=aン觀wソcン紛ゥサウ柳燎チgテェZe匠ン_SlU癸ヨ kセ/nクスミチハ]邂,タ+サノpヲリチルLタォj'>ニmカ歓LM!uメE賭編9ィ輹タコテ-`蚯カチヒUョ゚yxワムン湘」紺ヌロ鷽(コ">vdオ&ノェ侫ハa,イ\沃鮎ヲイホ3擢サミRF準kツ-ン」#jY?X腋ナッ~ッ襠ソ竃ケ・,%*& $ニぴ>Ejヨェk゙/ネ5J5uケvpQ;Xg蘓|+*9榕メ?コ/テセ[?ァユ\?コァサFNムW?{籃ロッセモn@? 5/?{ヘ娶ト{ク�hDワWB +'ト f反 "\コ\ハE(EH#)怡;徳セ蟇ホ&茵酸。O劣ェ/~rgxシBOケラョRシJィ'WコqOmw羸ヤUッ葹wo゙_<糢ォgo~wム}ヒ具~d/ォ/^シ}跿ウ!/_シxyマo楞葢?gマ。ハqアぱユShA1ア}^ヒ.女。bマ^゙?y&=トqコёvQe賄}eト ャキA以/}!!ケ賎梢xホウ浬ワ /S)"コ"o"]8.愚ル ケ突2 +7r!\匏zb#J"サ/G卍、ネt%ナ6ァ!"7蹣oIIq∂ヒFb像IU;"ネスサー 淫y\GVェヒqトGN欲褂e\1]侯ヲE3・cyレ輝DヨR飯訊ヲ| %PV∧テ,ヌ jケタヒqE゚シK.ヒ怛"キ,.ヘィm7 *弼ネ砲ツ懷僉HS、L「スエ董Dル#ク'R廷WレUzI =/]B[堽~ヌeイ憐' ルk/テ丿挌・ィ3「#マ)s膿dニa:*叶楾Pァヒ"z豫>1ヒ(ヲr9%烙甌A/X0゚%wナ冊剖 +MSBr 6kHtィu誌ο純B 腹xイR0a卉ケDェ蕊Eム披f=3L-Pロ竸fK5GヒC諄Dn睿莞Yz 硫h;ウR3fSHx キ!Yoc幌ソaQ3汗Xyシモ、Gヤ9謡コVR詠>ウX冷熕p3珊トY)憫f[浚 艙「ャ@ヨ/S萌-JィNォgR&昔|m髱鮹Sリソpョ1%N鉛0 +゚癨メヨy"L:*犠ト5マ78)0ヘノ#[)<sn0*UトC f軼ヘFe慶繝r{マ閤珊]燒)QN*i.JXq]戀釛手`ニdコ(y跳Oョ<ヒ「M#ヲ3MメMA!蔵情d!チ:+┼ヤ薛Zト -Mcミ」fシr。d$8ENモ リ""欧[らE舫Rツ獅cカP關.3dツ)却モァq眺J(AFケリ笨'羆B舫Fイノケネ +畠w9暖ナ嫁f"マ碵ヤ25Cーヘァリテ∬/ .sb2セ,Lヲ敝 -l[娜<桷}ヘ2チメィ]};Eユ `キz舫「 骨t 6ミ「ミネス{XZヒ$+」q琿 ツ@ Aエ鍬/<\ケ揣= ヲ4A#~!A゙\彭スgケA「2(S゙チ弦ヒォAj)at粟疹Nf%,ル 。H-G0:ノ魎・pヨ9d"lッフz就6"  菴d リFC篥沍 m"ヌn「B(ーカミ゚4ハ垓モ栂,鬟ネ數j瀬5flhE>借シチ DMチКルトE)/Fョ6RF0B!{2Q「eレヘ鞆ムta忍1饂ヌ^R z5yNヨヨr晩U 制.я嵜枡4儁マXセメIフ /Y6zコ Oェ辿鋸D =*14ワイシ<エンTp錨"ル疂fヌ^セリヒ/ョqO2肄虍ルFdb90ま2fF発IヤUス'aHモE9+紕 @#ィ aフ(/Lbbケ&y!ネ!麒F微8 +7淵м; +ィツラDィサf<砕e教隋崩Fーヘ`オWP 」YムxZ累w ^サ0<将 +サネ゙ル境c{瀛B、%G舛ト,ウXグワ0。畢ャ「隣e=A'H 割「G蕾.悛B賄メ羹S;kニホ屋 恍u棆dーCRuカf8t$x゚ネS1 +*/ル\ン迺Iワyな團p!ソ4Y逎 +,2イ:ウ舩8Yノ竦オf2タガA、@"j「�楕ニ"s0Q啄ヘマ*伎iケqEハ<ヘクkトリ1м0RhホzZム-犀ノ皺サ塀ヲ.[F.Dヷタウ腦`"゚t玳8ヒj(ハ]d'!o背0ヌロナ莟譯シWフ<UカGY$潼}\Nケ@「拓MQモn員jy行Ln6ク ツ浬「ヲ待F}0メd 」l:I摸怺ly垂タ~闘%X +OtIeホ蟶QFsチAノ9#kTRq:森8LD。�ルid, ラ6lーヌQ6菴rユFCミ虜ハp 拯!ネホ"犇キI「<jチホ STト9呉+元、F瀛イ。PメiG坤iキ`sGHミ}=ュ1'ョ-饅N怜/.謾ウVB}ラr廃Dイ峡B!@Dト紬Ju@舮、 ョ&ゅヒ-コ +チァ6v2リウネウ Eコ「Aク 膨?゙4YワSD|!&D逕'A繩网タンAO�1コβ.g2BムsGャJト拓0蹙エ輩N゙┃Gシ哽瀛[ィ儒X証E8テk<.Jz#NP.Dメy=儕&k\X0JィcMiキ!ミS=馬メ ;%投戳献ハ+閼oユ0駐A[ zυGX "(ラト擱PtДK有Q4H% d按!ルsヲ」ォ録O岾mハヤキ#ウェ(ル!ォSェテxハホ,�責 Nホ娚g%頸ロシUt鯲F穐8T>ョD鑁ニ疏ユル>焔Mリ ア$ー゙ャィDイ(!P`ug;セ犯ツ腮c#8dx?ェリニNケ・*Y)cu ネロ("メ^`wLVdyケテ�vT儷%ハ協洽ホ]I⊇。鴿i尾s椽JhMs*J$ルム~ノ- ;ゥネヘ獺Q,,}ホ弁d=マ攝NヘHカF2b?箭P-オUン阿l「毅"2 聞"kTw+hヒ。 +S�ー nネ/K蘖4ュ\TニW= ]<リ#wKLg[Jw(★s;ワ~QXC" +サニZ弄J@@ぞ「l F ムイir錠"'ィ�タセ3.7防ァ解UК 1笊ヰ)J'ムル{賄ノェI"クノn NT襃肥E紹m�B唳ヲh}rイ8AタvDナGヤヲdi長�4NzZけ・ハ苺119VuHV~L茫 "vチ娯ョ」 +�z-コネヲ4Idロ*$l.f呶、Re#緯拓Uモ3「テe!狄ナEュ ツ�ュv]ス リ 膸潦z&&y濁エL輌タNンf菎]gワk�J6g・PT゚ナ3サラ3嶋」ヨ溘aワ\Rチトxヌ フP,シ 狩31/ハ41=!t6捻#xセWJ �uニI zJタ3\∵3*Zニョーy"ィ ゙lッ:訟8B陋クホ�3<〉h コt&4ツ チク氷<l%/ぢウー、!O才wUuFBミ倦チQ、FソJ/ハ麼・ケQ?hKS狎$ヒU4@ケミャv詮ムロHZ7*$On鏈」ケ"レサスI・:「ネ_ワッ}QAポB8鼕h7閼タ7ノセツ、Dシ%R**ルヒvP@―崇1ネ1f゚ホ<LGル'�Sdp゛i%,3ワ賜飆 ー FミWSQミFナ~_Z慍イ↓Bヌuキ^)マ v・ク[VjネオケVヲdロG !ー%テアオPoIi!。@RゥォLv*661穀W3栓a゚&e:sタ@ス立zvツi[マ4N+8;(3!ャ 杠ぴタタ肢[孝$ミツ7HxァL(゚QイS) J附9サヌR� *'.ン(マ黒y ンq2*「弧cN曇5nb。虎:オミrT#�,!)&ツ:�i?*叱ツvヤオ剪#麿A・さ=Nンク%・N@�I、�R マト +qヤzヲョ佶、jPdンgEヤ。$6=クC�v&6b臆旃ク%Vヨ寂セフJタ1 +チカ7ィ兌 ケ」霆壁アスオ絅D 0�Yu;TtOd<)ッqムl「濕ーmAネP +lLトニ |ツ「 4=1正y<Nl凄.iテFp!リ+EQニィh」ツzヒス酬tムQ鎧YフJm>KZ拮s・チ街甅\UeyedクノoP&ァ@!キ&BMU・$包 Oホ }? %+j兄A゚ホ +m畸&譜prハミク}Z:款rウ;「管※リ臚n魅ロP^e>C雌ッp蝌l:ニ巵P鯖。リFアヌ ワUb%リ气P7JV ア 、ホ�ア5祈ッBi.沿オュャR黐 <.ヌヘ^ナH_`チ\(附Qゥ2kiモヲィM」キpャGnX0 紀aVF2-5oタヤマ)s'�Fナナ!gSr#gメZ蟆ェ�ゥa'ト破タノ果[ムM薩ヘDg桶,U$a%廈罌#J 2ャリ(リ"アトJ_lv8 澁・cレ!覽V�<xホUリQ・7ンシ」ン b\。ヌC堰批漆C5Bリ婬ュゥタ迚ヤ佳8レ +]4@A審"P`レ[A4鐡ト黹!wヘタィシレム成C靂y}q-錬芍6N'メ mR3q9。@ゥc_ミ?£喉G詮"=1( }�,Yムミvャエキ甜嫣f"ロ≫ツ, +カ病瓮シ�4xbd1qリ/�マPkタwY!xeZ薜」pA-川A敞Y岾�ユ5ロOミ0黎u4"ワ 慴j ーD~c然m4%8チ蠣ャリ +0締、ョ語0Q:沿ゥサ9$マ&2ネ8�]cza!ヤ;ヘц< ;Vェ+辛でリ@tt鱈ノ|謎6<ラ菅a)&?+:鬆イTムェYP'ヤO(}R" ナ篶ワ@ォI、<ゥtN"(ja1」Rhォgオ聳クョ`鷄sホvMB:D魃黌BM、トUpJ2ユ2�17WフPホ;"マセ"ィoセ3'@フ2トイ敬ヘ呉UV8ォ∴`{BレD8gu*p「ーG壑04>フ榔DN*)`: �s蘰謹/+@゙ヒoyワィセ ニ`ョ/:{I ー゚「ツマ彎El +[レx(タN@。 +FJヨ幀O@ミ$~ユQェシ5p:hモス頑謔・J\:ユーモ'L=-K俚モェ)勦Wケ汕ン)ョ蔔>'(搭ヘ妓_^|oソ゚=W?讃9Fェ繻 +чタ'埀剣M2rx?4キツF サa核ーヅ足ヘヌゥテhA(」,Z@ーAJ罌S+\6lzp�ヒー・EG ゚ォ)q_賄ih働楪;$D0Vーq"#リウチJ琅~ホCメmHエNCpvUcー"\C我&Pヒa怛cヨ 燗BX,ャ&vE|听疑己マ"ワ.zォ3/ネ) レo7C fi5ヒl圧ォーワB。n_Uル咳gu,)j痃犒隕&LU (& +ユ痒Hチ ++マ +゚Уネテ{ェアρA1-*@ュレ ル・\]シしリwニx帖B"TFロニXキ Pユk TH炙)タ犲Dコbレ$(ヤォロ +V*ハ +」^ェ/舍、琶q5。、;ロCB}モユ hミWワ4褫X}ゥ|V科Uヲタタ^オI┻!ュu<7拊堪mオpモホラ5咸/.ィ@ツ藏U)�8貨樓ロ4);&d嘯 +mJ&(ル憫Dヘ框k蚕0鍠'ネ、ホ\5lz.hリ/(棺Q戝ヘCи恬ヌノ&sI缶|qE阡ネゥ錚、 サヌマホdi*隕a・h�γ!м+"鬼ヌ?ラ�<ydtネキY浙梏ェ$ワヌhiTU擱7ッェ佚.UBuF、?ヘM3:Zハ萍0HL +リ慨,@:]w廿DBBヲソj2ヨ歳軈7A_)tjjA伽h�F゙ 1仞ャu,ッヲ/,er<「K|pォ1忖 2ツワaV4TtLOイG(激ユセj蜻v8Hニミ 0Sカ`ェAュN」コ呆シT}"ス冤p[#旁({タゥ扼' 17蛟iV<nィユ蛸b=^キ(NイGァ。~゚8 ?。l2=f浸L@Pニィ^. ミP翊>A廨ットレ9-COノ~?E b/D゙<圻p。ヘ,@せ65テ$ニp'ツソ`%ェロc-ExMィ% *F猩7シフイツLニ=ォオ9C践Tエゥb廓$ アツJN}ыqモタホト%ケCエ,、jdモ」胸7゙「 +ワhYソZニ,}<ク!GBLdコfッハJ、ェ籾ス75cニя,酌rヲf3^ケBネ)稜dBLn塗Aャヨ1ц8,'俥忝麺セ、4ヒリQ、;m\ +蓑^pI�5`aF、l凵朷h愨侫N トv+防. >剔vリワ�ユ]タ Th剴タ3pU鑾/ユ�ニナJト- ot(覯y0X`ル,ソ&ワFh9闢eツ2ユタ!ェcェAGgヨユ?UセSヌワヲ*ト」r3怱ク!Dァ)┤tX{CゥO渠'ア陋沐AY。ュk4ナ.整&ム7タ'ト!H臆 ャM*驥問「緜+フ�K-ツー倭2@Gウ,ス^ヲ%|0ォ}dB!35霸}&ンア fテX ワ6usネXルa8A1\卑2$紐Cェ7l2?ーレ慟4フzパEュヲ,メ レv^HC據gs-ユモd/ K!ー0。ィ 3カ旙^@幕ヲチハB・ Ln找Dリf鉄モ!Oy]Ojt{娑ノレテ フエ=Y6\!タ<`゙≪トモメ'ォケ-z]pリ扈�ィメ'缸 ト1キモd$!P慎ノUoN%x謚ヒ4潛p�佞 コ#ワ`*e$ゥ榁モR3MPE、昏酢エE#`J棒ツl 。Gノ枡コd聘ナ&u牾XUリwiJ贊u4h9Yイ゙,ノシpヌ1yメG孚Fチレュセ)pM・ q、ィケ2QQNク1蛞澀リホX1ィ ァHoユ9_Q:メカ綬RUp%J(アマC沸サ, ツウレーVサーッ゚夸ャvリ`セヒX゙^И障HO*レケ&ン及h*ゥXムJノ゙黹・*アR竰ヌ干つPh・ヲGロリBン蹄((鶇'ナ5`['#G>*ャ7フサ尊^+ッfV5o&"P,%P拙\錙Tヌ_クaッ」姿< XZ$@k|S G^Q虎漏オA !龍;>$x -D5ネ陰燻<aL92fU掻倶}F] +<xシ:ネ4X籌ラO峯ヤ>砥ssTP焜j性綟 [.sQa懣韓嵋T0.曰ツク満=WテU(ッユ +nゥツgレ閭H6jWレェ48 ム3。。@jO歙8ソdR!8 +c粂I} *ンZH送席RL +p[クfuセ、オ二}r%fAdJ Hn鼾|カHy掩Mュ@fヌ$Q杖猩0a-棧S5ゥ討3:;テイ揀1オ'エムKlヒTス!#| $3Zネゥ澱」爛R1寞"$ナfタ葺 YeFスbVテ'lES5ghツョ/メ&ケ<cレr"キn]覆Fx椈Db[L +.麌テエ、*)犧DZ@勠ネ#祁bケ被ョヲ聞ハ +ユセ`凹ェソムdチ'シ xキ r嵒adチb:コ乾!゙Pスフ! :レォ」Rゥ9Y袁「 ョイ�J +_t滑ヌMユBリ,ォァUョハタゥ +X5カ淘ト_リp燒ムシbチpー鼎鏖キ0ケ=ユ@<+閼iテシゥfU/ャャoャヤ2ツヌ3*!Uク。%ロaリゥhW」Qhb�シyゥ+QV%エ ィウ ]Q゙ワl(ュ4gロt\櫁ホ ホb|<爿Kォ&dナ フlノ忤ッGvd8沈uLニシBz^ョNミ{gVx2iァ$($タYK彗簡#fフzLfB映,タニタKfィtKカ颯ホE'ヤィq%:ナ8 ル♪撃イYワ賂`ノ6ォM`P(fLツ、cPイ棘4^�LヘtメX゙ヌmャ2鰰ヨ朮タ綴゚fトイЩ駕ヲjv--B;p m'TJyア・;ァSd鸛ッUm+U2ZQW7エモShT「ZロNH檳怕リ壯i�カ`3コァ麾刈+n"ッミ%」チg」 ウME]」´ーッ�ユナ協ョ5|(蠅REcQ「4'�「ツ@ェウ.u#・:~&Zヨ_マSラ燕&ニPャモ!p 、Yウ」~f認?猝ゥ倒「m41^IA]>aAマアコ%�テメネ0=C(О萱渣8ニ +Qカゥ投 紜髏"ム6$OレVg:FリML?44桜)ェ。坏ヲI9シア$ヒ刀M8X|$ テB圓IaH船�~\tヽ5鎖L&「lミヲネゥ<ロk.v+キv�・3カ9lーKT5ワцワヘロ~4Y文フ悪y? -コ"ヤ$8:>ト;RN +-メ8+h\=}狢!^0B4c +僉Vナ^f典 �BDノヘヲ?Cヘ6&テHDQホ ]脇|Te ~L剋A肖Q葉8lモ_1勤&]瓢ッ+」ツゥTu炯)是:V拶ロu广ハTaデ男Lノ~饂ユセウ8H3セ0ハ0ゥh8捜序yDCRリエDニメア,)ホ槝X +BB1U Ag比DNLzツCトr■ニ2EYナトァーy5タ_D|チイヲ齧白厭カナチi┗{セ惧鑾考<「Wムy$2H8゙;c,」a べb*億ムモミョu櫚(垣膊ゥ揶c陷#妛Gネ刄・_ワT〒!~o(*3TC!ェDィァU「3ニ$*6X0SFC・\ソ$リ7!ーヤcBナdA財8タk6\ナレI<kイヌ6セI繕4`Z," x08妣qメ8fToロ7jj&s」�#<dリ,U"Dコ陰、ウF  #fヒソ簣◆ァ艮ュエL9ヘモV@=ス7゚0G0|I&タ@ウg, +゙<<ニ゚ャ.ィX[鸛a汰ケィdK裡bルb$I�ソ�h∝TFンWぶA サ P'囹4V=゚皹。'ェセ鎖膿Rp蜒ネNRー"uサハ肚Nヤ 鳳9ョ +ェQヘ[dc5ゥキS_+sh#Gト.tハ9ワd9・|ッ、y<絢メ而タ「7M`+ェqァ、ヌeソ淞騷。ヨ(h-ユ趺ヤヒYzz咤右)@f棗HワA(ゥ,du:弥虹 +\~Eヒd@&。・DsUlYCf「,リ訴ャ7 x�RT$ン。ェノ2クA@エ!2X�=!`クSh2F(ム1tqメtヨ坦g符@ 砺メ馬x*碕x2hG4Tjニィ 4f-uUF穢ワノ< @qT&K+P鳧hpヨTEJ`刺ケ・@ォリ:P\lムt-卦ユf1rハ Eキ゚「ミE」b・)廡韲%カx酳BッY雁*ノャ:怎zィセ ヵNJKp |1餬%ホアGRィツ舟1gェケz]ツ<5j<孔ネゥ頬 モワ鞨+G#9ユ胼[(エjUヲオPヘ8マ}、XFト!Cテ{柵ワ煩華ヤr\ヒR部ル盗4モ紆ヨィ^ヘb8タvreヤlf U +=ォ語Tェェ ミS弸(x゚T1ィl>+Us}0tRk砦W_ +\pルNfPトテト>モ鏝釆Ub。ツクN>T".:xユ m擽模e9p$RLRモQb+9uコ:500屓「゚ハ0k"ニ`'ェV2K"gcセ。a区D&ZイJ。4ー0jケAウヲチ8"ハPセヲ/メTケ/YtGヒ4FャXフ陀T」コ!・「茅/ZK�-Tzス #ツp「kQ腐&h)[縫ッイ{jセハェz)2(ー3}Ziイ吽N吩cnヘ0ォd核ォッ ^牀"慍 }M譽=クX(PhOヲAセ 58Mヤノ、ヲ<3Z溶ヘユ樂8s)z$惚マ0yーhfュfp・チ>rフャ|o uu 鮮VCコr^Rs@ &ト ノタ>8Oバ +"}チhヘワ+コh鴬腺ィ信、ヒQPa 幡短1M?5疑定奈,仞絅aH H携SY(セcJ・スネ<粃K凍xXsォ %ソrVヘ旱�!ネタ碍ヤ[エセf.ーs針フPH:「 ルーxア嘖-hノG白- ス施#2隙pD。Q濠5ン松yヤェ6}メN勢4コ?YきサクッF寉:Z�zィル>aキホフN震�」ヤW:q]エ聰マ\ァワ藺ヌCoエ遷ッC熏エフモ T釣)、゙オュTHS゚dtYl0ウ- rqfKアH9リ~ 1?VモコウネkNw覆O5t弋 xj゚゚Uメ綴F「g6ェチgt<ユワュホ8!メサト巌,ツ`肚8D裁フ獺Z(tl~T賦 NK:イ.fNョ$愼3魯・ヤyタ8」9<z +v憂ェラlウ譎弓hI「頽舜K'ネFムサu +.ヌ5a9kヘ覃#2袱メ蚶4kコfo#&Pi、ホ鋒ア槁lナ克3tyE尉tツ17jクョiァ睦ィオ嗹イh$On3「トロー礎想aカT+巷ッ,イwスタ`レQ,UマlTトサミォP*0皓S(イV4杆メb胎l臓b6oル騎ー@譖ィキ`k!督m06U}Ho0 Y芬8);チ掏65ハャHsロ藍ハ�d!逐E^」gE!ョソ干・。毟.ィSアコ俎p2」ィ3Bョ-諞M械ト悟トキ阯;k6DD0qハ`wーセヌEユ゙-OlA$ M噌)+NミィフイテD框A陌+・ニフ&愡ゥLoTマeヘ帥エ4 ^「5`ロサ仕$ー舉ャU��ロbV)5テャ_)ソ5atカpS盒矜ヒミ,トムE*タ・T5・ニノ射2Uハ\)suhア,[2ェE呱a >HP? Kチ[OヤDxd8=劇 +エ僉*スe_&ヲネ眸ハラ?khp頚テ[4・(ィQ1ッケララヤー'ML� +Et=YモiJ祝菻」F゙2P}EQァQ朷ネァjc詼欠ァkcャ'Fン"ェNB.ォ-エ7k叢フソ「コ`載^(pホィ労U7Rユ~Fヒテ$フ�ワ僖鳧「f旁択麭�]ZD.s胡{sヨd/H^j「b.。 2F凵遯cロモ病\チHル8ラD稜K*ョマ#z2スコ2軒茲bJ+p@ロ�X賄uY*ェlノ。ILzTトCWiーm`定ァ:r ン4p泅�[FネE*6恨oエ@ゥル\ W)抔q;汗a>5Vフlォヨェ゚U54 f=x&*,e巴臼扶q.矛FT<ョ竡9ミf,璞\盾セカv゙西uj苺ス&>joq「摯コ�ュ W J ユv`Qdゥ ヨリ&急.6�z3C)祁}部弗ソC「)凍スO+-A、ヒア.泊fウ8ニ0zユ)餮nr蠖0&チ;DチセR>ZNq#"ナ�1`v愁e^#ッ 。゚+?"レ+匝+カ啣 =cU+┃Jゥ{�kヘJト篇ユMェ爆GオオLC@冀伎mゥj#古冓エケィぇx屮ニ<(ホ乖ー埣。棗ワ�&K�ァ タヲ6ヌi」ニ6ゥCヌ很P"36綱Oj"リ$」チハフィ卷)蝕>釁+。tu級6"}#a;7Oセnノ*Eb |、:EMS濾Z」,カ*ホ-コメラ」谺{ ヘ1」=DェホhヘA-コリ&0Aカ螢ZvYt」beタ榔$*、L#MQ惶摯.-;3l8チw゚ァN"1楓r咆髦百[#iンホシflGケ鷏抹。タスHCu+瀟F@フ$ヒ@」冖ネ潘5cチタェヨif9"摘ヶ1荊H"望ヤD\jnテ(8コヘナュ山ヘGCOォト-ta~K'ツォチь?ーアゥ鷙 `9i-8 荊s搗;hx{4Tv&Co Cュ5%粘アィ篝HTエh<コ +iLa5ノUBRIアbJ-」痩9儻=ヘ+躱5eヨ"ア@ミネH7>;ヌ e}[eル~l]1pーt34B碧`孅ィナs4憊(エシァエ恁m#・鳶Hy゚ DヵP耗ッ*醍u3ンヤ」 0 jKヲ6Ds[Mム浸85cWヘtX溟cヤXH 圜フツフGタR@ ウ・勍サ唇鼡68君セtナ忽゙ソ�ャ +MロェDD0w筧ZNW鞋虻_ユ!ナ蔦eユ?>ノPケ` ーU,メ忱a<5ォ?ャS戉1Qhコ ン6◎。唹メd J大具}r'頽享ゥ」o>ヘラ7マ゙゙|ケ悛:ワO椰x磆ラソ浹ョリ゚シユヘ夫'゙M輯Xl%z*゙U1e=-DdMュホ枠zン1uニ<$枌ミjウハK。1錦マBc8+#j。1Rb K。1=@メRh舷碪ュメ(( スTE6ォーョ4sモ逾メ称0融エョ3譯ア&ャフ豫nS+3詈ハ"レLゥ7ヘK1Rf Irfb}1PKホK1Pイ従1Pメ幡u1R4/uニHムレ\Vg迎E:c9フ,v汳ィ凰3ラb0ヒ&瓔:c字゙レ13ワイヤ(]Yォ史uニ酢Hカ雕T< カ]。1WP称uTワラ俛誘sハ磐・ニHu~^J国z岶ヤ(2クn]j Tヨェ僻@mキ,僻@-=ッ+昆i2j・1$ +$、jョッ┛ホX#ヨ2cxWヤaダdカ盃1MH鮟rd参后?j擲イ詮ユJc�l-ZdニZdシy]i ノ+|ャォ遜B輹。1メ,ヨJc、褒cdGォFヨJ国:Y1齷1螂ヤ仄)キ.5,ャーsDuS\J、オッ4謇殊�塒エメ8瞿8。ユ!1クゥUA^椀僻Nnン.ユ*(DYヨ僻マヨXュ4<uKォ4倪s*}・1メbqK・1R褒cョト。ャ+クッフL話Y9@.・ヤ(Åk_j,xV囓RcチモソhZJ拷T峅.50膨.Kゥアタ(イ阯Rc!0弦ャJ国侏シ#%メ`fオニ@A。uア1Pテ4讌リ(ツbRl KY cH鳳断ョタシ@モRkt(6ヤ~霖・Uア1肛J+6ニ」0Vオリセエェ6「+rンZm РアVmL6クェ6覯B-.ナニシ:#.uト<sアヨ膤mフテスN_(,儼mフ」ヲI_m D゙cュ6Fツィユナィm@モ~ZQt7゚ハ香タヘエ#!`リコJ枡碩ルハ酵s啝ケ1OiA睦cノD\+7譎9ヒ5┥rc ムc杙<eャ<得ワクIvモエナ<ハ9キrc a)7ヨhVn狐チ鏈ォ7趁ホZ_oフ3ンt遣゙ A獣POテ=ニ<c犒Lxノュワセ0ヌUケ1ッHS+7跌ョノ8VァBWnャkケ1t>GYオト4a~Unフ#・Pふz= +ミ5ナZnャrc更ヒ酵&Q鏡H」ッ7 Fアzcョナチwッ:#湿ヤタb -笥zcョユ%鵲ロラ卒Vュ7豎c決 エzcaロqpォzc Fェイ肪 Kォ7假xNォD ホcqュ エD$ミ}ノル駟h`艪轢ュフZoユユホ,<。+8eL>キDpル装9オDH翕4ッ +氏Hアョ Zo"カDフ)Ьョ/8F「1F-t鑑<キDXヒ鳩zcミ脳Kォ7拿nヨキzc0ス譛メェ枦椈I胥p/ャ4QSTタ]磔]チアラヲVpLUrラ鼾サs~Uo呼QΗb「kマヤ +首b#旻Zチ1<\ヤ・W7ヤuチキD災kエZp チ ・ユBb F0hォDe暑LVケヤ ※キェ7」竚r歎o桁gケgラ:bャOL繃_o窪e=トフv|ZjスアF齏5bュ7ニト)!VI,0橘Y _o 1タイcl衄。/7カュワX6Zニヤ*横�ーーVソェ75ホヒQ,zァ 匆姜I聾ニHL ゥオヲシホ技o,0\老ニ@ [ス1莟。ユ tZs~Uo }ュ゙kマqj・トtN茣ェ7ク崔�ミソ廚+8カコメD ムミタ(ヌ\Z)1\>ニ<ッ +斬dャ(@ォvc5B_pャkチアタ Y。オ?9ョ*斬ク)カ」錐"ホ天k゚劃更+治セラZK 5シe悪劃コXqLsォ8ヲitヲセ8冴ムbモーZBョヌμエNヤ猪 �c躔p 2[チ1=b檄Dタ)c`_{0}8PK!ュ タゼR/佐>翼fッ#X-┛゙リBエzc〃R飮チ1\ Q沖Dシ,浸p qモ +1N)喞J Sォ9ニウ&ツF*コア_n+]ヘ1$拐俔テb^,穡!t5ヌアヨ ヤ ヲホ、cX脯マケ」2ルモD揖&ケ罨$ヘクォ8ナ/%エZb:+参?b9 +奄ー!ヤ劃魂Zヨ氷+8エネリ*Vt~Uq,兼 オ禮`\M均|Aヒ酥Uノ1]オDBK脂.|Eュ 呷XーF之r rb 夐ゥ#ヘマセSぞ」ZrL 1ャJ氏d渡%ヌH�xXK資瀉Y沌¨s+9B5B|列フ}ノ1マ=`tュ苻G:$弋K拶)�チ団^s+.5ヌ@賄ソl5ヌィD葯鑠氏&スヘ1%茎ォ9ニモ0屑喞ルc姦譏gヲ0歇ヘ1@セreUs 噬毫+9觝Pyュ膵#%ヌアテ{#@゙J孜跛ホ劃榾o}^*孜8ミヨア劃r;ィ8贐ヌ@n +Kナ1Pd殳Kナ1マ`niヌAMirュワjナ11アカXWqフ3S=眺笘gF~ヒ故チ秘eMrnG魅ロゥ~0鼈セYワ9hoロr(� 、算辧rワd^リハ%鯖CレA鯖ア鏗 ヌ,6{芯ィ;9ニ#迯翡 タンネ1}」9勃ト 齎Qn靼V:侭。~pナイツォレ゙リアシ界、Cヤィ汰u +pカーヌア *=ィXVタィ傭WTコ弱 +ホt瀋Gケ當隷アL駝J耆$ト| u誥瀋R~テe>1)[繞終e ワ1毘C鮗 o狼VスモG%XアL}ハJ|l照(広Jツ|l |ィウjLンヤソ Go焼ヲZッテj,n +ウ〕n ナ 羽:|8辮G弦[o瘁ユ瀋EンT)役孑 :チ>&蚰wヨC!ロsテヌ、碣1隼黶述覽D丞~舒 ヲ ;ハ ;jタヌ(M!*-/|フ&Z~a搓i=アKルア」5(SネN璃Cナ4 +撮J驍述テ>ワヌゥ@oヲテヒャ膰zルcR゚,Js恙R~ルcィ<0チヒ歪onR~モo}ルch~ヲウヌイidサ=v){ィチン>マSLアョセネl^ア圏hラqハュケ6{,kサN +f銃IZ:{Lォ ヒク{L1タ゚oWXニ倉オCヒK*模莨セア怫EKマq*dVmモヌ.蠅5鐵ルQ>ヲキャォ>F7瀋RニCIリ]1T.Zタヌx-ニァ杖-ス樅凜个貽 +6|R| >蜂セ、伉マ゚v柱2コ蹴トナヒDリxケcR暇>ワアlセォpヌX]fー;v)wィチヒ鴨イ *ォョDhェNZ@榻花,愃ケcGケケcG 佝ェ=ホ謗) ハトvsヌウ�Ypヌ=Mリ1/~wy~アc喝ヤヌチ朱トユjアc +。ヲ~ーc2アmナ喰ヘH]6ヘン儼;J#YPヘZ員…ヌカrcヌカ靼148v 誼}、;FモcW慥kgユ店樂n蹄クqKXア&テbヌ +樂3ヌ)貍アcナ*P_鷙Qo鯲ゥcレ蛆Aモe'PヌPノNvLハa;&%逡m?綮`ヌ、ヤUニ,J}アcコ{r9ミア「3`@ヌjオヤMSト.袰vャ`ァ糲`\・8?^个タ醯ーc還iワリ17=リ1ゥ田ヌ8l:Cロk 鳴ソアcィハjlチ等BヨK蓼書R`M1+iιハ狃<'ASpヌRbスケcエ+框sヌオ'1/蒐U堰ヌ +鰄Q_:坏T)タc|」イwL煉キY/wLj。8 クcR~[ミtクc8庄セワ1Lレ賓J趁治ソケcRヌマテ」ッコ'ヌ゙ウ謗)|・ミニ氏[゙g}迢S゚#Oニ蔀dHースj4ョ/uLムー゚9PヌdェM薊Pヌ4:値{ィcセqM.ASト,)ンPヌ、RイゥczチラフSyゥcRYfm瓦':「bァ;F烹p0テ!ャj.ーc:ム5nリoョユyーcR贅vLCb゚{Qヌl愍c ・5s首气産セ琿tL#ル (gUル・{ホ5cexヨ「鯖」x+ィcヨgコdェ :ィ0ィcel陂&DvSヌGuuャO46D +v辞?ヤ1 :ニ4T釟ヤ1 ヤ +ンヤ1ニ{]、朱7^Ce餒Cネゥ>ヤ1価。エmツイwテ!モヲチモ勺ヲoE;Vフア、oリ?レソチB+ラ゚*ススリ1ゥ6ャvョツ;&ナヲ;ハイ4ーc(v跨鹹スリ1Vテク(vL$u豬アc +`ヨ懋モ齦ニ司并[8詩S睛ァャ/vLェユ/v吝ャ08踴u,[ホスoタリ1)%ュbヌTシ6ニチ勺ホ #ヌ)�KハテS!y掴S8廂ヌアc{fm、o錬カN X&/ョ/ワ1ュォアシ.亳ホソ{ムNvnチ#pレ|ケcャqX@g#テヒOjチcト-ヨ*<&ナbnC。&終ッ匣漸V)AウWrVリ&城ヨNヌtナネソz8テB)ヨSラ7z "5チヒミTエネスミc:嘱レ 城膏隻オMMヒリ3誦ネcワメ<ヲシトー0タEヒJoイA +伉<Vソ1スQ/yLキリト;ネc/XVェテミ"城電ユl。%}�城-チ7x 片激ヌjォ<&・6"ニ=緬ヌ}}」ヌr9ラ,[Im9ス1}RR7=約ンjチエ$ノゥYュ゚p=雎 nzL *?<ヲェ17y アェPニノc(o┛p甌虹サy読4uyL)ロN+テ枴読2\&2,uヲ・ミ「:蹂lR@<R゙工*BlM1P#),Sサ!ト6yLbモ'tXニwャ CXy=1価ュ籤1 Sム�!ィ梯)|洞# 俶&粍Sコ=甌モーGユy隻T:[@ラMS袍o/メn亟<求Sクxェ0,リc呰Z}當lセlヘュ2ャヘヨ)ル6}袴(ヘミヌ3!1Rk稿ォ%セZオDユ#51>2,リラ[�ネイスdニカ�Yヲ6Vチ)@YAサd。免 Sワ モ|?JYLg1lLテメィヨkムg(レュ<�2押r!#ュeヘセщ4累�2D=g ウモVロ2スo型,タコn +Y&鮎B夜И$1セj#イ *;・ !ヒu~゚進+zヲBFオ蔑トtSk�ソdト(メチ ヒニ%妁ヲ秋iレヘ モ、タ!dJ疵?キゥ゚ャサ寝ロ*(d:ヘ廝ヲ・ミ +>ミイ愎<%0dQル<_2ms透ゥ$eリU!0d9gシ9d移 A%チ!ヒxキpネ$~sヨヘ!モg\レLツウb泪F)レwC眠Iタ甥6hコ原ース9d,0yi逅%ハak゙2aネI゚2v郭Lサ皓LOpネエs +�佚!Cクク{Gロ'ォolVセ7,耻=7LsフPネ8Iチ・親Z・n +MJ _LアイN!モ:n*.イD嗜>2ナb~67,SjケニBス!dヨ-66キW碧<d卞レ゚ 2" 這3ネ2・セソbョヤコdY"b髄ユg」イャ`底'B1レ掫Cネ40[I6 aBf+a-エn*ロBヲuエ蟯o厥カ|l@ネx[絏@ネ2・U$シ.勦c)0ネイラd=2D筥 C!゙2)抹シdR{ゥ ネ2ヘk剩ZJzd?ォ纃 #゚ソー +s[]ペソ|zdィヤキJ!゚ 2 ソ_、> 2-歌誰ョ ネ$ k@コdZWカ1 澱ヲH$i=2オ@yd: GC)テ02阜弼ラ腆績xユW=2裴c[>イ「->2efェZE6のメJ S)嘖セイx&鍵癈)Я尋f ゙リ黽「8i8Lv:舅 +價Uカ・A!#ェCカ:(d8 毅&オ 位n鳳�xケ!レU:Z!虹蛞d\Dツ チ C�mY!飆罅1ネ葱尸Ncg(ィ-ン 2ェヌ閾AヲサトェネアFケフ妁 ツkテ 2拱q`ms~dナL、f姓ホツ$チ +ク橘クdJi插Aヲ3- イ"囿チV.Y荘7ァy駝[n+dェZx゙ 2凹カ7のйdvZ/ 5廻Ii'@&・ク dナ參!枢dヘ:2=Z7′:ホ+/'栴)8'クキコ7′6D+:3オモ1hV淵r=eI/僥�嚆@ヲミ\ネTェニXネリ畑+;d9咯@Vフ1ワフケcz2x -」?ェX謠Iュアロ8K{ d4Wャヨ⇔Rフォ +c Sケf妁ヲoフセd、オハシd+殱3ネh:ヘdJ力ヲ�賚 テエ争_@ネフ7 !楞Bネ藩ウnタ)セj^Bfレッシ2ンjクq|�BヲキCz!dT訳ヤъV>ニ$aY,ン2Kカ敏 d(Z6ъ3ウ!dr└> d+02JケPワイク屬チh.ミbヨ,EBヲTハocw9&3鰰Y!NG。ェrトケpJ卅y d5レェBF6凉ヲ Qm +劒7lェ +匱:飭妝Fノ壹Pネ)レハ蕷ネヤ|`?M!+Q:2]i廝Fッ~7フカ:2)カ +剩LラM!日[ワァ績仕¨ァ寸L<t. Ikbマチ!ウラlCFFュ瘰驪で"モ`u"S64ミC"3|2&2N"モK吼ョκ勦鱧)ス楹| 咒fッ$2z鵜ルa[ G_ャ`戴0モクadJV。Gニo+」タ鷹ヲゥ霹鷹§* Y碚ヒs翳4l7:"啀恍Tコo82ユ綴&uン27広EC(hdaルメt妲ヲオニァリzミネ背m揩Fヲ#クォn儼シ4@,唐ラh42J2\4イ蛍抛痩Yx)hdエ +ォBq)uト2`dT�,イ?"ニd8拾F qニリf漸 タュ*�<sホ"C~笙ー馥V兵テネt3r9記ブョーネ$сEP7hーネ 晝gBワ%m"チ"寅オケYd甚ス ヌt貝.匳妣ヲ オDタネ瑳ム}ャ20 +n儼�]U#S% ラ:`dzタ)テセid迫ィハid衡ズY 證Vウwモネ)U簣ヲ・曹Fニh4ケydrァ 臭nイ尽ホXヲUワ42フチモ」リ験idGク蝋GLチケエ」 冴サ゚[コid*Iト1jッR擔ミネー~V顫「贈曹pBテヤbャ傴o僖lFGVe「、5q猜ェュト,ェュ蒋idァFムid鉐祈カナ陀7]陀缸Pツ #テ訃ンキ!ハ幅イニ僧盪!採lK 勸<9寞F卆シ F&」{7 qフヘ"縊-ニ廢ヲソ儺.ZハEA磧選ヤa{ウネtウPN,2ZdX3。A?゚ #モ猫媛握 +hイvM3覧FJ9`ミネ、X=Cミネ;モ9眩E##%K筒F緬荷シid + 3%俎|JNォb゙dル)イチN#4N広「ナ孝F\迭Sキ腹5i9uhdD號422、JェmeシォハM#=E hd8f9@C漏7 1テ幻HB3fC�・?02eH蚋スrul 爆ヌ"S�)nG鷹メロ +ネQdbo +輪ホq。ネヤコャ,ツQdヌ/(2)燕モ"C・�(Pd0iv YfM苞ヘ"S$Wbー#+褐|lノ}禾焉帯充nh&リ7Qタネエ チタネPア +Yチ 9#督ff帯7ホz&Xd?チノBikシ,2躪Tヘ]叫Ui_Eヲ扱&ワ,イkgEヲ +コ:,セ9d[D=刷H.ニィcロヨ毅VHヤuキ ャ沓fツ゚ d[ _儒`進トエVェ妁ェラヘ C。l<dRテ゚ 2vk9芯リPユロ紳j┏クЛq「Bv)WユトQBヲキl矩Jg割nト褶q コ!;ツ !;j@ネ(2ス +Y。ァ(・唯ヲ3ュ+(dミク5#QハK!S|0松L。Y3 凾ー,ュ 。Y*シCニ詭y貊d$ークYdィゥオ#澱チリ選アアFF�8AミネPーR Gヲクq・t8xd +サZニ&xd飼蒿ャャアN゙<2Ug幄8イ0クGヲ^-<「儺k シO7,燈吶ナ贈ニ狆命チoGニ議xネ,榿鞫eZニ Y、@ネヘ#モF鞫)ュュ,テN、嬢竭QアBn<xd(テ9cト罸ェ%風Gコ|PGメチ拓銘ケ゚<2ヘエマ=dIハ癈ィハQn 勦」 YカEpワ*e-`ケ‥(殊Glk�朝ニミェ(o"n溘pノ1W伸ユ'$o ル6$リG梵$3・?<イュ詞イk#Sア助レ゙サmォVャ聰ネエ、イヨタ衄曽ェ翳rWミタ憩F゚qヌ竄梛s今鰲ネ(:・!R42沼選冖シ4イLS5A#ヒト5K942)盲スidト擴%pvp膨w俤mシ4イ軽59{ァ鷹bXェ7hd羊1.ユid」レs癆1Uヘュレ覓#」ソ+qr +¢m畴僧1PdzZ.偃贖k~Idコ2殘ァ +^イA";ハM"3UYテ 束鸞u晒ヒシヘ鎚T=ュb{A席pzlnlサ{.アzト9ツQd8;j'ーQdエ」朝セQdR[I罌ネ、弍pネ8ニ|r/Y6 k;,2jヌワGサYd糅`ル*オY チ"サ萩EvゥーネJ房 呀アモuウネヒXュC>キ闃s勦nノヒ6 9!`d-モxadォX襪訴イ ミ#サ Fvヤ粗B zニw-丘5ル゚$hムヒ]vus鮫ユ{テ&ラ季ヲヌ┫カ $テォ�絞vWソdサルqK-Jホ川(マ`ーユ�弾メトゥ"冰メSワD2sメD2'メワ<2eソソ&褂鎗苑{,燗j磆篳エ*オu> 8セホ#S厘ケセ<2Skィuqnムn希ネエbヲhmネPラ ナ.. 栄H&a、\伸 マン7臭・+覯@イけョ4{ヤ-ヌ�ノ、Z3dR:$c{ァ瑙$テA迅諭= +m譛リ「wヤy両租ソ,f@2ネ?ョHヲ攝h$澱テ�貯j・セJ豊 ニ"リユ]@2Jzハレ<イちlッ姆&C谺ハ鴨G&楕AネーmVUネヤ*スフkナJ」/pdリト詞#tiov+J鮫I3ェ'Gヲj竸-�コqdアア 刋ェミx猜$半qd渥ッ#4ッ?$/捜Uリケィ0ヘyu7Aワ辞タxオqdケ,ュ@溝ケヘ猜"1ェヘ4ヌ僧衄僧1pdレ メ゙iエGヲJョロ>J幽咬�知&ム租 +] ナユオV"パ1ノミキャロ2y[エ3ノエ襖ムb棚c (ぷ=鉐\ニテ$モ+|鏑ー1Vlャミ'S.}3aI>,賄[ケ囘[ &區|ォチ$+T|、0ノTYD・gu]+賄 +Tロホf)lч`y・zo。ケ囘&婿囘敗jLイ゚レKノ鵈0ノ$壅3ノ慣C藾提キイ`7鏑「 ホ$CPク8賄戀Yサテf帝ァテ範囘メ崟6斗 斗kチ$#c゙p�アN+アH=「ンヲ(⊆YVR゚ーセ賄[掲#寢k6ヲaュS痾1ノクオ黏%?ヒ9Wエwャr鏑祀ニ ウメッlヘヌチ$罧マa!fG参ア性5ソ猫ルJヲ重ァ JFswJvセd&カzlY 5厳qcレ鏝セd*ゥ頤:C46闘ミリレ%テフUホミ%モチェJヲ d*タウ溌ミ-QR@ノTェ"xcT(ゥ爬)rヘ\シ菖レ|冂キUNpSノ手T2ェaTT2゙mJF掛~sCノ$椀ュロ#ミwAノu浮Jニh *ル.セコゥd +W9O阜ツ!・JvщJvDァBd_゚シ1ナチ>dウアUャ ーdし,邃$~ーdz-LセKニ簪 q_PイミIV鞅ネキ1jn法lェJ搶ソュ0チе:mw1薪i4mレー椄$ヒテXIヲrj,IF價ネn$"cエオ租末ノヤ゙C'd梶19jLE<KマHヲリ、[ [ーUt ル"ルQI≧Yヨ9鱈}�$ンCル}ツ*o P緲Igィ D廷 +I6F゚D2U1i Mvヒ9$マ帷_8イ甼!妲6ス、iテネォ=,2A硲1 ェイcキqd^qロォ:Jm ル慈M!cス; !崚ィ筒A&#。Lyコヤ祓ーレヒ ク踐テ kン澗AVス(!杉ッ^9�2 i胞u?ヲ(K!%踝1ヘ瞽Z{L5ス」=&1俊ネcZ<ヲ掠ゥ゚ワアムSvJ。/'緩c筬繙司ラュケ冂ヘヨー9カ孃オナ Sマ:1U 豼ムニエイムヘウ徐詔ィ15と、ゥ_ysニ@渫y0cツ懈<^ハX6サnハXカン1ン 騫cル 6bLッヨレA瓧稽1cケYハ!ケリ填Hj;`アス籬F厭,E{Iシ アN`トTウレ゚8bルlユF,;zSト鑑.oX1t蹉 V91ウ カャjテr蛯 Vイu=0BコノC輩IuテテヤAセ-鉚恵M秩テg勲答-%ヨJ_}チar0ロ0Rワ+ラ 絲Z」ン牴dヘテ~+テN.驢'オウチa\エyタa$。鉦牴ンョキチaェV!サチaリO}槃ワ0メ「Ve0h�) CォpJヘ&\聶I-eモ瘋Iュルモ瘋Q・SI{^ワ0eヒノ與nXツリァキァWヤZト町セタa隷qヤトチハュ%ククa并ア9.巒ミ陋F橘ィa レ Kヨヘモ"順ヲ)T、V侑否ヲノワ兮4\ネ軟BノサL.ax冓+菎0y ャ狡-ユエ0レ9,固a.↑eィ0・。 RX レA)yメj笨0警T+諾ヲmヘ3W,絛ホ/=レ nDOナシB堵ュカ>|ーヲソメΛフ懿ナ矜馼0=莇幃}ミ ヨスQ4WンmO ヲ^=7ャ7サョA陶<> +カセ倭。L;EmZ5篦\@0u湊」44剄kノ8ーヲ≦00オ"S駆,0-ヤ逝(>osβZ,<`{L簇)將Vmセ?ァ)S;ミタaゥYニ糎ャヲ扁枴N5焉モ$cタ &狙4<゚$彰1` 釿Pタ、ム0=サAC�K~9h&糺・o 佝 "掾c煌ノKE$ツ)9Xチ z%ス*e2゙\O6cモ+)繕W`ターレ0 ~p゚ケ0`}Cタ8Iテp@タxYフシ. +6ァi尊ウ券6ツfャ0<ユ須Cタ2揄cm.矧}mネ熈9J} `ye0ロォブ)` Kニ゚・ 耋セッ゚0}ロ゚゙「o>様pイセユ.リヨヲ]T、wテス膿ノ漏ノ-ラ8e、セzQタT/募ルxSタtXU47(`0a凵=xhvSタ狄fedCユet]カカナa[Rハワッd棯チノ%号ウ}2Wハイl 7」bmシWb÷dホ;v$:3gト=O線・ィ{. `泯ツネ$\濳~ `区凰I濠sCタ$~約@タpuヘsl`_゙ヒ運 +俵3オN<ヨf痰ムο,_オV コ類スヨ^偃悵ァ{% f[gm畴m1`p Xヒヌ"k勢ZLソ5ラ}梅T`ソnリヲ盍ン套ュラ)%トナキ^bツP・箆�3 梗kMイヨ゚スオ黽IヘミMヌK!=BッA4怪Sマ!`vトフ7L。チZ箏o&ヌ桾Jレ|/ハP救Sタ0コ史Nヒ$&鯱FN縺 LBモBメ!`X゚犹y`ヲゥョヤ`4T吝 0^蜂蘆iiLbホ�モUK0タ姿1タカ ーフ^v =Aラゾ|ォ8- ハ}-Aye 討ゥO0=゚ュ0ゑ% ッ|Sタリ(セエ薯歿│m痒ーC +・|ソ歔SタLニo<0 +涎ワ +Xツマヨ\鷓n'ィカc=0コNツ+鬥ac}� +リj沫コ `Hclk フrZラM�SヨZYサ�ュXェ;Kォ備ニ-スaツj-。2カ徳+;ヲテb_}」ソー8]c徳tルu3゙/GucソコwFKュyn阯メハJ@ォ{ク!神:GM 燉&=E彦モ 5ン;p_壟コレW}テセBロャッ7vセタ}ョ.ヨ欲x-麼・mZ麼%王偶ーセ、レャ/ッta6+Q会蟶ロ[*U゚チツ「x圧セ8"ァm櫂ユB。ワラY_リbuキ#E]Iヒ/鵺「幺%チツAARユヒZ褌*弾モ難、/^嬋ルMメーリI_kニmメンKス攪t~ト.,セjzー^8ナ腓メ( ヤート゚モk求J猜=>尖azZモヘ「8]禝チ:ハヘコTgz%+!チ笵$鵡モ U簣坦セ<モK +ヨモ渠矗`zY陳o録(観>L/ゥ,a驟uョB'AJヤwフ0スリコ薯aケgzm畭z5録"x.O{ォuXIuァ0`q燈・c」v8(俎,B@A1タ!ヒgzm畭zユ録ュdL/シソエキ~録粕モ ッヌ ユヒツレヒgz吝\馥>bzoヲ糧オセz9L/ハQKヘ騏縛騏ヤ`z餡(・V*ニヲ柚>B%修レo杆(チ祺C%I@コ3~`^ワi蓊qェnSWリヲy<レハ「yI]簒シP奕ス湾fニKイ扈ラC達|kモシp4ZA +囓>屐cカィ$浮誦)ヘィA珍筆eA饂ンZT要ワh!ェカ啅謄シエ&タ|鴇ヤ朏ツ1@^#チ蝶K#)q0^8ヨ_筵簾asN~Bx瓰リハテeシ姿サカ.ejキ.ヲVキF嬋訓舞5濔ェユiウサコ;d=.噂、 wAモナ2フ7キ ?テ>レリ.ユメ・: 。#hラム雇・′8p\リZ゙Kェマャ カ蕀v >フ.Yソ曽Tリ~s闡 `ラ.^ララ5=姐pソォlヘョ絞槙リヌ)性 モヲu螯u5h]コi*MAメ}ナ盃モコHノ +Z翌<8?n\nォラナ 築>ク.攣ネ/゚ク.;hUワク.5牟%、]X.ロ9ニソキrテコカ隹.Zf4A8ャ _}ヨEGJヨ・~=*#コa゚ヨナM+ヨ焚翅コ8N黛 ツロTヘュ魚oミ泌エ. 」<l嶷・ォテ錵Bュタコh冩ュXャqュz`]Rネャ侠ヨ隣 メスサ被犲Dテーふコ弌セラRdキニ2*5ヨ塔ルー.束0i`]関Z,メ`] +ヲワー.E!亥<ー.ゥVI皺.娟ハタSサ$フoXjP,オァ`8・テ齟B|auOeV臨索セY]Y献ニナ,タフー.E~リnXク刪モ「aッワiーコヤワ;VW&レラヒ鶻キッユォ黍、カセ メe」タコ、レリー.)、゚6ャ 殪7ャ~モ B)_9ー.r゙7ャK*Aイ 「髦Ecタコtylqyテコgノオi]0 +Vリエ.)ツュKス<笵ヨネ セーキテサロ\W「u犲2E?ラ・淪57ョKsトハQmhgnエ犲、啾u犲ノ6ョヒ-セ篌ーイE;p](耶q\J/ュ詰,ラタu颪P\エョD┯禁・&ト・ハイM「イ」[ラ0aワ`羲l、ャッ錦エヲ|x]偲1sシ. 鱆u騅ツ^トy]<mレッ+棒サp]9jラ%$E犲ェgHv.Vク.ナタラ%AアラナHェロ<p]U テョヒ拡l。カq]ハツラナ<$サ楝u%\决}p]ト阪コ=ケソ=p]ZB゚ク.jエFルエ.^fミコ8Kサャ嶷・e +V_Aメfuフ・?~イヘ「牒シャ.y2ヲェ毅] u)カノ|qココWoN淀^ヨチtQ4鵺鰓領c@コ4qOヌン。ハ崎Rメhャq]イ[b駆ョN゚z\リ旭z\zヲ#オ(U絲ゥ」suキ、リp.ス7圻ヒr風フユァ―6婁[1ホチ裘」ヲ量%ヌナ2ラ。\rノ」m(猟b|。ハ5操r%2メn袵「椄蠶濕ナハEX Y@ケp涵。\DコW蕭烟ス/レツ<毀)!シ。\ヨハ%ナG蕋ノcrム蹙d5禄(+マ`rル 9Dk3ケ9モU $琉ロ@r,PりArQシセ|申ト�)u$-嵒 ノk6#N0ケsー曇L.リd゚H. +skケ悶ネ5スゥ痃ア∴8ョUシ4h\壅イソqiV-x(9規ヒe"6階 ロW迢ト5kツaクTj笹rクVトTテ・ソk]ツE1諂\dテセエ\\|ッ%%ホ7kzeキFキ4[ノyVq溷っ゙9\ハFoゥn対XGoゥ$LK崗%Mk�oゥ猫e銘ンR叙禀7vKz^コi罧コU=<サGチコ6゚J深Tsnト-ュfVハpK%キ*,.ヘx ォ0峪ォ ワエ-U補1鮃3ヨカ」nリヨ<|ウカコV%ウlヤ忙飼u メ-HソキスA["i3惆増ェ齪-薨e疽Aカーニ督![ロャ< [4ェォmdホ敷 ニ鳴キc喰c}ハ アワタ絳溌モ76aヒlg~[、タhsツ ュF.&-ヌヒラRエh覡ラメ $ヌk畤lカオサ@Q9 瘁ヨエd-荳チZュP獗ケZレ|髯 ャ霧7械゚T-V4Tk3 ヲ約。辜ヤRイQQミ4/T%b;邦C7Oヒ|Uニiqホレ0-9JjtスYZモ Hメ夭ス(-y7儀n猪.カ8メヘム2*フ|0Zb3 竃鷁& ゚+u庄ンュルZ9ZクシZ3[]ラMミメT)�ZJb」@粁モ7~y7>K'Y「゚Yウ嫩マMマR゚。~イg5+tV晧EホェQM牀 X7ォル'サゥYュZ?Yサロ1$5]2\]ネ,E沐トb問iGロゥ゙2キ篭hロク,q逑 垳ネシaYD澡摯Eノh俵ャYe1'K罔∨メエP圭オ)Yメィ0v祗 フ7#ォL[む,ニl睇%iン'Aネ糀ヤB茂QD'�Yハ-)j|,%7{.<褒h>\剄磁i]l,3矯ルX陋KウヒヲクZャセcムヘヤロcゥ.^mpアCナラ 意。X8eN駘.$鴆on"e浮闇ハ邉斈アネ"*坑寤eミア ョ6 FMr<ホ訛Qf@yイB廻ム+QfDヨ鞣a:畭傳ツ々) +"*チノ b。0)況/"KソR!b%笠W9D,)オネ1&biセテ-oアネ/ャワン"オ}?D,T「ニト単H)8Kし;]@,Qヤナ欺lmア、 ャケXZvAト鍛1憚b#メV鏡B-'b/ツQsクK、チヒwアォウZ.'bア゚K%スD,カ+)・Cトイ<ナNトRYッ蔑ワDャ・靴トBqD 'カー$bコ8, ヨ8,iq・`ウmEリトッjW┓/傍ユ/mV,繞D$ーーュヌaIrjナ%エr!a!寐蔑ロィo6e腔箕〔ソyXヤモ痾<,RヤS >iツ寐t輹xX8&Fチテ�#+縛「VチテPBt"xXリV ケyXクンroヒ<z><,= o般モn明カ・盾・lミーステテ鎚エシ々ヲ牌Xvbヘ/ U+閃トツ搭漾ア、�ツzXコfヌ<XハJt:6ュ寤EM#cYアュョCトイn濟^"c+ホ2"e勒ア\^モwtコ厩h "ヨス :串宀ソ寤ナ&B-RAトJムDャ!封條QPヨ」m&マゥQ&Xエ-o(jソ蝋Eトメ゚ヘコXャヒ頂+  +!挨Hユ'X +P@,メsZA゙@,祈マイ々4ソL晄@,・、ヲB 蹇「mトrテルシ々性y^n fヨカ腕ョケ YB<7ヒ悪m 〉-R挨キエス ト「ネレツzト「Йサ�baY(ン@,Kh怖X+J�ア8s1挨フン゙ト「]Qケ�bQヨャgb%Xメ」  啀6Kケ閑ヌユソソマ$x@,"扱CシK淌致トハ汞コ6旧ュ#7K-j 6亀繹ケ儿エヤcン<,換ゥ >゙{寐・トレ7+30フzxXコミV+f<,レ汐{秣Y 3ォ0+臣ォカ:ュvgfE、ヤ4ウsウ<+オ/[6蕎0Q゚タaYノJモナP9菻ーオケEv仂セテー婆$pウー 禺m、5ッン根レ0,}�e麋ヌmV゙EヲAテメm゙怕Eレタ8發a)ハハ(`XXハ2\ +サケテヘツR2V゙ツ稟U<PX$,ヤ[s」ーフ~s訣ツ"Tョ薑ー4Z7レJハ僧イs・慊ロ寉・-q]マ4ロr`寉E侮ぼチツbe?ロFa%レ6複スミXゥモ削(ャム冉)Gai頒0p族.カ8テ(セ睦オ゙名ィオ 未.リ?゚」`層マNキレ,ワメ。弾軋s +ツマ,Moレ,ンYェ`Qリ2Wy(Xxソk,藝beG佼Pーx-mモ%8xPーmy=ャモ_Sヘハ1 昧[re7Kテ>+安`髑/l」VVTャン,ヘ8ッK5\タ`鰮V碪Mチ「lCeMNチ「」D廻&副eリヘウナ゙K8Aチ穹黝 XイD ++g/y +タU&Lワラγツ遷ソ>茅タネブ ニtDヌ`瓩嫉ュ!ョp{セ6K$}胡ュ縣6 }xO「p ゎュ%ニ`褞C VVオ。ツチ0Uェqsー2pスnVニワキァ濮攸/ヨャ碧゙、カAXr'QΣp_[%8メチレツs蕕 愉ァャ古ナ,7 w-$c%丘7 QMツB錻ニヒヲモi-LツBSER晴ラV8HX>テ;n墨ツメEn3WヲU%<ヨhヒ +ワ6c軈ムW7モ|9XィンWpー、Xン@pー=モY眩ナチ"胼X秡アラ,mE ス喫メレ」ッノロ峇1XM2ヨ1X愬弟ツ`IエP「aーfRテ鮓 +' 緇,Kテヲイ1X殻wワ1X奄ュ< 柳゙T`機ォb堰チ「WJwレ挫Bヤソ 。,ヒ">'Voュ3zーЕs錯Aツ"R摧吋mツルp8 K゚ヨ?Nツ7ラ?y[(スhュ KieユNツ8~ワアM桍=晴、ヲ韵キ5セ。!ミニEsツメ影ai\セqョ鹽4x@Xエ、櫓gコVfmHロ< ,Tl%$ルaI栴晴h枅M$,64ン +庠r~IXlフ\ +ルヘWk3b7 +-゚al槙モ*^Zチツ:ハMテコTO、モヤN48W>カkスxXレ|「S。R!gセLニテ2。 uヤ b・hッ"Vニ ;コ笈ハD,jウヨ%ナ>MトbヒFX>N勸M:>,LЕ・Yラ]Dャフロ=`!熟aМトコ鉢ヲ皖Aトメ[Oリ、+]弯├Q学アvヨnヨQョE゚0リウEソiヘワ/pXV[ンフ4,Y鴛ョメコ.6l=兵テ6=9ENテJコシfモー偉RC4,_ヒ;yャ!Lル亥柊テBL 疑8ツーチツ鍛 V7 巾魘テャネォクム_晴/晴ウ4K!Uコ髷ゥ ヨ?9;ラィMシ9X5v"チチツ"[Q0ム帶ホHォケ晟`アf羆ヘタメ「楽F`筌イ忙:ォ劣ラ`57サW$ミ届zEBD~gHラf_癶、0ミWjHツロ5ネW瓏隕コタWレ +符8+ゐヘ'J糘qクEヤ;Wzキe/ウ糎zレクォYuモョカpテョヌA])鬯uオqャF"7鍮4 +恕BYウ蜂?ッe7腴=櫃VノlL/9z舗j+ケWム埔 #ケ(キyョカ+赴. セユtロヲoE_ヘnE沃Lミュ屍モュ.ユ餬kFウCォGi、ソリVモモマ[T9スミAカ墅{yネV塊リJツ2ァ?*Rト_ン9W。菩zPュヤ悒pZ)DAVfZヘネル:メjネ;ソチS:h・ハsヒケ;マJ.vイ笘-\�#:フJi3uKヨ゚z6イeオ、#聟$ォ-ワ$ォ-ノJヲBチラヒ晏×K?~ァPタレ「dudej2マZハ[mサトネ艢*@X糴禮 檸キリ」_?(V}<^+叱Vx也|Vタf)ナ>PォTナ{セJG Eッ「~レ屬Gtソ紺R#+?メMョjイナVャ。asォ姿aォ縞DォVノT貿、婪・ーャ齲|ニシヲラDウ齣ツW8ヘT庇R屈~ミェbノェ7ャ2nラ籵jr婬オセ8U。・ェy」ヨ$匹!サ癆4|鏡ヤオケ|。J{ア軌%7 +ツ7tJEイ寢怛A]U滾リヘヲ:ハh5リTzXp 4雰サナFS叟MゥMオ ~6 +詰[Z]p*ヨqウ�ロン]?|楕*t&"n奠タゥヤウzZ/慳ヤj~pロ楳2B儔h粫PNR嚏ソュ瓧SヲマムT#、エ嚏6憲Mナ」A?cーゥh萠`Saスe>1*癘1aSI鰄リ寢ュV] +[;=M(v/霈ヲ※J8鱆q4アゥテゥh、>;怺~エSIア=Zタゥ屍テゥLオM゚傍虞 + |ヤ.86哮N呆7mkモゥWU蚪モゥ$イ:゙タセ罰ソs .<疋ナ搖ヌMロ刈SqョMァツ7D 棧S%歡モゥエ/蘂セ餤W :F゙街搖E�n:"モュモゥ8M呆-艱ンネ,4it*カ)t苓,tzモゥQ娟葺ェR -・ソ~モゥ4!g+トアcT!iF4#ツEョワtェ-扣+ "$チ擇W?Nヌ.ロ>g┝ルT恨レ囀ゥKksゥR/.ZレT*[T*桓.弼`レvB'ニ +![oユヲR髟y4カeゥc ユ7・E,ルJu゙}俑7ゥメ +*ユVn*ユカe/゚JナメY」 ・「湧ナ!ョレS9寧QcロエンP*XT臘JEtYカrCゥL,eCゥ(ゥヤイ7TIZ縺Rム舮ァA4ヒ4Qモ<3ネJンP*4JロL*ヨdL*ホャ]`3ゥテu_ュPゥVコ=ェチ、レツナ、レZ0ゥ,総術ZieOg閃檳Aー」TョリヘA漸{}1ゥカ 3願|レメnハレUV}1ゥクウ莫ルGゥ壺ウ�)0,・<L*#.訣、糀bp)keモID8/&bv・半ォw゚儺ーィ綢Rルiア/'蹲ェナ、2ア^6。Dlユj」-。ケ>L*慵QェiPgR@ゥエミV0fRa.ェN嫣RY;wホ姜・0 ム姜・」ィRp&アツ7l!゚H*杉¶Q@Qフ=啜ツn$ユIEM滑AIナサ-紿;;ヤL* 譽龠ラt]L*ト~慎シ僉RァIkY▽「zG@R瓧Rム禅*ヒ呟 リソ汁共io +s$ヤYナワH*Dm2n$豹k 、bナァkゥ姿!ゥカL*mmX櫻ンZア{=?Vvラ#9(ユJ{攜Aト1ャヒgCゥhSPエ*TヤW+狼Zェ危FR-裘ZンDェ袒テ7遷cセ6、喊rャゥ゚ひシ)/閉ヌ界ヲ朷'QアァケT\ァO倣ュ跼ゥ裃{J8ル擯|、d爻?BウdワクSSワゥyシーh<%編洒J1_ ヤMェRoyシe~ ェ"R リn渭Hヨ簟泙ャSィjノ?Y5&(2オヨ: dォ垂8キ<KK「ィR3]蜘~I Uヘ^#タQ痍ネ・U筈(ヘゥjト<ロAQU袢(9T5ュヨ|eyuユェM/jpヨLルM」**~ミrZ Y諢?蓐`Uメサ戚サSP工鼻_Hp$Uイ瓷ハナ、JニU∬iPェd)N・Jfメラツ9&^-姜b=)芽Pg<oホqGキD」=欧Kb嵐9喜付ゥユチハ]ィヒBL +oEウL|ネ~TbSェ耶・ +ホ+e^*レセR%y{"メ@|R:モJ)jQツ\U*U4RノIa)ム惨リ淆ネ{m>駱剥X}惶」ェ者.VユVユナ「*Z}orVvワノ;Gbヨ嵎ホq +_}ヒ[゙キp !~ェlj5Eー阯&#野fX スd/^@2 +ウR悼TH牒ィコソ?k=Wキx$ "ュRーL猯"-*ォ2シイツB2求縱4sイ。p跪Vクユybヨ|]mhホ@鑼T=^ 亊ロq贊ト~j咄セ1iZRUPB+qc7ラェェjオト憶ヒォI3w瀬n4+、9iレrムZゥメK^' +朿Kル\ォ:ヘ["H1。(%5'ヨキ0?^CVLルェqメ)険ヒq`<ム躪テ哽C%~[U啓イーO�R稜5ネヨ +6:]gシ蠅J循%鐵sPュ$ 葵LJ +;{サフ。 wヨェェ消゙ZVェホ8vQ<5Cヒ:シツ~オCオ檀}ュヒュl9lza冀)4oナヨソDkU者Oル]KG咋P$ィキK。6+`惘イラ」ヨァ;nユVツJY\朷恭溘カ8 彫オ糜$ムコ'+siv|淹ルウ發2ケャ=t6ンlpmU�K3+ + フRv=ユ・イャnヒUャu_ +ワ KカGメN%^U4ニchュh゙q罕靴ソ:ェヨJ|Ufzユ*ク4モlナ゙ウ偸トu\イ'Dッナ{wrャチカリH紛ケK^hWル嘛゚�+[」弋j(ナ哨ン3ェ4拳カヤF禦爽蹶▽ツ竝~ネiッセCヘE%lョ[磨ッ?}+9Bヨ・.+qム;Pル)zQ9.[橸Rl褶刧9.f燬ェ#キ呈。e]j3^Vナ!シ埣ェ楪j-尸・I0サ@絵瓶_イ9ワ弑ユ・ィ>a━五検D唖ハ5 G}gIオ29%ウ|、bVコ切mU儁,シ~YRヘ/1サ博7ェ穗藐9X柢稘ナ描レa4繍。w cD夢nCRi':kィム-Gヘ84 1Y6コミ稜J6Hォオ ]nヘン扉4Lコ畩lォ&KゥャQl7#ヘニLbア黒Mオ塋砕B些腐 gニ8ッNマウF蓿疚ム鹵マCA*o"ミ邱タニコナHvセ^_jZ綯オ6:扎ィsMュJミ�/Aヨ嬬uシR(ケO^ヨ£�_ラBイiェ%CB]シF執TY +旻ケーD蓴@ヘ盗@ホD1エ゚ +}YcI;,4柄(フ桾シ_(「z。p&Spサ輯I4f銅ゥオjj漲ネ鮪テC3*;埓碍Y作ヤkw、。y+シgy惨牝レ 噐ハ・古ル:ェ -4マn`ォF「 ア2Jロn3ユ}kウ8cJiシU怫マヨQオモスiロォョユQナ・q釆ヒP簫bp酣zレソn*rァ99・r?jォミ +キKW)フエR6wォazェ5tvュEアG)iニk侮>5タ鎭モb、iS岸+。>=壘,j ナホフヨsK頬ム8J1爭\GUセ6゚-9PO>%[甅5ッモカ蒋ラマャ.2\?jqヒfスpォ鵺ツヲRe鵡キ☆チェ]TスTサヤ4,ョ」ェNフ?ハス闖*T76默キェ#e淹 jェyケ效テ「,Ζ革メ%易:&<オ、b阿トッe5bセオメカctiサ況藥)觴ハ樛|サウ%ォッキbOtモマqヒ}4ー{ヨ]ア瀰・チU冑4:ОツzK+J)ミナ。"P*怩レ,{qク,&ラ&tIRac砒:擇ハ+ロGメ・i芽.`$Mス0メシsu+j5Nラ・&ォ5mlヤゥウ�fT3ntaヨ*G物3ナ構ス%%\A`カイノ{ワ Rワモ_ηオ,喘xシx(鹿8オ。jE 、n1ロOo蒔:ホ♯ @ョQU\_Reェ +ケアョMヘーnkオトAェj2cUュ +憙XV慵コ皇夭+qモコ。]Uス効EヌQ盂袖7i弼@轟B4レ^イ`Sエシ-\儚Cqモ|ゥヤVdErUメ>WクR+WjINRゥA待mm渭Qf`「厶=ンoNc 頭ヲ-ホ桃!p洲2ミォ~VΚmя,ヌ紺。^%」Xゥ燃堋D9-;ヌ刋5V;Uー-薹2]ロ)峪Y躪*l]テt?/miィルヨ拊ヨeミエノQVp2爲ェォェ-"モYGオLeノヌ{顔・オ"mv&,レアix薇/ホン+_?ィ/ゥソ)q「t稗チ +刷完qfXI・@フ^/qX7?ノF>#tュヒラ/Tユ"K-岩アxェェSQ=]^n・tV 務;生Tユョ蝋0R(がbステ|]ィ葱オヒナ8ロqFユ#・oタ[2K[ア|>リW/vヲキu 抃鬪サ�ュワフ&j カ悪泪ツケ「9Q=ヨ「ツ2エ瓲「レセ揃ヨgトャ「ェゥホ餘「8ラ:ウPZ稔カィn・ラQキヨ幹ェッ%#シ?G 春レチP18PイョkJィヘ-、PィIゥ6>キDQbH +/\$Te/ゥカ、C*}X ノvゥハ匹アロ-黨ャl1コホキツ嬉Vァ聽クwォ段抖」シ{<9Y>+纂ム餃1怫4mO)角ョP鏨耐ャテ!Sレェル2ゥBb+」 +リQトQcキS レ黯Ra i.\�|"*ヤ/ロqtb。SJ!q・hミヘ1nd」ユpラRgェ^e7蛉ィ゙屬hユンラG雁b+s<充Qォサホ陌(do>{ +ェヨoカキoXア:?ヌ痍+tv2」ルキKK紋P謫:衂ャD]sX? &:蕋マqハモ'.pッS褒セ衰ナ還硫d +1)jlh_。K鳰GキャUウ具 ャカ/ホフ娼*7Hョtヒ"E宏y"。ヲnタ*GJMvハワ?ョ0彗{Bアk[ュァワ曷^#テ8ケF!K杁#;,wWテヌB7近魄WニV鰕`6h/廡紙X&ゥシマ崎go*スワ看EォナvキZ妨G鯢R皖ハ挧娜vVM9e)レワ-噺ル`$ト5"鍛<.aEォ'Rシア[E蝴髮3楢オ4DIフ`%a:"ュ!oヘ|リa杵}|メk劣m#&ォ>,ヒyコク+^*Yス+:ョ+・^゚筰浹ツゥ6*ャFV?=ヲチ万Jq・:ェ:髦」ミ%$ャ連]相ムm%詢x�8Mト、橄2PモQbアI"TV*ヲA尓8 9誡チ4ノ髑`偐{襁XVィ萱k エl1�キ< S�皿NV雲wソ UR0ャEノ}ヨ觸麻チ・"nヘVュT鏡nナ湫p邵iロK1霍「チ#G・yWj稼Dエ~ッMj捻^  oァfn黯[ワ*Lヌ3ニ>RI腺LィEツXQJシewp8Eツ・P"Z反;P]コ諠BニI遊セaカ「歿汐ヒONMq禿Pオ4X5ツP賽*ゥD炊F[wリ`カ.&ヤN$0 !ッ・qrラ`゙1ZuS qMノ&ト葆`Ezソ/癘A レ鏘ュュ)7」カ゚ンj莢ヲDN堅'Vヌオ)&ヤ`mQ^-チ: vネa 戯航ユ|9Lfエ輿ユ 筥日ケィェ +"/$譖テ$ウF我 +Y札槧SriiH}�ヲ萵 +hアZ渣-齲妖アョ・"6トL セJ|R3e樗nェ^ヨォZ"6ヘK~[、kヘ;チ1鍜)ヲTー#ウ<圓}lテ、"相1pテリH{J)。 韜カyェコ禍1O*オヲ札' +オヘテホ$:!eε、rルルxョ配アuヲレ-U|=ェナkテ掵,眺澄f5萇eェコ/=pX゙JU0祀v譬cコヌュョm掠D挿BPI#bョ拡广ェ)tFIメ-78LaYh~?シ/+ワォu♯聰0ゥ 顴粽E8L姦1tfテ、レ嚥ラモリ R{m1オ#C騅竡$p'}@陦TOスク�朿ッ!カ。ーlヌ4Cmル” ケチa6P6Sm別`嗄O、マa8FfY 袂z0稿(ヨI#7憚tセUヒ"*kーoキ c)KFテ、モ・コ攵eイシ=(ニヘ\nn戞q!ェR !鄭&累^U(ワJ4、:ム[n釜uBC9;ヤII)ィ)楽Jセリy \3ゥ /A\O$ハカ塁ムq +褊蛻X#,KBy8 コロ`ェセぃホィ スVュ$マ漑_瑙「o,^,6SャミXゥヒッハr +洽頭~Σフd@オ ャ*トB、4 +,GI!1チk総恬テe/kAg。W悸畿タリkヲヨユ'タキ1:J)fォ 僵ヲンNナェユ|イbRュbKェV鏥�ゥサC閑.GOKル1ヤフD様・Wシ NN漉ロS。eLU(桔リ/勳AGヌュPクュ{ニj^メR=\アハ弖スゥKユVw_閏釶ヌgR< _IレsケェWョム0Xl・イIcレ^Mゥl゙eILTtyナァ峯纏+カ「リwオツt鰭�ヲF克t剤 +cTーニm(操ェラュt;イメ補ツカレ抱 _Iq」ャb蘗{ホh帑hャツ@メiモ黙オz轟.セx#ロ!4ヲh尋傍メODF +琴VY犂-iθtNl「ミッ3KNイ{ +ユレニ=瀬タAZk3サrGーヒニyャル 4GmリX @ャ#{=ィpJヤfホ8ニ錣l゙蕨0 +:ユ`$ュ�シ`劣謚;。ンu芯$冀・9lヤ#、/柢QケO歟綯yZトtI#、シクメ公サJoネ「ムョヨ*&XウホA}PKL婀ウzc'gkュチカyレ姓゚,欝�ァ ョu嵯凱B鵆pOh+U腱ユZ_RエLウヒイpハN骭「RiA購ーI,祿,iタ,蝠簽エ=*NR愼ンノセ-末ロケmsOェァlixユ/g`ミzヲサ]ン ッ7朖*1験d。Mハd(泱゙F臆ォT8ィコ擘井リ#HQ)J8 *縋hユ謦 +yAス_k牢コリヘヒ7ーL」!オt<2=ヨ」^Eミィャヨリマッvェ +jッア6ホvE!G+}ェUUd*nj僥"<メY娉j辺ユX%宀6クLル"inY墨」-.ョd.1レ+~・eタ躔ホE*泄メ~Tッ9|ヌ苓> 」S~テJ0ア罵3E9kユティspフ靉Qユ勤魯ャRWф)ルフヨfヲャヲ咎D7ホ盲ミォVル鑑Zニス1r エiオ得7)ホ/カノr象Ry 5FAE2d3スー9暦ーヘエホa+*-y%$ュイ.50qb"ゥR瘡8S閑ュK/7イヒ4ャア16サロ゚PiッlェムアL5声畉-g&+ノ成$v0キ%Uウj・鯑*t歟ャjR�Jロ搨]^gM゙qkQ國;.lヲt桾L0髓w苴副}VチR霽Щヲヘ(Gィヒw舐5奚ホ)ェ lyqサIォ僻夜:xヤ「KdテE(0」/ア、PハVィバv讎。I&ムンU}ヤナニF滑d、ミノ匳馨(レ鷂*嘶>ィトs~!ヘYyXユ&」アNオラッ哩.T3ud全4,クx[v唱d犇Zンェ・v;モ iテ羹s&M*[ク萸IR*998CJ1`Fサ`i$リヘqi「q馴オAノvフAヲ餃JT4:。b藾佚メユ(ェ弖ーサdレ驗uKs?*蝠Wヌ<Pヘ &ム唳ャア +、テo\! %ァリ2噛gGMnヲZ1燉m$5'゚05*コ續キj・|>゚ツ1 kcケハマホlY0イkU 騎・メ鬚l5ニ!ェi6b>フ\Oメ ヘW#`k4gイ瀁9ラR索ナ勒;ネエ\キコ潅Tモルdゥ遐hKJン7ー・ゥvQKェゥf黎UOセ)=ユ襾1)ムkTン餞*LオZ#ワ EV)dH・イ鼈O mィ:截Qウ/\ォセh +ヲ圜bZQi@d鏘 Ka +[摶スqU特@マ鑓オks茲ツ@ミ'<;頴拙VU)ャW癶kWWニU;」CFD瓶ム%],ュn0ァ゚楯I%愈吩ヴ~bフ迷シ>ワフJロ蛋ェムヘヨyアナLK、lE0ユ*慄麪ヲ竒CFヤYホ1エ舮9ユゥ*!。"ナ頭^キ@wィ羅亀8QェニεLレaェ5川ヨ lq!ンYリK甍,醸3 +スT&+ +* )タ枷$!ヤAテ6eフテT纏2*ユェ戲!^@C8F慣rI ィ啜*nP夫鰓kY4,,罫Rッ|TM=ワz2-y堙ァSュi柱V4キ�Un+歙nオHAオ~イ: +ィZ% 冽:タVgVヌS_ロリ:ツ/」CUォレZテ?青ハfム FへネnYスrQヲ[ァj5忙円wヒ>Fフi*pェ[舐8ィBウjメ遣仞8ケ5ウェSス'繽 +v)bヲvルェq5Pェ)V0<ッ ecユPY絮C/`ウ 竿\)弼Q)ゞォテyク ャャ; NラレFW Zウbァ-ヲ緜TX 櫂TK +ェd^X5;ゥ帶ンBソQ(カLユ「-クjャウェ:2@テ燦|キPモ 2j〃c專Y=6[苛hbAフシ・UYF/リ?<フ坩,湿瑚@ヲeッァEシtlセ*・bナ.=,,、オa俊ミ-鷲ラ +ャs#R痢纏 リZ)1guフテxエ9 緩bイ2mヨ,^ッ甍裹Pwユ59ウYモ・イwク$RkュY搴ニ,゚(左ウ?テ;・船| ヨ濃エソ薤レ +ウ2ミq,TミM ム險VP 燭餅ゥ(ユccMルAカィT-kTハロ39vケzンヌYk天ロノ焚Qウワ_5ヤ +C査Zwp&ュ);厳_キ/~7 M`uゥJQケ@`ヨZャJ0陦ミ淡&コN=亳OワL゙>Jンwゥ、ュhオ; +ツ1k- +ーゥツ$嗽ロイ「\G、キオニチャ)ネeAユリュ^漲ウユテ5hュモ| vァオ +(MF鏝#&ukQ' yツhMゥnゥFハMアe]kハルォZ_カメリヶオウsfタB +キ +w樌(1uェRハAオ(瑾Kイ娘マ6ウFoe)0ヒオMォ!Nc肝、モイX=48ィB躑レ*'スニャ5\肥ヤNG轟ZeeホFウャ」剥Y35ルqウヲtソV4Mサマヘ寸胃レラ~1 kハTユJ$-6 Y嗅司VツシヨWJ\Sイ楙{L?*fq5l[uモ窯ッユヲネ*レト>ッ%ヤ委コ^6・Oス*膝 窈KャニNPUモX6ノc「7`kェu25mケ蘊[=MクqkZ煕ィヘ!羽・R`"ヤH7タpテiナ7%F+aユ┬ +JヤワC2^hヘ2a~Z1,3昨.&.ィZPzョe#^ョ*ク Zチ「PリユK%R1e )ウhノセ'{ 6J2iO 6JtヌoユJ kキ< g"マオヤ\ヒト」對ryン、62SH@炯ン<p!&9ュトa2}n]M鏑トdxスRfカム誑 !&;ウウX0カ翻ァアアe・ハナh5,SFマtンーナ紆 +モjPスH{ゥQ {X5n 娵 ャhWラlィサソツ.脈cオラニ;<8*d共ミ6]Sォ)nヒ0 オ;bメ゙Q憾4)2P誡dkyd゙ミ餒^RFャG殉セム゚ +gホト>トエomュ襾IvヤマロS.ルヘ(ァサヒV♭莟m9 ?j8P圜o-志ム℃:延C盥~6Vモo.隶V Rv*Gェ}j.枸xb朶,91ハ鴨v3ヨ埒BD$脳*ノ、{p PI」趙ィルBM}哦`ミ」ィZヲ皿y?シカ贏[uウ59字帰ロ Bjアl⊆qsX~IHOチカ=<< ヒ樛`lp齪カ0椁ヨuーヌ'ぱQcウロチ略ォw*S +M寨Xo{モントヨ>c[ョ{Z獅ヤレj樽Jハф`ォ}ォ」:GhM麋アXs#a8治メcォモハフワ[暸U3レ气:ゥキnDリ壙アl[%ヌ_-ヌエm7Nvbテナト z゙エ2qイホヲ2^ァuユz.Y紂ケI%iYcUオ、Eヤ勍\�Jミワ:Mイミ殊3NjNニ劵V綸 +:ラールd%ィ-/ム(囿IKO懋p ヲ*K)Y雎E。E3サケ'ユ、ェUiX7%r,タ秤QYロ 僧 0(ラSナO゙UKpRZノ4 「レjK%ヤhcシaネテメレ「uxタンヤDサィ�)ヨヘqチ-"ォ%^エ"C クェ龕尉篇\タ>・コュXVuゥフノ@拱7抑'^僚nナftOmU5聞ェ裡ホI;イPJmカ*ヨaンR絢aXヌFキV*ーー[蹲7ュヒ^jY<6トq�pJLルd"七ィD蔽Eトリキムソヒv奠4pクノ皺YREシ スァュ、~リn隷8%Pカ)?]萓U^ヨネヒエzキヘノ御iB3テッSwヤa侭|)+戒3hォ遂2符1エZM。T'- +セ +ニ |4Sl7音嬲F,ヤ pcHキEタхwx>ツB-オ;}Qョレ瀬ェdrF-ルオ-g;鏗モ7シサiン|ヌャUTGHタン.uE★ハaP/ ツ03瀟:ムハヨイ票ワサッ瘴bスQヲ%KZ2=44ヘ貔吊認xェ +瀟トゥsラン縄E-3ルs煮*ーF桷K:ャG +ヘr}yウ廸Lサt7GトルェサAヲワィHキsDJaUサマlヲセJンヨ噫tQ゚气?9g+・ンmネルMu鰔)4ー゙+jn・QS 蚣^R6ワMェPJナ)SK(遭 +)!、「!ホワ#3賦:アh瘢ッ枩ロ`ェ(エr。}^UVェン。s6v」「セEAア@w>3ャd畆u丿5Qム造B馨ミオテ↑ナ3ヒV囀フ^q:QD1顎ホ4"U +S薜」糊1檄Aィtメ鑄霸TモサCSI\ケ/faqN;コJヤ[lヤ貔T9Q[?F却ヨ5レ賃]ハZ[羞セエxrbツヲ頬ヨ +$1キツnォPユOiv歡リミ誹mXーハSメRオ4mレluB5KVS|)ヘT{*zツpCネJv9フ茯j ソWテ:n=シハチ霄bV錆゙'[)ッャハ)n e+」ヒ +U5z(青}yュ桟m祈リ0*W=5ノ掀+アTFレマモネ +嚼XN゚eーI霆エャ「ク'@b?sナ pコ耗ZQ冨ミユ|gKノ uゥンV彼籥++DyUコカー垰黌恣ハ縁9 +!彎*ホオdウホ楹捨k゚Jワ8懊Tエ\iソkVモシ&ンケ禦ヘoリk峠Q・ヤ+FC・o」リァM=ヌ}`lオ[站奇Tワ;ユ"U|ア+ァNニ聹Uエ靨裕メナI5ソjコレン耨l」窮J9ニ\責眷ゥーs分ヤーセ.-@冦魁ソl(゙トXヲユl彬2F赳・KIwヤ慨^禍-ニV+ぱ<78煮アャ龕ェ ゙リ B当z.{ベ賛テ姥 +ウ鷦麓Wユ>ョLG裲Xメ7レDァ9ォシ +・オテ;*-!ヲSィvqYXオソ]ネh:房(diセ簷 +ー.oDp頗薛クヤコ0衍擣-」ツ^;G0{{」'2スf誨ハ3ш5uテ#寞完峇、*%gL精ス-i+W"tノ4ニ碕&6Kホl湎rロ.ヒKォ-5鴟N\ト頁rマ=*j犬dツ兪ノ兒ァォuq=ハ eF″ァヘャ邉エ6マ考Aーコ春`rdソ)スVHイテ宛H S」ナ9Xx<z&ァツ珊莢葎ヨィォ閔」籐UッンェfIェ.キn青Jン纂 e假IdSフサウヲdZ・櫓悸?莫\:eオ3ゥリd7・チエWワ截b砕賜モ&衣Lキ ?Rリメヌo絏鵞ノ呟ーカ ヲ*dツュP>F+クb#ヘYテgネd ヒ垣2ャノnoy[弋oレヨL-キケGニ砲」>ッョcツ鏝ェzZ,遵dフq)v・筆ルuヒ@ゥ[.nヲ氣NE]ホ敕"pR6ZNェ「6;、3昧Tν[ fァオ ヲw絖幻_'ッ枷Mカ彜1ンラ5 ワタ}レ~K溘TXB}6[カ.:キ]キ"hロvnテスK恕ンQ昏U(スネワQユLE莢吮9ヤ] 。*サ0],=FュHコyY(ォ(mワロ「`E・,QvnBオロ゚m袿ホqェ俤[PuHXムB ゙=它"ヒf);ァ旅ヌクw_Lヘマ狸*タセカメ9T汁ソシメ0ケJSタVク4ロ{>Tユ3H ソ/共&ブL_Ud 撤 ヨZ餒Xエス$5◆Sルbコテウコkゥ玩[ヲュ+nDyアKRセテ 鶲ル袙ソFHNノ探sネP',斯ム)ニqワIユ3pJlpA。χつョRャ甫ウLg~゙豎It-ヘワ.[1gホ&詞gンVヤワI/髢凪ツ'」jラ;{偽穉瓢マ讀Z地ォサSェaqァ1Y)ュヨ4vォY'Mニ}Giッァァ4ウ+jャD孺vノNヒQヨeX鬱5モ\魏餘@.w囓「ヽ゚隻@ルロN%TトシqV8{o迷゙R。カultゥ@]ウコeア2J歇拵ナヲネl脈邵ーsWoaィム[ルヘW70ujィ、ぶ」Cャサ!yR9{ニ-Aェkt(+淮苡リ銓ョpタZムs2NLワ蹂}ヒンレュl+ゥ^ン・~ヨCuカ毬ケ梛貭y訊蔬gイニ.Kゑ輜(エ*AスsRサ{ヨエl)l占 ケug曦9 Hミ└-ケeキサRス`。習紋「。IアWア3ウ鍾8」Tヒヤァチ、ャ頻、gF 擔鎰、DZjR゙、h +nヘ。@互Qァウーm+ルjT!m日リ4H* aャEツムヲャkリーNィ)y゚「q H鐸'd〓iミyvオF ッ|Fュ?+yaゥ +_Hjョ9kニsィ截�DUュOmシ4(Q`;Р距オァ]=Eンウbオ圓TョエンJJ-ェ:eフr8.ユクoヨ]褐~ケ}黍┬,エロネ;ャイ{キ`ョQョacク??ンNUYソ(ソリ;jオ貂TJ 塋疇\徳`$棒饒ヤ癩;マコセソ9uセワ;ナ?,r{RW9ワ;;FQェテス耻|'e忘ホ瑠゚i」゚飆\卍}ッ-ヨ棉郷テQ゚[ァ゙i璧M営S25Bチ 1譯゙;&蹐スcE^皋゙I 橦PX艘ahemシリ;ヤ<戝゙。*ホアwシVヘ鯣゙1{%キRーeej、`庄{鱗g~e3!8ッス;ハMYサTカSチ誂>ッhC)c7tqX?aョア藷ッI邨|琳林G{ノwィ)マCセC)ュ摧゚鋤^抖iセ汝ロkッセ尼庠 セY5藥;ヨ{ホス;ツスロbPュ緲?4;ヘαサeスヤサl5_t<嫂ゥpン・ワソネV |GIュ=京エユo[ホ|妖エU緤Lムヒ&袱。ムメ;能ピ・ メカス;ヤ甬;cィォ7麑撰オ"+ス;・「zE1創新ムNK _狃L!_jムュy゚チwt泯ミ1Rィ%セ3[」マ7ヲM+゙*ャヤセゑゥ圉ウ�゚舵_ym79ニnZ]騾ャ蛟゙/゚ヘ.撰Y蜷ネォ*撰シ3r*s~ソ8;姑>O゚nY牘ッCセg +2 {芫|リラ<;八 ^、~程イ、約テセ尼fa゚Q探ラzルwェHヘ=@ノサャ堡A゚Sヒj2%オ抑'オ~iヌヘZNハo^m/%vDタフDjヲソ」ュク8セ .lミサlオヤN+J{Ro10メqJ~、ソヒ4キツ、レ ハャザヘ1bュル^旄゚/]&1譯゚。、欲'ソエテル駢樸6Ne「ソュメx鑿.桙u鑿ャS1u)ィAソヒl0�9ユ竺@ウヘCソモ`モモラqリb~鑿Gケ鑿揺;セクムタ゚チ}」庖ニ゚aアメj=;披ヌムネ處'オu軋黛ナCソ撤エ8{鑿ラvmNソテ"/・z鑿Gケ駢隷;ステャ廓ユNヒコ゚、p)vヒェゥホ8yリ`?恠w縛~wゥNソSUFK5ワがル|Z<サLg�Aヌ゚-セd竊ァ廟擇リ)ア匂}カtV」リコハ響#[y゚〆ipノp擱カイJzwRォ互 Eハoiケョ`p=ロヒソ:凾ツ�;,/ヨLホ、ヲαモ4ケ5輛sヲ*u壹裃)Z[ァ侃゚ウ<N6Nケ勾、イFワ; ~sミ矚a・ 矚。ニjナp:3マywシコ6Nエセuwレ>u>;%養o裃唹g=;\Oラ,gpb類`J^;カ」古ソウ :;飛響C|Dqテ-j卮矚棒JN_}./cカ冤ツNノw萩wト珀)1幀ケヌァヤミo板o*V;ヌ)];ャH/Nユゥ ーe- +6ヨ&7dムH9k|゙ヌゥ塚サ」ワサ」g娚ヒチレl}ラKソ%_絣Ubォ"9o螯゚5鑿髪ャッオアvェA歳(qe{誦|Fナムウ傲ハ;煩1yf諱`/Nj3摧゚?翼ソ湯fハ/」眈チ゚柆ョ昊+}ス;7ウoンヌiタ晏."_5ャキソセラN泙ヨ>_拵ャセセ8#Noマ[ケwG  ュy7リ5y.゙8<uレMレョ?o�゙Qァ祿oーE@1珮7]oオ`ソモ燎 メxw%挟Jb・nオ8゚;)」9懍8イ)ルソywRヨGx゚wvフN!ヤZZ:;?ュ、.ヨ獺ノ肢晞坐テ日テヘl?ニ゚衄゚]ェ胥 + 聢Noゥ&ムヌR:;)劫ッーNZo<Sヒ8<Nセgネ菌ヌコx囹c 4カトs゙Qn゙・:ッーc'溽棄Zo?HGトノKモ&Jd タテjアァ矮wカVナ^牾祥>NF畢-タ;ハ3 l5�xヤcカ�ッ�5M濂ニホツ&�xf.`マR+m邪它GT%セウ訂ハ∂ォK豹ηモ戉ラ!狠a*n<ト<C嗣b<Sj(ホヤ`.kカテ・}Fカ」シ%Uスロ<jEV5R楫ルハRrzCア凵$S_7C  +rヲ,Gロン[ーY黼タ」1'蕾蠅mZ-1゙<jE5実33ナ h゚ラβテ カzxj7=β34 〒}M2<'] 濔ハEタ;j2~ホトソ捩/�O7ヒメ{エ瀛2d猖ケ蔔/潛ヘ牙�pbォ3�^ヲ%テ イキ眇ヤヨFレ�<ャQ9�#ィサ GMJu�lンュキ-�。 +「耶 タ日ロオCタ督メTサfタ它ZZ?<ホ9o/NH&琺+0ャO・8e7(7ィチヒフo゙:vィ7#ルキェq%ェb:ハ債;jタエ%ニ收ニR@_ラq\ニ R.゙Qュ+Gg碵}キテナツC9梍゚ OJ蜉ン,<2C券チツウ\ムラ ・ケシYxRm,<研 '.Sマウ.龜}ヘイqrオ7怛w縛wヤ`瞼;結|ァ!「ロCフゥヨ0ナP興ァm/okEB卸 タネYxGケYxG5槐W%ム2$ソヒツ」+ー0ェq?%fmシ,<懆lqaッzXxfzGWマナツモ鞅Uツホツ」nケT Z゚畄n゙Qュァg「hrル;=?レd=,<寳ラシ)Cs゙Q メb・d鑰絲ソ(、フ.w旆」8U<ホtPx<枸・'ヘメA癸4纖[πL)ソ(<{ワ:(<)ソ?ョ[+pyツモG3ァ稍ヒ +(7 +ィツヴFワ鯰謹。 ァwテ8輔ッケ6 +OSuホp」、z"リQx埖ノ(m枌盟゚ョ<(シ邊FZ`x6ノ.岌~}ax3ヘ6ッ00シKケ`xG "ュゥ偲ツモ[ヨユテツ#K榑<,<|]ソoJツb癸rムeg 蘰eヌキlホ塁,<V}氾ツ」ト碇Sー.蟆手,シLbp{ケカ洞マュ>JN「O<サ貧 ヤ1ワ<ォヘN`Xwfソヘ)ィチモ諱uネn7チホアョ6h膃ZS6淇7ノ册ヌコヲrG +」ア]オ4A扶5ソ|ッS酔 $梵)@ュ綾泗Vー8ナ^ +ikシュシュOマQラセ(1xzヨ倚N 戒ニテ6ノ該則 +5鶤チc)ワ<攤Fo +楪4ソI鞏<オ(肴;狩uカZfzi7mq憖Eユイ)x[9)x[u +W゚鶫チテタ嗤uRh6} 陽ア哂;K、ヤ姿Jチkヨレルo +^テrォ宸ヌq括'ラ^ハどc8鮨w曦ロラVチモユ'オvAPY71セMチ迭ァ胚窒ヌン\km +梍ホマ)xト蝙ヨo +「レ6O0卍D <ヲアァぉ`ゥン<Y6ヤミcテケヨシ)x灰7{9。)腓t3)x且vコ(xRWyルa泪f0PQ7 +'Uゥ瞭}J(モコ ^_<イZン%マ*gI^モョィよ98xー9エ 桙Sエエキキbァ'Nツツmワ9xj汪オッ訴赳ゥ劈堪萵芹レ<]赱ェdン<ゥ黒Y`、 ecコ欅ソ1xDエgO J{セ挫C。ト狷潛m -#鎰7__萱<ソゥN +H硝v +櫁ッソ゚ン<壗<ーfOWVcンチS,ュ>ンシニ 浦ク鷽シ x)V鮭(=。/チ潛・%!x祠Aン燎aJi7V[チCQp%!x(ヤt<$zぉ/aナ、チktマ<゚MチS[ホ8:垤ス宸ヌクチ獻8y0J{剱¶ 胱?ヌタウヤド <=M 3レ 秡犒鬩トべフ異ノxリYOュマ慥AJw%!xィ ;エケx,vBQ輊ぉ[ネ チウェ・e_+!xラ %終ゥkCヨ`uン<ァ '<ン5オJ-濂N7ロリ<泌モk鰯:ヨoサ?t冏 +i1kXyコヨマ迄詬ラヘラ?タ#]'O*絎RXョ +V。'Uヒヨ、爍P <>峡腦チcオlロVャウu%`N-ヲ瀛颱シ7)xレ^ヤ<= ソ[レo +オ[Aチ」h9コ斯B{ gX呎J簔@宸'・峯ン<聯ニ道)xカウテVハ)xxeb養bコ# <怩ァロSィI;(xリケウ ^%y慶エ陟薇 fo6証(;サタfサ1xコ^マk)クカ゚挫S」モレ~rkャユ6O +アケ萵。P{を%慇倪AFYュマ>ノムu ツテ識鰡椣卆 禄ヤGメ:0HxDゥ益O2ミヤモ7O7狄ЖH信 ツォクnヨオAx<┤、ニエ0チツォャ\エ楪@Vソ <「qユソDを}rgOMユ、M。緩硅婬ハЖ鍼キ!サU|赳。Zエヤ8x倦チチウZN寇gウマ$<サ\勺3恣V&ス麿┤oji 皓助I栓$ノ9+ヤ幅Aツ」�L%、Iツ」LoN(ネ#rをP;E=ツ」0RQケqを0"}jン <ウ&ヨ瞋{F4;ォソイAxi  <レモV7祝ゥ"エ呂レk┤(Ng <錢t+8jjムcツ4r、カ捕赳Lヨ58x(゚[o枅脾yハ捺。ヒ娘ノチSメ勲ツテソ竭ケョhモхBiオ 2囀kT(<ェホゥノ=Yx燭ェw綮lュィcテ YヘGnO。エ瘻ォs& O韻K}4<ツX_ァz節9仲g樅ヤOトゥg&xx訐@Tナyx +uョW蓊ムイS{I枌ーソW}n俵ュYF6yx:ム吭硅sg枳鞠C趁僧U*3U}オオシ鰛l,、シッssニSィxサ6/4g.[mショkヨ 蓋済マt0ゥ!ウjjyュ獏<凅\+rソチト:-od「'カK「吟`稱lチト」絽コ)スTYo$1P>?靭ユ(s#]ュD磚ォテー,靭J籐テH<2o<ツ'獣椽粳L+」(椁TムstBpッV/・I*ユエレ鬱<ェ」ツハZ#モオカゥxTveO,*{ータ筍PX<)カ9アxTw_゚X<Blu'蜍ウコ]$v匡ム凱o`ィJュシアxツl+X<踈 ,梟ヒ此X<ェ _:局`ョ,Sb佛H 杞<T6uナ迭&H,Vヨマヲ賓S$リsT<S ナ< +�蓋淺jウ絵+リ偈祺颯ム。x黐レ蓋ネ~7OGソhヨルヨ蔓:オブニ\ス=MO&楫觝コG3エtH$槝Mコ!'ッfラE $^ナ・ヨsLヌZルフ~"ィ9ロ凅,→&+<ォ%8x、剌ラGレ0xカfiw0XノQ。L< Uナ Yノト」ワ`F菩 +ケ*_朖シJ腰ム'マヤ*/>ハ'匝ユ桐.""!ワ 筍 "ォM、'%nニソ3 +タ=ナ@73銑"樊聳7&2ェa)1H<ハo゙キワH<T= +夏瀞ネタ8Oツ呪 $.|< ┬w7OEO"朷+麹S、xーヒS[Z諫s?鉦YヒVカロi拉ッMトウmマr Aク,オn"巖ツ?xミhタ "枡*|iセコ飆トk`渉隨イ<H<ホ∩ヒp、PKウPシ自L粳/='OA 5xト樗?O(^ル3セ'オMリZcム潛y% ムl、ソ1$2暑Hワ+靭(マ;/$!アJ"エ ェfヲ@窕Zス廩< +!轎7蕉 %ト」.やソ姥ノP{薊<<ヒbO$タ'援)qカ@竅4Rh&匝リヌ*t!p嘸キ匝fiホ再モサ鱸`秣[ヨF粳塗K$gト栃エD<籐i}゙@<ヤ'メケ%曖" ト瀞ソサ』ヘ愃ハ簷b?レ@<ス「Y'州ヤ/キ0=ラキ:xヨョ+x握S蹇<Z>ァY・PユユォO逢Aタ坏oカ-マG0痛箜ユQ7|j%ッ'ワ沂ヌクル゙換M(Aソ瞋L2[サixィラ'蟾L寐'・L>』t擣n 槫ソラサ』(ッーメ^J。コ゚Sn$楪Zマ゙再#・ノェD禳゙wッa誘^ス鴬L゙7拍=匝xxヨn&椹@吏L<W}ヘトS墫iァLタ齲Jigフ蟋ンL<3ソm3ネ,ー&跣ソ縛烏シスь&。髱s3カカ~:xls3,ノニネ餃<ホ\~L2粘テマ 凅エ*ミL<ヤyKN&^ザ箆ト」゚輿)ムロ&セy&3xクキu&昿ス絡 +ノトモア|g0カeqx HvknサxJヨ6シPJー、igフリニ)ルj俺絵=諞粳[袈ロ)ュ7ヘ5黍m(.6ナ」), ナウキタ;<oTU甘xヲォァ「`U麸鴆<;循符筍|ユ譏、竭S'X<Kソ}cc鏝スーx瘢訊pHョォ,"クxJヨ鋳コタx& 饒<}輩0;O_■珞笙Z\Xシfス肓aニ」[曹県5+ヲ$綢lホ屡airア釆 G晶吟C箆。ス熙羯7nルt<メ,Nnァa|ィ鈬.aXミ( モrIヌモ|ヒ ヌモ&dヘ而ラナサ8桧揮' �|タタュワp<ィ4ッb1ィホ麾肓1<\p<戝ママエ@G,剣p<zウラシルxJkアL6瘧ンhシソ聘dエ渉貶サD絏リ靴・戟%G!|~筐メiァ玻ルxzDyt4匹゚r&UB +dEt:ミx(スX"ヨv県.vキ>ッyネロFナルヘッムメャ?'ムx NイメVb甌'緤l&ヌx。4Kリハ#リxヘケム莚j6ェ/6朷 o。ホルxェ鯵kl<VX~ツ(硲捨痊ヤソシ傘ウ>ヨkテヌC%カp<ネトヌ羌|N<釘タ罠hOq操゙u箋゚pシn5~レルYフケ痊rミリカp<ミ}ヤドAqxGケ炬d=ム瓱ム<゚ ヌテI怦ヌC$ep<1ロ紵a駱チコニヲ縉ユ~イツ:梍゚痊ニフ@ノM8゙N8゙。-Iッコルxツヲクリx ヤ゙悴,ュ3炬[ケnGェヌ3LBウヤAuィ%8クnル&^ア,(qイPァÅ5#ーシs4泛6アリソPレy'OハC家モウDュD「tノ'd緤イァシ*U4ョ淳フッカ紫Jnタ、リキ8゙゚テsZゅl適ヘヌc」≦Hタエ &用<&^複^p<sjcテP簸N8g*ヤuチ、ハ 8TUロ&条鍜ワ綺カサフ ヌSpオP�pシJ}]k7Oヘwテ飲;凝阯SュツヌCe +8ハ。BァgッO6=Rクホ.ェn昜籍H鵯fbオ'オd<ン[j;ッi!/KァヒIニSIト「"$ネx;ネxR竃cU$K・(ミxRフxD緤Vサ{_、オo]}0|eタクリx48キ藤Gム.傍チニモサヤナニC]Qv I惚_撥'竕ニ」CAリッ2lEk゙h<8桃ャOユレG緤d]'ッ砠:襷罠伐>アxゥyU ヤq若ネハO;゙ 歡寮eナ3矚x[t$?)譽 ツ饐f'オQスリ-'ナセ夏c宜ム7 砂H&アfy0/kヲoカレヤヨぬェ`ハQ&イユ`粳O止イt・ォe +&ヲ从舍旆'x[8凅4*,;64誇Eマ眼゚カ。xx4勧fq6遷(樞ユ昃ルD$タ<'搖ラリルyURマ゙ゥxl薮e睨Ljd- オ$オ Sヘ{G酸キセ5#ェcケ桃G伶DタP"マ孜゙?Lモp : +<゙゚#?9kkB~mワ<xZ撕鑼<Yゥ゚ヲ耻麩_ッコ*ヮW懸o梼G 勦梼g5>8kMニ憶剰タpシ0O<桾 漠x<ィ <^A6ヒ塞3;0゙Mヌ)ャ^7住cZUN<チhヌC剋ス#-`鈎現DWA <ハpp鉗セ_Vシz糂py|ミワァ[BTRケxヲホセxdヘ下ョ渡>JDp +<<OAakl?y露<始&!Cu`?xZノ辻シxロヌ!将モ]Aワgハ{碵BK:U5*ヮGgナニ躔゙5ワt<Bモo+'oォAヌ;[ラィSクlfトpミ dイセ8Zzュ゚:uTモ牾 ヌCl8ナァ紵而マ7轢紵。ミ&痊R,ヌ|ツpスヘァg!「-%Px酔轤罠◇肓bxル痊r アユ痊斐レ瞎;エ-ユア]p<:ユムソ藷臘マ&c)徂シ東ァ奨ク:wzロ ニ#_AGG':ハg圏ハニ3U○�聘nLKト�゙+B[リ ニS;ラ}\s」絏゚6ワレ8サR1ク:7マミ)ォ゙d<)彰:哲ニsJ>ネxユ狢c」鐫3@xn掲7D聘ホeユュRSニhシC9ミx[54>佳m「*.ミOソムx|丞fシ!せマ ゚a罍ミサuイLヨf罍05マ~e7 モbー偉ル7o+'oォチニォト使sイャリャ菩=ユ シムト<練, :X*齎奨ラСシ蒹甍KァYp'従蓁m竣ワRSク\鈬m BM>槲,3X @框 <ウhj゚膕T7K疣實ヌ3S(w。{gi遒繿,c寐寡]K;O-Sュf辧x<S{ィ}qnメoy +/ヌ緤甅E]糂P縉 +権Xネチヌ#\フ・シ ニヌ捶<゙Tチヌ」c秤`薈鵄dノヌkfヌR6Oハ;」DコvyB飼%!Rhト酘スノ3モr奩5;!O#・vニヌ」~z?壊鎬。x;xRリ&P>棠^ ;「 金綢セ[猖ヌ」ハィヘュ#ユ蔭Zモィ サ酊紵v>ヌ聶ンm蝶鰔リォ、4防Aヌ羞3wFァ縡 W、聶OC&>閂イコ|/テロ=n嗾<ゥf#t<温ウ「'uシv□縡ヲメホ徹ρ\馴7呂fミリ.匈个o{メqAヌkフqeホV・徼<ヘ馭mヌィ車 頗執蕪執ユ緤=Bク&アw?9n<&"\テ<テ J搶w( oォAネSk礇鮎燥X戍f]ェナ嵬舵z婆u $2B&#ナk3ネ) T慙D>゙゙紂膾Z]餐゚igョ。'#/F黨噬ォキソア リハ科ロj ミRj<ュ83/Bq4cB; ユBカk%"Oao"2貸@エ・D>7Mゥ怦<S嫺2警ァzTカ|∧#Eヒ科」1掘5撃8楴餾ク燥KZy(ヨル煦<ホ|シ#yコ玲~辷<]F{ケ孫送b"<X7嚊ワo/D朞テマwァハマランE)ホH瓮茹=T +K=琵ホZcI<サ~ヲJ班ロ!:オ6nD栫Y怦glユサ舵"/Dj ンョ>jJF樮oFスyj~ヲyエム+絃.F棠セハ4ォ]bセ&カ。屡縻(vUア:SM l∧モ゚ハNFスr OF框 Tヒ禹ny(8Rロヘネモqy#醜頸0 ;*ッ霏8!y且ロD淺チ[rOw+ +K蜆ェC(。6 yM:1Fノ6#O楽#.テ淘ハU H淒西,0サ y六タc +H蕾t%$PH゙。:$OO゚j:セカテG}\イ菲GチヨO'%兼挑マテ >)y,8ス゚ム0.\絃息}K腎コユΜM XHWキV牝1盗gハ::/mZ5y44#リ=モ[コ註Gラaク 臺セカ:モ 葭楾シ+, yZマフ9ヨ&葭潭7ネc.&<稷ヲs*末「ー照* +ト0淮モx[9y[ B^}メ]ミ y4チ: y\Uキt)c]刀ノ y抵f|ァェV!Rヘ|&t*オヲケ鬆゙iaエシ晟ネモケフサ衾N-マーナ8U ト5唱:(^カェOvヘX狷}ENヲォeチコモ>イ{?ユZ糾硅ロ ubjnヤンHx宅メ?ン區a糖サィカOフ6Gヤ=梍;。( ネワセwレ験*: wlp'aエケvリハ{粹z.b從'ァ風<:Yy政゙lサ Gロ ゚Hイ]F-ナ蒂ノレ`m\寓゚v篆ヌ|I「擒*ッ%yカ1ュ惇7&-/4サ�エ\0;系+T6wラvニノイS{~{ピイiテSEァ蠍ul8ノn ノ.ナ ルユ=; ィ嫻ナvq菠.;渭ッ{+ bンR>nyt鷽Kム'ュN+qWWヘモェcハVラャz「齲綯典遉 ェknュ~q齧Uf%ヲ刺o諷ユZ/Jン�Eoc;」n6oハ<uウコヤD]N�%cメイゥメ羅,/>]Qキ=.rチァ+Z9ッレ徹WーJ昴萼譜ヨ&虧゚贊齪[ソtE・-箭0'・b|:) リノァ+c:.tE彼贊fNX4tEチ+・w>]ム。'tny゚ニ渣oNヌ「LスO'キ-O'蟾r ュヤ^_碧膵QwナpoN2_・ラUセ骸ュzx%ヌ/>旄叛tオo +!越肓$礒捶:)マミ +<];{テ飩Z7攬Pマリ7tョィ7モゥイモeaァVDモスン幕Lコevるp欄Gp鱠.キセ妍ァ4ュFノメi0gロL: ハ]H:オ0ネ、8tテ[vHz粽葭ノッミ58:船J)エF傭ー隕キ'bNo=ョ'丑ロ8ユR盃゙翆。K眤ミmヘ(tヒヒ黒邑ルモY耡Yル|$D」= xム}v蹈ミD,5」オク梍モ>8πpママゥ4ュ<!板応ロ「鍋エ歸@ケ9リwp蹈5チ0'Dュタh鷭 +'tn勤彜TヨB 軼ルヒ 彈セaK゙恁ユ壙7會Zl罎ヘ黼クMセオ/jd"エケRァラ!惷ケ/ト++Jj、ヘf0Q;hsR6&}薙iナ)<ィ i {$lN"ン` 佞瘢リ +'mョ垂hVEJ絮チ゚コzァヘ=ナ S檄'mNoG裡yメ覽澳螯牟9 mカ6'%\メ誄Yzレエ9.レ怛>6k受モ5ヌgk%チ踝,峯 #V endstream endobj 68 0 obj <</Length 65536>>stream +tsリタoャ9葎q +ヨア/「l ツ|ーィ.ヨeフ5g[gョ6Rp�9`sィ渚油片コソキテ?黨5ヨ怡ャ9剳溪テ岶nR9Xs[ ヨ6゚fネ厩5qノ8Ysニo輌ツ7>ヘiッ2蠑`sヲル6lセqeC舁ヨ 寃]\Yヒケェォp}6キ6キユヘモレキ)rナフs゚6Wfオ゙ス}愨#、 6キ蕪6キユヘ TンNTユaチ=ィrqe゚簧Hv0Dw゙ト6愈X-_イ覬y58梼シUチ睹k5'オaコャ9PVテォ +Iン);&搖ンzA点|lF!gマハロ\ャ9チォーネテ�pO宸Xハチ俑jトソヨ~湶ulHSケソマ+クM<輌2ー ゙Qsr豸ィケBcトX筰'。ホu」踝ー゙ヌゥEト ィケマ5キユ@ヘ驛クメ艶Sワエ.クjNjqラ樮6jホ桁6k+。穃Fセ渣嘛ヘ喞ホホロngOTkNハz;kホ需ナ壞冊螫9E係QSh@4レRチ"渕ホ繙ンワヘm蜆ヘェテスWンャ9ノYヒシYs|醍y7kホ&框cヘ瓷、9Dヘ勣:Ps7オメ ヤ殞_鵝ヘ走cr ヤ弯lt5キ5wィ字ォコ蛉邀u萌C悽9nネォgニE断5ァユ9ウ 6旄ヌsリ=キKケソネゥ[ラ>ヘア)#ヲ淺5u「セas[ケ56WTZ3檜テ +Q校'lョヌYA+;゙=@<ヘ.asハ臑テ貿Bフテ替+鋤&躄*!Eーケ5,スvイ賻fhソア_bッZ珊ミCチ猯アHツEレ1sィ=)s"@ョdn%yトsェ1滉腰エメ螢0'ウ(C{サッj'yTOセケ/ヒjリncy戯タ蟠b爽イ袱eゥ奪ヒ!<&モisNー弖$8、WN3*ィタハ ッチhsR>_'UN'保ツチ葱1甚寧)ェDケ「$`)ァG,P"衞Sャ-喪ソウ~゚2カ@ハI5ャk 螟XュZ 衞)'伏@ハI` 、G゚1]ー +セ・ヒHZトミヒ#蜉b*簸Dケツ堀lV +襄ュタ 任mqvu貽ミニ2ノ|6ソ(Wリユク殘m妃Z7Dnュ刻+LYJ +ョ琶ロヘW麑ハy美ァ(ス"F萃猿K1ネq冱ン(ZM*t\Qツ躔縋.M呻Fヌハ℃ロj繩捕セ猿翩ェ5t*エ@ヌIiO'菽+a溯8搬*nCQh顳ヌIオユr胖e-HクB扛:フ8・豎( tワVNtワVgチ8ヤJW]<0Eヘ;旬=南8mサxo(L7▲oホキotワVNtワV Wト[.、: ァ閻ル懆8ゥ゚SュO.6)後ク媛。网P礪8費sP彝J戍ムカu絆・rテミッ\]Dカ_猿ロハ猿ロj胖N4 W蒲(_8嫂oUD。:78.スアqゥ8I57ィ N゙エ笶ヌ *輯 l噫ニ)F'ユワ2#G43ヒ3ohェ=|ユ]J倬4NxNh慇屐鰔ク「tIウニm蜆ニm5qE贅藁 nスヨ{1.ーレeY^(Sャ/欽`悁-。シク鯔敍ナi爨樹ナAxYァ Slz#<ゥコ'モv-甞ッ{ル'n &.ナト);o\PU゚rA笏_.・mF懋(」カナ!uトス鏑>网sラv+J:慍~睥Oカk 履」4鵬ヤキw崑21ソ!董lクワ 火]d8ル鳩gn0祁種\ク-Xク +。レv勇 肉ォBウ1髟} /オユJ(ワVN(ワV +ァ尊嵋砲O5gー +ァ aエツ)エdv暸S羚ャ7NウキシuS疸スワT8ミhL*6謄yン?)Sケf{ナヌ0A(\湛�8n+'nォホ┻ハユマ劉幢t2礪ー|サミュ゙Vホャ} w9ぴ)=_yヨヘ+8煮ケ冪ラVロL8)4カ\Pク「カIケC碣擺uケC疸 チyB甕{ンL86馗エヘ┻}オモ苒 ヌス\ォo&`チ#~ー?湾zнsI*$カPAチオッワL8!オ模#゙A(爾?{3aツ)2C2冪X:冪鱒xj28s +セァ廓Sp2甕ラ゛鶻68,lク GJ「エオ叢Vセ延モモキ7o$廣'(5nロエイgナ8O&ーU72ロトT=ュhラ剛テE椶后ツ欽"儉8ャTr1碣.「 湾 4D$蚕-?'死 ェ`ツ。エァm&懷%Vサ冪Xゥエ9ホ盂鷲7テ9dツ)el(vt点Iチ燵P8E|( 劇炸kaウァ「ツユョ.ゥp$x澪9NΖ粒T8EQW}ソMピI、ツI% +典8メj +G=k遠 +G)�ゥツeQAR甕゙yC瓸ff *慇5t#1ヌB眛X*K(\。鳥 +0╂qS疝、紗エ亮アp湘1sX8ヒ"<衄ツi4テイ%ーpeE&7ーp豌uS皃ルT8)3 +メ#=妬ニgzZP甕ア皐~ウC&(mu +ロJ*愴1婬8鷺ニz *ウHAモPOMメEcワK≪・ミャ!>ィp(,N*\チマル#,邸8 + +ァ5 fl モラg鳳クソo蠢チヌEヲエォンH8'pG然[ァ|$jア88 o[Gモ7 NヒcイチふニQp栢ウ9Ip檬Qヌリノャe-Tヒ5コ1p2ス・D*(p゚マノm緋o8鴛iヘp粧キ pメヒj7� 美7 VュFz、ワ7ルモQ7*ェ覃[Q /ルヲミコ-TVネ壞硅7-ヘdソタn3 &カ`ソ5_愿ー」P夫ー゚ +Tio>キェュャK/7座=榁~澱ヘ。チ~Cゥ~塗-栫~CY 孺正レヲ/O7ネoコ^lテF0ar[。遨廏Fー垂a'ソ・Hル\7挌Hハ@ソ騅ーモL媚スル─7$k゚7=lヤ戔迚}Snsfwロj^ミ7nラ廿ヲ鮓Aユp茆キHcMbニ&ヌ +カ|E他7ユミ>サqo+廡{モソヲ"ロア.ヤiカァ$骰ヒ9 �Tヤ薮貍}掃 フ妍樮梯」゙?9ォ;sEqd ゙`^1ツ嶌sヤァ皴{x栃9n$ヒ峽猷 +モスニ「サuマQ$ワュ沁bロ゚#ィzvu_レ$ル 剣」vモヒウJスケnェ?ネヘECDdモ碕&S釋ルl u{ン4。nxマセ冢丱O、廈らラ6ムM抔d6錻+犹 IH玳ヲ&ヘMYYeSN麿ニ7vにrSル)F1ノrSユ幔;v^9 _U9ハMア゚ッ9,ヒ)リ暄?ノMc 皓 ケァ6%ネ采ァ|6J深チゥホ r#C6盃q菅 ゚0n +9}uCワエOy^Kル黐+ケIq5(コ3nZ[ 嫂gツ%'ソMm(リヨ8セmト#鑪黠mヘ椿 oS!# +?ONt幇フ ー比6vィQV6ヒ; マe3ラm3テ ヨKハi゙gャエャ@#椏ネカマS:Ilモ,'カA +)カ鎭`ヨZ4s2ヤヌ2スtgF顯sムレト袁X幀u2ル3ホヌタiチj」ユア<「ヌー^ロg_セ麁k'ィMス艪モヲLャ=チiSタ迚i#ヘユMiモyV6xスメiS&2m♪ B[_a匐m=+m斫ヨWメマ6+柝カュ唾f汝Q菎別2伜AfSニ「Sル嫩ウ\カ。tU5\vvtL$墳欟ジホq1ル臑aH6ェi婉ぜ9F飽[ーF籀Tタ⊥XミリTメ獄06鰻懦#ュュニQlウ%Ebk゙$6=シ<GbC(vDぺtナqチaSk肋`リィ逹ヲーi-1 lーoGー叨ヌ`%2jリエ]Neャヘェ.ュcッナY,アヨmZOZク\5井コjチ^テユwNフ倚悔$ッ像ヌ依タkEキ�ッ|タ]H& ゥ3ニー�ッルハwワワオ&P‐モェル2ヤ'vュ`ャe杯?^巉オBスカ vヘヤ*ン ナ3rノ]+QiuラP遠x jラ +5ッ5%xMロ啾ヨxM ユミヒPlヌJ鬲:w!タk%シシF畉玻ス堋+'x uヤヘ]寅Hr8wM f'wュ`ゥヨ谿cl衿杳オそナW7xM括<s、5ノQッ 吠1坿= ツ^SW3ク ^」 g�ッ)躁ンOべTGu^S:ッY6@ッZラT緲珞シVUカケチk(Nb羞眛1o咼<_ぜ&a笘5I4譴ョQ`G |Pラヨ�マ齲ヤ蛙ヤ5ゥ詁ニ8^ッA!"ナZ湧齲ヤa1ーk\Bォ"4-コbラJ煤vM3+ヲZロス!0ッ4セOsa%T^ecラィ)トョbum墅'vュミx[セサ(K$vM|,ョサヲホ<ウ9アkkoサヲ3=ラ釿"楡トI]+ハキ疵リ5j<{7ャQ-$= 'vュPh�スGLJシf'zラPYエxMハP@"チkR牆]5]オルFラ&IMモン・テ?ッQ琶I_-ィ?Zワロ ^」汨1ッQ9ヘl +/xMムオxM」燦E:xMug6杳5カ&j?KZ6ッ墓Fy香<ミkzQ?7ノ^」ケB?bッ。セzMB=タkキオnワ50ヨ(崕f覿6w 峠ヲハル鬆Q葩ワ6クk、 Yq權5居msラh8モケkハ凡 +某ワ5 "k-崕踐ツ5ケkミ鳩nkョラ=ヘT畢スヘ]」ゥCAヲ興f�牾6wヘ(ロワオ + 點o穂>ア・h^ワ5セュュ%ロZンワ5俳sラ8s1ノ]テユаRpラ(ロァS#クkヤl凋ワ5 チ1P。<荀牋&yク(苹ヘ筆慷*そVHSサScrラE,ァワオハイ[崕FBY+ェサヲx云」e`ニ|MQルェア サFeニョ飫佻b`ラ-燻_リ5ミqv ホrー[オ#Fネ サf^薩テ2(N)惨ウ'OqセラムlQ)オ|nゥリy$v ナ2I]#m]ツ笠 +ルュoCラhワ鏐.l陏~6Vチ\モ@ルA0ラ +%掻"ラ &ン ziカ8 + スル愡ヲ/タ0p1ラL}ク┛)6GMlBラ、 ]」k曙 ]」2スラヘ\テ=76鰐ユ-6.膸ナuwm7鮪イ ョ 」ヒ$ョ騏=洩Zルコ$kスツマY}t笞*A-ト5Mヨモq"ラT_D 遡ニサ鉞ケVィvヌoテ遡ハソぐ 笞碵コkZ [+eラ +志堋ずF杉�ョ}ンォヤ#=cヘク5~クqkイz$Kエ5E Xmッネ?カ[#忙「眠5桎ィlカ0ト=蒋/]6k ,eミカヲ-Κe"Rj#tー5イカfヌLo*ノコgェ-ェ=ト 4R,Pー5)$.リZ!W:ラ劭昿%=ノ」!勳゙E[ォ2Oヒメメタミ'G3iヨ'mM倍;m(?hkトEコ UラネR蟆5鵯^Gr漸縢'チ[C・ヲ-`k(5(婉簿ウコ iホ^qy4サiァz WRヤァセwケhkxX舍l(ヲU濆VシラVΩU}6r(懋沒カヲ瞰ウqT堙ュaLM�ュ!槻レ +cA[#゙D零I[#エハシzフ(hkRセム キヲ梁妝キf贐セャオ#p籔ユュQ衾シ%8jyOt粐ュ甅ソカニニ凧ネュm蠎ゥmヘ|ォォ#,!tミヨXbウ. ワヒpB'n ョ牆。シN`κサすhEX\u;芸ョケ&M゙圉&長ヲH69j譏Zハ沂キァツ偲エリu;pkエ$Rクu籔P_Gゥーウコ6nソ9アw瞶ア)ミ~瞶 +枅7ヲl,アク5f]zモOワヴ6m A、ュq「mM*フュD昴ロエ5怦楸5n貪箒オx'ikェー ナyムヨ茫A%jメヨhL37_&ムJニ#xメヨPYEm ・;箆bNO、丹ワ3ar゙ンvDエクFヲ-R・cKニ$ョ骼リB+k゚ヒ苫脚tt奥タオB*マスア1i83オ'pュD/〔トPSタ\舍ュ胴ヲ� {我ュ 爲ノD聹ュアミk'柚cf^kテケ2エ杯楙5Tワイす& _ヨ、�`ケkエゥウ7]M \ォ赳]oャカクV!オミ翅5=瞶 qラムヘ倫〔ェメs麹\ロハ ];TッタJ:ノタゥ焚OサーkX・ホ~タリィ4;.テョ厰砂vィ3 +忌%xM」ェh杳5ヤ6ッ。袴6xM笠シニ>只@`ト*ュ4テx 躄s-<タk勉隙ナZ^疑$xP"鹿xMメミ Tc飢nナ(\ソ髷5レNレ。zニn鷸。8轌o齲Nエアョク脩戸・疚|オコV0gッv *@lニ]S(丼]#@L]y@ラリ-or「W雫ネZ7s アネ5 DケVク]ネ5"ク_ント5ウ$ー#柮ラク6x浅ヨオ撚ヨ(ノiサ{Y諷[=Xメ纂Oミ惴6ワ肚く細ロΨニ@ホ校モコ串ヘIZ筋iヨtニチY痊Rヨネ履52 +ac ホbュ/7zツレhVヤ捩5ィ椙Nセ囃/Bpシ噪鰆4bヤミ<’拉V'[m, セ'[Mm92ネj +Iェレ鑪BユBク亘sユ4ラー7Xレ効鉞ゥ}A +3IaマCロ$トライ>踏カシC/ゥ�ェ隷'JMqSB3'I-m B|゚Guラミ謄ZrヤT2豺1j?CE濠ニ^7DM&+>移VN移V「カセhァt6テ驅タメBN8コHqdEiチ P#滸オヘO堂フ迹b墹スイ.z竒t< 曜ク 陳 +p%>ムiDアJrレ!緤讎ゥタヲ駕02ハ[88I[tfレ逋ヌD。)狐飆Lロハqカ�」ャN`Z Lシf1Ah」砌・駭巍MィZS8他エT.^圸・o^毀'ネ'MN7ヤ愃4。)セnm晴4ケMG馘ウヲZX&・aU_・ゥ{崩搏& X嗔&W[NIモfテ{@メナホ工S枳セチC>ワサ、 7`IQ9ニ貘」m癶」・hpエIチF荒。ムVル`4ケN|^ホ礙ヘK' 寢6ワ8。hーRo&゙エワHエnゥ「ナソOZhC#ミヨオn〈オ膤0「sw磽+Jひ%ハ3v`ミヘ~諞Aセヘ6S{"ミリラ硅ェjF掲エュ惘vェ院+黐"矜Xヨ8VI@3゚ コ?怙&F +崇〃�オ=h覿舸 +カ'クウ麑E」y傀ヒ%3ミス_oY7ヘヤj毯彈ー[�eE瘠孅% ・oカz激FZ.E'Iュ&ヨ&iヘTキN夛Z,4ッェホLng讚s ミ、Zョ3hR^<ニ辞ッ朽 蛟A@サホム4ウェtNEf5 :M1g 4Nクiノ@督V-hr0ミLRS゚柎マ# lN5?V0テムP攅テb `2~ョ^4ゥ゙ス4 「 k� 黥IA笛オ^@ミ$XユI@ミ8 }Bミ0Z!-4%メャハ2 hェォ1イ A屠vA瀞 M界N*トメq&tォー吩モテxrッゥ49 Z。シfB頷│7伉Jタn゚7ュ(ャn蕋v謙9ヘハァG4)じユi_F%畴箱攷Qエ訛コXTヌ8m -ナ�)4ラニ泄L3トイ疊・{tタマエuタ櫑4Pイウマk ・カzテマ +ャ`ロ>ヒヲ喨C詩衙>ヒz>^^ウュ懺ウュフタ3I/刳 *T+ァゥ゚カユサリg器Z5リgPゥ>従ホVN勦 +建Pカfチ>+j頃アd櫑5寤`櫑%弱)z<+vイマ、2j チワU廩咒W1ロッtマカrマRLi∋#ヘ関i2cスミg6粨ヌゥuウヒ9!懆ウTウマHア。';ヨ゙ュMェ附3:メAy慴フ'|+収オv」マ$ョ27 。9タ罫3ホウャハ>Cュ5」ax`9ムgRネ\3}3?S3Zナ Y +フヤ~Zソbp@ー pルヨ~」マTヲaa<Nホオ4y乞ァ゚ミgxニ頬囘+脾n>モo龕}ヲ罟カムネ惶盞Ot:應3コメ俥8/廢('P掟Fチ ユッA>縊.G遍3f<ユ懆3lWハ  +-x' =ネg|經積イト"湲`Qlo、F ハA>;T'湲;dヘ攷[党>|J 歛jホェ$泯Rq佃h:ウ巧ザ觴ャャ埣ー+lォ>S 4^Uテжヘ蔓Mナd泗奥破ーマpト$7レ囗ノ>+OヤユL +ヤJLKo]N剿ラZ'Lヘョヘムゥ >Sュ.燼}Q@ウ3ム {&キVツd!逐v燎:#低正6xホ8ホQクgj_ェnBツhムR|ウソBナdrシル_ッ゚゚'リ滯 ュ?Gミオl啜*彝閉ッ羌[Иチ識ウ,P)|ュフサΧ8~マ舷ヘ]2ワ0エョ握<「ココ"T,"!)蓙'圃-?ッーf゙Neム迥^謗ヘg禰エョJi n="-スクアE衂V壷GンTエョシロ]Eナk儲at$Vィラ\Kサ>ソ F乳u*JA8モシュXQ;nウムシmユ濾ニァ」ゥ、xエbxゥホG+ニリ鯛エbF:R、+ツィz-コ諳ヌヤモ6.イヌd゚%巡モス2カxニ!賓Sサカ*、ムロユホァヲユヌ2W絳カ巷0Uej(u^>ケ?ヨk6]ニ眷芥乞{ン鋏yWィア1Jク祀・G*ケH)LF=筈`フ4KヤソRァサ9シンミイFMKeユ峺ユマK援SI&w\コヤV」フ`*vaスサnァ8レ」ルラモ)\7$トゥツ揮*NG鎭刀*キ悁l4ェソ渫&�・zサ"ハTC-&イBミrG +=/トyマ>Dェ!*I*ユTャ5 +褊+hワム厶{+?來P_/、 ケニタ1=゚ン5w6ホ^ォ鶚オ?^fル5iw=:テUッヲRィcP・Kッチ7&Mォ隷トC声jワ)!コ'ミ!ェロフ轗0ヤ閙メエヤ。?ヘOoオソロy姥モKBU% +?ロサレHアリケN コ喊g,班絛ヒ<]エフzui�磴」エ}X'モ・キ蹟カnc 諮] E%"4ネ] G;rQ$&仝ス/lalク咼幄T靉ヲョ +サフrxfャォ刄?タ2Yシホトレ:>珀7_~」6キnカ咼&3ハx箍マ ネ\K。ォUU<チV塗]イハェ,@閑顫ノ SFYV纛スヤ ヒラヘニy5ワ+整顴ナテ@}P8ア-d跫 ルリ) ZFnaセ稗衢*曰チ[$ナャyナ;]ヨ7孺my ェZ)フャ($ラ、d}Wェ廉 +ォリf&!xコハャヤjdlュヒ(Ha=ロy鶉*Mヘ寢ー[;ヤマ2p]8 z麼vィLa@3M*7峪|ヌC]=Zt・'r+ル&~聴ウ\*叛__ォZT2{(ヘ哨3ャ\|W゙鰄ヲメョ' + +狭湟鐺メ麩Hスンp ・膣ヘ釵スイ6~mォrZヨセF2mセ、bZムa賦ュンヌUg4;俳lロ。V」ーuブコRZミェ蚋「+スキヘモミ.針遥>5ノ1Ql拇 +ヤ!メホRkムZユΠU萢$Ylz覓凱* 4ヌミツェス.$ホg墻ャD援-、R-g<)/ヒ3絣T(6押&_>ッF 鎹オd)/]賣み隶モQ、伽+X +5Tニd90ュ^前ロP�ハワエンswm%�ョ蜩ヨZhン叙TVィzキGタ1P4セ V6ンヨチIbC些腐 gニ8?!沁[7砧D_Ocナ「畆Cee?ヤ�0> 」ャユOXM:ム|ユbh嬉2タェ"Xl」サ控(ェFQ} +m鍜N_鹹/-馮込シニテ?.p)チbモOキ;e0~K,溺�R +nΨナミワ!マvE{wセ!ンヒT8セ8旬ワ筏ヒ:マVM淋リ,6i^LJL4X�ャュF「澣嶇 カq=f\o゚u(勘!VェMョj喩~ー[ヘkマ ゼル 蜿S甅5斷m夘)Q゙ホス+ +袢Vオモ}<貉リ"ェ5JホsテリUhェ#ルヌEUニjfU>舂Kヲq;・レX� ヌey羆fZ) c屠$Rケエ*淌 O械茶ケャ#メw#pヘ吐禽ic゙Z{X +ナホャ、]偲ニQ褞9ヤnyレヤV)AM_OT8S_y懌ン6ゥO3ロハ:シS送メ_Pン桟", Y+ソ扣<カ倣>qj[゙dロV姫酥=!タ'ZROX(MuE繖�弁佐ソ<dッHュ鮟津% �「泡Rィーo$躍」i枋タ^ロカL*N1zIZnzヨ治蹶3キムシn 喫~%擶XZ-~boエ75ヌ-ソキXrゥリハキYl[^4」瞠@> OZ5。諦チb繼.IeS$册/fZヘ$6Iセノ゚ェァsスョ>ルセR゚$6MKス]V營ゥnャUセSQC切カェエべロ:kfョユ恂\ネロan宀T毅XLhナ2Z�`廂カrPx。リ擯ォチツ"スレ>a(メノアッPオ召ウスケ Rユむ5 ヨァn瓦m!ウ滓$ア)塋ゥC岱fyZヒケツャリ:+z裡シニ檀UトILKぺzャ# +(フイZ・{Bノ'ア!bソワ"ヨ]イ襃)=gH・咾ヒ~ャアPh +青E狽w致ロチcス゚ヌィQ孩ン)ヨ磧e M:]魁イア^タjS耕゙bOー?^uヲp{nソ年Gヤ6Dツ忍>廓9vh撈ヌリ`6ゥxJ・ヲモZエェ)ヤejc冤カ.F薹4ウVッオツ督TaVヲロニウiKC ケzpv'ュXルハリュb崚Hソェvキaョ」ハチテァイ(ワ,fgbT」K・瞰鋒V$ 6ゥオフユぐ「,wWリニc]=I:3シ擘Rゥf欷8群物vト:L-'0フェDR蛹v,:ンMEAエ};ォT湯6ゥェ1アルa,・Pぷヌ胝?}T@レP。I'孕&w_[iモ/`P罐ィキc携邉レHA!朗Qセ+鐡雍=、KR渋Y)リホアクzRqォァトBOo便DゥghスロZSロ7レ8v靈[コ'サ(ヘ ミ上シ]ム% n・l`ロVユa」e3・_゙ル1>ミ諍錯4TUHeァ*E1L*&Q"I@H#漿_ート成エHソH装棆カIVオヤ�」謝ヘ`ッ怺=n>P綉N*IR馥lUヒ“キXン圉「b餤テ翹ナYq廝ヲlヨアァ&{JメキC。O"涅9yネT盗m匐ヌJ・ラ lロェ +ヌS寉dオP激4エカI・$ゥv拌(ワJ)$ョヤシ-鉢エ;毛」.KS* .ホ\舟イ lモ触ゥ&mmtm銹ケキホVヨリ.ナゥj#I9ゴ ナゥY苔[z(+ョ8ァ<ィ。ルハモ#繭B$9:親ホュt地鑞」o%:r。y徊モ胚季S摸ゥ'相!還R犖qヲf )ノmウ]睇Wsv雋杭ハオケmn~4cェョ@ウ?,Jヌ9?善UI唹vレセシ衍k(NナョュWF綉"「R衒dU」)>ラニ9メ#釡-wラテヲC敘ヤuィ遣%{y8M圜>__h4R4給v駈ヲレ儲チk3R)ト。.ZツX}Z黙ニwmOJM q^王Xヤヒ"yケ +ォ'「cキ缶5モ/g&ムg1Dゥ゙ホ「゙昌ィフ講・基・Zm「[_゚Lキ2モLュ罰詮メw1p_VシVサvkO9施ヘョS殪ヤヌ 愉rル]ルゥッy6扁ー%'テ゚r諏*レT'鑢ォイ1`桟Mゥ レB[1コ4[」カI4’リヌ}4M:0ュTrアI"ThZZ8q2m兆oインHヘタM投BUke#ッー}<チvca3シ%BgZ&N~チvS|某o,c現ェj\ウユカb7ゥリウケdロV レ讖3g+忌icォxニ"i∴@+ミNカ;學8[爿VQ<|9ツw8;ン)ン閤、"攪ミ┳「卑m,7カ8Eツ・P稼」%wzネ81ツNkラ|紛.?95]ト、サ。B(ヒヌ*゚ゥN}Fヨャ゙N桿H`5OF>KA聹《bL!"ァ":レナ8ヨVルゥ>hク"6zォハ0z-」サ -~ 4抜駭晦7{;5QャュmQ^-チpメWNコ嶽・蠕TY>s侘$h'. IwC}\TU送ッコpp」k禰ョ仙P5ォヲQ r=誦2ホアS=,。Fム嶽UeィMカョKEl會M_3魴S゙{ィY/ャ籐\ネ磋*」~6キ、駝ミヌ/"ヲ刔/cテン、"癢<0iRシS +A((コuハp"t侵申渤G「ホ鑛g攝恥7ゥvルユ' ァ・茄僂ヨjカU)疣C~浣游-ヒ句ヌeェヤ認$rzOラタvスリ剴xvw_]ロW&dbl・H哘フ」夙ーOメ?苧ロE:P2疣iムX\ゥnテ[Hツン、RB(Q峯<ス(そ[b}テン、イ豐マモ%E。)ネP^;1dGヌrG%xqエ。 Eヘヤ(1pキ゚[繙オ釆シンヨタ$5dO「5dツンlヲレ*蔽エレ゚"} テ1sp7ヒJ(+rク屓'群l襃ケ砒」{Qc{エタbkレ忠ア備ォタ・サシeアシ=(ト複ヌlA6ハヘィj�1pィ2ネdTJワェユワSィTツcヘ wモーNhィqエ。メ、メkケ1zY゚雪ヲT良sッ3VjG抹"z8"ヨヒ$。<Nィマ^フ 勃glVイU棡g,+キ_璢B|tiカヤpxキFァ20ハ+Y%テq+ヨJOム シ。イn・ ウH-@)朮sラ゙ヌ ヨヒ強vトス5オヒmN0ョ下tュn)PFJウユキfQワ[潤vU{蓑8&ePオDァH} Rャ0^d)閲C簿「T#^.+蛋tQuアVfo゚TUB鉤ィ`.゙ワ」,\a゚レ}4ゥC柯偉"ェ9$ョZンノg?<神Xv<妹dオxJ,報mカTI齶ラ9Uサwy3ユ/ムBヌ6葷=・Xzス誓ス(Dナマ [Dチ |\、黌;峯ユ誓ャメpX3})ナc鹸嘲-」O登ミ7}ッ庄?l擯ォE0_o<nニセQュィQBタQ敏レソdテK陋ホテa馨エコヒエ羔Eルケs島y$惡W梭チzユ鋸a>ミI[g瓧XcyAh擔ーxNDョ幽0ォ鏥ェICi]サヤ7wエW 3o&オ,サ {─癢D=」a?8'ィЛサvァvZ士nDミ2fY鯵レ#邸 +0ス「厄゙tラ1(y嵒�mエコGネrコVUコケ% 軸/<綴~ ョj抛%sユミ ヤ矣=邇e「ハゥ4<Sナ7ン舞F餌Tェu゙ソ`ウ>ヒメシイ6/hタエ>ロ、メD=eモイナW「Oォ%*糟衲rKカ<k・aニ?枅4ェHП5M$Nェ 衞7徹;5hR@NKa帖悉Jオ鏘@`・我/`! +メnラCMネfd5僅%坡渓」スニ衢Jネハfトi4、セ痞ナ」・*a^ッネユ^螳イz]= cワ旌イIフオMNgJ13ヲFt懌オ8」&3キェ1伊hャオ@キ%qdー剱=Z撲Sオ+3m?ヲン拆ャ�嘴WォトVMナnセヨ]レタ0Bウ;ウzT直$cエR渉愾オル08嘖ィ&>ネ0T9 tbテナツ1)脈8敲滷丶占xiルJ$[〇:黶\ヨ裹ヲ姪、ユ7)ミ/メu杓Ry!ユ淪リ鬮dxq`リ(胡+V@9mO゙qDZXSカ+;2答ラY+ケンフコF\6TqnワMVB蠖ェゥト屯SユD?Yナ躊G舖QP7Wc:=カL,T`5ォ}v�。テ=j'O7痴{ャ9ォオィMミハ3 ッt榕Lネ}淒fミー##ム`Oュ糜ni80ラィfセ%Wセ=r.F9ユhワ$・ィ-.K毳S +tウ]"Eトメ}ヨ稗-ロ|ms茯ア5ッUィ雀 サレタ@'gf|i{粲cpЮEア^Lユ湟$fLミ莢イマ/槙n3u,酲)�3Yレ扮S4|RNテwLcハi゙「@WSAB螟レ浪ンテI^mリ)}堕(健\9&u H・W$5{ネェ灘Pェウムr:4Uレ`ォ桾beniイシイ駻6"ムCソケ*リ ?ョ&コ蝗YユD'レ07yス#ヨ c-\邨碪フ9刄dVpjチミ晦OソcdmnAュマ繪モ゙ハiT鯖XヒォPル^-"花]雀|際シe釁セYs莓Y儚xE杪リj、ム慄帛\ンー9ヨoエ o!モGXz]8ォヘQf@jxz聞閧コUl9ノ移ソイisヲ~ョヘ7 EウGT等ヘFRhユiヘ�゙=゙仰Y +)メッlレ ロヨ=坑b*ヘUムルァナセ +レ惡bzQ顱d鏘ぐ( <]Uロテチ!ハノーdャ愉オ賢ュイ[ラXf癌Uyw$ オMY%ネヒ>ノB碓?拡ヤ~hPヘマ[」dxd-Ohiuン~カ<#。|ヨifN>搬ショ. z6セ楸9ロ霤エ<eァ・ーRュイレ;[EgエメJレ;3貽癶GヒN枅3ッ*-['シD{?ヒBォネァ17dlロHケ潘ッ'`gョ/ム@)サ%豹 +トヒSSQI.チYオミーMム.=hsRロ腆^,'ラ+h杏H。 %psRュ艷hッb;胚Y+ニ>瀰F=) リeE,uXC ン_;洌.ノ錵ォVョ4メ5、ア RB腟オ「 ワ\' ユd穣ノ[シ~C3lcicョV萄ケ レ封テ「1 7怙渊ルク9m秤ヤ8-$[アGミ餞舩RハuレイRオョrwミキ苞ウ矧ヘ絨ル/、<ネク|ユWD鬥Xe�';1qsィャq(�「pDJo';・「チ攀30ャルタZチ4アュユ8ヒ隱佃R$#クMT楷\cg矚vFヌY[ーH粫逢S7フ黼ツ3・2U狂タヘi`クエe品ンテス0ヘ-藉ク9カ9エ](ォ洪 トフ[ojヒェ?ウ燥ケ]Ky $/cQ績?BトK丱タヘ。セ]糘H瀑髑 ツ(オ哭(。 +qヌ$2xナ ╋嘘|鹿UォQネ<材ォ゚CZ ィマヲヘYタ^テ涕ミ)'醂j]憂゚瞹Hア]レヘユニ#<ホ膜カfC:コ+ノトlNケErfカ)VハX` 朿Wjム@ツ佳鳴ムQョエッ! .vマ牌zl{イS87l山y゙AルiFネ +|ヲ@カ,洟i%コゥミョ,ッニP3mンチ冤オリ愆h觝ッmVァ+ c:RY:ッ弑6ァ カ カh「P碌テ釧Y&Nロ'Fb榾゚T%旱倹虧T/ホアas"カdTョユャロ剖<"ソ鍍ツ襷@タP5v等1]ォ 周jフリ [(セ'「T!eル|獲Iゥ ホ皙O緕+ア゚ムンョ骨屶ラ#~ォ姻サl・巣靖ウ5ウfタB-セxd姆]沐(T賦Yェ挌*Vャァ・Mツ覃」cZフ知泄ヘァ3EョS| 瀧 lVコDモ#TA|ZVj」ンーケム「*\;MZ@セD」2リ( mタ覘-v\ツ覃カ.4s勒:;8ェ{F」ネ^ナ@ヘ)UヘRIロ-檀sレ是遭Rスー+ムシXハ\KSル;cン搜if獨テ@Vキ鱸Z3G[LiィZ(nQィ殷スニmフRッ6J0]W頏オナ6IvmニルJh0E輟豢タコヘ贋{KシクmミENートゥ。c yitGロ,スNVヌヲネ nl考シna Vf匆aeL"コ.ケセヲWYUワmN ,絮hSセ"氓ミ2モN?悒。=カ_M5 <。Z s睛レマOワ9ュ瞰2{扣。マ褥Rbdヲ8ア|テニ�脾(ZEム齟Cチe9テ需庫yュルテl」$'u--ヘp8ァZ?7(V萃サクョ裘ュノ嶮タCナ凧 +ルネ=^>+<愃9ュXw#?7シ>_サX2ョu藤kxpヒ「N,谷8ェカvSワ裡oワェナィコE)レニモ・ネ@I侏M0sケ言zシ珊戎1+ +gF5゚>トgソレzヘS38:|,」ゥセ}ヘフiS梨 悸悟4ィ頸・[議B旙f蕃I$;ナアアレミ / ヨモV R2#ユ~P1Sミ。*O+j +~4'F]ミ]騏:b(クo~V端鍜eVェッ 碁}。 n嗄テ貳_%ミI祕ホハq;カコ」ヘ @,XXクxチqミ誥-┃w送a9蝌セアヘ。Fモ册。・ーョμ!xyqOレ"ノjカL|ロrGゥB6ァァノSYナォテ|`莟aHF↑)<hレ jヲ78ェy_ィ ヌ霄T剔0,ヌP cタエ:3wケgPユ公瓔゚弋サ`sDリア$lE愉cレカRzf筵ルp4vO +!ォ塩2_?kォ]アハ7)I專JアホハjH(*J.@Jミ,オ梗匹S-T:ゥ;tヘ^゚、ヘiラA悽ナ袁;EニeエIMウナ$hsィオY峭5К。GsモOェ?HUォヤ>hs4EY,~<「o +S. 41%ョZ7ニ、af~ン荒uィ入f|`ネテ/Kレ*  埴ピ從クEd0Tセ瑰mミ覬G(FK(Z1ヤ6\タ?・岷J!ヲq<p圓痣シwNシテユxアホスケメメDPB・@淋ロ簧゙レy+1]6ハ。KーCクd7+`イ降1@JZN4wュウ「ホn「ミq +いkヤァch�ニc5JQサ{&)^Jリ\;ラシテ贊タ.>Kェj針�Nx穃・mリワVァW"`鼻、vセmx~7lN;゙i⊃<.ワノヲHMZミ]キユn棘(イラ期sユ[D沸ワch/橿・XrZCオハ#l枝"MiZノS君溥4Aa宅ロャケチヒ;=a。棉MO=糞6膠ッgTィオGタホk催ゥリC;ク'ハヲ亮ァエKマtェテpUNォ0||ェ6gッY釖ユ!n慵KU監セカis絵ー、%モCG儷;フ娩炸Tメ謌メモhsン3`Zfイ逵酋`i< 龍[A#vコ8アd鉉イシZ8w&%B`GラHメ彙ヨ覗)uK[kヒ苜ュ鰄jC1nsヤ慓f14クチ神& +IX/キb裕輜fウ&J(ォ@Ι-gvo元:(3sd^n,モ^ヘAホ矍kヲ:z 袮ェ)ヨFサ妝瀛b~_コ頭雄モJ榕ァ淑,SナB" コ亡@PP「櫺惠{4ォ0,cラ下| 2瓦3# n豐?咨9フ_(#ャホVh露g+1哽筱[�决"ュャリb」o朏#オcィ鷄R ma[ウ^7サコ[、`THNL巒襴I牝 ?録 。bAソfセ�\睇ヨ$メmッ</セゥ$リオS\Uュヲク漲xJ3ーv#久5/ カノ2Eヲ錢Pル*]ゥハUオ]「衝s睥l瞼]W<q%xeウ罔*ァ0葺Fモ。Rwゥ・R徂κ!F"p<7扼タワ峽ス、:I晃ェーA!混 Dgヲテ&。贊r剛ニgY.O9yVWvア゚ミユー|}。ャヘイレ〜ナユヘセラェa[醗b_Vケ~邁u粤<"[ゥVキユラ1 ク(ェテヨ戴ノゥトs`ヨ�y恁(/Pヤ迢T贖シ:Sォ{mk|+ヘ峰? イワ8*;"TヤNvクケ ーンレ6,ゥスセンш}4GWウQョヲルマヒムcヨ:j梏a5渫ン捨}」?母Ub/莠Ngン{pヤア@c齢jト筝吮]幻qム*ユd侯ユ餔[ハ[ユヌミ(= +a蘊@;_ロ;セヌイェsェお乳シハ +]Zェ擣YZュ迫%]ヒ Jィラワj?イz降Шリ21肪IB"ーUU・h標。梓ロ匹FエマQXル`互レシ筥ホハ弑_h_ヤ7"8メNッr&; YノjヤY(^ヒg xスソム施ユ�リ2 RUゥワタ」嚶*Eネマ ゙7ユホL仄テ仭 +晁+W7dr9櫓ユホ|湎s゚.ヒK+ハ5鱸ュク*")ェ・{Vシ'ワ袈8T;S輕毯ワハ 蜍キ3ウB愽メレ wT.ィxソ嵯#劫*Dfム殆Zヲ島麩」卸繃碪Wh。5ヤツ4ケ7j槹ヒアサHuozキ:ヌ-{*ァ櫂6eDbY"ス淋フ#ョY茵竃レi橘 蠻ルCミ鳬3繽ラ (L惻Pクgイワーラモヌq綏ハレ呟ーカ 鎮ケ +ケp銃K祝v゚レQZdナ=ャ!丘,+~驀瀟璽MB、zラ^キnR|ケヘ>2カフ};JオBJ>銃ムtォヤ鵝e,砥ヒ ォ9A賂',5ァ(ヌU!ンソ餬皖ヤ�cOCハv ASオァィV鰤綱ヌ呷個ー徹 マス&慚q甎ィ蕎ワb凹JSmQ,ス壌aシクワoェ薔xoス胸M痣フK蹴b゚KDュBQキlノ-fィオケ鐘P襾Y)曚ヘ <C橸< {挫BチFメニ眞b8dFサャ贇(騒`ソ紹詐モラ冉D゙ ャDケL:$シ逢者ネタK(アーモ7<嶼ロ鱚5ヨ[ホb浬gラjmヌ サ1H軋j蠱^ZセCゥcカJb?0ャ6ュモオ�A 裕・パfRメ<8ャリ抽|ルNサ%テ倖ルLyッklハ-S*aQ^KメN %ユ湟ナE.匳d怪7ウネ蕨ゥ p'ト2pJ$ケヌミ1 mz臭g>゙鞫h;ンKワh)v\5qdウ +E苺爬8シナ(」克ヨf8fm歓トヘ+C・ヨ迩ンイエホエン。F|y」K+[モWpcレN二ワ捜ハ綉~R<・A仗cソgD]1モpィ6ュロェ夕n蚤ェヤ エj}-/aモK`默サm+ケTU攤'Hxシツ,ヌ +uャ」Kェ5rU艾レYテwンd;k=]8ョクァb8 CZレ繧ヘMカテ羅ッ.H=Vッkミ看少ICッ ロ8ォフ蜿リ銓カpン` +ュl∇6ルn�ミ夂q 妃ョンjタカメ6ルnォハゥレ誰・bM`シlフホ�5#*ノ璋コテtサyk%Gn^ヲ5」咾確赤!Ark躙?ネvリVミ\>ス曹(z゙エ%キ`*k楠カェ K1 ャbI.ロセ;ウレ}郛アg�・zャ0チvR3」リNg&モ毒,5IKk犯ョ9:レnォンaXレ`ア'[L拾w儼ムヤ#yスd3ィxp4ハ: ロ{Xス偸3"U JHモ4 :レ6ホエア$タェkサA祓+pJ詆ニsク旒2PIA^�;Qo」ロx;fMレ宏Bル龠ォ]ンコヤ抉"Pj!カP5モヒEV!ィニ=aw!軫カF*Mス{eニd゙ムgUンシ 。セ3g|懼uヌュノィマス宮ロスT\ワ;ゥソP+E゙刺"WアM~レ沒{'フ縊U6ョェz゙"uョ 錮婀ヘ3チwU=エy・/Sリlル1xホ&三」38ネwRセルQ、 m沐;チァc5^irUE゙」カXノ:o擒/_ツアwbbヲトゥ$涸Aヲケーw ト髯2-_*uオn\a +'N麸6穃cs、9賚スCュロワ;cナ9煮オ憔;クャナュX +[^2%0@ラ?」9クw}贊 ン。亰ュョ|ヤ煎Mエcキk72ー黷q5yサYオBセ+げシモェ怠ユオTヒи眥]Zz. P庸1D゚,rL$/*盥ラヲ/pゥjo"゚鬮6$゚A2FNン{ァ_ンレn彎オ腱>何&コX*.璽學キ簿痔j莉2ァソ帰セ+xサ7ヒァ$ョh叮緡ヤ Qエv\;42}AセCゥン徘IY-<NヌK黎ャ捍レ?�ョ(R\ィYfネ攷ツ^LT1ナゥ4Zネ]Rツ'ョ竹ィZ~マ穂; マ +#レハワ;)ソKV77ヲM+゙j0KH'ョUjOロ&゚オJuJ]テ勃ョ倒ヨWル;髪キMセkQキu難毀j><l}'・Gy仭c。ェ゙;qqoラキムwュR47キタQ3徴o}ラーx^+ ポエc +]kエ=ッ?']^WミXCj畑fー`5向ワr9烱RKW+ \,7フコツ貧T椚?ョゥァcク (yキW道ァアvVヒouS5~+繙゚IOY~ヌq_o~ラ間qモ、靖ヘMソ尼 ン、゚5Yソホ/Mル骸トソォVKyPО覡ス鑿77メ8ケ uw+損鑿Rヒ リ敞*3サ・T価日ロユ坐督 廁;之ラ坐ォjァxエヌt(s胥j#8/]報_k胥 X劣nニヤVNン。z&ッイチタツアvオ?Nο[<偲ロye胥ムw、Uニ赱U病-6。NスoJ緝ャヨキn旄:9ォ +0赧サ;ヲ[dPシナ脣N�゚pリ7PンVァソu,RkァeンoR8{dX鞜q弖}O7C3Zキr糀ユwUa慥テ-顆Dエ0ケw偏�JWeヨ點ノ(ソ]赱Uェ孅DUテ:+WWキI籬U &゙wタ鏗e_` 紆サィヨコY}M、vロサy`テ~y:慈ラ^%�<ゥ゚ウ慰Ia� +HEk%gメヒ赱U|Hhpン゚テeフ咥Iリタw�紆爻"鴒.マ タ#�メ誣、イFL�PマGl詭澪ト&ミ4ア靂}ヌァ;9/wz、ハzヨ赱縻゙コwシ7�蒐ォ タ#fキセカ'v鬟リ゚N�ロル nGdテ6vY<\o1遺[ヤ2<」゙ァXwD�sス雇f2アuK3匳ニクrカ�<"セ。PDトム嗄~7�マ漏<NHIェクァ97抹ラhラヌレ2汲獺ルァナ衙ソΖ\ア医Tヲヒ入サュ戛サTウMmsセセニ゚5ユ"ソP[8体TNンV'ユo談ァニコ゚鐔キW-マwムMAアtヌ,ヲ>ヨO逓;Tヌ珀。<Q・HGοIwチソ日,|キ@チe,=UR蓊+vL:*鮟コAニ+w牘ロ kM桾wケwbj oヘ4烝6脊k~(鷄=p/メシヨZd」墺゙\�シ/ニsァoト駲廴爭�シF'ヒ;6ル,zヨ]< カホ耿J゚ソシ蹙タロjAvゥネァxo>7Oゥ帯O普゚&燎 メシ�x2x儚キ}ュ タcヨN'ロ四湯賓、ャサ"獻1゚シ�xソキケl�曖ンォh`;左e?w倹<ォ~kw(nォチソcfユ�<I5迦�<セ/S�l"-xX'ュo <Suオメヌ箇¶ャpZ春"c0イ/hN蘚瀘5xザqマ ーDメョ@瀲C゙w共〒ロMタテe^d,挈ァb凍ヌ>ョカクG}m゙Vョa ヤ$5U抗6ッA5-&5゚ヨ77ッaトY噤・座ォヤRォ?モЮ於エMサッャ.オヤ|7ッェhF艮觝-T3ルxア~!*ト♯カ?佳3・�ゥソ眦夬0`@0S゙3ゴ%ッ害アコ。(卵~゙Pャt埋゚降/^$レハF澡]ルセタ慣ルZDN^%轌ロ(ヒWZ゚ <カig父'uL核怐gハmg:xUォ>f澡Mウ/3v�wャ宦ァ}MU>xS6P゙V仝)"舫b4ー,-ー凍W_・ロ@B9好タォ7Oj-ウm梍゚+Y6ッメ低ル騙/u刑逐'5x1ス'Mシ*v}ア9ッNEBワ{ロ +ミ顧o^e=ニF潛a髻シ5<Tクタ耄Yk"pB'ッイ蟀5xソ粉eメキすユ澡7賦゚ョ*>A顰ト澡mリウェq・>ィbレハノツロjミ*ゥタイ!wU ァルナ.uヌeハハテロjタ*蠻・$ 鍾SハwテPソZ6 OハoLュ'・sナN^]>R& 蛔゙ テCy1タ9`xRY`' O_朴RB*<ダルマ!{ァLテロハ テロjタ/フ}ァ}xy譲b.ス5メEsウ疆{yY(jアVB拿 疥蜆疥ユ`xMヤhカzテSタ7Q'翦 Oハ1Wュa゙0<ゥ6 藜}テ8>ー甼eg薬qテモEエm\タカrツRM槲襖ノ%)wuメorテlB^゚q會HU6テロハ皈+%Cロ昭!wg#vタx鶇乗qェxハf)サセ蘿瓷イイYx(テ騙ク5pf)f癸セレ,シJ漸/寉'71寉ァッ詒: ッ*_リhs^* oォ矍W蝸ヘャ;葯EミチツS茨タスヌq-ッア被WU、�套'ユチホツォ=2JチツSフwレナツォリq.k、GhアワUヤ7 ッヨi退}\UX +ァ疥螟ェモr-}n^eャ}゚ G万7`xR跿フ テCauツPkモ14"懶碵+ァフチzgロ0<ナ窺$ P6  WI,Iト拊鉗ソ$5u%'ムャァ{年杁簓O嶬赳アャ゚サ9xゥ\シュッハON人7ゥfl?ヘル襄ハ-kS苔ァ6pノチK裘瀘58xッ{m癒7/粡珥)ルgムケ珥)fS10x +周橙zc{ヒ;7O'ョム゚Ι}゚oz7O;ヤムシツフ_8:ニ獏nJヨ>Tウ喬ecカrbカ<+臂末 ー・v}ォ エウ飫/茎dx? H8v┰S ^ウヨホ~c耶_ン<惨<<1xRlィ<(xMカ�擢?ァ珮ソeォzァ琺齠Zサ(xィ, +ι゙経clソシト瀲7ラZ'・ッ&昇ワモ挫モCTロ)Rべ0-,罔eゥン<ンゥ;タ瘉.ュ5o e潜rっSネ鑁bーx滂ニ澪ェ ヒg}字アJマn +Uゥ嶺}J(モッ/ルュg斧ウ$O鍾ェォ゙ <Cm範チテn\;萵ムュリ鯔チンUを(;Vャ=@x広7}Ud%柔ヤヨ赳盂埠s0q「!8x゙ッl%毯s慰iマ<尾|寃g寿ン<ワ?Z怎g“ェn茂R籵v)uc蝗nヌ)非ス゚挫S$7<1x`?Jレuセn皃_yRHソ>ェシ +i#ネO$Iチ汲ァミェウn +h%/ +杁ェ_窒Gコ゚ヲ濂ルオナEチ」"Aォュ、澪uセIPP^% I堤ン<} エニ循'^ノ齪M;ッ?スマイ&ヒ募z3チL5H)OクG0モM(ィニレヤ tノTゥロ*AISゥU!C<�#^ +3孤 ヨレ{m゚~NヲユU.コr"ンウ3セ站p゚セャ サロXシFpメスSl朖<N・スフチ{; k|<KMc濛*專許AレP9<モ;-ヌ# +軒S +,癆6ムメン<Zッbヒエ4」汚懷ヨ_Q8」ホモェ-wメ孫|e]0」洽レ(x俎 + +・~ケ"%ェ0モウ:j」瀲ソ恐ケコ\恁怩GK-緬ZゥVJ 6KzSf杢ソ投5蒟\ソ・�jョ7'O(ウキg0l/ワ1xーrセ =`+チη。エ+ンVaha〓0x<ラ偸蔀」キl5F蔑ウ<゚チCフウラメw シ[ニ{ジ9S源0x(y枴゚1xーイx+0x,コ拆ヌBsシ「獏Xル<~W_a`i蠕v ハQ e. 枸Z]シハlL9w開 ^eンラシ栢V9ヒ蔀C0Lp*ウ〈カ挈ケフチォ垈Uモ9x 酌d {。?罧gスv^e@Rシb{,B攷ヌタニ}キツュチケ�瞋Rマs'眞zLヲ8段ケ[ マホ蓆コ 矣ハッ鷭(<ワ1ヲツc 魄 WY悛Px 7「(Z(シ侃ャ@ +泪ェHxxマ携ンzL!`kサLツォ庇ャK栓8&:=u#!ォ1-N食xUDツCネ +xEツォロE C「<サHx浜ぅ,^Eェシy"矣Jjケ"1tツテW勤 シ:.u フ}K?sC甼f(<サ]ホルォ免ツリォeG矣J-#寄陏v癒恚vE{ュメN。*ノ瑙Z(シ +B_3R; qH/ヌxルHxエv廸$シハフ}キ&=貘2Xコ選x包Suォセチ2択jフチFツォDユ_カO% ッ駐*^ッサ(wッァ荒鷓麕ヤB蠣G)疇8p枉栓`=yゥツォT◇VCCI;Zクホgャマセメェ殕8。溏,V湘t*-ャ%ヘ <D} +Sツテ哘_7@xネ嘔ケ択0イ?Hxィ、}懣セHx(フ{60蹶F!gb.:lセX&^6ッソゃa.:ェキCカクZ/4<NW蟯pCミ*・エr`イ3hxネ42オ碣ヌコェ5SR^サb縱 ヒs ┓トcq「レ_@<ソ2!ヨル;^ノ トcマN%xツ>ッ\@<xウオ{粃彭Ylvoコカp6ァアォ―fXqi]ラ AモツJ ト」包・xノロワmメpgfソ_6*^5Bサケ嘩WxW鈴Rー0睦P<ホフL +蓋ノ/eA*YMgロ。xf箜「ワ┃ツa3.尨x むナコ"ル*^ sa[本キ圃mL<ャ+tAiャ1K0刃ョヌ<w(ォ.*・9浙: +Q潦ン*&2ソ`無-*^ュ^KX<Lホ,JX<nーエ穆xk垉ツンサqhe%クxエ恵ムヨクチbサ淮ナク.#ル齒{q`ケチ(o?k焦ナ+ワカVjYvoチa゙クxz"v~鈔 +wォスa孰ケ/K姉\シ扈-ク\シ> V帆 クqh螳N\<X*チナュ樸ニナォヤ}w#|9マ,ヨ*T<~仔i「禧d藕%*{チ8f*z椈mNヤAナ+LZ,x鐓{ムエウュ/;rD括オマz訝粃Fモu&ゥャVネLシJ8<A2ホトォ畠 幼AV杉x,:タニFPシ潅タA*ナレチ ナテイトオ1xフr/(檠゙g゚。x蒭K((<wKウg(^・ケj<Xハ侍+謔禧苑4帳xf拵蜍Oヒx &^イ 烏#ァY!hケoWbE+Te'テーSヨムコ(モRY~$詳セー<7ユT$姥Mイメ;9ツキソ躪L<8マ棕L<Z1iKC +FL<'メ7&^・陜 y2Jフ w ュ3ッR井 季サ<キ7逧wル靭モモ@柴C*ハ&lG筍豁ア#!リ6セ靭(x&セコ靭ィdE諞トCイィ」'靭蓑pH1オQリ}_ラオ#ゥ:+雇\榻勝<ナソ休$XKウ'*^#娼Lァ粃マチヲトLナca!ユkEナc0 5Rホkァ簔ク驀QネL^Jテ ,ye(圭ナト絎d胼L<Z +ナ/&^c.チトCzェlv&^#マ,刮ヌJネ9ヌb禧jd拂1Xチjf禧&澑渇OZx-ホオLシVェ・gi^Gfiニム拷ラHリラb粃当ッ{hィナkH1餃<pヒエ演ミI61$レB笙。/"栲ャマ揶Gkイu 訳nm`鯤RlDシfR\eレA`メスxxE\刪ラO "ッ稘cュホレ悦d]リパ9妄J mナヤm"秣`キU0XDPD<ヤル─悦ワー^Dシェ譬 5ロ』忤.ロ[mテ;刈_瑩リM2[ロqxエ受\<<X7\@<Xレl躁トcロノ}殺トウ=j+d$コ 朮=ヌシニb1ァノヤ@f禳゙ワテクヒ愛鳶トC*:草ヘL<岳2k*(榾@P<vU莱 (}ーAョC焜ンズ 拡ミ螢P<4掌xア。レア+6コJル。xャ溽K((柁 管ォ・硲x lsA6Q勝シ祺やアW*uAXィホキ$CHツ8Y茯セ +T崋気羅+ Wト'揩5F ッPシニンw(. マ5mw_P<fサケカe*BWオ旛「箜Qbjナ帽ヨ`&-SX積wQp躱ロ「!`<SH0a乖xア2ムィxJ」gヲ禳甜u籖8-゙d>おx<コァ弐Tア +脣;=マ>g+「簷ツ-jニ1ゥNンq,v哄c稷X鰡4!トナテoュ:ワaーコ![ヒ慟Fニ3゙7ヒt恁S レチxク +2マャ蘰聹!X Hエ;常堪スマd<禺セ」ィlコ0ホニ。i低x碕ネwツ胝餝Ax<゙ミ_オ碵R\,%9'ツ綢?ムアラー汀チVテ罍ィ碧タ綢スヌリル閂(★ヌi)wメP褊ノ猿ラXモマノヤ騙H泓AモtF4cl」翆)カ.Rム*51ノ去ONオ奥ロヮ�遵アDヌcs6[i-ヌcク唐リxo聘3Z渚ヌPm;$l<V6pフヒハ渭林ルx~ホニkG-炬/c{圧ミシ・ +JA鞨ー5hi駱 +トニウc弯オハクYメl$ロ激-Sb翆2fウ拜5ヲs剿6D7合ケルェ、2ッア0{ヌテミホ^]゙L、ウ}*テ^債B81ャヨ[オ寉PIッ6inテ8ゥM`t<タ gィY#}Iカ!ムhe晁xエエi=kヌケ0l|<Dヘノ訃鈬痩ヨ^zヌケ齲e」絏゚ 」bヌ敘エ渭ュイd[イ:粛×&%Cル8v沫Lヌテ$? + g,C蹴箏[v鞍ツネ秤閂エ慱S.ケ!ルヒ[ツMX5flソ耶5ッuト且g鱆ノョヨウ!ム剖t<鷓テ|堂゙ma 雑�嫺知鬚%K~aマ8 ヘRユゥ釦Jt<:ロlアv8q:雑シコwホニcスlb耜X鵤繿チ攅ミxヤ8F ニニテXbュDー?龜ゥワ2ヲ|J┏ッ ++カ=蕊フォカ搦G+J!ヮg"/bfνハ「1リF劒Lヌォ、,uKrルFィ斬ソ縡疇bヲ17ラロケ閂エW[t<~。ョ克+C劼1條rロ羈e´ヌc然5「絛:ラス閂ィhLュd:DE5-檗:ロ(マ":貳mヤサ耜Zォiイ2PBヒ=Nャ iチ!」テ┻ウリPリュ復(4ヲ|zuKdb)Gハ ノミxx詼 桜Iセ献yYkuIhシハ *Bニ縡xレニΗタロミxユラB1面F ア`。リニニC、ヲrッ奏q%Tキlツネp<y-C0eNテー(Vx壟xエR^Lp<X 8,リ!nl<カ雉戞l<n{禽C苔Fヒyマ搓ヌタ�・ノjィツEeアリx゙テトナ蒋ケ)! �dシ;qd }k'0R+レァ#ロ+'*m&[ヌIクフゥxfxナ[Fg糂ヌーuQL<フ・ヨf侭xエイ_XL<ZXK/&,v刮ヌ-b鞘,ワカD拳ア&ア蔓x/0痾6g煥xヒ塚D鍔。xハウgリ]ウ^篝CィハチAG益rI 換 蒲ャ祉`牙カ{0|qヲ粃椴障サホw チ&2ッQJソ垳[!vムIm L抑テ1Bl@{ヌ穢仇{c!椛ケsg耜Zホsチ`ア于炬犀Vスp<ニq 夙ヌcヌ!|ン)カ*>「ソ&ォ#>゙ロ咄sョレネm[ムh跂=橦粛2u<^-Tソソ}l眉レxーZ[・x辺ヘャ  零 秀ォ&gd瑩4 楙_醫ヌウ22ワ(ヨッ但カ⇔ヌテ.ロヅ粤!ワスセッ貞臆e跂ア +ヌPホヌ」e:司ォヤ)&ツクjtル?xエ廸トJタッシ桙順JI準<<6}d gY2 マャウ/@ハホ&尓 [徼X。トョ�蘂pPbi晨剞G5嘉ルヘLネー:ー'@Jh,・yKネ!辞モ8ネ3ヒリxa酋5フ 順 +&ox<ォラs碵濮儼をxヒ提xヒ*<反mヤアw蕪L <ンユ9+ZホV瞬Tウt<Y):-&ツ翆rンsァ聶&,:^・Mk去=伸ヌc:Nヌ」タS@b瞼 9躁ヌC 5ン去嫗ゥgム%1ア剖t<悶レ瞞;ヤ゙ャcヒt<カ�ウ・?璽.ミXpシeHlシ0 +合モ8xミuコ二0*ッ+擦G2ォ Dニ[豊ニ3+v"罍 +ャv+帰72ワッ椚埜ケスネxT<]ロ8レRゥIゥ G絏ニウラケミxリe<」`=)ケ+4,.-h<υフ 晃|.6ロ 3C=。ml<フtTイ +kハ8テ牛キ,剄流d聶L ワ゚8リ。黙xシ杓ユxMD�メセ雑 峭2マャラス炬エ!8ハ2w8^・R0U 紫5墻p8゙イd8^イ:ッ2゙テ鎭ョン [w2櫑鹵楾 -CcXx<ヤNョア剌ラ├xネ」@-[ヘセテ +agマ<"=レqJ\Yネ[卜2ォ�y-`ェDネ3アr)!マ4壓繖<^イハx香ツマT。\も;KS゚;ホゥケソqワxi鈬!Up詳w>杠サャ}qョメoy +Z.Y恟ヌー杤鈬ムメ峻haH1Nィ`丶 +?pA璢。陪ヌ�臑GWチ36Jテォ%XネテPホQ<J<;油Z鮎ヘツN|~Ts原T鴫h:"-鷙|睡瓔チ-臑CdM<Xl(@^イ$@杠スヨwDナ膕}ナ 酋F^|シF 畭!Lテ~Bユ{剌ォ9鞘ンヲ/ゥM諧 %`ュ「Rx<Xヲノ3:症ー4胝(PテLシxネレアミ3xィン罔ヌヵ:aヌΗ#゙x<X,鎌xエ槭^x<~u。酲ウK3|2Jdッア%ョ`b]Rン:Nxシニ5ョワB゚Q往サロヌk衣Sロヤ就) ヌ[膜ヌ[V碵ーdク&クwT~(ワxィア{ヌ疣アd@シdI┥e"ョy軛5e(2#照簟7kS-゙U.FロPヘ<m$ッヘ`N≧レ賽ネテ鳫=#ッQZ漲゚!@ルミ 3uVァカ苑キ,剔キャb葮=yリ?鮨3PeeェイZネセヱーキ'3#ムdc宙舵-K臘モ摸ネ3kサ#穣ィ#ッ。ステzn#VラマpF,ウ8室餾クフネψg葭ツ正y蓊チネテウ、yク鋼ケヱキ,苑キ恵1スマ&ア8パfF-テヌ侮C裼pyQg!3旦ムJXwハ:モ8スPgシシテ_\2#ヨサ8マ +ルェwv拒ヌb含yエVXsQサ7 凶2$玲$殉フ@:$o2$マャ餐6ュ]ニ0mS;縮イリ]=Mキ5サ0リトネc7ロ3$"ス $ョオ:仲゚PZ5ト\@py8$廠PJサ樫ヌハ+v`dJサーミッ耙}サィサ-K「-ォ(y,鬧ァUYツシ綱Wsタz^Iスm1i(+H-ヨe yエョ薗ヌsオb +喙サヲ莖AノcyヤUュムイヒ(yヒ*Jサ ム.;Jnサレモft\ウイタ膕Iモノ」%読:Jチ 敵モ窄.C艱Q<ム ゥ[エ6QアRチ(ルュ7カ慶"マ,wシエeAV!ィメ8 p6(鉚粍@蒄颱ス∧CL舵<ヨマeDbs檐B莖チキ];!br!。8[|冠孅 ネC、1カ8 'モテt@゙イdB゙イ +燥f!"mュЫl<\Uラth^]蹌菴 ]ホタD゙ 7]租#蓊]ニニルャヨ:xィクA=yニ翆銅スc拆"セC~Fp<{"\コアタB=ミxd;到レロwツム{y+ホt^ 季クΤIナテ(,レ。xラ4bj00ヘイE頁ネマcセ1ユ症b筍g%5柴cjコv"樣 カト.F<<xヌィ賞px4ヲ髴訛ナツg柆G眞Xg[$<イレ\ <惡卵9xン=饗爍/d0Bツ$?>3ロ=>wg燵N^2oMニタツスクvィケャッ鑿ィ"Yヌ\ +ネシc;リミワ;窖オーwネ エQェ/タAス{ ワAmTレw。^g]ネ;シ/轌.臂2nyネE;2ノn喃ロシcホL\シcカ;]ル1ぴレ+ー摎uヨ 姻殻WMCaェフニラ限コ1嘔eメョYネd忖イnォ +」ツ^惻Vュeqテル1_A.羣ス槃av ョyヒ儕霧Pvヤ枹卓゙フ短ワャホェタ矩G゚Av]菅 疹∞}ラ サBMユyf疹アハア@vエ\Z サツz釉w疹aゥs) dK>\`iG;ネョ悚} +疹ADッキコ@vマ +銀殘ルH産ノス +$N=ル敏喃fルム8カ@vエコ8v0yl;X邊,,緒_ヌ也。拂Wミqコ'3dbK綵 サキ浄ス5觝`鄭vー」イ縡Wサネ爺qチアヱ「ユチア8躪サム=v馨!「/cJオ~モ 0迄)vィタ; ss#エミイ サムmーl;ィホ2Eー」 ンンタnXル諞ッcY9スサ nッ朧レリuhu坡ミuHAZk藷PテHTラAン堆8籔禪Xdィ0djン2z詩?e)廢7オ!2"N ;gヤeXシコe3\~ヌeノネ゚洲lャ:「Y ウ゚5莎Q%gPサCョ oNメ臀fLン8^騎7\% uヒua「NvD曚f7jヤa}>{[F囲ア)Ixコ0d:ン2: 」WbモAiモロ蛯Lヌェモ喜xGモ膽Aョ1酔・+HA>&披レタメ:=ヤ粒tーメu +,]Ad筆3ツメ沸sニメチjスュR+MLa +オヲ-<T:ル5T:Zニ徽G  KW亂hVmハ#フ1庫矢荅2テ豎├ォヤヌッea餘Tロン哽オヘカc*ユフj[X:ェ1^X:ェ6]ュX:Zヌぴs +JW・ヨカQ魏-ム[lWYン1^A鴪店 P:|ミ$yPハニ塰Jヌ lF惶XキリfイO睦ク.ィtエ%t4エ鬧ヌa= ぴ皎?[{ネ\頻G鯱レeノPコeは$7(]aKDマヌQvュ'*]a 鬻價:BミA・#僵シhsDfOク價Gネq・/躔ワ'ィtヒ朝ta *ueZサnョ侈リアteV[ヌ ̄メ嫦Wカd,ンイ +KWーuンQTN#砠tgGq%;車D苓、セ:オZ鸞m・」t叡ニ0i9^ヌV痲ロ?wニモDUムtT=」ル祓:X'eヌ┐ョュラヒtメセコ-「ヘルXeυ碧R:研iK=dI0ェd89ワヨミcSロシヒ9tVンA}カュンホ、[摸、 k0 +H`k捨:}Nテタ|8ニB1&]ケ1髢UL:慂エXsマW譯3動 ムウM?ホカt&@4ホ JGノ。粹Hセフテ&絨Fテ*B哉 : 肩cヨ・ウcョコAオ|ヲ恭t_コ +「ヘAネ +3憤%U|ワWTコdITコe憤2G[_9k;博ツ悠P:XNコエ・」vろ僮gニV梼泝tナ、羯「 モノナQL:,ス否 &ンイd&ンイ蟹Wケニ+1x6ワt| ロ3RF桐t績bトl」メQvX?=:フヌ}\6Wi菲3侮2ニツ8煦j徽キ,ロD kP +Jpホc,*]!k;憤テ6>A・+u�*゙ゥtp +掣醢ニ<レミ1徨 /ララQ<Gウ.エキキCf(mSカgn。゛フ^ムミdpムョヒ:oク]X'xt0錘柢t倚X#爰wB:)タキXt絢ヌBムヘ[� F%」kDヌY_:dムヨ +ヒ^ヌ。聽g蜉34A1 tモ謬@uヤイs+cl9ヨ遠*蹂9,ヌ}n|.恵マ。リt。 +ヨ 8マ{C`マ゚=9{ョnkcマv渓ア軈aM[ー +シレ9d訛emスリs0p{雑g\ATイア:フルs蚪ルャ`マ秒 =#v?A档∇}千Jq嚶<Gkモル]ト''穰N槭ケヒ9�ホン"マンbホアム=ム跟{q +,ヤ\W +I;fョヤa碆8ェYエ" +ツsab3ヨケ;ョ,ク1WP誄ケ&ケ[σ[0謦%1譁U源beコ#s1ubフム確{0訌iG搴1 ルcVホ{チ丱/sエ ノ$ニャ麻1菊'リq0W「ノルマ xwx(sヒsヒ*ニ怡テHD9ェルキ1 +ラ柾C|ウケ哢ケ]ワ:ヲdヤs oN゙ gフ-Kfフ-ォ1 +ZLクssニ「ヨ劑sー^|pbフチ2ヲ弱」,^ウ1訌オゥB9Zョ^9~b{Wbフ別 +掌sク恩)cnY2c.ャチ佚;ム +wv\).'ケ1詬y・サ[o驚aN/セ彈 E},^:4鈍\偲酵ニ8ョクsミ」゙鑽ーr]事モys梧灘;]蛇1「ヒチツ\ミ藾x」ヒ瞽哲+Hヌオ~-コ\X6コワイ.Wーツsa5Qチ屎7 .p5雕mホpア姪nソ竺灘@ア━螯;簗Aチ軼ツea螯UPT凜固乾8=9^ )qwクpa<E- C賈-」聿89ミQ6ヒ彗鼎・フqヤナ茶∪PFノチネ$ホテyH 9ヨ~;-8r」[!Q`菎唐?ウ]ヒー rヒf 9フe>字ヲル@70]0a!rウノ 9黔オ{GネAオ「s0U69@NF矼ヲ/ン/X +オg`5fzeaLlオ枕キャ「ヌa&&ニ襁8トSm蕭8dリ,&zBK |充9w|f」玄q莽yニヌ!ツミタヌAl゙タ)ヤ{{ツトル^0榧:核Jx充 充VヌアC鮗,a@壮ィ<纎6x;1Y x\%b、Y癰ゥ +ソ =+(ュ8瀁oクBe9<蕊!j8Xリ�ウム +イル桃pN湘Nv論8ワ|ホヲ=蛇^<ヌ1h Wリ+リケヌY゙w_8X�<首ウ」゙;<C雹咏ツヌ6ホE修X湊 修クハどAh廂」ヌUhタA゚瀲7{3 修dQネヌ!乎ミ将j<紫]ホg。>*ェ晢~8ZナN!;ラ・,v, 1o8ヲ$Jサ;ホJ菷v\ナェロニ#フ シ瀲Jチ聒 +gヌ*タケヌルq隲梭W呀ホ擦」5K翌ヌ_ヤネqxn3=<VN純ルテヌQ~ワ縦@ マ4瀲エエ」-x-Ho8Xo xス;<キ>修矧虻ヌ巣1ヒ^*F修?&_ヌ装チjム縣o9レ6|ツ^サコタヌU) + I痛サ W'|bcT拙qー2 +8シI怕 } +ゥタヌムげH璢hsァヌ1凵)2qクヤミ=浹"伸+ミアD]ミ ++杣Y8フ l8){簓q6・.~ワロyXS鈬ヌY(;?ウ・]ト+キ2ケ簓ユテ冬 實  ¥」・+=iニテG C簓ユテトタ6|釀ル=゚汽mD>sノ鰍件+bツ>辞イ湘Tマ圖 ヌ: ミハ鬣ー1圍?ヌヌムRWスS(Vツ9E哨磋ッ$=、dヲヌチ。h[ミ縣趁�Qセ古蝮wロルqPュ抖ヌvAA)チ79EJフUfp荊Vナ鴻aエ{a綛4N鴻{L)3A羃「_オ3「rワホddカ?険=,l。ャホ泣寅セpqテモエA凝Hラnエ8) +XN~\ ミrキ7.({5nキナ化ィエアS竦EZ$ qワ~brHワリレ q渥モS H\aレ彝(宴ラマD嘉册#営;カト1 角韻(^jGH\!レサヤ +B /ハ営d篝ョ宴ムオトムR_1竓zAGヒ]/1粮Du F.秕uD瓧ト1噫モC,ヘP∴cエテBトt移r!糅9ホ>チ暗聰V3q .<#(<Y"トa<t" 守繙?畊^ヘイeヌテa冀ャ鑵l瑩o8ヨロFa+gテA「毓 。皺モ?ィ敲paセョサン・0K孜\ク[Nヌツ痂&$Dシ7&7LG $o踪 ウチ ┰媒爾%g ワisョタンヒI7ル ゙アneラヘ<顱チ碧&甅c奏e≒ロ>麼。ア=n,綿8ネ"ナ降r[ユ゚pトエサ()p臂ア゙pLbォ +P 」:*コ籍ンw「鎚oCI*#h"ヌモ5サアュ°tfソ x0廉述フヨ$@マS野ル箙'ク,mVヌ FÅイC゚0ソq+ミ7ヤ攫ィスC゚PFjubセ!餌n葺o啌攪o・LpMネ7フ-薫 VリZゥ>-Lー}ハUwイ!ヨ'Sd'+ 効mケ机6M ho鏖=虱ケロクm郢ア゙゙幔Zィ7恆i退Pコ悦ノzC +お箴。~o`゙8jュ塙ヒmv5i;耋ネ蹤b +トタ<トルヒ俾-テウオtカ樊^SニVcシ、7$# ヘPgカロUl゚h7*X吼h7famdキヒU\Fセ1ラヘxCラ志テニT7^Ip-38ホ聢nモチmチt崟Q 、kチ{゚穎@iMチ]HナnH稈ツ゚xnフウ限qn ス|$マ7壙t゚"`nァUハュv9曇コ瑠ネュ゚Vキモ.q」ク昊 qヂQLさ筅_;ツ ・*ラシチtッ �nミ殺ィlクuェスセュカス n%e<2シ bvjgキア惴Y_ャォ(XOyキ5縮キュyレ>ーmネ86gィオ Fォホvワ霊Iウュ]趙nネ6ネqdトネm9ア号rト6|5[カ!テナイ%レ震襁敏mD峅憑imIャニロYmョ +炭mqラeBホF褞 オfィ鎖cネbヤt鐓箒こ)md#8(Hロ「ロ`エ]キァモ3「裁yJマ。ュ vト"レ +テ]B.cAhcャSロホ m踵;ヘ(sル5[:ルYKッ観WロZ瞭g+,伉J愉lf掵ルフツF1エ瓢m6Z9]諌F 杞レ`アlc&エチ:Zサ。ューn巾Koィィノ6ャM Bリネ。 Kx釐 mエ"'@ Yレ``Yエチネ$�mL\┯「X薈h+マコ"エチ糂$Oチ'ケ誦┯るか'エ!ンc堂レPユ TキmlラスmHコウ'mメN銃B1,@ B屶珞巾VX閘オ斷V(jン"エム篳6セ69w> ノl乍 マ +Unムマニh カQ“+コ%+瞼`e摯鑞ZX^ツ ,\)6<ャ・ナg-エR牢ムァiフg+ヲm5ぱォ驛マVH弥#ルXサ犁a傾uケl,*`2ル +^|6|メJ トg+l*ラホg+ン チρ>:ラチg+ワ渋7廂lャラ゙ 浙d滲l、=\Dニウ俸ノ聰ウ瘍[2K|カB<マトgヱヒv�レフメホEhウコレh・モ"B,'Ah+ウm┯ツ著{,B[チ=Yヤ4ユ^zケ2。攻ソレx'{E斷Vx」p3。 混sBヒ/ヌトy。 EナヒFhテ$瑩'エaヨアm(<ウ)?レク5a峺mE}2Ah+T%サホムニ援ヒケmxQ/ヲicwu3、斎m0ヤDhテ゚ヨサ�mタクマイ�m肪セヒエ*6@Jg'アーェハキY釘�レ7d=レ,@~オhcマミナO: 魎 ムメ ミF%If&hs6ワl6$ チサラセ�m、2ネmF +>hc;Dレjq&ツhc)9゚Bレリ3f]6^-}ァ hォzメh」ナ&エ胴6ネTZヌス�mャロソ嫉�m,レ覓mRヒャTjク ゥ倍フ$」滉w +ミTKh壷燐hテ0ゥカJキコeシ^厮K"ぱn[ナgCヒニ6>KモY->.z乎gCロ=フgォトスタ レ期狐ニ-Fァ2渭ス悖FヘJ!ルR 奔旬邉チZョ:トgc纈ナ;斫F興2“c゙ツウYzZt6vntイ鑞ルsさ痾ーコウ!ハHfウu哘0ホfテ厩カp6\Mホfヨ聢駘Hーウ(6鑞鬧}φルリカヌjLgCv俥亭l6]ウUild6イナヤ~嚶猛BウaイヘhCウ疼`)zル瑕兩"4f{裼ャカ + +ヘRPNV’テRマ眼栽# はV臀ール煕ウ X2nf+ 「心"ソタカ^J。ル +・ミ�#4%HMdカォロ`カル<$.Y聢ケlテウ4‘C9%aル゙D?gリ゚附ユikAecチ�ヌコャ,濕鏥6ヲpュ緲. ハチY羨 *Z泓ロhk痩┠1t,*-Tァ箆児゙Uマ軍Tト徂`ア@スィlー0鮃QルミャVーヨ)&jv Sイユe,ヨ7eテトミ(「ィ.g隔&,|机 ナ&シ‘テ$@杤ヲイア蘚キセQルXX2憚ナ,.J勢lエ嚀輯ルhi綽T6椨゚; コsRヲミ矯キVルe;ヒFQ1 丘7' ヒカ,脈゙DM{ +%;p昨�`.3妙メy>F:ェXムa`ルィ`]ロリーl42!,-ミ) ,,&a坡lーR$ーlカ ヒヒuW\6Hn[Wィクl�ーE\カdH\カe をヌ(ョケ8~ウvニf」スl徃‥`ル%?鴫 +ヒfユツユYJX6リ'.dヘムネ\6Z<獄皖6B@ホ癪エf」ア敗胎ネ倨杣d6X' 」右 fテsd6k膠ノf0ヨシメap6リ* .{ッr\6Z3ラネeη.B\カキ\Xセ絡!6Jッd.抖ホ.[)杞 .W]読ホォ3載ツイム@1taルA8 VF0ecuャ‘cテヒニ#XeC#ーlィー`郭テイATテ燃ecg薊e+枕V +q +ヒFKw|崘・3 甥テfcサ9"ウ1wモナnSェu +&7鹽6<sエDf{,゚ホゎゥオ$2:Lルレd6d6Z瀾md6XJ剄1ヤ0P]莢]fC{�ウ3ラ"eFウアノキe野゙スリ燐9vナj:昂ハe フ 3|fォTチ$カ"胎リァホR}胎ク゚-ス-2[5ゥコ遁ヨ綿l負;$チDfテh六V"ウ鼈R佰ノl(モヤQ-Y拯Yナg」�Cオ箘qZイュr箋aヌ;$燈ナへュi|63Wカd(6禍Yユ垓2。昂ニyEh」"エチb痢 mワ'2K$゙Xe+SFh」Dゥi%B[褄;"エaoム レ%q$ォレ錨y -カ珂F +ナ(ロ.カマ殞2-Y戳タ"ニ9椚ーm; d>l ワ掫コ]リア%<b売W bSFt:Bチtン7:トラク搓サシロサ憙,ヌエネ}p6Kbウチ`ム`アル`aLacウ1{ユf」チ n リGルノl\eネチl垓限lo'ハマケlwユef.[カス .ロ餔.ーlァ欺mT6*リ((スェ1 ~爺 ノ」fe8c゙セ�イ晄n86fK 3 ミU訣5jリ^g[ソ=セ-ヤラィ+Of/裲凝テtシcャ。9敖v活,ロy[= lカサ6K,レyX6鑢aネ5蹌ッ。m悖-」ェMナ?x37!l}yh qャtM0クシ\'Xjリ゚0G剔k。[ 8シサQタオ!ルミ\ 它kィxaNシ5Ldo=: {]エ5Mヲ レレイdレレイ憾v_ァtァモ捉j~#セ +#Uィ鷭、53QZ!敦`d」@k0ワeaヨ(:9ホウPヨ梓 . Y」\q5Fア扱ヒ[7ぉニムpヨーニk�惘Аcフ(/C*Qp5トニMKヨ冓8Y9毛jキイ敬=|�P)kY-"ォ!xリ(7疣 4」ヘャァヘbー問V[ V+メ>ーハ'=`Z@匝リクj8Iマニ瞽AUワ$モムェ6,ヒ#、5k]Dオ皴P梗pン: ハカ&T85Q[゚ijトハホナRCiァ甞/{HIt0bッニケYオ0d顧2弔i蒐ス jイQ+3ヤpwYオRラヤ``R讒ムxOΓク♪4ーRwxナiヌ\エn・ANモ゚剱6ァヲ1セ;5ロBZ欒ロケ'wクZU モヲヒ「1mVャ凉isムメ"?ョACO婪iワラaVヤ顕8Xiヒ胆e+ュテ G・Y郛k}*ヘсリ皖41ZWオ`i・ケオチメLャネクキ丙hソw_対hFユ.コdKCミ=ハステメフレdモ峻 vヒミ2eケT*\K」・/Tf=FF・1-}マ3Pi0<゙トスPi剌ミチJC] 翌`・aUIアメ(wfツ:鴛ォ:ナJテPdPャ4クス。メ(:rタ@・m~T+ョPi2Lpユ膚vノ゙\・!&~L氓昧ン=4チメ`アュ啻iノ蛋ifRS゚柎マ#芳モアKー4ヨXYB陸!ZoO吟ss・[ヲ・チkNK」Btw8夬0ゥ7 '\ャャi- iコ¨K!ャトフエ4*ュ0-ョ$メXeエ4ヤユオ゙hiaッ!iヌuチヶVヤコムメhナエ4~,餃R杤>'nEKC5ヘォ^3-m'ZZVコHh眉詛sムメ +ツ,c?・-Kヲ・-ォhiリ14*aムハOソqnチeホJ[Й 」Hi9ヘ{qメ崖剴FcY閥メスZ4{ル)i0rf$ニオEI」・カコSメpz{EIテU23lネ Aホ清5Cヌa胙2Qメ%Sメ剖43 iリs&ン i(JイJQY@e9垢メΩュ^、!カk、 +Aメ4.c竜,断V8うア&脳#うフbヨY iーコNГメ`僞ヌqヒ4XmヨpF �#<シs"ix樗i# w賊t0メ%1メ鵬4ヲルル#Yチ?Q53メl・、擦穢クレ<k2dFZイ*bネヨ)フニぁaV6iuLナq(6=<ノタネ7篋瑙n4 "号讀3麿s7FュU3?タ兮oiーX'3メpeI0メリ+ホt3メ!3メフレウ+C | #iヨi<ウ+(崗IC Sッi婚fオip9ャア@4スリi8ホェ-恆ニh- レ魴Otネ4┼ケシッ罌{サタ8sノiヒ*D nP4~鈿Lウ喞ニ]タチHη$IナH」ナZ#斎i<U+}!メ「トkC、!ロア。 Dk醗Z"-Y"mYHCム5彰ミg6ノ.崟テ韓;K ュ�zM"昂ヨCdDZケ @スL&界H[膜H[V1メ +ア%)ッ簣」ミ7mアh耗Aヘ6 ,$ヘ,WjO艸ツ*He{S列&ゥ、陛j&=鸛、チf [F、A].pメミリ愕4hマ#@レ・*d耐!ワK譽q*=モQャ3u2;3ムクルメ,"<チミコ6レ略ォ尋セスdeむ&T9耙9h涅衂已絅゚g箙_W_テsソ{ソ育Oソ゚}蒻ォソgラソ裃~隔7モマ橄Oヘoセリ膰ソニユラウgGo;_}o~* �ラニWソン゚三危_テラソンコゥ ヌo椏Yユ7ヨg^=ニ'ル~マ~ ?ユラソユoワソ゚?、6哢Nア&メ灘コウy轂99vツラ+サSナ]ルG碵X_ピ/ソー釆偏フLマ幢翔V]ヨ_|ヤク}7゚ユロユマ?粧[mマァ_ン娚CA迯v-TゥN@テy ァ<@殞フ稍`"蚌ム?n植狃 ヒJマ肚&d゚M,�好ヲヤセ1トマ!クタミ&巾F癨PD}メEニワイォ.俊!>佐Q拡qョ9ソ痃ヘ+ 漾}妓Wラ>"{(-Vaレ鑷ネ&:2�<sa7P├」コホbオ紂チBsカユノ1 サテナI=D梳゙ウ、ゥ3ョ8-p市qiё8刃奧N<>メqナス+モァmIQマニ 。}ーz7A dゥテマエ3DMg1蓖ュsク?MーB筍KqXユ半ャウYキB`~'4 N/;wb+タイCT崚ケ<ユXzタL!:_:矯 ッ「ロノサムュ粭ヘテ|沾2シxムリュナヌ幻iKSネBd舐z陀b トイ膽C[覧ミ苔金鑑Q + {d-oソ、U溂d樛dN&;アユc$&O・ZH黎ケCヲIヲ[2ロー~ cFタ嶮,|ュ涜セx?!{cャニO#<5vミ誡畝メノ 黐隔IヤafV$<!チヤ`珸&ツ/ユ6ヨ&}DQJXコwJウdbtネb゚維ッ5t\m ユMネケ*^k凱$"?リ wッヰマ3h ++-ンf燗_ 釀ラソヘマ/^~ロ禪マxナ鴫ィヌCM6ы)LP}蘯┴\ヤ{ヤ+s裹ォ_>轜Wケ1//ー梃「}シシ>1シ孅:o0フテコ=゚ッ1F゚=.?rk位シ{ツソqシ9ナウ'Dユ0浅b吶Wッ +キ狐ラ >71?rァ樒リ゙>^セ」.9續拘8L+9キヌヒW_}|9q衂ユ7ソ{Vョo~狗Q乂1ヌ沺ダ~'漱W譖゚レノラチgノナ7マ~7<ミサャ畷_9ソナ\]誌'/゚?ウソク+#「慎%チp=シs`'ヌノc嚼ロモ@qネ]PDョァッンcネァS cテレ'tC゙ォ8 +:d+ Lナコシカ$MRэ1ハoニpkノ;呵W$ヲ]、虚ア厭粭゙=-ミ6XウUlcイ馬ケX<1」ネVィ< "ネp拯_U(eb e 1\gァ{゚`┼タ噂M茶 「オ@n4,絡 +魏ツゥXi*uヒm韭ナノQ\鵝フ虱ヘムスP<O Dア3@L Aシヌmイ、7h擒ステ[ス猊ミ< + +K侏足ネnエnナ.R[貮ミa ;fP\�笵E h VC{ヌ癸~鑵ョヌユ`ュ゙テ1pZBNd瀘ャセ_G]SKp{レ1ヘy,96<ウンスp豸vンシク3ミノB甘:ナテXj<ツ粟"トイ。ィタ3ソEン^&コP!:"Jェハクチ$ニ7P{サfhモkウ浬*>ト,、[棺aah。纐 ム=イソY付9襪【(到r{ェ赦・ォ於癨AP?cゥヤ1曩)猖羨6R/ヨエpォ(チモA9吸若ウ モr ノチvミI硫F*"'俾dニ>5MュツW:%飄Zェ{ォx」B?譎ロ_U c宸w$h1笳。ャ�蔘゙シュ,Cナ嗚wノ貘テ$緊蜀C7欹らg狃壅イ啌c &�タルy;メ!xpψアユ籔濤」Y題Cxィ s汎ヤx0メュ9゙セlイサqt!7タf腮S3+ェcヂw,wCRwdヲ}ヒ尺~ーァ5m簒J:ツ@盛'.ツh゚~イXゥ^アァ>K\>r冏シプF]ノ 逧クvゥ鈑?禪O現た+;跂ホ(胙學ツafc∂{怱F~<オx!稟「「ヌL-vナロ`|3wiネ懆-胥1タ艨w籃fHヨァ7」夷0カ^$?・Q~イO瀝&恫G」w袢Y K~」xクウzーヘgレOo&Nフイクゥcjキ徂 l|�壺ル楫<U Gォ"。マ"Scニチigeウニ囓ネスn勺 ムテ__Locワ」ns瀛.S%4ェO詫"ナマ「挑ロウサョ&藉nヲml絡疽サンDァX�mjvェk抱=マンュТkノノキ虎ニセ}士Iツc、諮ッ['Jワ[ツL1シ(3EW倶 レレセ傑!/カaヤ キ樅/-レx=闌蝠梁d/ク#&B6ケ弋欄#めノJ韲ョ煖XsG。リFe・cNレィキロシ」s:「UN%|Bアホモ ルテEムq料ロA:<:FY8テdヌラ~b;+、萋yクセ%/ツ腟 /乾Xルホ*%rウK{コc!ヌ8jクgLm`jサ%:テマゥk8ルヌ廨 7Q竿フ莅#Er ゙ モR5モタ3Dョm_タ:テ|冩Xョリ朏ユツ&8#}トヤ溘9夫*躑b/s脹 xXP。EリウQスc辟`}松ソ乾エ cァモDc氣欸1謎ン~Zゥuト桴1B6<h[x2c幻蒸}V才9ッ2YVY彭例誰ヒZョ U・7u漂ー`ュ>ァWエb・ヨラ`マ恬 +Z<eケh,;ーエンノヘル=}c哘ッニニ=輟「`2Gフ%オFe焔zmキKヌミ1ニ13フ四g}xhJU甜]g栂FH!aサ2カr#ーソ�02`;嚥Lトォャ RwDQテコaハ謔cニカ貲;コ)テムヨ#bソN)樗'I]#ヤマュァ 8ゥ1*ィXz +轌サR ーB5[T!k「4版スzPョャa;5Fク栽j1ノ岼;キ祉ヤメe0セApbソ型4DS5驛|Y迚ネxeyアEスルィ(smツx ィン窶 DォVL#苜HgP *.Xェモ宸ルUァY 9|%シ0'7Xル0b$コ%bワ哮%ラd[コ eョ9ケy瘟-レ>s齢+AL依Z゚ァヨ�j23c朽ュ|ワミx扱бTヤ莚5Nイオ2q偈セシィ・Emrュqクnノ゙{タト盞トjI 4フマアィカト[嵯翌g4cy.ヤiテFZォxX>コハナ~鉋�ゐ 4eヨタ駁禳蕊イネ?チィソAムン。SXh冗!O藏禰X貰Zセ姆DT&畛13ル幤タ0Zケ?`wエ(RW仕n觧蓴RI9タ゚ノ N畸"ヌ:Yン モハソMヲ!ワユツ謾nyカj("ソナRt捜 ヒ%u9ム,夢5>カLョ芒ウ/4恥ーウ@ヲ[=Ba臘,ヌソ刃+/Vj|AMvm!ー;氛FTェモeロヨn、x]レー@i/エ} u紋ナヌチアAb゚2#Qャ5?エ待v P'茖bG*#fエocJョ]゚|wgタシァレ�レ+}"O・*リM"。Gナリリp「式キカ・懿ォ残,3Zアチe詐Λエ}*レ-ウ766ヤX酲gメョ崙#販ヘ9:|Y、w(6エkEコuc `Q`Cタ+ーエ磽":9」^)|E)嬉リwz#纂ア挂Yw.k\崢.掣;ツムヘOワ/カロェP創セ停Dエi{濃充qォ゙z5t< +ヲaイMロkンbPG\.セカラ#"|E0゙エnod耋]QGケWl2マ+┼ケb95櫂(4O;+`ェル)bェ1ウ鑾幃"B3「bク3#ミサヘャ8"ニ>GGXy嵎#セ簽Z"+ヌヨX~マモ{ワ<ヨ+EヨcI串カE>綿萇2mケ唆@,ヒ9挨{Yソャr畠o!娶Y条>"/1Krd鍔扎トК塹u感ホ:N辧pテV(サk胞狸Iヲ"オy卒 +/2イZ疂F+」! キ5檀瞽Fョm#%柮$ツ嫂ノスuG0シネハ十粫襾ハQサ?JニAゥヒm_ ホリ([禰馬;僣ァjテ ラリE^6"yォネニ,メタロ^-イナアァ灸イカ}宋゙v0"#;ヘネso;メHヌホu・フオサ]ゥシ XZk:sキフォ爼」5ヲZサy=潦@ )vコ慧yj?アキャ妊Oサ≠贅STsセナ=p0S`ー゚ルシ~P∴q ホ温:テリt湊貧ア H拡ァノ:J#u&[ヨ7*(aサ2oヨ/P睡ゥIRュ[。Pムコe9「エnュ"Oq怺ァ任X0鏤マ[アーキ%ツOヤd「^E:胆>^シrオソHR那^ヲr +媛ュp^繙*テ蜆。Fヒ佛9モコfヘネ>GYミFa苅:イz怺QAミzロ:ネi<(ケDニi},6Nu]q\\;末BRォ滲e@シソ'EゥSIム皓r隹vkムXDW7。喘 シ=jXR%',}エ裡オク3ホト PvY~シホ]モラnマ、+ラqコuョラソテ涼ムチP゙シNサーユサンg晤C軼x4ソァ(卜ミノ+e7&髟GUГ任q唇<喟ヨ蠣h]Wラョ9ヘO2/|b^ミyル檠ラル舞ィmb侏\ラォYa/:鉦Pカロ$Жョ{kBLBモ:/゚キフ。」S<ッ~ロ鈴獨タカ奐渭A キZ8r'`ヘ$r2r0ネンフクミC゚ルXヘ縞Iqヌ荏&ザ蟆V∂ヒ>イ^*スツBスPR0゚脉ル'u%闡タtPJエヨYロ 涕I][$Tw)舳[マ&レタ-掃+0O7ミVJト.熏b(「蹟_#:-cニ8ョSyヘ細(P\ 1トユS3~+a=M漓シンヒ)cコ_8ヒ +カイ゙!yゥGマoマ悵#マ/ニE\D>Lム0奨aKH<Ysャ告%7^'弱>モ醇�>]{ト・#kz!s?1pヨュタヤズトn杓$fu攤舌teタx@ウЛbF猟ォz゙キ#1ラ8'Y5r)カニtW +gdキ セヌ@Eラ1ウKヨA>籏ibl_/整)^2]カ^ナロヨ ォ[ー^jンヲ扈ケ& ン5題ノャ gロ」ニト、'ス&/号uyヤャノP|zVム cュ,o'okZA「?/イ}Hシ b hラ7K�Nナ羌ッぁbDモシ'ロ=R "]BTワ偲 ヤo8」+ヲk(o」草ーc、ヲubホOdヨネ堪砲ウレA%ナOx=魁髑ン序ーゥq・2貶ホツI]zF'v0樺`^ソャ2N滌ハ^MnYK)Q@y3ル9ユ運Gシ'4ヒ5盲Uカ5コ!hd$AィP巴ヤr*(コhオ怺z!夷Cb0ヤZYzォk=]插アElミDe/ウ輟襠|>コハP瑰r」ラxワマエ゙0フ}エ'ヲ@Sr|3Aサ�q麈蕊テyJメ懶゚*'ァヒ%(6ム瘰危|>u@3?怐m(^C-lチ_o~ヒウ|}セ殀イノ羂|コoサノz>66セモn\腓Jイiy%働�Yネル鈬 博&タz-姑垳'ヌt!u$憫,8]恫ノ}气 ノ 1[゙影ネーa┥蠣{1N刀ァレ\I�Po・カァO%'Aウフlu5?0K,ァ椣P縋チJbo~。 m( +關$「zヒ:ミo郡sョ_}裔ロソ0$_-メェK、ナKMソレコン+匱YD5ワユME,3]qムyL%({<个ob2S &tYフ晁qカィ;エセーxケVサ0:eh|暑g委晦2{ヌ祭ラqキ^3;ンユ粳ュクォシネ゚系 !レz食テ_遯アセ謝X醴獻ソSCl]寔蘯~斎wニィ収#?Yシ!゙ョ7Iマ スk弯ソ +ォ賀2oエbミl[!カj夘$u+lィT容cJ J +カネJ�ーZ5株�ー$櫃 �ミヒg%レ爆�ヤ ィlJ�<WュPチp7MLWィ,BvDB�4メヲ %t�麒糶!P蛸スシ?d��邀Lノ�T\マナ&+ラィタ'ヤケノ�<{マJ�」ヲヲz*Q彳�pッ �>xィ(ヒ邨f� 8ャCZヘク弓ソ乳6霪P` +タxチ;k。?スNナ3モ 禿2�クミ9k'゚Ppネ)椰qッ亦ッ蹈i-^e:(ナe�'.�@Aエベツ~ヌ]タヤG3d�ハ? 覦モ^<ィウY)塊クフタR蛛2aル・ハテ0ホ!K這jwT齣*5 eM\Uw,以ェ<,デ%Ty(EA・ネャハSゥ*ZレR蠣s貞チ;j@キャヒ。ヒワ/ォホC< +mコ<オ8X<ty*Wメ蘂ツ女キ鶯Pミ藺オ9。メロA}湶y&]>ワニtワe弛メ蠱!0o、p6Eレ。z、ハSDワTy0アロ*キ)Aェ<Z振y(媒$U曖^+K芙韓佻7U|? +械肌挑T(マロGゥナ゚f*Nセロ秤レタ条緩タツlfPハt敍6zHUeーフ!ネ(!.ク老"$5谷レ9$タキヌ"  穣シ + lノタヒ9$Pエ昿Hタj16)キ�+ッI6諮�>i♂ー_ソ犇ー鐃! #d謳@!uh+$3愉GH瑙」゙!(ェ6$`魎ァッテ+_ExLACテサ遏Y[\ハァマタニンqQェvLU蹼L濕.` `g|!Aニ?GD熏朦a蕭 曾J顎3ム8Y冦イ豊VレセXタトSm唸XS#'!p<sサg・ヲPャRVwm」x騒K1ラアヲ[ホhjR薛渚Vne%ヘカ,52.l゙ヒネjkWラ,$。゙ZフloW-6ヨワ「ヒYホヲykq|杙}qァノホ チd}Ppアョa0リカbハ(Sケ<7sm鏃熈コWJ筵V3vYQサ d塚ロ。1簽j慮U{WuL「jセ.d<ウ樛ウ 」ラュ'g$Aュ゙俘ケ$ィ忰Vュg悁ラィWVk9カヤリU9ホフワ「視イgゥ」千サ(ァ糺ur?2壤nカヒ韵ムワwマ;っェ|ヤ/c@ゥ}_ル$@署 +タWsVヘュシオ@�iGョKタh@イx ,ェ、V溥ュ.Gf・$ィテ-8j歉O ェ`帳欺噤W`3o@y佚^牝ェヘH・テ](「6。g5 ホ2僚^i& $J_A,]!*ロクタ鍬ォ0潛Xォラ痛タクCA) 戍DSZ]ンフクウ% ーmゥR {``~ゥ!イッP!85ラゥ威氤薯オFl-Iリ佞ュ ミEAヤ+ 0ャA闢ゥ淆ヘc来膕ャ`;鴎陣章研VH゚�キVb,hュk%[8楽皋ツO儺コ頁U嘉ミcE0N2癰Jbヲ恍'JB4 +XウuニH*r6aネ「7aエgシナ +flR レテソ、ロJbウマyケ}繋%P5ニD頼裸*ロソテ片aンヤァX\*8JuーA:b{Jカ^ョx鑓ラ鈑窮稿 シ ケ赫Ωy*X閙」]}キヒロkrホ\「Pリ?嵒ユVe@フ洋sz]誠MXkスTvワSスyミ"e逎ソ囓ハo9キァT・奎ャM-ヲ�ホトc%0}cam.冐i「'ウ]゚ヒnF抃a*a从 HOJbマ.オ テモMルメワノU~W,サqン|.#b芳([凍<An5皀|ア,n!烟餘ユ渫~ワラ\ユ;D゚ミBチセ9ナjオ6ィmュ#2z フ1叡ノ蚤[We固+ VアX據gEヌk[テQKサエrp'8+ス;; 2K∽Akノ顱ウP嫐R崘\(トミ/4ヌ;クvGィv ソ┝\<晰ィ謝n誣yw‐moネqルワシrレ7?V゙"\Mト#イKy:Y^鈿-q葡1ホス]?ネテEuB_゙*愎蓚リンPヘC4ヌ“ル!テL昔剋3褒跂Gオコ」[C砦6ナ閥烙壙纖セテエ1ヨq73トqオ紜7ノB"ロ=Kxy・張C傍魑ャワkナ゚p]{蒂c*レ軋寛fnA(уv 噪ェ.u8持1エqハ小コフ答'Gva彷、裴v籌{z3ェZ力ェ8c((QP明i塀yKL:j:カZウ廃ツムキd愃u淒gMKG?Zンnqk6 ソK�ヌ盜鞜Cリ夸AEォ^<Iuュ椽b\Ds慝?陬ko3!ン」ムー鞳xkk激シQツj畳f「*z-メE;ヲソ麓ヒヲスコォッモ_顰ラWコ9"レH5,。殃v撥!|「wュjセR_ォ豢ュU栩d5/F>sキュ齎hハ98レv5Ooンス堽」 8ヲh^ヒB'芝#コ残}火膵カ觜ュ「モ945Cヌイ練・cq言鷙?」:黙ュG;V縟/リム,ゥ/<Yス\A2クアオ「ッ-瘤DWイ蒡eU両ワ殄、'ikク_*テロ頑}wノカケm。 ソ.エツロエmツG簸@x兆カM82p4ワgン葫fZスKTチ]緇{チ逾ミ犒"恥p|z07} レネナw7] ゚ 6 メァE務m犠トセ$0bイ馭ト.'5エ + m6・゚P嚊6\!ロイM$6o! 「$Fbク)蘇ァ%ア Q豚rn'ア1 藻オw阜Jlp7ア娩&Kl%ロ鶤ロ%カン。ウカメ浦脈'ウャコ、エ哦 +6 (ャ"  +ヒ拌耕Sc]ソ!ッ~ァ*腎;QYwLaホFt&梳7))フウ?MEωSWタh ナ崩、S3ナァヨHTkア革ナネ死X 嬶ッHラ祟\シl鑑、「yンUシマ゚フsタjェXムEヘ&ξSN*5/E(3ヲョxn\Fc鈷ゥ&ハ芦nモiトacヨ恒ュOヒマン跟ニ 疎-?゙エl"ハ 鈎ム尠M┏ラ、ィv,a゙Vコ舵zQオf*リセッュ緩ッ5リ」k楓a[フe5_ょ(族3pト3柏%サ,ヒ*ラF仙(QイサIハァャ續rY.W、f6ラL徘熹綺>朿Aサ/ィ袴謬Z~e$浚ェpR#オYマtmn菘ツ+詞Yヘ+ウ餅Hタ):9齣ネロワネノ髀形l "qク"ソ寥HAニ>$2保v%叭ヤ(サ曰協ュQ膀c鰈リaEvロEイ6カk耐ユ.イセロカoヲヘ。メヌア}$カヒ圭tlFWセZユ勉ホロZャャ椴Pmy\wエC訶ヒ;濁ム平「g兆ュ ゚`墫湿"xテ溝゙キ」ltェ=g}ロ]{�騰苔イ &ーl貔v)\ェWh「メCセ#vQアDS,8 ナ?ヨy"憶ヒ:6qQ +キャkマ26-rウn;f褸マコゥ +ナ晃)朧6ナcTDj=iャ゙V: ソtヲBニッ&d%\l ,桍蜚怜# +サ狩ナ5%EQ9{ラセ蒋u侏ZャSIb}eVネXヌナ薔m耋ッ2&>ェXQ\1pイYFラ欹{SィY4マャc( N Kメ悩Viマ`疉ラ・Oウホ掎l燎フヒキ逞セN~2>6 」ウ庸意囑♪。タ!=G註"リア迚Wo&)t;l)粛]Lq椙イt墟ヌメ麗2Z~I2ニEk&{ヒセフ沽 &0Jsf!{]& Yサ#Gル[クN縊eメ ホ、塁\5$癩4U(8マォex5�ーヲソ槲}ロmヒニツVY蔓ソ岌,<挈痿I$リyxホヘ5Lー,8$D棆R}ア「逑モ;7xオヒォャ >izRjア]/ツYムYカ;c8 埒,゙昿d`オ`カエfクgム0・ヘッYカV_ヌ沼ャsc ゚ +}籘 メフB\?)v]g6、ナ�@レセAキ ス'゚n->pヲ�、2w*6Rワ欠\8(ラ3セネ1.カC"壁UJホオ\ vn$ ィ8其Eヨf 置aメ*Y/=匂#ヲfン 鬟钁IAeンヤャエイョC,Iオ%dw臥-5$$ウN悼!&ヘR・加圖kbHヌAq噎9カo距(ョパウクnス際ッ距6nBシリq」bリnhLq緜2烏」9g{15ナ梼+FC\ト6jb:袴fニ|5ュ~ョa「エ_kセラQN磔著タK6輙サ+1踊3ト+鉱"k>遯剃 +サ)a豐 寇イリfニ$Q``{6+、モタ@R蓮ハァ$<;粍醴kIO +pTル5kqェn腐ッセイュ +ホ、+G$(:!ィ&マ冢U潅uスコ・ネ]Vッカ[署瑤7ュエ]Jケrチ:態 ヨfеaRKX/EウツコRhXwォDササjV{Xw_ェ I9b=ネャ0ア:Nッ扛トNaqi1胄cャn?SC:F厚クcvlw6゙「x=モSz:j蝋H邁ュ.ueZ w勅「? ェ!uEヨユ|Pk+エョ戚"6(エョ鎔�橋ョェk勅ヘノイ!u5犀コB演2J +フ'ェーヨユル3エョホ、エョ>P&エョ゚CH1i]チ(V ュ+ER10エョ )。螂uト;{C +゙就ウ、vコ飭ォ オ+w^WRサb 榑岌壗< ヤfA嵒・懍+アォ7ZW噛le~V,uラ}yモ/D瓠コtWコz-t/Gh「?#ォ?ヒyシゥ }6Oンワマ~q(~/欅譌/?ォ毫oモo~sケヨ�ルシス4lBォYチアm恪ムュ6\コV・( + lvホEオ6ψAネンEMy&>yニrg&Z*3xヘ賄kリマヘ!^ホフマE$Nク(ヒiィ!+%"ホ#r2ャ)7=jクノハ\?ヨ.6猪仮JA(bEレIャア。ヘ可\エy濬hテ745"=サCヒGfモfカv東"4Mq*ェ5rqF<ホq俶R莢)A享7ツ6;疸ワ上s3@焼ワ澀0toゥィ!チ潅5カ(jゥWuX. hPワ.崘戻ヒyナヘ*晩P gR`k*4シli舍変掛tThAカ@E{ラ7イ#z$オ|ソ鴕班?.ULワM(^モL`eZヲォトZH疊|."マ┴チ'q&〕Dッ筧vルコL宣Q:#セLwア嘯エハョr-TO瑰摩ャ> *P 鶲Sオ}ミ2レァ#棡!ヤ@錙Nfィ>E#ェTi「9エヨzya載ノ d瘴*-Pヒ/% ソィ\シNRj裏ゥWタ・~ラ=乘。ネチ媚G 1茫A モ媒メaP|レトヘ ッ<丑rャTテ Gュ?(ヤウ衝抉サ_18ヅ8ァ`M"^5c'ォ敘)rツf5xAラツx;P'ョVス,P]a疥メ+釐ッェエr, ェHPクb +ホ<cケQイ8町a゙杓テ{→+^ミ5BWイ0N*ョXXヒesH�ユクN源クk嵯キw観ヨX)<n攻ミT oレh゙'$V擢|勢q 啗ヨヤ鑼9ャL鈬�ヌ!┛較凰ユ癈3Uyモ!黨[#_P}]゙~zメレ4Y乾I ・曝敲Eォ}ミチ~俵)タ+ �ヒ%ュァ +瀉o歔おsp>/6イ崩Iア /$5ムツ 蜀ュ&ホ!ハ籵lロ{/"%1?27コミ棄EM?3護 4ハ 」クラ\シトrト"・U08ツ>#ィ<=ロ7E丈勗.U祢,q 允剱ー~<�[6這;'etM4ノトD9ラwJe・シュ尺恫アリ<N*_Pリホ0vイa=+ォyケ燹 3-ョメ!。倪鰰-占クE +ヒユス0ャコ/削ivョスト レニ + +Kホeユオ、5ョ?`ョッ~ァfワ鐘ツ黽>6゚ラ叟_(Z=@ヨn1ミカクC"0ケミM7Xwラ0冽ョA溝悲ホoH0=Z\aユ?シス Sャ7w糟v/穢Yウナ「'kFY仙<,ウfィlヨ,`輓カ �tフ械DヌトケHメy~ 穰フテBRヌT蓐mJツuLチ主!`ルア韓掎ヲvャ6ヂ散鴒gtヌX痰ス-チ3リ盂ィc|[|ウョ5:p螻/K^誘nA メテu琵訛r=<Qル?bH>M褝>ワ」ナonT@袮qマKヘu 枝クxチコ�tqmカ#飽ョ;ケテ<オァ ,7=pyコ'(ン<ハオカ徠ワQp蘊c獻:平モンリヲマホw躇ョソコロ跚ムbム楚eUt゙ht磐UFG槝"kヒ)a、シアチヲアO|。?橢ヨラノ覈u^ +“゚}ュ=ヌIg判2フ<纖'ス-h窮助嫂アΙエラqカァ<劼シレuVJl萬)~bゥuャ],# |レレ髷ァヒIニ借セケゥ CnJaラpa;z" 2 +\椿uxモ;*JcGXタ桁l。:岫q勸 +溘ナ会1朷ロm髮+ョサw窟4斡:bセー5 +cG]%+1ヒー}4Wサオ誹6:$?�>ナ^」uc$郭uCjP|輹S蠹vi痿B@Rj皖Sルヲン Dカュ寔oャ゙Bーn.*フn�:Z99u麻Lz蒔「Nフ%麑lーeH諾Cキk懾gル」トt孤賜必コキQカFGトG6>9Fz:ト1NoXチ ネ]齪Vj~:綻g]Q9セM +X.zクサ・両罎ォ\<Moォ&月゙央肢マ+戲(゙Ζ鬧#ウU槹\フPマr邪7豎ホホロ」ヲ;Xoェト鈷1楓+ヘq9胄4テA;Es0瞋黄SwUS:ニ+ァiソ襍ッ蝪cy'gヒΟ"|゙_hQMOi-Hマ・ロf . t~RE:A\ト hアlE2 jGウ礫A 鉱}ァh(aオwvヒ\s-a /揩u戔 クlSYaムノ]txχ゚李イ,rg:ナ蕷ハチ87/PョQg;dツツコw +C瘢u<B窮ラ痙゙゙]ァツ<<nyーソノSh +CFス+鏖vル怠ル8ァ"'JNl拗9サ拊マx羔(ァクcCOラ_受3MZ*賛.&ルトk~8芸・テUg・V.}ac:(r鰈メア5レOア o5:注憖エ飃pメユカメV\>ヲ~フテウ吶[守ユ7rォヤ^ツ」S[ェ慈%mサ陞ソユ諺毬ク&HHレ趁6?庠+v8マU崗゚4箍za@icノウモ'ミ肌凋XlT1=モ壯3ク呰鐚籖ムヲ?6ニ +ps功畿導カ膃lエYM」I:7Fシッレエw%lエケ@#ケ骭t{eマ」ネpBヌワサ0#Ow倩」X;゚イフbゥ-チ-#>繊泙ン鶩\峨"�躬癒斃ラヲマコ~カ_ノ�Rワ沿0馭)オンRVナ桜`V<ym0BcQ+|テ!ツlッ合綯xEネ.`カ。!タメ&径チト蛻芯シC返kチヒ.F3゙リθ[瞑床jフz甑$Bエロ。ワ"ワウWуキY.ツヌ1*ツf「モャ碎{#、s╂キi<B1ン++Bロc蛉气アツD>V「゚ <ネ+薬�Zモ"[ー-}繕%22ア熊b[n#ヒr$;b饋名ト/ォ\藐ツ[4フ覿Dコ&シ秋驂ト囘u'メHEコis"-オ惨*ワー補ハ壼チツァ汽Y}善ロテHシケ痴5#余メH鯊po#mクyチ楚 o9R雪QッTeシ#」zd=テ縁韆G56蘇ユセA鰄mwY[゚(ュ對Hn{僣ヌ'ノア/割カ監tウ"uュュXdクキ[$ツcgノリER}ロ%ョ縹3ルリoFロ友カ?ッォ"@{ワU9煎ツC錨アg襴p鰉セュン仮p*Ptq^{%bカ=�^〇ハ p跚蚕痺・ャfー゚ルシンL瘉qケ犬チ2!InLハリX)�ご2 o£u*\ +コャッTp貪vi +筮泛`ウィSZキC▲uロr|iン^ナ。Dャ*Uiナ妻ラz鼕漆ュ+チW~i檢Do割cー モ゚モ#ヲ x(|遅導O遒ノタt。Q +イ: +p>ヤ@琥q%訖>莖コぼ孥u(峇 セMェコィ8n]m2>レMヒス$\玳6H;zキ>;キ`レ<ッ樒陛2xwR9フヨ卍濱AロZ'ヤ囿選タcGP陰8トHリ7ア嫂ヌ鰾ラケ^ネ_FテGG[W9B9^ッ*埖ミナ+hホノQ~Uマッ!ェ蘚腟^ュヲMdxカeネ:粧0メ<エョJGュ 2/|b^u�リ)z3゙箆劉比蹂$ヒヘCカi!誂: }4T/Hラoウッウ座:7学ニ綜轉ソL +ッvル鈷ワt^アイJVn{'scT惶(Tcノ(燃▽gア緲/- キィ(B +jミ,鞏\辜Sa、Zネ邸 +�H?ウn体箚BP テM;8ケ xィ弥薫nq\X{フウh!タヌ ョAヒリモVィqヒヘ力MリホrS些ネf窰<F&|ャdィツハ絛`P3偲=傚T志ワソ> +鮗Pテミクrd`墺/粉ラq#N<>槲NE葬棍イ:ニコ逾.=、(存=GエQSOlヌラウ5,)ミ�CコUタh桷LiGdゥ7ヌナケー得Jルエ呑Wハ錵8$.―フY>gン j1カP痾衡_ゥk鼈トク若L備ミナb5=Iハオ皷3h: mcb没ユネAォBIp網渭鹽b6ХX・。環綉穀t:ホ}:与常+% [勸]ッ胯ラ[ォ[ア゙lンョ5莉コf +ン5幄 ュYgロアニ蒿|ヘ_"リY。リG賣7s笑罅ウ~エヤv〃ッi、メ9P維・K゚wクィニ蛹ァGチ! +。Rホa(ニ'ェマ$,ォキ嗟」� KL n災0カ�70ヘ(:距mウ*M「「癶レ湫敷cュb)盒、札Za鳶ーXィm2ィ|ア�鎖ーフ H祚dムイネー要'薑蝨ヨ7テ+、*J艀*00}Ag>旭ュロ$ヤチV矛shヤ,フ%=ォlgル゚・=苴ョNnワー゙;|クiケャXHLcナセzV!カ篠)6�#ZG)┼銜+"ョヌfモ9Uhマ障セェ2_゙?8o=y&r4゚wー,1マe�モ糸ヌ輛8ヒニ慓Yヘ99ァ瀚瀕qkW劃薹!-w?チウ#チ、珊サ~AERホニ%「マAlハセ觝&r L +}G|st抂DQ/胛沚'ゥ[�'ァツルソメ_uカヘ wナ#,」J臓ロツ轟テウ!゙A "タ葮X#リUャオvWP/゚4) :キャセ~vヲ!$ェ.獲聿L境タウ'ゝチツ: +ヒ}サ!メpャ凖゚tリ。゚ィSテz}.sスョ uウユオ?3ヌyJoト4韈^`a!キnpカサ環 +v;ニンヌ?ギラ:ルrス +熙罔7翦ケtNッAミハ.崎nヤナ蜒。テfル剌o8[キス纐ヘjPタuk遜ソ觸キ飽`x`l=、1,\gv;ィナyヲAアホ、チウ」ルコ2 トuーロッ戟w#ニ~ワア痔;ザ%=♪セSzZ*B醪iナ4肚!.4g 渇」8)濶0ヘ.{獣5fォ�ネa]db3ャシチ1宝「゚ー為DqN#ウいァ1Z+、 vヨXヌ0+。ノツ iィタ;ムピ`根マヤ;ヤヌ=ソゥQミヌ゙�覇P勹zンKC!i鑼+pオ欹楠L<W:キァ イイxΑD多]ノウa+リm5ッナ0ユtxTmZニコ=TーOz,ヨ-w_@ワ`哲z節ノ3+`ァ^ラ疇^テAIG/e。マc賑クィBJ;K、o淮,]ソ據ソYウq~�, ィ0ス< h1ワ構ウホ3隅1ョWウムャ3娜嘛ュ0dY柧X"0{嘛�テ"C8ヲ斃エテユ洗5M; 6�=i゚勞w泊ヲャrпトエ娥 +yレケ=カヲミ*(Yモ聚ァニ<J|レAム +素嗽XBナ<#H6Xqh嗽゙>ヘ=$wム_ヘ<゙L=}w昵j趁ヒ ・|「p打O}エレ羯 ォイマゥ6Q゚n|3マセケ4&槁W2ieヤカx 締ンコ ヨャエ] ワwォ-%6壥クCtUTカw6?゚ヲユ?@tア+p}3、O藍ゥVi>」ヤ籾D4Nゃ\ク矩,zソハ>sォ%Ftz,ァサM劼g/,&ztX0トメャKy}1$q。vs ノヨァ「'N囘/4ォпF6=」nV?&マ稻;ォィ`、hカ $ムp"lィ瘋ワヲッ!Y痴7\ョツ@衄マレ・イS:1wィUラYUnら・ー8テ5"ー|Q鮓愾<W +カ睿Fルsi,誨>~拵=朸A <, ホXgE⊃�梔vホヒGホp「ノナェ皷ヨム9o0d 層l ++D<雜g丱ア拈q0<IT7ォ3モ'�騒。因イヲサ鋲ル叮ァ*Ad=洒碧コdVV。u 孝ノ`fRヘ`d*O刎テ?<碚F[カ┯ CnXoカレz oM悳o/##2ョJUA.楜マラ^羚�キ0@ノアク"ュ47 「イカ苜<0゙!*TD,@CヒiEコ<ソI ト98汨1r> 5G繹チラィt寐ゥィ4き <、YGBEr0P甦e棉ーhヌ@i\滝レQ癪ア*疏�`キ隼ゥTZユQーMー8ヤHノh弸b裾√ YHf亘磽c%エOL 蛛ォO@2ネ.qヘ幡E1Q+)ョ4ミ8fZ「鰾Q諸Rキウ�~チ辱ォCキ苒Eミt蛟 h沸trケu、フ 鱆%糊K}Udル7!イV -0綢 E$7i)!\0<チ洽"ワュ◯ヲタ!恫ナU<址/ハマ.b\\Q/bDョ,j1ナイ肥1^ハ迅Sテ、%ヒ= PML蔬r +リ- 87WG系ajィ8サq1хワツ� X!キ0p(アev 」#Aァ5 クス滝ヤ5'xjヲラ0`jlJv p萩ル5c竦タル5 メニT&ラ0゙蔟措預a歃テ?ーd/チワネ5 T*i952P鰓斌xy゚陥./サM」・kク扠<dケツ.h$チ'キp頑7チレNn゚[`ョコヤB;鎚寃籀ヨ怜トsぽ楊ッヨ捕G?;ケロム鐃hM`罌Fまツ褊yOレサa0%K陀nz ヌ犹イ」]ツ琢蹄% 'h1K8ツN@`ス#*ハ24ゥ\ツネ&dィ鈴% %<$�モ%Lル禍ワg用0R h*]ツヒcミK8R<AdL.a$ウ カ]ツ遷:ラ/aハ[」ォsz#ル健&子z#ヌ怒7ス尉テヤoaJノ!ス_退%リ兼k味ルsbgア{モ!8怒ノタニ2勿テ-ンaJョ。ケア{オヨ)dGaワ4Yウ{vFヤ{ケgTォムaリヌ rrcル屏0調P;テョ砒uヤkリL76!鮫ネ!<碣g!錫gLTCヨ焔f#斈、瀑アテQワヒ13D堺3%ハ切ェf8゙e*カェ?」/ョ帋#Kf88pJ蛋*3テ。G#Vミフp +衙フph暈 gf8lノff8 +コだ吼!jM3セノ bc(彗b クッ;1テムsエィjCラh髢[レ碚シOヘvーh;XiフハTEキ┿)ョiムmm コyb [jイレ3 $チwー`鶏Eニハク スAク壻>\ィ瞻tAョgャ」D↑>フ$fu}V#g,=W,オE6:ユgQ-喘g,jQ譯魑n艝jヲホ「、-。-港I孛ネミ#|ヲヘツ@Q・ヲヘイァ∽GN 抵gレ,^"~gレ,5A゚ヤY酣=Sgaノ'AUgQ2M%L前ェ:;yLス、謎'フ`,JE$L擂*"UpH戲ユ・荅魑(テ畉ヒ}槙@。「)エTッ\tモgQ雀ウ甬衍"S∽&ムgQ#穀・c, +xxャ雉>村ウエ頚.A|#z捍i」繼テ&v� ナsB楓ミ!ab繖鯤衽Qユ"ケセニNャ$フQワ弯瀬ユミs竿ヘルsCタ1ツо缶Pえrt\罪,エe8I ン�ンT?囀ツsつマFチ鵜)$丘~p堅_ツ器(咳R輿c軛ヤp0 セス]dCツ艦uョQS~矧箍ヲ停ホGー["ユBNッ」aGルワc%P@$ハ釿笥、TS %/jj鍠$6ホS5 �ツ巒3jW・n>," ウ%iZィ2、+経2$燕Tg{d{ "TDサシYルe弃閨。舘6。をjレロl[ャCRJホSI彫�/ミ豎gR`.・_0 ホ$マtヲ並恥カァsAFAb箪O裝Uヤ|-#2ー(或O嚊ホゥヌゥラ5_チマ@Fェ:疎刈O"&2R-[寺�9kdvきZ]タ8ヘ5n�喝ナウδH"タタユ擦D[匚@胥0瓧瞎UG @ィKJцTu」ヘ 風tsPe禿e 3ョャ?ヲ2c6ク「ィTーA\ミリァ概*@ト +ケ。4タユイ碾ンいフタ_3烟5^ヒ8XTチQ!YノF ワ酲R」�;�#(タ ワ吼.P;隠kZ ・dcR/z +み5ーィ5チq銘S<~Cモ]フ 辰餔メ5ー{ケ.#傑A*リ壁ハ +稜ェpィネ@拭ィキjー艢%O }。メ7+g祺[)+エ`L(ョ]hCa1Qc\7~&](;#,kJ・鳳ャ +タWョ2x゚ウ@ヌep濺 チセ祟「�ノ&U。腴、6b溽pト「. +$ー瀘VリーナhjB8チI8セ1蚊ス劇xfリxzheレィゥ i?Ctg。;d8レlヤ},Uニメ-eA」Zソ`0トイYマ盡ナ嚶ミヅl&"籤i鑞オニケp詬RツハZ'?且メ0YナL曚らツユZヲ�鐐\ワ;j`惴ヌ`蛻モmヤ懦V7Jpンユ$u2 増マ&蓍'┣ェチ畳 チ<Bム牌リ`i\ェル。、~ミl%ロ\S?濾シエ 0gネコュセ釆/�レMvp)タx'Sヒ功xJIヅ、<ハ獣レ6>クHEァ>ツ 1セ。|詣「・燬S狗*BS1蚊ハョ ゙z鉢n$PcAEサ 6d転$<オQdsサpT堺2ス寮エ#ヘN.ッ@触イhsJ論9a. ャ%2Bクサ^ィB怒12y<QoN録FUy�fコ茎a"{CJ恚ネヲタ旃E67ツXA刪3F5アq5&QL8ヤケEy.ー柳逅H{Fe1╂g&イナツ皹]エkeBヤ0モ31'倖a&-ユNメテ(C&ハY]ナ揺6TネoHオ貉0 u ォ&4S1jナ兪江GキヤL�*譏5擡 0 テS辭>`ェワlPチ奕LヘC 8「ヲ告 @モXpxノb<モlpx黜DホDD剪トJタTキD),ムクィ8Z?H'蹉ツ鎰u」R�tッォ絵オー扨 ┫OrミL]マゥZ伽丈UユL曾ィ3<エ0*Kホャクゥサ?KIユbm`リX宵、稲猝ク`~澪W`Hi^。棟キア猝$コj禀cヌメgリI延/エ 鎌?゙ト^'沙&6窖タ!ェフソJ噫0s0p[・ム8azだ�_.<>リx= マク-ネTyr弸ケ+{^92EHmLn+Iツlfサ菠1~:jッeレ0: +rォl緋cE・5 +卒ヒリリシ癪^r糶fチk徨h}ュr6D=vコヲEェ{uO+セオスレ> Fo{ュンL\ヌd・Xァj&]J剌urェR|怎ミPfn,゚ー3「 Gテ・ニ┐ラ萪ア#LHi5、キ[4:G�フ�Y渓エE >現Vホナク片8G%|3ャ ャエj`r=\ホ6繻ク(ih1ェマゥ3Z杏ネ網 シ?:モヲHケ`弦#フ`#>棧 顏MスO +逑++`キ]俟oッ, ~CZTチel B +」v_・t莨セR粗E&サz ュTソh78霙nqHcョカ7 +ヒ "L朶yIタ-ラ)ph:0pkqRノプtァィTU1j做ベ倦メ繕@B%<匪マ)rb哭F~jBフSム {σOUR`ニEチ)P1ARq宋&ユ唸 ウ2ノス&x�74嵩ワ%!傳 W'.゙、-ヌ慂ナ≫」q゚dg|ワc硫A浪(クG鞍タ6iGJ愽」チi*S"x#%Bk(Y`?M瓠aモコ)%Aンヲシ q含ンGニi≠Йゥ"DルTZN%UA「疑オfコル!メ剋F罠ァコ槭ネQ婁L韮rァp「<bAr・ミAQ0ゥ(〔T2- ~*ォリヲM/]衍uIcW{チ ハjッhヌ`$チィMae橙シDムニl茫\ォ fG*ル(J;ケ)GR府*ス迭O##�゙tタン5C]i墸ンラ'UxL|b咫=ユ逸碑>zfツー侍9トワb4 &[NM+切^z3J}M茄)5辞Ih>> ーyーO。覺ェニェ>jミヒ」ッ2ェ〓/キムlG亊mカqフ&gKvカヘセ7ンゥfエlヲBロfR悃 3=2、2ウbホ」Y;ミ哘ヤカNg釶ォハ&フk愼Lオ3残&]絖f5e趁)3+イBウ4ソ4偶険ェ瞽リッルカ孔 |ニハヘTョ゚ャRPォサ]GSシ]2fトキヒ +�ア。゚ョ,sリオf.ルgョサ&ヘミッRRフョ\fリユlサセサァdzヘwェ訥1唾|13ムツ|6*Uソホ2e*ホLィ"ィ+ノ$#u8ヘ(Kuハ\W&嫌橘&エ+Lサ.ッ{ユヲbbwセ8i:8ヘ7LサソッpX$[ホ瑁]TAケ{ U偃槎歌ン*嗹ァァ奇揄襪5uタャヲ2?vェY俚ヨsェ瓦燎"モトェt_イ*Eン<U楴gZ,^f^卆f゙pSコヌ\UソY洙9U%サ与ユヘヘ洙・ンッ麑 PキGLU皖ノ筥2S/韭Qオ壓-ヘナT撒(・ョヲ#Yァ1ワURBラMA0脇�"SYpEQyU52(W5FイC;uア-#「0 U薺紮$Yハ@P紙cェァTz[jt鱇T耄鬯ojトア!ィュ\ゥ6Rオ ルPサ閃レヤシヤ躔ヘP}ユTユラijメゥヲッセ詼[.チ7wィ擶�F蝟nロ<猟ン(h驩e2廁カ2猷Aヤ/8ャR$ レ櫃ン姦チヲ6% Tウレ洵,qカs0o*wtヘスッl濕蚣SャD%+;墨 0v.釀タPL 「秧o.H諄禝ヤーSd絞メPァネOEソaj 耽gチテ6」bヨ8リtUュトモセ[SKc<ンm副p$My$RLオモ衙s 3京@ネト四簒 メyZr悖鱗。ヌオIユョ觀0退2ヘ)C黨ウ轉キ-峻ヌVo=毎 5rF?E#h\ 査f0ェヌy)9宕箸<擺#"織cヌ゙チリAレ8Jyuィ*髀iSKcワqE、hル蓍塰 M"ロィ、ツス ァ]L狩Tメキ�6�q麹R″ ムbトノ琳啅ネa&~ヲサト4、 ; I"n?@EvR +ェェ +ス_@$イo綜畦R莟&雑{@0.@^リy]FF{莟ュx30'掻在!>エ棗セgチウbム^rmゥネヨ壜゚�忸A炳AXCP即ムRラワチ}嚴0)6ヘ)^擯,9:YEゥXロ'ノ++MVJツnJカ(ェGカンヨ菓゙i嬶ャ縟Aム・ア闢JQマヌツsヨV卑'エ�VD + +アテシ;z?覽鰌`メ、 メ) ノZ<オTWbzO!&s^・ヲ透ェッ&黴伺キラE'+*チクニhorb拯 xレシチホ颶jメ"Lウッ[v数7eウシア1ロヨ壷',YマエYTホFiァラfテNクN1ほシテー7ヲbkdフgカ免、lヘ刻ルセーNフ杖Eンgヒシs夘椣蓍o;ヲン~An励DホR漓Cマ{擧狐ワ,eワワ,eワワzハ4マヘRニ-マヘRニ-マヘRニgyn2nyn2>ヘsウ繋ヘs[チRツ,マヘニ-マヘニ-マヘニgノn0nノn0nケn1>ヒu繻qKtウ繋Kaウ佼Yヲ嫺薫朶d>Muウ佼Yェ嫺啓ェ嫺啓ェ嫺狐Rン,eシァコiハxOuモ懴Yェ屹啓ェ屶啓ェ屶狐Rン,eワRン4e\3ンhイト権藺 カ%V5';ワZ\wWヤzN&W6ト +z#\)Njリ暴Sヤ忝tリ&j ィケkj0・aツ jVΩ ィ *CPs」ト9レヲCナ/2li]:毀Bm尻堆ヤ +。F4")オホ ヤカnケs勹モ。豢エクaィ)゚T5 クロ;*セ悖ィ。ェーヨPヤ ヌヤ:ナQCLィO~yス オトラ2"スA-ィオヘモ.ネLrDM!フイ レvhF;移~ユラ Bュ� ミリーニ.BィスS�5<保釵*蓆ェノンLoンメ痲ヲ<ゥオ)O鸛Rハ Ljニ Lハx窒IK0ゥC20)cH&・ ゥcIM秩I)C20)cH&5cH&eゥテI G麌RS車ム、#u4)薊Mjハ:囈r、&・ァテIM9Rヌ迭車、#u@ゥ)G黴Rハ:、排、=-9メ= +qdbHyらエ'蜊!5ニ2ヌ唐T"hN%,5 hR9ニトhOム、」クロ%E8Pト佐_築キH*9薈。ハpワナ劇チ>Cモ10示」`MGチ輊: +ヲ゚テ$ルタt,Vp +ヲ」PLG。;撮鰕チtJソ(梅モQ(9撮駢0拮 +ヲ」Ps0メ`: +・?I Lヌ Lヌ Mヌgh:・oh:・oh:ウu\距シK.|リe 揀ユ04 +H?Gメ@{タ%柏約奚メ'T、kサoO`P!鰤キヤツ[Cメルリ7メy討>>jYpjツtG-pD2フ*VネL忸、スラ-万リア泛tネWIヲ 0ヨーj20q4猟qネ1(!浮zノヨ吮$a{ィAW「跋$qミ 意dサ檬鶻;=ウ孚猖cYゥ-!2組_$ハz、+赦石テe隷ク0FH;Q効<晋(�゚讚5Uhgレ. +畷F腰ヌセDIアSソ9$BFェ羝p姫梅&ヌンタ]Τ役dュャ」ク`&B鏗ミa麝タK)6cR8暖6F.pd3K)S]#oRホTOf撚7尚ク=fサツ坿ン3「2冦Dスmリル(mcロlリ豺d2アz罵iモ%Z:彬Tゞu^y「ャェタ'jサ +┗曝M(オ晦 5腐p2タ シ rヒで。YPJカkロi紡Rセ緯X +[(Sィ s0隋O�幡$r墸苴則<GヲxsL★崗X瘁S$」゚p莽ウ蝓7瞹S$o;ュA2ハ~タof$タ6D・$。pdシgヘ誼 筋B涎'-Hr)"ウH冉。S ^{;&A゚ナs`Cネラ F七[^ヘ7(セU 7ュ11津ユ暫螽 ,坩物 +ォ^ヌG\ ワ黏2^qJデq゚状メケ~zW聟K8f蒔6,^ニ+ g} I虱CdmP3yg賜ヌHX゙、ハ#Aマs1p$サSク#'V1如・Pョ)ネ艶汳�b6}殼:,ユH謬ユケ潰Y逸造タ4% |コjッg'-tjネ:/t」、+ノ遑pbェエ=DーナR<チ「j_<g剄\7埓允V@ub-.Wタ 4fァ'0・G里Pァ イネPdt I +й�ANキL*ン&H<歩ルGォS>m�メメ%゙�ウァョZホ貴(_・P 4>6ミ +R ロzサヒ +%]zア/J t8翳aャ錣j +ヲgNト」コヲ#3ミmBケ_(O7。峡、」ロl`%r2+q沫G[荘Q89H)dE/ー>嘆)イヒ~BAy$、\慳ゥj"赱NノoMハヘヘ。「Zヂ苜W%+\[メリ族ミ戊 Z、掃s ツ9,砕攝p$抔枸'`ホー7全ハ3チ}F糟判。hr戰8ァェ讖オラXッ・、O「0zロ <;H、,;)0LTセム lpc僞NZョ18ィ'q`ハヨ.q5K$訝z鍠`$シ鎗ユ7「,BB V,-@/ト(タユヘフミ又リOキ9用1「÷蛟Hコ?<4ネ + +≦Zヲ%マルトカ&`右5ィクj3'eHヨ?IY6A%ヨホ*3ネ"ャシf%@昧d森bョ・P=付Gt゚(D?I枚ェd07穀・(H]ソ酢yR・ミ貿@F:C$ヤW暴ツ セZ:ソ)jュ ゚WトE‥Aニ墳vd゚「フ。`R +!Jリ7ア緤 c蜑・7ルタニノ2M瘧\フユトerマ5!ヤecェケ滝k�'ネf6F゚ウwノ匪ハ gJHa]「ホU;asタR麟%「&qzfTI^气哂Bエ-」フセiTク+e[#エ九ヤj´/Jxム)-nワフ洪エhウlv]%溷カ坏&漫lユcdkィm姑3ケ >CヲR祓8sカgk笨Gロレタシ1モ/`;;#」苹レQr8、@ハisネメ」ーール。D0ムvvネ=艀就ナヲL�xi@N7^−ァ0&0 ┥タt(ーョホ姨Uq掣、nLsオR沐BB f ル3椢%硝Xoムフe衾タz上怫WPNTィ鮃Aサx^o 哦、jユn$�RY ス訊)k$hケャ(u賑流 +,ワz#ッ呑アmヌ!T7ケAス團g7ュwスWカQf7サQM�@ウt嚮T1 gイ\j9Zケrト +ハT|1ェ9@ #ャm箭Lyメ3陀ノAキ 1ュ&~!uTb|サ疲」ヤZ2iI垓j&!診z&4~蜂真ツ-コ秤桂曵」コヤ +!竿ュr-シR廡>Gチ]Pン リ/bエソi&nォ4」B9 +;!uア゙iB價(.M梱甚O醇�サ'ィL �ERカュゥ暗Hユ +rs%」B6セ・*0。ェxdH "X讙R腺ャヲQ!ロャq!'DD-+仲ュハ[QpwUニD掴L エXS!逍ェ宙R!h湊ツ ク*ヒ録 +沓ZRU]チXクフ飭クエZC/;板]護Jク@チAノテ�「.リナD�!エ肇)W'0 bs、惆ABワaナ'.J.ホ窕_。qNヒZ=シR・噴ニ=m@ェ沼2ヒィo「#Qナ 恰旌キソ盾Fe-�r A掀「c退:モ65ンヨ蕾 ミク*エQト鯊)gロMヲ笠9Eン9D痍p(拇*ニュ+A奏X禊ル,タホ�T�シLカ枋臀ゥセcDロ#`舘ラt�ツチ茗サ Yミス&イロミx @幹e@<jコソ碯c + +W撞C Y-ヌ iオ-?潯P芟Fヤノ6 dツhuト歯・vロg<果5蘊iS-|8險曰Jフ2(kサ父!ニ迅飛9ハ苡竹、ワ�QkァS6 T・sユカフGョフ祇px;G罵タニSチツォ�(」ァUォオサ�`ワ �(ネaソ[ー懐Mケ0當ホ怒 +}モロウH ンSr!n3%コヌ號ャョレ JCrRヨ]ルHオ娉[oc」慳ユHキ9ケル1 0。@マ酵.0JH*LL"sDd秒U6チヲf)M蝸Hぴ&穗ャs9ツ拒」「 sテ+lR侃煢 ァト7クoB( 亅"ハ"*リゥハ{zワトlKフロ腱$_gァ"写k&鼎 q_dスPyアア、J吋ロカ<テ嚏ヤ !」竿 メ餠癨$p3ェM皹&`3ト�ミ鉅%ヤ9キ J"ヘ縢矧ト +・M蒔r・P3U"p5{Eエ タ ・鶉l? 賎ナ8ャ層「ェ2威%`レBtル共Z困垓ヘP鑞迭Tケツ恷#「DC3」飄4<萇6�U茯eワンヲQ;,芋*z!・瓔 セモ-3ノヒェa#ラ,4UD)|Gヲォ"'ソ[ラuZ!「ヨゥH隍えモcD:ト甑壕^ォ[o黐@ッェ祖H襖X5wネ━~)"ネナn@/et +「qwホlヨ ウ; ー8`1フ>a 粢6;FNmス-」フセiT巓Wzユ3・Xk\ィAヌヲK>YUP毳オ!R[モ|%ユ&ユW\V}Wィ}kセyヤヨ7叭ハ>T巓|ソェヘオル輙ov@ブg酳Lzメヤp8=綱]gV 迅ャヘN9;fマ4&a6O#f捍5。O2+ォア-ウニホ婪m啼ラク、Y'ャヤトニoヘ僕,ルlホ3ホmカi胥fソカタワvSMFQサケン<_飴霊Rジafェ渤tfメキミフホTタnU/Bソηムミoi%フ.s%レ擶~.ィc.?ィ洟ヒ鵺YA刮,擡「匙oコ」~椹丶戌玄ネeセ・冑ヲ>ィ.チゥ洙Kyマ哮鶻」ニLイ4レLW ェ謐ツャ8f"ッL26淤ホンO8アヘ拮「クケMZ7ラ膈ィ7ヲノ趺Tタ悖3ツ惡「h麓ユ4セホメ喊」蚕モ|プ;S昔/lj輩散ム2L3?エ)m讚6スホ|レ3ッ?':「ニM4Lラ4Wサゥ、ンッZkwロO票`3*チヤコ|TO&錆1ユヲ=&゚貧┏qHア衒嬌姐ゥN�*TニT怖、cォ�,1蕚Z,恁jS@f2テ〓c?pク葺'ィuェン6W3旡91オ網Tb゚Sμ魘Wjv髱W ャロ ユ意'Bヘ<}ツヲヨ>アj4イノ7ウ-メヤdki&ェゼjトZ鄲'wタッ�テ&pXロ:j舖n{gt-甲o・zロ樢クァミ +!ミ「ンノル壌製2'ヘキj 8 +メXKネワ Tナ@?ィ゙ャレ/{ョス杣縅Kャ" 共゚vZ狗HィN Tンケォ@ゥェラ(!祖ナc宝{KF撰搖jテT┷FDBF8ネ頂タLoシュアU鷂Q椏セヲFxコロ ォv@6(hハレ$2レスャ,j=蕚+gzD<Gx覊D +ヌミテウB餃ホg95#ャナセ5?ヨ!。 [ラシネ!マハ蛹X1田Hユ 蹲(匈にc| {Cサ|tツw蝉レ.シoヌ娚Z)ヌ聲 続極s6kka|;>ーーQSャ髞@冗;・Bヌ蠑5ツ)42;2躪k"ャr$ф冪M8テメ隲ヲEqj!ツA依ツ鳴C□qォム&、。ァ"ル+03橋猜虔ノホoF*ィイニ~pオ8ツ昴 DゥX *[カシ*:印ヲ"d、;6叫ク?酘$モロrU?f八ヤレ3@=Sヲ摧ヌア. & +)ーゥ"t!f楝ンgモ3i2ヨ& 茖T ~a!ムリrv'Stィツl� 喚cC=1>ア]H・P E マY[H&XH&dィq%ヨ7Fョホン,ヒF9UmlP><dセ`ャーモレャ吊Uフ{7`x$逵ュ0ゥ)LWレ冢M]q2"ノル団]嗟腓jオEロb椅(ロH擂@ ロョTオ*iюn從゙胎7 iラィY鋏Dホi'ラ&テNキM碗ルトキー0暫K、携カ槌柎チ鴻ル棆>フ子Dロcヒ\s損椣蒹o, +ヨ~AId惶Lムl +カVハっ*ノU2癩チユGAA>槃Bi� サ�」ヲルタLヌS<y~{ツ-鵠ル%b@ 4ノレテE[縻`$)Q虻ネ4#≠ソモaBッヒフS嵯ツクヲ&[Q +N-黨zゥラ<B*^闥莽!テアN)).+uTテ_ス0K8ミ7f{:a 轣ス慧9Et・゙アヒ席ケ#]$_ヌ4!・ jb)Bu彷。59l~ハx\v伎*k;ツ#d +ヲサ&47#ワ&EJ#b宏ハーq7xe�@9ゥテSm:"tタV殖,r臆ゥネq*儁#{レ、ト"*$!ンui&+L>jワyd茹n;イ +ァl寉"ァチ」3lシa�{頴ウ ル~B\僕ア-勣k゚鱗ン^破;Iy6ニ輻猴ミミ卷 R兄Z匸ハt'忝マqeG!&7ツ・0矣・%}FBM\ 艨qybユワ ッ`P%タ`?r&hqN{)トtエ3拔襤Iチ$リサ9{・ネO�?^b2|FTテ*擦慙ヒ=%5i-$ラ%)ア 8aR&゚]\」スCSラnやE8Z゚ + 藹ネ_メホチ}径Ey�a!悵ノタ:$ーラQ撞鱚(奨ュ)qァS班エ社2 癘Rツ6焼bR韓ヘ。ネ鵲音~"#�ヤ8輩ホ/┬62;7nN微^ィJ\d*2..Gd�ミ?ヘ r汚Eヲチc籏ck <9」;哩夸n豐サXミjC9聹IUス_視ロョ恥fC+ヨァ>q酔,ケ。ル嶇i(脱ks礁qr王・ゥr\皚コキ哭ー恋M憶Qw后KンGP+]ヲ6フv逖0y:橿程)$橄S["tjyイ"<w1@M、|オ紬cコ)zKコy訐=fウmh攅:、j ロ6_|L釁ホ堆?kコFKgRe晃n]__4ョウ_權゙槹\=ル'ソ:{vvr{jニ:レニ+レコワb箇F賈/nッ蔬ウ'「ホ,`Ooョソ蓍ムi?k<rル_゙怡q~蜩」狗ィd識l7迯M撞マ>ソスォロソケ~蕈ノOnョッ|G逞ュマホマ?マホセZウロソコ] 毳zサミ d9)セv鳫2羆カヌ9ノoセzv&ン^ル0Fヒウ嶮vcaセイusIJ尨ッ_滾wv瘴セ睹ツ_=&{ツO>セセ袁ユmロL韲ウ6!?} /ンシxケカ粧セワ誉暾ヂーaセワ{アァキiォヒカ、太ワ埴?゚g|リ'オwP*%8゚.酥U`\Nノ・"ョ�vャc摂 .Sォヌォ[<゙サ「Nbt�d03P眺ゥJh +ェ6ヲ櫞ア&�APvクモ[>。f因」アP梢H掟<'A(2・ソ鵈Btツァ半)ネー2[l}5ケ7イQ習゚dツ'QE/7腔アW牲劫/「メ)U 鬱ツ7vソヤルtキ{z@^!乾Mieセ:/ネ横昇ITMョ K#ヌォロ鵬」kl;p皀エuD6!5蓚G塁桴^ン椰]:鵝ク・1Nネ endstream endobj 69 0 obj <</Length 65536>>stream +ウ1「j苅wャJWノKd陞MLkdマh鮫ョGワネ首xカホ �/G'マz路"&JDe*zj爲=^ツ。ノyLTZ琅~ー}?rク8僕L、"゚)*オホDェ*レ' i痕、ニマ石 W倒 B衢u<・Wーrモ典pケヲ鯔D&Mх扶メ升b鍬a誅 界フ;釘hL?。7羽ムgシ458マD +:」間ヤΘ'iタ%ト�pos"ケ・q!」;潸~ソエレd{・T岳\ヨR覽FSク< {懇サHkトD活,~"%Y逅!#Aヲトh&Rh#F."OヨBO^OンF#シ作ケク粁w獏zョ ウク[Hヘユ訌t」4�#モ艪t�eb,~祿=~サ +竣ヲマ゚菅羽宇ツ以h"E.#2ユ聡瑳2ヒD淹Ul潮巨9Oヨヨz欽(サ 」瀏フ!m#ヌAタフテ"ツツ(ケ、FマEィAフl. &誌h縵C,イ=c[ヌ鳥ツノ;^ヘタaーge册a],'eE�ュ怡シ%>ヒkO(D挽ォコ%R蘰ヲ:ツ匸喰,」rっeH\ンh;H=H<ノ~`ス:屎L2ャgオハN釀enツ凋 *(D_カrN蜥トハ=クヤ[Oカu:Yフニ0%k秘Bオzァ|09ハe>陋ニ<3$f"ワpW捐曙、?ユ拶ハ綟ョ1ノq喉菓+ヘ"WFナルF +゚$|Xス!雀Z 3ゥス゚カ{錨&Tマ$舫8筒ンマ%<uォ。JiRイトR* +スuシヤホロ楓」 b'7ヲヤ突イ8蚫ッVP蒄耻-魁�壞筴&臺テ1rャォノモ.キュカォg臺Hah」Kmォタ,\ 攝gュ Gy5yム蠍螢クウ雀~tB楔謝nメJ」ヒmG。フケームN楔NイヌG'葮G瑠Vノ<咆<閼<k}謂+ノモ.キ=領ノKヤワ挌|ヌ>$� E& i オ%エアRクサォhロc(ヤ $イPz_!0亜L$.R酔繍ヤ8DCチヌ艾;亜庚T*狸#l憐メラ床_ナ 」!-*dX城 +ゥ庸q、、ェフOG ッn苻[)}1ネュ#ェ7SメBU、>テ ゚ノ1ヌテ -Sメ琢」p2ラ~,ヨスTr蘓唱D!S9!ラ<迥マメrmP++モ。ハ臠 畤 +ル�M( タ盂IE\刹ィ3r糂9ャ+qT"!蜜 S搶ィo#bU浦゚_Aレシ甃Yケ沢tqX-E +ショ_sェnUD鏥:Q邀-揚rツ:r鉱(搓幤セハウネコ庸}窃zGaULn佞&ツヨf~2害\ルッ#p「0K:I0Q_ +9PネTs藕ノ9ハ)sM文I c ヒケヤn_ +VD=ゥ%扈>鍜蔓エm゚x醒e%ネ&!Zァネ^O6Eウ.テー エミア゙綯ニヤマF「Wホ61 +\uソ讙]Kc囿航真桝mB6。^獻=82罨゙?噺)�璢ハ'JiノJnU痾譁ス脉 肌クkレ<9績y]S`m(9衒后L2ヘ"トd_ 錫ケAN|;ウチチイpOJカ吋ヤニハ寿/|P{乎ノ圓Dネア>]ォ嬪f!Fmツ!アs釦)゙S7Q豹{ホヨm淪|zF]hCケN當タ|♀2ユ1X%廰*ェッnCG0ュ>ッ6u"ェヌナ衒サf?,qTD`I&bネ4P臙ヌ%做ル&マK/ンッハン牀鶉ーヤ、U理rハ6オ+ォR'Ms)スイミ\ェBオク題コgu゚Rt粕ヒ 匈・ルnヤ?]モW憖ッuH"Z@FメマQァ#iタ・「 ヤ。レ;ラッ惓路ァトWvャク詮チb゚ッ`筏内ヌトv、秤#珊0>3蔵7ムZムA セヤ・Fユ凰r|マE恤 P)タ~ノィiヤッ +}6J/hマXォレ掬Lk。レオト。a Rィケ[c壁ノリI鯔2(ォ 2eィ)Uaセーワ携ォJキTWbUNmホF7(抬] レ3ハhSニゥササ=F揄4TYOェモ!OY1$=HK;kW」ワruェ鈑餽・I{シコ対J-イレC(ルx^"{ンンカヨ包~&詼LA8k竒サa政ィL0詳[BXU~欄&レ{y6ル% |eュユ6,0ct\Ο佃貪糴R'慣gMヨSQH冢儉ョcレ_ル餾%|-m"gYO= ^Dr゙レ゚8*q2�ツ」=%/?Yエbrzロヒ 晝#'藉"鳶cャNモTu"CU凾.!レクぁワ禾G4�"K徼vCスc0ホK/ソb P+゚/トjI\z!ヨa納ェzY`r,IソP LEd>陏ヲ/U从Uク#� W5ユH\ル#幵v]hテP士ンョテ「ロエル C,カws,J }ハ囗ヲCΜュD督k?ワル5gコ3Yネ碇Pヤヘミリゲ」&輻hjOyヘアLF&/採Mヤウ>トレ。CネBy v,Gム1」x7+ョ安f=「"゚ヤ毒 /Daノ琅YLモj.z8ヨニ腸ャ1」゙廈「wヲシ5織゚ ヲ",?f +ラマ:Fイ]「」スO1n装&誅h41オE莢モンG針ミ4�ィテ 鴨詰.ゥb"笘ヌホヨ濆ノ(ンHd=Uラ/L$トヒ斌ォ起盥:鋩ニ・瀬wツ4c}コ&サ紋コXv檗UDL付 Y6ル邇kヲ 1貭hトe&M・i$゚サ5トアアク朝!#/2ku燧せタUM I,.ナQdォカ2&シ(r*i11:籾Fラ8jラrタ`スャ66?固l.U=服ォ裟N@。xリ5゙ュニ/担オ躑\゙:;:XU7 ェK性=Xk淞\ュルnキ[派ェツ澤cfo糊:俣ア:T[ッbI-スサn拗CュゥZ「Ψ1M襴[5QィN肢ヌカシ9]沽&J鯡 髭槝」W=Z,スン埜ラ檸ェSXア*ヒ jヨ疥。*幹レロ+マト#rJGァョ隘ゥルげLL9B、ィヨ砌ホ@>hラウF袁貂捕 2汝Zニj rテDmc「jア RPRbエ3堽`ケヲォ>ォ<「[ョレ熬個v]礇)ヨ詫h」^J厠M0kaHMO$ラタ・叮5Kォ�サイ攴hf'、3岱仍ノ, S;陛N5ヨホョZ2、6=D虻<ケタ構<] =) +-rGト Yフ4o柴Yム演3ェG裹)�「キxgN、VッnD.5 +f6x゚ヤ猶PBXネ!fケ 「xu#ヤz6吏F'サr蒙K實アイ駄L$!wナPクシハv丈λ源eK%及c& 2セ襍sn[ユョ|yッムフ; .D.讓、ヤ9&vナ1-/&淘}、誉「fN菁ト熱揩ウイ_メa:妣xF<ワ・椎ニルヨハトT6字氷T0逆TアDN$abケ MmL オウリム゙焦KキナPサud\#S揺ロ3A7娑ノ ァx,腆ト椴 ヘワDル�羅ッjW> 祁vJ,チFホb+, 90^#訴,ツプ+\ルャ|ム歉S祖PO9a01jミ$鐫&僕ゞn嗾怩>ロ,?ョ鵞?w8貶。sレUgハe「ネタ2ョz「暄裕ー#mラLェ&Hー\ユ47q2セrネヲクF>I 5ナ)ムラチトV>握|ol1キf W潴gス獲 ヨ8ハヌ慂尭Aハ!ネリ(ソトGァwゥ8-エ!@,Р 8F%間ZBGネツィ + 靖Q'aケメ3`HE5Qf・図Q輜走ゥiW`ェョ�~$ ヲTーヲホ 佶9鼎mUト2ア゙0u!02ゥh脾オィP`緇ムハ&rEーェ*|TRノbォsA:%$?}ツB:Nサ」袖FアW笵「1貭nヲ慳アナ> kヲスTrqaBV「ハェカ)サZGレ@ーニjマハbFF5]ル#[.ネ愆ュ姓曚ヨ褞ホX飮s鳥ナョ倶ヘィ5ー:6M=m.|セヒYHSシk跡чモvホ0eェ。エロ%ォP@�コ5*モ }V蛯1pツrzラニ8」v-vvNO(覯Stッ浹wyヨ&H#.ミェヒッ?ナE廻ハ8ィ肝ハネF:ュク球ナ_ +9H戌フI@tャ%/ィDJ ej[敬bB+Z賚ケイ*%.7HOgyHJfv「lv澣 Y黄jpi笙ノ ンャュf銑(冓ンレ瓏~4アeク角血ムア5痰Qu13k?XG゙ォmョルカs霽ス{ス6Ijヤロ$:ェゥ桿ヒ! 9{゙F#c0ア観、旱Q絵ォソ"jハ' 刔q「茗vスX鯢B.タ~セn。dq/マdD +g"'63ルKーシ[,s#lX{ケw,:Rメ�ヤ盃・Gッヤ(9ュ +滴Mカ3ェンJD」, ^ヘ鎬ハヤウイ$鷯豐#レ+伐チ掌ン]!Z#`9イb冶ォ|リヌヘ00ヤ-->ツ+Q沐コ~LV/ウキ綛ネ硲%'9 }LW.dX致K スン .蜻テッ(A 4ADカ [處3ワ�フ'コーo遵ェ$韈$-、{戀0Hbr$Αノ」リFP2kJTMトi�ュ:]ネ0V耀゙餬pQ>F貮Dオ櫟蒲@メム E U延ニDu:6、h、錺モ孰jワd>%D刔ツ8&ヲ悧キ」g。ー齏鼇B8 ゚)|d +踉ォη。,/n蛤Pミ杉F#ケ769。#P%'ロク +k&#cヘIマ=$ヌ駒 +~" eゥD。ュ&Fホヘメハhワトイ゚hカフ躇ヵMフ1ェャ&"ヌ「マRン`yヨホ`&ェヘ惇\眦 (゙ィシ穰ツ9爿鬢ヌモ終d#+/9浄、Fミ「Sシ゚A嚢ナ紮dW拝ムe"乾UE閠 +Yセ涅韵ムMIBイ钁菖фN%5ュ2y0ケ榮D,ヤサァv 選ヨェヲル^⇒ ル泣NァMqTc^oヒ 「ミ!ツ7iソ4l+」ゥ[.rイ收?[逐J4ユマ「莊r屬l$、1f{?メuウQo簗イッアe鱧’僭モシzY予搦4nN」60:Nォラ、H 粟イ(5+辛Ylフ餘7エ$スヲレb ェwW。フD&逵t5. モフTRVfE �箇輙Eト3o」ェdIa絖ア兪z們ヘ%宙^エ・トiム :サス`<,ツス3t7y28]$淀'アN{]ヒI「ス鵆ンG2�ウ0D+,zケPxッ<ェキTfテ8cヨy。彿@ヤfノ-zャ茲Dツ#1$W#G彳mラロタH(楷*邸dO}0ァ~fW暝ハマ慱F豆}@5ーフ P$カ拐ユ「jEモf「・~マ「41>ェナト<(駄1ィ(JM地斗 + 幺ラフK !eス!Zルz腆 萸穂オ゚e2Lヤ@ィDネvG「苻e佃~R0巻イナ5eニTU*脈V d' 9Y0Lスjc.ェ~EYgッモ)ユ数ナbDト嵩n/像Vufミ゚;1Vセ7蒔&{ェ乢+」ィ詰悶朷セ+賄櫁薛「ヲdナfイFプ。ルEK徽vムケjカイ゚コヲ裄ユg搭lPi/ルD代Z《@xX8ヌBN"%ml6カ畉<タ鐐0C- +Y勲YMルdニ崇マDl劔h3耋!悩トW?aVh.。ZuツタbェウJL1In;5!」琶イ W劭:*キ、.盗c摯.D7イXヌチ!シF!{/'ゥ託ェ 絲征リ=I>鉾サ/}Qフ &D$歯ab酳ゥ臙暄vB)v翠MX9ャ(マ)ュ:襁U「昆垤' +惷j黨T.ツメQユ lm $'.{ソヒ>,Dカ<(Z!6^T`Q}Qハ[P隅zアアWウXjj6ッ湊カA5,V簷<x艱狼.ホ|ーケ佶Iル@ィォ*%セ1哨_ワ^タ族}゚E授エクiナァRフォロFサ『BTノ耕ォ鮹YgoDオm>]ンフ糾單+褄ヒネュzオラ拾U+(タIヘュ- Oウ/#0-4B,イy揄!ゥヌ6J|"燥「+6ネ=8メ「ヌYヘhユヲ !ZノォHL>&ヲ案リoRzノwv因lQケ)ヲナ]」邇�Eク@&藻ル?BD'QS冦0L,ン「m Ztq +q0叭3C@択ヤ蜩町オ/$「GSメPH失'「jv壮(ヤ ,メモx8ィG劵ォ #ー+ノEDt輝涅、)8瑕懍gルヒ雑d・粂9 ∃ェez%9,U&fトト廨スnユア3リ&ニ{_ウ$sアサS"ムW;芳搜-ゥPタ$。0ノLC融%ヨO(リPヘル.摯、ラョヨaャE2ル 享ルニ6P-w亀rA:@。|^ォニン)izカ。aユォ殊`2q闡JテニS・ウ>ev +構2rL3グミ2ノホ @cーLQ|e「EウEDヘヌゥ゙zNF ロヌニLg7t規RXC(豊Jリヌ:2ムホQ^OZ*フEアdQ痕-ー:キnミマiヲk・0!i Uホd邪}4hシ-yナ4Tナ^v プHvイャ03opォリ)hdM&{Tuk 貘捶澣) +\IUロ$@$X彗獄鮖*(ユc#ナYユ8 ~蚋H-ネ?M'縱4oア/$1ルWm + フa葬┐5ィ|里D(ィリFカセc!ヌャ9+穂d"Jpオ_ヲhレ塲ヤ・Xナ;IiノLFォテト*游Fhj= 兔桐(タ9ヨムj~Lア<zLmT(チ厖tヤsIェDノ[@^ナFv喊?J゙h8xスxエ07霎ユ財-トィYh狽゚w旁hdo叔ヒノ薤ソク>ォ。クTムvセK蝟U4ム樛オt<&%レKク+ kQK1俣Da扠祈 頡ワ群レb0梵m �ノ轄1俯z鰈猛9慈ィ5T鈍 樸.yソj&ナ;k夲リ}ャ茯,Л!|ンk゙榿紵KvbSラPャケ謗3S;カ2タbロロ3н9 !(垰1r摩l{(ヤj九8ケuモ[ヌJホMォ~,キyカk渋ホ6z"yム^ォ,ケmQッ籌!$カi@ +僕シ感Ht* YV$hィ1qワクh9絖ヤpLー*オウ6イニ9=!チ[コwF-G&ェ、膵~VY寥<ツれ甑。ク呷M蕾ウ8]F%ヨ!飩5ーA=*墸Mルェ_i墸8ェメヲaad。ィ「i|ッgaS6ユQス9フ。!レ:T 輊侍¬}ノー&zォTマ「fヒ>ィg祁R攀t vサ悗ユャ瘰。#bミ�6諞ッQィfェM゚メ+侠ホh、fJOaレ5フn \,マfKFV3eヨ嶷 bーTt「ヒ槍ェ$マ&;躄,VケvルlVッ稽ォnoク柬贓+D x・オゥu 巫ォ1ュ  av續 ロヤ澪ヒ/z-d"ャ 8カク5暎驩ィ*2ZU報FdW4ョ�Dリ igツムYjBハc7sv恤儘橄-オP捍T*ゥ複Nャ。hC>ロdfR5゙さ咬セ9ンノ」カ沖M F.^Aq俘VFチョ2サuUrT勸ェュナeエ$is4兎巛/[T0 &ヌlZZMクTM厳 #σ.ニマb",&W#,\.<省y \]9ハ%o, +d'zgクS"ヌ4;Iユ蝮チアe鍼マ<)ア シ|$n/ユセu下イ士=蓼Aヤト蕉{2:Z熹{K棊」コ<)オ〜r囀8aWz之LホДx*gヒ^!8d餠Q7室^サs喙3Fァョメカ椽\タ`5レl郤 ?ラ「キ9オuRャ゙オトユア.Aa表2ッ刄又「 ア9メう-漓羈ヂ@ケ)顧Y鑷LLユ @イAィ&BsラハbラI0ヒ(Uレメ」d/Hソ陲?r7h( 「ヒ!'Iソ赴ニ8N菅ュ屯-メ鋩ル1鰤2=ルSイI=2Tkw#Gm ,9雌9ネチ$澄ユ{.�Gミ4\-環ナANニq▲、L窄f 8Sコ9ォィ夜ェキ/jO}rホB畆Y%\スム]^ハPL'鬘ラ{正゙ェQ W。Z疫Bャ垉店ヤY]O Mセ=ソz|Bエタdマ凾Lゥネト$)モリハ"B4(ア iハHカ<_穽 yrルSt7')"」D2ネ*qEjL梭」Hョjoj;01dAD&n聾「':チ 頂「A.s「ヌab%9遼柾F~_%哨 +曵ツA「0ユ硲l箪u0ィワント54Egn H ャ?§,~T欖ノYSG"NK\會&飭jw$2瞥蜿 黨Dコ盲+@ス「1J┨6杷イヒ~4fイ*%9{ヨ4=N濁qz3s=ユ%pBy」クケ/q*ィ鞴ユツリ、*�セY`[ユ+REV』ッニWt「イ。x:#ヌツiサU"ーbイ3 �カ}レ┫^mユ2a'スFL藕ネ耙o=ホ4ケアlMtノ|58(_ム#濃eリ +「妬Su(ヤ1堽|UdS悛ャj弟, 0ェ嵐cカマノヘIq +>!サ:メhヘ抄Yッ{ヤヒ=B.ン竃� |ンNV鮫サT。 ウQ」fJィウFボWiB`ロuTオXツD田yコ耿レオa」"スト臼樊ヲ _ヲ納ェ票唯tU゚ct$~メxiヨタ覃搾bgー。アIB少U7FCエ!ロナア5D,p>・牒ォ&@q忱ゥ ィレ遯{0勢レ檮N +畜錬 "子ーM僻ワ 甕nヘワモG董尹IV&鬟ジハ軫"癖溢;埔ッy枦Xミ]"ムウ僣悦bMkホ膤0<凰8Uミ%亊」チ、hQWウXチウuー[孛mgヒノツ hCDウZトロキケGナB=#;熨jア,ツ3ハョォノelノ「N_bOオ0lA5ミワ9イフMX+9pjイY4pLアpュ' hニ[% +オシQxc梁'3d a-ェ0D1ァカ鱈┤h"マ思h5゚Uゥ枴"/ー沚ェ;9. :;Eモ +「cFテヤp甎榔Xa(}*ャQKミ(Fd澀KR'U弋pt'クNムク<癜ォWReZ%Dos嚊ホ<サBョ夊唸!_サエ藁%。敞ウケタF゚,/?k$@I東儿4r[ョタ lオ掀務ア寇2テ穡双-L<3"Dノモイん,ソエ鰆寶徂[Q7再ゥ 9 ォモRワ$ラLイ離ナホ匯ッッョMル@YKッ£\{`QP臧ヤ4スN#ラ干(M冫ヨ新ャホmコdfチ忠チiT"エo +Eハ9ッリfe*痕i(ユタヨ異R^リトトャ9.tル)ッR&R|R鉾ユ`W[`u^ク2サ$d +ョSホェ3^ル Z,e}Mラヘフ糸 uユ3.s2ゥr(ニXコAlns4"qQ+w8アハトアwJ\cヲz9レタ臟T�2/U-B励畏Iォno&嵶宛ォォ冩ケォナュ艦wサモシ酉u陰ッ,ナク亊ウェ暖gノワ=Qワタ`"Rf鴣XネYN-j JリnヤHq罩zl*6@B。8酵ェ怛レ ^沃ぬXpォf-蔓メト+Z"低ェヲ蜜7^粐瑣}Q0[」=Nモ簫h'tJ8桾q'^?ヲG?アシ)=6根、,P P*kDヤ�ミ,q e謎ナ2ム7iTァ$Mギツ備・ =ビ41艮@ +ヨ6ゥメ拯@B +T=・6WCR擱8%ナ既I哮S「ネUd4M#liシ+・霈カB4OオキャヨhワシICウUrセO剄ォ3ス<Xh-y 、ユAテ癆9P 檳・Z0 i吸ッr*?゚ぞロオュ ォ:!オ」ラ鐫'左二<9Aナ$憇,ヌノヨヲlZ杭又� +]メタh8Y疑フ」Z8)ワZウt5「慘・啅ロ0ェt8pHュWJK;rJzeI/Iチチョ#「キゥ!=ォIa深~Vスフ A_SP"ソ/(シク^Nマ謀jT。1`�ヘQ愛ゥ!/J「~節Fウタソ重I�:ネg1$XrD+(モ銅GコL袈i0娜アヒ t I�狎% タG-n覊?叶h>申Si0 <ツ{kタYトoウE8燕KfヘムU星Xァシキ^虎kIムrDFサVaC +ハゥイ門F|滬ム Iモw2%gZ2其iIZヲOj嗷IO幡チ`f睥A゚一Mヒ I臍BュニCテhァ7贅Hョ洶ィy#ア倥 Iシ#*)D訟2svッゼmM謠ナ菘「ネホモヤt繰B +ラA秡娵ア #Q搆1寞般 霽40ゥHマ3ASュ"dx喞65L葮槧!。>ー&;bンハ峪":O好コヌlAn8#」喇G縄ヘ{ィ ハ-ト*?`H福ウn ホIラP3ロcイ救彡ラヘ、4ユニ凶モD OvエTリ=ャU] 咫マ蚯ムLG・IXノ;逝ィク@鯛ン背 Pオb +c&旋>I@ba6ャgweェェWA1 +ョYu dム 「f壟ャー忖ME」ニ4オ1レ>$攻p枚.耳:ノナ!3+ョ、].> カル;暴 。*qナ04T凵イ&ホ妾 {)菻rp +齔ス^*8�チiMM!ル#i桶聟iケ +ハ,+6ソ(8E」z{2F画`w**ヲ杪 ノ。蔭ヲ塩h4峅-ト`。鎌Dイヤ4泉メネjP Rfh7/@Bエア0燕乎ミm」Fリヨ8ワ]走ャ蚪Q}~煽.彬1 Q 迚ィョ&Zn!&>I痛U]cQaゥタメエ鼈へヨlヒsim`JカネbnW喊dウェDル゙'|dム@跟LdチPFァ6R`t9ヤQサヤrォ段緜6ワKオェ|-"j eユシ.ラ_C +ウyモ栄ムz0チ4裏ーLDユロ慊QDmモッ蒭&ゥ>話Y@ォ&WJP、惜薺Ehコ}8\\*^ ワ$T~ヒL槙ェャウh)影ヤHリ8ェR]ニピラ ゥ_kンeォハSテ$p枌5梧$ネフ「h8ュツン/Di?ワ8Zチi|5LェH柊ウ"ユ碪ユXYマ1ク|ァT揄チイKrB、ュtネ^ンア。N璋c1Tチゥ ァ6Jセ罨~Vホ$}拌5到ァyNンw YR酊d勤騎4DfjH・愾エv +鋏I怨Kケ、トクシケvキ(イヲア衛.監仲ホス・0Yr1Y PLG蕉}oゥルoエh[-まEA-O bユ�~ハ*「ノ4GX5gLhツウュ8@メ莢擒タョ前悗bャu懿;u。阪�i{ン 6S」k$甼モc*"ツGShイウシLハ 莨K」茶マ98ヨ;時>h并坊3ラQヌ7ャ&ニヒdヒK稔ティy)セWHケwLQQ"ロケムィ'ヨ)#X12繪]ONラIス8瘧ナN d%吹耻崎BUテェPKヘセ5モmケQlチD,�ky{Qク掬e&ケェhq(lー轡rvャ佩ヌh栢`V\jJ。チ濾>・NA竰 +貞"。I1陂レmラモ|妹ッ箇ワmメ fチヤソオ6ハニ j#ゥCgィ罎pB痼S]チ曽オj+]】ス哨ョ餽Gマ` +7桔eヒ(%稱5服F.=xオVM2:D亂HJHンユコ}<GLフA*街勢澣{Iルシ袴恫゙抖病IC`'宥ミ隊Zヨ。EsヒXコF4鰔G、/{(ケ3),ヘ"Dテ甅U脣Tワユ=剞rE/\摶ヤゥン5゙ォxt衝rイ啼dm&Z斑・眺V[I[劣瘉Vフス、x殉k5サ[Gfルム「FW~K。ヌスチ;懸\sゥdIテ*悧qャdsW賜?シ駘(估MTエh轉ュヒTSp搓ノC6サuイR噛Rxuメx �t荀姙!ォ輦<)&ェヤ、。ヲ牧・ェ4ッカ巓養pエP[Vサ'黯#サYンWシwテBナRQ'6#スgGャ ワ侖J;xNF.行<mb%ア7pユセォ=Xセタ軽`サ$ュテ�ィィuニ簣@<ンMテ6?ルLKワ9*斑絳濾#ラ「鞦0ニ)xラmjレ隋aミtサ-獪u2ハkeト,rF~hンR諱辿pミリkq)CレI剞/陋テ/゙ォ'K' {゙HノR|~雨瀰F-p盗スH、時ホ隣 尖シQ;畑゚"7 賺zョE7oオg=眺キスユ魏p:;Y/ー慎N$,Rtmf'ュル^搨ャ{拮6gC桎y2= ァ1、・g}フn゙黻8軒=擽jZ+q鴬{ルfナキ<ヲtJt面RハH0P_wDnwx`rDQ 9ヒdヨ、fァK=エg┫゚」顕SRンb゙: エK ゙Aチ1)カ+ヰ影E@wニ<k「ツwfワzヨ�+スB6ルiラk +挿賂{LヲkイOハ念シルシ滕ヘCAセR咀d樢貸鵐.pアa餐ホgヲ.「cmz*問精遉4]Hサエンレ5ァD +7gGe#O,,チxイェキォN3ii気ツ囁Wq:、 +gFョq6、顎レヌ|HX B 叩ニC%Zノ<「tP+サ|オ4拭|ユ/oホッnマッ>;8`2 モ?} q鰊モ沮_エf~h?ヂ繽ッ沾睇據゙枩_杲|コ?|ー?サシクj:hンコ9菁ル゙?シケ9Yx糜匡7gWサ゚睹ョn゚?キ_=;テ゚セ睹楙響ユヒソヒ'/ソロ誉ロ誉ヌ'?ユi{ラ[W渭_粭ソエ=ケネIx「u +マ゚9Y{マo韲空t頷Lfcメ:1クラ径奐zモマ沺歃}t稠ンセwメ:v瘍?:tΟ:K蛩>Kk~w没giイoワ0|oンュ襌モロマラ゙3o>?;ロオ、樵1ュ?「?[{0カム脛jq|�羣膂ホNo?コ~qエu」;f}倉エGo浣=タル;|ィクlソW/ソ尢゚キ/ソ沾ク命}qノ給ウォモウug\]s・;0ェuヌssナナS軣ココラユT,ツモソ9ソ8[`ボy#ナ/NoOセクヌネヲッシK穡H種涛軾?ケ9/レ兔ハXxチ葮゚ャノNヲメヲーツ__ソク9=鯱ノウママOラセヨW9ホッ6枩ンqg0埆fサ丞ルルヘノレヘ艱;<Gラ倫ョ沺゚゙冐4チ&クモw壟N|壟{サ讀 ネ_?゚驍;]「チオ鞘驍kロ孥ェ潘ワゥ;Upァ +レ{ +オ77衢ッ゙`F眷ウマO 萸P堵ラカソア孑椿ネ洌/ェ>}ニY゚゙! Na嶄ヤョ?ル-Nニヘルモ{ア7fqト~A#} {.7_ワ{oロZヤ沺ン|vン>セnTンY暦ョ;Uタ筌黼ヌ釁;p髑3喋goC k+;#ネV 肖蜘F信棉ヌbY ;#ネ靄;#ネニ_ツ;#ネdgル*#Hモp?W椙シアモRソ[-趺ラロヒッo械ヒ令ヒッヘウソ9サシF1[屑,ナャウロwa゚・ソテ~銹梅Zg胥>タ>N〉ウ~\#?ホヌsr衙Wk娼茄キ'7ナネ%Y{POララユル|z鴿ユsモzvvr」{畦ニ;゚啗x栲cタ咾\xウ空ォオ歴葢釋ヒオ゙ネレ貉8Y?ノ蓚モロサnチ鯡ル 酔ー喋悚セク|qqイ~`メ。Nョホ/ム藪モkw キソ[ィォ ^0Rgヨワ|kj5;/ニキ[ gohケロeキ<{ェY-ソxqW゙^ラニdl +_Xロァ?}意ウ@ツ aKY{ w y:キムケ#<:精%,l;ミ{j 宀權憑~~yvサセTーュ7鰛ワ}セJキヌFKサEソA?vセ陜/z迢セヒ^N?>_4抃x」チスNホシ?マッエラマウ疥ァ゙逑オm;ホシ?マ;ホシ?>ソnラ踰zホ;゚l_拆\\ケ.頗゚~pz}qサ稾幎_{z鬧/棔]_5-緞}NグサW沌f/n>mぷ6鵈・ヘf~ヒVylW=\\孑[<>_|vsvvA;吉彑==/ホッ/ホn?ク9{チヘノユ]茅mng廐.エウヘm肯>R萸@キ3ミ t;1qm゚ノ沺_セク圉=ホ[^{Lg養ウ&o<偖蹠遉゚ ;乾ォ)ヌrmX_ムvvレクフヘY緘0f,ソ�セヨ儒゙&帛 +スC ~鵡拆jKRz6#ユeSリ3謌驢9bル!嶄ホ亠3跪9゚チqロsvニ悃1ggフルsvニ惺hフyFリ竰6ネ2kムソカラ4荐+ナ2モqbul;a[ ユア>楪Cuャ? 鷙sdユアムミP孺゙7.p縊マヌ砕qq~ヒ弐サワhサ+t撞6 +ン。]ョミ a_宀{セ遷スサA7ン。\=*鉢{/碎 ー}x4W床蔬=Fエ5%ァcレ蔦ノf梨&Tアソ「尢f5听"W;d遣HテスC?{ヒネ$イl7堝レKエ5燮ネョ&サC�オイス酋|kオ7>ァe+3w゙ト掣ミ|=ツ{渝~u~搶p慮ウ%ァa3B^6マ6eエ゚コ輒マナ?b晟1 キク,ヒ=ュ$棄|< |lモル.ptkv孕ハシサnSu云トヒニ喜"^vA」Nリ并yル]。w_。ロ」G゚゚逓C^6eQセ�ヌY綻メ゙G! . +#レ(、ヌX"窃ッマ?ヒサソxr踴ク」ォn_ワ|粐j}~uヘeヨ<タィ[ユユッoマoOクォヲ^<并宮 、ベy#ラレユ桐_憊桍q書M_y7ト皺カ[涛軾?ケ9/レ兔セXxチ、鱇ャノN6Qテケモリt;ヨホ 6ャア搬クSwJ潘 ヨJ獺ルcT?ス9iイナヌラ鉈罕ヤタン継種SラレN ワi;-pァエタoォ3・Gァ゙cDロ「クヌ「゙g$;Mps4チ?}Ve<i瞻"-lN ヨ5bq9vィサ,b2,ヨ跪鮨4ユmaララkFlOロV,薫/ョッ +zツ''ァチ>動沱悚゚~0メmツスハ」mヒ。コラカ薛q車ヨ簷゙G;ヒ鯏艢=~ 糴'Oッソ<z,}ネ轗s?悗ル;|テン Vjk トッュr!几テ-スホクテメレゥ缺オ憾裘コo ヲキimフeヨ>興さ靂愎C倚>Qk*ホ飲ツbUWrU゚ Yw'n クYオ7ン、ァ-到vツモqm2ケM釡サHュlヨサウェマWg}xフ G^] 湿コ>yuゥホlナ{晋wW鑁;ヲ7 +ン@ョミ a_宀{セ遷スサAw7钁ワロcェ6」d1エョ; ヌー$゚]?カo[<V」GX9}]d呰虚{クNヘlーモ゙w ク薨kjm砧瑜nャノ(凭Zト鱚[plュモサCョカYシクセpヌ#」sカワサGyオン"k規寰)rh@E゙暇城>5チカツqワ[yシ[n13~ +ャラo゙X#ナlチl:祷司<テm汰ン磅ルF; |wセス#サOマn~r~ウ V熱Y釡徹ヨ_緡ーyオス4?コ櫺sホテ⊃ク:ユ1膝キルヒー~lキ溥カロテo7セ0キ8P!*跏蓐ァ亮リ憚&マヲ qo俘イウ<庇lCd晏dセ@桜眷ナ,ヘヲLノ幔ル]綢h鷂。4ペラノ9N wモ-テマ[{7'Oマ_ャ/聟"麝カvvs'yKイホCqリ嬌歙_\カvXツ漆ュノ゙ブヨ漆リロ漆m {sィケ%ユG#ャ>墮メスヌ粮鰹レ�セッ}ワ磅q0[%=ェxレァ'%o1ムeAャソ邯†Mdモwロオ緤トモセh覡ミ而mT贊輛=垈OY地 Nレ#レ#ソュ瓜#;lモO」ヒ$y8kgハl"ホーセニq6エmヒヘエヘリ>kャ濯4eUム=シ6?功匂ヰカ艪]Dfbx$wdKMxG沺\]拆粮>懷゚スァhm゚゙rナサ止tルナノ鰮袢ユマO枸゚暉:ヲワメ熟羲」゙ネケ{0ハMソ碩6ロmヘ%カ宛E゚jエシ{,ヌヲ雰オm9*t~タサ\゚リ晩鯱ルル浣mョーy番ナ,レォz{スセtスノモ幎ヒW~「Bロトシwル=ス<テ.セ<j15~{rs/ママソモウ椣cトマセアャ)Qル?ヺッ9セギH/ホッホNヨョizrqウ>'/シ貸恆Rソ=}z~{ナ=Vホ^x�oユユ:=}q粽タ」鯤&ッ<診rru~y.Gルナロ シv0ツf6Lマ;}ta3宿[L"サー儻ゥ2c +セヌロモソ 巍コー夘[Ijx・、6シmヒンエヘ3kK」ロ8>^K8sgヨム.pf8ウ 愡ラjス3} 愡」ワ ムホャ?「m惰キ:pヒア飄e8ウM3/ラカキ"レ橇毬,蛩yネ-`oハbワ# mキロ妓イ=kン綢h"?ルソnス檍ク%`I '=襟チ痿Wmス縊;カ縊暑ソス_ィナ?ユ剔「6揄「vム}ンキ {9ク7g隣w・,mWpXヨゼ6< Gppwyォ屐キz~モォ;kネNラ鰮ルノ情1イノ>lォj利レ硼sソ謁利{ン[qカ:>磋岶セQル。Mマ クkメキロ57ナ ス諞'?セzj觜(O>セセek筝オrpタ苡�2デヌマィ妻W痢\_}袮趺777醉ッラ令-~ー7リサ/^エク涎゚~アヌ!ユマセjソa甍鰺}7|a)゙ユ橦nネq`8。夢iエ|佗8倖oJi滄尉Nァ愍R_=XnソスeD}ス奨{レ#-5ー3}メ跂ソスツz=ン 治ウカ/b;サ9r~雉=n`ワセ順゙クG;ロJヘ?7n<kワン襁ヘr屶VラGァ展]<ャル廉>ムe[テ瞎?$wヌ+!)W~g<l?ヲサセ秣#スrソア垢ケcエ}」鉦テ} ゙#レg駱(オヤlウpXイテ]ッ欠5蔬vカ冩O茂゙ソ]7ヲ;クkラ雜;X5ナ!キSモウ購ヒsヌヒe8 nア>ュKmヒyワコ_、-tc/オM菷韲・カt蹶ー蓙;タケテカクwアmエク羲」ヒ郷゚{↓キキ襤?ソ;Yシハ\嶽!邯鉄ロチケNメ/ゥvN悒=・ツセカツt衆ヒOG{<X|`ユ':rーヤラノH授~メ蒸&ァ穩oミャ8Xヒ緝o.c;瓱{ gヘUヘ/ub鵁Nq4モq[゚゙o鰓ホモ5m<ンピチゥハp酸オ躅cホpエFWニ<粹テ嘶mサセ5\(xハe径wホ合霍ヌフ濤儷 wqNソdユタ;。ノ セスw゚ノ娥タ杤甄 + 4mミソm幡ウンホTモ=ムE{g.イゥxg7W?セ:葢ァ/ホ浚ェス'ェ丑ウgラ7キソM黠O壺dッ トレヒJ}誂。ニ|W/ソ_fz愚スWh,qョーxXGラDパ8T7カuトOc:排l買ル#ホ椰キ関゚シ「4ェヘ=ホV;PC閣ネ笘<シ。a ア:ソ>p魏クv3エナJイモ|;勦エ=RウOオ珎。純遘\MLO蜷 クeャeh?クz侏Xpy紡、ゥ サ-カ!&档肄&ゥ'コrアッBP,4Q鏗極yB mk1洳M.l v疎ニテZOアキ/惹ィア0媼w鍮.クZソcトヤ6Qウニュ\9,リセ・6G{ュュFンfn、9エツ0ク巽\1.3sセi'【mRヨミレmラHn汲ケテエミソSHッエ テ筝C:トzハゥqニ・cL唱ト6-テa謌/ヲ濔嫋Zl0Y,r)VーbWs[じリ蚪6@ツbク6鵠bニcケ6afソ.ド@ <qZbv?{oロ葮qン}7ョR榁鄒Qー$%CEi槽,gト棋Tサ P;ヲェ藩N$%/'弔ネr「ヲハrテ栗9゚"銷;ァス焦犠苒8s赭ロンァO溽>GfPク@2yネケ@"ラ!oケR +>Sァ喃戲髄D纖E。-洸D称0ヤ(Uトミヒ%ァ険)ョoJワオホ艶OJリzUリd厥マ0「睛b�1%?xd)(平溷/S2ヘヘc-B2y圷BトX]B搏櫞擔ト^�Yyナ_ +PLT1マ趙U#メs酣.ハ謹ヘL慂Hsイ粢ルテn*\V<B怺ワf艶、s!レマP'ツ!氛bЫァ�,oチ件サE(ホE GO握チ・&=テ>A淘f鰍8ェトナノ5&=蘰Jx渠抂'ネGネウェキ「ネ∂・?ユ垪ァrー\!チヘ「ンx93ツWヘ^ホ躯�セワ;W<ケ埋ニCュ`i2kJI'_幤モ3';:,hU+テS+5ヒ&拂 ^゚SPL賠 ン:!_#X頸ャMカТCm)ル Uノ・「混&Gpyャ9ョノア;Yワキ滄ノb臈ンAR%ホM仙DツVテマBハ缸草T蘋0池%テ鋲) ル 辱iモC絳ヲナd +ノS^ォ ∧ムィ/ル}B)Sロノ2Ttクヘヤ汨pdャ吩+モ(M>JノS"N@,7[d」"タ,ヘ、售NSチs′hOェ*о訌g。+r 紺イmクPS�v苻メ{\ナマ巛クゥU3H.コDY'#奪 �H<Pソ-v;!]d_ホi仟袞Hヒ2=S獨!@%X<ュ「帑ハチ&&ヨyウ4ゥV$怙+3孺。ェニ特盒囀Rp{オァ)6h&[憐9O屏[膺ハ芫奉ニセs 3pS*⊂ニZェ5・ン梠瀑fオイ」"/ X)rン!ェ番ケ} +ォ`n O$チW・ヒS・ヨiニ粭5恙「+ネ審國A0 +&メィ;=rァinユム N帖謖シ-}Mw^Q郊tヲHt罟棘設ェUG_肬冲キS*3DRホyrFカェ8LUN$�Qネъc +。 きォ 椰"~y囑2ェ-Z&▼F溌銜lレラム5ニ=ァ_ヲ兌#<-��ムM!EアMルmワfsA。峙D・ +ヌ JヤpR名RHヤa)Ii�゙N・^エ3ル_QoDTィM'[会ッya==N@6Tаェ`kA蠑m .アィDMeIニI`タs。アEオDl%゙Qニ冏フjEeUスxtfセ罍ヨ2^ 噎>r7テyュヘc"貧キIv{・ら カ+DmミQ!ェxツG(テd度「沌剪"ム佑・恪ヒチ\C譫n腎゚jハ6曇ャbウNP噸-w4} +pHクm&@}<8ミdネ?)ィ#Q{ュJ� ,E`無ト飴@ 9fJラt ρvZEマペO"枕ソヘf"ec[第。ヒチ撒マ1/\ヘエミр"5�PPキkP6JL$トS墅:メ ) ウソ各カ2ェ」硼gユ兆84&R'(!ルリb Y'石iム臻dhミ汽0マキ傀ウ(邉レトV嚀DI各&m{ネI浪,w+ルュuワ メ8-kーiV9Y}/庇エラ0定eイX惹ネ=鞨潯ツ +|=身KE'J、)dク夏 ツ「(ゥ反F<,ロホxC +1ナワOkL=#Eヒ_GョIIZ2Tウレ「+芒k。|ムナハタuィネ':t`#�BAEフヒzィ�ム戮艶η* 斬Aラ筰yN碣MA窒モ 瀬儂sJxJハ*巻ミツ義mZハ孔IT1$hチト厂L萱カ詭Gp ョ3Yxdン>[。rO」~H,G椄jケ:-= +B�Vホ鋼ノマ  G}イ +pネ恩。B¢ェTSフbチ≧DS]b '0p5ヒトEkMンr|ィ]テ*ィマ、/OPチチ婉>嵎亞PケャHh゙$ァ&。ズ_ャ"$-勸暢k謇戻アVpsァホs*!=フtツ。 「ミ2Dェl cfXヤ鉛3ア鑠蓆牋;4渭ワUf]i4oラフN6レエヨロp +タン舩ム゚ギ貯ミン6ンF\オ」.厳P+! Nl5@【ミ$\S゙ Tカ敘3i;w&\l礼ァ靺ozOjp|枝z[ン9lGMg「ム)嚶ヒzDヤシrヲ-ソォソ�\hヘtツ アーD[啼g┣ マ゚)jD「Q4ォ7モaァロ?W虜ョ~ +ネ`O=ヒゥjSヤ・裕綽PケNT}&${ヨ=G�ロ眺cHU礙2?セA鶫メ扇p>、eDツnシ懍;゙i?;m"!W/莠ァ*(?篁~d遨スMP荊ナヨXフ]7ロ'ツ掏`z@r<Lf、f&侑辜ナ潦q幹 +鏝n9訓@錺猥wBリラ7ンZ/Nvリalユ挙#筑Leuケ8iDJaOカ贏3ミOーy!Hh&窗揮ム?ン催|躇゚ワノвヲBt&|UYイ」S-モJュンS蜆|>「 +I儒゙ク*+゚ 、!@4煖鑿3N・@'コ還DヘU曠[牋樞8 -aGZフ拗瓊q"]-ン}Xbクリ7ク{j +ン0,爺ヤ朸-エ9唖ヤWレフリ=sヤ踞>簑Cス雨lサリY椥yリ シ Y0@゚8婿ロォgイcニ;ワシp」ンン倡ヌ「サリヌムネ:テe R}2ョヒ互SBセB +ゥ +ォKjネミュラnョB。縺ヲ<\ナdP躅5m霜トア@`lz芙キエ*屡ナキx「+#)+f&カケY゙94Z00'hオX,Н66.瘡2コ歩,モ`R?ゥマィ櫨ユンNG`�錨5<ナテP_e(楡wJムw瓷ユウm0bnbQ ネォ%<$。ク +ゥuツユLa.^N"ケシマ罷Bホ'タzェy|'ミヒ }シ(Nニワ允IH=q楢」エレ@`ъ⇔:薊゚7ンテテユBHIテエ>,4 ス+2u個 ヒ‥R:2ヤ腹8sb;}g、塔カ 舂#}h犒#ロu嫁フ>cチクm派Iレナ.hコ*ル%ォe「Oヒ(6ォソタ*颱T1造ァス^Iネ  [r<?Jエ[\}pr,サ祭越牛ィ慴、炉`sCoa|+T%モ給藷/ミ;ッYン&瓊チノムー>tコ嘘^>kフPx/e|*@ハァ#アタ吉 +2タ歔9==、,リワリ@O50ム!ホフ、鵤キSOトェ8ヤ%メ[ハイ@ミ.ハ倪6jコ小nBラ紫 ラ1ナ燻喇゙3フ5ヲf,樔>w7:dア9、f33iア*唐エA弧Aw~源ネタUa4]壌甎ア亟ys +SサレY9羲j6チ�kpJdbホ迷|ー、ッJ#スh ~|A/@xメU7ムマT嬌曝!コh)A]U=フケfQK)ノi>盲ネハnヘ7o1ウヌ゙ヌリ@」9メF2Fg7坏T|閘ペjノオQ5偉SK白#メ#ホl純8ェェッ}Aq笞5Pフ筒,レハ'キ$@榾篌ン1)ェフ3枠RヨD?)銑ロ戸'ヌタt智<Mナ~3Bヲ巧ス.メ8;杯・IMKBソ :oE叢C*chafy{owASs」7"ゥ!u!ロエdB6 Is蛮Йュ[シ榊pr$篩マ +リナヨI垠ゥJニ k 普サKサ|カX.h~|Pン: ノ跼殃\ウ舌チムタィ$u戮ツk鈷S\メソn「Jユ惨ヒ壗貸6ッ!Vネゥg&ミ/PK癡桔栗5]ヨテナノ袋]ト6テ竄+テハ、JJ獏ヨメエ詼ョ Dセニ8 考`杲v慾チノ ユ]6吟稘溲ーマ83ノnオ#)d。挙#)Gメ8カノラ示l# ワロ �ナハ&?a淌p,モ。圉!0_ゥzIHQuaラォィSネfV~ノ 'r、-ムノNGヌL゚mOz/銀\ス透シ@Mm1-フ3「樢/キ=2wWvSw�・) cc8:ュ叡タ"ム^4ハD葦ラlッbRaRエヲGン橿0(=ィナ「.}*ヤコ嶇レ輜ラ/N伺チl3evy*`6ノ|庚R2Dハ鰉ム絏a +�0;B焼;Bノエ<琅梧&x'Jミ呵IUキヤモkTL!ン0ゴuヲ藪ヌーニ]5抓キル喊9+怪"sユネLウQ0ァヲ!*_`トnpHト升盪X�J荀、G� R韜「ラL@)<ツ騫$^%ム}渭エ%Pミa r 舐Lォ30屶ナ5M選  ・Eハ"袱ハ渫[ウロシk齷コ 寒ソ[ィヒg �hF栃^BTY゙跋ィワYァr~6yA:。I*=チ':IlN嵎益ソN?D-オ0+)"12貸ヘ肇B*F球pE重=1.コqタnW頻g@ +リ巣イォ-ノjMxラ軫UェVy8オ"0nヌ"u俳東芭刑Hサ$・M軸勲ェホ.冏汝sチ─dbヒ逖マ>タ<ヒo,6トャ遡ク G*スT9淫R+x[5脂!qMnォ哩 ェ @ァ。2リヤ襁$ 气 +ヲメ酉カ、 ニミアシ」]Fホ&諠杜ニフ.」f姙「7'hュユHヒ、R#�;d」ゥェ"QQ1ムヲ`槝D?FムS M牧アワ`0{fネャl蛎カ[7rbチX�Z%航ェョN1沃コフwc黄 ~ソK4M6;ケン 1(-s詈・燐)aレ+寇.M"レ$}メツ6[lBGP:E干杢フcァmQ_EeャqP.リ.ャiキ苔ヘ&$遮, ]圃5繕mr殼ルQ*ン=ハU/∽ノナ>ィH柎ァ霓vヲ*ケB(0ン。リNPチ2隴} +#SLX@#オq@YオG迚qクCnT@リ:ヤ3カ{B互V゙ャ鶩慄・ォンp」1ネ゚EJu?:戳ヨー]ァz瑚牙払ィエOヌカgェ゙ヨ轗.9vzネヤモ;`.メカ靈ンdvrソ示i豈キpHク-圉ヘ"Uヘ偐!q除/5!A淫サHD楽Lfヒ5釛・鑒|ヌbヘ燧~ヨァィTI%ロe幔ムカ9k菌エ=k、Yc@゙置YUチ/黥淙'・ツ,ャ'QID頓ルQ!ヘ鷲|vクz&ニエヒZHチ6qMpT・セ"sEチムeuπセツ ケェY5庇/N鹿jサ5jコSテ忘攤kMDIRPE 3ニm棘キw笙f 4#カI濺クハ<柯 ±吊l,ェY衙」rMエ\56・雎J +3ヘssA8冉 .hq杲sB「ナb辺 フuヒアトテMf6qq巓x!ォ W)ネ。j韭.粭Xェ6頻L6シカKGワ糘ト!0yシンc筰。@w冽ノ渋yサロ}レ$メ4[ハムBg">3nu8キヒmシ8ルf?n#ラノネェ<K鬪嚆41ソ"ス アフ\hメ5」NLキ嵩サKTdBメ:敏幀クI>モニォ&8ルACf4hf彳訃ー%ヘ Z柁ネゥ ョ $F _ロnワウンロヲ *「隹テ&(櫞ァ[&或娘ヘ!tdフJ唾6褊栴3ャpウ-z.狼*ゥ-ム[FDMWツ旦ェ ツア析0゚$<~pイヒ\蹶n)ッ洗l カ`) C'3ko#ヘB翊イLヘ[呈H:ハ6ce淋イK{ケk蔚叱ヒ!オzロYーァq9Π稘ホマ(cリdo@詫2<カ) GイDシ& ミz"C53q:ワwッ゙ラz>2ス0マ精U散、s4ク吮Iハ 菲''Lェ>ネZ]!Tコ/q速ホ幕;ム ォu渺奄2ロミ#9「嫖?シオIワ・ メ +/盛ヲム`nテhq��,泳栃要ノ^サtーM3xヨルYサュAbCキ4サ#ヘ~笶L 3{ tju欄жヨiKサシヲcノOヌR、iTVオロfハウiカ7Lヤア(0麥ラu_ル詈s9カェ+%%串ム鐶t/1+3I 文Mリ'R4Π\・5]タM;T~z觴>ス云j閇<]Ghhツ8G」=聖);O椛ン、ナニ竭c。抑xfトルEzvアオ_#椰8G カロネ墳}h_糴,、0S、ヒghv孑諧mワヌGフkO#_R們`院`諄2スr_+ワヨGキ隊7.ヲ#NィオS┤kヲ」エリU.:Dタ +、ス7タ2チVΟKa縟hmm}ッmw鉈稘kポ:9joワ;゚x」Wニ クRキHタレIコ6執ニニロ゙]袍\Zロd殖kォmkユm-7k嫺cメl4 ェメ wオッメ。%QF飢mu]ヨ象hテ[myュ*RAX]獻^9vh{Ih{栄uヒ T ヌ�薊U(セイォオ--オヨ.エト瓔CAヌDッGu){�P;テXャ(禧姉イヒ6qニ早?3キt纖Zッ(テー3cuク驚纉ヤ<Fbサ:ョ1=5X.afシ螯レュbア*琵ノ<ーカイl=%A棕IwNo「 @C 8gュァyviメoBハ爐ナsコ^儕メ、A%もウ^チH雎ツDDク '=テ.レuィ3 ェニネ漕琶ハ6T鶸du臆レ屹C W4マidM:gz迯04゚kメ櫓+テ・ォイヌ苻ノ)~B 9m&ョ7「ホ`j,杓カ OF徑劃 Tヨ タヨ佳 =ンK叱SL1]pN翠zKゥQ"<ロ*8&ゥュz&ナL縛Dv(モrネ゙ョメm ヲ゚7キ% ュィ0鵐_徂uxァ 躁」Lm$%ス爾チ9ァ″ロ�ム2輝Aウムヨぢ。Xh$LJリ8 +エ ャdヽヲ:イW Nョ鬆6磋斛4ノY蝿ツヒjN(2ム5:櫛潰 +1シ」ア樫アゥ皎こ, ⊃[キO:.yィヨh袤Cチ残J,i\渓:ヲ~袂ルMヌA ルィ槇6。ヘ垓V/リ3P即罌 +呟�シNヨ営Hュ|y e=「wォBエイゥテゥ#c窗コ9碚iW]eB牟{゙"F -薪Ryォ=ュ醐X譎)ョrォ@XEルォXト"戦ロc^=゙漓@^hn=゚巡畭2:スケチワ9k糧Daヲt)モ桷ヒーコlキ{ヤaT「ン\襞靼恣o'毘カシユ鷺L┐N m轎xホ/ス>1ュ萪�Roj{ャ膏~dヤsヘO釦#"/:M泄」8s`准 ソReマsクi樒ユサ9窩?ェM%クキep*春ー雨E +・メLGヲ6 敕駈)ソ`i;「MCKU6/ sByjiO9ンY!紮P45z「>ユ>セ怠@ Hン「z堰+h9ー醉SチrケトKサ+]>テ{。怛c5゙ネcLgG]ヘ7vセ<ユ形メ~ワツ& +Cホャソルk懶ヌT6ツ岳治-ヨニCdvNォ8ヘ<_档Uネケv」f+ウjヤンX紆ネー隨。>義gチハfV靦9マ�U9 +ヲ^u/oオgB?ンロアt|ッUx砌ヲ%ネpゥ黠ホョ/准Kチヌ攅;゙ (5nヨ^OS扮VCjPメム樫7抔貪ユ」ソサz揺状韵セェ閥{b)饐嬖:フLUミィ瞹s:?ルク<tヌハYフwfヌ=Y乂+レス尸*所 ゥz蚰ムコ醵マク─イ済メリ扈ッイキ~|rェ汚゙。W+\1LQッ,?メJツ→1コテ臘R逍・驫遘敲匍ゥh>ァメFZ粧T(チuBU'G(ノ)ヒO=osム:Y\ ≪ヌe.p1#ハノトヤ霈・i嚢栩*チヲツ,扣i=>~S惣チ[53尿ヲ鍜鰉m.チケエ。ヨnc沂(燈~(!゚噤゚bz鶫$寇[H6,$;護踞殉万fGフ髷rケ撥>キミ0pYヤg「06C~帷3Δ3Xt。マ>h閭{掉 F}b軍フ0迴1xユチ]_~ァネ>、+ォ滯頸モフ4訴"hッヤ」マ:コ瓏レ猷シゥ艮UIト}ハPユll\QミXフ0。谿エキアz黒?゙イキ≪ヌVメ懦4>UFOp?、szM_档p恃vMゥ&zY8=,@^タ%F AQKh"#リォoT oラ俚巫�Zヘ-ラAbb4p"ツュlw,レ嶽_8[oc鵑iョy{エト暇^虻ャ[モYh気e�hロ;zA@-LPV性ヒ 4/hY4ッtレQヌТ[!ホP@キU嬋オ躪楷ZB。悩j{相゚<ヌp +殿YテサX赴Uル桴チロs}�肌メ@U鐚コ<8斉elロQX 册n=噫=13ユ^eメmM奢。炊rリ}�。角X |゙ヨエ};Y填7$�quレ實クケz%サH綣ム迄ソ"モヨロォh需5$ケヨィ菘A3懐フs{3ー�}6とjR・ -}ゎUス9<マコラ!レxX!ゲ候メ. ン4眸,レ&Re<k佳イコ1オ鐙QJxオPノ-Hャ・N "X轅ルヲH奧Yタオ齡9゙:チラエ,O!.エ^B。エ]$SPvコョvBlo6]タ睇z董ロ佯vニラ ケlネヤv <ィQ_u擧i`ケZyミ、ルKッい<ロラヲリホョy92シ1�琅降ァャヤ-A3ィQ。#)済%ロ-KO"gチjゥp8蘇ニ;@穴疲ゥn@5ヤNL,疚 ハユvヤAc;シs洌 �'Iq1Bュ5rB qイョシ;゚fニ。 +ゥS>.フ嚮+柳5-愕「cグケLt マ弧ケ<1ヒ俄[ウ{7ヲ4=チ4^(]9~l瑛マ[wリszコK4VシクcOFクe@ァ-]メ1裾HSャ~N繃d%エk6dHネ(ミヤ」2:3 エゥト生/Glワ隈ェ腟j +Kク髞sbラU $ヘ抬u椀rUロ4ッ,[ョッヒ +X ー4&HPメ9ト\夭A叺@イv{カオ展ヤ゙}ox・b +T黻5mハ墅X.タQP効カVJ9夸Z テFwソュUチ�Tレ^Q|�達g゚シ摘`ィョ}KKリsM),F\j、ハシィユォェテ鋲ヘ9Wゥ(,ァニ觜ツk +uラセ�sjaHォレヨt頽ンオイク-vヨニヘ+Tsィュ] $ャw^5高 ィソeロニ 縊0gt洞" @シ ツシユ&ZtワL�オ. 8運1Zォ[Aム訪誠ェ藏Vマyキ儲%X鶚WP醢ヤエC仁セr。MAMニF瑚昶「ワ紳メa7;蘚{サイlkヤχI@Ed\NミZ゚6`#;|mハ+籠ホmhクiュGサィ=ィsレ&ィa8aカNオヒヒ做>鶺Gヨ7ehNmYヘ0h尋 3M吹'! 胴シ exsXヲヲ.ュカマラx个゙W゙=ッ勵y0R〒イjオ磨ォGJ]アィラ""イ亭(I:ハq3ぜT&シ1KMツaミケ 蘂尭オ参bBノ+ア +Dル +吁Oホ(#モ6/ォu>} smヤヨ a+-"ェA;LTl盟ヨ^ホ嶬($`Yゥ」 Bウ@ョLiQs驫勦`シ惻66侏飢?弯」 ^Otニノロ」nラ +b><@ョi Nミ エ Cノdミ:pェオc獨エコWニ&ァ7俔^マオゥ シミ@康\」{?>ゥ スミロ躯卞3スL2フ8唳6ャk�ケ碆.タヷlkク絃ヘオFyエ_テヨト3-5l`ヤJ14玩サオ讓eサ恂=o@マメ M*ソ。 PcIレ\ナJツィネ87ェ,N@コ5h錐 ミワM (サ&Z拝莉チホbOРォQh鉄少フシ.6(!ミVッ ![`犒吸O擒ニァュ閏sマ'.」1`スuホナ6魏、,タ<O゚ノ +ナ鷦リlsBヌ S蛭オゥL溏ホ朖弩R7uカ6定6 u ャゥャnョ>=d餃qウ唖#ヌナT +%#hエ:ーs「/nDwhユ?ツ4 uスアテ +レテpaCPヘハ^ム5|ュ>ィwwVテェ=MzZ呵 ヨm{5ソrAN`ヌ]リも>貂}nmサ箴aAoッゥiXHM=チエ.|l#リL頃ェI匯YC鮑マTxタルMbアQ?6axqc鞣z1・」M|9ス�ラo佚<ヘp}イ(フ「fア袰ヘ=jオVA=jD7錬�カE壙ヌJ規$ZN ヤ"+xョ泝レワ「6哉トX乱モMO・ェ9A=x6�c麸:┯N豼イDミZ4@侠Eュbミbf.yAムエ(コラ?=ルZS裙ワ#hタレ、X崋式。2マ帷イ!キミ「ーィ@テユッ嶐h則ミ縛L6゚%ヘ「Cエ�Z3レ�イ�Zヤwワクxコオ<オ竸sCy 嵯クVUトソlヤ9Mュ濳,・14トUテlPエォハD愬ミ:ィ1エリbhノ:ωBテ魯eBhノコリ ーミ,~I水ニ築:ィ叨アh蜑鵞タハp@~ミンN、Eミ「カチモi┯ァTエヲEa S;破�艝ワ鮑�・E」 ミ「募寒vオ黻滔9オaオケ峽ルミヨhアms4リーQツメhーミ禳リM-D・ヨア[4ロsSモセエiャ=Mィミ「p齲q オゥヌb*@>G&閼�レ\ c驕アdfNオ#」-槁躪]_3ァQイ0jュIヤョV#_スl A@KュAK+トウZ2宏wU8セiルノ\�YhlcMッマE^kRPgワZz鳴hZ|5ォS熾vjbZh勿ZZMトクjR゙Ht (テ=zノタ靦イミ\uSY帳AgヤKT-ミ3ムナゥ+ツ</. セオ3c゙2マyr窺{シヲg3i;鼓ゥ撞7嶽iレ�.・f7ス椀\ンオK0Q8聰ヘル1匠7恭M5zー-敞1Iセy#曼令�5ン +J。1綸#ォBオb縣祝^Uヲ7マハy ;=�[、ヌ欹1レ#=榕oヤ敖゙v@s{モjw0&齏*ヤ3u゙ウトzエ跼.ハ餔j`8打Nムアチ-蠡eオ`O挫リTシe@ei=XW>/ラクq skムユA7mヒセレ`ケ,ヤj」蹴ーえZd�シム「=Akソd!焚KエW#イ=躬6侈>Z&鵯,fム5fセ<gオニッi+宜xO鍮フ29ヘoイ-Aォセカ・レ峽)]#Rエ]}レce レG゚モO靨l箙ヌ{喰 ソF-゙3伎タ秤ョ3g[トHヌクコ。メ鮑 +ヘケX(k5ー>R挿0V/ヌ皖ュマv4M}設#莠ZタァAニO5ユホコzヤ!璢ロ5Q?M~up!ンュTdスヘ):ォヘタ 3視\]格ナ゙妾e%眈6)モ>y,1簷∂・逧|Z>司・+マエiヒ :ペ6為hサエ掴靂ォ$ A5シホエ +ヌJ嵐孅Aィトョヤ -、アR:リuスュモ#>nJ5ー「}Iヲ慯M。?NeB}セ、横;Dフ^雪ヌ^兼訥マ鮖;i脱Cヤニヲ紙2ィ妻AAリ|+腟ネォ$4~vエ$ー +^@4オーVu[疫}ハ*ゥユSV/ウ萱ムc、jNe9$,ォSn +uaネ-疉.タ~5vホ雙ハ9髦 ラaメ.シE脉 ヤヘSソタレ麒弧妙sXBk 膓Sリ7 撕gーbコウセ8f! シCF6゚Mmトキ廝ハ鋳uョ」d LーK ヤホRP祐ZVキyムスム=\ニエzケ2i5跏p*C 運�{ 羲ZカFュ:ーリ嚆クウ6TyケォtdュカニNワクュ;ィY6嵜WoJ(ォ恫叭Zネォ4!ュサrWモ+シdコYイQコ笘ャ1ヲ遙dI堽jgミイWオ。リケj4シ|Mン5,>:FWウSoラ仁 鶫ikmセ4FsWXIgZ~ソtヲeカ@オHイヲィワキリ}せリ.ユナIェ:ヲ裴5ユqチ訟鮭5;ネ好1jィRニ\X<閥:ク粃ン覽チ中」f隍サシシ恂>トフェォ楸(ク2よ剳 谿; 0ヨ57pィト*mFツ訊^擡Z。ノアT・3テメクZI}ナHg゚H~瑜2ョ+q%0ゥ橋@*&S:メチ3ぜ&ネ脱メq龍Z,jソェ抱L4ルdT+ ンOマ(。転BXスャ争A `O&。力ヨDAゥ震コサオ炳k]諫s~リマロ」;k ォ= r7уレニマハワ8Fャ,醒ウメ-^2|lメvハ罌Lマl69ォテ%ワ#n$_Wノヒ\Wァーyケヲ7C34N・ェNウL9Xj゙ーーエJ、タ北ワ?カ$$74-}ィaoレ慝「ユ0岷au]寫lI厦8艱コ-厨$ネ9」Ij/レY#w<リsN蝦s 邂^-エ蒻,タレrdユツ_)エj・n_6枉+ネ[ゥムZotuツ、誇aFQPK・斑dヤツVテゥ&「Wァ>ー聳ヤ軟\lKスX@)#ー彼PワnTュカ"耀リイ趙66,ェA@mhIz:ル ゥVtメ}哺詞@覡ッV秒5=ソY7セソャVロッpイワ-タ~fMoツNヤオミ~シォ4゚W;ロ硫ソH]犯Vト羞BX豬。毬裕晃jモ:-S[FT塒yァヤq2;#okニ\a麓ロ/ッオ・ヌ]MノiXH.ー(D~キタ送ュ、[啜Q綺1[zfムGbnテyE泄カコ゚$,ッテrレ-琉テ コア鉚ツ端|レ'キエKni涙簽台涕ノ->端|:爪イ~njs['キt$ケナァ]r軌サ沁$キエMni巖箝ズ{鎗~ゲ歎|レ%キt$ケナァ]r軌ロo匳VェOサ殼ノ->InY= ケロfW、Mr軌サ殼ノ->Ini涙簽.ケナァ#ノ->端|レ%キt$ケe5SMサ沁$キエKni涙粤台キノ->n甜|<爪粤.ケナヌ]rK5'ヘシ~ャ%キクKnpKnq涙粤.ケナヌ#ノ-ン・Дレ棺ノ->端|ワ%キ4P'\7マirKwJ.Dノ->端|ワ&キx$ケナヌ]r居サソセ2ュノ->端セ満マョ竭wノ->端|<爪粤.ケナ]rG端Vマi<ヤヌ]rヒjュ-ケナヌ]r居サ$キエMni涙簽台殼ノ->端|:爪簽.ケナァ]r軌G端|レ%キエKn馼r儀ケ宏功<]c羞セb�ベ m詣唸y ルセU X}lkシxトxpcシラニ{ュ功\ォ臨x_ 。ニf*joSnFーーエ7゙< ロ+7繃リ嫻シッvP桜桜サオ鼠F羶ケ彪ニX夊ワ>功貉Z>詣ョ朔N釐ヨxigシエ3゙レヤ゚ヨニ;Oユレxo5Rニィイ'詣サ6゙9スュホeャ購.vmシッ27ニ稠シッカ「テ5繃リリfシ7ミ`シッhツ詣pォ暃セyPセ-ーフe3ーi#igシo泡繃オZ5ハW8Y@;缸8^ワ卸゙ャ瀦セレルセ┓セ!(5゙Wトモフラ ー仄サ5゙a!ヘ駑功.ナ」|ァエ3゙ワ-ロォ}豸5゙]愚ン単;スiカ[猥xoーナx/~ヨツ(タ箸ナア刀hl瘧階Z4e漫h餔ツァロnゥI笆$C柘~!ヨヌ慯 ネ∧6Uly#オミ酵ーシ「切"xYUー0リノクヲ ヘ萌?_J陟(、チ2オ79キzNウャ)qケ.モh圄6l +ン飽ヲu」Oルワ「ゥ ィロ0ヲヲVスlカシ劍ケワmfhカ|:モ2カ. Aホ4/(ZfヒcヨVヘ5sNKテク0リ-監カレアル分キn」 ル ff韓アャヘハBキ衲Yカリ�齶ヘ費ホ孟MylロS>Y2Pロセhシミnハァ3+S>ルオU�ゥN1ル0゙Lワn%チ費a非9ュツ!T0d富賂キ舖纎。ツルn;ofノw,リ,ワ6S>=AK^ヲ贇ト癒#&zカ<s躙矍ケ(祇娚チ。ワnノ#コゥ遨幵ノハコqチエLヌチ念fゥ`S;楠ハp7蜩]リィ幵ノT�ヘ飽レ[8壗QMス.N>2<ラ、Rキ衲哇l-殕毳7=UアレLメMリLy|ヒーk<Fエy斎ュ毎羸Dテ>+ f<舒f u3>ア'翌コ?ィ(+岻yン外VRトケn晉va゚ V|nGx|士オ5ウ箋9ェVフラ`Y衡オ# :!5+セCウ箋9,pフ観Mア ハヘt7+>キン:テbナ Jエ抛ャ匯t.t+>Yy%苅ゥSス:コ\鏃|イ$dコソ・++>Z謇ォ\C レサーハ5エヨaィ波馗チ4クナアウ.6ツ蓑*サmヒ冢,'6u縉-2k"コョEヲ +裲em'霹ZdZ釁ュk胎晧アY8ヒ4、チ.タ^詞5}鮒サ6鑞bc(G稔 +Dq]゙8R臭毒ィュ゚鑰,Gニ妄Jc}cP]pnャi附+.&樞タリ h漓hi\魚a′g.ネL 衒リ貯。Yvヘ朶o゚XUャナTV驢レッミュk(。qル麁臘シ"レキ.遉HワXIッウクア8T埼 ー・ェ錮刃ィホッメ ]羔Kコ盒pクd`コ懽+wフlTエレル寂藁ィ蟒ワコ(Y%CQ2?ロァゥ:チX,jマBbレラヤ最ニ4マ6 マロニ虧Z>モュヒ置%f劑ニワワX流・"ョ齟ユヲt更ムレ#nS*=ャ+}?L;ヒァXラ%kヨSヒ后ト4慎.、ラャ ヌ_rN)l>wBヌB}ソォ3ユxォ\C様#予テ螽\Cモ:Q^f、 ケ4.タヲワ5\ケホト蹕,ヘォ#aX)k鮃>Rネ」 [.$ワ8oqZトロ +XLタ-ルNEホ"Z 6∂ウ aネ6\@cカ]lC率オタモセ繚オ`トL廬ヒ枸8ゥ村YЫコq=)==レdzrxナ゙慄衞■su3@弖Z」遙チWピ*3ォdCソィノ=^-:ミすメ?ナ@ユn1ト+|孜E ̄タ甲コ嫐 \cKシ「コ ノオ`す聶Dz+下:ヘ-ョア:ホ-イアッホ関 +エホルL゙啖S7。1ッ陟QCXM題[エ ラヤ僊)qアi*]yム[メ+ gj蛋シネゥ簒ォモ<�ヌゥ゚擦g、サェ ャル チVC ゙樞ゥ_フ&ツ濛「ナテシャ示ヨ[)オ槽6ハッ])ノrコV・オ墻FX數ssャ゙ワ0給Yヒ#゚7ロp<韭9ッO~rオヘヌシッ&モラ'sm頚1ラケ)邯e゙「ィテニ"|ェhg*nh7メIPKトツoネトloコf.緞嶋ユLャWチトナjJミコリ替{礑ヤオnテ水ラニニ削kXカ_kSュ +ホ進OPzeニp`塗}Pvyヨノ5ョΩU復ナbA##ミ0キ|lAosワF}ウ5oゥSwpX+ハGz*ョ#'[ キョ(r*f+ェヒャ゚賛鰛(醋^ウョ5悽ョ;ミメPZkゥ菓KbFk|nA∀ッァ/ィZ'巉 ネCT6;q3BhNvhキヌcuィツ6枋キソvラO「イMs7)b4X%8&sヲュbロサ晄ネF�蝙ヘァ>\糒ョハZヤレヤ「セ┌Y)ヒソルフケタ&ヨ;zュ:エ゚ ti~ i;伍惷ゥ舐Q/k7ワI{q+ャ迸セi5p@Xレへjヘ壅隸钁カルァ2+ニヤキヨミ@fKヨTuン_゚m@擘zソチ築マ 6舊ヨ濤」0ォヤ kヌヤ ツ`DモN#ミ-カ岫コm芝I7δエ,瓧ホレワヤメ@Mム'a5`;JIサ/娚HIア「h望ャサ'鴒\ッ3ェ辜5&゙:h\~.&J6ュn:フ)*"<o`ッvニ舘jL3ミナネa6已リNユニ-%I叉ム`Wミカ@「スイオ8#嗷]ヘ;リuUャVKノオ徭pヘw・~峙dXA#R;PS・kカサョ強iー藤ゥ、ヒ偲ッl;゙霙6ュhェヒ即BKル゚オTуlC ラ車 \ム迫"*・離イ@滅/ーナ P]m(Z;椈憑Tッx>nL2ャ ロァ+ +ュ2國0.(ー o/ヨaPok「們アjij檻侵ロ0ZッYヲラメ辧(ア゙Vュ%Eキe藁ωシ1h!逮_Na.オ8僣敞naレ;オhuVy椢 ラa膵]ツ焜*ヲ9d~ニ再 +ー.イュE`ー オヲ>遲 ア~]テ&支,g禦ンbルKg!ib'ヨテMSキ%r]vル"「リ\Fフ%レI!匠N;ー +ロィ遉ア擣モaKZ*slJ、ON 伎xw、ォク.ヨ\ン輔経Wエ豫5ア百Lk謚 +カtネoクォZモア沛?<トテラNャUo姦怯慾Аzサレ_ニ豼ヌ・ッ[猟ェ;ーィ5ヒテォ1!W#ョワ執n7Zkヌt(r"'メ゙モdテ~Zy9ェ)ュイモ-えGO砿リ脣ォ8M闖?ヘ0ンa7<~Mャ∫eヨz8砧厨ムシ覇ワt證エ崩"-婚゚M+オZ<咤テ脣ォュ?/譲湃Cノ\ニォ綢7鹿9ッV牘ヒセ?WsFP_VヲIクF'6Lヒネ淤ナユセキOヨ┻゙∇ヨ蛤&モNxl$5= 噺ヲチ5‡ケ⇔:ea「yY瓠c+Pイ゙ホ Tーヲ5t、箜q#ラサ<2ヨdモ銹<ケノッホ>7踈9!冏南゚0>u険y薦^-ョ{コ「/ッOサキQR 署6レ'HAyx>4Z曇4ミ~ナヨソ1ョKッユ喀]~,エ+xニF]Hォ'/アムLYQトシ奘<フサモF╋ムソチ゚FフLFGz諦a5BF闢X沖oト5f椨訳抽vT|u「_1杯ヲ=Vv[貪zヒh .致メH鶏ZンP槲ヌ羃"4幣 +Tコ。=・ッNツjヨMッ桝ラリP死7]Qネ桙64カァツ憤6Gjァ=lィkO+\ヘykd/鱠麸ソ鳧w;Dlwhal;セヘホkッ゚ナo゙スsオヲテkoワス{ハ_q鯱崛yヘヒ^^<|Gキソwヨ齢\゙ュヒ\靱テ?密モ盞ッワyネテ嶼>シシ令ソ珮韵鞐・>韆「ョTdnメヤチ9レ7.ッ゚レoセ<コレヨュ熔]\ソuホヘ_mCサa「i昊oセニ蜒ヤv_{w?\ヲマノ|x袗テキロ$N|鯰 ].擾シ!kコc晋ョノユ譱セzdソ?ソ譱ウWe/_セテ肉O,Tッオ・ム>Gヒ#?梳ヤwンNx'ァr$ル該ミムi6A`�ワ@ミロル タミオ: WWヲ嵯橙テ鰔ヌnk'x +g2ラツッニヤソ:.胄エケ搶Nソ}イュッ レ~ソカヌハノ゚ハ7ワケ~ニ磊ッ゚クy)幎^%也'd:L゚o|~ヌq某&ュヲA,1aNAT'y*ノL゚コ=セ竿oモ点靖贐テォHォ*゙?螽oワOタ)~ヤ;a、碇揩"ユツ><サッ|シナユ):膈bmH馳纃裕卦 ノvイiュネ饋カノィ[キPメチメタW_R瞠Saモ3゙x8拈オヨ溢5。H倫".M�t完lフa專ルホカチテ6風サゥIクャ[sQフ箒q欣c蹕4Tコ&\ュクナi;nF%コ舶_悗 %{<ユ+峇Q屓<ン ユンヒO9ロホェ: y淹波%#マI・LフIエga啼ハ。Uテネ=ソt・ヨ鵠膕暫リe」客旅Nニ幢恚}_\5>セ冀;�劔9烱mェH!$゙YOゥ△gア>.>ヒ古:ク6.=又AユbD庄ソロ創タキoレ78ケカE貞8|d9*ヤソn彭SソケユホWル=C_oカタ珠�戯^>_スピ攴w '帚Gレgn軋ォォGCテッ~ォGle0?Y凄妄?ワ貨q4~ h=★第「q腦ッラ゙)Y9タ穫ウv勾[ュkpンル L∀ムロj +繊むオリ思MネG 依茗=ヘ鱆=<ケFサォレホスラ4颱ッ C更)3ヤr儔a。ヌァ<晄3ヘハシzハラpo5�k5ュ(サメヲルzw];AK`<aィ"セ,」W&ノフ1。ト ハ鑿鴦/禝 ) ナ3ナiヤホィネg@^ハクゥ�陸E關セハ\ス嘆ッP紙ノKeVwO嵒f2Ok>�ァ桀ト、ミヤYッEンjヤヒリLヨM|ハェRリ裏ZMAマャW Qヨ仂 。! 梳サハメャ82{呀8欠イフZォh;チ"kV$mャャ溽V耋&|K/P8サ*)8ミ<管iゥJラHZ3ラ'ィモu鈴チチ =\「nS審裂=ミ=メ(e[V帥)‘イlオ)κ#.#ォコ素>。豫」フ。2[rΝ゙0B;[J*モ^ェl#"ha蕗-]サツス'{ロmチeケdJユヒワア,hZW峯0g裾vオチ配� ヨA^ネ躅シヘ,V単ソァk'スB偉,キモ-t eノノ 穃儖.痛゙桓ネB励皰h楫TgFサ1カ姆cnQ#S=モ1愍測報q亡p [.ノウ・gヤィx 5ァ`.「$ヒィTタW雪 jマ^A T_拱xv_テ「跖%^B9髭qf゙ハ2d雀」N-仝&0mルォd雌pcTqI隍#_タ「p善゙(zC$!ムQエ+スD 直V髑O)#+ペィ|Gob&hg_ユシk陜F廢n許運广eコメヌ#ネAラq\撃テナls<武ュw畦Y ‥Wー・ト*ェ9ノKA #�ッ WSK+b幔ェ4�wイrヤツ)|Ioeヨ\諛rjFf萱濺ーア摶゙峽B粋+AI*l3Yサマヤ +ZDacオ蜊モ2F烋チzケxtPヌGモD讒杉笹カ胝|fK榾ハ較>{�ナO擣,Jフ萢B{ワSa濃F篇ミコ゚ pワネョフn 燒壞lyチ�:2оJ/ハ + USル「、鞏т+淒SbTヲリu`ヨ 鮨l0桷ツ。係ネ+鱧BАJew紵)x翅焉rlマL&tqXソ」cミbKJvヘトナ 9ゥア阨\シT^ΚE\債エ#) 0クQ"マハャ蠖"ェ`L + 1チ浜臘x.Hタ酘ヨq(Y掖喊イ巣ヌ*レサ愆/U蠻影綿JハdcョBFA'h�ム痰湿撞VMュ・物{ィTむカチ^BxGヤ0a,^侶ツエpノい!罹4+ク20 (レEp|t(繼6`ヌ-(@ネ7ヌK投曖巷yt"杣0$oチ]X ャ!9D装o娠;カーQ%I!iヒ嘯<ヲE}4チツタL勢狢;(j%x促審U>2マッp淇>\Xo]垓h匸yC +ト●pーメoD #ナャ=ィヤy5q洞ー@3%ニq@ケPg JHモ>ルタPヒzcヒYレ QD3^%ャwイaO G゙ャM蒔~ェDmシュラネ帷テ{ロ縞9・Pカ酷」 ゥ0Yォ5ワ(,)7カF-&3_瓜YYGルTネzUクLK#?4t俳FユBTe)」ソ垠靡カjYmネdOC4ュェ<ア0t5E#ィd8Y;i繪廷芳フV廖ヨヒメrゥミケqリ2Q0Vr@ィ+GvS4ナ瓜 }!+ヒTX-f5ィ�毎FI「FDサ蛮Jトカ#雀ノ」積フ+ィャユ」禮/レゥiYィfm?テェPv雄:ー *f廓暑ヘ@ヤ3Fo2クP&ヌツ&ェ:O5「xkITフ躡k&ヨI+澡弉hキ0(票^ト+エゥロウ#レコ7ノ +ケカTs(1Uャ^アB jヨ+(W85盖�ヨ'殲<oユ泯糟S摩蟆裨$┏・フオS造V。Lヨ瓰w棧ソウヨ#ト~ 0iIサa>。廏魅Pロf�潔レo3ラ.(0SXャ�VMナDazUウ*袴uo貌オ゙+鯨ル氏q゚6ョUA`pキ心~"シ[/mチbチュイヤ聾b^4Pラ+RUオ�レrBオz0xエ$霸:Nホ +トIユモ4オ.鳴冀・ヲ\ト +)靜K゚)册タQMャャl>�lz・'x[I"クaOme+ヒナヨIチ-休Z砺汲! G畆琺ケル.゜ムネS-魘ツ舜V$ゥ ネュdgム、ニ0R+Sアサ」,�膠[aワvスロリャfテオロq^ミヘVヲSヲ暮煕!ラ拮畔チ界�-「ニ慱*=�p*3ッコyrフ:Mリヨル嚏Y崟@7jqツ'QIキ0イ括Zヲャス駑5鯛7喃Z=モ{]�隼Tォ2oマ゙ +潼EGカルノP(*cT% =XD+ツ儺セ]! 」g>(hエFd-゙カ;サ&オ5]」サNBハ「瀞?ツ#AsuカVヒhゥサNヒ- ) レzッムマe9uR・*^岶<k鞆71ヌPル5u0t8V苞T}ア0ォ*E$K!Tュ凰イ/タVェga+9ュA<}(;K?`テ 54畴k討キオ:襠チオZ祉64媼=c。肚Tlヒpァ臆-モ*gチナ愆イLQツY〉 hケ嚀献フシ茯GナkL{tツニ2U]Njh=O讐; Vセre8ワレ#タヲ0%簪絨|ヲラ?Wル放#]ヨN"ェYEユl →βU+マレャSWdc沈ン 剳?j[)ン墻ヲ峽Nエ(アミHT卸ツュ. .-U\ュT -9カ 融ュxL +尠r8x-#&J:Z +ヲサY跡朞Q鯏1ャW屶ヲu#。 +jJュ艤ミ&-xハ・カムRfQ ;0ウユoJミ啌ワ稾レヤ&rVロJZQ蕀゙繋スコ唆qモワ?タf哭R1ェW[鋤|] メ-6k/6ワ%'V陦ォ +モ"}q8ーjリOtスモ}フ6OOスヨシ- Gオnウyh,Eオ,。p)イSノゥ'ヤコ)ヘ(ィ茯i。ウ匪ヤp6゙く、メョN 2得^m」フ6P;q#Nゥ*cル物A馨AーJ羃ナ&キh朴ウ迄ョホ廨23ォZ侃tDF V 襾迦9ウ zス�ライマ,ソキ'KkB裏7[ァ弧ハsU胝ーYA!P怛^マyNヨ=キ8揉ロ3堀uサi脇勗清゙ヘクI湟>ユ「qフOユシイ`T0ツヨゥマレホ'H}3otォ゚O・ナフZチN槹フ榜_鴬ヤG顕Mv4瓱D0[-]-vLマィイッVKi 4Vァニ)ォyヲ}カ-hPァ尿モx(|Zユ酲([ュ脛ヤd、.埒#遘k「D�n6DTサワ uxル\7イスチ1テヘュp};サc。ァBメpュ�ーッ\T衵0ィCミ C喰}`ケ'):・8ラ=s9 ワmミリ済ァ亟。春ンユZオzヤチ早sp兄ホjヒa屆-(ィァ結ュVKトV畋7KMル +VUWチロタFヘf、ッッフKタ_ヤ3[5カ'欅咽Eル@ウ銑ス。!CGwレシ┏マキュモッョ゚jテ禳i。嫐モ*ヌV゚D5睦ヲ譽ネ伍}reQw0#lサ*r兄Rqーz~櫃/saV買ハ横aヒ+藩k)~」^@Uワチラ )x ^ -ツツ|「sレ勲マゥサ7jVスコjラ榲Aナ).Vp%'S$ャ h ヨbp゚ ケ:套:マネYCハ %Й。vT秩Wヌpロ砦&R+祈[(�D「ヤI醉嘉g蛭ΟJCム岨ャ征(C」<マmr'|サVシwFeUャタ-Y-ゥQマク TQ^n)geォ.gDDヘ'チFZツB@+�ム'SA)!ウ?{タeS墫チツソ2ャンCヌ8v!,H"ウZホォ  +*0ヨ qォニオク、eメシv「PK「~・E週ォ糞gツクgn 吋甲ネT[セ?DヨC~」a5旺 ネhカキ妥Lテs「aL]暫=モ +(ェNTヘ(跏e燔*フキTユヒォ。タgR滷j・S瓩jウフャホぜ(OKgY8ロア$ヒ0@V)/r狂ク+ヲゥ 」,ムzーネェァソ#Kユ%蠱S覯ミH6+@「4&ト批;粹襠^綰yッコSz6綢<zタagチP/t+タ) レpzgl3比h。チJセ ラ.ネムクUIjヨ「>ル*fト 秀鏝v~黽Pィゥュソロtュオソ{'ヒマ 脱"マ*,IDリョ肩モvフVfN 權~P瓱CM 「眤ワツウy)ィ濫&!kワ([)�GWs沁ネHNuミ囘8麁oBR!#ヲ�シ萬PD花h邸Eヒ藾M$。58匳.訝bト噐,!;ロォイ╂ラPX\Z2iリ(oDカGン8垰゙S痰ーエフ「゙?'゚チ|秤ォD;Hヤセムp+E沌ハTミ冪ュ(Lレェ^エ剪ェ"_゙A:ワ饕tQィ'MH,「朶ナッ隶`F錐。aャ狢:7a"ト!bムBNPヒHルェ;タG)クYレ.Xノ「襦 A縢tコqフ、、uhヨオzdT|.皷+フ=-; ゙`゚A圓'πネ閧Btテユcリキwー穣h,�Rネ真�d續58E:WMヒzネム[{アト"錘'{」8"jャ廳>xを+aZ^ィ Tm「。21ム1.寒ハlBCムVヒヤ迩リ゚・瓣zウ4F宋x」ミ=餠」zェnXzヲ_>G/ソ/lセヌ$=?、ョXJIpKd黝0M!ユ\RF/vチ%ワネ(谺^゚Yy「c、ターョシ-6ルシリpッR eヘキ4<[2コ#せX怏ネ ー�-5甓/ホPg=蘚&jd3-,Tfタハaン7fコy2ッ没P,h 'リV駆シイヒウ/@a斬+5dウ ~Q代ヤ。ラJ65レ皃` jムナcョ_g'yOu晤。QMW5ソh螂ゥチGM=Hヲj[,丘ス蛻%ラ%Vホゥ@エ游K-。ネエzト犁Qリo<dマフ@シ3[s濡 ソUキ`Dホ4ソhnUナi^1弭ナgヌdDョヘFユt[&コ渕緬サ・=ョ9gオス レ\c檐E・ェミゥ:Sサ}7恪ム鸞ヲヒ諜1kキi +上ョ⇒"闌Tヤgカ殀隱j-フvタn毋K`HトU僣'実密ィケ4コ2ッ別N"gェ「cネ'カC`リo4^Mdmf 里怖許tナIスM,ル 兩フ3ヒd +・)凩F3\欝6vハ']墾Q\U^i0 8r屏キカク枝f5モノp゙%uO#r)�伊1ッmhイヨvk奢aYモ-z:\ワス}wnシw゙裔ンcJ郷 (ク模'5浦みキDd.Sケ\ソョ鰈譱ン]「|ヲ゚ッマ-ラkムCzゲュナ%6ァSス(ッ/僵{FZmbヲ侫ヒiオ{YUュ リOオー>Tミフ亟リフハル�ntオ答9: 1KX^{リW%300Iヒゥ茖ノ)Zテ拝ンB<QッP儁ヒナ ァ「Leツナt8V*t(冒泯ハ横ニセf%\Rミaヤェg*O2ル刧Xモ貯レ3トP \9H ΛヌyH鵝5・オLBz&掣$フ篳屠Eヘ=&(ァ芥V(/蚣オЪ, Yャ:jオィモト4ッXフツヨS'フ E<[[=9jャテ62ALテu2k $カヨL9ィ季sユgウタ禦オエ)タ:6 翦[Dズt;サ8yp愾シkネレ[rミ|ハoシ~qoワ}Hョ。ァ扮Oシニュヒ;7蓆セキルW^???0窓~鉋暦゙ス゚栲紊?/タA}4タヌ キy!乙-諛嫌ノ"瓣AU・3ォワ +G/ウ$1ォチ@1# ユワiVTム2ノ ヨョ1EタFyミ"C犖C>8檀ヒキ#ツWZヘbb鏃スハ減\タ軽 L ナ'<ヌYマ#hュ阨イ'シ8ー.ェmiか、pツリ揶cァS.煥rェkメ4朷ャゥィ<・k「樮IRF靫 ウkネミユタuU<‖唏リC昼Sェク2}! 3Yャzョ>ロ) +<!Pdンワrュ除M3ウQYモh/6ヲ八 ケゥkz-]$ト澤楾STエ誚き h4凉チY,X熨[ツテ!ツ トム摂「アE貲4xfフタpLー,4{Qホシuカ`ァ+#*0Qモネ彎C$1ホ_?anィカ,剰ト廏]礇囘AJ31I總朮刷案讀T1ナ�ゥf5翼?| uスュクャェ7RK&」(ト2Br鏥 4z;nB チェM<ェヲ�a,゚6ョサ,gnッ z2haメ|フb$Uァ、vFメR 澗 +5y〒ラ朴uレXルタ薗V0 +8%アo4/D!「u蒜ユュ'2;Cjム位ィラH=ユHQ1YtワDョ,國莵リ�「)A; +vdZg* |-キ2!7ネ~ケ蠑Sメ' ャstpeYリオ*~リリフ#;j"ッ`$N)/ZthMGケHリチ6櫞zハ'Ы瘡涅リ(bトャAKフi卷跖eト#ミユR古ァざトK;打KRァォ+レG@^0カGLfm。Eユノ勁�>虹置'杼ホX&モZ。P|028#ケ_徼+ラゥ^,徂゙:g5'ォヤH恍ナフーロト禿R珸シ8D[bヘAY#n^v2qJ゚ヒ佰レbるィレュ6Dス%ヌセ_ヘF材翫」∋インェ[ロ)"8wtbDB\チキF^ユAテツアユ.゙%uV8o`Iヨ{g5)メi。x&D;zーa眷堺ネ恚J捲:q`oaェキ"Xタツ'zVrレdLqekG"シI+ケ7$dO +奥?ク WpDメ'+I>。 #3ユ ュヒH/Z2突%2ァ .ョ゙ヘIS!Tレ2ウモセ @&|gゥオア`杵 カ士Q3y。l~P;賣'ェハ r「ャ謇PZdネ 褥オ(rコ)岨Xアロ嫣Opキ+)ハIヘゥ夘iMミヨ(須ヌA澆゙鍛)-0化_ァノ +E-mミー。N0D 壁テi匙ユ!遞傳 !i畠c=h6ヘヤ�FUgR8」炎^m_bカトC、業=ョ0ヒ<E?Nゥ煎リケホリyHrヲ瘻ナツタgp +ユ8ルQUrィモOヲ゚&モ'<.コ%) a^ oミ券9gゥ>クノ 莪dォヲルDnャンミムmキタタ2ェネ*F gm ャ「HAv6≫AテョhヨeヌリπxムゥネシDQ#eア桶?オタナ剿-ユ*$:sォメスッ'ナYマBxmチヨ lァ、1`ォFョR┐x.ユヤJ +g*鴪XKト 軼!ナ!ユ_(ZZN$「N菓 �ィ 珂Cム痾ァD({オ」6 4セZj-タロyハセvヘrFT枴--チ飴ェoH・ +ル「フ2J/ch;t蠣=?T +Ip來ツ6Kミヒ2エ;pム.鐙4゙)踟欹+EL剪${ッZ!ァ L V亡ハSBF壟箕T軣枴 +レ)&ム缺ィjマc゙HハNヒ2Eョ0、`ヘ}嚶ヨフア゚ ァg」゚Lオoガタィg椰(&ュJ紀 'xs愀塑Bq>El QhルSjNヨル$ロEYロ拮ニ<i=ネVノXtメシ恬、nF`Nゥ廴籾髴ヒ/ュ|BーfPT4"G@ソエtrFvdGZDシ「エャ劑*JhQElk拇y9殖ナーェル`鏗{ヌ 。ニ X01ォ目イWR┰!`d法スム[lF+ナj +2N 及販 ナMクタナェ凾抔O(ウiッ2購?@ァャYE>eLゥオYロァホR8ィイ;す+*Kd陛L典ムヌ8 <聊/zュ"E ミタウレ朗装*3倖ヲ/ラ"沃)A4 Nエラ貫「コ梠~、n、レ~エ +材ナ5vRャ3寒」kッXuセェニノ睨3ススヤ&b +);%mニQ谺ラ_'ヌk曳_Jィ ウムァlソ;炙トゥZ*ャレakコ#1し$5ゥリ6.MPヌチ、、s。ム蓄ヤb+lN 、g0�;kヲ&[潮ツ %・D85ヘ読彿。'佛クィы +Lh劍エォ9ZミェRbィzミx�lY」覘。ォvホウ*ィpウ4a兄Xリ42�囿」~涜IB^汚ゥF2`m5ゥサ{ロ8ユ・D>巌マfソZ{ツヤーbツ嶽,tnh脳0d ッィラオリネロ4ヌ&ス乙z ヒ~ +l+トAゥ +)t +oj,M`%ユフ最ンッYGgvチュルzCウツxv?ャヨヤタa1ョ嚏エ|ミ:U#b3ョ%=kbュィ、X頏エナ*&zDシ斂TPK・ッX|レ・完y2"ェ+vS椦pjセYンホnjホャメ淤/fw蓑Lタ1 j取フ鑾・*ル咳(匚0 |z鑾チフk。>ィ鋤琶HMサd]M妣2$}蕗ネ似Ziタフ」ソ「寮6YP[嵌:!Zマ])H>樽Aェ渕錢囀蚪談jヲッゥ>0ホA走$0コ5Y/ucメ[湫9マt樊ョァU帋8ィウセ嗅>Pー=憶qミ,$ヒ8ィ」セケ蜩r6マ0yヨ)pモcx「「ラ^0ケ謫ル鬱レ(テ暎ーナャ髴ソ>シシアO逶oャ愴トP(yW靆>*カ歴;ソ}ホ22砕S37砌キ/U豁裃_゙]^<<y襄wソwyx゙;|晤゚ソシj'シvヨュ已ゾ{7/ノ゚ケ{ヨktク瞞゚e?「G侘w農ロス磑苺ヘ7ワヌネタ掌o蔡($?ァFz陥9フモ|C゙+;b[Pタラ|]攴~@ed<_醯リ詞ヌIF(qル虍_>dエe 剴嶌>剴�&ロォ7栽{A円y +ヒマヒネハ」s互ァ0ルpgYウ 翕ケ魴WgJrLV4)沱:^Eマョ?セz't,ヤ餓$ヤ- Tョ|x+シq諠キ.ヘノ釟[dzw゚ソCワx醉ラシィ|ヒJ<遏;N(Eiオ/蝓'M8/?靤「ィ鈎yタNツ2>『k1オZア9 ソロq`+K<?aDz1臺FレhォB「頌ァ忠ァ?xミハイチスvhナゥォシv噛1ニ!モwa⊂ヲl+jRzゥウ /漲Ч姓祕?マAxユO''イYI^謠yシaSエ歙ヤfl咸ネ~?~隸ネ~jKヒカqォs゚uノ摸ヘyメコ?]"懾/イko=ムュヒ'ッ}ホン゙/「蝶ィ(}ソ-$ンkッ脅チekラ,wヒ7oノZオョ゚シsミェオ_ウGアhΡス}チヘン_x磆|/シqチヘ蟻wワx貪ァy7Nッスyテ#_%.毯ク「|qTm『~胄箘h7G}フxミ44ア;線ネ:_Zキ:ア+k�マノテ嵋タクロ俄$摩贄レa掵覽距~縣rxeエ゚8pメ/マセテフ齷24}ンw\>|宝煎m諦葮庠母襌K」Kムラシh欧BC +セ=トソ =ヒO-蛙pネs撥?ノ^セ;n"gウ[F_シ玻ュ?メ__戦NカミM汝縊coE2bョM.oVンヌリ':?カ,](x%゙m弾}ヒ>dマ描A .z7\~驛ヒ;_ソq艨! }型-Dtuレ:影レY}|Ar淌gN#嬲マ:~evリMOレ;EK"Z>#>蝿X'琅オ/蠻タw淑|ZW_{ゥン|、v~6エ8「ケ6Ex諌KュュレAシT椒酢rサ喟c=鞅禰ホSG鱧ノ擧~ゥ%=オ畍PC|rササ_[ナモトハッ巫サWォヌt/ッユユ罅~wP゚コy゙ュョ@ュ?ラ溘UヤcヒwJイト孩~坩!塒2ャヌ゙ソ; ママ瀕「}ケO}?セ7ケコ_8サ、z璽vル゚スwxス7ノVヤ迸`溺= シァn±スンc/ リ頷r癜゙ア9sy!{キ阜」ロ3w]ソ�,M r脣ャ\タョ゚シ\`<ォケア%ホイ.nン要>林ラチ�゙ュッ靖ν7゚:」《ォタ]メサ(аメ゚サ.RF゙セシタ「>sサ3Ph刧ユユ」Aァ/ル迯?q /$~Unエ[j@�ハアr 繙cヤm�eE_~ヌ?ム疚ラ猖マ)゚z賃゚ チ[侖マ駟E躯Rp|ナ:竦�゙酉「篁'眼{ラキ>メ9エ Oキoンシ ,.p゚}ミ$袁ンyxW゙&Lムワg'ニコヲ皹_ッユAモEソ孃ス氾79yア)yナコ|オ'ヲ゚゚Nw榁蚋崋酊 ^ xレヘA揖ヤ、16:Aモ浄 K鏝Tツ榔c゙#+剏シ類チ-゚ヒォG跛?w畆/y逋ヨレンg襭暾ラ<xロOヨワcOハiH「ョ、*wOォ嗹<l゚キ,R=チナ[熔ソ褄ョG/゚ス%Fヨキ惡ヘ o^゙ソ勉rOq」/^~・Vゥ ヲ゚サy醢サ7キ~kュユ鞜゙Oキノ/ンセ&チア チ綾~鄰ラワク{謠/w漱ュ3,=ソy邊。嗣コkwンシ0ラ8゚ム/ソスzマ^靠3eヨヒ?サH'.欅Z。n 蕕桴 )0カ,Fモ'/俄%Q|懷髴/祗珂ユQR^風U。トDア2ヤゥツfーぼK懐9セ曝/俄・ト\イw~Ifxホn_ci飩ユ柢テfR卷J(mXシ囮s}^/絳つィF跳シk9ユRTwャ垂め%SyノT>L裹]ソマゥト沸ミ7 L%ー瑩ァフT椡w(蹕?ソ サ?ZJ畜劑iF<ァq_ナセLF=?cコモム B:イチk!Nム拯ム.Dtユヘアセリトツマq扨ルユルユ也hヲミt耗痛}哭ソソシz/マ~v~u陝矗テ酲算゚`キ゚kw゚ケシ猖}6磬=ロe配ョユN豼モコノw_>ヲx毬Nbo[潟融ロァヌミXッKwn,ユZ?イ蓁嫦>|xノmxSフ。ウルウ=$ホ傑テ<9+3サ鑠PマセzウォGwァ゚ウタ歙=ロセハuヌ'リノ{ +x裲roS}膾o#ヒ')ヨ_=、娚 タ絹yュ=綯ヌゥL靱ラッ}ロ_=p庄。}`*ヘェリl#イ「r榧-EエX_yx_/X0碌uJ\リ?ハヘD3:a%g,舞?~裃アe゚ウeケ"'Mョ5ヤ@「ゥス-c&nニoォGヨ>タ'エs(>畴゙慴~ョー4烈)イMタF1kYエユ8_&9 sf+アフ爵ノHwョ スQ0|サz\=Oゥ鳳A匍Cャ 1ヌ2アテ、焚カュソ默疚_ロ_乂テW衂カ_sネ3"「*ス鮓[ノ1/ロ?)ラl弑|ロ_k絃6!G拗Qラケb0MVキ'ヨ@/E7|アr辞/f,ィ樓D慫!F+禁k&ォリ=|*甦Xュ飯リ カ"菠TR徇ンモァ;ホN^ルョw.逢績j=]" ルSマzSリ裟K>コタ搏Eコ9)越ォe\=aK~イOュラ咨4ア9$FF%Sゥフ\dソu4ィhMワ&w楢トモ印<aナ`}Eァ釟~カ0F2ナ虫~Qミ舖ー繻ョ3vD敦\Gヌ<~M?R符W: ラハn>鞅&/0X& hZハ%ヤ遥干゙セ6s7;ュa鋲ヨメ{5;")″「Kウコ{4|ーッア菰QJャdネ?wンホイ ;廢ホX苜s:ネс トパ゚ス.-浮・「HS塚"]イ]%Jヲィsセgfw∂ナb槧」oユナ8;ロ3モモンモンモ=mv兢ィ、ッヘa5ロ,0イB_陟\85Sハ<ЩXp]~徊ヲ靂チ"rl $]v;「7サヘ"�:qXM鳴嚶コ;ロIァエ袷ホI^キ[陰「埆オW)r」ヒLエ噐ク +-ソ エユEンツゎ┷;チ:]HL巨sヘb?焚FA.キスQ+ヂ,厥eGカ「,kル擴ツ"ハ; 9dァdN/vB威x 闇B桴y┷フ疏%й$ネ/VHyxV;フnタトB[毛%"AA`,ヲwfァ-E4筝W擴ニ)C-U-h」$カwレ�Wユツrサvキュュ wタ"Uネヌ′xR[調ホリAレHエ箍ミ< ークム6PoオK|B「抖=`ムャ!卵モヲィH:;レエ6D=@<アセN+)mHA ゥ9PスK+}ヌオ殼 N'D ユR'クマiu審ミナ,OY8闢|hp ネpンm'ヤ!"ムe3緝Kメタjsサ乖=?V/4ヤレN0)逗lf;チ.Qンi!;饗;Nャsメ陲ヌzBンA、6ァモ砦ゥレミ鞭m'吽咳ミ8%タュ',クユーム@ヘーpチヲ@舛cカQc=]ヲ +kウ-tbpリゥ}ルz 6'$1サ フ +ィ。ァユ{センBH�モy゙オムX\f レサZ\HcオC +%xС(m シV芳aホd礑コオモo|ch4モろャF]Z?、_ミュ閊ユ゙=w鰥マo~ヌ*Tv{4 ル\詠カtァ}??7,Lr}"キ@コ粳e蜉モZ」暦ヒ8轉菜dユネphヘフ/ナ繰BS 澱蜀螫。カ、XメU�W紿6Y(am。賠ホKtタウVЪ\ヘLh病ヌa}u'イAュ、RdEコ瓊ヒ%Xラ=ュV7。ォヘh?キ价~T#サォ6B*テ/荳ノ/用'ィlhp6!4W青Zbル_.:ホサ淌卦Hー-ケ!b莽、アKハ、屯wミUj:タ伝:`ァvサ蔚q8ュ.Bノヘコ砲w゙冒jB& +(ォv"宛甦融点.癬4t3ワ.噌7;-樂$鉈BモC_┫「y +,'ホIコ<テrJdjリ_クg%|ワbテ擘B隍フ_ハー9Y壻主8~ロ'シノA?ku,3古0n'tE7ey罕sレ/a+а畏ミ Pp褞!ッEタ綢イ?p9Hマ挙イIモ$クュA リfァンAjェ' レLムi3Lカv�7キル豌相ョ豆 %ホ 鯰トb蒿{、\弦ヤ厂ヘョ+Sョ?タ蘯]♭コ;zj/ミ幢f +=文フ8葵f +チwーモgセ/モ゚/゚塔;.リo胥FSx}エ 渤ャtス[h"ソメVサ_ミカ鴫ワヨヌ"゚ 蔭オMャa\%ネ?UrIc帋q5^bCVu・~」ぐ G:M^Ew嬶x7'nミ 殊チ?pセvパOチ: 6ン(6橈祥< #^w{ーk「ユタ歙ヤ裙rシ+訌ャDKjd!<yiヲ「ァFNモソD]チ+閃オ|ク昆>Oqmナp咥 隸+>Q/ォ21�4稠?ウCO-ヤ估ソb&^帖j +%$.Yエ:ィ創トA BヤJ ミモシ゚nャV蛞Ob埃lエノiSwyn;ヘi\髣ーy)詞ヤ」A臟~Q茣Xo僅2ンm纂チヲfル?契 ,Bチh~ルキ聨ヒ~セ:.i束k`>卸0 9h 9桓ワw脉0ヲ@」ヲ`キリ,.^X@* 萌アMaィ藥dロン禄;ンt ゙貿レ�ョ6・ 瀚ロモ�Bイ杙R<ッソ+'<Wワ桜聨w纓テK|4?襞@メャッ簪キ_?ナπ%゚! 'R杓瞭ニトョチZ#閾3sZホaェp.~v"ED/1 、纖<lフ7 +ヌテミ」; 翼ヒラモc:~)nカI尹ワ+ァLjケ `Zサ炬/・/ト獗Z g乕GQナaヤSq8Wョスサス遊o゙サ屋ム゚<ヨ'* Gイg茅チ;ウ�$$倔:隴櫂、ホqスY >ソ%リ,,コ>7ェ蜩チルg/j]轗ー!ォ+禾=゚映uリWLナpzテーYj%ル/=>ャiオ~ :ト偵//*ー獺ッヘPタ・ノマ~購綫1烈?tY MVR蝗賺#xWナ%j・ッユ6コン邨Yヘニ餃減8オユホ %*Yフラヲス(.桧X%ラユ鵈 f:?ェァsイtヲ1リ6O+ャ.゚5リ楕ォl悉8#タ"aロeナラ、ナ木V}>iBG濺セ 6fミ�スッ牝q而yサ鵁�エ"゙ァcbfwホ?x+ェ$;E瘉ムWlリネ?dセnケ(畆ス>Iz_9 ッ゚z徳ijフソ謫岷聨イ?躰。キ5湍%z嶷ケッチ~{}sフイeJ_h6ロテ|Eコ]ニ悟_V紊ヤ?チqネィ:1Gk 2レap#iD悶jチ3xeh」 7ゥnカエァB緩蘿ミ_棉ロ縒:リア椪粐xキ゚紗Iur7「肄イB?ホ舅帽n6;「KFチs遼鱠js<,鉈ヒa=ルRmカアGテワ"廸揖黴,g梺ツムホ;菰f7qウNムLX普Qz筐ユ 。リ゚ゞイq?w]ワヘ干l x梅メG8」i|5所サ Txウ錬湲イ1g|-ルモッ曰BEdハx呟�~s嫗 州tカiク・c躍ヌU┸dYx4噪'ー<3P9ユヨモ"_DBーW犒8フ%a餠カRWO/iラA#0/yv楹!=ヘタjqB ヒ蕀\レf逎nヤ24栓zJヘ賻b7ッマヌ?幢p| :D9 8?」。。カ瘟ホ オ懸弁m~qルlララミ?$」癲*$a,「-'スゥヘrレx焼mmヨオ=Ow┏、耒箍傚�{ヒN4gw!/ミPヘシ4・ts<aUゥ)ルN<讎l/P4セ菷゚漉ツA・*# +ib,ツミk;酸」スメ|7Fタ|?Ι造 ア儒+\Vウ肚�Np +ミゥU4廣r6zテ鮴P&�N0E �.l"0q「6"x伶与照゚'貊ュ>uハ惴リ.+聶f=コqスN}^,燐imBmシD6 +エ・b6゚購[ネVス/ 烈ヒpマBソル懇@>So悒鵺8�*ab@裡<?ゥ0ホs」 +@2|7玲ス�Mシu]4ャ゚轢カJ「潮誑/畠耽ァ縹 ョx&7ェtgojャO闃ァ +菱 ワ~┸ソP<.゚Inr`。) 逃ヒソ耽良|ム{紕7-ミ]ーカウ 俸C)メ襪Xリqサm21楽{煙g'#ィ@'>et斃Fョチオ}i羣杲o}マv轆V=ラ搾拓ウf搾匯Vハk、+ーー'ム{ス5マイ1クVh シtq#ハ[ホザrワ慢W^イqッ聞(桓%凋,Mo匯、盞用ヲ溷レKワト゚彜ヨcB漢]hイY屡;ハ J/ーモツk9B=戳モ?シ蕘CNaNoモ弍G屐q恕゙ク゚ウ拭{フp3ーz#%K3_蓆%コル0�}=bu1L「mシコCЖ+,Fnlイラスrケ.D u檮俟/LS畸フgレ/`v8晰ヨンpヘ便9S3z49{旺イUンシP恣ソンー &レN,lウwq鑪VBpエ-f3qサ塲ワカXm濱利-/盒P:モu"マ$ }&ァワコv霞。僥IオイフP+ルM 、ラョBレ痞ュェ''#]ンDM@wS斷3#t=モフjZ`iヌキaフ/Vト」 6セ3「8、mッb裁mDqx#碵廉詬vシフラネャ?\男マ(6斫ゥL泝〈 zラ_OYコh/猟ュ櫛v�ヲク`*Pfサ1佶~ キn9ワ,'チ、セL`キァ坦n +]槇郁フf真O6/gGUp孫(8h8チ1ネネサー4肢エ64モ゙, セFカ?洸yg;Zヌヒオ錢mG「チマァ7クヨ~サン堆{mネ゙Iw廐苻cキ」ナツ=xZムCフ.セVH2.ヌ-2ズf$リrwfカ カ%篩H悒Tム?!.Q#rゥャラ +~テ__アメ@リkコ仗~ネツ%」モイオa‰c5サ ヤ +ナツ挙ムx?洌i 巨p!lBQCtレ$「]?VュhqニX射Y/wニウナpウメ�ウ6[樢 ツ、wZ8[Fニベ佃b7怙掫カルH2Oォ-卩*D ィラゥQ煽ネ6゚]ルリュPン +ヨユv゚ マq?ワ.?ヒ*「ヘpス"bミ�LZホ*マセメ5ロx ロ 迎;]-後5<オレS嵐^・\ヤ恊゙gニ シッムツ-マaS 。ナ忍ワタテヤ+mサヘJィ(ヘ.p・t( 「Sh ;-ー購ツh@メ6/戀啄wW$7jス{誄D4>ミー|ュ菟チノ`-ナムfサ嬪.シケf縲祟+ラzチDOGp<イ7覬+Xスq=樢マキ4イ'xロュg- ki"95n1レg}件ー臑 ニvB'4f+'領~kd弖jョVサ+ォレツラrハnノモ灼マ!5\ynGDシキ\ホトh�C! 仏畴;0ィチ^`ナQτ2シッ$ヘヴヨ6Qオgnシュ&ヌP@6、Oノスモ_ッゥォ'ク Zヤ齲ン0\ムエ&uヲソッI'シL|鉅閑カ +M絣#AhwムOケレP甘ユV3ュ礦0サf5Z&Dコa!BLモ并'猊8カ「&N{;LスHウク骼ルX?^ヌ;Xケ&ィ+_T*贇_省[u ^でタス」`ソト解゙ワレヨセnスDツjカ搶]タホ#(qj零否般ウ0E謾#\襖モ.{l ル>ト0,~t3ヨ +ャ1S!褻&茅?R吩e9ォテv SレR蜷ァ:ク迚|GW。u%繁ワヌト0ヘG テエ*)ゥ3R可eマナ ?ス`孟ョ6/Y ;;モ%「(ゥ+ 酷h<ハ|nユ;_E・B?テt「ォヒ? D肚ロミムマーォdン/j) サ粥M繚?ォERe チw-l$-'妓+ヲoヌ」}ユ「∠cニイaセフ鑛":゙}チ5モ|ゥ癡>pロ#黙`~「ケクチネユy":鵁tシ9カウ階セリ1lエ謔Zkトd(ォ_{E"ムZ�ョユ曁@y舟T)E,{エvハ2ュBセ.,テf帽レ垤ト蔡」n.」r+゚捨|ィZo8f惑ォ算~「%妓寳匡]シ、=包�jdRg]シ モTeサ猾9ユV黶ォS閨'鶯yエND-然%雋カ_肴d、V宥Ae$n壷炬ヤニ餮W ,q螯ゥMFレ誌ネツ3メセZ鵠ホP ホ \レGハナWxオセDコ瀾d鞋漑鞣9:u\籃a?hZdイ.pリ9I ュ3柝EZG醺ムA「pョレclシ:縊泥$艙\亟斛ケz7ラX」ノ{モT!>タヌpカ%它朋ヤE メ{,=Jォ$簡2エエF没ナタ4'ヨn6di)zホmツ#6モE笆I2l゙t。ィjv股リトミカニ"|ス、トZhGLヲ10リd0(餌ア ミ.蛎チフ惨Jョ彦ロ礎壅ヲクオ鞍ムコ$ヌェ;,。゙ク テRレkヲ.ネ�iSbReヌλアWLnム 0ーョメ_ーレWy$ヲ.゚1MシイチエYッモ弗L_ヨ1C; f墅セ*0゙9ニャイウkフョe0^ヨナ懈゙sVフ擴・0O b゙ャ觚6弭 )`チコ喝ヨfhcX]ヨテ簗KソBXJアmc鯆Ve ヌ0耶+zリkPァチ開G+ ツsャ槻ロー゙ャa罘knqュ遏/レヘ末m」jラcホケm喙96rリ hリB鴬ー仏m +ニ$5l|aス%%ナメ」Tカ堺・ハL)Uマ5ゥ.ト・ス磴顔^ゥユ彑IRァ'#uスェヤRッgンT}4エk}I」ウrE夊fmメt'ス疲レゥざ0ハロ、蘰i-ュ鷆i pレ皈Tレォ`=饒z栞モ鮠�ャdロ師[t・A/Uヘ!天vr參慄4ACfィ8R2ウオ蜥ル彪變オeセD*セノbッ凾,Uチイ\c癡ロ%岻7ネZ2巷ヨqo・イ~アソ桃ァ封モ(drt&ロ+テSケエ慂U鏥ョ&grワ否アレJnセ艨敵cf<e 艙]テ./~yテ鍼ハロヲzQ゙ネ゙蜩|v&_|浄!iT`゙」_「P(岷9ィj+フッオツqセWe@チ'ErV)YソFQqC竃ミTt雷/ナ鑚P|>滑dクRb」セMゥZ繰J」rオUレ彝ッメS4ソ+CーZ「P&ャ2゚\ャ俵・゙ッ|+%ハ>>キ)ァcサrk膝Θ。R病ljェl参-yロェHvcS・ 舞ェリU沙zォgyユトムメゥVケtOuXр@ゥ~Lm愃嬲ロ甓?]u<疥ェ@*ェォ崖ンn鷁f婀/#クC}d・Ud<ヤ个コ「ニ厖4ヂィI~ナ圓q1メ43ム訥テ5@「ZコZEKァ5*゚eZG'・ ヲl mハ*kKハM_ロレ現レチイ゚ヨ.譚waモ{ラi4モ斜籘t゙杯急ンォ>カヤ5ヘ攬/ン+t毓猷w趨^ン摘縫U3l゙}bョ/ 2}ォSエ鼇ヨク~5X4 メuua0(:φcツッ_ Cv9ルカユムn cyf8N゚p」.7:買・14ロ^雇ココaャ轎rc?[K吏メ$ヘX}&Cケ<0ケF2サ)zLuMマチjzォeコ&@vモWア;タユーキヨd <h'フ。(テモX溌v| 5+メ龕Da6ソjLfE33ァx゙\ロ8-諱9コ1ッSナコE5[,~偏リト蘭lエロイ4オニ、NヒWNヲイjb雰ユaモ|X」恕オ闌dャキ<dフM]6i」K6モ!ェウ}N・-モメImMュ`キ艝ロ゙*゚ロu チn8・d4ェーラL閤h倪/スヨ鰔j#Aヒ喪$"ヲ乾ZョΗz鵁rキ年mロ誄コ5」リマ吊lモYXホムn」uGpoノ._*オue」幎-烋uヘウ。Oキャイク-緲ムQヨキR|誑悟゚]>スG;o<桷2+做エニウュg^ヌ$ +ッ<サワxmムdツ叫゙jャ弐庖ミヌ>\-ウBムマケッ8ヲ}}W[脯埔} チVヤミ4ラl韵ユ藝6cキノ.熄 :ラャ6霓蠱カュ2h0Dチタョ,lsナ`?。wロセ;d*$M。ーモェ +Uヤ +,4Z-カaャロY┓y8>jMテ絞cTg賓q落ォHv具"ンHRル:"j|ユZ」aK.ュ呵d成ヌ莽(,シc凾ム4f瞿#_央煤y<簫j箏6煮オォVBユワ'シヲ;:^ヤδa淨<メnpu妬ヘ+%ルQ ノ/拉猟ンルh*Vワ-RヘY<浸i燐エセ 、テヘgコ>絹?ンノ]Fsエシfc.Sゥホ:兀}ネェ ャュ[マテト 蒟心サvュ愾g羽ケ*ャヘヘ毓ォH4_ュヘ-マ{ユ9ァウラー#レーヒ^_Wセvャ`フ'シXギ・G}+セP-ウセャカ焦゙。{(a數ア腴l、・[ュ(J戮SV寢x9ht耶.Sーシzュe*ヲアイVI毀カキルV1i[WuUセjム」.Tァノヲヨeオネ{ヨS{ォЙオ]ユサィロサ~s=? 蓁eウ。欝lE#<旄o.エア祟Gェル,靫゙誥カtrg+ヨゥ Z掫躯 マ'o杠.Vユ{6oォク&n樌オYエ>m扱」既[サ=リ:Xヌィ(:゙WマS+Ur扨u鴈レYキスMコsァカヨ3ヨj^Zmvヘ咒CcK?「k筌~裨Aサ ユキPアメ?ヲ凶キ\,凜zqーモハCラ。.Q +{p溺GsT篏ムェョロ2ク}\ソEニヒィキ<アヲセ釘」y,&!ヤjアヲァ幹7ヨ;6ウ蒙゙Yムエェマ幕ンnnkkシRヘ>_ソ諤(モ泄カnケ擱 キr9Zヤca軛ケ/}談ル:塢+isX|遍ェkIdヨ*オ[オ辞フミ7zァーノ、ャ栽lm-xAカ-VzロヒH_ョ準ォ宅Kw俔8゙拳ョァu&ナト゚NN[6馭2;ネ嶌EE患ワ 4ウヘマRムEt嬶uo,メL卜,ニ/m n~j金゚71SxイSR7=;>(ウシGワA.w腋qy椀励03VAネFキ ハw擶畍yM}ニェ,"。]r5LラX&鰈ェ霈oワヒオTワ!jノ@゙蒂ェ|hw:qK゙・0ロl2゚ヌ>cS=.yサFmネァ゚Cャナ$Q┥9lG5ハ"モT)ルニ`A1」Q5ス*7j愕ツ縹Kb沱逸ヘ&Xnヲ{倬ル1ウノ耐・ェ!Qト&xfタ LtO懾メ{;\旆ロy:!゚"ム yニ.ヲW臧"Q d%>zclメi8。鰈L"ウCt諫33ミ。 ヘケッhg0艟エ;nタ7エ゙ー庵)W イ51ft(ワ殍ン0>エ琳ム勵鋏V・.ェf[-オ】F6カJソヘuInFlニM}輜.フサ儔dゥェ ;]ホU農p嚼73vセテ[ツ。j・鄂&`琵 メc>Aニ2:@婀5v6ャネ3恕`}ヘyソレG茂竓連+ァEモ>Y#ョwロ∝Kソ;dgtモユ凜w銃 ーオL(獎ハ熬シ;者)Yh4」nネ1S゚ァL`コキナtヤD「タメエ }ラ>岷マヘ」フメイ、6q] ラ[bチゥ氛モシ」マラ.ZノモシBトNE2ァtホ0ォeリhlCウc噌。6ヌ帙sョニ>uア)UcP+Rア^ \ 發|W-Vータoノタ;」キx#x<。唖Z况g`ョ・q里ャオ窺*ツ'�ロラ2oス!Y「姻フコzトヨフ$BサンャfAエB.|�匡ユ"w絡J貽騙ァD,,t6ィNト匁楹{タGp蔀&莚、疔誄シD%k%ixァセケテ珀ェ@枝軋6梹e8。Vn5ム劵>mlシロ駲ーyO!ミqBF.eフ移|蕚ャ1t ゙'ヤUZeテn$汕N2.ワムムェ'ヌ$#Kソq8菎妛ハャ1H`紕,ケP窟W%rOcs9Zvサ!ヲ?$キメ⊥ュレ^Yヲ姜tセ;エ4シ-Y:u桾wQョ�'5西:-Cu:m9fO9mミュツ撫Lフ4ォ*W嬖ィ^MqWゥ)Qtxシ}Bヌ6ョ゚シZJァ ヨ闔_Jェト ヒ>!包ェ淳Uクシワj鳫J*峙<モテルVe t魑ァ檐BUァイヘ}Uヘ-Cォ勲ツェ.c('= 6Cモ�2w=,eー梺ォ/; m-リD筒クセ:,ア孑]ター「ァ、p^チゥaーI5模ヲ _ワョAO畚ヲレ5ムシ)"ヒ nkN耘・ノ・オ鹹ワi/K[xV.賺(チヌ4>!<ォnネ檗テEメ2ヒ:衞テ +枹ニs璢オ釟゙>檮ョ籠モフ"oテ芫 Eネァ4ゥチヌ{璃ラ廳モテssタ歩櫻マ肴裂、゙^・タ競6M犹学,aニ榲ユシ畉o、 +ZZ葺/g-<Sワ領z競n鬲mnf:\モxp誰ヌュ�XI[朮3ナnヌnV聲ス;カマ疋a億イッ1コヘ ユKーL。郁Eス3、"ーk >Hテソユ�ハホTホナY-ネ�+4構x.?ヌア!ヨ|゚ヤ フ「’-ゥヲウユオhハ<0ウ堀マ}5ミ 鰐掉癶2ュZハ「1l3xfi(,ッ +Nサム8オトアyΤBouT&iミ倹�゙茴bオワqc_タウアメサY_ヌRト麋鮪*V>tcwエxvウ-エ池テ^ヒ妬lヒル-吟タ^Yュgラ艶ルシH*=0 +サレA楠ヌ陳苓ェレ/bコxス劼D、Nヌ4ゥハヨ2 r`G飮"ナ@馼ェュル セlト。[ァ譚Wuz゚r臆u!マ =-atHナrm2ク3nミOlアlヒF%メヒJ-\9、Wq]ホ、f>]&Bnナ乏ハハ垉澗#}ャ.D#ナモエb hpcホ&ャ昃aュvカ3藕fァ�ヨナ樓、テルF骰YMアH ケu レニ軟eヨスク4/鯵Kン s:k捍66)+ヲyPV+J+V偶]X囘ゥ壇/ハ苹B瞞 ・.$b沚^t0y'+ナZ3タI狹,6ppBェ鋲G「ク|ヘL「8fソ<ヘ b股ヘ(ヘフ。=ルSリヤ 溌ームTム勸5ヘ~ケVL<1tケ {cB「8 エSSォ _9やI筅 О)S: Q[L-g黄=ム鷽元Q0。リw,ルrN9キ燒、-K�-a6R゙ネ3シウ哦uQ凱jコ$>$bヘ(Np メヘzuヤMョョOケ璢+g「ロムハフナ「pッ\h}zケ鰡2然1贅Zスメア・与+DL3「怏}」ト搴�ルチlc徇6胆pヒロB攘1.川(ハチ +ウ薦^T」粭フウhゥv# ;?8RクgエZ窶Hヘッロタ~盥湶3!添}Sャサ5釦チz苦 yウ-)Pソgv!\I>チコw鳳 s欷タッ>Zニ`ムMGチルル]Bメユ}シキ5B゙毀Hs2XKゥwr,~ォオ~ t澪竕vネ +F2悧3a�せ廰@2ア咀Q勾ヤトスt`ツワ uKュ=遂iワkq奮[\ケハス隋$ +ァ Mq餉トo]ユム^Ba%ム譌;s/リ+#ゲ個h3萌tXレ「ェib%]+ ロッヘ<fjzC>Ucモlワワ塔Kニ、mタス%イ* ナ耻)ュo�ユ蛩\ァuLh;ヨ咒 )9茣/Wネモ嘴'ゥチ4臺&4P、ざ~ワエc-G +チヲンlw瀚``゙シアカ燭黻C無ノ珀,アl5/=wャ/sUーム衵ォッ;アI56ニ^カツaqゥaゥK、ggェX�齧:ヲラzク A6tXCゥC;.邦`ッフサョ X粍゙ロ逮(&ァ +Jサ冶yg&vァ迷ラ +,ヂ胚クVヌーkーヘゥコエウvU蘋й聊G襤.m98ョpネッネrO�ス,゙O。nンfョu。キtコJ襞餉<」ム琿イノ!サ゚Tタu,-ン7G. キ霑謳_ +・%I;、┿"葹幢ibpケコ、 ルマ}ネ撤AG3}斎ォ;(h4癪゚c饌ケア5,球ハ0ーy爭:フケSトヤノEF/柆xウ$6埠lNマヨミ\K'涜& $ケw檳ョ錢ナヲキ-S&ニ蟐*蝠DOヲャ鰛軋|8\<トュレ沌Y゚テユェcK0}#ュ|,rネ~カy$4・D4ワJb(ンLトUノ蹌誇スヌォaァサ<uロ>"+0ノホロn}h*i k}、檠ュネJ +.BセタカYョq%qd。:d"カ牟薬キm*Q3%<鴉#皖削ネr掻襾|C;Ghwテ +;ワk睿}1サーラ┬U<┻-椅ゥ?:轄Vn=ゥ'S#S)_XLマツ寶劑ニゥ'/クqン36qg務」ョp>vセDxケ"w「:%」」マkヤヤ仔ウ>。ィYJC"n棹柝YJ-hC $ユ蓿'ツ∴CアオヌメケZ胞 タMァ湖,゙験lZ=儻R98[~閨5_老o&lュ ゙p[�躪?�]4ーVュZC緑ェウKC +@ノ2メ娜ァWaャ*Kト既JBアオ瞑OCヨネ幔フ共セ,tvVdム0?ホ^`#e:ロレQワz)ウd恐MゥナユA +3Y^V�0ョ。ナロK%アh&UNfUfM詬x3+h髢ー*Fェ9メマヤz 囂シt」 jk,4ナ蒡ヤ{ヨーg輔b挙kX甄ZbJイ-Q$ノ ミモ礬k~ネ%::Br、ェ身@傘>f,フ|48寇V」w�%ノヲ�Fh猿rシcーNp825:ソ0]AKツォ羊Mh椒IB扨コ$(ケヤ銘K a*┣&-4イ勅>ivP(オ%シ^V_゚-眼ハアfケワnサXz5゚ギ-イレナpアt$> +7ソPハム('&J縣ケ7ヲa|ーIX(袰イェlt抄4イメ)ル8]7 セ6チJマiァ「,P ョシ+ワn&=ー)Pノモッ4ケS5ハ縋ア#タv8ヘbGMVj星ニ2Y ナメ」メH兄捩ヌLiツ/^WHq琶語儡オヘq鮃、捗桃 ン鯏%mowア睫Lラ吶Oソ'}\ヤ預ユレ]ヒ +メ偖tTF'$8B゚_ 0。タ`hC゙Mjsq`%ュeオネス+e オdOェ、"。-&*}ト瑾z侈Jv)リj!粮=蓖ヤ孟CッCrユq,副�E5=5ミ� セ舐 ヨe1y}e\トサニニリVXZ笑戉祢氛Fコ暼ヌ麟戞/m&6公1ワ4d)*ネz・モカ}耽mニ)lヘY戦#Dvヌセ檬?CFヘチh)!9窿jク巓: ネ崩Cn覆FU'np8軈ヌメJ tD'∃q笘。シk」」マネ"ヲ諺 ogxナ 竊84 粒yxヘ�MウU 、Nー沁=J/ w貂 %辱V{レ,dハキ顕ワlソユヒヒ塞Y*琶跡� +カチ\Mセケェオpy乳$&{^シ歸2ケ8悩XRタカワ9jナ Q モン Dス!!sJゥ P。@波ソf@pCh)|#酥@Oヘ]臠俐F徙oア+ニ ロ増EJaケ#bロッNgu;bE?vU・タハ縞7l隲Ol +Wク跡6 7ヘゥャNpz曵dァ +oツコ'・寫ブ ゙,| !oカp�┬oニ2リg佯g辱コ +鮑撓=ン+XS?zrlッシNスs`スセ厮メ壷3狎易監ムノ指'コ萄*ハ僭穏ォ:ヒ.$ヤULlフォ-8タ H泯p0脱紙1h[w#b.クe:ィ-'iヒ9エE。。>S釐畚u雖リリラ浮ケdムJクq゙0 >ヲ| )ニロ゙カi&「ュ絹d�8b溲fサ|ク{コx^邇エ前タ保#ー5uF=*ce 抻S\ス%ス\Q~f近スソン゚サ?ウ_ワqO +W}1冶Uw褒TTモ;E竜;イ^マルヒ9 ウ毯7ェ[?}」淦ォ淦チ_キ゚ナk「ー/ +9}?}C7~Nエナ_罅セ 」゚oキ髀゚ (ソ-ス治[)@?鰥クー`;ャノタAタツ肛~勝GFioラソソ#タ淦ユO゚~ァocヲ゚エ゚?}ヌソ7ンQ3Sリセマaム{b>?g/_懐滌゚_�^+j タシサイト6ォア 5&モ輪 [「\ヘネ)m^ィiア?ァsゥ門ヨzウコ岷弄/S$ゥカ釟@mOキ?怨ホシgエュR悔B#D ツ\隱'ェi「ソ?4ニxソコリFョd紐$V9ラ」モeoB-奄ン瑰x} 」G。$)n訳!讃ヨ"ロツU゙&`行タ:ム蜜t>ァ抵ュ戍、fスホv嶐8カル(エハNu癡ィ:�タ:lウ[ミq}Sハi}O侶 ゚d%4卓|-)jUヒトm?ミ*サロ&wェ`/s`yX"^3揶Aqムヘz4セ逐z。カ」,*鰐藤ユレ8#Oムm`Pびョj$ケ・ヤ鎭j OD「8゚.lルレンナu]bヤ矍9クィM鷲ミk「ィX((quv\ ヨr/ー能翆 +1「キg桓ッ鶺Be=フv!Z`ホL 憎イ姚。G笆,舩uュiワAVRクホUマ蟻,チWkアl0\ト穎[ 6ヤ]1ツ/3アフ~褥。臥=糎ワ']vM!^ Iョ シ貌PセP5淮ゥ[9&@v屋fマ@醜舍qキ猴pッ'岑]囀%nモ4ホm花)%+<ワmCョテ2n、-s4 エ夊ノ%オE九|=ヒd>oWaョE:r0マudィ;RメナK;エヒQシ0スIスzD-A ムlE�彊=#ヤ3 B/憺Dコテゥ ヨ&ワ、ヒtチルチ +ソYlセ追zzP:}Cシヨ`窺ワノEJVcシ8=オ顰eヌ モ`>3f6\ヲ毳:0オyタ4セ|モ|L堅隧`|3シ7ル*j0堽ハャ 禀 v,ェ)QクF2鮟$ルニツnオ役ナm溯ゥD摂v凡モスゥ3.タヤ#ワ*チ:fpp8*f斡lクノ゚R毟)ル6}~朽ロa0切"潘ノ?ム7[ータSスqT「リcUフ「 +HcャFFモ゙紛eゥ.兔#e+F。 射サッレKW迄) シゥhZC%オシf^KエゥCd:Qmネhヘケ室@Sレ凡ワゥmSョャ::スYォS0Wメaメnqヤ-サモョ罸ネラiJカ俥ク;a{YスUD敖」9ヨ\K~Uタ}マpuェm>朦3ュ<hヒsu*QvカVO獺<'ぇ苑C,k^ケ:ナユF県SLQャティS@cケレZxRV胛4iゥメcスマセエィR;(ミェZスuKr}U[サ% +;ユ\鋳ン賺GuSロ謔声セ>」[ヤゥ}Y:コJE擧モトミアV9ャャNA/ィロ}クc蝴+"%ロ貎オ碚ヤ'UUN蜴ォモンテャミィエ.sユシOァ呷趾ヤヨzヌY_戴)閻$・票a{黒ク:ナ孳キSeセ0Nu:ニ%ル把\~m煌ゥ^:キャNェd州oヒfujZTハDァ"チ薄カキ�朏サューSヲ_N[$h肚マュ&c゙N]xwzキァNサxaYィpw啅スe哉ヘ宍モJ゙鹽u額!サヘ%mYOァ6シ坩hx:=*ケ莉撞モ:~ョ茆kuj夾u堡]Uサモ彈UWcッチsァュロ。ョ蓖エV{e|斟7スソヒン駝z,Q|bCュ嘖ョ掾4マロ鯆ウTex:mn7l;w樺桧ンtメュwホN?ャM5oァメVWk粽ヤaP' リュJ +鱒N Aァ/カ(<壅uイモ[ヒォ軆Pァ`ッWァ.F岫ヲィlqリゥ担ォ&Ea/クC{L羆[懍ヤア。D。タ蠖ムm鈞ノ0D 症k リゥR*0ユXl¨Gカ 「モ9k�ツVZヘT a ヨr9zァ姪ウDCリ)~1モコオル勾エモ ニョヒ.ョ」vユ竓ウクモァヨaレタTo密]誤yQケ繃埴Fz麒蕋ネRヤモ謦+s號穣t1塢亡゙ァ@&輓r#ロ聹i・v <敘#g珪>ッ7゙キwスレヤ眺KXs~QOロ_ォO」Gヨsコ箔Om5SアFjヘョレYィ Oサj[1守モ偸mースOmuC_�cfソqR;筝ル淦ャ嫌 _/s俊サ鴦>ナ伴ィ掏レロア淕ナcカテ,xlEスM<ンイ,0(fハ'[S応カ゚Hァ=r荀殉d' 蟇ニ詆ト琶トd絖%ヤUェ.ヲ<PノbネtPEヘvbtガ��刳テハ蕗,「4ュ、ラ`!vR玉_4コエth3 ネャ*dヌ"ム +慓Yワ竒ョオ +槝#ワD yM|g}伍-占3oァネホ硅ヤ!プNォSツJj渊eu +Tロュ柄Sh銜v +憺YK.駸azァカ栢ヨゥォhキミ:)2z。ヤzYIヤ琳\劑レ4N・伽孫S、モクメハ+ヤ?x:m:Mハ\搨Vメケ謚H }セNヒ閘ヘヨkョPァ`ョェ>ユ淦HuI7栄hh坂"ZZOXD;、j擂ワリ(iyノコ*攀[&潘6」UOCトXル~ュ>ョァ}D レ靄X/AMノ*/チソ妄ミjラ"+1-qヤ3ノ9覗ンラ癌ァ秀-ユ。ウn ヌSTnゥFント楹 リェGURcテ、1.h "囿%悟4艾i6)熈-]Sモ3x徐rU黻@:゙∈ミ7庭カマ栂ャッ哇缸鐶クニメ黜メムGソ;[ユ\ウハスルk~ニ3+ネX?謬トAl>%メェa:<I「*ョ%zタ\ニ溘-ネ譲(ーラノ扞sシウO刈ャ3]Q\yAY^絎ツ{oGQ」佗'Q;/゙%+ネb応x;e萱8[彷^ 穏ユh駢 梟フ=罎QI(e\\ヨtZ`<ス」 +ネシ;5コqKノイトカ0W8自、7M策Z3 #ョ zJyaT執'ウRレ'ヘ'ウJr9=゙トNR號Qエモレメ鵈ト :Wツ22ウエEj} Fh落ィムH5uツゥテ ,賽%Qーョ/M齪|チwツ\w「艨(シ岬ケフ」G、Ddム恋、ャ螟4%ニ*・9「/h#▽ m。f:壌エャ梠-シ4ヘ6:・ニX]ク tマ。)2$yM 'zミ.6J垠耐ニ$、3^ミ篦u獺蔓Lセu}チ狃ヌ峩ァモ苛ナ&ルrYZニヒ?、アッ 敞sE・#$ミハナm」$憂GイWt~ +コツ看 W'ト6Z良‐Qx$73ン9I / ニフマト伜ウ>1r[& MiクNSHユ鍾、淺z:▲4Gツ茶ヲミrヒアCサ&ヌh +67WNSフ=ョ<7ハ<膨%#ヘムf過・X繝ヲ[イアワス唏7ァb贅3]ヒトk箜rメ蛤bm栴脾キシ 'W8ト'ロー/=$9カィr]゚b鷙.nFlOPロ菖FロルOキtタ鰆@:フgF纎就:/)ラ軌ミ刃�ニ.X +WカeムsP+oウ軾 ヨォy゙InAハ捨g4y香、ム。゙s諛OT_MRキ鉈莖ノDク%b粗サY胡7Yキアクナ穰7gg'Jォワス=^キコッ{遊&zHл VケG- ァK盲C誕kワ�.ルU鴆D4ヤ・ /zj6オD!萵Xeリロ @G奄iR゙5!藍ラ&w1a/アLpソレ_�b&ロ > ト料ヲマ「疂`ェメヲKUz嫺ェメ4膃"琶レk:ルク」.ミxシ]B夸<%ユ"墺ュ!夂q~ルf几=tャ)フ0・_ァナセw9!ノu'旁ヲwァ�メメSツ傴ン揶q「E「玳黜tルナFwmメムエ給ュV17Jト゚N俯.シ +P・(X&TTワ~ヌフ# ++?<,筒'RタU聟枠|"0 I促a梔C8俊 X堵(tF87{ィセ +軽Bxモ&z:ァ 」1ッ啼Rツソ9Gャラ8Gニナー磆ぴrmδg|シィャャE。坦? ゙gロ 鰻゚\J4キ[$\M鏨<^掩B*俟 �ヒ&汀瘻ア5・f ャS「ンノホ 塞w≒<A「A(O8{Ep航RBキg胸`B4肛RG!0カ・ウハFwゥミ7タイ輪麺誓I3νノ幕tMb?.e Yノ51 ]1EァヤセテaメF"ィ碓ツ\sMオ辣B怫C  奕:譯U2i弍ロgxケちンァ゚_ゥYjzワ站AメュノH9&f7艾ァMチチB`ョルァチレ ワナタェン簫籖ナ 惱{6ク>シ帰8 /N忰サ。^H0宏vC漆ミp゙ iス4G「f゚ロアB訖I。 4。」.ナ3.:* ョ|XDAァa柵寒K橡リLC貫tィ蓋AHヨ21&Fン=攷 +ZDス(>:=sフ`p]_ ァc宴Iマ培攷リFレ`ケ- \ロ帳?冽cヘシロW苞ース?リ 8o`.ツロモzZエ-�ナqvs^李No 0s6ノ`/ハ淮s2タ、茯ムtソス隈ナィチメh籘ミ織R沙;2チコ$[タネ9ケ- Fカ徭>qニ゙Jネt井篏ョソヌハ(椏C'廣'Q<'N8ナタ?!N8フ)9t:チ :by<N8e >!イSzGカ濔9tツtト*冗ミqvzハ」エ季s閼3鎹r靼!ヤ7鮟xN挾Mサ咾ヌ +H賺0oYレユxL!)vH杰0ィィーY/cx|ゥス腦アネ杰ニ刃ニリサスネ・サ8T8#ヘnニモ抛テi戻Kォャッ;Q枠|タョトa]听I9'z~LマソFユ>推3ッxョト5ィ李捺Dハ噎;スcF゚鼻%6萠|ノ&-ル・&ラ磬コ25^ユus-ル゙%ヌ'トulテe%]Kvサ=膤Zト"7!;マ礑`フ,蜑M?qカノ2EノャЧ」jJWブ~+ノヲSZ゚来Fq3,觝6ヒモKw汝9ホ擦ロ・~瞽ア秤サOャタャ奩NNヨXI拈 5壗uK゚cムy|ォ/腎ユ"Rモ亞暫R < キ係</攤[ネットタ牛"Hイ=9「ンR」莊P'験 ゚Qモク究`fハ-タXサハcc9Xテ仟Qネヘ験ソタ;w&メッdr箇e√53 ー:ケソ猥励|�、ラ3貴3クツン第予リ争5R竝=セ;"RツB膚%p5灰チ\+ゥrwョ、腓`/'ホTiクルヲク]雕0糲ネ樒濡Ds{耨\焙xョ<9ナ軸フ+=致レIuホ兜\闡<莫セノステ2ルオ| r<R7#*ボヘラヌ:6めゥ{zyt學' ミX遐S=OアヌツaW%⊥<2苣.漸:ロM!体,vタ曙?-1ィ<2!アーハン モ#土雑F「ーハ=メGンォ顕GFrCz9ォシモ#saΛ儷O榊疎FwOC.|欒ニホHス/?OャGF "ニ.1ラ都2ェキァ輛*ヒAOタR紡*v-n\鹸 t9咀愬$f仕8{盡ル:ァゥゥッナ鎌レヘ匡ч +]ク>FS┫ッ袗壼恒yuW脉ョ1.@ 「壱卍W擒;NQ,2TO}ゥシ6+"6:fホ;oネp-ニホ{v>ワス醤ヌフ|ク#TE蠹沿P}B>ys(ヌ{#鏨8「。(xb>ス」マホ」拑緯サノceqメB棘ヌc虞DY7゚/エ佇レ9&RXキY)寐モa轜。{X戞Px#η溟pヒタb鐵ホ」9 + c牘G<テ:;1"杣ロK6サ宙C1!ウ*椶キハ嗽リヒウリーホ{ュ ソ綟テコィミ+レ8トテlp=;N饋8bー^ 8マHтルウ!гン#Nオ'サ +Y 惺5ェ8ョ)^ケ+ェ4ッAヘハHm=a!フRv貭ゥfゥィ$RqゥfゥモハHKヌツWW雨ゥ{NFj紵ゥ懇d、6梍腿 4-ョ/hFタツ-AFDヤ濠h攻゙タト」*�lエT8エ級芽y(.鑒ヲツ。頡ョ|(vサ杁クヒ;~ゥpシ^ァヲツ ヌトルg_収溥ス朏殳。ンヌラ=" +Oタ5ニE苡0Q$ッs"_―スf2カ<v゙ォ井fヨ斉PтYトpV`ユ8Nr&ラィ>ナ Rモラサqフカv1Cニ L~oeテチGモ L+G,ェ髢Tノ2国�カロエツyp.慧7嶽穢s逹、J。d7」¨/ャ ;斫2-ムE#KVロ.゚吊゙ハナ} +gリM^+シ*ヘ呀星モo.ェヌゥミ賁Jv届ニg。ネ.「脹N3e雷k dリ3裨ヤ!痘W.o]K0テno胥4ゥィv +ォチホ:ヘゥx;ンk賢S蚤逅a。治ハXユア幀}#B}ュトエWkzL/OKォoョBエマHコ#キN腕ヤウムヘニヒ+ G*I"Bnル,ヌム{レオbS{巻トサモナ士ケ源S セ%ヒ熟ス>ァ區ニ.ム巌鷯箘$w.&>DR8ヨEモ喀q}Bu゚xぉスpw代ン7テ捺wオヨT癖Rノ ェwソxッ把 weer萪。篤ァfモ=竍櫪ヌe0スpマネヲ飜・譱赭l:. ソ<信w^ウX譽リcl俄ルルthチサ3幟Bnハヲ纃Q|j6ラ9 ルt\ケt'#fモqY.{8寰ヒラNzH椈Mヌ・ワミ<スOハヲ飜・繹}0寰k3"、3ウ鵁秣椦Mヌオ~エ9Oハヲ綮?゙hィサウ鮑@]ッ)|k6擒nエlコ[1v_6ニ棡M�ニnネヲ羇ーリ9V夙モq%Z搜ォ泱Mヌユエl:ョモホイ鮑r8ャラウ鮑メヌ.k>>哺ヌ必ヌオソ<邦ヌ カol:ョ\:雌ウ鮑+ク虞(・pP @Kg?0サリルL゚xuッ5ニエ悌N、緘vN笙黜エ'ラォサヲ]案縄ラ掩ニ/l<]W,D賃LDスラヒAq鮗(]]ヲヤX石ムpPラ4�アxb3 #┤惆-Vdメv1ヲE?ー-"狼u-フ塢 ニイ+ケ ンン亠vY跟筐+*me% Y韶チゥルヤW2ケD%メ]精沍-sウ8ッコ{クフ拗鞘ce: _。;アケJシe雹ob縲スBYカラ燼{ョfz薈yヨ`ヘ)"UDRゥワ踉ゥiDミァ艘"戞。8ワf悦ヌョ瓱裨ャD, +ヨb2`ッd・eテo "オ琉?JセZa スe、"洽゚$サ。ホ{`z%゚ ッ$W4Tqエh(�點ムPナ癖h(降鍾ス~S譽昃{{2┐スカ"矇q0sル礪2+レアェ@ヲー以.LLーvVbュ踉<、Y}箝�リ」景ンU堕言w「r、エ魯ュ ンP"T醉凅∈セ[bィアェサPf +リ゙Lキkケo「ト枯3dF゙ソクフヌヌユ E(ェ8Oク%�チyャZ5ニ棯ンォ +」)p^梁'シ*縞 +薑-+ワ1シ +5dCVサヌ鷏強pwE>ァツ兀0痞「*袿抂トェ微8rVク耄Kr[;^ォp'VsTq。マユ,Zッkツj endstream endobj 70 0 obj <</Length 7105>>stream +D!Bム。サ5ア; 卸fゥ&ン~マ=WホM゙,;"徃舖Pニu[*… *エer羽cょト蟾sq4ト {サK6{タッナェホ{ア C 惰膕v14&ョ0f;uワ5テ�{ 暁平(7オ$&詳,サャd]Lm英SSpァュ耽8(絅)蓬ウe8+T/煬{ウチ朏0昶.nフqm-Hソ^(#l!l9ア9cKDZェィr書諱}ワrッモ[|**P)疵妾フxR+゚ SYマ9ョgラ踐測LSツエYッ・鍼0アッる{」*ヲュ[体ヒクゥケpウc侯.13ァヤ\p(マユa3疸2磋*fK゚uリヤyyチW謗ィ8G橡フ4シ.梭8 +<:dオユロcu +y櫚テ +%1;ァノ莪u齡揆'rロg゚;5M ホU +ム2Sモt゙e狛х$ 荏mィ。ンk 蠹Mq゙ND'Uヲ`/ +ン-L_ァ}。2wクユ)スロn?ヘネx;ナレ2Gスz。勗蔑ネ.ーェ5 h�U8ユョ sオCr袴RZc" 漆>8 ・澱\ヤ疑ヘェ e爵N(lイィ\チ^蹉,鰈(&Z[岬t=d?%)$&、チ?ィォQWコ蝉='エ +3シメ+"QG.b7-_e未JtレオD9ヘ肉g・驗$ケ楙;酩Zテ7ア!嶼dシニ/箋トEiID煢゚O|#ソナijワアア,qユメッルツ臘賺'ョZzトhム>リsn垢ニ泄砦2Hケヲvロ)Oホ嬋Y9戒-霓0?肯7゚qッuvマ2W(フ|ZムbWュ?JK剣5{yW\BlホU モ6y/蟷ムFN<|鶤5 w1s醺ロ.サJ^マvルID忝.Fノォキ.ミ、[fキケマI$C4ニV>P枕黼{rャn*恰ト嫡9セMェ6ホ+N鰰T@クノッ鉐起\゚[Vロ捉#ィコニUfn�vュ莞Evューサ#サ麺sテクzサ'bZ=撥06謨鯆L吹ア峙�ナjDュエ{ウ�ナ�JハHj}wfrャg 3Bヨ,@ア94ッYlQヌネヒウBwWヤ;c,@6>g歯,@Aロ瞬*zリタ マ螫)ハwsEカサ岐]f、2岐y杣念"Bh<^拍団ソワ「|ァ篤_jQ>/ワ搭]ォ飾悗|キヤッシソ(3/ 眼+aホトhョ、sU{ヨンPツUトgr=nィ]N洪ユホhロ脅~ト)ン^ラ純*iUケ蛙ラOリ+$t7ヤ-u+ン_v⊇。nェ'靆SCuB,マユンuDfr=ゥ wU?r]?皓q.ィヌ埠?^ФラOxBp{F]?゙eセユニコ~ツ+p4;^恪BO仄u7:ハJzエョ瓶ナ]ユィ8 崋( u「ヲ穐~Oゥヌxホサネコ~"=XラO'Xユ瞬Sンugケ3Roッヌォj「ェ~qwヨ絲「ェ晢!y KsャYノ霖コ~|4:跌ロブョ/2Rャ'\ユ淳?フヘy5ア]'ユチOィ'\ユヨz|ン穢Y擾眈eUソサイ9ニu8ホコアpエュコ~ツ<蜒}エョ YL允寵PラOX扁5 霸ラOシ+癌楴~\i暖&|ャ湍 梱スLェヌ伴~ツカエクロ..ナw)aィヌ浜q車g =Rラ就^UヘJサ珍ホRs/ワ縉ユxサ3 Wサゥ゚ンYクャz|wラc@ケ0ュャヌwc.ァエシャ@2<ャ'眩ワ慈'セェ~Wn9]ラOクェ{ショ殫ァO骼コ~シf;ェ'訖8Q9O6ョ-ナユサンョシァョ゚ dT{4z征'LdtヌテuCニ:ヤNeネラ絆語シォョ゚u鞘3ン「テワ_ラr%{x!`<ノョ'+"鬼T]?睿※)ゥミ%ト。ウ漑gu鶏チコW +'酊tセ ケvッ゙3モL9F琅テP,lUカS 1!露hhサfタ^ワ懴yAs゚R.ヲ<ニVル注z肛n邱DオNK)ヨNヲ Lサゥ0匡潰y璃.珀tオLヌ_キV<瘤Dァ督日ch}9gマスソ シvoト+^ッシ9疼ユzラs/シセヘネFpテ;E勲シ6ャmYコ壥ユレテヌnソQヲwGマ痾/ロF&ム嘖ノワホ鬥pィー|-「ー8ユ}ユク(ォソUホ捻ZlスWユGナ纈V3CΠ(ェ%゚リ。;%ェR縋ワ猯)?チ定0ヘ泥。(フe、sー==ソT3_コ1ンメVb楳$m囑ホ3xク水0&ャト?ラ\マ3ユy66 煢j#'e帚nj訓&)9エェ ィ・畔I孤?チ\vニ *cゥ梨ル'珀メツuキ贖3僵<H亳oョナ +コマY 靈マVヌ酣サ疣|觝%。ェ!Z芋j呑ウ孝Wモ+ u*ニ蟐晁i゙ウ][&ィLネ。ミ#シフ@櫓{{唏 kOゥN゚ヤDxソsRZ'リ光ァ檣5甍肓5.^oヲ$ +8楔5X゚F「セノ憲6u"nノテ!g5エン~ネ崚v℃ ァコホ1zク2Kmdヲ+佰A�7%レ゚フレィルK6NFエ}yヤO=Hム犠ーラヨAdiミン濂ル鯨Z5寢。3レタ゚zリD xcAe  pFaL<フA説5Vk塀WンjハWVvUァ ネ|2T:0ョpS+g8uApx3トL}湟3]ォj _ワI;甼曹9ル,ムB敗移ナrn0ニuT"シ興nホ-ェ4FAヤd\%キ+ゥニユXzD&ュY5ヘゥT-辣キh=Y|クr&}1j黨ミヒチM.ル`(メエ:ラ瀏ヘldュ央ケエ|{7ロキiミオワi XォA゚J}ル�エーc2I@レル4双/゙q鷦Lmg臧#+Aウョネ)ネケ,VRアF\V謡ワユL「3G「Yコd.囈ソュ]饕篌蓄ソオウリ $ツNB�iHH駘@X贖傴*sa゙貍ネィ$ル黙BB>Mロイ]褒・R鵆dゥ0}#}-箭Cサ3V肘Mv^トLeメツ=2*「t�キ挿ヤムワ;アォクト蝗シsケ1'7妃ウn"['懼テホリR所!ラU3エ奧ル シa�V蠣ヨq渇ユN1+Uラル鷁ッョヨw゙マユ嫂ョGコ aホメ8ィ圧テ冴0@弟坩柳Lコャ翆ホy6C}`g'ャコ」 籔`/,シ`リ-ケ ゥ楽カmオ! Nヒハヘヤ-Kl畦忍h,リ郎Vーェ痕ソ ヒ綿j'Hリセ-┐Pセユケ#゙2B%{*慳nゥ`4フj衰8oZフ|Dアセ{gツ)._} キF7s・ン#Mko芙ト)RG印馳ロP)R@ �a沙イKゥKp\チオzMGaホララ�jロ ハBW尺s8 +{レ瓩Q呰モp湎ャeッ キ&iー青-狠Y磯脩84エ#.タ$iセ:q{9◎ーォ樸H4S?モウ ゥzホqEEリMナ、UKンZ痿W奈3蓑忖ィリゥートメレA柳コ觸ルンdヌ」yXァJ=}H身∞6 鳧vリ R u謇pツ`ス_コ]HM7"ォI@Fキfカ + クR <]啻畠"sメwヨ燕マ(籤 yf<ー56チK}T僻n艫輪h6ソカ l、uW?鞜=リJ0W 3輝*!7セャ4筧`zw讓赧;t^C z"`Jhァホ<*H嫌 +リK}n設アW)!屡フ3メア」СS゙zゥョaz黝#>jトヨル+S6Eシ榻N黙[<玲[],6$,�4カLY+m倉ワ>KsアTo +2',SオA1頡aァ.弖ケ~mレXマヲノクメ#き ^トコェ クェtM +4-F*レキEg瀚bE覿ノEbレt0Xハ]=:+ホスッ帳Kワe ル\g怺I+ヌスロ6ニ{ンレチ}ヨアミニオ|ロニ\M|ロニxM|ユR#uZシ+jャケLト恙rヘ ェ舂lモレ趨黶hl-゚Eh/&-kヨ葷ニ「N/ォ虞%サH�;ュbクユケエ/トeY刹e嗣<ャユ#vs?/m<ウDYpンノネオY讃~3ョUす&ぞU~マ[Wロ裼Ppニ*稜ノ+,"ィeィフ6'#T゚Nd) +゙}*」s= ?エo_(゙Eb漕/$慾3)Lニ�舫(リFG|u h!:ェ0ウツス仰QユQ始>コ%透)、・d絵ツ0;タ賛コーEIb肭ンXU「bァ院┥・a ラUML撃Gミ飯TK丞ォG 8bヨ鐔 ぁ]ェ「市I譟リKVクHg1Abアモ!`Dュトセ}ゥ瀉x-イ[5NォリSL 38ーXユィチ^釖ルネシq貘UK+シ"筒リ ホ/UpRt犇Fナbァムァu・Iロイトッ^&テ_3區3ミ +エホy區で^*巨0チソ。リェ鼕昂ルテボCキu<<シ>゚p<]ーE:鬩l崑オ 嘸ャ9 停l女2?s=joンPH+*Hx亙・�ゥkヘ驃アJ~o、ィkUパナHqタュ酋ソカ],ハメィヲK=テn モ)ヒ」棯J_ナwxハ旁タ6シ]Nネ#リンa暦IO'iリチ3ケ6゙Ko?ヒ?セNァjナ吐モ %ヤ};マメ*mr寸エc゚ム;kRク~ゥ3ko +9l5,ワcノ�レEタgt褄ワ秘窟ヲA'メ4&Bィエ彫億陝%尅4|'=「bKnP訶D鋳JHYg&メ枝8@劍up!ヒカァJ賑`nイャミSホ@ー3モK3~ ヘ TャッニU[アト辛燃Aィリ3�3=暮ii;ュ芬*qa(瞿ラ=リγソ唐7Su$*燐キ鑞ワ{蟻aOPヒU戡aヤ^w5ノ 棣ンDL位甼カ\児ケモモノイ゙諠p┿=碗えLWシZqyミホRノYコrwx ~) ~錵ー/ャョ|メ8 ァu潅PXsf 旛Ll<#ラeヲミI6w\]ケウ ク.mヲ{儼ニス}・tリ8ホ5 +7Wie「ィQ8ンKツs コP +Lv|メゥ瘠(サ7ー~o容;S|a)揉ヤ#_鐫ハw +Rセネ。゙Oj%_翩ニOJャ +ワ@ウ�。ラK~9@ョワ�&Oョ ク*iIセノw《Yノl┘泅椁TVクー`SBゥウ$4ユ酢冢BH%2(ノ?MHb7セ&∈ !E希寇$ g(ノ?MHヘ1OIiB容%ァ Iョスp比&$q8コ逓ヤ、/リ,La!゚/5X =傷穃ヘ'6フoNdIt<コ坦ラ0ケ%驪/~/砿fク|F\:�,、. PV�コワ嘉@メeァーキ 1o a2-サキォヲ}MR-ウr PI$ェ<ラ&2 4榲碎ーヒ-埣弱モ纖レ Uk莠Vヌ址 フUB*b憂」<,y・、「3ム>Y7・テagi殖>2 Sd青ッX2ロ憲。67yロルiL黐ヒトィカ-モ。.f漓:x条ワ甦x旨ニ肢y1X剥メ盻Mq輊?rツア、』]ー、ム>f;キGヘ(�Tィキ0Z5{l驗ユR椏ユ< タミ墜ホエ;ュ>R槃!}{,19W.E。ホY3昇0ハhKP$サト伶泯セ\黠ト龍胤j皷(ムミQB妓サ +シ +pnシ淪スニ(ミオ P0]ロョネ"リKエJヨPチチ,}舒)ハタョTxw*mト・c?$pッi行"ミVhン<璋イPD"゙ャY96ゥルm#ヨ+F5。|猿柞甫$ク窺テ�:4#il]MーMV」ス +ミ゙P契ーヲィ 恭ヲ*Qdサ決Vア 9[珎H瑁,f>$vgケw砕ワテワカンルャ9ー剄U ルーヤニV撹・ユMmlw`3Sメ[[D%ヤ@x、^kY&オィクイH�カアuE+[7ラナリ艚ヨ}空ミォ@>エ6pi祇个9LlVユョV%饑V」)|ュmフ!ZA腔ミ6JゥK<健 +窘苒1足怦ヌウ>牾 +ル=ハ\ャネテ-7ェ<ーカ?寞ァm+イ薦<EdW復キ、'礒Dウ 廁メ<フ{ヒァT9ナ泱ホメ颱 TナDtN栽グ<ケT霎麿カ虚l(ギトマ、m煢VF『イp +スZーsSスe)O.>踉;xネF戒mエクルpワ背#Dァ「ーョiQ恪mヘ0ugjw#2?リ~ャ8cwユ3uw-zァセ沃 机-テlマケ43+ヨS/ナユ甃Oテ榱ー・0エニC*ヌーR飃{0SトFンホャ`Wnhル 6Nヌ歔C汝ノイ:リ庵.j5Q<iナDト(Yコ1タ8ッ#ゥ_f゙膺餮e狗カセハzソ& +kH\$OX"「r潦趾|サ[l6bステォ鴕sセム9Zケォ5ァュエMメカtキ4<クe.e9ニrKas-w7tォリ菊?6a|z詰(齧P +@=ワホ羨蔔゙瞠ー%Aツゥ}QCu8kモエ姪オ6tBuロ$_Lツ顧Hッ*mヌTハヌ%ワーユ幔昌ミカ餃トキリWゥ讀ル8~}G:・6O翻`69#坐、g@哂ヌア權\nル\(& +筒剛セ嬲1%県j4(oュ ~?h崑5h崑4M`P価ワ@S゙鍄椶~徨ユ扠pペ滄檢崩゚ン操DGナ獸葛H級喨R+州燹??"墜J_゚+」Ii<霍G Hェ抖ェ蝨=賞紲ト�ホ孵ツwHタ釣#Qノ op蟐p+5&"ノx<~~|陥1{u}X*篩オソp充キョ>碼ュ{ー叢励qヒ5D嶋7UMヨcコゥ"YG壑ト:25Hタ?ェェハ*R-|テCB5 Gハヘ kャシw媛wィ=ソpンナ"常Nッ+= Gr駑レ顳nk<#W(+ネ「z +IャンR%LアLタ9ヨcアユ W8X胞掘雑cQヘK3査{Pk *3,o|r^pメ_"Rナョゥxロ・ゥliQャB宰Q、鰾サLSヨ,ンタ下)&渇.QWe=ェB奬「4GbEオ「5モ7ム噴kosモクャ.煽I「 エ!"%鯛&r%.ミツシトユYィョeリ0.12qヒwK.顏ヘ1ヘミ<jミq最 ヒ$椣xオ9ユ「:6!KモネソQK・6g倅�gケリ豌俄頴充D}XQдミ�6ヘ8ノヌP!QM6アオ嬬翫シテ忽jノ1ЛクキaNエャノ +}ΘGeヒタテ&iナdテ2「゙孅CG1ワミyqネPeテk゙羲ヤc(櫃O!VラX%4p籀"8懴濤{ンQ岱キォ+カチ、=ア7齊'ゲW)vマ +ツxック endstream endobj 15 0 obj [/ICCBased 63 0 R] endobj 5 0 obj <</Intent 22 0 R/Name(00、00� �1)/Type/OCG/Usage 23 0 R>> endobj 32 0 obj <</Intent 41 0 R/Name(00、00� �1)/Type/OCG/Usage 42 0 R>> endobj 41 0 obj [/View/Design] endobj 42 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 16.0)/Subtype/Artwork>>>> endobj 22 0 obj [/View/Design] endobj 23 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 16.0)/Subtype/Artwork>>>> endobj 53 0 obj [52 0 R] endobj 71 0 obj <</CreationDate(D:20150415134556+09'00')/Creator(Adobe Illustrator CS6 \(Macintosh\))/ModDate(D:20150415135729+09'00')/Producer(Adobe PDF library 10.01)/Title(Print)>> endobj xref 0 72 0000000004 65535 f +0000000016 00000 n +0000000173 00000 n +0000037976 00000 n +0000000006 00000 f +0000253062 00000 n +0000000008 00000 f +0000038027 00000 n +0000000010 00000 f +0000038747 00000 n +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000016 00000 f +0000253027 00000 n +0000000017 00000 f +0000000018 00000 f +0000000019 00000 f +0000000020 00000 f +0000000021 00000 f +0000000024 00000 f +0000253333 00000 n +0000253364 00000 n +0000000025 00000 f +0000000026 00000 f +0000000027 00000 f +0000000028 00000 f +0000000029 00000 f +0000000030 00000 f +0000000031 00000 f +0000000000 00000 f +0000253139 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000253217 00000 n +0000253248 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000039681 00000 n +0000253449 00000 n +0000038422 00000 n +0000042671 00000 n +0000039988 00000 n +0000039875 00000 n +0000038808 00000 n +0000039120 00000 n +0000039168 00000 n +0000039759 00000 n +0000039790 00000 n +0000040023 00000 n +0000042745 00000 n +0000042985 00000 n +0000044073 00000 n +0000049107 00000 n +0000114695 00000 n +0000180283 00000 n +0000245871 00000 n +0000253474 00000 n +trailer <</Size 72/Root 1 0 R/Info 71 0 R/ID[<4D5503399FCC4B1CB18AE82F78BC534D><AD2CFCAD0D354BF89BFC5387F57EAFEA>]>> startxref 253658 %%EOF \ No newline at end of file diff --git a/rep2/img/glyphish/icons2/108-badge@2x.png b/rep2/img/glyphish/icons2/108-badge@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e294296846fd89981892d7197a92166c5c3f3960 GIT binary patch literal 791 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTN?DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg3`{#cT^vIyZoP?d^g9$F@YdY-RTGPk4a2&aTgnf3Pw}4O zydwR8bBgo}-Vbb5%#pi-zN=kpVO4RMo0;Y~OKItqf10)WKY#jWE}vgH*Zlu^^%)j@ zvIpe)9xw?oFfo9zbwRFOjoJL?vzlb9=dFBH<-(xC!N91%fQB9Pr=3o{<iNn8!LxlG z^YguLrdrJJ?=|db(ApTa)~Mgnq4m?`QXVF)Y4cT>UhG(Bzka1EW8|dZaLHAwjNM0- zu3HLx@c$&7zUOVtx;~?n*$o%%PL@wUe@f=?L4krdmDjJt2L0aRz+nG5=-7oAP9=7m z;OEaPh0Ra;GfF;6|M@9rwZW{CVzc?*S4anEFZb}8w)65!lY7&0Vy~A*t-ZGFKI`8A zZWD{RR3WkBB`a-3r_QinmpD7t_uO_N#y}C<j>-S!W*9ENaxSwb@1kK*ZO5&qclC?E zO?^DA-*36FoE2m2#F^Zw#)mjh3k!a@*dgQKawoWa>5-qxMSG^+oN!geM}_5z?UKoP ztq+#SO!|DhcP?w>6cz1Bi_4^<HmXEUmf3napzwr4%0qkA^aV$Mz7k6k;@tP7b(3nQ zQq})eFMqFE-PYAy;rb_HQRKF(m!H*46`at;Hmz&7?b$mM9>3pO=l=FL<3u6pUR8yF zq{Wp&E}t$he79SrSY5?gP$|Lu%amJLJdBM&(FzH?^ZoX{^$`e2Fx<A*VS0|X)z59l zx08ffp1AB-I_JXkA|~~)%sp{0@->rN6cYX~nVF-VHnsn0%=Mca=B_jq%wEH~QTV>` zy<ds<MAxoa&@O3ImbUv(Ogo2%`Wf+SKVwgE7OmC)zRK^I6lcWruIQq)^(UfFfB&#I z$Jv;1l}bkL*XXR57NL*AwrX7yV{G)%^wyPKKXr%utwjeO)H@5Jq?q2r>lv6CVhha; T=f*_7X8;0ES3j3^P6<r_P8d+8 literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/108-badge@3x.png b/rep2/img/glyphish/icons2/108-badge@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5df5b584f78e77e64b3c6b1ff78fc9ab50544c8c GIT binary patch literal 2427 zcmV->3552EP)<h;3K|Lk000e1NJLTq0058x003YJ1^@s6^3?mG0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU*9Z5t%RCwC#omp%f)f&fVb-av2sO>lo z+ys}lAP^w-BFY1TN|#-%LP#v-0mP<)3Pm8n0|=_J+?%2++N-PEvOT~9<$=Di3YAJw zp(4=&MIe<bkXF==lh~d(&MfBtnK5#!G+t`Eneq3Rj>copobSvzzkJ_!W}IWOR4NH9 zR<n}03s?*giveOWKr9A`#bSV13=oR}Vs(WSw>I1`jFon&v<@$a8a=mED(zGiWvwjB zdri~4$h54NL{U7WiF)>;j<u+3r)62E8>UJ1EN|j+ev?G;X;oD}Vt_iNk|6Y80AqL= zYhvIRRb9J^{YaDb9HR3ped*L2YvOWdN}|}qA*|yJ33ij`+BNo%M?ED5h{Z`Xi^Tx3 z7$6n{#A1M0ECz_h0I?V#76Zg$F+eN^h{XW07$6pl0jeoc6uA=^pyt4_ZCjX~oh@$} zBnGHqfDFSBve|4IA_j;7YFGr0uIpuxSPW1@-p8^m!8A?!-g6lsdd*&l0je7y@;+1~ zNh$+Gg#luK8VX+oO$8v@XE8u^c^?W_1Wje}Ee>N0P{ZM?I%HL5WIP*VfEo&4a{<I+ zfEo&46>%72fa(IMSS<cM`#P+nuut#P=L`@7bW~Nm%v`E?Cl&)VZ}_SQF!n+&2M8I8 zADg~b0yHx-GiUfZGK|r2Ee5F1xgG|nQ&MGl7Y6aIR>4y%e9aZcS_KhZ2d?KE2B?z_ zm!$owqCAhze-JaIACDEF%HxW9^Q2Zh+CaO1qW05u(Dk@+99+A=lmk&3oxjm8mG)Sc zwF(1rZ>witM+;+gysE0l0__$>QMO2;_+>4d3{ZO^A~(7N1M!1ln!9Y<eyGvq>MHkm z=m~s1gGt8`M08%GUWk^(gN^?H{CBa<xV`^f4^S0I6Bv}&;f=n>0N;y&y1UL31q0rs z(dl_5j0FOLM!e3O@H(3T`*t^b9Zv#O<&CyufOf+heG6}Ne=To>b1Z}-yPoh>ZHM5Y z^Mav}Rj1e41i;@W(7n{>o&u<9fG2x=zSl4{{(^ENc%{39zZSr(45%r~@)W(cElU9i zp?bqtbr_q$d33%c%L3IWS(bTNNE5{jV165)ZN|I1z1Y{T0Vto(FM*ecV1O*4_JWj@ zoX8k7&9d!Z;EBisoQZM*4J!aj=(>J8Uhgvv<8lC$Xf&jhlj&k{ATvIGhoY)+P??0y zgaZ&vl%@a~+5K6TqzD>(A>O67*GihGeX{EFWx|^F%R(O)(JenXH#$1HJg@7|A%{2_ zyLt_XXw_4iA`Q|OgPO%a_EB-J8Dnb|09Fz2X(&xEv5PupQF2rVJWT+$WNI7Uo1_9; zy_7Pc9B{VtkxFodOv@Sz1%uBH4-I|A0JTWDTrQXzA75q6&aS~gC7ZbiQ+=)NcocE0 z_0#zPd%voxuSTQMExqBe&H%MGjL~C+%W}H@7(&mDUYW@_o=iX}{2&|(jrjfk?V6^! zqTQk!e={|g&nMEU)Z=jV_fZJ)06aRp>VIRg*el3;4!WuBqFaA-7v4xprPKEzv3>%b zzu1jW$DNS1&!?&{M`N-70Upb3*C4w2SDPuMO&1E+OixcgY8b|qZVG7>vXJY18Vm+E z1pWSPS~%>=F%Z4*v)>45NrbdD2x)f#qOc3#$-`^DiIDXwyw0y~?t9TIzZ(y4BqF3e zFl!iVWJy|(A*~#;Y<r(iQT~OH^*Z2jedl`yAjcC42xr$83WX;T(pD^_kmiJ}9f3e# zeJ~K%7ItaK@-#qI-sp6Aqo+;Nya^D67Q!q`QIxIGXmlOC&R#F|wI=~`APNAY)qv;$ zKs0n5;TctAc@y%T5lzzyUh8Mi0#pfU>2&&LgtI3A(Z!w2i>O}#&rX%5=#j|#UI|%U z1yBVdJ)b|TSS&t?1pE3<%+l!Dm`_zd?CI%QAJVklVNLUF|9T#vs*vVKNLy=J)`Rdw z@iuy%KV(JO7>h*KBV^5Zy<fZL|H5c6dwY9dgLn9@&EDs`UQHY626(y(Ajdmgh)uH1 zW|qRvrQOn}T?3G_;@G7KUyIwC6Nq9Gxz^>~vXV#F05mZ%5y)n<=OBre+uEU$BxG~B zC1j5Q^3sJ$(s?LLJ7jAa%J~eCm!_MdcyR~vpNi-klgk+(kH|0#AIjMn)L@5T4Uj$L zLOuq_1IlDFOQv$UGduNgRT4$YgU*26r3{b<B+K&o%{&jobbJ=&0BxJdgZ=@#7cfBX z4_~w-%W_c=`Wu92LQ#~r0)GD^*uFvg4VvyJyIx<>Oz}EE<C)9}Q`zh?Ku|9@RQAh~ zv>_Ua&>dxZ46^l5D)pmfS*z(jPdyK1%hP$-#j$+@@%SWrAoot+FF{Gx2~QrNedhD| zZi~m`Bb9%xp>4dse*@mX6`y}f$JJ^36td4D%%!5$#Naiqz{^u>9c$b60eFj%Xf%55 z@X*jVq0r&qL!*7Xzbl5%aooS@_&S=f81}EMwdxrIv_O>}ANS>I%)a1FW{~Xe^r`A9 zgqmlxP-xzVpa7{jFfj0}s;c+kyszo}`NA04Pp8v92FRV^>pXailjrd|DM1uB!>g<u z9v=SqNUw8Lh=M`kl;Pn|=sfKHzg*8z1p6m>`L49rbD$N%9Cx3c<z0S4KJ&<6JpK^C z$u(0s&dU!D3_MKrP<>SI9EXwp%Xk*%G9mX+;2G%gg?0oyv@XzR@E)rH!0*RuCkU^V z429m)r>A!uJa}*e>c4_!Ue%mYJE%Q?%w!Mb5~Wh9Wtc`MtMVU<ZVF=iR3eeMxfSpn z5!S{A6Ny`>e%Ki!dw);obGcz^4~H;!<v%Ovo{i&mbnJhQ@=px%M#^E@p&;r-{hP>+ zEJ-xo*PT3wKwiNBxhH&4f_yGsF2W$Dv0c~S-+$HOWO7e1*xu)<R6p!|4|`W*_eID4 zB5Dt{ive;+_&RYan>|fcl;7~ze*?V23-CG}9X)_#!|sc)e;ua$qtu>5XqVUe+LQm4 zkxr*qPE1aoebV6II~d46j(2;e3x)o%v9UY*`ug@DdH<LJVzIoQM6(zm76Zg$fLJUB th{XW07$6n{#9}c(ECz_RK=h{o0|3)$n3U0yQ>Op`002ovPDHLkV1fk$d^7+6 literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/12-eye@2x.png b/rep2/img/glyphish/icons2/12-eye@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f1220ea2565f69785a353f5b8859560137422216 GIT binary patch literal 751 zcmV<L0ucR)P)<h;3K|Lk000e1NJLTq003YB002M;1^@s6<uq~*0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!kx4{BRCwC#oZ)eTKoEt|$$v=&(t&mm zQbFuMtRSX>Xa{tlc7PQGJJ1fW1FXR8CHq4i4q1@n!1rcu%qSf2zPsH$VA4CE&kod_ z`mg{1000620Du4h03ZMW00;m800IC2fB*mhp!)UFwi8a%bW9%}weihQduoa6y8AX= zPp=IRWXN=%J_2eJYJ)qQpQuID)&wI4fNI7o(-+i+CA&DP{RzYx0OTWnUBUP)5P^*| z!YTk{yvxRa)O3g~gGd1&JGn*=9QAp#VPZ?NwgLdh`jyZ`6;6_i?^M`&6ZA2&AvZJ* zfXr7WObc$l<D?qrgs?fcL4p1@)K~Dd0EFg$ky&BEemxFnBikV~20&=OI9%{-h;4_^ zZ-M#CGO?N~9iJCw_cY~m>i!H6ntvoCJ%b6}_)IVgphUHk8G0^~t<PVnP!sCvd)ht` zl($B!BVzz~b^9aS?e*5woY;O)K(ZjvJ}P;C3Xc13YSr8~WWLK)i9`p@h@NW_>xh5L zlGMzI&$%;6I4W3|UvblX@8|5}3;WV(P-4KerwW411DF&n2d^s065%8k_NCK_&$$}_ zIF?H<Xrzh5AtziXBMFBk!dB*hF?Gk(SP0^(Vpd}2=oVN@=l|Z&j{o*^Oq0N$nS5@5 zg;>K2G2=;?FK|<E^C20ys964nwwm8q6(of4&7-)C`LSd9ZRy6!P$7gB89Eo3?>Q~F z6WT})sF)M*K&B=Ll0^BJoE<!pd^m)sd?;_ttq3+mLD<%K7}fXKrq>toVio}0%?%3& zuO?bCBLW96=UM^7<6M#TditJBPug@nJ^a5QR6zg$0RR9%0000G0000400001002M$ h000mGbY8y#3;-*eMB~xpp{xJ^002ovPDHLkV1mHmKI;Gg literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/12-eye@3x.png b/rep2/img/glyphish/icons2/12-eye@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..475868725e4a3ffa745b22cf982ef47bcac24a2e GIT binary patch literal 2502 zcmZveXEfUj8^He|R#6&i#7>Q(Xz5idh~BhTiyBpX#Fh|3rPqq;h}yMEL(!{TBOS!v zlvYU)GZdv(YO9wT*Xz7J{q}x%e$SWRr{|pKoL`)UnIZ2f=qUgIc#VyamM1&qWL!Df zPq;O7P;jzDL$2Qqu?qAG33Chf1PnX^-94p^F>c<TmY!}N_k%up!U2HG#~5i~jc2Un z-bV|D3U==<RZrLp@(l%_pOx60x#%42ir8!xKs^X6gme;w-31%Ze&Bp+J7i?-erTA; z0oqLJVpVZ2>8#9?R?6pIt)>@6NlKt>>Kl&ws#ee~YCns<to1f#@9IUi?CK~?jf@DT z89B<y2pEA=kbv?3Aj@I|Bm4pcBzp$&3vs|RPU&CxE&jF#>6S7AXh%5B)T45|Z4*D~ z@9%F~L|=YvtweFo{8`f(e$d{YnVESPhuhX91dB+86|LMF4>;Q28Lo2-(1^O?1Nr0; z>;y~oncdAuH$U&<-jG#VS{hYRUM`4e;?HSD;N(-pxh{mV^A=?eddIrWZXV~3w%zep z6zx$%P{eD6w!WZRtLkgohRT4gHf^G}o*4G=cCifMy-ol3;3k{HJ@%ALY?C2jNyQa{ zm<ONs)Jk1|w2n(DIM|$BXSaD?xvE?^=<b@sX0$Uenc5>M-6}dXHl`J~2!~?-v!d9v zbRZtd?dRvW1}<D@v$*_<ss*EhVaeBXt<9%dt1)uWCd141!o-CP)MX`80^p6XvZ4<Y za4a)J80JA+*JsdjHj~MGL0B>bSu<{XU%0(!GNT=WQu*f==WQOM^Ev339FroUOw(sh zn!rH)Q_srrID!Tj_8u1#ZIbDdWpyF?QXpR;nnp=8XswccvAqt1_9=1@dsw7r{-G$v zduvNAqD6rmwe#k4V|<D&9~cMWBb|)!m74q^$k%;VW*ags&8Y$CfA<(C1r&<)SKa|I z3_pJkd%Mw1@!~nb;sVjaku0q($<oZ4pS4wmg@tDjS9LT;7>xSF#rxr`gCa>{$x{^) z(mg>_aC=|+t4Wji%ZS#>mwdFKpeKKQ$dizk1n1RhZLL!Cmw9BROIcnIAY0=|;Z^Zb z0SDS4F04o?&iuS5i}%)|6HLumfIfmotPf5&)!W8)=BJv`WH)t^7D5hseGd5s7??*? zA%Ptpcn6lz3v68eTJC^lTp&qmacs&kX_0+1e|dumOYcjr7b3x5$Fm;()U?I-+G#C= zNPp<?;59{3mp<%7E!11ZEdNwJ7Ty-09Q6rTjW1^@5j)3sBQGxPG!A2eTZ^~06H-(! zfNn_<18#Jy3lmrB@XZsLNi*OPA8kQoS1BQ)RvCVnb&QzOh;Q`1UL#T|QMlV5^pf&k zTn74QC_Y0sQ1H<5%o)7WC1waI_-2Y3oK#6%+P<Nl-5V~hqD&u`a^l!{_hyH!ApFw6 zyuyq!__p#@p@Gh0PTdYC>Gv@%dAs&{&T&*PkRXqwsf7Y+C{ARw?tA9;=*jP7fusYc z(mu~uBc`<xA>jSTT?~cniuuE$L(G{oUaF&a)7GH`I)PkVt`rQ)!woJqq#V2*Pu4KG z&tDB=*+}SkZWY@)$NED%>28kNK47H(!-*Z47AGsw<W(umu@zS4%p~~8^B?7K<X@<t z3JeIKVx6Um7lPo<pLAVf^u!`m##0ZUQDd;J=Sy?N9G@us%i6C_rZiTr>(VstnzKRT zLo#x;{_vc}P5R!807YsFZejBEGVzUXboK9PSsRCpzM>_0!C`G?GOYsV-W{cvyt~SW zU?n0HzE<V1m{ly)3asw2_^AX(h+lKp6VaI@>aug^&we#_Fa>u=h;;2l5TXkFKFxzr zV9y%ZxejuAD%<IUScr)~pN{xUP46H}31<PDRqQ|#FHT5?|7_20ImHIuJlL(T7pN+6 zC&@Rq(~GY%9#FdG(>CU_7eQKk6ncx)Z$HEDZ+CX0?)hdiZ6d$25iYxj@mq=bB?fu; zE>AujnBwA+H2qj32Qpg-vTW+(P#P?7xjm(ZecmU<P!&{=gRHwJi}k6pl;DZbk9K64 zkSh<t{T9!r%^Yz5Sod7zdI?H+&9ZTMJm};uluVCxfouP6=Z?3n6v)=cKS*<)ZwZ8& zIY_V|8*ml%@Ore!EEg&C%D(;8nC`iQaILi<on}IF)S(FEEz=%FOD1QT4jamSN%g@! z#*9d+q{N79Go*9ls^t^z^je5-8GGl(jcEJWDD2<iujmS<I!CpW4351cj#;Ml9ZM8) zO4Sp|spMRu9$bZ_FA$lW5o{hJyTJN2L5XxVHk`8jih9dV{J;W(S@mdj%v#rqzJLbm z%f;GCn}(O7Ml-(&Lb<os!;){xYw%eZYPF|PwCSxHMMK@~FpYv<sl=D2X4v4A0eopJ zcWGIfuprceH>J`V`%<8GS_jScq(j%fDguh9vghfWeo;%!rn+@iJ-TmgpjLM+8O5G@ z(_FqCJ$-9q4EyolC6V=0e6-!CEx;!2{GObpKo6RFu`Ab|uJ0t%Zh!*$oT8Ff+3`#w z+-l%mG3whTylU~&isYx}uq#Ew3p^9x5L@D*{1N^I>;e4>x2WWcWqji~_?sI+?vd%X zo;=&Oo(ZSlD$NN!o7I*n?-7}O)1##<4d1!F{pZl=Bi`=&qX!N(wPfywX&2$@+OqHM zC8x^ZG_mW*1|lvw^r3fii)y*vQ$6Bgk2R@=wL&u1hxEP2I%n7AZ~AgW(5#N*A{}P? zdTsvA&0Kz0Pv+b=I33t)C}FgaM!F_Q%iCy3CQ9IVow8}Z?>`rvOySF6RPnIV<?D83 zn8P5d3;}0Cpln8m+!cEn_kQ&=CM?MqNsPx*sRrcv4iA*OX6!&=Y^XD1O*~X)g}TYR zNCV}KGjd=32!<&e?j5iuDzzQOIPdOq*ykU`n27xyW9>^PEY(8B3(#yEaMPi8ilX}I zX%(L%lRGsIbs>i6c3nu;7^mJ0yi^zRDqD;f26gJiNwOise@MeW_t&J9Xv8y38meyS zw#h>iXYADEV2M9!TECMc3tOsl?G(et7;l58v5i;OtfM(?7<K7xhrU=Ne=54&fweyZ zk<G0Y=vTbI#o=o@qg~d~pkAFwQA15#{Al0Vpk7|SvO!KTjPc5t${5gbV{%-4vOQ3$ z`J(%9cj7O!Xrk!()3S*YQzIyDc8vQ`JfhMv@O$c^`AJ^{e2a9`wz~lsUlVNFviw~s vC%y8!Qb4k)zbgfJ_Wzsa#12Yr0gC{x*z{rUZj9|om;uJu&5-14t`GhT?_i*^ literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/128-bone@2x.png b/rep2/img/glyphish/icons2/128-bone@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe4f179c64ab31c46b4911d7d5f0e01f765f8195 GIT binary patch literal 687 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTN?DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg3`~KZE{-7;x8BTp8+gb;ppE%){W-24Q3-8>xgMMmjhc-@ z3z)49N*Y8t%n}Oz^jGg#e8RxFX#2@^PioWijC?F^+)jU=_da>U-8^9re`cVi3=Kf6 z0K^<X%!I;Ka0?B6`g{J|;-#hS6VCR@MTVDkGe2PS+0nxnm%qZNcA;A+o9z4C-S(fV z4x5QDV+>HPd2(jOojE^VaZfcg&B#3R^WM8p9tUJLTTkbaGh~o)OyzyP{n`wN-N98l z*%tqg=WVi_{OkY1gy=4|bN)Yew>I(xm=ydwm)B&r@dop%Hr|`PYejthEPur_uUdEV z%@rU12RZ2?0i`7~G)vc9_`mN_<>4~|Q#7ykhWdzDdo#=_bFSJe@Hp|w&h&k|r+O@2 z%J4&@?)}8ixxR<yoIYR8l8{!axQ**f+rP;<dPjDM|JeE9@tnEx6L)RfC*-$-ea~FO z2LH*C7w!p!nBD37(H|9%e_r=ngD3x-_oeO!&9>cOcKX&-HNP!MQEXjy(}u3U6S)<W zlP+yy&pHuuxLL%4)mDyq_3}9-GiESv5MRQxAY_&FUCt@5y3R8iRy$6QIzCB|-6)CO z^H#NE@mb@<c`o9Np+}$ToZYKXe^uGEKqLOU+mZQiIW%|QzQKL#N=aSb!#siaFZ;7^ z?e*KY{&L4n+nj}lH#;Am*nfJ>9nPfP^DQdGVsGEQb=76wgHKPs-?_@~zx2qXrOlm{ z_ur}BzU!5L^l3~gBQQc4_J9Z=%K=CU05J<Pch2^GED{Vqt3Aw|t&J}NWf(kN{an^L HB{Ts5S_B}q literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/128-bone@3x.png b/rep2/img/glyphish/icons2/128-bone@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..160f3771701e363a33399533b1c38956c15e4620 GIT binary patch literal 1838 zcmai#X*Ao38pi)&F!rUf?@PzlsjXw|Vr!&KkYG%$5kXs9A{P})x`|z^t&&=*kye{b zqYSm)u>>iqszh51mz-X)YwcW}JNKOX;hu9pyzhIS^FH66bDm$8Cmbp+q9g(UfH=(6 z8F6~arxWt6;OX9cdr)(F6!9*8cw}riJ`sh(01jcXp%@KVG%5mvz@WmeV+S!d03i4p z=Ir2|G|i(#XL|dn^slwAyyEeq${FRMSqhQVNU+=+lE#3CjB~7(j-OwNqBGe!QsH7D zqE5@J8lffUmr5&8yb{j1DiG>leyy`?mB)U?do{f_J5yVIA#tr^!S=u=&LR<S8$TMK z#;rVQ-Qk&FzwmzXC=z^f8z}mQtV7fR=?H7UWFSR<Nf-d*bNy5P`}0-)ml1&d#|Q$q zCMPGiUw&qOzR)#*%?d{p;b{y;Y`UA9TZC!33NFv-W5>wIh#~D@B1Hwx>^CS(pdub4 z?5gA;L^FC2!$@cN@4rePju|6{R`cGvSW)2h=~}bCdf;XW0kT*nolbWN7<q`yI~#iz zlS;f=w}5|v-rY3U=n!@-)f6J<SwI@Uy(Nc}95=3854K;PMO$a2x*vlzRO6&|)GIjw zb~#4KLFjx=qC{~1#?HaUq7P*HO{Vl?O+eA6^b$sVHdRtE_ps|^q-(OHdn@j_--kbB zoV$w+N-ymc+K;dXxqRH<6wBUG#z=VMwb~3l95E%yH-1k_-;8Y9!sXv?*~@h%3{VuV z6S)bSO+@2lVqc}svs|Uxfi`2Ot%qTfV&Dh%G!LEccD{U}3)C4dNJx&i2n;n6xqA-X zXyz_f|9D1a@dzp+^>EZjq3IsmAyJyjSbo{owpI(ezaS<>2~nV+K<n;e)h!#lZG2Tm zSQ(9EmX=tB)W8R~T;hiBOr1r69scGgd<KDE3>H4m4&VaJDbftKqDw`5X{mTH>q0m9 zTIRieJ4+>kIR%wO>|4@bgL8r3Y5LpwUN`8#K2$SDJ=;X}_C+LVng6`m9rf{{#Z85J zV6)0N!bvaDl!Gx57*IpGOKQ@Gyc;IuCPOtuE6-?_RA@g!i+C1Ko|ITdJ`!xLZA-el zp-EG2Ov_rxi=SmhCrF~PPy?tJNskZ{>zZervp1u*nAjU98*bvM;I?W<eGab&Y8?rK zPc(rG4<P$7h;yV-(d!s2r~zqIHLCtM5e<Xw@7?y!JeBJ2t&t9WYL&)ghnYrHX5XNZ zqn)PUPiT2PdBTb-KRSQL6bg>D2E^F*ETfvRnd0}|(=tZatc5+1NTf9f$4LK~0&a&F zm;Djn2O}POMV{fXgHA@Q^es5dBiP|b*-u*4(#k`ACgR%F%|}LtyB5CD_K_Tk;l*>_ zGaB!56NaKZ@1!?I$Oc(>P)W5>V2cSdOUkPNGI4dH+1O@aQ8WlRxLMb=t$hU+AHQYY z3t8oRJ2r+DMNXQZH}a_vqTh1IY+d&E@516l(A&>fR2shVh-3!ldA!$K(}67FuHRVk z@v<gOKG-D~+Re_XK++g3J)$TN^0uU`Ojhq3TIV@tB5FHZcsn0kbIu|3@Zd<Zo#nQ` z60?fR4|&NGgB-sbrb^9O-u6<LvFVSoCUy8xYq;}2+0Eg$@Ke&exG6;<dBq=o2Y4;d ziAum)QC72+Ax)Q~5swh9`jN!;W7Vv?#Uu&O5{DPI7Gh}nApcmTQO0Kaphhl~l|>$k z)`NV$cSCV-`X;!)lcE%-miRTD4*B1keTR<9pK4P9&N6AuG4sbWz4m9n##)7BAVEFo z#WY7C)qo06swIL2Y_%4k{^##nFM%Q6G{?RKLCaFq@nDKwmpxq<KL^!Sozwp3m}<!L zz>?ogm{!gz7p8sL+Mu%EI8{n$ef}zm^&i-)iTstF)28LGe04#!p@ac*LFsM25r-iH zCFrn09z8Y(eatd^TW^~=CS)JPHw4!OF>e(xIXts~&L3Qp^4}1uBClNGDDUu7dB=}g zF`Hc4WQd$%bM1RFygoPwuarM+Y%L{|Sr*sYr`+A_>mJj?!`$oqSgO5BgO=_`QG=Fg zvxT6f&;q`93(M#cb?i?4X$2xq%S3iI7TW1<JBlhQqkK0@8Z^x5n-`+1F@G^AU7B3} z3|&XReAYk84<DA`go%8(t!^Yy?qq%<SXgde%s#l*H0@4bsZ@Dy7zUr>cO;ZyGf=In zw`LaBCS^tLFxk+fech&MyN$C+IPKOWEh^;&N|!tZj$lMxN>BslQnKYMKwNf4Uz|L< zB8sp_LYcKxIw~zzOoR(v<r`kDNqF5NS=2FpzXxhPv7%HY!1|K5EOc=`kT^cR?m|3n x;Qv3J|G(gHijGrk{KbktDH8aP{XilJP)_;z(`&TIucrV6U@mZHx?{-Ae*xf6P}cwe literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/28-star@2x.png b/rep2/img/glyphish/icons2/28-star@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0e395bf1b8c238b8dd1ecd25c2562bc11aed8e73 GIT binary patch literal 792 zcmV+z1LypSP)<h;3K|Lk000e1NJLTq003YB002M;1^@s6<uq~*0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!x=BPqRCwC#ob6G<KoEw3@jvN+Sb=n4 z=-^5S6{sDA3d9bu1MC1h&<YG4gbHwXW*HgAgbO5>UGnbCO;Eyx?3;ad??Z?C{eA%J z&PH$n1b_fA2mk?K5C8(eAV4iEiek#m@;%%ce}ED>ejx(7u~eE_8(N);AoRp^_>mv) zqbSM|0b$LRyoLY)@$=tnASf_?29_~oH3FRH?;t<`{Fug&IRus9$1H{{Mu5BUJqXYu ze#~OX6oSs+$0UZVMSyGQ90<??eoSJ>41zrIV-7=>BEYqDE(GYa0Ied3u#pY^7EP|T z$C~GVHgw$$;Vd(o14x7=9i9d@?TwuOY(5E-2#kakwXqS$@3@*G=dW+33L+6AI;<~1 zNoZqqIdXn+Q%RU_h#KdEg<|I~_&bJjerMwV*-FCEFj3<8tvvO?cUN>$hRThy2p<ZZ z&);F%h4WR6gee-h%E&rM(41&9a{RLQQxSqBu96-CUGiJ1oX$6NsTc{1BRE072e=$x zBhlb|H4zYK%n+=$H!XmO5c3p3gH_U2p88zdy{es#CJ~ATqhLqQk2K!rNU8H(!w4En zpAf*)oRK~u00hvFAJrJr7y*gVzHdf=I#20Nnpq5~5<sRTd~1K6x1UP$U4EQs`=dT> z5s-SGcbK=&r7>C-4PT>w12K9!^D_~!mFa{{$>$T9#;ELrJ|80j>f`4yZ@(!!LEbyJ z&Y%iInh=y$B-%MS*K3_tmOeSz&MOjh3IY5|M4q>2*01VzCZ9>954Gi}mIWDR^69?M z#`fft>`hX!e^g5ZxD({en%od2ea%jgq+(2<MS%3EwvVe4?G++$pYhR{K}8<Wuqc1P z&r7HUa@h#*ssTe91mJ{NgkGbSQZ#BK+RP5b`e^u%Sr7mMz#sqwfI$EV0PDbh1sDLg WFb}|Jz*9E>0000<MNUMnLSTZhxLBkB literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/28-star@3x.png b/rep2/img/glyphish/icons2/28-star@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b4d3a7d5c99eb04b0d78a1387ada7a6dad47c1bd GIT binary patch literal 2214 zcmV;X2wC@uP)<h;3K|Lk000e1NJLTq0058x003YJ1^@s6^3?mG0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU)NJ&INRCwC#omp&DRT#%RYdf7z+d$c* zEhx3Eg|<_}R#2e<G%*N7QKJb$L{Y<oia<1|4<ZjjgqX;ZxJGe_fcoNti24X|BWi-6 z(Wr4nuteM0I_>!T@HXC*F0<J7-aFryoSb{_oO91N=lt&Xzh~wyu2d>jpr)3sxwQ+_ z6d*MPNKFA!Q-IXe6d*MPNKFA!Q-IXe6d*MPNKFB<rN!g%lJ@rYO3Af16rhYPl}c6h z^z>X!Uah^M0A*}0m#da+4SAjRh60qSd=*5a(XhwknJc-ht0_R4$k!xNm_;9Xv#e{c zC_tIWS0h=Au^MK*Nqa>BN?X2SvDjRosWf1!WW7~oOaV$)z9umHlIY_xHhEYNvwfoW zjsld9e2H8&_u1Uc_GaxJ1!z!9BoZQDt-w;<2dXNSF$HKyL#oD$T$$vnz${~=3EE2v z&|vZ<G8G=+<0h3c1!$<**9G!rf~%S`^HjzZpuyy;r62j~D`Vrew-lg(<ZGxO3`NGm z+FJ_H1@a~GG?09mXJeF`uQH|p^_8y*WA^18qNvx9v2ogK3Xs`a(vYuSlmE#s*Dh0l z%+fTAEZqyoswh80drbj4Z;3>rgwzNW-ZWwJQoe;0Qh?M7y1ToZNYgW{6P9`kkXo;N z)n-_&hI+FVAeAqXuUWuQm?3n9QcvnDKzVG*WU>({%Ig0ukud5vDM0z$0dBX*P)(NA zYp6d*0m@(b3X*0cM@3nlJN3#~Pyx!%*;iez5+wCyKl$2+UaL3~i^W_F#3Cd?{t1tb zK$B4h{}$S-$>|7myQi_ARncfv`Z6#Aeix-uscxd*`+-0pr2zdm5Ge+sl+JmW&Kbj| z&f!)tQgycSWgbufx{b7uW&bey9Hf8#q_4IW7Z+RN0pFGZ$nW>dImMAkBvMW!dWcSH zuuB*>fFCp5?ez5YeCzReo(7&HKA+DT-`#3Ys_*LRl5-Qec>NwaY!!o(?-ND2%}65j z{=&k-JpgpnD)3kmAQMOvIy*bp;NKP?3gt089en?7!C>%3!1>K`(bvlF%8+OTL@S9z z_j3f!%QtxV-beY~yMX6_m7<Pq05VBh*pRe!`5<YAWIcmq?M1SVTNNH#0AvEGj1%nJ zfoMGtO>;0j-|_u+6Lp>koO70+K-lSZPZEuQXbBN%Ge_uR2TIlvBF+wGS%<A0b!-bz zFGR^?vLTU3h@`FMXbspM9L6BZ0r8yQ@89e7dQaE|9$Nxr0x3W=y48qAwRVMvgWwyY z&UT{CD}WQVoBu95zp>DWMvI9?_c9Pm?R0`|oG8CT)Om`i^PZiej$;5afmBU2x(kTz zHhvYhIy~*bvyZ5=4{(08bKkq1^3GJ_1bY>dwt>O1?46@P{yCDh6L?;-Yt(ThK)n!= z<|1nk0Mbe;Nt*OC;2c7(o+KTW|Nfj{E+@XV8HmOajn*5pv`P!W^D|NLS)$G!qRwe2 z^|i~Xul+V8?FJ&zgACrxQIxDth&)dK&p{_hR^9+)lC%~iZ3_c=4Vy;t4vG%IeHXdf z1~|u^2#=VfFKLxQ<H(o6dzAwvHj-`AUYvGcGun4-A3Oe<Xrhm#D_E=;;ikvZ?v>KM zlg;q}#pCfZWUO(dXJpczv@7i^Kz2UKbGa6g>PM;VI?`eV$fm{&OlCn>u{c^&`N_1u zK>SdEY-q7qOl};!bhLg@ly+&qM*L8K>?vO}NBiP4Y2SGIhXQ0n`C3?z{!_<>%c}9C z&8afxSb&g?V&tQBv@bZ58yCe7@kar&mwd@Hf2LZ*mnlw_F-HPq$X6SSQ*zwZ*;Fd^ z5&4-M_fzFm8FM5+$b}!-n3KzW?|}2Q+wFeT=kqNge?-=Eh(H1HNBmNN>>*zbq={LA zBNw=T;PrY}2LgdTB_$<)k?-?(Jga59e4eFG6G_t*AbZ#X(j{5I^DBeA2VkxXg+j-A z{{)r1w6ydX+vU3J-BK<KpTwVq3XsK(a}7VKmBrFbssY6*;Mfoh1~&psq`yLP*8~x1 z6Xous{7I>oK^vvw7s;mpS=ge{sN6GFpYE^EfN&0JdJ~CS0UWOnb?F7tRzSHoq&)Qw zN&Pe>On#NF$G_<ckhRZ$7Nk3UXYhZb>{g`dMkMN_z>$tgIm(}+-c8hhO!kweZ}LE^ zHU-GK^5tVN<tZLzLx2+}dK@RMC7SHa_JS{|NBv#0AJS*C-yy1$QN~d+<|u%Whq`z? zUN@M0F@R_Jd_U1+QCV5p;dG<UV9`kSBl}~&FU$T1lQI0OjYJ~#3XnDBOMZQxG%!1< zANYJTC(3saJ=*`zw&h70?DtOgzlnCfm-Ytm@ggU^BEc~LAqzstd=|&|Lrw&V`H-~C zcx=kB_+Uud3(}6XN4xz!D0H0oDgG)z7BXa^0(rP#_QhbGVcXu~;^O5<%@@Ocfx97T zU((((`Av!T|LAWvCjKfw){?K~B=b``x>)~;NU)Bmu#ti77)gI<uakD=$szJowG-lx z$yd3^ZG{44E%}n!SMPgF|7QJd<f@Hm@K&xT$~i`(^L~gw;+OGJg;QkA5da|vW4gM! z8Vvb5&EPy93WaWF0DrfFfB11){K2oS;-7KH#%1_DRsphxd|gj=F}eJ`u#~~t&Y)T9 zmRs=$zjm;Atw<~RRKsrt$O1Nlqx&FIF}u9H{NvG*taKy||31afIrw{^;NQ1D+xy^k z!oBew9UYU4ii*xKKykbHoJ=PDu~@8v6YXCVAho<Ted(^60;Hw@sVP8e3Xqzb0;Hw@ osVP8e3Xqzb0;D#)_KyGq026NH{WqNcNdN!<07*qoM6N<$f*I~Sng9R* literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/33-cabinet@2x.png b/rep2/img/glyphish/icons2/33-cabinet@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..80322c8a5dd93c70c15ee616562ba0c3d3eb376d GIT binary patch literal 456 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTN?DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg42)TxE{-7;x8BS?DA;5mz;N)PzW@Ab4(v{<QB89%G?gW= z2Qjh!SimCp@8g_K)(H&dhP#a=?G1XibM8FN`_sf%^2J7F77hmn1qQ|i&I><YD3tO3 zDVg%7_sGMzX-`#`iWZoP{LxRJDRNweWyj5W(;sF#mTqENbM~LS`b?QpuIdBMZsw1F zHA~y=N!gPgW1l12GiPx}%O-{GN9G?(zU1L{CHJerD+Vq@76v8(2F(=5eUY9A_D<~) zV`OYu(lY7WCMJ>B?P_iR!(4>^ocjE=xq<b=+Bvr+SSGM40^P%L{Nfr0t;E+q|2&&& z{+A)nv4H_-&WWa+6jjFWm-sna>lzqeu)koRU)P}Yg_(hoqoH(x{DeztZ|wXx&71or zsJf?K^8oAp8heG=-&y&q8D<**ec8Zp>4NBlDF*x=)!DBj!*z~dwEOCOp6kL|`4{Xu tCcj_z)HP_q4LiUE4w;4qlb;+03_>&Fe6Ls}O#(&@gQu&X%Q~loCIErEu>1f3 literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/33-cabinet@3x.png b/rep2/img/glyphish/icons2/33-cabinet@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..aafb7a6770769c843773b77fc54cf7f82239a349 GIT binary patch literal 1420 zcmV;71#|j|P)<h;3K|Lk000e1NJLTq0058x003YJ1^@s6^3?mG0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU%E=fc|RCwC#olS@wMHq&=tE+2fdv-S= zg!Ly9bwk1m9uf!=MMWjSlR@yLmp!Nl^`HdQ2!evQpeF@EuLkj|2SH*^!Gn14BziJ} z5(qA<>+Z~S^`GxIX+bX@>}r{*dLQ_ho*ceSS3O<z^-uN0P18h#{8tp4fKVVpfd~a6 z6o?QCL?{rUKqLtCBL1hx<MBCb?Tc|7FZt3DP1Ag1jCm@{vfn6Bzw+$M^ZaqhbJ(Y= z=-8JB5Km+C9Zq5WHncSIao?r_91zPzQ9OnNWR(K-H~Orik<X&BSA47|aB$p*c%1_E zIQk$?_*#(Sz({d`oY~vkJ4%7vk3MT?+)Xs{YUD9EK#n6`VG-?^s;XkdTS}?@^0h;% z5^+1?rgq!O;L-k{t|6`?k`4lC#MOlvH5cVfrmpLxOUL}Zj}WFkcwFy%(MlP2l(EKv zQcxh`Jqs~~N&Qon<$I`q?h2)2aA5zSwSGR!vg;J6`}CEf{@H*)cLyX;jA_j9EX+}R zw)I6w6g|{v;hx453PdOnAry#EAVPtN7wFJ-xM`YC5tp#(`jL=Io{&U5itSSr$WM8q z;c)n6nx^mLYw9|EQ54J5>GWnuM1g!2NGX+Tt>uPi={kQ^RSJKjfIytWe6RbgwabW? z(AoDm5c6we%-hH%k95Q#HD+)Ep_9vYv}hpEgZO^Nfj~oyY8MbT>h`P>1)6htqCC$J zpjH_`phK9>8b^7h{y9{ZrS<iBZ3@&11aY24N1v8e5csEKj#8gQ-isKCYUEv~Kz?%s zoqWV`&I5>hLn@yCQBV>>fd~a6tbuv~#c5L4^;$?Z2KISP_L~AZU^pCZ8Dr$4-@$+c z+EPkw&Hb4zm-P_VK!j7+zmezpzN)I8!4!5|KvUQ+Ns@dx7z}==KpnBxt`tS_0tC7< zAc1~L)ASPx<f2fEW4T4J9g;vm_P1sYL|8-<LV*YcA{2;FAVL=GG~Ojm(|n7M?+`=B zspXX0wC^xlr$Bzn6QybTQIaI@;%nwOeFfw_)^CRNSZi<s8Dn-3vU<Y0&Tp;F5o4|k z^IM|XK9^-FD>F`G^9~1TuWGHoh;F<^HVLUcLtGa&Tel@kd&cAOd3?X$fs|K9qtRtZ zG-+!g3goFgB97EPO6nD*)Q*ek1_JF!K70<4Z$N=O76>)USy^0&ZFxj?!%^N1<b5N$ z@rI656v%Ih9+q&Nb{#pNivolf5(xz&6o{|}>JOaV$cvknL+TjWU)gU8<bX6y<?8Nd zA>AT?JU?o!_vZejgzLhH_ajhQmLmF~t=U2_e)gkt7;)u&jtvFs$Ye4ZS!<s}gWej2 zajQUTzH7#qk5^V!{-8iz563v(uatT%v~^+F-_Nl**8(ldX}pX&+kurA+lw&T@;VTq zK!gGj3PdOnAry%Gp9J?nnNsTKIF5hqBX|2U&|9#1kOFxKIycI)?7T7NVjuafwbAbG z?gdEtG6nJ!j1sGV$%O6H(KKE|nxcK=BnzoML;S6b8Pn<1ARcOOk97HorbHgSSXx@T zq_wU>YsU};n%&)oI3vWXh({dcyo@|w;d4TP{GY-!rmv)(zFc+q1o;f|Hldx_1|<;c z6nQk{Btm{!`EdJqNM|Guro$(&S>kUTr9d8o&fdhwrsK3HkoSWSYe`;6Bov5HAi^4` zcd9l*d8odkK<*0P3F1n74=WEqAX$O(z3lhg_YK#D5!OJ20uc&CC=ekOh)^Ixfk+Vi aDZl^}R0dCAYKtxa0000<MNUMnLSTYAE|^^a literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/53-house@2x.png b/rep2/img/glyphish/icons2/53-house@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2c0b152f52aeb36cf10793facc7312ef59f75670 GIT binary patch literal 549 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTN?DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg42;J;T^vIyZoRp4(D$%`MBBq7rvy3s4={Lq2|Aa?Y}UXl z(VT6rF}G#T%cXZ0D5o?hC@(h(^^jh2>*wR|lXYA~me}8SUQjBKdV3qIr?@LC&;<+( z4M4jY6GCP!yO_r~VMWdFg=OAGO+s=1n&XoMr+oOdyTesO^)2hyDf{^ucAf9Nwu^J$ zvpcMIH$P{;YxqAk|IaP&y~03c^ZyEU2XN}w%g)KFsxy>kcr<1IKW@f`*VE;dbgBdx zIs)pZoA3U@$;2@6)ca4DK0oGY@Oawoydo`PpGHg8qo?bel)5dILX7p|S)5Eif6{l{ zak5DJ(6oB-m45^hOE={{{PZsUB>RE54b_LYbVvLXIJ9^6(eozt4D}1&S^qaH`svJ( zH_eK*>C~D(Clyz;Jk8&7t()cPf2R+|IYA)){#%dbJ5Sjw?U1~qvr-`B*i(O|hp*1J z{Po`R`1GE4KVP$+&su!!T<EWzJ_SD#`sH1ic@FppDePX`At?FvI(IPhJmv%b`?f_F zKbvy*anVhWopOZ?X7iuFo8oj}^MfVPf-DRS91IKsz<>k?CIbT#0|Qvha_N)(YDMhu hU<S%Kg#8ptV3_by)Rb4_5-1@sc)I$ztaD0e0sznQ=PdvL literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/53-house@3x.png b/rep2/img/glyphish/icons2/53-house@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f4aa348f21548c01eb166679f5263e430c540743 GIT binary patch literal 2086 zcmY+_c{J4h9tZH>EEvmJlCBw=#*DFLiKa!3$6(4bSxb>!CdtlB&FFcUhA={?lpBLl zj5Xr1=AqIvLWU@Nk!8@OiRdCcy0_<^bN~2$Kj(eEf4tB4d%owq*ba7<a4Dn|003}n zE0WXBOxs!BF!7yzsedDXXCSC2T&Sl*FH*1iL{I=TzffNa+B(?BpW;OE@neL)q7VQ; zqTQNgc7{IuuWYxV-OkGVri0hA#)8dIGM6#;m~1&Nuh)|8j@MbrlW&MivywiO^vE6B z5TFIVn@Mg3KO@tfE^sy6J@J>4Z~aNiwY?<cV9vuWEY^+;g>1%5m8sfYrI169AK#8K z%E~hF@9r`d9{KPsXDCZiSy`Ev$J@C3QX>y0e}bt6CMlqkFvQ&;?tfwu;0R6p5tnk; z*VhYaSFY&4h&tvL3&52)*2QN^6dsg6$^5Oh!&__!%9vmPJ*t1sd?cdB+mRcHGL`2O zVVZ8Uso-DtX&DeKD;s3UB(lwgH63KiVG>5coFt8RnWIKI+1uZ8;XD#2C|!=xenYv2 zMK`|OgC!m#D1t1jS$yp@TXdB4T3gVOsn~Yf7_QR$nr>;mXcuZ+;GlIzuJg)mfT6<4 z9*L;w-b8gqx0#JpJ<X54f+yo)n5me`mX>X{uLWd^JW{)tE4CEYRWSO_L*!RIbTf4_ zh)JnueO+;RK0A9ug9MPlfqS`IYM!k9s^Q9?ZRr}VWB3Q6R+fA6OW(lp^A%JY%|t~; zy!s3MDY7MZK(+<0kQ$mE@qIWxQ!t^>S^b<T1bY`>|GgpU>oFH@sCU4s?{*<;mIdmK z(3Y6C?MexfOfwx1cm>(H?&a19_}l|PkPznBSLMmxEC8oJ6jqV;Lov`EB^amasMK=8 zh|$E_p0NIB9%ICHHDWbVG#b60Oq1CNo&2V|gipNoVl^CCDGXtI7gu0I&sAX$fTv98 zC4Rirbb-xEoUw#JlgU*OQ4?_>-9zA%=rR@$Ij7X#gy@V4s)KMFRY_JKm^7At86ja_ z5wO2mkA-k1nLb6VBIA7o2Krd?_iePsFnjV=fNM!5;S{q&4pl|iC%i6%q6Z<$PQF>t zRCAHCe0k>gFlUpaTM+Gpg32YDTR3%9t-jp3aKv2r84Q)Q=KtZsp&L@9NbO$bXd7$e z=o{@ik#tl-(;7yOQ2u5v(aQ-*sLH>S6X_rE^v>kD#4@9JVE}b8ytTTGDSX&QnEe{k z`W6a%C!>UdaFIJNiE~^GsS1L&Z-~0if|h@!M%(}iWZMXmN{Z#pUUZqncS*R62*)jb zQ!~H2h6Dqos78n0nEpO))91y7Hc}weMl3zK`@Ce@)rqXY)<_%p+elH_{=?oV49S=M z&oItI<i}if;(J7i;H<?LGg02b4+G=Hd$l`H16*1JYK;sLj-6f1Y}Yy1c~FqdfTASt zr$>k3Ck)XgFW1gbo9xSu2{d-Yl&X%WZ&w@`HqsLWuo*pUkJ&EBV2ppwL@zq2L~Sb| zdt1Sszo&r%9-96wZ#M{ON}p=ci>#rE=hS*M=v5Iu@ug63jEc}Bd3oOp8jSQnnur%; z<Z2Qp{TVaU*M%lxJHM#0D&8{IszT^2)@xB;VXHxEU*>&kY?^LR0wIsnIT>n^sLthL zmgVTXXfb;#;jwe<EKj@_(JVK<=$W=|)eP$yY{h>5q}vV=oTV_J9QY*s7O2<!^{(K4 zwG1j_R(oX$N#d+m%BO5RWC?K)j$rD9!AhL#c(H*Jooeld<^A&csGUj0m&T~hs+0D7 z(Ki1Qz7eM?yKN?oe<JGA0R%#35lS>@bjQG%E<;vd40_^T*BW{r!<<H3ospDQ&$L7; z4Xj7VqJq8^RN3#ZJA}x2li2No>Y3AV)FwyTxw~rI4!HLWSe>4$&mr?y<(%rA>PR@b zG?wK_w{2Gx^EON6D6kv@z)hWhk%AI#5?WK|y1QT1t@7+uDq^mMhJKdq*POv6mhDRL z&wN6-`Ycv_>}LE}g6w@AMKwAc^*X0n|1qD7>T}4w_0ZF)#r@cPGcg3!z=ri~KI<!M z(i0Q>(b3VNF+lTIzirI`y^j<r8wxP}ld$>a`~A`@fo-AIkBMh8^kq^GSvHgl@${%^ z*%bbyUZToH^k&|@32k}BU<<;xf6Uh!=h$^Z;f}9!HVa3G1dpf-xNoj<Nc}|dZ1%|w zm6R)pz_1MXNldyIAkh9kgAp`+tnHZID9t`@(OeO4o`0VCh83k*X(~ax!!DolDS(r4 z3rqWlF&4}%OIVs9-?63CK~X8Mm-X**tbcGN$5l3yA7?fHsMcdtS5sc)H}-<6?w;ZN zsf%B<jG6sov`NqS%j#o%E6{;m;w}bq*qT%)i4OyPO}tk*(a&=hWs6knbN%I^0=*-p zR?J0s4-Wdss6`MKyXEWxOOsQAknXx@Ha0b3$JlYPdB5M6<f`))N=wR4opW~1PrS~K z4kp@#7xnk{ei@#wtvxsXCJ8Yy7^1PfQKNmj8=QwSty2MYDEN#lPjr-k9Ky}2DIU)a zy)N_(0O5t}$8BT{TTZD@Z&=q#{*NWV@o$#Eq@OJPP-+LPpGy7h*N?b!a%g60KH<iy z)*WnL(QXqriKU@}Fzhh&lFV)xw8Ay>?P2h3#3&IlGy+$Uc~4a>DjzgBy>O~<FW>L& z%4o(XM0eb|%X^*#az05L*y8OB#s9wy#QiUpKg)Ky?Pt9};y^gWKnR{xc)9~WV12@l JRAKJT`U|K{xX1ti literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/63-runner@2x.png b/rep2/img/glyphish/icons2/63-runner@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9398354912479465db79392c1d3ca2eb4dcdd482 GIT binary patch literal 905 zcmV;419tq0P)<h;3K|Lk000e1NJLTq003YB002M;1^@s6<uq~*0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#D@jB_RCwC#T)l47P#ATiP6$Ls7ND>o zB&7NcXrF+*0q)8GMLa-Li5b$N6N~c%G*3W~fQiA`*q~cSM}Sz6!uiClWNzc@>jZOu zI7j;A#J;xT@A&(@*V$Ms775`FJ*t2NkN|=NkN|=Nbb_)hGe`khD49YAzWlz8nA1=w zI>+W=&EcbdzrRlcx>NoTn}dd7yC7jo7t{?hi!shEAZ7w?T8v3a0JETIacVK9AOYPW zw-_@b0UZI^jbuS%!;nMQ8Bp{w01B2&Xb&>0?4GFfbI3x>KBw=mm@;06JcF`JU+>L( z0-*dy*c`8MiLa0wzLL=MT>0sm$`@RLykHu-n)3fvki6~deQtW}^CgYETG>5=8%Yi4 zNKidU0)wv>AW#0bR#fdYSc^&dpGbiH)1Pa~pF;+9L9}8mCY+G~JLOBNsrT<i`KFe^ zP$P^kXhr2q(ezT=y=SUcagMm9Cm|P$K3PDfeU}-lydhAZgkG)t8iXen(}jALRK?p+ z2=FNl%`18TsKH&yr22!J!*gX#pF<!ZxH(}ce=GUj$FF<(C2r)h0-~~S+>j|1u38l# z5+GJ`-{86iYFwKelWysb3le&PDSzLf{J9p$zqPouq_IvW=z9SvKV6ch>h(hP3BCvU zVR`wntNDS=fDFLo!;kcO0pCwS+Fg9S)pTK(Gh?Al$VkEUrslBpiBg{@U80ErHFzGX z@<Sp(($1eX$6l#cbdU%p4TX}WrF_RQM5^Bm*6@WE&<(0B<&R6+4U(P~J}o_uIR<>k zlP-bzP}?un@oSJUQq4LN&?QvvzMEWJhA1uSsj3}FK*uCV4ljzHEU9kat7R=DpkoqB z)dPB}S`z2D1UdHE9YwV?5hO?(TVlgZJ2WH#|Bi$rF|45Q4bFN&DnPbb9=_dz1YG`) z;<zLM7nMIv>L*p2a5)x>b>)J#)=<9SLo5V1u>iP;6Ig+)+s|5_dJXap=RYO^>ywZt zcCQgd4ZbBw0!RQs0!RQs0!Tn?IDbi7x})B%qK^F!o21v2H@x6M0_cJW5<mh75<mh7 f67av_mjD9*&aoB;;R6bG00000NkvXXu0mjfZPJvr literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/63-runner@3x.png b/rep2/img/glyphish/icons2/63-runner@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a28eda6a569e3e94776f8cdc86da3f11857a8192 GIT binary patch literal 2242 zcmV;z2tD_SP)<h;3K|Lk000e1NJLTq0058x003YJ1^@s6^3?mG0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU)WJyFpRCwC#oqLQ_<r&7$nVs92SzU>O z7YvFLD@JRz8l@@;UXpqzN?UK}AB}BA#2XqBFBq?Af<!|>W4vpWqzPctHnq}(v|b>o zHYT;D@d6SNi=wbQ*WI1|UL6CBv+~XCtnr-lJjt7#Ju~N=ne+YjdEfV(@67tOTFsNB zc9qZ}kOYt<fFuDV2_Q)lK#~BG1dtR9C3OfouWGg0)7#rSBauj)%dZC#1H{|4T5WkI zlX*S}f-j=-S$&;}?wl%>idQHUe&zfA-5l3Ei?Vi%>rWd*C1NwrKafhL7Ugm|0VHjQ zr?0PXmchfX-Me_XInexcI(={0AyN(0Ie4Z!!ei>;4|gUpT}8Cy0m200LPvPMvVPy+ zms;t3Ql0>kyu*pfZIllai4z5oG?vJ>vEF`!0Fu0}VXT)CKvH5D>m>z{^w}`hdq)6C zYuf>V0(w2MLIA0af0J0+;yT52I{o`xF4rr7Vy;XkQx1Y)@xZ{q(iQ;vBR>`;65$>K z0n`EczV89hCSo=aJ^O8!hwM3C^H?gCnuYsp3H@i+wXlw+GJ|7GwOXBAC=@ONEIY?D zy8iTsJpVV`>cwm}`zp@!zp%TH02)CVNF3X}z3rDbwp!N(G#jG;POJf{R4QHNa`|Q) z;?xmxqPK9GJ1LSkNBvkPV+fB|EEeYu4i3)d*WE^FH<NIn0wB!+Bmoo^;W}QaRGJDr zSK&Upjo_|Qz;iSZ**>;K`IyG43j>@phy}p2*LU>CnUDH0jg145x_(654m{(Vbx$s} zptb83j@q5DBKl(i6n=QdQTNQleU51afHd>hAP62xrBVaC+79h`fiyUkZOnAotrb7H zs2|&84B+Vjp4))ubOt`r0MEa&+3Y-Gl}l@lOO2<7I?~aFN>Q(WB3}d5JFXePb0LGC zZh&Va;M{@x{M`kf{{H?^Y|C2zlN@(%@TiRsIXu4xo@*KOT!WMJ0?)m`vmAI_QkUJX zb3WVpSqn8#zr77PP)OT#;5nNCx1xD;lWy$sWHR|A@RS|9x8rc2o7h%Q3va{sw%-#b zfWjow)3L-|cIQJA7@o~!GV>{#o$3?783T}41KYu#6n%h5H%Bt)_c7o<Yy#HGbUJ-Y zE|>ervF@?dbph+0-9qY$l_FIGQTJG(I~$idxk<bJ26fN%)IIB5;IX=gZJo?|*R!o| zp%McJV$df7&+(1$u<RY+nTzwh<$5I?aQ4H2u47x{Ty{<L380XR!5-x`++qVfHg$9X z@T_!ALx7V6#>;_iio?t86!r!$;%A)WQUlqS7NqK}y19r4JoABPDeySWTdB9~X9Cf0 zJcl#M?B^BY5gw*h1BF}+<iBy8hk1A?DeK*?uC8?ev;rsD+Cm3+2=Ls<I{P^6?^C+D z1?*>QsZ_ctj)iul0HQtLoJ=MkVqkNC^I5Ai{{Sbzfv#Y^Ne=MT*w=Fu<tu@9iaA~b zKxKaaQ~-tP!z7ayb`7f3MgeYJ*Hj$nV&B0^0A>~YGWRK4&1B_PLp^o`%NMat*Y{#y z)A179TMhgIC~RV|4<l~CeMURL^C9ruNBUY<Uu3mX<J_MEfN_SMOKKqnpJL~!h?Od$ z!v)V?^}6RMhnH7?=Wz=2Kbzy#WpjTrLv)6%#3bTMbzvb=z3aLdfX;JyJ@w8jfb$r! zW6DZ(@GbQSpm4d*(Zo!bIntz<59+CFL&Ne{0qf1LXEwGQY~v$-E>RI39(e3*^Bhvw z1P6G&0G@?(U8{CTU0)aP|IFv}Gl1}nVV;Kg2SxNU0Td2+EOlK%p?jvw`5PcvM&0u? z13Xms_c{+>kK1vKZ3?SYDr11?r@#|9)IDoSTMq)y7EcmD_3r3UVsDqahqij2r77Ve zfOeEkC@VU=t{2eON9lfc0n`EEEdM3eIXKnfq`Q0i`ufhXi?fmd`cl+1y`-hrJcnCv zfM_!H(r=5!;+%51JXRnHAOpyzdaTBUHZ+>k5D<;6R;%Vj3+di|EQnMCSsJqoRn>;Y z@3Z`O#QRMk@~DNT;YN=F(Jz1~CxG<%{RXJk<4(7b-mam2U(@WKc|fwW*G~b_t)#T^ zadsoM7T<KGJgF_4%jH&NGMQg?b#=YKvO*JxGIp<6J*Ax#SBL~q6NYe}gq?BD=ksp^ z(q%lp1Bl)oBBh-JNY4P#<v`RUfTW#7Dysm|{eUtHuvQO|(hdNkCH4&<wERDalN$*j zH;BxQ{y=J*&f}+TE_4%!5_D<TY}>YNF=_2AAlgR&NjpK*-QB%52!hLSqucHJShJKy zx|;$#FOkwNje`>jp!VEo5pHxPAiazmRhxl?8=Y1vmG%@s(ok;n7iy!Q1JPn2+Sml5 zJst0A6+j`DxkqgnAbpM-**AAAsh^bGQJ)a+MgET|jBna%3u+L%joGH5`fWnMCI<KS zhIvP+xe;~IYrP1^*`wi)Gbw<+hw#wloJfr^jR8BbK2YrdRI%?5vTIxo%WJJ}5BJH& zHl2s<4Ht{WiT(ZkPtfg57@=LHyw2Wbp&ID>BphS9owyspU07<|Luf>|h_<g$DUaax zKPNQzIjSj))b$(=bOLq9PwMY~IR9?Q*0tL#?6zc^T>pu6RKyyg5mA7$*{oegm_-qN z93a`i4-R8<wyw?TIfxiXSN115s--sBOp0(D4@8@Y6&gO(K#~BG1dt>NAV~m80!R`- zk|cm60Tg!m0!VVzH|7xezTZy_3LwcvJ567$)oP`5I=v<cf-M3_+I6n-{nd#?VlF@b zLu}&lLVn&Bi_hNdPD@FW14#l%5<rpwk|Y5n2_Q)TNdicc1d!A*{a=6q06LZ&4i@W~ QHUIzs07*qoM6N<$g1)pZmjD0& literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/64-zap@2x.png b/rep2/img/glyphish/icons2/64-zap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e615076ff35a7f834ea8bc87345af2e982f116bd GIT binary patch literal 671 zcmV;Q0$}}#P)<h;3K|Lk000e1NJLTq003YB002M;1^@s6<uq~*0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!K}keGRCwC#TisE@Ko|@e-%SUm149Ku z2Pq+TfE5TGKnGZXT7g=DT7gi3u>$;V<bel%hWo;>d+yFKnPDb3WcR+mz0g~&R+(@< z^dx`;kN|=NkN|=NkN|=N*on4npX^dNmKYU9@gV`?$gk}3?pR`J<d=xgmXkzk<Gg>Y z6y%G5)-IQkxBu9uv<PSw0deHl4)O!$sN}PxpxSx=R9#T~?hjqhw_}M1+x-o)0D0oO ze~upBDGTssyZ=>#SbX{kefyVViCYsu5pbs6zhodET>ww<q#z$Q1$AIO>_Z>P6Ur0Z z{rfOOGvrVsU}2Z5j+b59r$U>G;RIM)5058UdWhJTBBr4F1ZzH{&IE`Nu<PKZj7&?= zZYa}<SlGcgsSRYQpNIuJVxU3Hk5OdmY0w`GJ^~z;^u%`mSOWM32qfMgdE2LvU&)F% z-%!>^d<BKB1{nEG1o<--^5G*OqV<Hd8z=>cY(0kzr(i58=-AftnT>qd2#7e2gti;@ z;R5t`9Xmh;tD*XPfi7E^5DP_sF9JNTB2v|Z9FY8`1M(*<^#IY14n6#}V+nWz4px8; z4&&*HG2LI34%7#_Ie<!l1I{Rg`^hdq$n7ued7otx-iB&N-mf!KunACZ`EI~C0jClH zcTCoE3N>J}0}AF_osom-wUo^ch|c#<Aq8!wpE?EdSp}fa`>ZKwy0#hWEFmyOK&Syt zmKdmta4LD9whc`Y5<mh-0I?teB!D0RB!D0R{vUn?7y#xCJNmY^+{pj{002ovPDHLk FV1j~gAMOAE literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/64-zap@3x.png b/rep2/img/glyphish/icons2/64-zap@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..26b66fd323ead45c7aab1e4b0b16530d076d3f99 GIT binary patch literal 1851 zcmV-B2gLY^P)<h;3K|Lk000e1NJLTq0058x003YJ1^@s6^3?mG0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU&-AP12RCwC#om*^FRTPHLTsoIiiU<l7 zP!IzIG)hs_P|~Og61=@=c+)rIix2wbn+Yarydg+}7Z433q68H%fRP8(Xb^~2QIu#5 zsE8?o+<F=2>bGS~2x&W0dXBYc{eQA@rlss@_xa{uYn`)aPpnd@c#?FXiU}Y|07(K! z5<rpwk|Y5n2_Q)TNdicc1dt?vBmwllR4$jBe&)=X)>tf-<;zmQ!>5_sgQ-+%dp4Wx zj_MpHjlY2IEtkuW0Z=T2vEz*W7O^?X6KED7+-Ed#6YPu(V|?7_WICO0_kBOo79Th4 zKJz%qv%?ykvA^K3CLD7UKtt_5E^guEjt>c*BJQ&j_vwoIT$%)k6Fh;qI;_8+vG;IT z8+G?F3lJx^jYCUF@OZe-S9D$nEX<`jfN0xY`f3BBOF{zZ2M%w?<ME0BilAt#r*M*I zIwK0heKMKMF5G9AmH9LW5YBTahdCh){~P0P!F>t>D5B|$xS@LGIgIqRkJx5uPE7$s z`kF&r7ZN<~!r@j@SeF2bZu+{N!;FvsYG?d+NMD`+ilFGcE+&25$VpCx08a_``55;( zVy&h$0}!dJg$T=i_5$W6YwlwPAXhvW3WYm3$&<rq-Ep7Kai8xzgE9e7sZ?sleP;2n zA%x+7!Fje4MFAAu;@MsInHJLUn;3taXH=1259HEUKA&F@)}438UC8*8aJl|ojBat+ z!G?y0r%83c3!q`7VzGFIOJAJmL`Y9DmGP$nP``B&@T^KElPBds!!1Y0<MTOO^B<(i z{s7v=@39zwI#mM=zx3tqyk9g_zXR|b!+l;RbsbU>J^a#FOIWuq>TU6XXQS`??<Nun zPXG<S^mQAD=|c$6e%$YQ;OUI)97pvJBXx}|6bkb=ftewK=L9v+E9rE4zuNd=DB!u7 z&S>^ftV?#O3wU;ry4FNBby?`bW>f$80Ce1))85WA|K?%@k23)SbddD91bB`|y~~X( zKyGagF0c<k`nttXA<Z@8RFCpA*9HjBX$t3+JpX5&0Yw%d;Mwb<zn{UO?gF5(0lUv0 zoac3(+X6p!-<b+H864<7+^0D}cn;w{OH-*-hn0CW3sA9GoJ+I?2u~T;Sx@1-)r$L= z1qk<X0L`b+og5%Qy8&kf>8oUEE=>XiJkx>bRxhCUh5^rC?wSwj>t}0oX>NO$s{7o7 z`^*ZkV1F;0&2F@my39Hd0F5D9U8f(!cyx060cTkhmud*0-u~ctd_J95Ye2)DByGJ$ zm|PES4j@uj6Yg_&P#Y`YKA++|Yb~ZOlK=tFTz7*tpu+iAz*$Zl^$aU%2p;D^3rJy? z2QXY7aNeYF-fr1_OgRt$O(WWZXx&L&I~_pQ;V}ac&g0%2wustiW&o+{aJB0?;7MlQ znL5s0I1FN2mqa45!T0^mbY7yz3P9973xQ|Q7Y<2XUjxo++@~aTi~vOX8sYAH@o@AY zhx!wEULd{^Hio*ed_M15_twGgoI&lgo%Hn~$417CRqwucM}5hvX@IK5vrAutZr$Cw zA!@0I-9AJAW;ERBa5|kn4os&2=@WqJum(`1Kdq;$t7{4;eLe1TeHi1rxpTqzJF?mA zL%{TtYM=<Y4@K_-ILD08UVUfZ@$n_#JYo@^NCSlPxV!G|#;G6HbKpK5q^`xpUe!QR z%gwRaqA=YDcsfa4OMTz}!16VrNCHIqN>Mzwags;zWj&u3=-waZD5!S>&I+#cK6TGZ z>lYLw3lKnjL|x*RnC9yFF97HEkaoM+*Ia1E&$To565u)J8J9kEw<_B6`+ItNUafVz zgZVl_>Ut3O*_=wH%+H%{Cwu>F!s)_oLRAYMSNFWAdtnB;umN^#31W1OjTkDxvk~W6 zC3pnT`5oI>VnPk~Y0qRbOGsNsHDdzkd|g2__XE#S+~)}(Yu8k%2I@_2gM~4Dz;haS zo}=#Bq|_w`>PuJl;XozeSqD5T1djmfRpoNo#YC@{i->M}Uh1A@z|$#I1W>Qa<#O>p zI<P-*pQrf#_rgQ~)#|{;pXWTCeD7IO*A`tY6hO5!i5Pco-2*(X?pdw6M*!8MOTBZ} zOH&W+&StaAf#;N_MgY~LtBA|0sjGv!=Sd!Zt7)lErmq9J4h(4A=ZK{_c9FWCQQaee z2GoHOqi`L!Bw<}+W8)jDdz8Wk(t(X5CgMat;yf<_&j}$RfCi!#@9b*C$5r=S;ET}m zg0h~To<&5wsi|oL?o$*F0%$<$?(QC$OeXUb%{ieUfFuDV2_Q)TNs<7P1dt?vBmpEz p0!R`-k^qtfkR%BpDKPylzyOKJ7YOM4FWdkC002ovPDHLkV1gxTXsrMM literal 0 HcmV?d00001 diff --git a/rep2/img/gp0-more@2x.png b/rep2/img/gp0-more@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..27793f7ccaf1919833af56a99a007701ad543ca2 GIT binary patch literal 428 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTN?DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg42*uBE{-7;x8B@(=zGXPrme8BDenPCPlEXY-YD|~7PkYu zr`UEeDnDS`<v4di+~i3=justS`t-whmFbf{JoCN%{MH}Oh?3ay_Mbb-xj7UVSOgfD zI2agN8W@-y7#I~A7z7*`P=zOKY}l4-o><#*m3Q_3J$_e$&tEOp>(=}~M_O+UXZx$^ z>&smOuS~RUFNjckQOVnWb*XKn4ddZ;tK5`A&zyT*{^rD4`)@X`-`42a&Yu(K_}XRW zuTw@hIU>|f*|?;fa<T1Sw!rv)MQ7E%JkJBwF3)t8K1)utRI!@>SC{jKOUf)4+uNMR zl^h((vG$+dx+&>9KMV0MUi92D<y-LAl&{ta68}#n-qNhMd3Jk$+#7?eYu7JL?q&GX nui1g=5hVYCy_xnnx`B})_TfzJyVdvO8Gyjk)z4*}Q$iB}`fQ@D literal 0 HcmV?d00001 diff --git a/rep2/img/gp0-more@3x.png b/rep2/img/gp0-more@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..06904834260a74c2707633dd6bc380c9cb4cb135 GIT binary patch literal 1306 zcmeAS@N?(olHy`uVBq!ia0vp^6M#5@gAGW2y7GG=kdiEMjVKAuPb(=;EJ|f?Ovz75 zRq)JBOiv9;O-!jQJeg|4z`(M{)5S5Q;?|qF{uwf%G7X#SC*PgnqRqyg)EU~HF)=JU z`lYL@?X~WJjXN_PKTKN0UM=7+7a~yoVF5>zh^xT=g#x19UZ$O5h7pc|$sO06MYsCi zDB0|J?fpp>uL&vl*0jg|u&dzNZM^^I+24Ef@4wr_sd7EXY`4p%N!wW#IY6KimkI>p z6j<ayw3@l@8-w*q3JW)8XJ)=U6{A;fuAjeX>g3qxnUl|^6>kYzsk3?i)0iimKg|l) zRZot&dNt<BOpWQM<wd)XKK;Kq{-Hgqj*iZglcoIn-!HIDiWR?6-eog?!uvT)TQ&UG zhFNdew8_Y4q4PxZwU#NflKS=a_3dxpzHL4AeER$dOZO9{_Cm5gMZD`IKV*KJt1;DU z{iS0P52ihtIe-5Cofk7~+}7>gv$gc>KjT&>#V@aUx8*Aa-R|{WclUp|o6>pZnCHPF zl?8i~1#_AlWmkr+78bENeP*)ybw#!}o<+HF`42MhE1efi+xz{*%+PtUCyGTLe$TnE z{=UUC$zNZcc6(m=#&q`VSzCvR@k<(}FPr0N_x}C+`U#G6J5M_IeF)t&|HpJQp|6V? z|FSi<Wd?8DEVFan^TQvd{@$8vblvh-$%^&s-}~0PET3P?rg`V#mQR0fFRc0Zt!i&w zgX1a}t}QbqUo716NoD7@c8R3L`;Nc3tQzz9AV`3%LwcbaGuITMt{QRI+d`&GKPk`J z@mu1?!V^1cPrje9&g0{^OWR!AcqeAp=jdf^oVxGsLWh^^U;WIcr*_=-+pT5v#_iTq z$)enaZ##H)&nk0noAhPUYcp1_^QDsSMOI6uyf|OcdzEKn?UtannAYxTA|e{B;!z#F zvCB{HYM63bVE2_%N7gvJ{Hgb6+Bt#m>Th#W&cr`_XLY(aX_9{1h98lqCunzk-_Eo& zUi;^Sv+pGzsone|BWdjSTh)2p`%HD^!)cu}PX$ccAY`}7K~r=3>Et{6=Jm;35cpoV zFknV+r}k8@$y@r9_a}8qE_Lm6pP#mS_wM_BvCYcwvVVP>$+WaZ>AK*<O0K`oN7lZx zwzajD7r5Rd@}g#AL{00DmmM+3J1xa_3!UA1b;q&mo$}p368?DHDZaAAyYUfQ*_7z( z$2GrQaWm#WzUQ=hiAv3(%}<=#3U4Kz`+T)(GxP6RGRCJi`d>~n(hK}^YO9^pxy=`S zju<Yt_{XvJ$CkI#qO2bNKX(1~*A0L6ufLeVv-z&8;d;-!=EJflYbx|amzCYKk6IaW zZrdjV(@LRw?MgYd`+nyvr`)k>k12j))oY@jp+EVvk2Zg>pt8-S9Zkh{j_2+^*<}_f z#L;}|!Qc5aO8u118E%W;a{J9?L#DMta%+rMEWEJ&!zT5aj{g_%CwCZM?y~r=D)i`` z!gas6b#`8yJNuN+<xFE=A>Fa1H|F8RV+osB0{#EZd3?G|WVtfyq;H4!dx)?KL13T) o1PbC5U=<>uW>VjCc}6yduPuMeTTTfc02X!(p00i_>zopr04Y^iCjbBd literal 0 HcmV?d00001 diff --git a/rep2/img/gp1-up@2x.png b/rep2/img/gp1-up@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d5263ae67faca39cad79d211d383a63887975cf1 GIT binary patch literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTN?DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg42;V>T^vIyZoQdvvA4-VpzYv~cV!CUjd83u8p97wb>N(m zz_~4n_0qvY*#y=*Ih**uKag5%VC}unex^>KbHTp9&%={+ju+|#Sgp-qWMF6j+RDPf zpa7(RJPx3HfGj2k1_6*%LHJ>VH?>dy$X%P6zhLuoh0+6zzjptRo;Ei`wr_LD%*W@0 zmOS*E7MCR~x63p1+)hUJ7c2f=|Dz<c-NHe$B6X+RyniC%B^C*BbK`3G7=&5#|2|N) zo3LNP(dwY|<@HzWraPQF$@o_I?Dtz<rWOwR70JH@#J^Z1{CiOQMR%s)5`jID?3-Q+ ziZpHKF8(VzlRxD(U&g(RI<dx_YmA$IYe&|pS<Suau<cF5=8MI;@(vv5s}2SKa<DUK zDrqv8I$_kNC1X(k!Hqfc!8VZL?_Y}9P5Wk{;2V+0mArjTcw5>3D?n#l3{sda;b_dZ z{-?vXM-6Tpe=cLP+{x_pq3me!_g~`TC&Xk5ye`xjH|{ap@cZwd{VKayp08J2%I)<} nze9ix9#E)Z*nNFI12e<Cu6g?Jx*UOF$-v<0>gTe~DWM4f$&bg; literal 0 HcmV?d00001 diff --git a/rep2/img/gp1-up@3x.png b/rep2/img/gp1-up@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..bf651377ca7b434de56ff2b22c65cf2c59acee97 GIT binary patch literal 950 zcmeAS@N?(olHy`uVBq!ia0vp^ML_Js!3HEZu6?`!NJ*BsMwA5Sr<If^7Ns&crsOB3 zDtP85rl$s_CZ<#to=ml2U|^2$ba4!+xb<f4Z9m~ak+$2mA}p2~9c(Vm$5v!?BpEDH zlT%W9xZqv|qsP?d6%#Xf!hhM>b)A2pEU}(*irB4R>yJnaUvj#wS#5rQ{+l;G)|;=- z`}*~Mr152^O%Xb30Y8eCFihY8!v+^HWKm&)LIpuEWb9-BK~4`AkM&beKdmx1H*ddE z&R~=v+I_VBX3n?vUxf~AtM=~QTjw~Zdr^i<ZPab%1|FZ?yLWfKef#$L&zd@=nLcV) z`m?Kpymb_uCmrBD-KgDkBk%UL?CQYv@oXs;tbJQ6pWj*g-|yPa-9=fu1Y=)HUFr2d zTl;%Xyx02u7k~FNysU4$tbV<A!tZnMst=vxeeqZH?R8#{{oHfJpPex3o4e8J#5eXO z^YivB+qUG;vL{FP-?Lx%ciL4w#!JrTTs~3W&tEk9-Pvi)wl^^5rPPUDf0opD0?)6k z`5XUw2YbU8_D7yuO?STev(PW@_wB+m8->3b1!-p{iq>%~EBSN!!t{vi40$qJ4!N@W z_^Td&ZBhI=dMkH>jaA3Bu&pllR%>yd>urtu!NMEVxqtn(gjVmV&XEs4d%a~-c>VsE z-q!voDfVo`dB=9nI{*B-X_~ge>m5sO$;y14{H<e^n?mlLNbQ=O8i#9+J7eC(n6mnD z&Pab#<ns7C<0ihmD?&fwJmtHSYkI9$eVp!GoLZo;`R1D$U6U$R_o%8(cw2Vdy>K0~ zk=jYkxvfr#u_yb!&N|N}fAr_7inR?riJo_F-P*+TJaR499HZ9rJ&(?|Z92ln9ONCl z{%&L7B>$_*_x2xpKKao+wv@NiLVnk+s-5_%%=WR?y^cqEtq)EqIJ|rFCg!55<E}f* zk0l(+G~P8mif2jrnrEXHo};nS*<CQcuwC^3?q?TSPH0UF5tRwvB{QRM_W{k|A3hm! z{ke7xYaC|!EOYn#vnb`8{8Jl|`|nh8Gwfm;)~q=Y87h?j%RpXxi^+V~_}G^=WsfIJ zyHf6zuv}eXx9R-zv!+kyUohLIG&yB{o$C7?zwYllb9z<8*>vB}zr|by75EE2-e1)6 z*Jo+a{w*&r^PA4%ZapM_R{!F)YtKT@P5Prg@0dWnGyXIk==oPPfnodSM_&^I-*5mk OB7>)^pUXO@geCw8Sh>sq literal 0 HcmV?d00001 diff --git a/rep2/img/gp2-down@2x.png b/rep2/img/gp2-down@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2051d553d62aa36db22b4bc4dc75e3d033a2e73b GIT binary patch literal 513 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTN?DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg42+9CT^vIyZoQd(HusQ&Kx^R<TRlbD7QRVAF^8rx$hHW* zP<g4K+QMfhYO(o}T#bUDM%;Ou&$cITNgqD<-2A-#h2F<I9P6qUumbI4Vqg$pU}ylc zSQr=-fD|JG0|(GeKvvfBwdo({6z6*vy*n6v|NG6=70>?$-BZ|e`_rS4e}`xNuX?YX zvE%YBLxvlYKT=O0T=-?-HMN%0GTR>SN!VMw_GD;4sUzpXzfG!>(?7IvCAK@1@!vb~ zozXjH65m8K8Lo!8Gv{xUxh}US(fz`cXKPGeZgl+cZqb>48~T;9nxlFaiLCvpD0@L; zf-`G=2D=H@6Oq!%iHv6?P8|Ogsd&}(U;7!J#y`2ogOA)?Z_xCN<B7=5pATgX3Y{bs z&u4SSNwWVjcA0$Wm<q#<nK62v{y?Fff+fic?fh{^1xrpVzg}{wMw2~8@`TVq?UxPO zhfP=Jy73*5Z>$O8jC(2g#aqFfb^R}nT_Pu{k3KtXmGG$LQB%&@`zzli?!I_U;osk_ pvK!bwzRo}iEkr<WX{ck7V3;Y_mYAlr_!UqQgQu&X%Q~loCIC-<&;bAd literal 0 HcmV?d00001 diff --git a/rep2/img/gp2-down@3x.png b/rep2/img/gp2-down@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..857ab9b12e77e7ddc62c4e3bfc6f4cbfcd579745 GIT binary patch literal 1231 zcmeAS@N?(olHy`uVBq!ia0vp^6M#5@gAGW2y7GG=kdiEMjVKAuPb(=;EJ|f?Ovz75 zRq)JBOiv9;O-!jQJeg|4z`#=I>EaktaqG>T+kV1<B5f}NZZU<&{nWGT^?$guylSDi zTe6K(1=A5{hTen970F3V875gujKa-Ij#^qpSud~DtKQ}g6tUc5TwPzk>GC9=&DYob zOj}!j>+Z>r)mPbC%vN`ZC@?rNv@mcm3P33)1u&0EfyDtR2&Nif6oVpz6Gwvph+=4g zQZ->_XAkP@>zl7#x9;7k6r(bkLMi<RSzDt{rfr_j-RdOSkhP|0XN=}luiuL`ZY{PC z531n!Y0<~ddeM&2g>}`|sHmtU)&H4GgKn<Yx-x6q57FP(mn~b?TqaYoz-q<DjT;wk z-MTee_kr6jxhbh1wcgboy`O)a(cx=zhUeAi6Z}q8oMMm)zQZn3Z+Z6T_eXj@{~k__ zI+!|l%6rYM*mRNa65Bs|8Wi2kX<qm2vX$ZaV5SQlk8JY`nFESeUD)Dxf^+VinJtGu z2Nuc&?{Ss?^p4k|%=GkxZ?8%fR<_-ee7<|vYpD+le^szv@ONHYr~(x0+5E^_r{dJU zCwF$QH!9kBr#O9uxDeZU^P^Xn{fPTLCI3CcrfUmU|M9uRv-MHsq8(N>nX&hno~)W6 z8M<5h_Y{GOG*SQdN3*`_UXNo+3E$cCs&ud2n(YhAj#WB*yz^=8uL|x7%^88ZhgV%l znaemUK*nA4d{ckrw<_BSKChK~wX3361#@)I+V7ow<+{voz6p}Af(vD?KV`|fmp<$N znxl*kFI!)%z2&|;>g05(?dujjGp$goJ(thHFmvI)g<b{wr+v=acRTG#?K(S0h9^8< z=N$9gI_0}*R;=)>_dC`fv$SZ4QI#@sj%Ie=t5INOdcA<7l9y9qwM%-atXtWRUp=#) zf7)Bh%03}G_3^jP4}Owa>2rAJl`ni^qR}vC;k&5^Wp61yu5tgpU(D+(C!a!iYnRo* zYp0fN+ga+Hx&OJd!8u3fCkmTbV{LhFe@{NL>D%?C9~HL5uyIb<DzRE@mDKG`Pn>^C zZrf_7xOLqE#-h*{tv08RuGO>I+?sT&f9pDP#b<^QKzsHroBThc``FKUlAi@u`(I$N z?6AwYp?>A^?3~!kX(vq6oX;kH=r7;+e$AD-UFL}^&RUd5v2t0~A7q|#`so^>*dWu& zkMpmlhy1^u_n+S(L@|2%<&A;PYu`T0t?s?P@Ht;YjHr>ajO)b*ZIi@Yw;kK5|K%04 z!+xn(o{SgQT?_d$z3^Ju^DTdQBAFL#U3<oE;l5wybz6MP*NQJ^45*5_>18+neaKYF z_~pO$TrrE43f;u&P#>Z;xiZJz>&oq;rpIp9mET`y=roPt#rn3W&=u|nc-9)8<2O9V zu;rqbiDtqZM&9CezeIqUCfbAhC_~2U?O$t~PG|+Lxz646N^R!P*vOy_?{fccTIF~D z&!0be2TOz>@A2E}cl&W+_R64@Q(~i{PMMpVPiG03*~1`kh#5JT5|hC-7=I}qV7MLF WS<icP{$XGV#o+1c=d#Wzp$PyT?<u1I literal 0 HcmV?d00001 diff --git a/rep2/img/gp3-prev@2x.png b/rep2/img/gp3-prev@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..577c2fe52aee0a03fac95f9277008d9baa34a74a GIT binary patch literal 502 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTN?DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg42&~8T^vIyZoQdvFp$Ynz?FUVdmpwO4hcpH#<m8*2EiR^ z4U!3Jvl!D7II>x?{jUZbJ-GSu-OqJb*FU}S$NcwpE-A6kHtJXW%3XjKDgZGf0|N)p z9Y7Wn1A_nqLjw?X%vzSY!Kk}L;*aOttI_Wo{`1yfIqkZ4v&r-lff~z~>0eJhsu8mI zk$v}#&UsD7X8pf)YvQ8jhc~tUkMRF{>hu{Ql^+Yg{W*5~%_AG2qCFM0{EsYZ%1ecr z8lLYe<W+FGyMuMX!}ni}s@6-FGno7+ef!gwOUqEIW}W)K2~FNSZTr_RubXK#L4wP! z=I$R=Z+Z9Ww<LqojhGdl|5>QV5O>v{A%i_>P5B{fhFgv^t~^crv)~_-!|f<7{^!qE zY<=>`I<d8&E6O`>-<19+?|0jj7G0fmd+QX9txu}-Uo4yU?&^G?_D75Ey*jO)zf~m5 z*iUgzw(efW1-ZJid#?oDxEr9qRiw`HdX=tj)vv?LX7_f5yys)s!nBZKA7jIhUI}mz jF|Z(op6tu;21bSnhfCFYD&9>4h9rZhtDnm{r-UW|j6BQ` literal 0 HcmV?d00001 diff --git a/rep2/img/gp3-prev@3x.png b/rep2/img/gp3-prev@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5036d8550d5a9db52b19fee6686896a2d7a57fdb GIT binary patch literal 1206 zcmZXUYfuw+6vh7u3F0E<A(XP#vV>R}wAfOp5D^m_CA?w)H?bhfra(+gP)a}%shC1V z8QVa|BJWp-W-;kVAX=E#vDQ!oQ;aNXASi=?h=3y0L91<Mu%9}=x%bTZaPPNsPV%@B zP7n+M0GuK@?0B0hZIj|)Z`*VIuNrLPCEvD7o^T*tehB+24X{!V2-A>A874}LPs37k zGrQBm0HExOWV3c2wmh-+>|cqw8%JW)vH)4)lny!X$fCqesuc>3tA|EN9J$i&4-I=j z8SY8cXU;r!X2YW>Pk(b!dC?5i=oi5D9OiA5RH?gF70+JN6`MrrizU6YMcB9UGqZUi z6ET6ZkN$ivEG&$zUV{MI5)|eVg`ju|7vQ=C8TpT`fW5?<gsA3tsazgphq%3GdiwO~ zjndLm$Bqo`k1x<`18<In{Jc9u9gx>$G`>6a#A3)_#{Av6wnO?^-cYtRpr<u`syMgy z1%C@{=dvguCi}*)5wS=06;UnzGRqI(DgBMT1!2+U5vQ&TJ0HXZqvtB^>TirhN|@mn z9_zXL#*L%5E^i_6s5m#gZnjUV-#d-R9)ug`-;jdBL!MJ63M>Q-tq~K$I<T{W^hK75 ze)ZnEkWz^N;7sCHwVq#mgd%EqplbZ}Lom1e9M7)}GKJp^ji!j87BX_>U}aHyxrI1_ z*5t-jX90J&9RcN2{kbRl+FBmdcX@zC#b}7>XnTv6!SB-ncM7+}OG)S$X!f|xKJ@&) zIj4P_=+lYyD8YKC;BRy_TD8cC=}cT3@`De__B~N9y|XauY$q0gxstWIoc4wx9iP3J zkP4{9`01;+)n7JQi1e%C^jD;Zmy%=eV7LhmUqRuygo)c*2*v^b`^gta!JHtw*Y3%8 zqw+I@Xr<O(`BP{_O1dNW1dt^V6|7FOa@HLxIvieif8SuvhG~f~9&M@S(1i;N3p=Qf z$|iE}-`xYKQ8JmfDyn(r@m(z>|0CO)C;g=0H|DA4+moxhQ(GgHTnBTs0cK(@`EkJv zUrru%5|TMFF`vz@stg|nE(xkHkCtw>oph*Kc~wY_n@S|zQb6`KCtCz)(``kn{d9?9 z-phVuWp`KT3i|4At_w5!GON3q<26ZL<et_tWj&dy<!nStd#|PD!>xOnWG05>-#Oa9 zS0E7CPxmP1PogB=SxJx|XR|^cqx`_p?6=OYKIL;P_GX>I5LIkiek+SlWn%v39V~`M zpZos9vYCNly+43<pN3(0Pvz_YWm1Vaou@hJ0|6A~ofcRzIA+K(3=M?w?U^i}F=D`k z2WCTNl=ad9al5S5z`qby3pd%@U3DTZV?ThsRY{7r-q!V5m;Q>{&<SWPpHR5%m2_~1 z7u*rR@dj+Npvh=79>TXLQN?wL)l=mSXc%JkP>o6Uzur2ZxM7pck2gKXw@;6CwmSpb zaax!f&gTbPeA(kZhGmK%mG>H4Y$XMei1QlFWGPbdPfg~Y;^9YQ_+r_Bd6lqyt>3sn zr@wdM42K@5*(q^g(&rkA-sTgy{x6>n1#cm_cpdwC`NzO|eJJ=W(6Ver1R}R_*}APM GihluI<OSjY literal 0 HcmV?d00001 diff --git a/rep2/img/gp4-next@2x.png b/rep2/img/gp4-next@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..216258b693c8fa96a47c42956cd8f625ab2b081b GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTN?DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg42;#DE{-7;x8B@&=*#3NaJ0~%uH1Tp&<h9a349A!tOTql zaM@^2;A`Pqz_g%waZ|D0%?Kvz{Ad3s{oFS*{@v4W9e(YJGbWT(Ca?l6XJBXmTFc15 zz{J47!oa}6z#zcDup|7}zWIz7%;qYV+*H^Tdg0Qu3=V0ATTf3uyDOk)ww__j>CI=? zE51>>KIu^Oh3F?yL6y9`(cW3#8w$2AsS^CXUUfE;!{Mk^0^AI@u3hR^d?T8zd1?Cs z@!6ZBbY1^QsE2w7?r%GFCFslfi|?{EPrqkO*6p3XLzE#mK6-za?pel+=|RU`<%D(r zrES(+T2o~eBG!;Ud#mpL?`0caFf8BoWAAllH`ank^GJp}*L+JFoMZn4zPupFkXQO~ z?xTlS-!n$fp84w2)cFi2cXcu-#G1bnRf#uW<?k?KS0M9_Ye(NJ#b4bUcA@>O&96_k zc8tk)*W`Sh?m5Y4@1NsqK5oD5(_PL!!SqkB1UMuV5J9Bi|Bpq2VO{^!$J%9qZooie N@O1TaS?83{1OVm8zc2s* literal 0 HcmV?d00001 diff --git a/rep2/img/gp4-next@3x.png b/rep2/img/gp4-next@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..87cf56b99e92cf02204938a4c7d802d4876bce25 GIT binary patch literal 1230 zcmYM!e^Al~6aerqgg;`TVvx(Zi_%I>Tsqu5&4~mG)rib=;f7hD#zb%f@kb%*taM5( zwHr!;#%yZh@<30AX>F%@P7}Xsr2~I#ilWXREIC`|*xarA+<Wit-TUj^y;ne^Mj+s> zZ~y=h6f!Z=T5nk6oV~3zuMYiHWi7k;q)+àt>{1+@BjLALE!caKziL6LgJToJ; zhjj!1U_1&jEGm6;;n%Ux-B@m2EB(o7iD@53b4mHtjM-vNz#xN&)wtXupf_#9NF*&1 z#YG{B_niu(NJSb>q$4uYYxw*rl;4^-5>{(>B-)9cpX|_gAXpSJr7@>85fVEbwF^q& z^Y!H{gE08HXKzzL7r)|JOQ-$gEpJ11Z*j+Lxd3BsDH8t=dE;LLBx!4F>+xMKF75SD zlkaV+u}dnIhJYX_#A2}-LL1aA&%$y{Tb>urKRCGJXxpb`D4b%5`x@T{53~StwEE%9 zujU`e>MM4XE(>2;=EJ@5Z3P8<1UQ=}GU$_Vk|=NVQkyuJz36{HC-Lc3*$u|OzNln0 zW(OZWJfUxS1b3(J>|Pnhw{_@KuHV;*ispyL-c!)XXw0-`EimHsrEE2Lp#wdFP=-w; z-x*P{I7Xv>X!PkH*Jb!BO|t{pg7xvy_Tw^3LHbc=s^T2E_pWCC8IwDid9u8wB&Ep) z1+VSFjaJG>I@QHNS^FtBL4q@F7DtaL3xU=2;mZ{>4Cr9S-tC^K!9EQA3DMPdDCv$a zJ(dWC=SN*w1O_rC8=FIP4Lzi1wGT;iQXZ0qTbjof_cFTE-)$IX8)ep=eAM7qoC4^u z_u7X>i5>3Fv_PfzJQagTT^K)hySRz^=OGV>z;O=l6w>K2O8l-JQoV8SL45$EK|69q ztVWVsAQyA#@7U>Xici=pUp>F`V~)BE98CZg6E7Pa?^@@4|LNLEi9Z2Boi89x8__fL zoir|+vkgqzCcg3z_u$oDW-R^yYLJTIOsbn}qw9-vlIoH{GQRz)dKb|#Z#H^)VcTF< z*|F&pXV)U2FE?v+U9Z$5Y>n^7H-D!90vHp1u(v7n+ao0x%PS`|xa<TEh2gG#jxWhg zh-+u;IW(qY;6rxssMFmUYa#2YuPy!}Uk}A_W8J0OHvKT(TJB7`G?a!KFio9R)Jbv< zZaR+SiJUnElj-=f8&h5q%1=|piMWskH!36MD&Fi}CeV&oMx$sJfgq>A+~Y4>5ncY} z3|>FEzEAQS#bhE)$d-&20zRH6N-()4ES@*XRwgqc=zI{`*L_c`GN2`5!m>=MGE}R= z#qS$~_bIA*qWGyxKxHC`d+}B+3>6h4hZv_lD2Dqg7%JCT?^$S2su)1OcIle9@X>ls ztr?kKS*3a)G}(XeDeDlMy?AMU0!ix=Bu%G&Xh!f>Lr;nrfl#<KDAd~Lt>e-~=<8yF ziCx%h6q~DfFjQpB_^Fsi?9($d92c6d*6e=Tc-dFZ{-7dp!!-`F5wqHeRY8p>e~?YR z*k03LD%h{6ZUxH0RJT1g{nvPza?fmgt&dbLkLzV4930YqcE^1A&BE@Y{|@wqAJl(K kIDSjln>&}5O>-f(z|+tA&g5082CNSXppd9U72#a&-=;G>od5s; literal 0 HcmV?d00001 diff --git a/rep2/img/gp5-info@2x.png b/rep2/img/gp5-info@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8402e3d31e44af41fe77c72a9a02ddc2232a296c GIT binary patch literal 837 zcmV-L1G@Z)P)<h;3K|Lk000e1NJLTq003YB002M;1^@s6<uq~*0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!=Sf6CRCwC#o9%JhKoEux#{WeJC>2B< zSgydNf{+eK1yL$6uE0_Ur~_O<pn^aJkt!g&GpiXa+dqUB-HLm6W=D9&+B@FoZts)H z>2z{1e>Q~#0000m0000O0000C000060000R&hExi(W<Hz^hn54@|b+y`j;d5fqYB8 zo6TmMF?_Fy<;^$}orTWGS^TKu>oqw;$Oy&(04@{$yHd!)Du}5;@mHKe6vcNEYbUYM z13nRcMvt8Q@ybP&<V)%e6#%>yp9jyc0~NXF!Q29bX@KH8DQhcb2R{bnO5#6@*Bv0_ zL8l-Y6rU7AeQW0Z6qDBqe>%MTlipni2SBEpy9?&`?~DYTv|?8s;&P8kd`(e(rl3qi z{Ij0ad`>&YjifH&^Z;r7f0e_&%Jcrh_rLh)1yhf$U)%0`i0^#$0$%_Y&YmrT03f@X zk#g8tAx0#1yZIiFDChkL%H6!6DvZ_5EPzxg&TrD4w-dJV_r_4&Oaq7&V*FsiWznUX z!{ZPD%oW7v1su2hwK9Nt2mtzu??n7ap4S@K2eG@6)t7Vh`9V!C&!row4Zael)~Z$D zo(AAVwv_*A)vvv;bc-qIs1#>?h1P!@S_~fm4oY#FY3Isd-An`6D#R%GI8mmdb7OTg z4`64s^=sA5_8=?+ahC&=cX^sxf2<IvZMAG^1hEd-^nI7KU!IB2n{lPbI*krM*5lp$ zY)#OJpDN_<EEoWC@^s1WC8wVzPjedL`#p(xpTqqk)HC6_N1Di_<#Q@}>681N$1`DX z0Hnor{o;oYfc)y)5PV+R^?o&x22&RCu|sR+6)<nUX<X(iNqn!zqZR=8xSHskk^7<E zx1&XXR0Ii1d=mg#5Xu3HE3JrcA_aYrl2%Uf)?9nG<MSS<*&fj94QrX#7m8syR$@(j zlRco-8)Ana>6w9npQ*wE7y|$R1^@s60{{Sk0RRBN0001B0C3CpUw{DsD69|aFI%TE P00000NkvXXu0mjfwwHT_ literal 0 HcmV?d00001 diff --git a/rep2/img/gp5-info@3x.png b/rep2/img/gp5-info@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..195270c132fc684f25282c8253d8a54119cca315 GIT binary patch literal 2449 zcmb7G_dnYS1O7^`wxZUFk*Ha_RjvpPVs(%j)zsdtl_FlDh*>p));c@J^~4J0Z0bry z^sIAYgiy3m)Lzljx1ak9-uH)R{PH|MKA$HAWo6FC4dDg=fX~tbY4by~e!z{B{Ri*; z^R@hkh+|D3U~Mrz*l_m{Z@|b4<KYdn40QMPw()lNiU_89!vTOx%Mxj1hnw3h@edHT z7moD}r+fR7Kp?)$&tv(cfO{3y@N}*{lZombo^b*H^vr>2=sOOj-8iy^$7L=-sKq$+ z?`pRwfdr$*M;=Ji2@Amij?{RMuCBn(4U6S%RQ9hX^p3WkW~Q8?Ru_G=$9L-&X0d)K zlYu1JaogE-s#qFaQ0C4`1yxl5BqfCM|Ku;*=f;2@K75F5PC+gk8)ld%SISOgkDq(v z=hC-~@Cdxw8`a!fd}pVJ{$?si-{h5pEo$R@B**_!6HU_^|8o=CZ;ft&h+MXD{^sBH zO@Hp$ryJpT#cV2gjs3`#tx77F-PV-NtFIt!WSVW{XQKG<w6>sRXNu<*N0qbWeiBx% zM<JV<BTU4_*(TTX08Beb2kkyOXIBCiZ7!~{Oejt3GEdb;fUNxeH&lroLQ>Y17lZ9} zn1|tr(@W8i%og<q*gH|!l6cM-Q_OQwvQM|XZQY1<)AoE$lUEEpVRT`LpR6U4+003Q zwQK*1->w!wLYE17O9UMXRpK2tERKV$#a|>k>Gu1<AE);;sD!*MH?o-su~#n1*vM`P zeM^?GR(n_#bMxMtB;X)K5|;X|<k2p?PpggGAG(?<53MZC<lMBuT&U*9Nx!8<L6@#1 zJWBj0Khjm@@EF~V&zWE_43h@i)6B#_!@dQWED8io@F?wbw<roMn4U?n+D$`=3@&Gr z_IL-6epNan$7NyTpmghZu|HJSa8+09>g($>^yb05q%G;Z@6l;a)ft}K(*mCiu?trH zqb-5Sa=q7gZoB^+L~dvpEmvDBt*NPDvc4pg7US3PDKj7ZmG(tpPTzSU+mHq~G3SDw zzP;#c1>eLT1hgJ&LWiFevu3nx*+RrRYc4_!qngvYDMO^SHFXGHxQHq!HznJ|RA{=* z76L2YtPMU3$=Cf*0f(Hl(`Yn$VNsFdy;j^CB8fzzt=`P8Py#)DmFirGq#qkjt@0cy z1pnuXF#0qeb@az(HX;)!4V}<5Monj<#uOI)rh>W+wzaZr!)(I4#ti%y2av;MxPdUm z%5a89{tO3VLpyPH*AO%gFItH>2b;#J;ohll7Hv;T`H_Lk0qM)i1}bZj?T;np<d0rp z2sW_+b~**!sUy`e#<ffO<omIkiR91iEKe!l(U(P=W)2l9C*Aar=WtPdjXnAFh-~Bv z&7^aT(sifQn-~=qc6jT+z%a;!{&?PO{qhRob?fkjf80GZs8|=a)UDy-KA$WToX+3g zcxB%HHd~TilWKZQa=67q_K2*5lbN6?0nw6l6AnFqsVVJduUF!NvbEj6uL}<mYC<U$ zFE8y<fdlMFTt%+C5hV>z`{~IXmxOi2G}s38!0OVY;m9~Jmzt1d;zV7O16wM}s*x+J zFJU?&K8h)0I10+MXGNX6bgVdu_O7yj!g93w5PAxc=CeI~stez*?!Zf_UU@^~4~S?# z#>0B;N=dx1b>guuWdb~(^KYGBfMgD83OV#L|GTu#4qS%cdIYmb)W3TI0U?+#gdzel z^2v=AzpV_X;kUsQNm#^dA!#H#A<zu}%ZCk+`G@zdJt7-%b$u6w6V~!He2(j`;pFPR z$W=vKIJiW*S^`CzC*n>vY^nDPRi(m}+?=B99`NkIL1PyuqoF*ANy%p#MMw7oIO!5t zUY|B~AV*eljvIl$y_aq!lUVX)oc142GDx_5=wzi>Hr7xkG4LuiRCGJEw;*;ncQw6- z8<qHa>;j_X1JA<am&}wtt&ygB-G38NY3H8-A{e`IGkX<1Xt)yRwKWi&5qQS4P!5>V z8_Sw?*NDY;6UpqeirA@&Yl#Dg5qe51WDz1~Qk9PNjagsu(o5z3JPhA5F4xIe-<o~1 zKdm-Lt{?<c?+hbXf+`67=%1=zgtXdZB$BW9kV9FgHz=h?0sv;u`;s#GS<9t|>j@bh zg@M`(v*DBZgWkcGmX<r)No_ZeAo?Q2YEy<er3WwapnXK+IOax7!u;14t7xAypj0d4 zw8&Mjj4<12)@aRmvse$HxjnD%Kp?vgJdD7n3fU~Xw_+)wknK<zfKMrbsW{x5y;#<C zc<t4U{1NMVXhAqxCp3QXqw?AH<!3_MG(gk5n}^<1@o}fhhD3if<1kB`16gdo?G2Ce z<KG5ePRHm{YrUmEak34ADT>#^(pa~abVoMdUsrE?=H8yy{m5NCzpH=Hk>rs%^KsID z#0BKljWQs#qeq`235q<wN7)}u#TdSCQG+)3r0mfqWF3DDEwm3j`?Co8t#n5;YTMcI zgj2xbu>{{~owy9n!@6ILZyJVi#Kv&QL2U=sR!x)T%GHIr-?KVLX_L719a#pZW9Fly zBToNMVL}HRPA*3zk{hK{bk?dG#f4&%xvP*{*tbo-XH`<a1*c#H^&6Sa8kKQmz|uNN z=ne0-W~o_wU6)uwtWl6G27zth(-9uiDO?#HR9TowVDW$VZ;J-Es_us!MUs6V=cZiY z^3I%CdX1edSh(<9{cEmIhB1}oHClGtnO8dd>NKvG(zx=AE4}Y)!TJdA;q=hzLhoNf z3kAoh#jiVt8Z5YHv}&H7Qo`B<!>NFYf6gn~#qs1mt9RaLo;LjJ*w)`f%$pp=je7NT zFx=(%ZRf3;eod#5t%bZYheNr5FX=+?raeT72aTu5MOD<hspE<f1=QK&qGr4y8tKIU zYVz~lPM2SyFluTNzsF(#1cTFvl!^#$lHP8&a8NxMmnhHo^kf#25~Skylj{m@6<C8u zi#mO3m|QyUU)Y=d_NhM0KRGT9?JW{s`)PgfGo8=>-p~@ZBILa>n5kWR<2Z9^e8eaB z)8Ol{m9*R^Rw~@YN@MyB$kWogyo8HBu0H))Xy&9@SEq;?CcPCh^8PPrL?{rQd8VC6 zk_vWJbYWYEygCQu3|e=MC<bx`MZO337$orp!npu;o-;=V24%Zr`<qcEKtd|~zxQLn c>|D?d==nmSqSxiSe|#*!($ossVC)wEUsi9OU;qFB literal 0 HcmV?d00001 From 40aed5a83cad71d477a11d9b10c7ab015588c958 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 16 Apr 2015 01:37:28 +0900 Subject: [PATCH 141/339] =?UTF-8?q?headline.2ch.net=E3=82=92=E6=9C=80?= =?UTF-8?q?=E8=BF=91=E8=AA=AD=E3=82=93=E3=81=A0=E3=82=B9=E3=83=AC=E3=81=AB?= =?UTF-8?q?=E8=BF=BD=E8=A8=98=E3=81=97=E3=81=AA=E3=81=84=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4=20Firefox=E3=81=A7=E3=82=B9?= =?UTF-8?q?=E3=83=9E=E3=83=9B=E5=90=91=E3=81=91=E8=A1=A8=E7=A4=BA=E3=81=8C?= =?UTF-8?q?=E5=B4=A9=E3=82=8C=E3=82=8B=E4=B8=8D=E5=85=B7=E5=90=88=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20=E3=82=B9=E3=83=9E=E3=83=9B=E7=94=A8IC2?= =?UTF-8?q?=E3=81=AE=E3=83=9D=E3=83=83=E3=83=97=E3=82=A2=E3=83=83=E3=83=97?= =?UTF-8?q?=E3=81=A7=E6=97=A2=E3=81=AB=E8=A8=AD=E5=AE=9A=E6=B8=88=E3=81=BF?= =?UTF-8?q?=E3=81=AE=E6=98=9F=E3=82=92=E3=82=BF=E3=83=83=E3=83=97=E3=81=97?= =?UTF-8?q?=E3=81=9F=E9=9A=9B=E3=81=AB=E3=82=A8=E3=83=A9=E3=83=BC=E3=82=92?= =?UTF-8?q?=E5=87=BA=E3=81=95=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=20=E3=82=B9=E3=83=9E=E3=83=9B=E7=94=A8?= =?UTF-8?q?=E3=83=AC=E3=82=B9=E3=83=9D=E3=83=83=E3=83=97=E3=82=A2=E3=83=83?= =?UTF-8?q?=E3=83=97=E3=81=8B=E3=82=89=E9=96=8B=E3=81=84=E3=81=9FSPM?= =?UTF-8?q?=E3=81=A8ic2=E3=83=9D=E3=83=83=E3=83=97=E3=82=A2=E3=83=83?= =?UTF-8?q?=E3=83=97=E3=82=92=E3=82=BF=E3=83=83=E3=83=97=E3=81=97=E3=81=9F?= =?UTF-8?q?=E9=9A=9B=E3=81=AB=E5=85=83=E3=81=AE=E3=83=9D=E3=83=83=E3=83=97?= =?UTF-8?q?=E3=82=A2=E3=83=83=E3=83=97=E3=81=8C=E6=B6=88=E3=81=88=E3=81=AA?= =?UTF-8?q?=E3=81=84=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4=20?= =?UTF-8?q?=E6=96=B0=E7=9D=80=E3=81=8C=E6=8C=87=E5=AE=9A=E3=81=97=E3=81=9F?= =?UTF-8?q?=E4=BB=B6=E6=95=B0=E4=BB=A5=E4=B8=8B=E3=81=AE=E3=82=B9=E3=83=AC?= =?UTF-8?q?=E3=81=A0=E3=81=91=E7=BA=8F=E3=82=81=E8=AA=AD=E3=81=BF=E3=81=99?= =?UTF-8?q?=E3=82=8B=E6=A9=9F=E8=83=BD=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/sb_toolbar.inc.php | 4 ++- rep2/css/iphone.css | 1 + rep2/js/ic2_iphone.js | 2 -- rep2/js/respopup_iphone.js | 3 ++- rep2/read.php | 3 ++- rep2/read_new.php | 54 +++++++++++++++++++++++++++++--------- rep2/read_new_k.php | 17 ++++++------ 7 files changed, 58 insertions(+), 26 deletions(-) diff --git a/lib/sb_toolbar.inc.php b/lib/sb_toolbar.inc.php index ff3cb3dd1..1ad1ffa59 100644 --- a/lib/sb_toolbar.inc.php +++ b/lib/sb_toolbar.inc.php @@ -24,8 +24,10 @@ } else { $shinchaku_num_ht = ''; } + $shinchaku_matome_url = "{$_conf['read_new_php']}?host={$aThreadList->host}&bbs={$aThreadList->bbs}&spmode={$aThreadList->spmode}{$norefresh_q}&nt={$newtime}"; $shinchaku_matome_ht =<<<EOP -<a id="smy{$new_matome_i}" class="matome" href="{$_conf['read_new_php']}?host={$aThreadList->host}&bbs={$aThreadList->bbs}&spmode={$aThreadList->spmode}{$norefresh_q}&nt={$newtime}" onclick="rep2.subject.changeNewAllColor();">新着まとめ読み{$shinchaku_num_ht}</a> +<a id="smy{$new_matome_i}" class="matome" href="{$shinchaku_matome_url}" onclick="rep2.subject.changeNewAllColor();">新着まとめ読み{$shinchaku_num_ht} [全件]</a> +<a class="matome" href="javascript:var unum_limit = window.prompt('新着が指定した件数以下のスレだけまとめ読みします。','100');if(unum_limit){window.location = '{$shinchaku_matome_url}&unum_limit='+unum_limit;}">[一部]</a> EOP; } else { $shinchaku_matome_ht = ''; diff --git a/rep2/css/iphone.css b/rep2/css/iphone.css index d354ae31a..67980ddc1 100644 --- a/rep2/css/iphone.css +++ b/rep2/css/iphone.css @@ -69,6 +69,7 @@ div#toolbar_header { text-align:right; padding: 6px; height: 45px; + box-sizing: border-box; -webkit-box-sizing: border-box; } diff --git a/rep2/js/ic2_iphone.js b/rep2/js/ic2_iphone.js index cc9c15c17..1f6d82d9d 100644 --- a/rep2/js/ic2_iphone.js +++ b/rep2/js/ic2_iphone.js @@ -183,8 +183,6 @@ document.addEventListener('DOMContentLoaded', function(event) { if (req.status == 200) { if (req.responseText == '1') { ic2info.setRank(rank); - } else { - window.alert('Internal error'); } } else { window.alert('HTTP error ' + req.statusText); diff --git a/rep2/js/respopup_iphone.js b/rep2/js/respopup_iphone.js index 79e0fdc11..9bf7ad3c5 100644 --- a/rep2/js/respopup_iphone.js +++ b/rep2/js/respopup_iphone.js @@ -96,7 +96,8 @@ ipoputil.callback = function(req, url, popid, yOffset) { */ $container.css('top',yOffset.toString() + 'px'); $container.css('z-index',ipoputil.getZ()); - $container.skOuterClick(ipoputil.getDeactivator($container, url)); + //respop自体等を内部扱いにしておく + $container.skOuterClick(ipoputil.getDeactivator($container, url),$("[id^=_respop]"),$('#ic2-info-body'),$('#ic2-info-closer'),$('#spm'),$('#spm-closer')); $closer.addClass('close-button'); $closer.attr('src', 'img/iphone/close.png'); diff --git a/rep2/read.php b/rep2/read.php index 2b4195ba2..ba2957f0a 100644 --- a/rep2/read.php +++ b/rep2/read.php @@ -448,8 +448,9 @@ //=========================================================== // 履歴を記録 +// 速報headlineは最近読んだスレに記録しないようにしてみる //=========================================================== -if ($aThread->rescount && !$is_ajax) { +if ($aThread->rescount && !$is_ajax && $aThread->host != 'headline.2ch.net') { recRecent(implode('<>', array($aThread->ttitle, $aThread->key, $idx_data[2], '', '', $aThread->readnum, $idx_data[6], $idx_data[7], $idx_data[8], $newline, $aThread->host, $aThread->bbs))); diff --git a/rep2/read_new.php b/rep2/read_new.php index ae3c948e3..abb6a4c60 100755 --- a/rep2/read_new.php +++ b/rep2/read_new.php @@ -27,17 +27,35 @@ //================================================= // 板の指定 //================================================= -if (isset($_GET['host'])) { $host = $_GET['host']; } -if (isset($_POST['host'])) { $host = $_POST['host']; } -if (isset($_GET['bbs'])) { $bbs = $_GET['bbs']; } -if (isset($_POST['bbs'])) { $bbs = $_POST['bbs']; } -if (isset($_GET['spmode'])) { $spmode = $_GET['spmode']; } -if (isset($_POST['spmode'])) { $spmode = $_POST['spmode']; } - -if ((!isset($host) || !isset($bbs)) && !isset($spmode)) { +if (isset($_GET['host'])) { + $host = $_GET['host']; +} elseif (isset($_POST['host'])) { + $host = $_POST['host']; +} +if (isset($_GET['bbs'])) { + $bbs = $_GET['bbs']; +} elseif (isset($_POST['bbs'])) { + $bbs = $_POST['bbs']; +} +if (isset($_GET['spmode'])) { + $spmode = $_GET['spmode']; +} elseif (isset($_POST['spmode'])) { + $spmode = $_POST['spmode']; +} + +if (!(isset($host) && isset($bbs)) && !isset($spmode)) { p2die('必要な引数が指定されていません'); } +// 未読数制限 +if (ctype_digit($_GET['unum_limit'])) { + $unum_limit = (int)$_GET['unum_limit']; +} elseif (ctype_digit($_POST['unum_limit'])) { + $unum_limit = (int)$_POST['unum_limit']; +} else { + $unum_limit = 0; +} + //================================================= // あぼーん&NGワード設定読み込み //================================================= @@ -343,9 +361,7 @@ function pageLoaded() $subject_id = $aThread->host . '/' . $aThread->bbs; $aThread->setThreadPathInfo($aThread->host, $aThread->bbs, $aThread->key); - - // 既得スレッドデータをidxから取得 - $aThread->getThreadInfoFromIdx(); + $aThread->getThreadInfoFromIdx(); // 既得スレッドデータをidxから取得 // 新着のみ(for subject) ========================================= if (!$aThreadList->spmode && $sb_view == 'shinchaku' && empty($_GET['word'])) { @@ -392,6 +408,12 @@ function pageLoaded() } } + // 未読数制限 + if ($unum_limit > 0 && $aThread->unum >= $unum_limit) { + unset($aThread); + continue; + } + if ($aThread->isonline) { $online_num++; } // 生存数set P2Util::printInfoHtml(); @@ -515,7 +537,7 @@ function readNew($aThread) } //if (!$aThread->ls) { - $aThread->ls = "$from_num-"; + $aThread->ls = "{$from_num}-"; //} } @@ -779,7 +801,13 @@ function readNew($aThread) echo "<hr>"; } -$shinchaku_matome_url = "{$_conf['read_new_php']}?host={$aThreadList->host}&bbs={$aThreadList->bbs}&spmode={$aThreadList->spmode}&nt={$newtime}"; +if ($unum_limit > 0) { + $unum_limit_at_a = "&unum_limit={$unum_limit}"; +} else { + $unum_limit_at_a = ''; +} + +$shinchaku_matome_url = "{$_conf['read_new_php']}?host={$aThreadList->host}&bbs={$aThreadList->bbs}&spmode={$aThreadList->spmode}&nt={$newtime}{$unum_limit_at_a}"; if ($aThreadList->spmode == 'merge_favita') { $shinchaku_matome_url .= $_conf['m_favita_set_at_a']; diff --git a/rep2/read_new_k.php b/rep2/read_new_k.php index d14a4cf71..b831c7cd3 100644 --- a/rep2/read_new_k.php +++ b/rep2/read_new_k.php @@ -23,8 +23,8 @@ $sb_view = 'shinchaku'; $newtime = date('gis'); -$newthre_num = 0; $online_num = 0; +$newthre_num = 0; //================================================= // 板の指定 @@ -50,9 +50,9 @@ } // 未読数制限 -if (isset($_GET['unum_limit'])) { +if (ctype_digit($_GET['unum_limit'])) { $unum_limit = (int)$_GET['unum_limit']; -} elseif (isset($_POST['unum_limit'])) { +} elseif (ctype_digit($_POST['unum_limit'])) { $unum_limit = (int)$_POST['unum_limit']; } else { $unum_limit = 0; @@ -72,7 +72,7 @@ // 板とモードのセット =================================== $ta_keys = array(); if ($spmode) { - if ($spmode == "taborn" or $spmode == "soko") { + if ($spmode == 'taborn' or $spmode == 'soko') { $aThreadList->setIta($host, $bbs, P2Util::getItaName($host, $bbs)); } $aThreadList->setSpMode($spmode); @@ -234,6 +234,7 @@ $aThread->torder = $x + 1; // データ読み込み + // spmodeなら if ($aThreadList->spmode) { switch ($aThreadList->spmode) { case "recent": // 履歴 @@ -250,7 +251,7 @@ $aThread->host = $aThreadList->host; $aThread->bbs = $aThreadList->bbs; break; - case "palace": // 殿堂入り + case "palace": // スレの殿堂 $aThread->getThreadInfoFromExtIdxLine($l); break; case "merge_favita": // お気に板をマージ @@ -266,7 +267,7 @@ } break; } - // subject (not spmode) + // subject (not spmode)の場合 } else { $aThread->getThreadInfoFromSubjectTxtLine($l); $aThread->host = $aThreadList->host; @@ -293,7 +294,7 @@ } // スレッドあぼーんチェック ===================================== - if ($aThreadList->spmode != "taborn" && !empty($ta_keys[$aThread->key])) { + if ($aThreadList->spmode != 'taborn' && !empty($ta_keys[$aThread->key])) { unset($ta_keys[$aThread->key]); continue; // あぼーんスレはスキップ } @@ -321,7 +322,7 @@ } // 新着のみ(for spmode) =============================== - if ($sb_view == "shinchaku" && empty($_GET['word'])) { + if ($sb_view == 'shinchaku' && empty($_GET['word'])) { if ($aThread->unum < 1) { unset($aThread); continue; From a286e811addfa000a04f56af7f105f61dc454dae Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 16 Apr 2015 18:50:49 +0900 Subject: [PATCH 142/339] =?UTF-8?q?rep2=E3=81=AB=E7=99=BB=E9=8C=B2?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=9F=E5=A4=96=E9=83=A8=E6=9D=BF=E3=81=B8?= =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=82=AF=E3=81=99=E3=82=8B=E6=A9=9F=E8=83=BD?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0=20=E5=8F=8D=E6=98=A0=E3=81=AB?= =?UTF-8?q?=E3=81=AFdata/cache/host=5Fbbs=5Fmap.txt=E3=81=AE=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E3=81=8C=E5=BF=85=E8=A6=81=E3=81=AA=E3=81=9F=E3=82=81?= =?UTF-8?q?=E3=81=99=E3=81=90=E3=81=AB=E8=A9=A6=E3=81=99=E5=A0=B4=E5=90=88?= =?UTF-8?q?=E3=81=AF=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/BbsMap.php | 49 ++++++++++++++++++++++++++++++++++++- lib/P2Util.php | 53 ++++++++++++++++++++++------------------- lib/ShowBrdMenuPc.php | 2 +- lib/ShowThreadI.php | 9 ++++--- lib/ShowThreadK.php | 9 ++++--- lib/ShowThreadPc.php | 15 +++++++----- lib/ThreadRead.php | 2 +- lib/read_header.inc.php | 9 +++---- 8 files changed, 104 insertions(+), 44 deletions(-) diff --git a/lib/BbsMap.php b/lib/BbsMap.php index a1d3a57ee..16fe7767e 100644 --- a/lib/BbsMap.php +++ b/lib/BbsMap.php @@ -5,6 +5,7 @@ /** * BbsMapクラス * 板-ホストの対応表を作成し、それに基づいてホストの同期を行う + * 外部板がrep2に登録されているかどうかの判定も兼ねる * * @static */ @@ -87,6 +88,52 @@ static public function getBbsName($host, $bbs) return $itaj; } + // }}} + // {{{ isRegisteredBbs() + + /** + * 板がrep2に登録されているかどうか + * + * @param string $host ホスト名 + * @param string $bbs 板名 + * @return bool rep2に追加されている板ならtrue + */ + static public function isRegisteredBbs($host, $bbs) + { + global $_conf; + + $type = self::_detectHostType($host); + + // 登録無しでもrep2で扱える板はチェック無しでtrue + if($host != $type) { + return true; + } + + // マッピング読み込み + $map = self::_getMapping(); + if (!$map) { + return false; + } + + // チェック + if (isset($map[$type]) && isset($map[$type][$bbs])) { + return true; + } + + // もし見つからなければお気に板の内容も確認(外部板が登録可能になっているため) + if ($lines = FileCtl::file_read_lines($_conf['favita_brd'], FILE_IGNORE_NEW_LINES)) { + foreach ($lines as $l) { + if (preg_match("/^\t?(.+)\t(.+)\t(.+)\$/", $l, $matches)) { + if ($host == $matches[1]) + { + return true; + } + } + } + } + return false; + } + // }}} // {{{ syncBrd() @@ -289,7 +336,7 @@ static private function _getMapping() // }}} // {{{ メニューをダウンロード - $brd_menus_online = BrdCtl::read_brd_online(); + $brd_menus_online = BrdCtl::read_brds(); $map = array(); foreach ($brd_menus_online as $a_brd_menu) { diff --git a/lib/P2Util.php b/lib/P2Util.php index 7f8ad804d..cac9eff38 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1879,28 +1879,13 @@ static public function detectThread($url = null) // スレURLの直接指定 if ($nama_url) { - // 2ch or pink - http://choco.2ch.net/test/read.cgi/event/1027770702/ - if (preg_match('<^http://(\\w+\\.(?:2ch\\.net|bbspink\\.com|vip2ch\\.com))/test/read\\.(?:cgi|html) - /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) - { - $host = $matches[1]; - $bbs = $matches[2]; - $key = $matches[3]; - $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; - - // 2ch or pink 過去ログhtml - http://pc.2ch.net/mac/kako/1015/10153/1015358199.html - } elseif (preg_match('<^(http://(\\w+\\.(?:2ch\\.net|bbspink\\.com|vip2ch\\.com))(?:/[^/]+)?/(\\w+) - /kako/\\d+(?:/\\d+)?/(\\d+)).html>x', $nama_url, $matches)) - { - $host = $matches[2]; - $bbs = $matches[3]; - $key = $matches[4]; - $ls = ''; - $kakolog_url = $matches[1]; - $_GET['kakolog'] = $kakolog_url; + $host = null; + $bbs = null; + $key = null; + $ls = null; // まちBBS - http://kanto.machi.to/bbs/read.cgi/kanto/1241815559/ - } elseif (preg_match('<^http://(\\w+\\.machi(?:bbs\\.com|\\.to))/bbs/read\\.cgi + if (preg_match('<^http://(\\w+\\.machi(?:bbs\\.com|\\.to))/bbs/read\\.cgi /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) { $host = $matches[1]; @@ -1930,11 +1915,29 @@ static public function detectThread($url = null) $host = $matches[1]; list($bbs, $key, $ls) = self::parseMachiQuery($matches[4]); - } else { - $host = null; - $bbs = null; - $key = null; - $ls = null; + // 2ch or pink - http://choco.2ch.net/test/read.cgi/event/1027770702/ + } elseif (preg_match('<^https?://(.+)/test/read\\.(?:cgi|html|so) + /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) + { + if(BbsMap::isRegisteredBbs($matches[1] ,$matches[2])) { + $host = $matches[1]; + $bbs = $matches[2]; + $key = $matches[3]; + $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; + } + + // 2ch or pink 過去ログhtml - http://pc.2ch.net/mac/kako/1015/10153/1015358199.html + } elseif (preg_match('<^(https?://(.+)(?:/[^/]+)?/(\\w+) + /kako/\\d+(?:/\\d+)?/(\\d+)).html>x', $nama_url, $matches)) + { + if(BbsMap::isRegisteredBbs($matches[2] ,$matches[3])) { + $host = $matches[2]; + $bbs = $matches[3]; + $key = $matches[4]; + $ls = ''; + $kakolog_url = $matches[1]; + $_GET['kakolog'] = $kakolog_url; + } } // 補正 diff --git a/lib/ShowBrdMenuPc.php b/lib/ShowBrdMenuPc.php index 06fb6f628..583bf4ce8 100644 --- a/lib/ShowBrdMenuPc.php +++ b/lib/ShowBrdMenuPc.php @@ -86,7 +86,7 @@ public function printFavIta() if ($_conf['merge_favita']) { echo <<<EOP -   <a href="{$_conf['subject_php']}?spmode=merge_favita{$_conf['m_favita_set_at_a']}">{$favset_title} (まとめ)</a><br>\n + <a href="{$_conf['subject_php']}?spmode=merge_favita{$_conf['m_favita_set_at_a']}">{$favset_title} (まとめ)</a><br>\n EOP; } diff --git a/lib/ShowThreadI.php b/lib/ShowThreadI.php index c52b20ff1..50ec003e2 100644 --- a/lib/ShowThreadI.php +++ b/lib/ShowThreadI.php @@ -842,9 +842,12 @@ public function plugin_link2chSubject($url, $purl, $str) { global $_conf; - if (preg_match('{^http://(\\w+\\.(?:2ch\\.net|bbspink\\.com))/(\\w+)/$}', $purl[0], $m)) { - $subject_url = "{$_conf['subject_php']}?host={$m[1]}&bbs={$m[2]}"; - return "<a href=\"{$url}\">{$str}</a> [<a href=\"{$subject_url}{$_conf['k_at_a']}\">板をp2で開く</a>]"; + if (preg_match('{^https?://(.+)/(.+)/$}', $purl[0], $m)) { + //rep2に登録されている板ならばリンクする + if (BbsMap::isRegisteredBbs($m[1],$m[2])) { + $subject_url = "{$_conf['subject_php']}?host={$m[1]}&bbs={$m[2]}"; + return "<a href=\"{$url}\">{$str}</a> [<a href=\"{$subject_url}{$_conf['k_at_a']}\">板をp2で開く</a>]"; + } } return false; } diff --git a/lib/ShowThreadK.php b/lib/ShowThreadK.php index 27f7a107a..dfda8ead8 100644 --- a/lib/ShowThreadK.php +++ b/lib/ShowThreadK.php @@ -754,9 +754,12 @@ public function plugin_link2chSubject($url, $purl, $str) { global $_conf; - if (preg_match('{^http://(\\w+\\.(?:2ch\\.net|bbspink\\.com))/(\\w+)/$}', $purl[0], $m)) { - $subject_url = "{$_conf['subject_php']}?host={$m[1]}&bbs={$m[2]}"; - return "<a href=\"{$url}\">{$str}</a> [<a href=\"{$subject_url}{$_conf['k_at_a']}\">板をp2で開く</a>]"; + if (preg_match('{^https?://(.+)/(.+)/$}', $purl[0], $m)) { + //rep2に登録されている板ならばリンクする + if (BbsMap::isRegisteredBbs($m[1],$m[2])) { + $subject_url = "{$_conf['subject_php']}?host={$m[1]}&bbs={$m[2]}"; + return "<a href=\"{$url}\">{$str}</a> [<a href=\"{$subject_url}{$_conf['k_at_a']}\">板をp2で開く</a>]"; + } } return false; } diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index 41468a1ec..188602a8b 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -154,7 +154,7 @@ public function transRes($ares, $i, $pattern = null) $idstr = null; } - // +live (live.bbs_noname) 用 + // +live (live.bbs_noname) 用 if (!empty($this->BBS_NONAME_NAME) and $this->BBS_NONAME_NAME == $name) { $name = ''; } @@ -1274,9 +1274,12 @@ public function plugin_link2chSubject($url, $purl, $str) { global $_conf; - if (preg_match('{^http://(\\w+\\.(?:2ch\\.net|bbspink\\.com))/(\\w+)/$}', $purl[0], $m)) { - $subject_url = "{$_conf['subject_php']}?host={$m[1]}&bbs={$m[2]}"; - return "<a href=\"{$url}\" target=\"subject\">{$str}</a> [<a href=\"{$subject_url}\" target=\"subject\">板をp2で開く</a>]"; + if (preg_match('{^https?://(.+)/(.+)/$}', $purl[0], $m)) { + //rep2に登録されている板ならばリンクする + if (BbsMap::isRegisteredBbs($m[1],$m[2])) { + $subject_url = "{$_conf['subject_php']}?host={$m[1]}&bbs={$m[2]}"; + return "<a href=\"{$url}\" target=\"subject\">{$str}</a> [<a href=\"{$subject_url}{$_conf['k_at_a']}\" target=\"subject\">板をp2で開く</a>]"; + } } return false; } @@ -1298,7 +1301,7 @@ public function plugin_linkThread($url, $purl, $str) list($nama_url, $host, $bbs, $key, $ls) = P2Util::detectThread($purl[0]); if ($host && $bbs && $key) { - $read_url = "{$_conf['read_php']}?host={$host}&bbs={$bbs}&key={$key}&ls={$ls}"; + $read_url = "{$_conf['read_php']}?host={$host}&bbs={$bbs}&key={$key}&ls={$ls}{$_conf['k_at_a']}"; if ($_conf['iframe_popup']) { if ($ls && preg_match('/^[0-9\\-n]+$/', $ls)) { $pop_url = $read_url; @@ -1340,7 +1343,7 @@ public function plugin_linkYouTube($url, $purl, $str) // http://www.youtube.com/watch?v=Mn8tiFnAUAI // http://m.youtube.com/watch?v=OhcX0xJsDK8&client=mv-google&gl=JP&hl=ja&guid=ON&warned=True if (preg_match('{^https?://(youtu\\.be/|(www|jp|m)\\.youtube\\.com/watch\\?(?:.+&)?v=)([0-9a-zA-Z_\\-]+)}', $url, $m)) { - $url = preg_replace('{^http:}', 'https:', $url); + $url = preg_replace('{^http:}', 'https:', $url); // ime if ($_conf['through_ime']) { $link_url = P2Util::throughIme($url); diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index d0b076ea0..609a1df6d 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -699,7 +699,7 @@ public function get2chDatError($code = null) { $read_response_html = ''; if (! $reason) { try { - $req = P2Util::getHTTPRequest2 ($read_url, HTTP_Request2::METHOD_GET); + $req = P2Util::getHTTPRequest2 ($read_url + '1/', HTTP_Request2::METHOD_GET); // ヘッダ $req->setHeader ('User-Agent', P2Util::getP2UA(false,P2Util::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG diff --git a/lib/read_header.inc.php b/lib/read_header.inc.php index 248f8fd50..c1aef7b33 100755 --- a/lib/read_header.inc.php +++ b/lib/read_header.inc.php @@ -417,14 +417,15 @@ function filterCount(n) } else { $diedat_msg = $aThread->getDefaultGetDatErrorMessageHTML(); } + $motothre_url_t = P2Util::throughIme ($motothre_url); - $motothre_popup = " onmouseover=\"showHtmlPopUp('{$motothre_url}',event,{$_conf['iframe_popup_delay']})\" onmouseout=\"offHtmlPopUp()\""; + $motothre_popup = " onmouseover=\"showHtmlPopUp('{$motothre_url_t}',event,{$_conf['iframe_popup_delay']})\" onmouseout=\"offHtmlPopUp()\""; if ($_conf['iframe_popup'] == 1) { - $motothre_ht = "<a href=\"{$motothre_url}\"{$_conf['bbs_win_target_at']}{$motothre_popup}>{$motothre_url}</a>"; + $motothre_ht = "<a href=\"{$motothre_url_t}\"{$_conf['bbs_win_target_at']}{$motothre_popup}>{$motothre_url}</a>"; } elseif ($_conf['iframe_popup'] == 2) { - $motothre_ht = "(<a href=\"{$motothre_url}\"{$_conf['bbs_win_target_at']}{$motothre_popup}>p</a>)<a href=\"{$motothre_url}\"{$_conf['bbs_win_target_at']}>{$motothre_url}</a>"; + $motothre_ht = "(<a href=\"{$motothre_url_t}\"{$_conf['bbs_win_target_at']}{$motothre_popup}>p</a>)<a href=\"{$motothre_url_t}\"{$_conf['bbs_win_target_at']}>{$motothre_url}</a>"; } else { - $motothre_ht = "<a href=\"{$motothre_url}\"{$_conf['bbs_win_target_at']}>{$motothre_url}</a>"; + $motothre_ht = "<a href=\"{$motothre_url_t}\"{$_conf['bbs_win_target_at']}>{$motothre_url}</a>"; } echo $diedat_msg; From 7090f0467e5220959e695ba8021709e9bb34591a Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 17 Apr 2015 00:32:37 +0900 Subject: [PATCH 143/339] =?UTF-8?q?ai=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=81=8C=E6=AE=8B=E3=81=A3=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE?= =?UTF-8?q?=E3=81=A7=E9=99=A4=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + rep2/img/glyphish/icons2/108-badge.ai | 1582 ------------------------- 2 files changed, 1 insertion(+), 1582 deletions(-) delete mode 100644 rep2/img/glyphish/icons2/108-badge.ai diff --git a/README.md b/README.md index a41092fe4..75029eea2 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,7 @@ Web繝悶Λ繧ヲ繧カ縺九i螟画峩縺ァ縺阪↑縺鬆逶ョ縺ッ [conf/conf_admin.inc.php](https * **orzisun** https://github.com/orzisun/p2-php * **2ch774** https://github.com/2ch774/p2-php * **killer4989** https://github.com/killer4989/p2-php +* **dgg712** https://github.com/dgg712/p2-php * **2ch p2/rep2繧ケ繝ャ縺ョ>>1-1000** diff --git a/rep2/img/glyphish/icons2/108-badge.ai b/rep2/img/glyphish/icons2/108-badge.ai deleted file mode 100644 index 39c258115..000000000 --- a/rep2/img/glyphish/icons2/108-badge.ai +++ /dev/null @@ -1,1582 +0,0 @@ -%PDF-1.5 %粤マモ -1 0 obj <</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R 32 0 R 52 0 R]/Order 53 0 R/RBGroups[]>>/OCGs[5 0 R 32 0 R 52 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <</Length 37726/Subtype/XML/Type/Metadata>>stream -<?xpacket begin="サソ" id="W5M0MpCehiHzreSzNTczkc9d"?> -<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27 "> - <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> - <rdf:Description rdf:about="" - xmlns:dc="http://purl.org/dc/elements/1.1/"> - <dc:format>application/pdf</dc:format> - <dc:title> - <rdf:Alt> - <rdf:li xml:lang="x-default">Print</rdf:li> - </rdf:Alt> - </dc:title> - </rdf:Description> - <rdf:Description rdf:about="" - xmlns:xmp="http://ns.adobe.com/xap/1.0/" - xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"> - <xmp:MetadataDate>2015-04-15T13:57:29+09:00</xmp:MetadataDate> - <xmp:ModifyDate>2015-04-15T13:57:29+09:00</xmp:ModifyDate> - <xmp:CreateDate>2015-04-15T13:45:56+09:00</xmp:CreateDate> - <xmp:CreatorTool>Adobe Illustrator CS6 (Macintosh)</xmp:CreatorTool> - <xmp:Thumbnails> - <rdf:Alt> - <rdf:li rdf:parseType="Resource"> - <xmpGImg:width>256</xmpGImg:width> - <xmpGImg:height>172</xmpGImg:height> - <xmpGImg:format>JPEG</xmpGImg:format> - <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgArAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FVGb7f0YqsxQ7FV8P2/oxS6b7f0YqsxQ7FV8P2/oxS6b7f0YqsxQ7FV8P2/oxSr Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVGb7f0YqsxQ7FV8P2/oxS6b7f0Y qsxQ7FV8P2/oxS6b7f0YqsxQ7FV8P2/oxSrYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FVGb7f0YqsxQ7FV8P2/oxS6b7f0YqsxQ7FV8P2/oxS6b7f0YqsxQ7FV8P2/oxSrYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVGb7f0YqsxQ7FV8P2/oxS6b7f0YqsxQ7F V8P2/oxS6b7f0YqsxQ7FV8P2/oxSrYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FVGb7f0YqsxQ7FV8P2/oxS6b7f0Yqhb2X0rZ2HUii/M4odZS+rbIx6gUb5jFUVD9v6MUum+39GK rMUOxVfD9v6MUq2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVRm+39GKrMUOx VfD9v6MUum+39GKpRq8tWSIdvib5npih2kS0Z4j3+JfmOuKpvD9v6MUum+39GKrMUOxVfD9v6MUq 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVRm+39GKrMUOxVfD9v6MUum+19G KscuJfVneTsTt8u2KHW8vpTpJ2B3+XfFWRw/a+jFLpvt/RiqzFDsVXw/b+jFKtirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVaZA3Xr44qoMjL16eOKGsVXw/b+jFKH1WX04GI6sOI +n+zFUgxQ7FU/wBKl9SBSeqjifo/sxSiJvt/RiqzFDaozdOnjiquqBenXxxS3irsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdiqlNdW8JAlcITuK4qpnUrEf7uH4nFWjqdh/v0fcf6Yqovq Gn9Vl+ji39MVaTVLJWqX/wCFP9MVQOq3kdw6CI1RRuaU3OKoHFDsVR2lXkdu7iU0RhsaV3GKUc+q WTNUP/wp/piraahp/Vpfo4t/TFVYanYf79H3H+mKtjUrE/7uH4jFVSK6t5iRE4cjrTFVXFXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqsmgimjKSLyU/h8sVSK+0yW2Jdfjh/m7j54qgsUO xV2KuxV2KuxV2KuxV2KuxVG2OmS3JDt8EP8AN3PyxSnsMEUMYSNeKj8fniq/FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXEAih3BxVKb/R61kthQ9TF/wA04qlBBBIIoRsQcUOxV2Ku xV2KuxV2KuAJIAFSdgBiqb2Gj0pJcip6iL/mrFKbAACg2AxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxVCX2mxXI5D4Jezjv8APFUgngkglMcgowxQsxV2KuxV2Kr4IJJ5 RHGKscVT+x02G2HI/HL3c9vlilF4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYqxi8m9a5kk7FtvkNhihRxV2KuxV2Kq1nN6NzHJ0Abf5HY4qyfFLsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqHv5vRtJX70ovzO2KsaxQ7FW1VnYKo LMegG5xVzKyMVYFWHUHY4q1irsVZLYTetaRP3pRvmNsUojFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYqlWuzfDHCO/xt9GwxVJ8UIi0sZ7lqIKIPtOegxSntpYwWy/A KuernrirruxguV+MUcdHHXFUiu7Ge2ajiqH7LjocVQ+KE40Kb4ZIT2+Nfp2OKU1xV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ksc1KUzXslNwp4KPlt+vFUVY6MzUkuf hXtH3Pz8MVThEVFCoAqjoB0xVvFXYq06K6lXAZT1B6Yqk99ozLWS2+Je8fcfLxxVC6bKYb2OuwY8 GHz2/XirI8VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVablxPH7VPh r0riqFs9Oht/jPxzHq5/hiqLxV2KuxV2KuxV2KoS806G4+MfBMOjj+OKopeXEcvtU+KnSuKt4q7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq//9k=</xmpGImg:image> - </rdf:li> - </rdf:Alt> - </xmp:Thumbnails> - </rdf:Description> - <rdf:Description rdf:about="" - xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" - xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" - xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" - xmlns:stMfs="http://ns.adobe.com/xap/1.0/sType/ManifestItem#"> - <xmpMM:InstanceID>uuid:ec32ecb0-f02c-2a4c-b7eb-05a6aa4b7a7a</xmpMM:InstanceID> - <xmpMM:DocumentID>xmp.did:0680117407206811822AD3757CE76CAE</xmpMM:DocumentID> - <xmpMM:OriginalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</xmpMM:OriginalDocumentID> - <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass> - <xmpMM:DerivedFrom rdf:parseType="Resource"> - <stRef:instanceID>xmp.iid:0580117407206811822AD3757CE76CAE</stRef:instanceID> - <stRef:documentID>xmp.did:0580117407206811822AD3757CE76CAE</stRef:documentID> - <stRef:originalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</stRef:originalDocumentID> - <stRef:renditionClass>proof:pdf</stRef:renditionClass> - </xmpMM:DerivedFrom> - <xmpMM:History> - <rdf:Seq> - <rdf:li rdf:parseType="Resource"> - <stEvt:action>saved</stEvt:action> - <stEvt:instanceID>xmp.iid:0580117407206811822AD3757CE76CAE</stEvt:instanceID> - <stEvt:when>2015-04-15T13:44:37+09:00</stEvt:when> - <stEvt:softwareAgent>Adobe Illustrator CS6 (Macintosh)</stEvt:softwareAgent> - <stEvt:changed>/</stEvt:changed> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <stEvt:action>saved</stEvt:action> - <stEvt:instanceID>xmp.iid:0680117407206811822AD3757CE76CAE</stEvt:instanceID> - <stEvt:when>2015-04-15T13:45:56+09:00</stEvt:when> - <stEvt:softwareAgent>Adobe Illustrator CS6 (Macintosh)</stEvt:softwareAgent> - <stEvt:changed>/</stEvt:changed> - </rdf:li> - </rdf:Seq> - </xmpMM:History> - <xmpMM:Manifest> - <rdf:Seq> - <rdf:li rdf:parseType="Resource"> - <stMfs:linkForm>EmbedByReference</stMfs:linkForm> - <stMfs:reference rdf:parseType="Resource"> - <stRef:filePath>/Volumes/home/rep2img/108-badge.png</stRef:filePath> - </stMfs:reference> - </rdf:li> - </rdf:Seq> - </xmpMM:Manifest> - </rdf:Description> - <rdf:Description rdf:about="" - xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/"> - <illustrator:Type>Document</illustrator:Type> - <illustrator:StartupProfile>Print</illustrator:StartupProfile> - </rdf:Description> - <rdf:Description rdf:about="" - xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" - xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" - xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"> - <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint> - <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency> - <xmpTPg:NPages>1</xmpTPg:NPages> - <xmpTPg:MaxPageSize rdf:parseType="Resource"> - <stDim:w>480.000000</stDim:w> - <stDim:h>320.000000</stDim:h> - <stDim:unit>Pixels</stDim:unit> - </xmpTPg:MaxPageSize> - <xmpTPg:PlateNames> - <rdf:Seq> - <rdf:li>Cyan</rdf:li> - <rdf:li>Magenta</rdf:li> - <rdf:li>Yellow</rdf:li> - <rdf:li>Black</rdf:li> - </rdf:Seq> - </xmpTPg:PlateNames> - <xmpTPg:SwatchGroups> - <rdf:Seq> - <rdf:li rdf:parseType="Resource"> - <xmpG:groupName>蛻晄悄險ュ螳壹ョ繧ケ繧ヲ繧ゥ繝繝√げ繝ォ繝シ繝</xmpG:groupName> - <xmpG:groupType>0</xmpG:groupType> - <xmpG:Colorants> - <rdf:Seq> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>繝帙Ρ繧、繝</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>255</xmpG:green> - <xmpG:blue>255</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>繝悶Λ繝繧ッ</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>35</xmpG:red> - <xmpG:green>24</xmpG:green> - <xmpG:blue>21</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>CMYK 繝ャ繝繝</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>230</xmpG:red> - <xmpG:green>0</xmpG:green> - <xmpG:blue>18</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>CMYK 繧、繧ィ繝ュ繝シ</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>241</xmpG:green> - <xmpG:blue>0</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>CMYK 繧ー繝ェ繝シ繝ウ</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>153</xmpG:green> - <xmpG:blue>68</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>CMYK 繧キ繧「繝ウ</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>160</xmpG:green> - <xmpG:blue>233</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>CMYK 繝悶Ν繝シ</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>29</xmpG:red> - <xmpG:green>32</xmpG:green> - <xmpG:blue>136</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>CMYK 繝槭ぞ繝ウ繧ソ</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>228</xmpG:red> - <xmpG:green>0</xmpG:green> - <xmpG:blue>127</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=15 M=100 Y=90 K=10</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>195</xmpG:red> - <xmpG:green>13</xmpG:green> - <xmpG:blue>35</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=90 Y=85 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>232</xmpG:red> - <xmpG:green>56</xmpG:green> - <xmpG:blue>40</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=80 Y=95 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>234</xmpG:red> - <xmpG:green>85</xmpG:green> - <xmpG:blue>20</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=50 Y=100 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>243</xmpG:red> - <xmpG:green>152</xmpG:green> - <xmpG:blue>0</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=35 Y=85 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>248</xmpG:red> - <xmpG:green>182</xmpG:green> - <xmpG:blue>45</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=5 M=0 Y=90 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>250</xmpG:red> - <xmpG:green>238</xmpG:green> - <xmpG:blue>0</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=20 M=0 Y=100 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>218</xmpG:red> - <xmpG:green>224</xmpG:green> - <xmpG:blue>0</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=50 M=0 Y=100 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>143</xmpG:red> - <xmpG:green>195</xmpG:green> - <xmpG:blue>31</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=75 M=0 Y=100 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>34</xmpG:red> - <xmpG:green>172</xmpG:green> - <xmpG:blue>56</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=85 M=10 Y=100 K=10</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>145</xmpG:green> - <xmpG:blue>58</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=90 M=30 Y=95 K=30</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>105</xmpG:green> - <xmpG:blue>52</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=75 M=0 Y=75 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>19</xmpG:red> - <xmpG:green>174</xmpG:green> - <xmpG:blue>103</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=80 M=10 Y=45 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>162</xmpG:green> - <xmpG:blue>154</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=70 M=15 Y=0 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>46</xmpG:red> - <xmpG:green>167</xmpG:green> - <xmpG:blue>224</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=85 M=50 Y=0 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>3</xmpG:red> - <xmpG:green>110</xmpG:green> - <xmpG:blue>184</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=100 M=95 Y=5 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>23</xmpG:red> - <xmpG:green>42</xmpG:green> - <xmpG:blue>136</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=100 M=100 Y=25 K=25</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>23</xmpG:red> - <xmpG:green>28</xmpG:green> - <xmpG:blue>97</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=75 M=100 Y=0 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>96</xmpG:red> - <xmpG:green>25</xmpG:green> - <xmpG:blue>134</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=50 M=100 Y=0 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>146</xmpG:red> - <xmpG:green>7</xmpG:green> - <xmpG:blue>131</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=35 M=100 Y=35 K=10</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>164</xmpG:red> - <xmpG:green>11</xmpG:green> - <xmpG:blue>93</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=10 M=100 Y=50 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>215</xmpG:red> - <xmpG:green>0</xmpG:green> - <xmpG:blue>81</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=95 Y=20 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>230</xmpG:red> - <xmpG:green>22</xmpG:green> - <xmpG:blue>115</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=25 M=25 Y=40 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>201</xmpG:red> - <xmpG:green>188</xmpG:green> - <xmpG:blue>156</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=40 M=45 Y=50 K=5</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>164</xmpG:red> - <xmpG:green>139</xmpG:green> - <xmpG:blue>120</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=50 M=50 Y=60 K=25</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>122</xmpG:red> - <xmpG:green>106</xmpG:green> - <xmpG:blue>86</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=55 M=60 Y=65 K=40</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>96</xmpG:red> - <xmpG:green>76</xmpG:green> - <xmpG:blue>63</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=25 M=40 Y=65 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>201</xmpG:red> - <xmpG:green>160</xmpG:green> - <xmpG:blue>99</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=30 M=50 Y=75 K=10</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>178</xmpG:red> - <xmpG:green>130</xmpG:green> - <xmpG:blue>71</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=35 M=60 Y=80 K=25</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>149</xmpG:red> - <xmpG:green>97</xmpG:green> - <xmpG:blue>52</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=40 M=65 Y=90 K=35</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>127</xmpG:red> - <xmpG:green>79</xmpG:green> - <xmpG:blue>33</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=40 M=70 Y=100 K=50</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>106</xmpG:red> - <xmpG:green>57</xmpG:green> - <xmpG:blue>6</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=50 M=70 Y=80 K=70</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>64</xmpG:red> - <xmpG:green>34</xmpG:green> - <xmpG:blue>15</xmpG:blue> - </rdf:li> - </rdf:Seq> - </xmpG:Colorants> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:groupName>繧ー繝ャ繝シ</xmpG:groupName> - <xmpG:groupType>1</xmpG:groupType> - <xmpG:Colorants> - <rdf:Seq> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=0 Y=0 K=100</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>35</xmpG:red> - <xmpG:green>24</xmpG:green> - <xmpG:blue>21</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=0 Y=0 K=90</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>62</xmpG:red> - <xmpG:green>58</xmpG:green> - <xmpG:blue>57</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=0 Y=0 K=80</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>89</xmpG:red> - <xmpG:green>87</xmpG:green> - <xmpG:blue>87</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=0 Y=0 K=70</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>114</xmpG:red> - <xmpG:green>113</xmpG:green> - <xmpG:blue>113</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=0 Y=0 K=60</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>137</xmpG:red> - <xmpG:green>137</xmpG:green> - <xmpG:blue>137</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=0 Y=0 K=50</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>159</xmpG:red> - <xmpG:green>160</xmpG:green> - <xmpG:blue>160</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=0 Y=0 K=40</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>181</xmpG:red> - <xmpG:green>181</xmpG:green> - <xmpG:blue>182</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=0 Y=0 K=30</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>201</xmpG:red> - <xmpG:green>202</xmpG:green> - <xmpG:blue>202</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=0 Y=0 K=20</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>220</xmpG:red> - <xmpG:green>221</xmpG:green> - <xmpG:blue>221</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=0 Y=0 K=10</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>239</xmpG:red> - <xmpG:green>239</xmpG:green> - <xmpG:blue>239</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=0 Y=0 K=5</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>247</xmpG:red> - <xmpG:green>248</xmpG:green> - <xmpG:blue>248</xmpG:blue> - </rdf:li> - </rdf:Seq> - </xmpG:Colorants> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:groupName>霈昴″</xmpG:groupName> - <xmpG:groupType>1</xmpG:groupType> - <xmpG:Colorants> - <rdf:Seq> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=100 Y=100 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>230</xmpG:red> - <xmpG:green>0</xmpG:green> - <xmpG:blue>18</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=75 Y=100 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>235</xmpG:red> - <xmpG:green>97</xmpG:green> - <xmpG:blue>0</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=0 M=10 Y=95 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>226</xmpG:green> - <xmpG:blue>0</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=85 M=10 Y=100 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>154</xmpG:green> - <xmpG:blue>62</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=100 M=90 Y=0 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>11</xmpG:red> - <xmpG:green>49</xmpG:green> - <xmpG:blue>143</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>C=60 M=90 Y=0 K=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>126</xmpG:red> - <xmpG:green>49</xmpG:green> - <xmpG:blue>142</xmpG:blue> - </rdf:li> - </rdf:Seq> - </xmpG:Colorants> - </rdf:li> - </rdf:Seq> - </xmpTPg:SwatchGroups> - </rdf:Description> - <rdf:Description rdf:about="" - xmlns:pdf="http://ns.adobe.com/pdf/1.3/"> - <pdf:Producer>Adobe PDF library 10.01</pdf:Producer> - </rdf:Description> - </rdf:RDF> -</x:xmpmeta> - - - - - - - - - - - - - - - - - - - - - -<?xpacket end="w"?> endstream endobj 3 0 obj <</Count 1/Kids[7 0 R]/Type/Pages>> endobj 7 0 obj <</ArtBox[148.953 48.9473 348.055 298.143]/BleedBox[0.0 0.0 497.008 337.008]/Contents 54 0 R/Group 9 0 R/LastModified(D:20150415135729+09'00')/MediaBox[0.0 0.0 497.008 337.008]/Parent 3 0 R/PieceInfo<</Illustrator 55 0 R>>/Resources<</ColorSpace<</CS0 56 0 R>>/ExtGState<</GS0 57 0 R>>/Properties<</MC0 52 0 R>>>>/Thumb 58 0 R/TrimBox[8.50389 8.50391 488.504 328.504]/Type/Page>> endobj 54 0 obj <</Filter/FlateDecode/Length 256>>stream -H瑛Q[N1 マ)|』c;ホ纓UhUR義承]UE速hlマL&テテテn ps;ニ�モkェュfル*,モエy9ツ|pテスMソ- &A蔓@ZアTJ0拿k撩」 -`Hヌ @R牲!。サソサWヤ3チ彜ケ_[95pQ=rn>7.gm゙ロTタ嬬Kハ[]3,ナ、ロ噪ヤY竏|カナミdkEユ0 -ト匪�「l」ム織ィ )E嚊ァ榔」カクヨセ}゚Hィ$Jネッ^:+vンソ �ge endstream endobj 9 0 obj <</CS 15 0 R/I false/K false/S/Transparency>> endobj 58 0 obj <</BitsPerComponent 8/ColorSpace 59 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 42/Length 171/Width 62>>stream -8;Z\s5n8Df$j?V1(N)?imheG!L,EZM`!^@Lk[C#W#V#/b8eA=d*6#!gs(AL9,P_pT -G`jq_<SJLBhLUs[a_Yc7-p8>dA%mP#Ct1M$rF;\Ipss*=$idSWPrlRhc'/ANZj3Z; -^%#77Cj+-"j15E(.e;E>If6RVG<X2)!*%`aSH~> endstream endobj 59 0 obj [/Indexed/DeviceRGB 255 60 0 R] endobj 60 0 obj <</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1 -VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH< -PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 52 0 obj <</Intent 61 0 R/Name(00、00� �1)/Type/OCG/Usage 62 0 R>> endobj 61 0 obj [/View/Design] endobj 62 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 16.0)/Subtype/Artwork>>>> endobj 57 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>> endobj 56 0 obj [/ICCBased 63 0 R] endobj 63 0 obj <</Filter/FlateDecode/Length 2574/N 3>>stream -H奥幌TSwヌoノ梵焚テc [ー5laQIBHリADED━2ヨmtFOE.ョcュヨ}メ08エラ持8G扼gヲモ9wン゚ス暎�'・ェオユ0 �斎マJ固b、 � - �2yュ.-;!熬ニKーZワ 京^進ス"Lハタ0-ラ �@8(鳩r;qョェ7鎰忱・&Qqカ4アj椰轎9レト -昂ウ)g截」0i弩ラ8#ゥ8wユゥ峯8_ナル・ハィQ腋ワォQハj@&サA)/ヌルgコ>'K�ネtユ;\ モ・$ユコFスZUnタワ(4T%)ォ0C&ッ秘丶Z」妬仭8ヲレbx巣E。チチBム;ッ崛Pヺホモ椴ケ暸 om?躙= -xッヘキカメ-�険タ觴嵳�0セセホ}ヲy)7taセセ>j・ワヌTミ7ソ@シマヌtワ幵`qハ2匈ハ呟&ッョェ6アZ扠ョト?秬yxg)ヒ配・省テァLュU硼ヨ*ヤuオSkSeリO4?ラククcッッリー.�キ �袵�Rエ ゚∇-葡25゚矗ワマ S>モ」Vュ嚥電藾r」セn~マY&+`怐;ツA4ノ 艢ーネA9ミ�=ィ-tーlテ`;サチ~p激消 Gp| ョー`Lョ`<ッ "A YA+Cb(括R。,ィ�*ゝ2B-ミ -ィ鼇。ミn顆ミQtコ}MA0モalサチセー氏Sx ャL&ク^チ」>0|>_'瘍,ツG!"F$H:R!z、颶漸d?r 9欺A&賎ネ 蝿rQ 「疉嚥ハムエEム]鐶4z截gミラチ籾E#H *B=。0HリIpp0MxJ$D1魯, V實ストュトト翔KトサトY嬰E"E脊I2秩ヤEレBレG荊4MzNヲネr!YK 締?%_&゚#ソ「ー(ョ0J:EAi、Qニ(ヌ()モ埜T6U@頃覬+ィヤ!黯麥肴D ・eメヤエ蟠!レh渾ヲh/コ']B/「鴉メ蒋ソ「?a0n敬F!テタXヌリヘ8ナ夾ワ渓訥&5S亰剄6サl露aコ2c婁儁フA!襴#衄腸dャVヨ(k模e筋駘 サ凌}枝櫃篋q9 -N'ホ)ホ].ツu覊クr - w哦 xR^ッ[゙oニ彡h枷゙`>b懐$盻・*~ :・戲桁メb最~桐マ,m,」-楓ン,ッYセエツャ箝*ュ6X梗ンアFュ=ュ3ュュキY浤~dテウ キ苔tロエケi ロzレfル6ロ~`{チvヨボ.ムNgキナ庇#{セ}エ}ァクjマ鎌c1X6敞fm克;'_9 徨:8ンqヲ:享ヒ廾:マク8ク、ケエクuケ飩qサ冥nv=フM燒カハmワセタR 4 -nサ3ワ」ワkワGンッz=ト[=セ=<ヒ=G</zチ^チ^jッュ^両 ゙。゙ZQBコ0FX'ワ+懿磊、t口<u-ン炮ヨオ_神捕倚-G,}鉐/ソタHh 8mW2p[燹クAiAォN#8$Xシ?AKHIネ{!7ト<qクWy(!46エ-耙aチaーヂW ソソ@ー@ケ`lチンァYト肢ノH,イ$ネノ(ヌ(Yヤhヤ7ムホム願旃b<b*bナ<寿琴ヌ~L&Y&9ト%ニuヌMトs龝繚譱NpJP%M露 JlN<曠HJIレ腎Cj'必wKg辰苧%櫻。ァdァ ァ|縄飭O=ァ%ァmLサスミu。v痊:H率oLソ!ネィノC&13#s$/Y「ャ脈ウルワ粮=ルOsbsrn蠎sO1岐v=ヒ祥マ歃莉hル「ヨ黷#、ツシツ揣ウ九oZ<]TヤUt}荏Iテ痴Kュ遊-、郎,+>TB(ノ/ルS,]6*-楓セW:#諒7ヒ*「ハeソ^YDYル}Uj」鵞yT`#オD=ャカ"ゥb{ナウハハ+ャハッ:!kJ4Gオm・tオ}uC%摎ョK7YVウゥfF泙゚Y ユ.ゥ=b珮?S乞ニ僻ゥコネコ村鋏yリ レ 込耕5%4ヲm7殕qlio兒ウlG+ヤZレzイヘケュウmzy糘]ヤハ?uuw|ソ"ナアNサホ蝮wW&ョワロeヨ・コア*|ユユ鑠皷5kカャyンュ「ヌッgー辯^ykEkヨクョlンD_p゚カトレラ7Dmリユマoソサ1m聶l{瓔Mナ嶄 n゚Lンlワ<9琵O�、[从$剞咨喇墸妝岷怏戈拇旆曄椣沂滯iリ。G。カ「&「魅」v」讀V、ヌ・8・ゥヲヲ協ァnァ爲Rィトゥ7ゥゥェェ将ォuォ鬯\ャミュDュクョ-ョ。ッッ恐�ーuーア`アヨイKイツウ8ウョエ%エ愀オ憾カyカキhキ犧YクムケJケツコ;コオサ.サァシ!シ嵜ス樟 -セ╂ソzソタpタチgチ翊_ツロテXテヤトQトホナKナネニFニテヌAヌソネ=ネシノ:ノケハ8ハキヒ6ヒカフ5フオヘ5ヘオホ6ホカマ7マクミ9ミコム<ムセメ?メチモDモニヤIヤヒユNユムヨUヨリラ\ラ獵dリ鞁lルレvレロワワ岸ン尤゙「゚)゚ッ6狄瓮睥禊籟緜肭舖蕈蜆 譁遨2霈颶鰔鷦褄p懣(エ@フX褥r候ァ4ツP゙m旗ィ8ヌW鍄w)コKワm � endstream endobj 55 0 obj <</LastModified(D:20150415135729+09'00')/Private 64 0 R>> endobj 64 0 obj <</AIMetaData 65 0 R/AIPrivateData1 66 0 R/AIPrivateData2 67 0 R/AIPrivateData3 68 0 R/AIPrivateData4 69 0 R/AIPrivateData5 70 0 R/ContainerVersion 11/CreatorVersion 16/NumBlock 5/RoundtripStreamType 1/RoundtripVersion 16>> endobj 65 0 obj <</Length 1037>>stream -%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.4 %%For: (\614\703\623c \610\752\613`) () %%Title: (108-badge.ai) %%CreationDate: 2015/04/15 13:57 %%Canvassize: 16383 %%BoundingBox: -1 -320 480 0 %%HiResBoundingBox: -0.001953 -319.998 479.998 -0.001465 %%DocumentProcessColors: Cyan Magenta Yellow Black %%DocumentFiles:/Volumes/home/rep2img/108-badge.png %AI5_FileFormat 12.0 %AI12_BuildNumber: 691 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([繝ャ繧ク繧ケ繝医Ξ繝シ繧キ繝ァ繝ウ]) %AI3_Cropmarks: 0 -320 480 0 %AI3_TemplateBox: 240.5 -160.5 240.5 -160.5 %AI3_TileBox: -163 -439.5 620 119.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -217 18 3.66 3349 1293 18 0 0 46 134 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 66 0 obj <</Length 4983>>stream -%%BoundingBox: -1 -320 480 0 %%HiResBoundingBox: -0.001953 -319.998 479.998 -0.001465 %AI7_Thumbnail: 128 88 8 %%BeginData: 4834 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFDFCFFFDFCFFFDFCFFFDBCFFA8FFFFFFA8FFFFFFA8FD07FF %A8FFFFFFA8FFFFFFA8FD07FFA8FFFFFFA8FFFFFFA8FDD5FFA8FFAFFFA8FF %AFFFA8FFAFFFA8FFFFFFA8FFAFFFA8FFAFFFA8FFAFFFA8FFFFFFA8FFAFFF %A8FFAFFFA8FFAFFFA8FDD3FFA8FFFFFFA8FFFFFFA8FD07FFA8FFFFFFA8FF %FFFFA8FD07FFA8FFFFFFA8FFFFFFA8FDD7FFAFFFA8FFAFFFA8FFAFFFA8FD %05FFAFFFA8FFAFFFA8FFAFFFA8FD05FFAFFFA8FFAFFFA8FFAFFFA8FDD7FF %A8FFFFFFA8FFFFFFA8FD07FFA8FFFFFFA8FFFFFFA8FD07FFA8FFFFFFA8FF %FFFFA8FDD5FFA8FFAFFFA8FFAFFFA8FFAFFFA8FFFFFFA8FFAFFFA8FFAFFF %A8FFAFFFA8FFFFFFA8FFAFFFA8FFAFFFA8FFAFFFA8FDD3FFA8FFFFFFA8FF %FFFFA8FD07FFA8FFFFFFA8FFFFFFA8FD07FFA8FFFFFFA8FFFFFFA8FDD7FF %AFFFA8FFAFFFA8FFAFFFA8FD05FFAFFFA8FFAFFFA8FFAFFFA8FD05FFAFFF %A8FFAFFFA8FFAFFFA8FDD7FFA8FFFFFFA8FFFFFFA8FD07FFA8FFFFFFA8FF %FFFFA8FD07FFA8FFFFFFA8FFFFFFA8FD6AFFA8FD6AFFA8FFAFFFA8FFAFFF %A8FFAFFFA8FFFFFFA8FFAFFFA8A8A8FFA8FFAFFFA8FFFFFFA8FFAFFFA8FF %AFFFA8FFAFFFA8FD68FFA8FFA8FD68FFA8FFFFFFA8FFFFFFA8FD07FFA8FF %FFFFA8FFA8FFA8FD07FFA8FFFFFFA8FFFFFFA8FD6CFFA8FFA8FD68FFA8FF %A8FFAFFFA8FFAFFFA8FD05FFA8FFA8FFFD05A8FFA8FD05FFA8FFA8FFAFFF %A8FFAFFFA8FD68FFA8FFA8FFA8FD6AFFA8FFFFFFA8FFFFFFA8FD07FFA8FF %A8A8A8FFA8FFA8FD07FFA8FFFFFFA8FFFFFFA8FD68FFA8FFA8FFA8FD68FF %A8FFAFFFA8FFAFFFA8FFAFFFA8FFFFFFA8FFFD07A8FFFFFFA8FFFFFFA8FF %AFFFA8FFAFFFA8FFAFFFA8FD66FFA8FFA8FFA8FFA8FD66FFA8FFFFFFA8FF %FFFFA8FD07FFAFFFA8A8A8FFA8A8A8FFA8FD05FFA8FFFFFFA8FFFFFFA8FD %68FFA8FFA8FFA8FFA8FFA8FD68FFA8FFA8FFA8FFAFFFA8FD05FFFD0BA8FD %05FFA8FFA8FFAFFFA8FD6AFFA8FFA8FFA8FFA8FFA8FD6CFFA8FFFFFFA8FD %05FFA8A8A8FFA8A8A8FFA8A8A8FD07FFA8FD6EFFA8FFA8FFA8FFA8FFA8FF %A8FD6CFFA8FFA8FFA8FFFFFFFD0DA8FFFFFFA8FFA8FFA8FD58FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD4CFFA8FFA8A8A8FFA8A8A8FF %A8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8 %A8FFA8A8A8FFFD05A8FD50FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD %52FFFD2DA8FD54FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD58FFA8AFA8A8A8FFA8A8 %A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FF %A8FD5AFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FD5CFFFD23A8FD60FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD62FFA8FFA8A8A8FF %A8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FD64FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD68FFFD19A8FD68FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD6CFFA8A8A8FFA8A8 %A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8FD6AFFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FD6AFFFD17A8FD6AFFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FD68FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FF %A8A8A8FFA8A8A8FD68FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FD68FFFD19A8FD66FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FD67FFA8A8FFA8A8A8FFA8A8A8AFA8FFFFFFA8A8A8 %FFA8A8A8FFA8A8A8FD66FFA8FFA8FFA8FFA8FFA8FFA8FD05FFA8FFA8FFA8 %FFA8FFA8FFA8FD64FFFD09A8FFAFFD07FFFD0AA8FD65FFA8FFA8FFA8FFA8 %FD0BFFA8FFA8FFA8FFA8FFA8FD64FFA8FFA8A8A8AFA8FD0DFFA8FFA8A8A8 %FFA8A8A8FD62FFA8FFA8FFA8FFA8FD11FFA8FFA8FFA8FD62FFA8AFFD05A8 %FD13FFFD05A8FD62FFA8FFA8FD17FFA8FFA8FD62FFA8A8A8FD19FFA8FFA8 %FD62FFA8FD1DFFA8FD60FFA8FD1DFFA8FFA8FDFCFFFDFCFFFDFCFFFDFCFF %FDFCFFFDFCFFFD46FFFF %%EndData endstream endobj 67 0 obj <</Length 65536>>stream -%AI12_CompressedDatax懍スK%ノ& ? ーェロモン(。唖8 僅颶sTJfEs:+ウ枢ナ6モフMマB A6AメH# YhF喀H?C鍄ホ1ssソ7Y オコ22 w;;ッ?淳ルァサ/^贊p9^ 77マ゙セ~ R/~蟾゚シ}メ~ノヒ離エムケヒ7゚シxモe?^冐*サォi ソハ><ソ塵羆ヲ蒟_|rスO荳_シxF師腋魃毳袁蟲渣;.粧゙ハ靨ヌ}.\A嗔タウWソ}ヘ7/ル ョ エo_}籃練ラ渕軌/<^炯ウ?ソf}トx9式、 コrYハ|'_s庄ユヘォキ?{ヘ7゚^ソ|譖\~ユナO栲)yvァ7/_セヒヒgマ「;褝ナヒ孃~_セ~)_ソo^u77__}蜑ソ~ o3}偲蠻}xヌサ9ロ/ソ」oソ詐メ\ネ疽゙ニ#ラ夕チ O+。|vュ<、ワ$?ワキ.Dカルwン゚ソソシ?スo'v7ッソル崛@Wォラ?粫ォッ_ハe8^&y_Xy4,;"d鰕ノ峭c}ロ7ル?z鵲゚フヘロマtィcGゥキ/o゙ォo3HE_ヘO^qR姉軅ソ|ニ7ツ譁毟タ/椰豁フェキ慳sスぞ?ン ニワ~ヘォ_シ%Sヲ 7_ヒ/BEョPp脇ツニvQキヤセムゥタフ剏澎゚シナォリMヘ/鵬暼ナャ?耀ッヤzォヤo゚゙シイ[麟tI7;ニヒ毫&Wシzナ磆Wx゚`ンネ・eニシ|・ュホソネ鱇~ュwマ淪(ヘ妓鑚#eg/ソ?ヘoソムォ?=|Oノ/o キ吹粐ァソ'Eクタッセト柔yaイメ _Dセケ_蠖Q四g 醸;/$跏B(gkウ7.ォp9]ゥクュ鼾ゥンujwロキ/?,鴉ユoo^セ趙ルォ/.ムウ7_゚;?{ユウ7、ッヲ^ソ[]ョスレサo鯢/~+y&C{訴オO!廐コ縲Oクミウキソ~z鼡oVマm7UレC訛ゥンンマ枋ムシケリソ已\糢累-クヌメegヘ珍シ&ャc杵u+? ッ~J贖 冴kマロお。w'ト數ムw゚ユョンミ゚跼衢_セyo^<ソ。]マキユ響ナwケKスャチ゚}ラ/_|ユヨ~ルマ「メョヘロマ_゙|サo゙゙|獻{qナ ル゙n皙wル_>{7?~7マ゙シクケ特aナォ/├|狭7 -"�| 碾箋゚<杖7ラ<ウヨa\ト×テモ;$宅ッコソヘウ/^!ソz+セ4メd8Guアbウ?テ^レPリ貪d-I詰A囓#レz%ネ二ルア扶ウエIZ゙'iQZ先・ケクwラメョ、ルz誅キ+メfi[末vq、yin7「斌iW衒v({6/溂蝪リ<q蓊8Pエ崇K*。粫j>ネ幌橦懈0ルMラモ<~*モ<MS堋艸iフラy檪橦粘勺1]・」<.ヘiJ)ナ苴禽J^ロ>8ヌ)ヲ」.\」シネ](a -y1狡隸Q^ヘホマ~ノGW\サ」;ク搏孀「9マrrシ|ム湲・ヘマd?キ゚マシッ忸オ姥暹S^鰕ル~kヤ砌゚ァ<ヤ(%/ ュXロオカoヘ訛<カvユレオカ4ヨ6$ラ垤Z禁飽nmイ6キVミキウカoミレムレヌ垣ョ(ユ s%,ウf黙ウ9t聖t扮ァQ゙ケ 蟯Y&ロ,渡'S0e^マ」シ4/モ2r7y枦Y"{匏G匳ラE-潰謀VO2キ,たフ」フkY*Nf雛囘-Lイカ堪舷ャケ Z魅兎'Yョ,ワ"kq/k(+ZVサ砥QWホヨ\サWXヒトq}コハ�3W謗 秡挧キ靼 [z躰迫"\G朖クョー?灣牌uク>\ヌ」ャ乾ャ膨HGy烏yQヌ剏`wワツ叢ニx%j疲、ォ -rx菴_MWョ0翡|セ6(乱 qM}リ剄歹YォSラヌ ォ;ヒ*殷リy 厳ュ.'w樔ワq<\@ナ」シ[瘁z9ャtマユ[/'(1ハ -W実コヤig」フq^.gテx刋MミdヌITルア萵5ン モOヒT)Nク^コ「 -迢4^毘RクNF「レ~hソ捜悼gt!KトヌNモ8Qチソニ(慢F眥<ハ W]ハイ顕ワロ#ヌ{屎]4輯f_ツ=イ墓ルヌ3>Sラ欄サ勗袱ゥ?スキ ]ーッ2JKjマ/+ヲアフシ"o]在M}dGr7c電ェ@Pe<+、+)ナヒ?e雹オ勒ェMロ~惴。簓u匿wンョ6クimCナ7mキieモヲMヒレKキュk 帶7m\キ夬jー_ョヌ罔コF mモハヲM繻6メイオd筥Mャイ0ルホZ2"暸@サ眺ネ-惆PX峪ハ"。(クyハ#r7イs^a[サ(ノクオホ碑&葬挾%ixラ 腆フΒキ*v総{磽ルマC嫐i募cロSワQzタup>UT"B トルハ8靭 -EニY6猫)e幇Ub+;R<@ャqr酩」狎p香「・7オエ+ -僭芋リ・!H{菲!t齲=C]2ム!Э骭dWアュNQ揄3 苺M.L、:qタヘ6ァ#ホ走[テ -ッョッチ-;ーHサォツ z眺:ノK -x�Y{胝Z:ハソ累セネエ詫 xnミヤvqUiホdェ0T_ィコゥイ@Y儁K岡娜/Q剛[@eDユ摺レU刪T'シヘYフW抬:O。XD據'醵エ 矼2ア0 赱);ェ:遒 ォ邑>rェ9ノT睚C媼市 -鯊ノTレ4栢@uLチチ堰sナq綿 8=trdN機ヲ9締ィ菩(ハ+_qニTqyDフoョq]モ]6-nZレエャmィソ\M6oZルエンヲオ ホチセ7mケ^キハdヒvCケ6-nZメ6ヤ_ョヲM6oZルエ攜。rス゚エテヲ7苹テUMホ<q*+PWタス蒹ワxΕ&PKTcネ@普2#フ@糠Ot礬ス謚マ0Rサqu廩-SョRpユX:抛0・・W[ェ簫ォ.Uy鰈S`,u0%ヲWcェ"SU竸勦鶚ッミT膚Jヘ@擱j5;-ェヨ話ウRm|[7吸3オゥマ)>リエョモキNモ:ャォ騰N「:Y龕ィcッ#-憔ノO8(2"{y-リ9ョeqワS"%66EFk/ッ(キ}Ivゥ ;\注k)a7ロォ#キDM*VR%串タ曰タu~G>R此LレォB醗ヌモソUNサk獎梏k燧Z妬ヌ{Nヲ+モ涯#ニヤN'フムt`ユ#'ヌトiア縹タ\ク,ト臓9諚叱師SZ!割`[ァ。籤u3Tミ8Rフ8PミPq」ナs'隶j5Wユ}ロqンラサpンΙコ ォXア|0W苗a*oテ|ニシサャl4オオ5!eW]嚀8顫ャkTWゥョS]ゥコV塾モクnk稔V庖チC惧イIwカュQ[柮!>忍;-侯ウ j磅F;pケホムョケレム<u0pル+ャtfュQソХヒォ軼 蕾+ヨ坊袰vハヘセリm⊥ヘzh;・咼4夥祟Nu:メカ[^Qf=Rn=リムR(テホ把ムイツBI゚ハ字ホd#。i俗ョ�ケ3:+D}VrP R酲ト6キヨkw謹キomム{スェ6孰+トゥホp^~;#ン}Q鍖J )宗)d塋ロP濠貶|轡。*3^Fl郵< レXD・戴ィ+NShョ# 3冕7 -ワ }lGョツ8澁)2xエvU1抓 O賽"Bロムヌ!B,"?"$コ」B タa貍ンcNvRInRノ"鐙DRe脱"ヘGIT((,2IC_婬R蜥數%&僉6フブ信D厦于7テ螻 ワー!阮 =フコ1 ワD'灼!ョネヘF慈8pソD8x.児{Gmj`ロ+4「ニ>e@ェA-jトツ ェオヌキコk_レ69ヽ9r&D<i2痔cZユョ1雜ュ�セテヌ添オtU{ラb壗 膿wレヌSpネ澎チタkJカ#迺」啓Fgx」"述リl埠ウフンvY/MNレ[;6ネ觜キメ。ゥヘ駒リ荏0'カヲ7アYΕア苓コマ2^ョ腰Bv樅 6〔ー残jcゥ?郤モ ・*エ[m8ァチ6 E侮ン$@we/ZヲS羲R+ HァK/ノユ謳ォ$銕[・Uエォ~カリォoxャ?tトs`ュサトンキo5Q=Rミン凰)フ"m ホカ`l ツNカールフニ令le gS、MmSシュ"nfリクィs3レー2リワpe�゙@ツD!オ蹤v -ル -6+ワ<窩e=沂ナ^ヘト4*=S>ォ-wma}/n[UTェSーQォェノljノFチ(rキ)ニs7P畍炙"ミ匡ァ「iLラbi'lヨネ 8 シY?F ラ湊sー横~%サナキdーy2qョd/kG縄l筬=・Y&ェbuヌチシPt7JコV6m>モヲヾ、-各ユ持bケ(練ヲCT擇bpg範。モ6 6ヤ゙瀲m購5]、9リ|8エYアッs」オ -aメ5絢BYラ�ンク[ラニウマキ-メxメ6`ー%ケS] ン懽抉�イB=zs玩tホーqェコ8ス6コ`9ヌ:Ct壤テ`xa1hg゚#ヲk捏|X ツス= 4lYカd[ヲ賢ク妍ケ尽ッMホ]$]E澣ヨ -テチ<qョBq^、ォ*ツ5巒 フsM+。」,、Rn6リ-tVl妬。ヨF*クUンSdス2c4Aエ姿jョ ウ<ワ C Yタ+廊ケvxウgュ&7ォモヤdr綸~Reモ玄CウロマスワQル5ロセYゥ8g?ォキ夫待セ聳ェ餾擶夸[e「QG~3q秧ミ疱サユtホn5倔ェィ驫゙rウ贇r5u+'B5込0xVロU3R、uiセ2ユ|bスコヲ�ー7」~uヘ~EAPxマ@qウア2%Z5V,。ミ兆OcムxeP蝪 -e#エ佇b%フ。y/VQe2,35竕YツォDイ7Id6|(寤3ワ6fWユN艮レソウ洪lヨムl゚Wf゙ロH磨9Uモ7Wュァ棯od%Cl・ワハキ -セ$3墜V侍7Bト"@lホ。ノ k臨砕ェ ヲル\簗{稗ミ9ア^ロヲェ遙゚tVvye杭フ纂耻Y ヘ3テハ>モロh謨・ヲキ-ヨサナXUヘacカ」禧mi。Yメ'クj?モK8ッコンU等セGシUyソ峭ン」、」1D[1F[ニSSモ$Uウ 拐柤bdクハィゥh「ミG{ミv:リ0`^ワリ 睚薩サカ2�6S疉 6.�3ゥソテ4ヤュj{�葭>晞遯插SQCqEWム1オリ俸ッxドカ�T侶暑zケrルfォッK$gD>\2T棋スラ釧スLdァセ/リ絵nラk浴;>tJcuン8シア1戴.{eーナv#ワ ナ九.エ8j�c:Tホヨ&W「災^ァ桴A$8筝"ス�┿2O@ワヨ揖ゥ|xoe皮ァO」#コク疝>ユe@AアdwY狠吶・フナ-湖ョJq承フ/ニ1ホ8ユej▽_8ヘqモ歃キサアヌ鴆胙|?マィ ~eYNツコ佑Tシ稙驍 !SIホIナ 震B゙*Gク"ヘ莓期ホ8e纉ニ%#・yオdV;ヲZ1UPレーイ -V褌!飜キスルf"\抜ナ陛尸=n\ムマzpィN6六贐掵クキ oュツスMxャ麭オv〇;mス6゙LUクホ0曁.ュ催w8*yネ!轎編-mィtニqi8^コュmス嗜iテC<q脅・ =qUタqエ�膰ミ^蜊@y謗萎オIka%ォフ榱ノmTLX/震チルz/xPッ^4t.Upヘ`V,c鷙廿Dレ5uニPンリカB"レgュW}ユ隗6丱Zオヘ�_スヤ麋ヲョ疲・カ3ナ觜峅67ェJQU*鷸C 6%ォ;mヌヨネIc(ス#@V-nZ>i儖[ケ・ir崚タタマミマc組ミノクテ^eェア}HA2サオ0トナRシ6^ ユ h.NユイW-ニユn巛ク窶ム0@エJ、Qムウルフパワ・囗ァSチツワ(鄭RミN7ネBケヲ-O譎]ヲ`柆87ミ2wチ樸>7・ヲ. -・ンマ。uエtZソユ裝BナhC#/11rヒ_黹ッ[pi酊nnPロ*|gAsァuチB蕉:|タ ヘJ~発アネ曠u"E\."T'コ扎薑ル@^fルア<姆ル〇i(#ア@ォネトaセセb邇リッセ@s霤E*ヨー ネ0|g径 ケキ`贈チxッミサoミフU$メどャミ倔68fAcフ5ィ J「ノ)ョPヤ{a 羃 セ黥_ヘヲ!.ヘij>5オア吃メv[<`jqO瀾O` xメカ〕テすキロ :wベ゚シ賤裳vX雫マ「メF)W"$賢D簒#ハ※痩%0\款枕ィ6X悁FゥUァミ懌オ錫エy1% キチ+゚\クマ雇H躍1届jtオ鎌,dIs3ルLGf<鸛eぬテYTy旺\p乕q梅.[D蠏a&ヌチ4擦C+レシ ホ・ケ絖ュ袒Zヲセ8dしu,f火ュ`*$ニ+\ [ヌ家Jマオテ=mッXテレamx閨dhテC{ワ矮カ莉ロ熔贔Fフ^Cェ^^;鴉スbs饂愡緻ov擡鍾ーノ 苞ωU3エY0ア] ァ&ヨ3FV3エカ廣>ス9 -垉獎e3チァ=X=Cヒ+-サミメwb\ア]pメ5<qリエ浹イ[レミ~ス3゚ムヲモ6恊キヤキa」[J|ワヤNhvニム喞津琶 -HAr9ヒヲホp7亦&ォニョ.Vォマ臨メキカ=Jwoヘ'掬ッアY%ラトzヤ4m9カ苡3ゥヘgMjSHハSHハSHハSHハSHハSHハSHハSHハSHハSHハュヘァ数ァ数ァ数ァ数ァ数ァ数ソ!)ス輊爾U瑠lョー8lメ層ン=溂C>sKァ.}エKヘラ」セ・ォ.wpュ!.活ラ與・ケホ5gaホョ!9ィ{莖4ユテj淀4TZムセ腰踈鮑!ウ励ィユa�:乍麸~ ヲ-ィツ漕p蟹e摸Iオタ [テ鳩ョi=トウヒリ埠;拉イワ(セォQ゚フ%膚モa}゙+ラP朖朶ィkK*クP5拜<2`t[Y還ヤ゚p、ホ箪k花 ?[:<t濛膀?sO=讀ク。Xフ揶ェ`L <)4'uユヌ xル4ヲ飃゚リィ/}翠{ヘ7ョホ{D-ヘ\ミ6ムm芭],駭ヘ"サMx{sウ1)。t%イ.ホ%セ:葺Gノ:mク&ロ雌9TwuサGu鰄7マ及1レw1F[6ElUマEノセ9ワ帷%悖q翻ア! k!ァハ8 錬コ,鴦笳ャサ_壞・シ>8甃オ3オ|\(s#iVv仍l徃釋ニ瘟.Mキ.=BOg_)g+Nウッt。'9ノュm]忿フ[3・・f&肌fムナTアカツヨ詳qメ|kXァZ -ャカ笂トトvFgr.ナ」;携Pロxメフ0牢エメ!'繦遇カエテニュ5ウ~ャ<d坡abネヌメ];tI#ヘヲ03Wャ 9ウウテt゚チェT ・BuェzJユQ哉nヌ麭y ェX遅Y{&reオ4-wェホL詁ケo k� V靼・籔2@cモ pcラLソ}dセTヘサ[ホ#_4惑ュhサヤツ7Vク牋kヒシ]@砒働YーxAムfW薙[|uメヨ"クョフリメ觚7ースk6ラ区ワシテェ俾r。ケrコ+fメヌミG"s&惑オエs倥カmモ]/ミッーj[ン-、;=捗jケk]Q。・鏖Sjスoッォ。ウ儀{h閧頬リR1ィq゚q_キトォスシL7-黜 xGヤe:[フ痔ニキ、5^g5エニ272cイヲケマヒホDヤTチ6iヤュP4踏.ヒト> 譽F顴ヨ47qソOc鰐オ彁姶アウ処骭ナctQサオ?[WホサUア。ナ線齧V-zヘヲgミLオト慌ッy」 ビbロトイリヨhkDKnXュアモtW'f[_ウハhヘナlX慢z墳=ハカndァ.c"v夕リy_ッ際ユヨy靫ミ殃wy7〔クUォV緞=オZ亮Mマ,T8W蓬|nメ 宰送ッx譏覡-ォBツトrィロル@ォノZC)mヤッリヲコa0/遶NWョBユ・{アgチタu琉ヒ@=クjチサョ闍FXDォ牝]P.>bjvハ}ト&$「駅G;9ルミv+ワル&メヲ搖、。オ*<頤斉銷襾W,LヒTャ橿-e 亦VュUサ:V・p R,睨~9&Kー e僞ナb盤ウレ<ェ!bqhホTUヲ+備v悧ヘkェ梯ヘ(・ュ禄0湾P-U壘゙黏�w\ォX兇献.i靤キEZ+R添セヨ渤6lTゥレケリ癜ェ5慝ソnk=@・vK棒フュェ;5 U差錬嵳欟ヌ5ヒ轍トホッレDK+、Y�ッZアフ・>fhFメ達ケ+Y喩`ュxケTコT4 ェ3ゥ=4oA斷i0Qj祉j\ユYセk3}゚ェOTu[lCW-mQ)CラE&u-ッZ哦篌捏イ゙ンム嗟?懾リ鞆眦レp濬:)ォ池[儚zw・($WK圻・$ナ。ヒ儕ホ:oヘZケ:ノ涓-エFO*� キ�ZZハ�Tネサ,ミ匁LナェzWlヨ飮 ィf<ォKア>LKヌ^ウシレエモZL蛄ー_コユ粧エS%z{�1蓉ィツ]9ノDヤV詢ct\オCラヲh6m裁捫NW>9ヤp゙}nユNシ隰smー_=チ瘍Cロ:ナホミ\<mvク.チ{キレ{1」j了イワ梔R4IJアト(G、Ciィテトl'j、ス^m遙ュレロ,s-|キoネ!Zh゚景SgFCエ-i^5ヨV\ハwコh逑ォy゙)q�葱ホ 菖尹_D會遥,%GZ$BZ惰。H -ヘ<Z.W.ヰoV -.E齲ム゚b【ャFpfFs(酷Z勗「VヲヨEHツG -jトタ慓竈ホ> -ワ ク#T鮑冀フeェソケカw珠ヘルスニルJTク,ォオイZ*ァf」;ンャ<}絅z烈h"ユSエ・ッ '寨 vZ疏.カuェuカ;ォキンrャ#[苟 ラノRQ,ッーVネ嫺rハ]=常yLナ3i。pサR緬8-N]イィVメョYツ1K7ラムGM犁ユ簗艇HュqZロ(-ム゙ツ8ャ*ョハ)bCヒ8 WU筱@>h。クモクァー顎ハ]レリエkヨ1OGヲ=Z/ `Yメ)ユX辛ッ3uhミlセ,ナ-ョィリD」1MW慧-)エ(ケリJマ8ヤツs「t0!#,。ク梔"rォ(「`?「ミナD5T,4lラトj畏7エD -ッー ェヤY蛄洵j゚ハニホヨ{.ァニ -、}`Lホ惶Eu觴J0ラ憬K0キテェ -%假ノ瘠イ暉ュ9膏9ュYテk|橘-ロユt?t-ア [r]Lヒq~_:ヤナヤB{csヤTヌ[  #ケ'^蒡h濯オ2羃Yヌ恟ゥロヒヘfセンニラロ�酋>ワニヲ|彪2リm ・オx}}ワNyヨ'ヤヘ^9カスrZハ電箋ォナ^ケ鷽i5ロ^yysh|wql総ヨ攫゙ >ツ擾コロ@譚Owチ%~TテヤツdN叨x~アr僵 ーセコ0Ocテuo蟷;ヒsキ颪カWロ^煩浤モn>b<G}Xフ瑙ワキ~E嫌クevyュィY旦ロト?ュeルルヘマュワ場裙ヨャ?サf=ヤウ哩ロGE鍼ュルm!jクトヲx攬嶌?U{k{o剤スモm剰t符魃エU/k;/笋Pク3ヒ<MエkオФ臨pク 9^ヌ'o゚6c}闕サリフ辟剥в*滕;ル、有テ"榔.Y<~醇罅、ゥレゥワb゚X,wYチ-マRux?]Kッ」?霧\ッロim鰛ウトmV)ンハアキbロ猖uセM1%Aオoナ1fスウlKレ゚Zヤ~隱レ渣オ_テjcMOヒネ/ AOユ畊Fタ7ォSシq砧ケ苡Gオl暸1躪 -ケUL^儻ゥミW枚s狙コノクY鑰軣サイ;苧^ ハ&k3咏メ錵ソ' wヤR~、゙dチ|^O4ナl宿E劵ツ羯ン霆QトY/=雖yハW髪)_ヘSセ圦|5Oj橙ユ<雖yハW髪)_ヘSセ圦|5Oj橙ユ<雖yハW髪)_ヘSセ圦|5Ojニユ、|9Eヘ#、罰誂<cM:;曇ハMzS5ョカ-9カNォbmー_カ(gYミ鰆Z^。躊ウAt^#~讃#_Ph1巻�g2608 レ[ィbャネ左ツ}ャbユwdヲ_ユ(ナ。モマホ場'ヒmルSイ^ャ>ナカoヲ 「:sobセj峽故SキY+簷,フ*我キ骼vRM[イヨェ餠ワ兔t'ーBuC-aキ僵コ{T姙`カ杼;t膺モO匯yル味ルサ嵋R *N拵ロDIォ)Rカュ' cィォ<f豆g-ヘ@クLネZCXUX寔濆機:Rッョア?5NCォe^?s゙ ゥヲe゚ヒ]美R}u[\オbZoopMメ、レ」RXYン|ォョ*_菽}アャVオ罷鹵ml。.+.婿bオ*Xロッ」夕rZア敘ッGyW]裹゚`d!x-湶x縉ヘe+Pモ嘩ラメュAコテ疹w -苙@エモ鎧/タ9唖 穃ヨオ5 '�チi。ッシカuセGc"�テX・vMュセンqミ 5t"鰛ノ悍2ゥ Mn4チ」ス・ハx?メ8メcH~オ1)ン>メァン頬n e゙簒]#} -茉iDo7ユ」W>ヨi矍ロゥ:{ホp雄辟慚ネ湘j瓔~コカoコア銘゙o+ンwO狢ミ/韆リテオユ|h>尻廡ラr矼#<vタレ3イ[ノ ユケ rシ"チム6完9誦\i]。熟+=}Qロr.3Jr;渙(マ」zyユモ 5xU盒)\氏aアカァサ蒋pホメ 4悳儡ufX2D了U妬ゥ$7jフー1胛ヨb:Dnムb&B}カ墓ヌfX95fワUP]G堽ホ4被ト牢Uf?P岔タレフZ!xヨv;t)hキ}一鳶*:y禿モs[ユ悳Tモoヨ醴「璧高ウ(;Yキ慯oLl- -趣D゙ヤD゙咀So>ェIsh\&ミーQqハ芽ロ+95R4ュワ 尠3リY`M(オgOsv<=v*0ヲLプfヘCt「セX[N蠱\:ァL>ウN枝u9ャ9ヘgムyK=?ヨモ`?,ウ�ソ姜Vモ`ムs+イ$nコ^7ゥェkタ榲Tソ�ョiケ5XxQ~4dXG8uュユ ーヘ膣5ン=苔C ム:銘66<ueス。' ]@ク9Z=:ゥ4|tVAZゥツテξ褓N。y%6キhツk゚フヲ!ン」 yリセマ9;筏:メゥ}覽擦'E゚ュ'暝C9アモ [Cヘテヤ辯M@r^U雌`xー竹1q^G>i.コ5z・?ノ$ホ�"W撥9燐IpX\]仏ヒVY鮒:u;Rカコ靱ム[%zクeワォ?(マ6zllォ=Oォ@t~lァタ!(ノテ゚<aウNヌユ猾ゥ}カεNセ[>o・=Cカfレオツ'ル!ш皓yヲX -マ1ネ.AI悛ーニオタyオムzx剴粤)゚ュサ蹴セマヨ泯zァU`~ンコ[カ^マッ[<i、臼8胡ェヘ驃レg屹9鰛ーI]xシキン贊lmィソク|サ=オ繚サO:モM詰温楞ウ゚9?タu!ャァカwクト5/Q徘ト鹹8Gャウ0{モz5|yラ ]s副Z.ォ%zSオラオ」&オ#nア_eカツワLッEoンオ慊jシサn゙}.疆(mオ肢ルo2wルs7サO \ラ2(ツ竍U迺メキヨV9vmeョマFz字孕ケヨ=Oウ樊ヘァュj肅ロ浚mテ)ゥkロ$ェhテス コス zツ゚F! -イ5;X25汪b哈・:トヨネH<0ヤahIv弖nー゙祕0;+コXs8-スVhケh"OGXャ劭&盟。テ」|マiーTマウ%y゙キ"族Q,撞zDGヒ [37ラ|ヘ5E3テ,ウナヘy 5 -pヘ]>7鯔鼡ナ,iッハトチ ヌXVヘヌ圖ュナ)ZQ3ウャレ`ソ、ヨI6m>モZba'wg;ゥ荊ョ ;ーx?<Z;ワノャ殞ハ卜8珮、晄 稜4エーフンI貅ン^コe放yリdばカtwレッゼ8ラ;レ6ンヘヲ 。エテサワHミ常爻テソEn特}Hコマuクウ) j"ク墻タm2W-アAYh'駱+蛙フ梓mチ.gリCJ6エコ]KユョZキk>ゥロ・`kイメ]オxラェ|ラミW鷙]_スォカ・ヘェ淡ラ3ワRヘォッァpョョラケ鷽l}%モモvZ゙_テル蛋) vK=苙Bbロvo螻ァe・a�Iソ套廼WX/\9Y腮"雉ャンUYヒャイ踴*kCWf kヒ ,ラ2kイVョャミZアRkjィ=:+ユAチメス綱 'ェ!モ(,ャ,ャィ% .鵤ソコM ZG~ 巵ッフ∠Bタ,レ,ヌ v0g�e1t. ィユ峡ン鋳姦s -!ス?。゙aUm)�ラキ罔抬メ*ォシサ;ロ<」カチ"レァM(d7=n;ワ畸ユュ9カ&jNテヲ塩帑998ヨ,{1劫撓゚核ーコG>cz懣4ニ%X]@エ梨Vコ亞_9ノイサェz"イニユy迴X?Iッノ ?^_ヲ3輟宿躇モ&q燒q讀pヨV辨?ミ.ケvンF* -w ャiンナャイコuエz Bュ$菊メ2v`yH+Zセdn檸4゙痙oレ:i遶、=0w0YEィdラ-耕Uヌj扎ェaッ63戛6カスー m-3hc�朏B -Kテ<"泡浚'_ヨイ4Nテ@宦VVノ$ル凩?ョ沙ヘナケャFルィリYx:lォ{カャ嵬0モ「゙^8蕾z牲ヒwサ?ォソ゚~{?ネスッスキsュムkルzカ\ サウ。ネCKレhMモオX);*vッuァU皸u魄ノォ謀JL。)Pn2キ0趙メウnノ;ッテ蛄キラハヨgeq粫4l}X4ッIレ桀"レ曳N程t+エ=、葹>ア訳@闢nラマ:糴45ShMメス行6tナ`fKSーア,ヨdIァェ%猝シメ7.饂ヘ宙Eワ,9トk鵐;7y蜂tレ凰拉'W襍0无~δ^斃=キェ貫%ロ判メr詣;9sO゙ゥa摶Aァリ僖twカロヲ莖Fbャソvl]馭ノ'z穡QS完シ*Nマコ」ヤK窈ヲqモ 0鼇]+ァ"|jュgウ|Mィ饑V!ト-Wァコラ0Krシッリs~ウ轤ハヌク必ワー;ォ;\uヌキ98<d頴`ホ蘓 yクュ 製ッ$P5[ユ/ヤ轎ウセ k名スソトワ6魃!0u)ー冂ク逵ァナ シロGャケウrワ>ヤ鼬o_Pf&aヨチb0jメ%v(樌58「ラ811アBヤ亂ケb-$b:36RZ[餅|^);痃ノ゙ィヘ艝]"スル`Iォ悋ョZキ7Ll9i[sロy」ロン&ク3mクモB`払sh淆クnSキェ卒rュOテ-NユョZオサ顆エウVK *コnY公5ヱE�%&t}ヤi~euヤヘPウ`マ2{ー レルrj4Wモ}ッ\&WK鑞闇J畜ネ~ヲィ\椶s イEh略5タ2礬oм╂エP”t肝BLVb5uPゥモヨ:8Uア踵R((ンYyQ浦エツ偶チ「ォ(w6ネ梍pイ把ネ耀 -}uノヌ鰕J^ホヘ ホ迄SゥЧコn諫R效マ励\V%/?ョ#スQ4Y゙骭b覓マム&。ZJ|ネ*オオV」抔ナ&セkヲツ{ムG゚ソッラwwンンソzン゚庠庠+ッゥヤ~ネrOAユ\TテcE*dタソ' テシNX荊ネニロ」」8~。テx0・怜n.j?オ沂レマE遒sQRb猴E.。頷uスo+Nq^趾|t懼! `*燐ヨoソト<AIgリ」A狗ンソ|゚�リ5マェ_X*wuU彬kU>鰭ラU厚噎ヌU」*セP8Fオオ[Z%ロ姪ォッeサォユl7汚ヲa滾鑛シ==MヒuワTーイT~ΙU渫Q73Z禝- nネhyDvチd2サ8{0チハ~^オヤ5yケo゙ユ」ーzホ}征キl値柯,寒Tm・ッUe9j,オ^UWシxゥXナQマ娉?Zイヲeワ-ラpRニクァ゚除oォ~qシlKNカ>#ロレgt=゙Rヲ夙ソ4リネJyxエヘ諫ツV 魑A、*}ヒEラ゙>ツァ:2ハc゚eQラなォ單ュ*S浹セョヘ8 ルm2ョユ<\'Eォoオ菟エCノヨLr嘲シー桜ミシo)90擣セ諤ュ。兒コュ棋>+ァ0s>用heオヨfョB-ー;Ud位ル-wp^ヨ莽fV 'n;W2 ヤaiメ $hホLu 悋轡楜蕕9ハ排Lサ=aン觀wソcン紛ゥサウ柳燎チgテェZe匠ン_SlU癸ヨ kセ/nクスミチハ]邂,タ+サノpヲリチルLタォj'>ニmカ歓LM!uメE賭編9ィ輹タコテ-`蚯カチヒUョ゚yxワムン湘」紺ヌロ鷽(コ">vdオ&ノェ侫ハa,イ\沃鮎ヲイホ3擢サミRF準kツ-ン」#jY?X腋ナッ~ッ襠ソ竃ケ・,%*& $ニぴ>Ejヨェk゙/ネ5J5uケvpQ;Xg蘓|+*9榕メ?コ/テセ[?ァユ\?コァサFNムW?{籃ロッセモn@? 5/?{ヘ娶ト{ク�hDワWB -'ト f反 "\コ\ハE(EH#)怡;徳セ蟇ホ&茵酸。O劣ェ/~rgxシBOケラョRシJィ'WコqOmw羸ヤUッ葹wo゙_<糢ォgo~wム}ヒ具~d/ォ/^シ}跿ウ!/_シxyマo楞葢?gマ。ハqアぱユShA1ア}^ヒ.女。bマ^゙?y&=トqコёvQe賄}eト ャキA以/}!!ケ賎梢xホウ浬ワ /S)"コ"o"]8.愚ル ケ突2 -7r!\匏zb#J"サ/G卍、ネt%ナ6ァ!"7蹣oIIq∂ヒFb像IU;"ネスサー 淫y\GVェヒqトGN欲褂e\1]侯ヲE3・cyレ輝DヨR飯訊ヲ| %PV∧テ,ヌ jケタヒqE゚シK.ヒ怛"キ,.ヘィm7 *弼ネ砲ツ懷僉HS、L「スエ董Dル#ク'R廷WレUzI =/]B[堽~ヌeイ憐' ルk/テ丿挌・ィ3「#マ)s膿dニa:*叶楾Pァヒ"z豫>1ヒ(ヲr9%烙甌A/X0゚%wナ冊剖 -MSBr 6kHtィu誌ο純B 腹xイR0a卉ケDェ蕊Eム披f=3L-Pロ竸fK5GヒC諄Dn睿莞Yz 硫h;ウR3fSHx キ!Yoc幌ソaQ3汗Xyシモ、Gヤ9謡コVR詠>ウX冷熕p3珊トY)憫f[浚 艙「ャ@ヨ/S萌-JィNォgR&昔|m髱鮹Sリソpョ1%N鉛0 -゚癨メヨy"L:*犠ト5マ78)0ヘノ#[)<sn0*UトC f軼ヘFe慶繝r{マ閤珊]燒)QN*i.JXq]戀釛手`ニdコ(y跳Oョ<ヒ「M#ヲ3MメMA!蔵情d!チ:+┼ヤ薛Zト -Mcミ」fシr。d$8ENモ リ""欧[らE舫Rツ獅cカP關.3dツ)却モァq眺J(AFケリ笨'羆B舫Fイノケネ -畠w9暖ナ嫁f"マ碵ヤ25Cーヘァリテ∬/ .sb2セ,Lヲ敝 -l[娜<桷}ヘ2チメィ]};Eユ `キz舫「 骨t 6ミ「ミネス{XZヒ$+」q琿 ツ@ Aエ鍬/<\ケ揣= ヲ4A#~!A゙\彭スgケA「2(S゙チ弦ヒォAj)at粟疹Nf%,ル 。H-G0:ノ魎・pヨ9d"lッフz就6"  菴d リFC篥沍 m"ヌn「B(ーカミ゚4ハ垓モ栂,鬟ネ數j瀬5flhE>借シチ DMチКルトE)/Fョ6RF0B!{2Q「eレヘ鞆ムta忍1饂ヌ^R z5yNヨヨr晩U 制.я嵜枡4儁マXセメIフ /Y6zコ Oェ辿鋸D =*14ワイシ<エンTp錨"ル疂fヌ^セリヒ/ョqO2肄虍ルFdb90ま2fF発IヤUス'aHモE9+紕 @#ィ aフ(/Lbbケ&y!ネ!麒F微8 -7淵м; -ィツラDィサf<砕e教隋崩Fーヘ`オWP 」YムxZ累w ^サ0<将 -サネ゙ル境c{瀛B、%G舛ト,ウXグワ0。畢ャ「隣e=A'H 割「G蕾.悛B賄メ羹S;kニホ屋 恍u棆dーCRuカf8t$x゚ネS1 +*/ル\ン迺Iワyな團p!ソ4Y逎 -,2イ:ウ舩8Yノ竦オf2タガA、@"j「�楕ニ"s0Q啄ヘマ*伎iケqEハ<ヘクkトリ1м0RhホzZム-犀ノ皺サ塀ヲ.[F.Dヷタウ腦`"゚t玳8ヒj(ハ]d'!o背0ヌロナ莟譯シWフ<UカGY$潼}\Nケ@「拓MQモn員jy行Ln6ク ツ浬「ヲ待F}0メd 」l:I摸怺ly垂タ~闘%X -OtIeホ蟶QFsチAノ9#kTRq:森8LD。�ルid, ラ6lーヌQ6菴rユFCミ虜ハp 拯!ネホ"犇キI「<jチホ STト9呉+元、F瀛イ。PメiG坤iキ`sGHミ}=ュ1'ョ-饅N怜/.謾ウVB}ラr廃Dイ峡B!@Dト紬Ju@舮、 ョ&ゅヒ-コ -チァ6v2リウネウ Eコ「Aク 膨?゙4YワSD|!&D逕'A繩网タンAO�1コβ.g2BムsGャJト拓0蹙エ輩N゙┃Gシ哽瀛[ィ儒X証E8テk<.Jz#NP.Dメy=儕&k\X0JィcMiキ!ミS=馬メ ;%投戳献ハ+閼oユ0駐A[ zυGX "(ラト擱PtДK有Q4H% d按!ルsヲ」ォ録O岾mハヤキ#ウェ(ル!ォSェテxハホ,�責 Nホ娚g%頸ロシUt鯲F穐8T>ョD鑁ニ疏ユル>焔Mリ ア$ー゙ャィDイ(!P`ug;セ犯ツ腮c#8dx?ェリニNケ・*Y)cu ネロ("メ^`wLVdyケテ�vT儷%ハ協洽ホ]I⊇。鴿i尾s椽JhMs*J$ルム~ノ- ;ゥネヘ獺Q,,}ホ弁d=マ攝NヘHカF2b?箭P-オUン阿l「毅"2 聞"kTw+hヒ。 -S�ー nネ/K蘖4ュ\TニW= ]<リ#wKLg[Jw(★s;ワ~QXC" -サニZ弄J@@ぞ「l F ムイir錠"'ィ�タセ3.7防ァ解UК 1笊ヰ)J'ムル{賄ノェI"クノn NT襃肥E紹m�B唳ヲh}rイ8AタvDナGヤヲdi長�4NzZけ・ハ苺119VuHV~L茫 "vチ娯ョ」 -�z-コネヲ4Idロ*$l.f呶、Re#緯拓Uモ3「テe!狄ナEュ ツ�ュv]ス リ 膸潦z&&y濁エL輌タNンf菎]gワk�J6g・PT゚ナ3サラ3嶋」ヨ溘aワ\Rチトxヌ フP,シ 狩31/ハ41=!t6捻#xセWJ �uニI zJタ3\∵3*Zニョーy"ィ ゙lッ:訟8B陋クホ�3<〉h コt&4ツ チク氷<l%/ぢウー、!O才wUuFBミ倦チQ、FソJ/ハ麼・ケQ?hKS狎$ヒU4@ケミャv詮ムロHZ7*$On鏈」ケ"レサスI・:「ネ_ワッ}QAポB8鼕h7閼タ7ノセツ、Dシ%R**ルヒvP@―崇1ネ1f゚ホ<LGル'�Sdp゛i%,3ワ賜飆 ー FミWSQミFナ~_Z慍イ↓Bヌuキ^)マ v・ク[VjネオケVヲdロG !ー%テアオPoIi!。@RゥォLv*661穀W3栓a゚&e:sタ@ス立zvツi[マ4N+8;(3!ャ 杠ぴタタ肢[孝$ミツ7HxァL(゚QイS) J附9サヌR� *'.ン(マ黒y ンq2*「弧cN曇5nb。虎:オミrT#�,!)&ツ:�i?*叱ツvヤオ剪#麿A・さ=Nンク%・N@�I、�R マト -qヤzヲョ佶、jPdンgEヤ。$6=クC�v&6b臆旃ク%Vヨ寂セフJタ1 -チカ7ィ兌 ケ」霆壁アスオ絅D 0�Yu;TtOd<)ッqムl「濕ーmAネP -lLトニ |ツ「 4=1正y<Nl凄.iテFp!リ+EQニィh」ツzヒス酬tムQ鎧YフJm>KZ拮s・チ街甅\UeyedクノoP&ァ@!キ&BMU・$包 Oホ }? %+j兄A゚ホ -m畸&譜prハミク}Z:款rウ;「管※リ臚n魅ロP^e>C雌ッp蝌l:ニ巵P鯖。リFアヌ ワUb%リ气P7JV ア 、ホ�ア5祈ッBi.沿オュャR黐 <.ヌヘ^ナH_`チ\(附Qゥ2kiモヲィM」キpャGnX0 紀aVF2-5oタヤマ)s'�Fナナ!gSr#gメZ蟆ェ�ゥa'ト破タノ果[ムM薩ヘDg桶,U$a%廈罌#J 2ャリ(リ"アトJ_lv8 澁・cレ!覽V�<xホUリQ・7ンシ」ン b\。ヌC堰批漆C5Bリ婬ュゥタ迚ヤ佳8レ -]4@A審"P`レ[A4鐡ト黹!wヘタィシレム成C靂y}q-錬芍6N'メ mR3q9。@ゥc_ミ?£喉G詮"=1( }�,Yムミvャエキ甜嫣f"ロ≫ツ, -カ病瓮シ�4xbd1qリ/�マPkタwY!xeZ薜」pA-川A敞Y岾�ユ5ロOミ0黎u4"ワ 慴j ーD~c然m4%8チ蠣ャリ -0締、ョ語0Q:沿ゥサ9$マ&2ネ8�]cza!ヤ;ヘц< ;Vェ+辛でリ@tt鱈ノ|謎6<ラ菅a)&?+:鬆イTムェYP'ヤO(}R" ナ篶ワ@ォI、<ゥtN"(ja1」Rhォgオ聳クョ`鷄sホvMB:D魃黌BM、トUpJ2ユ2�17WフPホ;"マセ"ィoセ3'@フ2トイ敬ヘ呉UV8ォ∴`{BレD8gu*p「ーG壑04>フ榔DN*)`: �s蘰謹/+@゙ヒoyワィセ ニ`ョ/:{I ー゚「ツマ彎El -[レx(タN@。 -FJヨ幀O@ミ$~ユQェシ5p:hモス頑謔・J\:ユーモ'L=-K俚モェ)勦Wケ汕ン)ョ蔔>'(搭ヘ妓_^|oソ゚=W?讃9Fェ繻 -чタ'埀剣M2rx?4キツF サa核ーヅ足ヘヌゥテhA(」,Z@ーAJ罌S+\6lzp�ヒー・EG ゚ォ)q_賄ih働楪;$D0Vーq"#リウチJ琅~ホCメmHエNCpvUcー"\C我&Pヒa怛cヨ 燗BX,ャ&vE|听疑己マ"ワ.zォ3/ネ) レo7C fi5ヒl圧ォーワB。n_Uル咳gu,)j痃犒隕&LU (& -ユ痒Hチ -+マ -゚Уネテ{ェアρA1-*@ュレ ル・\]シしリwニx帖B"TFロニXキ Pユk TH炙)タ犲Dコbレ$(ヤォロ -V*ハ -」^ェ/舍、琶q5。、;ロCB}モユ hミWワ4褫X}ゥ|V科Uヲタタ^オI┻!ュu<7拊堪mオpモホラ5咸/.ィ@ツ藏U)�8貨樓ロ4);&d嘯 -mJ&(ル憫Dヘ框k蚕0鍠'ネ、ホ\5lz.hリ/(棺Q戝ヘCи恬ヌノ&sI缶|qE阡ネゥ錚、 サヌマホdi*隕a・h�γ!м+"鬼ヌ?ラ�<ydtネキY浙梏ェ$ワヌhiTU擱7ッェ佚.UBuF、?ヘM3:Zハ萍0HL -リ慨,@:]w廿DBBヲソj2ヨ歳軈7A_)tjjA伽h�F゙ 1仞ャu,ッヲ/,er<「K|pォ1忖 2ツワaV4TtLOイG(激ユセj蜻v8Hニミ 0Sカ`ェAュN」コ呆シT}"ス冤p[#旁({タゥ扼' 17蛟iV<nィユ蛸b=^キ(NイGァ。~゚8 ?。l2=f浸L@Pニィ^. ミP翊>A廨ットレ9-COノ~?E b/D゙<圻p。ヘ,@せ65テ$ニp'ツソ`%ェロc-ExMィ% *F猩7シフイツLニ=ォオ9C践Tエゥb廓$ アツJN}ыqモタホト%ケCエ,、jdモ」胸7゙「 -ワhYソZニ,}<ク!GBLdコfッハJ、ェ籾ス75cニя,酌rヲf3^ケBネ)稜dBLn塗Aャヨ1ц8,'俥忝麺セ、4ヒリQ、;m\ -蓑^pI�5`aF、l凵朷h愨侫N トv+防. >剔vリワ�ユ]タ Th剴タ3pU鑾/ユ�ニナJト- ot(覯y0X`ル,ソ&ワFh9闢eツ2ユタ!ェcェAGgヨユ?UセSヌワヲ*ト」r3怱ク!Dァ)┤tX{CゥO渠'ア陋沐AY。ュk4ナ.整&ム7タ'ト!H臆 ャM*驥問「緜+フ�K-ツー倭2@Gウ,ス^ヲ%|0ォ}dB!35霸}&ンア fテX ワ6usネXルa8A1\卑2$紐Cェ7l2?ーレ慟4フzパEュヲ,メ レv^HC據gs-ユモd/ K!ー0。ィ 3カ旙^@幕ヲチハB・ Ln找Dリf鉄モ!Oy]Ojt{娑ノレテ フエ=Y6\!タ<`゙≪トモメ'ォケ-z]pリ扈�ィメ'缸 ト1キモd$!P慎ノUoN%x謚ヒ4潛p�佞 コ#ワ`*e$ゥ榁モR3MPE、昏酢エE#`J棒ツl 。Gノ枡コd聘ナ&u牾XUリwiJ贊u4h9Yイ゙,ノシpヌ1yメG孚Fチレュセ)pM・ q、ィケ2QQNク1蛞澀リホX1ィ ァHoユ9_Q:メカ綬RUp%J(アマC沸サ, ツウレーVサーッ゚夸ャvリ`セヒX゙^И障HO*レケ&ン及h*ゥXムJノ゙黹・*アR竰ヌ干つPh・ヲGロリBン蹄((鶇'ナ5`['#G>*ャ7フサ尊^+ッfV5o&"P,%P拙\錙Tヌ_クaッ」姿< XZ$@k|S G^Q虎漏オA !龍;>$x -D5ネ陰燻<aL92fU掻倶}F] -<xシ:ネ4X籌ラO峯ヤ>砥ssTP焜j性綟 [.sQa懣韓嵋T0.曰ツク満=WテU(ッユ -nゥツgレ閭H6jWレェ48 ム3。。@jO歙8ソdR!8 -c粂I} *ンZH送席RL -p[クfuセ、オ二}r%fAdJ Hn鼾|カHy掩Mュ@fヌ$Q杖猩0a-棧S5ゥ討3:;テイ揀1オ'エムKlヒTス!#| $3Zネゥ澱」爛R1寞"$ナfタ葺 YeFスbVテ'lES5ghツョ/メ&ケ<cレr"キn]覆Fx椈Db[L -.麌テエ、*)犧DZ@勠ネ#祁bケ被ョヲ聞ハ -ユセ`凹ェソムdチ'シ xキ r嵒adチb:コ乾!゙Pスフ! :レォ」Rゥ9Y袁「 ョイ�J -_t滑ヌMユBリ,ォァUョハタゥ -X5カ淘ト_リp燒ムシbチpー鼎鏖キ0ケ=ユ@<+閼iテシゥfU/ャャoャヤ2ツヌ3*!Uク。%ロaリゥhW」Qhb�シyゥ+QV%エ ィウ ]Q゙ワl(ュ4gロt\櫁ホ ホb|<爿Kォ&dナ フlノ忤ッGvd8沈uLニシBz^ョNミ{gVx2iァ$($タYK彗簡#fフzLfB映,タニタKfィtKカ颯ホE'ヤィq%:ナ8 ル♪撃イYワ賂`ノ6ォM`P(fLツ、cPイ棘4^�LヘtメX゙ヌmャ2鰰ヨ朮タ綴゚fトイЩ駕ヲjv--B;p m'TJyア・;ァSd鸛ッUm+U2ZQW7エモShT「ZロNH檳怕リ壯i�カ`3コァ麾刈+n"ッミ%」チg」 ウME]」´ーッ�ユナ協ョ5|(蠅REcQ「4'�「ツ@ェウ.u#・:~&Zヨ_マSラ燕&ニPャモ!p 、Yウ」~f認?猝ゥ倒「m41^IA]>aAマアコ%�テメネ0=C(О萱渣8ニ -Qカゥ投 紜髏"ム6$OレVg:FリML?44桜)ェ。坏ヲI9シア$ヒ刀M8X|$ テB圓IaH船�~\tヽ5鎖L&「lミヲネゥ<ロk.v+キv�・3カ9lーKT5ワцワヘロ~4Y文フ悪y? -コ"ヤ$8:>ト;RN --メ8+h\=}狢!^0B4c -僉Vナ^f典 �BDノヘヲ?Cヘ6&テHDQホ ]脇|Te ~L剋A肖Q葉8lモ_1勤&]瓢ッ+」ツゥTu炯)是:V拶ロu广ハTaデ男Lノ~饂ユセウ8H3セ0ハ0ゥh8捜序yDCRリエDニメア,)ホ槝X -BB1U Ag比DNLzツCトr■ニ2EYナトァーy5タ_D|チイヲ齧白厭カナチi┗{セ惧鑾考<「Wムy$2H8゙;c,」a べb*億ムモミョu櫚(垣膊ゥ揶c陷#妛Gネ刄・_ワT〒!~o(*3TC!ェDィァU「3ニ$*6X0SFC・\ソ$リ7!ーヤcBナdA財8タk6\ナレI<kイヌ6セI繕4`Z," x08妣qメ8fToロ7jj&s」�#<dリ,U"Dコ陰、ウF  #fヒソ簣◆ァ艮ュエL9ヘモV@=ス7゚0G0|I&タ@ウg, -゙<<ニ゚ャ.ィX[鸛a汰ケィdK裡bルb$I�ソ�h∝TFンWぶA サ P'囹4V=゚皹。'ェセ鎖膿Rp蜒ネNRー"uサハ肚Nヤ 鳳9ョ -ェQヘ[dc5ゥキS_+sh#Gト.tハ9ワd9・|ッ、y<絢メ而タ「7M`+ェqァ、ヌeソ淞騷。ヨ(h-ユ趺ヤヒYzz咤右)@f棗HワA(ゥ,du:弥虹 -\~Eヒd@&。・DsUlYCf「,リ訴ャ7 x�RT$ン。ェノ2クA@エ!2X�=!`クSh2F(ム1tqメtヨ坦g符@ 砺メ馬x*碕x2hG4Tjニィ 4f-uUF穢ワノ< @qT&K+P鳧hpヨTEJ`刺ケ・@ォリ:P\lムt-卦ユf1rハ Eキ゚「ミE」b・)廡韲%カx酳BッY雁*ノャ:怎zィセ ヵNJKp |1餬%ホアGRィツ舟1gェケz]ツ<5j<孔ネゥ頬 モワ鞨+G#9ユ胼[(エjUヲオPヘ8マ}、XFト!Cテ{柵ワ煩華ヤr\ヒR部ル盗4モ紆ヨィ^ヘb8タvreヤlf U -=ォ語Tェェ ミS弸(x゚T1ィl>+Us}0tRk砦W_ -\pルNfPトテト>モ鏝釆Ub。ツクN>T".:xユ m擽模e9p$RLRモQb+9uコ:500屓「゚ハ0k"ニ`'ェV2K"gcセ。a区D&ZイJ。4ー0jケAウヲチ8"ハPセヲ/メTケ/YtGヒ4FャXフ陀T」コ!・「茅/ZK�-Tzス #ツp「kQ腐&h)[縫ッイ{jセハェz)2(ー3}Ziイ吽N吩cnヘ0ォd核ォッ ^牀"慍 }M譽=クX(PhOヲAセ 58Mヤノ、ヲ<3Z溶ヘユ樂8s)z$惚マ0yーhfュfp・チ>rフャ|o uu 鮮VCコr^Rs@ &ト ノタ>8Oバ -"}チhヘワ+コh鴬腺ィ信、ヒQPa 幡短1M?5疑定奈,仞絅aH H携SY(セcJ・スネ<粃K凍xXsォ %ソrVヘ旱�!ネタ碍ヤ[エセf.ーs針フPH:「 ルーxア嘖-hノG白- ス施#2隙pD。Q濠5ン松yヤェ6}メN勢4コ?YきサクッF寉:Z�zィル>aキホフN震�」ヤW:q]エ聰マ\ァワ藺ヌCoエ遷ッC熏エフモ T釣)、゙オュTHS゚dtYl0ウ- rqfKアH9リ~ 1?VモコウネkNw覆O5t弋 xj゚゚Uメ綴F「g6ェチgt<ユワュホ8!メサト巌,ツ`肚8D裁フ獺Z(tl~T賦 NK:イ.fNョ$愼3魯・ヤyタ8」9<z -v憂ェラlウ譎弓hI「頽舜K'ネFムサu -.ヌ5a9kヘ覃#2袱メ蚶4kコfo#&Pi、ホ鋒ア槁lナ克3tyE尉tツ17jクョiァ睦ィオ嗹イh$On3「トロー礎想aカT+巷ッ,イwスタ`レQ,UマlTトサミォP*0皓S(イV4杆メb胎l臓b6oル騎ー@譖ィキ`k!督m06U}Ho0 Y芬8);チ掏65ハャHsロ藍ハ�d!逐E^」gE!ョソ干・。毟.ィSアコ俎p2」ィ3Bョ-諞M械ト悟トキ阯;k6DD0qハ`wーセヌEユ゙-OlA$ M噌)+NミィフイテD框A陌+・ニフ&愡ゥLoTマeヘ帥エ4 ^「5`ロサ仕$ー舉ャU��ロbV)5テャ_)ソ5atカpS盒矜ヒミ,トムE*タ・T5・ニノ射2Uハ\)suhア,[2ェE呱a >HP? Kチ[OヤDxd8=劇 -エ僉*スe_&ヲネ眸ハラ?khp頚テ[4・(ィQ1ッケララヤー'ML� -Et=YモiJ祝菻」F゙2P}EQァQ朷ネァjc詼欠ァkcャ'Fン"ェNB.ォ-エ7k叢フソ「コ`載^(pホィ労U7Rユ~Fヒテ$フ�ワ僖鳧「f旁択麭�]ZD.s胡{sヨd/H^j「b.。 2F凵遯cロモ病\チHル8ラD稜K*ョマ#z2スコ2軒茲bJ+p@ロ�X賄uY*ェlノ。ILzTトCWiーm`定ァ:r ン4p泅�[FネE*6恨oエ@ゥル\ W)抔q;汗a>5Vフlォヨェ゚U54 f=x&*,e巴臼扶q.矛FT<ョ竡9ミf,璞\盾セカv゙西uj苺ス&>joq「摯コ�ュ W J ユv`Qdゥ ヨリ&急.6�z3C)祁}部弗ソC「)凍スO+-A、ヒア.泊fウ8ニ0zユ)餮nr蠖0&チ;DチセR>ZNq#"ナ�1`v愁e^#ッ 。゚+?"レ+匝+カ啣 =cU+┃Jゥ{�kヘJト篇ユMェ爆GオオLC@冀伎mゥj#古冓エケィぇx屮ニ<(ホ乖ー埣。棗ワ�&K�ァ タヲ6ヌi」ニ6ゥCヌ很P"36綱Oj"リ$」チハフィ卷)蝕>釁+。tu級6"}#a;7Oセnノ*Eb |、:EMS濾Z」,カ*ホ-コメラ」谺{ ヘ1」=DェホhヘA-コリ&0Aカ螢ZvYt」beタ榔$*、L#MQ惶摯.-;3l8チw゚ァN"1楓r咆髦百[#iンホシflGケ鷏抹。タスHCu+瀟F@フ$ヒ@」冖ネ潘5cチタェヨif9"摘ヶ1荊H"望ヤD\jnテ(8コヘナュ山ヘGCOォト-ta~K'ツォチь?ーアゥ鷙 `9i-8 荊s搗;hx{4Tv&Co Cュ5%粘アィ篝HTエh<コ -iLa5ノUBRIアbJ-」痩9儻=ヘ+躱5eヨ"ア@ミネH7>;ヌ e}[eル~l]1pーt34B碧`孅ィナs4憊(エシァエ恁m#・鳶Hy゚ DヵP耗ッ*醍u3ンヤ」 0 jKヲ6Ds[Mム浸85cWヘtX溟cヤXH 圜フツフGタR@ ウ・勍サ唇鼡68君セtナ忽゙ソ�ャ -MロェDD0w筧ZNW鞋虻_ユ!ナ蔦eユ?>ノPケ` ーU,メ忱a<5ォ?ャS戉1Qhコ ン6◎。唹メd J大具}r'頽享ゥ」o>ヘラ7マ゙゙|ケ悛:ワO椰x磆ラソ浹ョリ゚シユヘ夫'゙M輯Xl%z*゙U1e=-DdMュホ枠zン1uニ<$枌ミjウハK。1錦マBc8+#j。1Rb K。1=@メRh舷碪ュメ(( スTE6ォーョ4sモ逾メ称0融エョ3譯ア&ャフ豫nS+3詈ハ"レLゥ7ヘK1Rf Irfb}1PKホK1Pイ従1Pメ幡u1R4/uニHムレ\Vg迎E:c9フ,v汳ィ凰3ラb0ヒ&瓔:c字゙レ13ワイヤ(]Yォ史uニ酢Hカ雕T< カ]。1WP称uTワラ俛誘sハ磐・ニHu~^J国z岶ヤ(2クn]j Tヨェ僻@mキ,僻@-=ッ+昆i2j・1$ -$、jョッ┛ホX#ヨ2cxWヤaダdカ盃1MH鮟rd参后?j擲イ詮ユJc�l-ZdニZdシy]i ノ+|ャォ遜B輹。1メ,ヨJc、褒cdGォFヨJ国:Y1齷1螂ヤ仄)キ.5,ャーsDuS\J、オッ4謇殊�塒エメ8瞿8。ユ!1クゥUA^椀僻Nnン.ユ*(DYヨ僻マヨXュ4<uKォ4倪s*}・1メbqK・1R褒cョト。ャ+クッフL話Y9@.・ヤ(Åk_j,xV囓RcチモソhZJ拷T峅.50膨.Kゥアタ(イ阯Rc!0弦ャJ国侏シ#%メ`fオニ@A。uア1Pテ4讌リ(ツbRl KY cH鳳断ョタシ@モRkt(6ヤ~霖・Uア1肛J+6ニ」0Vオリセエェ6「+rンZm РアVmL6クェ6覯B-.ナニシ:#.uト<sアヨ膤mフテスN_(,儼mフ」ヲI_m D゙cュ6Fツィユナィm@モ~ZQt7゚ハ香タヘエ#!`リコJ枡碩ルハ酵s啝ケ1OiA睦cノD\+7譎9ヒ5┥rc ムc杙<eャ<得ワクIvモエナ<ハ9キrc a)7ヨhVn狐チ鏈ォ7趁ホZ_oフ3ンt遣゙ A獣POテ=ニ<c犒Lxノュワセ0ヌUケ1ッHS+7跌ョノ8VァBWnャkケ1t>GYオト4a~Unフ#・Pふz= -ミ5ナZnャrc更ヒ酵&Q鏡H」ッ7 Fアzcョナチwッ:#湿ヤタb -笥zcョユ%鵲ロラ卒Vュ7豎c決 エzcaロqpォzc Fェイ肪 Kォ7假xNォD ホcqュ エD$ミ}ノル駟h`艪轢ュフZoユユホ,<。+8eL>キDpル装9オDH翕4ッ -氏Hアョ Zo"カDフ)Ьョ/8F「1F-t鑑<キDXヒ鳩zcミ脳Kォ7拿nヨキzc0ス譛メェ枦椈I胥p/ャ4QSTタ]磔]チアラヲVpLUrラ鼾サs~Uo呼QΗb「kマヤ -首b#旻Zチ1<\ヤ・W7ヤuチキD災kエZp チ ・ユBb F0hォDe暑LVケヤ ※キェ7」竚r歎o桁gケgラ:bャOL繃_o窪e=トフv|ZjスアF齏5bュ7ニト)!VI,0橘Y _o 1タイcl衄。/7カュワX6Zニヤ*横�ーーVソェ75ホヒQ,zァ 匆姜I聾ニHL ゥオヲシホ技o,0\老ニ@ [ス1莟。ユ tZs~Uo }ュ゙kマqj・トtN茣ェ7ク崔�ミソ廚+8カコメD ムミタ(ヌ\Z)1\>ニ<ッ -斬dャ(@ォvc5B_pャkチアタ Y。オ?9ョ*斬ク)カ」錐"ホ天k゚劃更+治セラZK 5シe悪劃コXqLsォ8ヲitヲセ8冴ムbモーZBョヌμエNヤ猪 �c躔p 2[チ1=b檄Dタ)c`_{0}8PK!ュ タゼR/佐>翼fッ#X-┛゙リBエzc〃R飮チ1\ Q沖Dシ,浸p qモ -1N)喞J Sォ9ニウ&ツF*コア_n+]ヘ1$拐俔テb^,穡!t5ヌアヨ ヤ ヲホ、cX脯マケ」2ルモD揖&ケ罨$ヘクォ8ナ/%エZb:+参?b9 -奄ー!ヤ劃魂Zヨ氷+8エネリ*Vt~Uq,兼 オ禮`\M均|Aヒ酥Uノ1]オDBK脂.|Eュ 呷XーF之r rb 夐ゥ#ヘマセSぞ」ZrL 1ャJ氏d渡%ヌH�xXK資瀉Y沌¨s+9B5B|列フ}ノ1マ=`tュ苻G:$弋K拶)�チ団^s+.5ヌ@賄ソl5ヌィD葯鑠氏&スヘ1%茎ォ9ニモ0屑喞ルc姦譏gヲ0歇ヘ1@セreUs 噬毫+9觝Pyュ膵#%ヌアテ{#@゙J孜跛ホ劃榾o}^*孜8ミヨア劃r;ィ8贐ヌ@n -Kナ1Pd殳Kナ1マ`niヌAMirュワjナ11アカXWqフ3S=眺笘gF~ヒ故チ秘eMrnG魅ロゥ~0鼈セYワ9hoロr(� 、算辧rワd^リハ%鯖CレA鯖ア鏗 ヌ,6{芯ィ;9ニ#迯翡 タンネ1}」9勃ト 齎Qn靼V:侭。~pナイツォレ゙リアシ界、Cヤィ汰u -pカーヌア *=ィXVタィ傭WTコ弱 -ホt瀋Gケ當隷アL駝J耆$ト| u誥瀋R~テe>1)[繞終e ワ1毘C鮗 o狼VスモG%XアL}ハJ|l照(広Jツ|l |ィウjLンヤソ Go焼ヲZッテj,n -ウ〕n ナ 羽:|8辮G弦[o瘁ユ瀋EンT)役孑 :チ>&蚰wヨC!ロsテヌ、碣1隼黶述覽D丞~舒 ヲ ;ハ ;jタヌ(M!*-/|フ&Z~a搓i=アKルア」5(SネN璃Cナ4 -撮J驍述テ>ワヌゥ@oヲテヒャ膰zルcR゚,Js恙R~ルcィ<0チヒ歪onR~モo}ルch~ヲウヌイidサ=v){ィチン>マSLアョセネl^ア圏hラqハュケ6{,kサN -f銃IZ:{Lォ ヒク{L1タ゚oWXニ倉オCヒK*模莨セア怫EKマq*dVmモヌ.蠅5鐵ルQ>ヲキャォ>F7瀋RニCIリ]1T.Zタヌx-ニァ杖-ス樅凜个貽 -6|R| >蜂セ、伉マ゚v柱2コ蹴トナヒDリxケcR暇>ワアlセォpヌX]fー;v)wィチヒ鴨イ *ォョDhェNZ@榻花,愃ケcGケケcG 佝ェ=ホ謗) ハトvsヌウ�Ypヌ=Mリ1/~wy~アc喝ヤヌチ朱トユjアc -。ヲ~ーc2アmナ喰ヘH]6ヘン儼;J#YPヘZ員…ヌカrcヌカ靼148v 誼}、;FモcW慥kgユ店樂n蹄クqKXア&テbヌ -樂3ヌ)貍アcナ*P_鷙Qo鯲ゥcレ蛆Aモe'PヌPノNvLハa;&%逡m?綮`ヌ、ヤUニ,J}アcコ{r9ミア「3`@ヌjオヤMSト.袰vャ`ァ糲`\・8?^个タ醯ーc還iワリ17=リ1ゥ田ヌ8l:Cロk 鳴ソアcィハjlチ等BヨK蓼書R`M1+iιハ狃<'ASpヌRbスケcエ+框sヌオ'1/蒐U堰ヌ -鰄Q_:坏T)タc|」イwL煉キY/wLj。8 クcR~[ミtクc8庄セワ1Lレ賓J趁治ソケcRヌマテ」ッコ'ヌ゙ウ謗)|・ミニ氏[゙g}迢S゚#Oニ蔀dHースj4ョ/uLムー゚9PヌdェM薊Pヌ4:値{ィcセqM.ASト,)ンPヌ、RイゥczチラフSyゥcRYfm瓦':「bァ;F烹p0テ!ャj.ーc:ム5nリoョユyーcR贅vLCb゚{Qヌl愍c ・5s首气産セ琿tL#ル (gUル・{ホ5cexヨ「鯖」x+ィcヨgコdェ :ィ0ィcel陂&DvSヌGuuャO46D -v辞?ヤ1 :ニ4T釟ヤ1 ヤ -ンヤ1ニ{]、朱7^Ce餒Cネゥ>ヤ1価。エmツイwテ!モヲチモ勺ヲoE;Vフア、oリ?レソチB+ラ゚*ススリ1ゥ6ャvョツ;&ナヲ;ハイ4ーc(v跨鹹スリ1Vテク(vL$u豬アc -`ヨ懋モ齦ニ司并[8詩S睛ァャ/vLェユ/v吝ャ08踴u,[ホスoタリ1)%ュbヌTシ6ニチ勺ホ #ヌ)�KハテS!y掴S8廂ヌアc{fm、o錬カN X&/ョ/ワ1ュォアシ.亳ホソ{ムNvnチ#pレ|ケcャqX@g#テヒOjチcト-ヨ*<&ナbnC。&終ッ匣漸V)AウWrVリ&城ヨNヌtナネソz8テB)ヨSラ7z "5チヒミTエネスミc:嘱レ 城膏隻オMMヒリ3誦ネcワメ<ヲシトー0タEヒJoイA -伉<Vソ1スQ/yLキリト;ネc/XVェテミ"城電ユl。%}�城-チ7x 片激ヌjォ<&・6"ニ=緬ヌ}}」ヌr9ラ,[Im9ス1}RR7=約ンjチエ$ノゥYュ゚p=雎 nzL *?<ヲェ17y アェPニノc(o┛p甌虹サy読4uyL)ロN+テ枴読2\&2,uヲ・ミ「:蹂lR@<R゙工*BlM1P#),Sサ!ト6yLbモ'tXニwャ CXy=1価ュ籤1 Sム�!ィ梯)|洞# 俶&粍Sコ=甌モーGユy隻T:[@ラMS袍o/メn亟<求Sクxェ0,リc呰Z}當lセlヘュ2ャヘヨ)ル6}袴(ヘミヌ3!1Rk稿ォ%セZオDユ#51>2,リラ[�ネイスdニカ�Yヲ6Vチ)@YAサd。免 Sワ モ|?JYLg1lLテメィヨkムg(レュ<�2押r!#ュeヘセщ4累�2D=g ウモVロ2スo型,タコn -Y&鮎B夜И$1セj#イ *;・ !ヒu~゚進+zヲBFオ蔑トtSk�ソdト(メチ ヒニ%妁ヲ秋iレヘ モ、タ!dJ疵?キゥ゚ャサ寝ロ*(d:ヘ廝ヲ・ミ ->ミイ愎<%0dQル<_2ms透ゥ$eリU!0d9gシ9d移 A%チ!ヒxキpネ$~sヨヘ!モg\レLツウb泪F)レwC眠Iタ甥6hコ原ース9d,0yi逅%ハak゙2aネI゚2v郭Lサ皓LOpネエs -�佚!Cクク{Gロ'ォolVセ7,耻=7LsフPネ8Iチ・親Z・n -MJ _LアイN!モ:n*.イD嗜>2ナb~67,SjケニBス!dヨ-66キW碧<d卞レ゚ 2" 這3ネ2・セソbョヤコdY"b髄ユg」イャ`底'B1レ掫Cネ40[I6 aBf+a-エn*ロBヲuエ蟯o厥カ|l@ネx[絏@ネ2・U$シ.勦c)0ネイラd=2D筥 C!゙2)抹シdR{ゥ ネ2ヘk剩ZJzd?ォ纃 #゚ソー -s[]ペソ|zdィヤキJ!゚ 2 ソ_、> 2-歌誰ョ ネ$ k@コdZWカ1 澱ヲH$i=2オ@yd: GC)テ02阜弼ラ腆績xユW=2裴c[>イ「->2efェZE6のメJ S)嘖セイx&鍵癈)Я尋f ゙リ黽「8i8Lv:舅 -價Uカ・A!#ェCカ:(d8 毅&オ 位n鳳�xケ!レU:Z!虹蛞d\Dツ チ C�mY!飆罅1ネ葱尸Ncg(ィ-ン 2ェヌ閾AヲサトェネアFケフ妁 ツkテ 2拱q`ms~dナL、f姓ホツ$チ +ク橘クdJi插Aヲ3- イ"囿チV.Y荘7ァy駝[n+dェZx゙ 2凹カ7のйdvZ/ 5廻Ii'@&・ク dナ參!枢dヘ:2=Z7′:ホ+/'栴)8'クキコ7′6D+:3オモ1hV淵r=eI/僥�嚆@ヲミ\ネTェニXネリ畑+;d9咯@Vフ1ワフケcz2x -」?ェX謠Iュアロ8K{ d4Wャヨ⇔Rフォ -c Sケf妁ヲoフセd、オハシd+殱3ネh:ヘdJ力ヲ�賚 テエ争_@ネフ7 !楞Bネ藩ウnタ)セj^Bfレッシ2ンjクq|�BヲキCz!dT訳ヤъV>ニ$aY,ン2Kカ敏 d(Z6ъ3ウ!dr└> d+02JケPワイク屬チh.ミbヨ,EBヲTハocw9&3鰰Y!NG。ェrトケpJ卅y d5レェBF6凉ヲ Qm -劒7lェ -匱:飭妝Fノ壹Pネ)レハ蕷ネヤ|`?M!+Q:2]i廝Fッ~7フカ:2)カ -剩LラM!日[ワァ績仕¨ァ寸L<t. Ikbマチ!ウラlCFFュ瘰驪で"モ`u"S64ミC"3|2&2N"モK吼ョκ勦鱧)ス楹| 咒fッ$2z鵜ルa[ G_ャ`戴0モクadJV。Gニo+」タ鷹ヲゥ霹鷹§* Y碚ヒs翳4l7:"啀恍Tコo82ユ綴&uン27広EC(hdaルメt妲ヲオニァリzミネ背m揩Fヲ#クォn儼シ4@,唐ラh42J2\4イ蛍抛痩Yx)hdエ -ォBq)uト2`dT�,イ?"ニd8拾F qニリf漸 タュ*�<sホ"C~笙ー馥V兵テネt3r9記ブョーネ$сEP7hーネ 晝gBワ%m"チ"寅オケYd甚ス ヌt貝.匳妣ヲ オDタネ瑳ム}ャ20 -n儼�]U#S% ラ:`dzタ)テセid迫ィハid衡ズY 證Vウwモネ)U簣ヲ・曹Fニh4ケydrァ 臭nイ尽ホXヲUワ42フチモ」リ験idGク蝋GLチケエ」 冴サ゚[コid*Iト1jッR擔ミネー~V顫「贈曹pBテヤbャ傴o僖lFGVe「、5q猜ェュト,ェュ蒋idァFムid鉐祈カナ陀7]陀缸Pツ #テ訃ンキ!ハ幅イニ僧盪!採lK 勸<9寞F卆シ F&」{7 qフヘ"縊-ニ廢ヲソ儺.ZハEA磧選ヤa{ウネtウPN,2ZdX3。A?゚ #モ猫媛握 -hイvM3覧FJ9`ミネ、X=Cミネ;モ9眩E##%K筒F緬荷シid - 3%俎|JNォb゙dル)イチN#4N広「ナ孝F\迭Sキ腹5i9uhdD號422、JェmeシォハM#=E hd8f9@C漏7 1テ幻HB3fC�・?02eH蚋スrul 爆ヌ"S�)nG鷹メロ -ネQdbo -輪ホq。ネヤコャ,ツQdヌ/(2)燕モ"C・�(Pd0iv YfM苞ヘ"S$Wbー#+褐|lノ}禾焉帯充nh&リ7Qタネエ チタネPア -Yチ 9#督ff帯7ホz&Xd?チノBikシ,2躪Tヘ]叫Ui_Eヲ扱&ワ,イkgEヲ -コ:,セ9d[D=刷H.ニィcロヨ毅VHヤuキ ャ沓fツ゚ d[ _儒`進トエVェ妁ェラヘ C。l<dRテ゚ 2vk9芯リPユロ紳j┏クЛq「Bv)WユトQBヲキl矩Jg割nト褶q コ!;ツ !;j@ネ(2ス -Y。ァ(・唯ヲ3ュ+(dミク5#QハK!S|0松L。Y3 凾ー,ュ 。Y*シCニ詭y貊d$ークYdィゥオ#澱チリ選アアFF�8AミネPーR Gヲクq・t8xd -サZニ&xd飼蒿ャャアN゙<2Ug幄8イ0クGヲ^-<「儺k シO7,燈吶ナ贈ニ狆命チoGニ議xネ,榿鞫eZニ Y、@ネヘ#モF鞫)ュュ,テN、嬢竭QアBn<xd(テ9cト罸ェ%風Gコ|PGメチ拓銘ケ゚<2ヘエマ=dIハ癈ィハQn 勦」 YカEpワ*e-`ケ‥(殊Glk�朝ニミェ(o"n溘pノ1W伸ユ'$o ル6$リG梵$3・?<イュ詞イk#Sア助レ゙サmォVャ聰ネエ、イヨタ衄曽ェ翳rWミタ憩F゚qヌ竄梛s今鰲ネ(:・!R42沼選冖シ4イLS5A#ヒト5K942)盲スidト擴%pvp膨w俤mシ4イ軽59{ァ鷹bXェ7hd羊1.ユid」レs癆1Uヘュレ覓#」ソ+qr -¢m畴僧1PdzZ.偃贖k~Idコ2殘ァ -^イA";ハM"3UYテ 束鸞u晒ヒシヘ鎚T=ュb{A席pzlnlサ{.アzト9ツQd8;j'ーQdエ」朝セQdR[I罌ネ、弍pネ8ニ|r/Y6 k;,2jヌワGサYd糅`ル*オY チ"サ萩EvゥーネJ房 呀アモuウネヒXュC>キ闃s勦nノヒ6 9!`d-モxadォX襪訴イ ミ#サ Fvヤ粗B zニw-丘5ル゚$hムヒ]vus鮫ユ{テ&ラ季ヲヌ┫カ $テォ�絞vWソdサルqK-Jホ川(マ`ーユ�弾メトゥ"冰メSワD2sメD2'メワ<2eソソ&褂鎗苑{,燗j磆篳エ*オu> 8セホ#S厘ケセ<2Skィuqnムn希ネエbヲhmネPラ ナ.. 栄H&a、\伸 マン7臭・+覯@イけョ4{ヤ-ヌ�ノ、Z3dR:$c{ァ瑙$テA迅諭= -m譛リ「wヤy両租ソ,f@2ネ?ョHヲ攝h$澱テ�貯j・セJ豊 ニ"リユ]@2Jzハレ<イちlッ姆&C谺ハ鴨G&楕AネーmVUネヤ*スフkナJ」/pdリト詞#tiov+J鮫I3ェ'Gヲj竸-�コqdアア 刋ェミx猜$半qd渥ッ#4ッ?$/捜Uリケィ0ヘyu7Aワ辞タxオqdケ,ュ@溝ケヘ猜"1ェヘ4ヌ僧衄僧1pdレ メ゙iエGヲJョロ>J幽咬�知&ム租 -] ナユオV"パ1ノミキャロ2y[エ3ノエ襖ムb棚c (ぷ=鉐\ニテ$モ+|鏑ー1Vlャミ'S.}3aI>,賄[ケ囘[ &區|ォチ$+T|、0ノTYD・gu]+賄 -Tロホf)lч`y・zo。ケ囘&婿囘敗jLイ゚レKノ鵈0ノ$壅3ノ慣C藾提キイ`7鏑「 ホ$CPク8賄戀Yサテf帝ァテ範囘メ崟6斗 斗kチ$#c゙p�アN+アH=「ンヲ(⊆YVR゚ーセ賄[掲#寢k6ヲaュS痾1ノクオ黏%?ヒ9Wエwャr鏑祀ニ ウメッlヘヌチ$罧マa!fG参ア性5ソ猫ルJヲ重ァ JFswJvセd&カzlY 5厳qcレ鏝セd*ゥ頤:C46闘ミリレ%テフUホミ%モチェJヲ d*タウ溌ミ-QR@ノTェ"xcT(ゥ爬)rヘ\シ菖レ|冂キUNpSノ手T2ェaTT2゙mJF掛~sCノ$椀ュロ#ミwAノu浮Jニh *ル.セコゥd -W9O阜ツ!・JvщJvDァBd_゚シ1ナチ>dウアUャ ーdし,邃$~ーdz-LセKニ簪 q_PイミIV鞅ネキ1jn法lェJ搶ソュ0チе:mw1薪i4mレー椄$ヒテXIヲrj,IF價ネn$"cエオ租末ノヤ゙C'd梶19jLE<KマHヲリ、[ [ーUt ル"ルQI≧Yヨ9鱈}�$ンCル}ツ*o P緲Igィ D廷 -I6F゚D2U1i Mvヒ9$マ帷_8イ甼!妲6ス、iテネォ=,2A硲1 ェイcキqd^qロォ:Jm ル慈M!cス; !崚ィ筒A&#。Lyコヤ祓ーレヒ ク踐テ kン澗AVス(!杉ッ^9�2 i胞u?ヲ(K!%踝1ヘ瞽Z{L5ス」=&1俊ネcZ<ヲ掠ゥ゚ワアムSvJ。/'緩c筬繙司ラュケ冂ヘヨー9カ孃オナ Sマ:1U 豼ムニエイムヘウ徐詔ィ15と、ゥ_ysニ@渫y0cツ懈<^ハX6サnハXカン1ン 騫cル 6bLッヨレA瓧稽1cケYハ!ケリ填Hj;`アス籬F厭,E{Iシ アN`トTウレ゚8bルlユF,;zSト鑑.oX1t蹉 V91ウ カャjテr蛯 Vイu=0BコノC輩IuテテヤAセ-鉚恵M秩テg勲答-%ヨJ_}チar0ロ0Rワ+ラ 絲Z」ン牴dヘテ~+テN.驢'オウチa\エyタa$。鉦牴ンョキチaェV!サチaリO}槃ワ0メ「Ve0h�) CォpJヘ&\聶I-eモ瘋Iュルモ瘋Q・SI{^ワ0eヒノ與nXツリァキァWヤZト町セタa隷qヤトチハュ%ククa并ア9.巒ミ陋F橘ィa レ Kヨヘモ"順ヲ)T、V侑否ヲノワ兮4\ネ軟BノサL.ax冓+菎0y ャ狡-ユエ0レ9,固a.↑eィ0・。 RX レA)yメj笨0警T+諾ヲmヘ3W,絛ホ/=レ nDOナシB堵ュカ>|ーヲソメΛフ懿ナ矜馼0=莇幃}ミ ヨスQ4WンmO ヲ^=7ャ7サョA陶<> -カセ倭。L;EmZ5篦\@0u湊」44剄kノ8ーヲ≦00オ"S駆,0-ヤ逝(>osβZ,<`{L簇)將Vmセ?ァ)S;ミタaゥYニ糎ャヲ扁枴N5焉モ$cタ &狙4<゚$彰1` 釿Pタ、ム0=サAC�K~9h&糺・o 佝 "掾c煌ノKE$ツ)9Xチ z%ス*e2゙\O6cモ+)繕W`ターレ0 ~p゚ケ0`}Cタ8Iテp@タxYフシ. -6ァi尊ウ券6ツfャ0<ユ須Cタ2揄cm.矧}mネ熈9J} `ye0ロォブ)` Kニ゚・ 耋セッ゚0}ロ゚゙「o>様pイセユ.リヨヲ]T、wテス膿ノ漏ノ-ラ8e、セzQタT/募ルxSタtXU47(`0a凵=xhvSタ狄fedCユet]カカナa[Rハワッd棯チノ%号ウ}2Wハイl 7」bmシWb÷dホ;v$:3gト=O線・ィ{. `泯ツネ$\濳~ `区凰I濠sCタ$~約@タpuヘsl`_゙ヒ運 -俵3オN<ヨf痰ムο,_オV コ類スヨ^偃悵ァ{% f[gm畴m1`p Xヒヌ"k勢ZLソ5ラ}梅T`ソnリヲ盍ン套ュラ)%トナキ^bツP・箆�3 梗kMイヨ゚スオ黽IヘミMヌK!=BッA4怪Sマ!`vトフ7L。チZ箏o&ヌ桾Jレ|/ハP救Sタ0コ史Nヒ$&鯱FN縺 LBモBメ!`X゚犹y`ヲゥョヤ`4T吝 0^蜂蘆iiLbホ�モUK0タ姿1タカ ーフ^v =Aラゾ|ォ8- ハ}-Aye 討ゥO0=゚ュ0ゑ% ッ|Sタリ(セエ薯歿│m痒ーC -・|ソ歔SタLニo<0 -涎ワ -Xツマヨ\鷓n'ィカc=0コNツ+鬥ac}� -リj沫コ `Hclk フrZラM�SヨZYサ�ュXェ;Kォ備ニ-スaツj-。2カ徳+;ヲテb_}」ソー8]c徳tルu3゙/GucソコwFKュyn阯メハJ@ォ{ク!神:GM 燉&=E彦モ 5ン;p_壟コレW}テセBロャッ7vセタ}ョ.ヨ欲x-麼・mZ麼%王偶ーセ、レャ/ッta6+Q会蟶ロ[*U゚チツ「x圧セ8"ァm櫂ユB。ワラY_リbuキ#E]Iヒ/鵺「幺%チツAARユヒZ褌*弾モ難、/^嬋ルMメーリI_kニmメンKス攪t~ト.,セjzー^8ナ腓メ( ヤート゚モk求J猜=>尖azZモヘ「8]禝チ:ハヘコTgz%+!チ笵$鵡モ U簣坦セ<モK -ヨモ渠矗`zY陳o録(観>L/ゥ,a驟uョB'AJヤwフ0スリコ薯aケgzm畭z5録"x.O{ォuXIuァ0`q燈・c」v8(俎,B@A1タ!ヒgzm畭zユ録ュdL/シソエキ~録粕モ ッヌ ユヒツレヒgz吝\馥>bzoヲ糧オセz9L/ハQKヘ騏縛騏ヤ`z餡(・V*ニヲ柚>B%修レo杆(チ祺C%I@コ3~`^ワi蓊qェnSWリヲy<レハ「yI]簒シP奕ス湾fニKイ扈ラC達|kモシp4ZA -囓>屐cカィ$浮誦)ヘィA珍筆eA饂ンZT要ワh!ェカ啅謄シエ&タ|鴇ヤ朏ツ1@^#チ蝶K#)q0^8ヨ_筵簾asN~Bx瓰リハテeシ姿サカ.ejキ.ヲVキF嬋訓舞5濔ェユiウサコ;d=.噂、 wAモナ2フ7キ ?テ>レリ.ユメ・: 。#hラム雇・′8p\リZ゙Kェマャ カ蕀v >フ.Yソ曽Tリ~s闡 `ラ.^ララ5=姐pソォlヘョ絞槙リヌ)性 モヲu螯u5h]コi*MAメ}ナ盃モコHノ -Z翌<8?n\nォラナ 築>ク.攣ネ/゚ク.;hUワク.5牟%、]X.ロ9ニソキrテコカ隹.Zf4A8ャ _}ヨEGJヨ・~=*#コa゚ヨナM+ヨ焚翅コ8N黛 ツロTヘュ魚oミ泌エ. 」<l嶷・ォテ錵Bュタコh冩ュXャqュz`]Rネャ侠ヨ隣 メスサ被犲Dテーふコ弌セラRdキニ2*5ヨ塔ルー.束0i`]関Z,メ`] -ヲワー.E!亥<ー.ゥVI皺.娟ハタSサ$フoXjP,オァ`8・テ齟B|auOeV臨索セY]Y献ニナ,タフー.E~リnXク刪モ「aッワiーコヤワ;VW&レラヒ鶻キッユォ黍、カセ メe」タコ、レリー.)、゚6ャ 殪7ャ~モ B)_9ー.r゙7ャK*Aイ 「髦Ecタコtylqyテコgノオi]0 -Vリエ.)ツュKス<笵ヨネ セーキテサロ\W「u犲2E?ラ・淪57ョKsトハQmhgnエ犲、啾u犲ノ6ョヒ-セ篌ーイE;p](耶q\J/ュ詰,ラタu颪P\エョD┯禁・&ト・ハイM「イ」[ラ0aワ`羲l、ャッ錦エヲ|x]偲1sシ. 鱆u騅ツ^トy]<mレッ+棒サp]9jラ%$E犲ェgHv.Vク.ナタラ%AアラナHェロ<p]U テョヒ拡l。カq]ハツラナ<$サ楝u%\决}p]ト阪コ=ケソ=p]ZB゚ク.jエFルエ.^fミコ8Kサャ嶷・e -V_Aメfuフ・?~イヘ「牒シャ.y2ヲェ毅] u)カノ|qココWoN淀^ヨチtQ4鵺鰓領c@コ4qOヌン。ハ崎Rメhャq]イ[b駆ョN゚z\リ旭z\zヲ#オ(U絲ゥ」suキ、リp.ス7圻ヒr風フユァ―6婁[1ホチ裘」ヲ量%ヌナ2ラ。\rノ」m(猟b|。ハ5操r%2メn袵「椄蠶濕ナハEX Y@ケp涵。\DコW蕭烟ス/レツ<毀)!シ。\ヨハ%ナG蕋ノcrム蹙d5禄(+マ`rル 9Dk3ケ9モU $琉ロ@r,PりArQシセ|申ト�)u$-嵒 ノk6#N0ケsー曇L.リd゚H. -skケ悶ネ5スゥ痃ア∴8ョUシ4h\壅イソqiV-x(9規ヒe"6階 ロW迢ト5kツaクTj笹rクVトTテ・ソk]ツE1諂\dテセエ\\|ッ%%ホ7kzeキFキ4[ノyVq溷っ゙9\ハFoゥn対XGoゥ$LK崗%Mk�oゥ猫e銘ンR叙禀7vKz^コi罧コU=<サGチコ6゚J深Tsnト-ュfVハpK%キ*,.ヘx ォ0峪ォ ワエ-U補1鮃3ヨカ」nリヨ<|ウカコV%ウlヤ忙飼u メ-HソキスA["i3惆増ェ齪-薨e疽Aカーニ督![ロャ< [4ェォmdホ敷 ニ鳴キc喰c}ハ アワタ絳溌モ76aヒlg~[、タhsツ ュF.&-ヌヒラRエh覡ラメ $ヌk畤lカオサ@Q9 瘁ヨエd-荳チZュP獗ケZレ|髯 ャ霧7械゚T-V4Tk3 ヲ約。辜ヤRイQQミ4/T%b;邦C7Oヒ|Uニiqホレ0-9JjtスYZモ Hメ夭ス(-y7儀n猪.カ8メヘム2*フ|0Zb3 竃鷁& ゚+u庄ンュルZ9ZクシZ3[]ラMミメT)�ZJb」@粁モ7~y7>K'Y「゚Yウ嫩マMマR゚。~イg5+tV晧EホェQM牀 X7ォル'サゥYュZ?Yサロ1$5]2\]ネ,E沐トb問iGロゥ゙2キ篭hロク,q逑 垳ネシaYD澡摯Eノh俵ャYe1'K罔∨メエP圭オ)Yメィ0v祗 フ7#ォL[む,ニl睇%iン'Aネ糀ヤB茂QD'�Yハ-)j|,%7{.<褒h>\剄磁i]l,3矯ルX陋KウヒヲクZャセcムヘヤロcゥ.^mpアCナラ 意。X8eN駘.$鴆on"e浮闇ハ邉斈アネ"*坑寤eミア ョ6 FMr<ホ訛Qf@yイB廻ム+QfDヨ鞣a:畭傳ツ々) -"*チノ b。0)況/"KソR!b%笠W9D,)オネ1&biセテ-oアネ/ャワン"オ}?D,T「ニト単H)8Kし;]@,Qヤナ欺lmア、 ャケXZvAト鍛1憚b#メV鏡B-'b/ツQsクK、チヒwアォウZ.'bア゚K%スD,カ+)・Cトイ<ナNトRYッ蔑ワDャ・靴トBqD 'カー$bコ8, ヨ8,iq・`ウmEリトッjW┓/傍ユ/mV,繞D$ーーュヌaIrjナ%エr!a!寐蔑ロィo6e腔箕〔ソyXヤモ痾<,RヤS >iツ寐t輹xX8&Fチテ�#+縛「VチテPBt"xXリV ケyXクンroヒ<z><,= o般モn明カ・盾・lミーステテ鎚エシ々ヲ牌Xvbヘ/ U+閃トツ搭漾ア、�ツzXコfヌ<XハJt:6ュ寤EM#cYアュョCトイn濟^"c+ホ2"e勒ア\^モwtコ厩h "ヨス :串宀ソ寤ナ&B-RAトJムDャ!封條QPヨ」m&マゥQ&Xエ-o(jソ蝋Eトメ゚ヘコXャヒ頂+  -!挨Hユ'X -P@,メsZA゙@,祈マイ々4ソL晄@,・、ヲB 蹇「mトrテルシ々性y^n fヨカ腕ョケ YB<7ヒ悪m 〉-R挨キエス ト「ネレツzト「Йサ�baY(ン@,Kh怖X+J�ア8s1挨フン゙ト「]Qケ�bQヨャgb%Xメ」  啀6Kケ閑ヌユソソマ$x@,"扱CシK淌致トハ汞コ6旧ュ#7K-j 6亀繹ケ儿エヤcン<,換ゥ >゙{寐・トレ7+30フzxXコミV+f<,レ汐{秣Y 3ォ0+臣ォカ:ュvgfE、ヤ4ウsウ<+オ/[6蕎0Q゚タaYノJモナP9菻ーオケEv仂セテー婆$pウー 禺m、5ッン根レ0,}�e麋ヌmV゙EヲAテメm゙怕Eレタ8發a)ハハ(`XXハ2\ +サケテヘツR2V゙ツ稟U<PX$,ヤ[s」ーフ~s訣ツ"Tョ薑ー4Z7レJハ僧イs・慊ロ寉・-q]マ4ロr`寉E侮ぼチツbe?ロFa%レ6複スミXゥモ削(ャム冉)Gai頒0p族.カ8テ(セ睦オ゙名ィオ 未.リ?゚」`層マNキレ,ワメ。弾軋s -ツマ,Moレ,ンYェ`Qリ2Wy(Xxソk,藝beG佼Pーx-mモ%8xPーmy=ャモ_Sヘハ1 昧[re7Kテ>+安`髑/l」VVTャン,ヘ8ッK5\タ`鰮V碪Mチ「lCeMNチ「」D廻&副eリヘウナ゙K8Aチ穹黝 XイD -+g/y -タU&Lワラγツ遷ソ>茅タネブ ニtDヌ`瓩嫉ュ!ョp{セ6K$}胡ュ縣6 }xO「p ゎュ%ニ`褞C VVオ。ツチ0Uェqsー2pスnVニワキァ濮攸/ヨャ碧゙、カAXr'QΣp_[%8メチレツs蕕 愉ァャ古ナ,7 w-$c%丘7 QMツB錻ニヒヲモi-LツBSER晴ラV8HX>テ;n墨ツメEn3WヲU%<ヨhヒ -ワ6c軈ムW7モ|9XィンWpー、Xン@pー=モY眩ナチ"胼X秡アラ,mE ス喫メレ」ッノロ峇1XM2ヨ1X愬弟ツ`IエP「aーfRテ鮓 -' 緇,Kテヲイ1X殻wワ1X奄ュ< 柳゙T`機ォb堰チ「WJwレ挫Bヤソ 。,ヒ">'Voュ3zーЕs錯Aツ"R摧吋mツルp8 K゚ヨ?Nツ7ラ?y[(スhュ KieユNツ8~ワアM桍=晴、ヲ韵キ5セ。!ミニEsツメ影ai\セqョ鹽4x@Xエ、櫓gコVfmHロ< ,Tl%$ルaI栴晴h枅M$,64ン +庠r~IXlフ\ -ルヘWk3b7 +-゚al槙モ*^Zチツ:ハMテコTO、モヤN48W>カkスxXレ|「S。R!gセLニテ2。 uヤ b・hッ"Vニ ;コ笈ハD,jウヨ%ナ>MトbヒFX>N勸M:>,LЕ・Yラ]Dャフロ=`!熟aМトコ鉢ヲ皖Aトメ[Oリ、+]弯├Q学アvヨnヨQョE゚0リウEソiヘワ/pXV[ンフ4,Y鴛ョメコ.6l=兵テ6=9ENテJコシfモー偉RC4,_ヒ;yャ!Lル亥柊テBL 疑8ツーチツ鍛 V7 巾魘テャネォクム_晴/晴ウ4K!Uコ髷ゥ ヨ?9;ラィMシ9X5v"チチツ"[Q0ム帶ホHォケ晟`アf羆ヘタメ「楽F`筌イ忙:ォ劣ラ`57サW$ミ届zEBD~gHラf_癶、0ミWjHツロ5ネW瓏隕コタWレ -符8+ゐヘ'J糘qクEヤ;Wzキe/ウ糎zレクォYuモョカpテョヌA])鬯uオqャF"7鍮4 -恕BYウ蜂?ッe7腴=櫃VノlL/9z舗j+ケWム埔 #ケ(キyョカ+赴. セユtロヲoE_ヘnE沃Lミュ屍モュ.ユ餬kFウCォGi、ソリVモモマ[T9スミAカ墅{yネV塊リJツ2ァ?*Rト_ン9W。菩zPュヤ悒pZ)DAVfZヘネル:メjネ;ソチS:h・ハsヒケ;マJ.vイ笘-\�#:フJi3uKヨ゚z6イeオ、#聟$ォ-ワ$ォ-ノJヲBチラヒ晏×K?~ァPタレ「dudej2マZハ[mサトネ艢*@X糴禮 檸キリ」_?(V}<^+叱Vx也|Vタf)ナ>PォTナ{セJG Eッ「~レ屬Gtソ紺R#+?メMョjイナVャ。asォ姿aォ縞DォVノT貿、婪・ーャ齲|ニシヲラDウ齣ツW8ヘT庇R屈~ミェbノェ7ャ2nラ籵jr婬オセ8U。・ェy」ヨ$匹!サ癆4|鏡ヤオケ|。J{ア軌%7 -ツ7tJEイ寢怛A]U滾リヘヲ:ハh5リTzXp 4雰サナFS叟MゥMオ ~6 -詰[Z]p*ヨqウ�ロン]?|楕*t&"n奠タゥヤウzZ/慳ヤj~pロ楳2B儔h粫PNR嚏ソュ瓧SヲマムT#、エ嚏6憲Mナ」A?cーゥh萠`Saスe>1*癘1aSI鰄リ寢ュV] -[;=M(v/霈ヲ※J8鱆q4アゥテゥh、>;怺~エSIア=Zタゥ屍テゥLオM゚傍虞 - |ヤ.86哮N呆7mkモゥWU蚪モゥ$イ:゙タセ罰ソs .<疋ナ搖ヌMロ刈SqョMァツ7D 棧S%歡モゥエ/蘂セ餤W :F゙街搖E�n:"モュモゥ8M呆-艱ンネ,4it*カ)t苓,tzモゥQ娟葺ェR -・ソ~モゥ4!g+トアcT!iF4#ツEョワtェ-扣+ "$チ擇W?Nヌ.ロ>g┝ルT恨レ囀ゥKksゥR/.ZレT*[T*桓.弼`レvB'ニ -![oユヲR髟y4カeゥc ユ7・E,ルJu゙}俑7ゥメ -*ユVn*ユカe/゚JナメY」 ・「湧ナ!ョレS9寧QcロエンP*XT臘JEtYカrCゥL,eCゥ(ゥヤイ7TIZ縺Rム舮ァA4ヒ4Qモ<3ネJンP*4JロL*ヨdL*ホャ]`3ゥテu_ュPゥVコ=ェチ、レツナ、レZ0ゥ,総術ZieOg閃檳Aー」TョリヘA漸{}1ゥカ 3願|レメnハレUV}1ゥクウ莫ルGゥ壺ウ�)0,・<L*#.訣、糀bp)keモID8/&bv・半ォw゚儺ーィ綢Rルiア/'蹲ェナ、2ア^6。Dlユj」-。ケ>L*慵QェiPgR@ゥエミV0fRa.ェN嫣RY;wホ姜・0 ム姜・」ィRp&アツ7l!゚H*杉¶Q@Qフ=啜ツn$ユIEM滑AIナサ-紿;;ヤL* 譽龠ラt]L*ト~慎シ僉RァIkY▽「zG@R瓧Rム禅*ヒ呟 リソ汁共io -s$ヤYナワH*Dm2n$豹k 、bナァkゥ姿!ゥカL*mmX櫻ンZア{=?Vvラ#9(ユJ{攜Aト1ャヒgCゥhSPエ*TヤW+狼Zェ危FR-裘ZンDェ袒テ7遷cセ6、喊rャゥ゚ひシ)/閉ヌ界ヲ朷'QアァケT\ァO倣ュ跼ゥ裃{J8ル擯|、d爻?BウdワクSSワゥyシーh<%編洒J1_ ヤMェRoyシe~ ェ"R リn渭Hヨ簟泙ャSィjノ?Y5&(2オヨ: dォ垂8キ<KK「ィR3]蜘~I Uヘ^#タQ痍ネ・U筈(ヘゥjト<ロAQU袢(9T5ュヨ|eyuユェM/jpヨLルM」**~ミrZ Y諢?蓐`Uメサ戚サSP工鼻_Hp$Uイ瓷ハナ、JニU∬iPェd)N・Jfメラツ9&^-姜b=)芽Pg<oホqGキD」=欧Kb嵐9喜付ゥユチハ]ィヒBL -oEウL|ネ~TbSェ耶・ -ホ+e^*レセR%y{"メ@|R:モJ)jQツ\U*U4RノIa)ム惨リ淆ネ{m>駱剥X}惶」ェ者.VユVユナ「*Z}orVvワノ;Gbヨ嵎ホq -_}ヒ[゙キp !~ェlj5Eー阯&#野fX スd/^@2 -ウR悼TH牒ィコソ?k=Wキx$ "ュRーL猯"-*ォ2シイツB2求縱4sイ。p跪Vクユybヨ|]mhホ@鑼T=^ 亊ロq贊ト~j咄セ1iZRUPB+qc7ラェェjオト憶ヒォI3w瀬n4+、9iレrムZゥメK^' -朿Kル\ォ:ヘ["H1。(%5'ヨキ0?^CVLルェqメ)険ヒq`<ム躪テ哽C%~[U啓イーO�R稜5ネヨ -6:]gシ蠅J循%鐵sPュ$ 葵LJ -;{サフ。 wヨェェ消゙ZVェホ8vQ<5Cヒ:シツ~オCオ檀}ュヒュl9lza冀)4oナヨソDkU者Oル]KG咋P$ィキK。6+`惘イラ」ヨァ;nユVツJY\朷恭溘カ8 彫オ糜$ムコ'+siv|淹ルウ發2ケャ=t6ンlpmU�K3+ - フRv=ユ・イャnヒUャu_ +ワ KカGメN%^U4ニchュh゙q罕靴ソ:ェヨJ|Ufzユ*ク4モlナ゙ウ偸トu\イ'Dッナ{wrャチカリH紛ケK^hWル嘛゚�+[」弋j(ナ哨ン3ェ4拳カヤF禦爽蹶▽ツ竝~ネiッセCヘE%lョ[磨ッ?}+9Bヨ・.+qム;Pル)zQ9.[橸Rl褶刧9.f燬ェ#キ呈。e]j3^Vナ!シ埣ェ楪j-尸・I0サ@絵瓶_イ9ワ弑ユ・ィ>a━五検D唖ハ5 G}gIオ29%ウ|、bVコ切mU儁,シ~YRヘ/1サ博7ェ穗藐9X柢稘ナ描レa4繍。w cD夢nCRi':kィム-Gヘ84 1Y6コミ稜J6Hォオ ]nヘン扉4Lコ畩lォ&KゥャQl7#ヘニLbア黒Mオ塋砕B些腐 gニ8ッNマウF蓿疚ム鹵マCA*o"ミ邱タニコナHvセ^_jZ綯オ6:扎ィsMュJミ�/Aヨ嬬uシR(ケO^ヨ£�_ラBイiェ%CB]シF執TY -旻ケーD蓴@ヘ盗@ホD1エ゚ -}YcI;,4柄(フ桾シ_(「z。p&Spサ輯I4f銅ゥオjj漲ネ鮪テC3*;埓碍Y作ヤkw、。y+シgy惨牝レ 噐ハ・古ル:ェ -4マn`ォF「 ア2Jロn3ユ}kウ8cJiシU怫マヨQオモスiロォョユQナ・q釆ヒP簫bp酣zレソn*rァ99・r?jォミ -キKW)フエR6wォazェ5tvュEアG)iニk侮>5タ鎭モb、iS岸+。>=壘,j ナホフヨsK頬ム8J1爭\GUセ6゚-9PO>%[甅5ッモカ蒋ラマャ.2\?jqヒfスpォ鵺ツヲRe鵡キ☆チェ]TスTサヤ4,ョ」ェNフ?ハス闖*T76默キェ#e淹 jェyケ效テ「,Ζ革メ%易:&<オ、b阿トッe5bセオメカctiサ況藥)觴ハ樛|サウ%ォッキbOtモマqヒ}4ー{ヨ]ア瀰・チU冑4:ОツzK+J)ミナ。"P*怩レ,{qク,&ラ&tIRac砒:擇ハ+ロGメ・i芽.`$Mス0メシsu+j5Nラ・&ォ5mlヤゥウ�fT3ntaヨ*G物3ナ構ス%%\A`カイノ{ワ Rワモ_ηオ,喘xシx(鹿8オ。jE 、n1ロOo蒔:ホ♯ @ョQU\_Reェ -ケアョMヘーnkオトAェj2cUュ -憙XV慵コ皇夭+qモコ。]Uス効EヌQ盂袖7i弼@轟B4レ^イ`Sエシ-\儚Cqモ|ゥヤVdErUメ>WクR+WjINRゥA待mm渭Qf`「厶=ンoNc 頭ヲ-ホ桃!p洲2ミォ~VΚmя,ヌ紺。^%」Xゥ燃堋D9-;ヌ刋5V;Uー-薹2]ロ)峪Y躪*l]テt?/miィルヨ拊ヨeミエノQVp2爲ェォェ-"モYGオLeノヌ{顔・オ"mv&,レアix薇/ホン+_?ィ/ゥソ)q「t稗チ -刷完qfXI・@フ^/qX7?ノF>#tュヒラ/Tユ"K-岩アxェェSQ=]^n・tV 務;生Tユョ蝋0R(がbステ|]ィ葱オヒナ8ロqFユ#・oタ[2K[ア|>リW/vヲキu 抃鬪サ�ュワフ&j カ悪泪ツケ「9Q=ヨ「ツ2エ瓲「レセ揃ヨgトャ「ェゥホ餘「8ラ:ウPZ稔カィn・ラQキヨ幹ェッ%#シ?G 春レチP18PイョkJィヘ-、PィIゥ6>キDQbH -/\$Te/ゥカ、C*}X ノvゥハ匹アロ-黨ャl1コホキツ嬉Vァ聽クwォ段抖」シ{<9Y>+纂ム餃1怫4mO)角ョP鏨耐ャテ!Sレェル2ゥBb+」 -リQトQcキS レ黯Ra i.\�|"*ヤ/ロqtb。SJ!q・hミヘ1nd」ユpラRgェ^e7蛉ィ゙屬hユンラG雁b+s<充Qォサホ陌(do>{ -ェヨoカキoXア:?ヌ痍+tv2」ルキKK紋P謫:衂ャD]sX? &:蕋マqハモ'.pッS褒セ衰ナ還硫d -1)jlh_。K鳰GキャUウ具 ャカ/ホフ娼*7Hョtヒ"E宏y"。ヲnタ*GJMvハワ?ョ0彗{Bアk[ュァワ曷^#テ8ケF!K杁#;,wWテヌB7近魄WニV鰕`6h/廡紙X&ゥシマ崎go*スワ看EォナvキZ妨G鯢R皖ハ挧娜vVM9e)レワ-噺ル`$ト5"鍛<.aEォ'Rシア[E蝴髮3楢オ4DIフ`%a:"ュ!oヘ|リa杵}|メk劣m#&ォ>,ヒyコク+^*Yス+:ョ+・^゚筰浹ツゥ6*ャFV?=ヲチ万Jq・:ェ:髦」ミ%$ャ連]相ムm%詢x�8Mト、橄2PモQbアI"TV*ヲA尓8 9誡チ4ノ髑`偐{襁XVィ萱k エl1�キ< S�皿NV雲wソ UR0ャEノ}ヨ觸麻チ・"nヘVュT鏡nナ湫p邵iロK1霍「チ#G・yWj稼Dエ~ッMj捻^  oァfn黯[ワ*Lヌ3ニ>RI腺LィEツXQJシewp8Eツ・P"Z反;P]コ諠BニI遊セaカ「歿汐ヒONMq禿Pオ4X5ツP賽*ゥD炊F[wリ`カ.&ヤN$0 !ッ・qrラ`゙1ZuS qMノ&ト葆`Ezソ/癘A レ鏘ュュ)7」カ゚ンj莢ヲDN堅'Vヌオ)&ヤ`mQ^-チ: vネa 戯航ユ|9Lfエ輿ユ 筥日ケィェ -"/$譖テ$ウF我 -Y札槧SriiH}�ヲ萵 -hアZ渣-齲妖アョ・"6トL セJ|R3e樗nェ^ヨォZ"6ヘK~[、kヘ;チ1鍜)ヲTー#ウ<圓}lテ、"相1pテリH{J)。 韜カyェコ禍1O*オヲ札' -オヘテホ$:!eε、rルルxョ配アuヲレ-U|=ェナkテ掵,眺澄f5萇eェコ/=pX゙JU0祀v譬cコヌュョm掠D挿BPI#bョ拡广ェ)tFIメ-78LaYh~?シ/+ワォu♯聰0ゥ 顴粽E8L姦1tfテ、レ嚥ラモリ R{m1オ#C騅竡$p'}@陦TOスク�朿ッ!カ。ーlヌ4Cmル” ケチa6P6Sm別`嗄O、マa8FfY 袂z0稿(ヨI#7憚tセUヒ"*kーoキ c)KFテ、モ・コ攵eイシ=(ニヘ\nn戞q!ェR !鄭&累^U(ワJ4、:ム[n釜uBC9;ヤII)ィ)楽Jセリy \3ゥ /A\O$ハカ塁ムq -褊蛻X#,KBy8 コロ`ェセぃホィ スVュ$マ漑_瑙「o,^,6SャミXゥヒッハr -洽頭~Σフd@オ ャ*トB、4 -,GI!1チk総恬テe/kAg。W悸畿タリkヲヨユ'タキ1:J)fォ 僵ヲンNナェユ|イbRュbKェV鏥�ゥサC閑.GOKル1ヤフD様・Wシ NN漉ロS。eLU(桔リ/勳AGヌュPクュ{ニj^メR=\アハ弖スゥKユVw_閏釶ヌgR< _IレsケェWョム0Xl・イIcレ^Mゥl゙eILTtyナァ峯纏+カ「リwオツt鰭�ヲF克t剤 -cTーニm(操ェラュt;イメ補ツカレ抱 _Iq」ャb蘗{ホh帑hャツ@メiモ黙オz轟.セx#ロ!4ヲh尋傍メODF -琴VY犂-iθtNl「ミッ3KNイ{ -ユレニ=瀬タAZk3サrGーヒニyャル 4GmリX @ャ#{=ィpJヤfホ8ニ錣l゙蕨0 -:ユ`$ュ�シ`劣謚;。ンu芯$冀・9lヤ#、/柢QケO歟綯yZトtI#、シクメ公サJoネ「ムョヨ*&XウホA}PKL婀ウzc'gkュチカyレ姓゚,欝�ァ ョu嵯凱B鵆pOh+U腱ユZ_RエLウヒイpハN骭「RiA購ーI,祿,iタ,蝠簽エ=*NR愼ンノセ-末ロケmsOェァlixユ/g`ミzヲサ]ン ッ7朖*1験d。Mハd(泱゙F臆ォT8ィコ擘井リ#HQ)J8 *縋hユ謦 -yAス_k牢コリヘヒ7ーL」!オt<2=ヨ」^Eミィャヨリマッvェ -jッア6ホvE!G+}ェUUd*nj僥"<メY娉j辺ユX%宀6クLル"inY墨」-.ョd.1レ+~・eタ躔ホE*泄メ~Tッ9|ヌ苓> 」S~テJ0ア罵3E9kユティspフ靉Qユ勤魯ャRWф)ルフヨfヲャヲ咎D7ホ盲ミォVル鑑Zニス1r エiオ得7)ホ/カノr象Ry 5FAE2d3スー9暦ーヘエホa+*-y%$ュイ.50qb"ゥR瘡8S閑ュK/7イヒ4ャア16サロ゚PiッlェムアL5声畉-g&+ノ成$v0キ%Uウj・鯑*t歟ャjR�Jロ搨]^gM゙qkQ國;.lヲt桾L0髓w苴副}VチR霽Щヲヘ(Gィヒw舐5奚ホ)ェ lyqサIォ僻夜:xヤ「KdテE(0」/ア、PハVィバv讎。I&ムンU}ヤナニF滑d、ミノ匳馨(レ鷂*嘶>ィトs~!ヘYyXユ&」アNオラッ哩.T3ud全4,クx[v唱d犇Zンェ・v;モ iテ羹s&M*[ク萸IR*998CJ1`Fサ`i$リヘqi「q馴オAノvフAヲ餃JT4:。b藾佚メユ(ェ弖ーサdレ驗uKs?*蝠Wヌ<Pヘ &ム唳ャア -、テo\! %ァリ2噛gGMnヲZ1燉m$5'゚05*コ續キj・|>゚ツ1 kcケハマホlY0イkU 騎・メ鬚l5ニ!ェi6b>フ\Oメ ヘW#`k4gイ瀁9ラR索ナ勒;ネエ\キコ潅Tモルdゥ遐hKJン7ー・ゥvQKェゥf黎UOセ)=ユ襾1)ムkTン餞*LオZ#ワ EV)dH・イ鼈O mィ:截Qウ/\ォセh -ヲ圜bZQi@d鏘 Ka -[摶スqU特@マ鑓オks茲ツ@ミ'<;頴拙VU)ャW癶kWWニU;」CFD瓶ム%],ュn0ァ゚楯I%愈吩ヴ~bフ迷シ>ワフJロ蛋ェムヘヨyアナLK、lE0ユ*慄麪ヲ竒CFヤYホ1エ舮9ユゥ*!。"ナ頭^キ@wィ羅亀8QェニεLレaェ5川ヨ lq!ンYリK甍,醸3 -スT&+ -* )タ枷$!ヤAテ6eフテT纏2*ユェ戲!^@C8F慣rI ィ啜*nP夫鰓kY4,,罫Rッ|TM=ワz2-y堙ァSュi柱V4キ�Un+歙nオHAオ~イ: -ィZ% 冽:タVgVヌS_ロリ:ツ/」CUォレZテ?青ハfム FへネnYスrQヲ[ァj5忙円wヒ>Fフi*pェ[舐8ィBウjメ遣仞8ケ5ウェSス'繽 -v)bヲvルェq5Pェ)V0<ッ ecユPY絮C/`ウ 竿\)弼Q)ゞォテyク ャャ; NラレFW Zウbァ-ヲ緜TX 櫂TK +ェd^X5;ゥ帶ンBソQ(カLユ「-クjャウェ:2@テ燦|キPモ 2j〃c專Y=6[苛hbAフシ・UYF/リ?<フ坩,湿瑚@ヲeッァEシtlセ*・bナ.=,,、オa俊ミ-鷲ラ -ャs#R痢纏 リZ)1guフテxエ9 緩bイ2mヨ,^ッ甍裹Pwユ59ウYモ・イwク$RkュY搴ニ,゚(左ウ?テ;・船| ヨ濃エソ薤レ -ウ2ミq,TミM ム險VP 燭餅ゥ(ユccMルAカィT-kTハロ39vケzンヌYk天ロノ焚Qウワ_5ヤ -C査Zwp&ュ);厳_キ/~7 M`uゥJQケ@`ヨZャJ0陦ミ淡&コN=亳OワL゙>Jンwゥ、ュhオ; -ツ1k- -ーゥツ$嗽ロイ「\G、キオニチャ)ネeAユリュ^漲ウユテ5hュモ| vァオ -(MF鏝#&ukQ' yツhMゥnゥFハMアe]kハルォZ_カメリヶオウsfタB -キ -w樌(1uェRハAオ(瑾Kイ娘マ6ウFoe)0ヒオMォ!Nc肝、モイX=48ィB躑レ*'スニャ5\肥ヤNG轟ZeeホFウャ」剥Y35ルqウヲtソV4Mサマヘ寸胃レラ~1 kハTユJ$-6 Y嗅司VツシヨWJ\Sイ楙{L?*fq5l[uモ窯ッユヲネ*レト>ッ%ヤ委コ^6・Oス*膝 窈KャニNPUモX6ノc「7`kェu25mケ蘊[=MクqkZ煕ィヘ!羽・R`"ヤH7タpテiナ7%F+aユ┬ -JヤワC2^hヘ2a~Z1,3昨.&.ィZPzョe#^ョ*ク Zチ「PリユK%R1e )ウhノセ'{ 6J2iO 6JtヌoユJ kキ< g"マオヤ\ヒト」對ryン、62SH@炯ン<p!&9ュトa2}n]M鏑トdxスRfカム誑 !&;ウウX0カ翻ァアアe・ハナh5,SFマtンーナ紆 -モjPスH{ゥQ {X5n 娵 ャhWラlィサソツ.脈cオラニ;<8*d共ミ6]Sォ)nヒ0 オ;bメ゙Q憾4)2P誡dkyd゙ミ餒^RFャG殉セム゚ -gホト>トエomュ襾IvヤマロS.ルヘ(ァサヒV♭莟m9 ?j8P圜o-志ム℃:延C盥~6Vモo.隶V Rv*Gェ}j.枸xb朶,91ハ鴨v3ヨ埒BD$脳*ノ、{p PI」趙ィルBM}哦`ミ」ィZヲ皿y?シカ贏[uウ59字帰ロ Bjアl⊆qsX~IHOチカ=<< ヒ樛`lp齪カ0椁ヨuーヌ'ぱQcウロチ略ォw*S -M寨Xo{モントヨ>c[ョ{Z獅ヤレj樽Jハф`ォ}ォ」:GhM麋アXs#a8治メcォモハフワ[暸U3レ气:ゥキnDリ壙アl[%ヌ_-ヌエm7Nvbテナト z゙エ2qイホヲ2^ァuユz.Y紂ケI%iYcUオ、Eヤ勍\�Jミワ:Mイミ殊3NjNニ劵V綸 -:ラールd%ィ-/ム(囿IKO懋p ヲ*K)Y雎E。E3サケ'ユ、ェUiX7%r,タ秤QYロ 僧 0(ラSナO゙UKpRZノ4 「レjK%ヤhcシaネテメレ「uxタンヤDサィ�)ヨヘqチ-"ォ%^エ"C クェ龕尉篇\タ>・コュXVuゥフノ@拱7抑'^僚nナftOmU5聞ェ裡ホI;イPJmカ*ヨaンR絢aXヌFキV*ーー[蹲7ュヒ^jY<6トq�pJLルd"七ィD蔽Eトリキムソヒv奠4pクノ皺YREシ スァュ、~リn隷8%Pカ)?]萓U^ヨネヒエzキヘノ御iB3テッSwヤa侭|)+戒3hォ遂2符1エZM。T'- -セ -ニ |4Sl7音嬲F,ヤ pcHキEタхwx>ツB-オ;}Qョレ瀬ェdrF-ルオ-g;鏗モ7シサiン|ヌャUTGHタン.uE★ハaP/ ツ03瀟:ムハヨイ票ワサッ瘴bスQヲ%KZ2=44ヘ貔吊認xェ +瀟トゥsラン縄E-3ルs煮*ーF桷K:ャG -ヘr}yウ廸Lサt7GトルェサAヲワィHキsDJaUサマlヲセJンヨ噫tQ゚气?9g+・ンmネルMu鰔)4ー゙+jn・QS 蚣^R6ワMェPJナ)SK(遭 -)!、「!ホワ#3賦:アh瘢ッ枩ロ`ェ(エr。}^UVェン。s6v」「セEAア@w>3ャd畆u丿5Qム造B馨ミオテ↑ナ3ヒV囀フ^q:QD1顎ホ4"U +S薜」糊1檄Aィtメ鑄霸TモサCSI\ケ/faqN;コJヤ[lヤ貔T9Q[?F却ヨ5レ賃]ハZ[羞セエxrbツヲ頬ヨ -$1キツnォPユOiv歡リミ誹mXーハSメRオ4mレluB5KVS|)ヘT{*zツpCネJv9フ茯j ソWテ:n=シハチ霄bV錆゙'[)ッャハ)n e+」ヒ -U5z(青}yュ桟m祈リ0*W=5ノ掀+アTFレマモネ -嚼XN゚eーI霆エャ「ク'@b?sナ pコ耗ZQ冨ミユ|gKノ uゥンV彼籥++DyUコカー垰黌恣ハ縁9 -!彎*ホオdウホ楹捨k゚Jワ8懊Tエ\iソkVモシ&ンケ禦ヘoリk峠Q・ヤ+FC・o」リァM=ヌ}`lオ[站奇Tワ;ユ"U|ア+ァNニ聹Uエ靨裕メナI5ソjコレン耨l」窮J9ニ\責眷ゥーs分ヤーセ.-@冦魁ソl(゙トXヲユl彬2F赳・KIwヤ慨^禍-ニV+ぱ<78煮アャ龕ェ ゙リ B当z.{ベ賛テ姥 -ウ鷦麓Wユ>ョLG裲Xメ7レDァ9ォシ -・オテ;*-!ヲSィvqYXオソ]ネh:房(diセ簷 -ー.oDp頗薛クヤコ0衍擣-」ツ^;G0{{」'2スf誨ハ3ш5uテ#寞完峇、*%gL精ス-i+W"tノ4ニ碕&6Kホl湎rロ.ヒKォ-5鴟N\ト頁rマ=*j犬dツ兪ノ兒ァォuq=ハ eF″ァヘャ邉エ6マ考Aーコ春`rdソ)スVHイテ宛H S」ナ9Xx<z&ァツ珊莢葎ヨィォ閔」籐UッンェfIェ.キn青Jン纂 e假IdSフサウヲdZ・櫓悸?莫\:eオ3ゥリd7・チエWワ截b砕賜モ&衣Lキ ?Rリメヌo絏鵞ノ呟ーカ ヲ*dツュP>F+クb#ヘYテgネd ヒ垣2ャノnoy[弋oレヨL-キケGニ砲」>ッョcツ鏝ェzZ,遵dフq)v・筆ルuヒ@ゥ[.nヲ氣NE]ホ敕"pR6ZNェ「6;、3昧Tν[ fァオ ヲw絖幻_'ッ枷Mカ彜1ンラ5 ワタ}レ~K溘TXB}6[カ.:キ]キ"hロvnテスK恕ンQ昏U(スネワQユLE莢吮9ヤ] 。*サ0],=FュHコyY(ォ(mワロ「`E・,QvnBオロ゚m袿ホqェ俤[PuHXムB ゙=它"ヒf);ァ旅ヌクw_Lヘマ狸*タセカメ9T汁ソシメ0ケJSタVク4ロ{>Tユ3H ソ/共&ブL_Ud 撤 ヨZ餒Xエス$5◆Sルbコテウコkゥ玩[ヲュ+nDyアKRセテ 鶲ル袙ソFHNノ探sネP',斯ム)ニqワIユ3pJlpA。χつョRャ甫ウLg~゙豎It-ヘワ.[1gホ&詞gンVヤワI/髢凪ツ'」jラ;{偽穉瓢マ讀Z地ォサSェaqァ1Y)ュヨ4vォY'Mニ}Giッァァ4ウ+jャD孺vノNヒQヨeX鬱5モ\魏餘@.w囓「ヽ゚隻@ルロN%TトシqV8{o迷゙R。カultゥ@]ウコeア2J歇拵ナヲネl脈邵ーsWoaィム[ルヘW70ujィ、ぶ」Cャサ!yR9{ニ-Aェkt(+淮苡リ銓ョpタZムs2NLワ蹂}ヒンレュl+ゥ^ン・~ヨCuカ毬ケ梛貭y訊蔬gイニ.Kゑ輜(エ*AスsRサ{ヨエl)l占 ケug曦9 Hミ└-ケeキサRス`。習紋「。IアWア3ウ鍾8」Tヒヤァチ、ャ頻、gF 擔鎰、DZjR゙、h -nヘ。@互Qァウーm+ルjT!m日リ4H* aャEツムヲャkリーNィ)y゚「q H鐸'd〓iミyvオF ッ|Fュ?+yaゥ -_Hjョ9kニsィ截�DUュOmシ4(Q`;Р距オァ]=Eンウbオ圓TョエンJJ-ェ:eフr8.ユクoヨ]褐~ケ}黍┬,エロネ;ャイ{キ`ョQョacク??ンNUYソ(ソリ;jオ貂TJ 塋疇\徳`$棒饒ヤ癩;マコセソ9uセワ;ナ?,r{RW9ワ;;FQェテス耻|'e忘ホ瑠゚i」゚飆\卍}ッ-ヨ棉郷テQ゚[ァ゙i璧M営S25Bチ 1譯゙;&蹐スcE^皋゙I 橦PX艘ahemシリ;ヤ<戝゙。*ホアwシVヘ鯣゙1{%キRーeej、`庄{鱗g~e3!8ッス;ハMYサTカSチ誂>ッhC)c7tqX?aョア藷ッI邨|琳林G{ノwィ)マCセC)ュ摧゚鋤^抖iセ汝ロkッセ尼庠 セY5藥;ヨ{ホス;ツスロbPュ緲?4;ヘαサeスヤサl5_t<嫂ゥpン・ワソネV |GIュ=京エユo[ホ|妖エU緤Lムヒ&袱。ムメ;能ピ・ メカス;ヤ甬;cィォ7麑撰オ"+ス;・「zE1創新ムNK _狃L!_jムュy゚チwt泯ミ1Rィ%セ3[」マ7ヲM+゙*ャヤセゑゥ圉ウ�゚舵_ym79ニnZ]騾ャ蛟゙/゚ヘ.撰Y蜷ネォ*撰シ3r*s~ソ8;姑>O゚nY牘ッCセg -2 {芫|リラ<;八 ^、~程イ、約テセ尼fa゚Q探ラzルwェHヘ=@ノサャ堡A゚Sヒj2%オ抑'オ~iヌヘZNハo^m/%vDタフDjヲソ」ュク8セ .lミサlオヤN+J{Ro10メqJ~、ソヒ4キツ、レ ハャザヘ1bュル^旄゚/]&1譯゚。、欲'ソエテル駢樸6Ne「ソュメx鑿.桙u鑿ャS1u)ィAソヒl0�9ユ竺@ウヘCソモ`モモラqリb~鑿Gケ鑿揺;セクムタ゚チ}」庖ニ゚aアメj=;披ヌムネ處'オu軋黛ナCソ撤エ8{鑿ラvmNソテ"/・z鑿Gケ駢隷;ステャ廓ユNヒコ゚、p)vヒェゥホ8yリ`?恠w縛~wゥNソSUFK5ワがル|Z<サLg�Aヌ゚-セd竊ァ廟擇リ)ア匂}カtV」リコハ響#[y゚〆ipノp擱カイJzwRォ互 Eハoiケョ`p=ロヒソ:凾ツ�;,/ヨLホ、ヲαモ4ケ5輛sヲ*u壹裃)Z[ァ侃゚ウ<N6Nケ勾、イFワ; ~sミ矚a・ 矚。ニjナp:3マywシコ6Nエセuwレ>u>;%養o裃唹g=;\Oラ,gpb類`J^;カ」古ソウ :;飛響C|Dqテ-j卮矚棒JN_}./cカ冤ツNノw萩wト珀)1幀ケヌァヤミo板o*V;ヌ)];ャH/Nユゥ ーe- -6ヨ&7dムH9k|゙ヌゥ塚サ」ワサ」g娚ヒチレl}ラKソ%_絣Ubォ"9o螯゚5鑿髪ャッオアvェA歳(qe{誦|Fナムウ傲ハ;煩1yf諱`/Nj3摧゚?翼ソ湯fハ/」眈チ゚柆ョ昊+}ス;7ウoンヌiタ晏."_5ャキソセラN泙ヨ>_拵ャセセ8#Noマ[ケwG  ュy7リ5y.゙8<uレMレョ?o�゙Qァ祿oーE@1珮7]oオ`ソモ燎 メxw%挟Jb・nオ8゚;)」9懍8イ)ルソywRヨGx゚wvフN!ヤZZ:;?ュ、.ヨ獺ノ肢晞坐テ日テヘl?ニ゚衄゚]ェ胥 - 聢Noゥ&ムヌR:;)劫ッーNZo<Sヒ8<Nセgネ菌ヌコx囹c 4カトs゙Qn゙・:ッーc'溽棄Zo?HGトノKモ&Jd タテjアァ矮wカVナ^牾祥>NF畢-タ;ハ3 l5�xヤcカ�ッ�5M濂ニホツ&�xf.`マR+m邪它GT%セウ訂ハ∂ォK豹ηモ戉ラ!狠a*n<ト<C嗣b<Sj(ホヤ`.kカテ・}Fカ」シ%Uスロ<jEV5R楫ルハRrzCア凵$S_7C  -rヲ,Gロン[ーY黼タ」1'蕾蠅mZ-1゙<jE5実33ナ h゚ラβテ カzxj7=β34 〒}M2<'] 濔ハEタ;j2~ホトソ捩/�O7ヒメ{エ瀛2d猖ケ蔔/潛ヘ牙�pbォ3�^ヲ%テ イキ眇ヤヨFレ�<ャQ9�#ィサ GMJu�lンュキ-�。 -「耶 タ日ロオCタ督メTサfタ它ZZ?<ホ9o/NH&琺+0ャO・8e7(7ィチヒフo゙:vィ7#ルキェq%ェb:ハ債;jタエ%ニ收ニR@_ラq\ニ R.゙Qュ+Gg碵}キテナツC9梍゚ OJ蜉ン,<2C券チツウ\ムラ ・ケシYxRm,<研 '.Sマウ.龜}ヘイqrオ7怛w縛wヤ`瞼;結|ァ!「ロCフゥヨ0ナP興ァm/okEB卸 タネYxGケYxG5槐W%ム2$ソヒツ」+ー0ェq?%fmシ,<懆lqaッzXxfzGWマナツモ鞅Uツホツ」nケT Z゚畄n゙Qュァg「hrル;=?レd=,<寳ラシ)Cs゙Q メb・d鑰絲ソ(、フ.w旆」8U<ホtPx<枸・'ヘメA癸4纖[πL)ソ(<{ワ:(<)ソ?ョ[+pyツモG3ァ稍ヒ -(7 -ィツヴFワ鯰謹。 ァwテ8輔ッケ6 -OSuホp」、z"リQx埖ノ(m枌盟゚ョ<(シ邊FZ`x6ノ.岌~}ax3ヘ6ッ00シKケ`xG "ュゥ偲ツモ[ヨユテツ#K榑<,<|]ソoJツb癸rムeg 蘰eヌキlホ塁,<V}氾ツ」ト碇Sー.蟆手,シLbp{ケカ洞マュ>JN「O<サ貧 ヤ1ワ<ォヘN`Xwfソヘ)ィチモ諱uネn7チホアョ6h膃ZS6淇7ノ册ヌコヲrG +」ア]オ4A扶5ソ|ッS酔 $梵)@ュ綾泗Vー8ナ^ -ikシュシュOマQラセ(1xzヨ倚N 戒ニテ6ノ該則 -5鶤チc)ワ<攤Fo -楪4ソI鞏<オ(肴;狩uカZfzi7mq憖Eユイ)x[9)x[u -W゚鶫チテタ嗤uRh6} 陽ア哂;K、ヤ姿Jチkヨレルo -^テrォ宸ヌq括'ラ^ハどc8鮨w曦ロラVチモユ'オvAPY71セMチ迭ァ胚窒ヌン\km -梍ホマ)xト蝙ヨo -「レ6O0卍D <ヲアァぉ`ゥン<Y6ヤミcテケヨシ)x灰7{9。)腓t3)x且vコ(xRWyルa泪f0PQ7 -'Uゥ瞭}J(モコ ^_<イZン%マ*gI^モョィよ98xー9エ 桙Sエエキキbァ'Nツツmワ9xj汪オッ訴赳ゥ劈堪萵芹レ<]赱ェdン<ゥ黒Y`、 ecコ欅ソ1xDエgO J{セ挫C。ト狷潛m -#鎰7__萱<ソゥN -H硝v -櫁ッソ゚ン<壗<ーfOWVcンチS,ュ>ンシニ 浦ク鷽シ x)V鮭(=。/チ潛・%!x祠Aン燎aJi7V[チCQp%!x(ヤt<$zぉ/aナ、チktマ<゚MチS[ホ8:垤ス宸ヌクチ獻8y0J{剱¶ 胱?ヌタウヤド <=M 3レ 秡犒鬩トべフ異ノxリYOュマ慥AJw%!xィ ;エケx,vBQ輊ぉ[ネ チウェ・e_+!xラ %終ゥkCヨ`uン<ァ '<ン5オJ-濂N7ロリ<泌モk鰯:ヨoサ?t冏 +i1kXyコヨマ迄詬ラヘラ?タ#]'O*絎RXョ -V。'Uヒヨ、爍P <>峡腦チcオlロVャウu%`N-ヲ瀛颱シ7)xレ^ヤ<= ソ[レo -オ[Aチ」h9コ斯B{ gX呎J簔@宸'・峯ン<聯ニ道)xカウテVハ)xxeb養bコ# <怩ァロSィI;(xリケウ ^%y慶エ陟薇 fo6証(;サタfサ1xコ^マk)クカ゚挫S」モレ~rkャユ6O -アケ萵。P{を%慇倪AFYュマ>ノムu ツテ識鰡椣卆 禄ヤGメ:0HxDゥ益O2ミヤモ7O7狄ЖH信 ツォクnヨオAx<┤、ニエ0チツォャ\エ楪@Vソ <「qユソDを}rgOMユ、M。緩硅婬ハЖ鍼キ!サU|赳。Zエヤ8x倦チチウZN寇gウマ$<サ\勺3恣V&ス麿┤oji 皓助I栓$ノ9+ヤ幅Aツ」�L%、Iツ」LoN(ネ#rをP;E=ツ」0RQケqを0"}jン <ウ&ヨ瞋{F4;ォソイAxi  <レモV7祝ゥ"エ呂レk┤(Ng <錢t+8jjムcツ4r、カ捕赳Lヨ58x(゚[o枅脾yハ捺。ヒ娘ノチSメ勲ツテソ竭ケョhモхBiオ 2囀kT(<ェホゥノ=Yx燭ェw綮lュィcテ YヘGnO。エ瘻ォs& O韻K}4<ツX_ァz節9仲g樅ヤOトゥg&xx訐@Tナyx -uョW蓊ムイS{I枌ーソW}n俵ュYF6yx:ム吭硅sg枳鞠C趁僧U*3U}オオシ鰛l,、シッssニSィxサ6/4g.[mショkヨ 蓋済マt0ゥ!ウjjyュ獏<凅\+rソチト:-od「'カK「吟`稱lチト」絽コ)スTYo$1P>?靭ユ(s#]ュD磚ォテー,靭J籐テH<2o<ツ'獣椽粳L+」(椁TムstBpッV/・I*ユエレ鬱<ェ」ツハZ#モオカゥxTveO,*{ータ筍PX<)カ9アxTw_゚X<Blu'蜍ウコ]$v匡ム凱o`ィJュシアxツl+X<踈 ,梟ヒ此X<ェ _:局`ョ,Sb佛H 杞<T6uナ迭&H,Vヨマヲ賓S$リsT<S ナ< -�蓋淺jウ絵+リ偈祺颯ム。x黐レ蓋ネ~7OGソhヨルヨ蔓:オブニ\ス=MO&楫觝コG3エtH$槝Mコ!'ッfラE $^ナ・ヨsLヌZルフ~"ィ9ロ凅,→&+<ォ%8x、剌ラGレ0xカfiw0XノQ。L< Uナ Yノト」ワ`F菩 -ケ*_朖シJ腰ム'マヤ*/>ハ'匝ユ桐.""!ワ 筍 "ォM、'%nニソ3 -タ=ナ@73銑"樊聳7&2ェa)1H<ハo゙キワH<T= -夏瀞ネタ8Oツ呪 $.|< ┬w7OEO"朷+麹S、xーヒS[Z諫s?鉦YヒVカロi拉ッMトウmマr Aク,オn"巖ツ?xミhタ "枡*|iセコ飆トk`渉隨イ<H<ホ∩ヒp、PKウPシ自L粳/='OA 5xト樗?O(^ル3セ'オMリZcム潛y% ムl、ソ1$2暑Hワ+靭(マ;/$!アJ"エ ェfヲ@窕Zス廩< -!轎7蕉 %ト」.やソ姥ノP{薊<<ヒbO$タ'援)qカ@竅4Rh&匝リヌ*t!p嘸キ匝fiホ再モサ鱸`秣[ヨF粳塗K$gト栃エD<籐i}゙@<ヤ'メケ%曖" ト瀞ソサ』ヘ愃ハ簷b?レ@<ス「Y'州ヤ/キ0=ラキ:xヨョ+x握S蹇<Z>ァY・PユユォO逢Aタ坏oカ-マG0痛箜ユQ7|j%ッ'ワ沂ヌクル゙換M(Aソ瞋L2[サixィラ'蟾L寐'・L>』t擣n 槫ソラサ』(ッーメ^J。コ゚Sn$楪Zマ゙再#・ノェD禳゙wッa誘^ス鴬L゙7拍=匝xxヨn&椹@吏L<W}ヘトS墫iァLタ齲Jigフ蟋ンL<3ソm3ネ,ー&跣ソ縛烏シスь&。髱s3カカ~:xls3,ノニネ餃<ホ\~L2粘テマ 凅エ*ミL<ヤyKN&^ザ箆ト」゚輿)ムロ&セy&3xクキu&昿ス絡 -ノトモア|g0カeqx HvknサxJヨ6シPJー、igフリニ)ルj俺絵=諞粳[袈ロ)ュ7ヘ5黍m(.6ナ」), ナウキタ;<oTU甘xヲォァ「`U麸鴆<;循符筍|ユ譏、竭S'X<Kソ}cc鏝スーx瘢訊pHョォ,"クxJヨ鋳コタx& 饒<}輩0;O_■珞笙Z\Xシfス肓aニ」[曹県5+ヲ$綢lホ屡airア釆 G晶吟C箆。ス熙羯7nルt<メ,Nnァa|ィ鈬.aXミ( モrIヌモ|ヒ ヌモ&dヘ而ラナサ8桧揮' �|タタュワp<ィ4ッb1ィホ麾肓1<\p<戝ママエ@G,剣p<zウラシルxJkアL6瘧ンhシソ聘dエ渉貶サD絏リ靴・戟%G!|~筐メiァ玻ルxzDyt4匹゚r&UB -dEt:ミx(スX"ヨv県.vキ>ッyネロFナルヘッムメャ?'ムx NイメVb甌'緤l&ヌx。4Kリハ#リxヘケム莚j6ェ/6朷 o。ホルxェ鯵kl<VX~ツ(硲捨痊ヤソシ傘ウ>ヨkテヌC%カp<ネトヌ羌|N<釘タ罠hOq操゙u箋゚pシn5~レルYフケ痊rミリカp<ミ}ヤドAqxGケ炬d=ム瓱ム<゚ ヌテI怦ヌC$ep<1ロ紵a駱チコニヲ縉ユ~イツ:梍゚痊ニフ@ノM8゙N8゙。-Iッコルxツヲクリx ヤ゙悴,ュ3炬[ケnGェヌ3LBウヤAuィ%8クnル&^ア,(qイPァÅ5#ーシs4泛6アリソPレy'OハC家モウDュD「tノ'd緤イァシ*U4ョ淳フッカ紫Jnタ、リキ8゙゚テsZゅl適ヘヌc」≦Hタエ &用<&^複^p<sjcテP簸N8g*ヤuチ、ハ 8TUロ&条鍜ワ綺カサフ ヌSpオP�pシJ}]k7Oヘwテ飲;凝阯SュツヌCe -8ハ。BァgッO6=Rクホ.ェn昜籍H鵯fbオ'オd<ン[j;ッi!/KァヒIニSIト「"$ネx;ネxR竃cU$K・(ミxRフxD緤Vサ{_、オo]}0|eタクリx48キ藤Gム.傍チニモサヤナニC]Qv I惚_撥'竕ニ」CAリッ2lEk゙h<8桃ャOユレG緤d]'ッ砠:襷罠伐>アxゥyU ヤq若ネハO;゙ 歡寮eナ3矚x[t$?)譽 ツ饐f'オQスリ-'ナセ夏c宜ム7 砂H&アfy0/kヲoカレヤヨぬェ`ハQ&イユ`粳O止イt・ォe -&ヲ从舍旆'x[8凅4*,;64誇Eマ眼゚カ。xx4勧fq6遷(樞ユ昃ルD$タ<'搖ラリルyURマ゙ゥxl薮e睨Ljd- オ$オ Sヘ{G酸キセ5#ェcケ桃G伶DタP"マ孜゙?Lモp : -<゙゚#?9kkB~mワ<xZ撕鑼<Yゥ゚ヲ耻麩_ッコ*ヮW懸o梼G 勦梼g5>8kMニ憶剰タpシ0O<桾 漠x<ィ <^A6ヒ塞3;0゙Mヌ)ャ^7住cZUN<チhヌC剋ス#-`鈎現DWA <ハpp鉗セ_Vシz糂py|ミワァ[BTRケxヲホセxdヘ下ョ渡>JDp -<<OAakl?y露<始&!Cu`?xZノ辻シxロヌ!将モ]Aワgハ{碵BK:U5*ヮGgナニ躔゙5ワt<Bモo+'oォAヌ;[ラィSクlfトpミ dイセ8Zzュ゚:uTモ牾 ヌCl8ナァ紵而マ7轢紵。ミ&痊R,ヌ|ツpスヘァg!「-%Px酔轤罠◇肓bxル痊r アユ痊斐レ瞎;エ-ユア]p<:ユムソ藷臘マ&c)徂シ東ァ奨ク:wzロ ニ#_AGG':ハg圏ハニ3U○�聘nLKト�゙+B[リ ニS;ラ}\s」絏゚6ワレ8サR1ク:7マミ)ォ゙d<)彰:哲ニsJ>ネxユ狢c」鐫3@xn掲7D聘ホeユュRSニhシC9ミx[54>佳m「*.ミOソムx|丞fシ!せマ ゚a罍ミサuイLヨf罍05マ~e7 モbー偉ル7o+'oォチニォト使sイャリャ菩=ユ シムト<練, :X*齎奨ラСシ蒹甍KァYp'従蓁m竣ワRSク\鈬m BM>槲,3X @框 <ウhj゚膕T7K疣實ヌ3S(w。{gi遒繿,c寐寡]K;O-Sュf辧x<S{ィ}qnメoy -/ヌ緤甅E]糂P縉 -権Xネチヌ#\フ・シ ニヌ捶<゙Tチヌ」c秤`薈鵄dノヌkfヌR6Oハ;」DコvyB飼%!Rhト酘スノ3モr奩5;!O#・vニヌ」~z?壊鎬。x;xRリ&P>棠^ ;「 金綢セ[猖ヌ」ハィヘュ#ユ蔭Zモィ サ酊紵v>ヌ聶ンm蝶鰔リォ、4防Aヌ羞3wFァ縡 W、聶OC&>閂イコ|/テロ=n嗾<ゥf#t<温ウ「'uシv□縡ヲメホ徹ρ\馴7呂fミリ.匈个o{メqAヌkフqeホV・徼<ヘ馭mヌィ車 頗執蕪執ユ緤=Bク&アw?9n<&"\テ<テ J搶w( oォAネSk礇鮎燥X戍f]ェナ嵬舵z婆u $2B&#ナk3ネ) T慙D>゙゙紂膾Z]餐゚igョ。'#/F黨噬ォキソア リハ科ロj ミRj<ュ83/Bq4cB; ユBカk%"Oao"2貸@エ・D>7Mゥ怦<S嫺2警ァzTカ|∧#Eヒ科」1掘5撃8楴餾ク燥KZy(ヨル煦<ホ|シ#yコ玲~辷<]F{ケ孫送b"<X7嚊ワo/D朞テマwァハマランE)ホH瓮茹=T -K=琵ホZcI<サ~ヲJ班ロ!:オ6nD栫Y怦glユサ舵"/Dj ンョ>jJF樮oFスyj~ヲyエム+絃.F棠セハ4ォ]bセ&カ。屡縻(vUア:SM l∧モ゚ハNFスr OF框 Tヒ禹ny(8Rロヘネモqy#醜頸0 ;*ッ霏8!y且ロD淺チ[rOw+ -K蜆ェC(。6 yM:1Fノ6#O楽#.テ淘ハU H淒西,0サ y六タc -H蕾t%$PH゙。:$OO゚j:セカテG}\イ菲GチヨO'%兼挑マテ >)y,8ス゚ム0.\絃息}K腎コユΜM XHWキV牝1盗gハ::/mZ5y44#リ=モ[コ註Gラaク 臺セカ:モ 葭楾シ+, yZマフ9ヨ&葭潭7ネc.&<稷ヲs*末「ー照* -ト0淮モx[9y[ B^}メ]ミ y4チ: y\Uキt)c]刀ノ y抵f|ァェV!Rヘ|&t*オヲケ鬆゙iaエシ晟ネモケフサ衾N-マーナ8U ト5唱:(^カェOvヘX狷}ENヲォeチコモ>イ{?ユZ糾硅ロ ubjnヤンHx宅メ?ン區a糖サィカOフ6Gヤ=梍;。( ネワセwレ験*: wlp'aエケvリハ{粹z.b從'ァ風<:Yy政゙lサ Gロ ゚Hイ]F-ナ蒂ノレ`m\寓゚v篆ヌ|I「擒*ッ%yカ1ュ惇7&-/4サ�エ\0;系+T6wラvニノイS{~{ピイiテSEァ蠍ul8ノn ノ.ナ ルユ=; ィ嫻ナvq菠.;渭ッ{+ bンR>nyt鷽Kム'ュN+qWWヘモェcハVラャz「齲綯典遉 ェknュ~q齧Uf%ヲ刺o諷ユZ/Jン�Eoc;」n6oハ<uウコヤD]N�%cメイゥメ羅,/>]Qキ=.rチァ+Z9ッレ徹WーJ昴萼譜ヨ&虧゚贊齪[ソtE・-箭0'・b|:) リノァ+c:.tE彼贊fNX4tEチ+・w>]ム。'tny゚ニ渣oNヌ「LスO'キ-O'蟾r ュヤ^_碧膵QwナpoN2_・ラUセ骸ュzx%ヌ/>旄叛tオo -!越肓$礒捶:)マミ -<];{テ飩Z7攬Pマリ7tョィ7モゥイモeaァVDモスン幕Lコevるp欄Gp鱠.キセ妍ァ4ュFノメi0gロL: ハ]H:オ0ネ、8tテ[vHz粽葭ノッミ58:船J)エF傭ー隕キ'bNo=ョ'丑ロ8ユR盃゙翆。K眤ミmヘ(tヒヒ黒邑ルモY耡Yル|$D」= xム}v蹈ミD,5」オク梍モ>8πpママゥ4ュ<!板応ロ「鍋エ歸@ケ9リwp蹈5チ0'Dュタh鷭 -'tn勤彜TヨB 軼ルヒ 彈セaK゙恁ユ壙7會Zl罎ヘ黼クMセオ/jd"エケRァラ!惷ケ/ト++Jj、ヘf0Q;hsR6&}薙iナ)<ィ i {$lN"ン` 佞瘢リ -'mョ垂hVEJ絮チ゚コzァヘ=ナ S檄'mNoG裡yメ覽澳螯牟9 mカ6'%\メ誄Yzレエ9.レ怛>6k受モ5ヌgk%チ踝,峯 #V endstream endobj 68 0 obj <</Length 65536>>stream -tsリタoャ9葎q -ヨア/「l ツ|ーィ.ヨeフ5g[gョ6Rp�9`sィ渚油片コソキテ?黨5ヨ怡ャ9剳溪テ岶nR9Xs[ ヨ6゚fネ厩5qノ8Ysニo輌ツ7>ヘiッ2蠑`sヲル6lセqeC舁ヨ 寃]\Yヒケェォp}6キ6キユヘモレキ)rナフs゚6Wfオ゙ス}愨#、 6キ蕪6キユヘ TンNTユaチ=ィrqe゚簧Hv0Dw゙ト6愈X-_イ覬y58梼シUチ睹k5'オaコャ9PVテォ -Iン);&搖ンzA点|lF!gマハロ\ャ9チォーネテ�pO宸Xハチ俑jトソヨ~湶ulHSケソマ+クM<輌2ー ゙Qsr豸ィケBcトX筰'。ホu」踝ー゙ヌゥEト ィケマ5キユ@ヘ驛クメ艶Sワエ.クjNjqラ樮6jホ桁6k+。穃Fセ渣嘛ヘ喞ホホロngOTkNハz;kホ需ナ壞冊螫9E係QSh@4レRチ"渕ホ繙ンワヘm蜆ヘェテスWンャ9ノYヒシYs|醍y7kホ&框cヘ瓷、9Dヘ勣:Ps7オメ ヤ殞_鵝ヘ走cr ヤ弯lt5キ5wィ字ォコ蛉邀u萌C悽9nネォgニE断5ァユ9ウ 6旄ヌsリ=キKケソネゥ[ラ>ヘア)#ヲ淺5u「セas[ケ56WTZ3檜テ -Q校'lョヌYA+;゙=@<ヘ.asハ臑テ貿Bフテ替+鋤&躄*!Eーケ5,スvイ賻fhソア_bッZ珊ミCチ猯アHツEレ1sィ=)s"@ョdn%yトsェ1滉腰エメ螢0'ウ(C{サッj'yTOセケ/ヒjリncy戯タ蟠b爽イ袱eゥ奪ヒ!<&モisNー弖$8、WN3*ィタハ ッチhsR>_'UN'保ツチ葱1甚寧)ェDケ「$`)ァG,P"衞Sャ-喪ソウ~゚2カ@ハI5ャk 螟XュZ 衞)'伏@ハI` 、G゚1]ー -セ・ヒHZトミヒ#蜉b*簸Dケツ堀lV +襄ュタ 任mqvu貽ミニ2ノ|6ソ(Wリユク殘m妃Z7Dnュ刻+LYJ -ョ琶ロヘW麑ハy美ァ(ス"F萃猿K1ネq冱ン(ZM*t\Qツ躔縋.M呻Fヌハ℃ロj繩捕セ猿翩ェ5t*エ@ヌIiO'菽+a溯8搬*nCQh顳ヌIオユr胖e-HクB扛:フ8・豎( tワVNtワVgチ8ヤJW]<0Eヘ;旬=南8mサxo(L7▲oホキotワVNtワV Wト[.、: ァ閻ル懆8ゥ゚SュO.6)後ク媛。网P礪8費sP彝J戍ムカu絆・rテミッ\]Dカ_猿ロハ猿ロj胖N4 W蒲(_8嫂oUD。:78.スアqゥ8I57ィ N゙エ笶ヌ *輯 l噫ニ)F'ユワ2#G43ヒ3ohェ=|ユ]J倬4NxNh慇屐鰔ク「tIウニm蜆ニm5qE贅藁 nスヨ{1.ーレeY^(Sャ/欽`悁-。シク鯔敍ナi爨樹ナAxYァ Slz#<ゥコ'モv-甞ッ{ル'n &.ナト);o\PU゚rA笏_.・mF懋(」カナ!uトス鏑>网sラv+J:慍~睥Oカk 履」4鵬ヤキw崑21ソ!董lクワ 火]d8ル鳩gn0祁種\ク-Xク -。レv勇 肉ォBウ1髟} /オユJ(ワVN(ワV -ァ尊嵋砲O5gー -ァ aエツ)エdv暸S羚ャ7NウキシuS疸スワT8ミhL*6謄yン?)Sケf{ナヌ0A(\湛�8n+'nォホ┻ハユマ劉幢t2礪ー|サミュ゙Vホャ} w9ぴ)=_yヨヘ+8煮ケ冪ラVロL8)4カ\Pク「カIケC碣擺uケC疸 チyB甕{ンL86馗エヘ┻}オモ苒 ヌス\ォo&`チ#~ー?湾zнsI*$カPAチオッワL8!オ模#゙A(爾?{3aツ)2C2冪X:冪鱒xj28s -セァ廓Sp2甕ラ゛鶻68,lク GJ「エオ叢Vセ延モモキ7o$廣'(5nロエイgナ8O&ーU72ロトT=ュhラ剛テE椶后ツ欽"儉8ャTr1碣.「 湾 4D$蚕-?'死 ェ`ツ。エァm&懷%Vサ冪Xゥエ9ホ盂鷲7テ9dツ)el(vt点Iチ燵P8E|( 劇炸kaウァ「ツユョ.ゥp$x澪9NΖ粒T8EQW}ソMピI、ツI% -典8メj -G=k遠 -G)�ゥツeQAR甕゙yC瓸ff *慇5t#1ヌB眛X*K(\。鳥 +0╂qS疝、紗エ亮アp湘1sX8ヒ"<衄ツi4テイ%ーpeE&7ーp豌uS皃ルT8)3 -メ#=妬ニgzZP甕ア皐~ウC&(mu -ロJ*愴1婬8鷺ニz *ウHAモPOMメEcワK≪・ミャ!>ィp(,N*\チマル#,邸8 - -ァ5 fl モラg鳳クソo蠢チヌEヲエォンH8'pG然[ァ|$jア88 o[Gモ7 NヒcイチふニQp栢ウ9Ip檬Qヌリノャe-Tヒ5コ1p2ス・D*(p゚マノm緋o8鴛iヘp粧キ pメヒj7� 美7 VュFz、ワ7ルモQ7*ェ覃[Q /ルヲミコ-TVネ壞硅7-ヘdソタn3 &カ`ソ5_愿ー」P夫ー゚ -Tio>キェュャK/7座=榁~澱ヘ。チ~Cゥ~塗-栫~CY 孺正レヲ/O7ネoコ^lテF0ar[。遨廏Fー垂a'ソ・Hル\7挌Hハ@ソ騅ーモL媚スル─7$k゚7=lヤ戔迚}Snsfwロj^ミ7nラ廿ヲ鮓Aユp茆キHcMbニ&ヌ -カ|E他7ユミ>サqo+廡{モソヲ"ロア.ヤiカァ$骰ヒ9 �Tヤ薮貍}掃 フ妍樮梯」゙?9ォ;sEqd ゙`^1ツ嶌sヤァ皴{x栃9n$ヒ峽猷 -モスニ「サuマQ$ワュ沁bロ゚#ィzvu_レ$ル 剣」vモヒウJスケnェ?ネヘECDdモ碕&S釋ルl u{ン4。nxマセ冢丱O、廈らラ6ムM抔d6錻+犹 IH玳ヲ&ヘMYYeSN麿ニ7vにrSル)F1ノrSユ幔;v^9 _U9ハMア゚ッ9,ヒ)リ暄?ノMc 皓 ケァ6%ネ采ァ|6J深チゥホ r#C6盃q菅 ゚0n -9}uCワエOy^Kル黐+ケIq5(コ3nZ[ 嫂gツ%'ソMm(リヨ8セmト#鑪黠mヘ椿 oS!# -?ONt幇フ ー比6vィQV6ヒ; マe3ラm3テ ヨKハi゙gャエャ@#椏ネカマS:Ilモ,'カA -)カ鎭`ヨZ4s2ヤヌ2スtgF顯sムレト袁X幀u2ル3ホヌタiチj」ユア<「ヌー^ロg_セ麁k'ィMス艪モヲLャ=チiSタ迚i#ヘユMiモyV6xスメiS&2m♪ B[_a匐m=+m斫ヨWメマ6+柝カュ唾f汝Q菎別2伜AfSニ「Sル嫩ウ\カ。tU5\vvtL$墳欟ジホq1ル臑aH6ェi婉ぜ9F飽[ーF籀Tタ⊥XミリTメ獄06鰻懦#ュュニQlウ%Ebk゙$6=シ<GbC(vDぺtナqチaSk肋`リィ逹ヲーi-1 lーoGー叨ヌ`%2jリエ]Neャヘェ.ュcッナY,アヨmZOZク\5井コjチ^テユwNフ倚悔$ッ像ヌ依タkEキ�ッ|タ]H& ゥ3ニー�ッルハwワワオ&P‐モェル2ヤ'vュ`ャe杯?^巉オBスカ vヘヤ*ン ナ3rノ]+QiuラP遠x jラ -5ッ5%xMロ啾ヨxM ユミヒPlヌJ鬲:w!タk%シシF畉玻ス堋+'x uヤヘ]寅Hr8wM f'wュ`ゥヨ谿cl衿杳オそナW7xM括<s、5ノQッ 吠1坿= ツ^SW3ク ^」 g�ッ)躁ンOべTGu^S:ッY6@ッZラT緲珞シVUカケチk(Nb羞眛1o咼<_ぜ&a笘5I4譴ョQ`G |Pラヨ�マ齲ヤ蛙ヤ5ゥ詁ニ8^ッA!"ナZ湧齲ヤa1ーk\Bォ"4-コbラJ煤vM3+ヲZロス!0ッ4セOsa%T^ecラィ)トョbum墅'vュミx[セサ(K$vM|,ョサヲホ<ウ9アkkoサヲ3=ラ釿"楡トI]+ハキ疵リ5j<{7ャQ-$= 'vュPh�スGLJシf'zラPYエxMハP@"チkR牆]5]オルFラ&IMモン・テ?ッQ琶I_-ィ?Zワロ ^」汨1ッQ9ヘl -/xMムオxM」燦E:xMug6杳5カ&j?KZ6ッ墓Fy香<ミkzQ?7ノ^」ケB?bッ。セzMB=タkキオnワ50ヨ(崕f覿6w 峠ヲハル鬆Q葩ワ6クk、 Yq權5居msラh8モケkハ凡 -某ワ5 "k-崕踐ツ5ケkミ鳩nkョラ=ヘT畢スヘ]」ゥCAヲ興f�牾6wヘ(ロワオ - 點o穂>ア・h^ワ5セュュ%ロZンワ5俳sラ8s1ノ]テユаRpラ(ロァS#クkヤl凋ワ5 チ1P。<荀牋&yク(苹ヘ筆慷*そVHSサScrラE,ァワオハイ[崕FBY+ェサヲx云」e`ニ|MQルェア サFeニョ飫佻b`ラ-燻_リ5ミqv ホrー[オ#Fネ サf^薩テ2(N)惨ウ'OqセラムlQ)オ|nゥリy$v ナ2I]#m]ツ笠 -ルュoCラhワ鏐.l陏~6Vチ\モ@ルA0ラ -%掻"ラ &ン ziカ8 - スル愡ヲ/タ0p1ラL}ク┛)6GMlBラ、 ]」k曙 ]」2スラヘ\テ=76鰐ユ-6.膸ナuwm7鮪イ ョ 」ヒ$ョ騏=洩Zルコ$kスツマY}t笞*A-ト5Mヨモq"ラT_D 遡ニサ鉞ケVィvヌoテ遡ハソぐ 笞碵コkZ [+eラ -志堋ずF杉�ョ}ンォヤ#=cヘク5~クqkイz$Kエ5E Xmッネ?カ[#忙「眠5桎ィlカ0ト=蒋/]6k ,eミカヲ-Κe"Rj#tー5イカfヌLo*ノコgェ-ェ=ト 4R,Pー5)$.リZ!W:ラ劭昿%=ノ」!勳゙E[ォ2Oヒメメタミ'G3iヨ'mM倍;m(?hkトEコ UラネR蟆5鵯^Gr漸縢'チ[C・ヲ-`k(5(婉簿ウコ iホ^qy4サiァz WRヤァセwケhkxX舍l(ヲU濆VシラVΩU}6r(懋沒カヲ瞰ウqT堙ュaLM�ュ!槻レ -cA[#゙D零I[#エハシzフ(hkRセム キヲ梁妝キf贐セャオ#p籔ユュQ衾シ%8jyOt粐ュ甅ソカニニ凧ネュm蠎ゥmヘ|ォォ#,!tミヨXbウ. ワヒpB'n ョ牆。シN`κサすhEX\u;芸ョケ&M゙圉&長ヲH69j譏Zハ沂キァツ偲エリu;pkエ$Rクu籔P_Gゥーウコ6nソ9アw瞶ア)ミ~瞶 -枅7ヲl,アク5f]zモOワヴ6m A、ュq「mM*フュD昴ロエ5怦楸5n貪箒オx'ikェー ナyムヨ茫A%jメヨhL37_&ムJニ#xメヨPYEm ・;箆bNO、丹ワ3ar゙ンvDエクFヲ-R・cKニ$ョ骼リB+k゚ヒ苫脚tt奥タオB*マスア1i83オ'pュD/〔トPSタ\舍ュ胴ヲ� {我ュ 爲ノD聹ュアミk'柚cf^kテケ2エ杯楙5Tワイす& _ヨ、�`ケkエゥウ7]M \ォ赳]oャカクV!オミ翅5=瞶 qラムヘ倫〔ェメs麹\ロハ ];TッタJ:ノタゥ焚OサーkX・ホ~タリィ4;.テョ厰砂vィ3 -忌%xM」ェh杳5ヤ6ッ。袴6xM笠シニ>只@`ト*ュ4テx 躄s-<タk勉隙ナZ^疑$xP"鹿xMメミ Tc飢nナ(\ソ髷5レNレ。zニn鷸。8轌o齲Nエアョク脩戸・疚|オコV0gッv *@lニ]S(丼]#@L]y@ラリ-or「W雫ネZ7s アネ5 DケVク]ネ5"ク_ント5ウ$ー#柮ラク6x浅ヨオ撚ヨ(ノiサ{Y諷[=Xメ纂Oミ惴6ワ肚く細ロΨニ@ホ校モコ串ヘIZ筋iヨtニチY痊Rヨネ履52 -ac ホbュ/7zツレhVヤ捩5ィ椙Nセ囃/Bpシ噪鰆4bヤミ<’拉V'[m, セ'[Mm92ネj -Iェレ鑪BユBク亘sユ4ラー7Xレ効鉞ゥ}A -3IaマCロ$トライ>踏カシC/ゥ�ェ隷'JMqSB3'I-m B|゚Guラミ謄ZrヤT2豺1j?CE濠ニ^7DM&+>移VN移V「カセhァt6テ驅タメBN8コHqdEiチ P#滸オヘO堂フ迹b墹スイ.z竒t< 曜ク 陳 -p%>ムiDアJrレ!緤讎ゥタヲ駕02ハ[88I[tfレ逋ヌD。)狐飆Lロハqカ�」ャN`Z Lシf1Ah」砌・駭巍MィZS8他エT.^圸・o^毀'ネ'MN7ヤ愃4。)セnm晴4ケMG馘ウヲZX&・aU_・ゥ{崩搏& X嗔&W[NIモfテ{@メナホ工S枳セチC>ワサ、 7`IQ9ニ貘」m癶」・hpエIチF荒。ムVル`4ケN|^ホ礙ヘK' 寢6ワ8。hーRo&゙エワHエnゥ「ナソOZhC#ミヨオn〈オ膤0「sw磽+Jひ%ハ3v`ミヘ~諞Aセヘ6S{"ミリラ硅ェjF掲エュ惘vェ院+黐"矜Xヨ8VI@3゚ コ?怙&F -崇〃�オ=h覿舸 -カ'クウ麑E」y傀ヒ%3ミス_oY7ヘヤj毯彈ー[�eE瘠孅% ・oカz激FZ.E'Iュ&ヨ&iヘTキN夛Z,4ッェホLng讚s ミ、Zョ3hR^<ニ辞ッ朽 蛟A@サホム4ウェtNEf5 :M1g 4Nクiノ@督V-hr0ミLRS゚柎マ# lN5?V0テムP攅テb `2~ョ^4ゥ゙ス4 「 k� 黥IA笛オ^@ミ$XユI@ミ8 }Bミ0Z!-4%メャハ2 hェォ1イ A屠vA瀞 M界N*トメq&tォー吩モテxrッゥ49 Z。シfB頷│7伉Jタn゚7ュ(ャn蕋v謙9ヘハァG4)じユi_F%畴箱攷Qエ訛コXTヌ8m -ナ�)4ラニ泄L3トイ疊・{tタマエuタ櫑4Pイウマk ・カzテマ -ャ`ロ>ヒヲ喨C詩衙>ヒz>^^ウュ懺ウュフタ3I/刳 *T+ァゥ゚カユサリg器Z5リgPゥ>従ホVN勦 -建Pカfチ>+j頃アd櫑5寤`櫑%弱)z<+vイマ、2j チワU廩咒W1ロッtマカrマRLi∋#ヘ関i2cスミg6粨ヌゥuウヒ9!懆ウTウマHア。';ヨ゙ュMェ附3:メAy慴フ'|+収オv」マ$ョ27 。9タ罫3ホウャハ>Cュ5」ax`9ムgRネ\3}3?S3Zナ Y -フヤ~Zソbp@ー pルヨ~」マTヲaa<Nホオ4y乞ァ゚ミgxニ頬囘+脾n>モo龕}ヲ罟カムネ惶盞Ot:應3コメ俥8/廢('P掟Fチ ユッA>縊.G遍3f<ユ懆3lWハ  --x' =ネg|經積イト"湲`Qlo、F ハA>;T'湲;dヘ攷[党>|J 歛jホェ$泯Rq佃h:ウ巧ザ觴ャャ埣ー+lォ>S 4^Uテжヘ蔓Mナd泗奥破ーマpト$7レ囗ノ>+OヤユL -ヤJLKo]N剿ラZ'Lヘョヘムゥ >Sュ.燼}Q@ウ3ム {&キVツd!逐v燎:#低正6xホ8ホQクgj_ェnBツhムR|ウソBナdrシル_ッ゚゚'リ滯 ュ?Gミオl啜*彝閉ッ羌[Иチ識ウ,P)|ュフサΧ8~マ舷ヘ]2ワ0エョ握<「ココ"T,"!)蓙'圃-?ッーf゙Neム迥^謗ヘg禰エョJi n="-スクアE衂V壷GンTエョシロ]Eナk儲at$Vィラ\Kサ>ソ F乳u*JA8モシュXQ;nウムシmユ濾ニァ」ゥ、xエbxゥホG+ニリ鯛エbF:R、+ツィz-コ諳ヌヤモ6.イヌd゚%巡モス2カxニ!賓Sサカ*、ムロユホァヲユヌ2W絳カ巷0Uej(u^>ケ?ヨk6]ニ眷芥乞{ン鋏yWィア1Jク祀・G*ケH)LF=筈`フ4KヤソRァサ9シンミイFMKeユ峺ユマK援SI&w\コヤV」フ`*vaスサnァ8レ」ルラモ)\7$トゥツ揮*NG鎭刀*キ悁l4ェソ渫&�・zサ"ハTC-&イBミrG -=/トyマ>Dェ!*I*ユTャ5 -褊+hワム厶{+?來P_/、 ケニタ1=゚ン5w6ホ^ォ鶚オ?^fル5iw=:テUッヲRィcP・Kッチ7&Mォ隷トC声jワ)!コ'ミ!ェロフ轗0ヤ閙メエヤ。?ヘOoオソロy姥モKBU% -?ロサレHアリケN コ喊g,班絛ヒ<]エフzui�磴」エ}X'モ・キ蹟カnc 諮] E%"4ネ] G;rQ$&仝ス/lalク咼幄T靉ヲョ -サフrxfャォ刄?タ2Yシホトレ:>珀7_~」6キnカ咼&3ハx箍マ ネ\K。ォUU<チV塗]イハェ,@閑顫ノ SFYV纛スヤ ヒラヘニy5ワ+整顴ナテ@}P8ア-d跫 ルリ) ZFnaセ稗衢*曰チ[$ナャyナ;]ヨ7孺my ェZ)フャ($ラ、d}Wェ廉 -ォリf&!xコハャヤjdlュヒ(Ha=ロy鶉*Mヘ寢ー[;ヤマ2p]8 z麼vィLa@3M*7峪|ヌC]=Zt・'r+ル&~聴ウ\*叛__ォZT2{(ヘ哨3ャ\|W゙鰄ヲメョ' - -狭湟鐺メ麩Hスンp ・膣ヘ釵スイ6~mォrZヨセF2mセ、bZムa賦ュンヌUg4;俳lロ。V」ーuブコRZミェ蚋「+スキヘモミ.針遥>5ノ1Ql拇 -ヤ!メホRkムZユΠU萢$Ylz覓凱* 4ヌミツェス.$ホg墻ャD援-、R-g<)/ヒ3絣T(6押&_>ッF 鎹オd)/]賣み隶モQ、伽+X -5Tニd90ュ^前ロP�ハワエンswm%�ョ蜩ヨZhン叙TVィzキGタ1P4セ V6ンヨチIbC些腐 gニ8?!沁[7砧D_Ocナ「畆Cee?ヤ�0> 」ャユOXM:ム|ユbh嬉2タェ"Xl」サ控(ェFQ} -m鍜N_鹹/-馮込シニテ?.p)チbモOキ;e0~K,溺�R -nΨナミワ!マvE{wセ!ンヒT8セ8旬ワ筏ヒ:マVM淋リ,6i^LJL4X�ャュF「澣嶇 カq=f\o゚u(勘!VェMョj喩~ー[ヘkマ ゼル 蜿S甅5斷m夘)Q゙ホス+ -袢Vオモ}<貉リ"ェ5JホsテリUhェ#ルヌEUニjfU>舂Kヲq;・レX� ヌey羆fZ) c屠$Rケエ*淌 O械茶ケャ#メw#pヘ吐禽ic゙Z{X -ナホャ、]偲ニQ褞9ヤnyレヤV)AM_OT8S_y懌ン6ゥO3ロハ:シS送メ_Pン桟", Y+ソ扣<カ倣>qj[゙dロV姫酥=!タ'ZROX(MuE繖�弁佐ソ<dッHュ鮟津% �「泡Rィーo$躍」i枋タ^ロカL*N1zIZnzヨ治蹶3キムシn 喫~%擶XZ-~boエ75ヌ-ソキXrゥリハキYl[^4」瞠@> OZ5。諦チb繼.IeS$册/fZヘ$6Iセノ゚ェァsスョ>ルセR゚$6MKス]V營ゥnャUセSQC切カェエべロ:kfョユ恂\ネロan宀T毅XLhナ2Z�`廂カrPx。リ擯ォチツ"スレ>a(メノアッPオ召ウスケ Rユむ5 ヨァn瓦m!ウ滓$ア)塋ゥC岱fyZヒケツャリ:+z裡シニ檀UトILKぺzャ# -(フイZ・{Bノ'ア!bソワ"ヨ]イ襃)=gH・咾ヒ~ャアPh -青E狽w致ロチcス゚ヌィQ孩ン)ヨ磧e M:]魁イア^タjS耕゙bOー?^uヲp{nソ年Gヤ6Dツ忍>廓9vh撈ヌリ`6ゥxJ・ヲモZエェ)ヤejc冤カ.F薹4ウVッオツ督TaVヲロニウiKC ケzpv'ュXルハリュb崚Hソェvキaョ」ハチテァイ(ワ,fgbT」K・瞰鋒V$ 6ゥオフユぐ「,wWリニc]=I:3シ擘Rゥf欷8群物vト:L-'0フェDR蛹v,:ンMEAエ};ォT湯6ゥェ1アルa,・Pぷヌ胝?}T@レP。I'孕&w_[iモ/`P罐ィキc携邉レHA!朗Qセ+鐡雍=、KR渋Y)リホアクzRqォァトBOo便DゥghスロZSロ7レ8v靈[コ'サ(ヘ ミ上シ]ム% n・l`ロVユa」e3・_゙ル1>ミ諍錯4TUHeァ*E1L*&Q"I@H#漿_ート成エHソH装棆カIVオヤ�」謝ヘ`ッ怺=n>P綉N*IR馥lUヒ“キXン圉「b餤テ翹ナYq廝ヲlヨアァ&{JメキC。O"涅9yネT盗m匐ヌJ・ラ lロェ -ヌS寉dオP激4エカI・$ゥv拌(ワJ)$ョヤシ-鉢エ;毛」.KS* .ホ\舟イ lモ触ゥ&mmtm銹ケキホVヨリ.ナゥj#I9ゴ ナゥY苔[z(+ョ8ァ<ィ。ルハモ#繭B$9:親ホュt地鑞」o%:r。y徊モ胚季S摸ゥ'相!還R犖qヲf )ノmウ]睇Wsv雋杭ハオケmn~4cェョ@ウ?,Jヌ9?善UI唹vレセシ衍k(NナョュWF綉"「R衒dU」)>ラニ9メ#釡-wラテヲC敘ヤuィ遣%{y8M圜>__h4R4給v駈ヲレ儲チk3R)ト。.ZツX}Z黙ニwmOJM q^王Xヤヒ"yケ -ォ'「cキ缶5モ/g&ムg1Dゥ゙ホ「゙昌ィフ講・基・Zm「[_゚Lキ2モLュ罰詮メw1p_VシVサvkO9施ヘョS殪ヤヌ 愉rル]ルゥッy6扁ー%'テ゚r諏*レT'鑢ォイ1`桟Mゥ レB[1コ4[」カI4’リヌ}4M:0ュTrアI"ThZZ8q2m兆oインHヘタM投BUke#ッー}<チvca3シ%BgZ&N~チvS|某o,c現ェj\ウユカb7ゥリウケdロV レ讖3g+忌icォxニ"i∴@+ミNカ;學8[爿VQ<|9ツw8;ン)ン閤、"攪ミ┳「卑m,7カ8Eツ・P稼」%wzネ81ツNkラ|紛.?95]ト、サ。B(ヒヌ*゚ゥN}Fヨャ゙N桿H`5OF>KA聹《bL!"ァ":レナ8ヨVルゥ>hク"6zォハ0z-」サ -~ 4抜駭晦7{;5QャュmQ^-チpメWNコ嶽・蠕TY>s侘$h'. IwC}\TU送ッコpp」k禰ョ仙P5ォヲQ r=誦2ホアS=,。Fム嶽UeィMカョKEl會M_3魴S゙{ィY/ャ籐\ネ磋*」~6キ、駝ミヌ/"ヲ刔/cテン、"癢<0iRシS -A((コuハp"t侵申渤G「ホ鑛g攝恥7ゥvルユ' ァ・茄僂ヨjカU)疣C~浣游-ヒ句ヌeェヤ認$rzOラタvスリ剴xvw_]ロW&dbl・H哘フ」夙ーOメ?苧ロE:P2疣iムX\ゥnテ[Hツン、RB(Q峯<ス(そ[b}テン、イ豐マモ%E。)ネP^;1dGヌrG%xqエ。 Eヘヤ(1pキ゚[繙オ釆シンヨタ$5dO「5dツンlヲレ*蔽エレ゚"} テ1sp7ヒJ(+rク屓'群l襃ケ砒」{Qc{エタbkレ忠ア備ォタ・サシeアシ=(ト複ヌlA6ハヘィj�1pィ2ネdTJワェユワSィTツcヘ wモーNhィqエ。メ、メkケ1zY゚雪ヲT良sッ3VjG抹"z8"ヨヒ$。<Nィマ^フ 勃glVイU棡g,+キ_璢B|tiカヤpxキFァ20ハ+Y%テq+ヨJOム シ。イn・ ウH-@)朮sラ゙ヌ ヨヒ強vトス5オヒmN0ョ下tュn)PFJウユキfQワ[潤vU{蓑8&ePオDァH} Rャ0^d)閲C簿「T#^.+蛋tQuアVfo゚TUB鉤ィ`.゙ワ」,\a゚レ}4ゥC柯偉"ェ9$ョZンノg?<神Xv<妹dオxJ,報mカTI齶ラ9Uサwy3ユ/ムBヌ6葷=・Xzス誓ス(Dナマ [Dチ |\、黌;峯ユ誓ャメpX3})ナc鹸嘲-」O登ミ7}ッ庄?l擯ォE0_o<nニセQュィQBタQ敏レソdテK陋ホテa馨エコヒエ羔Eルケs島y$惡W梭チzユ鋸a>ミI[g瓧XcyAh擔ーxNDョ幽0ォ鏥ェICi]サヤ7wエW 3o&オ,サ {─癢D=」a?8'ィЛサvァvZ士nDミ2fY鯵レ#邸 -0ス「厄゙tラ1(y嵒�mエコGネrコVUコケ% 軸/<綴~ ョj抛%sユミ ヤ矣=邇e「ハゥ4<Sナ7ン舞F餌Tェu゙ソ`ウ>ヒメシイ6/hタエ>ロ、メD=eモイナW「Oォ%*糟衲rKカ<k・aニ?枅4ェHП5M$Nェ 衞7徹;5hR@NKa帖悉Jオ鏘@`・我/`! -メnラCMネfd5僅%坡渓」スニ衢Jネハfトi4、セ痞ナ」・*a^ッネユ^螳イz]= cワ旌イIフオMNgJ13ヲFt懌オ8」&3キェ1伊hャオ@キ%qdー剱=Z撲Sオ+3m?ヲン拆ャ�嘴WォトVMナnセヨ]レタ0Bウ;ウzT直$cエR渉愾オル08嘖ィ&>ネ0T9 tbテナツ1)脈8敲滷丶占xiルJ$[〇:黶\ヨ裹ヲ姪、ユ7)ミ/メu杓Ry!ユ淪リ鬮dxq`リ(胡+V@9mO゙qDZXSカ+;2答ラY+ケンフコF\6TqnワMVB蠖ェゥト屯SユD?Yナ躊G舖QP7Wc:=カL,T`5ォ}v�。テ=j'O7痴{ャ9ォオィMミハ3 ッt榕Lネ}淒fミー##ム`Oュ糜ni80ラィfセ%Wセ=r.F9ユhワ$・ィ-.K毳S -tウ]"Eトメ}ヨ稗-ロ|ms茯ア5ッUィ雀 サレタ@'gf|i{粲cpЮEア^Lユ湟$fLミ莢イマ/槙n3u,酲)�3Yレ扮S4|RNテwLcハi゙「@WSAB螟レ浪ンテI^mリ)}堕(健\9&u H・W$5{ネェ灘Pェウムr:4Uレ`ォ桾beniイシイ駻6"ムCソケ*リ ?ョ&コ蝗YユD'レ07yス#ヨ c-\邨碪フ9刄dVpjチミ晦OソcdmnAュマ繪モ゙ハiT鯖XヒォPル^-"花]雀|際シe釁セYs莓Y儚xE杪リj、ム慄帛\ンー9ヨoエ o!モGXz]8ォヘQf@jxz聞閧コUl9ノ移ソイisヲ~ョヘ7 EウGT等ヘFRhユiヘ�゙=゙仰Y -)メッlレ ロヨ=坑b*ヘUムルァナセ -レ惡bzQ顱d鏘ぐ( <]Uロテチ!ハノーdャ愉オ賢ュイ[ラXf癌Uyw$ オMY%ネヒ>ノB碓?拡ヤ~hPヘマ[」dxd-Ohiuン~カ<#。|ヨifN>搬ショ. z6セ楸9ロ霤エ<eァ・ーRュイレ;[EgエメJレ;3貽癶GヒN枅3ッ*-['シD{?ヒBォネァ17dlロHケ潘ッ'`gョ/ム@)サ%豹 -トヒSSQI.チYオミーMム.=hsRロ腆^,'ラ+h杏H。 %psRュ艷hッb;胚Y+ニ>瀰F=) リeE,uXC ン_;洌.ノ錵ォVョ4メ5、ア RB腟オ「 ワ\' ユd穣ノ[シ~C3lcicョV萄ケ レ封テ「1 7怙渊ルク9m秤ヤ8-$[アGミ餞舩RハuレイRオョrwミキ苞ウ矧ヘ絨ル/、<ネク|ユWD鬥Xe�';1qsィャq(�「pDJo';・「チ攀30ャルタZチ4アュユ8ヒ隱佃R$#クMT楷\cg矚vFヌY[ーH粫逢S7フ黼ツ3・2U狂タヘi`クエe品ンテス0ヘ-藉ク9カ9エ](ォ洪 トフ[ojヒェ?ウ燥ケ]Ky $/cQ績?BトK丱タヘ。セ]糘H瀑髑 ツ(オ哭(。 -qヌ$2xナ ╋嘘|鹿UォQネ<材ォ゚CZ ィマヲヘYタ^テ涕ミ)'醂j]憂゚瞹Hア]レヘユニ#<ホ膜カfC:コ+ノトlNケErfカ)VハX` 朿Wjム@ツ佳鳴ムQョエッ! .vマ牌zl{イS87l山y゙AルiFネ -|ヲ@カ,洟i%コゥミョ,ッニP3mンチ冤オリ愆h觝ッmVァ+ c:RY:ッ弑6ァ カ カh「P碌テ釧Y&Nロ'Fb榾゚T%旱倹虧T/ホアas"カdTョユャロ剖<"ソ鍍ツ襷@タP5v等1]ォ 周jフリ [(セ'「T!eル|獲Iゥ ホ皙O緕+ア゚ムンョ骨屶ラ#~ォ姻サl・巣靖ウ5ウfタB-セxd姆]沐(T賦Yェ挌*Vャァ・Mツ覃」cZフ知泄ヘァ3EョS| 瀧 lVコDモ#TA|ZVj」ンーケム「*\;MZ@セD」2リ( mタ覘-v\ツ覃カ.4s勒:;8ェ{F」ネ^ナ@ヘ)UヘRIロ-檀sレ是遭Rスー+ムシXハ\KSル;cン搜if獨テ@Vキ鱸Z3G[LiィZ(nQィ殷スニmフRッ6J0]W頏オナ6IvmニルJh0E輟豢タコヘ贋{KシクmミENートゥ。c yitGロ,スNVヌヲネ nl考シna Vf匆aeL"コ.ケセヲWYUワmN ,絮hSセ"氓ミ2モN?悒。=カ_M5 <。Z s睛レマOワ9ュ瞰2{扣。マ褥Rbdヲ8ア|テニ�脾(ZEム齟Cチe9テ需庫yュルテl」$'u--ヘp8ァZ?7(V萃サクョ裘ュノ嶮タCナ凧 -ルネ=^>+<愃9ュXw#?7シ>_サX2ョu藤kxpヒ「N,谷8ェカvSワ裡oワェナィコE)レニモ・ネ@I侏M0sケ言zシ珊戎1+ -gF5゚>トgソレzヘS38:|,」ゥセ}ヘフiS梨 悸悟4ィ頸・[議B旙f蕃I$;ナアアレミ / ヨモV R2#ユ~P1Sミ。*O+j -~4'F]ミ]騏:b(クo~V端鍜eVェッ 碁}。 n嗄テ貳_%ミI祕ホハq;カコ」ヘ @,XXクxチqミ誥-┃w送a9蝌セアヘ。Fモ册。・ーョμ!xyqOレ"ノjカL|ロrGゥB6ァァノSYナォテ|`莟aHF↑)<hレ jヲ78ェy_ィ ヌ霄T剔0,ヌP cタエ:3wケgPユ公瓔゚弋サ`sDリア$lE愉cレカRzf筵ルp4vO -!ォ塩2_?kォ]アハ7)I專JアホハjH(*J.@Jミ,オ梗匹S-T:ゥ;tヘ^゚、ヘiラA悽ナ袁;EニeエIMウナ$hsィオY峭5К。GsモOェ?HUォヤ>hs4EY,~<「o -S. 41%ョZ7ニ、af~ン荒uィ入f|`ネテ/Kレ*  埴ピ從クEd0Tセ瑰mミ覬G(FK(Z1ヤ6\タ?・岷J!ヲq<p圓痣シwNシテユxアホスケメメDPB・@淋ロ簧゙レy+1]6ハ。KーCクd7+`イ降1@JZN4wュウ「ホn「ミq -いkヤァch�ニc5JQサ{&)^Jリ\;ラシテ贊タ.>Kェj針�Nx穃・mリワVァW"`鼻、vセmx~7lN;゙i⊃<.ワノヲHMZミ]キユn棘(イラ期sユ[D沸ワch/橿・XrZCオハ#l枝"MiZノS君溥4Aa宅ロャケチヒ;=a。棉MO=糞6膠ッgTィオGタホk催ゥリC;ク'ハヲ亮ァエKマtェテpUNォ0||ェ6gッY釖ユ!n慵KU監セカis絵ー、%モCG儷;フ娩炸Tメ謌メモhsン3`Zfイ逵酋`i< 龍[A#vコ8アd鉉イシZ8w&%B`GラHメ彙ヨ覗)uK[kヒ苜ュ鰄jC1nsヤ慓f14クチ神& -IX/キb裕輜fウ&J(ォ@Ι-gvo元:(3sd^n,モ^ヘAホ矍kヲ:z 袮ェ)ヨFサ妝瀛b~_コ頭雄モJ榕ァ淑,SナB" コ亡@PP「櫺惠{4ォ0,cラ下| 2瓦3# n豐?咨9フ_(#ャホVh露g+1哽筱[�决"ュャリb」o朏#オcィ鷄R ma[ウ^7サコ[、`THNL巒襴I牝 ?録 。bAソfセ�\睇ヨ$メmッ</セゥ$リオS\Uュヲク漲xJ3ーv#久5/ カノ2Eヲ錢Pル*]ゥハUオ]「衝s睥l瞼]W<q%xeウ罔*ァ0葺Fモ。Rwゥ・R徂κ!F"p<7扼タワ峽ス、:I晃ェーA!混 Dgヲテ&。贊r剛ニgY.O9yVWvア゚ミユー|}。ャヘイレ〜ナユヘセラェa[醗b_Vケ~邁u粤<"[ゥVキユラ1 ク(ェテヨ戴ノゥトs`ヨ�y恁(/Pヤ迢T贖シ:Sォ{mk|+ヘ峰? イワ8*;"TヤNvクケ ーンレ6,ゥスセンш}4GWウQョヲルマヒムcヨ:j梏a5渫ン捨}」?母Ub/莠Ngン{pヤア@c齢jト筝吮]幻qム*ユd侯ユ餔[ハ[ユヌミ(= -a蘊@;_ロ;セヌイェsェお乳シハ -]Zェ擣YZュ迫%]ヒ Jィラワj?イz降Шリ21肪IB"ーUU・h標。梓ロ匹FエマQXル`互レシ筥ホハ弑_h_ヤ7"8メNッr&; YノjヤY(^ヒg xスソム施ユ�リ2 RUゥワタ」嚶*Eネマ ゙7ユホL仄テ仭 -晁+W7dr9櫓ユホ|湎s゚.ヒK+ハ5鱸ュク*")ェ・{Vシ'ワ袈8T;S輕毯ワハ 蜍キ3ウB愽メレ wT.ィxソ嵯#劫*Dfム殆Zヲ島麩」卸繃碪Wh。5ヤツ4ケ7j槹ヒアサHuozキ:ヌ-{*ァ櫂6eDbY"ス淋フ#ョY茵竃レi橘 蠻ルCミ鳬3繽ラ (L惻Pクgイワーラモヌq綏ハレ呟ーカ 鎮ケ -ケp銃K祝v゚レQZdナ=ャ!丘,+~驀瀟璽MB、zラ^キnR|ケヘ>2カフ};JオBJ>銃ムtォヤ鵝e,砥ヒ ォ9A賂',5ァ(ヌU!ンソ餬皖ヤ�cOCハv ASオァィV鰤綱ヌ呷個ー徹 マス&慚q甎ィ蕎ワb凹JSmQ,ス壌aシクワoェ薔xoス胸M痣フK蹴b゚KDュBQキlノ-fィオケ鐘P襾Y)曚ヘ <C橸< {挫BチFメニ眞b8dFサャ贇(騒`ソ紹詐モラ冉D゙ ャDケL:$シ逢者ネタK(アーモ7<嶼ロ鱚5ヨ[ホb浬gラjmヌ サ1H軋j蠱^ZセCゥcカJb?0ャ6ュモオ�A 裕・パfRメ<8ャリ抽|ルNサ%テ倖ルLyッklハ-S*aQ^KメN %ユ湟ナE.匳d怪7ウネ蕨ゥ p'ト2pJ$ケヌミ1 mz臭g>゙鞫h;ンKワh)v\5qdウ -E苺爬8シナ(」克ヨf8fm歓トヘ+C・ヨ迩ンイエホエン。F|y」K+[モWpcレN二ワ捜ハ綉~R<・A仗cソgD]1モpィ6ュロェ夕n蚤ェヤ エj}-/aモK`默サm+ケTU攤'Hxシツ,ヌ -uャ」Kェ5rU艾レYテwンd;k=]8ョクァb8 CZレ繧ヘMカテ羅ッ.H=Vッkミ看少ICッ ロ8ォフ蜿リ銓カpン` -ュl∇6ルn�ミ夂q 妃ョンjタカメ6ルnォハゥレ誰・bM`シlフホ�5#*ノ璋コテtサyk%Gn^ヲ5」咾確赤!Ark躙?ネvリVミ\>ス曹(z゙エ%キ`*k楠カェ K1 ャbI.ロセ;ウレ}郛アg�・zャ0チvR3」リNg&モ毒,5IKk犯ョ9:レnォンaXレ`ア'[L拾w儼ムヤ#yスd3ィxp4ハ: ロ{Xス偸3"U JHモ4 :レ6ホエア$タェkサA祓+pJ詆ニsク旒2PIA^�;Qo」ロx;fMレ宏Bル龠ォ]ンコヤ抉"Pj!カP5モヒEV!ィニ=aw!軫カF*Mス{eニd゙ムgUンシ 。セ3g|懼uヌュノィマス宮ロスT\ワ;ゥソP+E゙刺"WアM~レ沒{'フ縊U6ョェz゙"uョ 錮婀ヘ3チwU=エy・/Sリlル1xホ&三」38ネwRセルQ、 m沐;チァc5^irUE゙」カXノ:o擒/_ツアwbbヲトゥ$涸Aヲケーw ト髯2-_*uオn\a -'N麸6穃cs、9賚スCュロワ;cナ9煮オ憔;クャナュX -[^2%0@ラ?」9クw}贊 ン。亰ュョ|ヤ煎Mエcキk72ー黷q5yサYオBセ+げシモェ怠ユオTヒи眥]Zz. P庸1D゚,rL$/*盥ラヲ/pゥjo"゚鬮6$゚A2FNン{ァ_ンレn彎オ腱>何&コX*.璽學キ簿痔j莉2ァソ帰セ+xサ7ヒァ$ョh叮緡ヤ Qエv\;42}AセCゥン徘IY-<NヌK黎ャ捍レ?�ョ(R\ィYfネ攷ツ^LT1ナゥ4Zネ]Rツ'ョ竹ィZ~マ穂; マ -#レハワ;)ソKV77ヲM+゙j0KH'ョUjOロ&゚オJuJ]テ勃ョ倒ヨWル;髪キMセkQキu難毀j><l}'・Gy仭c。ェ゙;qqoラキムwュR47キタQ3徴o}ラーx^+ ポエc -]kエ=ッ?']^WミXCj畑fー`5向ワr9烱RKW+ \,7フコツ貧T椚?ョゥァcク (yキW道ァアvVヒouS5~+繙゚IOY~ヌq_o~ラ間qモ、靖ヘMソ尼 ン、゚5Yソホ/Mル骸トソォVKyPО覡ス鑿77メ8ケ uw+損鑿Rヒ リ敞*3サ・T価日ロユ坐督 廁;之ラ坐ォjァxエヌt(s胥j#8/]報_k胥 X劣nニヤVNン。z&ッイチタツアvオ?Nο[<偲ロye胥ムw、Uニ赱U病-6。NスoJ緝ャヨキn旄:9ォ -0赧サ;ヲ[dPシナ脣N�゚pリ7PンVァソu,RkァeンoR8{dX鞜q弖}O7C3Zキr糀ユwUa慥テ-顆Dエ0ケw偏�JWeヨ點ノ(ソ]赱Uェ孅DUテ:+WWキI籬U &゙wタ鏗e_` 紆サィヨコY}M、vロサy`テ~y:慈ラ^%�<ゥ゚ウ慰Ia� -HEk%gメヒ赱U|Hhpン゚テeフ咥Iリタw�紆爻"鴒.マ タ#�メ誣、イFL�PマGl詭澪ト&ミ4ア靂}ヌァ;9/wz、ハzヨ赱縻゙コwシ7�蒐ォ タ#fキセカ'v鬟リ゚N�ロル nGdテ6vY<\o1遺[ヤ2<」゙ァXwD�sス雇f2アuK3匳ニクrカ�<"セ。PDトム嗄~7�マ漏<NHIェクァ97抹ラhラヌレ2汲獺ルァナ衙ソΖ\ア医Tヲヒ入サュ戛サTウMmsセセニ゚5ユ"ソP[8体TNンV'ユo談ァニコ゚鐔キW-マwムMAアtヌ,ヲ>ヨO逓;Tヌ珀。<Q・HGοIwチソ日,|キ@チe,=UR蓊+vL:*鮟コAニ+w牘ロ kM桾wケwbj oヘ4烝6脊k~(鷄=p/メシヨZd」墺゙\�シ/ニsァoト駲廴爭�シF'ヒ;6ル,zヨ]< カホ耿J゚ソシ蹙タロjAvゥネァxo>7Oゥ帯O普゚&燎 メシ�x2x儚キ}ュ タcヨN'ロ四湯賓、ャサ"獻1゚シ�xソキケl�曖ンォh`;左e?w倹<ォ~kw(nォチソcfユ�<I5迦�<セ/S�l"-xX'ュo <Suオメヌ箇¶ャpZ春"c0イ/hN蘚瀘5xザqマ ーDメョ@瀲C゙w共〒ロMタテe^d,挈ァb凍ヌ>ョカクG}m゙Vョa ヤ$5U抗6ッA5-&5゚ヨ77ッaトY噤・座ォヤRォ?モЮ於エMサッャ.オヤ|7ッェhF艮觝-T3ルxア~!*ト♯カ?佳3・�ゥソ眦夬0`@0S゙3ゴ%ッ害アコ。(卵~゙Pャt埋゚降/^$レハF澡]ルセタ慣ルZDN^%轌ロ(ヒWZ゚ <カig父'uL核怐gハmg:xUォ>f澡Mウ/3v�wャ宦ァ}MU>xS6P゙V仝)"舫b4ー,-ー凍W_・ロ@B9好タォ7Oj-ウm梍゚+Y6ッメ低ル騙/u刑逐'5x1ス'Mシ*v}ア9ッNEBワ{ロ -ミ顧o^e=ニF潛a髻シ5<Tクタ耄Yk"pB'ッイ蟀5xソ粉eメキすユ澡7賦゚ョ*>A顰ト澡mリウェq・>ィbレハノツロjミ*ゥタイ!wU ァルナ.uヌeハハテロjタ*蠻・$ 鍾SハwテPソZ6 OハoLュ'・sナN^]>R& 蛔゙ テCy1タ9`xRY`' O_朴RB*<ダルマ!{ァLテロハ テロjタ/フ}ァ}xy譲b.ス5メEsウ疆{yY(jアVB拿 疥蜆疥ユ`xMヤhカzテSタ7Q'翦 Oハ1Wュa゙0<ゥ6 藜}テ8>ー甼eg薬qテモEエm\タカrツRM槲襖ノ%)wuメorテlB^゚q會HU6テロハ皈+%Cロ昭!wg#vタx鶇乗qェxハf)サセ蘿瓷イイYx(テ騙ク5pf)f癸セレ,シJ漸/寉'71寉ァッ詒: ッ*_リhs^* oォ矍W蝸ヘャ;葯EミチツS茨タスヌq-ッア被WU、�套'ユチホツォ=2JチツSフwレナツォリq.k、GhアワUヤ7 ッヨi退}\UX +ァ疥螟ェモr-}n^eャ}゚ G万7`xR跿フ テCauツPkモ14"懶碵+ァフチzgロ0<ナ窺$ P6  WI,Iト拊鉗ソ$5u%'ムャァ{年杁簓O嶬赳アャ゚サ9xゥ\シュッハON人7ゥfl?ヘル襄ハ-kS苔ァ6pノチK裘瀘58xッ{m癒7/粡珥)ルgムケ珥)fS10x -周橙zc{ヒ;7O'ョム゚Ι}゚oz7O;ヤムシツフ_8:ニ獏nJヨ>Tウ喬ecカrbカ<+臂末 ー・v}ォ エウ飫/茎dx? H8v┰S ^ウヨホ~c耶_ン<惨<<1xRlィ<(xMカ�擢?ァ珮ソeォzァ琺齠Zサ(xィ, -ι゙経clソシト瀲7ラZ'・ッ&昇ワモ挫モCTロ)Rべ0-,罔eゥン<ンゥ;タ瘉.ュ5o e潜rっSネ鑁bーx滂ニ澪ェ ヒg}字アJマn -Uゥ嶺}J(モッ/ルュg斧ウ$O鍾ェォ゙ <Cm範チテn\;萵ムュリ鯔チンUを(;Vャ=@x広7}Ud%柔ヤヨ赳盂埠s0q「!8x゙ッl%毯s慰iマ<尾|寃g寿ン<ワ?Z怎g“ェn茂R籵v)uc蝗nヌ)非ス゚挫S$7<1x`?Jレuセn皃_yRHソ>ェシ -i#ネO$Iチ汲ァミェウn -h%/ -杁ェ_窒Gコ゚ヲ濂ルオナEチ」"Aォュ、澪uセIPP^% I堤ン<} エニ循'^ノ齪M;ッ?スマイ&ヒ募z3チL5H)OクG0モM(ィニレヤ tノTゥロ*AISゥU!C<�#^ -3孤 ヨレ{m゚~NヲユU.コr"ンウ3セ站p゚セャ サロXシFpメスSl朖<N・スフチ{; k|<KMc濛*專許AレP9<モ;-ヌ# -軒S -,癆6ムメン<Zッbヒエ4」汚懷ヨ_Q8」ホモェ-wメ孫|e]0」洽レ(x俎 - -・~ケ"%ェ0モウ:j」瀲ソ恐ケコ\恁怩GK-緬ZゥVJ 6KzSf杢ソ投5蒟\ソ・�jョ7'O(ウキg0l/ワ1xーrセ =`+チη。エ+ンVaha〓0x<ラ偸蔀」キl5F蔑ウ<゚チCフウラメw シ[ニ{ジ9S源0x(y枴゚1xーイx+0x,コ拆ヌBsシ「獏Xル<~W_a`i蠕v ハQ e. 枸Z]シハlL9w開 ^eンラシ栢V9ヒ蔀C0Lp*ウ〈カ挈ケフチォ垈Uモ9x 酌d {。?罧gスv^e@Rシb{,B攷ヌタニ}キツュチケ�瞋Rマs'眞zLヲ8段ケ[ マホ蓆コ 矣ハッ鷭(<ワ1ヲツc 魄 WY悛Px 7「(Z(シ侃ャ@ -泪ェHxxマ携ンzL!`kサLツォ庇ャK栓8&:=u#!ォ1-N食xUDツCネ -xEツォロE C「<サHx浜ぅ,^Eェシy"矣Jjケ"1tツテW勤 シ:.u フ}K?sC甼f(<サ]ホルォ免ツリォeG矣J-#寄陏v癒恚vE{ュメN。*ノ瑙Z(シ -B_3R; qH/ヌxルHxエv廸$シハフ}キ&=貘2Xコ選x包Suォセチ2択jフチFツォDユ_カO% ッ駐*^ッサ(wッァ荒鷓麕ヤB蠣G)疇8p枉栓`=yゥツォT◇VCCI;Zクホgャマセメェ殕8。溏,V湘t*-ャ%ヘ <D} -Sツテ哘_7@xネ嘔ケ択0イ?Hxィ、}懣セHx(フ{60蹶F!gb.:lセX&^6ッソゃa.:ェキCカクZ/4<NW蟯pCミ*・エr`イ3hxネ42オ碣ヌコェ5SR^サb縱 ヒs ┓トcq「レ_@<ソ2!ヨル;^ノ トcマN%xツ>ッ\@<xウオ{粃彭Ylvoコカp6ァアォ―fXqi]ラ AモツJ ト」包・xノロワmメpgfソ_6*^5Bサケ嘩WxW鈴Rー0睦P<ホフL -蓋ノ/eA*YMgロ。xf箜「ワ┃ツa3.尨x むナコ"ル*^ sa[本キ圃mL<ャ+tAiャ1K0刃ョヌ<w(ォ.*・9浙: -Q潦ン*&2ソ`無-*^ュ^KX<Lホ,JX<nーエ穆xk垉ツンサqhe%クxエ恵ムヨクチbサ淮ナク.#ル齒{q`ケチ(o?k焦ナ+ワカVjYvoチa゙クxz"v~鈔 -wォスa孰ケ/K姉\シ扈-ク\シ> V帆 クqh螳N\<X*チナュ樸ニナォヤ}w#|9マ,ヨ*T<~仔i「禧d藕%*{チ8f*z椈mNヤAナ+LZ,x鐓{ムエウュ/;rD括オマz訝粃Fモu&ゥャVネLシJ8<A2ホトォ畠 幼AV杉x,:タニFPシ潅タA*ナレチ ナテイトオ1xフr/(檠゙g゚。x蒭K((<wKウg(^・ケj<Xハ侍+謔禧苑4帳xf拵蜍Oヒx &^イ 烏#ァY!hケoWbE+Te'テーSヨムコ(モRY~$詳セー<7ユT$姥Mイメ;9ツキソ躪L<8マ棕L<Z1iKC -FL<'メ7&^・陜 y2Jフ w ュ3ッR井 季サ<キ7逧wル靭モモ@柴C*ハ&lG筍豁ア#!リ6セ靭(x&セコ靭ィdE諞トCイィ」'靭蓑pH1オQリ}_ラオ#ゥ:+雇\榻勝<ナソ休$XKウ'*^#娼Lァ粃マチヲトLナca!ユkEナc0 5Rホkァ簔ク驀QネL^Jテ ,ye(圭ナト絎d胼L<Z -ナ/&^c.チトCzェlv&^#マ,刮ヌJネ9ヌb禧jd拂1Xチjf禧&澑渇OZx-ホオLシVェ・gi^Gfiニム拷ラHリラb粃当ッ{hィナkH1餃<pヒエ演ミI61$レB笙。/"栲ャマ揶Gkイu 訳nm`鯤RlDシfR\eレA`メスxxE\刪ラO "ッ稘cュホレ悦d]リパ9妄J mナヤm"秣`キU0XDPD<ヤル─悦ワー^Dシェ譬 5ロ』忤.ロ[mテ;刈_瑩リM2[ロqxエ受\<<X7\@<Xレl躁トcロノ}殺トウ=j+d$コ 朮=ヌシニb1ァノヤ@f禳゙ワテクヒ愛鳶トC*:草ヘL<岳2k*(榾@P<vU莱 (}ーAョC焜ンズ 拡ミ螢P<4掌xア。レア+6コJル。xャ溽K((柁 管ォ・硲x lsA6Q勝シ祺やアW*uAXィホキ$CHツ8Y茯セ -T崋気羅+ Wト'揩5F ッPシニンw(. マ5mw_P<fサケカe*BWオ旛「箜Qbjナ帽ヨ`&-SX積wQp躱ロ「!`<SH0a乖xア2ムィxJ」gヲ禳甜u籖8-゙d>おx<コァ弐Tア -脣;=マ>g+「簷ツ-jニ1ゥNンq,v哄c稷X鰡4!トナテoュ:ワaーコ![ヒ慟Fニ3゙7ヒt恁S レチxク -2マャ蘰聹!X Hエ;常堪スマd<禺セ」ィlコ0ホニ。i低x碕ネwツ胝餝Ax<゙ミ_オ碵R\,%9'ツ綢?ムアラー汀チVテ罍ィ碧タ綢スヌリル閂(★ヌi)wメP褊ノ猿ラXモマノヤ騙H泓AモtF4cl」翆)カ.Rム*51ノ去ONオ奥ロヮ�遵アDヌcs6[i-ヌcク唐リxo聘3Z渚ヌPm;$l<V6pフヒハ渭林ルx~ホニkG-炬/c{圧ミシ・ -JA鞨ー5hi駱 -トニウc弯オハクYメl$ロ激-Sb翆2fウ拜5ヲs剿6D7合ケルェ、2ッア0{ヌテミホ^]゙L、ウ}*テ^債B81ャヨ[オ寉PIッ6inテ8ゥM`t<タ gィY#}Iカ!ムhe晁xエエi=kヌケ0l|<Dヘノ訃鈬痩ヨ^zヌケ齲e」絏゚ 」bヌ敘エ渭ュイd[イ:粛×&%Cル8v沫Lヌテ$? - g,C蹴箏[v鞍ツネ秤閂エ慱S.ケ!ルヒ[ツMX5flソ耶5ッuト且g鱆ノョヨウ!ム剖t<鷓テ|堂゙ma 雑�嫺知鬚%K~aマ8 ヘRユゥ釦Jt<:ロlアv8q:雑シコwホニcスlb耜X鵤繿チ攅ミxヤ8F ニニテXbュDー?龜ゥワ2ヲ|J┏ッ -+カ=蕊フォカ搦G+J!ヮg"/bfνハ「1リF劒Lヌォ、,uKrルFィ斬ソ縡疇bヲ17ラロケ閂エW[t<~。ョ克+C劼1條rロ羈e´ヌc然5「絛:ラス閂ィhLュd:DE5-檗:ロ(マ":貳mヤサ耜Zォiイ2PBヒ=Nャ iチ!」テ┻ウリPリュ復(4ヲ|zuKdb)Gハ ノミxx詼 桜Iセ献yYkuIhシハ *Bニ縡xレニΗタロミxユラB1面F ア`。リニニC、ヲrッ奏q%Tキlツネp<y-C0eNテー(Vx壟xエR^Lp<X 8,リ!nl<カ雉戞l<n{禽C苔Fヒyマ搓ヌタ�・ノjィツEeアリx゙テトナ蒋ケ)! �dシ;qd }k'0R+レァ#ロ+'*m&[ヌIクフゥxfxナ[Fg糂ヌーuQL<フ・ヨf侭xエイ_XL<ZXK/&,v刮ヌ-b鞘,ワカD拳ア&ア蔓x/0痾6g煥xヒ塚D鍔。xハウgリ]ウ^篝CィハチAG益rI 換 蒲ャ祉`牙カ{0|qヲ粃椴障サホw チ&2ッQJソ垳[!vムIm L抑テ1Bl@{ヌ穢仇{c!椛ケsg耜Zホsチ`ア于炬犀Vスp<ニq 夙ヌcヌ!|ン)カ*>「ソ&ォ#>゙ロ咄sョレネm[ムh跂=橦粛2u<^-Tソソ}l眉レxーZ[・x辺ヘャ  零 秀ォ&gd瑩4 楙_醫ヌウ22ワ(ヨッ但カ⇔ヌテ.ロヅ粤!ワスセッ貞臆e跂ア -ヌPホヌ」e:司ォヤ)&ツクjtル?xエ廸トJタッシ桙順JI準<<6}d gY2 マャウ/@ハホ&尓 [徼X。トョ�蘂pPbi晨剞G5嘉ルヘLネー:ー'@Jh,・yKネ!辞モ8ネ3ヒリxa酋5フ 順 -&ox<ォラs碵濮儼をxヒ提xヒ*<反mヤアw蕪L <ンユ9+ZホV瞬Tウt<Y):-&ツ翆rンsァ聶&,:^・Mk去=伸ヌc:Nヌ」タS@b瞼 9躁ヌC 5ン去嫗ゥgム%1ア剖t<悶レ瞞;ヤ゙ャcヒt<カ�ウ・?璽.ミXpシeHlシ0 -合モ8xミuコ二0*ッ+擦G2ォ Dニ[豊ニ3+v"罍 -ャv+帰72ワッ椚埜ケスネxT<]ロ8レRゥIゥ G絏ニウラケミxリe<」`=)ケ+4,.-h<υフ 晃|.6ロ 3C=。ml<フtTイ +kハ8テ牛キ,剄流d聶L ワ゚8リ。黙xシ杓ユxMD�メセ雑 峭2マャラス炬エ!8ハ2w8^・R0U 紫5墻p8゙イd8^イ:ッ2゙テ鎭ョン [w2櫑鹵楾 -CcXx<ヤNョア剌ラ├xネ」@-[ヘセテ -agマ<"=レqJ\Yネ[卜2ォ�y-`ェDネ3アr)!マ4壓繖<^イハx香ツマT。\も;KS゚;ホゥケソqワxi鈬!Up詳w>杠サャ}qョメoy -Z.Y恟ヌー杤鈬ムメ峻haH1Nィ`丶 -?pA璢。陪ヌ�臑GWチ36Jテォ%XネテPホQ<J<;油Z鮎ヘツN|~Ts原T鴫h:"-鷙|睡瓔チ-臑CdM<Xl(@^イ$@杠スヨwDナ膕}ナ 酋F^|シF 畭!Lテ~Bユ{剌ォ9鞘ンヲ/ゥM諧 %`ュ「Rx<Xヲノ3:症ー4胝(PテLシxネレアミ3xィン罔ヌヵ:aヌΗ#゙x<X,鎌xエ槭^x<~u。酲ウK3|2Jdッア%ョ`b]Rン:Nxシニ5ョワB゚Q往サロヌk衣Sロヤ就) ヌ[膜ヌ[V碵ーdク&クwT~(ワxィア{ヌ疣アd@シdI┥e"ョy軛5e(2#照簟7kS-゙U.FロPヘ<m$ッヘ`N≧レ賽ネテ鳫=#ッQZ漲゚!@ルミ 3uVァカ苑キ,剔キャb葮=yリ?鮨3PeeェイZネセヱーキ'3#ムdc宙舵-K臘モ摸ネ3kサ#穣ィ#ッ。ステzn#VラマpF,ウ8室餾クフネψg葭ツ正y蓊チネテウ、yク鋼ケヱキ,苑キ恵1スマ&ア8パfF-テヌ侮C裼pyQg!3旦ムJXwハ:モ8スPgシシテ_\2#ヨサ8マ -ルェwv拒ヌb含yエVXsQサ7 凶2$玲$殉フ@:$o2$マャ餐6ュ]ニ0mS;縮イリ]=Mキ5サ0リトネc7ロ3$"ス $ョオ:仲゚PZ5ト\@py8$廠PJサ樫ヌハ+v`dJサーミッ耙}サィサ-K「-ォ(y,鬧ァUYツシ綱Wsタz^Iスm1i(+H-ヨe yエョ薗ヌsオb -喙サヲ莖AノcyヤUュムイヒ(yヒ*Jサ ム.;Jnサレモft\ウイタ膕Iモノ」%読:Jチ 敵モ窄.C艱Q<ム ゥ[エ6QアRチ(ルュ7カ慶"マ,wシエeAV!ィメ8 p6(鉚粍@蒄颱ス∧CL舵<ヨマeDbs檐B莖チキ];!br!。8[|冠孅 ネC、1カ8 'モテt@゙イdB゙イ -燥f!"mュЫl<\Uラth^]蹌菴 ]ホタD゙ 7]租#蓊]ニニルャヨ:xィクA=yニ翆銅スc拆"セC~Fp<{"\コアタB=ミxd;到レロwツム{y+ホt^ 季クΤIナテ(,レ。xラ4bj00ヘイE頁ネマcセ1ユ症b筍g%5柴cjコv"樣 カト.F<<xヌィ賞px4ヲ髴訛ナツg柆G眞Xg[$<イレ\ <惡卵9xン=饗爍/d0Bツ$?>3ロ=>wg燵N^2oMニタツスクvィケャッ鑿ィ"Yヌ\ -ネシc;リミワ;窖オーwネ エQェ/タAス{ ワAmTレw。^g]ネ;シ/轌.臂2nyネE;2ノn喃ロシcホL\シcカ;]ル1ぴレ+ー摎uヨ 姻殻WMCaェフニラ限コ1嘔eメョYネd忖イnォ -」ツ^惻Vュeqテル1_A.羣ス槃av ョyヒ儕霧Pvヤ枹卓゙フ短ワャホェタ矩G゚Av]菅 疹∞}ラ サBMユyf疹アハア@vエ\Z サツz釉w疹aゥs) dK>\`iG;ネョ悚} -疹ADッキコ@vマ -銀殘ルH産ノス -$N=ル敏喃fルム8カ@vエコ8v0yl;X邊,,緒_ヌ也。拂Wミqコ'3dbK綵 サキ浄ス5觝`鄭vー」イ縡Wサネ爺qチアヱ「ユチア8躪サム=v馨!「/cJオ~モ 0迄)vィタ; ss#エミイ サムmーl;ィホ2Eー」 ンンタnXル諞ッcY9スサ nッ朧レリuhu坡ミuHAZk藷PテHTラAン堆8籔禪Xdィ0djン2z詩?e)廢7オ!2"N ;gヤeXシコe3\~ヌeノネ゚洲lャ:「Y ウ゚5莎Q%gPサCョ oNメ臀fLン8^騎7\% uヒua「NvD曚f7jヤa}>{[F囲ア)Ixコ0d:ン2: 」WbモAiモロ蛯Lヌェモ喜xGモ膽Aョ1酔・+HA>&披レタメ:=ヤ粒tーメu -,]Ad筆3ツメ沸sニメチjスュR+MLa -オヲ-<T:ル5T:Zニ徽G  KW亂hVmハ#フ1庫矢荅2テ豎├ォヤヌッea餘Tロン哽オヘカc*ユフj[X:ェ1^X:ェ6]ュX:Zヌぴs -JW・ヨカQ魏-ム[lWYン1^A鴪店 P:|ミ$yPハニ塰Jヌ lF惶XキリfイO睦ク.ィtエ%t4エ鬧ヌa= ぴ皎?[{ネ\頻G鯱レeノPコeは$7(]aKDマヌQvュ'*]a 鬻價:BミA・#僵シhsDfOク價Gネq・/躔ワ'ィtヒ朝ta *ueZサnョ侈リアteV[ヌ ̄メ嫦Wカd,ンイ -KWーuンQTN#砠tgGq%;車D苓、セ:オZ鸞m・」t叡ニ0i9^ヌV痲ロ?wニモDUムtT=」ル祓:X'eヌ┐ョュラヒtメセコ-「ヘルXeυ碧R:研iK=dI0ェd89ワヨミcSロシヒ9tVンA}カュンホ、[摸、 k0 -H`k捨:}Nテタ|8ニB1&]ケ1髢UL:慂エXsマW譯3動 ムウM?ホカt&@4ホ JGノ。粹Hセフテ&絨Fテ*B哉 : 肩cヨ・ウcョコAオ|ヲ恭t_コ -「ヘAネ -3憤%U|ワWTコdITコe憤2G[_9k;博ツ悠P:XNコエ・」vろ僮gニV梼泝tナ、羯「 モノナQL:,ス否 &ンイd&ンイ蟹Wケニ+1x6ワt| ロ3RF桐t績bトl」メQvX?=:フヌ}\6Wi菲3侮2ニツ8煦j徽キ,ロD kP -Jpホc,*]!k;憤テ6>A・+u�*゙ゥtp -掣醢ニ<レミ1徨 /ララQ<Gウ.エキキCf(mSカgn。゛フ^ムミdpムョヒ:oク]X'xt0錘柢t倚X#爰wB:)タキXt絢ヌBムヘ[� F%」kDヌY_:dムヨ -ヒ^ヌ。聽g蜉34A1 tモ謬@uヤイs+cl9ヨ遠*蹂9,ヌ}n|.恵マ。リt。 -ヨ 8マ{C`マ゚=9{ョnkcマv渓ア軈aM[ー -シレ9d訛emスリs0p{雑g\ATイア:フルs蚪ルャ`マ秒 =#v?A档∇}千Jq嚶<Gkモル]ト''穰N槭ケヒ9�ホン"マンbホアム=ム跟{q -,ヤ\W -I;fョヤa碆8ェYエ" -ツsab3ヨケ;ョ,ク1WP誄ケ&ケ[σ[0謦%1譁U源beコ#s1ubフム確{0訌iG搴1 ルcVホ{チ丱/sエ ノ$ニャ麻1菊'リq0W「ノルマ xwx(sヒsヒ*ニ怡テHD9ェルキ1 -ラ柾C|ウケ哢ケ]ワ:ヲdヤs oN゙ gフ-Kfフ-ォ1 -ZLクssニ「ヨ劑sー^|pbフチ2ヲ弱」,^ウ1訌オゥB9Zョ^9~b{Wbフ別 -掌sク恩)cnY2c.ャチ佚;ム -wv\).'ケ1詬y・サ[o驚aN/セ彈 E},^:4鈍\偲酵ニ8ョクsミ」゙鑽ーr]事モys梧灘;]蛇1「ヒチツ\ミ藾x」ヒ瞽哲+Hヌオ~-コ\X6コワイ.Wーツsa5Qチ屎7 .p5雕mホpア姪nソ竺灘@ア━螯;簗Aチ軼ツea螯UPT凜固乾8=9^ )qwクpa<E- C賈-」聿89ミQ6ヒ彗鼎・フqヤナ茶∪PFノチネ$ホテyH 9ヨ~;-8r」[!Q`菎唐?ウ]ヒー rヒf 9フe>字ヲル@70]0a!rウノ 9黔オ{GネAオ「s0U69@NF矼ヲ/ン/X -オg`5fzeaLlオ枕キャ「ヌa&&ニ襁8トSm蕭8dリ,&zBK |充9w|f」玄q莽yニヌ!ツミタヌAl゙タ)ヤ{{ツトル^0榧:核Jx充 充VヌアC鮗,a@壮ィ<纎6x;1Y x\%b、Y癰ゥ -ソ =+(ュ8瀁oクBe9<蕊!j8Xリ�ウム -イル桃pN湘Nv論8ワ|ホヲ=蛇^<ヌ1h Wリ+リケヌY゙w_8X�<首ウ」゙;<C雹咏ツヌ6ホE修X湊 修クハどAh廂」ヌUhタA゚瀲7{3 修dQネヌ!乎ミ将j<紫]ホg。>*ェ晢~8ZナN!;ラ・,v, 1o8ヲ$Jサ;ホJ菷v\ナェロニ#フ シ瀲Jチ聒 -gヌ*タケヌルq隲梭W呀ホ擦」5K翌ヌ_ヤネqxn3=<VN純ルテヌQ~ワ縦@ マ4瀲エエ」-x-Ho8Xo xス;<キ>修矧虻ヌ巣1ヒ^*F修?&_ヌ装チjム縣o9レ6|ツ^サコタヌU) - I痛サ W'|bcT拙qー2 -8シI怕 } +ゥタヌムげH璢hsァヌ1凵)2qクヤミ=浹"伸+ミアD]ミ -+杣Y8フ l8){簓q6・.~ワロyXS鈬ヌY(;?ウ・]ト+キ2ケ簓ユテ冬 實  ¥」・+=iニテG C簓ユテトタ6|釀ル=゚汽mD>sノ鰍件+bツ>辞イ湘Tマ圖 ヌ: ミハ鬣ー1圍?ヌヌムRWスS(Vツ9E哨磋ッ$=、dヲヌチ。h[ミ縣趁�Qセ古蝮wロルqPュ抖ヌvAA)チ79EJフUfp荊Vナ鴻aエ{a綛4N鴻{L)3A羃「_オ3「rワホddカ?険=,l。ャホ泣寅セpqテモエA凝Hラnエ8) -XN~\ ミrキ7.({5nキナ化ィエアS竦EZ$ qワ~brHワリレ q渥モS H\aレ彝(宴ラマD嘉册#営;カト1 角韻(^jGH\!レサヤ -B /ハ営d篝ョ宴ムオトムR_1竓zAGヒ]/1粮Du F.秕uD瓧ト1噫モC,ヘP∴cエテBトt移r!糅9ホ>チ暗聰V3q .<#(<Y"トa<t" 守繙?畊^ヘイeヌテa冀ャ鑵l瑩o8ヨロFa+gテA「毓 。皺モ?ィ敲paセョサン・0K孜\ク[Nヌツ痂&$Dシ7&7LG $o踪 ウチ ┰媒爾%g ワisョタンヒI7ル ゙アneラヘ<顱チ碧&甅c奏e≒ロ>麼。ア=n,綿8ネ"ナ降r[ユ゚pトエサ()p臂ア゙pLbォ -P 」:*コ籍ンw「鎚oCI*#h"ヌモ5サアュ°tfソ x0廉述フヨ$@マS野ル箙'ク,mVヌ FÅイC゚0ソq+ミ7ヤ攫ィスC゚PFjubセ!餌n葺o啌攪o・LpMネ7フ-薫 VリZゥ>-Lー}ハUwイ!ヨ'Sd'+ 効mケ机6M ho鏖=虱ケロクm郢ア゙゙幔Zィ7恆i退Pコ悦ノzC -お箴。~o`゙8jュ塙ヒmv5i;耋ネ蹤b -トタ<トルヒ俾-テウオtカ樊^SニVcシ、7$# ヘPgカロUl゚h7*X吼h7famdキヒU\Fセ1ラヘxCラ志テニT7^Ip-38ホ聢nモチmチt崟Q 、kチ{゚穎@iMチ]HナnH稈ツ゚xnフウ限qn ス|$マ7壙t゚"`nァUハュv9曇コ瑠ネュ゚Vキモ.q」ク昊 qヂQLさ筅_;ツ ・*ラシチtッ �nミ殺ィlクuェスセュカス n%e<2シ bvjgキア惴Y_ャォ(XOyキ5縮キュyレ>ーmネ86gィオ Fォホvワ霊Iウュ]趙nネ6ネqdトネm9ア号rト6|5[カ!テナイ%レ震襁敏mD峅憑imIャニロYmョ -炭mqラeBホF褞 オfィ鎖cネbヤt鐓箒こ)md#8(Hロ「ロ`エ]キァモ3「裁yJマ。ュ vト"レ -テ]B.cAhcャSロホ m踵;ヘ(sル5[:ルYKッ観WロZ瞭g+,伉J愉lf掵ルフツF1エ瓢m6Z9]諌F 杞レ`アlc&エチ:Zサ。ューn巾Koィィノ6ャM Bリネ。 Kx釐 mエ"'@ Yレ``Yエチネ$�mL\┯「X薈h+マコ"エチ糂$Oチ'ケ誦┯るか'エ!ンc堂レPユ TキmlラスmHコウ'mメN銃B1,@ B屶珞巾VX閘オ斷V(jン"エム篳6セ69w> ノl乍 マ -Unムマニh カQ“+コ%+瞼`e摯鑞ZX^ツ ,\)6<ャ・ナg-エR牢ムァiフg+ヲm5ぱォ驛マVH弥#ルXサ犁a傾uケl,*`2ル -^|6|メJ トg+l*ラホg+ン チρ>:ラチg+ワ渋7廂lャラ゙ 浙d滲l、=\Dニウ俸ノ聰ウ瘍[2K|カB<マトgヱヒv�レフメホEhウコレh・モ"B,'Ah+ウm┯ツ著{,B[チ=Yヤ4ユ^zケ2。攻ソレx'{E斷Vx」p3。 混sBヒ/ヌトy。 EナヒFhテ$瑩'エaヨアm(<ウ)?レク5a峺mE}2Ah+T%サホムニ援ヒケmxQ/ヲicwu3、斎m0ヤDhテ゚ヨサ�mタクマイ�m肪セヒエ*6@Jg'アーェハキY釘�レ7d=レ,@~オhcマミナO: 魎 ムメ ミF%If&hs6ワl6$ チサラセ�m、2ネmF ->hc;Dレjq&ツhc)9゚Bレリ3f]6^-}ァ hォzメh」ナ&エ胴6ネTZヌス�mャロソ嫉�m,レ覓mRヒャTjク ゥ倍フ$」滉w -ミTKh壷燐hテ0ゥカJキコeシ^厮K"ぱn[ナgCヒニ6>KモY->.z乎gCロ=フgォトスタ レ期狐ニ-Fァ2渭ス悖FヘJ!ルR 奔旬邉チZョ:トgc纈ナ;斫F興2“c゙ツウYzZt6vntイ鑞ルsさ痾ーコウ!ハHfウu哘0ホfテ厩カp6\Mホfヨ聢駘Hーウ(6鑞鬧}φルリカヌjLgCv俥亭l6]ウUild6イナヤ~嚶猛BウaイヘhCウ疼`)zル瑕兩"4f{裼ャカ - -ヘRPNV’テRマ眼栽# はV臀ール煕ウ X2nf+ 「心"ソタカ^J。ル -・ミ�#4%HMdカォロ`カル<$.Y聢ケlテウ4‘C9%aル゙D?gリ゚附ユikAecチ�ヌコャ,濕鏥6ヲpュ緲. ハチY羨 *Z泓ロhk痩┠1t,*-Tァ箆児゙Uマ軍Tト徂`ア@スィlー0鮃QルミャVーヨ)&jv Sイユe,ヨ7eテトミ(「ィ.g隔&,|机 ナ&シ‘テ$@杤ヲイア蘚キセQルXX2憚ナ,.J勢lエ嚀輯ルhi綽T6椨゚; コsRヲミ矯キVルe;ヒFQ1 丘7' ヒカ,脈゙DM{ -%;p昨�`.3妙メy>F:ェXムa`ルィ`]ロリーl42!,-ミ) ,,&a坡lーR$ーlカ ヒヒuW\6Hn[Wィクl�ーE\カdH\カe をヌ(ョケ8~ウvニf」スl徃‥`ル%?鴫 -ヒfユツユYJX6リ'.dヘムネ\6Z<獄皖6B@ホ癪エf」ア敗胎ネ倨杣d6X' 」右 fテsd6k膠ノf0ヨシメap6リ* .{ッr\6Z3ラネeη.B\カキ\Xセ絡!6Jッd.抖ホ.[)杞 .W]読ホォ3載ツイム@1taルA8 VF0ecuャ‘cテヒニ#XeC#ーlィー`郭テイATテ燃ecg薊e+枕V -q -ヒFKw|崘・3 甥テfcサ9"ウ1wモナnSェu -&7鹽6<sエDf{,゚ホゎゥオ$2:Lルレd6d6Z瀾md6XJ剄1ヤ0P]莢]fC{�ウ3ラ"eFウアノキe野゙スリ燐9vナj:昂ハe フ 3|fォTチ$カ"胎リァホR}胎ク゚-ス-2[5ゥコ遁ヨ綿l負;$チDfテh六V"ウ鼈R佰ノl(モヤQ-Y拯Yナg」�Cオ箘qZイュr箋aヌ;$燈ナへュi|63Wカd(6禍Yユ垓2。昂ニyEh」"エチb痢 mワ'2K$゙Xe+SFh」Dゥi%B[褄;"エaoム レ%q$ォレ錨y -カ珂F -ナ(ロ.カマ殞2-Y戳タ"ニ9椚ーm; d>l ワ掫コ]リア%<b売W bSFt:Bチtン7:トラク搓サシロサ憙,ヌエネ}p6Kbウチ`ム`アル`aLacウ1{ユf」チ n リGルノl\eネチl垓限lo'ハマケlwユef.[カス .ロ餔.ーlァ欺mT6*リ((スェ1 ~爺 ノ」fe8c゙セ�イ晄n86fK 3 ミU訣5jリ^g[ソ=セ-ヤラィ+Of/裲凝テtシcャ。9敖v活,ロy[= lカサ6K,レyX6鑢aネ5蹌ッ。m悖-」ェMナ?x37!l}yh qャtM0クシ\'Xjリ゚0G剔k。[ 8シサQタオ!ルミ\ 它kィxaNシ5Ldo=: {]エ5Mヲ レレイdレレイ憾v_ァtァモ捉j~#セ -#Uィ鷭、53QZ!敦`d」@k0ワeaヨ(:9ホウPヨ梓 . Y」\q5Fア扱ヒ[7ぉニムpヨーニk�惘Аcフ(/C*Qp5トニMKヨ冓8Y9毛jキイ敬=|�P)kY-"ォ!xリ(7疣 4」ヘャァヘbー問V[ V+メ>ーハ'=`Z@匝リクj8Iマニ瞽AUワ$モムェ6,ヒ#、5k]Dオ皴P梗pン: ハカ&T85Q[゚ijトハホナRCiァ甞/{HIt0bッニケYオ0d顧2弔i蒐ス jイQ+3ヤpwYオRラヤ``R讒ムxOΓク♪4ーRwxナiヌ\エn・ANモ゚剱6ァヲ1セ;5ロBZ欒ロケ'wクZU モヲヒ「1mVャ凉isムメ"?ョACO婪iワラaVヤ顕8Xiヒ胆e+ュテ G・Y郛k}*ヘсリ皖41ZWオ`i・ケオチメLャネクキ丙hソw_対hFユ.コdKCミ=ハステメフレdモ峻 vヒミ2eケT*\K」・/Tf=FF・1-}マ3Pi0<゙トスPi剌ミチJC] 翌`・aUIアメ(wfツ:鴛ォ:ナJテPdPャ4クス。メ(:rタ@・m~T+ョPi2Lpユ膚vノ゙\・!&~L氓昧ン=4チメ`アュ啻iノ蛋ifRS゚柎マ#芳モアKー4ヨXYB陸!ZoO吟ss・[ヲ・チkNK」Btw8夬0ゥ7 '\ャャi- iコ¨K!ャトフエ4*ュ0-ョ$メXeエ4ヤユオ゙hiaッ!iヌuチヶVヤコムメhナエ4~,餃R杤>'nEKC5ヘォ^3-m'ZZVコHh眉詛sムメ -ツ,c?・-Kヲ・-ォhiリ14*aムハOソqnチeホJ[Й 」Hi9ヘ{qメ崖剴FcY閥メスZ4{ル)i0rf$ニオEI」・カコSメpz{EIテU23lネ Aホ清5Cヌa胙2Qメ%Sメ剖43 iリs&ン i(JイJQY@e9垢メΩュ^、!カk、 -Aメ4.c竜,断V8うア&脳#うフbヨY iーコNГメ`僞ヌqヒ4XmヨpF �#<シs"ix樗i# w賊t0メ%1メ鵬4ヲルル#Yチ?Q53メl・、擦穢クレ<k2dFZイ*bネヨ)フニぁaV6iuLナq(6=<ノタネ7篋瑙n4 "号讀3麿s7FュU3?タ兮oiーX'3メpeI0メリ+ホt3メ!3メフレウ+C | #iヨi<ウ+(崗IC Sッi婚fオip9ャア@4スリi8ホェ-恆ニh- レ魴Otネ4┼ケシッ罌{サタ8sノiヒ*D nP4~鈿Lウ喞ニ]タチHη$IナH」ナZ#斎i<U+}!メ「トkC、!ロア。 Dk醗Z"-Y"mYHCム5彰ミg6ノ.崟テ韓;K ュ�zM"昂ヨCdDZケ @スL&界H[膜H[V1メ -ア%)ッ簣」ミ7mアh耗Aヘ6 ,$ヘ,WjO艸ツ*He{S列&ゥ、陛j&=鸛、チf [F、A].pメミリ愕4hマ#@レ・*d耐!ワK譽q*=モQャ3u2;3ムクルメ,"<チミコ6レ略ォ尋セスdeむ&T9耙9h涅衂已絅゚g箙_W_テsソ{ソ育Oソ゚}蒻ォソgラソ裃~隔7モマ橄Oヘoセリ膰ソニユラウgGo;_}o~* �ラニWソン゚三危_テラソンコゥ ヌo椏Yユ7ヨg^=ニ'ル~マ~ ?ユラソユoワソ゚?、6哢Nア&メ灘コウy轂99vツラ+サSナ]ルG碵X_ピ/ソー釆偏フLマ幢翔V]ヨ_|ヤク}7゚ユロユマ?粧[mマァ_ン娚CA迯v-TゥN@テy ァ<@殞フ稍`"蚌ム?n植狃 ヒJマ肚&d゚M,�好ヲヤセ1トマ!クタミ&巾F癨PD}メEニワイォ.俊!>佐Q拡qョ9ソ痃ヘ+ 漾}妓Wラ>"{(-Vaレ鑷ネ&:2�<sa7P├」コホbオ紂チBsカユノ1 サテナI=D梳゙ウ、ゥ3ョ8-p市qiё8刃奧N<>メqナス+モァmIQマニ 。}ーz7A dゥテマエ3DMg1蓖ュsク?MーB筍KqXユ半ャウYキB`~'4 N/;wb+タイCT崚ケ<ユXzタL!:_:矯 ッ「ロノサムュ粭ヘテ|沾2シxムリュナヌ幻iKSネBd舐z陀b トイ膽C[覧ミ苔金鑑Q - {d-oソ、U溂d樛dN&;アユc$&O・ZH黎ケCヲIヲ[2ロー~ cFタ嶮,|ュ涜セx?!{cャニO#<5vミ誡畝メノ 黐隔IヤafV$<!チヤ`珸&ツ/ユ6ヨ&}DQJXコwJウdbtネb゚維ッ5t\m ユMネケ*^k凱$"?リ wッヰマ3h -+-ンf燗_ 釀ラソヘマ/^~ロ禪マxナ鴫ィヌCM6ы)LP}蘯┴\ヤ{ヤ+s裹ォ_>轜Wケ1//ー梃「}シシ>1シ孅:o0フテコ=゚ッ1F゚=.?rk位シ{ツソqシ9ナウ'Dユ0浅b吶Wッ -キ狐ラ >71?rァ樒リ゙>^セ」.9續拘8L+9キヌヒW_}|9q衂ユ7ソ{Vョo~狗Q乂1ヌ沺ダ~'漱W譖゚レノラチgノナ7マ~7<ミサャ畷_9ソナ\]誌'/゚?ウソク+#「慎%チp=シs`'ヌノc嚼ロモ@qネ]PDョァッンcネァS cテレ'tC゙ォ8 -:d+ Lナコシカ$MRэ1ハoニpkノ;呵W$ヲ]、虚ア厭粭゙=-ミ6XウUlcイ馬ケX<1」ネVィ< "ネp拯_U(eb e 1\gァ{゚`┼タ噂M茶 「オ@n4,絡 -魏ツゥXi*uヒm韭ナノQ\鵝フ虱ヘムスP<O Dア3@L Aシヌmイ、7h擒ステ[ス猊ミ< - -K侏足ネnエnナ.R[貮ミa ;fP\�笵E h VC{ヌ癸~鑵ョヌユ`ュ゙テ1pZBNd瀘ャセ_G]SKp{レ1ヘy,96<ウンスp豸vンシク3ミノB甘:ナテXj<ツ粟"トイ。ィタ3ソEン^&コP!:"Jェハクチ$ニ7P{サfhモkウ浬*>ト,、[棺aah。纐 ム=イソY付9襪【(到r{ェ赦・ォ於癨AP?cゥヤ1曩)猖羨6R/ヨエpォ(チモA9吸若ウ モr ノチvミI硫F*"'俾dニ>5MュツW:%飄Zェ{ォx」B?譎ロ_U c宸w$h1笳。ャ�蔘゙シュ,Cナ嗚wノ貘テ$緊蜀C7欹らg狃壅イ啌c &�タルy;メ!xpψアユ籔濤」Y題Cxィ s汎ヤx0メュ9゙セlイサqt!7タf腮S3+ェcヂw,wCRwdヲ}ヒ尺~ーァ5m簒J:ツ@盛'.ツh゚~イXゥ^アァ>K\>r冏シプF]ノ 逧クvゥ鈑?禪O現た+;跂ホ(胙學ツafc∂{怱F~<オx!稟「「ヌL-vナロ`|3wiネ懆-胥1タ艨w籃fHヨァ7」夷0カ^$?・Q~イO瀝&恫G」w袢Y K~」xクウzーヘgレOo&Nフイクゥcjキ徂 l|�壺ル楫<U Gォ"。マ"Scニチigeウニ囓ネスn勺 ムテ__Locワ」ns瀛.S%4ェO詫"ナマ「挑ロウサョ&藉nヲml絡疽サンDァX�mjvェk抱=マンュТkノノキ虎ニセ}士Iツc、諮ッ['Jワ[ツL1シ(3EW倶 レレセ傑!/カaヤ キ樅/-レx=闌蝠梁d/ク#&B6ケ弋欄#めノJ韲ョ煖XsG。リFe・cNレィキロシ」s:「UN%|Bアホモ ルテEムq料ロA:<:FY8テdヌラ~b;+、萋yクセ%/ツ腟 /乾Xルホ*%rウK{コc!ヌ8jクgLm`jサ%:テマゥk8ルヌ廨 7Q竿フ莅#Er ゙ モR5モタ3Dョm_タ:テ|冩Xョリ朏ユツ&8#}トヤ溘9夫*躑b/s脹 xXP。EリウQスc辟`}松ソ乾エ cァモDc氣欸1謎ン~Zゥuト桴1B6<h[x2c幻蒸}V才9ッ2YVY彭例誰ヒZョ U・7u漂ー`ュ>ァWエb・ヨラ`マ恬 -Z<eケh,;ーエンノヘル=}c哘ッニニ=輟「`2Gフ%オFe焔zmキKヌミ1ニ13フ四g}xhJU甜]g栂FH!aサ2カr#ーソ�02`;嚥Lトォャ RwDQテコaハ謔cニカ貲;コ)テムヨ#bソN)樗'I]#ヤマュァ 8ゥ1*ィXz -轌サR ーB5[T!k「4版スzPョャa;5Fク栽j1ノ岼;キ祉ヤメe0セApbソ型4DS5驛|Y迚ネxeyアEスルィ(smツx ィン窶 DォVL#苜HgP *.Xェモ宸ルUァY 9|%シ0'7Xル0b$コ%bワ哮%ラd[コ eョ9ケy瘟-レ>s齢+AL依Z゚ァヨ�j23c朽ュ|ワミx扱бTヤ莚5Nイオ2q偈セシィ・Emrュqクnノ゙{タト盞トjI 4フマアィカト[嵯翌g4cy.ヤiテFZォxX>コハナ~鉋�ゐ 4eヨタ駁禳蕊イネ?チィソAムン。SXh冗!O藏禰X貰Zセ姆DT&畛13ル幤タ0Zケ?`wエ(RW仕n觧蓴RI9タ゚ノ N畸"ヌ:Yン モハソMヲ!ワユツ謾nyカj("ソナRt捜 ヒ%u9ム,夢5>カLョ芒ウ/4恥ーウ@ヲ[=Ba臘,ヌソ刃+/Vj|AMvm!ー;氛FTェモeロヨn、x]レー@i/エ} u紋ナヌチアAb゚2#Qャ5?エ待v P'茖bG*#fエocJョ]゚|wgタシァレ�レ+}"O・*リM"。Gナリリp「式キカ・懿ォ残,3Zアチe詐Λエ}*レ-ウ766ヤX酲gメョ崙#販ヘ9:|Y、w(6エkEコuc `Q`Cタ+ーエ磽":9」^)|E)嬉リwz#纂ア挂Yw.k\崢.掣;ツムヘOワ/カロェP創セ停Dエi{濃充qォ゙z5t< -ヲaイMロkンbPG\.セカラ#"|E0゙エnod耋]QGケWl2マ+┼ケb95櫂(4O;+`ェル)bェ1ウ鑾幃"B3「bク3#ミサヘャ8"ニ>GGXy嵎#セ簽Z"+ヌヨX~マモ{ワ<ヨ+EヨcI串カE>綿萇2mケ唆@,ヒ9挨{Yソャr畠o!娶Y条>"/1Krd鍔扎トК塹u感ホ:N辧pテV(サk胞狸Iヲ"オy卒 -/2イZ疂F+」! キ5檀瞽Fョm#%柮$ツ嫂ノスuG0シネハ十粫襾ハQサ?JニAゥヒm_ ホリ([禰馬;僣ァjテ ラリE^6"yォネニ,メタロ^-イナアァ灸イカ}宋゙v0"#;ヘネso;メHヌホu・フオサ]ゥシ XZk:sキフォ爼」5ヲZサy=潦@ )vコ慧yj?アキャ妊Oサ≠贅STsセナ=p0S`ー゚ルシ~P∴q ホ温:テリt湊貧ア H拡ァノ:J#u&[ヨ7*(aサ2oヨ/P睡ゥIRュ[。Pムコe9「エnュ"Oq怺ァ任X0鏤マ[アーキ%ツOヤd「^E:胆>^シrオソHR那^ヲr -媛ュp^繙*テ蜆。Fヒ佛9モコfヘネ>GYミFa苅:イz怺QAミzロ:ネi<(ケDニi},6Nu]q\\;末BRォ滲e@シソ'EゥSIム皓r隹vkムXDW7。喘 シ=jXR%',}エ裡オク3ホト PvY~シホ]モラnマ、+ラqコuョラソテ涼ムチP゙シNサーユサンg晤C軼x4ソァ(卜ミノ+e7&髟GUГ任q唇<喟ヨ蠣h]Wラョ9ヘO2/|b^ミyル檠ラル舞ィmb侏\ラォYa/:鉦Pカロ$Жョ{kBLBモ:/゚キフ。」S<ッ~ロ鈴獨タカ奐渭A キZ8r'`ヘ$r2r0ネンフクミC゚ルXヘ縞Iqヌ荏&ザ蟆V∂ヒ>イ^*スツBスPR0゚脉ル'u%闡タtPJエヨYロ 涕I][$Tw)舳[マ&レタ-掃+0O7ミVJト.熏b(「蹟_#:-cニ8ョSyヘ細(P\ 1トユS3~+a=M漓シンヒ)cコ_8ヒ -カイ゙!yゥGマoマ悵#マ/ニE\D>Lム0奨aKH<Ysャ告%7^'弱>モ醇�>]{ト・#kz!s?1pヨュタヤズトn杓$fu攤舌teタx@ウЛbF猟ォz゙キ#1ラ8'Y5r)カニtW -gdキ セヌ@Eラ1ウKヨA>籏ibl_/整)^2]カ^ナロヨ ォ[ー^jンヲ扈ケ& ン5題ノャ gロ」ニト、'ス&/号uyヤャノP|zVム cュ,o'okZA「?/イ}Hシ b hラ7K�Nナ羌ッぁbDモシ'ロ=R "]BTワ偲 ヤo8」+ヲk(o」草ーc、ヲubホOdヨネ堪砲ウレA%ナOx=魁髑ン序ーゥq・2貶ホツI]zF'v0樺`^ソャ2N滌ハ^MnYK)Q@y3ル9ユ運Gシ'4ヒ5盲Uカ5コ!hd$AィP巴ヤr*(コhオ怺z!夷Cb0ヤZYzォk=]插アElミDe/ウ輟襠|>コハP瑰r」ラxワマエ゙0フ}エ'ヲ@Sr|3Aサ�q麈蕊テyJメ懶゚*'ァヒ%(6ム瘰危|>u@3?怐m(^C-lチ_o~ヒウ|}セ殀イノ羂|コoサノz>66セモn\腓Jイiy%働�Yネル鈬 博&タz-姑垳'ヌt!u$憫,8]恫ノ}气 ノ 1[゙影ネーa┥蠣{1N刀ァレ\I�Po・カァO%'Aウフlu5?0K,ァ椣P縋チJbo~。 m( -關$「zヒ:ミo郡sョ_}裔ロソ0$_-メェK、ナKMソレコン+匱YD5ワユME,3]qムyL%({<个ob2S &tYフ晁qカィ;エセーxケVサ0:eh|暑g委晦2{ヌ祭ラqキ^3;ンユ粳ュクォシネ゚系 !レz食テ_遯アセ謝X醴獻ソSCl]寔蘯~斎wニィ収#?Yシ!゙ョ7Iマ スk弯ソ -ォ賀2oエbミl[!カj夘$u+lィT容cJ J -カネJ�ーZ5株�ー$櫃 �ミヒg%レ爆�ヤ ィlJ�<WュPチp7MLWィ,BvDB�4メヲ %t�麒糶!P蛸スシ?d��邀Lノ�T\マナ&+ラィタ'ヤケノ�<{マJ�」ヲヲz*Q彳�pッ �>xィ(ヒ邨f� 8ャCZヘク弓ソ乳6霪P` -タxチ;k。?スNナ3モ 禿2�クミ9k'゚Ppネ)椰qッ亦ッ蹈i-^e:(ナe�'.�@Aエベツ~ヌ]タヤG3d�ハ? 覦モ^<ィウY)塊クフタR蛛2aル・ハテ0ホ!K這jwT齣*5 eM\Uw,以ェ<,デ%Ty(EA・ネャハSゥ*ZレR蠣s貞チ;j@キャヒ。ヒワ/ォホC< -mコ<オ8X<ty*Wメ蘂ツ女キ鶯Pミ藺オ9。メロA}湶y&]>ワニtワe弛メ蠱!0o、p6Eレ。z、ハSDワTy0アロ*キ)Aェ<Z振y(媒$U曖^+K芙韓佻7U|? -械肌挑T(マロGゥナ゚f*Nセロ秤レタ条緩タツlfPハt敍6zHUeーフ!ネ(!.ク老"$5谷レ9$タキヌ"  穣シ - lノタヒ9$Pエ昿Hタj16)キ�+ッI6諮�>i♂ー_ソ犇ー鐃! #d謳@!uh+$3愉GH瑙」゙!(ェ6$`魎ァッテ+_ExLACテサ遏Y[\ハァマタニンqQェvLU蹼L濕.` `g|!Aニ?GD熏朦a蕭 曾J顎3ム8Y冦イ豊VレセXタトSm唸XS#'!p<sサg・ヲPャRVwm」x騒K1ラアヲ[ホhjR薛渚Vne%ヘカ,52.l゙ヒネjkWラ,$。゙ZフloW-6ヨワ「ヒYホヲykq|杙}qァノホ チd}Ppアョa0リカbハ(Sケ<7sm鏃熈コWJ筵V3vYQサ d塚ロ。1簽j慮U{WuL「jセ.d<ウ樛ウ 」ラュ'g$Aュ゙俘ケ$ィ忰Vュg悁ラィWVk9カヤリU9ホフワ「視イgゥ」千サ(ァ糺ur?2壤nカヒ韵ムワwマ;っェ|ヤ/c@ゥ}_ル$@署 -タWsVヘュシオ@�iGョKタh@イx ,ェ、V溥ュ.Gf・$ィテ-8j歉O ェ`帳欺噤W`3o@y佚^牝ェヘH・テ](「6。g5 ホ2僚^i& $J_A,]!*ロクタ鍬ォ0潛Xォラ痛タクCA) 戍DSZ]ンフクウ% ーmゥR {``~ゥ!イッP!85ラゥ威氤薯オFl-Iリ佞ュ ミEAヤ+ 0ャA闢ゥ淆ヘc来膕ャ`;鴎陣章研VH゚�キVb,hュk%[8楽皋ツO儺コ頁U嘉ミcE0N2癰Jbヲ恍'JB4 -XウuニH*r6aネ「7aエgシナ -flR レテソ、ロJbウマyケ}繋%P5ニD頼裸*ロソテ片aンヤァX\*8JuーA:b{Jカ^ョx鑓ラ鈑窮稿 シ ケ赫Ωy*X閙」]}キヒロkrホ\「Pリ?嵒ユVe@フ洋sz]誠MXkスTvワSスyミ"e逎ソ囓ハo9キァT・奎ャM-ヲ�ホトc%0}cam.冐i「'ウ]゚ヒnF抃a*a从 HOJbマ.オ テモMルメワノU~W,サqン|.#b芳([凍<An5皀|ア,n!烟餘ユ渫~ワラ\ユ;D゚ミBチセ9ナjオ6ィmュ#2z フ1叡ノ蚤[We固+ VアX據gEヌk[テQKサエrp'8+ス;; 2K∽Akノ顱ウP嫐R崘\(トミ/4ヌ;クvGィv ソ┝\<晰ィ謝n誣yw‐moネqルワシrレ7?V゙"\Mト#イKy:Y^鈿-q葡1ホス]?ネテEuB_゙*愎蓚リンPヘC4ヌ“ル!テL昔剋3褒跂Gオコ」[C砦6ナ閥烙壙纖セテエ1ヨq73トqオ紜7ノB"ロ=Kxy・張C傍魑ャワkナ゚p]{蒂c*レ軋寛fnA(уv 噪ェ.u8持1エqハ小コフ答'Gva彷、裴v籌{z3ェZ力ェ8c((QP明i塀yKL:j:カZウ廃ツムキd愃u淒gMKG?Zンnqk6 ソK�ヌ盜鞜Cリ夸AEォ^<Iuュ椽b\Ds慝?陬ko3!ン」ムー鞳xkk激シQツj畳f「*z-メE;ヲソ麓ヒヲスコォッモ_顰ラWコ9"レH5,。殃v撥!|「wュjセR_ォ豢ュU栩d5/F>sキュ齎hハ98レv5Ooンス堽」 8ヲh^ヒB'芝#コ残}火膵カ觜ュ「モ945Cヌイ練・cq言鷙?」:黙ュG;V縟/リム,ゥ/<Yス\A2クアオ「ッ-瘤DWイ蒡eU両ワ殄、'ikク_*テロ頑}wノカケm。 ソ.エツロエmツG簸@x兆カM82p4ワgン葫fZスKTチ]緇{チ逾ミ犒"恥p|z07} レネナw7] ゚ 6 メァE務m犠トセ$0bイ馭ト.'5エ - m6・゚P嚊6\!ロイM$6o! 「$Fbク)蘇ァ%ア Q豚rn'ア1 藻オw阜Jlp7ア娩&Kl%ロ鶤ロ%カン。ウカメ浦脈'ウャコ、エ哦 -6 (ャ"  -ヒ拌耕Sc]ソ!ッ~ァ*腎;QYwLaホFt&梳7))フウ?MEωSWタh ナ崩、S3ナァヨHTkア革ナネ死X 嬶ッHラ祟\シl鑑、「yンUシマ゚フsタjェXムEヘ&ξSN*5/E(3ヲョxn\Fc鈷ゥ&ハ芦nモiトacヨ恒ュOヒマン跟ニ 疎-?゙エl"ハ 鈎ム尠M┏ラ、ィv,a゙Vコ舵zQオf*リセッュ緩ッ5リ」k楓a[フe5_ょ(族3pト3柏%サ,ヒ*ラF仙(QイサIハァャ續rY.W、f6ラL徘熹綺>朿Aサ/ィ袴謬Z~e$浚ェpR#オYマtmn菘ツ+詞Yヘ+ウ餅Hタ):9齣ネロワネノ髀形l "qク"ソ寥HAニ>$2保v%叭ヤ(サ曰協ュQ膀c鰈リaEvロEイ6カk耐ユ.イセロカoヲヘ。メヌア}$カヒ圭tlFWセZユ勉ホロZャャ椴Pmy\wエC訶ヒ;濁ム平「g兆ュ ゚`墫湿"xテ溝゙キ」ltェ=g}ロ]{�騰苔イ &ーl貔v)\ェWh「メCセ#vQアDS,8 ナ?ヨy"憶ヒ:6qQ -キャkマ26-rウn;f褸マコゥ -ナ晃)朧6ナcTDj=iャ゙V: ソtヲBニッ&d%\l ,桍蜚怜# +サ狩ナ5%EQ9{ラセ蒋u侏ZャSIb}eVネXヌナ薔m耋ッ2&>ェXQ\1pイYFラ欹{SィY4マャc( N Kメ悩Viマ`疉ラ・Oウホ掎l燎フヒキ逞セN~2>6 」ウ庸意囑♪。タ!=G註"リア迚Wo&)t;l)粛]Lq椙イt墟ヌメ麗2Z~I2ニEk&{ヒセフ沽 &0Jsf!{]& Yサ#Gル[クN縊eメ ホ、塁\5$癩4U(8マォex5�ーヲソ槲}ロmヒニツVY蔓ソ岌,<挈痿I$リyxホヘ5Lー,8$D棆R}ア「逑モ;7xオヒォャ >izRjア]/ツYムYカ;c8 埒,゙昿d`オ`カエfクgム0・ヘッYカV_ヌ沼ャsc ゚ -}籘 メフB\?)v]g6、ナ�@レセAキ ス'゚n->pヲ�、2w*6Rワ欠\8(ラ3セネ1.カC"壁UJホオ\ vn$ ィ8其Eヨf 置aメ*Y/=匂#ヲfン 鬟钁IAeンヤャエイョC,Iオ%dw臥-5$$ウN悼!&ヘR・加圖kbHヌAq噎9カo距(ョパウクnス際ッ距6nBシリq」bリnhLq緜2烏」9g{15ナ梼+FC\ト6jb:袴fニ|5ュ~ョa「エ_kセラQN磔著タK6輙サ+1踊3ト+鉱"k>遯剃 -サ)a豐 寇イリfニ$Q``{6+、モタ@R蓮ハァ$<;粍醴kIO -pTル5kqェn腐ッセイュ +ホ、+G$(:!ィ&マ冢U潅uスコ・ネ]Vッカ[署瑤7ュエ]Jケrチ:態 ヨfеaRKX/EウツコRhXwォDササjV{Xw_ェ I9b=ネャ0ア:Nッ扛トNaqi1胄cャn?SC:F厚クcvlw6゙「x=モSz:j蝋H邁ュ.ueZ w勅「? ェ!uEヨユ|Pk+エョ戚"6(エョ鎔�橋ョェk勅ヘノイ!u5犀コB演2J -フ'ェーヨユル3エョホ、エョ>P&エョ゚CH1i]チ(V ュ+ER10エョ )。螂uト;{C -゙就ウ、vコ飭ォ オ+w^WRサb 榑岌壗< ヤfA嵒・懍+アォ7ZW噛le~V,uラ}yモ/D瓠コtWコz-t/Gh「?#ォ?ヒyシゥ }6Oンワマ~q(~/欅譌/?ォ毫oモo~sケヨ�ルシス4lBォYチアm恪ムュ6\コV・( - lvホEオ6ψAネンEMy&>yニrg&Z*3xヘ賄kリマヘ!^ホフマE$Nク(ヒiィ!+%"ホ#r2ャ)7=jクノハ\?ヨ.6猪仮JA(bEレIャア。ヘ可\エy濬hテ745"=サCヒGfモfカv東"4Mq*ェ5rqF<ホq俶R莢)A享7ツ6;疸ワ上s3@焼ワ澀0toゥィ!チ潅5カ(jゥWuX. hPワ.崘戻ヒyナヘ*晩P gR`k*4シli舍変掛tThAカ@E{ラ7イ#z$オ|ソ鴕班?.ULワM(^モL`eZヲォトZH疊|."マ┴チ'q&〕Dッ筧vルコL宣Q:#セLwア嘯エハョr-TO瑰摩ャ> *P 鶲Sオ}ミ2レァ#棡!ヤ@錙Nfィ>E#ェTi「9エヨzya載ノ d瘴*-Pヒ/% ソィ\シNRj裏ゥWタ・~ラ=乘。ネチ媚G 1茫A モ媒メaP|レトヘ ッ<丑rャTテ Gュ?(ヤウ衝抉サ_18ヅ8ァ`M"^5c'ォ敘)rツf5xAラツx;P'ョVス,P]a疥メ+釐ッェエr, ェHPクb +ホ<cケQイ8町a゙杓テ{→+^ミ5BWイ0N*ョXXヒesH�ユクN源クk嵯キw観ヨX)<n攻ミT oレh゙'$V擢|勢q 啗ヨヤ鑼9ャL鈬�ヌ!┛較凰ユ癈3Uyモ!黨[#_P}]゙~zメレ4Y乾I ・曝敲Eォ}ミチ~俵)タ+ �ヒ%ュァ -瀉o歔おsp>/6イ崩Iア /$5ムツ 蜀ュ&ホ!ハ籵lロ{/"%1?27コミ棄EM?3護 4ハ 」クラ\シトrト"・U08ツ>#ィ<=ロ7E丈勗.U祢,q 允剱ー~<�[6這;'etM4ノトD9ラwJe・シュ尺恫アリ<N*_Pリホ0vイa=+ォyケ燹 3-ョメ!。倪鰰-占クE -ヒユス0ャコ/削ivョスト レニ - -Kホeユオ、5ョ?`ョッ~ァfワ鐘ツ黽>6゚ラ叟_(Z=@ヨn1ミカクC"0ケミM7Xwラ0冽ョA溝悲ホoH0=Z\aユ?シス Sャ7w糟v/穢Yウナ「'kFY仙<,ウfィlヨ,`輓カ �tフ械DヌトケHメy~ 穰フテBRヌT蓐mJツuLチ主!`ルア韓掎ヲvャ6ヂ散鴒gtヌX痰ス-チ3リ盂ィc|[|ウョ5:p螻/K^誘nA メテu琵訛r=<Qル?bH>M褝>ワ」ナonT@袮qマKヘu 枝クxチコ�tqmカ#飽ョ;ケテ<オァ ,7=pyコ'(ン<ハオカ徠ワQp蘊c獻:平モンリヲマホw躇ョソコロ跚ムbム楚eUt゙ht磐UFG槝"kヒ)a、シアチヲアO|。?橢ヨラノ覈u^ -“゚}ュ=ヌIg判2フ<纖'ス-h窮助嫂アΙエラqカァ<劼シレuVJl萬)~bゥuャ],# |レレ髷ァヒIニ借セケゥ CnJaラpa;z" 2 -\椿uxモ;*JcGXタ桁l。:岫q勸 -溘ナ会1朷ロm髮+ョサw窟4斡:bセー5 -cG]%+1ヒー}4Wサオ誹6:$?�>ナ^」uc$郭uCjP|輹S蠹vi痿B@Rj皖Sルヲン Dカュ寔oャ゙Bーn.*フn�:Z99u麻Lz蒔「Nフ%麑lーeH諾Cキk懾gル」トt孤賜必コキQカFGトG6>9Fz:ト1NoXチ ネ]齪Vj~:綻g]Q9セM -X.zクサ・両罎ォ\<Moォ&月゙央肢マ+戲(゙Ζ鬧#ウU槹\フPマr邪7豎ホホロ」ヲ;Xoェト鈷1楓+ヘq9胄4テA;Es0瞋黄SwUS:ニ+ァiソ襍ッ蝪cy'gヒΟ"|゙_hQMOi-Hマ・ロf . t~RE:A\ト hアlE2 jGウ礫A 鉱}ァh(aオwvヒ\s-a /揩u戔 クlSYaムノ]txχ゚李イ,rg:ナ蕷ハチ87/PョQg;dツツコw -C瘢u<B窮ラ痙゙゙]ァツ<<nyーソノSh -CFス+鏖vル怠ル8ァ"'JNl拗9サ拊マx羔(ァクcCOラ_受3MZ*賛.&ルトk~8芸・テUg・V.}ac:(r鰈メア5レOア o5:注憖エ飃pメユカメV\>ヲ~フテウ吶[守ユ7rォヤ^ツ」S[ェ慈%mサ陞ソユ諺毬ク&HHレ趁6?庠+v8マU崗゚4箍za@icノウモ'ミ肌凋XlT1=モ壯3ク呰鐚籖ムヲ?6ニ -ps功畿導カ膃lエYM」I:7Fシッレエw%lエケ@#ケ骭t{eマ」ネpBヌワサ0#Ow倩」X;゚イフbゥ-チ-#>繊泙ン鶩\峨"�躬癒斃ラヲマコ~カ_ノ�Rワ沿0馭)オンRVナ桜`V<ym0BcQ+|テ!ツlッ合綯xEネ.`カ。!タメ&径チト蛻芯シC返kチヒ.F3゙リθ[瞑床jフz甑$Bエロ。ワ"ワウWуキY.ツヌ1*ツf「モャ碎{#、s╂キi<B1ン++Bロc蛉气アツD>V「゚ <ネ+薬�Zモ"[ー-}繕%22ア熊b[n#ヒr$;b饋名ト/ォ\藐ツ[4フ覿Dコ&シ秋驂ト囘u'メHEコis"-オ惨*ワー補ハ壼チツァ汽Y}善ロテHシケ痴5#余メH鯊po#mクyチ楚 o9R雪QッTeシ#」zd=テ縁韆G56蘇ユセA鰄mwY[゚(ュ對Hn{僣ヌ'ノア/割カ監tウ"uュュXdクキ[$ツcgノリER}ロ%ョ縹3ルリoFロ友カ?ッォ"@{ワU9煎ツC錨アg襴p鰉セュン仮p*Ptq^{%bカ=�^〇ハ p跚蚕痺・ャfー゚ルシンL瘉qケ犬チ2!InLハリX)�ご2 o£u*\ -コャッTp貪vi -筮泛`ウィSZキC▲uロr|iン^ナ。Dャ*Uiナ妻ラz鼕漆ュ+チW~i檢Do割cー モ゚モ#ヲ x(|遅導O遒ノタt。Q -イ: -p>ヤ@琥q%訖>莖コぼ孥u(峇 セMェコィ8n]m2>レMヒス$\玳6H;zキ>;キ`レ<ッ樒陛2xwR9フヨ卍濱AロZ'ヤ囿選タcGP陰8トHリ7ア嫂ヌ鰾ラケ^ネ_FテGG[W9B9^ッ*埖ミナ+hホノQ~Uマッ!ェ蘚腟^ュヲMdxカeネ:粧0メ<エョJGュ 2/|b^u�リ)z3゙箆劉比蹂$ヒヘCカi!誂: }4T/Hラoウッウ座:7学ニ綜轉ソL -ッvル鈷ワt^アイJVn{'scT惶(Tcノ(燃▽gア緲/- キィ(B -jミ,鞏\辜Sa、Zネ邸 -�H?ウn体箚BP テM;8ケ xィ弥薫nq\X{フウh!タヌ ョAヒリモVィqヒヘ力MリホrS些ネf窰<F&|ャdィツハ絛`P3偲=傚T志ワソ> -鮗Pテミクrd`墺/粉ラq#N<>槲NE葬棍イ:ニコ逾.=、(存=GエQSOlヌラウ5,)ミ�CコUタh桷LiGdゥ7ヌナケー得Jルエ呑Wハ錵8$.―フY>gン j1カP痾衡_ゥk鼈トク若L備ミナb5=Iハオ皷3h: mcb没ユネAォBIp網渭鹽b6ХX・。環綉穀t:ホ}:与常+% [勸]ッ胯ラ[ォ[ア゙lンョ5莉コf -ン5幄 ュYgロアニ蒿|ヘ_"リY。リG賣7s笑罅ウ~エヤv〃ッi、メ9P維・K゚wクィニ蛹ァGチ! -。Rホa(ニ'ェマ$,ォキ嗟」� KL n災0カ�70ヘ(:距mウ*M「「癶レ湫敷cュb)盒、札Za鳶ーXィm2ィ|ア�鎖ーフ H祚dムイネー要'薑蝨ヨ7テ+、*J艀*00}Ag>旭ュロ$ヤチV矛shヤ,フ%=ォlgル゚・=苴ョNnワー゙;|クiケャXHLcナセzV!カ篠)6�#ZG)┼銜+"ョヌfモ9Uhマ障セェ2_゙?8o=y&r4゚wー,1マe�モ糸ヌ輛8ヒニ慓Yヘ99ァ瀚瀕qkW劃薹!-w?チウ#チ、珊サ~AERホニ%「マAlハセ觝&r L -}G|st抂DQ/胛沚'ゥ[�'ァツルソメ_uカヘ wナ#,」J臓ロツ轟テウ!゙A "タ葮X#リUャオvWP/゚4) :キャセ~vヲ!$ェ.獲聿L境タウ'ゝチツ: -ヒ}サ!メpャ凖゚tリ。゚ィSテz}.sスョ uウユオ?3ヌyJoト4韈^`a!キnpカサ環 -v;ニンヌ?ギラ:ルrス -熙罔7翦ケtNッAミハ.崎nヤナ蜒。テfル剌o8[キス纐ヘjPタuk遜ソ觸キ飽`x`l=、1,\gv;ィナyヲAアホ、チウ」ルコ2 トuーロッ戟w#ニ~ワア痔;ザ%=♪セSzZ*B醪iナ4肚!.4g 渇」8)濶0ヘ.{獣5fォ�ネa]db3ャシチ1宝「゚ー為DqN#ウいァ1Z+、 vヨXヌ0+。ノツ iィタ;ムピ`根マヤ;ヤヌ=ソゥQミヌ゙�覇P勹zンKC!i鑼+pオ欹楠L<W:キァ イイxΑD多]ノウa+リm5ッナ0ユtxTmZニコ=TーOz,ヨ-w_@ワ`哲z節ノ3+`ァ^ラ疇^テAIG/e。マc賑クィBJ;K、o淮,]ソ據ソYウq~�, ィ0ス< h1ワ構ウホ3隅1ョWウムャ3娜嘛ュ0dY柧X"0{嘛�テ"C8ヲ斃エテユ洗5M; 6�=i゚勞w泊ヲャrпトエ娥 -yレケ=カヲミ*(Yモ聚ァニ<J|レAム -素嗽XBナ<#H6Xqh嗽゙>ヘ=$wム_ヘ<゙L=}w昵j趁ヒ ・|「p打O}エレ羯 ォイマゥ6Q゚n|3マセケ4&槁W2ieヤカx 締ンコ ヨャエ] ワwォ-%6壥クCtUTカw6?゚ヲユ?@tア+p}3、O藍ゥVi>」ヤ籾D4Nゃ\ク矩,zソハ>sォ%Ftz,ァサM劼g/,&ztX0トメャKy}1$q。vs ノヨァ「'N囘/4ォпF6=」nV?&マ稻;ォィ`、hカ $ムp"lィ瘋ワヲッ!Y痴7\ョツ@衄マレ・イS:1wィUラYUnら・ー8テ5"ー|Q鮓愾<W -カ睿Fルsi,誨>~拵=朸A <, ホXgE⊃�梔vホヒGホp「ノナェ皷ヨム9o0d 層l -+D<雜g丱ア拈q0<IT7ォ3モ'�騒。因イヲサ鋲ル叮ァ*Ad=洒碧コdVV。u 孝ノ`fRヘ`d*O刎テ?<碚F[カ┯ CnXoカレz oM悳o/##2ョJUA.楜マラ^羚�キ0@ノアク"ュ47 「イカ苜<0゙!*TD,@CヒiEコ<ソI ト98汨1r> 5G繹チラィt寐ゥィ4き <、YGBEr0P甦e棉ーhヌ@i\滝レQ癪ア*疏�`キ隼ゥTZユQーMー8ヤHノh弸b裾√ YHf亘磽c%エOL 蛛ォO@2ネ.qヘ幡E1Q+)ョ4ミ8fZ「鰾Q諸Rキウ�~チ辱ォCキ苒Eミt蛟 h沸trケu、フ 鱆%糊K}Udル7!イV -0綢 E$7i)!\0<チ洽"ワュ◯ヲタ!恫ナU<址/ハマ.b\\Q/bDョ,j1ナイ肥1^ハ迅Sテ、%ヒ= PML蔬r -リ- 87WG系ajィ8サq1хワツ� X!キ0p(アev 」#Aァ5 クス滝ヤ5'xjヲラ0`jlJv p萩ル5c竦タル5 メニT&ラ0゙蔟措預a歃テ?ーd/チワネ5 T*i952P鰓斌xy゚陥./サM」・kク扠<dケツ.h$チ'キp頑7チレNn゚[`ョコヤB;鎚寃籀ヨ怜トsぽ楊ッヨ捕G?;ケロム鐃hM`罌Fまツ褊yOレサa0%K陀nz ヌ犹イ」]ツ琢蹄% 'h1K8ツN@`ス#*ハ24ゥ\ツネ&dィ鈴% %<$�モ%Lル禍ワg用0R h*]ツヒcミK8R<AdL.a$ウ カ]ツ遷:ラ/aハ[」ォsz#ル健&子z#ヌ怒7ス尉テヤoaJノ!ス_退%リ兼k味ルsbgア{モ!8怒ノタニ2勿テ-ンaJョ。ケア{オヨ)dGaワ4Yウ{vFヤ{ケgTォムaリヌ rrcル屏0調P;テョ砒uヤkリL76!鮫ネ!<碣g!錫gLTCヨ焔f#斈、瀑アテQワヒ13D堺3%ハ切ェf8゙e*カェ?」/ョ帋#Kf88pJ蛋*3テ。G#Vミフp -衙フph暈 gf8lノff8 -コだ吼!jM3セノ bc(彗b クッ;1テムsエィjCラh髢[レ碚シOヘvーh;XiフハTEキ┿)ョiムmm コyb [jイレ3 $チwー`鶏Eニハク スAク壻>\ィ瞻tAョgャ」D↑>フ$fu}V#g,=W,オE6:ユgQ-喘g,jQ譯魑n艝jヲホ「、-。-港I孛ネミ#|ヲヘツ@Q・ヲヘイァ∽GN 抵gレ,^"~gレ,5A゚ヤY酣=Sgaノ'AUgQ2M%L前ェ:;yLス、謎'フ`,JE$L擂*"UpH戲ユ・荅魑(テ畉ヒ}槙@。「)エTッ\tモgQ雀ウ甬衍"S∽&ムgQ#穀・c, -xxャ雉>村ウエ頚.A|#z捍i」繼テ&v� ナsB楓ミ!ab繖鯤衽Qユ"ケセニNャ$フQワ弯瀬ユミs竿ヘルsCタ1ツо缶Pえrt\罪,エe8I ン�ンT?囀ツsつマFチ鵜)$丘~p堅_ツ器(咳R輿c軛ヤp0 セス]dCツ艦uョQS~矧箍ヲ停ホGー["ユBNッ」aGルワc%P@$ハ釿笥、TS %/jj鍠$6ホS5 �ツ巒3jW・n>," ウ%iZィ2、+経2$燕Tg{d{ "TDサシYルe弃閨。舘6。をjレロl[ャCRJホSI彫�/ミ豎gR`.・_0 ホ$マtヲ並恥カァsAFAb箪O裝Uヤ|-#2ー(或O嚊ホゥヌゥラ5_チマ@Fェ:疎刈O"&2R-[寺�9kdvきZ]タ8ヘ5n�喝ナウδH"タタユ擦D[匚@胥0瓧瞎UG @ィKJцTu」ヘ 風tsPe禿e 3ョャ?ヲ2c6ク「ィTーA\ミリァ概*@ト -ケ。4タユイ碾ンいフタ_3烟5^ヒ8XTチQ!YノF ワ酲R」�;�#(タ ワ吼.P;隠kZ ・dcR/z -み5ーィ5チq銘S<~Cモ]フ 辰餔メ5ー{ケ.#傑A*リ壁ハ -稜ェpィネ@拭ィキjー艢%O }。メ7+g祺[)+エ`L(ョ]hCa1Qc\7~&](;#,kJ・鳳ャ -タWョ2x゚ウ@ヌep濺 チセ祟「�ノ&U。腴、6b溽pト「. -$ー瀘VリーナhjB8チI8セ1蚊ス劇xfリxzheレィゥ i?Ctg。;d8レlヤ},Uニメ-eA」Zソ`0トイYマ盡ナ嚶ミヅl&"籤i鑞オニケp詬RツハZ'?且メ0YナL曚らツユZヲ�鐐\ワ;j`惴ヌ`蛻モmヤ懦V7Jpンユ$u2 増マ&蓍'┣ェチ畳 チ<Bム牌リ`i\ェル。、~ミl%ロ\S?濾シエ 0gネコュセ釆/�レMvp)タx'Sヒ功xJIヅ、<ハ獣レ6>クHEァ>ツ 1セ。|詣「・燬S狗*BS1蚊ハョ ゙z鉢n$PcAEサ 6d転$<オQdsサpT堺2ス寮エ#ヘN.ッ@触イhsJ論9a. ャ%2Bクサ^ィB怒12y<QoN録FUy�fコ茎a"{CJ恚ネヲタ旃E67ツXA刪3F5アq5&QL8ヤケEy.ー柳逅H{Fe1╂g&イナツ皹]エkeBヤ0モ31'倖a&-ユNメテ(C&ハY]ナ揺6TネoHオ貉0 u ォ&4S1jナ兪江GキヤL�*譏5擡 0 テS辭>`ェワlPチ奕LヘC 8「ヲ告 @モXpxノb<モlpx黜DホDD剪トJタTキD),ムクィ8Z?H'蹉ツ鎰u」R�tッォ絵オー扨 ┫OrミL]マゥZ伽丈UユL曾ィ3<エ0*Kホャクゥサ?KIユbm`リX宵、稲猝ク`~澪W`Hi^。棟キア猝$コj禀cヌメgリI延/エ 鎌?゙ト^'沙&6窖タ!ェフソJ噫0s0p[・ム8azだ�_.<>リx= マク-ネTyr弸ケ+{^92EHmLn+Iツlfサ菠1~:jッeレ0: -rォl緋cE・5 -卒ヒリリシ癪^r糶fチk徨h}ュr6D=vコヲEェ{uO+セオスレ> Fo{ュンL\ヌd・Xァj&]J剌urェR|怎ミPfn,゚ー3「 Gテ・ニ┐ラ萪ア#LHi5、キ[4:G�フ�Y渓エE >現Vホナク片8G%|3ャ ャエj`r=\ホ6繻ク(ih1ェマゥ3Z杏ネ網 シ?:モヲHケ`弦#フ`#>棧 顏MスO -逑++`キ]俟oッ, ~CZTチel B -」v_・t莨セR粗E&サz ュTソh78霙nqHcョカ7 -ヒ "L朶yIタ-ラ)ph:0pkqRノプtァィTU1j做ベ倦メ繕@B%<匪マ)rb哭F~jBフSム {σOUR`ニEチ)P1ARq宋&ユ唸 ウ2ノス&x�74嵩ワ%!傳 W'.゙、-ヌ慂ナ≫」q゚dg|ワc硫A浪(クG鞍タ6iGJ愽」チi*S"x#%Bk(Y`?M瓠aモコ)%Aンヲシ q含ンGニi≠Йゥ"DルTZN%UA「疑オfコル!メ剋F罠ァコ槭ネQ婁L韮rァp「<bAr・ミAQ0ゥ(〔T2- ~*ォリヲM/]衍uIcW{チ ハjッhヌ`$チィMae橙シDムニl茫\ォ fG*ル(J;ケ)GR府*ス迭O##�゙tタン5C]i墸ンラ'UxL|b咫=ユ逸碑>zfツー侍9トワb4 &[NM+切^z3J}M茄)5辞Ih>> ーyーO。覺ェニェ>jミヒ」ッ2ェ〓/キムlG亊mカqフ&gKvカヘセ7ンゥfエlヲBロfR悃 3=2、2ウbホ」Y;ミ哘ヤカNg釶ォハ&フk愼Lオ3残&]絖f5e趁)3+イBウ4ソ4偶険ェ瞽リッルカ孔 |ニハヘTョ゚ャRPォサ]GSシ]2fトキヒ -�ア。゚ョ,sリオf.ルgョサ&ヘミッRRフョ\fリユlサセサァdzヘwェ訥1唾|13ムツ|6*Uソホ2e*ホLィ"ィ+ノ$#u8ヘ(Kuハ\W&嫌橘&エ+Lサ.ッ{ユヲbbwセ8i:8ヘ7LサソッpX$[ホ瑁]TAケ{ U偃槎歌ン*嗹ァァ奇揄襪5uタャヲ2?vェY俚ヨsェ瓦燎"モトェt_イ*Eン<U楴gZ,^f^卆f゙pSコヌ\UソY洙9U%サ与ユヘヘ洙・ンッ麑 PキGLU皖ノ筥2S/韭Qオ壓-ヘナT撒(・ョヲ#Yァ1ワURBラMA0脇�"SYpEQyU52(W5FイC;uア-#「0 U薺紮$Yハ@P紙cェァTz[jt鱇T耄鬯ojトア!ィュ\ゥ6Rオ ルPサ閃レヤシヤ躔ヘP}ユTユラijメゥヲッセ詼[.チ7wィ擶�F蝟nロ<猟ン(h驩e2廁カ2猷Aヤ/8ャR$ レ櫃ン姦チヲ6% Tウレ洵,qカs0o*wtヘスッl濕蚣SャD%+;墨 0v.釀タPL 「秧o.H諄禝ヤーSd絞メPァネOEソaj 耽gチテ6」bヨ8リtUュトモセ[SKc<ンm副p$My$RLオモ衙s 3京@ネト四簒 メyZr悖鱗。ヌオIユョ觀0退2ヘ)C黨ウ轉キ-峻ヌVo=毎 5rF?E#h\ 査f0ェヌy)9宕箸<擺#"織cヌ゙チリAレ8Jyuィ*髀iSKcワqE、hル蓍塰 M"ロィ、ツス ァ]L狩Tメキ�6�q麹R″ ムbトノ琳啅ネa&~ヲサト4、 ; I"n?@EvR -ェェ -ス_@$イo綜畦R莟&雑{@0.@^リy]FF{莟ュx30'掻在!>エ棗セgチウbム^rmゥネヨ壜゚�忸A炳AXCP即ムRラワチ}嚴0)6ヘ)^擯,9:YEゥXロ'ノ++MVJツnJカ(ェGカンヨ菓゙i嬶ャ縟Aム・ア闢JQマヌツsヨV卑'エ�VD - -アテシ;z?覽鰌`メ、 メ) ノZ<オTWbzO!&s^・ヲ透ェッ&黴伺キラE'+*チクニhorb拯 xレシチホ颶jメ"Lウッ[v数7eウシア1ロヨ壷',YマエYTホFiァラfテNクN1ほシテー7ヲbkdフgカ免、lヘ刻ルセーNフ杖Eンgヒシs夘椣蓍o;ヲン~An励DホR漓Cマ{擧狐ワ,eワワ,eワワzハ4マヘRニ-マヘRニ-マヘRニgyn2nyn2>ヘsウ繋ヘs[チRツ,マヘニ-マヘニ-マヘニgノn0nノn0nケn1>ヒu繻qKtウ繋Kaウ佼Yヲ嫺薫朶d>Muウ佼Yェ嫺啓ェ嫺啓ェ嫺狐Rン,eシァコiハxOuモ懴Yェ屹啓ェ屶啓ェ屶狐Rン,eワRン4e\3ンhイト権藺 カ%V5';ワZ\wWヤzN&W6ト -z#\)Njリ暴Sヤ忝tリ&j ィケkj0・aツ jVΩ ィ *CPs」ト9レヲCナ/2li]:毀Bm尻堆ヤ -。F4")オホ ヤカnケs勹モ。豢エクaィ)゚T5 クロ;*セ悖ィ。ェーヨPヤ ヌヤ:ナQCLィO~yス オトラ2"スA-ィオヘモ.ネLrDM!フイ レvhF;移~ユラ Bュ� ミリーニ.BィスS�5<保釵*蓆ェノンLoンメ痲ヲ<ゥオ)O鸛Rハ Ljニ Lハx窒IK0ゥC20)cH&・ ゥcIM秩I)C20)cH&5cH&eゥテI G麌RS車ム、#u4)薊Mjハ:囈r、&・ァテIM9Rヌ迭車、#u@ゥ)G黴Rハ:、排、=-9メ= -qdbHyらエ'蜊!5ニ2ヌ唐T"hN%,5 hR9ニトhOム、」クロ%E8Pト佐_築キH*9薈。ハpワナ劇チ>Cモ10示」`MGチ輊: -ヲ゚テ$ルタt,Vp -ヲ」PLG。;撮鰕チtJソ(梅モQ(9撮駢0拮 -ヲ」Ps0メ`: -・?I Lヌ Lヌ Mヌgh:・oh:・oh:ウu\距シK.|リe 揀ユ04 -H?Gメ@{タ%柏約奚メ'T、kサoO`P!鰤キヤツ[Cメルリ7メy討>>jYpjツtG-pD2フ*VネL忸、スラ-万リア泛tネWIヲ 0ヨーj20q4猟qネ1(!浮zノヨ吮$a{ィAW「跋$qミ 意dサ檬鶻;=ウ孚猖cYゥ-!2組_$ハz、+赦石テe隷ク0FH;Q効<晋(�゚讚5Uhgレ. -畷F腰ヌセDIアSソ9$BFェ羝p姫梅&ヌンタ]Τ役dュャ」ク`&B鏗ミa麝タK)6cR8暖6F.pd3K)S]#oRホTOf撚7尚ク=fサツ坿ン3「2冦Dスmリル(mcロlリ豺d2アz罵iモ%Z:彬Tゞu^y「ャェタ'jサ -┗曝M(オ晦 5腐p2タ シ rヒで。YPJカkロi紡Rセ緯X -[(Sィ s0隋O�幡$r墸苴則<GヲxsL★崗X瘁S$」゚p莽ウ蝓7瞹S$o;ュA2ハ~タof$タ6D・$。pdシgヘ誼 筋B涎'-Hr)"ウH冉。S ^{;&A゚ナs`Cネラ F七[^ヘ7(セU 7ュ11津ユ暫螽 ,坩物 -ォ^ヌG\ ワ黏2^qJデq゚状メケ~zW聟K8f蒔6,^ニ+ g} I虱CdmP3yg賜ヌHX゙、ハ#Aマs1p$サSク#'V1如・Pョ)ネ艶汳�b6}殼:,ユH謬ユケ潰Y逸造タ4% |コjッg'-tjネ:/t」、+ノ遑pbェエ=DーナR<チ「j_<g剄\7埓允V@ub-.Wタ 4fァ'0・G里Pァ イネPdt I -й�ANキL*ン&H<歩ルGォS>m�メメ%゙�ウァョZホ貴(_・P 4>6ミ -R ロzサヒ -%]zア/J t8翳aャ錣j -ヲgNト」コヲ#3ミmBケ_(O7。峡、」ロl`%r2+q沫G[荘Q89H)dE/ー>嘆)イヒ~BAy$、\慳ゥj"赱NノoMハヘヘ。「Zヂ苜W%+\[メリ族ミ戊 Z、掃s ツ9,砕攝p$抔枸'`ホー7全ハ3チ}F糟判。hr戰8ァェ讖オラXッ・、O「0zロ <;H、,;)0LTセム lpc僞NZョ18ィ'q`ハヨ.q5K$訝z鍠`$シ鎗ユ7「,BB V,-@/ト(タユヘフミ又リOキ9用1「÷蛟Hコ?<4ネ - -≦Zヲ%マルトカ&`右5ィクj3'eHヨ?IY6A%ヨホ*3ネ"ャシf%@昧d森bョ・P=付Gt゚(D?I枚ェd07穀・(H]ソ酢yR・ミ貿@F:C$ヤW暴ツ セZ:ソ)jュ ゚WトE‥Aニ墳vd゚「フ。`R -!Jリ7ア緤 c蜑・7ルタニノ2M瘧\フユトerマ5!ヤecェケ滝k�'ネf6F゚ウwノ匪ハ gJHa]「ホU;asタR麟%「&qzfTI^气哂Bエ-」フセiTク+e[#エ九ヤj´/Jxム)-nワフ洪エhウlv]%溷カ坏&漫lユcdkィm姑3ケ >CヲR祓8sカgk笨Gロレタシ1モ/`;;#」苹レQr8、@ハisネメ」ーール。D0ムvvネ=艀就ナヲL�xi@N7^−ァ0&0 ┥タt(ーョホ姨Uq掣、nLsオR沐BB f ル3椢%硝Xoムフe衾タz上怫WPNTィ鮃Aサx^o 哦、jユn$�RY ス訊)k$hケャ(u賑流 -,ワz#ッ呑アmヌ!T7ケAス團g7ュwスWカQf7サQM�@ウt嚮T1 gイ\j9Zケrト -ハT|1ェ9@ #ャm箭Lyメ3陀ノAキ 1ュ&~!uTb|サ疲」ヤZ2iI垓j&!診z&4~蜂真ツ-コ秤桂曵」コヤ -!竿ュr-シR廡>Gチ]Pン リ/bエソi&nォ4」B9 -;!uア゙iB價(.M梱甚O醇�サ'ィL �ERカュゥ暗Hユ -rs%」B6セ・*0。ェxdH "X讙R腺ャヲQ!ロャq!'DD-+仲ュハ[QpwUニD掴L エXS!逍ェ宙R!h湊ツ ク*ヒ録 -沓ZRU]チXクフ飭クエZC/;板]護Jク@チAノテ�「.リナD�!エ肇)W'0 bs、惆ABワaナ'.J.ホ窕_。qNヒZ=シR・噴ニ=m@ェ沼2ヒィo「#Qナ 恰旌キソ盾Fe-�r A掀「c退:モ65ンヨ蕾 ミク*エQト鯊)gロMヲ笠9Eン9D痍p(拇*ニュ+A奏X禊ル,タホ�T�シLカ枋臀ゥセcDロ#`舘ラt�ツチ茗サ Yミス&イロミx @幹e@<jコソ碯c - -W撞C Y-ヌ iオ-?潯P芟Fヤノ6 dツhuト歯・vロg<果5蘊iS-|8險曰Jフ2(kサ父!ニ迅飛9ハ苡竹、ワ�QkァS6 T・sユカフGョフ祇px;G罵タニSチツォ�(」ァUォオサ�`ワ �(ネaソ[ー懐Mケ0當ホ怒 -}モロウH ンSr!n3%コヌ號ャョレ JCrRヨ]ルHオ娉[oc」慳ユHキ9ケル1 0。@マ酵.0JH*LL"sDd秒U6チヲf)M蝸Hぴ&穗ャs9ツ拒」「 sテ+lR侃煢 ァト7クoB( 亅"ハ"*リゥハ{zワトlKフロ腱$_gァ"写k&鼎 q_dスPyアア、J吋ロカ<テ嚏ヤ !」竿 メ餠癨$p3ェM皹&`3ト�ミ鉅%ヤ9キ J"ヘ縢矧ト -・M蒔r・P3U"p5{Eエ タ ・鶉l? 賎ナ8ャ層「ェ2威%`レBtル共Z困垓ヘP鑞迭Tケツ恷#「DC3」飄4<萇6�U茯eワンヲQ;,芋*z!・瓔 セモ-3ノヒェa#ラ,4UD)|Gヲォ"'ソ[ラuZ!「ヨゥH隍えモcD:ト甑壕^ォ[o黐@ッェ祖H襖X5wネ━~)"ネナn@/et -「qwホlヨ ウ; ー8`1フ>a 粢6;FNmス-」フセiT巓Wzユ3・Xk\ィAヌヲK>YUP毳オ!R[モ|%ユ&ユW\V}Wィ}kセyヤヨ7叭ハ>T巓|ソェヘオル輙ov@ブg酳Lzメヤp8=綱]gV 迅ャヘN9;fマ4&a6O#f捍5。O2+ォア-ウニホ婪m啼ラク、Y'ャヤトニoヘ僕,ルlホ3ホmカi胥fソカタワvSMFQサケン<_飴霊Rジafェ渤tfメキミフホTタnU/Bソηムミoi%フ.s%レ擶~.ィc.?ィ洟ヒ鵺YA刮,擡「匙oコ」~椹丶戌玄ネeセ・冑ヲ>ィ.チゥ洙Kyマ哮鶻」ニLイ4レLW ェ謐ツャ8f"ッL26淤ホンO8アヘ拮「クケMZ7ラ膈ィ7ヲノ趺Tタ悖3ツ惡「h麓ユ4セホメ喊」蚕モ|プ;S昔/lj輩散ム2L3?エ)m讚6スホ|レ3ッ?':「ニM4Lラ4Wサゥ、ンッZkwロO票`3*チヤコ|TO&錆1ユヲ=&゚貧┏qHア衒嬌姐ゥN�*TニT怖、cォ�,1蕚Z,恁jS@f2テ〓c?pク葺'ィuェン6W3旡91オ網Tb゚Sμ魘Wjv髱W ャロ ユ意'Bヘ<}ツヲヨ>アj4イノ7ウ-メヤdki&ェゼjトZ鄲'wタッ�テ&pXロ:j舖n{gt-甲o・zロ樢クァミ -!ミ「ンノル壌製2'ヘキj 8 -メXKネワ Tナ@?ィ゙ャレ/{ョス杣縅Kャ" 共゚vZ狗HィN Tンケォ@ゥェラ(!祖ナc宝{KF撰搖jテT┷FDBF8ネ頂タLoシュアU鷂Q椏セヲFxコロ ォv@6(hハレ$2レスャ,j=蕚+gzD<Gx覊D -ヌミテウB餃ホg95#ャナセ5?ヨ!。 [ラシネ!マハ蛹X1田Hユ 蹲(匈にc| {Cサ|tツw蝉レ.シoヌ娚Z)ヌ聲 続極s6kka|;>ーーQSャ髞@冗;・Bヌ蠑5ツ)42;2躪k"ャr$ф冪M8テメ隲ヲEqj!ツA依ツ鳴C□qォム&、。ァ"ル+03橋猜虔ノホoF*ィイニ~pオ8ツ昴 DゥX *[カシ*:印ヲ"d、;6叫ク?酘$モロrU?f八ヤレ3@=Sヲ摧ヌア. & -)ーゥ"t!f楝ンgモ3i2ヨ& 茖T ~a!ムリrv'Stィツl� 喚cC=1>ア]H・P E マY[H&XH&dィq%ヨ7Fョホン,ヒF9UmlP><dセ`ャーモレャ吊Uフ{7`x$逵ュ0ゥ)LWレ冢M]q2"ノル団]嗟腓jオEロb椅(ロH擂@ ロョTオ*iюn從゙胎7 iラィY鋏Dホi'ラ&テNキM碗ルトキー0暫K、携カ槌柎チ鴻ル棆>フ子Dロcヒ\s損椣蒹o, -ヨ~AId惶Lムl -カVハっ*ノU2癩チユGAA>槃Bi� サ�」ヲルタLヌS<y~{ツ-鵠ル%b@ 4ノレテE[縻`$)Q虻ネ4#≠ソモaBッヒフS嵯ツクヲ&[Q -N-黨zゥラ<B*^闥莽!テアN)).+uTテ_ス0K8ミ7f{:a 轣ス慧9Et・゙アヒ席ケ#]$_ヌ4!・ jb)Bu彷。59l~ハx\v伎*k;ツ#d -ヲサ&47#ワ&EJ#b宏ハーq7xe�@9ゥテSm:"tタV殖,r臆ゥネq*儁#{レ、ト"*$!ンui&+L>jワyd茹n;イ -ァl寉"ァチ」3lシa�{頴ウ ル~B\僕ア-勣k゚鱗ン^破;Iy6ニ輻猴ミミ卷 R兄Z匸ハt'忝マqeG!&7ツ・0矣・%}FBM\ 艨qybユワ ッ`P%タ`?r&hqN{)トtエ3拔襤Iチ$リサ9{・ネO�?^b2|FTテ*擦慙ヒ=%5i-$ラ%)ア 8aR&゚]\」スCSラnやE8Z゚ - 藹ネ_メホチ}径Ey�a!悵ノタ:$ーラQ撞鱚(奨ュ)qァS班エ社2 癘Rツ6焼bR韓ヘ。ネ鵲音~"#�ヤ8輩ホ/┬62;7nN微^ィJ\d*2..Gd�ミ?ヘ r汚Eヲチc籏ck <9」;哩夸n豐サXミjC9聹IUス_視ロョ恥fC+ヨァ>q酔,ケ。ル嶇i(脱ks礁qr王・ゥr\皚コキ哭ー恋M憶Qw后KンGP+]ヲ6フv逖0y:橿程)$橄S["tjyイ"<w1@M、|オ紬cコ)zKコy訐=fウmh攅:、j ロ6_|L釁ホ堆?kコFKgRe晃n]__4ョウ_權゙槹\=ル'ソ:{vvr{jニ:レニ+レコワb箇F賈/nッ蔬ウ'「ホ,`Ooョソ蓍ムi?k<rル_゙怡q~蜩」狗ィd識l7迯M撞マ>ソスォロソケ~蕈ノOnョッ|G逞ュマホマ?マホセZウロソコ] 毳zサミ d9)セv鳫2羆カヌ9ノoセzv&ン^ル0Fヒウ嶮vcaセイusIJ尨ッ_滾wv瘴セ睹ツ_=&{ツO>セセ袁ユmロL韲ウ6!?} /ンシxケカ粧セワ誉暾ヂーaセワ{アァキiォヒカ、太ワ埴?゚g|リ'オwP*%8゚.酥U`\Nノ・"ョ�vャc摂 .Sォヌォ[<゙サ「Nbt�d03P眺ゥJh -ェ6ヲ櫞ア&�APvクモ[>。f因」アP梢H掟<'A(2・ソ鵈Btツァ半)ネー2[l}5ケ7イQ習゚dツ'QE/7腔アW牲劫/「メ)U 鬱ツ7vソヤルtキ{z@^!乾Mieセ:/ネ横昇ITMョ K#ヌォロ鵬」kl;p皀エuD6!5蓚G塁桴^ン椰]:鵝ク・1Nネ endstream endobj 69 0 obj <</Length 65536>>stream -ウ1「j苅wャJWノKd陞MLkdマh鮫ョGワネ首xカホ �/G'マz路"&JDe*zj爲=^ツ。ノyLTZ琅~ー}?rク8僕L、"゚)*オホDェ*レ' i痕、ニマ石 W倒 B衢u<・Wーrモ典pケヲ鯔D&Mх扶メ升b鍬a誅 界フ;釘hL?。7羽ムgシ458マD -:」間ヤΘ'iタ%ト�pos"ケ・q!」;潸~ソエレd{・T岳\ヨR覽FSク< {懇サHkトD活,~"%Y逅!#Aヲトh&Rh#F."OヨBO^OンF#シ作ケク粁w獏zョ ウク[Hヘユ訌t」4�#モ艪t�eb,~祿=~サ -竣ヲマ゚菅羽宇ツ以h"E.#2ユ聡瑳2ヒD淹Ul潮巨9Oヨヨz欽(サ 」瀏フ!m#ヌAタフテ"ツツ(ケ、FマEィAフl. &誌h縵C,イ=c[ヌ鳥ツノ;^ヘタaーge册a],'eE�ュ怡シ%>ヒkO(D挽ォコ%R蘰ヲ:ツ匸喰,」rっeH\ンh;H=H<ノ~`ス:屎L2ャgオハN釀enツ凋 *(D_カrN蜥トハ=クヤ[Oカu:Yフニ0%k秘Bオzァ|09ハe>陋ニ<3$f"ワpW捐曙、?ユ拶ハ綟ョ1ノq喉菓+ヘ"WFナルF -゚$|Xス!雀Z 3ゥス゚カ{錨&Tマ$舫8筒ンマ%<uォ。JiRイトR* -スuシヤホロ楓」 b'7ヲヤ突イ8蚫ッVP蒄耻-魁�壞筴&臺テ1rャォノモ.キュカォg臺Hah」Kmォタ,\ 攝gュ Gy5yム蠍螢クウ雀~tB楔謝nメJ」ヒmG。フケームN楔NイヌG'葮G瑠Vノ<咆<閼<k}謂+ノモ.キ=領ノKヤワ挌|ヌ>$� E& i オ%エアRクサォhロc(ヤ $イPz_!0亜L$.R酔繍ヤ8DCチヌ艾;亜庚T*狸#l憐メラ床_ナ 」!-*dX城 -ゥ庸q、、ェフOG ッn苻[)}1ネュ#ェ7SメBU、>テ ゚ノ1ヌテ -Sメ琢」p2ラ~,ヨスTr蘓唱D!S9!ラ<迥マメrmP++モ。ハ臠 畤 -ル�M( タ盂IE\刹ィ3r糂9ャ+qT"!蜜 S搶ィo#bU浦゚_Aレシ甃Yケ沢tqX-E -ショ_sェnUD鏥:Q邀-揚rツ:r鉱(搓幤セハウネコ庸}窃zGaULn佞&ツヨf~2害\ルッ#p「0K:I0Q_ -9PネTs藕ノ9ハ)sM文I c ヒケヤn_ -VD=ゥ%扈>鍜蔓エm゚x醒e%ネ&!Zァネ^O6Eウ.テー エミア゙綯ニヤマF「Wホ61 -\uソ讙]Kc囿航真桝mB6。^獻=82罨゙?噺)�璢ハ'JiノJnU痾譁ス脉 肌クkレ<9績y]S`m(9衒后L2ヘ"トd_ 錫ケAN|;ウチチイpOJカ吋ヤニハ寿/|P{乎ノ圓Dネア>]ォ嬪f!Fmツ!アs釦)゙S7Q豹{ホヨm淪|zF]hCケN當タ|♀2ユ1X%廰*ェッnCG0ュ>ッ6u"ェヌナ衒サf?,qTD`I&bネ4P臙ヌ%做ル&マK/ンッハン牀鶉ーヤ、U理rハ6オ+ォR'Ms)スイミ\ェBオク題コgu゚Rt粕ヒ 匈・ルnヤ?]モW憖ッuH"Z@FメマQァ#iタ・「 ヤ。レ;ラッ惓路ァトWvャク詮チb゚ッ`筏内ヌトv、秤#珊0>3蔵7ムZムA セヤ・Fユ凰r|マE恤 P)タ~ノィiヤッ -}6J/hマXォレ掬Lk。レオト。a Rィケ[c壁ノリI鯔2(ォ 2eィ)Uaセーワ携ォJキTWbUNmホF7(抬] レ3ハhSニゥササ=F揄4TYOェモ!OY1$=HK;kW」ワruェ鈑餽・I{シコ対J-イレC(ルx^"{ンンカヨ包~&詼LA8k竒サa政ィL0詳[BXU~欄&レ{y6ル% |eュユ6,0ct\Ο佃貪糴R'慣gMヨSQH冢儉ョcレ_ル餾%|-m"gYO= ^Dr゙レ゚8*q2�ツ」=%/?Yエbrzロヒ 晝#'藉"鳶cャNモTu"CU凾.!レクぁワ禾G4�"K徼vCスc0ホK/ソb P+゚/トjI\z!ヨa納ェzY`r,IソP LEd>陏ヲ/U从Uク#� W5ユH\ル#幵v]hテP士ンョテ「ロエル C,カws,J }ハ囗ヲCΜュD督k?ワル5gコ3Yネ碇Pヤヘミリゲ」&輻hjOyヘアLF&/採Mヤウ>トレ。CネBy v,Gム1」x7+ョ安f=「"゚ヤ毒 /Daノ琅YLモj.z8ヨニ腸ャ1」゙廈「wヲシ5織゚ ヲ",?f -ラマ:Fイ]「」スO1n装&誅h41オE莢モンG針ミ4�ィテ 鴨詰.ゥb"笘ヌホヨ濆ノ(ンHd=Uラ/L$トヒ斌ォ起盥:鋩ニ・瀬wツ4c}コ&サ紋コXv檗UDL付 Y6ル邇kヲ 1貭hトe&M・i$゚サ5トアアク朝!#/2ku燧せタUM I,.ナQdォカ2&シ(r*i11:籾Fラ8jラrタ`スャ66?固l.U=服ォ裟N@。xリ5゙ュニ/担オ躑\゙:;:XU7 ェK性=Xk淞\ュルnキ[派ェツ澤cfo糊:俣ア:T[ッbI-スサn拗CュゥZ「Ψ1M襴[5QィN肢ヌカシ9]沽&J鯡 髭槝」W=Z,スン埜ラ檸ェSXア*ヒ jヨ疥。*幹レロ+マト#rJGァョ隘ゥルげLL9B、ィヨ砌ホ@>hラウF袁貂捕 2汝Zニj rテDmc「jア RPRbエ3堽`ケヲォ>ォ<「[ョレ熬個v]礇)ヨ詫h」^J厠M0kaHMO$ラタ・叮5Kォ�サイ攴hf'、3岱仍ノ, S;陛N5ヨホョZ2、6=D虻<ケタ構<] =) --rGト Yフ4o柴Yム演3ェG裹)�「キxgN、VッnD.5 -f6x゚ヤ猶PBXネ!fケ 「xu#ヤz6吏F'サr蒙K實アイ駄L$!wナPクシハv丈λ源eK%及c& 2セ襍sn[ユョ|yッムフ; .D.讓、ヤ9&vナ1-/&淘}、誉「fN菁ト熱揩ウイ_メa:妣xF<ワ・椎ニルヨハトT6字氷T0逆TアDN$abケ MmL オウリム゙焦KキナPサud\#S揺ロ3A7娑ノ ァx,腆ト椴 ヘワDル�羅ッjW> 祁vJ,チFホb+, 90^#訴,ツプ+\ルャ|ム歉S祖PO9a01jミ$鐫&僕ゞn嗾怩>ロ,?ョ鵞?w8貶。sレUgハe「ネタ2ョz「暄裕ー#mラLェ&Hー\ユ47q2セrネヲクF>I 5ナ)ムラチトV>握|ol1キf W潴gス獲 ヨ8ハヌ慂尭Aハ!ネリ(ソトGァwゥ8-エ!@,Р 8F%間ZBGネツィ - 靖Q'aケメ3`HE5Qf・図Q輜走ゥiW`ェョ�~$ ヲTーヲホ 佶9鼎mUト2ア゙0u!02ゥh脾オィP`緇ムハ&rEーェ*|TRノbォsA:%$?}ツB:Nサ」袖FアW笵「1貭nヲ慳アナ> kヲスTrqaBV「ハェカ)サZGレ@ーニjマハbFF5]ル#[.ネ愆ュ姓曚ヨ褞ホX飮s鳥ナョ倶ヘィ5ー:6M=m.|セヒYHSシk跡чモvホ0eェ。エロ%ォP@�コ5*モ }V蛯1pツrzラニ8」v-vvNO(覯Stッ浹wyヨ&H#.ミェヒッ?ナE廻ハ8ィ肝ハネF:ュク球ナ_ -9H戌フI@tャ%/ィDJ ej[敬bB+Z賚ケイ*%.7HOgyHJfv「lv澣 Y黄jpi笙ノ ンャュf銑(冓ンレ瓏~4アeク角血ムア5痰Qu13k?XG゙ォmョルカs霽ス{ス6Ijヤロ$:ェゥ桿ヒ! 9{゙F#c0ア観、旱Q絵ォソ"jハ' 刔q「茗vスX鯢B.タ~セn。dq/マdD -g"'63ルKーシ[,s#lX{ケw,:Rメ�ヤ盃・Gッヤ(9ュ -滴Mカ3ェンJD」, ^ヘ鎬ハヤウイ$鷯豐#レ+伐チ掌ン]!Z#`9イb冶ォ|リヌヘ00ヤ-->ツ+Q沐コ~LV/ウキ綛ネ硲%'9 }LW.dX致K スン .蜻テッ(A 4ADカ [處3ワ�フ'コーo遵ェ$韈$-、{戀0Hbr$Αノ」リFP2kJTMトi�ュ:]ネ0V耀゙餬pQ>F貮Dオ櫟蒲@メム E U延ニDu:6、h、錺モ孰jワd>%D刔ツ8&ヲ悧キ」g。ー齏鼇B8 ゚)|d -踉ォη。,/n蛤Pミ杉F#ケ769。#P%'ロク -k&#cヘIマ=$ヌ駒 -~" eゥD。ュ&Fホヘメハhワトイ゚hカフ躇ヵMフ1ェャ&"ヌ「マRン`yヨホ`&ェヘ惇\眦 (゙ィシ穰ツ9爿鬢ヌモ終d#+/9浄、Fミ「Sシ゚A嚢ナ紮dW拝ムe"乾UE閠 -Yセ涅韵ムMIBイ钁菖фN%5ュ2y0ケ榮D,ヤサァv 選ヨェヲル^⇒ ル泣NァMqTc^oヒ 「ミ!ツ7iソ4l+」ゥ[.rイ收?[逐J4ユマ「莊r屬l$、1f{?メuウQo簗イッアe鱧’僭モシzY予搦4nN」60:Nォラ、H 粟イ(5+辛Ylフ餘7エ$スヲレb ェwW。フD&逵t5. モフTRVfE �箇輙Eト3o」ェdIa絖ア兪z們ヘ%宙^エ・トiム :サス`<,ツス3t7y28]$淀'アN{]ヒI「ス鵆ンG2�ウ0D+,zケPxッ<ェキTfテ8cヨy。彿@ヤfノ-zャ茲Dツ#1$W#G彳mラロタH(楷*邸dO}0ァ~fW暝ハマ慱F豆}@5ーフ P$カ拐ユ「jEモf「・~マ「41>ェナト<(駄1ィ(JM地斗 - 幺ラフK !eス!Zルz腆 萸穂オ゚e2Lヤ@ィDネvG「苻e佃~R0巻イナ5eニTU*脈V d' 9Y0Lスjc.ェ~EYgッモ)ユ数ナbDト嵩n/像Vufミ゚;1Vセ7蒔&{ェ乢+」ィ詰悶朷セ+賄櫁薛「ヲdナfイFプ。ルEK徽vムケjカイ゚コヲ裄ユg搭lPi/ルD代Z《@xX8ヌBN"%ml6カ畉<タ鐐0C- -Y勲YMルdニ崇マDl劔h3耋!悩トW?aVh.。ZuツタbェウJL1In;5!」琶イ W劭:*キ、.盗c摯.D7イXヌチ!シF!{/'ゥ託ェ 絲征リ=I>鉾サ/}Qフ &D$歯ab酳ゥ臙暄vB)v翠MX9ャ(マ)ュ:襁U「昆垤' -惷j黨T.ツメQユ lm $'.{ソヒ>,Dカ<(Z!6^T`Q}Qハ[P隅zアアWウXjj6ッ湊カA5,V簷<x艱狼.ホ|ーケ佶Iル@ィォ*%セ1哨_ワ^タ族}゚E授エクiナァRフォロFサ『BTノ耕ォ鮹YgoDオm>]ンフ糾單+褄ヒネュzオラ拾U+(タIヘュ- Oウ/#0-4B,イy揄!ゥヌ6J|"燥「+6ネ=8メ「ヌYヘhユヲ !ZノォHL>&ヲ案リoRzノwv因lQケ)ヲナ]」邇�Eク@&藻ル?BD'QS冦0L,ン「m Ztq -q0叭3C@択ヤ蜩町オ/$「GSメPH失'「jv壮(ヤ ,メモx8ィG劵ォ #ー+ノEDt輝涅、)8瑕懍gルヒ雑d・粂9 ∃ェez%9,U&fトト廨スnユア3リ&ニ{_ウ$sアサS"ムW;芳搜-ゥPタ$。0ノLC融%ヨO(リPヘル.摯、ラョヨaャE2ル 享ルニ6P-w亀rA:@。|^ォニン)izカ。aユォ殊`2q闡JテニS・ウ>ev -構2rL3グミ2ノホ @cーLQ|e「EウEDヘヌゥ゙zNF ロヌニLg7t規RXC(豊Jリヌ:2ムホQ^OZ*フEアdQ痕-ー:キnミマiヲk・0!i Uホd邪}4hシ-yナ4Tナ^v プHvイャ03opォリ)hdM&{Tuk 貘捶澣) -\IUロ$@$X彗獄鮖*(ユc#ナYユ8 ~蚋H-ネ?M'縱4oア/$1ルWm - フa葬┐5ィ|里D(ィリFカセc!ヌャ9+穂d"Jpオ_ヲhレ塲ヤ・Xナ;IiノLFォテト*游Fhj= 兔桐(タ9ヨムj~Lア<zLmT(チ厖tヤsIェDノ[@^ナFv喊?J゙h8xスxエ07霎ユ財-トィYh狽゚w旁hdo叔ヒノ薤ソク>ォ。クTムvセK蝟U4ム樛オt<&%レKク+ kQK1俣Da扠祈 頡ワ群レb0梵m �ノ轄1俯z鰈猛9慈ィ5T鈍 樸.yソj&ナ;k夲リ}ャ茯,Л!|ンk゙榿紵KvbSラPャケ謗3S;カ2タbロロ3н9 !(垰1r摩l{(ヤj九8ケuモ[ヌJホMォ~,キyカk渋ホ6z"yム^ォ,ケmQッ籌!$カi@ -僕シ感Ht* YV$hィ1qワクh9絖ヤpLー*オウ6イニ9=!チ[コwF-G&ェ、膵~VY寥<ツれ甑。ク呷M蕾ウ8]F%ヨ!飩5ーA=*墸Mルェ_i墸8ェメヲaad。ィ「i|ッgaS6ユQス9フ。!レ:T 輊侍¬}ノー&zォTマ「fヒ>ィg祁R攀t vサ悗ユャ瘰。#bミ�6諞ッQィfェM゚メ+侠ホh、fJOaレ5フn \,マfKFV3eヨ嶷 bーTt「ヒ槍ェ$マ&;躄,VケvルlVッ稽ォnoク柬贓+D x・オゥu 巫ォ1ュ  av續 ロヤ澪ヒ/z-d"ャ 8カク5暎驩ィ*2ZU報FdW4ョ�Dリ igツムYjBハc7sv恤儘橄-オP捍T*ゥ複Nャ。hC>ロdfR5゙さ咬セ9ンノ」カ沖M F.^Aq俘VFチョ2サuUrT勸ェュナeエ$is4兎巛/[T0 &ヌlZZMクTM厳 #σ.ニマb",&W#,\.<省y \]9ハ%o, -d'zgクS"ヌ4;Iユ蝮チアe鍼マ<)ア シ|$n/ユセu下イ士=蓼Aヤト蕉{2:Z熹{K棊」コ<)オ〜r囀8aWz之LホДx*gヒ^!8d餠Q7室^サs喙3Fァョメカ椽\タ`5レl郤 ?ラ「キ9オuRャ゙オトユア.Aa表2ッ刄又「 ア9メう-漓羈ヂ@ケ)顧Y鑷LLユ @イAィ&BsラハbラI0ヒ(Uレメ」d/Hソ陲?r7h( 「ヒ!'Iソ赴ニ8N菅ュ屯-メ鋩ル1鰤2=ルSイI=2Tkw#Gm ,9雌9ネチ$澄ユ{.�Gミ4\-環ナANニq▲、L窄f 8Sコ9ォィ夜ェキ/jO}rホB畆Y%\スム]^ハPL'鬘ラ{正゙ェQ W。Z疫Bャ垉店ヤY]O Mセ=ソz|Bエタdマ凾Lゥネト$)モリハ"B4(ア iハHカ<_穽 yrルSt7')"」D2ネ*qEjL梭」Hョjoj;01dAD&n聾「':チ 頂「A.s「ヌab%9遼柾F~_%哨 -曵ツA「0ユ硲l箪u0ィワント54Egn H ャ?§,~T欖ノYSG"NK\會&飭jw$2瞥蜿 黨Dコ盲+@ス「1J┨6杷イヒ~4fイ*%9{ヨ4=N濁qz3s=ユ%pBy」クケ/q*ィ鞴ユツリ、*�セY`[ユ+REV』ッニWt「イ。x:#ヌツiサU"ーbイ3 �カ}レ┫^mユ2a'スFL藕ネ耙o=ホ4ケアlMtノ|58(_ム#濃eリ -「妬Su(ヤ1堽|UdS悛ャj弟, 0ェ嵐cカマノヘIq ->!サ:メhヘ抄Yッ{ヤヒ=B.ン竃� |ンNV鮫サT。 ウQ」fJィウFボWiB`ロuTオXツD田yコ耿レオa」"スト臼樊ヲ _ヲ納ェ票唯tU゚ct$~メxiヨタ覃搾bgー。アIB少U7FCエ!ロナア5D,p>・牒ォ&@q忱ゥ ィレ遯{0勢レ檮N -畜錬 "子ーM僻ワ 甕nヘワモG董尹IV&鬟ジハ軫"癖溢;埔ッy枦Xミ]"ムウ僣悦bMkホ膤0<凰8Uミ%亊」チ、hQWウXチウuー[孛mgヒノツ hCDウZトロキケGナB=#;熨jア,ツ3ハョォノelノ「N_bOオ0lA5ミワ9イフMX+9pjイY4pLアpュ' hニ[% -オシQxc梁'3d a-ェ0D1ァカ鱈┤h"マ思h5゚Uゥ枴"/ー沚ェ;9. :;Eモ -「cFテヤp甎榔Xa(}*ャQKミ(Fd澀KR'U弋pt'クNムク<癜ォWReZ%Dos嚊ホ<サBョ夊唸!_サエ藁%。敞ウケタF゚,/?k$@I東儿4r[ョタ lオ掀務ア寇2テ穡双-L<3"Dノモイん,ソエ鰆寶徂[Q7再ゥ 9 ォモRワ$ラLイ離ナホ匯ッッョMル@YKッ£\{`QP臧ヤ4スN#ラ干(M冫ヨ新ャホmコdfチ忠チiT"エo -Eハ9ッリfe*痕i(ユタヨ異R^リトトャ9.tル)ッR&R|R鉾ユ`W[`u^ク2サ$d -ョSホェ3^ル Z,e}Mラヘフ糸 uユ3.s2ゥr(ニXコAlns4"qQ+w8アハトアwJ\cヲz9レタ臟T�2/U-B励畏Iォno&嵶宛ォォ冩ケォナュ艦wサモシ酉u陰ッ,ナク亊ウェ暖gノワ=Qワタ`"Rf鴣XネYN-j JリnヤHq罩zl*6@B。8酵ェ怛レ ^沃ぬXpォf-蔓メト+Z"低ェヲ蜜7^粐瑣}Q0[」=Nモ簫h'tJ8桾q'^?ヲG?アシ)=6根、,P P*kDヤ�ミ,q e謎ナ2ム7iTァ$Mギツ備・ =ビ41艮@ -ヨ6ゥメ拯@B -T=・6WCR擱8%ナ既I哮S「ネUd4M#liシ+・霈カB4OオキャヨhワシICウUrセO剄ォ3ス<Xh-y 、ユAテ癆9P 檳・Z0 i吸ッr*?゚ぞロオュ ォ:!オ」ラ鐫'左二<9Aナ$憇,ヌノヨヲlZ杭又� -]メタh8Y疑フ」Z8)ワZウt5「慘・啅ロ0ェt8pHュWJK;rJzeI/Iチチョ#「キゥ!=ォIa深~Vスフ A_SP"ソ/(シク^Nマ謀jT。1`�ヘQ愛ゥ!/J「~節Fウタソ重I�:ネg1$XrD+(モ銅GコL袈i0娜アヒ t I�狎% タG-n覊?叶h>申Si0 <ツ{kタYトoウE8燕KfヘムU星Xァシキ^虎kIムrDFサVaC -ハゥイ門F|滬ム Iモw2%gZ2其iIZヲOj嗷IO幡チ`f睥A゚一Mヒ I臍BュニCテhァ7贅Hョ洶ィy#ア倥 Iシ#*)D訟2svッゼmM謠ナ菘「ネホモヤt繰B -ラA秡娵ア #Q搆1寞般 霽40ゥHマ3ASュ"dx喞65L葮槧!。>ー&;bンハ峪":O好コヌlAn8#」喇G縄ヘ{ィ ハ-ト*?`H福ウn ホIラP3ロcイ救彡ラヘ、4ユニ凶モD OvエTリ=ャU] 咫マ蚯ムLG・IXノ;逝ィク@鯛ン背 Pオb -c&旋>I@ba6ャgweェェWA1 -ョYu dム 「f壟ャー忖ME」ニ4オ1レ>$攻p枚.耳:ノナ!3+ョ、].> カル;暴 。*qナ04T凵イ&ホ妾 {)菻rp -齔ス^*8�チiMM!ル#i桶聟iケ -ハ,+6ソ(8E」z{2F画`w**ヲ杪 ノ。蔭ヲ塩h4峅-ト`。鎌Dイヤ4泉メネjP Rfh7/@Bエア0燕乎ミm」Fリヨ8ワ]走ャ蚪Q}~煽.彬1 Q 迚ィョ&Zn!&>I痛U]cQaゥタメエ鼈へヨlヒsim`JカネbnW喊dウェDル゙'|dム@跟LdチPFァ6R`t9ヤQサヤrォ段緜6ワKオェ|-"j eユシ.ラ_C -ウyモ栄ムz0チ4裏ーLDユロ慊QDmモッ蒭&ゥ>話Y@ォ&WJP、惜薺Ehコ}8\\*^ ワ$T~ヒL槙ェャウh)影ヤHリ8ェR]ニピラ ゥ_kンeォハSテ$p枌5梧$ネフ「h8ュツン/Di?ワ8Zチi|5LェH柊ウ"ユ碪ユXYマ1ク|ァT揄チイKrB、ュtネ^ンア。N璋c1Tチゥ ァ6Jセ罨~Vホ$}拌5到ァyNンw YR酊d勤騎4DfjH・愾エv -鋏I怨Kケ、トクシケvキ(イヲア衛.監仲ホス・0Yr1Y PLG蕉}oゥルoエh[-まEA-O bユ�~ハ*「ノ4GX5gLhツウュ8@メ莢擒タョ前悗bャu懿;u。阪�i{ン 6S」k$甼モc*"ツGShイウシLハ 莨K」茶マ98ヨ;時>h并坊3ラQヌ7ャ&ニヒdヒK稔ティy)セWHケwLQQ"ロケムィ'ヨ)#X12繪]ONラIス8瘧ナN d%吹耻崎BUテェPKヘセ5モmケQlチD,�ky{Qク掬e&ケェhq(lー轡rvャ佩ヌh栢`V\jJ。チ濾>・NA竰 -貞"。I1陂レmラモ|妹ッ箇ワmメ fチヤソオ6ハニ j#ゥCgィ罎pB痼S]チ曽オj+]】ス哨ョ餽Gマ` -7桔eヒ(%稱5服F.=xオVM2:D亂HJHンユコ}<GLフA*街勢澣{Iルシ袴恫゙抖病IC`'宥ミ隊Zヨ。EsヒXコF4鰔G、/{(ケ3),ヘ"Dテ甅U脣Tワユ=剞rE/\摶ヤゥン5゙ォxt衝rイ啼dm&Z斑・眺V[I[劣瘉Vフス、x殉k5サ[Gfルム「FW~K。ヌスチ;懸\sゥdIテ*悧qャdsW賜?シ駘(估MTエh轉ュヒTSp搓ノC6サuイR噛Rxuメx �t荀姙!ォ輦<)&ェヤ、。ヲ牧・ェ4ッカ巓養pエP[Vサ'黯#サYンWシwテBナRQ'6#スgGャ ワ侖J;xNF.行<mb%ア7pユセォ=Xセタ軽`サ$ュテ�ィィuニ簣@<ンMテ6?ルLKワ9*斑絳濾#ラ「鞦0ニ)xラmjレ隋aミtサ-獪u2ハkeト,rF~hンR諱辿pミリkq)CレI剞/陋テ/゙ォ'K' {゙HノR|~雨瀰F-p盗スH、時ホ隣 尖シQ;畑゚"7 賺zョE7oオg=眺キスユ魏p:;Y/ー慎N$,Rtmf'ュル^搨ャ{拮6gC桎y2= ァ1、・g}フn゙黻8軒=擽jZ+q鴬{ルfナキ<ヲtJt面RハH0P_wDnwx`rDQ 9ヒdヨ、fァK=エg┫゚」顕SRンb゙: エK ゙Aチ1)カ+ヰ影E@wニ<k「ツwfワzヨ�+スB6ルiラk -挿賂{LヲkイOハ念シルシ滕ヘCAセR咀d樢貸鵐.pアa餐ホgヲ.「cmz*問精遉4]Hサエンレ5ァD -7gGe#O,,チxイェキォN3ii気ツ囁Wq:、 -gFョq6、顎レヌ|HX B 叩ニC%Zノ<「tP+サ|オ4拭|ユ/oホッnマッ>;8`2 モ?} q鰊モ沮_エf~h?ヂ繽ッ沾睇據゙枩_杲|コ?|ー?サシクj:hンコ9菁ル゙?シケ9Yx糜匡7gWサ゚睹ョn゚?キ_=;テ゚セ睹楙響ユヒソヒ'/ソロ誉ロ誉ヌ'?ユi{ラ[W渭_粭ソエ=ケネIx「u -マ゚9Y{マo韲空t頷Lfcメ:1クラ径奐zモマ沺歃}t稠ンセwメ:v瘍?:tΟ:K蛩>Kk~w没giイoワ0|oンュ襌モロマラ゙3o>?;ロオ、樵1ュ?「?[{0カム脛jq|�羣膂ホNo?コ~qエu」;f}倉エGo浣=タル;|ィクlソW/ソ尢゚キ/ソ沾ク命}qノ給ウォモウug\]s・;0ェuヌssナナS軣ココラユT,ツモソ9ソ8[`ボy#ナ/NoOセクヌネヲッシK穡H種涛軾?ケ9/レ兔ハXxチ葮゚ャノNヲメヲーツ__ソク9=鯱ノウママOラセヨW9ホッ6枩ンqg0埆fサ丞ルルヘノレヘ艱;<Gラ倫ョ沺゚゙冐4チ&クモw壟N|壟{サ讀 ネ_?゚驍;]「チオ鞘驍kロ孥ェ潘ワゥ;Upァ -レ{ -オ77衢ッ゙`F眷ウマO 萸P堵ラカソア孑椿ネ洌/ェ>}ニY゚゙! Na嶄ヤョ?ル-Nニヘルモ{ア7fqト~A#} {.7_ワ{oロZヤ沺ン|vン>セnTンY暦ョ;Uタ筌黼ヌ釁;p髑3喋goC k+;#ネV 肖蜘F信棉ヌbY ;#ネ靄;#ネニ_ツ;#ネdgル*#Hモp?W椙シアモRソ[-趺ラロヒッo械ヒ令ヒッヘウソ9サシF1[屑,ナャウロwa゚・ソテ~銹梅Zg胥>タ>N〉ウ~\#?ホヌsr衙Wk娼茄キ'7ナネ%Y{POララユル|z鴿ユsモzvvr」{畦ニ;゚啗x栲cタ咾\xウ空ォオ歴葢釋ヒオ゙ネレ貉8Y?ノ蓚モロサnチ鯡ル 酔ー喋悚セク|qqイ~`メ。Nョホ/ム藪モkw キソ[ィォ ^0Rgヨワ|kj5;/ニキ[ gohケロeキ<{ェY-ソxqW゙^ラニdl -_Xロァ?}意ウ@ツ aKY{ w y:キムケ#<:精%,l;ミ{j 宀權憑~~yvサセTーュ7鰛ワ}セJキヌFKサEソA?vセ陜/z迢セヒ^N?>_4抃x」チスNホシ?マッエラマウ疥ァ゙逑オm;ホシ?マ;ホシ?>ソnラ踰zホ;゚l_拆\\ケ.頗゚~pz}qサ稾幎_{z鬧/棔]_5-緞}NグサW沌f/n>mぷ6鵈・ヘf~ヒVylW=\\孑[<>_|vsvvA;吉彑==/ホッ/ホn?ク9{チヘノユ]茅mng廐.エウヘm肯>R萸@キ3ミ t;1qm゚ノ沺_セク圉=ホ[^{Lg養ウ&o<偖蹠遉゚ ;乾ォ)ヌrmX_ムvvレクフヘY緘0f,ソ�セヨ儒゙&帛 -スC ~鵡拆jKRz6#ユeSリ3謌驢9bル!嶄ホ亠3跪9゚チqロsvニ悃1ggフルsvニ惺hフyFリ竰6ネ2kムソカラ4荐+ナ2モqbul;a[ ユア>楪Cuャ? 鷙sdユアムミP孺゙7.p縊マヌ砕qq~ヒ弐サワhサ+t撞6 -ン。]ョミ a_宀{セ遷スサA7ン。\=*鉢{/碎 ー}x4W床蔬=Fエ5%ァcレ蔦ノf梨&Tアソ「尢f5听"W;d遣HテスC?{ヒネ$イl7堝レKエ5燮ネョ&サC�オイス酋|kオ7>ァe+3w゙ト掣ミ|=ツ{渝~u~搶p慮ウ%ァa3B^6マ6eエ゚コ輒マナ?b晟1 キク,ヒ=ュ$棄|< |lモル.ptkv孕ハシサnSu云トヒニ喜"^vA」Nリ并yル]。w_。ロ」G゚゚逓C^6eQセ�ヌY綻メ゙G! . -#レ(、ヌX"窃ッマ?ヒサソxr踴ク」ォn_ワ|粐j}~uヘeヨ<タィ[ユユッoマoOクォヲ^<并宮 、ベy#ラレユ桐_憊桍q書M_y7ト皺カ[涛軾?ケ9/レ兔セXxチ、鱇ャノN6Qテケモリt;ヨホ 6ャア搬クSwJ潘 ヨJ獺ルcT?ス9iイナヌラ鉈罕ヤタン継種SラレN ワi;-pァエタoォ3・Gァ゙cDロ「クヌ「゙g$;Mps4チ?}Ve<i瞻"-lN ヨ5bq9vィサ,b2,ヨ跪鮨4ユmaララkFlOロV,薫/ョッ -zツ''ァチ>動沱悚゚~0メmツスハ」mヒ。コラカ薛q車ヨ簷゙G;ヒ鯏艢=~ 糴'Oッソ<z,}ネ轗s?悗ル;|テン Vjk トッュr!几テ-スホクテメレゥ缺オ憾裘コo ヲキimフeヨ>興さ靂愎C倚>Qk*ホ飲ツbUWrU゚ Yw'n クYオ7ン、ァ-到vツモqm2ケM釡サHュlヨサウェマWg}xフ G^] 湿コ>yuゥホlナ{晋wW鑁;ヲ7 -ン@ョミ a_宀{セ遷スサAw7钁ワロcェ6」d1エョ; ヌー$゚]?カo[<V」GX9}]d呰虚{クNヘlーモ゙w ク薨kjm砧瑜nャノ(凭Zト鱚[plュモサCョカYシクセpヌ#」sカワサGyオン"k規寰)rh@E゙暇城>5チカツqワ[yシ[n13~ -ャラo゙X#ナlチl:祷司<テm汰ン磅ルF; |wセス#サOマn~r~ウ V熱Y釡徹ヨ_緡ーyオス4?コ櫺sホテ⊃ク:ユ1膝キルヒー~lキ溥カロテo7セ0キ8P!*跏蓐ァ亮リ憚&マヲ qo俘イウ<庇lCd晏dセ@桜眷ナ,ヘヲLノ幔ル]綢h鷂。4ペラノ9N wモ-テマ[{7'Oマ_ャ/聟"麝カvvs'yKイホCqリ嬌歙_\カvXツ漆ュノ゙ブヨ漆リロ漆m {sィケ%ユG#ャ>墮メスヌ粮鰹レ�セッ}ワ磅q0[%=ェxレァ'%o1ムeAャソ邯†Mdモwロオ緤トモセh覡ミ而mT贊輛=垈OY地 Nレ#レ#ソュ瓜#;lモO」ヒ$y8kgハl"ホーセニq6エmヒヘエヘリ>kャ濯4eUム=シ6?功匂ヰカ艪]Dfbx$wdKMxG沺\]拆粮>懷゚スァhm゚゙rナサ止tルナノ鰮袢ユマO枸゚暉:ヲワメ熟羲」゙ネケ{0ハMソ碩6ロmヘ%カ宛E゚jエシ{,ヌヲ雰オm9*t~タサ\゚リ晩鯱ルル浣mョーy番ナ,レォz{スセtスノモ幎ヒW~「Bロトシwル=ス<テ.セ<j15~{rs/ママソモウ椣cトマセアャ)Qル?ヺッ9セギH/ホッホNヨョizrqウ>'/シ貸恆Rソ=}z~{ナ=Vホ^x�oユユ:=}q粽タ」鯤&ッ<診rru~y.Gルナロ シv0ツf6Lマ;}ta3宿[L"サー儻ゥ2c -セヌロモソ 巍コー夘[Ijx・、6シmヒンエヘ3kK」ロ8>^K8sgヨム.pf8ウ 愡ラjス3} 愡」ワ ムホャ?「m惰キ:pヒア飄e8ウM3/ラカキ"レ橇毬,蛩yネ-`oハbワ# mキロ妓イ=kン綢h"?ルソnス檍ク%`I '=襟チ痿Wmス縊;カ縊暑ソス_ィナ?ユ剔「6揄「vム}ンキ {9ク7g隣w・,mWpXヨゼ6< Gppwyォ屐キz~モォ;kネNラ鰮ルノ情1イノ>lォj利レ硼sソ謁利{ン[qカ:>磋岶セQル。Mマ クkメキロ57ナ ス諞'?セzj觜(O>セセek筝オrpタ苡�2デヌマィ妻W痢\_}袮趺777醉ッラ令-~ー7リサ/^エク涎゚~アヌ!ユマセjソa甍鰺}7|a)゙ユ橦nネq`8。夢iエ|佗8倖oJi滄尉Nァ愍R_=XnソスeD}ス奨{レ#-5ー3}メ跂ソスツz=ン 治ウカ/b;サ9r~雉=n`ワセ順゙クG;ロJヘ?7n<kワン襁ヘr屶VラGァ展]<ャル廉>ムe[テ瞎?$wヌ+!)W~g<l?ヲサセ秣#スrソア垢ケcエ}」鉦テ} ゙#レg駱(オヤlウpXイテ]ッ欠5蔬vカ冩O茂゙ソ]7ヲ;クkラ雜;X5ナ!キSモウ購ヒsヌヒe8 nア>ュKmヒyワコ_、-tc/オM菷韲・カt蹶ー蓙;タケテカクwアmエク羲」ヒ郷゚{↓キキ襤?ソ;Yシハ\嶽!邯鉄ロチケNメ/ゥvN悒=・ツセカツt衆ヒOG{<X|`ユ':rーヤラノH授~メ蒸&ァ穩oミャ8Xヒ緝o.c;瓱{ gヘUヘ/ub鵁Nq4モq[゚゙o鰓ホモ5m<ンピチゥハp酸オ躅cホpエFWニ<粹テ嘶mサセ5\(xハe径wホ合霍ヌフ濤儷 wqNソdユタ;。ノ セスw゚ノ娥タ杤甄 - 4mミソm幡ウンホTモ=ムE{g.イゥxg7W?セ:葢ァ/ホ浚ェス'ェ丑ウgラ7キソM黠O壺dッ トレヒJ}誂。ニ|W/ソ_fz愚スWh,qョーxXGラDパ8T7カuトOc:排l買ル#ホ椰キ関゚シ「4ェヘ=ホV;PC閣ネ笘<シ。a ア:ソ>p魏クv3エナJイモ|;勦エ=RウOオ珎。純遘\MLO蜷 クeャeh?クz侏Xpy紡、ゥ サ-カ!&档肄&ゥ'コrアッBP,4Q鏗極yB mk1洳M.l v疎ニテZOアキ/惹ィア0媼w鍮.クZソcトヤ6Qウニュ\9,リセ・6G{ュュFンfn、9エツ0ク巽\1.3sセi'【mRヨミレmラHn汲ケテエミソSHッエ テ筝C:トzハゥqニ・cL唱ト6-テa謌/ヲ濔嫋Zl0Y,r)VーbWs[じリ蚪6@ツbク6鵠bニcケ6afソ.ド@ <qZbv?{oロ葮qン}7ョR榁鄒Qー$%CEi槽,gト棋Tサ P;ヲェ藩N$%/'弔ネr「ヲハrテ栗9゚"銷;ァス焦犠苒8s赭ロンァO溽>GfPク@2yネケ@"ラ!oケR ->Sァ喃戲髄D纖E。-洸D称0ヤ(Uトミヒ%ァ険)ョoJワオホ艶OJリzUリd厥マ0「睛b�1%?xd)(平溷/S2ヘヘc-B2y圷BトX]B搏櫞擔ト^�Yyナ_ -PLT1マ趙U#メs酣.ハ謹ヘL慂Hsイ粢ルテn*\V<B怺ワf艶、s!レマP'ツ!氛bЫァ�,oチ件サE(ホE GO握チ・&=テ>A淘f鰍8ェトナノ5&=蘰Jx渠抂'ネGネウェキ「ネ∂・?ユ垪ァrー\!チヘ「ンx93ツWヘ^ホ躯�セワ;W<ケ埋ニCュ`i2kJI'_幤モ3';:,hU+テS+5ヒ&拂 ^゚SPL賠 ン:!_#X頸ャMカТCm)ル Uノ・「混&Gpyャ9ョノア;Yワキ滄ノb臈ンAR%ホM仙DツVテマBハ缸草T蘋0池%テ鋲) ル 辱iモC絳ヲナd -ノS^ォ ∧ムィ/ル}B)Sロノ2Ttクヘヤ汨pdャ吩+モ(M>JノS"N@,7[d」"タ,ヘ、售NSチs′hOェ*о訌g。+r 紺イmクPS�v苻メ{\ナマ巛クゥU3H.コDY'#奪 �H<Pソ-v;!]d_ホi仟袞Hヒ2=S獨!@%X<ュ「帑ハチ&&ヨyウ4ゥV$怙+3孺。ェニ特盒囀Rp{オァ)6h&[憐9O屏[膺ハ芫奉ニセs 3pS*⊂ニZェ5・ン梠瀑fオイ」"/ X)rン!ェ番ケ} -ォ`n O$チW・ヒS・ヨiニ粭5恙「+ネ審國A0 -&メィ;=rァinユム N帖謖シ-}Mw^Q郊tヲHt罟棘設ェUG_肬冲キS*3DRホyrFカェ8LUN$�Qネъc -。 きォ 椰"~y囑2ェ-Z&▼F溌銜lレラム5ニ=ァ_ヲ兌#<-��ムM!EアMルmワfsA。峙D・ -ヌ JヤpR名RHヤa)Ii�゙N・^エ3ル_QoDTィM'[会ッya==N@6Tаェ`kA蠑m .アィDMeIニI`タs。アEオDl%゙Qニ冏フjEeUスxtfセ罍ヨ2^ 噎>r7テyュヘc"貧キIv{・ら カ+DmミQ!ェxツG(テd度「沌剪"ム佑・恪ヒチ\C譫n腎゚jハ6曇ャbウNP噸-w4} -pHクm&@}<8ミdネ?)ィ#Q{ュJ� ,E`無ト飴@ 9fJラt ρvZEマペO"枕ソヘf"ec[第。ヒチ撒マ1/\ヘエミр"5�PPキkP6JL$トS墅:メ ) ウソ各カ2ェ」硼gユ兆84&R'(!ルリb Y'石iム臻dhミ汽0マキ傀ウ(邉レトV嚀DI各&m{ネI浪,w+ルュuワ メ8-kーiV9Y}/庇エラ0定eイX惹ネ=鞨潯ツ -|=身KE'J、)dク夏 ツ「(ゥ反F<,ロホxC -1ナワOkL=#Eヒ_GョIIZ2Tウレ「+芒k。|ムナハタuィネ':t`#�BAEフヒzィ�ム戮艶η* 斬Aラ筰yN碣MA窒モ 瀬儂sJxJハ*巻ミツ義mZハ孔IT1$hチト厂L萱カ詭Gp ョ3Yxdン>[。rO」~H,G椄jケ:-= -B�Vホ鋼ノマ  G}イ -pネ恩。B¢ェTSフbチ≧DS]b '0p5ヒトEkMンr|ィ]テ*ィマ、/OPチチ婉>嵎亞PケャHh゙$ァ&。ズ_ャ"$-勸暢k謇戻アVpsァホs*!=フtツ。 「ミ2Dェl cfXヤ鉛3ア鑠蓆牋;4渭ワUf]i4oラフN6レエヨロp -タン舩ム゚ギ貯ミン6ンF\オ」.厳P+! Nl5@【ミ$\S゙ Tカ敘3i;w&\l礼ァ靺ozOjp|枝z[ン9lGMg「ム)嚶ヒzDヤシrヲ-ソォソ�\hヘtツ アーD[啼g┣ マ゚)jD「Q4ォ7モaァロ?W虜ョ~ -ネ`O=ヒゥjSヤ・裕綽PケNT}&${ヨ=G�ロ眺cHU礙2?セA鶫メ扇p>、eDツnシ懍;゙i?;m"!W/莠ァ*(?篁~d遨スMP荊ナヨXフ]7ロ'ツ掏`z@r<Lf、f&侑辜ナ潦q幹 -鏝n9訓@錺猥wBリラ7ンZ/Nvリalユ挙#筑Leuケ8iDJaOカ贏3ミOーy!Hh&窗揮ム?ン催|躇゚ワノвヲBt&|UYイ」S-モJュンS蜆|>「 -I儒゙ク*+゚ 、!@4煖鑿3N・@'コ還DヘU曠[牋樞8 -aGZフ拗瓊q"]-ン}Xbクリ7ク{j -ン0,爺ヤ朸-エ9唖ヤWレフリ=sヤ踞>簑Cス雨lサリY椥yリ シ Y0@゚8婿ロォgイcニ;ワシp」ンン倡ヌ「サリヌムネ:テe R}2ョヒ互SBセB -ゥ -ォKjネミュラnョB。縺ヲ<\ナdP躅5m霜トア@`lz芙キエ*屡ナキx「+#)+f&カケY゙94Z00'hオX,Н66.瘡2コ歩,モ`R?ゥマィ櫨ユンNG`�錨5<ナテP_e(楡wJムw瓷ユウm0bnbQ ネォ%<$。ク -ゥuツユLa.^N"ケシマ罷Bホ'タzェy|'ミヒ }シ(Nニワ允IH=q楢」エレ@`ъ⇔:薊゚7ンテテユBHIテエ>,4 ス+2u個 ヒ‥R:2ヤ腹8sb;}g、塔カ 舂#}h犒#ロu嫁フ>cチクm派Iレナ.hコ*ル%ォe「Oヒ(6ォソタ*颱T1造ァス^Iネ  [r<?Jエ[\}pr,サ祭越牛ィ慴、炉`sCoa|+T%モ給藷/ミ;ッYン&瓊チノムー>tコ嘘^>kフPx/e|*@ハァ#アタ吉 -2タ歔9==、,リワリ@O50ム!ホフ、鵤キSOトェ8ヤ%メ[ハイ@ミ.ハ倪6jコ小nBラ紫 ラ1ナ燻喇゙3フ5ヲf,樔>w7:dア9、f33iア*唐エA弧Aw~源ネタUa4]壌甎ア亟ys -SサレY9羲j6チ�kpJdbホ迷|ー、ッJ#スh ~|A/@xメU7ムマT嬌曝!コh)A]U=フケfQK)ノi>盲ネハnヘ7o1ウヌ゙ヌリ@」9メF2Fg7坏T|閘ペjノオQ5偉SK白#メ#ホl純8ェェッ}Aq笞5Pフ筒,レハ'キ$@榾篌ン1)ェフ3枠RヨD?)銑ロ戸'ヌタt智<Mナ~3Bヲ巧ス.メ8;杯・IMKBソ :oE叢C*chafy{owASs」7"ゥ!u!ロエdB6 Is蛮Йュ[シ榊pr$篩マ -リナヨI垠ゥJニ k 普サKサ|カX.h~|Pン: ノ跼殃\ウ舌チムタィ$u戮ツk鈷S\メソn「Jユ惨ヒ壗貸6ッ!Vネゥg&ミ/PK癡桔栗5]ヨテナノ袋]ト6テ竄+テハ、JJ獏ヨメエ詼ョ Dセニ8 考`杲v慾チノ ユ]6吟稘溲ーマ83ノnオ#)d。挙#)Gメ8カノラ示l# ワロ �ナハ&?a淌p,モ。圉!0_ゥzIHQuaラォィSネfV~ノ 'r、-ムノNGヌL゚mOz/銀\ス透シ@Mm1-フ3「樢/キ=2wWvSw�・) cc8:ュ叡タ"ム^4ハD葦ラlッbRaRエヲGン橿0(=ィナ「.}*ヤコ嶇レ輜ラ/N伺チl3evy*`6ノ|庚R2Dハ鰉ム絏a -�0;B焼;Bノエ<琅梧&x'Jミ呵IUキヤモkTL!ン0ゴuヲ藪ヌーニ]5抓キル喊9+怪"sユネLウQ0ァヲ!*_`トnpHト升盪X�J荀、G� R韜「ラL@)<ツ騫$^%ム}渭エ%Pミa r 舐Lォ30屶ナ5M選  ・Eハ"袱ハ渫[ウロシk齷コ 寒ソ[ィヒg �hF栃^BTY゙跋ィワYァr~6yA:。I*=チ':IlN嵎益ソN?D-オ0+)"12貸ヘ肇B*F球pE重=1.コqタnW頻g@ -リ巣イォ-ノjMxラ軫UェVy8オ"0nヌ"u俳東芭刑Hサ$・M軸勲ェホ.冏汝sチ─dbヒ逖マ>タ<ヒo,6トャ遡ク G*スT9淫R+x[5脂!qMnォ哩 ェ @ァ。2リヤ襁$ 气 -ヲメ酉カ、 ニミアシ」]Fホ&諠杜ニフ.」f姙「7'hュユHヒ、R#�;d」ゥェ"QQ1ムヲ`槝D?FムS M牧アワ`0{fネャl蛎カ[7rbチX�Z%航ェョN1沃コフwc黄 ~ソK4M6;ケン 1(-s詈・燐)aレ+寇.M"レ$}メツ6[lBGP:E干杢フcァmQ_EeャqP.リ.ャiキ苔ヘ&$遮, ]圃5繕mr殼ルQ*ン=ハU/∽ノナ>ィH柎ァ霓vヲ*ケB(0ン。リNPチ2隴} -#SLX@#オq@YオG迚qクCnT@リ:ヤ3カ{B互V゙ャ鶩慄・ォンp」1ネ゚EJu?:戳ヨー]ァz瑚牙払ィエOヌカgェ゙ヨ轗.9vzネヤモ;`.メカ靈ンdvrソ示i豈キpHク-圉ヘ"Uヘ偐!q除/5!A淫サHD楽Lfヒ5釛・鑒|ヌbヘ燧~ヨァィTI%ロe幔ムカ9k菌エ=k、Yc@゙置YUチ/黥淙'・ツ,ャ'QID頓ルQ!ヘ鷲|vクz&ニエヒZHチ6qMpT・セ"sEチムeuπセツ ケェY5庇/N鹿jサ5jコSテ忘攤kMDIRPE 3ニm棘キw笙f 4#カI濺クハ<柯 ±吊l,ェY衙」rMエ\56・雎J -3ヘssA8冉 .hq杲sB「ナb辺 フuヒアトテMf6qq巓x!ォ W)ネ。j韭.粭Xェ6頻L6シカKGワ糘ト!0yシンc筰。@w冽ノ渋yサロ}レ$メ4[ハムBg">3nu8キヒmシ8ルf?n#ラノネェ<K鬪嚆41ソ"ス アフ\hメ5」NLキ嵩サKTdBメ:敏幀クI>モニォ&8ルACf4hf彳訃ー%ヘ Z柁ネゥ ョ $F _ロnワウンロヲ *「隹テ&(櫞ァ[&或娘ヘ!tdフJ唾6褊栴3ャpウ-z.狼*ゥ-ム[FDMWツ旦ェ ツア析0゚$<~pイヒ\蹶n)ッ洗l カ`) C'3ko#ヘB翊イLヘ[呈H:ハ6ce淋イK{ケk蔚叱ヒ!オzロYーァq9Π稘ホマ(cリdo@詫2<カ) GイDシ& ミz"C53q:ワwッ゙ラz>2ス0マ精U散、s4ク吮Iハ 菲''Lェ>ネZ]!Tコ/q速ホ幕;ム ォu渺奄2ロミ#9「嫖?シオIワ・ メ -/盛ヲム`nテhq��,泳栃要ノ^サtーM3xヨルYサュAbCキ4サ#ヘ~笶L 3{ tju欄жヨiKサシヲcノOヌR、iTVオロfハウiカ7Lヤア(0麥ラu_ル詈s9カェ+%%串ム鐶t/1+3I 文Mリ'R4Π\・5]タM;T~z觴>ス云j閇<]Ghhツ8G」=聖);O椛ン、ナニ竭c。抑xfトルEzvアオ_#椰8G カロネ墳}h_糴,、0S、ヒghv孑諧mワヌGフkO#_R們`院`諄2スr_+ワヨGキ隊7.ヲ#NィオS┤kヲ」エリU.:Dタ -、ス7タ2チVΟKa縟hmm}ッmw鉈稘kポ:9joワ;゚x」Wニ クRキHタレIコ6執ニニロ゙]袍\Zロd殖kォmkユm-7k嫺cメl4 ェメ wオッメ。%QF飢mu]ヨ象hテ[myュ*RAX]獻^9vh{Ih{栄uヒ T ヌ�薊U(セイォオ--オヨ.エト瓔CAヌDッGu){�P;テXャ(禧姉イヒ6qニ早?3キt纖Zッ(テー3cuク驚纉ヤ<Fbサ:ョ1=5X.afシ螯レュbア*琵ノ<ーカイl=%A棕IwNo「 @C 8gュァyviメoBハ爐ナsコ^儕メ、A%もウ^チH雎ツDDク '=テ.レuィ3 ェニネ漕琶ハ6T鶸du臆レ屹C W4マidM:gz迯04゚kメ櫓+テ・ォイヌ苻ノ)~B 9m&ョ7「ホ`j,杓カ OF徑劃 Tヨ タヨ佳 =ンK叱SL1]pN翠zKゥQ"<ロ*8&ゥュz&ナL縛Dv(モrネ゙ョメm ヲ゚7キ% ュィ0鵐_徂uxァ 躁」Lm$%ス爾チ9ァ″ロ�ム2輝Aウムヨぢ。Xh$LJリ8 -エ ャdヽヲ:イW Nョ鬆6磋斛4ノY蝿ツヒjN(2ム5:櫛潰 -1シ」ア樫アゥ皎こ, ⊃[キO:.yィヨh袤Cチ残J,i\渓:ヲ~袂ルMヌA ルィ槇6。ヘ垓V/リ3P即罌 -呟�シNヨ営Hュ|y e=「wォBエイゥテゥ#c窗コ9碚iW]eB牟{゙"F -薪Ryォ=ュ醐X譎)ョrォ@XEルォXト"戦ロc^=゙漓@^hn=゚巡畭2:スケチワ9k糧Daヲt)モ桷ヒーコlキ{ヤaT「ン\襞靼恣o'毘カシユ鷺L┐N m轎xホ/ス>1ュ萪�Roj{ャ膏~dヤsヘO釦#"/:M泄」8s`准 ソReマsクi樒ユサ9窩?ェM%クキep*春ー雨E -・メLGヲ6 敕駈)ソ`i;「MCKU6/ sByjiO9ンY!紮P45z「>ユ>セ怠@ Hン「z堰+h9ー醉SチrケトKサ+]>テ{。怛c5゙ネcLgG]ヘ7vセ<ユ形メ~ワツ& -Cホャソルk懶ヌT6ツ岳治-ヨニCdvNォ8ヘ<_档Uネケv」f+ウjヤンX紆ネー隨。>義gチハfV靦9マ�U9 -ヲ^u/oオgB?ンロアt|ッUx砌ヲ%ネpゥ黠ホョ/准Kチヌ攅;゙ (5nヨ^OS扮VCjPメム樫7抔貪ユ」ソサz揺状韵セェ閥{b)饐嬖:フLUミィ瞹s:?ルク<tヌハYフwfヌ=Y乂+レス尸*所 ゥz蚰ムコ醵マク─イ済メリ扈ッイキ~|rェ汚゙。W+\1LQッ,?メJツ→1コテ臘R逍・驫遘敲匍ゥh>ァメFZ粧T(チuBU'G(ノ)ヒO=osム:Y\ ≪ヌe.p1#ハノトヤ霈・i嚢栩*チヲツ,扣i=>~S惣チ[53尿ヲ鍜鰉m.チケエ。ヨnc沂(燈~(!゚噤゚bz鶫$寇[H6,$;護踞殉万fGフ髷rケ撥>キミ0pYヤg「06C~帷3Δ3Xt。マ>h閭{掉 F}b軍フ0迴1xユチ]_~ァネ>、+ォ滯頸モフ4訴"hッヤ」マ:コ瓏レ猷シゥ艮UIト}ハPユll\QミXフ0。谿エキアz黒?゙イキ≪ヌVメ懦4>UFOp?、szM_档p恃vMゥ&zY8=,@^タ%F AQKh"#リォoT oラ俚巫�Zヘ-ラAbb4p"ツュlw,レ嶽_8[oc鵑iョy{エト暇^虻ャ[モYh気e�hロ;zA@-LPV性ヒ 4/hY4ッtレQヌТ[!ホP@キU嬋オ躪楷ZB。悩j{相゚<ヌp -殿YテサX赴Uル桴チロs}�肌メ@U鐚コ<8斉elロQX 册n=噫=13ユ^eメmM奢。炊rリ}�。角X |゙ヨエ};Y填7$�quレ實クケz%サH綣ム迄ソ"モヨロォh需5$ケヨィ菘A3懐フs{3ー�}6とjR・ -}ゎUス9<マコラ!レxX!ゲ候メ. ン4眸,レ&Re<k佳イコ1オ鐙QJxオPノ-Hャ・N "X轅ルヲH奧Yタオ齡9゙:チラエ,O!.エ^B。エ]$SPvコョvBlo6]タ睇z董ロ佯vニラ ケlネヤv <ィQ_u擧i`ケZyミ、ルKッい<ロラヲリホョy92シ1�琅降ァャヤ-A3ィQ。#)済%ロ-KO"gチjゥp8蘇ニ;@穴疲ゥn@5ヤNL,疚 ハユvヤAc;シs洌 �'Iq1Bュ5rB qイョシ;゚fニ。 -ゥS>.フ嚮+柳5-愕「cグケLt マ弧ケ<1ヒ俄[ウ{7ヲ4=チ4^(]9~l瑛マ[wリszコK4VシクcOFクe@ァ-]メ1裾HSャ~N繃d%エk6dHネ(ミヤ」2:3 エゥト生/Glワ隈ェ腟j -Kク髞sbラU $ヘ抬u椀rUロ4ッ,[ョッヒ -X ー4&HPメ9ト\夭A叺@イv{カオ展ヤ゙}ox・b -T黻5mハ墅X.タQP効カVJ9夸Z テFwソュUチ�Tレ^Q|�達g゚シ摘`ィョ}KKリsM),F\j、ハシィユォェテ鋲ヘ9Wゥ(,ァニ觜ツk -uラセ�sjaHォレヨt頽ンオイク-vヨニヘ+Tsィュ] $ャw^5高 ィソeロニ 縊0gt洞" @シ ツシユ&ZtワL�オ. 8運1Zォ[Aム訪誠ェ藏Vマyキ儲%X鶚WP醢ヤエC仁セr。MAMニF瑚昶「ワ紳メa7;蘚{サイlkヤχI@Ed\NミZ゚6`#;|mハ+籠ホmhクiュGサィ=ィsレ&ィa8aカNオヒヒ做>鶺Gヨ7ehNmYヘ0h尋 3M吹'! 胴シ exsXヲヲ.ュカマラx个゙W゙=ッ勵y0R〒イjオ磨ォGJ]アィラ""イ亭(I:ハq3ぜT&シ1KMツaミケ 蘂尭オ参bBノ+ア -Dル -吁Oホ(#モ6/ォu>} smヤヨ a+-"ェA;LTl盟ヨ^ホ嶬($`Yゥ」 Bウ@ョLiQs驫勦`シ惻66侏飢?弯」 ^Otニノロ」nラ -b><@ョi Nミ エ Cノdミ:pェオc獨エコWニ&ァ7俔^マオゥ シミ@康\」{?>ゥ スミロ躯卞3スL2フ8唳6ャk�ケ碆.タヷlkク絃ヘオFyエ_テヨト3-5l`ヤJ14玩サオ讓eサ恂=o@マメ M*ソ。 PcIレ\ナJツィネ87ェ,N@コ5h錐 ミワM (サ&Z拝莉チホbOРォQh鉄少フシ.6(!ミVッ ![`犒吸O擒ニァュ閏sマ'.」1`スuホナ6魏、,タ<O゚ノ -ナ鷦リlsBヌ S蛭オゥL溏ホ朖弩R7uカ6定6 u ャゥャnョ>=d餃qウ唖#ヌナT -%#hエ:ーs「/nDwhユ?ツ4 uスアテ -レテpaCPヘハ^ム5|ュ>ィwwVテェ=MzZ呵 ヨm{5ソrAN`ヌ]リも>貂}nmサ箴aAoッゥiXHM=チエ.|l#リL頃ェI匯YC鮑マTxタルMbアQ?6axqc鞣z1・」M|9ス�ラo佚<ヘp}イ(フ「fア袰ヘ=jオVA=jD7錬�カE壙ヌJ規$ZN ヤ"+xョ泝レワ「6哉トX乱モMO・ェ9A=x6�c麸:┯N豼イDミZ4@侠Eュbミbf.yAムエ(コラ?=ルZS裙ワ#hタレ、X崋式。2マ帷イ!キミ「ーィ@テユッ嶐h則ミ縛L6゚%ヘ「Cエ�Z3レ�イ�Zヤwワクxコオ<オ竸sCy 嵯クVUトソlヤ9Mュ濳,・14トUテlPエォハD愬ミ:ィ1エリbhノ:ωBテ魯eBhノコリ ーミ,~I水ニ築:ィ叨アh蜑鵞タハp@~ミンN、Eミ「カチモi┯ァTエヲEa S;破�艝ワ鮑�・E」 ミ「募寒vオ黻滔9オaオケ峽ルミヨhアms4リーQツメhーミ禳リM-D・ヨア[4ロsSモセエiャ=Mィミ「p齲q オゥヌb*@>G&閼�レ\ c驕アdfNオ#」-槁躪]_3ァQイ0jュIヤョV#_スl A@KュAK+トウZ2宏wU8セiルノ\�YhlcMッマE^kRPgワZz鳴hZ|5ォS熾vjbZh勿ZZMトクjR゙Ht (テ=zノタ靦イミ\uSY帳AgヤKT-ミ3ムナゥ+ツ</. セオ3c゙2マyr窺{シヲg3i;鼓ゥ撞7嶽iレ�.・f7ス椀\ンオK0Q8聰ヘル1匠7恭M5zー-敞1Iセy#曼令�5ン -J。1綸#ォBオb縣祝^Uヲ7マハy ;=�[、ヌ欹1レ#=榕oヤ敖゙v@s{モjw0&齏*ヤ3u゙ウトzエ跼.ハ餔j`8打Nムアチ-蠡eオ`O挫リTシe@ei=XW>/ラクq skムユA7mヒセレ`ケ,ヤj」蹴ーえZd�シム「=Akソd!焚KエW#イ=躬6侈>Z&鵯,fム5fセ<gオニッi+宜xO鍮フ29ヘoイ-Aォセカ・レ峽)]#Rエ]}レce レG゚モO靨l箙ヌ{喰 ソF-゙3伎タ秤ョ3g[トHヌクコ。メ鮑 -ヘケX(k5ー>R挿0V/ヌ皖ュマv4M}設#莠ZタァAニO5ユホコzヤ!璢ロ5Q?M~up!ンュTdスヘ):ォヘタ 3視\]格ナ゙妾e%眈6)モ>y,1簷∂・逧|Z>司・+マエiヒ :ペ6為hサエ掴靂ォ$ A5シホエ -ヌJ嵐孅Aィトョヤ -、アR:リuスュモ#>nJ5ー「}Iヲ慯M。?NeB}セ、横;Dフ^雪ヌ^兼訥マ鮖;i脱Cヤニヲ紙2ィ妻AAリ|+腟ネォ$4~vエ$ー -^@4オーVu[疫}ハ*ゥユSV/ウ萱ムc、jNe9$,ォSn -uaネ-疉.タ~5vホ雙ハ9髦 ラaメ.シE脉 ヤヘSソタレ麒弧妙sXBk 膓Sリ7 撕gーbコウセ8f! シCF6゚Mmトキ廝ハ鋳uョ」d LーK ヤホRP祐ZVキyムスム=\ニエzケ2i5跏p*C 運�{ 羲ZカFュ:ーリ嚆クウ6TyケォtdュカニNワクュ;ィY6嵜WoJ(ォ恫叭Zネォ4!ュサrWモ+シdコYイQコ笘ャ1ヲ遙dI堽jgミイWオ。リケj4シ|Mン5,>:FWウSoラ仁 鶫ikmセ4FsWXIgZ~ソtヲeカ@オHイヲィワキリ}せリ.ユナIェ:ヲ裴5ユqチ訟鮭5;ネ好1jィRニ\X<閥:ク粃ン覽チ中」f隍サシシ恂>トフェォ楸(ク2よ剳 谿; 0ヨ57pィト*mFツ訊^擡Z。ノアT・3テメクZI}ナHg゚H~瑜2ョ+q%0ゥ橋@*&S:メチ3ぜ&ネ脱メq龍Z,jソェ抱L4ルdT+ ンOマ(。転BXスャ争A `O&。力ヨDAゥ震コサオ炳k]諫s~リマロ」;k ォ= r7уレニマハワ8Fャ,醒ウメ-^2|lメvハ罌Lマl69ォテ%ワ#n$_Wノヒ\Wァーyケヲ7C34N・ェNウL9Xj゙ーーエJ、タ北ワ?カ$$74-}ィaoレ慝「ユ0岷au]寫lI厦8艱コ-厨$ネ9」Ij/レY#w<リsN蝦s 邂^-エ蒻,タレrdユツ_)エj・n_6枉+ネ[ゥムZotuツ、誇aFQPK・斑dヤツVテゥ&「Wァ>ー聳ヤ軟\lKスX@)#ー彼PワnTュカ"耀リイ趙66,ェA@mhIz:ル ゥVtメ}哺詞@覡ッV秒5=ソY7セソャVロッpイワ-タ~fMoツNヤオミ~シォ4゚W;ロ硫ソH]犯Vト羞BX豬。毬裕晃jモ:-S[FT塒yァヤq2;#okニ\a麓ロ/ッオ・ヌ]MノiXH.ー(D~キタ送ュ、[啜Q綺1[zfムGbnテyE泄カコ゚$,ッテrレ-琉テ コア鉚ツ端|レ'キエKni涙簽台涕ノ->端|:爪イ~njs['キt$ケナァ]r軌サ沁$キエMni巖箝ズ{鎗~ゲ歎|レ%キt$ケナァ]r軌ロo匳VェOサ殼ノ->InY= ケロfW、Mr軌サ殼ノ->Ini涙簽.ケナァ#ノ->端|レ%キt$ケe5SMサ沁$キエKni涙粤台キノ->n甜|<爪粤.ケナヌ]rK5'ヘシ~ャ%キクKnpKnq涙粤.ケナヌ#ノ-ン・Дレ棺ノ->端|ワ%キ4P'\7マirKwJ.Dノ->端|ワ&キx$ケナヌ]r居サソセ2ュノ->端セ満マョ竭wノ->端|<爪粤.ケナ]rG端Vマi<ヤヌ]rヒjュ-ケナヌ]r居サ$キエMni涙簽台殼ノ->端|:爪簽.ケナァ]r軌G端|レ%キエKn馼r儀ケ宏功<]c羞セb�ベ m詣唸y ルセU X}lkシxトxpcシラニ{ュ功\ォ臨x_ 。ニf*joSnFーーエ7゙< ロ+7繃リ嫻シッvP桜桜サオ鼠F羶ケ彪ニX夊ワ>功貉Z>詣ョ朔N釐ヨxigシエ3゙レヤ゚ヨニ;Oユレxo5Rニィイ'詣サ6゙9スュホeャ購.vmシッ27ニ稠シッカ「テ5繃リリfシ7ミ`シッhツ詣pォ暃セyPセ-ーフe3ーi#igシo泡繃オZ5ハW8Y@;缸8^ワ卸゙ャ瀦セレルセ┓セ!(5゙Wトモフラ ー仄サ5゙a!ヘ駑功.ナ」|ァエ3゙ワ-ロォ}豸5゙]愚ン単;スiカ[猥xoーナx/~ヨツ(タ箸ナア刀hl瘧階Z4e漫h餔ツァロnゥI笆$C柘~!ヨヌ慯 ネ∧6Uly#オミ酵ーシ「切"xYUー0リノクヲ ヘ萌?_J陟(、チ2オ79キzNウャ)qケ.モh圄6l -ン飽ヲu」Oルワ「ゥ ィロ0ヲヲVスlカシ劍ケワmfhカ|:モ2カ. Aホ4/(ZfヒcヨVヘ5sNKテク0リ-監カレアル分キn」 ル ff韓アャヘハBキ衲Yカリ�齶ヘ費ホ孟MylロS>Y2Pロセhシミnハァ3+S>ルオU�ゥN1ル0゙Lワn%チ費a非9ュツ!T0d富賂キ舖纎。ツルn;ofノw,リ,ワ6S>=AK^ヲ贇ト癒#&zカ<s躙矍ケ(祇娚チ。ワnノ#コゥ遨幵ノハコqチエLヌチ念fゥ`S;楠ハp7蜩]リィ幵ノT�ヘ飽レ[8壗QMス.N>2<ラ、Rキ衲哇l-殕毳7=UアレLメMリLy|ヒーk<Fエy斎ュ毎羸Dテ>+ f<舒f u3>ア'翌コ?ィ(+岻yン外VRトケn晉va゚ V|nGx|士オ5ウ箋9ェVフラ`Y衡オ# :!5+セCウ箋9,pフ観Mア ハヘt7+>キン:テbナ Jエ抛ャ匯t.t+>Yy%苅ゥSス:コ\鏃|イ$dコソ・++>Z謇ォ\C レサーハ5エヨaィ波馗チ4クナアウ.6ツ蓑*サmヒ冢,'6u縉-2k"コョEヲ -裲em'霹ZdZ釁ュk胎晧アY8ヒ4、チ.タ^詞5}鮒サ6鑞bc(G稔 +Dq]゙8R臭毒ィュ゚鑰,Gニ妄Jc}cP]pnャi附+.&樞タリ h漓hi\魚a′g.ネL 衒リ貯。Yvヘ朶o゚XUャナTV驢レッミュk(。qル麁臘シ"レキ.遉HワXIッウクア8T埼 ー・ェ錮刃ィホッメ ]羔Kコ盒pクd`コ懽+wフlTエレル寂藁ィ蟒ワコ(Y%CQ2?ロァゥ:チX,jマBbレラヤ最ニ4マ6 マロニ虧Z>モュヒ置%f劑ニワワX流・"ョ齟ユヲt更ムレ#nS*=ャ+}?L;ヒァXラ%kヨSヒ后ト4慎.、ラャ ヌ_rN)l>wBヌB}ソォ3ユxォ\C様#予テ螽\Cモ:Q^f、 ケ4.タヲワ5\ケホト蹕,ヘォ#aX)k鮃>Rネ」 [.$ワ8oqZトロ -XLタ-ルNEホ"Z 6∂ウ aネ6\@cカ]lC率オタモセ繚オ`トL廬ヒ枸8ゥ村YЫコq=)==レdzrxナ゙慄衞■su3@弖Z」遙チWピ*3ォdCソィノ=^-:ミすメ?ナ@ユn1ト+|孜E ̄タ甲コ嫐 \cKシ「コ ノオ`す聶Dz+下:ヘ-ョア:ホ-イアッホ関 -エホルL゙啖S7。1ッ陟QCXM題[エ ラヤ僊)qアi*]yム[メ+ gj蛋シネゥ簒ォモ<�ヌゥ゚擦g、サェ ャル チVC ゙樞ゥ_フ&ツ濛「ナテシャ示ヨ[)オ槽6ハッ])ノrコV・オ墻FX數ssャ゙ワ0給Yヒ#゚7ロp<韭9ッO~rオヘヌシッ&モラ'sm頚1ラケ)邯e゙「ィテニ"|ェhg*nh7メIPKトツoネトloコf.緞嶋ユLャWチトナjJミコリ替{礑ヤオnテ水ラニニ削kXカ_kSュ -ホ進OPzeニp`塗}Pvyヨノ5ョΩU復ナbA##ミ0キ|lAosワF}ウ5oゥSwpX+ハGz*ョ#'[ キョ(r*f+ェヒャ゚賛鰛(醋^ウョ5悽ョ;ミメPZkゥ菓KbFk|nA∀ッァ/ィZ'巉 ネCT6;q3BhNvhキヌcuィツ6枋キソvラO「イMs7)b4X%8&sヲュbロサ晄ネF�蝙ヘァ>\糒ョハZヤレヤ「セ┌Y)ヒソルフケタ&ヨ;zュ:エ゚ ti~ i;伍惷ゥ舐Q/k7ワI{q+ャ迸セi5p@Xレへjヘ壅隸钁カルァ2+ニヤキヨミ@fKヨTuン_゚m@擘zソチ築マ 6舊ヨ濤」0ォヤ kヌヤ ツ`DモN#ミ-カ岫コm芝I7δエ,瓧ホレワヤメ@Mム'a5`;JIサ/娚HIア「h望ャサ'鴒\ッ3ェ辜5&゙:h\~.&J6ュn:フ)*"<o`ッvニ舘jL3ミナネa6已リNユニ-%I叉ム`Wミカ@「スイオ8#嗷]ヘ;リuUャVKノオ徭pヘw・~峙dXA#R;PS・kカサョ強iー藤ゥ、ヒ偲ッl;゙霙6ュhェヒ即BKル゚オTуlC ラ車 \ム迫"*・離イ@滅/ーナ P]m(Z;椈憑Tッx>nL2ャ ロァ+ -ュ2國0.(ー o/ヨaPok「們アjij檻侵ロ0ZッYヲラメ辧(ア゙Vュ%Eキe藁ωシ1h!逮_Na.オ8僣敞naレ;オhuVy椢 ラa膵]ツ焜*ヲ9d~ニ再 -ー.イュE`ー オヲ>遲 ア~]テ&支,g禦ンbルKg!ib'ヨテMSキ%r]vル"「リ\Fフ%レI!匠N;ー -ロィ遉ア擣モaKZ*slJ、ON 伎xw、ォク.ヨ\ン輔経Wエ豫5ア百Lk謚 -カtネoクォZモア沛?<トテラNャUo姦怯慾Аzサレ_ニ豼ヌ・ッ[猟ェ;ーィ5ヒテォ1!W#ョワ執n7Zkヌt(r"'メ゙モdテ~Zy9ェ)ュイモ-えGO砿リ脣ォ8M闖?ヘ0ンa7<~Mャ∫eヨz8砧厨ムシ覇ワt證エ崩"-婚゚M+オZ<咤テ脣ォュ?/譲湃Cノ\ニォ綢7鹿9ッV牘ヒセ?WsFP_VヲIクF'6Lヒネ淤ナユセキOヨ┻゙∇ヨ蛤&モNxl$5= 噺ヲチ5‡ケ⇔:ea「yY瓠c+Pイ゙ホ Tーヲ5t、箜q#ラサ<2ヨdモ銹<ケノッホ>7踈9!冏南゚0>u険y薦^-ョ{コ「/ッOサキQR 署6レ'HAyx>4Z曇4ミ~ナヨソ1ョKッユ喀]~,エ+xニF]Hォ'/アムLYQトシ奘<フサモF╋ムソチ゚FフLFGz諦a5BF闢X沖oト5f椨訳抽vT|u「_1杯ヲ=Vv[貪zヒh .致メH鶏ZンP槲ヌ羃"4幣 -Tコ。=・ッNツjヨMッ桝ラリP死7]Qネ桙64カァツ憤6Gjァ=lィkO+\ヘykd/鱠麸ソ鳧w;Dlwhal;セヘホkッ゚ナo゙スsオヲテkoワス{ハ_q鯱崛yヘヒ^^<|Gキソwヨ齢\゙ュヒ\靱テ?密モ盞ッワyネテ嶼>シシ令ソ珮韵鞐・>韆「ョTdnメヤチ9レ7.ッ゚レoセ<コレヨュ熔]\ソuホヘ_mCサa「i昊oセニ蜒ヤv_{w?\ヲマノ|x袗テキロ$N|鯰 ].擾シ!kコc晋ョノユ譱セzdソ?ソ譱ウWe/_セテ肉O,Tッオ・ム>Gヒ#?梳ヤwンNx'ァr$ル該ミムi6A`�ワ@ミロル タミオ: WWヲ嵯橙テ鰔ヌnk'x -g2ラツッニヤソ:.胄エケ搶Nソ}イュッ レ~ソカヌハノ゚ハ7ワケ~ニ磊ッ゚クy)幎^%也'd:L゚o|~ヌq某&ュヲA,1aNAT'y*ノL゚コ=セ竿oモ点靖贐テォHォ*゙?螽oワOタ)~ヤ;a、碇揩"ユツ><サッ|シナユ):膈bmH馳纃裕卦 ノvイiュネ饋カノィ[キPメチメタW_R瞠Saモ3゙x8拈オヨ溢5。H倫".M�t完lフa專ルホカチテ6風サゥIクャ[sQフ箒q欣c蹕4Tコ&\ュクナi;nF%コ舶_悗 %{<ユ+峇Q屓<ン ユンヒO9ロホェ: y淹波%#マI・LフIエga啼ハ。Uテネ=ソt・ヨ鵠膕暫リe」客旅Nニ幢恚}_\5>セ冀;�劔9烱mェH!$゙YOゥ△gア>.>ヒ古:ク6.=又AユbD庄ソロ創タキoレ78ケカE貞8|d9*ヤソn彭SソケユホWル=C_oカタ珠�戯^>_スピ攴w '帚Gレgn軋ォォGCテッ~ォGle0?Y凄妄?ワ貨q4~ h=★第「q腦ッラ゙)Y9タ穫ウv勾[ュkpンル L∀ムロj -繊むオリ思MネG 依茗=ヘ鱆=<ケFサォレホスラ4颱ッ C更)3ヤr儔a。ヌァ<晄3ヘハシzハラpo5�k5ュ(サメヲルzw];AK`<aィ"セ,」W&ノフ1。ト ハ鑿鴦/禝 ) ナ3ナiヤホィネg@^ハクゥ�陸E關セハ\ス嘆ッP紙ノKeVwO嵒f2Ok>�ァ桀ト、ミヤYッEンjヤヒリLヨM|ハェRリ裏ZMAマャW Qヨ仂 。! 梳サハメャ82{呀8欠イフZォh;チ"kV$mャャ溽V耋&|K/P8サ*)8ミ<管iゥJラHZ3ラ'ィモu鈴チチ =\「nS審裂=ミ=メ(e[V帥)‘イlオ)κ#.#ォコ素>。豫」フ。2[rΝ゙0B;[J*モ^ェl#"ha蕗-]サツス'{ロmチeケdJユヒワア,hZW峯0g裾vオチ配� ヨA^ネ躅シヘ,V単ソァk'スB偉,キモ-t eノノ 穃儖.痛゙桓ネB励皰h楫TgFサ1カ姆cnQ#S=モ1愍測報q亡p [.ノウ・gヤィx 5ァ`.「$ヒィTタW雪 jマ^A T_拱xv_テ「跖%^B9髭qf゙ハ2d雀」N-仝&0mルォd雌pcTqI隍#_タ「p善゙(zC$!ムQエ+スD 直V髑O)#+ペィ|Gob&hg_ユシk陜F廢n許運广eコメヌ#ネAラq\撃テナls<武ュw畦Y ‥Wー・ト*ェ9ノKA #�ッ WSK+b幔ェ4�wイrヤツ)|Ioeヨ\諛rjFf萱濺ーア摶゙峽B粋+AI*l3Yサマヤ -ZDacオ蜊モ2F烋チzケxtPヌGモD讒杉笹カ胝|fK榾ハ較>{�ナO擣,Jフ萢B{ワSa濃F篇ミコ゚ pワネョフn 燒壞lyチ�:2оJ/ハ - USル「、鞏т+淒SbTヲリu`ヨ 鮨l0桷ツ。係ネ+鱧BАJew紵)x翅焉rlマL&tqXソ」cミbKJvヘトナ 9ゥア阨\シT^ΚE\債エ#) 0クQ"マハャ蠖"ェ`L - 1チ浜臘x.Hタ酘ヨq(Y掖喊イ巣ヌ*レサ愆/U蠻影綿JハdcョBFA'h�ム痰湿撞VMュ・物{ィTむカチ^BxGヤ0a,^侶ツエpノい!罹4+ク20 (レEp|t(繼6`ヌ-(@ネ7ヌK投曖巷yt"杣0$oチ]X ャ!9D装o娠;カーQ%I!iヒ嘯<ヲE}4チツタL勢狢;(j%x促審U>2マッp淇>\Xo]垓h匸yC -ト●pーメoD #ナャ=ィヤy5q洞ー@3%ニq@ケPg JHモ>ルタPヒzcヒYレ QD3^%ャwイaO G゙ャM蒔~ェDmシュラネ帷テ{ロ縞9・Pカ酷」 ゥ0Yォ5ワ(,)7カF-&3_瓜YYGルTネzUクLK#?4t俳FユBTe)」ソ垠靡カjYmネdOC4ュェ<ア0t5E#ィd8Y;i繪廷芳フV廖ヨヒメrゥミケqリ2Q0Vr@ィ+GvS4ナ瓜 }!+ヒTX-f5ィ�毎FI「FDサ蛮Jトカ#雀ノ」積フ+ィャユ」禮/レゥiYィfm?テェPv雄:ー *f廓暑ヘ@ヤ3Fo2クP&ヌツ&ェ:O5「xkITフ躡k&ヨI+澡弉hキ0(票^ト+エゥロウ#レコ7ノ -ケカTs(1Uャ^アB jヨ+(W85盖�ヨ'殲<oユ泯糟S摩蟆裨$┏・フオS造V。Lヨ瓰w棧ソウヨ#ト~ 0iIサa>。廏魅Pロf�潔レo3ラ.(0SXャ�VMナDazUウ*袴uo貌オ゙+鯨ル氏q゚6ョUA`pキ心~"シ[/mチbチュイヤ聾b^4Pラ+RUオ�レrBオz0xエ$霸:Nホ -トIユモ4オ.鳴冀・ヲ\ト -)靜K゚)册タQMャャl>�lz・'x[I"クaOme+ヒナヨIチ-休Z砺汲! G畆琺ケル.゜ムネS-魘ツ舜V$ゥ ネュdgム、ニ0R+Sアサ」,�膠[aワvスロリャfテオロq^ミヘVヲSヲ暮煕!ラ拮畔チ界�-「ニ慱*=�p*3ッコyrフ:Mリヨル嚏Y崟@7jqツ'QIキ0イ括Zヲャス駑5鯛7喃Z=モ{]�隼Tォ2oマ゙ -潼EGカルノP(*cT% =XD+ツ儺セ]! 」g>(hエFd-゙カ;サ&オ5]」サNBハ「瀞?ツ#AsuカVヒhゥサNヒ- ) レzッムマe9uR・*^岶<k鞆71ヌPル5u0t8V苞T}ア0ォ*E$K!Tュ凰イ/タVェga+9ュA<}(;K?`テ 54畴k討キオ:襠チオZ祉64媼=c。肚Tlヒpァ臆-モ*gチナ愆イLQツY〉 hケ嚀献フシ茯GナkL{tツニ2U]Njh=O讐; Vセre8ワレ#タヲ0%簪絨|ヲラ?Wル放#]ヨN"ェYEユl →βU+マレャSWdc沈ン 剳?j[)ン墻ヲ峽Nエ(アミHT卸ツュ. .-U\ュT -9カ 融ュxL -尠r8x-#&J:Z -ヲサY跡朞Q鯏1ャW屶ヲu#。 -jJュ艤ミ&-xハ・カムRfQ ;0ウユoJミ啌ワ稾レヤ&rVロJZQ蕀゙繋スコ唆qモワ?タf哭R1ェW[鋤|] メ-6k/6ワ%'V陦ォ -モ"}q8ーjリOtスモ}フ6OOスヨシ- Gオnウyh,Eオ,。p)イSノゥ'ヤコ)ヘ(ィ茯i。ウ匪ヤp6゙く、メョN 2得^m」フ6P;q#Nゥ*cル物A馨AーJ羃ナ&キh朴ウ迄ョホ廨23ォZ侃tDF V 襾迦9ウ zス�ライマ,ソキ'KkB裏7[ァ弧ハsU胝ーYA!P怛^マyNヨ=キ8揉ロ3堀uサi脇勗清゙ヘクI湟>ユ「qフOユシイ`T0ツヨゥマレホ'H}3otォ゚O・ナフZチN槹フ榜_鴬ヤG顕Mv4瓱D0[-]-vLマィイッVKi 4Vァニ)ォyヲ}カ-hPァ尿モx(|Zユ酲([ュ脛ヤd、.埒#遘k「D�n6DTサワ uxル\7イスチ1テヘュp};サc。ァBメpュ�ーッ\T衵0ィCミ C喰}`ケ'):・8ラ=s9 ワmミリ済ァ亟。春ンユZオzヤチ早sp兄ホjヒa屆-(ィァ結ュVKトV畋7KMル -VUWチロタFヘf、ッッフKタ_ヤ3[5カ'欅咽Eル@ウ銑ス。!CGwレシ┏マキュモッョ゚jテ禳i。嫐モ*ヌV゚D5睦ヲ譽ネ伍}reQw0#lサ*r兄Rqーz~櫃/saV買ハ横aヒ+藩k)~」^@Uワチラ )x ^ -ツツ|「sレ勲マゥサ7jVスコjラ榲Aナ).Vp%'S$ャ h ヨbp゚ ケ:套:マネYCハ %Й。vT秩Wヌpロ砦&R+祈[(�D「ヤI醉嘉g蛭ΟJCム岨ャ征(C」<マmr'|サVシwFeUャタ-Y-ゥQマク TQ^n)geォ.gDDヘ'チFZツB@+�ム'SA)!ウ?{タeS墫チツソ2ャンCヌ8v!,H"ウZホォ  -*0ヨ qォニオク、eメシv「PK「~・E週ォ糞gツクgn 吋甲ネT[セ?DヨC~」a5旺 ネhカキ妥Lテs「aL]暫=モ -(ェNTヘ(跏e燔*フキTユヒォ。タgR滷j・S瓩jウフャホぜ(OKgY8ロア$ヒ0@V)/r狂ク+ヲゥ 」,ムzーネェァソ#Kユ%蠱S覯ミH6+@「4&ト批;粹襠^綰yッコSz6綢<zタagチP/t+タ) レpzgl3比h。チJセ ラ.ネムクUIjヨ「>ル*fト 秀鏝v~黽Pィゥュソロtュオソ{'ヒマ 脱"マ*,IDリョ肩モvフVfN 權~P瓱CM 「眤ワツウy)ィ濫&!kワ([)�GWs沁ネHNuミ囘8麁oBR!#ヲ�シ萬PD花h邸Eヒ藾M$。58匳.訝bト噐,!;ロォイ╂ラPX\Z2iリ(oDカGン8垰゙S痰ーエフ「゙?'゚チ|秤ォD;Hヤセムp+E沌ハTミ冪ュ(Lレェ^エ剪ェ"_゙A:ワ饕tQィ'MH,「朶ナッ隶`F錐。aャ狢:7a"ト!bムBNPヒHルェ;タG)クYレ.Xノ「襦 A縢tコqフ、、uhヨオzdT|.皷+フ=-; ゙`゚A圓'πネ閧Btテユcリキwー穣h,�Rネ真�d續58E:WMヒzネム[{アト"錘'{」8"jャ廳>xを+aZ^ィ Tm「。21ム1.寒ハlBCムVヒヤ迩リ゚・瓣zウ4F宋x」ミ=餠」zェnXzヲ_>G/ソ/lセヌ$=?、ョXJIpKd黝0M!ユ\RF/vチ%ワネ(谺^゚Yy「c、ターョシ-6ルシリpッR eヘキ4<[2コ#せX怏ネ ー�-5甓/ホPg=蘚&jd3-,Tfタハaン7fコy2ッ没P,h 'リV駆シイヒウ/@a斬+5dウ ~Q代ヤ。ラJ65レ皃` jムナcョ_g'yOu晤。QMW5ソh螂ゥチGM=Hヲj[,丘ス蛻%ラ%Vホゥ@エ游K-。ネエzト犁Qリo<dマフ@シ3[s濡 ソUキ`Dホ4ソhnUナi^1弭ナgヌdDョヘFユt[&コ渕緬サ・=ョ9gオス レ\c檐E・ェミゥ:Sサ}7恪ム鸞ヲヒ諜1kキi -上ョ⇒"闌Tヤgカ殀隱j-フvタn毋K`HトU僣'実密ィケ4コ2ッ別N"gェ「cネ'カC`リo4^Mdmf 里怖許tナIスM,ル 兩フ3ヒd -・)凩F3\欝6vハ']墾Q\U^i0 8r屏キカク枝f5モノp゙%uO#r)�伊1ッmhイヨvk奢aYモ-z:\ワス}wnシw゙裔ンcJ郷 (ク模'5浦みキDd.Sケ\ソョ鰈譱ン]「|ヲ゚ッマ-ラkムCzゲュナ%6ァSス(ッ/僵{FZmbヲ侫ヒiオ{YUュ リOオー>Tミフ亟リフハル�ntオ答9: 1KX^{リW%300Iヒゥ茖ノ)Zテ拝ンB<QッP儁ヒナ ァ「Leツナt8V*t(冒泯ハ横ニセf%\Rミaヤェg*O2ル刧Xモ貯レ3トP \9H ΛヌyH鵝5・オLBz&掣$フ篳屠Eヘ=&(ァ芥V(/蚣オЪ, Yャ:jオィモト4ッXフツヨS'フ E<[[=9jャテ62ALテu2k $カヨL9ィ季sユgウタ禦オエ)タ:6 翦[Dズt;サ8yp愾シkネレ[rミ|ハoシ~qoワ}Hョ。ァ扮Oシニュヒ;7蓆セキルW^???0窓~鉋暦゙ス゚栲紊?/タA}4タヌ キy!乙-諛嫌ノ"瓣AU・3ォワ -G/ウ$1ォチ@1# ユワiVTム2ノ ヨョ1EタFyミ"C犖C>8檀ヒキ#ツWZヘbb鏃スハ減\タ軽 L ナ'<ヌYマ#hュ阨イ'シ8ー.ェmiか、pツリ揶cァS.煥rェkメ4朷ャゥィ<・k「樮IRF靫 ウkネミユタuU<‖唏リC昼Sェク2}! 3Yャzョ>ロ) -<!Pdンワrュ除M3ウQYモh/6ヲ八 ケゥkz-]$ト澤楾STエ誚き h4凉チY,X熨[ツテ!ツ トム摂「アE貲4xfフタpLー,4{Qホシuカ`ァ+#*0Qモネ彎C$1ホ_?anィカ,剰ト廏]礇囘AJ31I總朮刷案讀T1ナ�ゥf5翼?| uスュクャェ7RK&」(ト2Br鏥 4z;nB チェM<ェヲ�a,゚6ョサ,gnッ z2haメ|フb$Uァ、vFメR 澗 -5y〒ラ朴uレXルタ薗V0 -8%アo4/D!「u蒜ユュ'2;Cjム位ィラH=ユHQ1YtワDョ,國莵リ�「)A; -vdZg* |-キ2!7ネ~ケ蠑Sメ' ャstpeYリオ*~リリフ#;j"ッ`$N)/ZthMGケHリチ6櫞zハ'Ы瘡涅リ(bトャAKフi卷跖eト#ミユR古ァざトK;打KRァォ+レG@^0カGLfm。Eユノ勁�>虹置'杼ホX&モZ。P|028#ケ_徼+ラゥ^,徂゙:g5'ォヤH恍ナフーロト禿R珸シ8D[bヘAY#n^v2qJ゚ヒ佰レbるィレュ6Dス%ヌセ_ヘF材翫」∋インェ[ロ)"8wtbDB\チキF^ユAテツアユ.゙%uV8o`Iヨ{g5)メi。x&D;zーa眷堺ネ恚J捲:q`oaェキ"Xタツ'zVrレdLqekG"シI+ケ7$dO -奥?ク WpDメ'+I>。 #3ユ ュヒH/Z2突%2ァ .ョ゙ヘIS!Tレ2ウモセ @&|gゥオア`杵 カ士Q3y。l~P;賣'ェハ r「ャ謇PZdネ 褥オ(rコ)岨Xアロ嫣Opキ+)ハIヘゥ夘iMミヨ(須ヌA澆゙鍛)-0化_ァノ -E-mミー。N0D 壁テi匙ユ!遞傳 !i畠c=h6ヘヤ�FUgR8」炎^m_bカトC、業=ョ0ヒ<E?Nゥ煎リケホリyHrヲ瘻ナツタgp -ユ8ルQUrィモOヲ゚&モ'<.コ%) a^ oミ券9gゥ>クノ 莪dォヲルDnャンミムmキタタ2ェネ*F gm ャ「HAv6≫AテョhヨeヌリπxムゥネシDQ#eア桶?オタナ剿-ユ*$:sォメスッ'ナYマBxmチヨ lァ、1`ォFョR┐x.ユヤJ -g*鴪XKト 軼!ナ!ユ_(ZZN$「N菓 �ィ 珂Cム痾ァD({オ」6 4セZj-タロyハセvヘrFT枴--チ飴ェoH・ -ル「フ2J/ch;t蠣=?T -Ip來ツ6Kミヒ2エ;pム.鐙4゙)踟欹+EL剪${ッZ!ァ L V亡ハSBF壟箕T軣枴 -レ)&ム缺ィjマc゙HハNヒ2Eョ0、`ヘ}嚶ヨフア゚ ァg」゚Lオoガタィg椰(&ュJ紀 'xs愀塑Bq>El QhルSjNヨル$ロEYロ拮ニ<i=ネVノXtメシ恬、nF`Nゥ廴籾髴ヒ/ュ|BーfPT4"G@ソエtrFvdGZDシ「エャ劑*JhQElk拇y9殖ナーェル`鏗{ヌ 。ニ X01ォ目イWR┰!`d法スム[lF+ナj -2N 及販 ナMクタナェ凾抔O(ウiッ2購?@ァャYE>eLゥオYロァホR8ィイ;す+*Kd陛L典ムヌ8 <聊/zュ"E ミタウレ朗装*3倖ヲ/ラ"沃)A4 Nエラ貫「コ梠~、n、レ~エ -材ナ5vRャ3寒」kッXuセェニノ睨3ススヤ&b -);%mニQ谺ラ_'ヌk曳_Jィ ウムァlソ;炙トゥZ*ャレakコ#1し$5ゥリ6.MPヌチ、、s。ム蓄ヤb+lN 、g0�;kヲ&[潮ツ %・D85ヘ読彿。'佛クィы -Lh劍エォ9ZミェRbィzミx�lY」覘。ォvホウ*ィpウ4a兄Xリ42�囿」~涜IB^汚ゥF2`m5ゥサ{ロ8ユ・D>巌マfソZ{ツヤーbツ嶽,tnh脳0d ッィラオリネロ4ヌ&ス乙z ヒ~ -l+トAゥ -)t -oj,M`%ユフ最ンッYGgvチュルzCウツxv?ャヨヤタa1ョ嚏エ|ミ:U#b3ョ%=kbュィ、X頏エナ*&zDシ斂TPK・ッX|レ・完y2"ェ+vS椦pjセYンホnjホャメ淤/fw蓑Lタ1 j取フ鑾・*ル咳(匚0 |z鑾チフk。>ィ鋤琶HMサd]M妣2$}蕗ネ似Ziタフ」ソ「寮6YP[嵌:!Zマ])H>樽Aェ渕錢囀蚪談jヲッゥ>0ホA走$0コ5Y/ucメ[湫9マt樊ョァU帋8ィウセ嗅>Pー=憶qミ,$ヒ8ィ」セケ蜩r6マ0yヨ)pモcx「「ラ^0ケ謫ル鬱レ(テ暎ーナャ髴ソ>シシアO逶oャ愴トP(yW靆>*カ歴;ソ}ホ22砕S37砌キ/U豁裃_゙]^<<y襄wソwyx゙;|晤゚ソシj'シvヨュ已ゾ{7/ノ゚ケ{ヨktク瞞゚e?「G侘w農ロス磑苺ヘ7ワヌネタ掌o蔡($?ァFz陥9フモ|C゙+;b[Pタラ|]攴~@ed<_醯リ詞ヌIF(qル虍_>dエe 剴嶌>剴�&ロォ7栽{A円y -ヒマヒネハ」s互ァ0ルpgYウ 翕ケ魴WgJrLV4)沱:^Eマョ?セz't,ヤ餓$ヤ- Tョ|x+シq諠キ.ヘノ釟[dzw゚ソCワx醉ラシィ|ヒJ<遏;N(Eiオ/蝓'M8/?靤「ィ鈎yタNツ2>『k1オZア9 ソロq`+K<?aDz1臺FレhォB「頌ァ忠ァ?xミハイチスvhナゥォシv噛1ニ!モwa⊂ヲl+jRzゥウ /漲Ч姓祕?マAxユO''イYI^謠yシaSエ歙ヤfl咸ネ~?~隸ネ~jKヒカqォs゚uノ摸ヘyメコ?]"懾/イko=ムュヒ'ッ}ホン゙/「蝶ィ(}ソ-$ンkッ脅チekラ,wヒ7oノZオョ゚シsミェオ_ウGアhΡス}チヘン_x磆|/シqチヘ蟻wワx貪ァy7Nッスyテ#_%.毯ク「|qTm『~胄箘h7G}フxミ44ア;線ネ:_Zキ:ア+k�マノテ嵋タクロ俄$摩贄レa掵覽距~縣rxeエ゚8pメ/マセテフ齷24}ンw\>|宝煎m諦葮庠母襌K」Kムラシh欧BC -セ=トソ =ヒO-蛙pネs撥?ノ^セ;n"gウ[F_シ玻ュ?メ__戦NカミM汝縊coE2bョM.oVンヌリ':?カ,](x%゙m弾}ヒ>dマ描A .z7\~驛ヒ;_ソq艨! }型-Dtuレ:影レY}|Ar淌gN#嬲マ:~evリMOレ;EK"Z>#>蝿X'琅オ/蠻タw淑|ZW_{ゥン|、v~6エ8「ケ6Ex諌KュュレAシT椒酢rサ喟c=鞅禰ホSG鱧ノ擧~ゥ%=オ畍PC|rササ_[ナモトハッ巫サWォヌt/ッユユ罅~wP゚コy゙ュョ@ュ?ラ溘UヤcヒwJイト孩~坩!塒2ャヌ゙ソ; ママ瀕「}ケO}?セ7ケコ_8サ、z璽vル゚スwxス7ノVヤ迸`溺= シァn±スンc/ リ頷r癜゙ア9sy!{キ阜」ロ3w]ソ�,M r脣ャ\タョ゚シ\`<ォケア%ホイ.nン要>林ラチ�゙ュッ靖ν7゚:」《ォタ]メサ(аメ゚サ.RF゙セシタ「>sサ3Ph刧ユユ」Aァ/ル迯?q /$~Unエ[j@�ハアr 繙cヤm�eE_~ヌ?ム疚ラ猖マ)゚z賃゚ チ[侖マ駟E躯Rp|ナ:竦�゙酉「篁'眼{ラキ>メ9エ Oキoンシ ,.p゚}ミ$袁ンyxW゙&Lムワg'ニコヲ皹_ッユAモEソ孃ス氾79yア)yナコ|オ'ヲ゚゚Nw榁蚋崋酊 ^ xレヘA揖ヤ、16:Aモ浄 K鏝Tツ榔c゙#+剏シ類チ-゚ヒォG跛?w畆/y逋ヨレンg襭暾ラ<xロOヨワcOハiH「ョ、*wOォ嗹<l゚キ,R=チナ[熔ソ褄ョG/゚ス%Fヨキ惡ヘ o^゙ソ勉rOq」/^~・Vゥ ヲ゚サy醢サ7キ~kュユ鞜゙Oキノ/ンセ&チア チ綾~鄰ラワク{謠/w漱ュ3,=ソy邊。嗣コkwンシ0ラ8゚ム/ソスzマ^靠3eヨヒ?サH'.欅Z。n 蕕桴 )0カ,Fモ'/俄%Q|懷髴/祗珂ユQR^風U。トDア2ヤゥツfーぼK懐9セ曝/俄・ト\イw~Ifxホn_ci飩ユ柢テfR卷J(mXシ囮s}^/絳つィF跳シk9ユRTwャ垂め%SyノT>L裹]ソマゥト沸ミ7 L%ー瑩ァフT椡w(蹕?ソ サ?ZJ畜劑iF<ァq_ナセLF=?cコモム B:イチk!Nム拯ム.Dtユヘアセリトツマq扨ルユルユ也hヲミt耗痛}哭ソソシz/マ~v~u陝矗テ酲算゚`キ゚kw゚ケシ猖}6磬=ロe配ョユN豼モコノw_>ヲx毬Nbo[潟融ロァヌミXッKwn,ユZ?イ蓁嫦>|xノmxSフ。ウルウ=$ホ傑テ<9+3サ鑠PマセzウォGwァ゚ウタ歙=ロセハuヌ'リノ{ -x裲roS}膾o#ヒ')ヨ_=、娚 タ絹yュ=綯ヌゥL靱ラッ}ロ_=p庄。}`*ヘェリl#イ「r榧-EエX_yx_/X0碌uJ\リ?ハヘD3:a%g,舞?~裃アe゚ウeケ"'Mョ5ヤ@「ゥス-c&nニoォGヨ>タ'エs(>畴゙慴~ョー4烈)イMタF1kYエユ8_&9 sf+アフ爵ノHwョ スQ0|サz\=Oゥ鳳A匍Cャ 1ヌ2アテ、焚カュソ默疚_ロ_乂テW衂カ_sネ3"「*ス鮓[ノ1/ロ?)ラl弑|ロ_k絃6!G拗Qラケb0MVキ'ヨ@/E7|アr辞/f,ィ樓D慫!F+禁k&ォリ=|*甦Xュ飯リ カ"菠TR徇ンモァ;ホN^ルョw.逢績j=]" ルSマzSリ裟K>コタ搏Eコ9)越ォe\=aK~イOュラ咨4ア9$FF%Sゥフ\dソu4ィhMワ&w楢トモ印<aナ`}Eァ釟~カ0F2ナ虫~Qミ舖ー繻ョ3vD敦\Gヌ<~M?R符W: ラハn>鞅&/0X& hZハ%ヤ遥干゙セ6s7;ュa鋲ヨメ{5;")″「Kウコ{4|ーッア菰QJャdネ?wンホイ ;廢ホX苜s:ネс トパ゚ス.-浮・「HS塚"]イ]%Jヲィsセgfw∂ナb槧」oユナ8;ロ3モモンモンモ=mv兢ィ、ッヘa5ロ,0イB_陟\85Sハ<ЩXp]~徊ヲ靂チ"rl $]v;「7サヘ"�:qXM鳴嚶コ;ロIァエ袷ホI^キ[陰「埆オW)r」ヒLエ噐ク --ソ エユEンツゎ┷;チ:]HL巨sヘb?焚FA.キスQ+ヂ,厥eGカ「,kル擴ツ"ハ; 9dァdN/vB威x 闇B桴y┷フ疏%й$ネ/VHyxV;フnタトB[毛%"AA`,ヲwfァ-E4筝W擴ニ)C-U-h」$カwレ�Wユツrサvキュュ wタ"Uネヌ′xR[調ホリAレHエ箍ミ< ークム6PoオK|B「抖=`ムャ!卵モヲィH:;レエ6D=@<アセN+)mHA ゥ9PスK+}ヌオ殼 N'D ユR'クマiu審ミナ,OY8闢|hp ネpンm'ヤ!"ムe3緝Kメタjsサ乖=?V/4ヤレN0)逗lf;チ.Qンi!;饗;Nャsメ陲ヌzBンA、6ァモ砦ゥレミ鞭m'吽咳ミ8%タュ',クユーム@ヘーpチヲ@舛cカQc=]ヲ -kウ-tbpリゥ}ルz 6'$1サ フ -ィ。ァユ{センBH�モy゙オムX\f レサZ\HcオC -%xС(m シV芳aホd礑コオモo|ch4モろャF]Z?、_ミュ閊ユ゙=w鰥マo~ヌ*Tv{4 ル\詠カtァ}??7,Lr}"キ@コ粳e蜉モZ」暦ヒ8轉菜dユネphヘフ/ナ繰BS 澱蜀螫。カ、XメU�W紿6Y(am。賠ホKtタウVЪ\ヘLh病ヌa}u'イAュ、RdEコ瓊ヒ%Xラ=ュV7。ォヘh?キ价~T#サォ6B*テ/荳ノ/用'ィlhp6!4W青Zbル_.:ホサ淌卦Hー-ケ!b莽、アKハ、屯wミUj:タ伝:`ァvサ蔚q8ュ.Bノヘコ砲w゙冒jB& -(ォv"宛甦融点.癬4t3ワ.噌7;-樂$鉈BモC_┫「y -,'ホIコ<テrJdjリ_クg%|ワbテ擘B隍フ_ハー9Y壻主8~ロ'シノA?ku,3古0n'tE7ey罕sレ/a+а畏ミ Pp褞!ッEタ綢イ?p9Hマ挙イIモ$クュA リfァンAjェ' レLムi3Lカv�7キル豌相ョ豆 %ホ 鯰トb蒿{、\弦ヤ厂ヘョ+Sョ?タ蘯]♭コ;zj/ミ幢f +=文フ8葵f -チwーモgセ/モ゚/゚塔;.リo胥FSx}エ 渤ャtス[h"ソメVサ_ミカ鴫ワヨヌ"゚ 蔭オMャa\%ネ?UrIc帋q5^bCVu・~」ぐ G:M^Ew嬶x7'nミ 殊チ?pセvパOチ: 6ン(6橈祥< #^w{ーk「ユタ歙ヤ裙rシ+訌ャDKjd!<yiヲ「ァFNモソD]チ+閃オ|ク昆>Oqmナp咥 隸+>Q/ォ21�4稠?ウCO-ヤ估ソb&^帖j -%$.Yエ:ィ創トA BヤJ ミモシ゚nャV蛞Ob埃lエノiSwyn;ヘi\髣ーy)詞ヤ」A臟~Q茣Xo僅2ンm纂チヲfル?契 ,Bチh~ルキ聨ヒ~セ:.i束k`>卸0 9h 9桓ワw脉0ヲ@」ヲ`キリ,.^X@* 萌アMaィ藥dロン禄;ンt ゙貿レ�ョ6・ 瀚ロモ�Bイ杙R<ッソ+'<Wワ桜聨w纓テK|4?襞@メャッ簪キ_?ナπ%゚! 'R杓瞭ニトョチZ#閾3sZホaェp.~v"ED/1 、纖<lフ7 -ヌテミ」; 翼ヒラモc:~)nカI尹ワ+ァLjケ `Zサ炬/・/ト獗Z g乕GQナaヤSq8Wョスサス遊o゙サ屋ム゚<ヨ'* Gイg茅チ;ウ�$$倔:隴櫂、ホqスY >ソ%リ,,コ>7ェ蜩チルg/j]轗ー!ォ+禾=゚映uリWLナpzテーYj%ル/=>ャiオ~ :ト偵//*ー獺ッヘPタ・ノマ~購綫1烈?tY MVR蝗賺#xWナ%j・ッユ6コン邨Yヘニ餃減8オユホ %*Yフラヲス(.桧X%ラユ鵈 f:?ェァsイtヲ1リ6O+ャ.゚5リ楕ォl悉8#タ"aロeナラ、ナ木V}>iBG濺セ 6fミ�スッ牝q而yサ鵁�エ"゙ァcbfwホ?x+ェ$;E瘉ムWlリネ?dセnケ(畆ス>Iz_9 ッ゚z徳ijフソ謫岷聨イ?躰。キ5湍%z嶷ケッチ~{}sフイeJ_h6ロテ|Eコ]ニ悟_V紊ヤ?チqネィ:1Gk 2レap#iD悶jチ3xeh」 7ゥnカエァB緩蘿ミ_棉ロ縒:リア椪粐xキ゚紗Iur7「肄イB?ホ舅帽n6;「KFチs遼鱠js<,鉈ヒa=ルRmカアGテワ"廸揖黴,g梺ツムホ;菰f7qウNムLX普Qz筐ユ 。リ゚ゞイq?w]ワヘ干l x梅メG8」i|5所サ Txウ錬湲イ1g|-ルモッ曰BEdハx呟�~s嫗 州tカiク・c躍ヌU┸dYx4噪'ー<3P9ユヨモ"_DBーW犒8フ%a餠カRWO/iラA#0/yv楹!=ヘタjqB ヒ蕀\レf逎nヤ24栓zJヘ賻b7ッマヌ?幢p| :D9 8?」。。カ瘟ホ オ懸弁m~qルlララミ?$」癲*$a,「-'スゥヘrレx焼mmヨオ=Ow┏、耒箍傚�{ヒN4gw!/ミPヘシ4・ts<aUゥ)ルN<讎l/P4セ菷゚漉ツA・*# -ib,ツミk;酸」スメ|7Fタ|?Ι造 ア儒+\Vウ肚�Np -ミゥU4廣r6zテ鮴P&�N0E �.l"0q「6"x伶与照゚'貊ュ>uハ惴リ.+聶f=コqスN}^,燐imBmシD6 -エ・b6゚購[ネVス/ 烈ヒpマBソル懇@>So悒鵺8�*ab@裡<?ゥ0ホs」 -@2|7玲ス�Mシu]4ャ゚轢カJ「潮誑/畠耽ァ縹 ョx&7ェtgojャO闃ァ -菱 ワ~┸ソP<.゚Inr`。) 逃ヒソ耽良|ム{紕7-ミ]ーカウ 俸C)メ襪Xリqサm21楽{煙g'#ィ@'>et斃Fョチオ}i羣杲o}マv轆V=ラ搾拓ウf搾匯Vハk、+ーー'ム{ス5マイ1クVh シtq#ハ[ホザrワ慢W^イqッ聞(桓%凋,Mo匯、盞用ヲ溷レKワト゚彜ヨcB漢]hイY屡;ハ J/ーモツk9B=戳モ?シ蕘CNaNoモ弍G屐q恕゙ク゚ウ拭{フp3ーz#%K3_蓆%コル0�}=bu1L「mシコCЖ+,Fnlイラスrケ.D u檮俟/LS畸フgレ/`v8晰ヨンpヘ便9S3z49{旺イUンシP恣ソンー &レN,lウwq鑪VBpエ-f3qサ塲ワカXm濱利-/盒P:モu"マ$ }&ァワコv霞。僥IオイフP+ルM 、ラョBレ痞ュェ''#]ンDM@wS斷3#t=モフjZ`iヌキaフ/Vト」 6セ3「8、mッb裁mDqx#碵廉詬vシフラネャ?\男マ(6斫ゥL泝〈 zラ_OYコh/猟ュ櫛v�ヲク`*Pfサ1佶~ キn9ワ,'チ、セL`キァ坦n -]槇郁フf真O6/gGUp孫(8h8チ1ネネサー4肢エ64モ゙, セFカ?洸yg;Zヌヒオ錢mG「チマァ7クヨ~サン堆{mネ゙Iw廐苻cキ」ナツ=xZムCフ.セVH2.ヌ-2ズf$リrwfカ カ%篩H悒Tム?!.Q#rゥャラ -~テ__アメ@リkコ仗~ネツ%」モイオa‰c5サ ヤ -ナツ挙ムx?洌i 巨p!lBQCtレ$「]?VュhqニX射Y/wニウナpウメ�ウ6[樢 ツ、wZ8[Fニベ佃b7怙掫カルH2Oォ-卩*D ィラゥQ煽ネ6゚]ルリュPン -ヨユv゚ マq?ワ.?ヒ*「ヘpス"bミ�LZホ*マセメ5ロx ロ 迎;]-後5<オレS嵐^・\ヤ恊゙gニ シッムツ-マaS 。ナ忍ワタテヤ+mサヘJィ(ヘ.p・t( 「Sh ;-ー購ツh@メ6/戀啄wW$7jス{誄D4>ミー|ュ菟チノ`-ナムfサ嬪.シケf縲祟+ラzチDOGp<イ7覬+Xスq=樢マキ4イ'xロュg- ki"95n1レg}件ー臑 ニvB'4f+'領~kd弖jョVサ+ォレツラrハnノモ灼マ!5\ynGDシキ\ホトh�C! 仏畴;0ィチ^`ナQτ2シッ$ヘヴヨ6Qオgnシュ&ヌP@6、Oノスモ_ッゥォ'ク Zヤ齲ン0\ムエ&uヲソッI'シL|鉅閑カ -M絣#AhwムOケレP甘ユV3ュ礦0サf5Z&Dコa!BLモ并'猊8カ「&N{;LスHウク骼ルX?^ヌ;Xケ&ィ+_T*贇_省[u ^でタス」`ソト解゙ワレヨセnスDツjカ搶]タホ#(qj零否般ウ0E謾#\襖モ.{l ル>ト0,~t3ヨ -ャ1S!褻&茅?R吩e9ォテv SレR蜷ァ:ク迚|GW。u%繁ワヌト0ヘG テエ*)ゥ3R可eマナ ?ス`孟ョ6/Y ;;モ%「(ゥ+ 酷h<ハ|nユ;_E・B?テt「ォヒ? D肚ロミムマーォdン/j) サ粥M繚?ォERe チw-l$-'妓+ヲoヌ」}ユ「∠cニイaセフ鑛":゙}チ5モ|ゥ癡>pロ#黙`~「ケクチネユy":鵁tシ9カウ階セリ1lエ謔Zkトd(ォ_{E"ムZ�ョユ曁@y舟T)E,{エvハ2ュBセ.,テf帽レ垤ト蔡」n.」r+゚捨|ィZo8f惑ォ算~「%妓寳匡]シ、=包�jdRg]シ モTeサ猾9ユV黶ォS閨'鶯yエND-然%雋カ_肴d、V宥Ae$n壷炬ヤニ餮W ,q螯ゥMFレ誌ネツ3メセZ鵠ホP ホ \レGハナWxオセDコ瀾d鞋漑鞣9:u\籃a?hZdイ.pリ9I ュ3柝EZG醺ムA「pョレclシ:縊泥$艙\亟斛ケz7ラX」ノ{モT!>タヌpカ%它朋ヤE メ{,=Jォ$簡2エエF没ナタ4'ヨn6di)zホmツ#6モE笆I2l゙t。ィjv股リトミカニ"|ス、トZhGLヲ10リd0(餌ア ミ.蛎チフ惨Jョ彦ロ礎壅ヲクオ鞍ムコ$ヌェ;,。゙ク テRレkヲ.ネ�iSbReヌλアWLnム 0ーョメ_ーレWy$ヲ.゚1MシイチエYッモ弗L_ヨ1C; f墅セ*0゙9ニャイウkフョe0^ヨナ懈゙sVフ擴・0O b゙ャ觚6弭 )`チコ喝ヨfhcX]ヨテ簗KソBXJアmc鯆Ve ヌ0耶+zリkPァチ開G+ ツsャ槻ロー゙ャa罘knqュ遏/レヘ末m」jラcホケm喙96rリ hリB鴬ー仏m -ニ$5l|aス%%ナメ」Tカ堺・ハL)Uマ5ゥ.ト・ス磴顔^ゥユ彑IRァ'#uスェヤRッgンT}4エk}I」ウrE夊fmメt'ス疲レゥざ0ハロ、蘰i-ュ鷆i pレ皈Tレォ`=饒z栞モ鮠�ャdロ師[t・A/Uヘ!天vr參慄4ACfィ8R2ウオ蜥ル彪變オeセD*セノbッ凾,Uチイ\c癡ロ%岻7ネZ2巷ヨqo・イ~アソ桃ァ封モ(drt&ロ+テSケエ慂U鏥ョ&grワ否アレJnセ艨敵cf<e 艙]テ./~yテ鍼ハロヲzQ゙ネ゙蜩|v&_|浄!iT`゙」_「P(岷9ィj+フッオツqセWe@チ'ErV)YソFQqC竃ミTt雷/ナ鑚P|>滑dクRb」セMゥZ繰J」rオUレ彝ッメS4ソ+CーZ「P&ャ2゚\ャ俵・゙ッ|+%ハ>>キ)ァcサrk膝Θ。R病ljェl参-yロェHvcS・ 舞ェリU沙zォgyユトムメゥVケtOuXр@ゥ~Lm愃嬲ロ甓?]u<疥ェ@*ェォ崖ンn鷁f婀/#クC}d・Ud<ヤ个コ「ニ厖4ヂィI~ナ圓q1メ43ム訥テ5@「ZコZEKァ5*゚eZG'・ ヲl mハ*kKハM_ロレ現レチイ゚ヨ.譚waモ{ラi4モ斜籘t゙杯急ンォ>カヤ5ヘ攬/ン+t毓猷w趨^ン摘縫U3l゙}bョ/ 2}ォSエ鼇ヨク~5X4 メuua0(:φcツッ_ Cv9ルカユムn cyf8N゚p」.7:買・14ロ^雇ココaャ轎rc?[K吏メ$ヘX}&Cケ<0ケF2サ)zLuMマチjzォeコ&@vモWア;タユーキヨd <h'フ。(テモX溌v| 5+メ龕Da6ソjLfE33ァx゙\ロ8-諱9コ1ッSナコE5[,~偏リト蘭lエロイ4オニ、NヒWNヲイjb雰ユaモ|X」恕オ闌dャキ<dフM]6i」K6モ!ェウ}N・-モメImMュ`キ艝ロ゙*゚ロu チn8・d4ェーラL閤h倪/スヨ鰔j#Aヒ喪$"ヲ乾ZョΗz鵁rキ年mロ誄コ5」リマ吊lモYXホムn」uGpoノ._*オue」幎-烋uヘウ。Oキャイク-緲ムQヨキR|誑悟゚]>スG;o<桷2+做エニウュg^ヌ$ -ッ<サワxmムdツ叫゙jャ弐庖ミヌ>\-ウBムマケッ8ヲ}}W[脯埔} チVヤミ4ラl韵ユ藝6cキノ.熄 :ラャ6霓蠱カュ2h0Dチタョ,lsナ`?。wロセ;d*$M。ーモェ -Uヤ -,4Z-カaャロY┓y8>jMテ絞cTg賓q落ォHv具"ンHRル:"j|ユZ」aK.ュ呵d成ヌ莽(,シc凾ム4f瞿#_央煤y<簫j箏6煮オォVBユワ'シヲ;:^ヤδa淨<メnpu妬ヘ+%ルQ ノ/拉猟ンルh*Vワ-RヘY<浸i燐エセ 、テヘgコ>絹?ンノ]Fsエシfc.Sゥホ:兀}ネェ ャュ[マテト 蒟心サvュ愾g羽ケ*ャヘヘ毓ォH4_ュヘ-マ{ユ9ァウラー#レーヒ^_Wセvャ`フ'シXギ・G}+セP-ウセャカ焦゙。{(a數ア腴l、・[ュ(J戮SV寢x9ht耶.Sーシzュe*ヲアイVI毀カキルV1i[WuUセjム」.Tァノヲヨeオネ{ヨS{ォЙオ]ユサィロサ~s=? 蓁eウ。欝lE#<旄o.エア祟Gェル,靫゙誥カtrg+ヨゥ Z掫躯 マ'o杠.Vユ{6oォク&n樌オYエ>m扱」既[サ=リ:Xヌィ(:゙WマS+Ur扨u鴈レYキスMコsァカヨ3ヨj^Zmvヘ咒CcK?「k筌~裨Aサ ユキPアメ?ヲ凶キ\,凜zqーモハCラ。.Q +{p溺GsT篏ムェョロ2ク}\ソEニヒィキ<アヲセ釘」y,&!ヤjアヲァ幹7ヨ;6ウ蒙゙Yムエェマ幕ンnnkkシRヘ>_ソ諤(モ泄カnケ擱 キr9Zヤca軛ケ/}談ル:塢+isX|遍ェkIdヨ*オ[オ辞フミ7zァーノ、ャ栽lm-xAカ-VzロヒH_ョ準ォ宅Kw俔8゙拳ョァu&ナト゚NN[6馭2;ネ嶌EE患ワ 4ウヘマRムEt嬶uo,メL卜,ニ/m n~j金゚71SxイSR7=;>(ウシGワA.w腋qy椀励03VAネFキ ハw擶畍yM}ニェ,"。]r5LラX&鰈ェ霈oワヒオTワ!jノ@゙蒂ェ|hw:qK゙・0ロl2゚ヌ>cS=.yサFmネァ゚Cャナ$Q┥9lG5ハ"モT)ルニ`A1」Q5ス*7j愕ツ縹Kb沱逸ヘ&Xnヲ{倬ル1ウノ耐・ェ!Qト&xfタ LtO懾メ{;\旆ロy:!゚"ム yニ.ヲW臧"Q d%>zclメi8。鰈L"ウCt諫33ミ。 ヘケッhg0艟エ;nタ7エ゙ー庵)W イ51ft(ワ殍ン0>エ琳ム勵鋏V・.ェf[-オ】F6カJソヘuInFlニM}輜.フサ儔dゥェ ;]ホU農p嚼73vセテ[ツ。j・鄂&`琵 メc>Aニ2:@婀5v6ャネ3恕`}ヘyソレG茂竓連+ァEモ>Y#ョwロ∝Kソ;dgtモユ凜w銃 ーオL(獎ハ熬シ;者)Yh4」nネ1S゚ァL`コキナtヤD「タメエ }ラ>岷マヘ」フメイ、6q] ラ[bチゥ氛モシ」マラ.ZノモシBトNE2ァtホ0ォeリhlCウc噌。6ヌ帙sョニ>uア)UcP+Rア^ \ 發|W-Vータoノタ;」キx#x<。唖Z况g`ョ・q里ャオ窺*ツ'�ロラ2oス!Y「姻フコzトヨフ$BサンャfAエB.|�匡ユ"w絡J貽騙ァD,,t6ィNト匁楹{タGp蔀&莚、疔誄シD%k%ixァセケテ珀ェ@枝軋6梹e8。Vn5ム劵>mlシロ駲ーyO!ミqBF.eフ移|蕚ャ1t ゙'ヤUZeテn$汕N2.ワムムェ'ヌ$#Kソq8菎妛ハャ1H`紕,ケP窟W%rOcs9Zvサ!ヲ?$キメ⊥ュレ^Yヲ姜tセ;エ4シ-Y:u桾wQョ�'5西:-Cu:m9fO9mミュツ撫Lフ4ォ*W嬖ィ^MqWゥ)Qtxシ}Bヌ6ョ゚シZJァ ヨ闔_Jェト ヒ>!包ェ淳Uクシワj鳫J*峙<モテルVe t魑ァ檐BUァイヘ}Uヘ-Cォ勲ツェ.c('= 6Cモ�2w=,eー梺ォ/; m-リD筒クセ:,ア孑]ター「ァ、p^チゥaーI5模ヲ _ワョAO畚ヲレ5ムシ)"ヒ nkN耘・ノ・オ鹹ワi/K[xV.賺(チヌ4>!<ォnネ檗テEメ2ヒ:衞テ -枹ニs璢オ釟゙>檮ョ籠モフ"oテ芫 Eネァ4ゥチヌ{璃ラ廳モテssタ歩櫻マ肴裂、゙^・タ競6M犹学,aニ榲ユシ畉o、 -ZZ葺/g-<Sワ領z競n鬲mnf:\モxp誰ヌュ�XI[朮3ナnヌnV聲ス;カマ疋a億イッ1コヘ ユKーL。郁Eス3、"ーk >Hテソユ�ハホTホナY-ネ�+4構x.?ヌア!ヨ|゚ヤ フ「’-ゥヲウユオhハ<0ウ堀マ}5ミ 鰐掉癶2ュZハ「1l3xfi(,ッ -Nサム8オトアyΤBouT&iミ倹�゙茴bオワqc_タウアメサY_ヌRト麋鮪*V>tcwエxvウ-エ池テ^ヒ妬lヒル-吟タ^Yュgラ艶ルシH*=0 -サレA楠ヌ陳苓ェレ/bコxス劼D、Nヌ4ゥハヨ2 r`G飮"ナ@馼ェュル セlト。[ァ譚Wuz゚r臆u!マ =-atHナrm2ク3nミOlアlヒF%メヒJ-\9、Wq]ホ、f>]&Bnナ乏ハハ垉澗#}ャ.D#ナモエb hpcホ&ャ昃aュvカ3藕fァ�ヨナ樓、テルF骰YMアH ケu レニ軟eヨスク4/鯵Kン s:k捍66)+ヲyPV+J+V偶]X囘ゥ壇/ハ苹B瞞 ・.$b沚^t0y'+ナZ3タI狹,6ppBェ鋲G「ク|ヘL「8fソ<ヘ b股ヘ(ヘフ。=ルSリヤ 溌ームTム勸5ヘ~ケVL<1tケ {cB「8 エSSォ _9やI筅 О)S: Q[L-g黄=ム鷽元Q0。リw,ルrN9キ燒、-K�-a6R゙ネ3シウ哦uQ凱jコ$>$bヘ(Np メヘzuヤMョョOケ璢+g「ロムハフナ「pッ\h}zケ鰡2然1贅Zスメア・与+DL3「怏}」ト搴�ルチlc徇6胆pヒロB攘1.川(ハチ -ウ薦^T」粭フウhゥv# ;?8RクgエZ窶Hヘッロタ~盥湶3!添}Sャサ5釦チz苦 yウ-)Pソgv!\I>チコw鳳 s欷タッ>Zニ`ムMGチルル]Bメユ}シキ5B゙毀Hs2XKゥwr,~ォオ~ t澪竕vネ -F2悧3a�せ廰@2ア咀Q勾ヤトスt`ツワ uKュ=遂iワkq奮[\ケハス隋$ -ァ Mq餉トo]ユム^Ba%ム譌;s/リ+#ゲ個h3萌tXレ「ェib%]+ ロッヘ<fjzC>Ucモlワワ塔Kニ、mタス%イ* ナ耻)ュo�ユ蛩\ァuLh;ヨ咒 )9茣/Wネモ嘴'ゥチ4臺&4P、ざ~ワエc-G -チヲンlw瀚``゙シアカ燭黻C無ノ珀,アl5/=wャ/sUーム衵ォッ;アI56ニ^カツaqゥaゥK、ggェX�齧:ヲラzク A6tXCゥC;.邦`ッフサョ X粍゙ロ逮(&ァ -Jサ冶yg&vァ迷ラ -,ヂ胚クVヌーkーヘゥコエウvU蘋й聊G襤.m98ョpネッネrO�ス,゙O。nンfョu。キtコJ襞餉<」ム琿イノ!サ゚Tタu,-ン7G. キ霑謳_ -・%I;、┿"葹幢ibpケコ、 ルマ}ネ撤AG3}斎ォ;(h4癪゚c饌ケア5,球ハ0ーy爭:フケSトヤノEF/柆xウ$6埠lNマヨミ\K'涜& $ケw檳ョ錢ナヲキ-S&ニ蟐*蝠DOヲャ鰛軋|8\<トュレ沌Y゚テユェcK0}#ュ|,rネ~カy$4・D4ワJb(ンLトUノ蹌誇スヌォaァサ<uロ>"+0ノホロn}h*i k}、檠ュネJ -.BセタカYョq%qd。:d"カ牟薬キm*Q3%<鴉#皖削ネr掻襾|C;Ghwテ -;ワk睿}1サーラ┬U<┻-椅ゥ?:轄Vn=ゥ'S#S)_XLマツ寶劑ニゥ'/クqン36qg務」ョp>vセDxケ"w「:%」」マkヤヤ仔ウ>。ィYJC"n棹柝YJ-hC $ユ蓿'ツ∴CアオヌメケZ胞 タMァ湖,゙験lZ=儻R98[~閨5_老o&lュ ゙p[�躪?�]4ーVュZC緑ェウKC -@ノ2メ娜ァWaャ*Kト既JBアオ瞑OCヨネ幔フ共セ,tvVdム0?ホ^`#e:ロレQワz)ウd恐MゥナユA -3Y^V�0ョ。ナロK%アh&UNfUfM詬x3+h髢ー*Fェ9メマヤz 囂シt」 jk,4ナ蒡ヤ{ヨーg輔b挙kX甄ZbJイ-Q$ノ ミモ礬k~ネ%::Br、ェ身@傘>f,フ|48寇V」w�%ノヲ�Fh猿rシcーNp825:ソ0]AKツォ羊Mh椒IB扨コ$(ケヤ銘K a*┣&-4イ勅>ivP(オ%シ^V_゚-眼ハアfケワnサXz5゚ギ-イレナpアt$> -7ソPハム('&J縣ケ7ヲa|ーIX(袰イェlt抄4イメ)ル8]7 セ6チJマiァ「,P ョシ+ワn&=ー)Pノモッ4ケS5ハ縋ア#タv8ヘbGMVj星ニ2Y ナメ」メH兄捩ヌLiツ/^WHq琶語儡オヘq鮃、捗桃 ン鯏%mowア睫Lラ吶Oソ'}\ヤ預ユレ]ヒ -メ偖tTF'$8B゚_ 0。タ`hC゙Mjsq`%ュeオネス+e オdOェ、"。-&*}ト瑾z侈Jv)リj!粮=蓖ヤ孟CッCrユq,副�E5=5ミ� セ舐 ヨe1y}e\トサニニリVXZ笑戉祢氛Fコ暼ヌ麟戞/m&6公1ワ4d)*ネz・モカ}耽mニ)lヘY戦#Dvヌセ檬?CFヘチh)!9窿jク巓: ネ崩Cn覆FU'np8軈ヌメJ tD'∃q笘。シk」」マネ"ヲ諺 ogxナ 竊84 粒yxヘ�MウU 、Nー沁=J/ w貂 %辱V{レ,dハキ顕ワlソユヒヒ塞Y*琶跡� -カチ\Mセケェオpy乳$&{^シ歸2ケ8悩XRタカワ9jナ Q モン Dス!!sJゥ P。@波ソf@pCh)|#酥@Oヘ]臠俐F徙oア+ニ ロ増EJaケ#bロッNgu;bE?vU・タハ縞7l隲Ol -Wク跡6 7ヘゥャNpz曵dァ -oツコ'・寫ブ ゙,| !oカp�┬oニ2リg佯g辱コ -鮑撓=ン+XS?zrlッシNスs`スセ厮メ壷3狎易監ムノ指'コ萄*ハ僭穏ォ:ヒ.$ヤULlフォ-8タ H泯p0脱紙1h[w#b.クe:ィ-'iヒ9エE。。>S釐畚u雖リリラ浮ケdムJクq゙0 >ヲ| )ニロ゙カi&「ュ絹d�8b溲fサ|ク{コx^邇エ前タ保#ー5uF=*ce 抻S\ス%ス\Q~f近スソン゚サ?ウ_ワqO -W}1冶Uw褒TTモ;E竜;イ^マルヒ9 ウ毯7ェ[?}」淦ォ淦チ_キ゚ナk「ー/ -9}?}C7~Nエナ_罅セ 」゚oキ髀゚ (ソ-ス治[)@?鰥クー`;ャノタAタツ肛~勝GFioラソソ#タ淦ユO゚~ァocヲ゚エ゚?}ヌソ7ンQ3Sリセマaム{b>?g/_懐滌゚_�^+j タシサイト6ォア 5&モ輪 [「\ヘネ)m^ィiア?ァsゥ門ヨzウコ岷弄/S$ゥカ釟@mOキ?怨ホシgエュR悔B#D ツ\隱'ェi「ソ?4ニxソコリFョd紐$V9ラ」モeoB-奄ン瑰x} 」G。$)n訳!讃ヨ"ロツU゙&`行タ:ム蜜t>ァ抵ュ戍、fスホv嶐8カル(エハNu癡ィ:�タ:lウ[ミq}Sハi}O侶 ゚d%4卓|-)jUヒトm?ミ*サロ&wェ`/s`yX"^3揶Aqムヘz4セ逐z。カ」,*鰐藤ユレ8#Oムm`Pびョj$ケ・ヤ鎭j OD「8゚.lルレンナu]bヤ矍9クィM鷲ミk「ィX((quv\ ヨr/ー能翆 -1「キg桓ッ鶺Be=フv!Z`ホL 憎イ姚。G笆,舩uュiワAVRクホUマ蟻,チWkアl0\ト穎[ 6ヤ]1ツ/3アフ~褥。臥=糎ワ']vM!^ Iョ シ貌PセP5淮ゥ[9&@v屋fマ@醜舍qキ猴pッ'岑]囀%nモ4ホm花)%+<ワmCョテ2n、-s4 エ夊ノ%オE九|=ヒd>oWaョE:r0マudィ;RメナK;エヒQシ0スIスzD-A ムlE�彊=#ヤ3 B/憺Dコテゥ ヨ&ワ、ヒtチルチ -ソYlセ追zzP:}Cシヨ`窺ワノEJVcシ8=オ顰eヌ モ`>3f6\ヲ毳:0オyタ4セ|モ|L堅隧`|3シ7ル*j0堽ハャ 禀 v,ェ)QクF2鮟$ルニツnオ役ナm溯ゥD摂v凡モスゥ3.タヤ#ワ*チ:fpp8*f斡lクノ゚R毟)ル6}~朽ロa0切"潘ノ?ム7[ータSスqT「リcUフ「 -HcャFFモ゙紛eゥ.兔#e+F。 射サッレKW迄) シゥhZC%オシf^KエゥCd:Qmネhヘケ室@Sレ凡ワゥmSョャ::スYォS0Wメaメnqヤ-サモョ罸ネラiJカ俥ク;a{YスUD敖」9ヨ\K~Uタ}マpuェm>朦3ュ<hヒsu*QvカVO獺<'ぇ苑C,k^ケ:ナユF県SLQャティS@cケレZxRV胛4iゥメcスマセエィR;(ミェZスuKr}U[サ% -;ユ\鋳ン賺GuSロ謔声セ>」[ヤゥ}Y:コJE擧モトミアV9ャャNA/ィロ}クc蝴+"%ロ貎オ碚ヤ'UUN蜴ォモンテャミィエ.sユシOァ呷趾ヤヨzヌY_戴)閻$・票a{黒ク:ナ孳キSeセ0Nu:ニ%ル把\~m煌ゥ^:キャNェd州oヒfujZTハDァ"チ薄カキ�朏サューSヲ_N[$h肚マュ&c゙N]xwzキァNサxaYィpw啅スe哉ヘ宍モJ゙鹽u額!サヘ%mYOァ6シ坩hx:=*ケ莉撞モ:~ョ茆kuj夾u堡]Uサモ彈UWcッチsァュロ。ョ蓖エV{e|斟7スソヒン駝z,Q|bCュ嘖ョ掾4マロ鯆ウTex:mn7l;w樺桧ンtメュwホN?ャM5oァメVWk粽ヤaP' リュJ -鱒N Aァ/カ(<壅uイモ[ヒォ軆Pァ`ッWァ.F岫ヲィlqリゥ担ォ&Ea/クC{L羆[懍ヤア。D。タ蠖ムm鈞ノ0D 症k リゥR*0ユXl¨Gカ 「モ9k�ツVZヘT a ヨr9zァ姪ウDCリ)~1モコオル勾エモ ニョヒ.ョ」vユ竓ウクモァヨaレタTo密]誤yQケ繃埴Fz麒蕋ネRヤモ謦+s號穣t1塢亡゙ァ@&輓r#ロ聹i・v <敘#g珪>ッ7゙キwスレヤ眺KXs~QOロ_ォO」Gヨsコ箔Om5SアFjヘョレYィ Oサj[1守モ偸mースOmuC_�cfソqR;筝ル淦ャ嫌 _/s俊サ鴦>ナ伴ィ掏レロア淕ナcカテ,xlEスM<ンイ,0(fハ'[S応カ゚Hァ=r荀殉d' 蟇ニ詆ト琶トd絖%ヤUェ.ヲ<PノbネtPEヘvbtガ��刳テハ蕗,「4ュ、ラ`!vR玉_4コエth3 ネャ*dヌ"ム -慓Yワ竒ョオ -槝#ワD yM|g}伍-占3oァネホ硅ヤ!プNォSツJj渊eu -Tロュ柄Sh銜v -憺YK.駸azァカ栢ヨゥォhキミ:)2z。ヤzYIヤ琳\劑レ4N・伽孫S、モクメハ+ヤ?x:m:Mハ\搨Vメケ謚H }セNヒ閘ヘヨkョPァ`ョェ>ユ淦HuI7栄hh坂"ZZOXD;、j擂ワリ(iyノコ*攀[&潘6」UOCトXル~ュ>ョァ}D レ靄X/AMノ*/チソ妄ミjラ"+1-qヤ3ノ9覗ンラ癌ァ秀-ユ。ウn ヌSTnゥFント楹 リェGURcテ、1.h "囿%悟4艾i6)熈-]Sモ3x徐rU黻@:゙∈ミ7庭カマ栂ャッ哇缸鐶クニメ黜メムGソ;[ユ\ウハスルk~ニ3+ネX?謬トAl>%メェa:<I「*ョ%zタ\ニ溘-ネ譲(ーラノ扞sシウO刈ャ3]Q\yAY^絎ツ{oGQ」佗'Q;/゙%+ネb応x;e萱8[彷^ 穏ユh駢 梟フ=罎QI(e\\ヨtZ`<ス」 -ネシ;5コqKノイトカ0W8自、7M策Z3 #ョ zJyaT執'ウRレ'ヘ'ウJr9=゙トNR號Qエモレメ鵈ト :Wツ22ウエEj} Fh落ィムH5uツゥテ ,賽%Qーョ/M齪|チwツ\w「艨(シ岬ケフ」G、Ddム恋、ャ螟4%ニ*・9「/h#▽ m。f:壌エャ梠-シ4ヘ6:・ニX]ク tマ。)2$yM 'zミ.6J垠耐ニ$、3^ミ篦u獺蔓Lセu}チ狃ヌ峩ァモ苛ナ&ルrYZニヒ?、アッ 敞sE・#$ミハナm」$憂GイWt~ -コツ看 W'ト6Z良‐Qx$73ン9I / ニフマト伜ウ>1r[& MiクNSHユ鍾、淺z:▲4Gツ茶ヲミrヒアCサ&ヌh -67WNSフ=ョ<7ハ<膨%#ヘムf過・X繝ヲ[イアワス唏7ァb贅3]ヒトk箜rメ蛤bm栴脾キシ 'W8ト'ロー/=$9カィr]゚b鷙.nFlOPロ菖FロルOキtタ鰆@:フgF纎就:/)ラ軌ミ刃�ニ.X -WカeムsP+oウ軾 ヨォy゙InAハ捨g4y香、ム。゙s諛OT_MRキ鉈莖ノDク%b粗サY胡7Yキアクナ穰7gg'Jォワス=^キコッ{遊&zHл VケG- ァK盲C誕kワ�.ルU鴆D4ヤ・ /zj6オD!萵Xeリロ @G奄iR゙5!藍ラ&w1a/アLpソレ_�b&ロ > ト料ヲマ「疂`ェメヲKUz嫺ェメ4膃"琶レk:ルク」.ミxシ]B夸<%ユ"墺ュ!夂q~ルf几=tャ)フ0・_ァナセw9!ノu'旁ヲwァ�メメSツ傴ン揶q「E「玳黜tルナFwmメムエ給ュV17Jト゚N俯.シ -P・(X&TTワ~ヌフ# -+?<,筒'RタU聟枠|"0 I促a梔C8俊 X堵(tF87{ィセ -軽Bxモ&z:ァ 」1ッ啼Rツソ9Gャラ8Gニナー磆ぴrmδg|シィャャE。坦? ゙gロ 鰻゚\J4キ[$\M鏨<^掩B*俟 �ヒ&汀瘻ア5・f ャS「ンノホ 塞w≒<A「A(O8{Ep航RBキg胸`B4肛RG!0カ・ウハFwゥミ7タイ輪麺誓I3νノ幕tMb?.e Yノ51 ]1EァヤセテaメF"ィ碓ツ\sMオ辣B怫C  奕:譯U2i弍ロgxケちンァ゚_ゥYjzワ站AメュノH9&f7艾ァMチチB`ョルァチレ ワナタェン簫籖ナ 惱{6ク>シ帰8 /N忰サ。^H0宏vC漆ミp゙ iス4G「f゚ロアB訖I。 4。」.ナ3.:* ョ|XDAァa柵寒K橡リLC貫tィ蓋AHヨ21&Fン=攷 -ZDス(>:=sフ`p]_ ァc宴Iマ培攷リFレ`ケ- \ロ帳?冽cヘシロW苞ース?リ 8o`.ツロモzZエ-�ナqvs^李No 0s6ノ`/ハ淮s2タ、茯ムtソス隈ナィチメh籘ミ織R沙;2チコ$[タネ9ケ- Fカ徭>qニ゙Jネt井篏ョソヌハ(椏C'廣'Q<'N8ナタ?!N8フ)9t:チ :by<N8e >!イSzGカ濔9tツtト*冗ミqvzハ」エ季s閼3鎹r靼!ヤ7鮟xN挾Mサ咾ヌ -H賺0oYレユxL!)vH杰0ィィーY/cx|ゥス腦アネ杰ニ刃ニリサスネ・サ8T8#ヘnニモ抛テi戻Kォャッ;Q枠|タョトa]听I9'z~LマソFユ>推3ッxョト5ィ李捺Dハ噎;スcF゚鼻%6萠|ノ&-ル・&ラ磬コ25^ユus-ル゙%ヌ'トulテe%]Kvサ=膤Zト"7!;マ礑`フ,蜑M?qカノ2EノャЧ」jJWブ~+ノヲSZ゚来Fq3,觝6ヒモKw汝9ホ擦ロ・~瞽ア秤サOャタャ奩NNヨXI拈 5壗uK゚cムy|ォ/腎ユ"Rモ亞暫R < キ係</攤[ネットタ牛"Hイ=9「ンR」莊P'験 ゚Qモク究`fハ-タXサハcc9Xテ仟Qネヘ験ソタ;w&メッdr箇e√53 ー:ケソ猥励|�、ラ3貴3クツン第予リ争5R竝=セ;"RツB膚%p5灰チ\+ゥrwョ、腓`/'ホTiクルヲク]雕0糲ネ樒濡Ds{耨\焙xョ<9ナ軸フ+=致レIuホ兜\闡<莫セノステ2ルオ| r<R7#*ボヘラヌ:6めゥ{zyt學' ミX遐S=OアヌツaW%⊥<2苣.漸:ロM!体,vタ曙?-1ィ<2!アーハン モ#土雑F「ーハ=メGンォ顕GFrCz9ォシモ#saΛ儷O榊疎FwOC.|欒ニホHス/?OャGF "ニ.1ラ都2ェキァ輛*ヒAOタR紡*v-n\鹸 t9咀愬$f仕8{盡ル:ァゥゥッナ鎌レヘ匡ч -]ク>FS┫ッ袗壼恒yuW脉ョ1.@ 「壱卍W擒;NQ,2TO}ゥシ6+"6:fホ;oネp-ニホ{v>ワス醤ヌフ|ク#TE蠹沿P}B>ys(ヌ{#鏨8「。(xb>ス」マホ」拑緯サノceqメB棘ヌc虞DY7゚/エ佇レ9&RXキY)寐モa轜。{X戞Px#η溟pヒタb鐵ホ」9 - c牘G<テ:;1"杣ロK6サ宙C1!ウ*椶キハ嗽リヒウリーホ{ュ ソ綟テコィミ+レ8トテlp=;N饋8bー^ 8マHтルウ!гン#Nオ'サ -Y 惺5ェ8ョ)^ケ+ェ4ッAヘハHm=a!フRv貭ゥfゥィ$RqゥfゥモハHKヌツWW雨ゥ{NFj紵ゥ懇d、6梍腿 4-ョ/hFタツ-AFDヤ濠h攻゙タト」*�lエT8エ級芽y(.鑒ヲツ。頡ョ|(vサ杁クヒ;~ゥpシ^ァヲツ ヌトルg_収溥ス朏殳。ンヌラ=" -Oタ5ニE苡0Q$ッs"_―スf2カ<v゙ォ井fヨ斉PтYトpV`ユ8Nr&ラィ>ナ Rモラサqフカv1Cニ L~oeテチGモ L+G,ェ髢Tノ2国�カロエツyp.慧7嶽穢s逹、J。d7」¨/ャ ;斫2-ムE#KVロ.゚吊゙ハナ} -gリM^+シ*ヘ呀星モo.ェヌゥミ賁Jv届ニg。ネ.「脹N3e雷k dリ3裨ヤ!痘W.o]K0テno胥4ゥィv -ォチホ:ヘゥx;ンk賢S蚤逅a。治ハXユア幀}#B}ュトエWkzL/OKォoョBエマHコ#キN腕ヤウムヘニヒ+ G*I"Bnル,ヌム{レオbS{巻トサモナ士ケ源S セ%ヒ熟ス>ァ區ニ.ム巌鷯箘$w.&>DR8ヨEモ喀q}Bu゚xぉスpw代ン7テ捺wオヨT癖Rノ ェwソxッ把 weer萪。篤ァfモ=竍櫪ヌe0スpマネヲ飜・譱赭l:. ソ<信w^ウX譽リcl俄ルルthチサ3幟Bnハヲ纃Q|j6ラ9 ルt\ケt'#fモqY.{8寰ヒラNzH椈Mヌ・ワミ<スOハヲ飜・繹}0寰k3"、3ウ鵁秣椦Mヌオ~エ9Oハヲ綮?゙hィサウ鮑@]ッ)|k6擒nエlコ[1v_6ニ棡M�ニnネヲ羇ーリ9V夙モq%Z搜ォ泱Mヌユエl:ョモホイ鮑r8ャラウ鮑メヌ.k>>哺ヌ必ヌオソ<邦ヌ カol:ョ\:雌ウ鮑+ク虞(・pP @Kg?0サリルL゚xuッ5ニエ悌N、緘vN笙黜エ'ラォサヲ]案縄ラ掩ニ/l<]W,D賃LDスラヒAq鮗(]]ヲヤX石ムpPラ4�アxb3 #┤惆-Vdメv1ヲE?ー-"狼u-フ塢 ニイ+ケ ンン亠vY跟筐+*me% Y韶チゥルヤW2ケD%メ]精沍-sウ8ッコ{クフ拗鞘ce: _。;アケJシe雹ob縲スBYカラ燼{ョfz薈yヨ`ヘ)"UDRゥワ踉ゥiDミァ艘"戞。8ワf悦ヌョ瓱裨ャD, -ヨb2`ッd・eテo "オ琉?JセZa スe、"洽゚$サ。ホ{`z%゚ ッ$W4Tqエh(�點ムPナ癖h(降鍾ス~S譽昃{{2┐スカ"矇q0sル礪2+レアェ@ヲー以.LLーvVbュ踉<、Y}箝�リ」景ンU堕言w「r、エ魯ュ ンP"T醉凅∈セ[bィアェサPf -リ゙Lキkケo「ト枯3dF゙ソクフヌヌユ E(ェ8Oク%�チyャZ5ニ棯ンォ -」)p^梁'シ*縞 -薑-+ワ1シ -5dCVサヌ鷏強pwE>ァツ兀0痞「*袿抂トェ微8rVク耄Kr[;^ォp'VsTq。マユ,Zッkツj endstream endobj 70 0 obj <</Length 7105>>stream -D!Bム。サ5ア; 卸fゥ&ン~マ=WホM゙,;"徃舖Pニu[*… *エer羽cょト蟾sq4ト {サK6{タッナェホ{ア C 惰膕v14&ョ0f;uワ5テ�{ 暁平(7オ$&詳,サャd]Lm英SSpァュ耽8(絅)蓬ウe8+T/煬{ウチ朏0昶.nフqm-Hソ^(#l!l9ア9cKDZェィr書諱}ワrッモ[|**P)疵妾フxR+゚ SYマ9ョgラ踐測LSツエYッ・鍼0アッる{」*ヲュ[体ヒクゥケpウc侯.13ァヤ\p(マユa3疸2磋*fK゚uリヤyyチW謗ィ8G橡フ4シ.梭8 -<:dオユロcu -y櫚テ -%1;ァノ莪u齡揆'rロg゚;5M ホU -ム2Sモt゙e狛х$ 荏mィ。ンk 蠹Mq゙ND'Uヲ`/ -ン-L_ァ}。2wクユ)スロn?ヘネx;ナレ2Gスz。勗蔑ネ.ーェ5 h�U8ユョ sオCr袴RZc" 漆>8 ・澱\ヤ疑ヘェ e爵N(lイィ\チ^蹉,鰈(&Z[岬t=d?%)$&、チ?ィォQWコ蝉='エ -3シメ+"QG.b7-_e未JtレオD9ヘ肉g・驗$ケ楙;酩Zテ7ア!嶼dシニ/箋トEiID煢゚O|#ソナijワアア,qユメッルツ臘賺'ョZzトhム>リsn垢ニ泄砦2Hケヲvロ)Oホ嬋Y9戒-霓0?肯7゚qッuvマ2W(フ|ZムbWュ?JK剣5{yW\BlホU モ6y/蟷ムFN<|鶤5 w1s醺ロ.サJ^マvルID忝.Fノォキ.ミ、[fキケマI$C4ニV>P枕黼{rャn*恰ト嫡9セMェ6ホ+N鰰T@クノッ鉐起\゚[Vロ捉#ィコニUfn�vュ莞Evューサ#サ麺sテクzサ'bZ=撥06謨鯆L吹ア峙�ナjDュエ{ウ�ナ�JハHj}wfrャg 3Bヨ,@ア94ッYlQヌネヒウBwWヤ;c,@6>g歯,@Aロ瞬*zリタ マ螫)ハwsEカサ岐]f、2岐y杣念"Bh<^拍団ソワ「|ァ篤_jQ>/ワ搭]ォ飾悗|キヤッシソ(3/ 眼+aホトhョ、sU{ヨンPツUトgr=nィ]N洪ユホhロ脅~ト)ン^ラ純*iUケ蛙ラOリ+$t7ヤ-u+ン_v⊇。nェ'靆SCuB,マユンuDfr=ゥ wU?r]?皓q.ィヌ埠?^ФラOxBp{F]?゙eセユニコ~ツ+p4;^恪BO仄u7:ハJzエョ瓶ナ]ユィ8 崋( u「ヲ穐~Oゥヌxホサネコ~"=XラO'Xユ瞬Sンugケ3Roッヌォj「ェ~qwヨ絲「ェ晢!y KsャYノ霖コ~|4:跌ロブョ/2Rャ'\ユ淳?フヘy5ア]'ユチOィ'\ユヨz|ン穢Y擾眈eUソサイ9ニu8ホコアpエュコ~ツ<蜒}エョ YL允寵PラOX扁5 霸ラOシ+癌楴~\i暖&|ャ湍 梱スLェヌ伴~ツカエクロ..ナw)aィヌ浜q車g =Rラ就^UヘJサ珍ホRs/ワ縉ユxサ3 Wサゥ゚ンYクャz|wラc@ケ0ュャヌwc.ァエシャ@2<ャ'眩ワ慈'セェ~Wn9]ラOクェ{ショ殫ァO骼コ~シf;ェ'訖8Q9O6ョ-ナユサンョシァョ゚ dT{4z征'LdtヌテuCニ:ヤNeネラ絆語シォョ゚u鞘3ン「テワ_ラr%{x!`<ノョ'+"鬼T]?睿※)ゥミ%ト。ウ漑gu鶏チコW -'酊tセ ケvッ゙3モL9F琅テP,lUカS 1!露hhサfタ^ワ懴yAs゚R.ヲ<ニVル注z肛n邱DオNK)ヨNヲ Lサゥ0匡潰y璃.珀tオLヌ_キV<瘤Dァ督日ch}9gマスソ シvoト+^ッシ9疼ユzラs/シセヘネFpテ;E勲シ6ャmYコ壥ユレテヌnソQヲwGマ痾/ロF&ム嘖ノワホ鬥pィー|-「ー8ユ}ユク(ォソUホ捻ZlスWユGナ纈V3CΠ(ェ%゚リ。;%ェR縋ワ猯)?チ定0ヘ泥。(フe、sー==ソT3_コ1ンメVb楳$m囑ホ3xク水0&ャト?ラ\マ3ユy66 煢j#'e帚nj訓&)9エェ ィ・畔I孤?チ\vニ *cゥ梨ル'珀メツuキ贖3僵<H亳oョナ -コマY 靈マVヌ酣サ疣|觝%。ェ!Z芋j呑ウ孝Wモ+ u*ニ蟐晁i゙ウ][&ィLネ。ミ#シフ@櫓{{唏 kOゥN゚ヤDxソsRZ'リ光ァ檣5甍肓5.^oヲ$ -8楔5X゚F「セノ憲6u"nノテ!g5エン~ネ崚v℃ ァコホ1zク2Kmdヲ+佰A�7%レ゚フレィルK6NFエ}yヤO=Hム犠ーラヨAdiミン濂ル鯨Z5寢。3レタ゚zリD xcAe  pFaL<フA説5Vk塀WンjハWVvUァ ネ|2T:0ョpS+g8uApx3トL}湟3]ォj _ワI;甼曹9ル,ムB敗移ナrn0ニuT"シ興nホ-ェ4FAヤd\%キ+ゥニユXzD&ュY5ヘゥT-辣キh=Y|クr&}1j黨ミヒチM.ル`(メエ:ラ瀏ヘldュ央ケエ|{7ロキiミオワi XォA゚J}ル�エーc2I@レル4双/゙q鷦Lmg臧#+Aウョネ)ネケ,VRアF\V謡ワユL「3G「Yコd.囈ソュ]饕篌蓄ソオウリ $ツNB�iHH駘@X贖傴*sa゙貍ネィ$ル黙BB>Mロイ]褒・R鵆dゥ0}#}-箭Cサ3V肘Mv^トLeメツ=2*「t�キ挿ヤムワ;アォクト蝗シsケ1'7妃ウn"['懼テホリR所!ラU3エ奧ル シa�V蠣ヨq渇ユN1+Uラル鷁ッョヨw゙マユ嫂ョGコ aホメ8ィ圧テ冴0@弟坩柳Lコャ翆ホy6C}`g'ャコ」 籔`/,シ`リ-ケ ゥ楽カmオ! Nヒハヘヤ-Kl畦忍h,リ郎Vーェ痕ソ ヒ綿j'Hリセ-┐Pセユケ#゙2B%{*慳nゥ`4フj衰8oZフ|Dアセ{gツ)._} キF7s・ン#Mko芙ト)RG印馳ロP)R@ �a沙イKゥKp\チオzMGaホララ�jロ ハBW尺s8 -{レ瓩Q呰モp湎ャeッ キ&iー青-狠Y磯脩84エ#.タ$iセ:q{9◎ーォ樸H4S?モウ ゥzホqEEリMナ、UKンZ痿W奈3蓑忖ィリゥートメレA柳コ觸ルンdヌ」yXァJ=}H身∞6 鳧vリ R u謇pツ`ス_コ]HM7"ォI@Fキfカ - クR <]啻畠"sメwヨ燕マ(籤 yf<ー56チK}T僻n艫輪h6ソカ l、uW?鞜=リJ0W 3輝*!7セャ4筧`zw讓赧;t^C z"`Jhァホ<*H嫌 -リK}n設アW)!屡フ3メア」СS゙zゥョaz黝#>jトヨル+S6Eシ榻N黙[<玲[],6$,�4カLY+m倉ワ>KsアTo -2',SオA1頡aァ.弖ケ~mレXマヲノクメ#き ^トコェ クェtM -4-F*レキEg瀚bE覿ノEbレt0Xハ]=:+ホスッ帳Kワe ル\g怺I+ヌスロ6ニ{ンレチ}ヨアミニオ|ロニ\M|ロニxM|ユR#uZシ+jャケLト恙rヘ ェ舂lモレ趨黶hl-゚Eh/&-kヨ葷ニ「N/ォ虞%サH�;ュbクユケエ/トeY刹e嗣<ャユ#vs?/m<ウDYpンノネオY讃~3ョUす&ぞU~マ[Wロ裼Ppニ*稜ノ+,"ィeィフ6'#T゚Nd) -゙}*」s= ?エo_(゙Eb漕/$慾3)Lニ�舫(リFG|u h!:ェ0ウツス仰QユQ始>コ%透)、・d絵ツ0;タ賛コーEIb肭ンXU「bァ院┥・a ラUML撃Gミ飯TK丞ォG 8bヨ鐔 ぁ]ェ「市I譟リKVクHg1Abアモ!`Dュトセ}ゥ瀉x-イ[5NォリSL 38ーXユィチ^釖ルネシq貘UK+シ"筒リ ホ/UpRt犇Fナbァムァu・Iロイトッ^&テ_3區3ミ -エホy區で^*巨0チソ。リェ鼕昂ルテボCキu<<シ>゚p<]ーE:鬩l崑オ 嘸ャ9 停l女2?s=joンPH+*Hx亙・�ゥkヘ驃アJ~o、ィkUパナHqタュ酋ソカ],ハメィヲK=テn モ)ヒ」棯J_ナwxハ旁タ6シ]Nネ#リンa暦IO'iリチ3ケ6゙Ko?ヒ?セNァjナ吐モ %ヤ};マメ*mr寸エc゚ム;kRク~ゥ3ko -9l5,ワcノ�レEタgt褄ワ秘窟ヲA'メ4&Bィエ彫億陝%尅4|'=「bKnP訶D鋳JHYg&メ枝8@劍up!ヒカァJ賑`nイャミSホ@ー3モK3~ ヘ TャッニU[アト辛燃Aィリ3�3=暮ii;ュ芬*qa(瞿ラ=リγソ唐7Su$*燐キ鑞ワ{蟻aOPヒU戡aヤ^w5ノ 棣ンDL位甼カ\児ケモモノイ゙諠p┿=碗えLWシZqyミホRノYコrwx ~) ~錵ー/ャョ|メ8 ァu潅PXsf 旛Ll<#ラeヲミI6w\]ケウ ク.mヲ{儼ニス}・tリ8ホ5 -7Wie「ィQ8ンKツs コP -Lv|メゥ瘠(サ7ー~o容;S|a)揉ヤ#_鐫ハw -Rセネ。゙Oj%_翩ニOJャ -ワ@ウ�。ラK~9@ョワ�&Oョ ク*iIセノw《Yノl┘泅椁TVクー`SBゥウ$4ユ酢冢BH%2(ノ?MHb7セ&∈ !E希寇$ g(ノ?MHヘ1OIiB容%ァ Iョスp比&$q8コ逓ヤ、/リ,La!゚/5X =傷穃ヘ'6フoNdIt<コ坦ラ0ケ%驪/~/砿fク|F\:�,、. PV�コワ嘉@メeァーキ 1o a2-サキォヲ}MR-ウr PI$ェ<ラ&2 4榲碎ーヒ-埣弱モ纖レ Uk莠Vヌ址 フUB*b憂」<,y・、「3ム>Y7・テagi殖>2 Sd青ッX2ロ憲。67yロルiL黐ヒトィカ-モ。.f漓:x条ワ甦x旨ニ肢y1X剥メ盻Mq輊?rツア、』]ー、ム>f;キGヘ(�Tィキ0Z5{l驗ユR椏ユ< タミ墜ホエ;ュ>R槃!}{,19W.E。ホY3昇0ハhKP$サト伶泯セ\黠ト龍胤j皷(ムミQB妓サ -シ -pnシ淪スニ(ミオ P0]ロョネ"リKエJヨPチチ,}舒)ハタョTxw*mト・c?$pッi行"ミVhン<璋イPD"゙ャY96ゥルm#ヨ+F5。|猿柞甫$ク窺テ�:4#il]MーMV」ス -ミ゙P契ーヲィ 恭ヲ*Qdサ決Vア 9[珎H瑁,f>$vgケw砕ワテワカンルャ9ー剄U ルーヤニV撹・ユMmlw`3Sメ[[D%ヤ@x、^kY&オィクイH�カアuE+[7ラナリ艚ヨ}空ミォ@>エ6pi祇个9LlVユョV%饑V」)|ュmフ!ZA腔ミ6JゥK<健 -窘苒1足怦ヌウ>牾 -ル=ハ\ャネテ-7ェ<ーカ?寞ァm+イ薦<EdW復キ、'礒Dウ 廁メ<フ{ヒァT9ナ泱ホメ颱 TナDtN栽グ<ケT霎麿カ虚l(ギトマ、m煢VF『イp -スZーsSスe)O.>踉;xネF戒mエクルpワ背#Dァ「ーョiQ恪mヘ0ugjw#2?リ~ャ8cwユ3uw-zァセ沃 机-テlマケ43+ヨS/ナユ甃Oテ榱ー・0エニC*ヌーR飃{0SトFンホャ`Wnhル 6Nヌ歔C汝ノイ:リ庵.j5Q<iナDト(Yコ1タ8ッ#ゥ_f゙膺餮e狗カセハzソ& -kH\$OX"「r潦趾|サ[l6bステォ鴕sセム9Zケォ5ァュエMメカtキ4<クe.e9ニrKas-w7tォリ菊?6a|z詰(齧P -@=ワホ羨蔔゙瞠ー%Aツゥ}QCu8kモエ姪オ6tBuロ$_Lツ顧Hッ*mヌTハヌ%ワーユ幔昌ミカ餃トキリWゥ讀ル8~}G:・6O翻`69#坐、g@哂ヌア權\nル\(& -筒剛セ嬲1%県j4(oュ ~?h崑5h崑4M`P価ワ@S゙鍄椶~徨ユ扠pペ滄檢崩゚ン操DGナ獸葛H級喨R+州燹??"墜J_゚+」Ii<霍G Hェ抖ェ蝨=賞紲ト�ホ孵ツwHタ釣#Qノ op蟐p+5&"ノx<~~|陥1{u}X*篩オソp充キョ>碼ュ{ー叢励qヒ5D嶋7UMヨcコゥ"YG壑ト:25Hタ?ェェハ*R-|テCB5 Gハヘ kャシw媛wィ=ソpンナ"常Nッ+= Gr駑レ顳nk<#W(+ネ「z -IャンR%LアLタ9ヨcアユ W8X胞掘雑cQヘK3査{Pk *3,o|r^pメ_"Rナョゥxロ・ゥliQャB宰Q、鰾サLSヨ,ンタ下)&渇.QWe=ェB奬「4GbEオ「5モ7ム噴kosモクャ.煽I「 エ!"%鯛&r%.ミツシトユYィョeリ0.12qヒwK.顏ヘ1ヘミ<jミq最 ヒ$椣xオ9ユ「:6!KモネソQK・6g倅�gケリ豌俄頴充D}XQдミ�6ヘ8ノヌP!QM6アオ嬬翫シテ忽jノ1ЛクキaNエャノ -}ΘGeヒタテ&iナdテ2「゙孅CG1ワミyqネPeテk゙羲ヤc(櫃O!VラX%4p籀"8懴濤{ンQ岱キォ+カチ、=ア7齊'ゲW)vマ -ツxック endstream endobj 15 0 obj [/ICCBased 63 0 R] endobj 5 0 obj <</Intent 22 0 R/Name(00、00� �1)/Type/OCG/Usage 23 0 R>> endobj 32 0 obj <</Intent 41 0 R/Name(00、00� �1)/Type/OCG/Usage 42 0 R>> endobj 41 0 obj [/View/Design] endobj 42 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 16.0)/Subtype/Artwork>>>> endobj 22 0 obj [/View/Design] endobj 23 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 16.0)/Subtype/Artwork>>>> endobj 53 0 obj [52 0 R] endobj 71 0 obj <</CreationDate(D:20150415134556+09'00')/Creator(Adobe Illustrator CS6 \(Macintosh\))/ModDate(D:20150415135729+09'00')/Producer(Adobe PDF library 10.01)/Title(Print)>> endobj xref 0 72 0000000004 65535 f -0000000016 00000 n -0000000173 00000 n -0000037976 00000 n -0000000006 00000 f -0000253062 00000 n -0000000008 00000 f -0000038027 00000 n -0000000010 00000 f -0000038747 00000 n -0000000011 00000 f -0000000012 00000 f -0000000013 00000 f -0000000014 00000 f -0000000016 00000 f -0000253027 00000 n -0000000017 00000 f -0000000018 00000 f -0000000019 00000 f -0000000020 00000 f -0000000021 00000 f -0000000024 00000 f -0000253333 00000 n -0000253364 00000 n -0000000025 00000 f -0000000026 00000 f -0000000027 00000 f -0000000028 00000 f -0000000029 00000 f -0000000030 00000 f -0000000031 00000 f -0000000000 00000 f -0000253139 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000253217 00000 n -0000253248 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000039681 00000 n -0000253449 00000 n -0000038422 00000 n -0000042671 00000 n -0000039988 00000 n -0000039875 00000 n -0000038808 00000 n -0000039120 00000 n -0000039168 00000 n -0000039759 00000 n -0000039790 00000 n -0000040023 00000 n -0000042745 00000 n -0000042985 00000 n -0000044073 00000 n -0000049107 00000 n -0000114695 00000 n -0000180283 00000 n -0000245871 00000 n -0000253474 00000 n -trailer <</Size 72/Root 1 0 R/Info 71 0 R/ID[<4D5503399FCC4B1CB18AE82F78BC534D><AD2CFCAD0D354BF89BFC5387F57EAFEA>]>> startxref 253658 %%EOF \ No newline at end of file From 81346237ebbbcc3de8d11e4a8a019c75b37e09f4 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 17 Apr 2015 11:09:53 +0900 Subject: [PATCH 144/339] =?UTF-8?q?subject=E3=81=AE=E4=B8=80=E9=83=A8?= =?UTF-8?q?=E7=BA=8F=E3=82=81=E8=AA=AD=E3=81=BF=E3=82=923=E3=83=9A?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=81=AE=E6=99=82=E3=81=A8=E3=81=9D=E3=81=86?= =?UTF-8?q?=E3=81=A7=E7=84=A1=E3=81=84=E3=81=A8=E3=81=8D=E3=81=AE=E5=88=86?= =?UTF-8?q?=E5=B2=90=E3=82=92=E8=BF=BD=E5=8A=A0=20=E3=82=B9=E3=83=9E?= =?UTF-8?q?=E3=83=9B=E5=90=91=E3=81=91read=E3=81=A7Dropbox=E9=80=A3?= =?UTF-8?q?=E6=90=BA=E3=82=92=E4=BD=BF=E7=94=A8=E3=81=99=E3=82=8B=E3=81=A8?= =?UTF-8?q?jQuery=E3=81=8C=E5=A4=9A=E9=87=8D=E8=AA=AD=E8=BE=BC=E3=81=BF?= =?UTF-8?q?=E3=81=AB=E3=81=AA=E3=81=A3=E3=81=A6=E4=B8=8D=E5=85=B7=E5=90=88?= =?UTF-8?q?=E3=81=8C=E8=B5=B7=E3=81=93=E3=82=8B=E5=8F=AF=E8=83=BD=E6=80=A7?= =?UTF-8?q?=E3=81=8C=E3=81=82=E3=82=8B=E4=BB=B6=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- lib/post_form_options.inc.php | 1 - lib/read_header_i.inc.php | 4 ++-- lib/sb_toolbar.inc.php | 2 +- rep2/js/subject.js | 15 +++++++++++++++ rep2/post_form.php | 1 + 6 files changed, 20 insertions(+), 5 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 6171b6acb..16364152c 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -77,7 +77,7 @@ function p2_init() $_conf['favrank_url'] = 'http://akid.s17.xrea.com/favrank/favrank.php'; $_conf['expack.web_url'] = 'http://2ch774.github.io/p2-php/'; $_conf['expack.download_url'] = 'https://github.com/2ch774/p2-php/releases'; - $_conf['expack.history_url'] = 'https://github.com/2ch774/p2-php/blob/master/doc/ChangeLog.txt'; + $_conf['expack.history_url'] = 'https://github.com/2ch774/p2-php/blob/master/doc/README-774.txt'; $_conf['expack.tgrep_url'] = 'http://page2.xrea.jp/tgrep/search'; $_conf['test.dig2ch_url'] = 'http://dig.2ch.net/'; $_conf['expack.gate_php'] = 'http://2ch774.github.io/p2-php/gate.html'; diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index 8741a329f..ac30333db 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -362,7 +362,6 @@ function setHiddenValue(button) { $_SESSION['upload_token'] = $upload_token; $upload_form = <<<EOP <input id="fileupload" type="file" name="{$upload_name}" data-url="upload.php?mode={$upload_mode}&token={$upload_token}" {$upload_multiple}> -<script type="text/javascript" src="js/jquery-{$_conf['jquery_version']}.min.js"></script> <script src="js/jquery.ui.widget.js"></script> <script src="js/jquery.iframe-transport.js"></script> <script src="js/jquery.fileupload.js"></script> diff --git a/lib/read_header_i.inc.php b/lib/read_header_i.inc.php index 41175a0ea..212fa0ad2 100644 --- a/lib/read_header_i.inc.php +++ b/lib/read_header_i.inc.php @@ -106,9 +106,9 @@ </script> EOS; } - +// 書き込み欄 if ($_conf['bottom_res_form']) { - $_conf['extra_headers_ht'] .= "\t<script type=\"text/javascript\" src=\"js/post_form.js?{$_conf['p2_version_id']}\"></script>\n"; + $_conf['extra_headers_ht'] .= "<script type=\"text/javascript\" src=\"js/post_form.js?{$_conf['p2_version_id']}\"></script>\n"; if ($_conf['expack.editor.savedraft'] != '0') { $_conf['extra_headers_ht'] .= <<<EOP <script type="text/javascript" src="js/post_draft.js?{$_conf['p2_version_id']}"></script> diff --git a/lib/sb_toolbar.inc.php b/lib/sb_toolbar.inc.php index 1ad1ffa59..467b959d3 100644 --- a/lib/sb_toolbar.inc.php +++ b/lib/sb_toolbar.inc.php @@ -27,7 +27,7 @@ $shinchaku_matome_url = "{$_conf['read_new_php']}?host={$aThreadList->host}&bbs={$aThreadList->bbs}&spmode={$aThreadList->spmode}{$norefresh_q}&nt={$newtime}"; $shinchaku_matome_ht =<<<EOP <a id="smy{$new_matome_i}" class="matome" href="{$shinchaku_matome_url}" onclick="rep2.subject.changeNewAllColor();">新着まとめ読み{$shinchaku_num_ht} [全件]</a> -<a class="matome" href="javascript:var unum_limit = window.prompt('新着が指定した件数以下のスレだけまとめ読みします。','100');if(unum_limit){window.location = '{$shinchaku_matome_url}&unum_limit='+unum_limit;}">[一部]</a> +<a class="matome" target="_self" href="javascript:rep2.subject.jumpMatomeLimit('{$shinchaku_matome_url}');">[一部]</a> EOP; } else { $shinchaku_matome_ht = ''; diff --git a/rep2/js/subject.js b/rep2/js/subject.js index 0c9215e40..2c9f58328 100644 --- a/rep2/js/subject.js +++ b/rep2/js/subject.js @@ -21,6 +21,21 @@ rep2.subject.changeNewAllColor = function () { $('#smynum1, #smynum2, a.un_a').css('color', rep2.subject.properties.ttcolor); }; +// }}} +// {{{ rep2.subject.jumpMatomeLimit() + +rep2.subject.jumpMatomeLimit = function (matome_url) { + var unum_limit = window.prompt('新着が指定した件数以下のスレだけまとめ読みします。','100'); + if (unum_limit) { + matome_url +='&unum_limit='+unum_limit; + if (top == self) { + window.location = matome_url; + } else { + parent.read.location.href = matome_url; + } + } +}; + // }}} // {{{ rep2.subject.changeUnReadColor() diff --git a/rep2/post_form.php b/rep2/post_form.php index f3230d454..af92727e7 100644 --- a/rep2/post_form.php +++ b/rep2/post_form.php @@ -114,6 +114,7 @@ if (!$_conf['ktai'] || $_conf['iphone']) { echo <<<EOP <link rel="shortcut icon" type="image/x-icon" href="favicon.ico"> + <script type="text/javascript" src="js/jquery-{$_conf['jquery_version']}.min.js"></script> <script type="text/javascript" src="js/basic.js?{$_conf['p2_version_id']}"></script> <script type="text/javascript" src="js/post_form.js?{$_conf['p2_version_id']}"></script>\n EOP; From d75c5ed527e93d2a6cef26e510cd00442b1c3103 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 17 Apr 2015 15:28:51 +0900 Subject: [PATCH 145/339] =?UTF-8?q?0=E3=81=A1=E3=82=83=E3=82=93=E3=81=AD?= =?UTF-8?q?=E3=82=8B=E3=82=B9=E3=82=AF=E3=83=AA=E3=83=97=E3=83=88=E3=82=92?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E3=81=97=E3=81=9F=E5=A4=96=E9=83=A8=E6=9D=BF?= =?UTF-8?q?=E3=81=AE=E9=81=8E=E5=8E=BB=E3=83=AD=E3=82=B0DAT=E3=82=92?= =?UTF-8?q?=E5=8F=96=E3=82=8A=E8=BE=BC=E3=81=BF=E5=8F=AF=E8=83=BD=E3=81=AB?= =?UTF-8?q?=E3=81=97=E3=81=9F=20fix=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 609a1df6d..a6d690224 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -478,9 +478,7 @@ protected function _downloadDat2ch($from_bytes) { */ protected function _downloadDat2chNotFound($code = null) { // 2ch, bbspink ならread.cgiで確認 - if (P2Util::isHost2chs ($this->host) || P2Util::isHostVip2ch ($this->host)) { - $this->getdat_error_msg_ht .= $this->get2chDatError ($code); - } + $this->getdat_error_msg_ht .= $this->get2chDatError ($code); $this->diedat = true; return false; } @@ -679,15 +677,17 @@ public function get2chDatError($code = null) { } $reason = null; - if ($code == '302') { - $body203 = $this->_get2ch203Body (); - if ($body203 !== false && preg_match ('/過去ログ ★/', $body203)) { - $this->getdat_error_body = $body203; - if (preg_match ('/このスレッドは過去ログ倉庫に格.{1,2}されています/', $body203)) { - $reason = 'datochi'; - $this->setDatochiResiduums (); - } elseif (preg_match ('{http://[^/]+/[^/]+/kako/\\d+(/\\d+)?/(\\d+)\\.html}', $body203, $matches)) { - $reason = 'kakohtml'; + if (P2Util::isHost2chs ($this->host) || P2Util::isHostVip2ch ($this->host)) { + if ($code == '302') { + $body203 = $this->_get2ch203Body(); + if ($body203 !== false && preg_match('/過去ログ ★/', $body203)) { + $this->getdat_error_body = $body203; + if (preg_match('/このスレッドは過去ログ倉庫に格.{1,2}されています/', $body203)) { + $reason = 'datochi'; + $this->setDatochiResiduums(); + } elseif (preg_match('{http://[^/]+/[^/]+/kako/\\d+(/\\d+)?/(\\d+)\\.html}', $body203, $matches)) { + $reason = 'kakohtml'; + } } } } @@ -699,7 +699,7 @@ public function get2chDatError($code = null) { $read_response_html = ''; if (! $reason) { try { - $req = P2Util::getHTTPRequest2 ($read_url + '1/', HTTP_Request2::METHOD_GET); + $req = P2Util::getHTTPRequest2 ($read_url.'1', HTTP_Request2::METHOD_GET); // ヘッダ $req->setHeader ('User-Agent', P2Util::getP2UA(false,P2Util::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG @@ -738,6 +738,10 @@ public function get2chDatError($code = null) { $kakosoko_match2 = "/http:\/\/turing1000\.nttec\.com\/?(403|404|500)\.dat/"; $naidesu_match = "/<title>そんな板orスレッドないです。<\/title>/"; + + // 0ちゃんねるスクリプトに反応するように + $soukoni_match = "/<title>隊長!過去ログ倉庫に<\/title>/"; + $error3939_match = "{<title>2ちゃんねる error 3939}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) // @@ -756,7 +760,11 @@ public function get2chDatError($code = null) { $dat_response_msg = "

    2ch info - このスレッドは過去ログ倉庫に格納されています。{$marutori_ht}{$moritori_ht}{$plugin_ht}

    "; // がそんな板orスレッドないです。or error 3939 - } elseif ($reason === 'kakohtml' or preg_match ($naidesu_match, $read_response_html, $matches) || preg_match ($error3939_match, $read_response_html, $matches) || preg_match ($vip2ch_kakosoko_match, $read_response_html, $matches)) { + } elseif ($reason === 'kakohtml' or + preg_match ($naidesu_match, $read_response_html, $matches) || + preg_match ($error3939_match, $read_response_html, $matches) || + preg_match ($vip2ch_kakosoko_match, $read_response_html, $matches) || + preg_match ($soukoni_match, $read_response_html, $matches)) { if ($reason === 'kakohtml' or preg_match ($kakohtml_match, $read_response_html, $matches)) { if ($reason === 'kakohtml') { From f6804e171013f68ea4682f76538a83c99abfac2e Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Sat, 18 Apr 2015 03:57:48 +0900 Subject: [PATCH 146/339] =?UTF-8?q?=E3=82=B5=E3=83=A0=E3=83=8D=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E8=A1=A8=E7=A4=BA=E3=81=AB=E3=81=A6=20URL=20=E3=81=A7?= =?UTF-8?q?=E5=8F=82=E7=85=A7=E3=81=97=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE?= =?UTF-8?q?=E3=81=A7=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=83=91=E3=82=B9?= =?UTF-8?q?=E3=81=A7=E5=8F=82=E7=85=A7=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThreadI.php | 14 ++++++-------- lib/ShowThreadK.php | 15 +++++++-------- lib/ShowThreadPc.php | 10 ++++------ 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/lib/ShowThreadI.php b/lib/ShowThreadI.php index 50ec003e2..c1f61dde2 100644 --- a/lib/ShowThreadI.php +++ b/lib/ShowThreadI.php @@ -1005,11 +1005,10 @@ public function plugin_imageCache2($url, $purl, $str) } // オリジナルの有無を確認 - $_src_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); - if (file_exists($_src_url)) { + if (file_exists($this->thumbnailer->srcPath($icdb->size, $icdb->md5, $icdb->mime))) { $src_exists = true; $img_url = $img_url2 . $icdb->id; - $src_url = $_src_url; + $src_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); } else { $img_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); $src_url = $src_url2 . $icdb->id; @@ -1027,7 +1026,7 @@ public function plugin_imageCache2($url, $purl, $str) // サムネイル表示制限数以内のとき if ($inline_preview_flag) { // プレビュー画像が作られているかどうかでimg要素の属性を決定 - if (file_exists($prv_url)) { + if (file_exists($this->inline_prvw->thumbPath($icdb->size, $icdb->md5, $icdb->mime))) { $prv_size = explode('x', $this->inline_prvw->calc($icdb->width, $icdb->height)); $img_str = "<img src=\"{$prv_url}\" width=\"{$prv_size[0]}\" height=\"{$prv_size[1]}\">"; } else { @@ -1196,11 +1195,10 @@ public function plugin_replaceImageUrl($url, $purl, $str) } // オリジナルの有無を確認 - $_src_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); - if (file_exists($_src_url)) { + if (file_exists($this->thumbnailer->srcPath($icdb->size, $icdb->md5, $icdb->mime))) { $src_exists = true; $img_url = $img_url2 . $icdb->id; - $src_url = $_src_url; + $src_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); } else { $img_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); $src_url = $src_url2 . $icdb->id; @@ -1218,7 +1216,7 @@ public function plugin_replaceImageUrl($url, $purl, $str) // サムネイル表示制限数以内のとき if ($inline_preview_flag) { // プレビュー画像が作られているかどうかでimg要素の属性を決定 - if (file_exists($prv_url)) { + if (file_exists($this->inline_prvw->thumbPath($icdb->size, $icdb->md5, $icdb->mime))) { $prvw_size = explode('x', $this->inline_prvw->calc($icdb->width, $icdb->height)); $img_str = "<img src=\"{$prv_url}\" width=\"{$prvw_size[0]}\" height=\"{$prvw_size[1]}\">"; } else { diff --git a/lib/ShowThreadK.php b/lib/ShowThreadK.php index dfda8ead8..6684d8e89 100644 --- a/lib/ShowThreadK.php +++ b/lib/ShowThreadK.php @@ -917,11 +917,10 @@ public function plugin_imageCache2($url, $purl, $str) } // オリジナルの有無を確認 - $_src_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); - if (file_exists($_src_url)) { + if (file_exists($this->thumbnailer->srcPath($icdb->size, $icdb->md5, $icdb->mime))) { $src_exists = true; $img_url = $img_url2 . $icdb->id; - $src_url = $_src_url; + $src_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); } else { $img_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); $src_url = $src_url2 . $icdb->id; @@ -939,7 +938,7 @@ public function plugin_imageCache2($url, $purl, $str) // サムネイル表示制限数以内のとき if ($inline_preview_flag) { // プレビュー画像が作られているかどうかでimg要素の属性を決定 - if (file_exists($prv_url)) { + if (file_exists($this->inline_prvw->thumbPath($icdb->size, $icdb->md5, $icdb->mime))) { $prv_size = explode('x', $this->inline_prvw->calc($icdb->width, $icdb->height)); $img_str = "<img src=\"{$prv_url}\" width=\"{$prv_size[0]}\" height=\"{$prv_size[1]}\">"; } else { @@ -1102,11 +1101,11 @@ public function plugin_replaceImageUrl($url, $purl, $str) } // オリジナルの有無を確認 - $_src_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); - if (file_exists($_src_url)) { + $_src_url = ; + if (file_exists($this->thumbnailer->srcPath($icdb->size, $icdb->md5, $icdb->mime))) { $src_exists = true; $img_url = $img_url2 . $icdb->id; - $src_url = $_src_url; + $src_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); } else { $img_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); $src_url = $src_url2 . $icdb->id; @@ -1124,7 +1123,7 @@ public function plugin_replaceImageUrl($url, $purl, $str) // サムネイル表示制限数以内のとき if ($inline_preview_flag) { // プレビュー画像が作られているかどうかでimg要素の属性を決定 - if (file_exists($prv_url)) { + if (file_exists($this->inline_prvw->thumbPath($icdb->size, $icdb->md5, $icdb->mime))) { $prvw_size = explode('x', $this->inline_prvw->calc($icdb->width, $icdb->height)); $img_str = "<img src=\"{$prv_url}\" width=\"{$prvw_size[0]}\" height=\"{$prvw_size[1]}\">"; } else { diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index 188602a8b..c912290d8 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -1718,18 +1718,16 @@ public function plugin_replaceImageUrl($url, $purl, $str) } // オリジナルがキャッシュされているときは画像を直接読み込む - $_img_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); - if (file_exists($_img_url)) { - $img_url = $_img_url; + if (file_exists($this->thumbnailer->srcPath($icdb->size, $icdb->md5, $icdb->mime))) { + $img_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); $cached = true; } else { $cached = false; } // サムネイルが作成されていているときは画像を直接読み込む - $_thumb_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); - if (file_exists($_thumb_url)) { - $thumb_url = $_thumb_url; + if (file_exists($this->thumbnailer->thumbPath($icdb->size, $icdb->md5, $icdb->mime))) { + $thumb_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false){ $update = new ImageCache2_DataObject_Images(); From b36f011203aab8ff18a2a9e3419fd4cafa0f6b83 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Sat, 18 Apr 2015 03:58:26 +0900 Subject: [PATCH 147/339] =?UTF-8?q?board=20=E3=83=87=E3=82=A3=E3=83=AC?= =?UTF-8?q?=E3=82=AF=E3=83=88=E3=83=AA=E3=81=8C=E3=81=AA=E3=81=84=E5=A0=B4?= =?UTF-8?q?=E5=90=88=E3=81=AF=E8=87=AA=E5=8B=95=E7=94=9F=E6=88=90=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/BrdCtl.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/BrdCtl.php b/lib/BrdCtl.php index 51f8a1288..75cb87a1c 100644 --- a/lib/BrdCtl.php +++ b/lib/BrdCtl.php @@ -34,6 +34,16 @@ static public function read_brd_dir() $brd_menus = array(); $brd_dir = $_conf['data_dir'] . '/board'; + // ディレクトリがない場合は新規で作成 + if (!file_exists($brd_dir)) { + FileCtl::mkdirRecursive($brd_dir); + if(!is_writable($brd_dir)){ + // 書き込み権限を得られなかった場合はパーミッションの注意喚起をする + p2die("親ディレクトリのパーミッションを見直して下さい。"); + } + return $brd_menus; + } + if ($cdir = @dir($brd_dir)) { // ディレクトリ走査 while ($entry = $cdir->read()) { From 1706922203e6908c8fd40a348aa6f6ddf958d59a Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Sat, 18 Apr 2015 03:59:34 +0900 Subject: [PATCH 148/339] =?UTF-8?q?=E3=83=87=E3=82=A3=E3=83=AC=E3=82=AF?= =?UTF-8?q?=E3=83=88=E3=83=AA=E7=94=9F=E6=88=90=E3=82=92=20FileCtl::mkdirR?= =?UTF-8?q?ecursive=20=E3=81=A7=E8=A1=8C=E3=81=86=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 2 +- lib/expack/ImageCache2/Thumbnailer.php | 4 ++-- rep2/ic2.php | 2 +- rep2/ic2_setter.php | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index cac9eff38..7db67940d 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -320,7 +320,7 @@ static public function checkDirWritable($aDir) */ if (is_dir(dirname(realpath($aDir))) && is_writable(dirname(realpath($aDir)))) { //$info_msg_ht .= "ディレクトリの自動作成を試みます...<br>"; - if (mkdir($aDir)) { + if (FileCtl::mkdirRecursive($aDir)) { //$info_msg_ht .= "ディレクトリの自動作成が成功しました。"; } else { //$info_msg_ht .= "ディレクトリを自動作成できませんでした。<br>手動でディレクトリを作成し、パーミッションを設定して下さい。"; diff --git a/lib/expack/ImageCache2/Thumbnailer.php b/lib/expack/ImageCache2/Thumbnailer.php index 7d401482c..2e3ca186c 100644 --- a/lib/expack/ImageCache2/Thumbnailer.php +++ b/lib/expack/ImageCache2/Thumbnailer.php @@ -275,7 +275,7 @@ public function convert($size, $md5, $mime, $width, $height, return $thumbUrl; } $thumbDir = dirname($thumbPath); - if (!is_dir($thumbDir) && !mkdir($thumbDir)) { + if (!is_dir($thumbDir) && !FileCtl::mkdirRecursive($thumbDir)) { $error = PEAR::raiseError("ディレクトリを作成できませんでした。({$thumbDir})"); return $error; } @@ -563,7 +563,7 @@ public function getSubDir($basedir, $size, $md5, $mime, $fullPath = false) $dirID = $this->dirID($size, $md5, $mime); if ($fullPath) { if (!is_dir($basedir)) { - if (!mkdir($basedir)) { + if (!FileCtl::mkdirRecursive($basedir)) { return false; } } diff --git a/rep2/ic2.php b/rep2/ic2.php index 0f0271c54..6335a1161 100644 --- a/rep2/ic2.php +++ b/rep2/ic2.php @@ -475,7 +475,7 @@ public function __destruct() $newfile = $thumbnailer->srcPath($size, $md5, $mime); $newurl = $thumbnailer->srcUrl($size, $md5, $mime); $newdir = dirname($newfile); -if (!is_dir($newdir) && !@mkdir($newdir)) { +if (!is_dir($newdir) && !FileCtl::mkdirRecursive($newdir)) { ic2_error('x02', "ディレクトリを作成できませんでした。({$newdir})"); } if (($force || !file_exists($newfile)) && !@rename($tmpfile, $newfile)) { diff --git a/rep2/ic2_setter.php b/rep2/ic2_setter.php index 83f48a86f..e07d3baa8 100644 --- a/rep2/ic2_setter.php +++ b/rep2/ic2_setter.php @@ -353,7 +353,7 @@ function ic2_register_uploaded_file($file) // 未登録の画像だったとき } else { $newdir = dirname($file['img_src']); - if (!is_dir($newdir) && !@mkdir($newdir)) { + if (!is_dir($newdir) && !FileCtl::mkdirRecursive($newdir)) { return sprintf($err_fmt['dir'], $file['path'], $newdir); } if (!@move_uploaded_file($file['tmp_name'], $file['img_src'])) { From 40b066cf13ba76e599c9c642fe82ea803c1b5528 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sat, 18 Apr 2015 11:42:09 +0900 Subject: [PATCH 149/339] v150418.1111 --- conf/conf.inc.php | 2 +- doc/README-774.txt | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 16364152c..a031aa320 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150414.2333', // rep2のバージョン + 'p2version' => '150418.1111', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index dd84329c7..78fcaeae8 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -10,15 +10,33 @@ rep2-expack test https://github.com/orzisun/p2-php ●主な機能 +### 設定の追加 * 「ユーザー設定編集」から+liveリンクの表示設定を変更可能 * 実況板のスレ一覧からスレを開いたときに自動的に実況モードでスレを開く設定を追加 * 3ペイン表示の配置を変更できる設定を追加 * スレッドタイトルから著作権表記を削除する設定を追加 -* ローカル板一覧用.brdファイルの置き場所をrep2/boardから$_conf['data_dir']/brardに変更 + +### 新機能 * cronとかで最近読んだスレなどのdatをDL出来るスクリプト追加 -* 本家からbeのログイン部分を移植してBE2.0に対応 + - scripts/fetch-dat.php --mode モードを一つ指定(fav recent res_hist) * 名無しが節穴になる板に名無しで書き込むときに警告を出す機能を追加 * NGあぼーんの対象になったレスのIDを自動的にNGあぼーんする機能を追加 + - NGあぼーんの条件を削除した場合は自動NGあぼーんのデータ消去しないと反映されません + - 自動NGあぼーんのデータは手動NGあぼーんと独立しており、自動NGあぼーんがONの時だけ読み込まれます。 +* 「設定管理」からキャッシュ・履歴の消去できる機能を追加 +* 本家からbeのログイン部分を移植してBE2.0に対応 +* rep2に登録された外部板へリンクする機能を追加 +* 0ちゃんねるスクリプトを使用した外部板の過去ログDATを取り込み対応 + +### 仕様変更 +* ローカル板一覧用.brdファイルの置き場所をrep2/boardから$_conf['data_dir']/brardに変更 + - openJaneと同じ形式です。 +* スマホ用画面のツールバーアイコンを高解像度画面に対応(thx https://github.com/dgg712/p2-php) +* スマホ用レスポップアップ、SPM、IC2の外側をタップすると閉じるように変更 + - レスポップアップから開いたレスポップアップをタップした際に元のレスポップアップが消えるのは仕様とさせていただきます。 + - スクロールは指の終着点がポップアップ内になるようにすれば消えません。 +* headline.2ch.netを最近読んだスレに追記しないように変更 + * その他今時のアレに合わせた修正等gitのコミットログも確認してください。 ●免責 @@ -38,6 +56,17 @@ rep2-expack test https://github.com/orzisun/p2-php 本家p2と同じく、X11ライセンスです。 ●ChangeLog +150418.1111 +* スマホ用画面のツールバーアイコンを高解像度画面に対応(thx https://github.com/dgg712/p2-php) +* rep2に登録された外部板へリンクする機能を追加 +* 0ちゃんねるスクリプトを使用した外部板の過去ログDATを取り込み対応 +* headline.2ch.netを最近読んだスレに追記しないように変更 +* Firefoxでスマホ用表示が崩れる不具合を修正 +* スマホ用IC2のポップアップで既に設定済みの星をタップした際にエラーを出さないように変更 +* スマホ用IC2のポップアップに表示されるURLをリンクに変更(thx http://anago.2ch.net/test/read.cgi/software/1426940268/711) +* スマホ用IC2で画像表示をダブルタップすると閉じるように変更(txh http://anago.2ch.net/test/read.cgi/software/1426940268/711) +* スマホ用レスポップアップ、SPM、IC2の外側をタップすると閉じるように変更 + 150414.2333 * スマホ用readに書き込みフォームを追加 * スマホ用画面のデザインを変更 From 8e278fde5652e274a23f90650d906f1152042c8f Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sat, 18 Apr 2015 23:11:21 +0900 Subject: [PATCH 150/339] =?UTF-8?q?=E5=B7=A6=E4=B8=8A=E6=88=BB=E3=82=8B?= =?UTF-8?q?=E3=83=9C=E3=82=BF=E3=83=B3=E3=82=92=E9=AB=98=E8=A7=A3=E5=83=8F?= =?UTF-8?q?=E5=BA=A6=E5=AF=BE=E5=BF=9C=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/css/iphone.css | 3 +++ rep2/iui/backButton.png | Bin 472 -> 289 bytes rep2/iui/backButton@2x.png | Bin 0 -> 434 bytes rep2/iui/backButton@3x.png | Bin 0 -> 553 bytes rep2/iui/iui.css | 3 +++ 5 files changed, 6 insertions(+) create mode 100644 rep2/iui/backButton@2x.png create mode 100644 rep2/iui/backButton@3x.png diff --git a/rep2/css/iphone.css b/rep2/css/iphone.css index 67980ddc1..9eb858acc 100644 --- a/rep2/css/iphone.css +++ b/rep2/css/iphone.css @@ -63,6 +63,9 @@ a#backButton { /* background: #333; border-radius: 5px; min-width:46px; text-align:center */ background: none; -webkit-border-image: url(../iui/backButton.png?14011419) 0 8 0 14; + border-image: url(../iui/backButton.png?14011419) 0 8 0 14 fill; + -webkit-border-image: -webkit-image-set(url(../iui/backButton.png?14011419) 1x,url(../iui/backButton@2x.png?14011419) 2x,url(../iui/backButton@3x.png?14011419) 3x) 0 8 0 14; + border-image: image-set(url(../iui/backButton.png?14011419) 1x,url(../iui/backButton@2x.png?14011419) 2x,url(../iui/backButton@3x.png?14011419) 3x) 0 8 0 14; } div#toolbar_header { diff --git a/rep2/iui/backButton.png b/rep2/iui/backButton.png index 224da72080a65b64b9ba9c42d3175005e9d17141..2a3ec6d8a6d1bc842847b2c3349c0b5135321394 100644 GIT binary patch delta 273 zcmcb?ypU;vWIZzj14EOE_!}T4S>hT|5}cn_Ql40p%HWuipOmWLnVXoN8kCxtQdxL1 z)dr|YJ-{c#_1(L7-@bkO^5x6VpFcl-{P_3p-wz)?{QLLs*RNmi-@pI;`}f<oZ~y=Q z|MN{|8c+*wNswPKkP8P4wl9?0fD+}NF7=Kf6}Prbv1Dpc;9;@cGyVVmaMq)fZXOB| z3HCXmw(tYjePgX4GjHpZ=L)$KVoicx<V;e#aa&b7>=@I{b4)j<t8U`&PLVzhLfYJ^ z`QI8g>Akjy*c(~@?98EA8>h-@PxiaER(92?l@iwT>vyPL>y^5$d4OTb1S`Rwjzz~9 R7`PZ1JYD@<);T3K0RVTlhuZ)E delta 457 zcmV;)0XF`j0@wqP8Gi-<006b>=iUGS010qNS#tmY3labT3lag+-G2N400D|gL_t(o zh1HnBQNlnJhCgTkI?xWV1L=TtV4UF&-rf;z@1|5>>>zX?9cTyIfp*}*9|%L(#6z;{ zciKOb!#A1t-fng<pU?R(4FB@7yBF@BcjVGYYgtL&0jsWLntx~|>+Uzev*K5GI$;`R z-F*y{ir+xisZoG7U$z9Uw9d`!qdT22L0NZy0&W#IW>$vY@0yFU?w$b)#hsZg`%$_~ zt*jcVP>foqRnBD9Pz5m3qs+{rO@JzOU$y`yTCdIQwKtmvPGsGE3Ct9?X140xD8ND1 z-KW5#;wO+t@P7$11aS9jj)NZ(s?#d_FI#eKs0TB9i{uleuEC~#OSEM#oAEnO0cP3| zl4A&<{k|$#sE(83PzIW(YsC?#4VMHbHLJP0Rh;M`lMHnYmILovFEoFX;7nHYHRsrH zWh(Vsd+O4h-5&{)so#s|Su-nujbak@8~jtyfqSR8h(bMo+x&x7H;kzBw^3FNH&u*U zzpd^K)NuET<L-3Aw7!v1!@UskMrQDzF6Mp!O0jRlU5e=@00000NkvXXu0mjf<TcsW diff --git a/rep2/iui/backButton@2x.png b/rep2/iui/backButton@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..80b0711f4dc5d469fe3759f1fd57447687cb6e5a GIT binary patch literal 434 zcmeAS@N?(olHy`uVBq!ia0vp^VL)ud!3-o%Ki~TkNJ*BsMwA5Sr<If^7Ns&crsOB3 zDtP85rl$s_CZ<#to=mj?Dl!Q0332`R@88FdAK$%u_x=0#_wV2T{{8#cuV3H3ef#w3 z)6btjzkK=f_wU~yKYo1p@Zs&-xBvhD54hj`2dGz|B*-rq$VCPW50qmifpUL5T^vIy zZe6+IDRf9d#5K@Eq(|xI|2$I@ui$g<yr=3s;OpbCpAoz1%*>l-ZyiXFtyw?y+^nZ3 zqO7v}vv>-wEq}$k&3D7cq#HSHz2OzjsW(LLZD)Bi$2DQO4zqQt<PF2>^n~^|YzM#H zWM{pdK3^nf`qPBlIvlrCJa4FZAFA7|@kaghp=&xk(VGo&PF~tz*?oAK4*%>;a_ymM zt{jWz`)oZJQqTTQPQFh{-7;%~WTw@zwNE6LSMu6k=@s8KJ?4eZdO@Fshclk5ES5c4 zeeA{>sZXx+Ri<9Qbo0>bmpKnhzr1#T7W=?Iv+etL<D>g+R;Ao)NO$EA`!cg(?Q{la ZhNGP7iz25^oeK;H22WQ%mvv4FO#qn2+rj_< literal 0 HcmV?d00001 diff --git a/rep2/iui/backButton@3x.png b/rep2/iui/backButton@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ecf6af7706bcabb8ddb666cb48110eeab6ef19ae GIT binary patch literal 553 zcmV+^0@nSBP)<h;3K|Lk000e1NJLTq004mi003GD0{{R3sE5Ul0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUyEl^BUMgIQ&?(XjP_V)Yx`|<Jd`1ttn z@bLQj`t$Si_xJbx{r&Rt^6&5O?d|RV|Nj-2tDFD;01tFhPE-H?|NsC0|NsC0|NsC0 z0My)=p#T5@cS%G+RCwC#+S`tTFc?MQ3e2HudH=`N$f1C3#~b(B$>_B)U&0c~--eO? zgpc5F!8vx_nH2P=bpL#Dg75&O)MJ8S0;G--bTi<cm!T>6SpeTq2TKI$)I)+na1EM* zHG*I0j+7$^j6f4XOQ4CMArM7S7pNkr3S<#f1+oZg0$l_ZfiQxyKp8<<pp2j>kVa4v zXd@^H#1Rw(;s~Av>Ij|$@(7LseFR5=K7xY)h+r=uBG?I#2zCM_f~|mwU?YGc$O0;Y zETAG-1y}@&fQw)jfDz0BFoH=C!3ZY707l><;I9H-qQSqBzatskl?|Ru22W>xg<`Nu zGgzq_tk(HA7K67ogEv=$w|9PmVKBupm}D7D^Z1FT!Bp2^vTZQk=XW>^c6khTx(s&v z_#Mwp3KvR{Q;3vcO(9Xc|2c&#bOJ(_!b>M%A|=qI@Y;!}cc#$(=}4an8^;TMGHwi4 r`g9<FLh}9v`jjZOKKNgPn*aj<C<AX&)3u4P00000NkvXXu0mjf4jlcL literal 0 HcmV?d00001 diff --git a/rep2/iui/iui.css b/rep2/iui/iui.css index aab8d84f1..b5fd14da1 100644 --- a/rep2/iui/iui.css +++ b/rep2/iui/iui.css @@ -123,6 +123,9 @@ body[orient="landscape"] > .toolbar > h1 { font-family: Helvetica; border-width: 0 8px 0 14px; -webkit-border-image: url(backButton.png) 0 8 0 14; + border-image: url(backButton.png) 0 8 0 14 fill; + -webkit-border-image: -webkit-image-set(url(backButton.png) 1x,url(backButton@2x.png) 2x,url(backButton@3x.png) 3x) 0 8 0 14; + border-image: image-set(url(backButton.png) 1x,url(backButton@2x.png) 2x,url(backButton@3x.png) 3x) 0 8 0 14; } .whiteButton, From a54713afb2fc7a9666b9346fdc65314c9f0a6c70 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 20 Apr 2015 22:46:26 +0900 Subject: [PATCH 151/339] =?UTF-8?q?=E3=82=AC=E3=83=A9=E3=82=B1=E3=83=BC?= =?UTF-8?q?=E5=90=91=E3=81=91read=E3=81=AEsyntax=20error=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=20=E3=82=AD=E3=83=A3=E3=83=83=E3=82=B7=E3=83=A5=E5=89=8A?= =?UTF-8?q?=E9=99=A4=E3=81=AB=E6=9D=BF=E4=B8=80=E8=A6=A7=E3=81=AE=E5=89=8A?= =?UTF-8?q?=E9=99=A4=E6=A9=9F=E8=83=BD=E8=BF=BD=E5=8A=A0=20=E6=88=BB?= =?UTF-8?q?=E3=82=8B=E3=83=9C=E3=82=BF=E3=83=B3=E3=81=AE=E7=94=BB=E5=83=8F?= =?UTF-8?q?=E7=B8=AE=E5=B0=8F=E3=81=AB=E5=95=8F=E9=A1=8C=E3=81=8C=E3=81=82?= =?UTF-8?q?=E3=81=A3=E3=81=9F=E3=81=AE=E3=81=A7=E4=BD=9C=E3=82=8A=E7=9B=B4?= =?UTF-8?q?=E3=81=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThreadK.php | 2 +- rep2/editpref.php | 60 +++++++++++++++++++------------------ rep2/iui/backButton.png | Bin 289 -> 387 bytes rep2/iui/backButton@2x.png | Bin 434 -> 689 bytes rep2/iui/backButton@3x.png | Bin 553 -> 823 bytes rep2/js/editpref.js | 11 +++++++ 6 files changed, 43 insertions(+), 30 deletions(-) diff --git a/lib/ShowThreadK.php b/lib/ShowThreadK.php index 6684d8e89..0a414cc4b 100644 --- a/lib/ShowThreadK.php +++ b/lib/ShowThreadK.php @@ -1101,7 +1101,7 @@ public function plugin_replaceImageUrl($url, $purl, $str) } // オリジナルの有無を確認 - $_src_url = ; + $_src_url = ''; if (file_exists($this->thumbnailer->srcPath($icdb->size, $icdb->md5, $icdb->mime))) { $src_exists = true; $img_url = $img_url2 . $icdb->id; diff --git a/rep2/editpref.php b/rep2/editpref.php index 20effc447..88ac7d8dd 100644 --- a/rep2/editpref.php +++ b/rep2/editpref.php @@ -7,6 +7,15 @@ $_login->authorize(); // ユーザ認証 +$deltitles = array( + 'cookie' => 'Ccookie', + 'matome' => '新着まとめ読み', + 'recent' => '最近読んだスレ', + 'reshist' => '書き込み履歴', + 'autong' => '自動 NG・あぼーん', + 'boardlist' => '板一覧 (Online)', +); + // {{{ ホストの同期用設定 $synctitles = array( @@ -117,15 +126,23 @@ $delflag = true; } break; + case boardlist: + $cachefile = P2Util::cacheFileForDL($_conf['brdfile_online']); + if(deleteFile($_conf['cache_dir'] . '/host_bbs_map.txt') && + deleteFile($cachefile) && + deleteFile($cachefile . '.p2.brd') ) { + $delflag = true; + } + break; default: $delflag = false; P2Util::pushInfoHtml("<p>p2 error: 引数 {$_POST['delete']} が不正です。 "); break; } if ($delflag) { - P2Util::pushInfoHtml("<p>p2 info: {$_POST['submit']}を削除しました。"); + P2Util::pushInfoHtml("<p>p2 info: {$deltitles[$_POST['delete']]}を削除しました。"); } else { - P2Util::pushInfoHtml("<p>p2 error: {$_POST['submit']}の削除に失敗しました。"); + P2Util::pushInfoHtml("<p>p2 error: {$deltitles[$_POST['delete']]}の削除に失敗しました。"); } } @@ -174,7 +191,8 @@ echo <<<EOP <link rel="stylesheet" type="text/css" href="css.php?css=style&skin={$skin_en}"> <link rel="stylesheet" type="text/css" href="css.php?css=editpref&skin={$skin_en}"> - <link rel="shortcut icon" type="image/x-icon" href="favicon.ico">\n + <link rel="shortcut icon" type="image/x-icon" href="favicon.ico"> + <script type="text/javascript" src="js/jquery-{$_conf['jquery_version']}.min.js"></script> <script type="text/javascript" src="js/basic.js?{$_conf['p2_version_id']}"></script> <script type="text/javascript" src="js/changeskin.js?{$_conf['p2_version_id']}"></script> <script type="text/javascript" src="js/respopup.js?{$_conf['p2_version_id']}"></script> @@ -330,25 +348,8 @@ echo <<<EOP <fieldset> <legend>履歴・キャッシュの削除</legend>\n -<script type="text/javascript"> -//<![CDATA[ -function deleteCheck(submit){ - if(window.confirm(submit + 'を全て削除してよろしいですか?')){ - return true; - } - else{ - return false; // 送信を中止 - } -} -//]]> -</script> - EOP; - echo getDeleteHistoryFormHt('cookie', 'Cookie'); - echo getDeleteHistoryFormHt('matome', 'まとめ読み'); - echo getDeleteHistoryFormHt('reshist', '書込履歴'); - echo getDeleteHistoryFormHt('recent', '閲覧履歴'); - echo getDeleteHistoryFormHt('autong', '自動NGアボーン'); + echo getDeleteHistoryFormHt(); echo <<<EOP </fieldset>\n EOP; @@ -678,21 +679,22 @@ function getSyncFavoritesFormHt($path_value, $submit_value) /** * 履歴削除用フォームのHTMLを取得する * - * @param string $path_value 削除するファイルの種類 - * @param string $submit_value submitボタンの値 * @return string */ -function getDeleteHistoryFormHt($path_value, $submit_value) +function getDeleteHistoryFormHt() { - global $_conf; + global $_conf, $deltitles; $ht = <<<EOFORM -<form action="editpref.php" method="POST" target="_self" class="inline-form" onSubmit="return deleteCheck('{$submit_value}')"> +<form action="editpref.php" method="POST" target="_self" class="inline-form" onSubmit="return deleteCheck()"> {$_conf['k_input_ht']} - <input type="hidden" name="delete" value="{$path_value}"> - <input type="submit" name="submit" value="{$submit_value}"> -</form>\n + EOFORM; + $ht .= "<select name=\"delete\">"; + foreach ($deltitles as $delmode => $delname) { + $ht .= "<option value=\"{$delmode}\">{$delname}</option>"; + } + $ht .= "</select><input type=\"submit\" name=\"submit\" value=\"削除\"></form>\n"; if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) { $ht = ' ' . preg_replace('/>\s+</', '><', $ht); diff --git a/rep2/iui/backButton.png b/rep2/iui/backButton.png index 2a3ec6d8a6d1bc842847b2c3349c0b5135321394..0385981c54fbad6f5d2ad0e682dbe77129e6615f 100644 GIT binary patch delta 336 zcmV-W0k8g{0)qpP83+ad006b>=iZSaCw~DYNkl<Zc-qvM!3qIU7=?#yrOd)Zu$l#V z0xw}9p)72qD8)*MEZDL24jw_2S$PSIQSt!e+&T+QMzfnUQ(yDnx{I&BGylC!%J+RM zDNn}pyr_E{U;y^EZExd{O-I~U1xBz4YH@WoifqAj6J)^?Oq6BUpu~CvZmP09P=9BA zAeN%6$?1%>%dT3Avca6T`IeLo=G0Y~vuX95{*#r<X_%~JPQzp+bNWkGHm5<^K3H;n z<z>ZEl}*fJWH(^Qb(z_f?(7a6S+|LF3`|z<tQWvhmVJN@c!NAALSFd;JA*N6haHxl z2D14L8(ot54U?73@4rJKnBSH92|f0m-zMm)AGhE6or8+9tjTW+yg&|2)h{v^UL#G1 iPjShnlJsNlBftP9CPXq~7uMGR0000<MNUMnLSTabPo3!i delta 237 zcmZo>UdS{-l7pFnfuYGn{LMr~^?C;N0G|-ockkYP`}Xb2moGnm{`~my<KMr3KYaM` z@87>)zka=c|Ni&y-*4Z({r~^}&o`NAK)t*rL4LtNE*vn}zEEldN|bxLIEGZ*+A_tG zsX>8<#d6Q||NFyPk50OIC`2UK=Y-nA4_x<+wSvsNty7*W<W7h+35t4=GfC~nZB^;8 zV@x;CG2NW5x{1F#Mfx-dX>+IMe{0yJ_u3+2Z)E+mGlynvoGPn5+3(s~*;S`jN?6aY i-=TV~SL(Xv0fr?LtOR>H799h+fx*+&&t;ucLK6THK6{}6 diff --git a/rep2/iui/backButton@2x.png b/rep2/iui/backButton@2x.png index 80b0711f4dc5d469fe3759f1fd57447687cb6e5a..04cf254d932aebf29f038b358f2aa703acde3350 100644 GIT binary patch delta 640 zcmV-`0)PFo1F;2=83+ad008_sP0NuXCw~G{Nkl<Zc-rioJt#$C9LCR;A{pGS7-STa zK`a&}gU!N(g~dmrd~~z;7$hI1gljNUl)Ev=XkjvuQ5N0XH7O<6bMjZW+k43Sp8ufp zJoOvy``(WFb?*N@=eV6%KA-oP@Drn0MX}jzHtgeefk99PjzBt*NJL6(slqWkz<(*I zl-GS=031e1Y)Qz+s{{K5QosL3chp8fNyuma7HBl=ol&fPW<alDJtcFNVlBU{77gpy zU_OeiAPlkfU{@MIVKQJG<S5oIo1nq4o|H4zqu9S^PU=)~4g`;4|DH~;5HMGhQNQxC z6<a5BwW4S}Cv!DJvElaB`6$m-SAVfT_0<%W+KFXfRS?U*sw9?uRY5HKs)AVdRRyu^ zs|sS-SCz!FuPTUTUsVvxzN#daeN{m$`>KLi_EiP3tzd_JHGHuXpvka5%ekt1uYj=> zyAAFP`|F^Mn(W2i$Si#=+K<cZt)?pbQE&;C4Da#J*j1`>o3U%)*zmq#fq!xM@|p$@ zhV@m>TQ{+fU<|w!tyjyujZ>R_-MaA1cengAc7@v9dh7-`F|3aWjHTFjFa_=ndn=r` zZdYDUGH=;$6)tJnZx!zqu-__)WxrJv%YLgQmi<;yEc>mZSoT{bvA^|O|5q}#6l<TL ze%s=G{WgJO9TL=U`@OG!P;FAILxTG4GH9n*`vmpdDzFD?DAqnf{kB=^8O1up7ifAe zf&XlnA&Rw+-)|?utzoZ&V%_o#M!`$L+6Op~nplme7+rxL`S_R1ct}T0EFWk_vHvTd a0t^5lJ&=j|7q3JB0000<MNUMnLSTY-W;;9p delta 383 zcmV-_0f7Fo1+oK>83+Ra007J9z4?(LCw~AiP)t-s{{H^)@$v5N?)Ufi@9*#X`}_L( z`u6tr^78We`T6wp^!@$)`1ttn@bK;J?f?J(P~VIE0000GbW%=J|NsC0|NsC0|NsC0 z|Ns90;3Hib0002|Nkl<Zc-qw1NfN>!6h%=;6pSL-|86xjN>k46OO-6(4vq*vn15Ze z%$eEE+Q4UBe6N+xn&rq^I%|(=3~<(`>J7F{u<>HpY=(_jc!Oow72dZ5?3_hlrz`_I zWf|BpduL#W>;}R1*#`yNXP*>om*rsFEC}0VN!TV!!hW+T>?g~@)+`KLvoLJQ(y%#; z!=@|`o3b8<Rc1v9qMuB)!Bl?-?ra_(jv6O9YOon;I>xQ!7^is+J=BdCx|dw&EUytv zp~GnBB%>Y4d&bzT8uCS-B$e0F*~07TY~gkE>qq8Y;7@6W_xCf!zdWjB-hgLC4_5S< dfUTDR0|3PdC!$%Em7M?p002ovPDHLkV1h~H&=UXv diff --git a/rep2/iui/backButton@3x.png b/rep2/iui/backButton@3x.png index ecf6af7706bcabb8ddb666cb48110eeab6ef19ae..689bc997072b389418674520bf3f17d1e366355e 100644 GIT binary patch delta 775 zcmZ3<vYl;$BnKM<1H=4C(>)Uv)$5sVdb&7<RNQ(q=YQrQ2Z^@Hml(OM8kDc_mNdO$ zJIhwuT*kE9@veh)qwGRy6XqZ7(l_2eU~*LH++S3F|N9;V!R&=k<o12vDWYdD!za0M zE_)s$Bhw_?u>4Op{GZt0l<l4vllH0Vll<DY!-+5N1%&=pS)W(J!NJmyzB4DAAw;vD zrA1Ugquqg_fct+rQ-jvyg9#r_3%x9BDrIJvxt?Q@DAP=)_eC?e)T~XZoN}#^!Qi9Z zg(>lcO@@983WO^7BevJ%zCSWy>BVUFT)79ECTKPYWVI|<%)TR?MSGg-LgA9H43)mD zO|@Sc{T8q^@ttSZ;-4XRok8HmN@kk_Ml2N#^&hQvTwz|ptSS)mn9*Uua=s4?rv)A` z9((;jOwK`8h3DW}8wQR`>!7NEinp={uy;BZ@bfb?eR;*ezk!EQE@2PfyO)et9GL{} z+-7c2=(Re)tmE9kF0sCOpG|{Rhe(s1Ed$4+wQw^y9s(7+2()}+Q0S;%4YyHY3()9B z#g2nOGiqcXFiumPp!uPV-GDRBs^UOXbXs<|2anT-yPsmqf4!I#y{x``!`la}uJLgP z-YNLVp7|@bLDRcl&F~^eWBm`~{GYPhTmO7IFVf*=C?Zhz<Wr-(L}^o1(g)@_3V*}| z?Kki-)-kaBVDzh>;QEl=!jWY%gFOS&9|jJP0w((doJzBSvH}m-9U9~xur&T*Q17S^ z0`nLc>l%c=ya4J^Lelf#98grng7X8j!j2>S*M2nK^Sp4C-_1`XlC9ORpizEDv%Xy+ z(_VoROQz$gH8o6J0xEIr>AxJ?O5`=#80;7Dt^36M%0Zna{U@V<#wuo@L;QX^-qy@G z$DgLtAH-q9vF@|Etb;<7;s?zqp=N(-4u8^UU+|25`M--H1tse)-E}<N_i*dB<O28S p({cov9UN9LGqD^g`o}84a7|UiWUV>xN??*_@O1TaS?83{1OWD!I4%GH delta 503 zcmV<T0SNxL2B`#)83+Ra005|m#g367Cw~AfP)t-s{{H^%?(X*X_WS$$@$vEa`1tVf z@cR1t^Yiof_xJt%{qpki@9*#J?d|{n{}q?3oB#j-4|GyaQ~&?}|NsC0|NsC0|Ns90 z)ZCb%0004ZNkl<Zc-rjR+m3=T7)9X<%%N&||HswHp@4128~57D=(RCl!V=2ghJTU% zgpc5F!8vx_nH2P=bpL#Dg75&O)MJ8S0;G--bTi<cm!T>6SpeTq2TKI$)I)+na1EM* zHG*I0j+7$^j6f4XOQ4CMArM7S7pNkr3S<#f1+oZg0$l_ZfiQxyKp8<<pp2j>kVa4v zXd@^H#1Rw(;s~Av>Ij|$@(7LseSZW;fj)wR0El2OAR^cakO+1HB!aDgiC`muBFF+N zf-ImSSOr)Fi-3z@7Jw1V0x*I}5Wxs0!2m|!BH*tAU!uXkk-sAu+?5TUOa@P9euZMN zN;6og8m!j&Hx`4pHiI`;gSU5nf?+VlF_>f-O!N4OromL#V6ts6-RE~W3}kkB40gH< zcKi4p&rJ#!N{~~ClweIEQM>;+g)4LdLYBfyCt)Hb(4_F%iKus`(EjO2p9&kt3w<(f t3|IPeAb&#g{ssD!D78NLUxJ$e0{|!kZ&K5>iLd|w002ovPDHLkV1mzY@)ZC8 diff --git a/rep2/js/editpref.js b/rep2/js/editpref.js index 58ffe5f09..03f3bccd2 100644 --- a/rep2/js/editpref.js +++ b/rep2/js/editpref.js @@ -73,6 +73,17 @@ function setCacheMetaDataPopUpHeight(popup) } } +function deleteCheck() +{ + + if(window.confirm($('[name=delete] option:selected').text() + 'を全て削除してよろしいですか?')){ + return true; + } + else{ + return false; // 送信を中止 + } +} + // }}} /* From 707dbcffbe018cd965d26f74b46a9f42f639d993 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 26 Apr 2015 10:44:49 +0900 Subject: [PATCH 152/339] =?UTF-8?q?302=E3=81=8C=E7=99=BA=E7=94=9F=E3=81=99?= =?UTF-8?q?=E3=82=8BURL=E3=81=A7RSS=E3=83=AA=E3=83=BC=E3=83=80=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E5=8B=95=E4=BD=9C=E3=81=97=E3=81=AA=E3=81=84=E4=B8=8D?= =?UTF-8?q?=E5=85=B7=E5=90=88=E3=82=92=E4=BF=AE=E6=AD=A3=E3=80=80fixed=20#?= =?UTF-8?q?8=20RSS=E3=83=AA=E3=83=BC=E3=83=80=E3=81=8B=E3=82=89HTTP=5FRequ?= =?UTF-8?q?est2=E3=81=AB=E5=AD=98=E5=9C=A8=E3=81=97=E3=81=AA=E3=81=84?= =?UTF-8?q?=E9=96=A2=E6=95=B0=E3=82=92=E5=91=BC=E3=81=B3=E5=87=BA=E3=81=97?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=81=9F=E9=83=A8=E5=88=86=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4=20P2Util::fileDownload=E3=81=A7If-Modified-Since?= =?UTF-8?q?=E3=82=92=E9=80=81=E4=BF=A1=E3=81=97=E3=81=AA=E3=81=84=E4=B8=8D?= =?UTF-8?q?=E5=85=B7=E5=90=88=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/NgAbornCtl.php | 2 +- lib/P2Util.php | 12 ++++++------ lib/expack/rss/parser.inc.php | 4 ++-- lib/expack/tgrep/view_k.inc.php | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/NgAbornCtl.php b/lib/NgAbornCtl.php index cee8c5e03..804020c24 100644 --- a/lib/NgAbornCtl.php +++ b/lib/NgAbornCtl.php @@ -229,7 +229,7 @@ static public function ngAbornAdd($code, $word) { 'regex' => false, // パターンマッチ関数 'ignorecase' => false, // 大文字小文字を無視 ); - return; + return true; } // }}} // {{{ _readNgAbornFromFile() diff --git a/lib/P2Util.php b/lib/P2Util.php index 7db67940d..b574f6519 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -255,16 +255,16 @@ static public function fileDownload($url, $localfile, { global $_conf; - if (file_exists($localfile)) { - $modified = http_date(filemtime($localfile)); - } else { - $modified = false; - } - try { // DL $req = self::getHTTPRequest2($url, HTTP_Request2::METHOD_GET); + $req->setConfig(array('follow_redirects' => $trace_redirection)); + + if (file_exists($localfile)) { + $req->setHeader ('If-Modified-Since', http_date(filemtime($localfile)) ); + } + $response = $req->send(); $code = $response->getStatus(); diff --git a/lib/expack/rss/parser.inc.php b/lib/expack/rss/parser.inc.php index 3677416bf..ab8b88557 100644 --- a/lib/expack/rss/parser.inc.php +++ b/lib/expack/rss/parser.inc.php @@ -53,11 +53,11 @@ function p2GetRSS($remotefile, $atom = 0) if (!file_exists($localpath) || $refresh || filemtime($localpath) < (time() - $_conf['expack.rss.check_interval'] * 60) ) { - $dl = P2Util::fileDownload($remotefile, $localpath, true, 301); + $dl = P2Util::fileDownload($remotefile, $localpath, true, true); } // キャッシュが更新されなかったか、ダウンロード成功ならRSSをパース - if (file_exists($localpath) && (!isset($dl) || $dl->isSuccess())) { + if (file_exists($localpath) && (!isset($dl))) { if ($atom) { $atom = (isset($dl) && $dl->getStatus() == 200) ? 2 : 1; } diff --git a/lib/expack/tgrep/view_k.inc.php b/lib/expack/tgrep/view_k.inc.php index 7b30d0be6..4334c7d18 100644 --- a/lib/expack/tgrep/view_k.inc.php +++ b/lib/expack/tgrep/view_k.inc.php @@ -116,7 +116,7 @@ $itaj = $t->ita; } ?> -<p><?php echo $o; ?>.<a href="<?php echo $turl; ?>"><?php echo $ttitle; ?></a><br> +<p><?php echo $o+1; ?>.<a href=\"<?php echo $turl; ?>\"><?php echo $ttitle; ?></a><br> <small><?php echo date('y/m/d ', $t->tkey); ?><a href="<?php echo $burl; ?>"><?php echo $itaj; ?>(<?php echo $profile['boards'][$t->bid]->hits; ?>)</a></small></p> <?php } ?> <div><a href="#top" align="right" title="上へ"<?php echo $_conf['k_accesskey_at']['above']; ?>><?php echo $_conf['k_accesskey_st']['above']; ?>▲</a></div> From cf384241cb2d2518ced955f6450bb52c08e258aa Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 26 Apr 2015 10:48:04 +0900 Subject: [PATCH 153/339] v150426.1033 --- conf/conf.inc.php | 2 +- doc/README-774.txt | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index a031aa320..4db56df99 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150418.1111', // rep2のバージョン + 'p2version' => '150426.1033', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index 78fcaeae8..10ea4ed9b 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -30,14 +30,15 @@ rep2-expack test https://github.com/orzisun/p2-php ### 仕様変更 * ローカル板一覧用.brdファイルの置き場所をrep2/boardから$_conf['data_dir']/brardに変更 - - openJaneと同じ形式です。 + - .brdはopenJaneと同じ形式です。 * スマホ用画面のツールバーアイコンを高解像度画面に対応(thx https://github.com/dgg712/p2-php) * スマホ用レスポップアップ、SPM、IC2の外側をタップすると閉じるように変更 - レスポップアップから開いたレスポップアップをタップした際に元のレスポップアップが消えるのは仕様とさせていただきます。 - スクロールは指の終着点がポップアップ内になるようにすれば消えません。 * headline.2ch.netを最近読んだスレに追記しないように変更 -* その他今時のアレに合わせた修正等gitのコミットログも確認してください。 +その他今時のアレに合わせた修正等gitのコミットログも確認してください。 + ●免責 @@ -56,6 +57,14 @@ rep2-expack test https://github.com/orzisun/p2-php 本家p2と同じく、X11ライセンスです。 ●ChangeLog +150426.1033 +* ガラケー向けreadのsyntax error修正 +* 302が発生するURLでRSSリーダ正常動作しない不具合を修正 +* RSSリーダからHTTP_Request2に存在しない関数を呼び出していた部分を削除 +* P2Util::fileDownloadでIf-Modified-Sinceを送信しない不具合を修正 +* キャッシュ削除に板一覧の削除機能追加 +* 左上戻るボタンを高解像度対応に変更 + 150418.1111 * スマホ用画面のツールバーアイコンを高解像度画面に対応(thx https://github.com/dgg712/p2-php) * rep2に登録された外部板へリンクする機能を追加 From a3dcfac0c21cdc13d0678ddf7c056bbbc9308640 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 30 Apr 2015 12:28:11 +0900 Subject: [PATCH 154/339] =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=82=AF=E3=83=97?= =?UTF-8?q?=E3=83=A9=E3=82=B0=E3=82=A4=E3=83=B3=E3=81=8B=E3=82=89show?= =?UTF-8?q?=E3=83=9C=E3=82=BF=E3=83=B3=E3=82=92=E4=BD=BF=E3=81=84=E3=82=84?= =?UTF-8?q?=E3=81=99=E3=81=8F=E3=81=97=E3=81=9F=E3=80=82=20Youtube+?= =?UTF-8?q?=E3=83=8B=E3=82=B3=E5=8B=95=E5=AF=BE=E5=BF=9C=E3=81=AE=E5=89=8A?= =?UTF-8?q?=E9=99=A4=E3=81=AB=E5=90=91=E3=81=91=E3=81=9F=E6=BA=96=E5=82=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/wiki/WIKI-774.txt | 18 ++++++++ lib/ShowThreadPc.php | 4 +- lib/read_header.inc.php | 11 ++--- rep2/js/preview_video.js | 86 +++++++++++++---------------------- rep2/js/preview_video_half.js | 76 ------------------------------- style/read_css.inc | 10 ++-- 6 files changed, 62 insertions(+), 143 deletions(-) create mode 100644 doc/wiki/WIKI-774.txt delete mode 100755 rep2/js/preview_video_half.js diff --git a/doc/wiki/WIKI-774.txt b/doc/wiki/WIKI-774.txt new file mode 100644 index 000000000..4754fe606 --- /dev/null +++ b/doc/wiki/WIKI-774.txt @@ -0,0 +1,18 @@ +リンクプラグインで使える774独自機能 + +● showボタン +jQueryの力により、クリックするとiframeに変身します。 + +一例 +Match +^(?:https?://(?:www\.|m\.)?youtube\.(?:com|jp)/(?:watch\?(?:.*&)?(?:v|video_id)=|v/)|(?:https?://youtu\.be/|https://www\.youtube-nocookie\.com/v/))([\w\-_]+)(?:.*)?$ + +Replace +<img class="preview-video-switch" src="img/show.png" alt="show" data-video_url="https://www.youtube.com/embed/\1" data-video_width="640" data-video_height="360" data-video_harf="0" data-video_option='{"allowfullscreen":"1"}'> + +data-video_url(必須) iframeのsrc属性 +data-video_width(必須) iframeのwidth属性 +data-video_height(必須) iframeのheight属性 +data-video_style(オプション) iframeのstyle属性 +data-video_harf(オプション) 1にするとwidthとheightが半分になります +data-video_option(オプション) Javascriptの連想配列形式でiframeの追加属性を指定します。名前と値は必ずペアである必要があります。 diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index c912290d8..e3a1df5d8 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -1365,7 +1365,7 @@ public function plugin_linkYouTube($url, $purl, $str) if ($_conf['link_youtube'] == 2) { return <<<EOP -{$link} <img class="preview-video-switch" src="img/show.png" width="30" height="12" alt="show" onclick="preview_video_youtube('{$id}', this);"> +{$link} <img class="preview-video-switch" src="img/show.png" alt="show" data-video_url="https://www.youtube.com/embed/{$id}" data-video_width="425" data-video_height="350" data-video_harf="{$_conf['live.youtube_winsize']}" data-video_option='{"allowfullscreen":"1"}'> EOP; } else { return <<<EOP @@ -1416,7 +1416,7 @@ public function plugin_linkNicoNico($url, $purl, $str) if ($_conf['link_niconico'] == 2) { return <<<EOP -{$link} <img class="preview-video-switch" src="img/show.png" width="30" height="12" alt="show" onclick="preview_video_niconico('{$id}', this);"> +{$link} <img class="preview-video-switch" src="img/show.png" alt="show" data-video_url="http://ext.nicovideo.jp/thumb/{$id}" data-video_width="425" data-video_height="175" data-video_harf="0" data-video_option='{"scrolling":"auto"}'> EOP; } else { return <<<EOP diff --git a/lib/read_header.inc.php b/lib/read_header.inc.php index c1aef7b33..4f05203cb 100755 --- a/lib/read_header.inc.php +++ b/lib/read_header.inc.php @@ -232,23 +232,20 @@ <script type="text/javascript" src="./js/yui-ext/yui.js"></script> <script type="text/javascript" src="./js/yui-ext/yui-ext-nogrid.js"></script> <link rel="stylesheet" type="text/css" href="./js/yui-ext/resources/css/resizable.css"> - <script type="text/javascript" src="js/{$live_view_popup}htmlpopup_resizable.js?{$_conf['p2_version_id']}"></script> + <script type="text/javascript" src="js/{$live_view_popup}htmlpopup_resizable.js?{$_conf['p2_version_id']}"></script>\n EOP; } else { echo <<<EOP - <script type="text/javascript" src="js/{$live_view_popup}htmlpopup.js?{$_conf['p2_version_id']}"></script> + <script type="text/javascript" src="js/{$live_view_popup}htmlpopup.js?{$_conf['p2_version_id']}"></script>\n EOP; } if ($_conf['link_youtube'] == 2 || $_conf['link_niconico'] == 2) { - // +live YouTubeプレビュー表示のサイズ指定 - if ($_conf['live.youtube_winsize'] == 1) { - echo "\t<script type=\"text/javascript\" src=\"js/preview_video_half.js?{$_conf['p2_version_id']}\"></script>\n"; - } else { echo <<<EOP + <script type="text/javascript" src="js/jquery-{$_conf['jquery_version']}.min.js"></script> <script type="text/javascript" src="js/preview_video.js?{$_conf['p2_version_id']}"></script>\n EOP; - } + } if ($_conf['expack.am.enabled']) { echo <<<EOP diff --git a/rep2/js/preview_video.js b/rep2/js/preview_video.js index bdf4361ac..a2ba1a897 100644 --- a/rep2/js/preview_video.js +++ b/rep2/js/preview_video.js @@ -5,62 +5,40 @@ // {{{ preview_video_youtube() /* - * YouTubeのプレビューを表示する + * プレビューを表示する * - * @param String id - * @param Element placeholder - * @return void */ -function preview_video_youtube(id, placeholder) -{ - var container = document.createElement('div'); - container.className = 'preview-video preview-video-youtube'; - - var preview = document.createElement('iframe'); - preview.setAttribute('width', '425'); - preview.setAttribute('height', '350'); - preview.setAttribute('src', 'https://www.youtube.com/embed/' + id); - preview.setAttribute('frameborder', '0'); - preview.setAttribute('allowfullscreen',''); - container.appendChild(preview); - - if (placeholder && placeholder.parentNode) { - placeholder.parentNode.replaceChild(container, placeholder); - } else { - document.body.appendChild(container); - } -} - -// }}} -// {{{ preview_video_niconico() - -/* - * ニコニコ動画のプレビューを表示する - * - * @param String id - * @param Element placeholder - * @return void - */ -function preview_video_niconico(id, placeholder) -{ - var container = document.createElement('div'); - container.className = 'preview-video preview-video-niconico'; - - var preview = document.createElement('iframe'); - preview.setAttribute('src', 'http://ext.nicovideo.jp/thumb/' + id); - preview.setAttribute('width', '425'); - preview.setAttribute('height', '175'); - preview.setAttribute('frameborder', '0'); - preview.setAttribute('scrolling', 'auto'); - - container.appendChild(preview); - - if (placeholder && placeholder.parentNode) { - placeholder.parentNode.replaceChild(container, placeholder); - } else { - document.body.appendChild(container); - } -} +$(function() { + $("img.preview-video-switch").click(function (event) { + var $container = $("<div>").addClass('preview-video preview-video-youtube'); + var $preview = $("<iframe>").attr('src', $(this).data('video_url')).attr('frameborder', '0'); + + if($(this).data('video_harf') == "1") { + $preview.attr('width', $(this).data('video_width')/2); + $preview.attr('height', $(this).data('video_height')/2); + } else { + $preview.attr('width', $(this).data('video_width')); + $preview.attr('height', $(this).data('video_height')); + } + + if($(this).data('video_style')) { + $preview.attr('style', $(this).data('video_style')); + } + + var video_option = $(this).data('video_option'); + for (var key in video_option) { + $preview.attr(key, video_option [key]); + } + + $container.append($preview); + + if ($(this) && $(this).parent()) { + $(this).replaceWith($container); + } else { + $("body").append($container); + } + }); +}); // }}} diff --git a/rep2/js/preview_video_half.js b/rep2/js/preview_video_half.js deleted file mode 100755 index c372b36cd..000000000 --- a/rep2/js/preview_video_half.js +++ /dev/null @@ -1,76 +0,0 @@ -/* - * rep2expack - ネット動画のプレビュー - */ - -// {{{ preview_video_youtube() - -/* - * YouTubeのプレビューを表示する - * - * @param String id - * @param Element placeholder - * @return void - */ -function preview_video_youtube(id, placeholder) -{ - var container = document.createElement('div'); - container.className = 'preview-video preview-video-youtube'; - - var preview = document.createElement('iframe'); - preview.setAttribute('width', '212'); - preview.setAttribute('height', '175'); - preview.setAttribute('src', 'https://www.youtube.com/embed/' + id); - preview.setAttribute('frameborder', '0'); - preview.setAttribute('allowfullscreen',''); - container.appendChild(preview); - - if (placeholder && placeholder.parentNode) { - placeholder.parentNode.replaceChild(container, placeholder); - } else { - document.body.appendChild(container); - } -} - -// }}} -// {{{ preview_video_niconico() - -/* - * ニコニコ動画のプレビューを表示する - * - * @param String id - * @param Element placeholder - * @return void - */ -function preview_video_niconico(id, placeholder) -{ - var container = document.createElement('div'); - container.className = 'preview-video preview-video-niconico'; - - var preview = document.createElement('iframe'); - preview.setAttribute('src', 'http://ext.nicovideo.jp/thumb/' + id); - preview.setAttribute('width', '425'); - preview.setAttribute('height', '175'); - preview.setAttribute('frameborder', '0'); - preview.setAttribute('scrolling', 'auto'); - - container.appendChild(preview); - - if (placeholder && placeholder.parentNode) { - placeholder.parentNode.replaceChild(container, placeholder); - } else { - document.body.appendChild(container); - } -} - -// }}} - -/* - * Local Variables: - * mode: javascript - * coding: cp932 - * tab-width: 4 - * c-basic-offset: 4 - * indent-tabs-mode: t - * End: - */ -/* vim: set syn=javascript fenc=cp932 ai noet ts=4 sw=4 sts=4 fdm=marker: */ diff --git a/style/read_css.inc b/style/read_css.inc index e29f3f1c8..811cc2cf2 100644 --- a/style/read_css.inc +++ b/style/read_css.inc @@ -374,6 +374,8 @@ div.respopup div.reslist { .preview-video-switch { cursor: pointer; + width: 32px; + height: 12px; } /* ツールバー */ @@ -385,20 +387,20 @@ table.toolbar { table.toolbar td.lblock { text-align: left; -} +} table.toolbar td.cblock { text-align: center; -} +} table.toolbar td.rblock { text-align: right; -} +} div.reslist_inner { position:relative; // margin:0 0 0 17px; - + } blockquote.folding_container{ From e6665a5c9689c9449b3a3c277aa105921d620829 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Fri, 1 May 2015 15:19:43 +0900 Subject: [PATCH 155/339] =?UTF-8?q?=E6=9C=AA=E4=BD=BF=E7=94=A8=E3=81=AE?= =?UTF-8?q?=E5=A4=89=E6=95=B0=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P.S. 縺昴ョ遽縺ッ螟ァ螟峨#霑キ諠代♀縺九¢縺励∪縺励◆ス。 --- lib/ShowThreadK.php | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ShowThreadK.php b/lib/ShowThreadK.php index 0a414cc4b..ce0bad8a3 100644 --- a/lib/ShowThreadK.php +++ b/lib/ShowThreadK.php @@ -1101,7 +1101,6 @@ public function plugin_replaceImageUrl($url, $purl, $str) } // オリジナルの有無を確認 - $_src_url = ''; if (file_exists($this->thumbnailer->srcPath($icdb->size, $icdb->md5, $icdb->mime))) { $src_exists = true; $img_url = $img_url2 . $icdb->id; From fdd6e03d5e14ddbc85db6c1f256dc2d8099c4f95 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Fri, 1 May 2015 15:29:07 +0900 Subject: [PATCH 156/339] =?UTF-8?q?=E6=9C=AC=E5=AE=B6=E3=81=A7=E3=81=AE?= =?UTF-8?q?=E3=81=8A=E6=B0=97=E3=81=AB=E3=82=B9=E3=83=AC=E5=85=B1=E6=9C=89?= =?UTF-8?q?=E3=81=8C=E5=BB=83=E6=AD=A2=E3=81=95=E3=82=8C=E3=81=9F=E3=81=AE?= =?UTF-8?q?=E3=81=A7=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=20(=E3=82=AF?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=B3=E3=81=AE=E9=96=8B=E7=99=BA=E3=82=92?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=81=A8=E3=81=84=E3=81=86=E8=A9=B1=E3=82=82?= =?UTF-8?q?=E4=B8=80=E5=BF=9C=E3=81=82=E3=82=8B=E3=81=BF=E3=81=9F=E3=81=84?= =?UTF-8?q?=E3=81=AA=E3=81=AE=E3=81=A7=E5=AE=8C=E6=88=90=E3=81=97=E3=81=9F?= =?UTF-8?q?=E3=82=89=E5=A4=96=E3=81=97=E3=81=A6=E3=81=8F=E3=81=A0=E3=81=95?= =?UTF-8?q?=E3=81=84=EF=BD=A1=20=20http://anago.2ch.net/test/read.cgi/soft?= =?UTF-8?q?ware/1425420543/975=20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- conf/conf_user_def.inc.php | 2 ++ lib/setfav.inc.php | 3 +++ rep2/edit_conf_user.php | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 4db56df99..e850cfb69 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -74,7 +74,7 @@ function p2_init() $_conf['p2web_url'] = 'http://akid.s17.xrea.com/'; $_conf['p2ime_url'] = 'http://akid.s17.xrea.com/p2ime.php'; - $_conf['favrank_url'] = 'http://akid.s17.xrea.com/favrank/favrank.php'; +// $_conf['favrank_url'] = 'http://akid.s17.xrea.com/favrank/favrank.php'; $_conf['expack.web_url'] = 'http://2ch774.github.io/p2-php/'; $_conf['expack.download_url'] = 'https://github.com/2ch774/p2-php/releases'; $_conf['expack.history_url'] = 'https://github.com/2ch774/p2-php/blob/master/doc/README-774.txt'; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 970660c4c..ffa7a62cc 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -497,9 +497,11 @@ // ゲートで自動転送しない拡張子(カンマ区切りで、拡張子の前のピリオドは不要) $conf_user_def['ime_manual_ext'] = "exe,zip"; // ("exe,zip") +/* // お気にスレ共有に参加(する:1, しない:0) $conf_user_def['join_favrank'] = 0; // (0) $conf_user_rad['join_favrank'] = array('1' => 'する', '0' => 'しない'); + */ // お気に板のスレ一覧をまとめて表示 (する:1, しない:0, 既得スレのみ:2) $conf_user_def['merge_favita'] = 0; // (0) diff --git a/lib/setfav.inc.php b/lib/setfav.inc.php index a9241bad1..aa6563dce 100644 --- a/lib/setfav.inc.php +++ b/lib/setfav.inc.php @@ -138,6 +138,7 @@ function setFav($host, $bbs, $key, $setfav, $ttitle = null, $setnum = null) p2die('cannot write file.'); } +/* //================================================ // お気にスレ共有 @@ -155,6 +156,8 @@ function setFav($host, $bbs, $key, $setfav, $ttitle = null, $setnum = null) postFavRank($post); } + */ + return true; } diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index 6eee5da17..5bb69ec9c 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -430,7 +430,7 @@ array('brocra_checker_url', 'ブラクラチェッカURL'), array('brocra_checker_query', 'ブラクラチェッカのクエリー (空の場合、PATH_INFOでURLを渡す)'), '板メニュー・お気に板', - array('join_favrank', '<a href="http://akid.s17.xrea.com/favrank/favrank.html" target="_blank">お気にスレ共有</a>に参加'), +// array('join_favrank', '<a href="http://akid.s17.xrea.com/favrank/favrank.html" target="_blank">お気にスレ共有</a>に参加'), array('merge_favita', 'お気に板のスレ一覧をまとめて表示 (お気に板の数によっては処理に時間がかかる)'), array('favita_order_dnd', 'ドラッグ&ドロップでお気に板を並べ替える'), array('enable_menu_new', '板メニューに新着数を表示'), From 433cf36e3a0dfa12d9ec322325668d306c6783fc Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 3 May 2015 12:08:22 +0900 Subject: [PATCH 157/339] =?UTF-8?q?=E3=82=88=E3=82=8A=E9=AB=98=E6=80=A7?= =?UTF-8?q?=E8=83=BD=E3=81=AA=E3=83=AA=E3=83=B3=E3=82=AF=E3=83=97=E3=83=A9?= =?UTF-8?q?=E3=82=B0=E3=82=A4=E3=83=B3=E3=81=8C=E5=87=BA=E3=81=9F=E3=81=AE?= =?UTF-8?q?=E3=81=A7=E5=86=85=E8=94=B5Youtube=E3=81=A8=E3=83=8B=E3=82=B3?= =?UTF-8?q?=E3=83=8B=E3=82=B3=E5=8B=95=E7=94=BB=E3=82=92=E5=89=8A=E9=99=A4?= =?UTF-8?q?=20=E3=82=B9=E3=83=9E=E3=83=9B=E5=90=91=E3=81=91read=E3=81=AB?= =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=82=AF=E3=83=97=E3=83=A9=E3=82=B0=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E5=AE=9F=E8=A3=85=20=E6=AE=8B=E3=82=8A=E3=81=8B?= =?UTF-8?q?=E3=81=99=E3=81=AE=E6=8E=83=E9=99=A4=E3=81=AF=E3=81=93=E3=82=8C?= =?UTF-8?q?=E3=81=8B=E3=82=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThreadI.php | 59 +++++---------------- lib/ShowThreadPc.php | 117 ------------------------------------------ lib/wiki/read.inc.php | 20 ++++---- 3 files changed, 21 insertions(+), 175 deletions(-) diff --git a/lib/ShowThreadI.php b/lib/ShowThreadI.php index c1f61dde2..0e89d6b6f 100644 --- a/lib/ShowThreadI.php +++ b/lib/ShowThreadI.php @@ -51,6 +51,9 @@ public function __construct(ThreadRead $aThread, $matome = false) 'plugin_link2chSubject', ); // +Wiki + if (isset($GLOBALS['linkPluginCtl'])) { + $this->_url_handlers[] = 'plugin_linkPlugin'; + } if (isset($GLOBALS['replaceImageUrlCtl'])) { $this->_url_handlers[] = 'plugin_replaceImageUrl'; } @@ -59,9 +62,6 @@ public function __construct(ThreadRead $aThread, $matome = false) } elseif ($_conf['mobile.use_picto']) { $this->_url_handlers[] = 'plugin_viewImage'; } - if ($_conf['mobile.link_youtube']) { - $this->_url_handlers[] = 'plugin_linkYouTube'; - } $this->_url_handlers[] = 'plugin_linkURL'; if (!$_conf['mobile.bbs_noname_name']) { @@ -871,50 +871,6 @@ public function plugin_linkThread($url, $purl, $str) return false; } - // }}} - // {{{ plugin_linkYouTube() - - /** - * YouTubeリンク変換プラグイン - * - * Zend_Gdata_Youtubeを使えばサムネイルその他の情報を簡単に取得できるが... - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_linkYouTube($url, $purl, $str) - { - global $_conf; - - // http://www.youtube.com/watch?v=Mn8tiFnAUAI - if (preg_match('{^http://(www|jp)\\.youtube\\.com/watch\\?v=([0-9A-Za-z_\\-]+)}', $purl[0], $m)) { - $subd = $m[1]; - $id = $m[2]; - - if ($_conf['mobile.link_youtube'] == 2) { - $link = $str; - } else { - $link = $this->plugin_linkURL($url, $purl, $str); - if ($link === false) { - // plugin_linkURL()がちゃんと機能している限りここには来ない - if ($_conf['through_ime']) { - $link_url = P2Util::throughIme($purl[0]); - } else { - $link_url = $url; - } - $link = "<a href=\"{$link_url}\">{$str}</a>"; - } - } - - return <<<EOP -{$link}<br><img src="http://img.youtube.com/vi/{$id}/default.jpg" alt="YouTube {$id}"> -EOP; - } - return false; - } - // }}} // {{{ plugin_viewImage() @@ -1322,6 +1278,15 @@ public function plugin_replaceImageUrl($url, $purl, $str) } // }}} + // {{{ plugin_linkPlugin() + + /** + * +Wiki:リンクプラグイン + */ + public function plugin_linkPlugin($url, $purl, $str) + { + return $GLOBALS['linkPluginCtl']->replaceLinkToHTML($url, $str); + } // }}} // {{{ _quotebackHorizontalListHtml() diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index e3a1df5d8..7849659bc 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -72,12 +72,6 @@ public function __construct($aThread, $matome = false) } elseif ($_conf['preview_thumbnail']) { $this->_url_handlers[] = 'plugin_viewImage'; } - if ($_conf['link_youtube']) { - $this->_url_handlers[] = 'plugin_linkYouTube'; - } - if ($_conf['link_niconico']) { - $this->_url_handlers[] = 'plugin_linkNicoNico'; - } $this->_url_handlers[] = 'plugin_linkURL'; // imepitaのURLを加工してImageCache2させるプラグインを登録 @@ -1316,117 +1310,6 @@ public function plugin_linkThread($url, $purl, $str) return false; } - // }}} - // {{{ plugin_linkYouTube() - - /** - * YouTubeリンク変換プラグイン - * - * Zend_Gdata_Youtubeを使えばサムネイルその他の情報を簡単に取得できるが... - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_linkYouTube($url, $purl, $str) - { - global $_conf; - - // +live YouTubeプレビュー表示のサイズ指定 - if ($_conf['live.youtube_winsize'] == 1) { - $youtube_winsize = "width=\"212\" height=\"175\""; // ハーフ - } else { - $youtube_winsize = "width=\"425\" height=\"350\""; // ノーマル - } - - // http://www.youtube.com/watch?v=Mn8tiFnAUAI - // http://m.youtube.com/watch?v=OhcX0xJsDK8&client=mv-google&gl=JP&hl=ja&guid=ON&warned=True - if (preg_match('{^https?://(youtu\\.be/|(www|jp|m)\\.youtube\\.com/watch\\?(?:.+&)?v=)([0-9a-zA-Z_\\-]+)}', $url, $m)) { - $url = preg_replace('{^http:}', 'https:', $url); - // ime - if ($_conf['through_ime']) { - $link_url = P2Util::throughIme($url); - } else { - $link_url = $url; - } - - $link_url = $link_url . "&fmt=18"; // 高画質用 - - // HTMLポップアップ - if ($_conf['iframe_popup']) { - $link = $this->iframePopup($link_url, $str, $_conf['ext_win_target_at']); - } else { - $link = "<a href=\"{$link_url}\"{$_conf['ext_win_target_at']}>{$str}</a>"; - } - - $subd = $m[1]; - $id = $m[3]; - - if ($_conf['link_youtube'] == 2) { - return <<<EOP -{$link} <img class="preview-video-switch" src="img/show.png" alt="show" data-video_url="https://www.youtube.com/embed/{$id}" data-video_width="425" data-video_height="350" data-video_harf="{$_conf['live.youtube_winsize']}" data-video_option='{"allowfullscreen":"1"}'> -EOP; - } else { - return <<<EOP -{$link}<div class="preview-video preview-video-youtuve"> -<iframe {$youtube_winsize} src="https://www.youtube.com/embed/{$id}" frameborder="0" allowfullscreen></iframe> -</div> -EOP; - } - } - return false; - } - - // }}} - // {{{ plugin_linkNicoNico() - - /** - * ニコニコ動画変換プラグイン - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_linkNicoNico($url, $purl, $str) - { - global $_conf; - - // http://www.nicovideo.jp/watch?v=utbrYUJt9CSl0 - // http://www.nicovideo.jp/watch/utvWwAM30N0No - // http://m.nicovideo.jp/watch/sm7044684 - if (preg_match('{^http://(?:www|m)\\.nicovideo\\.jp/watch(?:/|(?:\\?v=))([0-9a-zA-Z_-]+)}', $url, $m) || - preg_match('{^http://nico\\.(?:ms|sc)/([0-9a-zA-Z_-]+)}', $url, $m)) { - // ime - if ($_conf['through_ime']) { - $link_url = P2Util::throughIme($purl[0]); - } else { - $link_url = $url; - } - - // HTMLポップアップ - if ($_conf['iframe_popup']) { - $link = $this->iframePopup($link_url, $str, $_conf['ext_win_target_at']); - } else { - $link = "<a href=\"{$link_url}\"{$_conf['ext_win_target_at']}>{$str}</a>"; - } - - $id = $m[1]; - - if ($_conf['link_niconico'] == 2) { - return <<<EOP -{$link} <img class="preview-video-switch" src="img/show.png" alt="show" data-video_url="http://ext.nicovideo.jp/thumb/{$id}" data-video_width="425" data-video_height="175" data-video_harf="0" data-video_option='{"scrolling":"auto"}'> -EOP; - } else { - return <<<EOP -{$link}<div class="preview-video preview-video-niconico"><iframe src="http://ext.nicovideo.jp/thumb/{$id}" width="425" height="175" scrolling="auto" frameborder="0"></iframe></div> -EOP; - } - } - return false; - } - // }}} // {{{ plugin_viewImage() diff --git a/lib/wiki/read.inc.php b/lib/wiki/read.inc.php index 5eadf5475..fffc4699b 100644 --- a/lib/wiki/read.inc.php +++ b/lib/wiki/read.inc.php @@ -3,22 +3,20 @@ p2 - スレッド表示でincludeされるファイル */ -if (!$_conf['ktai']) { - // リンクプラグイン - require_once P2_LIB_DIR . '/wiki/LinkPluginCtl.php'; - $GLOBALS['linkPluginCtl'] = new LinkPluginCtl(); - // 置換画像URL(PCでImageCache2が有効の場合) - if ($_conf['expack.ic2.enabled'] % 2 == 1) { - require_once P2_LIB_DIR . '/wiki/ReplaceImageUrlCtl.php'; - $GLOBALS['replaceImageUrlCtl'] = new ReplaceImageUrlCtl(); - } -} else { - // 置換画像URL(携帯でImageCache2が有効の場合) +// ImageCache2が有効の場合 +if (in_array($_conf['expack.ic2.enabled'], array($_conf['ktai'] ? 1 : 2, 3))) { +// 置換画像URL if ($_conf['expack.ic2.enabled'] >= 2) { require_once P2_LIB_DIR . '/wiki/ReplaceImageUrlCtl.php'; $GLOBALS['replaceImageUrlCtl'] = new ReplaceImageUrlCtl(); } } +// 携帯ビュー以外の場合 +if (!$_conf['ktai'] || $_conf['iphone']) { +// リンクプラグイン + require_once P2_LIB_DIR . '/wiki/LinkPluginCtl.php'; + $GLOBALS['linkPluginCtl'] = new LinkPluginCtl(); +} // 置換ワード require_once P2_LIB_DIR . '/wiki/ReplaceWordCtl.php'; $GLOBALS['replaceWordCtl'] = new ReplaceWordCtl(); From 1879bc27d9b859da31ab4e0f16bbcb3378b934a0 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 8 May 2015 05:29:42 +0900 Subject: [PATCH 158/339] =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=82=AF=E3=83=97?= =?UTF-8?q?=E3=83=A9=E3=82=B0=E3=82=A4=E3=83=B3=E3=81=AE=E3=81=9F=E3=82=81?= =?UTF-8?q?PC=E3=81=A8=E3=82=B9=E3=83=9E=E3=83=9B=E3=81=A7shpw=E3=83=9C?= =?UTF-8?q?=E3=82=BF=E3=83=B3=E3=81=AE=E3=82=B9=E3=82=AF=E3=83=AA=E3=83=97?= =?UTF-8?q?=E3=83=88=E3=82=92=E7=84=A1=E6=9D=A1=E4=BB=B6=E3=81=A7=E8=AA=AD?= =?UTF-8?q?=E3=81=BF=E8=BE=BC=E3=82=80=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThreadPc.php | 2 +- lib/read_header.inc.php | 9 ++------- lib/read_header_i.inc.php | 1 + 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index 7849659bc..9733ad6e5 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -1337,7 +1337,7 @@ public function plugin_viewImage($url, $purl, $str) if (preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $purl[0]) && empty($purl['query'])) { $pre_thumb_limit--; // 表示制限カウンタを下げる - $img_tag = "<img class=\"thumbnail\" src=\"{$url}\" height=\"{$_conf['pre_thumb_height']}\" weight=\"{$_conf['pre_thumb_width']}\" hspace=\"4\" vspace=\"4\" align=\"middle\">"; + $img_tag = "<img class=\"thumbnail\" src=\"{$url}\" height=\"{$_conf['pre_thumb_height']}\" width=\"{$_conf['pre_thumb_width']}\" hspace=\"4\" vspace=\"4\" align=\"middle\">"; if ($_conf['iframe_popup']) { $view_img = $this->imageHtmlPopup($url, $img_tag, $str); diff --git a/lib/read_header.inc.php b/lib/read_header.inc.php index 4f05203cb..62f6485ff 100755 --- a/lib/read_header.inc.php +++ b/lib/read_header.inc.php @@ -214,11 +214,13 @@ {$_conf['extra_headers_ht']} <title>{$ptitle_ht} + + \n EOP; @@ -240,13 +242,6 @@ EOP; } -if ($_conf['link_youtube'] == 2 || $_conf['link_niconico'] == 2) { - echo << - \n -EOP; - -} if ($_conf['expack.am.enabled']) { echo <<\n diff --git a/lib/read_header_i.inc.php b/lib/read_header_i.inc.php index 212fa0ad2..2996994ad 100644 --- a/lib/read_header_i.inc.php +++ b/lib/read_header_i.inc.php @@ -71,6 +71,7 @@ + EOS; // ImageCache2 if ($_conf['expack.ic2.enabled']) { From d5437928d197a6f364a7a3b0c173fe070c53736a Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 8 May 2015 05:40:25 +0900 Subject: [PATCH 159/339] =?UTF-8?q?=E5=86=85=E8=94=B5=E3=83=AA=E3=83=B3?= =?UTF-8?q?=E3=82=AF=E3=83=97=E3=83=A9=E3=82=B0=E3=82=A4=E3=83=B3=E3=81=AB?= =?UTF-8?q?=E9=96=A2=E3=81=99=E3=82=8B=E8=A8=AD=E5=AE=9A=E9=A0=85=E7=9B=AE?= =?UTF-8?q?=E3=82=92=E9=99=A4=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- conf/conf_user_def.inc.php | 10 +--------- conf/conf_user_def_live.inc.php | 4 ---- rep2/edit_conf_user.php | 3 --- rep2/read_new.php | 12 ++---------- 5 files changed, 4 insertions(+), 27 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index e850cfb69..3181db496 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150426.1033', // rep2のバージョン + 'p2version' => '150508.0061', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index ffa7a62cc..bad6d5d6f 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -170,14 +170,6 @@ $conf_user_def['pre_thumb_width'] = "32"; // ("32") //$conf_user_rules['pre_thumb_width'] = array('emptyToDef', 'notIntExceptMinusToDef'); -// YouTubeのリンクをプレビュー表示(する:1, しない:0, 手動でする:2) -$conf_user_def['link_youtube'] = 1; // (1) -$conf_user_rad['link_youtube'] = array('1' => 'する', '0' => 'しない', '2' => '手動でする'); - -// ニコニコ動画のリンクをプレビュー表示(する:1, しない:0, 手動でする:2) -$conf_user_def['link_niconico'] = 1; // (1) -$conf_user_rad['link_niconico'] = array('1' => 'する', '0' => 'しない', '2' => '手動でする'); - // HTMLポップアップ(する:1, しない:0, pでする:2, 画像でする:3) $conf_user_def['iframe_popup'] = 2; // (2) $conf_user_sel['iframe_popup'] = array('1' => 'する', '0' => 'しない', '2' => 'pでする', '3' => '画像でする'); @@ -497,7 +489,7 @@ // ゲートで自動転送しない拡張子(カンマ区切りで、拡張子の前のピリオドは不要) $conf_user_def['ime_manual_ext'] = "exe,zip"; // ("exe,zip") -/* +/* // お気にスレ共有に参加(する:1, しない:0) $conf_user_def['join_favrank'] = 0; // (0) $conf_user_rad['join_favrank'] = array('1' => 'する', '0' => 'しない'); diff --git a/conf/conf_user_def_live.inc.php b/conf/conf_user_def_live.inc.php index 9ef4c138d..27eec8ff5 100755 --- a/conf/conf_user_def_live.inc.php +++ b/conf/conf_user_def_live.inc.php @@ -31,10 +31,6 @@ $conf_user_def['live.highlight_chain'] = 0; // (0) $conf_user_rad['live.highlight_chain'] = array('1' => 'する', '0' => 'しない'); -// YouTubeプレビュー表示のサイズ -$conf_user_def['live.youtube_winsize'] = 0; // (0) -$conf_user_sel['live.youtube_winsize'] = array('0' => 'ノーマルサイズ', '1' => 'ハーフサイズ'); - // }}} // {{{ ■実況中設定 diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index 5bb69ec9c..b2e5b9368 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -310,8 +310,6 @@ array('pre_thumb_limit', '画像URLの先読みサムネイルを一度に表示する制限数 (0で無制限)'), // array('pre_thumb_height', '画像サムネイルの縦の大きさを指定 (ピクセル)'), // array('pre_thumb_width', '画像サムネイルの横の大きさを指定 (ピクセル)'), - array('link_youtube', 'YouTubeのリンクをプレビュー表示
    (手動の場合はURLの横のshowをクリックして表示)'), - array('link_niconico', 'ニコニコ動画のリンクをプレビュー表示
    (手動の場合はURLの横のshowをクリックして表示)'), array('iframe_popup', 'HTMLポップアップ'), array('iframe_popup_event', 'HTMLポップアップをする場合のイベント'), array('iframe_popup_type', 'HTMLポップアップの種類'), @@ -891,7 +889,6 @@ array('live.view_type', 'レス表示の種類'), array('live.id_b', 'ID末尾の O (携帯) P (公式p2) Q (フルブラウザ) i (iPhone)を太字に'), array('live.highlight_chain', '連鎖ハイライト (連鎖範囲は ngaborn_chain_all にて設定)'), - array('live.youtube_winsize', 'YouTubeプレビュー表示のサイズ'), ); printEditConfGroupHtml($groupname, $conflist, $flags); } diff --git a/rep2/read_new.php b/rep2/read_new.php index abb6a4c60..9be0b2ac5 100755 --- a/rep2/read_new.php +++ b/rep2/read_new.php @@ -137,11 +137,13 @@ + + \n EOHEADER; @@ -163,16 +165,6 @@ EOP; } -if ($_conf['link_youtube'] == 2 || $_conf['link_niconico'] == 2) { - // +live YouTubeプレビュー表示のサイズ指定 - if ($_conf['live.youtube_winsize'] == 1) { - echo "\t\n"; - } else { - echo <<\n -EOP; - } -} if ($_conf['expack.am.enabled']) { echo <<\n From 7881b1b7c0943b3f12ef51efecf5a54daa38ec45 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 10 May 2015 11:42:57 +0900 Subject: [PATCH 160/339] v150510.1111 --- conf/conf.inc.php | 2 +- doc/README-774.txt | 12 ++++++++++++ lib/wiki/ReplaceImageUrlCtl.php | 3 +++ style/read_css.inc | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 3181db496..c731f87cf 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150508.0061', // rep2のバージョン + 'p2version' => '150510.1111', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index 10ea4ed9b..0866093cb 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -36,6 +36,8 @@ rep2-expack test https://github.com/orzisun/p2-php - レスポップアップから開いたレスポップアップをタップした際に元のレスポップアップが消えるのは仕様とさせていただきます。 - スクロールは指の終着点がポップアップ内になるようにすれば消えません。 * headline.2ch.netを最近読んだスレに追記しないように変更 +* Youtubeとニコニコ動画を表示する機能を削除 + - リンクプラグインを使用してください http://akid.s17.xrea.com/p2puki/index.phtml?%A5%EA%A5%F3%A5%AF%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3 その他今時のアレに合わせた修正等gitのコミットログも確認してください。 @@ -56,7 +58,17 @@ rep2-expack test https://github.com/orzisun/p2-php 本家p2と同じく、X11ライセンスです。 + ●ChangeLog + +150510.1111 +* Youtubeとニコ動の内蔵リンクプラグインを削除 +* Youtube関連の設定を全て削除 +* showボタンをリンクプラグインから利用出来るように変更 +* スマホ向けreadにPCのリンクプラグインが反映されるようにした +* 画像置換URLのEXTRACTの重複URLを無視するように変更 +* サービス終了に伴って使用できなくなった機能の設定を一部削除 + 150426.1033 * ガラケー向けreadのsyntax error修正 * 302が発生するURLでRSSリーダ正常動作しない不具合を修正 diff --git a/lib/wiki/ReplaceImageUrlCtl.php b/lib/wiki/ReplaceImageUrlCtl.php index 9dcc5d112..6c00a10ae 100644 --- a/lib/wiki/ReplaceImageUrlCtl.php +++ b/lib/wiki/ReplaceImageUrlCtl.php @@ -322,6 +322,9 @@ public function extractPage($url, $match, $replace, $referer, $source, $ident=nu $ret = self::_identByCacheData($ret, $this->cacheData[$url]['data'], $ident); } + // 結果から重複を削除 + $ret = array_unique($ret); + // 結果を永続キャッシュに保存 $this->storeCache($url, array('code' => $code, 'responseHeaders' => $req->getResponseHeader(), diff --git a/style/read_css.inc b/style/read_css.inc index 811cc2cf2..3788ee208 100644 --- a/style/read_css.inc +++ b/style/read_css.inc @@ -374,7 +374,7 @@ div.respopup div.reslist { .preview-video-switch { cursor: pointer; - width: 32px; + width: 30px; height: 12px; } From 4fa462c78b0b2df7284cb0defeedaacca38874a4 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 14 May 2015 00:10:27 +0900 Subject: [PATCH 161/339] =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=82=AF=E3=83=97?= =?UTF-8?q?=E3=83=A9=E3=82=B0=E3=82=A4=E3=83=B3=E3=81=AB$atag=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=9F=20=E8=BB=A2=E9=80=81?= =?UTF-8?q?=E3=83=9A=E3=83=BC=E3=82=B8(github.io)=E3=81=8CSSL=E3=81=AB?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=E3=81=97=E3=81=A6=E3=81=84=E3=82=8B=E3=81=AE?= =?UTF-8?q?=E3=81=A7rep2=E3=81=8CSSL=E3=81=AE=E6=99=82=E3=81=ABSSL?= =?UTF-8?q?=E3=82=92=E4=BD=BF=E3=81=86=E3=82=88=E3=81=86=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 繝ェ繝ウ繧ッ繝励Λ繧ー繧、繝ウ縺ョ隧ウ邏ー縺ッdoc/wiki/WIKI-774.txt --- conf/conf.inc.php | 2 +- doc/wiki/WIKI-774.txt | 13 +++++++++++++ lib/P2Ime.php | 4 ++-- lib/ShowThreadPc.php | 16 ++++++++-------- lib/wiki/LinkPluginCtl.php | 24 ++++++++++++++++++++++++ 5 files changed, 48 insertions(+), 11 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index c731f87cf..9a1af07b4 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -80,7 +80,7 @@ function p2_init() $_conf['expack.history_url'] = 'https://github.com/2ch774/p2-php/blob/master/doc/README-774.txt'; $_conf['expack.tgrep_url'] = 'http://page2.xrea.jp/tgrep/search'; $_conf['test.dig2ch_url'] = 'http://dig.2ch.net/'; - $_conf['expack.gate_php'] = 'http://2ch774.github.io/p2-php/gate.html'; + $_conf['expack.gate_php'] = '//2ch774.github.io/p2-php/gate.html'; $_conf['menu_php'] = 'menu.php'; $_conf['subject_php'] = 'subject.php'; $_conf['read_php'] = 'read.php'; diff --git a/doc/wiki/WIKI-774.txt b/doc/wiki/WIKI-774.txt index 4754fe606..0103620c0 100644 --- a/doc/wiki/WIKI-774.txt +++ b/doc/wiki/WIKI-774.txt @@ -16,3 +16,16 @@ data-video_height( data-video_style(オプション) iframeのstyle属性 data-video_harf(オプション) 1にするとwidthとheightが半分になります data-video_option(オプション) Javascriptの連想配列形式でiframeの追加属性を指定します。名前と値は必ずペアである必要があります。 + +● 定数 +リンクプラグイン内のReplaceに以下の項目を指定すると、その内容に変換します。 +・$atag rep2の設定と接続端末に応じた内容のaタグに変換します。 +$atagの一例 +Match +^(?:https?://(?:www\.|m\.)?youtube\.(?:com|jp)/(?:watch\?(?:.*&)?(?:v|video_id)=|v/)|(?:https?://youtu\.be/|https://www\.youtube-nocookie\.com/v/))([\w\-_]+)(?:.*)?$ + +Replace +$atag
    + +iframe_popup=「pでする」に設定した状態ででPCからアクセスした場合は$atagを +「
    (p)$str」に変換します。 \ No newline at end of file diff --git a/lib/P2Ime.php b/lib/P2Ime.php index 7514142b8..103c4e3ec 100644 --- a/lib/P2Ime.php +++ b/lib/P2Ime.php @@ -152,9 +152,9 @@ public function __construct($type = null, array $exceptions = null, $ignoreHttp case 'google': $this->_method = '_throughGoogleGateway'; if ($_conf['ktai'] && !$_conf['iphone']) { - $this->_gateUrl = 'http://www.google.co.jp/gwt/x?u='; + $this->_gateUrl = '//www.google.co.jp/gwt/x?u='; } else { - $this->_gateUrl = 'http://www.google.co.jp/url?q='; + $this->_gateUrl = '//www.google.co.jp/url?q='; } break; // }}} diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index 9733ad6e5..2f1911183 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -663,7 +663,7 @@ public function idFilter($idstr, $id) ), '', '&') . $_conf['k_at_a']; if ($_conf['iframe_popup']) { - return $this->iframePopup($filter_url, $idstr, $_conf['bbs_win_target_at']) . $num_ht; + return self::iframePopup($filter_url, $idstr, $_conf['bbs_win_target_at']) . $num_ht; } return "{$idstr}{$num_ht}"; } @@ -767,7 +767,7 @@ public function quoteResRange($full, $qsign, $appointed_num) if ($_conf['iframe_popup']) { $pop_url = $read_url . "&renzokupop=true"; - return $this->iframePopup(array($read_url, $pop_url), $full, $_conf['bbs_win_target_at'], 1); + return self::iframePopup(array($read_url, $pop_url), $full, $_conf['bbs_win_target_at'], 1); } // 普通にリンク @@ -797,7 +797,7 @@ public function quoteResRange($full, $qsign, $appointed_num) * @param bool $marker * @return string */ - public function iframePopup($url, $str, $attr = '', $mode = null, $marker = false) + static public function iframePopup($url, $str, $attr = '', $mode = null, $marker = false) { global $_conf; @@ -888,7 +888,7 @@ public function iframePopup($url, $str, $attr = '', $mode = null, $marker = fals */ public function iframePopupCallback($s) { - return $this->iframePopup(p2h($s[1], false), p2h($s[3], false), $s[2]); + return self::iframePopup(p2h($s[1], false), p2h($s[3], false), $s[2]); } // }}} @@ -1047,7 +1047,7 @@ public function imageHtmlPopup($img_url, $img_tag, $link_str) } $pops = ($_conf['iframe_popup'] == 1) ? $img_tag . $link_str : array($link_str, $img_tag); - return $this->iframePopup(array($img_url, $popup_url), $pops, $_conf['ext_win_target_at'], null, true); + return self::iframePopup(array($img_url, $popup_url), $pops, $_conf['ext_win_target_at'], null, true); } // }}} @@ -1208,7 +1208,7 @@ public function plugin_linkURL($url, $purl, $str) } else { $pop_url = $link_url; } - $link = $this->iframePopup(array($link_url, $pop_url), $str, $_conf['ext_win_target_at']); + $link = self::iframePopup(array($link_url, $pop_url), $str, $_conf['ext_win_target_at']); } else { $link = "{$str}"; } @@ -1241,7 +1241,7 @@ public function plugin_linkURL($url, $purl, $str) $check_mark_prefix = ''; $check_mark_suffix = ''; } - $brocra_checker_link = $this->iframePopup(array($brocra_checker_url, $brocra_pop_url), $check_mark, $_conf['ext_win_target_at']); + $brocra_checker_link = self::iframePopup(array($brocra_checker_url, $brocra_pop_url), $check_mark, $_conf['ext_win_target_at']); } else { $brocra_checker_link = "{$check_mark}"; } @@ -1302,7 +1302,7 @@ public function plugin_linkThread($url, $purl, $str) } else { $pop_url = $read_url . '&one=true'; } - return $this->iframePopup(array($read_url, $pop_url), $str, $_conf['bbs_win_target_at']); + return self::iframePopup(array($read_url, $pop_url), $str, $_conf['bbs_win_target_at']); } return "{$str}"; } diff --git a/lib/wiki/LinkPluginCtl.php b/lib/wiki/LinkPluginCtl.php index 9fbd0e4bc..3bb3c8c9f 100644 --- a/lib/wiki/LinkPluginCtl.php +++ b/lib/wiki/LinkPluginCtl.php @@ -73,6 +73,8 @@ public function save($data) public function replaceLinkToHTML($url, $str) { + global $_conf; + $this->setup(); $src = false; @@ -85,6 +87,28 @@ public function replaceLinkToHTML($url, $str) if (strstr($v['replace'], '$str')) { $src = str_replace('$str', $str, $src); } + if (strstr($v['replace'], '$atag')) { + // ime + if ($_conf['through_ime']) { + $link_url = P2Util::throughIme($url); + } else { + $link_url = $url; + } + // HTMLポップアップ(PCの時だけ) + if ($_conf['iframe_popup'] && !$_conf['ktai']) { + // *pm 指定の場合のみ、特別に手動転送指定を追加する + if (substr($_conf['through_ime'], -2) == 'pm') { + $pop_url = P2Util::throughIme($url, -1); + } else { + $pop_url = $link_url; + } + $atag = ShowThreadPc::iframePopup(array($link_url, $pop_url), $str, $_conf['ext_win_target_at']); + } else { + $atag = "{$str}"; + } + + $src = str_replace('$atag', $atag, $src); + } break; } } From 66f93bc89e6dc7c6b80ee6feb6afd66e06302d42 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 14 May 2015 17:18:06 +0900 Subject: [PATCH 162/339] =?UTF-8?q?=E9=AB=98=E9=80=9F=E5=8C=96=E3=83=91?= =?UTF-8?q?=E3=83=83=E3=83=81=E3=82=92=E9=81=A9=E7=94=A8=20http://anago.2c?= =?UTF-8?q?h.net/test/read.cgi/software/1431258367/35-36?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThread.php | 29 +++++++++++++++++++++++++---- lib/wiki/LinkPluginCtl.php | 20 ++++++++++++-------- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/lib/ShowThread.php b/lib/ShowThread.php index f54573e67..03131f0a4 100644 --- a/lib/ShowThread.php +++ b/lib/ShowThread.php @@ -1106,6 +1106,27 @@ public function transLink($str) * @return string */ public function transLinkDo(array $s) + { + // 結果のキャッシュ + static $cache = array(); + // sha1で囲んだ方が多少速くなるが低確率で衝突する + $key = sha1(serialize($s)); + // キャッシュしてない場合 + if (!isset($cache[$key])) { + // 結果を計算 + $cache[$key] = self::_transLinkDo($s); + } + return $cache[$key]; + } + // {{{ _transLinkDo() + + /** + * transLinkDoの子関数 + * + * @param array $s + * @return string + */ + private function _transLinkDo(array $s) { global $_conf; @@ -1132,13 +1153,13 @@ public function transLinkDo(array $s) return $s[3]; } - // 引用 + // 引用 } elseif ($s['quote']) { return preg_replace_callback( self::getAnchorRegex('/(%prefix%)?(%a_range%)/'), array($this, '_quoteResCallback'), $s['quote']); - // http or ftp のURL + // http or ftp のURL } elseif ($s['url']) { if ($_conf['ktai'] && $s[9] == 'ftp') { return $orig; @@ -1162,11 +1183,11 @@ public function transLinkDo(array $s) } } - // ID + // ID } elseif ($s['id'] && $_conf['flex_idpopup']) { // && $_conf['flex_idlink_k'] return $this->idFilter($s['id'], $s[12]); - // その他(予備) + // その他(予備) } else { return strip_tags($orig); } diff --git a/lib/wiki/LinkPluginCtl.php b/lib/wiki/LinkPluginCtl.php index 3bb3c8c9f..5accea500 100644 --- a/lib/wiki/LinkPluginCtl.php +++ b/lib/wiki/LinkPluginCtl.php @@ -79,13 +79,17 @@ public function replaceLinkToHTML($url, $str) $src = false; foreach ($this->data as $v) { - if (preg_match('{'.$v['match'].'}', $url)) { - $src = @preg_replace ('{'.$v['match'].'}', $v['replace'], $url); + // 置換を試行 + $temp = @preg_replace ('{'.$v['match'].'}', $v['replace'], $url, -1, $count); + // 置換された場合 + if ($count) { + $src = $temp; + $replace_pairs = array(); if (strstr($v['replace'], '$ime_url')) { - $src = str_replace('$ime_url', P2Util::throughIme($url), $src); + $replace_pairs['$ime_url'] = P2Util::throughIme($url); } if (strstr($v['replace'], '$str')) { - $src = str_replace('$str', $str, $src); + $replace_pairs['$str'] = $str; } if (strstr($v['replace'], '$atag')) { // ime @@ -102,13 +106,13 @@ public function replaceLinkToHTML($url, $str) } else { $pop_url = $link_url; } - $atag = ShowThreadPc::iframePopup(array($link_url, $pop_url), $str, $_conf['ext_win_target_at']); + $replace_pairs['$atag'] = ShowThreadPc::iframePopup(array($link_url, $pop_url), $str, $_conf['ext_win_target_at']); } else { - $atag = "{$str}"; + $replace_pairs['$atag'] = "{$str}"; } - - $src = str_replace('$atag', $atag, $src); } + // 変数を展開 + $src = strtr($src, $replace_pairs); break; } } From 3cf360f0967dba9a637a6da41d0a9c1ee8dc7295 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Fri, 1 May 2015 17:39:06 +0900 Subject: [PATCH 163/339] =?UTF-8?q?=E6=9C=80=E8=BF=91=E8=AA=AD=E3=82=93?= =?UTF-8?q?=E3=81=A0=E3=82=B9=E3=83=AC=E5=B1=A5=E6=AD=B4=E3=82=92=E8=A8=98?= =?UTF-8?q?=E9=8C=B2=E3=81=99=E3=82=8B=E9=9A=9B=E3=81=AB=E9=87=8D=E8=A4=87?= =?UTF-8?q?=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=82=92=E6=9C=AC=E5=AE=B6?= =?UTF-8?q?=E9=A2=A8=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/read.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rep2/read.php b/rep2/read.php index ba2957f0a..6ee1cf5b0 100644 --- a/rep2/read.php +++ b/rep2/read.php @@ -510,8 +510,8 @@ function recRecent($data) foreach ($lines as $l) { $lar = explode('<>', $l); $data_ar = explode('<>', $data); - if ($lar[1] == $data_ar[1]) { continue; } // keyで重複回避 - if (!$lar[1]) { continue; } // keyのないものは不正データ + if (!$lar[1] || !strlen($lar[11])) { continue; } // 不正データを削除 + if ($lar[1] == $data_ar[1] && $lar[11] == $data_ar[11]) { continue; } // key, bbsで重複回避 $neolines[] = $l; } } From 2ce759e490ea6e63bc1b5e75c2132fdbf4669d8e Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 17 May 2015 11:58:44 +0900 Subject: [PATCH 164/339] =?UTF-8?q?=E9=AB=98=E9=80=9F=E5=8C=96=E3=83=91?= =?UTF-8?q?=E3=83=83=E3=83=81=E3=82=92=E6=9B=B4=E6=96=B0=20http://anago.2c?= =?UTF-8?q?h.net/test/read.cgi/software/1431258367/54-55=20PC=E7=94=A8?= =?UTF-8?q?=E4=B8=80=E9=83=A8=E7=BA=8F=E3=82=81=E8=AA=AD=E3=81=BF=E3=81=8C?= =?UTF-8?q?=E5=8B=95=E4=BD=9C=E3=81=97=E3=81=AA=E3=81=84=E4=BB=B6=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThread.php | 29 ++++++++----- lib/wiki/ReplaceWordCtl.php | 82 ++++++++++++++++++++++++------------- rep2/js/subject.js | 2 +- 3 files changed, 73 insertions(+), 40 deletions(-) diff --git a/lib/ShowThread.php b/lib/ShowThread.php index 03131f0a4..decc97243 100644 --- a/lib/ShowThread.php +++ b/lib/ShowThread.php @@ -114,6 +114,13 @@ abstract class ShowThread */ static private $_anchorRegexParts = null; + /** + * transLinkDo() のキャッシュ + * + * @var array + */ + static private $_link_cache = array(); + // }}} // {{{ properties @@ -1107,16 +1114,18 @@ public function transLink($str) */ public function transLinkDo(array $s) { - // 結果のキャッシュ - static $cache = array(); - // sha1で囲んだ方が多少速くなるが低確率で衝突する - $key = sha1(serialize($s)); - // キャッシュしてない場合 - if (!isset($cache[$key])) { - // 結果を計算 - $cache[$key] = self::_transLinkDo($s); - } - return $cache[$key]; + if ($s['url']) { + // sha1で囲んだ方が多少速くなるが低確率で衝突する + $key = sha1(serialize($s)); + // キャッシュしてない場合 + if (!isset(self::$_link_cache[$key])) { + // 結果を計算 + self::$_link_cache[$key] = self::_transLinkDo($s); + } + return self::$_link_cache[$key]; + } else { + return self::_transLinkDo($s); + } } // {{{ _transLinkDo() diff --git a/lib/wiki/ReplaceWordCtl.php b/lib/wiki/ReplaceWordCtl.php index 7e75136e7..dae84732f 100644 --- a/lib/wiki/ReplaceWordCtl.php +++ b/lib/wiki/ReplaceWordCtl.php @@ -5,12 +5,12 @@ load() データを読み込んで返す(自動的に実行される) clear() データを削除 */ - class ReplaceWordCtl { protected $isLoaded = false; protected $data = array(); - + protected $data_filtered = array(); + protected $data_nocache = array(); public function setup() { if (!$this->isLoaded) { @@ -53,7 +53,9 @@ public function loadFile($cont) $lines = array(); $path = $_conf['pref_dir'].'/'.$this->filename($cont); + $this->data_nocache[$cont] = false; if ($lines = @file($path)) { + $check_mode = $_conf['ktai'] ? 1 : 2; foreach ($lines as $l) { if (substr($l, 0, 1) === ';' || substr($l, 0, 1) === "'" || substr($l, 0, 1) === '#' || substr($l, 0, 2) === '//') { @@ -71,6 +73,13 @@ public function loadFile($cont) ); $this->data[$cont][] = $ar; + if ($lar[2] != $check_mode) { + $this->data_filtered[$cont][] = $ar; + // replaceにレス固有の変数$i($id, $id_base64)が含まれる場合 + if (!$this->data_nocache[$cont] && strpos($lar[1], '$' !== FALSE)) { + $this->data_nocache[$cont] = true; + } + } } } return $this->data[$cont]; @@ -110,47 +119,66 @@ public function save($data) */ public function replace($cont, $aThread, $ares, $i) { - global $_conf; + // キャッシュ + /* + キャッシュが有効になる条件 + ・replaceで$i, $id, $id_base64を使ってない + これらを使うと置換ワードの結果は同じデータでもレス番号ごとに異なる結果になるため、キャッシュできなくなる。 + + キャッシュの働きやすさはメール欄>名前欄>>本文>>>>>>>>日付欄といったところ。 + */ + static $cache = array('name' => array(), 'mail' => array(), 'date' => array(), 'msg' => array()); $this->setup(); $resar = $aThread->explodeDatLine($ares); - $name = $resar[0]; - $mail = $resar[1]; - $date_id = $resar[2]; - $msg = $resar[3]; switch ($cont) { case 'name': - $word = $name; + $word = $resar[0]; break; case 'mail': - $word = $mail; + $word = $resar[1]; break; case 'date': - $word = $date_id; + $word = $resar[2]; break; case 'msg': - $word = $msg; + $word = $resar[3]; break; // エラー default: // そのまま返す return $word; } + // 置換設定が無い場合はそのまま返す - if (!isset($this->data[$cont])) { + if (!isset($this->data_filtered[$cont])) { return $word; } + // キャッシュ可能な場合 + if (!$this->data_nocache[$cont]) { + // キャッシュ + // sha1を使うと速くなるが低確率で衝突する + // sha1の計算結果自体をキャッシュしても速くならなかった + $cache_ = &$cache[$cont][sha1($word)]; + // キャッシュがあればそれを返す + if (isset($cache_)) { + return $cache_; + } + } - preg_match('|ID: ?([0-9A-Za-z/.+]{8,11})|',$date_id, $matches); - $id = $matches[1]; - foreach ($this->data[$cont] as $v) { - // 携帯モードでデータがPC用なら飛ばす - if ($_conf['ktai'] && $v['mode'] == 1) continue; - // PCモードでデータが携帯用なら飛ばす - if (!$_conf['ktai'] && $v['mode'] == 2) continue; - + preg_match('|ID: ?([0-9A-Za-z/.+]{8,11})|',$resar[2], $matches); + $replace_pairs = array( + '$ttitle_hd' => $aThread->ttitle_hd, + '$host' => $aThread->host, + '$bbs' => $aThread->bbs, + '$key' => $aThread->key, + '$id' => $matches[1], + '$id_base64' => base64_encode($matches[1]), + '$i' => $i + ); + foreach ($this->data_filtered[$cont] as $v) { /* Match用の変数展開(用途が思い浮かばないのでコメントアウト) $v['match'] = str_replace ('$i', $i, $v['match']); $v['match'] = str_replace ('$ttitle', $aThread->ttitle, $v['match']); @@ -169,18 +197,14 @@ public function replace($cont, $aThread, $ares, $i) これ自体に正規表現が入っていたらどうしよう。 実質的に使うのは$i, $host, $bbs, $key, $date_idくらいだから問題ないだろうけど。 */ - $v['replace'] = strtr($v['replace'], array( - '$ttitle_hd' => $aThread->ttitle_hd, - '$host' => $aThread->host, - '$bbs' => $aThread->bbs, - '$key' => $aThread->key, - '$id' => $id, - '$id_base64' => base64_encode($id), - '$i' => $i - )); + $v['replace'] = strtr($v['replace'], $replace_pairs); $word = @preg_replace ('{'.$v['match'].'}', $v['replace'], $word); } + // キャッシュ可能ならキャッシュする + if (!$this->data_nocache[$cont]) { + $cache_ = $word; + } return $word; } } diff --git a/rep2/js/subject.js b/rep2/js/subject.js index 2c9f58328..fad98fbbf 100644 --- a/rep2/js/subject.js +++ b/rep2/js/subject.js @@ -27,7 +27,7 @@ rep2.subject.changeNewAllColor = function () { rep2.subject.jumpMatomeLimit = function (matome_url) { var unum_limit = window.prompt('新着が指定した件数以下のスレだけまとめ読みします。','100'); if (unum_limit) { - matome_url +='&unum_limit='+unum_limit; + matome_url +='&unum_limit='+unum_limit; if (top == self) { window.location = matome_url; } else { From ec60c1f03c87680d1681d4444dce4ceca4569140 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 18 May 2015 11:22:45 +0900 Subject: [PATCH 165/339] =?UTF-8?q?=E3=82=BD=E3=83=BC=E3=82=B9=E6=95=B4?= =?UTF-8?q?=E5=BD=A2=E6=A9=9F=E8=83=BD=E3=82=92=E6=9B=B4=E6=96=B0=20http:/?= =?UTF-8?q?/anago.2ch.net/test/read.cgi/software/1431258367/59?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/editpref.php | 2 +- rep2/post.php | 36 +++++++++++++++++++----------------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/rep2/editpref.php b/rep2/editpref.php index 88ac7d8dd..cea008990 100644 --- a/rep2/editpref.php +++ b/rep2/editpref.php @@ -8,7 +8,7 @@ $_login->authorize(); // ユーザ認証 $deltitles = array( - 'cookie' => 'Ccookie', + 'cookie' => 'Cookie', 'matome' => '新着まとめ読み', 'recent' => '最近読んだスレ', 'reshist' => '書き込み履歴', diff --git a/rep2/post.php b/rep2/post.php index a35b337b8..b7b6fd104 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -64,28 +64,33 @@ // タブをスペースに $MESSAGE = tab2space($MESSAGE); // 特殊文字を実体参照に - $MESSAGE = p2h($MESSAGE); + $MESSAGE = strtr(p2h($MESSAGE), array( + '"' => '"', // " + '&' => '&', // & + ''' => ''', // ' + '<' => '<', // < + '>' => '>', // > + )); // 自動URLリンク回避 $MESSAGE = str_replace('tp://', 'tp://', $MESSAGE); // 行頭のスペースを実体参照に - $MESSAGE = preg_replace('/^ /m', ' ', $MESSAGE); + $MESSAGE = preg_replace('/^ /m', ' ', $MESSAGE); // 二つ続くスペースの一つ目を実体参照に - $MESSAGE = preg_replace('/(? Date: Fri, 22 May 2015 13:08:15 +0900 Subject: [PATCH 166/339] =?UTF-8?q?plugin=5FimageCache2=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 逕サ蜒冗スョ謠帙↓荳閾エ縺励↑縺ФRL縺ョ蜃ヲ逅縺継lugin_replaceImageUrl竊恥lugin_imageCache2縺ィ縺ェ縺」縺ヲ莠悟コヲ謇矩俣縺ェ縺ョ縺ァ蜈ィ縺ヲ荳譛ャ蛹 --- lib/ShowThreadI.php | 184 ---------------------------- lib/ShowThreadK.php | 178 --------------------------- lib/ShowThreadPc.php | 206 -------------------------------- lib/wiki/ReplaceImageUrlCtl.php | 3 +- rep2/js/respopup_iphone.js | 2 +- 5 files changed, 2 insertions(+), 571 deletions(-) diff --git a/lib/ShowThreadI.php b/lib/ShowThreadI.php index 0e89d6b6f..2e3976293 100644 --- a/lib/ShowThreadI.php +++ b/lib/ShowThreadI.php @@ -56,9 +56,6 @@ public function __construct(ThreadRead $aThread, $matome = false) } if (isset($GLOBALS['replaceImageUrlCtl'])) { $this->_url_handlers[] = 'plugin_replaceImageUrl'; - } - if (P2_IMAGECACHE_AVAILABLE == 2) { - $this->_url_handlers[] = 'plugin_imageCache2'; } elseif ($_conf['mobile.use_picto']) { $this->_url_handlers[] = 'plugin_viewImage'; } @@ -900,187 +897,6 @@ public function plugin_viewImage($url, $purl, $str) return false; } - // }}} - // {{{ plugin_imageCache2() - - /** - * 画像URLのImageCache2変換 - */ - public function plugin_imageCache2($url, $purl, $str) - { - global $_conf; - global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit_k; - - if (P2Util::isUrlWikipediaJa($url)) { - return false; - } - - if (preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $purl[0]) && empty($purl['query'])) { - // インラインプレビューの有効判定 - if ($pre_thumb_unlimited || $pre_thumb_ignore_limit || $pre_thumb_limit_k > 0) { - $inline_preview_flag = true; - $inline_preview_done = false; - } else { - $inline_preview_flag = false; - $inline_preview_done = false; - } - - $url_ht = $url; - $url = $purl[0]; - $url_en = rawurlencode($url); - $img_str = null; - $img_id = null; - - $icdb = new ImageCache2_DataObject_Images(); - - // r=0:リンク;r=1:リダイレクト;r=2:PHPで表示 - // t=0:オリジナル;t=1:PC用サムネイル;t=2:携帯用サムネイル;t=3:中間イメージ - $img_url = 'ic2.php?r=0&t=2&uri=' . $url_en; - $img_url2 = 'ic2.php?r=0&t=2&id='; - $src_url = 'ic2.php?r=1&t=0&uri=' . $url_en; - $src_url2 = 'ic2.php?r=1&t=0&id='; - $src_exists = false; - - // お気にスレ自動画像ランク - $rank = null; - if ($_conf['expack.ic2.fav_auto_rank']) { - $rank = $this->getAutoFavRank(); - } - - // DBに画像情報が登録されていたとき - if ($icdb->get($url)) { - $img_id = $icdb->id; - - // ウィルスに感染していたファイルのとき - if ($icdb->mime == 'clamscan/infected') { - return '[IC2:ウィルス警告]'; - } - // あぼーん画像のとき - if ($icdb->rank < 0) { - return '[IC2:あぼーん画像]'; - } - - // オリジナルの有無を確認 - if (file_exists($this->thumbnailer->srcPath($icdb->size, $icdb->md5, $icdb->mime))) { - $src_exists = true; - $img_url = $img_url2 . $icdb->id; - $src_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); - } else { - $img_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); - $src_url = $src_url2 . $icdb->id; - } - - // インラインプレビューが有効のとき - $prv_url = null; - if ($this->thumbnailer->ini['General']['inline'] == 1) { - // PCでread_new_k.phpにアクセスしたとき等 - if (!isset($this->inline_prvw) || !is_object($this->inline_prvw)) { - $this->inline_prvw = $this->thumbnailer; - } - $prv_url = $this->inline_prvw->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); - - // サムネイル表示制限数以内のとき - if ($inline_preview_flag) { - // プレビュー画像が作られているかどうかでimg要素の属性を決定 - if (file_exists($this->inline_prvw->thumbPath($icdb->size, $icdb->md5, $icdb->mime))) { - $prv_size = explode('x', $this->inline_prvw->calc($icdb->width, $icdb->height)); - $img_str = ""; - } else { - $r_type = ($this->thumbnailer->ini['General']['redirect'] == 1) ? 1 : 2; - if ($src_exists) { - $prv_url = "ic2.php?r={$r_type}&t=1&id={$icdb->id}"; - } else { - $prv_url = "ic2.php?r={$r_type}&t=1&uri={$url_en}"; - } - $prv_url .= $this->img_dpr_query; - if ($this->img_dpr === 1.5 || $this->img_dpr === 2.0) { - $prv_onload = sprintf(' onload="autoAdjustImgSize(this, %f);"', $this->img_dpr); - } else { - $prv_onload = ''; - } - $img_str = ""; - } - $inline_preview_done = true; - } else { - $img_str = '[p2:既得画像(ランク:' . $icdb->rank . ')]'; - } - } - - // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 - if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false) { - $update = new ImageCache2_DataObject_Images(); - if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { - $update->memo = $this->img_memo . ' ' . $icdb->memo; - } else { - $update->memo = $this->img_memo; - } - $update->whereAddQuoted('uri', '=', $url); - } - - // expack.ic2.fav_auto_rank_override の設定とランク条件がOKなら - // お気にスレ自動画像ランクを上書き更新 - if ($rank !== null && self::isAutoFavRankOverride($icdb->rank, $rank)) { - if ($update === null) { - $update = new ImageCache2_DataObject_Images(); - $update->whereAddQuoted('uri', '=', $url); - } - $update->rank = $rank; - } - - if ($update !== null) { - $update->update(); - } - - // 画像がキャッシュされていないとき - // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める - } else { - // 画像がブラックリストorエラーログにあるか確認 - if (false !== ($errcode = $icdb->ic2_isError($url))) { - return "[IC2:エラー({$errcode})]"; - } - - // インラインプレビューが有効で、サムネイル表示制限数以内なら - if ($this->thumbnailer->ini['General']['inline'] == 1 && $inline_preview_flag) { - $rank_str = ($rank !== null) ? '&rank=' . $rank : ''; - $img_str = "img_memo_query}{$rank_str}\" width=\"{$prvw_size[0]}\" height=\"{$prvw_size[1]}\">"; - $inline_preview_done = true; - } else { - $img_url .= $this->img_memo_query; - } - } - - // 表示数制限をデクリメント - if ($inline_preview_flag && $inline_preview_done) { - $pre_thumb_limit_k--; - } - - if (!empty($_SERVER['REQUEST_URI'])) { - $backto = '&from=' . rawurlencode($_SERVER['REQUEST_URI']); - } else { - $backto = ''; - } - - if (is_null($img_str)) { - return sprintf('[IC2:%s:%s]', - $img_url, - $backto, - p2h($purl['host']), - p2h(basename($purl['path'])) - ); - } - - $img_title = p2h($purl['host']) - . ' ' - . p2h(basename($purl['path'])); - return "{$img_str}" - //. ' '; - } - - return false; - } - // }}} // {{{ plugin_replaceImageUrl() diff --git a/lib/ShowThreadK.php b/lib/ShowThreadK.php index ce0bad8a3..6343effd4 100644 --- a/lib/ShowThreadK.php +++ b/lib/ShowThreadK.php @@ -53,9 +53,6 @@ public function __construct(ThreadRead $aThread, $matome = false) // +Wiki if (isset($GLOBALS['replaceImageUrlCtl'])) { $this->_url_handlers[] = 'plugin_replaceImageUrl'; - } - if (P2_IMAGECACHE_AVAILABLE == 2) { - $this->_url_handlers[] = 'plugin_imageCache2'; } elseif ($_conf['mobile.use_picto']) { $this->_url_handlers[] = 'plugin_viewImage'; } @@ -856,181 +853,6 @@ public function plugin_viewImage($url, $purl, $str) return false; } - // }}} - // {{{ plugin_imageCache2() - - /** - * 画像URLのImageCache2変換 - */ - public function plugin_imageCache2($url, $purl, $str) - { - global $_conf; - global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit_k; - - if (P2Util::isUrlWikipediaJa($url)) { - return false; - } - - if (preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $purl[0]) && empty($purl['query'])) { - // インラインプレビューの有効判定 - if ($pre_thumb_unlimited || $pre_thumb_ignore_limit || $pre_thumb_limit_k > 0) { - $inline_preview_flag = true; - $inline_preview_done = false; - } else { - $inline_preview_flag = false; - $inline_preview_done = false; - } - - $url_ht = $url; - $url = $purl[0]; - $url_en = rawurlencode($url); - $img_str = null; - $img_id = null; - - $icdb = new ImageCache2_DataObject_Images(); - - // r=0:リンク;r=1:リダイレクト;r=2:PHPで表示 - // t=0:オリジナル;t=1:PC用サムネイル;t=2:携帯用サムネイル;t=3:中間イメージ - $img_url = 'ic2.php?r=0&t=2&uri=' . $url_en; - $img_url2 = 'ic2.php?r=0&t=2&id='; - $src_url = 'ic2.php?r=1&t=0&uri=' . $url_en; - $src_url2 = 'ic2.php?r=1&t=0&id='; - $src_exists = false; - - // お気にスレ自動画像ランク - $rank = null; - if ($_conf['expack.ic2.fav_auto_rank']) { - $rank = $this->getAutoFavRank(); - } - - // DBに画像情報が登録されていたとき - if ($icdb->get($url)) { - $img_id = $icdb->id; - - // ウィルスに感染していたファイルのとき - if ($icdb->mime == 'clamscan/infected') { - return '[IC2:ウィルス警告]'; - } - // あぼーん画像のとき - if ($icdb->rank < 0) { - return '[IC2:あぼーん画像]'; - } - - // オリジナルの有無を確認 - if (file_exists($this->thumbnailer->srcPath($icdb->size, $icdb->md5, $icdb->mime))) { - $src_exists = true; - $img_url = $img_url2 . $icdb->id; - $src_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); - } else { - $img_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); - $src_url = $src_url2 . $icdb->id; - } - - // インラインプレビューが有効のとき - $prv_url = null; - if ($this->thumbnailer->ini['General']['inline'] == 1) { - // PCでread_new_k.phpにアクセスしたとき等 - if (!isset($this->inline_prvw) || !is_object($this->inline_prvw)) { - $this->inline_prvw = $this->thumbnailer; - } - $prv_url = $this->inline_prvw->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); - - // サムネイル表示制限数以内のとき - if ($inline_preview_flag) { - // プレビュー画像が作られているかどうかでimg要素の属性を決定 - if (file_exists($this->inline_prvw->thumbPath($icdb->size, $icdb->md5, $icdb->mime))) { - $prv_size = explode('x', $this->inline_prvw->calc($icdb->width, $icdb->height)); - $img_str = ""; - } else { - $r_type = ($this->thumbnailer->ini['General']['redirect'] == 1) ? 1 : 2; - if ($src_exists) { - $prv_url = "ic2.php?r={$r_type}&t=1&id={$icdb->id}"; - } else { - $prv_url = "ic2.php?r={$r_type}&t=1&uri={$url_en}"; - } - $prv_url .= $this->img_dpr_query; - if ($this->img_dpr === 1.5 || $this->img_dpr === 2.0) { - $prv_onload = sprintf(' onload="autoAdjustImgSize(this, %f);"', $this->img_dpr); - } else { - $prv_onload = ''; - } - $img_str = ""; - } - $inline_preview_done = true; - } else { - $img_str = '[p2:既得画像(ランク:' . $icdb->rank . ')]'; - } - } - - // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 - if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false) { - $update = new ImageCache2_DataObject_Images(); - if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { - $update->memo = $this->img_memo . ' ' . $icdb->memo; - } else { - $update->memo = $this->img_memo; - } - $update->whereAddQuoted('uri', '=', $url); - } - - // expack.ic2.fav_auto_rank_override の設定とランク条件がOKなら - // お気にスレ自動画像ランクを上書き更新 - if ($rank !== null && self::isAutoFavRankOverride($icdb->rank, $rank)) { - if ($update === null) { - $update = new ImageCache2_DataObject_Images(); - $update->whereAddQuoted('uri', '=', $url); - } - $update->rank = $rank; - } - - if ($update !== null) { - $update->update(); - } - - // 画像がキャッシュされていないとき - // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める - } else { - // 画像がブラックリストorエラーログにあるか確認 - if (false !== ($errcode = $icdb->ic2_isError($url))) { - return "[IC2:エラー({$errcode})]"; - } - - // インラインプレビューが有効で、サムネイル表示制限数以内なら - if ($this->thumbnailer->ini['General']['inline'] == 1 && $inline_preview_flag) { - $rank_str = ($rank !== null) ? '&rank=' . $rank : ''; - $img_str = "img_memo_query}{$rank_str}\" width=\"{$prvw_size[0]}\" height=\"{$prvw_size[1]}\">"; - $inline_preview_done = true; - } else { - $img_url .= $this->img_memo_query; - } - } - - // 表示数制限をデクリメント - if ($inline_preview_flag && $inline_preview_done) { - $pre_thumb_limit_k--; - } - - if (!empty($_SERVER['REQUEST_URI'])) { - $backto = '&from=' . rawurlencode($_SERVER['REQUEST_URI']); - } else { - $backto = ''; - } - - if (is_null($img_str)) { - return sprintf('[IC2:%s:%s]', - $img_url, - $backto, - p2h($purl['host']), - p2h(basename($purl['path'])) - ); - } - - return "{$img_str}"; - } - - return false; - } - // }}} // {{{ plugin_replaceImageUrl() diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index 2f1911183..353ec8889 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -66,19 +66,11 @@ public function __construct($aThread, $matome = false) } if (isset($GLOBALS['replaceImageUrlCtl'])) { $this->_url_handlers[] = 'plugin_replaceImageUrl'; - } - if (P2_IMAGECACHE_AVAILABLE == 2) { - $this->_url_handlers[] = 'plugin_imageCache2'; } elseif ($_conf['preview_thumbnail']) { $this->_url_handlers[] = 'plugin_viewImage'; } $this->_url_handlers[] = 'plugin_linkURL'; - // imepitaのURLを加工してImageCache2させるプラグインを登録 - if (P2_IMAGECACHE_AVAILABLE == 2) { - $this->addURLHandler(array($this, 'plugin_imepitaToImageCache2')); - } - // サムネイル表示制限数を設定 if (!isset($GLOBALS['pre_thumb_unlimited']) || !isset($GLOBALS['pre_thumb_limit'])) { if (isset($_conf['pre_thumb_limit']) && $_conf['pre_thumb_limit'] > 0) { @@ -1366,180 +1358,6 @@ public function plugin_viewImage($url, $purl, $str) return false; } - // }}} - // {{{ plugin_imageCache2() - - /** - * ImageCache2サムネイル変換 - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_imageCache2($url, $purl, $str, - $force = false, - $referer = null) - { - static $serial = 0; - - global $_conf; - global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit; - - if (P2Util::isUrlWikipediaJa($url)) { - return false; - } - - if ((preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $purl[0]) && empty($purl['query'])) || $force) { - // 準備 - $serial++; - $thumb_id = 'thumbs' . $serial . $this->thumb_id_suffix; - $tmp_thumb = './img/ic_load.png'; - $url_ht = $url; - $url = $purl[0]; - $url_en = rawurlencode($url) . - ($referer ? '&ref=' . rawurlencode($referer) : ''); - $img_id = null; - - $icdb = new ImageCache2_DataObject_Images(); - - // r=0:リンク;r=1:リダイレクト;r=2:PHPで表示 - // t=0:オリジナル;t=1:PC用サムネイル;t=2:携帯用サムネイル;t=3:中間イメージ - $img_url = 'ic2.php?r=1&uri=' . $url_en; - $thumb_url = 'ic2.php?r=1&t=1&uri=' . $url_en; - // お気にスレ自動画像ランク - $rank = null; - if ($_conf['expack.ic2.fav_auto_rank']) { - $rank = $this->getAutoFavRank(); - if ($rank !== null) { - $thumb_url .= '&rank=' . $rank; - } - } - - // DBに画像情報が登録されていたとき - if ($icdb->get($url)) { - $img_id = $icdb->id; - - // ウィルスに感染していたファイルのとき - if ($icdb->mime == 'clamscan/infected') { - return " {$str}"; - } - // あぼーん画像のとき - if ($icdb->rank < 0) { - return " {$str}"; - } - - // オリジナルがキャッシュされているときは画像を直接読み込む - if (file_exists($this->thumbnailer->srcPath($icdb->size, $icdb->md5, $icdb->mime))) { - $img_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); - $cached = true; - } else { - $cached = false; - } - - // サムネイルが作成されていているときは画像を直接読み込む - if (file_exists($this->thumbnailer->thumbPath($icdb->size, $icdb->md5, $icdb->mime))) { - $thumb_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); - // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 - if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false){ - $update = new ImageCache2_DataObject_Images(); - if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { - $update->memo = $this->img_memo . ' ' . $icdb->memo; - } else { - $update->memo = $this->img_memo; - } - $update->whereAddQuoted('uri', '=', $url); - } - - // expack.ic2.fav_auto_rank_override の設定とランク条件がOKなら - // お気にスレ自動画像ランクを上書き更新 - if ($rank !== null && - self::isAutoFavRankOverride($icdb->rank, $rank)) { - if ($update === null) { - $update = new ImageCache2_DataObject_Images(); - $update->whereAddQuoted('uri', '=', $url); - } - $update->rank = $rank; - } - - if ($update !== null) { - $update->update(); - } - } - - // サムネイルの画像サイズ - $thumb_size = $this->thumbnailer->calc($icdb->width, $icdb->height); - $thumb_size = preg_replace('/(\d+)x(\d+)/', 'width="$1" height="$2"', $thumb_size); - $tmp_thumb = './img/ic_load1.png'; - - $orig_img_url = $img_url; - $orig_thumb_url = $thumb_url; - - // 画像がキャッシュされていないとき - // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める - } else { - // 画像がブラックリストorエラーログにあるか確認 - if (false !== ($errcode = $icdb->ic2_isError($url))) { - return " {$str}"; - } - - $cached = false; - - $orig_img_url = $img_url; - $orig_thumb_url = $thumb_url; - $img_url .= $this->img_memo_query; - $thumb_url .= $this->img_memo_query; - $thumb_size = ''; - $tmp_thumb = './img/ic_load2.png'; - } - - // キャッシュされておらず、表示数制限が有効のとき - if (!$cached && !$pre_thumb_unlimited && !$pre_thumb_ignore_limit) { - // 表示制限を超えていたら、表示しない - // 表示制限を超えていなければ、表示制限カウンタを下げる - if ($pre_thumb_limit <= 0) { - $show_thumb = false; - } else { - $show_thumb = true; - $pre_thumb_limit--; - } - } else { - $show_thumb = true; - } - - // 表示モード - if ($show_thumb) { - $img_tag = ""; - if ($_conf['iframe_popup']) { - $view_img = $this->imageHtmlPopup($img_url, $img_tag, $str); - } else { - $view_img = "{$img_tag}{$str}"; - } - } else { - $img_tag = ""; - $view_img = "{$img_tag}{$str}"; - } - - // ソースへのリンクをime付きで表示 - if ($_conf['expack.ic2.enabled'] && $_conf['expack.ic2.through_ime']) { - $ime_url = P2Util::throughIme($url); - if ($_conf['iframe_popup'] == 3) { - $ime_mark = ''; - } else { - $ime_mark = '[ime]'; - } - $view_img .= " {$ime_mark}"; - } - - $view_img .= ''; - - return $view_img; - } - - return false; - } - // }}} // {{{ plugin_replaceImageUrl() @@ -1712,30 +1530,6 @@ public function plugin_linkPlugin($url, $purl, $str) return $GLOBALS['linkPluginCtl']->replaceLinkToHTML($url, $str); } - // }}} - // {{{ plugin_imepitaToImageCache2() - - /** - * imepitaのURLを加工してImageCache2させるプラグイン - * - * @param string $url - * @param array $purl - * @param string $str - * @return string|false - */ - public function plugin_imepitaToImageCache2($url, $purl, $str) - { - if (preg_match('{^https?://imepita\.jp/(?:image/)?(\d{8}/\d{6})}i', - $purl[0], $m) && empty($purl['query'])) { - $_url = 'http://imepita.jp/image/' . $m[1]; - $_purl = @parse_url($_url); - $_purl[0] = $_url; - return $this->plugin_imageCache2($_url, $_purl, $str, true, $url); - } - return false; - } - - // }}} // }}} // {{{ getQuotebacksJson() diff --git a/lib/wiki/ReplaceImageUrlCtl.php b/lib/wiki/ReplaceImageUrlCtl.php index 6c00a10ae..b693b2ddf 100644 --- a/lib/wiki/ReplaceImageUrlCtl.php +++ b/lib/wiki/ReplaceImageUrlCtl.php @@ -222,7 +222,7 @@ public function replaceImageUrl($url) break; } } - /* plugin_imageCache2で処理させるためコメントアウト + /* plugin_imageCache2で処理させるためコメントアウト ← plugin_imageCache2を削除する為復活 by 2ch774*/ // ヒットしなかった場合 if (!$return[0]) { // 画像っぽいURLの場合 @@ -231,7 +231,6 @@ public function replaceImageUrl($url) $return[0]['referer'] = ''; } } - */ return $this->_reply($url, $return); } diff --git a/rep2/js/respopup_iphone.js b/rep2/js/respopup_iphone.js index 9bf7ad3c5..04634850e 100644 --- a/rep2/js/respopup_iphone.js +++ b/rep2/js/respopup_iphone.js @@ -97,7 +97,7 @@ ipoputil.callback = function(req, url, popid, yOffset) { $container.css('top',yOffset.toString() + 'px'); $container.css('z-index',ipoputil.getZ()); //respop自体等を内部扱いにしておく - $container.skOuterClick(ipoputil.getDeactivator($container, url),$("[id^=_respop]"),$('#ic2-info-body'),$('#ic2-info-closer'),$('#spm'),$('#spm-closer')); + $container.skOuterClick(ipoputil.getDeactivator($container, url),$("[id^=_respop]"),$('.close-button'),$('#ic2-info-body'),$('#ic2-info-closer'),$('#spm'),$('#spm-closer')); $closer.addClass('close-button'); $closer.attr('src', 'img/iphone/close.png'); From 45cf829f1829b42eca3d0d37861c8769b4069a02 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 21 Jun 2015 23:54:44 +0900 Subject: [PATCH 167/339] =?UTF-8?q?=E9=AB=98=E9=80=9F=E5=8C=96=E3=83=91?= =?UTF-8?q?=E3=83=83=E3=83=81=E6=9B=B4=E6=96=B0=20http://anago.2ch.net/tes?= =?UTF-8?q?t/read.cgi/software/1431258367/120?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/NgAbornCtl.php | 93 +++++++++++++++++++++------------------------- 1 file changed, 43 insertions(+), 50 deletions(-) diff --git a/lib/NgAbornCtl.php b/lib/NgAbornCtl.php index 804020c24..d1162979e 100644 --- a/lib/NgAbornCtl.php +++ b/lib/NgAbornCtl.php @@ -244,9 +244,11 @@ static protected function _readNgAbornFromFile($filename) { $data = array(); if ($lines = FileCtl::file_read_lines($file)) { + // 外に出して高速化 + $replace_pairs = array('<' => '<', '>' => '>'); foreach ($lines as $l) { $lar = explode("\t", trim($l)); - if (strlen($lar[0]) == 0) { + if ($lar[0] === '') { continue; } $ar = array( @@ -264,64 +266,55 @@ static protected function _readNgAbornFromFile($filename) { $data[] = $ar; continue; } - - // 板縛り - if (preg_match('!(.+?)!', $ar['word'], $matches)) { - $ar['bbs'] = explode(',', $matches[1]); - } - $ar['word'] = preg_replace('!(.*)!', '', $ar['word']); - - // タイトル縛り - if (preg_match('!(.+?)!', $ar['word'], $matches)) { - $ar['title'] = $matches[1]; - } - $ar['word'] = preg_replace('!(.*)!', '', $ar['word']); - - // 正規表現 - if (preg_match('/^<(mb_ereg|preg_match|regex)(:[imsxeADSUXu]+)?>(.+)$/', $ar['word'], $matches)) { - // マッチング関数とパターンを設定 - if ($matches[1] == 'regex') { - if (P2_MBREGEX_AVAILABLE) { - $ar['regex'] = 'mb_ereg'; - $ar['word'] = $matches[3]; - } else { - $ar['regex'] = 'preg_match'; - $ar['word'] = '/' . str_replace('/', '\\/', $matches[3]) . '/'; - } - } else { - $ar['regex'] = $matches[1]; - $ar['word'] = $matches[3]; + // 内容解析(edit_aborn_word.php通りなら必ずこの順番になる) + if (preg_match('{^(?:<(regex|regexi|i)>)?(?:(.+?))?(?:(.+?))?(.+)$}s', $ar['word'], $matches)) { + switch ($matches[1]) { + // 正規表現 + case "regex": + if (P2_MBREGEX_AVAILABLE) { + $ar['regex'] = 'mb_ereg'; + $ar['word'] = $matches[4]; + } else { + $ar['regex'] = 'preg_match'; + $ar['word'] = '/' . str_replace('/', '\\/', $matches[4]) . '/'; + } + break; + // 正規表現・大文字小文字を無視 + case 'regexi': + if (P2_MBREGEX_AVAILABLE) { + $ar['regex'] = 'mb_eregi'; + $ar['word'] = $matches[4]; + } else { + $ar['regex'] = 'preg_match'; + $ar['word'] = '/' . str_replace('/', '\\/', $matches[4]) . '/i'; + } + break; + // 大文字小文字を無視 + case 'i': + $ar['word'] = $matches[4]; + $ar['ignorecase'] = true; + default: + // エスケープされていない特殊文字をエスケープ + // $ar['word'] = p2h($ar['word'], false); + // 2chの仕様上、↑は期待通りの結果が得られないことが多いので、<>だけ実体参照にする + $ar['word'] = strtr($matches[4], $replace_pairs); + break; } - // 大文字小文字を無視 - if ($matches[2] && strpos($matches[2], 'i') !== false) { - if ($ar['regex'] == 'mb_ereg') { - $ar['regex'] = 'mb_eregi'; - } else { - $ar['word'] .= 'i'; - } + // 板縛り + if ($matches[2] !== '') { + $ar['bbs'] = explode(',', $matches[2]); + } + // タイトル縛り + if ($matches[3] !== '') { + $ar['title'] = $matches[3]; } - // 大文字小文字を無視 - } elseif (preg_match('/^(.+)$/', $ar['word'], $matches)) { - $ar['word'] = $matches[1]; - $ar['ignorecase'] = true; - } - - // 正規表現でないなら、エスケープされていない特殊文字をエスケープ - /*if (!$ar['regex']) { - $ar['word'] = p2h($ar['word'], false); - }*/ - // 2chの仕様上、↑は期待通りの結果が得られないことが多いので、<>だけ実体参照にする - if (!$ar['regex']) { - $ar['word'] = str_replace(array('<', '>'), array('<', '>'), $ar['word']); } - $data[] = $ar; } } return array('file' => $file, 'data' => $data); } - // }}} } From dceecdb4a6e9e438f336f16bac61cefd21d6b65b Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 22 Jun 2015 00:09:20 +0900 Subject: [PATCH 168/339] =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E9=A0=85=E7=9B=AE2ch?= =?UTF-8?q?api=5Frounin=E3=82=92=E5=89=8A=E9=99=A4=EF=BC=88=E5=BC=B7?= =?UTF-8?q?=E5=88=B6ON=E3=81=AB=E5=A4=89=E6=9B=B4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- conf/conf_user_def.inc.php | 4 ---- lib/auth2chapi.inc.php | 2 +- rep2/edit_conf_user.php | 1 - 4 files changed, 2 insertions(+), 7 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 9a1af07b4..cc9f0a460 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150510.1111', // rep2のバージョン + 'p2version' => '150621.0091', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index bad6d5d6f..5c2551ec6 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -390,10 +390,6 @@ $conf_user_def['2chapi_use'] = 0; // (0) $conf_user_rad['2chapi_use'] = array('1' => 'する', '0' => 'しない'); -// 2ch API 認証時に●(浪人)IDを送信する -$conf_user_def['2chapi_rounin'] = 0; // (0) -$conf_user_rad['2chapi_rounin'] = array('1' => 'する', '0' => 'しない'); - // 2ch API 認証する間隔(単位:時間) $conf_user_def['2chapi_interval'] = 1; // (1) $conf_user_rules['2chapi_interval'] = array('emptyToDef', 'notIntExceptMinusToDef'); diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index 8fe81d949..daae86591 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -37,7 +37,7 @@ function authenticate_2chapi() return ''; } - if ($_conf['2chapi_rounin'] == 1&& $array = P2Util::readIdPw2ch()) { + if ($array = P2Util::readIdPw2ch()) { list($login2chID, $login2chPW, $autoLogin2ch) = $array; } diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index b2e5b9368..a4f7e3305 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -375,7 +375,6 @@ } else { $conflist = array( array('2chapi_use','2ch API を使用する'), - array('2chapi_rounin','2ch API 認証時に●(浪人)IDを送信する(人柱機能)'), array('2chapi_interval','2ch API 認証する間隔(単位:時間)'), 'API認証情報(全て必須)', array('2chapi_appkey','AppKey', P2_EDIT_CONF_USER_LONGTEXT), From cee80431f73889650ba0432720e16f48d3c79a46 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 22 Jun 2015 10:38:20 +0900 Subject: [PATCH 169/339] =?UTF-8?q?Merge=20#11=20=E5=85=AC=E5=BC=8F=20P2?= =?UTF-8?q?=20=E9=96=A2=E9=80=A3=E3=81=AE=E3=82=B3=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4=20offlaw2(shiro=3Dkuma)=E3=82=92?= =?UTF-8?q?=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_user_def.inc.php | 17 -- doc/README-killer.txt | 28 +++ lib/P2Util.php | 28 --- lib/ThreadRead.php | 310 ++++++++++++---------------------- lib/post_form_options.inc.php | 10 +- rep2/edit_conf_user.php | 7 +- rep2/post.php | 79 ++------- 7 files changed, 154 insertions(+), 325 deletions(-) create mode 100644 doc/README-killer.txt diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 5c2551ec6..23e9dafb2 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -19,23 +19,6 @@ // be.2ch.netのMDMD(手動設定する場合のみ入力) $conf_user_def['be_2ch_MDMD'] = ""; // ("") -// }}} -// {{{ p2.2ch.netアカウント - -// p2.2ch.netのサーバー -$conf_user_def['p2_2ch_host'] = "w1.p2.2ch.net"; // ("w1.p2.2ch.net") -$conf_user_rules['p2_2ch_host'] = array('/^(?:w\\d+\\.)?p2\\.2ch\\.net$/'); - -// p2.2ch.netの登録メールアドレス -$conf_user_def['p2_2ch_mail'] = ""; // ("") - -// p2.2ch.netのログインパスワード -$conf_user_def['p2_2ch_pass'] = ""; // ("") - -// p2.2ch.net Cookie認証時にIPアドレスの同一性をチェック -$conf_user_def['p2_2ch_ignore_cip'] = 0; // (0) -$conf_user_rad['p2_2ch_ignore_cip'] = array('0' => 'チェックする', '1' => 'チェックしない'); - // }}} // {{{ PATH diff --git a/doc/README-killer.txt b/doc/README-killer.txt new file mode 100644 index 000000000..f83ab1cf9 --- /dev/null +++ b/doc/README-killer.txt @@ -0,0 +1,28 @@ +rep2 機能拡張パック 全部入り(expack all in one) by killer + + +●何? + rep2-expack_allinone https://github.com/2ch774/p2-php + 上記やスレに上げられた修正を取り込みつつ気になったところをゴニョゴニョするバージョンです。 + + +●免責 + + 本ソフトウェアの使用により直接および間接的に生じたいかなる損害も補償いたしません。 + 使用は自己責任で。 + + +●注意 + + 設置者本人が悪用するのはもちろん、認証を切るなどして + 第三者に悪用されても仕方ない環境で使うのはやめてください。 + + +●ライセンス + + 本家p2と同じく、X11ライセンスです。 + + +●ChangeLog + + https://github.com/killer4989/p2-php/commits/master に書いてあるコミットログでどうぞ(コラ diff --git a/lib/P2Util.php b/lib/P2Util.php index b574f6519..ec5295455 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -2062,34 +2062,6 @@ static public function getHostGroupName($host) } } - // }}} - // {{{ getP2Client() - - /** - * P2Clientクラスのインスタンスを生成する - * - * @param void - * @return P2Client - */ - static public function getP2Client() - { - global $_conf; - - if (!is_dir($_conf['db_dir'])) { - FileCtl::mkdirRecursive($_conf['db_dir']); - } - - try { - return new P2Client("http://{$_conf['p2_2ch_host']}/p2/", - $_conf['p2_2ch_mail'], - $_conf['p2_2ch_pass'], - $_conf['db_dir'], - (bool)$_conf['p2_2ch_ignore_cip']); - } catch (P2Exception $e) { - p2die($e->getMessage()); - } - } - // }}} // {{{ rawurlencodeCallback() diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index a6d690224..9c6ce9ea5 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -78,13 +78,6 @@ public function downloadDat() { include $_conf['sid2ch_php']; return $this->_downloadDat2chMaru ($uaMona, $SID2ch); - // 2ch bbspink モリタポ読み - } elseif (P2Util::isHost2chs ($this->host) && ! empty ($_GET['moritapodat']) && $_conf['p2_2ch_mail'] && $_conf['p2_2ch_pass']) { - if (! array_key_exists ('csrfid', $_GET) || $this->_getCsrfIdForMoritapoDat () != $_GET['csrfid']) { - p2die ('不正なリクエストです'); - } - return $this->_downloadDat2chMoritapo (); - // 2chの過去ログ倉庫読み } elseif (! empty ($_GET['kakolog']) && ! empty ($_GET['kakoget'])) { if ($_GET['kakoget'] == 1) { @@ -94,10 +87,6 @@ public function downloadDat() { } return $this->_downloadDat2chKako ($_GET['kakolog'], $ext); - // 2ch or 2ch互換 - } elseif (P2Util::isHost2chs ($this->host) && ! empty ($_GET['shirokuma'])) { - return $this->_downloadDat2chMaru ($uaMona, $SID2ch, true); - // 2ch はAPI経由で落とす } elseif (P2Util::isHost2chs ($this->host) && $_conf['2chapi_use'] && empty ($_GET['olddat'])) { @@ -264,6 +253,17 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { $body = substr ($body, 1); } + // 2行目を切り出す + $lines = explode("\n", $body); + $secondmsg = $lines[1]; + + // 2行目が過去ログであることを示しているようであれば過去ログリンクを表示 + if (mb_strpos ($secondmsg, "2ちゃんねる ★<><>2015/05/31(日) 00:00:00.00 ID:????????<> このスレッドは過去ログです。") === 0) { + return $this->_downloadDat2chNotFound ('302'); + } + unset ($secondmsg); + unset ($lines); + $file_append = ($zero_read) ? 0 : FILE_APPEND; if (FileCtl::file_write_contents ($this->keydat, $body, $file_append) === false) { @@ -498,29 +498,73 @@ protected function _downloadDat2chNotFound($code = null) { */ protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma = false) { global $_conf; + global $debug; - if (! ($this->host && $this->bbs && $this->key && $this->keydat)) { + if (! ($this->host && $this->bbs && $this->key)) { return false; } - // GET /test/offlaw.cgi?bbs=板名&key=スレッド番号&sid=セッションID HTTP/1.1 - // $url = "http://{$this->host}/test/offlaw.cgi/{$this->bbs}/{$this->key}/?raw=0.0&sid="; - if (! $shirokuma) { - // 浪人対応 - $rokkasystem = explode (".", $this->host, 2); - $url = "http://rokka.$rokkasystem[1]/$rokkasystem[0]/{$this->bbs}/{$this->key}/?raw=0.0&sid="; - $url .= rawurlencode ($SID2ch); + $AppKey = $_conf['2chapi_appkey']; + $AppName = $_conf['2chapi_appname']; + $HMKey = $_conf['2chapi_hmkey']; + $ReadUA = sprintf ($_conf['2chapi_ua.read'], $AppName); + + if ($SID2ch == '') { + return false; + } + + $from_bytes = intval ($from_bytes); + + if ($from_bytes == 0) { + $zero_read = true; } else { - $url = "http://{$this->host}/test/offlaw2.so?shiro=kuma&bbs={$this->bbs}&key={$this->key}&sid=ERROR"; + $zero_read = false; + $from_bytes = $from_bytes - 1; } + + $serverName = explode ('.', $this->host); + // $url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; + // $url="http://news2.2ch.net/test/read.cgi?bbs=newsplus&key=1038486598"; + + if($_conf['2chapi_ssl.read']) { + $url = 'https://api.2ch.net/v1/'; + } else { + $url = 'http://api.2ch.net/v1/'; + } + + $url .= $serverName[0] . '/' . $this->bbs . '/' . $this->key; + $message = '/v1/' . $serverName[0] . '/' . $this->bbs . '/' . $this->key . $SID2ch . $AppKey; + $HB = hash_hmac ("sha256", $message, $HMKey); + $purl = parse_url ($url); // URL分解 try { - $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_GET); + $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_POST); + // ヘッダ - $req->setHeader ('User-Agent', "{$uaMona} ({$_conf['p2ua']})"); + $req->setHeader ('User-Agent', $ReadUA); - // Requestの送信 + if (! $zero_read) { + $req->setHeader ('Range', sprintf ('bytes=%d-', $from_bytes) ); + } + + if ($this->modified) { + $req->setHeader ('If-Modified-Since', $this->modified); + } + + // Basic認証用のヘッダ + if (isset ($purl['user']) && isset ($purl['pass'])) { + $req->setAuth ($purl['user'], $purl['pass'], HTTP_Request2::AUTH_BASIC); + } + + // POSTする内容 + $req->addPostParameter (array ( + 'sid' => $SID2ch, + 'hobo' => $HB, + 'appkey' => $AppKey + )); + + // POSTデータの送信 $response = $req->send (); $code = $response->getStatus (); @@ -532,25 +576,48 @@ protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma = false) { $this->modified = $response->getHeader ('Last-Modified'); - if (FileCtl::file_write_contents ($this->keydat, $body, 0) === false) { - p2die ('cannot write file. downloadDat2chMaru()'); + // 1行目を切り出す + $posLF = mb_strpos ($body, "\n"); + $firstmsg = mb_substr ($body, 0, $posLF === false ? mb_strlen ($body) : $posLF); + + // ngで始まってたらapiのエラーの可能性 + if (preg_match ("/^ng \((.*)\)$/", $firstmsg)) { + $this->getdat_error_msg_ht .= "

    rep2 error: API経由での浪人 ID のスレッド取得に失敗しました。" . $firstmsg . "

    "; + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&relogin2chapi=true\">APIで再取得を試みる]"; + $this->getdat_error_msg_ht .= $this->_generateMarutoriLink (true); + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&olddat=true\">旧datで再取得を試みる]"; + $this->diedat = true; + return false; } + unset ($firstmsg); - // クリーニング ===== - if ($marudatlines = FileCtl::file_read_lines ($this->keydat)) { - if (! $shirokuma) { - $firstline = array_shift ($marudatlines); - // チャンクとか - if (strpos ($firstline, 'Success') === false) { // 浪人(rokka)対応 - $secondline = array_shift ($marudatlines); - } - } - $cont = ''; - foreach ($marudatlines as $aline) { - $cont .= $aline; + // 末尾の改行であぼーんチェック + if (! $zero_read) { + if (substr ($body, 0, 1) != "\n") { + // echo "あぼーん検出"; + $this->onbytes = 0; + $this->modified = null; + return $this->_downloadDat2chMaru($uaMona, $SID2ch, $shirokuma); // datサイズは不正。全部取り直し。 } - if (FileCtl::file_write_contents ($this->keydat, $cont) === false) { - p2die ('cannot write file. downloadDat2chMaru()'); + $body = substr ($body, 1); + } + + $file_append = ($zero_read) ? 0 : FILE_APPEND; + + if (FileCtl::file_write_contents ($this->keydat, $body, $file_append) === false) { + p2die ('cannot write file.'); + } + + // $GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("dat_size_check"); + // 取得後サイズチェック + if ($zero_read == false && $this->onbytes) { + $this->getDatBytesFromLocalDat (); // $aThread->length をset + if ($this->onbytes != $this->length) { + $this->onbytes = 0; + $this->modified = null; + P2Util::pushInfoHtml ("

    rep2 info: {$this->onbytes}/{$this->length} ファイルサイズが変なので、datを再取得

    "); + // $GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("dat_size_check"); + return $this->_downloadDat2chMaru($uaMona, $SID2ch, $shirokuma); // datサイズは不正。全部取り直し。 } } @@ -583,7 +650,6 @@ protected function _downloadDat2chMaruNotFound() { return $this->downloadDat (); } else { $remarutori_ht = $this->_generateMarutoriLink (true); - $moritori_ht = $this->_generateMoritapoDatLink (); $this->getdat_error_msg_ht .= "

    rep2 info: ●IDでのスレッド取得に失敗しました。{$remarutori_ht}{$moritori_ht}

    "; $this->diedat = true; return false; @@ -756,7 +822,6 @@ public function get2chDatError($code = null) { $dat_response_status = "このスレッドは過去ログ倉庫に格納されています。"; $marutori_ht = $this->_generateMarutoriLink (); $plugin_ht = $this->_generateWikiDatLink ($read_url); - $moritori_ht = $this->_generateMoritapoDatLink (); $dat_response_msg = "

    2ch info - このスレッドは過去ログ倉庫に格納されています。{$marutori_ht}{$moritori_ht}{$plugin_ht}

    "; // がそんな板orスレッドないです。or error 3939 @@ -778,7 +843,6 @@ public function get2chDatError($code = null) { } elseif (preg_match ($waithtml_match, $read_response_html, $matches)) { $dat_response_status = "隊長! スレッドはhtml化されるのを待っているようです。"; $marutori_ht = $this->_generateMarutoriLink (); - $moritori_ht = $this->_generateMoritapoDatLink (); $dat_response_msg = "<p>2ch info - 隊長! スレッドはhtml化されるのを待っているようです。{$marutori_ht}{$moritori_ht}</p>"; } elseif (preg_match ($vip2ch_kakodat_match, $read_response_html, $matches)) { $dat_response_status = "隊長! 過去ログ倉庫で、datを発見しました。"; @@ -1177,167 +1241,6 @@ public function getDefaultGetDatErrorMessageHTML() { return $diedat_msg; } - // }}} - // {{{ _generateMoritapoDatLink() - - /** - * 公式p2で(dat取得権限がない場合はモリタポを消費して)datを取得するためのリンクを生成する。 - * - * @param - * void - * @return string - */ - protected function _generateMoritapoDatLink() { - global $_conf; - - if ($_conf['p2_2ch_mail'] && $_conf['p2_2ch_pass']) { - $csrfid = $this->_getCsrfIdForMoritapoDat (); - $query = p2h ('host=' . rawurlencode ($this->host) . '&bbs=' . rawurlencode ($this->bbs) . '&key=' . rawurlencode ($this->key) . '&ls=' . rawurlencode ($this->ls) . '&moritapodat=true' . '&csrfid=' . rawurlencode ($csrfid)); - return " [<a href=\"{$_conf['read_php']}?{$query}{$_conf['k_at_a']}\">モリタポでrep2に取り込む</a>]"; - } else { - return ''; - } - } - - // }}} - // {{{ _downloadDat2chMoritapo() - - /** - * 公式p2で(dat取得権限がない場合はモリタポを消費して)datを取得する - * - * @param - * void - * @return bool - */ - protected function _downloadDat2chMoritapo() { - global $_conf; - - // datをダウンロード - try { - $client = P2Util::getP2Client (); - $body = $client->downloadDat ($this->host, $this->bbs, $this->key, $response); - // DEBUG - /* - * $GLOBALS['_downloadDat2chMoritapo_response_dump'] = '<pre>' . p2h(print_r($response, true)) . '</pre>'; - * register_shutdown_function(create_function('', 'echo $GLOBALS[\'_downloadDat2chMoritapo_response_dump\'];')); - */ - } catch (P2Exception $e) { - p2die ($e->getMessage ()); - } - - // データ検証その1 - if (! $body || (strpos ($body, '<>') === false && strpos ($body, ',') === false)) { - return $this->_downloadDat2chMoritapoNotFound (); - } - - // 改行位置を検出 - $posCR = strpos ($body, "\r"); - $posLF = strpos ($body, "\n"); - if ($posCR === false && $posLF === false) { - $pos = strlen ($body); - } elseif ($posCR === false) { - $pos = $posLF; - } elseif ($posLF === false) { - $pos = $posCR; - } else { - $pos = min ($posLF, $posCR); - } - - // 1行目の取得とデータ検証その2 - $firstLine = rtrim (substr ($body, 0, $pos)); - if (strpos ($firstLine, '<>') !== false) { - $this->dat_type = '2ch'; - } elseif (strpos ($firstLine, ',') !== false) { - $this->dat_type = '2ch_old'; - } else { - return $this->_downloadDat2chMoritapoNotFound (); - } - - // データ検証その3 (タイトル = $ar[4]) - $ar = $this->explodeDatLine ($firstLine); - if (count ($ar) < 5) { - return $this->_downloadDat2chMoritapoNotFound (); - } - - // ローカルdatに書き込み - if (FileCtl::file_write_contents ($this->keydat, $body) === false) { - p2die ('cannot write file. downloadDat2chMoritapo()'); - } - - return true; - } - - // }}} - // {{{ _downloadDat2chMoritapoNotFound() - - /** - * モリタポでの取得ができなかったときに呼び出される - * - * @param - * void - * @return bool - */ - protected function _downloadDat2chMoritapoNotFound() { - global $_conf; - - $csrfid = $this->_getCsrfIdForMoritapoDat (); - - $host_en = rawurlencode ($this->host); - $bbs_en = rawurlencode ($this->bbs); - $key_en = rawurlencode ($this->key); - $ls_en = rawurlencode ($this->ls); - - $host_ht = p2h ($this->host); - $bbs_ht = p2h ($this->bbs); - $key_ht = p2h ($this->key); - $ls_ht = p2h ($this->ls); - - $query_ht = p2h ("host={$host_en}&bbs={$bbs_en}&key={$key_en}&ls={$ls_en}&maru=true"); - $marutori_ht = $this->_generateMarutoriLink (); - - if ($hosts = $this->scanOriginalHosts ()) { - $hostlist_ht = '<br>datから他のホスト候補を検出しました。'; - foreach ($hosts as $host) { - $hostlist_ht .= " [<a href=\"#\" onclick=\"this.parentNode.elements['host'].value='{$host}';return false;\">{$host}</a>]"; - } - } else { - $hostlist_ht = ''; - } - - $this->getdat_error_msg_ht .= <<<EOF -<p>rep2 info: モリタポでのスレッド取得に失敗しました。{$marutori_ht}</p> -<form action="{$_conf['read_php']}" method="get"> - ホストを - <input type="text" name="host" value="{$host_ht}" size="12"> - <input type="hidden" name="bbs" value="{$bbs_ht}"> - <input type="hidden" name="key" value="{$key_ht}"> - <input type="hidden" name="ls" value="{$ls_ht}"> - に変えて - <input type="submit" name="moritapodat" value="モリタポでrep2に取り込んでみる"> - <input type="hidden" name="csrfid" value="{$csrfid}"> - {$hostlist_ht} - {$_conf['k_input_ht']} -</form>\n -EOF; - $this->diedat = true; - - return false; - } - - // }}} - // {{{ _getCsrfIdForMoritapoDat() - - /** - * 公式p2からdatを取得する際に使うCSRF防止トークンを生成する - * - * @param - * void - * @return string - */ - protected function _getCsrfIdForMoritapoDat() { - return P2Util::getCsrfId ('moritapodat' . $this->host . $this->bbs . $this->key); - } - // }}} // {{{ _pushInfoMessage() @@ -1578,7 +1481,6 @@ protected function _generateMarutoriLink($retry = false) { $atext = "●IDでrep2に取り込む"; } $marutori_ht = " [<a href=\"{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&maru=true{$retry_q}{$_conf['k_at_a']}\">{$atext}</a>]"; - $marutori_ht .= " [<a href=\"{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&shirokuma=true{$_conf['k_at_a']}\">offlaw経由でrep2に取り込む</a>]"; return $marutori_ht; } // }}} diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index ac30333db..563c03e11 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -165,7 +165,7 @@ function setHiddenValue(button) { } // }}} -// {{{ ●/Be/公式p2 書き込み チェックボックス +// {{{ ●/Be 書き込み チェックボックス // 2ch●書き込み if (P2Util::isHost2chs($host) and file_exists($_conf['sid2ch_php'])) { @@ -179,14 +179,6 @@ function setHiddenValue(button) { . '<label for="beres">Beで書き込む</label>'; } -// 公式p2 -if ((P2Util::isHost2chs($host) || P2Util::isHostMachiBbs($host)) && - $_conf['p2_2ch_mail'] && $_conf['p2_2ch_pass']) -{ - $htm['p2res'] = '<input type="checkbox" id="p2res" name="p2res" value="1"'. $hd['p2res_checked'] . '>' - . '<label for="p2res">公式p2で書き込む</label>'; -} - // }}} // {{{ 書き込みブロック用チェックボックス diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index a4f7e3305..f5059c8a7 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -220,7 +220,7 @@ // {{{ rep2基本設定 // {{{ 'be/p2' -$groupname = 'be/p2'; +$groupname = 'be'; $groups[] = $groupname; $flags = getGroupShowFlags($groupname); if ($flags & P2_EDIT_CONF_USER_SKIPPED) { @@ -232,11 +232,6 @@ array('be_2ch_password', '<a href="http://be.2ch.net/" target="_blank">be.2ch.net</a>のパスワード(認証コードは使えなくなりました)', P2_EDIT_CONF_USER_PASSWORD), array('be_2ch_DMDM', '<a href="http://be.2ch.net/" target="_blank">be.2ch.net</a>のDMDM(手動設定する場合のみ入力)', P2_EDIT_CONF_USER_LONGTEXT), array('be_2ch_MDMD', '<a href="http://be.2ch.net/" target="_blank">be.2ch.net</a>のMDMD(手動設定する場合のみ入力)', P2_EDIT_CONF_USER_LONGTEXT), - '公式p2', - array('p2_2ch_host', '公式p2 (<a href="http://p2.2ch.net/" target="_blank">p2.2ch.net</a>) で割り当てられているサーバー', P2_EDIT_CONF_USER_LONGTEXT), - array('p2_2ch_mail', '公式p2の登録メールアドレス', P2_EDIT_CONF_USER_LONGTEXT), - array('p2_2ch_pass', '公式p2のログインパスワード', P2_EDIT_CONF_USER_LONGTEXT | P2_EDIT_CONF_USER_PASSWORD), - array('p2_2ch_ignore_cip', ' p2.2ch.net Cookie認証時にIPアドレスの同一性をチェック'), ); printEditConfGroupHtml($groupname, $conflist, $flags); } diff --git a/rep2/post.php b/rep2/post.php index b7b6fd104..bcd0d3c43 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -200,37 +200,31 @@ // 書き込みを一時的に保存 PostDataStore::set($post_backup_key, $post_cache); -// ポスト実行 -if (!empty($_POST['p2res']) && empty($_POST['newthread'])) { - // 公式p2で書き込み - $posted = postIt2($host, $bbs, $key, $FROM, $mail, $MESSAGE); -} else { - // cookie 読み込み - $cookie_key = $_login->user_u . '/' . P2Util::normalizeHostName(P2Util::isHostBbsPink($host) ? 'www.bbspink.com' : P2Util::isHost2chs($host) ? 'www.2ch.net' : $host); // 忍法帳対応 - if ($p2cookies = CookieDataStore::get($cookie_key)) { - if (is_array($p2cookies)) { - if (array_key_exists('expires', $p2cookies)) { - // 期限切れなら破棄 - if (time() > strtotime($p2cookies['expires'])) { - CookieDataStore::delete($cookie_key); - $p2cookies = null; - } +// cookie 読み込み +$cookie_key = $_login->user_u . '/' . P2Util::normalizeHostName(P2Util::isHostBbsPink($host) ? 'www.bbspink.com' : P2Util::isHost2chs($host) ? 'www.2ch.net' : $host); // 忍法帳対応 +if ($p2cookies = CookieDataStore::get($cookie_key)) { + if (is_array($p2cookies)) { + if (array_key_exists('expires', $p2cookies)) { + // 期限切れなら破棄 + if (time() > strtotime($p2cookies['expires'])) { + CookieDataStore::delete($cookie_key); + $p2cookies = null; } - } else { - CookieDataStore::delete($cookie_key); - $p2cookies = null; } } else { + CookieDataStore::delete($cookie_key); $p2cookies = null; } +} else { + $p2cookies = null; +} - // 直接書き込み - $posted = postIt($host, $bbs, $key, $post); +// 直接書き込み +$posted = postIt($host, $bbs, $key, $post); - // cookie 保存 - if ($p2cookies) { - CookieDataStore::set($cookie_key, $p2cookies); - } +// cookie 保存 +if ($p2cookies) { + CookieDataStore::set($cookie_key, $p2cookies); } // 投稿失敗記録を削除 @@ -502,43 +496,6 @@ function postIt($host, $bbs, $key, $post) } } -// }}} -// {{{ postIt2() - -/** - * 公式p2でレスを書き込む - * - * @return boolean 書き込み成功なら true、失敗なら false - */ -function postIt2($host, $bbs, $key, $FROM, $mail, $MESSAGE) -{ - if (P2Util::isHostBe2chNet($host) || !empty($_REQUEST['beres'])) { - $beRes = true; - } else { - $beRes = false; - } - - try { - $posted = P2Util::getP2Client()->post($host, $bbs, $key, - $FROM, $mail, $MESSAGE, - $beRes, $response); - } catch (P2Exception $e) { - p2die('公式p2ポスト失敗', $e->getMessage()); - } - - if ($posted) { - $reload = empty($_POST['from_read_new']); - showPostMsg(true, '書きこみが終わりました。', $reload); - } else { - $result_msg = '公式p2ポスト失敗</p>' - . '<pre>' . p2h($response['body']) . '</pre>' - . '<p>-'; - showPostMsg(false, $result_msg, false); - } - - return $posted; -} - // }}} // {{{ showPostMsg() From 154de7ac52c6efaedabb643271954c666a808870 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Mon, 22 Jun 2015 10:41:44 +0900 Subject: [PATCH 170/339] =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E9=A0=85=E7=9B=AE?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=E3=81=AB=E4=BC=B4=E3=81=86=E3=83=90=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E3=83=A7=E3=83=B3=E7=95=AA=E5=8F=B7=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index cc9f0a460..dcff755ab 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150621.0091', // rep2のバージョン + 'p2version' => '150621.0092', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; From f794ff98110738285f611b1c87f9d887a7db4a00 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Mon, 22 Jun 2015 05:34:14 +0900 Subject: [PATCH 171/339] =?UTF-8?q?DAT=20=E3=81=AE2=E8=A1=8C=E7=9B=AE?= =?UTF-8?q?=E3=81=8C=E9=81=8E=E5=8E=BB=E3=83=AD=E3=82=B0=E3=81=A7=E3=81=82?= =?UTF-8?q?=E3=82=8B=E3=81=93=E3=81=A8=E3=82=92=E7=A4=BA=E3=81=97=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=82=8B=E3=82=88=E3=81=86=E3=81=A7=E3=81=82=E3=82=8C?= =?UTF-8?q?=E3=81=B0=E9=81=8E=E5=8E=BB=E3=83=AD=E3=82=B0=E6=89=B1=E3=81=84?= =?UTF-8?q?=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 9c6ce9ea5..a2132149a 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -420,6 +420,17 @@ protected function _downloadDat2ch($from_bytes) { $body = substr ($body, 1); } + // 2行目を切り出す + $lines = explode("\n", $body); + $secondmsg = $lines[1]; + + // 2行目が過去ログであることを示しているようであれば過去ログリンクを表示 + if (mb_strpos ($secondmsg, "2ちゃんねる ★<><>2015/05/31(日) 00:00:00.00 ID:????????<> このスレッドは過去ログです。") === 0) { + return $this->_downloadDat2chNotFound ('302'); + } + unset ($secondmsg); + unset ($lines); + $file_append = ($zero_read) ? 0 : FILE_APPEND; if (FileCtl::file_write_contents ($this->keydat, $body, $file_append) === false) { From dae14ed5daebff6061ac28b30dacbe80c1974565 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Sat, 27 Jun 2015 23:54:48 +0900 Subject: [PATCH 172/339] =?UTF-8?q?=E3=82=AD=E3=83=A3=E3=83=83=E3=82=B7?= =?UTF-8?q?=E3=83=A5=E7=A2=BA=E8=AA=8D=E3=81=A730=E5=88=86=E3=81=8A?= =?UTF-8?q?=E3=81=8D=E3=81=AB=E6=9B=B4=E6=96=B0=E3=81=99=E3=82=8B=E3=81=AF?= =?UTF-8?q?=E3=81=9A=E3=81=8C30=E6=99=82=E9=96=93=E3=81=AB=E3=81=AA?= =?UTF-8?q?=E3=81=A3=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=81=A7=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/BbsMap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/BbsMap.php b/lib/BbsMap.php index 16fe7767e..232a756e7 100644 --- a/lib/BbsMap.php +++ b/lib/BbsMap.php @@ -313,7 +313,7 @@ static private function _getMapping() // {{{ 設定 $map_cache_path = $_conf['cache_dir'] . '/host_bbs_map.txt'; - $map_cache_lifetime = 60 * 60 * 30; // 30分おきに更新があるか確認するがBrdCtl側で最低1時間はアクセスしない。 + $map_cache_lifetime = 60 * 30; // 30分おきに更新があるか確認するがBrdCtl側で最低1時間はアクセスしない。 // }}} // {{{ キャッシュ確認 From eddd6f2a27ceac84960326bf24f72a472c017ef9 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 10 Jul 2015 14:04:48 +0900 Subject: [PATCH 173/339] =?UTF-8?q?v151710.1400=20=E4=B9=85=E3=80=85?= =?UTF-8?q?=E3=81=AE=E3=83=AA=E3=83=AA=E3=83=BC=E3=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- doc/README-774.txt | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index dcff755ab..fc03f2be8 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150621.0092', // rep2のバージョン + 'p2version' => '151710.1400', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index 0866093cb..570a66a61 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -60,6 +60,13 @@ rep2-expack test https://github.com/orzisun/p2-php ●ChangeLog +151710.1400 +* キャッシュ確認で30分おきに更新するはずが30時間になっていたので修正 +* DAT の2行目が過去ログであることを示しているようであれば過去ログ扱いにする +* 公式 P2 関連のコードを削除 +* offlaw2(shiro=kuma)を削除 +* 上記の変更点はkiller4989さんのパッチを取り込み +* 設定項目2chapi_rouninを削除(強制ONに変更) 150510.1111 * Youtubeとニコ動の内蔵リンクプラグインを削除 From a277f07ffbc7e0087e3a6a923b64c04345e5f287 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sat, 11 Jul 2015 09:38:35 +0900 Subject: [PATCH 174/339] =?UTF-8?q?v150711.1000=20=E3=83=90=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E3=83=A7=E3=83=B3=E7=95=AA=E5=8F=B7=E3=83=9F=E3=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- doc/README-774.txt | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index fc03f2be8..329835dda 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '151710.1400', // rep2のバージョン + 'p2version' => '150711.1000', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index 570a66a61..c6d7a431c 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -60,6 +60,10 @@ rep2-expack test https://github.com/orzisun/p2-php ●ChangeLog +150711.1000 +・バージョン番号の数字ミスってたので 151710.1400 をにして付け直し +・更新内容に問題無いはずなので内容は 151710.1400 と同一です。 + 151710.1400 * キャッシュ確認で30分おきに更新するはずが30時間になっていたので修正 * DAT の2行目が過去ログであることを示しているようであれば過去ログ扱いにする From fb4b9852ea25fc48f48d8d3c05854863a860ac8a Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Fri, 14 Aug 2015 14:41:42 +0900 Subject: [PATCH 175/339] =?UTF-8?q?=E3=81=BE=E3=81=A1BBS=E3=81=A7=E3=83=AA?= =?UTF-8?q?=E3=83=A2=E3=83=BC=E3=83=88=E3=83=9B=E3=82=B9=E3=83=88=E5=90=8D?= =?UTF-8?q?=E3=82=92=E8=A1=A8=E7=A4=BA=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_user_def.inc.php | 4 ++++ lib/DownloadDatMachiBbs.php | 12 +++++++++++- rep2/edit_conf_user.php | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 23e9dafb2..cf3371020 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -326,6 +326,10 @@ $conf_user_def['coloredid.coloring.type'] = 0; $conf_user_rad['coloredid.coloring.type'] = array('0' => 'オリジナル', '1' => 'thermon版'); +// まちBBSでリモートホスト名を表示 +$conf_user_def['machibbs.disphost.enable'] = 1; +$conf_user_rad['machibbs.disphost.enable'] = array('1' => 'する', '0' => 'しない'); + // }}} // {{{ NG/あぼーん diff --git a/lib/DownloadDatMachiBbs.php b/lib/DownloadDatMachiBbs.php index f39357f80..2a4263223 100644 --- a/lib/DownloadDatMachiBbs.php +++ b/lib/DownloadDatMachiBbs.php @@ -53,7 +53,11 @@ static public function invoke(ThreadRead $thread) } // http://[SERVER]/bbs/offlaw.cgi/[BBS]/[KEY]/[OPTION]; - $url = "http://{$host}/bbs/offlaw.cgi/{$bbs}/{$key}/{$option}"; + if($_conf['machibbs.disphost.enable']){ + $url = "http://{$host}/bbs/offlaw.cgi/2/{$bbs}/{$key}/{$option}"; + } else { + $url = "http://{$host}/bbs/offlaw.cgi/{$bbs}/{$key}/{$option}"; + } $tempfile = $thread->keydat . '.tmp'; FileCtl::mkdirFor($tempfile); @@ -104,6 +108,12 @@ static public function invoke(ThreadRead $thread) fwrite($fp, $abn); $thread->gotnum++; } + + if($_conf['machibbs.disphost.enable']){ + $lar[2] .= sprintf(" [ %s ]", $lar[5]); + } + unset($lar[5]); + // 行を書き込む fwrite($fp, implode('<>', $lar) . "\n"); } else { diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index f5059c8a7..b0a8e583f 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -332,6 +332,7 @@ array('coloredid.click', 'ID出現数をクリックすると着色をトグル(「しない」にするとJavascriptではなくPHPで着色)'), array('coloredid.marking.colors', 'ID出現数をダブルクリックしてマーキングの色リスト(カンマ区切り)'), array('coloredid.coloring.type', 'カラーリングのタイプ(thermon版はPHPで着色(coloredid.click=しない)の場合のみ有効)'), + array('machibbs.disphost.enable', 'まちBBSでリモートホスト名を表示'), ); printEditConfGroupHtml($groupname, $conflist, $flags); } From e2ee4b3af250a2c154c6e1d5df10d1b3a13d3324 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 15 Sep 2015 10:59:05 +0900 Subject: [PATCH 176/339] v150815.1030 --- conf/conf.inc.php | 2 +- doc/README-774.txt | 8 ++++++-- rep2/subject.php | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 329835dda..24d87ee4b 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150711.1000', // rep2のバージョン + 'p2version' => '150815.1030', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index c6d7a431c..06d65e7fd 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -60,9 +60,13 @@ rep2-expack test https://github.com/orzisun/p2-php ●ChangeLog +150815.1030 +* 表示レス数の上限を2000から65535に変更 +* まちBBSのホスト名を表示する設定を追加(killer4989さんのパッチを取り込み) + 150711.1000 -・バージョン番号の数字ミスってたので 151710.1400 をにして付け直し -・更新内容に問題無いはずなので内容は 151710.1400 と同一です。 +* バージョン番号の数字ミスってたので 151710.1400 を欠番にして付け直し +* 更新内容に問題無いはずなので内容は 151710.1400 と同一です。 151710.1400 * キャッシュ確認で30分おきに更新するはずが30時間になっていたので修正 diff --git a/rep2/subject.php b/rep2/subject.php index c40690f74..3ca376bd0 100644 --- a/rep2/subject.php +++ b/rep2/subject.php @@ -117,7 +117,7 @@ // }}} // {{{ 表示スレッド数設定 -$threads_num_max = 2000; +$threads_num_max = 65535; if (!$spmode || $spmode == 'merge_favita') { $threads_num = $p2_setting['viewnum']; From 67d0692204aa67ff336d6f54589268648f70a349 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 3 Mar 2016 13:26:30 +0900 Subject: [PATCH 177/339] =?UTF-8?q?2ch=20API=E3=81=AE=E7=8B=AC=E8=87=AA?= =?UTF-8?q?=E3=83=AC=E3=82=B9=E3=83=9D=E3=83=B3=E3=82=B9=E3=83=98=E3=83=83?= =?UTF-8?q?=E3=83=80=E3=82=92=E4=BD=BF=E7=94=A8=E3=81=97=E3=81=A6=E3=80=81?= =?UTF-8?q?DAT=E5=8F=96=E5=BE=97=E6=99=82=E3=81=AE=E3=80=81=E8=AA=8D?= =?UTF-8?q?=E8=A8=BC=E5=A4=B1=E6=95=97=E3=81=A8=E9=81=8E=E5=8E=BB=E3=83=AD?= =?UTF-8?q?=E3=82=B0=E5=8F=96=E5=BE=97=E5=A4=B1=E6=95=97=E3=81=AE=E5=88=A4?= =?UTF-8?q?=E5=AE=9A=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index a2132149a..12a5a82e8 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -200,8 +200,24 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { // POSTデータの送信 $response = $req->send (); + // 2ch API の状態がヘッダーに記載されているので取得する。 + // User-Status: 0 (sessionID無効) or 1 (sessionID有効) or + // 2 (sessionID有効/https://2chv.tora3.net/futen.cgiで取得したもの) + // 3 (sessionID有効/API認証時にRoninアカウントを付けて取得したもの) + // ※ User-Status: が 2,3 の時はdat落ち/過去ログも取れる + $apiUserStatus = $response->getHeader('User-Status'); + + // Thread-Status: 0 (dat取得不可) or 1 (現行スレ) or 2 (dat落ち) or 3 (過去ログ) or + // 8 (dat取得不可/Ronin無しでdat落ち/過去ログを取ろうとしたとき) + $apiThreadStatus = $response->getHeader('Thread-Status'); + $code = $response->getStatus (); + if($_conf['2chapi_debug_print']==1) + { + P2Util::pushInfoHtml('<p>p2 debug(ThreadRead::API): User-Status='.$apiUserStatus.' Thread-Status='.$apiThreadStatus.' HTTP-Status='.$code.'</p>'); + } + if ($code == '200' || $code == '206') { // Partial Content $body = $response->getBody (); @@ -303,6 +319,13 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { $this->onbytes = 0; $this->modified = null; return $this->_downloadDat2chAPI ($sid, 0); // あぼーん検出。全部取り直し。 + } elseif ($code == '401' && $apiUserStatus == '0') { // 401はAPI認証失敗(再認証する) + if (empty ($_REQUEST['relogin2chapi'])) { + $_REQUEST['relogin2chapi'] = true; + return $this->downloadDat (); + } + } elseif ($code == '501' && $apiUserStatus == '1') { // 浪人無しで尚且つRange付でDAT落ちにアクセスした場合は501 + return $this->_downloadDat2chNotFound ('302'); } else { return $this->_downloadDat2chNotFound ($code); } From 1c70e516d85a58a7e5c636461fb45647ef115ff6 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 3 Mar 2016 13:52:11 +0900 Subject: [PATCH 178/339] =?UTF-8?q?DAT=E8=90=BD=E3=81=A1=E3=81=AE=E5=88=A4?= =?UTF-8?q?=E5=AE=9A=E3=81=ABThread-Status=E3=83=98=E3=83=83=E3=83=80?= =?UTF-8?q?=E3=82=92=E4=BD=BF=E7=94=A8=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 12a5a82e8..7fe8b9b9b 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -218,6 +218,11 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { P2Util::pushInfoHtml('<p>p2 debug(ThreadRead::API): User-Status='.$apiUserStatus.' Thread-Status='.$apiThreadStatus.' HTTP-Status='.$code.'</p>'); } + // APIの返答が過去ログ(Ronin無)だったら過去ログリンクを表示して終了 + if($apiThreadStatus == '8') { + return $this->_downloadDat2chNotFound ('302'); + } + if ($code == '200' || $code == '206') { // Partial Content $body = $response->getBody (); @@ -235,9 +240,11 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { $this->modified = $response->getHeader ('Last-Modified'); + // 行毎に分割 + $lines = explode("\n", $body ,3); + // 1行目を切り出す - $posLF = mb_strpos ($body, "\n"); - $firstmsg = mb_substr ($body, 0, $posLF === false ? mb_strlen ($body) : $posLF); + $firstmsg = $lines[0]; // ngで始まってたらapiのエラーの可能性 if (preg_match ("/^ng \((.*)\)$/", $firstmsg)) { @@ -258,6 +265,18 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { } unset ($firstmsg); + // 2行目を切り出す + $secondmsg = $lines[1]; + + // 2行目が過去ログであることを示しているようであれば過去ログリンクを表示 + // APIのヘッダーで判定してここまで来ないように変更したがDAT破損防止のため残す + if (mb_strpos ($secondmsg, "2ちゃんねる ★<><>2015/05/31(日) 00:00:00.00 ID:????????<> このスレッドは過去ログです。") === 0) { + return $this->_downloadDat2chNotFound ('302'); + } + + unset ($secondmsg); + unset ($lines); + // 末尾の改行であぼーんチェック if (! $zero_read) { if (substr ($body, 0, 1) != "\n") { @@ -269,17 +288,6 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { $body = substr ($body, 1); } - // 2行目を切り出す - $lines = explode("\n", $body); - $secondmsg = $lines[1]; - - // 2行目が過去ログであることを示しているようであれば過去ログリンクを表示 - if (mb_strpos ($secondmsg, "2ちゃんねる ★<><>2015/05/31(日) 00:00:00.00 ID:????????<> このスレッドは過去ログです。") === 0) { - return $this->_downloadDat2chNotFound ('302'); - } - unset ($secondmsg); - unset ($lines); - $file_append = ($zero_read) ? 0 : FILE_APPEND; if (FileCtl::file_write_contents ($this->keydat, $body, $file_append) === false) { From 9fb51e7af003ba2e1cd02602848cdba061e5fdfe Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 3 Mar 2016 13:59:03 +0900 Subject: [PATCH 179/339] =?UTF-8?q?=E4=B8=8D=E8=B6=B3=E3=81=97=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=81=9F=E9=AB=98=E8=A7=A3=E5=83=8F=E5=BA=A6=E3=82=A2?= =?UTF-8?q?=E3=82=A4=E3=82=B3=E3=83=B3=E3=82=92=E8=BF=BD=E5=8A=A0=20thx!?= =?UTF-8?q?=20http://potato.2ch.net/test/read.cgi/software/1431258367/767?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/img/glyphish/icons2/42-photos@2x.png | Bin 0 -> 467 bytes rep2/img/glyphish/icons2/42-photos@3x.png | Bin 0 -> 746 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 rep2/img/glyphish/icons2/42-photos@2x.png create mode 100644 rep2/img/glyphish/icons2/42-photos@3x.png diff --git a/rep2/img/glyphish/icons2/42-photos@2x.png b/rep2/img/glyphish/icons2/42-photos@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..847196cb6dd946b83078b0cbb747db383d99cbb1 GIT binary patch literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTN?DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a!@$58=jq}YQo;CkmLp%2 zg8<9LA1wd=JKbAw%sHN?aqpQcYSD3Of=T+JCPxlz`#G_JMMZ&;)5C#DXhH)^nDU1g zRu3Lq*u_RFTmIg+UH13Ys(Inkcf<T07{B)D3yTzVF0XsM+U}9f!rxLhw{0~-avVGy zgtHyKe=IZ4`|=~_fX2#2f0tz*$hrPv-LV@Di;Szkq>CDOt;(=x6={_Hdo%ML<A3gV zyV%sH?_$5%AknalN#R3hDA0^xMu8tkv=meptYqM*NfH$hx)8#^Vz-ftgEK>mfoXmO zYYU5sC_|(F8YU;ESzHYV)WaAR8GTtD9tf{)n9!i6_TW29R}~lQM!VjlEOXYS9n=?P z@D6WaN?<D3!yCZh!_c>#aYIAq{hsKj_DokB%xfO`3g5rh@UGl;xnj*`fmMv=r=!w0 wGbLQ-f-2@};5_irj6p164|4dZY>;cz*N~UhEsYIZ42%K>Pgg&ebxsLQ0KIFZumAu6 literal 0 HcmV?d00001 diff --git a/rep2/img/glyphish/icons2/42-photos@3x.png b/rep2/img/glyphish/icons2/42-photos@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..21a710d12146a16713f0df0adbea2c8f097c1350 GIT binary patch literal 746 zcmeAS@N?(olHy`uVBq!ia0vp^6M#5@gAGW2y7GG=kYY)9^mSxl*x1kgCy^D%S4j2< z@?~JCQe$9fXklRZ1r%y{!N5>zz`*b-fq}tl1_Oh5!JJ)zHVh0*rJgR1Ar*{o?*#fC zcHnWnD7LZXU483aXU+OBm8Llpmu)NkF>At%ig&wxOtc=BeQsr7;!tS7NgVKD`hMzi zmEHXHr~byiefzOu%CmVhuZKTNx~^29;;=wj@VF)ui`T=Vj}sXh`&?v}a|md(o<8c% zbpLpMiN(JQde6$APq`)Pch}X;eT~D!V?Qla&;RV7RXok1c+;N~K2dgu?3`X5^0oi6 zV(*2QUxl<Ul$L4TXW?*ZR%Kc&ml#}bJ5|0lY{Am|_D5MB9S~w<(tQ~0qrj&lsBl5Z z?&#vO#QLL=mEywH?{;)=VLHmvdzpn}irX>;A%%b?iF4E(7MK{Z0^Oy=``Cn$Y3W4G z4i*lPOo`>30vf$OjzHIY9JcUnaL7#IQetFsl{%IQ^oeq?08sjpfuFEKfYi(;j|Hn8 zlK(jd^DKV6W2wXX>Dzl&pSTvZ;P>Bi3zXQlimc$U&fUW)(81=-!m*{r->}hQgG+;h z_YV=_4rX+r?KN91_c7ghy7lSGRgsO$)OKgavD{**dX>vzVtUi}v(g2%3&Hu$3s#=Y zn<d_8);O<9n#tF<?D8ItEu3Gj+!n~l+BEx_>jK{e%kQ;01W&$evVPk9*3_Fv&Y#<~ zb)CI>0;|>Y$8YReIKJ>JEI-dVrLN^?aPQ|2T64BCg?cP3<Y&o}iEF*a8KT&F%vNAU zVTEXvdO)j))OUvk#~y}e%ykeA%DBVaDAgXmuoO)Lt1X`70Zum#mQ40pf8}m1IxPMP Qm@*kWUHx3vIVCg!08W@4+W-In literal 0 HcmV?d00001 From 4b6d0f4da58576842dbd5f4d99ae65759fe4096a Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 3 Mar 2016 14:29:13 +0900 Subject: [PATCH 180/339] =?UTF-8?q?API+=E6=B5=AA=E4=BA=BA=E3=81=A7?= =?UTF-8?q?=E5=8F=96=E5=BE=97=E3=81=97=E3=81=9FDAT=E3=82=92=E9=81=8E?= =?UTF-8?q?=E5=8E=BB=E3=83=AD=E3=82=B0=E6=89=B1=E3=81=84=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 7fe8b9b9b..6f1613f62 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -307,7 +307,10 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { } } - $this->isonline = true; + if ($apiThreadStatus == '1') { + // 現行スレの時だけセット + $this->isonline = true; + } return true; } elseif ($code == '302') { // Found // ホストの移転を追跡 From 5cacc21cc052ac39799ed6d95329b0326e1d5dee Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 3 Mar 2016 14:39:42 +0900 Subject: [PATCH 181/339] =?UTF-8?q?=E2=97=8F=E3=81=A7DAT=E3=82=92=E3=83=80?= =?UTF-8?q?=E3=82=A6=E3=83=B3=E3=83=AD=E3=83=BC=E3=83=89=E3=81=99=E3=82=8B?= =?UTF-8?q?=E7=82=BA=E3=81=AE=E3=82=B3=E3=83=BC=E3=83=89=E3=82=92=E9=99=A4?= =?UTF-8?q?=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 193 +-------------------------------------------- 1 file changed, 1 insertion(+), 192 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 6f1613f62..6281f2f6a 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -61,25 +61,7 @@ public function downloadDat() { $this->getDatBytesFromLocalDat (); // $aThread->length をset $pinktest = "/\w+\.bbspink.com/"; - // 2ch bbspink●読み - if (P2Util::isHost2chs ($this->host) && ! empty ($_GET['maru'])) { - // ログインしてなければ or ログイン後、24時間以上経過していたら自動再ログイン - if (! file_exists ($_conf['sid2ch_php']) || ! empty ($_REQUEST['relogin2ch']) || (filemtime ($_conf['sid2ch_php']) < time () - 60 * 60 * 24)) { - if (! function_exists ('login2ch')) { - include P2_LIB_DIR . '/login2ch.inc.php'; - } - if (! login2ch ()) { - $this->getdat_error_msg_ht .= $this->get2chDatError (); - $this->diedat = true; - return false; - } - } - - include $_conf['sid2ch_php']; - return $this->_downloadDat2chMaru ($uaMona, $SID2ch); - - // 2chの過去ログ倉庫読み - } elseif (! empty ($_GET['kakolog']) && ! empty ($_GET['kakoget'])) { + if (! empty ($_GET['kakolog']) && ! empty ($_GET['kakoget'])) { if ($_GET['kakoget'] == 1) { $ext = '.dat.gz'; } elseif ($_GET['kakoget'] == 2) { @@ -528,179 +510,6 @@ protected function _downloadDat2chNotFound($code = null) { return false; } - // }}} - // {{{ _downloadDat2chMaru() - - /** - * 2ch●用 DATをダウンロードする - * - * @param string $uaMona - * @param string $SID2ch - * @param bool $shirokuma - * trueならofflaw2で取得 - * @return bool - * @see lib/login2ch.inc.php - */ - protected function _downloadDat2chMaru($uaMona, $SID2ch, $shirokuma = false) { - global $_conf; - global $debug; - - if (! ($this->host && $this->bbs && $this->key)) { - return false; - } - - $AppKey = $_conf['2chapi_appkey']; - $AppName = $_conf['2chapi_appname']; - $HMKey = $_conf['2chapi_hmkey']; - $ReadUA = sprintf ($_conf['2chapi_ua.read'], $AppName); - - if ($SID2ch == '') { - return false; - } - - $from_bytes = intval ($from_bytes); - - if ($from_bytes == 0) { - $zero_read = true; - } else { - $zero_read = false; - $from_bytes = $from_bytes - 1; - } - - $serverName = explode ('.', $this->host); - // $url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; - // $url="http://news2.2ch.net/test/read.cgi?bbs=newsplus&key=1038486598"; - - if($_conf['2chapi_ssl.read']) { - $url = 'https://api.2ch.net/v1/'; - } else { - $url = 'http://api.2ch.net/v1/'; - } - - $url .= $serverName[0] . '/' . $this->bbs . '/' . $this->key; - $message = '/v1/' . $serverName[0] . '/' . $this->bbs . '/' . $this->key . $SID2ch . $AppKey; - $HB = hash_hmac ("sha256", $message, $HMKey); - - $purl = parse_url ($url); // URL分解 - - try { - $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_POST); - - // ヘッダ - $req->setHeader ('User-Agent', $ReadUA); - - if (! $zero_read) { - $req->setHeader ('Range', sprintf ('bytes=%d-', $from_bytes) ); - } - - if ($this->modified) { - $req->setHeader ('If-Modified-Since', $this->modified); - } - - // Basic認証用のヘッダ - if (isset ($purl['user']) && isset ($purl['pass'])) { - $req->setAuth ($purl['user'], $purl['pass'], HTTP_Request2::AUTH_BASIC); - } - - // POSTする内容 - $req->addPostParameter (array ( - 'sid' => $SID2ch, - 'hobo' => $HB, - 'appkey' => $AppKey - )); - - // POSTデータの送信 - $response = $req->send (); - - $code = $response->getStatus (); - - if ($code == '200' || $code == '206') { // Partial Content - $body = $response->getBody (); - - $this->onbytes = intval ($response->getHeader ('Content-Length')); - - $this->modified = $response->getHeader ('Last-Modified'); - - // 1行目を切り出す - $posLF = mb_strpos ($body, "\n"); - $firstmsg = mb_substr ($body, 0, $posLF === false ? mb_strlen ($body) : $posLF); - - // ngで始まってたらapiのエラーの可能性 - if (preg_match ("/^ng \((.*)\)$/", $firstmsg)) { - $this->getdat_error_msg_ht .= "<p>rep2 error: API経由での浪人 ID のスレッド取得に失敗しました。" . $firstmsg . "</p>"; - $this->getdat_error_msg_ht .= " [<a href=\"{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&relogin2chapi=true\">APIで再取得を試みる</a>]"; - $this->getdat_error_msg_ht .= $this->_generateMarutoriLink (true); - $this->getdat_error_msg_ht .= " [<a href=\"{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&olddat=true\">旧datで再取得を試みる</a>]"; - $this->diedat = true; - return false; - } - unset ($firstmsg); - - // 末尾の改行であぼーんチェック - if (! $zero_read) { - if (substr ($body, 0, 1) != "\n") { - // echo "あぼーん検出"; - $this->onbytes = 0; - $this->modified = null; - return $this->_downloadDat2chMaru($uaMona, $SID2ch, $shirokuma); // datサイズは不正。全部取り直し。 - } - $body = substr ($body, 1); - } - - $file_append = ($zero_read) ? 0 : FILE_APPEND; - - if (FileCtl::file_write_contents ($this->keydat, $body, $file_append) === false) { - p2die ('cannot write file.'); - } - - // $GLOBALS['debug'] && $GLOBALS['profiler']->enterSection("dat_size_check"); - // 取得後サイズチェック - if ($zero_read == false && $this->onbytes) { - $this->getDatBytesFromLocalDat (); // $aThread->length をset - if ($this->onbytes != $this->length) { - $this->onbytes = 0; - $this->modified = null; - P2Util::pushInfoHtml ("<p>rep2 info: {$this->onbytes}/{$this->length} ファイルサイズが変なので、datを再取得</p>"); - // $GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("dat_size_check"); - return $this->_downloadDat2chMaru($uaMona, $SID2ch, $shirokuma); // datサイズは不正。全部取り直し。 - } - } - - return true; - } elseif ($code == '304') { - return '304 Not Modified'; - } else { - return $this->_downloadDat2chMaruNotFound ($code); - } - } catch (Exception $e) { - $this->getdat_error_msg_ht .= "<p>サーバ接続エラー: " . $e->getMessage (); - $this->getdat_error_msg_ht .= "<br>rep2 error: 板サーバへの接続に失敗しました。</p>"; - $this->diedat = true; - return false; - } - } - - // }}} - // {{{ _downloadDat2chMaruNotFound() - - /** - * ●IDでの取得ができなかったときに呼び出される - */ - protected function _downloadDat2chMaruNotFound() { - global $_conf; - - // 再チャレンジがまだなら、再チャレンジする。SIDが変更されてしまっている場合がある時のための自動チャレンジ。 - if (empty ($_REQUEST['relogin2ch']) && empty ($_REQUEST['shirokuma'])) { - $_REQUEST['relogin2ch'] = true; - return $this->downloadDat (); - } else { - $remarutori_ht = $this->_generateMarutoriLink (true); - $this->getdat_error_msg_ht .= "<p>rep2 info: ●IDでのスレッド取得に失敗しました。{$remarutori_ht}{$moritori_ht}</p>"; - $this->diedat = true; - return false; - } - } - // }}} // {{{ _downloadDat2chKako() From ef772f869aaae70ac76e8db2843e9748274b4cfc Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 3 Mar 2016 14:50:43 +0900 Subject: [PATCH 182/339] =?UTF-8?q?=E2=97=8F=E3=81=A7DAT=E3=82=92=E5=8F=96?= =?UTF-8?q?=E5=BE=97=E3=81=99=E3=82=8B=E3=81=9F=E3=82=81=E3=81=AE=E3=83=AA?= =?UTF-8?q?=E3=83=B3=E3=82=AF=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 29 +++++------------------------ 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 6281f2f6a..c055835ef 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -674,9 +674,9 @@ public function get2chDatError($code = null) { // <title>がこのスレッドは過去ログ倉庫に if ($reason === 'datochi' || preg_match ($kakosoko_match, $read_response_html, $matches) || preg_match ($kakosoko_match2, $read_response_html, $matches)) { $dat_response_status = "このスレッドは過去ログ倉庫に格納されています。"; - $marutori_ht = $this->_generateMarutoriLink (); + //$marutori_ht = $this->_generateMarutoriLink (); $plugin_ht = $this->_generateWikiDatLink ($read_url); - $dat_response_msg = "<p>2ch info - このスレッドは過去ログ倉庫に格納されています。{$marutori_ht}{$moritori_ht}{$plugin_ht}</p>"; + $dat_response_msg = "<p>2ch info - このスレッドは過去ログ倉庫に格納されています。浪人ログインすると取得出来るかもしれません。{$plugin_ht}</p>"; // <title>がそんな板orスレッドないです。or error 3939 } elseif ($reason === 'kakohtml' or @@ -696,8 +696,9 @@ public function get2chDatError($code = null) { $dat_response_msg = "<p>2ch info - 隊長! 過去ログ倉庫で、<a href=\"{$kakolog_uri}.html\"{$_conf['bbs_win_target_at']}>スレッド {$matches[3]}.html</a> を発見しました。 [<a href=\"{$read_kako_url}\">rep2に取り込んで読む</a>]</p>"; } elseif (preg_match ($waithtml_match, $read_response_html, $matches)) { $dat_response_status = "隊長! スレッドはhtml化されるのを待っているようです。"; - $marutori_ht = $this->_generateMarutoriLink (); - $dat_response_msg = "<p>2ch info - 隊長! スレッドはhtml化されるのを待っているようです。{$marutori_ht}{$moritori_ht}</p>"; + //$marutori_ht = $this->_generateMarutoriLink (); + $plugin_ht = $this->_generateWikiDatLink ($read_url); + $dat_response_msg = "<p>2ch info - 隊長! スレッドはhtml化されるのを待っているようです。浪人ログインすると取得出来るかもしれません。{$plugin_ht}</p>"; } elseif (preg_match ($vip2ch_kakodat_match, $read_response_html, $matches)) { $dat_response_status = "隊長! 過去ログ倉庫で、datを発見しました。"; $kakolog_uri = "http://{$this->host}/{$matches[1]}"; @@ -1318,26 +1319,6 @@ protected function _generateWikiDatLink($read_url) { } // }}} - // {{{ _generateMarutoriHtml() - /** - * ●とofflawでdatを取得するためのリンクを生成する。 - * - * @param bool $retry - * @return string HTML - */ - protected function _generateMarutoriLink($retry = false) { - global $_conf; - - if ($retry) { - $retry_q = "&relogin2ch=true"; - $atext = "●IDで再取得する"; - } else { - $atext = "●IDでrep2に取り込む"; - } - $marutori_ht = " [<a href=\"{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&maru=true{$retry_q}{$_conf['k_at_a']}\">{$atext}</a>]"; - return $marutori_ht; - } - // }}} } // }}} From 1977a61a7ffa8c85d093d82557106e8cfa379696 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Mon, 22 Feb 2016 20:28:56 +0900 Subject: [PATCH 183/339] =?UTF-8?q?vip2ch.com=20=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/P2Util.php b/lib/P2Util.php index ec5295455..ae2681657 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1915,6 +1915,22 @@ static public function detectThread($url = null) $host = $matches[1]; list($bbs, $key, $ls) = self::parseMachiQuery($matches[4]); + // vip2ch.com - http://ex14.vip2ch.com/test/read.cgi/news4ssnip/1450958506/ + } elseif (preg_match('<^https?://((\\w+)\\.vip2ch\\.com)/test/(?:read\\.(?:cgi|html|so)|mread\\.cgi)/(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) + { + $host = $matches[1]; + $bbs = $matches[3]; + $key = $matches[4]; + $ls = (isset($matches[5]) && strlen($matches[5])) ? $matches[5] : ''; + + // vip2ch.com - http://ex14.vip2ch.com/i/responce.html?bbs=news4ssnip&dat=1450958506 + } elseif (preg_match('<^https?://((\\w+)\\.vip2ch\\.com)/i/responce\\.html\\?bbs=(\\w+)&dat=([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) + { + $host = $matches[1]; + $bbs = $matches[3]; + $key = $matches[4]; + $ls = (isset($matches[5]) && strlen($matches[5])) ? $matches[5] : ''; + // 2ch or pink - http://choco.2ch.net/test/read.cgi/event/1027770702/ } elseif (preg_match('<^https?://(.+)/test/read\\.(?:cgi|html|so) /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) From c31c72faf0a9a27ae9a6c70f89437b152fd9d04a Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Mon, 22 Feb 2016 20:31:25 +0900 Subject: [PATCH 184/339] =?UTF-8?q?=E3=81=B3=E3=82=93=E3=81=9F=E3=82=93?= =?UTF-8?q?=EF=BD=A5=E3=81=B9=E3=81=A3=E3=81=8B=E3=82=93=E3=81=93=E3=81=AE?= =?UTF-8?q?=20URL=20=E3=81=8C=E6=8C=87=E5=AE=9A=E3=81=95=E3=82=8C=E3=81=9F?= =?UTF-8?q?=E6=99=82=E3=81=AB=E6=AD=A3=E3=81=97=E3=81=8F=E3=82=B9=E3=83=AC?= =?UTF-8?q?=E3=81=8C=E8=A1=A8=E7=A4=BA=E3=81=95=E3=82=8C=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/P2Util.php b/lib/P2Util.php index ae2681657..2b3d6c10b 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1942,6 +1942,15 @@ static public function detectThread($url = null) $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; } + // 2ch or pink by ula.cc(bintan / bekkanko) - http://choco.2ch.net/test/read.cgi/event/1027770702/ + } elseif (preg_match('<^http://(?:bintan|same)\\.ula\\.cc/test/(?:read\\.(?:cgi|html|so)|r\\.so) + /(.+)/(\\w+)/([0-9]+)(?:/([^/]*))>x', $nama_url, $matches)) + { + $host = $matches[1]; + $bbs = $matches[2]; + $key = $matches[3]; + $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; + // 2ch or pink 過去ログhtml - http://pc.2ch.net/mac/kako/1015/10153/1015358199.html } elseif (preg_match('<^(https?://(.+)(?:/[^/]+)?/(\\w+) /kako/\\d+(?:/\\d+)?/(\\d+)).html>x', $nama_url, $matches)) From 9cf4df517116c1eb6986d13a39e163e6d3aa6256 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Mon, 22 Feb 2016 20:33:21 +0900 Subject: [PATCH 185/339] =?UTF-8?q?=EF=BD=A2=E6=B5=AA=E4=BA=BA=E3=81=8A?= =?UTF-8?q?=E5=BD=B9=E7=AB=8B=E3=81=A1=E3=83=84=E3=83=BC=E3=83=AB=EF=BD=A3?= =?UTF-8?q?=E3=81=AE=E3=83=AA=E3=83=B3=E3=82=AF=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/login2ch.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rep2/login2ch.php b/rep2/login2ch.php index 14790a8d1..24ac1ac7b 100644 --- a/rep2/login2ch.php +++ b/rep2/login2ch.php @@ -157,6 +157,9 @@ function checkPass2ch(){ $tora3_url = "http://2ch.tora3.net/"; $tora3_url_r = P2Util::throughIme($tora3_url); +$tool_url = "https://maraga.jp/1.1/RoninTool.php"; +$tool_url_r = P2Util::throughIme($tool_url); + if (!$_conf['ktai']) { $id_input_size_at = " size=\"30\""; $pass_input_size_at = " size=\"24\""; @@ -190,7 +193,10 @@ function checkPass2ch(){ //================================================================ echo <<<EOP -<p>2ch IDについての詳細はこちら→ <a href="{$tora3_url_r}" target="_blank">{$tora3_url}</a></p> +<p> +浪人お役立ちツールはこちら→ <a href="{$tool_url_r}" target="_blank">{$tool_url}</a><br /> +2ちゃんねる浪人についての詳細はこちら→ <a href="{$tora3_url_r}" target="_blank">{$tora3_url}</a> +</p> EOP; if ($_conf['ktai']) { From 0ac4a6a8f8a782232e56b1195981992f18e332cc Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Mon, 22 Feb 2016 20:40:30 +0900 Subject: [PATCH 186/339] =?UTF-8?q?=E3=82=B9=E3=83=AC=E3=83=83=E3=83=89?= =?UTF-8?q?=E4=BD=9C=E6=88=90=E6=97=A5=E6=99=82=E3=81=AE=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=83=95=E3=82=A9=E3=83=BC=E3=83=9E=E3=83=83=E3=83=88=E3=82=92?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_user_def.inc.php | 9 +++++++++ lib/sb_print.inc.php | 12 +++++++----- rep2/edit_conf_user.php | 1 + 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index cf3371020..0ff22006a 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -118,6 +118,15 @@ $conf_user_def['mobile.sb_ttitle_trim_pos'] = 1; // (1) $conf_user_rad['mobile.sb_ttitle_trim_pos'] = array('-1' => '先頭', '0' => '中央', '1' => '末尾'); +// スレッド作成日時の表示フォーマット +$conf_user_def['birth_format'] = 'y/m/d'; +$conf_user_sel['birth_format'] = array( + 'y/m/d' => 'YY/MM/DD', + 'y/m/d H:i:s' => 'YY/MM/DD HH:MM:SS', + 'Y/m/d' => 'YYYY/MM/DD', + 'Y/m/d H:i:s' => 'YYYY/MM/DD HH:MM:SS', + ); + // }}} // {{{ read diff --git a/lib/sb_print.inc.php b/lib/sb_print.inc.php index bb6fe6da7..d0d349be7 100644 --- a/lib/sb_print.inc.php +++ b/lib/sb_print.inc.php @@ -190,9 +190,9 @@ function sb_print($aThreadList) <th{$class_ti} id="sb_th_ikioi"><a{$class_sort_ikioi} href="{$_conf['subject_php']}?sort=ikioi{$sortq_common}{$rsortq_ikioi}{$norefresh_q}" target="_self">勢い</a></th>\n EOP; } - // Birthday + // Birth echo <<<EOP -<th{$class_t} id="sb_th_bd"><a{$class_sort_bd} href="{$_conf['subject_php']}?sort=bd{$sortq_common}{$rsortq_bd}{$norefresh_q}" target="_self">Birthday</a></th>\n +<th{$class_t} id="sb_th_bd"><a{$class_sort_bd} href="{$_conf['subject_php']}?sort=bd{$sortq_common}{$rsortq_bd}{$norefresh_q}" target="_self">since</a></th>\n EOP; // お気に入り if ($_conf['sb_show_fav'] && $aThreadList->spmode != 'taborn') { @@ -448,9 +448,11 @@ function sb_print($aThreadList) $td['ikioi'] = "<td{$class_ti}>{$dayres_st}</td>\n"; } - // Birthday - $birthday = date('y/m/d', $aThread->key); // (y/m/d H:i) - $td['birth'] = "<td{$class_t}>{$birthday}</td>\n"; + // Birth + $birth_format = isset($_conf['birth_format']) ? $_conf['birth_format'] : 'y/m/d'; + $birth = date($birth_format, $aThread->key); // (y/m/d H:i) + $td['birth'] = "<td{$class_t}>{$birth}</td>\n"; + unset($birth_format); // +live 実況ボタンの処理 // +live 実況中ic2のサムネイル作成をonoff diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index b0a8e583f..1dbb9d9d8 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -283,6 +283,7 @@ array('viewall_kitoku', '既得スレは表示件数に関わらず表示'), array('delete_copyright', 'スレッドのタイトルから著作権表記を削除する'), array('delete_copyright.list', '削除する著作権表記の文字列(カンマ区切り)'), + array('birth_format', 'スレッド作成日時の表示フォーマット'), ); printEditConfGroupHtml($groupname, $conflist, $flags); } From 0b8242f4b4b49f37717a9a39d9770f94321a53a7 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 3 Mar 2016 15:08:30 +0900 Subject: [PATCH 187/339] =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E9=A0=85=E7=9B=AE?= =?UTF-8?q?=E3=81=AE=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=9F=E3=81=9F=E3=82=81?= =?UTF-8?q?=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7=E3=83=B3=E7=95=AA=E5=8F=B7?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=EF=BC=88=E4=BA=BA=E6=9F=B1=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 24d87ee4b..31dd32442 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '150815.1030', // rep2のバージョン + 'p2version' => '160303.9001', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; From e7e3c599f8f65ac5a5d91b3d8454b879d1c8a4b8 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 3 Mar 2016 18:18:19 +0900 Subject: [PATCH 188/339] =?UTF-8?q?SOCKS5=E3=83=97=E3=83=AD=E3=82=AF?= =?UTF-8?q?=E3=82=B7=E7=B5=8C=E7=94=B1=E3=81=AE=E6=8E=A5=E7=B6=9A=E3=81=AB?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C(=E4=BA=BA=E6=9F=B1)=20tor(.onion=E3=83=89?= =?UTF-8?q?=E3=83=A1=E3=82=A4=E3=83=B3)=E3=82=92tor=E7=B5=8C=E7=94=B1?= =?UTF-8?q?=E3=81=A7=E9=96=B2=E8=A6=A7=E3=81=99=E3=82=8B=E6=A9=9F=E8=83=BD?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0(=E4=BA=BA=E6=9F=B1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- conf/conf_user_def.inc.php | 30 +++++++++++++++++ lib/P2Util.php | 67 +++++++++++++++++++++++++++++++++++--- lib/SettingTxt.php | 2 +- lib/SubjectTxt.php | 2 +- lib/ThreadRead.php | 10 +++--- lib/auth2chapi.inc.php | 2 +- lib/login2ch.inc.php | 2 +- lib/wiki/P2UtilWiki.php | 2 +- rep2/dig2ch.php | 2 +- rep2/edit_conf_user.php | 8 +++++ rep2/post.php | 2 +- 12 files changed, 113 insertions(+), 18 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 31dd32442..77b393e89 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '160303.9001', // rep2のバージョン + 'p2version' => '160303.9002', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 0ff22006a..73aecf57d 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -538,6 +538,36 @@ // プロキシパスワード (使用する場合のみ) $conf_user_def['proxy_password'] = ""; // ("") +// プロキシの種類 +$conf_user_def['proxy_mode'] = "http"; // ("http") +$conf_user_sel['proxy_mode'] = array( + 'socks5' => 'SOCKS5 プロキシ', + 'http' => 'HTTP プロキシ', +); + +// Tor 掲示板(.onion ドメイン)のアクセスに Tor を使用(する:1, しない:0) +$conf_user_def['tor_use'] = 0; // (0) +$conf_user_rad['tor_use'] = array('1' => 'する', '0' => 'しない'); + +// Tor プロキシホスト ex)"127.0.0.1", "www.p2proxy.com" +$conf_user_def['tor_proxy_host'] = ""; // ("") + +// Tor プロキシポート ex)"8080" +$conf_user_def['tor_proxy_port'] = ""; // ("") + +// Tor プロキシユーザー名 (使用する場合のみ) +$conf_user_def['tor_proxy_user'] = ""; // ("") + +// Tor プロキシパスワード (使用する場合のみ) +$conf_user_def['tor_proxy_password'] = ""; // ("") + +// Tor プロキシの種類 +$conf_user_def['tor_proxy_mode'] = "socks5"; // ("socks5") +$conf_user_sel['tor_proxy_mode'] = array( + 'socks5' => 'SOCKS5 プロキシ', + 'http' => 'HTTP プロキシ', +); + // フレーム左 板メニュー の表示幅 $conf_user_def['frame_menu_width'] = "158"; // ("158") diff --git a/lib/P2Util.php b/lib/P2Util.php index 2b3d6c10b..ad02f7a12 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -265,7 +265,7 @@ static public function fileDownload($url, $localfile, $req->setHeader ('If-Modified-Since', http_date(filemtime($localfile)) ); } - $response = $req->send(); + $response = self::getHTTPResponse($req); $code = $response->getStatus(); if (!($code == 200 || $code == 206 || $code == 304)) { @@ -441,7 +441,11 @@ static private function _p2DirOfHost($base_dir, $host, $dir_sep = true) // machibbs.com } elseif (self::isHostMachiBbs($host)) { $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'machibbs.com'; - + // tor + } elseif (self::isHostTor($host)) { + $tor_host = preg_replace('/\.onion\.(\w+)$/', '.onion', $host); + $host_dir = $base_dir . DIRECTORY_SEPARATOR . $tor_host; + unset($tor_host); // jbbs.livedoor.jp (livedoor レンタル掲示板) } elseif (self::isHostJbbsShitaraba($host)) { if (DIRECTORY_SEPARATOR == '/') { @@ -904,6 +908,35 @@ static public function isHostBbsPink($host) return self::$_hostIsBbsPink[$host]; } + // }}} + // {{{ isHostTor() + + /** + * host が tor 系板 なら true を返す + * + * @access public + * @param string $host + * @return boolean + */ + static function isHostTor($host, $isGatewayMode = 99) + { + switch($isGatewayMode){ + case 0: + $ret = (bool)preg_match('/\\.onion$/', $host); + break; + + case 1: + $ret = (bool)preg_match('/\\.(onion\\.cab|onion\\.city|onion\\.direct|onion\\.link|onion\\.nu|onion\\.to)$/', $host); + break; + + default: + $ret = (bool)preg_match('/\\.(onion\\.cab|onion\\.city|onion\\.direct|onion\\.link|onion\\.nu|onion\\.to|onion)$/', $host); + break; + } + + return $ret; + } + // }}} // {{{ isHostMachiBbs() @@ -1695,7 +1728,7 @@ static public function getWebPage($url, &$error_msg, $timeout = 15) $req = self::getHTTPRequest2($url, HTTP_Request2::METHOD_GET); //$req->addHeader("X-PHP-Version", phpversion()); - $response = $req->send(); + $response = self::getHTTPResponse($req); $code = $response->getStatus(); if ($code == 200 || $code == 206) { // || $code == 304) { @@ -2206,7 +2239,7 @@ static public function getBe2chCodeByMailPass($mail, $pass) $req->addPostParameter('pass', $pass); $req->addPostParameter('login', 'ログインする'); - $response = $req->send(); + $response = self::getHTTPResponse($req); $code = $response->getStatus(); // 成功とみなすコード @@ -2279,13 +2312,26 @@ static public function getHTTPRequest2($url , $method = HTTP_Request2::METHOD_GE } // プロキシ - if ($_conf['proxy_use']) { + if ($_conf['tor_use'] && P2Util::isHostTor($this->host, 0)) { // Tor(.onion)はTor用の設定をセット + $req->setConfig (array ( + 'proxy_host' => $_conf['tor_proxy_host'], + 'proxy_port' => $_conf['tor_proxy_port'], + 'proxy_user' => $_conf['tor_proxy_user'], + 'proxy_password' => $_conf['tor_proxy_password'] + )); + if($_conf['tor_proxy_mode'] == 'socks5'){ + $req->setConfig('proxy_type', $_conf['tor_proxy_mode']); + } + } elseif ($_conf['proxy_use']) { $req->setConfig (array ( 'proxy_host' => $_conf['proxy_host'], 'proxy_port' => $_conf['proxy_port'], 'proxy_user' => $_conf['proxy_user'], 'proxy_password' => $_conf['proxy_password'] )); + if($_conf['proxy_mode'] == 'socks5'){ + $req->setConfig('proxy_type', $_conf['proxy_mode']); + } } unset ($purl); @@ -2293,6 +2339,17 @@ static public function getHTTPRequest2($url , $method = HTTP_Request2::METHOD_GE return $req; } + static public function getHTTPResponse($req) { + if($req->getConfig('proxy_type') == 'socks5') { + $socks = HTTP_Request2_Adapter_Socket(); + $res = $socks->sendRequest($req); + unset($socks); + } else { + $res = $req->send (); + } + return $res; + } + // }}} // {{{ debug() /* diff --git a/lib/SettingTxt.php b/lib/SettingTxt.php index 4c4202378..23279f6fa 100644 --- a/lib/SettingTxt.php +++ b/lib/SettingTxt.php @@ -104,7 +104,7 @@ public function downloadSettingTxt() $req = P2Util::getHTTPRequest2($this->_url, HTTP_Request2::METHOD_GET); $modified && $req->setHeader("If-Modified-Since", $modified); - $response = $req->send(); + $response = P2Util::getHTTPResponse($req); $code = $response->getStatus(); if ($code == 302) { diff --git a/lib/SubjectTxt.php b/lib/SubjectTxt.php index 5519933aa..4a9e6b15a 100644 --- a/lib/SubjectTxt.php +++ b/lib/SubjectTxt.php @@ -99,7 +99,7 @@ public function downloadSubject() $req = P2Util::getHTTPRequest2($this->subject_url, HTTP_Request2::METHOD_GET); $modified && $req->setHeader("If-Modified-Since", $modified); - $response = $req->send(); + $response = P2Util::getHTTPResponse($req); $code = $response->getStatus(); if ($code == 302) { diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index c055835ef..e4bd34093 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -180,7 +180,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { )); // POSTデータの送信 - $response = $req->send (); + $response = P2Util::getHTTPResponse($req); // 2ch API の状態がヘッダーに記載されているので取得する。 // User-Status: 0 (sessionID無効) or 1 (sessionID有効) or @@ -390,7 +390,7 @@ protected function _downloadDat2ch($from_bytes) { } // Requestの送信 - $response = $req->send (); + $response = P2Util::getHTTPResponse($req); $code = $response->getStatus (); @@ -527,7 +527,7 @@ protected function _downloadDat2chKako($uri, $ext) { $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_GET); // Requestの送信 - $response = $req->send (); + $response = P2Util::getHTTPResponse($req); $code = $response->getStatus (); @@ -624,7 +624,7 @@ public function get2chDatError($code = null) { $req->setHeader ('User-Agent', P2Util::getP2UA(false,P2Util::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG // Requestの送信 - $response = $req->send (); + $response = P2Util::getHTTPResponse($req); $res_code = $response->getStatus (); @@ -1199,7 +1199,7 @@ private function _get2ch203Body() { $url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; $req = P2Util::getHTTPRequest2 ($url,HTTP_Request2::METHOD_GET); - $res = $req->send (); + $res = P2Util::getHTTPResponse($req); // レスポンスコードを検証 if ('203' == $res->getStatus ()) { diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index daae86591..6090930b6 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -54,7 +54,7 @@ function authenticate_2chapi() $req->addPostParameter('HB', $HB); // POSTデータの送信 - $res = $req->send(); + $res = P2Util::getHTTPResponse($req); $code = $res->getStatus(); if ($code =! 200) { diff --git a/lib/login2ch.inc.php b/lib/login2ch.inc.php index dbf04884a..3ab4083f6 100644 --- a/lib/login2ch.inc.php +++ b/lib/login2ch.inc.php @@ -54,7 +54,7 @@ function login2ch() $req->addPostParameter('PW', $login2chPW); // POSTデータの送信 - $res = $req->send(); + $res = P2Util::getHTTPResponse($req); $code = $res->getStatus(); if ($code =! 200) { diff --git a/lib/wiki/P2UtilWiki.php b/lib/wiki/P2UtilWiki.php index de75dd1f7..58f4e42c9 100644 --- a/lib/wiki/P2UtilWiki.php +++ b/lib/wiki/P2UtilWiki.php @@ -41,7 +41,7 @@ public static function getResponseCode($url) { try { $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_HEAD); - $response = $req->send(); + $response = P2Util::getHTTPResponse($req); return $response->getStatus(); } catch (Exception $e) { diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php index 063d88896..80050010a 100644 --- a/rep2/dig2ch.php +++ b/rep2/dig2ch.php @@ -18,7 +18,7 @@ function dig2chsearch($query) $req->setHeader('Cache-Control', 'no-cache'); $req->setHeader('Accept', 'application/json'); - $response = $req->send(); + $response = P2Util::getHTTPResponse($req); $code = $response->getStatus(); if ($code != 200) { diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index 1dbb9d9d8..1694fd748 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -436,6 +436,14 @@ array('proxy_port', 'プロキシポート ex)"8080"'), array('proxy_user', 'プロキシユーザー名 (使用する場合のみ)'), array('proxy_password', 'プロキシパスワード (使用する場合のみ)'), + array('proxy_mode', 'プロキシの種類(人柱)'), + 'Tor 掲示板(人柱)', + array('tor_use', 'Tor 掲示板(.onion ドメイン)のアクセスに Tor を使用'), + array('tor_proxy_host', 'Tor プロキシホスト ex)"127.0.0.1", "p2proxy.example"'), + array('tor_proxy_port', 'Tor プロキシポート ex)"8080"'), + array('tor_proxy_user', 'Tor プロキシユーザー名 (使用する場合のみ)'), + array('tor_proxy_password', 'Tor プロキシパスワード (使用する場合のみ)'), + array('tor_proxy_mode', 'Tor プロキシの種類'), 'SSL通信設定', array('ssl_function', 'SSL通信(●ログイン等)に使用する関数<br>(関数に該当する拡張をインストールする必要がある)'), array('ssl_capath', 'SSL通信で接続先を検証するための証明書があるディレクトリ ex)"/etc/ssl/certs"<br>設定なして動く場合は設定不要<br>ssl_functionに対応した形式の証明書が必要'), diff --git a/rep2/post.php b/rep2/post.php index bcd0d3c43..93a92b369 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -424,7 +424,7 @@ function postIt($host, $bbs, $key, $post) } // POSTデータの送信 - $response = $req->send(); + $response = P2Util::getHTTPResponse($req); // Cookieを取得 $cookies = $response->getCookies(); From 91e78803c6be7c23c1a3af65688d5f8028b64641 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Mon, 22 Feb 2016 20:25:16 +0900 Subject: [PATCH 189/339] =?UTF-8?q?p2proxy=20=E5=AF=BE=E5=BF=9C(=E4=BB=AE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/Login.php | 6 +++--- lib/bootstrap.php | 2 +- lib/login_first.inc.php | 14 +++++++------- lib/post_form_options.inc.php | 7 +------ rep2/login.php | 8 ++++---- rep2/post.php | 2 +- 6 files changed, 17 insertions(+), 22 deletions(-) diff --git a/lib/Login.php b/lib/Login.php index a012b63d2..03115f634 100644 --- a/lib/Login.php +++ b/lib/Login.php @@ -317,7 +317,7 @@ private function _authCheck() // {{{ フォームからログインした時 - if (!empty($_POST['submit_member'])) { + if (!empty($_POST['submit_userlogin'])) { // フォームログイン成功なら if ($_POST['form_login_id'] == $this->user_u and sha1($_POST['form_login_pass']) == $this->pass_x) { @@ -463,8 +463,8 @@ public function registerCookie() { $r = true; - if (!empty($_REQUEST['ctl_keep_login'])) { - if (!empty($_REQUEST['keep_login'])) { + if (!empty($_REQUEST['ctl_register_cookie'])) { + if (!empty($_REQUEST['register_cookie'])) { $r = $this->setCookieCid($this->user_u, $this->pass_x); } else { // クッキーをクリア diff --git a/lib/bootstrap.php b/lib/bootstrap.php index 24e3b80f4..03518e137 100644 --- a/lib/bootstrap.php +++ b/lib/bootstrap.php @@ -99,7 +99,7 @@ // エンコーディング判定用文字列の取得 if (!empty($_POST)) { // 新規ログインとメンバーログインの同時指定はありえないので、エラーを出す - if (isset($_POST['submit_new']) && isset($_POST['submit_member'])) { + if (isset($_POST['submit_new']) && isset($_POST['submit_member']) && isset($_POST['submit_userlogin'])) { p2die('無効なリクエストです。'); } diff --git a/lib/login_first.inc.php b/lib/login_first.inc.php index 17d8b3729..b6472c2e3 100644 --- a/lib/login_first.inc.php +++ b/lib/login_first.inc.php @@ -59,16 +59,16 @@ function printLoginFirst(Login $_login) //============================================== $mobile = Net_UserAgent_Mobile::singleton(); - $keep_login_checked = ' checked'; - if (isset($_POST['submit_new']) || isset($_POST['submit_member'])) { - if (!isset($_POST['keep_login']) || $_POST['keep_login'] !== '1') { - $keep_login_checked = ''; + $register_cookie_checked = ' checked'; + if (isset($_POST['submit_new']) || isset($_POST['submit_member']) || isset($_POST['submit_userlogin'])) { + if (!isset($_POST['register_cookie']) || $_POST['register_cookie'] !== '1') { + $register_cookie_checked = ''; } } $auth_sub_input_ht = <<<EOP <input type="hidden" name="device_pixel_ratio" id="device_pixel_ratio" value="1"> -<input type="hidden" name="ctl_keep_login" value="1"> -<input type="checkbox" id="keep_login" name="keep_login" value="1"{$keep_login_checked}><label for="keep_login">Cookieにログイン状態を保持</label><br> +<input type="hidden" name="ctl_register_cookie" value="1"> +<input type="checkbox" id="register_cookie" name="register_cookie" value="1"{$register_cookie_checked}><label for="register_cookie">Cookieにログイン状態を保持</label><br> EOP; // }}} @@ -114,7 +114,7 @@ function printLoginFirst(Login $_login) } if (file_exists($_conf['auth_user_file'])) { - $submit_ht = '<input type="submit" name="submit_member" value="ユーザログイン">'; + $submit_ht = '<input type="submit" name="submit_userlogin" value="ユーザログイン">'; } else { $submit_ht = '<input type="submit" name="submit_new" value="新規登録">'; } diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index 563c03e11..592e5dc5b 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -15,7 +15,6 @@ $hd['mail'] = ''; $hd['MESSAGE'] = ''; $hd['subject'] = ''; -$hd['beres_checked'] = ''; $hd['p2res_checked'] = ''; $htm['beres'] = ''; @@ -102,9 +101,6 @@ function setHiddenValue(button) { // beres/p2res if ($post_config = PostDataStore::get($post_config_key)) { - if ($post_config['beres']) { - $hd['beres_checked'] = ' checked'; - } if ($post_config['p2res']) { $hd['p2res_checked'] = ' checked'; } @@ -175,8 +171,7 @@ function setHiddenValue(button) { // Be if (P2Util::isHost2chs($host) and P2Util::isEnableBe2ch()) { - $htm['beres'] = '<input type="checkbox" id="beres" name="beres" value="1"'. $hd['beres_checked'] . '>' - . '<label for="beres">Beで書き込む</label>'; + $htm['beres'] = '<input type="submit" id="submit_beres" name="submit_beres" value="Beで書き込む" onclick="setHiddenValue(this);" tabindex="5">'; } // }}} diff --git a/rep2/login.php b/rep2/login.php index 61ac58990..389c216f9 100644 --- a/rep2/login.php +++ b/rep2/login.php @@ -197,14 +197,14 @@ // 情報表示 P2Util::printInfoHtml(); -echo '<p id="login_status">'; +echo '<div id="login_status">'; echo <<<EOP -{$p_str['autho_user']}: {$_login->user_u}<br> -{$p_htm['auth_cookie']} +{$p_str['autho_user']}: {$_login->user_u} <font color="gray">(p2 ID: 9999999999)</font><br> +{$p_htm['auth_cookie']}モリタポ残高: 99999 (<a href="http://find.moritapo.jp/moritapo/amount.php" target="_blank">モリタポ通帳</a>)<br><br> <br> [<a href="./index.php?logout=1" target="_parent">{$p_str['logout']}する</a>] EOP; -echo '</p>'; +echo '</div>'; echo $login_form_ht; diff --git a/rep2/post.php b/rep2/post.php index 93a92b369..b8e5ae449 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -400,7 +400,7 @@ function postIt($host, $bbs, $key, $post) } // be.2ch.net 認証クッキー - if (P2Util::isHostBe2chNet($host) || !empty($_REQUEST['beres'])) { + if (P2Util::isHostBe2chNet($host) || !empty($_REQUEST['submit_beres'])) { if ($_conf['be_2ch_DMDM'] && $_conf['be_2ch_MDMD']) { $req->addCookie('DMDM', urlencode( rawurldecode( $_conf['be_2ch_DMDM']) ) ); $req->addCookie('MDMD', urlencode( rawurldecode( $_conf['be_2ch_MDMD']) ) ); From 83941138930c03de0f3d9da4b3af5078d26a9930 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 3 Mar 2016 22:35:06 +0900 Subject: [PATCH 190/339] =?UTF-8?q?91e78803c6be7c23c1a3af65688d5f8028b6464?= =?UTF-8?q?1=20=E3=81=A7p2proxy=E3=81=AE=E7=82=BA=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=E3=81=97=E3=81=9F=E9=83=A8=E5=88=86=E3=82=92=E9=9D=9E?= =?UTF-8?q?=E8=A1=A8=E7=A4=BA=E3=81=AB=E3=81=97=E3=81=A6=E3=81=93=E3=82=8C?= =?UTF-8?q?=E3=81=BE=E3=81=A7=E9=80=9A=E3=82=8A=E3=81=AE=E8=A6=8B=E3=81=9F?= =?UTF-8?q?=E7=9B=AE=E3=81=AB=E6=88=BB=E3=81=97=E3=81=9F=E3=80=82=20?= =?UTF-8?q?=E3=81=82=E3=81=8F=E3=81=BE=E3=81=A7=E3=83=96=E3=83=A9=E3=82=A6?= =?UTF-8?q?=E3=82=B6=E5=84=AA=E5=85=88=E3=80=82p2proxy=E3=81=8C=E3=81=BE?= =?UTF-8?q?=E3=81=A8=E3=82=82=E3=81=AA=E5=AE=9F=E8=A3=85=E3=81=AA=E3=82=89?= =?UTF-8?q?=E3=81=B0display:=20none;=E3=81=A7=E3=82=82=E3=81=A1=E3=82=83?= =?UTF-8?q?=E3=82=93=E3=81=A8=E5=8B=95=E3=81=8F=E3=81=A0=E3=82=8D=E3=81=86?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/post_form_options.inc.php | 8 +++++++- rep2/login.php | 4 ++-- rep2/post.php | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index 592e5dc5b..d37209190 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -15,6 +15,7 @@ $hd['mail'] = ''; $hd['MESSAGE'] = ''; $hd['subject'] = ''; +$hd['beres_checked'] = ''; $hd['p2res_checked'] = ''; $htm['beres'] = ''; @@ -101,6 +102,9 @@ function setHiddenValue(button) { // beres/p2res if ($post_config = PostDataStore::get($post_config_key)) { + if ($post_config['beres']) { + $hd['beres_checked'] = ' checked'; + } if ($post_config['p2res']) { $hd['p2res_checked'] = ' checked'; } @@ -171,7 +175,9 @@ function setHiddenValue(button) { // Be if (P2Util::isHost2chs($host) and P2Util::isEnableBe2ch()) { - $htm['beres'] = '<input type="submit" id="submit_beres" name="submit_beres" value="Beで書き込む" onclick="setHiddenValue(this);" tabindex="5">'; + $htm['beres'] = '<input type="checkbox" id="beres" name="beres" value="1"'. $hd['beres_checked'] . '>' + . '<label for="beres">Beで書き込む</label>' + . '<input style="display: none;" type="submit" id="submit_beres" name="submit_beres" value="Beで書き込む" onclick="setHiddenValue(this);" tabindex="5">'; } // }}} diff --git a/rep2/login.php b/rep2/login.php index 389c216f9..7713a73f7 100644 --- a/rep2/login.php +++ b/rep2/login.php @@ -199,8 +199,8 @@ echo '<div id="login_status">'; echo <<<EOP -{$p_str['autho_user']}: {$_login->user_u} <font color="gray">(p2 ID: 9999999999)</font><br> -{$p_htm['auth_cookie']}モリタポ残高: 99999 (<a href="http://find.moritapo.jp/moritapo/amount.php" target="_blank">モリタポ通帳</a>)<br><br> +{$p_str['autho_user']}: {$_login->user_u} <font style="display: none;" color="gray">(p2 ID: 9999999999)</font><br> +{$p_htm['auth_cookie']}<span style="display: none;">モリタポ残高: 99999 (<a href="http://find.moritapo.jp/moritapo/amount.php" target="_blank">モリタポ通帳</a>)</span><br><br> <br> [<a href="./index.php?logout=1" target="_parent">{$p_str['logout']}する</a>] EOP; diff --git a/rep2/post.php b/rep2/post.php index b8e5ae449..bd536ab1f 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -400,7 +400,7 @@ function postIt($host, $bbs, $key, $post) } // be.2ch.net 認証クッキー - if (P2Util::isHostBe2chNet($host) || !empty($_REQUEST['submit_beres'])) { + if (P2Util::isHostBe2chNet($host) || !empty($_REQUEST['beres']) || !empty($_REQUEST['submit_beres'])) { if ($_conf['be_2ch_DMDM'] && $_conf['be_2ch_MDMD']) { $req->addCookie('DMDM', urlencode( rawurldecode( $_conf['be_2ch_DMDM']) ) ); $req->addCookie('MDMD', urlencode( rawurldecode( $_conf['be_2ch_MDMD']) ) ); From 7328e3aa57816e09ffaa3cddc4fe0793e40c9390 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 3 Mar 2016 23:08:12 +0900 Subject: [PATCH 191/339] =?UTF-8?q?Revert=20"p2proxy=20=E5=AF=BE=E5=BF=9C(?= =?UTF-8?q?=E4=BB=AE)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 91e78803c6be7c23c1a3af65688d5f8028b64641. Conflicts: lib/post_form_options.inc.php rep2/login.php rep2/post.php p2proxy縺ョPOST蜈医′繧オ繝シ繝舌シ蜷/p2蝗コ螳壹□縺九i縺繧阪>繧阪a繧薙←縺上&縺吶℃縺ヲrep2蛛エ縺ァ蟇セ蠢懊☆繧倶セ。蛟、辟。縺励 --- lib/Login.php | 6 +++--- lib/bootstrap.php | 2 +- lib/login_first.inc.php | 14 +++++++------- lib/post_form_options.inc.php | 3 +-- rep2/login.php | 8 ++++---- rep2/post.php | 2 +- 6 files changed, 17 insertions(+), 18 deletions(-) diff --git a/lib/Login.php b/lib/Login.php index 03115f634..a012b63d2 100644 --- a/lib/Login.php +++ b/lib/Login.php @@ -317,7 +317,7 @@ private function _authCheck() // {{{ フォームからログインした時 - if (!empty($_POST['submit_userlogin'])) { + if (!empty($_POST['submit_member'])) { // フォームログイン成功なら if ($_POST['form_login_id'] == $this->user_u and sha1($_POST['form_login_pass']) == $this->pass_x) { @@ -463,8 +463,8 @@ public function registerCookie() { $r = true; - if (!empty($_REQUEST['ctl_register_cookie'])) { - if (!empty($_REQUEST['register_cookie'])) { + if (!empty($_REQUEST['ctl_keep_login'])) { + if (!empty($_REQUEST['keep_login'])) { $r = $this->setCookieCid($this->user_u, $this->pass_x); } else { // クッキーをクリア diff --git a/lib/bootstrap.php b/lib/bootstrap.php index 03518e137..24e3b80f4 100644 --- a/lib/bootstrap.php +++ b/lib/bootstrap.php @@ -99,7 +99,7 @@ // エンコーディング判定用文字列の取得 if (!empty($_POST)) { // 新規ログインとメンバーログインの同時指定はありえないので、エラーを出す - if (isset($_POST['submit_new']) && isset($_POST['submit_member']) && isset($_POST['submit_userlogin'])) { + if (isset($_POST['submit_new']) && isset($_POST['submit_member'])) { p2die('無効なリクエストです。'); } diff --git a/lib/login_first.inc.php b/lib/login_first.inc.php index b6472c2e3..17d8b3729 100644 --- a/lib/login_first.inc.php +++ b/lib/login_first.inc.php @@ -59,16 +59,16 @@ function printLoginFirst(Login $_login) //============================================== $mobile = Net_UserAgent_Mobile::singleton(); - $register_cookie_checked = ' checked'; - if (isset($_POST['submit_new']) || isset($_POST['submit_member']) || isset($_POST['submit_userlogin'])) { - if (!isset($_POST['register_cookie']) || $_POST['register_cookie'] !== '1') { - $register_cookie_checked = ''; + $keep_login_checked = ' checked'; + if (isset($_POST['submit_new']) || isset($_POST['submit_member'])) { + if (!isset($_POST['keep_login']) || $_POST['keep_login'] !== '1') { + $keep_login_checked = ''; } } $auth_sub_input_ht = <<<EOP <input type="hidden" name="device_pixel_ratio" id="device_pixel_ratio" value="1"> -<input type="hidden" name="ctl_register_cookie" value="1"> -<input type="checkbox" id="register_cookie" name="register_cookie" value="1"{$register_cookie_checked}><label for="register_cookie">Cookieにログイン状態を保持</label><br> +<input type="hidden" name="ctl_keep_login" value="1"> +<input type="checkbox" id="keep_login" name="keep_login" value="1"{$keep_login_checked}><label for="keep_login">Cookieにログイン状態を保持</label><br> EOP; // }}} @@ -114,7 +114,7 @@ function printLoginFirst(Login $_login) } if (file_exists($_conf['auth_user_file'])) { - $submit_ht = '<input type="submit" name="submit_userlogin" value="ユーザログイン">'; + $submit_ht = '<input type="submit" name="submit_member" value="ユーザログイン">'; } else { $submit_ht = '<input type="submit" name="submit_new" value="新規登録">'; } diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index d37209190..563c03e11 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -176,8 +176,7 @@ function setHiddenValue(button) { // Be if (P2Util::isHost2chs($host) and P2Util::isEnableBe2ch()) { $htm['beres'] = '<input type="checkbox" id="beres" name="beres" value="1"'. $hd['beres_checked'] . '>' - . '<label for="beres">Beで書き込む</label>' - . '<input style="display: none;" type="submit" id="submit_beres" name="submit_beres" value="Beで書き込む" onclick="setHiddenValue(this);" tabindex="5">'; + . '<label for="beres">Beで書き込む</label>'; } // }}} diff --git a/rep2/login.php b/rep2/login.php index 7713a73f7..61ac58990 100644 --- a/rep2/login.php +++ b/rep2/login.php @@ -197,14 +197,14 @@ // 情報表示 P2Util::printInfoHtml(); -echo '<div id="login_status">'; +echo '<p id="login_status">'; echo <<<EOP -{$p_str['autho_user']}: {$_login->user_u} <font style="display: none;" color="gray">(p2 ID: 9999999999)</font><br> -{$p_htm['auth_cookie']}<span style="display: none;">モリタポ残高: 99999 (<a href="http://find.moritapo.jp/moritapo/amount.php" target="_blank">モリタポ通帳</a>)</span><br><br> +{$p_str['autho_user']}: {$_login->user_u}<br> +{$p_htm['auth_cookie']} <br> [<a href="./index.php?logout=1" target="_parent">{$p_str['logout']}する</a>] EOP; -echo '</div>'; +echo '</p>'; echo $login_form_ht; diff --git a/rep2/post.php b/rep2/post.php index bd536ab1f..93a92b369 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -400,7 +400,7 @@ function postIt($host, $bbs, $key, $post) } // be.2ch.net 認証クッキー - if (P2Util::isHostBe2chNet($host) || !empty($_REQUEST['beres']) || !empty($_REQUEST['submit_beres'])) { + if (P2Util::isHostBe2chNet($host) || !empty($_REQUEST['beres'])) { if ($_conf['be_2ch_DMDM'] && $_conf['be_2ch_MDMD']) { $req->addCookie('DMDM', urlencode( rawurldecode( $_conf['be_2ch_DMDM']) ) ); $req->addCookie('MDMD', urlencode( rawurldecode( $_conf['be_2ch_MDMD']) ) ); From ef74863e4473baa4c70164534758d37ce79b349d Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Thu, 3 Mar 2016 22:23:46 +0900 Subject: [PATCH 192/339] =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E3=83=A1?= =?UTF-8?q?=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=81=AB=202ch=20API=20?= =?UTF-8?q?=E3=81=AB=E9=96=A2=E3=81=97=E3=81=A6=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/auth2chapi.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index 6090930b6..551258e2d 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -92,7 +92,7 @@ function authenticate_2chapi() } if($sid[0]!='SESSION-ID=Monazilla/1.00') { - P2Util::pushInfoHtml("<p>p2 Error: レスポンスからSessionIDを取得出来ませんでした。</p>"); + P2Util::pushInfoHtml("<p>p2 Error: 2ch API のレスポンスからSessionIDを取得出来ませんでした。</p>"); return ''; } From 6266a3acdcaf258e05998fb184c3cf4edcf3702b Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 4 Mar 2016 01:45:52 +0900 Subject: [PATCH 193/339] =?UTF-8?q?IC2=E3=81=A8=E7=BD=AE=E6=8F=9B=E3=83=97?= =?UTF-8?q?=E3=83=A9=E3=82=B0=E3=82=A4=E3=83=B3=E3=81=AE=E9=80=9A=E4=BF=A1?= =?UTF-8?q?=E5=91=A8=E3=82=8A=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/wiki/ReplaceImageUrlCtl.php | 86 ++++++++++--------- rep2/ic2.php | 148 ++++++++++++++++---------------- 2 files changed, 119 insertions(+), 115 deletions(-) diff --git a/lib/wiki/ReplaceImageUrlCtl.php b/lib/wiki/ReplaceImageUrlCtl.php index b693b2ddf..8f334c5e8 100644 --- a/lib/wiki/ReplaceImageUrlCtl.php +++ b/lib/wiki/ReplaceImageUrlCtl.php @@ -254,27 +254,53 @@ public function extractPage($url, $match, $replace, $referer, $source, $ident=nu ? $this->cacheData[$url]['data'] : $ret; } - $params = array(); - $params['timeout'] = $_conf['http_conn_timeout']; - $params['readTimeout'] = array($_conf['http_read_timeout'], 0); - if ($_conf['proxy_use']) { - $params['proxy_host'] = $_conf['proxy_host']; - $params['proxy_port'] = $_conf['proxy_port']; - } - $req = new HTTP_Request($get_url, $params); - if ($this->cacheData[$url] && $this->cacheData[$url]['responseHeaders'] - && $this->cacheData[$url]['responseHeaders']['last-modified'] - && strlen($this->cacheData[$url]['responseHeaders']['last-modified'])) { - $req->addHeader("If-Modified-Since", - $this->cacheData[$url]['responseHeaders']['last-modified']); + try { + $req = P2Util::getHTTPRequest2 ($get_url, HTTP_Request2::METHOD_GET); + if ($this->cacheData[$url] && $this->cacheData[$url]['responseHeaders'] + && $this->cacheData[$url]['responseHeaders']['last-modified'] + && strlen($this->cacheData[$url]['responseHeaders']['last-modified'])) { + $req->setHeader("If-Modified-Since", + $this->cacheData[$url]['responseHeaders']['last-modified']); + } + + $req->setHeader('User-Agent', + (!empty($_conf['expack.user_agent'])) ? $_conf['expack.user_agent'] + : $_SERVER['HTTP_USER_AGENT']); + + $response = P2Util::getHTTPResponse($req); + + $code = $response->getStatus (); + + if ($code == 304 && $this->cacheData[$url]) { + return $this->cacheData[$url]['data']; + } + + $body = $response->getBody(); + preg_match_all('{' . $source . '}i', $body, $extracted, PREG_SET_ORDER); + foreach ($extracted as $i => $extract) { + $_url = $replace; $_referer = $referer; + foreach ($extract as $j => $part) { + if ($j < 1) continue; + $_url = str_replace('$EXTRACT'.$j, $part, $_url); + $_referer = str_replace('$EXTRACT'.$j, $part, $_referer); + } + if ($extract[1]) { + $_url = str_replace('$EXTRACT', $part, $_url); + $_referer = str_replace('$EXTRACT', $part, $_referer); + } + $ret[$i]['url'] = $_url; + $ret[$i]['referer'] = $_referer; + } + } catch (Exception $e) { + $errmsg = $e->getMessage (); } - $req->addHeader('User-Agent', - (!empty($_conf['expack.user_agent'])) ? $_conf['expack.user_agent'] - : $_SERVER['HTTP_USER_AGENT']); - $response = $req->sendRequest(); - $code = $req->getResponseCode(); - if (PEAR::isError($response) || ($code != 200 && $code != 206 && $code != 304)) { - $errmsg = PEAR::isError($response) ? $response->getMessage() : $code; + + // 取得エラーが発生した場合 + if (isset($errmsg) || ($code != 200 && $code != 206 && $code != 304)) { + if(!isset($errmsg)) + { + $errmsg = $code; + } // 今回リクエストでのエラーをオンラインキャッシュ $this->extractErrors[$get_url] = $errmsg; // サーバエラー以外なら永続キャッシュに保存 @@ -291,26 +317,6 @@ public function extractPage($url, $match, $replace, $referer, $source, $ident=nu return ($this->cacheData[$url] && $this->cacheData[$url]['data']) ? $this->cacheData[$url]['data'] : $ret; } - if ($code == 304 && $this->cacheData[$url]) { - return $this->cacheData[$url]['data']; - } - - $body = $req->getResponseBody(); - preg_match_all('{' . $source . '}i', $body, $extracted, PREG_SET_ORDER); - foreach ($extracted as $i => $extract) { - $_url = $replace; $_referer = $referer; - foreach ($extract as $j => $part) { - if ($j < 1) continue; - $_url = str_replace('$EXTRACT'.$j, $part, $_url); - $_referer = str_replace('$EXTRACT'.$j, $part, $_referer); - } - if ($extract[1]) { - $_url = str_replace('$EXTRACT', $part, $_url); - $_referer = str_replace('$EXTRACT', $part, $_referer); - } - $ret[$i]['url'] = $_url; - $ret[$i]['referer'] = $_referer; - } // ページが消えている場合 if ($this->_checkLost($url, $ret)) { diff --git a/rep2/ic2.php b/rep2/ic2.php index 6335a1161..782037f61 100644 --- a/rep2/ic2.php +++ b/rep2/ic2.php @@ -45,6 +45,9 @@ /*if (!isset($uri) && false !== ($url = getenv('PATH_INFO'))) { $uri = 'http:/' . $url; }*/ + +error_log("IC2 Init Finish ".$uri, 0); + if (empty($id) && empty($uri) && empty($file)) { ic2_error('x06', 'URLまたはファイル名がありません。', false); } @@ -156,10 +159,12 @@ public function __destruct() // {{{ sleep if ($doDL) { + error_log("IC2 Dup prevention ".$uri, 0); // 同じ画像のURIに対するクエリが(ほぼ)同時に発行されたときの重複GETを防ぐ // sleepした時間はプロセスの実行時間に含まれないので独自にタイマーを用意する(無限ループ回避) $dl_lock_file = $_conf['tmp_dir'] . DIRECTORY_SEPARATOR . 'ic2_lck_' . md5($uri); if (file_exists($dl_lock_file)) { + error_log("IC2 dl_lock_file exists ".$uri, 0); $offtimer = ini_get('max_execution_time'); if ($offtimer == 0) { $offtimer = 30; @@ -303,101 +308,94 @@ public function __destruct() ? $_conf['expack.user_agent'] : $_SERVER['HTTP_USER_AGENT']; // キャッシュされていなければ、取得を試みる -$client = new HTTP_Client(); -$client->setRequestParameter('timeout', $conn_timeout); -$client->setRequestParameter('readTimeout', array($read_timeout, 0)); -$client->setMaxRedirects(3); -$client->setDefaultHeader('User-Agent', $ic2_ua); -if ($mtime > 0) { - $client->setDefaultHeader('If-Modified-Since', http_date($mtime)); -} - -// プロキシ設定 -if ($ini['Proxy']['enabled'] && $ini['Proxy']['host'] && $ini['Proxy']['port']) { - $client->setRequestParameter('proxy_host', $ini['Proxy']['host']); - $client->setRequestParameter('proxy_port', $ini['Proxy']['port']); - if ($ini['Proxy']['user']) { - $client->setRequestParameter('proxy_user', $ini['Proxy']['user']); - $client->setRequestParameter('proxy_pass', $ini['Proxy']['pass']); - $proxy_auth_data = base64_encode($ini['Proxy']['user'] . ':' . $ini['Proxy']['pass']); - $client->setDefaultHeader('Proxy-Authorization', 'Basic ' . $proxy_auth_data); +try { + error_log("getHTTPRequest2 ".$uri, 0); + $req = P2Util::getHTTPRequest2($uri, HTTP_Request2::METHOD_GET); + $req->setConfig(array('follow_redirects' => true)); + $req->setHeader('User-Agent', $ic2_ua); + if ($mtime > 0) { + $req->setHeader('If-Modified-Since', http_date($mtime)); } -} // リファラ設定 -if (is_null($referer)) { - $send_referer = (boolean)$ini['Getter']['sendreferer']; - if ($send_referer) { - if ($ini['Getter']['norefhosts']) { - $pattern = preg_quote($ini['Getter']['norefhosts'], '/'); + if (is_null($referer)) { + $send_referer = (boolean)$ini['Getter']['sendreferer']; + if ($send_referer) { + if ($ini['Getter']['norefhosts']) { + $pattern = preg_quote($ini['Getter']['norefhosts'], '/'); + $pattern = str_replace(',', '|', $pattern); + $pattern = '/' . $pattern . '/i'; + if (preg_match($pattern, $pURL['host'])) { + $send_referer = false; + } + } + } elseif ($ini['Getter']['refhosts']) { + $pattern = preg_quote($ini['Getter']['refhosts'], '/'); $pattern = str_replace(',', '|', $pattern); $pattern = '/' . $pattern . '/i'; if (preg_match($pattern, $pURL['host'])) { - $send_referer = false; + $send_referer = true; } } - } elseif ($ini['Getter']['refhosts']) { - $pattern = preg_quote($ini['Getter']['refhosts'], '/'); - $pattern = str_replace(',', '|', $pattern); - $pattern = '/' . $pattern . '/i'; - if (preg_match($pattern, $pURL['host'])) { - $send_referer = true; + if ($send_referer) { + $referer = $uri . '.html'; } } - if ($send_referer) { - $referer = $uri . '.html'; - } -} -if (is_string($referer)) { - $client->setDefaultHeader('Referer', $referer); -} + if (is_string($referer)) { + $req->setHeader('Referer', $referer); + } // }}} // {{{ get // ダウンロード -if ($ini['Getter']['retry_regex'] && - strlen(trim($ini['Getter']['retry_regex'])) > 0 && - intval($ini['Getter']['retry_max']) > 0 && - preg_match($ini['Getter']['retry_regex'], $uri)) -{ - $retryCount = 0; - do { - $code = $client->get($uri); - if ($code != 403) { - break; - } - $retryCount++; - sleep($ini['Getter']['retry_interval']); - } while ($retryCount < intval($ini['Getter']['retry_max'])); -} else { - $code = $client->get($uri); -} + if ($ini['Getter']['retry_regex'] && + strlen(trim($ini['Getter']['retry_regex'])) > 0 && + intval($ini['Getter']['retry_max']) > 0 && + preg_match($ini['Getter']['retry_regex'], $uri) + ) { + $retryCount = 0; + do { + error_log("Start Download ".$uri, 0); + $response = P2Util::getHTTPResponse($req); + $code = $response->getStatus(); + if ($code != 403) { + break; + } + $retryCount++; + sleep($ini['Getter']['retry_interval']); + } while ($retryCount < intval($ini['Getter']['retry_max'])); + } else { + error_log("Start Download ".$uri, 0); + $response = P2Util::getHTTPResponse($req); + $code = $response->getStatus(); + } -if (PEAR::isError($code)) { - ic2_error('x02', $code->getMessage()); -} elseif ($fileurl && $mtime > 0 && $code == 304) { - // 304 Not Modified のとき - ic2_finish($fileurl, $thumb, $params, false); -} elseif ($code != 200) { - ic2_error($code); -} + if ($fileurl && $mtime > 0 && $code == 304) { + // 304 Not Modified のとき + ic2_finish($fileurl, $thumb, $params, false); + } elseif ($code != 200) { + ic2_error($code); + } -$response = $client->currentResponse(); -if (isset($response['headers']['content-type'])) { - $serv_mime = $response['headers']['content-type']; -} + if ($response->getHeader('content-type')) { + $serv_mime = $response->getHeader('content-type'); + } + + // 一時ファイルに保存 + $tmpfile = tempnam($_conf['tmp_dir'], 'ic2_get_'); + $tmpobj = new IC2TempFile($tmpfile); + $fp = fopen($tmpfile, 'wb'); + if (!$fp) { + ic2_error('x02', "fopen失敗。($tmpfile)"); + } + fwrite($fp, $response->getBody()); + fclose($fp); -// 一時ファイルに保存 -$tmpfile = tempnam($_conf['tmp_dir'], 'ic2_get_'); -$tmpobj = new IC2TempFile($tmpfile); -$fp = fopen($tmpfile, 'wb'); -if (!$fp) { - ic2_error('x02', "fopen失敗。($tmpfile)"); +} catch (Exception $e) { + ic2_error('x02', $e->getMessage ()); } -fwrite($fp, $response['body']); -fclose($fp); // }}} // {{{ check From 5a864da0152cf16c9efe89d5625777456c06c7d2 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 4 Mar 2016 14:21:54 +0900 Subject: [PATCH 194/339] v160304.1333 --- composer.json | 2 -- conf/conf.inc.php | 2 +- doc/README-774.txt | 18 ++++++++++++++++++ rep2/ic2.php | 7 ------- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/composer.json b/composer.json index 6dff89b60..2bcd5148e 100644 --- a/composer.json +++ b/composer.json @@ -22,8 +22,6 @@ "pear-pear.php.net/file_util": "1.0.0", "pear-pear.php.net/html_common": "1.2.5", "pear-pear.php.net/html_quickform": "3.2.13", - "pear-pear.php.net/http_client": "1.2.1", - "pear-pear.php.net/http_request": "1.4.4", "pear-pear.php.net/http_request2": "2.2.1", "pear-pear.php.net/net_socket": "1.0.10", "pear-pear.php.net/net_url": "1.0.15", diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 77b393e89..22c80e9c2 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '160303.9002', // rep2のバージョン + 'p2version' => '160304.1333', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index 06d65e7fd..42a5c9827 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -15,6 +15,8 @@ rep2-expack test https://github.com/orzisun/p2-php * 実況板のスレ一覧からスレを開いたときに自動的に実況モードでスレを開く設定を追加 * 3ペイン表示の配置を変更できる設定を追加 * スレッドタイトルから著作権表記を削除する設定を追加 +* スレッド作成日時の表示フォーマットを指定できるようにした +* まちBBSのホスト名を表示する設定を追加 ### 新機能 * cronとかで最近読んだスレなどのdatをDL出来るスクリプト追加 @@ -27,6 +29,8 @@ rep2-expack test https://github.com/orzisun/p2-php * 本家からbeのログイン部分を移植してBE2.0に対応 * rep2に登録された外部板へリンクする機能を追加 * 0ちゃんねるスクリプトを使用した外部板の過去ログDATを取り込み対応 +* SOCKS5プロクシ経由の接続に対応(人柱) +* tor内の掲示板(.onionドメイン)をtor経由で閲覧する機能を追加(人柱) ### 仕様変更 * ローカル板一覧用.brdファイルの置き場所をrep2/boardから$_conf['data_dir']/brardに変更 @@ -60,6 +64,20 @@ rep2-expack test https://github.com/orzisun/p2-php ●ChangeLog +160304.1333 +* 不足していた高解像度アイコンを追加 thx! http://potato.2ch.net/test/read.cgi/software/1431258367/767 +* ●でDATをダウンロードする為のコードとリンクを除去 +* DAT落ちの判定に2ch APIの独自レスポンスヘッダを使用するように変更 +* API+浪人で取得したDATを過去ログ扱いするように変更 +* SOCKS5プロクシ経由の接続に対応(人柱) +* tor内の掲示板(.onionドメイン)をtor経由で閲覧する機能を追加(人柱) +* 以下の変更点はkiller4989さんのパッチを取り込み +* vip2ch.com 対応 +* びんたん・べっかんこの URL が指定された時に正しくスレが表示されるようにした +* 「浪人お役立ちツール」のリンクを追加 +* スレッド作成日時の表示フォーマットを指定できるようにした +* その他諸々 + 150815.1030 * 表示レス数の上限を2000から65535に変更 * まちBBSのホスト名を表示する設定を追加(killer4989さんのパッチを取り込み) diff --git a/rep2/ic2.php b/rep2/ic2.php index 782037f61..28a4f84ba 100644 --- a/rep2/ic2.php +++ b/rep2/ic2.php @@ -46,8 +46,6 @@ $uri = 'http:/' . $url; }*/ -error_log("IC2 Init Finish ".$uri, 0); - if (empty($id) && empty($uri) && empty($file)) { ic2_error('x06', 'URLまたはファイル名がありません。', false); } @@ -159,12 +157,10 @@ public function __destruct() // {{{ sleep if ($doDL) { - error_log("IC2 Dup prevention ".$uri, 0); // 同じ画像のURIに対するクエリが(ほぼ)同時に発行されたときの重複GETを防ぐ // sleepした時間はプロセスの実行時間に含まれないので独自にタイマーを用意する(無限ループ回避) $dl_lock_file = $_conf['tmp_dir'] . DIRECTORY_SEPARATOR . 'ic2_lck_' . md5($uri); if (file_exists($dl_lock_file)) { - error_log("IC2 dl_lock_file exists ".$uri, 0); $offtimer = ini_get('max_execution_time'); if ($offtimer == 0) { $offtimer = 30; @@ -309,7 +305,6 @@ public function __destruct() // キャッシュされていなければ、取得を試みる try { - error_log("getHTTPRequest2 ".$uri, 0); $req = P2Util::getHTTPRequest2($uri, HTTP_Request2::METHOD_GET); $req->setConfig(array('follow_redirects' => true)); $req->setHeader('User-Agent', $ic2_ua); @@ -357,7 +352,6 @@ public function __destruct() ) { $retryCount = 0; do { - error_log("Start Download ".$uri, 0); $response = P2Util::getHTTPResponse($req); $code = $response->getStatus(); if ($code != 403) { @@ -367,7 +361,6 @@ public function __destruct() sleep($ini['Getter']['retry_interval']); } while ($retryCount < intval($ini['Getter']['retry_max'])); } else { - error_log("Start Download ".$uri, 0); $response = P2Util::getHTTPResponse($req); $code = $response->getStatus(); } From ab4d4ebddaf0d1c8e71479dbe30f0b58768400fd Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Mon, 7 Mar 2016 19:47:51 +0900 Subject: [PATCH 195/339] =?UTF-8?q?fix=20tor=20=E5=AF=BE=E5=BF=9C(?= =?UTF-8?q?=E4=BB=AE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index ad02f7a12..e65f0e453 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -2312,7 +2312,7 @@ static public function getHTTPRequest2($url , $method = HTTP_Request2::METHOD_GE } // プロキシ - if ($_conf['tor_use'] && P2Util::isHostTor($this->host, 0)) { // Tor(.onion)はTor用の設定をセット + if ($_conf['tor_use'] && self::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット $req->setConfig (array ( 'proxy_host' => $_conf['tor_proxy_host'], 'proxy_port' => $_conf['tor_proxy_port'], @@ -2341,7 +2341,7 @@ static public function getHTTPRequest2($url , $method = HTTP_Request2::METHOD_GE static public function getHTTPResponse($req) { if($req->getConfig('proxy_type') == 'socks5') { - $socks = HTTP_Request2_Adapter_Socket(); + $socks = new HTTP_Request2_Adapter_Socket(); $res = $socks->sendRequest($req); unset($socks); } else { From 41eed7d2b7d9cacdcd97bf1b0d1b8cfeafb249cd Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Mon, 7 Mar 2016 19:47:10 +0900 Subject: [PATCH 196/339] =?UTF-8?q?=E3=81=97=E3=81=9F=E3=82=89=E3=81=B0?= =?UTF-8?q?=E6=8E=B2=E7=A4=BA=E6=9D=BF=E3=81=AE=E3=82=B9=E3=83=9E=E3=83=9B?= =?UTF-8?q?=E7=89=88=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index e65f0e453..c2158e37e 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1927,7 +1927,7 @@ static public function detectThread($url = null) $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; // したらばJBBS - http://jbbs.livedoor.com/bbs/read.cgi/computer/2999/1081177036/-100 - } elseif (preg_match('<^http://(jbbs\\.(?:livedoor\\.(?:jp|com)|shitaraba\\.(?:net|com)))/bbs/read\\.cgi + } elseif (preg_match('<^http://(jbbs\\.(?:livedoor\\.(?:jp|com)|shitaraba\\.(?:net|com)))/(?:bbs|bbs/lite)/read\\.cgi /(\\w+)/(\\d+)/(\\d+)/((?:\\d+)?-(?:\\d+)?)?[^"]*>x', $nama_url, $matches)) { $host = $matches[1] . '/' . $matches[2]; From 782629656e30a02a089fd4f285e08bf8d724b7af Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 9 Mar 2016 07:15:10 +0900 Subject: [PATCH 197/339] v160309.0710 --- conf/conf.inc.php | 2 +- doc/README-774.txt | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 22c80e9c2..e27aac339 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '160304.1333', // rep2のバージョン + 'p2version' => '160309.0710', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index 42a5c9827..5ef8915c0 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -64,6 +64,11 @@ rep2-expack test https://github.com/orzisun/p2-php ●ChangeLog +160309.0710 +* 以下の変更点はkiller4989さんのパッチを取り込み +* SOCKS5接続とtor接続が機能していない不具合を修正 +* スマホ版したらばのURLを開けるように変更 + 160304.1333 * 不足していた高解像度アイコンを追加 thx! http://potato.2ch.net/test/read.cgi/software/1431258367/767 * ●でDATをダウンロードする為のコードとリンクを除去 From 4a9d28663d3b1a364656f71bb0dd5b45f407f8c6 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 8 Apr 2016 23:19:28 +0900 Subject: [PATCH 198/339] =?UTF-8?q?NG=E3=82=B9=E3=83=AC=E3=83=83=E3=83=89?= =?UTF-8?q?=E6=A9=9F=E8=83=BD=E3=81=8C=E5=8B=95=E4=BD=9C=E3=81=97=E3=81=AA?= =?UTF-8?q?=E3=81=84=E4=B8=8D=E5=85=B7=E5=90=88=E3=82=92=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=20=E7=94=BB=E5=83=8F=E7=BD=AE=E6=8F=9BURL=E3=81=8C=E5=8B=95?= =?UTF-8?q?=E4=BD=9C=E3=81=97=E3=81=AA=E3=81=84=E4=B8=8D=E5=85=B7=E5=90=88?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20composer.json=E6=9B=B4=E6=96=B0=20?= =?UTF-8?q?=E3=81=B3=E3=82=93=E3=81=9F=E3=82=93=E3=81=AEURL=E5=88=A4?= =?UTF-8?q?=E5=AE=9A=E3=82=92=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 2 +- lib/P2Util.php | 2 +- lib/wiki/ReplaceImageUrlCtl.php | 4 ++-- lib/wiki/read.inc.php | 22 ---------------------- lib/wiki/subject.inc.php | 5 ----- rep2/read.php | 24 ++++++++++++++++++++++-- rep2/subject.php | 13 +++++++++++++ 7 files changed, 39 insertions(+), 33 deletions(-) delete mode 100644 lib/wiki/read.inc.php delete mode 100644 lib/wiki/subject.inc.php diff --git a/composer.json b/composer.json index 2bcd5148e..3e731893b 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "repositories": [ { "type": "pear", - "url": "http://pear.php.net" + "url": "https://pear.php.net" } ], "require": { diff --git a/lib/P2Util.php b/lib/P2Util.php index c2158e37e..928938c11 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1976,7 +1976,7 @@ static public function detectThread($url = null) } // 2ch or pink by ula.cc(bintan / bekkanko) - http://choco.2ch.net/test/read.cgi/event/1027770702/ - } elseif (preg_match('<^http://(?:bintan|same)\\.ula\\.cc/test/(?:read\\.(?:cgi|html|so)|r\\.so) + } elseif (preg_match('<^https?://(?:(?:bintan|same)\\.ula\\.cc|ula\\.2ch\\.net)/test/(?:read\\.(?:cgi|html|so)|r\\.so) /(.+)/(\\w+)/([0-9]+)(?:/([^/]*))>x', $nama_url, $matches)) { $host = $matches[1]; diff --git a/lib/wiki/ReplaceImageUrlCtl.php b/lib/wiki/ReplaceImageUrlCtl.php index 8f334c5e8..eeee1d824 100644 --- a/lib/wiki/ReplaceImageUrlCtl.php +++ b/lib/wiki/ReplaceImageUrlCtl.php @@ -311,7 +311,7 @@ public function extractPage($url, $match, $replace, $referer, $source, $ident=nu } $this->storeCache($url, array('code' => $code, 'errmsg' => $errmsg, - 'responseHeaders' => $req->getResponseHeader(), + 'responseHeaders' => $response->getHeader(), 'data' => $ret)); } return ($this->cacheData[$url] && $this->cacheData[$url]['data']) @@ -332,7 +332,7 @@ public function extractPage($url, $match, $replace, $referer, $source, $ident=nu // 結果を永続キャッシュに保存 $this->storeCache($url, array('code' => $code, - 'responseHeaders' => $req->getResponseHeader(), + 'responseHeaders' => $response->getHeader(), 'data' => $ret)); return $ret; diff --git a/lib/wiki/read.inc.php b/lib/wiki/read.inc.php deleted file mode 100644 index fffc4699b..000000000 --- a/lib/wiki/read.inc.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php -/* - p2 - スレッド表示でincludeされるファイル -*/ - -// ImageCache2が有効の場合 -if (in_array($_conf['expack.ic2.enabled'], array($_conf['ktai'] ? 1 : 2, 3))) { -// 置換画像URL - if ($_conf['expack.ic2.enabled'] >= 2) { - require_once P2_LIB_DIR . '/wiki/ReplaceImageUrlCtl.php'; - $GLOBALS['replaceImageUrlCtl'] = new ReplaceImageUrlCtl(); - } -} -// 携帯ビュー以外の場合 -if (!$_conf['ktai'] || $_conf['iphone']) { -// リンクプラグイン - require_once P2_LIB_DIR . '/wiki/LinkPluginCtl.php'; - $GLOBALS['linkPluginCtl'] = new LinkPluginCtl(); -} -// 置換ワード -require_once P2_LIB_DIR . '/wiki/ReplaceWordCtl.php'; -$GLOBALS['replaceWordCtl'] = new ReplaceWordCtl(); diff --git a/lib/wiki/subject.inc.php b/lib/wiki/subject.inc.php deleted file mode 100644 index 6469a806d..000000000 --- a/lib/wiki/subject.inc.php +++ /dev/null @@ -1,5 +0,0 @@ -<?php -if ($_conf['wiki.ng_thread']) { - require_once P2_LIB_DIR . '/wiki/NgThreadCtl.php'; - $GLOBALS['ngThreadCtl'] = new NgThreadCtl(); -} diff --git a/rep2/read.php b/rep2/read.php index 6ee1cf5b0..ab0c92732 100644 --- a/rep2/read.php +++ b/rep2/read.php @@ -9,8 +9,28 @@ $_login->authorize(); // ユーザ認証 -// +Wiki -require_once P2_LIB_DIR . '/wiki/read.inc.php'; +// {{{ +Wiki由来の機能を初期化 +// ImageCache2が有効の場合 +if (in_array($_conf['expack.ic2.enabled'], array($_conf['ktai'] ? 1 : 2, 3))) { +// 置換画像URL + if ($_conf['expack.ic2.enabled'] >= 2) { + require_once P2_LIB_DIR . '/wiki/ReplaceImageUrlCtl.php'; + $GLOBALS['replaceImageUrlCtl'] = new ReplaceImageUrlCtl(); + } +} + +// 携帯ビュー以外の場合 +if (!$_conf['ktai'] || $_conf['iphone']) { +// リンクプラグイン + require_once P2_LIB_DIR . '/wiki/LinkPluginCtl.php'; + $GLOBALS['linkPluginCtl'] = new LinkPluginCtl(); +} + +// 置換ワード +require_once P2_LIB_DIR . '/wiki/ReplaceWordCtl.php'; +$GLOBALS['replaceWordCtl'] = new ReplaceWordCtl(); + +// }}} // iPhone if ($_conf['iphone']) { diff --git a/rep2/subject.php b/rep2/subject.php index 3ca376bd0..db1aeb9e5 100644 --- a/rep2/subject.php +++ b/rep2/subject.php @@ -8,6 +8,12 @@ require_once __DIR__ . '/../init.php'; +// +Wiki NGスレッド機能 +if ($_conf['wiki.ng_thread']) { + require_once P2_LIB_DIR . '/wiki/NgThreadCtl.php'; + $GLOBALS['ngThreadCtl'] = new NgThreadCtl(); +} + //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection('HEAD'); $_login->authorize(); // ユーザ認証 @@ -532,6 +538,10 @@ continue; } + // {{{ ■+Wiki:NGスレッドチェック + if (isset($ngaborns)) if ($ngaborns->check($aThread)) continue; + // }}} + // {{{ ■ favlistチェック //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection('favlist_check'); @@ -881,6 +891,9 @@ NgAbornCtl::saveAbornThreads($aborn_threads); } +// +Wiki:NGスレッド +if (isset($ngaborns)) $ngaborns->save(); + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('FOOT'); // ここまで From 714dd3467aa4d5a68658000d2ac2a24ecda5fbc1 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sat, 9 Apr 2016 10:05:29 +0900 Subject: [PATCH 199/339] v160409.1000 --- conf/conf.inc.php | 2 +- doc/README-774.txt | 6 ++++++ doc/README-API.txt | 4 ---- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index e27aac339..8e4c59b88 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '160309.0710', // rep2のバージョン + 'p2version' => '160409.1000', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index 5ef8915c0..063c12919 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -64,6 +64,12 @@ rep2-expack test https://github.com/orzisun/p2-php ●ChangeLog +160409.1000 +* NGスレッド機能が動作しない不具合を修正 +* 画像置換URLが動作しない不具合修正 +* びんたんのURL判定を更新 +* composer.json内のURLを更新して新規インストール時の不具合修正 + 160309.0710 * 以下の変更点はkiller4989さんのパッチを取り込み * SOCKS5接続とtor接続が機能していない不具合を修正 diff --git a/doc/README-API.txt b/doc/README-API.txt index 74a835536..3002ba7ef 100644 --- a/doc/README-API.txt +++ b/doc/README-API.txt @@ -16,10 +16,6 @@ PHP dat取得以外のUser-Agentをrep2標準から2chapi_appnameを使用した物に変更します。 外部板のUser-Agentとdat取得ははrep2標準のままです。 -2chapi_rounin -「する」に設定した場合はAPI 認証時に●(浪人)を送信します。 -送信したら何が起こるのか判らないため切り替えることが出来るようになっています。 - 2chapi_ssl.auth 2chapi_ssl.read この設定はSSL通信がエラーとなる環境向けの設定です。 From 99a6b71ed2d1047d4b1c6d29c567ed19ba8e9af3 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 10 Apr 2016 00:33:55 +0900 Subject: [PATCH 200/339] =?UTF-8?q?=E6=96=B0=E7=9D=80=E7=BA=8F=E3=82=81?= =?UTF-8?q?=E8=AA=AD=E3=81=BF=E3=81=A8=E5=AE=9F=E6=B3=81=E3=81=8C=E5=8B=95?= =?UTF-8?q?=E3=81=8B=E3=81=AA=E3=81=8F=E3=81=AA=E3=81=A3=E3=81=A6=E3=81=84?= =?UTF-8?q?=E3=81=9F=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/wiki/read.inc.php | 23 +++++++++++++++++++++++ rep2/live_read.php | 7 ++++--- rep2/read.php | 24 ++---------------------- 3 files changed, 29 insertions(+), 25 deletions(-) create mode 100644 lib/wiki/read.inc.php diff --git a/lib/wiki/read.inc.php b/lib/wiki/read.inc.php new file mode 100644 index 000000000..52df5997d --- /dev/null +++ b/lib/wiki/read.inc.php @@ -0,0 +1,23 @@ +<?php +/* + p2 - スレッド表示でincludeされるファイル + read系共通で使用しているため削除不可 +*/ + +// ImageCache2が有効の場合 +if (in_array($_conf['expack.ic2.enabled'], array($_conf['ktai'] ? 1 : 2, 3))) { +// 置換画像URL + if ($_conf['expack.ic2.enabled'] >= 2) { + require_once P2_LIB_DIR . '/wiki/ReplaceImageUrlCtl.php'; + $GLOBALS['replaceImageUrlCtl'] = new ReplaceImageUrlCtl(); + } +} +// 携帯ビュー以外の場合 +if (!$_conf['ktai'] || $_conf['iphone']) { +// リンクプラグイン + require_once P2_LIB_DIR . '/wiki/LinkPluginCtl.php'; + $GLOBALS['linkPluginCtl'] = new LinkPluginCtl(); +} +// 置換ワード +require_once P2_LIB_DIR . '/wiki/ReplaceWordCtl.php'; +$GLOBALS['replaceWordCtl'] = new ReplaceWordCtl(); diff --git a/rep2/live_read.php b/rep2/live_read.php index 3b7c485c7..ccc0b1cdb 100755 --- a/rep2/live_read.php +++ b/rep2/live_read.php @@ -340,8 +340,9 @@ //=========================================================== // 履歴を記録 +// 速報headlineは最近読んだスレに記録しないようにしてみる //=========================================================== -if ($aThread->rescount && !$is_ajax) { +if ($aThread->rescount && !$is_ajax && $aThread->host != 'headline.2ch.net') { recRecent(implode('<>', array($aThread->ttitle, $aThread->key, $idx_data[2], '', '', $aThread->readnum, $idx_data[6], $idx_data[7], $idx_data[8], $newline, $aThread->host, $aThread->bbs))); @@ -401,8 +402,8 @@ function recRecent($data) foreach ($lines as $l) { $lar = explode('<>', $l); $data_ar = explode('<>', $data); - if ($lar[1] == $data_ar[1]) { continue; } // keyで重複回避 - if (!$lar[1]) { continue; } // keyのないものは不正データ + if (!$lar[1] || !strlen($lar[11])) { continue; } // 不正データを削除 + if ($lar[1] == $data_ar[1] && $lar[11] == $data_ar[11]) { continue; } // key, bbsで重複回避 $neolines[] = $l; } } diff --git a/rep2/read.php b/rep2/read.php index ab0c92732..6ee1cf5b0 100644 --- a/rep2/read.php +++ b/rep2/read.php @@ -9,28 +9,8 @@ $_login->authorize(); // ユーザ認証 -// {{{ +Wiki由来の機能を初期化 -// ImageCache2が有効の場合 -if (in_array($_conf['expack.ic2.enabled'], array($_conf['ktai'] ? 1 : 2, 3))) { -// 置換画像URL - if ($_conf['expack.ic2.enabled'] >= 2) { - require_once P2_LIB_DIR . '/wiki/ReplaceImageUrlCtl.php'; - $GLOBALS['replaceImageUrlCtl'] = new ReplaceImageUrlCtl(); - } -} - -// 携帯ビュー以外の場合 -if (!$_conf['ktai'] || $_conf['iphone']) { -// リンクプラグイン - require_once P2_LIB_DIR . '/wiki/LinkPluginCtl.php'; - $GLOBALS['linkPluginCtl'] = new LinkPluginCtl(); -} - -// 置換ワード -require_once P2_LIB_DIR . '/wiki/ReplaceWordCtl.php'; -$GLOBALS['replaceWordCtl'] = new ReplaceWordCtl(); - -// }}} +// +Wiki +require_once P2_LIB_DIR . '/wiki/read.inc.php'; // iPhone if ($_conf['iphone']) { From 931551b50e96d90a2d33a4c471251ff9b62774e7 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 10 Apr 2016 01:18:29 +0900 Subject: [PATCH 201/339] =?UTF-8?q?NG=E3=82=B9=E3=83=AC=E3=83=83=E3=83=89?= =?UTF-8?q?=E6=A9=9F=E8=83=BD=E3=81=8C=E6=9C=AC=E4=BD=93=E3=81=A8+Wiki?= =?UTF-8?q?=E3=81=A7=E9=87=8D=E8=A4=87=E3=81=97=E3=81=A6=E5=AE=9F=E8=A3=85?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84=E3=82=8B=E3=81=AE=E3=81=A7?= =?UTF-8?q?=E5=89=8A=E9=99=A4=20=E5=AE=9F=E6=B3=81=E3=83=AA=E3=83=B3?= =?UTF-8?q?=E3=82=AF=E3=81=AB&ls=E3=82=92=E4=BB=98=E5=8A=A0=E3=81=97?= =?UTF-8?q?=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/read_header.inc.php | 4 +- lib/sb_print.inc.php | 2 +- lib/wiki/NgThreadCtl.php | 182 -------------------------------- rep2/edit_conf_user.php | 3 + rep2/edit_ng_thread.php | 223 --------------------------------------- rep2/subject.php | 15 +-- 6 files changed, 7 insertions(+), 422 deletions(-) delete mode 100644 lib/wiki/NgThreadCtl.php delete mode 100644 rep2/edit_ng_thread.php diff --git a/lib/read_header.inc.php b/lib/read_header.inc.php index 62f6485ff..17ac2f8d0 100755 --- a/lib/read_header.inc.php +++ b/lib/read_header.inc.php @@ -198,7 +198,7 @@ if($_conf['live.livelink_thread']==2||$livebbs_bool) { $toolbar_right_ht .= <<<EOTOOLBAR - <a href="live_frame.php?{$host_bbs_key_q}{$ttitle_en_q}&ls={$aThread->rescount}-{$word_q}{$anum_ht}">実況</a> + <a href="live_frame.php?{$host_bbs_key_q}{$ttitle_en_q}">実況</a> EOTOOLBAR; } } @@ -475,7 +475,7 @@ function filterCount(n) <script type="text/javascript"> //<![CDATA[ if (top == self) { - document.writeln('<a href="live_frame.php?{$host_bbs_key_q}{$ttitle_en_q}&ls={$aThread->rescount}-{$word_q}{$anum_ht}">実況フレーム 2ペインで開く<' + '/a> |'); + document.writeln('<a href="live_frame.php?{$host_bbs_key_q}{$ttitle_en_q}">実況フレーム 2ペインで開く<' + '/a> |'); } //]]> </script>\n diff --git a/lib/sb_print.inc.php b/lib/sb_print.inc.php index d0d349be7..1cda94a63 100644 --- a/lib/sb_print.inc.php +++ b/lib/sb_print.inc.php @@ -377,7 +377,7 @@ function sb_print($aThreadList) if($_conf['live.livelink_subject']==2||$livebbs_bool) { // $ttitle_en_q は節減省略 - $live_url = "live_frame.php?{$host_bbs_key_q}&live=1{$rescount_q}{$anum_ht}"; + $live_url = "live_frame.php?{$host_bbs_key_q}&live=1{$rescount_q}"; } // オンリー>>1 diff --git a/lib/wiki/NgThreadCtl.php b/lib/wiki/NgThreadCtl.php deleted file mode 100644 index 9663c9b35..000000000 --- a/lib/wiki/NgThreadCtl.php +++ /dev/null @@ -1,182 +0,0 @@ -<?php -/* -replaceLinkToHTML(url, src) メイン関数 -save(array) データを保存 -load() データを読み込んで返す(自動的に実行される) -clear() データを削除 - -基本構造 -データの登録方法 -・$this->dataを更新する事による登録 -・一括で登録 -・一行だけの登録 -データ構造 -word ignorecase regex bbs lasttime hits -*/ - -require_once __DIR__ . '/WikiPluginCtlBase.php'; - -class NgThreadCtl -{ - const DATE_FORMAT = 'Y/m/d G:i'; - - protected $filename = 'p2_aborn_thread.txt'; - protected $data = array(); - public $hits = 0; - - /* - データをクリア - */ - public function clear() - { - global $_conf; - - $path = $_conf['pref_dir'] . '/' . $this->filename; - - return @unlink($path); - } - - /* - データを読み込んで返す - */ - public function load() - { - global $_conf; - - $lines = array(); - $path = $_conf['pref_dir'] . '/' . $this->filename; - if ($lines = @file($path)) { - foreach ($lines as $l) { - $lar = explode("\t", trim($l)); - if (strlen($lar[0]) == 0) { - continue; - } - $ar = array( - 'word' => $lar[0], // 対象文字列 - 'ignorecase' => $lar[1], // 大文字小文字を無視 - 'regex' => $lar[2], // 正規表現 - 'bbs' => $lar[3], // 板縛り - 'lasttime' => $lar[4] == '--' ? '' : $lar[4], // 最後にHITした時間 - 'hits' => (int) $lar[5], // HIT回数 - ); - - $this->data[] = $ar; - } - } - - return $this->data; - } - - /* - 保存 - 引数が指定されてる⇒そのデータで保存 - $this->dataがない⇒保存しない - */ - public function save($data) - { - global $_conf; - - if ($data) { - $new_data = true; - $this->data = $data; - } elseif (!$this->isLoaded) { - return; - } else { - $new_data = false; - } - // HITした時のみ更新する - if ($this->hits > 0 || $new_data) { - $cont = ''; - - foreach ($this->data as $v) { - if ($v['del']) { - continue; - } - - // 必要ならここで古いデータはスキップ(削除)する - if (!empty($v['lasttime']) && $_conf['ngaborn_daylimit']) { - if (strtotime($v['lasttime']) < time() - 60 * 60 * 24 * $_conf['ngaborn_daylimit']) { - continue; - } - } - - $a['word'] = strtr(trim($v['word'], "\t\r\n"), "\t\r\n", " "); - $a['ignorecase'] = $v['ignorecase']; - $a['regex'] = $v['regex']; - $a['bbs'] = strtr(trim($v['bbs'], "\t\r\n"), "\t\r\n", " "); - $a['lasttime'] = $v['lasttime']; - $a['hits'] = $v['hits']; - - // lasttimeが設定されていなかったら現在時間を設定(本来なら登録時にするべき) - if (empty($v['lasttime'])) { - $v['lasttime'] = date(self::DATE_FORMAT); - } - - $cont .= implode("\t", $v) . "\n"; - } - - return FileCtl::file_write_contents($_conf['pref_dir'].'/'.$this->filename); - } - } - - /* - あぼーんチェック - あぼーん対象⇒true - */ - public function check($aThread) - { - $this->setup(); - - if ($aThreadList->spmode != "taborn" && isset($this->data) && is_array($this->data)) { - foreach ($this->data as $k => $v) { - // 板チェック - if (!in_array($aThread->bbs, explode(',', $v['bbs']))) { - continue; - } - // 正規表現 - if (!empty($v['regex'])) { - if ($v['ignorecase']) { - $match = '{' . $v['word'] . '}i'; - } else { - $match = '{' . $v['word'] . '}'; - } - if (preg_match('{' . $v['word'] . '}i', $aThread->ttitle_hc)) { - $this->update($k); - return true; - } - // 大文字小文字を無視 - } elseif (!empty($v['ignorecase'])) { - if(stristr($aThread->ttitle_hc,$v['word'])){ - $this->update($k); - return true; - } - // 単純に文字列が含まれるかどうかをチェック - } else { - if (strstr($aThread->ttitle_hc,$v['word'])) { - $this->update($k); - return true; - } - } - } - } - - return false; - } - - /* - そのデータのあぼーん情報を更新 - */ - public function update($k) - { - $this->hits++; - if (isset($this->data[$k])) { - $this->data[$k]['lasttime'] = date(self::DATE_FORMAT); // HIT時間を更新 - if (empty($v['hits'])) { - $this->data[$k]['hits'] = 1; // 初HIT - } else { - $this->data[$k]['hits']++; // HIT回数を更新 - } - } - } - -} diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index 1694fd748..73605bb67 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -849,6 +849,9 @@ $keep_old = true; } else { $conflist = array( + 'samba タイマー', + array('wiki.samba_timer', 'samba タイマーを利用'), + array('wiki.samba_cache', 'samba のキャッシュ時間'), '画像置換URL', array('wiki.replaceimageurl.extract_cache', '画像置換URLのEXTRACTキャッシュ制御'), 'スマートポップアップメニュー外部ツール', diff --git a/rep2/edit_ng_thread.php b/rep2/edit_ng_thread.php deleted file mode 100644 index 68065aec3..000000000 --- a/rep2/edit_ng_thread.php +++ /dev/null @@ -1,223 +0,0 @@ -<?php -/* - p2 - NGスレッドインタフェース -*/ - -require_once __DIR__ . '/../init.php'; -require_once P2_LIB_DIR . '/wiki/NgThreadCtl.php'; - -$_login->authorize(); // ユーザ認証 - -if (!empty($_POST['submit_save']) || !empty($_POST['submit_default'])) { - if (!isset($_POST['csrfid']) || $_POST['csrfid'] != P2Util::getCsrfId()) { - die('p2 error: 不正なポストです'); - } -} - -$ngThreadCtl = new NgThreadCtl(); - -//===================================================================== -// 前処理 -//===================================================================== - -// {{{ ■保存ボタンが押されていたら、設定を保存 - -if (!empty($_POST['submit_save'])) { - - if ($ngThreadCtl->save($POST['nga']) != false) { - $_info_msg_ht .= '<p>○設定を更新保存しました</p>'; - } else { - $_info_msg_ht .= '<p>×設定を更新保存できませんでした</p>'; - } - -// }}} -// {{{ ■デフォルトに戻すボタンが押されていたら - -} elseif (!empty($_POST['submit_default'])) { - if ($ngThreadCtl->clear()) { - $_info_msg_ht .= '<p>○リストを空にしました</p>'; - } else { - $_info_msg_ht .= '<p>×リストを空にできませんでした</p>'; - } -} - -// }}} -// {{{ リスト読み込み - -$formdata = $ngThreadCtl->load(); - -// }}} - -//===================================================================== -// プリント設定 -//===================================================================== -$ptitle_top = 'NGスレッド編集'; -$ptitle = strip_tags($ptitle_top); - -$csrfid = P2Util::getCsrfId(); - -//===================================================================== -// プリント -//===================================================================== -// ヘッダHTMLをプリント -P2Util::header_nocache(); -echo $_conf['doctype']; -echo <<<EOP -<html lang="ja"> -<head> - {$_conf['meta_charset_ht']} - <meta name="ROBOTS" content="NOINDEX, NOFOLLOW"> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <title>{$ptitle}\n -EOP; - -if (!$_conf['ktai']) { - echo << - - - \n -EOP; -} - -$body_at = ($_conf['ktai']) ? $_conf['k_colors'] : ' onLoad="top.document.title=self.document.title;"'; -echo << -\n -EOP; - -// PC用表示 -if (!$_conf['ktai']) { - echo <<設定管理 > {$ptitle_top}

    \n -EOP; -} else { - echo basename($path) . "
    "; -} - -// PC用表示 -if (!$_conf['ktai']) { - $htm['form_submit'] = << - - -
    - - \n -EOP; -// 携帯用表示 -} else { - $htm['form_submit'] = <<
    \n -EOP; -} - -// 情報メッセージ表示 -if (!empty($_info_msg_ht)) { - echo $_info_msg_ht; - $_info_msg_ht = ""; -} - -$usage = << -
  • ×: 削除
  • -
  • ワード: NG/あぼーんワード (空にすると登録解除)
  • -
  • i: 大文字小文字を無視
  • -
  • re: 正規表現
  • -
  • 板: newsplus,software 等 (完全一致, カンマ区切り)
  • - -EOP; -if ($_conf['ktai']) { - $usage = mb_convert_kana($usage, 'k'); -} -echo << - {$_conf['k_input_ht']} - - - \n -EOP; - -// PC用表示(table) -if (!$_conf['ktai']) { - echo << - - × - ワード - i - re - 板 - 最終ヒット日時と回数 - - - 新規登録 - \n -EOP; - $row_format = << - - - - - - - %6\$s - (%7\$d) - - \n -EOP; -// 携帯用表示 -} else { - echo "新規登録
    \n"; - $row_format = <<
    -板: -i -re -×
    - -(%6\$d)
    \n -EOP; -} - -printf($row_format, -1, '', '', '', '', '--', 0); - -echo $htm['form_submit']; -if (!empty($formdata)) { - foreach ($formdata as $k => $v) { - printf($row_format, - $k, - p2h($v['word']), - $v['ignorecase'], - $v['regex'], - p2h($v['bbs']), - p2h($v['lasttime']), - p2h($v['hits']) - ); - } - echo $htm['form_submit']; -} - -// PCなら -if (!$_conf['ktai']) { - echo ''."\n"; -} - -echo ''."\n"; - -// 携帯なら -if ($_conf['ktai']) { - echo << -{$_conf['k_accesskey']['up']}.設定編集 -{$_conf['k_to_index_ht']} -EOP; -} - -echo ''; - -// ここまで -exit; diff --git a/rep2/subject.php b/rep2/subject.php index db1aeb9e5..c40690f74 100644 --- a/rep2/subject.php +++ b/rep2/subject.php @@ -8,12 +8,6 @@ require_once __DIR__ . '/../init.php'; -// +Wiki NGスレッド機能 -if ($_conf['wiki.ng_thread']) { - require_once P2_LIB_DIR . '/wiki/NgThreadCtl.php'; - $GLOBALS['ngThreadCtl'] = new NgThreadCtl(); -} - //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection('HEAD'); $_login->authorize(); // ユーザ認証 @@ -123,7 +117,7 @@ // }}} // {{{ 表示スレッド数設定 -$threads_num_max = 65535; +$threads_num_max = 2000; if (!$spmode || $spmode == 'merge_favita') { $threads_num = $p2_setting['viewnum']; @@ -538,10 +532,6 @@ continue; } - // {{{ ■+Wiki:NGスレッドチェック - if (isset($ngaborns)) if ($ngaborns->check($aThread)) continue; - // }}} - // {{{ ■ favlistチェック //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection('favlist_check'); @@ -891,9 +881,6 @@ NgAbornCtl::saveAbornThreads($aborn_threads); } -// +Wiki:NGスレッド -if (isset($ngaborns)) $ngaborns->save(); - //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('FOOT'); // ここまで From e5d1006fc2a8bda4dc79a9eb039763ad0e0a3967 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 10 Apr 2016 01:44:15 +0900 Subject: [PATCH 202/339] =?UTF-8?q?v160410.0125=20=E6=9C=AA=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E3=81=AE=E8=A8=AD=E5=AE=9A=E9=A0=85=E7=9B=AE=E3=82=92?= =?UTF-8?q?=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- conf/conf_user_def_wiki.inc.php | 11 ----------- doc/README-774.txt | 6 ++++++ 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 8e4c59b88..2b837a02d 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '160409.1000', // rep2のバージョン + 'p2version' => '160410.0125', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/conf/conf_user_def_wiki.inc.php b/conf/conf_user_def_wiki.inc.php index fcfcdc4c5..a480af3aa 100644 --- a/conf/conf_user_def_wiki.inc.php +++ b/conf/conf_user_def_wiki.inc.php @@ -44,14 +44,3 @@ $conf_user_rules['wiki.samba_cache'] = array('emptyToDef', 'notIntExceptMinusToDef'); // }}} - -// {{{ ■samba - -// NGスレッドを有効にする (する:1, しない:0) -$conf_user_def['wiki.ng_thread'] = 0; // (0) -$conf_user_rad['wiki.ng_thread'] = array('1' => 'する', '0' => 'しない'); -// 携帯閲覧時、レス番号にSPMをつける (つける:1, つけない:0) -$conf_user_def['wiki.spm.mobile'] = 0; // (0) -$conf_user_rad['wiki.spm.mobile'] = array('1' => 'する', '0' => 'しない'); - -// }}} diff --git a/doc/README-774.txt b/doc/README-774.txt index 063c12919..7c0969fbb 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -64,6 +64,12 @@ rep2-expack test https://github.com/orzisun/p2-php ●ChangeLog +160410.0125 +* NGスレッド機能が本体と+Wikiで重複して実装されているので削除 +* 160409.1000 に新着纏め読みと実況等が動作しない不具合があるので修正 +* 実況リンクに&lsを付加しないように変更 +* ユーザー設定管理に+Wikiのsambaタイマーに関する設定項目を表示するように変更 + 160409.1000 * NGスレッド機能が動作しない不具合を修正 * 画像置換URLが動作しない不具合修正 From 4e60d62166885611305c0bb2bf7242afdc74b19c Mon Sep 17 00:00:00 2001 From: killer4989 Date: Fri, 3 Jun 2016 19:53:02 +0900 Subject: [PATCH 203/339] =?UTF-8?q?ImageCache2=20=E3=81=A7=E3=81=AE?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=A0=E3=82=A2=E3=82=A6=E3=83=88=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E5=80=A4=E3=82=92=20http=5Fconn=5Ftimeout=20/=20http?= =?UTF-8?q?=5Fread=5Ftimeout=20=E3=81=AB=E4=BE=9D=E5=AD=98=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_ic2.inc.php | 4 ++-- rep2/ic2.php | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/conf/conf_ic2.inc.php b/conf/conf_ic2.inc.php index 4bb5d6750..fdd89f165 100644 --- a/conf/conf_ic2.inc.php +++ b/conf/conf_ic2.inc.php @@ -138,10 +138,10 @@ // ページタイトル $_conf['expack.ic2.getter.title'] = "ImageCache2::Getter"; -// サーバに接続する際にタイムアウトするまでの時間(秒) +// サーバに接続する際にタイムアウトするまでの時間(秒)[0 => http_conn_timeout に依存] $_conf['expack.ic2.getter.conn_timeout'] = 5; -// ダウンロードがタイムアウトするまでの時間(秒) +// ダウンロードがタイムアウトするまでの時間(秒)[0 => http_read_timeout に依存] $_conf['expack.ic2.getter.read_timeout'] = 60; // エラーログにある画像はダウンロードを試みない (no:0;yes:1) diff --git a/rep2/ic2.php b/rep2/ic2.php index 28a4f84ba..caf3f0877 100644 --- a/rep2/ic2.php +++ b/rep2/ic2.php @@ -297,9 +297,9 @@ public function __destruct() // 設定を確認 $conn_timeout = (isset($ini['Getter']['conn_timeout']) && $ini['Getter']['conn_timeout'] > 0) - ? (float) $ini['Getter']['conn_timeout'] : 60.0; + ? $ini['Getter']['conn_timeout'] : $_conf['http_conn_timeout']; $read_timeout = (isset($ini['Getter']['read_timeout']) && $ini['Getter']['read_timeout'] > 0) - ? (int) $ini['Getter']['read_timeout'] : 60; + ? $ini['Getter']['read_timeout'] : $_conf['http_read_timeout']; $ic2_ua = (!empty($_conf['expack.user_agent'])) ? $_conf['expack.user_agent'] : $_SERVER['HTTP_USER_AGENT']; @@ -312,6 +312,12 @@ public function __destruct() $req->setHeader('If-Modified-Since', http_date($mtime)); } + // タイムアウトの設定 + $req->setConfig (array ( + 'connect_timeout' => $conn_timeout, + 'timeout' => $read_timeout, + )); + // リファラ設定 if (is_null($referer)) { $send_referer = (boolean)$ini['Getter']['sendreferer']; From 4c1c1388ec966cd6397d422d85b3ea343571670f Mon Sep 17 00:00:00 2001 From: killer4989 Date: Fri, 3 Jun 2016 20:19:43 +0900 Subject: [PATCH 204/339] =?UTF-8?q?(=E4=BA=BA=E6=9F=B1=E6=A9=9F=E8=83=BD)c?= =?UTF-8?q?url=20=E3=82=92=E7=94=A8=E3=81=84=E3=81=9F=E4=B8=A6=E5=88=97?= =?UTF-8?q?=E3=83=80=E3=82=A6=E3=83=B3=E3=83=AD=E3=83=BC=E3=83=89=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_admin_ex.inc.php | 4 + lib/P2CurlMulti.php | 298 ++++++++++++++++++++++++++++++++++ lib/ShowBrdMenuPc.php | 5 +- lib/ThreadList.php | 5 +- lib/menu.inc.php | 20 ++- rep2/subject.php | 53 ++++-- scripts/fetch-subject-txt.php | 14 +- 7 files changed, 370 insertions(+), 29 deletions(-) create mode 100644 lib/P2CurlMulti.php diff --git a/conf/conf_admin_ex.inc.php b/conf/conf_admin_ex.inc.php index a266f80d7..4bb46be97 100644 --- a/conf/conf_admin_ex.inc.php +++ b/conf/conf_admin_ex.inc.php @@ -17,6 +17,10 @@ // Zend Framework (Zend Gdataでも可) のlibraryディレクトリへのパス $_conf['expack.zf_path'] = ""; // ("") +// curl による並列ダウンロードを有効にする +// (off:0, on:1) +$_conf['expack.use_curl_multi'] = 0; // (1) + // pecl_http が利用できる場合、HttpRequestPool による並列ダウンロードを有効にする // (off:0, on:1, コマンドラインで実行:2) $_conf['expack.use_pecl_http'] = 1; // (1) diff --git a/lib/P2CurlMulti.php b/lib/P2CurlMulti.php new file mode 100644 index 000000000..56c77823d --- /dev/null +++ b/lib/P2CurlMulti.php @@ -0,0 +1,298 @@ +mh = curl_multi_init(); + $this->ch = array(); + $this->file_update = array(); + } + + private function __destruct() { + foreach ($this->ch as $ch_array) { + curl_multi_remove_handle($this->mh, $ch_array); + curl_close($ch_array); + } + curl_multi_close($this->mh); + } + + + private function add($subjects, $force = false) { + global $_conf; + + if(empty($subjects)){ return; } + + $time = time() - $_conf['sb_dl_interval']; + $isOldFile = array(); + + foreach ($subjects as $key => $subject) { + list($host, $bbs) = explode("_", $key); + + $url = "http://{$host}/{$bbs}/subject.txt"; + $file = P2Util::datDirOfHostBbs($host, $bbs) . 'subject.txt'; + + $isOldFile[$key] = false; + if (!$force && file_exists($file) && $time <= filemtime($file)) { + $isOldFile[$key] = true; + continue; + } + + $this->ch[$key] = curl_init(); + + $this->file_update[$key] = file_exists($file) ? filemtime($file) : 0; + + // dat取得用header生成 + $header = array(); + $header["If-Modified-Since"] = gmdate('D, d M Y H:i:s T', $this->file_update[$key]); + $header["Connection"] = 'close'; + + curl_setopt($this->ch[$key], CURLOPT_URL, $url); + curl_setopt($this->ch[$key], CURLOPT_RETURNTRANSFER, true); + curl_setopt($this->ch[$key], CURLOPT_TIMEOUT, $_conf['http_read_timeout']); + curl_setopt($this->ch[$key], CURLOPT_CONNECTTIMEOUT, $_conf['http_conn_timeout']); + curl_setopt($this->ch[$key], CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($this->ch[$key], CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE); + curl_setopt($this->ch[$key], CURLOPT_FILETIME, true); + curl_setopt($this->ch[$key], CURLOPT_HTTPHEADER, $header); + curl_setopt($this->ch[$key], CURLINFO_HEADER_OUT, true); + curl_setopt($this->ch[$key], CURLOPT_HEADER, true); + curl_setopt($this->ch[$key], CURLOPT_MAXCONNECTS, self::MAX_REQUESTS_PER_HOST); + + // User-Agent + if(P2Util::isHost2chs($host) && !P2Util::isNotUse2chAPI($host) && $_conf['2chapi_use']){ + $user_agent = sprintf ($_conf['2chapi_ua.read'], $_conf['2chapi_appname']); + } else { + $user_agent = P2Util::getP2UA(true, P2Util::isHost2chs($purl['host'])); + } + curl_setopt($this->ch[$key], CURLOPT_USERAGENT, $user_agent); + + // プロキシ + if ($_conf['tor_use'] && P2Util::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット + $tor_user_info = sprintf("%s%s@", $_conf['tor_proxy_user'], empty($_conf['tor_proxy_password']) ? "" : ":{$_conf['tor_proxy_password']}"); + $tor_address = "{$_conf['tor_proxy_host']}:{$_conf['tor_proxy_port']}"; + $address = sprintf("http://%s%s", strpos($tor_user_info, "@") === 0 ? "" : $tor_user_info, $tor_address); + + curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); + curl_setopt($ch, CURLOPT_PROXY, $address); + + if($_conf['tor_proxy_mode'] == 'socks5'){ + curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); + } + + } elseif ($_conf['proxy_use']) { + $proxy_user_info = sprintf("%s%s@", $_conf['proxy_user'], empty($_conf['proxy_password']) ? "" : ":{$_conf['proxy_password']}"); + $proxy_address = "{$_conf['proxy_host']}:{$_conf['proxy_port']}"; + $address = sprintf("http://%s%s", strpos($proxy_user_info, "@") === 0 ? "" : $proxy_user_info, $proxy_address); + + curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); + curl_setopt($ch, CURLOPT_PROXY, $address); + + if($_conf['proxy_mode'] == 'socks5'){ + curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); + } + } + + curl_multi_add_handle($this->mh, $this->ch[$key]); + } + } + + private function execute() { + global $_conf; + + if(is_null($this->mh) && is_null($this->ch)){ + return; + } + + // execute + do { + $stat = curl_multi_exec($this->mh, $running); + } while ($stat === CURLM_CALL_MULTI_PERFORM); + + // check + // 暫定で残す(not start Download なら終了でも?) +// if (!$running || $stat !== CURLM_OK) { +// // throw new RuntimeException("$running $stat"); +// error_log("not start download. please check. running:[$running], stat:[$stat]\n", 3, "D:/Apache/Apache2.4/logs/test.log"); +// } + + // wait + do { + switch (curl_multi_select($this->mh, self::TIMEOUT)) { + case -1: // selectに失敗するケースがあるらしい https://bugs.php.net/bug.php?id=61141 + usleep(10); + do{ + $stat = curl_multi_exec($this->mh, $running); + } while ($stat === CURLM_CALL_MULTI_PERFORM); + continue 2; + + case 0: //timeout + continue 2; + + default: + //何か変化があった + do{ + $stat = curl_multi_exec($this->mh, $running); + } while ($stat === CURLM_CALL_MULTI_PERFORM); + } + } while ($running); + } + + private function getResult() { + + $eucjp2sjis = null; + + foreach ($this->ch as $key => $ch_array) { + list($host, $bbs) = explode("_", $key); + + if ($isOldFile[$key]) { + continue; + } + + $file = P2Util::datDirOfHostBbs($host, $bbs) . 'subject.txt'; + + if(is_null($this->mh) && is_null($ch_array)){ + return; + } + + if(empty($ch)){ + continue; + } + + $tmp = curl_getinfo($ch_array); + $tmp += array("before_time" => $this->file_update[$key], "after_time" => empty($tmp['filetime']) ? time() : $tmp['filetime']); + // $result[$key] = $tmp; + + $data = curl_multi_getcontent($ch_array); + $header_size = $tmp['header_size']; + + if (P2Util::isHostJbbsShitaraba($host) || P2Util::isHostBe2chNet($host)) { + $data = mb_convert_encoding($data, 'CP932', 'CP51932'); + } + + // 304が来なかったとき用 + if($tmp['http_code'] != "304" && $tmp['before_time'] <= $tmp['after_time']){ + $body = substr($data, $header_size); + if (file_put_contents($file, $body) === false) { + error_log("cannot write file.[$file]\n", 3, "D:/Apache/Apache2.4/logs/test.log"); + } + } + } + } + + // {{{ fetchSubjectTxt() + + /** + * subject.txtを一括ダウンロード&保存する + * + * @param array|string $subjects + * @param bool $force + * @return void + */ + static public function fetchSubjectTxt($subjects, $force = false) + { + global $_conf; + + $makeIdFormat = "%s_%s"; + + // {{{ ダウンロード対象を設定 + + // お気に板等の.idx形式のファイルをパース + if (is_string($subjects)) { + $lines = FileCtl::file_read_lines($subjects, FILE_IGNORE_NEW_LINES); + if (!$lines) { + return; + } + + $subjects = array(); + + foreach ($lines as $l) { + $la = explode('<>', $l); + if (count($la) < 12) { + continue; + } + + $host = $la[10]; + $bbs = $la[11]; + if ($host === '' || $bbs === '') { + continue; + } + + $key = sprintf($makeIdFormat, $host, $bbs); + if (isset($subjects[$key])) { + continue; + } + + $subjects[$key] = array($host, $bbs); + } + + // [host, bbs] の連想配列を検証 + } elseif (is_array($subjects)) { + $originals = $subjects; + $subjects = array(); + + foreach ($originals as $s) { + if (!is_array($s) || !isset($s['host']) || !isset($s['bbs'])) { + continue; + } + + $key = sprintf($makeIdFormat, $s['host'], $s['bbs']); + if (isset($subjects[$key])) { + continue; + } + + $subjects[$key] = array($s['host'], $s['bbs']); + } + + // 上記以外 + } else { + return; + } + + if (!count($subjects)) { + return; + } + + // }}} + // {{{ + + ksort($subjects); + + $self = new self; + + // 各 subject.txt へのリクエストをキューに追加 + $self->add($subjects, $force); + + // ダウンロードスタート + $self->execute(); + + // 各 subject.txt を保存 + $self->getResult(); + + // }}} + + return ; + } + + // }}} +} + +// }}} +/* + * Local Variables: + * mode: php + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ +// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/lib/ShowBrdMenuPc.php b/lib/ShowBrdMenuPc.php index 583bf4ce8..1c90172d9 100644 --- a/lib/ShowBrdMenuPc.php +++ b/lib/ShowBrdMenuPc.php @@ -107,7 +107,10 @@ public function printFavIta() if ($favitas) { // 新着数を表示する場合・まとめてプリフェッチ if ($_conf['enable_menu_new'] && !empty($_GET['new'])) { - if ($_conf['expack.use_pecl_http'] == 1) { + if ($_conf['expack.use_curl_multi'] == 1) { + P2CurlMulti::fetchSubjectTxt($favitas); + $GLOBALS['expack.subject.multi-threaded-download.done'] = true; + } elseif ($_conf['expack.use_pecl_http'] == 1) { P2HttpExt::activate(); P2HttpRequestPool::fetchSubjectTxt($favitas); $GLOBALS['expack.subject.multi-threaded-download.done'] = true; diff --git a/lib/ThreadList.php b/lib/ThreadList.php index 8a6c9cd6a..1856e1930 100644 --- a/lib/ThreadList.php +++ b/lib/ThreadList.php @@ -167,7 +167,10 @@ public function readList() } if (empty($_REQUEST['norefresh']) && !(empty($_REQUEST['refresh']) && isset($_REQUEST['word']))) { - if ($_conf['expack.use_pecl_http'] == 1) { + if ($_conf['expack.use_curl_multi'] == 1) { + P2CurlMulti::fetchSubjectTxt($favitas); + $GLOBALS['expack.subject.multi-threaded-download.done'] = true; + } elseif ($_conf['expack.use_pecl_http'] == 1) { P2HttpExt::activate(); P2HttpRequestPool::fetchSubjectTxt($favitas); $GLOBALS['expack.subject.multi-threaded-download.done'] = true; diff --git a/lib/menu.inc.php b/lib/menu.inc.php index 2419d9554..0878ac119 100644 --- a/lib/menu.inc.php +++ b/lib/menu.inc.php @@ -290,17 +290,19 @@ function chMenuColor(idnum){ // ■新着数を表示する場合 if ($_conf['enable_menu_new'] == 1 && $_GET['new']) { // 並列ダウンロードの設定 - if ($_conf['expack.use_pecl_http'] == 1) { - P2HttpExt::activate(); - $GLOBALS['expack.subject.multi-threaded-download.done'] = true; - } elseif ($_conf['expack.use_pecl_http'] == 2) { + if ($_conf['expack.use_curl_multi'] != 0 || $_conf['expack.use_pecl_http'] != 0) { + if ($_conf['expack.use_pecl_http'] == 1) { + P2HttpExt::activate(); + } $GLOBALS['expack.subject.multi-threaded-download.done'] = true; } // {{{ お気にスレ // ダウンロード - if ($_conf['expack.use_pecl_http'] == 1) { + if ($_conf['expack.use_curl_multi'] == 1) { + P2CurlMulti::fetchSubjectTxt($_conf['favlist_idx']); + } elseif ($_conf['expack.use_pecl_http'] == 1) { P2HttpRequestPool::fetchSubjectTxt($_conf['favlist_idx']); } elseif ($_conf['expack.use_pecl_http'] == 2) { P2CommandRunner::fetchSubjectTxt('fav', $_conf); @@ -317,7 +319,9 @@ function chMenuColor(idnum){ // {{{ 最近読んだスレ // ダウンロード - if ($_conf['expack.use_pecl_http'] == 1) { + if ($_conf['expack.use_curl_multi'] == 1) { + P2CurlMulti::fetchSubjectTxt($_conf['recent_idx']); + } elseif ($_conf['expack.use_pecl_http'] == 1) { P2HttpRequestPool::fetchSubjectTxt($_conf['recent_idx']); } elseif ($_conf['expack.use_pecl_http'] == 2) { P2CommandRunner::fetchSubjectTxt('recent', $_conf); @@ -334,7 +338,9 @@ function chMenuColor(idnum){ // {{{ 書き込み履歴 // ダウンロード - if ($_conf['expack.use_pecl_http'] == 1) { + if ($_conf['expack.use_curl_multi'] == 1) { + P2CurlMulti::fetchSubjectTxt($_conf['res_hist_idx']); + } elseif ($_conf['expack.use_pecl_http'] == 1) { P2HttpRequestPool::fetchSubjectTxt($_conf['res_hist_idx']); } elseif ($_conf['expack.use_pecl_http'] == 2) { P2CommandRunner::fetchSubjectTxt('res_hist', $_conf); diff --git a/rep2/subject.php b/rep2/subject.php index c40690f74..bf25791d9 100644 --- a/rep2/subject.php +++ b/rep2/subject.php @@ -264,29 +264,46 @@ } //============================================================ -// 更新する場合、前もって一括&並列ダウンロード (要pecl_http) +// 更新する場合、前もって一括&並列ダウンロード (要pecl_http or curl) //============================================================ if (empty($_REQUEST['norefresh']) && !(empty($_REQUEST['refresh']) && isset($_REQUEST['word']))) { - if ($_conf['expack.use_pecl_http'] == 1) { + if ($_conf['expack.use_curl_multi'] == 1) { + switch ($spmode) { + case 'fav': + P2CurlMulti::fetchSubjectTxt($_conf['favlist_idx']); + break; + case 'recent': + P2CurlMulti::fetchSubjectTxt($_conf['recent_idx']); + break; + case 'res_hist': + P2CurlMulti::fetchSubjectTxt($_conf['res_hist_idx']); + break; + case 'merge_favita': + P2CurlMulti::fetchSubjectTxt($favitas); + break; + } + $GLOBALS['expack.subject.multi-threaded-download.done'] = true; + + } elseif ($_conf['expack.use_pecl_http'] == 1) { P2HttpExt::activate(); switch ($spmode) { - case 'fav': - P2HttpRequestPool::fetchSubjectTxt($_conf['favlist_idx']); - $GLOBALS['expack.subject.multi-threaded-download.done'] = true; - break; - case 'recent': - P2HttpRequestPool::fetchSubjectTxt($_conf['recent_idx']); - $GLOBALS['expack.subject.multi-threaded-download.done'] = true; - break; - case 'res_hist': - P2HttpRequestPool::fetchSubjectTxt($_conf['res_hist_idx']); - $GLOBALS['expack.subject.multi-threaded-download.done'] = true; - break; - case 'merge_favita': - P2HttpRequestPool::fetchSubjectTxt($favitas); - $GLOBALS['expack.subject.multi-threaded-download.done'] = true; - break; + case 'fav': + P2HttpRequestPool::fetchSubjectTxt($_conf['favlist_idx']); + $GLOBALS['expack.subject.multi-threaded-download.done'] = true; + break; + case 'recent': + P2HttpRequestPool::fetchSubjectTxt($_conf['recent_idx']); + $GLOBALS['expack.subject.multi-threaded-download.done'] = true; + break; + case 'res_hist': + P2HttpRequestPool::fetchSubjectTxt($_conf['res_hist_idx']); + $GLOBALS['expack.subject.multi-threaded-download.done'] = true; + break; + case 'merge_favita': + P2HttpRequestPool::fetchSubjectTxt($favitas); + $GLOBALS['expack.subject.multi-threaded-download.done'] = true; + break; } } elseif ($_conf['expack.use_pecl_http'] == 2) { if (P2CommandRunner::fetchSubjectTxt($spmode, $_conf)) { diff --git a/scripts/fetch-subject-txt.php b/scripts/fetch-subject-txt.php index c90cbf60e..527f4786f 100644 --- a/scripts/fetch-subject-txt.php +++ b/scripts/fetch-subject-txt.php @@ -136,9 +136,19 @@ $favitas[$_id] = array('host' => $_host, 'bbs' => $_bbs); } } - P2HttpRequestPool::fetchSubjectTxt($favitas); + + if($_conf['expack.use_curl_multi'] == 1) { + P2HttpExt::fetchSubjectTxt($favitas); + } elseif($_conf['expack.use_pecl_http'] == 1) { + P2HttpRequestPool::fetchSubjectTxt($favitas); + } + } else { - P2HttpRequestPool::fetchSubjectTxt($source); + if($_conf['expack.use_curl_multi'] == 1) { + P2CurlMulti::fetchSubjectTxt($source); + } elseif($_conf['expack.use_pecl_http'] == 1) { + P2HttpRequestPool::fetchSubjectTxt($source); + } } // }}} From 8ca37de4c3ed6b4a5c5651dcc6851b7e86f95630 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Fri, 3 Jun 2016 20:26:54 +0900 Subject: [PATCH 205/339] =?UTF-8?q?error=204002=20=E3=81=AB=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index e4bd34093..2da1ec535 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -663,6 +663,7 @@ public function get2chDatError($code = null) { $soukoni_match = "/隊長!過去ログ倉庫に<\/title>/"; $error3939_match = "{<title>2ちゃんねる error 3939}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) + $error4002_match = "{2ちゃんねる error 4002}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) // // @@ -682,6 +683,7 @@ public function get2chDatError($code = null) { } elseif ($reason === 'kakohtml' or preg_match ($naidesu_match, $read_response_html, $matches) || preg_match ($error3939_match, $read_response_html, $matches) || + preg_match ($error4002_match, $read_response_html, $matches) || preg_match ($vip2ch_kakosoko_match, $read_response_html, $matches) || preg_match ($soukoni_match, $read_response_html, $matches)) { @@ -694,6 +696,14 @@ public function get2chDatError($code = null) { $kakolog_url_en = rawurlencode ($kakolog_uri); $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; $dat_response_msg = "

    2ch info - 隊長! 過去ログ倉庫で、スレッド {$matches[3]}.html を発見しました。 [rep2に取り込んで読む]

    "; + } elseif (preg_match ($error4002_match, $read_response_html, $matches)) { + $dat_response_status = "隊長! 過去ログ倉庫で、html化されたスレッドを発見しました。"; + $key4 = substr($this->key, 0, 4); + $key5 = substr($this->key, 0, 5); + $kakolog_uri = "http://{$this->host}/{$this->bbs}/kako/{$key4}/{$key5}/{$this->key}"; + $kakolog_url_en = rawurlencode ($kakolog_uri); + $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; + $dat_response_msg = "

    2ch info - 隊長! 過去ログ倉庫で、スレッド {$this->key}.html を発見しました。 [rep2に取り込んで読む]

    "; } elseif (preg_match ($waithtml_match, $read_response_html, $matches)) { $dat_response_status = "隊長! スレッドはhtml化されるのを待っているようです。"; //$marutori_ht = $this->_generateMarutoriLink (); From 17de3f3000c0c4877fbd193e13871e49134488de Mon Sep 17 00:00:00 2001 From: killer4989 Date: Tue, 7 Jun 2016 18:53:18 +0900 Subject: [PATCH 206/339] =?UTF-8?q?SS=20=E9=80=9F=E5=A0=B1=20R=20=E3=81=AE?= =?UTF-8?q?=E7=A7=BB=E8=BB=A2=E6=A4=9C=E7=9F=A5=E3=81=A7=E3=81=8D=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 2da1ec535..d266ca405 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -665,6 +665,8 @@ public function get2chDatError($code = null) { $error3939_match = "{2ちゃんねる error 3939}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) $error4002_match = "{2ちゃんねる error 4002}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) + $vip2ch_ssr_match = "/隊長!新設されたSS速報R板にてスレを発見したですよ!/"; + // // // $kakohtml_match = "{}"; @@ -685,6 +687,7 @@ public function get2chDatError($code = null) { preg_match ($error3939_match, $read_response_html, $matches) || preg_match ($error4002_match, $read_response_html, $matches) || preg_match ($vip2ch_kakosoko_match, $read_response_html, $matches) || + preg_match ($vip2ch_ssr_match, $read_response_html, $matches) || preg_match ($soukoni_match, $read_response_html, $matches)) { if ($reason === 'kakohtml' or preg_match ($kakohtml_match, $read_response_html, $matches)) { @@ -715,6 +718,12 @@ public function get2chDatError($code = null) { $kakolog_url_en = rawurlencode ($kakolog_uri); $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; $dat_response_msg = "

    2ch info - 隊長! 過去ログ倉庫で、スレッド {$this->key}.html を発見しました。 [rep2に取り込んで読む]

    "; + } elseif (preg_match ($vip2ch_ssr_match, $read_response_html, $matches)) { + $dat_response_status = "隊長! 新設されたSS速報R板にてスレを発見したですよ!"; + $movelog_uri = str_replace("news4ssnip", "news4ssr", $read_url); + $movelog_url_en = rawurlencode ($kakolog_uri); + $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs=news4ssr&key={$this->key}&ls={$this->ls}"; + $dat_response_msg = "

    2ch info - 隊長! 新設されたSS速報R板にて、スレッド を発見しました。 [rep2に取り込んで読む]

    "; } else { if (! empty ($_GET['kakolog'])) { $dat_response_status = 'そんな板orスレッドないです。'; From e4a4c49f47b72a66412d599ae7b06636da17df31 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Tue, 12 Jul 2016 12:29:42 +0900 Subject: [PATCH 207/339] =?UTF-8?q?=E3=81=BE=E3=81=A1BBS=20=E3=81=AB?= =?UTF-8?q?=E3=81=A6=E3=83=89=E3=83=A1=E3=82=A4=E3=83=B3=E3=81=A7=E3=82=82?= =?UTF-8?q?=E3=82=B9=E3=83=AC=E3=82=92=E8=A6=8B=E3=82=8C=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/P2Util.php b/lib/P2Util.php index 928938c11..0839f154a 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -948,6 +948,10 @@ static function isHostTor($host, $isGatewayMode = 99) */ static public function isHostMachiBbs($host) { + if ($host === "machi.to") { + return true; + } + if (!array_key_exists($host, self::$_hostIsMachiBbs)) { self::$_hostIsMachiBbs[$host] = (bool)preg_match('<^\\w+\\.machi(?:bbs\\.com|\\.to)$>', $host); } @@ -1926,6 +1930,15 @@ static public function detectThread($url = null) $key = $matches[3]; $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; + // まちBBS(ドメインのみ) - http://machi.to/bbs/read.cgi/kanto/1241815559/ + } elseif (preg_match('<^http?://(machi\\.to)/bbs/read\\.cgi + /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) + { + $host = $matches[1]; + $bbs = $matches[2]; + $key = $matches[3]; + $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; + // したらばJBBS - http://jbbs.livedoor.com/bbs/read.cgi/computer/2999/1081177036/-100 } elseif (preg_match('<^http://(jbbs\\.(?:livedoor\\.(?:jp|com)|shitaraba\\.(?:net|com)))/(?:bbs|bbs/lite)/read\\.cgi /(\\w+)/(\\d+)/(\\d+)/((?:\\d+)?-(?:\\d+)?)?[^"]*>x', $nama_url, $matches)) From 7538c5ebfd6db7bfc7982a4a10bd16177933258d Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 29 Nov 2016 23:22:00 +0900 Subject: [PATCH 208/339] =?UTF-8?q?php5.5.14=E3=81=A7iv2.php=E3=81=8C?= =?UTF-8?q?=E5=8B=95=E3=81=8B=E3=81=AA=E3=81=84=E4=B8=8D=E5=85=B7=E5=90=88?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20thx!=20http://potato.2ch.net/test/read.cgi?= =?UTF-8?q?/software/1465970697/82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 6 +++++- lib/expack/ImageCache2/QuickForm/Rules.php | 6 +++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 3e731893b..2818ed210 100644 --- a/composer.json +++ b/composer.json @@ -6,6 +6,10 @@ { "type": "pear", "url": "https://pear.php.net" + }, + { + "type": "vcs", + "url": "https://github.com/2ch774/quickform" } ], "require": { @@ -21,7 +25,7 @@ "pear-pear.php.net/file": "1.4.1", "pear-pear.php.net/file_util": "1.0.0", "pear-pear.php.net/html_common": "1.2.5", - "pear-pear.php.net/html_quickform": "3.2.13", + "2ch774/quickform": "dev-master", "pear-pear.php.net/http_request2": "2.2.1", "pear-pear.php.net/net_socket": "1.0.10", "pear-pear.php.net/net_url": "1.0.15", diff --git a/lib/expack/ImageCache2/QuickForm/Rules.php b/lib/expack/ImageCache2/QuickForm/Rules.php index 944a30ea6..651a0b750 100644 --- a/lib/expack/ImageCache2/QuickForm/Rules.php +++ b/lib/expack/ImageCache2/QuickForm/Rules.php @@ -15,7 +15,7 @@ class ImageCache2_QuickForm_Rule_NumberInRange extends HTML_QuickForm_Rule /** * @return bool */ - public function validate($value, $options) + public function validate($value, $options = NULL) { if (isset($options['min']) && floatval($value) < $options['min']) { return false; @@ -60,7 +60,7 @@ class ImageCache2_QuickForm_Rule_InArray extends HTML_QuickForm_Rule /** * @return bool */ - public function validate($value, $options) + public function validate($value, $options = NULL) { return in_array($value, $options); } @@ -81,7 +81,7 @@ class ImageCache2_QuickForm_ArrayKeyExists extends HTML_QuickForm_Rule /** * @return bool */ - public function validate($value, $options) + public function validate($value, $options = NULL) { return array_key_exists($value, $options); } From 4800920c43f8aef1e19c0c0ea2936021da176a22 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Fri, 3 Jun 2016 20:27:38 +0900 Subject: [PATCH 209/339] =?UTF-8?q?API=20=E6=9C=AA=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E3=81=A7=E3=82=82=E8=A6=8B=E3=82=8C=E3=82=8B=E6=9D=BF=E3=81=8C?= =?UTF-8?q?=E3=81=82=E3=81=A3=E3=81=9F=E3=81=AE=E3=81=A7=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/P2Util.php b/lib/P2Util.php index 0839f154a..475d1e2ce 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -891,6 +891,20 @@ static public function isHostBe2chNet($host) */ } + // }}} + // {{{ isNotUse2chAPI() + + /** + * host が API を用いなくても取得できる場合なら true を返す + * + * @param string $host + * @return bool + */ + static public function isNotUse2chAPI($host) + { + return ($host == 'qb5.2ch.net' || $host == 'carpenter.2ch.net'); + } + // }}} // {{{ isHostBbsPink() From 5e7392366904d155ccae3176272e1d763a5d8a25 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Sat, 4 Jun 2016 14:12:59 +0900 Subject: [PATCH 210/339] =?UTF-8?q?API=20=E6=9C=AA=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E3=81=A7=E3=82=82=E8=A6=8B=E3=82=8C=E3=82=8B=E6=9D=BF=E3=81=8C?= =?UTF-8?q?=E3=81=82=E3=81=A3=E3=81=9F=E3=81=AE=E3=81=A7=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index d266ca405..1a3772deb 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -70,7 +70,7 @@ public function downloadDat() { return $this->_downloadDat2chKako ($_GET['kakolog'], $ext); // 2ch はAPI経由で落とす - } elseif (P2Util::isHost2chs ($this->host) && $_conf['2chapi_use'] && empty ($_GET['olddat'])) { + } elseif (P2Util::isHost2chs ($this->host) && !P2Util::isNotUse2chAPI ($this->host) && $_conf['2chapi_use'] && empty ($_GET['olddat'])) { // ログインしてなければ or ログイン後、設定した時間経過していたら自動再ログイン if (! file_exists ($_conf['sid2chapi_php']) || ! empty ($_REQUEST['relogin2chapi']) || (filemtime ($_conf['sid2chapi_php']) < time () - 60 * 60 * $_conf['2chapi_interval'])) { From 80840d5603fe48e9d003fa7699b96930873c78b9 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 6 Apr 2017 22:13:57 +0900 Subject: [PATCH 211/339] =?UTF-8?q?my=5FFROM=E3=81=AE=E5=80=A4=E3=81=8C?= =?UTF-8?q?=E7=84=A1=E8=A6=96=E3=81=95=E3=82=8C=E3=82=8B=E4=B8=8D=E5=85=B7?= =?UTF-8?q?=E5=90=88=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/post_form_options.inc.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index 563c03e11..d56ba9ca8 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -113,14 +113,6 @@ function setHiddenValue(button) { // }}} // {{{ 名前とメールの最終調整 -// 空白はユーザ設定値に変換 -if ($hd['FROM'] === '') { - $hd['FROM'] = p2h($_conf['my_FROM']); -} -if ($hd['mail'] === '') { - $hd['mail'] = p2h($_conf['my_mail']); -} - // P2NULLは空白に変換 if ($hd['FROM'] === 'P2NULL') { $hd['FROM'] = ''; @@ -129,6 +121,14 @@ function setHiddenValue(button) { $hd['mail'] = ''; } +// 空白はユーザ設定値に変換 +if ($hd['FROM'] === '') { + $hd['FROM'] = p2h($_conf['my_FROM']); +} +if ($hd['mail'] === '') { + $hd['mail'] = p2h($_conf['my_mail']); +} + // }}} // {{{ textareaの属性 From efc9cc0e467bd0c0c71fb0ad6855b2afceee723d Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 6 Apr 2017 22:15:09 +0900 Subject: [PATCH 212/339] =?UTF-8?q?P2CurlMulti=E3=81=AB=E9=96=A2=E3=81=99?= =?UTF-8?q?=E3=82=8B=E4=B8=8D=E5=85=B7=E5=90=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2CurlMulti.php | 8 ++++---- rep2/subject.php | 5 ++++- scripts/fetch-subject-txt.php | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/P2CurlMulti.php b/lib/P2CurlMulti.php index 56c77823d..74751b308 100644 --- a/lib/P2CurlMulti.php +++ b/lib/P2CurlMulti.php @@ -121,7 +121,7 @@ private function execute() { // 暫定で残す(not start Download なら終了でも?) // if (!$running || $stat !== CURLM_OK) { // // throw new RuntimeException("$running $stat"); -// error_log("not start download. please check. running:[$running], stat:[$stat]\n", 3, "D:/Apache/Apache2.4/logs/test.log"); +// error_log("not start download. please check. running:[$running], stat:[$stat]\n"); // } // wait @@ -159,11 +159,11 @@ private function getResult() { $file = P2Util::datDirOfHostBbs($host, $bbs) . 'subject.txt'; - if(is_null($this->mh) && is_null($ch_array)){ + if(is_null($this->mh)){ return; } - if(empty($ch)){ + if(empty($ch_array)){ continue; } @@ -182,7 +182,7 @@ private function getResult() { if($tmp['http_code'] != "304" && $tmp['before_time'] <= $tmp['after_time']){ $body = substr($data, $header_size); if (file_put_contents($file, $body) === false) { - error_log("cannot write file.[$file]\n", 3, "D:/Apache/Apache2.4/logs/test.log"); + error_log("cannot write file.[$file]\n"); } } } diff --git a/rep2/subject.php b/rep2/subject.php index bf25791d9..482b70e76 100644 --- a/rep2/subject.php +++ b/rep2/subject.php @@ -272,18 +272,21 @@ switch ($spmode) { case 'fav': P2CurlMulti::fetchSubjectTxt($_conf['favlist_idx']); + $GLOBALS['expack.subject.multi-threaded-download.done'] = true; break; case 'recent': P2CurlMulti::fetchSubjectTxt($_conf['recent_idx']); + $GLOBALS['expack.subject.multi-threaded-download.done'] = true; break; case 'res_hist': P2CurlMulti::fetchSubjectTxt($_conf['res_hist_idx']); + $GLOBALS['expack.subject.multi-threaded-download.done'] = true; break; case 'merge_favita': P2CurlMulti::fetchSubjectTxt($favitas); + $GLOBALS['expack.subject.multi-threaded-download.done'] = true; break; } - $GLOBALS['expack.subject.multi-threaded-download.done'] = true; } elseif ($_conf['expack.use_pecl_http'] == 1) { P2HttpExt::activate(); diff --git a/scripts/fetch-subject-txt.php b/scripts/fetch-subject-txt.php index 527f4786f..f393cee7e 100644 --- a/scripts/fetch-subject-txt.php +++ b/scripts/fetch-subject-txt.php @@ -138,7 +138,7 @@ } if($_conf['expack.use_curl_multi'] == 1) { - P2HttpExt::fetchSubjectTxt($favitas); + P2CurlMulti::fetchSubjectTxt($favitas); } elseif($_conf['expack.use_pecl_http'] == 1) { P2HttpRequestPool::fetchSubjectTxt($favitas); } From 1b25e148e2d7f81af50e1d26e97773e58409db98 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Tue, 27 Dec 2016 01:13:19 +0900 Subject: [PATCH 213/339] =?UTF-8?q?onion.rip=20=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index 475d1e2ce..a4a810070 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -940,11 +940,11 @@ static function isHostTor($host, $isGatewayMode = 99) break; case 1: - $ret = (bool)preg_match('/\\.(onion\\.cab|onion\\.city|onion\\.direct|onion\\.link|onion\\.nu|onion\\.to)$/', $host); + $ret = (bool)preg_match('/\\.(onion\\.cab|onion\\.city|onion\\.direct|onion\\.link|onion\\.nu|onion\\.to|onion\\.rip)$/', $host); break; default: - $ret = (bool)preg_match('/\\.(onion\\.cab|onion\\.city|onion\\.direct|onion\\.link|onion\\.nu|onion\\.to|onion)$/', $host); + $ret = (bool)preg_match('/\\.(onion\\.cab|onion\\.city|onion\\.direct|onion\\.link|onion\\.nu|onion\\.to|onion\\.rip|onion)$/', $host); break; } From d8a286ac631480c9e621acc5592b095116dfcc37 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Tue, 27 Dec 2016 14:01:17 +0900 Subject: [PATCH 214/339] =?UTF-8?q?P2CurlMulti=20=E3=81=A7=E3=81=AE?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=A0=E3=82=A2=E3=82=A6=E3=83=88=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E5=80=A4=E3=82=92=20http=5Fconn=5Ftimeout=20/=20http?= =?UTF-8?q?=5Fread=5Ftimeout=20=E3=81=AB=E4=BE=9D=E5=AD=98=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2CurlMulti.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/P2CurlMulti.php b/lib/P2CurlMulti.php index 74751b308..56342af9f 100644 --- a/lib/P2CurlMulti.php +++ b/lib/P2CurlMulti.php @@ -3,7 +3,6 @@ class P2CurlMulti { - const TIMEOUT = 300; const MAX_REQUESTS_PER_HOST = 2; private $mh; @@ -126,7 +125,7 @@ private function execute() { // wait do { - switch (curl_multi_select($this->mh, self::TIMEOUT)) { + switch (curl_multi_select($this->mh, $_conf['http_conn_timeout'] + $_conf['http_read_timeout'])) { case -1: // selectに失敗するケースがあるらしい https://bugs.php.net/bug.php?id=61141 usleep(10); do{ From 22b04dcff2804f9ac63b85c6bafbc29279cf5a6e Mon Sep 17 00:00:00 2001 From: killer4989 Date: Tue, 27 Dec 2016 14:15:01 +0900 Subject: [PATCH 215/339] =?UTF-8?q?curl=20=E3=81=AB=E3=82=88=E3=82=8B?= =?UTF-8?q?=E4=B8=A6=E5=88=97=E3=83=80=E3=82=A6=E3=83=B3=E3=83=AD=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=81=AE=E6=9C=80=E5=A4=A7=E6=8C=81=E7=B6=9A=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E7=B6=9A=E6=95=B0=E3=82=92=E5=A4=89=E6=9B=B4=E3=81=A7?= =?UTF-8?q?=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_admin_ex.inc.php | 3 +++ lib/P2CurlMulti.php | 4 +--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/conf/conf_admin_ex.inc.php b/conf/conf_admin_ex.inc.php index 4bb46be97..e64d780f5 100644 --- a/conf/conf_admin_ex.inc.php +++ b/conf/conf_admin_ex.inc.php @@ -21,6 +21,9 @@ // (off:0, on:1) $_conf['expack.use_curl_multi'] = 0; // (1) +// curl による並列ダウンロードの最大持続的接続数 +$_conf['expack.curl_per_host'] = 2; // (1) + // pecl_http が利用できる場合、HttpRequestPool による並列ダウンロードを有効にする // (off:0, on:1, コマンドラインで実行:2) $_conf['expack.use_pecl_http'] = 1; // (1) diff --git a/lib/P2CurlMulti.php b/lib/P2CurlMulti.php index 56342af9f..033225bb9 100644 --- a/lib/P2CurlMulti.php +++ b/lib/P2CurlMulti.php @@ -3,8 +3,6 @@ class P2CurlMulti { - const MAX_REQUESTS_PER_HOST = 2; - private $mh; private $ch; private $file_update; @@ -64,7 +62,7 @@ private function add($subjects, $force = false) { curl_setopt($this->ch[$key], CURLOPT_HTTPHEADER, $header); curl_setopt($this->ch[$key], CURLINFO_HEADER_OUT, true); curl_setopt($this->ch[$key], CURLOPT_HEADER, true); - curl_setopt($this->ch[$key], CURLOPT_MAXCONNECTS, self::MAX_REQUESTS_PER_HOST); + curl_setopt($this->ch[$key], CURLOPT_MAXCONNECTS, $_conf['expack.curl_per_host']); // User-Agent if(P2Util::isHost2chs($host) && !P2Util::isNotUse2chAPI($host) && $_conf['2chapi_use']){ From 82de3ba0af6103f01c2a50997db39ac88984f27c Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 7 Apr 2017 00:32:34 +0900 Subject: [PATCH 216/339] =?UTF-8?q?=E8=82=A5=E5=A4=A7=E5=8C=96=E3=81=97?= =?UTF-8?q?=E3=81=9FP2Util=E3=81=8B=E3=82=89HTTP=E9=96=A2=E4=BF=82?= =?UTF-8?q?=E3=81=AE=E6=A9=9F=E8=83=BD=E3=82=92P2Commun=E3=81=AB=E7=A7=BB?= =?UTF-8?q?=E5=8B=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_user_style.inc.php | 2 +- lib/BrdCtl.php | 20 +-- lib/DownloadDatMachiBbs.php | 2 +- lib/P2Commun.php | 233 ++++++++++++++++++++++++++++++++ lib/P2CurlMulti.php | 2 +- lib/P2HttpExt.php | 2 +- lib/P2Util.php | 205 +--------------------------- lib/SettingTxt.php | 4 +- lib/SubjectTxt.php | 4 +- lib/ThreadRead.php | 24 ++-- lib/auth2chapi.inc.php | 4 +- lib/expack/rss/parser.inc.php | 7 +- lib/login2ch.inc.php | 6 +- lib/plugins/hissi/Hissi.php | 2 +- lib/plugins/mimizun/Mimizun.php | 2 +- lib/post_form_options.inc.php | 2 +- lib/read_shitaraba.inc.php | 2 +- lib/wiki/P2UtilWiki.php | 38 ------ lib/wiki/ReplaceImageUrlCtl.php | 4 +- lib/wiki/Samba.php | 2 +- rep2/dig2ch.php | 4 +- rep2/ic2.php | 6 +- rep2/post.php | 4 +- rep2/title.php | 13 +- 24 files changed, 283 insertions(+), 311 deletions(-) create mode 100644 lib/P2Commun.php diff --git a/conf/conf_user_style.inc.php b/conf/conf_user_style.inc.php index 53634e6c7..d4b3dde3f 100644 --- a/conf/conf_user_style.inc.php +++ b/conf/conf_user_style.inc.php @@ -15,7 +15,7 @@ $STYLE['fontfamily'] = "ヒラギノ角ゴ Pro W3"; // ("ヒラギノ角ゴ Pro W3") 基本のフォント if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mac') !== false) { - if(!P2Util::isBrowserSafariGroup()){ /* ブラウザが Macで Safari 以外 なら */ + if(!UA::isSafariGroup()){ /* ブラウザが Macで Safari 以外 なら */ $STYLE['fontfamily_bold'] = "ヒラギノ角ゴ Pro W6"; // ("ヒラギノ角ゴ Pro W6") 基本ボールド用フォント(普通に太字にしたい場合は指定しない("")) } diff --git a/lib/BrdCtl.php b/lib/BrdCtl.php index 75cb87a1c..7195ab866 100644 --- a/lib/BrdCtl.php +++ b/lib/BrdCtl.php @@ -82,24 +82,14 @@ static public function read_brd_online() if ($_conf['brdfile_online']) { $cachefile = P2Util::cacheFileForDL($_conf['brdfile_online']); - $noDL = false; - $read_html_flag = false; - // キャッシュがある場合 - if (file_exists($cachefile.'.p2.brd')) { - // norefreshならDLしない - if (!empty($_GET['nr'])) { - $noDL = true; - // キャッシュの更新が指定時間以内ならDLしない - } elseif (@filemtime($cachefile.'.p2.brd') > time() - 60 * 60 * $_conf['menu_dl_interval']) { - $noDL = true; - } - } + $read_html_flag = false; - // DLする - if (!$noDL) { + // DLする、ただしnorefreshならDLしない + if (empty($_GET['nr']) || !file_exists($cachefile.'.p2.brd')) { //echo "DL!
    ";// - $brdfile_online_res = P2Util::fileDownload($_conf['brdfile_online'], $cachefile); + $cache_time = time() - 60 * 60 * $_conf['menu_dl_interval']; + $brdfile_online_res = P2Commun::fileDownload($_conf['brdfile_online'], $cachefile, $cache_time); if (isset($brdfile_online_res) && $brdfile_online_res->getStatus() != 304) { $isNewDL = true; } diff --git a/lib/DownloadDatMachiBbs.php b/lib/DownloadDatMachiBbs.php index 2a4263223..9f122054e 100644 --- a/lib/DownloadDatMachiBbs.php +++ b/lib/DownloadDatMachiBbs.php @@ -66,7 +66,7 @@ static public function invoke(ThreadRead $thread) } elseif (file_exists($tempfile)) { unlink($tempfile); } - $response = P2Util::fileDownload($url, $tempfile); + $response = P2Commun::fileDownload($url, $tempfile); if (empty($response)) { $thread->diedat = true; diff --git a/lib/P2Commun.php b/lib/P2Commun.php new file mode 100644 index 000000000..b617763aa --- /dev/null +++ b/lib/P2Commun.php @@ -0,0 +1,233 @@ +setHeader ('User-Agent', self::getP2UA(true,P2Util::isHost2chs($purl['host']))); + $req->setHeader ('Acecpt-Language', 'ja,en-us;q=0.7,en;q=0.3'); + $req->setHeader ('Accept', '*/*'); + $req->setHeader ('Accept-Encoding', 'gzip, deflate'); + + // タイムアウトの設定 + $req->setConfig (array ( + 'connect_timeout' => $_conf['http_conn_timeout'], + 'timeout' => $_conf['http_read_timeout'], + )); + + // SSLの設定 + if($purl['scheme'] == 'https') { + $req->setAdapter($_conf['ssl_function']); + + if($_conf['ssl_capath']) + { + $req->setConfig ('ssl_capath', $_conf['ssl_capath']); + } + } + + // プロキシ + if ($_conf['tor_use'] && self::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット + $req->setConfig (array ( + 'proxy_host' => $_conf['tor_proxy_host'], + 'proxy_port' => $_conf['tor_proxy_port'], + 'proxy_user' => $_conf['tor_proxy_user'], + 'proxy_password' => $_conf['tor_proxy_password'] + )); + if($_conf['tor_proxy_mode'] == 'socks5'){ + $req->setConfig('proxy_type', $_conf['tor_proxy_mode']); + } + } elseif ($_conf['proxy_use']) { + $req->setConfig (array ( + 'proxy_host' => $_conf['proxy_host'], + 'proxy_port' => $_conf['proxy_port'], + 'proxy_user' => $_conf['proxy_user'], + 'proxy_password' => $_conf['proxy_password'] + )); + if($_conf['proxy_mode'] == 'socks5'){ + $req->setConfig('proxy_type', $_conf['proxy_mode']); + } + } + + unset ($purl); + + return $req; + } + + static public function getHTTPResponse($req) { + if($req->getConfig('proxy_type') == 'socks5') { + $socks = new HTTP_Request2_Adapter_Socket(); + $res = $socks->sendRequest($req); + unset($socks); + } else { + $res = $req->send (); + } + return $res; + } + // }}} + // {{{ getP2UA() + /** + * p2又はAPIのUAを返す + * @param bool $withMonazilla trueならMonazilla/1.00を付ける + * @param bool $apiUA trueで尚且つAPIが利用可能なときにAPIのUAを返す + * @return string + */ + static public function getP2UA($withMonazilla = true,$apiUA = false) + { + global $_conf; + + // APIを使用する設定の場合はAPIのUAを返す + if ($apiUA && $_conf['2chapi_use'] == 1) { + if ($_conf['2chapi_appname'] != "") { + $p2ua = $_conf['2chapi_appname']; + } else { + p2die("2chと通信するために必要な情報が設定されていません。"); + } + + } else { + $p2ua = $_conf['p2ua']; + } + + if ($withMonazilla) { + $p2ua = sprintf('Monazilla/1.00 (%s)', $p2ua); + } + + return $p2ua; + } + // }}} + // {{{ getWebPage + + /** + * Webページを取得する + * + * 200 OK + * 206 Partial Content + * 304 Not Modified → 失敗扱い + * + * @return array|false 成功したらページ内容を返す。失敗したらfalseを返す。 + */ + static public function getWebPage($url, &$error_msg, $timeout = 15) + { + try { + $req = self::createHTTPRequest($url, HTTP_Request2::METHOD_GET); + //$req->addHeader("X-PHP-Version", phpversion()); + + $response = self::getHTTPResponse($req); + + $code = $response->getStatus(); + if ($code == 200 || $code == 206) { // || $code == 304) { + return $response->getBody(); + } + } catch (Exception $e) { + return false; + } + return false; + } + + // }}} + // {{{ fileDownload() + + /** + * ファイルをダウンロード保存する + */ + static public function fileDownload($url, $localfile, + $cache_time = 0, + $disp_error = true, + $trace_redirection = false) + { + global $_conf; + + if (file_exists($localfile)) { + // キャッシュ有効期間ならダウンロードしない + if (filemtime($localfile) > time() - $cache_time) { + return null; + } + } + + try { + // DL + $req = self::createHTTPRequest($url, HTTP_Request2::METHOD_GET); + + $req->setConfig(array('follow_redirects' => $trace_redirection)); + + if (file_exists($localfile)) { + $req->setHeader ('If-Modified-Since', http_date(filemtime($localfile)) ); + } + + $response = self::getHTTPResponse($req); + + $code = $response->getStatus(); + if (!($code == 200 || $code == 206 || $code == 304)) { + $error_msg = $code; + } + $body = $response->getBody(); + + } catch (Exception $e) { + $error_msg = $e->getMessage(); + } + + // エラーが出たらnullを返して終わり + if (isset($error_msg) && strlen($error_msg) > 0) { + // エラーメッセージを設定 + if ($disp_error) { + $url_t = self::throughIme($url); + $info_msg_ht = "

    Error: {$error_msg}
    "; + $info_msg_ht .= "rep2 info: {$url} に接続できませんでした。

    "; + self::pushInfoHtml($info_msg_ht); + } + return null; + } + + // 更新されていたら保存 + if ($code != 304) { + if (FileCtl::file_write_contents($localfile, $body) === false) { + p2die('cannot write file.'); + } + } + + return $response; + } + + // }}} + public static function getResponseCode($url) + { + try { + $req = self::createHTTPRequest ($url, HTTP_Request2::METHOD_HEAD); + $response = self::getHTTPResponse($req); + return $response->getStatus(); + + } catch (Exception $e) { + return false; // $error_msg + } + } +} \ No newline at end of file diff --git a/lib/P2CurlMulti.php b/lib/P2CurlMulti.php index 033225bb9..fb43d802c 100644 --- a/lib/P2CurlMulti.php +++ b/lib/P2CurlMulti.php @@ -68,7 +68,7 @@ private function add($subjects, $force = false) { if(P2Util::isHost2chs($host) && !P2Util::isNotUse2chAPI($host) && $_conf['2chapi_use']){ $user_agent = sprintf ($_conf['2chapi_ua.read'], $_conf['2chapi_appname']); } else { - $user_agent = P2Util::getP2UA(true, P2Util::isHost2chs($purl['host'])); + $user_agent = P2Commun::getP2UA(true, P2Util::isHost2chs($purl['host'])); } curl_setopt($this->ch[$key], CURLOPT_USERAGENT, $user_agent); diff --git a/lib/P2HttpExt.php b/lib/P2HttpExt.php index e101ecc8b..e6d6fcd2c 100644 --- a/lib/P2HttpExt.php +++ b/lib/P2HttpExt.php @@ -247,7 +247,7 @@ public function __construct($url, if (!isset($options['useragent'])) { $purl = parse_url($url); // URL分解 - $options['useragent'] = P2Util::getP2UA(true,P2Util::isHost2chs($purl['host'])); + $options['useragent'] = P2Commun::getP2UA(true,P2Util::isHost2chs($purl['host'])); unset($purl); } diff --git a/lib/P2Util.php b/lib/P2Util.php index a4a810070..5013fbc06 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -243,62 +243,6 @@ static public function unsetCookie($key, $path = '', $domain = null) return false; } - // }}} - // {{{ fileDownload() - - /** - * ファイルをダウンロード保存する - */ - static public function fileDownload($url, $localfile, - $disp_error = true, - $trace_redirection = false) - { - global $_conf; - - try { - // DL - $req = self::getHTTPRequest2($url, HTTP_Request2::METHOD_GET); - - $req->setConfig(array('follow_redirects' => $trace_redirection)); - - if (file_exists($localfile)) { - $req->setHeader ('If-Modified-Since', http_date(filemtime($localfile)) ); - } - - $response = self::getHTTPResponse($req); - - $code = $response->getStatus(); - if (!($code == 200 || $code == 206 || $code == 304)) { - $error_msg = $code; - } - $body = $response->getBody(); - - } catch (Exception $e) { - $error_msg = $e->getMessage(); - } - - // エラーが出たらnullを返して終わり - if (isset($error_msg) && strlen($error_msg) > 0) { - // エラーメッセージを設定 - if ($disp_error) { - $url_t = self::throughIme($url); - $info_msg_ht = "

    Error: {$error_msg}
    "; - $info_msg_ht .= "rep2 info: {$url} に接続できませんでした。

    "; - self::pushInfoHtml($info_msg_ht); - } - return null; - } - - // 更新されていたら保存 - if ($code != 304) { - if (FileCtl::file_write_contents($localfile, $body) === false) { - p2die('cannot write file.'); - } - } - - return $response; - } - // }}} // {{{ checkDirWritable() @@ -1728,36 +1672,6 @@ static public function mkTrip2($key) return str_replace('+', '.', substr(base64_encode(sha1($key, true)), 0, 12)); } - // }}} - // {{{ getWebPage - - /** - * Webページを取得する - * - * 200 OK - * 206 Partial Content - * 304 Not Modified → 失敗扱い - * - * @return array|false 成功したらページ内容を返す。失敗したらfalseを返す。 - */ - static public function getWebPage($url, &$error_msg, $timeout = 15) - { - try { - $req = self::getHTTPRequest2($url, HTTP_Request2::METHOD_GET); - //$req->addHeader("X-PHP-Version", phpversion()); - - $response = self::getHTTPResponse($req); - - $code = $response->getStatus(); - if ($code == 200 || $code == 206) { // || $code == 304) { - return $response->getBody(); - } - } catch (Exception $e) { - return false; - } - return false; - } - // }}} // {{{ getMyUrl() @@ -2163,35 +2077,6 @@ static public function rawurlencodeCallback(array $m) } // }}} - // {{{ getP2UA() - /** - * p2又はAPIのUAを返す - * @param bool $withMonazilla trueならMonazilla/1.00を付ける - * @param bool $apiUA trueで尚且つAPIが利用可能なときにAPIのUAを返す - * @return string - */ - static public function getP2UA($withMonazilla = true,$apiUA = false) - { - global $_conf; - - // APIを使用する設定の場合はAPIのUAを返す - if ($apiUA && $_conf['2chapi_use'] == 1) { - if ($_conf['2chapi_appname'] != "") { - $p2ua = $_conf['2chapi_appname']; - } else { - p2die("2chと通信するために必要な情報が設定されていません。"); - } - - } else { - $p2ua = $_conf['p2ua']; - } - - if ($withMonazilla) { - $p2ua = sprintf('Monazilla/1.00 (%s)', $p2ua); - } - - return $p2ua; - } // {{{ isEnableBe2ch() /** * beが使用可能な設定か調べる @@ -2258,15 +2143,15 @@ static public function getBe2chCodeByMailPass($mail, $pass) } try { - $req = self::getHTTPRequest2 ('http://be.2ch.net/index.php', HTTP_Request2::METHOD_POST); + $req = P2Commun::createHTTPRequest ('http://be.2ch.net/index.php', HTTP_Request2::METHOD_POST); - $req->setHeader('User-Agent', self::getP2UA(true,true)); + $req->setHeader('User-Agent', P2Commun::getP2UA(true,true)); $req->addPostParameter('mail', $mail); $req->addPostParameter('pass', $pass); $req->addPostParameter('login', 'ログインする'); - $response = self::getHTTPResponse($req); + $response = P2Commun::getHTTPResponse($req); $code = $response->getStatus(); // 成功とみなすコード @@ -2293,91 +2178,7 @@ static public function getBe2chCodeByMailPass($mail, $pass) } // }}} - // {{{ getHTTPRequest2() - - /** - * HTTP_Request2クラスのインスタンスを生成する - * - * @param string $url 文字列のURL(絶対に必須) - * @param $method HTTP_Request2と同じ - * @return HTTP_Request2 - */ - static public function getHTTPRequest2($url , $method = HTTP_Request2::METHOD_GET) - { - global $_conf; - - $purl = parse_url ($url); - if(empty($url) || $purl === false) - { - throw new InvalidArgumentException ("URLの指定が変です。"); - } - - $req = new HTTP_Request2($url, $method); - - // よく使うヘッダを指定 - // p2のHTTP通信は特に指定の無い限りMonazillaを名乗るようにする - $req->setHeader ('User-Agent', self::getP2UA(true,self::isHost2chs($purl['host']))); - $req->setHeader ('Acecpt-Language', 'ja,en-us;q=0.7,en;q=0.3'); - $req->setHeader ('Accept', '*/*'); - $req->setHeader ('Accept-Encoding', 'gzip, deflate'); - - // タイムアウトの設定 - $req->setConfig (array ( - 'connect_timeout' => $_conf['http_conn_timeout'], - 'timeout' => $_conf['http_read_timeout'], - )); - - // SSLの設定 - if($purl['scheme'] == 'https') { - $req->setAdapter($_conf['ssl_function']); - - if($_conf['ssl_capath']) - { - $req->setConfig ('ssl_capath', $_conf['ssl_capath']); - } - } - - // プロキシ - if ($_conf['tor_use'] && self::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット - $req->setConfig (array ( - 'proxy_host' => $_conf['tor_proxy_host'], - 'proxy_port' => $_conf['tor_proxy_port'], - 'proxy_user' => $_conf['tor_proxy_user'], - 'proxy_password' => $_conf['tor_proxy_password'] - )); - if($_conf['tor_proxy_mode'] == 'socks5'){ - $req->setConfig('proxy_type', $_conf['tor_proxy_mode']); - } - } elseif ($_conf['proxy_use']) { - $req->setConfig (array ( - 'proxy_host' => $_conf['proxy_host'], - 'proxy_port' => $_conf['proxy_port'], - 'proxy_user' => $_conf['proxy_user'], - 'proxy_password' => $_conf['proxy_password'] - )); - if($_conf['proxy_mode'] == 'socks5'){ - $req->setConfig('proxy_type', $_conf['proxy_mode']); - } - } - - unset ($purl); - - return $req; - } - - static public function getHTTPResponse($req) { - if($req->getConfig('proxy_type') == 'socks5') { - $socks = new HTTP_Request2_Adapter_Socket(); - $res = $socks->sendRequest($req); - unset($socks); - } else { - $res = $req->send (); - } - return $res; - } - - // }}} // {{{ debug() /* static public function debug() diff --git a/lib/SettingTxt.php b/lib/SettingTxt.php index 23279f6fa..6fdf41db9 100644 --- a/lib/SettingTxt.php +++ b/lib/SettingTxt.php @@ -101,10 +101,10 @@ public function downloadSettingTxt() // DL try { - $req = P2Util::getHTTPRequest2($this->_url, HTTP_Request2::METHOD_GET); + $req = P2Commun::createHTTPRequest($this->_url, HTTP_Request2::METHOD_GET); $modified && $req->setHeader("If-Modified-Since", $modified); - $response = P2Util::getHTTPResponse($req); + $response = P2Commun::getHTTPResponse($req); $code = $response->getStatus(); if ($code == 302) { diff --git a/lib/SubjectTxt.php b/lib/SubjectTxt.php index 4a9e6b15a..3f507f33a 100644 --- a/lib/SubjectTxt.php +++ b/lib/SubjectTxt.php @@ -96,10 +96,10 @@ public function downloadSubject() // DL try { - $req = P2Util::getHTTPRequest2($this->subject_url, HTTP_Request2::METHOD_GET); + $req = P2Commun::createHTTPRequest($this->subject_url, HTTP_Request2::METHOD_GET); $modified && $req->setHeader("If-Modified-Since", $modified); - $response = P2Util::getHTTPResponse($req); + $response = P2Commun::getHTTPResponse($req); $code = $response->getStatus(); if ($code == 302) { diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 1a3772deb..f4ff55477 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -151,7 +151,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { $purl = parse_url ($url); // URL分解 try { - $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_POST); + $req = P2Commun::createHTTPRequest ($url, HTTP_Request2::METHOD_POST); // ヘッダ $req->setHeader ('User-Agent', $ReadUA); @@ -180,7 +180,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { )); // POSTデータの送信 - $response = P2Util::getHTTPResponse($req); + $response = P2Commun::getHTTPResponse($req); // 2ch API の状態がヘッダーに記載されているので取得する。 // User-Status: 0 (sessionID無効) or 1 (sessionID有効) or @@ -369,7 +369,7 @@ protected function _downloadDat2ch($from_bytes) { // $request .= "Accept-Encoding: gzip, deflate\r\n"; try { - $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_GET); + $req = P2Commun::createHTTPRequest ($url, HTTP_Request2::METHOD_GET); // ヘッダ $req->setHeader ('Referer', "http://{$purl['host']}/{$this->bbs}/"); @@ -390,7 +390,7 @@ protected function _downloadDat2ch($from_bytes) { } // Requestの送信 - $response = P2Util::getHTTPResponse($req); + $response = P2Commun::getHTTPResponse($req); $code = $response->getStatus (); @@ -524,10 +524,10 @@ protected function _downloadDat2chKako($uri, $ext) { $purl = parse_url ($url); // URL分解 try { - $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_GET); + $req = P2Commun::createHTTPRequest ($url, HTTP_Request2::METHOD_GET); // Requestの送信 - $response = P2Util::getHTTPResponse($req); + $response = P2Commun::getHTTPResponse($req); $code = $response->getStatus (); @@ -619,12 +619,12 @@ public function get2chDatError($code = null) { $read_response_html = ''; if (! $reason) { try { - $req = P2Util::getHTTPRequest2 ($read_url.'1', HTTP_Request2::METHOD_GET); + $req = P2Commun::createHTTPRequest ($read_url.'1', HTTP_Request2::METHOD_GET); // ヘッダ - $req->setHeader ('User-Agent', P2Util::getP2UA(false,P2Util::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG + $req->setHeader ('User-Agent', P2Commun::getP2UA(false,P2Util::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG // Requestの送信 - $response = P2Util::getHTTPResponse($req); + $response = P2Commun::getHTTPResponse($req); $res_code = $response->getStatus (); @@ -1216,9 +1216,9 @@ private function _get2ch203Body() { */ try { $url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; - $req = P2Util::getHTTPRequest2 ($url,HTTP_Request2::METHOD_GET); + $req = P2Commun::createHTTPRequest ($url,HTTP_Request2::METHOD_GET); - $res = P2Util::getHTTPResponse($req); + $res = P2Commun::getHTTPResponse($req); // レスポンスコードを検証 if ('203' == $res->getStatus ()) { @@ -1304,7 +1304,7 @@ protected function _generateWikiDatLink($read_url) { foreach ($datPlugin->getData () as $v) { if (preg_match ('{' . $v['match'] . '}', $read_url)) { $replace = @preg_replace ('{' . $v['match'] . '}', $v['replace'], $read_url); - $code = P2UtilWiki::getResponseCode ($replace); + $code = P2Commun::getResponseCode ($replace); if ($code == 200) { $code = '○' . $code; } else { diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index 551258e2d..609efa99b 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -42,7 +42,7 @@ function authenticate_2chapi() } try { - $req = P2Util::getHTTPRequest2($url,HTTP_Request2::METHOD_POST); + $req = P2Commun::createHTTPRequest($url,HTTP_Request2::METHOD_POST); $req->setHeader('User-Agent', $AuthUA); $req->setHeader('X-2ch-UA', $AppName); @@ -54,7 +54,7 @@ function authenticate_2chapi() $req->addPostParameter('HB', $HB); // POSTデータの送信 - $res = P2Util::getHTTPResponse($req); + $res = P2Commun::getHTTPResponse($req); $code = $res->getStatus(); if ($code =! 200) { diff --git a/lib/expack/rss/parser.inc.php b/lib/expack/rss/parser.inc.php index ab8b88557..af84ab00a 100644 --- a/lib/expack/rss/parser.inc.php +++ b/lib/expack/rss/parser.inc.php @@ -50,11 +50,8 @@ function p2GetRSS($remotefile, $atom = 0) } // If-Modified-Sinceつきでダウンロード(ファイルが無いか、古いか、強制リロードのとき) - if (!file_exists($localpath) || $refresh || - filemtime($localpath) < (time() - $_conf['expack.rss.check_interval'] * 60) - ) { - $dl = P2Util::fileDownload($remotefile, $localpath, true, true); - } + $cache_time = ($refresh) ? 0 : $_conf['expack.rss.check_interval'] * 60); + $dl = P2Commun::fileDownload($remotefile, $localpath,$cache_time, true, true); // キャッシュが更新されなかったか、ダウンロード成功ならRSSをパース if (file_exists($localpath) && (!isset($dl))) { diff --git a/lib/login2ch.inc.php b/lib/login2ch.inc.php index 3ab4083f6..2b3e99c72 100644 --- a/lib/login2ch.inc.php +++ b/lib/login2ch.inc.php @@ -39,11 +39,11 @@ function login2ch() return false; } } else { - $x_2ch_ua = 'X-2ch-UA: ' . P2Util::getP2UA(false,false); + $x_2ch_ua = 'X-2ch-UA: ' . P2Commun::getP2UA(false,false); } try { - $req = P2Util::getHTTPRequest2($auth2ch_url,HTTP_Request2::METHOD_POST); + $req = P2Commun::createHTTPRequest($auth2ch_url,HTTP_Request2::METHOD_POST); // ヘッダー $req->setHeader('User-Agent', $dolib2ch); @@ -54,7 +54,7 @@ function login2ch() $req->addPostParameter('PW', $login2chPW); // POSTデータの送信 - $res = P2Util::getHTTPResponse($req); + $res = P2Commun::getHTTPResponse($req); $code = $res->getStatus(); if ($code =! 200) { diff --git a/lib/plugins/hissi/Hissi.php b/lib/plugins/hissi/Hissi.php index efb1ac6e8..4f5ec41df 100644 --- a/lib/plugins/hissi/Hissi.php +++ b/lib/plugins/hissi/Hissi.php @@ -65,7 +65,7 @@ public function load() $path = P2Util::cacheFileForDL($this->menuUrl); // メニューのキャッシュ時間の10倍キャッシュ - P2UtilWiki::cacheDownload($this->menuUrl, $path, $_conf['menu_dl_interval'] * 36000); + P2Commun::fileDownload($this->menuUrl, $path, $_conf['menu_dl_interval'] * 36000); $this->boards = array(); $file = @file_get_contents($path); diff --git a/lib/plugins/mimizun/Mimizun.php b/lib/plugins/mimizun/Mimizun.php index e36b3f223..91702a696 100644 --- a/lib/plugins/mimizun/Mimizun.php +++ b/lib/plugins/mimizun/Mimizun.php @@ -51,7 +51,7 @@ public function load($type) // キャッシュ用ディレクトリが無ければ作成 FileCtl::mkdir_for($path); // メニューのキャッシュ時間の10倍キャッシュ - P2UtilWiki::cacheDownload($url, $path, $_conf['menu_dl_interval'] * 36000); + P2Commun::fileDownload($url, $path, $_conf['menu_dl_interval'] * 36000); $file = @file_get_contents($path); preg_match_all($match, $file, $boards); return $boards[1]; diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index d56ba9ca8..5b82830b6 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -350,7 +350,7 @@ function setHiddenValue(button) { $upload_multiple = 'multiple'; $upload_name = 'upload[]'; } - $upload_token = sha1(P2Util::getP2UA(false,false) . microtime()); + $upload_token = sha1(P2Commun::getP2UA(false,false) . microtime()); $_SESSION['upload_token'] = $upload_token; $upload_form = << diff --git a/lib/read_shitaraba.inc.php b/lib/read_shitaraba.inc.php index b6e7d4615..69968b9a1 100644 --- a/lib/read_shitaraba.inc.php +++ b/lib/read_shitaraba.inc.php @@ -46,7 +46,7 @@ function shitarabaDownload(ThreadRead $aThread) $tempfile = $aThread->keydat.'.dat.temp'; FileCtl::mkdirFor($tempfile); - $machiurl_res = P2Util::fileDownload($machiurl, $tempfile); + $machiurl_res = P2Commun::fileDownload($machiurl, $tempfile); if (empty($machiurl_res)) { $aThread->diedat = true; diff --git a/lib/wiki/P2UtilWiki.php b/lib/wiki/P2UtilWiki.php index 58f4e42c9..dac94d988 100644 --- a/lib/wiki/P2UtilWiki.php +++ b/lib/wiki/P2UtilWiki.php @@ -20,15 +20,6 @@ public static function calcBeId($prof_id) return 0; } - /** - * Wiki:そのURLにアクセスできるか確認する - */ - public static function isURLAccessible($url, $timeout = 7) - { - $code = self::getResponseCode($url); - return ($code == 200 || $code == 206) ? true : false; - } - /** * URLがイメピタならtrueを返す */ @@ -36,33 +27,4 @@ public static function isUrlImepita($url) { return preg_match('{^http://imepita\.jp/}', $url); } - - public static function getResponseCode($url) - { - try { - $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_HEAD); - $response = P2Util::getHTTPResponse($req); - return $response->getStatus(); - - } catch (Exception $e) { - return false; // $error_msg - } - } - - /** - * Wiki:Last-Modifiedをチェックしてキャッシュする - * time:チェックしない期間(unixtime) - */ - public static function cacheDownload($url, $path, $time = 0) - { - $filetime = @filemtime($path); - - // キャッシュ有効期間ならダウンロードしない - if ($filetime !== false && $filetime > time() - $time) { - return; - } - - // 新しければ取得 - P2Util::fileDownload($url, $path); - } } diff --git a/lib/wiki/ReplaceImageUrlCtl.php b/lib/wiki/ReplaceImageUrlCtl.php index eeee1d824..01c2321a5 100644 --- a/lib/wiki/ReplaceImageUrlCtl.php +++ b/lib/wiki/ReplaceImageUrlCtl.php @@ -255,7 +255,7 @@ public function extractPage($url, $match, $replace, $referer, $source, $ident=nu } try { - $req = P2Util::getHTTPRequest2 ($get_url, HTTP_Request2::METHOD_GET); + $req = P2Commun::createHTTPRequest ($get_url, HTTP_Request2::METHOD_GET); if ($this->cacheData[$url] && $this->cacheData[$url]['responseHeaders'] && $this->cacheData[$url]['responseHeaders']['last-modified'] && strlen($this->cacheData[$url]['responseHeaders']['last-modified'])) { @@ -267,7 +267,7 @@ public function extractPage($url, $match, $replace, $referer, $source, $ident=nu (!empty($_conf['expack.user_agent'])) ? $_conf['expack.user_agent'] : $_SERVER['HTTP_USER_AGENT']); - $response = P2Util::getHTTPResponse($req); + $response = P2Commun::getHTTPResponse($req); $code = $response->getStatus (); diff --git a/lib/wiki/Samba.php b/lib/wiki/Samba.php index 398c3da6d..f4080167f 100644 --- a/lib/wiki/Samba.php +++ b/lib/wiki/Samba.php @@ -74,7 +74,7 @@ public function getSambaTime($host, $bbs) } // sambaを取得 $url = "http://{$host}/{$bbs}/index.html"; - $src = P2Util::getWebPage($url, $errmsg); + $src = P2Commun::getWebPage($url, $errmsg); $match = '{2ちゃんねる BBS\.CGI - .*?\+Samba24=(\d+)}'; preg_match($match, $src, $samba); if(!$this->isLoaded) $this->load(); diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php index 80050010a..4e6b66e5b 100644 --- a/rep2/dig2ch.php +++ b/rep2/dig2ch.php @@ -12,13 +12,13 @@ function dig2chsearch($query) $url = $_conf['test.dig2ch_url'] . '?AndOr=' . $query_arry['AndOr'] . '&maxResult=' . $query_arry['maxResult'] . '&atLeast=1&Sort=' . $query_arry['Sort'] . '&Link=1&Bbs=all&924=' . $query_arry['924'] . '&json=1&keywords=' . $query_arry['q']; try { - $req = P2Util::getHTTPRequest2 ($url, HTTP_Request2::METHOD_GET); + $req = P2Commun::createHTTPRequest ($url, HTTP_Request2::METHOD_GET); // $req->setHeader('User-Agent', $_SERVER['HTTP_USER_AGENT']); やっぱMonazilla名乗っといた方が良さそうか $req->setHeader('Accept-Charset', 'utf-8'); $req->setHeader('Cache-Control', 'no-cache'); $req->setHeader('Accept', 'application/json'); - $response = P2Util::getHTTPResponse($req); + $response = P2Commun::getHTTPResponse($req); $code = $response->getStatus(); if ($code != 200) { diff --git a/rep2/ic2.php b/rep2/ic2.php index caf3f0877..81cb93f7e 100644 --- a/rep2/ic2.php +++ b/rep2/ic2.php @@ -305,7 +305,7 @@ public function __destruct() // キャッシュされていなければ、取得を試みる try { - $req = P2Util::getHTTPRequest2($uri, HTTP_Request2::METHOD_GET); + $req = P2Commun::createHTTPRequest($uri, HTTP_Request2::METHOD_GET); $req->setConfig(array('follow_redirects' => true)); $req->setHeader('User-Agent', $ic2_ua); if ($mtime > 0) { @@ -358,7 +358,7 @@ public function __destruct() ) { $retryCount = 0; do { - $response = P2Util::getHTTPResponse($req); + $response = P2Commun::getHTTPResponse($req); $code = $response->getStatus(); if ($code != 403) { break; @@ -367,7 +367,7 @@ public function __destruct() sleep($ini['Getter']['retry_interval']); } while ($retryCount < intval($ini['Getter']['retry_max'])); } else { - $response = P2Util::getHTTPResponse($req); + $response = P2Commun::getHTTPResponse($req); $code = $response->getStatus(); } diff --git a/rep2/post.php b/rep2/post.php index 93a92b369..295d92cd1 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -385,7 +385,7 @@ function postIt($host, $bbs, $key, $post) } try { - $req = P2Util::getHTTPRequest2 ($bbs_cgi_url,HTTP_Request2::METHOD_POST); + $req = P2Commun::createHTTPRequest ($bbs_cgi_url,HTTP_Request2::METHOD_POST); // ヘッダ $req->setHeader('Referer', "http://{$host}/{$bbs}/{$key}/"); @@ -424,7 +424,7 @@ function postIt($host, $bbs, $key, $post) } // POSTデータの送信 - $response = P2Util::getHTTPResponse($req); + $response = P2Commun::getHTTPResponse($req); // Cookieを取得 $cookies = $response->getCookies(); diff --git a/rep2/title.php b/rep2/title.php index fdff4a7ed..142162d06 100644 --- a/rep2/title.php +++ b/rep2/title.php @@ -210,22 +210,11 @@ function checkUpdatan() { global $_conf, $p2web_url_r, $expack_url_r, $expack_dl_url_r, $expack_hist_url_r; - $no_p2status_dl_flag = false; - $ver_txt_url = $_conf['expack.web_url'] . 'version.txt'; $cachefile = P2Util::cacheFileForDL($ver_txt_url); FileCtl::mkdirFor($cachefile); - if (file_exists($cachefile)) { - // キャッシュの更新が指定時間以内なら - if (filemtime($cachefile) > time() - $_conf['p2status_dl_interval'] * 86400) { - $no_p2status_dl_flag = true; - } - } - - if (empty($no_p2status_dl_flag)) { - P2Util::fileDownload($ver_txt_url, $cachefile); - } + P2Commun::fileDownload($ver_txt_url, $cachefile, $_conf['p2status_dl_interval'] * 86400); $ver_txt = FileCtl::file_read_lines($cachefile, FILE_IGNORE_NEW_LINES); $update_ver = $ver_txt[0]; From 4203b89592ec6b5d9b9794881510d48e66912faa Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 7 Apr 2017 14:26:53 +0900 Subject: [PATCH 217/339] =?UTF-8?q?=E3=83=96=E3=83=A9=E3=82=A6=E3=82=B6?= =?UTF-8?q?=E5=88=A4=E5=AE=9A=E3=82=92lib/UA.php=E3=81=AB=E7=B5=B1?= =?UTF-8?q?=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 55 ----------------------------------- lib/UA.php | 11 +++++++ lib/bootstrap.php | 2 +- lib/post_form_options.inc.php | 2 +- rep2/menu_async.php | 2 +- rep2/read_async.php | 2 +- rep2/skin/blackboard.php | 2 +- rep2/skin/classicWP.php | 2 +- rep2/skin/flat.php | 2 +- rep2/skin/flat2.php | 2 +- rep2/skin/live.php | 2 +- rep2/skin/live2.php | 2 +- rep2/skin/live_box.php | 2 +- rep2/skin/live_box2.php | 2 +- rep2/skin/metal.php | 2 +- rep2/skin/tangerine.php | 2 +- rep2/tgrepctl.php | 2 +- 17 files changed, 26 insertions(+), 70 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index 5013fbc06..a87c84cf4 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1224,61 +1224,6 @@ static public function recAccessLog($logfile, $maxline = 100, $format = 'dataphp return true; } - // }}} - // {{{ isBrowserSafariGroup() - - /** - * ブラウザがSafari系ならtrueを返す - */ - static public function isBrowserSafariGroup() - { - return UA::isSafariGroup(); - } - - // }}} - // {{{ isClientOSWindowsCE() - - /** - * ブラウザがWindows CEで動作するものならtrueを返す - */ - static public function isClientOSWindowsCE() - { - return (strpos($_SERVER['HTTP_USER_AGENT'], 'Windows CE') !== false); - } - - // }}} - // {{{ isBrowserNintendoDS() - - /** - * ニンテンドーDSブラウザーならtrueを返す - */ - static public function isBrowserNintendoDS() - { - return UA::isNintendoDS(); - } - - // }}} - // {{{ isBrowserPSP() - - /** - * ブラウザがPSPならtrueを返す - */ - static public function isBrowserPSP() - { - return UA::isPSP(); - } - - // }}} - // {{{ isBrowserIphone() - - /** - * ブラウザがiPhone, iPod Touch or Androidならtrueを返す - */ - static public function isBrowserIphone() - { - return UA::isIPhoneGroup(); - } - // }}} // {{{ isUrlWikipediaJa() diff --git a/lib/UA.php b/lib/UA.php index eeda61522..37d9f4723 100644 --- a/lib/UA.php +++ b/lib/UA.php @@ -528,6 +528,17 @@ static public function isIModeBrowser2($ua = null) return false; } + // }}} + // {{{ isClientOSWindowsCE() + + /** + * ブラウザがWindows CEで動作するものならtrueを返す + */ + static public function isClientOSWindowsCE() + { + return (strpos($_SERVER['HTTP_USER_AGENT'], 'Windows CE') !== false); + } + // }}} } diff --git a/lib/bootstrap.php b/lib/bootstrap.php index 24e3b80f4..5f54e3266 100644 --- a/lib/bootstrap.php +++ b/lib/bootstrap.php @@ -173,7 +173,7 @@ $_conf['accept_charset'] = 'UTF-8'; // Windows Mobile - } elseif (P2Util::isClientOSWindowsCE()) { + } elseif (UA::isClientOSWindowsCE()) { $_conf['ktai'] = true; // 携帯ゲーム機 diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index 5b82830b6..3ceda6076 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -219,7 +219,7 @@ function setHiddenValue(button) { } $_dpreview_hide = 'false'; if ($_conf['expack.editor.dpreview'] == 2) { - if (P2Util::isBrowserSafariGroup() && basename($_SERVER['SCRIPT_NAME']) != 'post_form.php') { + if (UA::isSafariGroup() && basename($_SERVER['SCRIPT_NAME']) != 'post_form.php') { $_dpreview_hide = 'true'; } $_dpreview_pos = 'dpreview2'; diff --git a/rep2/menu_async.php b/rep2/menu_async.php index 71fee6806..038ed9197 100644 --- a/rep2/menu_async.php +++ b/rep2/menu_async.php @@ -49,7 +49,7 @@ // }}} // {{{ 本体出力 -if (P2Util::isBrowserSafariGroup()) { +if (UA::isSafariGroup()) { $menuItem = P2Util::encodeResponseTextForSafari($menuItem); } echo $menuItem; diff --git a/rep2/read_async.php b/rep2/read_async.php index 7f633a2a2..fb936c373 100644 --- a/rep2/read_async.php +++ b/rep2/read_async.php @@ -133,7 +133,7 @@ // }}} // {{{ 本体出力 -if (P2Util::isBrowserSafariGroup()) { +if (UA::isSafariGroup()) { $node = P2Util::encodeResponseTextForSafari($node); } echo $node; diff --git a/rep2/skin/blackboard.php b/rep2/skin/blackboard.php index 3c0d67d38..c42e1b69f 100644 --- a/rep2/skin/blackboard.php +++ b/rep2/skin/blackboard.php @@ -14,7 +14,7 @@ if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mac') !== false) { /* Mac用フォントファミリー*/ - if (P2Util::isBrowserSafariGroup()){ /* Safari系なら */ + if (UA::isSafariGroup()){ /* Safari系なら */ $STYLE['fontfamily'] = array("Comic Sans MS", "Hiragino Maru Gothic Pro"); // ("Hiragino Kaku Gothic Pro") 基本のフォント for Safari $STYLE['fontfamily_bold'] = array("Arial Black", "Hiragino Kaku Gothic Std"); // ("") 基本ボールド用フォント for Safari(普通の太字より太くしたい場合は"Hiragino Kaku Gothic Std") } else { diff --git a/rep2/skin/classicWP.php b/rep2/skin/classicWP.php index 80f7df3a0..b8bdbb0c2 100644 --- a/rep2/skin/classicWP.php +++ b/rep2/skin/classicWP.php @@ -14,7 +14,7 @@ if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mac') !== false) { /* Mac用フォントファミリー*/ - if (P2Util::isBrowserSafariGroup()){ /* Safari系なら */ + if (UA::isSafariGroup()){ /* Safari系なら */ $STYLE['fontfamily'] = array("Lucida Grande", "Hiragino Kaku Gothic Pro"); // ("Hiragino Kaku Gothic Pro") 基本のフォント for Safari $STYLE['fontfamily_bold'] = ""; // ("") 基本ボールド用フォント for Safari(普通の太字より太くしたい場合は"Hiragino Kaku Gothic Std") } else { diff --git a/rep2/skin/flat.php b/rep2/skin/flat.php index 16b8e3fe1..b65b85663 100644 --- a/rep2/skin/flat.php +++ b/rep2/skin/flat.php @@ -14,7 +14,7 @@ if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mac') !== false) { /* Mac用フォントファミリー*/ - if (P2Util::isBrowserSafariGroup()){ /* Safari系なら */ + if (UA::isSafariGroup()){ /* Safari系なら */ $STYLE['fontfamily'] = array("Myriad Pro", "Lucida Grande", "Hiragino Maru Gothic Pro"); $STYLE['fontfamily_bold'] = array("Myriad Pro", "Lucida Grande", "Hiragino Kaku Gothic Pro"); $STYLE['fontweight_bold'] = "bold"; diff --git a/rep2/skin/flat2.php b/rep2/skin/flat2.php index 484abc114..3fc3bbd26 100644 --- a/rep2/skin/flat2.php +++ b/rep2/skin/flat2.php @@ -14,7 +14,7 @@ if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mac') !== false) { /* Mac用フォントファミリー*/ - if (P2Util::isBrowserSafariGroup()){ /* Safari系なら */ + if (UA::isSafariGroup()){ /* Safari系なら */ $STYLE['fontfamily'] = array("Myriad Pro", "Lucida Grande", "Hiragino Maru Gothic Pro"); $STYLE['fontfamily_bold'] = array("Myriad Pro", "Lucida Grande", "Hiragino Kaku Gothic Pro"); $STYLE['fontweight_bold'] = "bold"; diff --git a/rep2/skin/live.php b/rep2/skin/live.php index 9ac19e72d..43ccf8da0 100755 --- a/rep2/skin/live.php +++ b/rep2/skin/live.php @@ -12,7 +12,7 @@ if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mac') !== false) { /* Mac用フォントファミリー*/ - if (P2Util::isBrowserSafariGroup()){ /* Safari系なら */ + if (UA::isSafariGroup()){ /* Safari系なら */ $STYLE['fontfamily'] = array("Hiragino Maru Gothic ProN", "Arial"); $STYLE['fontfamily_bold'] = array("Hiragino Kaku Gothic StdN", "Arial Black"); // $STYLE['fontweight_bold'] = "bold"; diff --git a/rep2/skin/live2.php b/rep2/skin/live2.php index 658852d90..3592c6aec 100755 --- a/rep2/skin/live2.php +++ b/rep2/skin/live2.php @@ -12,7 +12,7 @@ if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mac') !== false) { /* Mac用フォントファミリー*/ - if (P2Util::isBrowserSafariGroup()){ /* Safari系なら */ + if (UA::isSafariGroup()){ /* Safari系なら */ $STYLE['fontfamily'] = array("Hiragino Maru Gothic ProN", "Arial"); $STYLE['fontfamily_bold'] = array("Hiragino Kaku Gothic StdN", "Arial Black"); // $STYLE['fontweight_bold'] = "bold"; diff --git a/rep2/skin/live_box.php b/rep2/skin/live_box.php index 449dc8e18..e02729ac2 100755 --- a/rep2/skin/live_box.php +++ b/rep2/skin/live_box.php @@ -12,7 +12,7 @@ if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mac') !== false) { /* Mac用フォントファミリー*/ - if (P2Util::isBrowserSafariGroup()){ /* Safari系なら */ + if (UA::isSafariGroup()){ /* Safari系なら */ $STYLE['fontfamily'] = array("Hiragino Maru Gothic ProN", "Arial"); $STYLE['fontfamily_bold'] = array("Hiragino Kaku Gothic StdN", "Arial Black"); // $STYLE['fontweight_bold'] = "bold"; diff --git a/rep2/skin/live_box2.php b/rep2/skin/live_box2.php index dcaa39d9e..0647587fe 100755 --- a/rep2/skin/live_box2.php +++ b/rep2/skin/live_box2.php @@ -12,7 +12,7 @@ if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mac') !== false) { /* Mac用フォントファミリー*/ - if (P2Util::isBrowserSafariGroup()){ /* Safari系なら */ + if (UA::isSafariGroup()){ /* Safari系なら */ $STYLE['fontfamily'] = array("Hiragino Maru Gothic ProN", "Arial"); $STYLE['fontfamily_bold'] = array("Hiragino Kaku Gothic StdN", "Arial Black"); // $STYLE['fontweight_bold'] = "bold"; diff --git a/rep2/skin/metal.php b/rep2/skin/metal.php index d87eb9923..30fcfde9f 100644 --- a/rep2/skin/metal.php +++ b/rep2/skin/metal.php @@ -14,7 +14,7 @@ if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mac') !== false) { /* Mac用フォントファミリー*/ - if (P2Util::isBrowserSafariGroup()){ /* Safari系なら */ + if (UA::isSafariGroup()){ /* Safari系なら */ $STYLE['fontfamily'] = array("Helvetica Neue", "Helvetica", "Hiragino Kaku Gothic Pro"); // ("Hiragino Kaku Gothic Pro") 基本のフォント for Safari $STYLE['fontfamily_bold'] = array("Arial Black", "Hiragino Kaku Gothic Std"); // ("") 基本ボールド用フォント for Safari(普通の太字より太くしたい場合は"Hiragino Kaku Gothic Std") } else { diff --git a/rep2/skin/tangerine.php b/rep2/skin/tangerine.php index 34ed154da..2ad032c82 100644 --- a/rep2/skin/tangerine.php +++ b/rep2/skin/tangerine.php @@ -14,7 +14,7 @@ if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mac') !== false) { /* Mac用フォントファミリー*/ - if (P2Util::isBrowserSafariGroup()){ /* Safari系なら */ + if (UA::isSafariGroup()){ /* Safari系なら */ $STYLE['fontfamily'] = array("Lucida Grande", "Hiragino Kaku Gothic Pro"); // ("Hiragino Kaku Gothic Pro") 基本のフォント for Safari $STYLE['fontfamily_bold'] = ""; // ("") 基本ボールド用フォント for Safari(普通の太字より太くしたい場合は"Hiragino Kaku Gothic Std") } else { diff --git a/rep2/tgrepctl.php b/rep2/tgrepctl.php index dd81c8e7d..f48d59989 100644 --- a/rep2/tgrepctl.php +++ b/rep2/tgrepctl.php @@ -99,7 +99,7 @@ ob_start(); include $include_file; $buf = ob_get_clean(); - if (P2Util::isBrowserSafariGroup()) { + if (UA::isSafariGroup()) { $buf = P2Util::encodeResponseTextForSafari($buf); } echo $buf; From 30f15fc6bce0330c5ad874b788078df2f6370e47 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 7 Apr 2017 14:55:26 +0900 Subject: [PATCH 218/339] =?UTF-8?q?NetFront=E5=88=A4=E5=AE=9A=E3=82=92UA.p?= =?UTF-8?q?hp=E3=81=AB=E7=B5=B1=E4=B8=80=20=E4=BD=BF=E7=94=A8=E3=81=95?= =?UTF-8?q?=E3=82=8C=E3=81=A6=E3=81=84=E3=81=AA=E3=81=84=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 49 ----------------------------------- lib/post_form_options.inc.php | 13 ++-------- rep2/editfavita.php | 6 ++--- rep2/editrss.php | 6 ++--- 4 files changed, 8 insertions(+), 66 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index a87c84cf4..59527f305 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1074,38 +1074,6 @@ static public function transResHistLogPhpToDat() return true; } - // }}} - // {{{ transResHistLogDatToPhp() - - /** - * dat形式(<>)の書き込み履歴をデータPHP形式(TAB)に変換する - */ - static public function transResHistLogDatToPhp() - { - global $_conf; - - // 書き込み履歴を記録しない設定の場合は何もしない - if ($_conf['res_write_rec'] == 0) { - return true; - } - - // p2_res_hist.dat.php がなくて、p2_res_hist.dat が読み込み可能であったら - if ((!file_exists($_conf['res_hist_dat_php'])) and is_readable($_conf['res_hist_dat'])) { - // 読み込んで - if ($cont = FileCtl::file_read_contents($_conf['res_hist_dat'])) { - // <>区切りからタブ区切りに変更する - // まずタブを全て外して - $cont = str_replace("\t", "", $cont); - // <>をタブに変換して - $cont = str_replace("<>", "\t", $cont); - - // データPHP形式で保存 - DataPhp::writeDataPhp($_conf['res_hist_dat_php'], $cont); - } - } - return true; - } - // }}} // {{{ getLastAccessLog() @@ -1733,23 +1701,6 @@ static public function hasInfoHtml() } } - // }}} - // {{{ isNetFront() - - /** - * isNetFront? - * - * @return boolean - */ - static public function isNetFront() - { - if (preg_match('/(NetFront|AVEFront\/|AVE-Front\/)/', $_SERVER['HTTP_USER_AGENT'])) { - return true; - } else { - return false; - } - } - // }}} // {{{ encodeResponseTextForSafari() diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index 3ceda6076..d9f0481f3 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -34,19 +34,10 @@ // -function isNetFront() { - var ua = navigator.userAgent; - if (ua.indexOf("NetFront") != -1 || ua.indexOf("AVEFront/") != -1 || ua.indexOf("AVE-Front/") != -1) { - return true; - } else { - return false; - } -} - function disableSubmit(form) { // 2006/02/15 NetFrontとは相性が悪く固まるらしいので抜ける - if (isNetFront()) { + if (UA::isNetFront()) { return; } @@ -61,7 +52,7 @@ function disableSubmit(form) { function setHiddenValue(button) { // 2006/02/15 NetFrontとは相性が悪く固まるらしいので抜ける - if (isNetFront()) { + if (UA::isNetFront()) { return; } diff --git a/rep2/editfavita.php b/rep2/editfavita.php index d1e6d5b0b..a774b566a 100644 --- a/rep2/editfavita.php +++ b/rep2/editfavita.php @@ -223,7 +223,7 @@ function submitApply() echo '
    '; // PC(NetFrontを除外) -if (!$_conf['ktai'] && $_conf['favita_order_dnd'] && !P2Util::isNetFront()) { +if (!$_conf['ktai'] && $_conf['favita_order_dnd'] && !UA::isNetFront()) { if ($lines) { $script_enable_html .= <<'; } echo 'お気に板の並び替え'; @@ -306,7 +306,7 @@ function submitApply() echo ""; // PC(NetFrontを除外) - if (!$_conf['ktai'] && $_conf['favita_order_dnd'] && !P2Util::isNetFront()) { + if (!$_conf['ktai'] && $_conf['favita_order_dnd'] && !UA::isNetFront()) { echo ''; } } diff --git a/rep2/editrss.php b/rep2/editrss.php index 188ff5d63..a74422213 100644 --- a/rep2/editrss.php +++ b/rep2/editrss.php @@ -231,7 +231,7 @@ function submitApply() echo "
    \n"; // PC(NetFrontを除外) -if (!$_conf['ktai'] && $_conf['favita_order_dnd'] && !P2Util::isNetFront()) { +if (!$_conf['ktai'] && $_conf['favita_order_dnd'] && !UA::isNetFront()) { if ($lines) { $script_enable_html .= <<'; } echo 'RSSの並び替え'; @@ -326,7 +326,7 @@ function submitApply() } echo "\n"; // PC(NetFrontを除外) - if (!$_conf['ktai'] && $_conf['favita_order_dnd'] && !P2Util::isNetFront()) { + if (!$_conf['ktai'] && $_conf['favita_order_dnd'] && !UA::isNetFront()) { echo ''; } } From 9815c5ec3170d22b9e3e89df56002814e8acadbd Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Fri, 7 Apr 2017 15:06:07 +0900 Subject: [PATCH 219/339] =?UTF-8?q?P2UtilWiki=E3=82=92P2Util=E3=81=AB?= =?UTF-8?q?=E7=B5=B1=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 -- lib/P2Util.php | 17 +++++++++++++++++ lib/ShowThread.php | 2 +- lib/wiki/P2UtilWiki.php | 30 ------------------------------ rep2/info_sp.php | 2 +- 5 files changed, 19 insertions(+), 34 deletions(-) delete mode 100644 lib/wiki/P2UtilWiki.php diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 2b837a02d..f02119d55 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -177,8 +177,6 @@ function p2_init() include P2_LIB_DIR . '/startup.funcs.php'; spl_autoload_register('p2_load_class'); - include P2_LIB_DIR . '/wiki/P2UtilWiki.php'; - if ($debug) { $profiler = new Benchmark_Profiler(true); // p2_print_memory_usage(); diff --git a/lib/P2Util.php b/lib/P2Util.php index 59527f305..4f52a0122 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -2074,6 +2074,23 @@ static public function getBe2chCodeByMailPass($mail, $pass) } // }}} + /** + * +Wiki:プロフィールIDからBEIDを計算する + * + * @return integer|0 成功したらBEIDを返す。失敗したら0を返す。 + */ + public static function calcBeId($prof_id) + { + for ($y = 2; $y <= 9; $y++) { + for ($x = 2; $x <= 9; $x++) { + $id = (($prof_id - $x*10.0 - $y)/100.0 + $x - $y - 5.0)/(3.0 * $x * $y); + if ($id == floor($id)) { + return $id; + } + } + } + return 0; + } // {{{ debug() /* diff --git a/lib/ShowThread.php b/lib/ShowThread.php index decc97243..79ac36c8b 100644 --- a/lib/ShowThread.php +++ b/lib/ShowThread.php @@ -925,7 +925,7 @@ public function ngAbornCheck($code, $resfield, $ic = false) if ($code == 'aborn_be' || $code == 'ng_be') { // プロフィールIDを抜き出す if (preg_match('/BE:(\\d+)/', $resfield, $matches)) { - $beId = P2UtilWiki::calcBeId((int)$matches[1]); + $beId = P2Util::calcBeId((int)$matches[1]); if ($beId === 0) { return false; } diff --git a/lib/wiki/P2UtilWiki.php b/lib/wiki/P2UtilWiki.php deleted file mode 100644 index dac94d988..000000000 --- a/lib/wiki/P2UtilWiki.php +++ /dev/null @@ -1,30 +0,0 @@ - Date: Thu, 13 Apr 2017 12:16:27 +0900 Subject: [PATCH 220/339] =?UTF-8?q?Tor=E3=81=8C=E5=8B=95=E3=81=8B=E3=81=AA?= =?UTF-8?q?=E3=81=84=E4=B8=8D=E5=85=B7=E5=90=88=E4=BF=AE=E6=AD=A3=20401?= =?UTF-8?q?=E3=81=A7apiUserStatus=E3=81=8C=E5=8F=96=E3=82=8C=E3=81=AA?= =?UTF-8?q?=E3=81=84=E5=A0=B4=E5=90=88=E3=82=92=E6=83=B3=E5=AE=9A=E3=81=97?= =?UTF-8?q?=E3=81=9F=E5=8B=95=E4=BD=9C=E3=82=92=E8=BF=BD=E5=8A=A0=20?= =?UTF-8?q?=E6=9D=BF=E4=B8=80=E8=A6=A7=E3=81=AE=E6=9B=B4=E6=96=B0=E9=96=93?= =?UTF-8?q?=E9=9A=94=E3=82=9230=E5=88=86=E3=81=8A=E3=81=8D=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/BbsMap.php | 2 +- lib/BrdCtl.php | 2 +- lib/P2Commun.php | 2 +- lib/ThreadRead.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/BbsMap.php b/lib/BbsMap.php index 232a756e7..9fe87d577 100644 --- a/lib/BbsMap.php +++ b/lib/BbsMap.php @@ -313,7 +313,7 @@ static private function _getMapping() // {{{ 設定 $map_cache_path = $_conf['cache_dir'] . '/host_bbs_map.txt'; - $map_cache_lifetime = 60 * 30; // 30分おきに更新があるか確認するがBrdCtl側で最低1時間はアクセスしない。 + $map_cache_lifetime = 60 * 10; // 10分おきにキャッシュを再構築するが、BrdCtl側で最低30分はアクセスしない。 // }}} // {{{ キャッシュ確認 diff --git a/lib/BrdCtl.php b/lib/BrdCtl.php index 7195ab866..f857fa053 100644 --- a/lib/BrdCtl.php +++ b/lib/BrdCtl.php @@ -88,7 +88,7 @@ static public function read_brd_online() // DLする、ただしnorefreshならDLしない if (empty($_GET['nr']) || !file_exists($cachefile.'.p2.brd')) { //echo "DL!
    ";// - $cache_time = time() - 60 * 60 * $_conf['menu_dl_interval']; + $cache_time = time() - 60 * 30 * $_conf['menu_dl_interval']; $brdfile_online_res = P2Commun::fileDownload($_conf['brdfile_online'], $cachefile, $cache_time); if (isset($brdfile_online_res) && $brdfile_online_res->getStatus() != 304) { $isNewDL = true; diff --git a/lib/P2Commun.php b/lib/P2Commun.php index b617763aa..9809ce3fb 100644 --- a/lib/P2Commun.php +++ b/lib/P2Commun.php @@ -57,7 +57,7 @@ static public function createHTTPRequest($url , $method = HTTP_Request2::METHOD_ } // プロキシ - if ($_conf['tor_use'] && self::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット + if ($_conf['tor_use'] && P2Util::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット $req->setConfig (array ( 'proxy_host' => $_conf['tor_proxy_host'], 'proxy_port' => $_conf['tor_proxy_port'], diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index f4ff55477..11d23f051 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -312,7 +312,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { $this->onbytes = 0; $this->modified = null; return $this->_downloadDat2chAPI ($sid, 0); // あぼーん検出。全部取り直し。 - } elseif ($code == '401' && $apiUserStatus == '0') { // 401はAPI認証失敗(再認証する) + } elseif ($code == '401' && ($apiUserStatus == '0'||$apiUserStatus == '')) { // 401はAPI認証失敗(再認証する) if (empty ($_REQUEST['relogin2chapi'])) { $_REQUEST['relogin2chapi'] = true; return $this->downloadDat (); From 064e5e73c87798d167e885ff66a410377a9abd14 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Sat, 8 Apr 2017 19:28:21 +0900 Subject: [PATCH 221/339] =?UTF-8?q?SID=20=E3=81=AE=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 19 ++++++++++--------- lib/auth2chapi.inc.php | 35 +++++++++++++++-------------------- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 11d23f051..999d091df 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -85,7 +85,7 @@ public function downloadDat() { } include $_conf['sid2chapi_php']; - return $this->_downloadDat2chAPI ($SID2chAPI, $this->length); + return $this->_downloadDat2chAPI ($uaMona, $SID2chAPI, $this->length); } else { // 2ch 以外の外部板 @@ -103,7 +103,7 @@ public function downloadDat() { * * @return mix 取得できたか、更新がなかった場合はtrueを返す */ - protected function _downloadDat2chAPI($sid, $from_bytes) { + protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { global $_conf; global $debug; @@ -121,9 +121,10 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { return true; } - if ($sid == '') { + if ($SID2ch == '') { return false; } + $SID2ch = str_replace ("$uaMona:", '', $SID2ch); $from_bytes = intval ($from_bytes); @@ -145,7 +146,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { } $url .= $serverName[0] . '/' . $this->bbs . '/' . $this->key; - $message = '/v1/' . $serverName[0] . '/' . $this->bbs . '/' . $this->key . $sid . $AppKey; + $message = '/v1/' . $serverName[0] . '/' . $this->bbs . '/' . $this->key . $SID2ch . $AppKey; $HB = hash_hmac ("sha256", $message, $HMKey); $purl = parse_url ($url); // URL分解 @@ -174,7 +175,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { // POSTする内容 $req->addPostParameter (array ( - 'sid' => $sid, + 'sid' => $SID2ch, 'hobo' => $HB, 'appkey' => $AppKey )); @@ -265,7 +266,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { // echo "あぼーん検出"; $this->onbytes = 0; $this->modified = null; - return $this->_downloadDat2chAPI ($sid, 0); // あぼーん検出。全部取り直し。 + return $this->_downloadDat2chAPI ($uaMona, $SID2ch, 0); // あぼーん検出。全部取り直し。 } $body = substr ($body, 1); } @@ -285,7 +286,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { $this->modified = null; P2Util::pushInfoHtml ("

    rep2 info: {$this->onbytes}/{$this->length} ファイルサイズが変なので、datを再取得

    "); // $GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection("dat_size_check"); - return $this->_downloadDat2chAPI ($sid, 0); // datサイズは不正。全部取り直し。 + return $this->_downloadDat2chAPI ($uaMona, $SID2ch, 0); // datサイズは不正。全部取り直し。 } } @@ -300,7 +301,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { if ($new_host != $this->host) { $this->old_host = $this->host; $this->host = $new_host; - return $this->_downloadDat2chAPI ($sid, $from_bytes); + return $this->_downloadDat2chAPI ($uaMona, $SID2ch, $from_bytes); } else { return $this->_downloadDat2chNotFound ($code); } @@ -311,7 +312,7 @@ protected function _downloadDat2chAPI($sid, $from_bytes) { // echo "あぼーん検出"; $this->onbytes = 0; $this->modified = null; - return $this->_downloadDat2chAPI ($sid, 0); // あぼーん検出。全部取り直し。 + return $this->_downloadDat2chAPI ($uaMona, $SID2ch, 0); // あぼーん検出。全部取り直し。 } elseif ($code == '401' && ($apiUserStatus == '0'||$apiUserStatus == '')) { // 401はAPI認証失敗(再認証する) if (empty ($_REQUEST['relogin2chapi'])) { $_REQUEST['relogin2chapi'] = true; diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index 609efa99b..ae414b1aa 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -82,30 +82,25 @@ function authenticate_2chapi() return false; } - if (strpos($body, ':') != false) - { - $sid = explode(':', $body); - - if($_conf['2chapi_debug_print']==1) - { - P2Util::pushInfoHtml($body."
    ".$AuthUA); - } - - if($sid[0]!='SESSION-ID=Monazilla/1.00') { - P2Util::pushInfoHtml("

    p2 Error: 2ch API のレスポンスからSessionIDを取得出来ませんでした。

    "); - return ''; - } + $body = rtrim($body); - $cont = sprintf('p2 Error: {$_conf['sid2chapi_php']} を保存できませんでした。ログイン登録失敗。

    "); - return ''; - } + // 分解 + if (!preg_match('/SESSION-ID=(.+?):(.+)/', $body, $matches)) { + if (file_exists($_conf['sid2chapi_php'])) { unlink($_conf['sid2chapi_php']); } + P2Util::pushInfoHtml("

    p2 error: 2ch API のレスポンスからSessionIDを取得出来ませんでした。

    "); + return false; + } + $uaMona = $matches[1]; + $SID2chAPI = $matches[1] . ':' . $matches[2]; - return $sid[1]; + // SID の記録保持 + $cont = sprintf('p2 Error: {$_conf['sid2chapi_php']} を保存できませんでした。ログイン登録失敗。

    "); + return false; } - return ''; + return $SID2chAPI; } // }}} From 882b784c764d2a585ce312eb40750d4e348421cb Mon Sep 17 00:00:00 2001 From: killer4989 Date: Thu, 13 Apr 2017 13:45:40 +0900 Subject: [PATCH 222/339] =?UTF-8?q?API=E7=94=A8SID=E3=81=AE=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E6=96=B9=E6=B3=95=E3=82=92=E6=B5=AA=E4=BA=BA=E3=81=A7?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E3=81=97=E3=81=A6=E3=81=84=E3=82=8B=E5=BD=A2?= =?UTF-8?q?=E5=BC=8F=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From bcf33f2e987a0a1e005a681c868e6809e96c85b3 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 13 Apr 2017 14:33:58 +0900 Subject: [PATCH 223/339] =?UTF-8?q?=E9=87=8D=E8=A4=87=E3=81=97=E3=81=A6?= =?UTF-8?q?=E5=AE=9F=E8=A3=85=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84=E3=82=8B?= =?UTF-8?q?=E9=AB=98=E8=A7=A3=E5=83=8F=E5=BA=A6=E5=AF=BE=E5=BF=9C=E3=82=92?= =?UTF-8?q?srcset=E5=B1=9E=E6=80=A7=E3=81=AE=E3=81=BF=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=20=E6=B5=AA=E4=BA=BA=E3=82=92=E4=BD=BF=E3=81=A3?= =?UTF-8?q?=E3=81=9F=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=81=BF=E3=81=A7=E3=80=81?= =?UTF-8?q?2ch=E3=81=AEAPI=E3=81=AESID=E3=82=92=E4=BD=BF=E3=81=86=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=82=92=E8=BF=BD=E5=8A=A0=20API=E3=81=AESID=E3=82=92?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E3=81=97=E3=81=A6=E3=80=81=E6=B5=AA=E4=BA=BA?= =?UTF-8?q?=E3=81=AE=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=81=BF=E7=89=B9=E5=85=B8?= =?UTF-8?q?=E3=81=8C=E5=8F=97=E3=81=91=E3=82=89=E3=82=8C=E3=82=8B=E5=A0=B4?= =?UTF-8?q?=E5=90=88=E3=81=AF=E3=80=81=E6=B5=AA=E4=BA=BA=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E6=A9=9F=E8=83=BD=E3=81=A8API=E3=81=AE?= =?UTF-8?q?=E8=AA=8D=E8=A8=BC=E6=A9=9F=E8=83=BD=E3=82=92=E7=B5=B1=E5=90=88?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 3 +-- conf/conf_user_def.inc.php | 4 ++++ lib/toolbar_i.inc.php | 28 ---------------------------- rep2/edit_conf_user.php | 1 + rep2/post.php | 9 +++++++-- 5 files changed, 13 insertions(+), 32 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index f02119d55..54a0aa10a 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '160410.0125', // rep2のバージョン + 'p2version' => '170413.9001', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; @@ -15,7 +15,6 @@ define('P2_VERSION_ID', sprintf('%u', crc32($_conf['p2ua']))); $_conf['jquery_version'] = '1.8.3'; -$_conf['have_glyphish_2x'] = false; /* * 通常はセッションファイルのロック待ちを極力短くするため diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 73aecf57d..77233cedc 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -427,6 +427,10 @@ $conf_user_def['2chapi_debug_print'] = 0; // (0) $conf_user_rad['2chapi_debug_print'] = array('1' => 'する', '0' => 'しない'); +// 2ch API を使用する +$conf_user_def['2chapi_post'] = 0; // (0) +$conf_user_rad['2chapi_post'] = array('1' => 'する', '0' => 'しない'); + // }}} // {{{ ETC diff --git a/lib/toolbar_i.inc.php b/lib/toolbar_i.inc.php index a1fae5177..b12eceeae 100644 --- a/lib/toolbar_i.inc.php +++ b/lib/toolbar_i.inc.php @@ -5,32 +5,6 @@ // {{{ _toolbar_i_button() -/** - * ツールバーアイコン - * - * @param string $icon - * @return string - */ -function _toolbar_i_icon($icon) -{ - static $hd = null; - - if ($hd === null) { - $hd = false; - if (isset($_SESSION['device_pixel_ratio'])) { - if ($_SESSION['device_pixel_ratio'] > 1.0) { - $hd = $GLOBALS['_conf']['have_glyphish_2x']; - } - } - } - - if ($hd && preg_match('@img/glyphish/icons2/\\d+-[\\-\\w]+\\.png$@', $icon)) { - $icon = substr($icon, 0, -4) . '@2x.png'; - } - - return $icon; -} - /** * imgタグに解像度毎の代替パスを指定するsrcset属性を生成 * @@ -76,7 +50,6 @@ function _toolbar_i_button($icon, $label, $uri, $attrs = '') $attrs = str_replace('class="', 'class="hoverable ', $attrs); } - $icon = _toolbar_i_icon($icon); $srcset = _toolbar_i_srcset($icon); return << Date: Tue, 5 Sep 2017 21:39:54 +0900 Subject: [PATCH 224/339] =?UTF-8?q?PHP7.1=E3=81=A7=E3=81=97=E3=81=9F?= =?UTF-8?q?=E3=82=89=E5=A0=B4=E3=81=8C=E8=AA=AD=E3=82=81=E3=81=AA=E3=81=84?= =?UTF-8?q?=E4=B8=8D=E5=85=B7=E5=90=88=E3=82=92=E4=BF=AE=E6=AD=A3=20Thx!?= =?UTF-8?q?=20http://egg.2ch.net/test/read.cgi/software/1465970697/584?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/read_shitaraba.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/read_shitaraba.inc.php b/lib/read_shitaraba.inc.php index 69968b9a1..131856c04 100644 --- a/lib/read_shitaraba.inc.php +++ b/lib/read_shitaraba.inc.php @@ -117,7 +117,7 @@ function shitarabaDatTo2chDatLines($mlines) $retval = false; return $retval; } - $mdatlines = ""; + $mdatlines = array(); foreach ($mlines as $ml) { $ml = rtrim($ml); From 2dc761053f9220d519799a98ddf84d6f953e96d1 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 20 Sep 2017 21:03:23 +0900 Subject: [PATCH 225/339] fix spell miss --- lib/P2Commun.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/P2Commun.php b/lib/P2Commun.php index 9809ce3fb..162536c13 100644 --- a/lib/P2Commun.php +++ b/lib/P2Commun.php @@ -1,6 +1,6 @@ 0) { // エラーメッセージを設定 if ($disp_error) { - $url_t = self::throughIme($url); + $url_t = P2Util::throughIme($url); $info_msg_ht = "

    Error: {$error_msg}
    "; $info_msg_ht .= "rep2 info: {$url} に接続できませんでした。

    "; self::pushInfoHtml($info_msg_ht); From a0a33635cc58e99f0223122b48b78d7ea2de635d Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Wed, 20 Sep 2017 21:34:09 +0900 Subject: [PATCH 226/339] =?UTF-8?q?=E7=B5=B5=E6=96=87=E5=AD=97=E3=81=AB?= =?UTF-8?q?=E6=9A=AB=E5=AE=9A=E5=AF=BE=E5=BF=9C=E3=80=82=E6=9B=B8=E3=81=91?= =?UTF-8?q?=E3=81=AA=E3=81=84=E6=9D=BF=E3=82=84=E7=92=B0=E5=A2=83=E3=81=8C?= =?UTF-8?q?=E3=81=82=E3=82=8B=E3=81=AE=E3=81=AF=E4=BB=95=E6=A7=98=E8=A9=B3?= =?UTF-8?q?=E3=81=97=E3=81=8F=E3=81=AFissue=E5=8F=82=E7=85=A7=20resolve=20?= =?UTF-8?q?#14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 54a0aa10a..48cdc2500 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '170413.9001', // rep2のバージョン + 'p2version' => '170920.9001', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; @@ -187,8 +187,10 @@ function p2_init() mb_internal_encoding('SJIS-win'); mb_http_output('pass'); - mb_substitute_character(63); // 文字コード変換に失敗した文字が "?" になる + //mb_substitute_character(63); // 文字コード変換に失敗した文字が "?" になる //mb_substitute_character(0x3013); // 〓 + + mb_substitute_character('entity'); //文字コード変換に失敗した文字が数値参照に置換される //ob_start('mb_output_handler'); if (function_exists('mb_ereg_replace')) { From 56240da29e51559e22b0c1093d8b3ccfc3dccbae Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 21 Sep 2017 11:18:04 +0900 Subject: [PATCH 227/339] =?UTF-8?q?2ch=E7=B3=BB=E3=81=A0=E3=81=91=20html?= =?UTF-8?q?=5Fentity=5Fdecode=E3=81=A7=E5=A4=89=E6=8F=9B=E3=81=97=E3=81=9F?= =?UTF-8?q?UTF-8=E3=81=AE=E6=96=87=E5=AD=97=E5=88=97=E3=82=92POST=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4=20?= =?UTF-8?q?=E5=85=83=E3=81=8B=E3=82=89Unicode=E3=82=92=E6=8A=95=E7=A8=BF?= =?UTF-8?q?=E5=87=BA=E6=9D=A5=E3=82=8B=E6=9D=BF=E3=81=AE=E5=8B=95=E4=BD=9C?= =?UTF-8?q?=E3=81=AF=E6=9C=AA=E7=A2=BA=E8=AA=8D=E3=80=82Pink=E3=81=AF?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=E3=81=97=E3=81=A6=E3=82=8B=E3=81=8B=E4=B8=8D?= =?UTF-8?q?=E6=98=8E=E3=81=AA=E3=81=AE=E3=81=A7=E9=99=A4=E5=A4=96=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/post.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rep2/post.php b/rep2/post.php index b00584a83..e4a537bfa 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -167,7 +167,7 @@ include $_conf['sid2chapi_php']; $post['sid'] = $SID2chAPI; } else { - include $_conf['sid2ch_php']; + include $_conf['sid2ch_php']; $post['sid'] = $SID2ch; } } @@ -424,6 +424,9 @@ function postIt($host, $bbs, $key, $post) // したらば or be.2ch.netなら、EUCに変換 if (P2Util::isHostJbbsShitaraba($host) || P2Util::isHostBe2chNet($host)) { $value = mb_convert_encoding($value, 'CP51932', 'CP932'); + } elseif (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host)) { + // 2chはUnicodeの文字列をpostする + $value = html_entity_decode(mb_convert_encoding($value, 'UTF-8', 'CP932'),ENT_QUOTES,'UTF-8'); } $req->addPostParameter($name, $value); } From e1cc7a72a3bc0280c973e497e3e83f5cbf4a9bd3 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Wed, 7 Jun 2017 22:58:00 +0900 Subject: [PATCH 228/339] =?UTF-8?q?vip2ch.com=E8=AA=AD=E3=81=BF=E8=BE=BC?= =?UTF-8?q?=E3=81=BF=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index 4f52a0122..c9b1cd6da 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1786,7 +1786,7 @@ static public function detectThread($url = null) list($bbs, $key, $ls) = self::parseMachiQuery($matches[4]); // vip2ch.com - http://ex14.vip2ch.com/test/read.cgi/news4ssnip/1450958506/ - } elseif (preg_match('<^https?://((\\w+)\\.vip2ch\\.com)/test/(?:read\\.(?:cgi|html|so)|mread\\.cgi)/(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) + } elseif (preg_match('<^https?://((\\w+)\\.vip2ch\\.com)/(?:test|i)/(?:read\\.(?:cgi|html|so)|mread\\.cgi|read)/(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) { $host = $matches[1]; $bbs = $matches[3]; @@ -1794,7 +1794,7 @@ static public function detectThread($url = null) $ls = (isset($matches[5]) && strlen($matches[5])) ? $matches[5] : ''; // vip2ch.com - http://ex14.vip2ch.com/i/responce.html?bbs=news4ssnip&dat=1450958506 - } elseif (preg_match('<^https?://((\\w+)\\.vip2ch\\.com)/i/responce\\.html\\?bbs=(\\w+)&dat=([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) + } elseif (preg_match('<^https?://((\\w+)\\.vip2ch\\.com)/i/(?:responce|responce_r18)\\.html\\?bbs=(\\w+)&dat=([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) { $host = $matches[1]; $bbs = $matches[3]; From 9f9899a05c52f37591f9d2ae1373cb053562a6b3 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 21 Sep 2017 15:43:52 +0900 Subject: [PATCH 229/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=E7=94=A8?= =?UTF-8?q?=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=81=BF=E6=AC=84=E3=81=AE=E3=83=87?= =?UTF-8?q?=E3=82=B6=E3=82=A4=E3=83=B3=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/post_form.inc.php | 11 ++++++----- rep2/css/iphone.css | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/lib/post_form.inc.php b/lib/post_form.inc.php index 22351c8d2..3dd3054d5 100644 --- a/lib/post_form.inc.php +++ b/lib/post_form.inc.php @@ -27,6 +27,7 @@ $htm['table_break2'] = ''; $htm['table_end'] = '
    '; if ($_conf['iphone']) { + $htm['k_br'] = ''; $htm['options'] .= << @@ -34,11 +35,11 @@ EOP; - $htm['name_label'] = '名前:'; - $htm['mail_label'] = 'E-mail:'; - $htm['name_extra_at'] = ' autocorrect="off" autocapitalize="off"'; - $htm['mail_extra_at'] = ' autocorrect="off" autocapitalize="off"'; - $htm['msg_extra_at'] = ' autocorrect="off" autocapitalize="off"'; + $htm['name_label'] = ''; + $htm['mail_label'] = ''; + $htm['name_extra_at'] = ' class="formelem maxwidth" placeholder="名前(省略可)" autocorrect="off" autocapitalize="off"'; + $htm['mail_extra_at'] = ' class="formelem maxwidth" placeholder="メール(省略可)" autocorrect="off" autocapitalize="off"'; + $htm['msg_extra_at'] = ' class="formelem maxwidth" placeholder="本文" autocorrect="off" autocapitalize="off"'; $htm['submit_extra_at'] = ''; if ($_conf['expack.editor.mobile.savedraft'] != '0' && $_conf['expack.editor.mobile.savedraft.interval'] > 0) { $htm['kaiko_on_js'] = ' onfocus="DraftKakiko.startAutoSave(this.form, ' . ($_conf['expack.editor.mobile.savedraft.interval'] * 1000) . ')"'; diff --git a/rep2/css/iphone.css b/rep2/css/iphone.css index 9eb858acc..06fbb6d77 100644 --- a/rep2/css/iphone.css +++ b/rep2/css/iphone.css @@ -140,6 +140,24 @@ input[type="checkbox"]:checked { border-color: #555555; } +input[type="submit"] { + -moz-user-select: none; + background-color: #808080; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; + color: #fff; + cursor: pointer; + display: inline-block; + font-size: 15px; + font-weight: normal; + padding: 10px; + text-align: center; + touch-action: manipulation; + vertical-align: middle; + white-space: nowrap; +} + textarea { padding-left: 5px; padding-right: 5px; @@ -1050,6 +1068,24 @@ div.mtoolbar > .ttitle > span.btitle { } } + +.maxwidth { + width: 98%; +} + +.formelem { + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset; + color: #000; + display: block; + margin-bottom: 15px; + padding: 6px 12px; + transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s; +} + /* }}} */ /* From a08256120f7a82e0108e617ba2649271251b15a8 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 21 Sep 2017 17:56:51 +0900 Subject: [PATCH 230/339] v170921.1800 --- README.md | 4 ++++ doc/README-774.txt | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/README.md b/README.md index 75029eea2..a97b42b11 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,10 @@ 迢ャ閾ェ縺ョ謾ケ濶ッ繧り。後▲縺ヲ縺縺セ縺吶 +### 蜍穂ス懃腸蠅 +Linux(openSUSE Leap)縺ョPHP7+Apache縺ァ蜍穂ス懃「コ隱阪@縺ヲ縺縺セ縺吶 +PHP5.6莉・髯阪〒蜍輔¥縺ッ縺壹〒縺吶′縲 ̄HP7.*謗ィ螂ィ縺ァ縺吶 +PHP7縺ァ縺ョ荳榊キ蜷井ソョ豁」繧貞━蜈医☆繧九◆繧∫ェ∫┯PHP5.x縺ョ繧オ繝昴シ繝医′邨ゅo繧句庄閭ス諤ァ縺後≠繧翫∪縺吶 ### 霑ス蜉讖溯ス diff --git a/doc/README-774.txt b/doc/README-774.txt index 7c0969fbb..7912995da 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -8,6 +8,10 @@ rep2-expack test https://github.com/orzisun/p2-php 上記やスレに上げられた修正を取り込んで全部入りを目指す闇鍋バージョンです。 独自の改良も行っています。 +●動作環境 +Linux(openSUSE Leap)のPHP7+Apacheで動作確認しています。 +PHP5.6以降で動くはずですが、PHP7.*推奨です。 +PHP7での不具合修正を優先するため突然PHP5.xのサポートが終わる可能性があります。 ●主な機能 ### 設定の追加 @@ -64,6 +68,17 @@ rep2-expack test https://github.com/orzisun/p2-php ●ChangeLog +170921.1800 +* vip2ch.com読み込み対応 +* 2chのUnicode絵文字投稿に対応 +* PHP7.1でしたら場が読めない不具合を修正 +* Torが動かない不具合修正 +* 2chでAPI 未使用でも見れる板に対応 +* まちBBS にてドメインでもスレを見れるようにした +* SS 速報 R の移転検知できるようにした +* (人柱機能)curl を用いた並列ダウンロード機能を追加 +* スマホ用書き込み欄のデザインを変更 + 160410.0125 * NGスレッド機能が本体と+Wikiで重複して実装されているので削除 * 160409.1000 に新着纏め読みと実況等が動作しない不具合があるので修正 From 2d184a90913518695133f93ee635edb29e2d4480 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 21 Sep 2017 18:09:30 +0900 Subject: [PATCH 231/339] =?UTF-8?q?=E5=8B=95=E4=BD=9C=E3=83=81=E3=82=A7?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=81=AE=E6=9C=80=E4=BD=8E=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E3=82=92=E6=9B=B4=E6=96=B0=20CentOS=E6=B0=91=E3=81=AF=E8=87=AA?= =?UTF-8?q?=E5=8A=9B=E3=81=A7=E4=BD=95=E3=81=A8=E3=81=8B=E3=81=97=E3=81=A6?= =?UTF-8?q?=E3=81=8F=E3=82=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 ++++----- conf/setup_info.php | 4 ++-- lib/expack/Console/Command/Check.php | 6 +++--- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index a97b42b11..b3a87aa11 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,6 @@ 迢ャ閾ェ縺ョ謾ケ濶ッ繧り。後▲縺ヲ縺縺セ縺吶 -### 蜍穂ス懃腸蠅 -Linux(openSUSE Leap)縺ョPHP7+Apache縺ァ蜍穂ス懃「コ隱阪@縺ヲ縺縺セ縺吶 -PHP5.6莉・髯阪〒蜍輔¥縺ッ縺壹〒縺吶′縲 ̄HP7.*謗ィ螂ィ縺ァ縺吶 -PHP7縺ァ縺ョ荳榊キ蜷井ソョ豁」繧貞━蜈医☆繧九◆繧∫ェ∫┯PHP5.x縺ョ繧オ繝昴シ繝医′邨ゅo繧句庄閭ス諤ァ縺後≠繧翫∪縺吶 - ### 霑ス蜉讖溯ス 蜷讖溯ス縺ョ隱ャ譏弱ッdoc繝繧」繝ャ繧ッ繝医Μ縺ョREADME繝輔ぃ繧、繝ォ繧定ヲ九※縺上□縺輔>縲 @@ -36,6 +31,10 @@ PHP7縺ァ縺ョ荳榊キ蜷井ソョ豁」繧貞━蜈医☆繧九◆繧∫ェ∫┯PHP5.x縺ョ繧オ繝昴シ繝医′邨 ## 蜍穂ス懃腸蠅 +Linux(openSUSE Leap)縺ョPHP7+Apache縺ァ蜍穂ス懃「コ隱阪@縺ヲ縺縺セ縺吶 +PHP5.6莉・髯阪〒蜍輔¥縺ッ縺壹〒縺吶′縲 ̄HP7.*謗ィ螂ィ縺ァ縺吶 +PHP7縺ァ縺ョ荳榊キ蜷井ソョ豁」繧貞━蜈医☆繧九◆繧∫ェ∫┯PHP5.x縺ョ繧オ繝昴シ繝医′邨ゅo繧句庄閭ス諤ァ縺後≠繧翫∪縺吶 + 莉・荳九ョ繧ウ繝槭Φ繝峨r螳溯。後@縺ヲ縲∝ィ縺ヲ縺ョ鬆逶ョ縺ァ `OK` 縺悟コ縺溘↑繧牙、ァ荳亥、ォ縺ァ縺吶 菴輔°繧ィ繝ゥ繝シ縺悟コ縺溘i縺後s縺ー縺」縺ヲ迺ー蠅繧呈紛縺医※縺上□縺輔>縲 diff --git a/conf/setup_info.php b/conf/setup_info.php index 96d379355..948f56550 100644 --- a/conf/setup_info.php +++ b/conf/setup_info.php @@ -4,8 +4,8 @@ */ // 必須バージョン -$p2_required_version_5_3 = '5.3.2'; -$p2_required_version_5_4 = '5.4.0'; +$p2_required_version_5_x = '5.6.0'; +$p2_required_version_7_x = '7.0.0'; // 必須拡張モジュール $p2_required_extensions = array( diff --git a/lib/expack/Console/Command/Check.php b/lib/expack/Console/Command/Check.php index c14cd2ab4..bad8061c2 100644 --- a/lib/expack/Console/Command/Check.php +++ b/lib/expack/Console/Command/Check.php @@ -30,10 +30,10 @@ protected function execute(InputInterface $input, OutputInterface $output) $php_version = phpversion(); - if (version_compare($php_version, '5.4.0-dev', '>=')) { - $required_version = $p2_required_version_5_4; + if (version_compare($php_version, '7.0.0-dev', '>=')) { + $required_version = $p2_required_version_7_x; } else { - $required_version = $p2_required_version_5_3; + $required_version = $p2_required_version_5_x; } // PHPのバージョン From 53be72409fce050907acd320aca8a238e33dcee1 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 21 Sep 2017 23:57:10 +0900 Subject: [PATCH 232/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=E7=94=A8?= =?UTF-8?q?=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=81=BF=E6=AC=84=E3=81=AE=E3=83=86?= =?UTF-8?q?=E3=82=AD=E3=82=B9=E3=83=88=E3=82=A8=E3=83=AA=E3=82=A2=E3=82=92?= =?UTF-8?q?=E8=87=AA=E5=8B=95=E7=9A=84=E3=81=AB=E3=82=B5=E3=82=A4=E3=82=BA?= =?UTF-8?q?=E8=AA=BF=E6=95=B4=EF=BC=88PC=E3=81=A8=E5=90=8C=E3=81=98?= =?UTF-8?q?=E5=8B=95=E4=BD=9C=EF=BC=89=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/post_form.inc.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/post_form.inc.php b/lib/post_form.inc.php index 3dd3054d5..b6e3e8d6e 100644 --- a/lib/post_form.inc.php +++ b/lib/post_form.inc.php @@ -28,22 +28,22 @@ $htm['table_end'] = '
    '; if ($_conf['iphone']) { $htm['k_br'] = ''; - $htm['options'] .= << - - - - -EOP; $htm['name_label'] = ''; $htm['mail_label'] = ''; $htm['name_extra_at'] = ' class="formelem maxwidth" placeholder="名前(省略可)" autocorrect="off" autocapitalize="off"'; $htm['mail_extra_at'] = ' class="formelem maxwidth" placeholder="メール(省略可)" autocorrect="off" autocapitalize="off"'; $htm['msg_extra_at'] = ' class="formelem maxwidth" placeholder="本文" autocorrect="off" autocapitalize="off"'; + + $htm['kaiko_on_js_fmt'] = ' onfocus="%1$s" onkeyup="if(%2$s){%1$s}"'; + $htm['kaiko_on_js_func'] = sprintf("adjustTextareaRows(this,%d,2); ", $STYLE['post_msg_rows']); + $htm['submit_extra_at'] = ''; if ($_conf['expack.editor.mobile.savedraft'] != '0' && $_conf['expack.editor.mobile.savedraft.interval'] > 0) { - $htm['kaiko_on_js'] = ' onfocus="DraftKakiko.startAutoSave(this.form, ' . ($_conf['expack.editor.mobile.savedraft.interval'] * 1000) . ')"'; + $htm['kaiko_on_js_func'] = 'DraftKakiko.startAutoSave(this.form, ' . ($_conf['expack.editor.mobile.savedraft.interval'] * 1000) . '); '.$htm['kaiko_on_js_func']; } + + $htm['kaiko_on_js_cond'] = '!event||((event.keyCode&&(event.keyCode==8||event.keyCode==13))||event.ctrlKey||event.metaKey||event.altKey)'; + $htm['kaiko_on_js'] = sprintf($htm['kaiko_on_js_fmt'], $htm['kaiko_on_js_func'], p2h($htm['kaiko_on_js_cond'])); } else { $htm['name_label'] = '名前:'; $htm['mail_label'] = 'E-mail:'; From d8e094971d32e6ea7c4210d225ea42d6a5722231 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 24 Sep 2017 10:14:51 +0900 Subject: [PATCH 233/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=E5=90=91?= =?UTF-8?q?=E3=81=91=E3=83=9A=E3=83=BC=E3=82=B8=E3=81=ABbootstrap=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=20=E8=AA=A4=E6=93=8D=E4=BD=9C=E9=98=B2?= =?UTF-8?q?=E6=AD=A2=E3=81=AE=E3=81=9F=E3=82=81=E3=81=AB=E3=83=84=E3=83=BC?= =?UTF-8?q?=E3=83=AB=E3=83=90=E3=83=BC=E3=81=AE=E3=83=AD=E3=82=B0=E5=89=8A?= =?UTF-8?q?=E9=99=A4=E3=83=9C=E3=82=BF=E3=83=B3=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 4 +- conf/conf_ic2.inc.php | 2 +- lib/ResFilterElement.php | 2 +- lib/ShowThreadI.php | 180 +++--- lib/bootstrap.php | 6 + lib/post_form.inc.php | 10 +- lib/read_header_i.inc.php | 44 +- lib/read_jump_k.inc.php | 4 +- lib/sb_footer_i.inc.php | 4 +- lib/sb_header_i.inc.php | 28 +- rep2/css/bootstrap.min.css | 6 + rep2/css/iphone.css | 1088 +++++++++++++++++------------------ rep2/js/bootstrap.min.js | 7 + rep2/js/jquery-3.2.1.min.js | 4 + rep2/js/spm_iphone.js | 32 +- rep2/post_form.php | 2 +- rep2/read_filter_k.php | 1 + rep2/read_new_k.php | 1 - 18 files changed, 707 insertions(+), 718 deletions(-) create mode 100644 rep2/css/bootstrap.min.css create mode 100644 rep2/js/bootstrap.min.js create mode 100644 rep2/js/jquery-3.2.1.min.js diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 48cdc2500..998f34da1 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,14 +7,14 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '170920.9001', // rep2のバージョン + 'p2version' => '170921.1800', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; define('P2_VERSION_ID', sprintf('%u', crc32($_conf['p2ua']))); -$_conf['jquery_version'] = '1.8.3'; +$_conf['jquery_version'] = '3.2.1'; /* * 通常はセッションファイルのロック待ちを極力短くするため diff --git a/conf/conf_ic2.inc.php b/conf/conf_ic2.inc.php index fdd89f165..bebec256a 100644 --- a/conf/conf_ic2.inc.php +++ b/conf/conf_ic2.inc.php @@ -12,7 +12,7 @@ // DSN (DBに接続するためのデータソース名) // @link http://jp.pear.php.net/manual/ja/package.database.db.intro-dsn.php // 例) -// MySQL: 'mysql://username:password@localhost:3306/database' +// MySQL: 'mysqli://username:password@localhost:3306/database' // PostgreSQL: 'pgsql://username:password@localhost:5432/database' // SQLite2: 'sqlite:///' . $_conf['db_dir'] . '/imgcache.sqlite' // 注1: username,password,databaseは実際のものと読み替える。 diff --git a/lib/ResFilterElement.php b/lib/ResFilterElement.php index c5a505ddd..2e55dd43d 100644 --- a/lib/ResFilterElement.php +++ b/lib/ResFilterElement.php @@ -161,7 +161,7 @@ static private function _getSelectField(array $fields, $default, $key, $name = p2h($name); $id = p2h($id); - $html = ""; foreach ($fields as $value => $label) { if ($value == $default) { if ($xhtml) { diff --git a/lib/ShowThreadI.php b/lib/ShowThreadI.php index 2e3976293..8db0cc160 100644 --- a/lib/ShowThreadI.php +++ b/lib/ShowThreadI.php @@ -122,7 +122,7 @@ public function __construct(ThreadRead $aThread, $matome = false) //if ($this->_matome) { // $this->spmObjName = sprintf('t%dspm%u', $this->_matome, crc32($this->thread->keydat)); //} else { - $this->spmObjName = sprintf('spm%u', crc32($this->thread->keydat)); + $this->spmObjName = sprintf('spm%u', crc32($this->thread->keydat)); //} } @@ -132,9 +132,9 @@ public function __construct(ThreadRead $aThread, $matome = false) /** * DatレスをHTMLレスに変換する * - * @param string $ares datの1ライン - * @param int $i レス番号 - * @param string $pattern ハイライト用正規表現 + * @param string $ares datの1ライン + * @param int $i レス番号 + * @param string $pattern ハイライト用正規表現 * @return string */ public function transRes($ares, $i, $pattern = null) @@ -152,10 +152,10 @@ public function transRes($ares, $i, $pattern = null) // +Wiki:置換ワード if (isset($GLOBALS['replaceWordCtl'])) { $replaceWordCtl = $GLOBALS['replaceWordCtl']; - $name = $replaceWordCtl->replace('name', $this->thread, $ares, $i); - $mail = $replaceWordCtl->replace('mail', $this->thread, $ares, $i); + $name = $replaceWordCtl->replace('name', $this->thread, $ares, $i); + $mail = $replaceWordCtl->replace('mail', $this->thread, $ares, $i); $date_id = $replaceWordCtl->replace('date', $this->thread, $ares, $i); - $msg = $replaceWordCtl->replace('msg', $this->thread, $ares, $i); + $msg = $replaceWordCtl->replace('msg', $this->thread, $ares, $i); } $tores = ''; @@ -196,7 +196,7 @@ public function transRes($ares, $i, $pattern = null) } else { $name = '[串]' . $name; } - // デフォルトの名前と同じなら省略 + // デフォルトの名前と同じなら省略 } elseif ($name === $this->_nanashiName) { $name = ''; } @@ -296,7 +296,7 @@ public function transRes($ares, $i, $pattern = null) respopup_at}{$this->target_at}>{$this->check_st} EOMSG; - // NGメール変換 + // NGメール変換 } elseif ($ng_type & self::NG_MAIL) { $mail = <<{$mail} @@ -305,7 +305,7 @@ public function transRes($ares, $i, $pattern = null) EOMSG; - // NGID変換 + // NGID変換 } elseif ($ng_type & self::NG_ID) { $date_id = <<{$date_id} @@ -386,7 +386,7 @@ public function transRes($ares, $i, $pattern = null) /** * 名前をHTML用に変換する * - * @param string $name 名前 + * @param string $name 名前 * @return string */ public function transName($name) @@ -428,8 +428,8 @@ public function transName($name) /** * datのレスメッセージをHTML表示用メッセージに変換する * - * @param string $msg メッセージ - * @param int $mynum レス番号 + * @param string $msg メッセージ + * @param int $mynum レス番号 * @return string */ public function transMsg($msg, $mynum) @@ -577,25 +577,40 @@ static public function getSpmElementHtml() { global $_conf; - return << -
    - >>???にレス - [引用なし] + $spm = << +
    >>???
    +
    + これにレス + 引用してレス +EOP; + if ($_conf['expack.aas.enabled']) { + $spm .= <<AAS + AAS(回転) +EOP; + } + $spm .= <<逆参照
    -
    -を
    + +
    EOP; + return $spm; } // }}} @@ -604,8 +619,8 @@ static public function getSpmElementHtml() /** * IDフィルタリングリンク変換 * - * @param string $idstr ID:xxxxxxxxxx - * @param string $id xxxxxxxxxx + * @param string $idstr ID:xxxxxxxxxx + * @param string $id xxxxxxxxxx * @return string */ public function idFilter($idstr, $id) @@ -624,20 +639,20 @@ public function idFilter($idstr, $id) */ $filter_url = $_conf['read_php'] . '?' . http_build_query(array( - 'host' => $this->thread->host, - 'bbs' => $this->thread->bbs, - 'key' => $this->thread->key, - 'ls' => 'all', - 'offline' => '1', - 'idpopup' => '1', - 'rf' => array( - 'field' => ResFilter::FIELD_ID, - 'method' => ResFilter::METHOD_JUST, - 'match' => ResFilter::MATCH_ON, - 'include' => ResFilter::INCLUDE_NONE, - 'word' => $id, - ), - ), '', '&') . $_conf['k_at_a']; + 'host' => $this->thread->host, + 'bbs' => $this->thread->bbs, + 'key' => $this->thread->key, + 'ls' => 'all', + 'offline' => '1', + 'idpopup' => '1', + 'rf' => array( + 'field' => ResFilter::FIELD_ID, + 'method' => ResFilter::METHOD_JUST, + 'match' => ResFilter::MATCH_ON, + 'include' => ResFilter::INCLUDE_NONE, + 'word' => $id, + ), + ), '', '&') . $_conf['k_at_a']; if (isset($this->thread->idcount[$id]) && $this->thread->idcount[$id] > 0) { $num_ht = "(target_at}>{$this->thread->idcount[$id]})"; @@ -663,7 +678,7 @@ protected function _linkToWikipeida($word) $link = P2Util::throughIme($link); } - return "{$word}"; + return "{$word}"; } // }}} @@ -672,9 +687,9 @@ protected function _linkToWikipeida($word) /** * 引用変換(単独) * - * @param string $full >>1-100 - * @param string $qsign >> - * @param string $appointed_num 1-100 + * @param string $full >>1-100 + * @param string $qsign >> + * @param string $appointed_num 1-100 * @return string */ public function quoteRes($full, $qsign, $appointed_num) @@ -710,9 +725,9 @@ public function quoteRes($full, $qsign, $appointed_num) /** * 引用変換(範囲) * - * @param string $full >>1-100 - * @param string $qsign >> - * @param string $appointed_num 1-100 + * @param string $full >>1-100 + * @param string $qsign >> + * @param string $appointed_num 1-100 * @return string */ public function quoteResRange($full, $qsign, $appointed_num) @@ -747,9 +762,9 @@ public function quoteResRange($full, $qsign, $appointed_num) /** * 携帯用外部URL変換 * - * @param string $full - * @param string $url - * @param string $str + * @param string $full + * @param string $url + * @param string $str * @return string */ public function ktaiExtUrl($full, $url, $str) @@ -794,7 +809,7 @@ public function ktaiExtUrl($full, $url, $str) /** * 携帯用外部URL変換 * - * @param array $s 正規表現にマッチした要素の配列 + * @param array $s 正規表現にマッチした要素の配列 * @return string */ public function ktaiExtUrlCallback(array $s) @@ -841,7 +856,7 @@ public function plugin_link2chSubject($url, $purl, $str) if (preg_match('{^https?://(.+)/(.+)/$}', $purl[0], $m)) { //rep2に登録されている板ならばリンクする - if (BbsMap::isRegisteredBbs($m[1],$m[2])) { + if (BbsMap::isRegisteredBbs($m[1], $m[2])) { $subject_url = "{$_conf['subject_php']}?host={$m[1]}&bbs={$m[2]}"; return "{$str} [板をp2で開く]"; } @@ -883,10 +898,10 @@ public function plugin_viewImage($url, $purl, $str) } if (preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $url) && empty($purl['query'])) { - $picto_url = 'http://pic.to/'.$purl['host'].$purl['path']; - $picto_tag = '(ピ) '; + $picto_url = 'http://pic.to/' . $purl['host'] . $purl['path']; + $picto_tag = '(ピ) '; if ($_conf['through_ime']) { - $link_url = P2Util::throughIme($purl[0]); + $link_url = P2Util::throughIme($purl[0]); $picto_url = P2Util::throughIme($picto_url); } else { $link_url = $url; @@ -1013,7 +1028,7 @@ public function plugin_replaceImageUrl($url, $purl, $str) } // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 - if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false){ + if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false) { $update = new ImageCache2_DataObject_Images(); if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { $update->memo = $this->img_memo . ' ' . $icdb->memo; @@ -1026,7 +1041,8 @@ public function plugin_replaceImageUrl($url, $purl, $str) // expack.ic2.fav_auto_rank_override の設定とランク条件がOKなら // お気にスレ自動画像ランクを上書き更新 if ($rank !== null && - self::isAutoFavRankOverride($icdb->rank, $rank)) { + self::isAutoFavRankOverride($icdb->rank, $rank) + ) { if ($update === null) { $update = new ImageCache2_DataObject_Images(); $update->whereAddQuoted('uri', '=', $v['url']); @@ -1038,8 +1054,8 @@ public function plugin_replaceImageUrl($url, $purl, $str) $update->update(); } - // 画像がキャッシュされていないとき - // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める + // 画像がキャッシュされていないとき + // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める } else { // 画像がブラックリストorエラーログにあるか確認 if (false !== ($errcode = $icdb->ic2_isError($v['url']))) { @@ -1067,22 +1083,24 @@ public function plugin_replaceImageUrl($url, $purl, $str) $backto = ''; } + $result = ""; + if (is_null($img_str)) { $result .= sprintf('[IC2:%s:%s]', - $img_url, - $backto, - p2h($purl['host']), - p2h(basename($purl['path'])) - ); + $img_url, + $backto, + p2h($purl['host']), + p2h(basename($purl['path'])) + ); } $img_title = p2h($purl['host']) - . ' ' - . p2h(basename($purl['path'])); + . ' ' + . p2h(basename($purl['path'])); $result .= "{$img_str}" - //. ' '; + //. ' '; } $linkUrlResult = $this->plugin_linkURL($url, $purl, $str); @@ -1125,35 +1143,37 @@ protected function _quotebackHorizontalListHtml($anchors, $resnum) } $plus = array_unique($plus); $plus_cnt = count(array_diff($plus, $anchors)); - $plus_str = count($plus) > 0 ? '+' . ($plus_cnt > 0 ? $plus_cnt : '') : ''; + $plus_str = count($plus) > 0 ? '+' . ($plus_cnt > 0 ? $plus_cnt : '') : ''; $url = $_conf['read_php'] . '?' . http_build_query(array( - 'host' => $this->thread->host, - 'bbs' => $this->thread->bbs, - 'key' => $this->thread->key, - 'ls' => $resnum, - 'offline' => '1', - 'showbl' => '1', - ), '', '&') . $_conf['k_at_a']; + 'host' => $this->thread->host, + 'bbs' => $this->thread->bbs, + 'key' => $this->thread->key, + 'ls' => $resnum, + 'offline' => '1', + 'showbl' => '1', + ), '', '&') . $_conf['k_at_a']; $suppress = false; $n = 0; $reslist = array(); - foreach($anchors as $anchor) { + foreach ($anchors as $anchor) { if ($anchor == $resnum) continue; $n++; if ($_conf['mobile.backlink_list.suppress'] > 0 - && $n > $_conf['mobile.backlink_list.suppress']) { + && $n > $_conf['mobile.backlink_list.suppress'] + ) { $suppress = true; break; } - $reslist[] = $this->quoteRes('>>'.$anchor, '>>', $anchor); + $reslist[] = $this->quoteRes('>>' . $anchor, '>>', $anchor); } $res_navi = ''; if ($_conf['mobile.backlink_list.openres_navi'] == 1 || ($_conf['mobile.backlink_list.openres_navi'] == 2 - && $suppress === true)) { + && $suppress === true) + ) { if (count($anchors) > 1 || $plus_str) { $res_navi = "(target_at}>" . (count($anchors) > 1 ? count($anchors) : '') diff --git a/lib/bootstrap.php b/lib/bootstrap.php index 5f54e3266..9f117614b 100644 --- a/lib/bootstrap.php +++ b/lib/bootstrap.php @@ -438,7 +438,10 @@ {$_conf['touch_icon_ht']} + + + EOS; @@ -447,7 +450,10 @@ // 強制iPhoneビュー時 } elseif ($_conf['iphone']) { $_conf['extra_headers_ht'] .= << + + EOS; } diff --git a/lib/post_form.inc.php b/lib/post_form.inc.php index b6e3e8d6e..e47ebce8a 100644 --- a/lib/post_form.inc.php +++ b/lib/post_form.inc.php @@ -30,14 +30,14 @@ $htm['k_br'] = ''; $htm['name_label'] = ''; $htm['mail_label'] = ''; - $htm['name_extra_at'] = ' class="formelem maxwidth" placeholder="名前(省略可)" autocorrect="off" autocapitalize="off"'; - $htm['mail_extra_at'] = ' class="formelem maxwidth" placeholder="メール(省略可)" autocorrect="off" autocapitalize="off"'; - $htm['msg_extra_at'] = ' class="formelem maxwidth" placeholder="本文" autocorrect="off" autocapitalize="off"'; + $htm['name_extra_at'] = ' class="form-control form-group" placeholder="名前(省略可)" autocorrect="off" autocapitalize="off"'; + $htm['mail_extra_at'] = ' class="form-control form-group" placeholder="メール(省略可)" autocorrect="off" autocapitalize="off"'; + $htm['msg_extra_at'] = ' class="form-control form-group" placeholder="本文" autocorrect="off" autocapitalize="off"'; $htm['kaiko_on_js_fmt'] = ' onfocus="%1$s" onkeyup="if(%2$s){%1$s}"'; $htm['kaiko_on_js_func'] = sprintf("adjustTextareaRows(this,%d,2); ", $STYLE['post_msg_rows']); - $htm['submit_extra_at'] = ''; + $htm['submit_extra_at'] = 'class="btn form-group"'; if ($_conf['expack.editor.mobile.savedraft'] != '0' && $_conf['expack.editor.mobile.savedraft.interval'] > 0) { $htm['kaiko_on_js_func'] = 'DraftKakiko.startAutoSave(this.form, ' . ($_conf['expack.editor.mobile.savedraft.interval'] * 1000) . '); '.$htm['kaiko_on_js_func']; } @@ -91,7 +91,7 @@ if ((!$_conf['ktai'] && $_conf['expack.editor.savedraft'] != 0) || ($_conf['iphone'] && $_conf['expack.editor.mobile.savedraft'] != 0)) { $savedraft = << + EOP; } elseif ($_conf['ktai'] && $_conf['expack.editor.mobile.savedraft']) { diff --git a/lib/read_header_i.inc.php b/lib/read_header_i.inc.php index 2996994ad..56090e7fe 100644 --- a/lib/read_header_i.inc.php +++ b/lib/read_header_i.inc.php @@ -68,8 +68,7 @@ // {{{ ヘッダ要素 $_conf['extra_headers_ht'] .= << - + EOS; @@ -216,30 +215,8 @@ echo toolbar_i_aborn_button('img/glyphish/icons2/128-bone.png', 'あぼーん', $thread_info); echo ''; -// ログ削除 -echo ''; -if (file_exists($aThread->keydat)) { - $escaped_url = "info.php?{$host_bbs_key_q}{$ttitle_en_q}&dele=1{$_conf['k_at_a']}"; - echo toolbar_i_standard_button('img/glyphish/icons2/64-zap.png', 'ログ削除', $escaped_url); -} else { - echo toolbar_i_disabled_button('img/glyphish/icons2/64-zap.png', 'ログ削除'); -} -echo ''; - -echo ''; - -// }}} - -echo ''; - -// {{{ その他 - SPMフォーム - // IC2リンク、件数 if ($_conf['expack.ic2.enabled'] && $_conf['expack.ic2.thread_imagelink']) { - echo ''; - echo ''; $escaped_url = 'iv2.php?field=memo&keyword=' . rawurlencode($aThread->ttitle) . "&session_no_close=1{$_conf['k_at_a']}"; @@ -264,14 +241,15 @@ echo toolbar_i_opentab_button('img/glyphish/icons2/42-photos.png', '画像', $escaped_url); } - echo '
    '; - echo kspform($aThread); - echo '
    '; -} else { - echo kspform($aThread); + echo ''; } +echo ''; // }}} +echo ''; + echo ''; // }}} @@ -281,6 +259,7 @@ $htm['rf_word_field'] = ResFilterElement::getWordField(array( 'autocorrect' => 'off', 'autocapitalize' => 'off', + 'class' => 'form-control', )); $htm['rf_field_field'] = ResFilterElement::getFieldField(); $htm['rf_method_field'] = ResFilterElement::getMethodField(); @@ -290,10 +269,17 @@ echo <<
    -{$htm['rf_hidden_fields']}{$htm['rf_word_field']} -
    +{$htm['rf_hidden_fields']} +
    +{$htm['rf_word_field']} + + + +
    +
    {$htm['rf_field_field']}に{$htm['rf_method_field']}を{$htm['rf_match_field']} {$htm['rf_include_field']} +
    {$_conf['detect_hint_input_ht']}{$_conf['k_input_ht']}
    diff --git a/lib/read_jump_k.inc.php b/lib/read_jump_k.inc.php index cd7914d14..a6ac08369 100644 --- a/lib/read_jump_k.inc.php +++ b/lib/read_jump_k.inc.php @@ -219,7 +219,7 @@ function _get_read_jump_js(ThreadRead $aThread, $options) global $_conf; return <<{$options} + EOP; } @@ -234,7 +234,7 @@ function _get_read_jump_filter_js(ThreadRead $aThread, $options) global $_conf; return <<{$options} + EOP; } diff --git a/lib/sb_footer_i.inc.php b/lib/sb_footer_i.inc.php index 5175abfb3..b9d37c8a3 100644 --- a/lib/sb_footer_i.inc.php +++ b/lib/sb_footer_i.inc.php @@ -123,12 +123,12 @@ }*/ } - $k_sb_navi_ht = ""; + $k_sb_navi_ht = ""; } if ($sb_all_pages < 2) { $sb_all_pages = 1; - $k_sb_navi_ht = ''; + $k_sb_navi_ht = ''; } // }}} diff --git a/lib/sb_header_i.inc.php b/lib/sb_header_i.inc.php index 6c83f424d..5cae6ca43 100644 --- a/lib/sb_header_i.inc.php +++ b/lib/sb_header_i.inc.php @@ -182,9 +182,11 @@ echo << -{$sb_form_hidden_ht}{$shinchaku_norefresh_ht} -未読数が未満の - +{$sb_form_hidden_ht} +
    +{$shinchaku_norefresh_ht} + +
    EOP; @@ -220,7 +222,7 @@ $htm['change_sort'] .= "bbs}\">"; } -$htm['change_sort'] .= ''; foreach ($sorts as $k => $v) { if ($GLOBALS['now_sort'] == $k) { $sb_sort_selected_at = ' selected'; @@ -241,9 +243,9 @@ } else { $sb_rsort_checked_at = ''; } -$htm['change_sort'] .= ' '; -$htm['change_sort'] .= ' '; +$htm['change_sort'] .= ' '; +$htm['change_sort'] .= ' '; echo $htm['change_sort']; @@ -262,9 +264,15 @@ echo <<
    -{$sb_form_hidden_ht} - - +
    +{$sb_form_hidden_ht} + + + + + + +
    diff --git a/rep2/css/bootstrap.min.css b/rep2/css/bootstrap.min.css new file mode 100644 index 000000000..ed3905e0e --- /dev/null +++ b/rep2/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/rep2/css/iphone.css b/rep2/css/iphone.css index 06fbb6d77..1bb7603e7 100644 --- a/rep2/css/iphone.css +++ b/rep2/css/iphone.css @@ -3,737 +3,703 @@ /* {{{ General */ body { - margin: 0; - padding: 10px; - font-family: sans-serif; - font-size: medium; - line-height: 140%; - color: #000; - background-color: #fafafa; - -webkit-text-size-adjust: none; + margin: 0; + padding: 10px; + font-size: medium; + line-height: 140%; + color: #000; + background-color: #fafafa; + -webkit-text-size-adjust: none; } body > *:first-child { - margin-top: 0 !important; - padding-top: 0 !important; + margin-top: 0 !important; + padding-top: 0 !important; } body > *:last-child { - margin-bottom: 0 !important; - padding-bottom: 0 !important; + margin-bottom: 0 !important; + padding-bottom: 0 !important; } div, h1, h2, h3, h4, h5, h6, li, p { - word-break: normal; - word-wrap: break-word; + word-break: normal; + word-wrap: break-word; } h1, h2, h3, h4, h5, h6, p, form, fieldset { - margin: 8px 0; + margin: 8px 0; } a { - word-break: break-all; + word-break: break-all; } a:link { - color: #0000ff; + color: #0000ff; } /* 左上のTOPボタン */ a#backButton { - position: absolute; - overflow: hidden; - top: 8px; - margin: 0; - left: 6px; right: auto; - height: 30px; - padding-right: 0px; padding-left: 0px; - width: auto; max-width: 100px; - font-family: Helvetica; - line-height: 30px; - font-size: 12px; - font-weight: bold; - text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0; - text-overflow: ellipsis; - text-decoration: none; - white-space: nowrap; - color: #FFFFFF; - border-width: 0 8px 0 14px; - /* background: #333; border-radius: 5px; min-width:46px; text-align:center */ - background: none; - -webkit-border-image: url(../iui/backButton.png?14011419) 0 8 0 14; - border-image: url(../iui/backButton.png?14011419) 0 8 0 14 fill; - -webkit-border-image: -webkit-image-set(url(../iui/backButton.png?14011419) 1x,url(../iui/backButton@2x.png?14011419) 2x,url(../iui/backButton@3x.png?14011419) 3x) 0 8 0 14; - border-image: image-set(url(../iui/backButton.png?14011419) 1x,url(../iui/backButton@2x.png?14011419) 2x,url(../iui/backButton@3x.png?14011419) 3x) 0 8 0 14; + position: absolute; + overflow: hidden; + top: 8px; + margin: 0; + left: 6px; + right: auto; + height: 30px; + padding-right: 0px; + padding-left: 0px; + width: auto; + max-width: 100px; + font-family: Helvetica; + line-height: 30px; + font-size: 12px; + font-weight: bold; + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0; + text-overflow: ellipsis; + text-decoration: none; + white-space: nowrap; + color: #FFFFFF; + border-width: 0 8px 0 14px; + /* background: #333; border-radius: 5px; min-width:46px; text-align:center */ + background: none; + -webkit-border-image: url(../iui/backButton.png?14011419) 0 8 0 14; + border-image: url(../iui/backButton.png?14011419) 0 8 0 14 fill; + -webkit-border-image: -webkit-image-set(url(../iui/backButton.png?14011419) 1x, url(../iui/backButton@2x.png?14011419) 2x, url(../iui/backButton@3x.png?14011419) 3x) 0 8 0 14; + border-image: image-set(url(../iui/backButton.png?14011419) 1x, url(../iui/backButton@2x.png?14011419) 2x, url(../iui/backButton@3x.png?14011419) 3x) 0 8 0 14; } div#toolbar_header { - text-align:right; - padding: 6px; - height: 45px; - box-sizing: border-box; - -webkit-box-sizing: border-box; + text-align: right; + padding: 6px; + height: 45px; + box-sizing: border-box; + -webkit-box-sizing: border-box; } a:visited { - color: #0080ff; + color: #0080ff; } a img { - vertical-align: middle; + vertical-align: middle; } b.filtering, span.matched { - font-weight: bold; + font-weight: bold; } span.label { - cursor: pointer; + cursor: pointer; } div.left, td.left { - text-align: left; + text-align: left; } div.center, td.center { - text-align: center; + text-align: center; } div.right, td.right { - text-align: right; + text-align: right; } p.empty { - margin: 0; - padding: 7px 11px; - background-color: #fff; - color: #333;; + margin: 0; + padding: 7px 11px; + background-color: #fff; + color: #333;; } /* }}} * /* {{{ Res */ textarea#MESSAGE { - padding: 6px; - line-height: 132%; - width: 100%; - box-sizing: border-box; - -webkit-box-sizing: border-box; + padding: 6px; + line-height: 132%; + width: 100%; + box-sizing: border-box; + -webkit-box-sizing: border-box; } + /* }}} * /* {{{ Forms */ -input, select, textarea { - font-size: medium; -} - -input[type="checkbox"] { - width: 24px; - height: 24px; - -webkit-border-radius: 8px; - border-radius: 8px; - vertical-align: middle; -} - -input[type="checkbox"]:checked { - background-color: #808080; - border-color: #555555; -} - -input[type="submit"] { - -moz-user-select: none; - background-color: #808080; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; - color: #fff; - cursor: pointer; - display: inline-block; - font-size: 15px; - font-weight: normal; - padding: 10px; - text-align: center; - touch-action: manipulation; - vertical-align: middle; - white-space: nowrap; -} - -textarea { - padding-left: 5px; - padding-right: 5px; -} - form.inline { - display: inline; - margin: 0 5px; + display: inline; + margin: 0 5px; } form.inline-block { - display: inline-block; - margin: 0 5px; + display: inline-block; + margin: 0 5px; } /* }}} * /* {{{ Navigations */ div.navi, div.pager, div.toolbar { - margin: 5px 0; + margin: 5px 0; } a.button, div.navi a[href]:not(.nobutton), div.pager a[href]:not(.nobutton), -div.toolbar a[href]:not(.nobutton) -{ - display: inline-block; - min-width: 12px; /* 15 * 2 - (8 + 1) * 2 */ - height: 22px; /* 15 * 2 - (3 + 1) * 2 */ - margin: 4px 2px; - padding: 3px 8px; - text-align: center; - vertical-align: middle; - line-height: 150%; - text-decoration: none; - color: #000000; - background: #ffffff url('../img/iphone/btn-bg.png') repeat-x left bottom; - border: #505050 solid 1px; - -webkit-border-radius: 15px; - border-radius: 15px; +div.toolbar a[href]:not(.nobutton) { + display: inline-block; + min-width: 12px; /* 15 * 2 - (8 + 1) * 2 */ + height: 22px; /* 15 * 2 - (3 + 1) * 2 */ + margin: 4px 2px; + padding: 3px 8px; + text-align: center; + vertical-align: middle; + line-height: 150%; + text-decoration: none; + color: #000000; + background: #ffffff url('../img/iphone/btn-bg.png') repeat-x left bottom; + border: #505050 solid 1px; + -webkit-border-radius: 15px; + border-radius: 15px; } span.autosave-info { - font-size: xx-small; - color:#777; + font-size: xx-small; + color: #777; } /* }}} * /* {{{ SPM */ div#spm { - display: none; - position: absolute; - /*width: 300px;*/ - top: 0; - left: 10px; - z-index: 1000; - margin: 5px 0 0 5px; - padding: 0; - color: #ffffff; - background-color: rgba(0, 0, 0, 0.8); - -webkit-box-shadow: rgba(0, 0, 0, 0.7) 0 2px 5px; - box-shadow: rgba(0, 0, 0, 0.7) 0 2px 5px; - -webkit-border-radius: 8px; - border-radius: 8px; + display: none; + position: absolute; + /*width: 300px;*/ + max-width: 300px; + top: 0; + left: 10px; + z-index: 1000; + margin: 5px 0 0 5px; + padding: 2px 4px; + color: #ffffff; + background-color: rgba(0, 0, 0, 0.8); + -webkit-box-shadow: rgba(0, 0, 0, 0.7) 0 2px 5px; + box-shadow: rgba(0, 0, 0, 0.7) 0 2px 5px; + -webkit-border-radius: 8px; + border-radius: 8px; + line-height: 170%; } div#spm span#spm-num { - /*color: #ffffcc;*/ - /*text-decoration: underline;;*/ + /*color: #ffffcc;*/ + /*text-decoration: underline;;*/ } div#spm > div { - margin: 0; - padding: 8px; - line-height: 100%; + margin: 0; + padding: 8px; } -div#spm > div#spm-reply { - text-align: center; - font-size: x-large; - font-weight: bold; - border-bottom-color: rgba(255, 255, 255, 0.80); - border-bottom-style: solid; - border-bottom-width: 1px; -} - -div#spm > div#spm-reply > span#spm-reply-quote { +div#spm > div.spm-section { + white-space: nowrap; + margin: 2px; + padding: 0px; + border-bottom: 1px white solid; + vertical-align: middle; } -div#spm > div#spm-reply > span#spm-reply-noquote { - font-size: large; +div#spm > div#spm-menu > span { + display: block; + white-space: nowrap; + margin: 2px; + padding: 0px 4px; + vertical-align: middle; + text-decoration: none; + color: white; + font-size: large; } div#spm > div#spm-action { - text-align: center; + text-align: center; } div#spm > div#spm-action > select { - background-color: #ffffff; + background-color: #ffffff; } div#spm > img#spm-closer { - cursor: pointer; - position: absolute; - top: -12px; - left: -12px; + cursor: pointer; + position: absolute; + top: -12px; + left: -12px; } /* }}} */ /* {{{ Read */ span.thread_title { - text-align: left; - font-weight: bold; - font-size: 16px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - width: 100%; - box-sizing: border-box; - display: inline-block; + text-align: left; + font-weight: bold; + font-size: 16px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; + box-sizing: border-box; + display: inline-block; } td#thread_title { - text-align: left; - font-weight: bold; - font-size: 14px; - line-height: 14px; + text-align: left; + font-weight: bold; + font-size: 14px; + line-height: 14px; } td#thread_title > div { - padding: 0 0 0 8px; - width: 100%; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; + padding: 0 0 0 8px; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } span.link_right_button { - position: absolute; - text-align: right; - right: 0; - top: 0; - padding: 3px 0; - display: inline-block; + position: absolute; + text-align: right; + right: 0; + top: 0; + padding: 3px 0; + display: inline-block; } div.thread_title { - background-color: #808080; - position: relative; - padding: 4px 0px 4px 4px; + background-color: #808080; + position: relative; + padding: 4px 0px 4px 4px; } h3 > font[color], div > font[color] > b { - color: #252525; + color: #252525; } div:not(.res-header) > span.onthefly { - padding: 2px 4px; - border: #00aa00 solid 1px; - color: #00aa00; - font-style: italic; + padding: 2px 4px; + border: #00aa00 solid 1px; + color: #00aa00; + font-style: italic; } div.res:not(.aborned) { - margin: 0; - padding: 0; - /*border-top: #fff solid 1px;*/ - border-top: #dcdcdc solid 1px; - /*background-color: #FAFAFA;*/ + margin: 0; + padding: 0; + /*border-top: #fff solid 1px;*/ + border-top: #dcdcdc solid 1px; + /*background-color: #FAFAFA;*/ } div.thread > div.res:not(:first-child) { -/* border-top-width: 4px;*/ + /* border-top-width: 4px;*/ } div.res.aborned { - margin: 0; - padding: 0; - font-size: xx-small; - line-height: 100%; + margin: 0; + padding: 0; + font-size: xx-small; + line-height: 100%; } div.res > div.message { - margin: 0; - padding: 5px 10px; - line-height: 140%; - word-break: break-all; + margin: 0; + padding: 5px 10px; + line-height: 140%; + word-break: break-all; } div.res > div.reslist { - margin: 0; - padding: 5px 10px; - line-height: 140%; - word-break: break-all; + margin: 0; + padding: 5px 10px; + line-height: 140%; + word-break: break-all; } div.res > div.res-header { - margin: 0; - padding: 5px; - line-height: 120%; - color: #1144AA; - display: inline-block; - /*border-bottom: #808080 solid 1px;*/ + margin: 0; + padding: 5px; + line-height: 120%; + color: #1144AA; + display: inline-block; + /*border-bottom: #808080 solid 1px;*/ } div.thread > div.res > div.res-header { - /*background-color: #fafafa;*/ + /*background-color: #fafafa;*/ } div.res-header > span.no { } div.res-header > span.no.newres { - color: #ff6600; + color: #ff6600; } div.res-header > span.no.onthefly { - color: #00aa00; + color: #00aa00; } div.res-header > span.no:before { - content: "["; - color: #000000; + content: "["; + color: #000000; } div.res-header > span.no:after { - content: "]"; - color: #000000; + content: "]"; + color: #000000; } div.res-header > span.name { } div.res-header > span.name:after { - content: ":"; + content: ":"; } div.res-header > span.mail { } div.res-header > span.mail:after { - content: ":"; + content: ":"; } div.res-header > span.date-id { } div.respop { - position: absolute; - top: 0; - left: 0; - margin: 0; - padding: 12px 6px 0 14px; + position: absolute; + top: 0; + left: 0; + margin: 0; + padding: 12px 6px 0 14px; } div.respop > div.res { - margin: 0 0 8px 0 !important; - background-color: rgba(255, 255, 250, 0.95) !important; - border: rgba(108, 108, 108, 0.8) solid 1px !important; - -webkit-border-radius: 8px; - border-radius: 8px; - -webkit-box-shadow: rgba(0, 0, 0, 0.7) 0 2px 5px; - box-shadow: rgba(0, 0, 0, 0.7) 0 2px 5px; + margin: 0 0 8px 0 !important; + background-color: rgba(255, 255, 250, 0.95) !important; + border: rgba(108, 108, 108, 0.8) solid 1px !important; + -webkit-border-radius: 8px; + border-radius: 8px; + -webkit-box-shadow: rgba(0, 0, 0, 0.7) 0 2px 5px; + box-shadow: rgba(0, 0, 0, 0.7) 0 2px 5px; } div.respop > div.res > div.res-header { - border-bottom-color: rgba(108, 108, 108, 0.8) !important; + border-bottom-color: rgba(108, 108, 108, 0.8) !important; } div.respop > img.close-button { - cursor: pointer; - position: absolute; - top: 0; - left: 2px; + cursor: pointer; + position: absolute; + top: 0; + left: 2px; } div.respop > div.res > div.respop-back { - margin: 0; - padding: 0; - border-top: rgba(108, 108, 108, 0.8) solid 1px; - text-align: center; + margin: 0; + padding: 0; + border-top: rgba(108, 108, 108, 0.8) solid 1px; + text-align: center; } div.respop > div.res > div.respop-back > a { - display: block; - margin: 0; - padding: 3px; - font-size: small; - text-decoration: none; - color: #252525; + display: block; + margin: 0; + padding: 3px; + font-size: small; + text-decoration: none; + color: #252525; } a.aas { - display: inline-block; - vertical-align: middle; - margin: 0 5px; - padding: 0; - border: #aaaaaa inset 3px; + display: inline-block; + vertical-align: middle; + margin: 0 5px; + padding: 0; + border: #aaaaaa inset 3px; } /* }}} * /* {{{ Subject */ ul.subject { - display: block; - margin: 0; - padding: 0; + display: block; + margin: 0; + padding: 0; } ul.subject > li { - display: block; - margin: 0; - padding: 0; - border-bottom: #e0e0e0 solid 1px; + display: block; + margin: 0; + padding: 0; + border-bottom: #e0e0e0 solid 1px; } ul.subject > li:first-child { - border-top: #e0e0e0 solid 1px; + border-top: #e0e0e0 solid 1px; } ul.subject > li > a { - display: block; - margin: 0; - padding: 8px 10px; - word-break: normal; - font-size: medium; - text-decoration: none; - color: #000000; - background-color: #ffffff; + display: block; + margin: 0; + padding: 8px 10px; + word-break: normal; + font-size: medium; + text-decoration: none; + color: #000000; + background-color: #ffffff; } ul.subject > li > a:link { - color: #000000; - background-color: #ffffff; + color: #000000; + background-color: #ffffff; } ul.subject > li > a:visited { - color: #666666; - background-color: #ffffff; + color: #666666; + background-color: #ffffff; } ul.subject > li > a:active { } ul.subject > li > a:link > span.new { - color: #8C99B4; + color: #8C99B4; } ul.subject > li > a:visited > span.new { - color: #8090B0; + color: #8090B0; } ul.subject > li > a:active > span.new { - color: #ffffff; + color: #ffffff; } ul.subject > li > a > span.info { - display: none; + display: none; } ul.subject > li > a > span.title { - word-break: break-all; - font-size: 15px; - line-height: 127%; - font-weight: bold; + word-break: break-all; + font-size: 15px; + line-height: 127%; + font-weight: bold; } ul.subject > li > a > span.ita { - white-space: nowrap; - color: #666; - font-size: 12px; + white-space: nowrap; + color: #666; + font-size: 12px; } ul.subject > li > a > span.num { - white-space: nowrap; - color: #999999; - font-size: 14px; + white-space: nowrap; + color: #999999; + font-size: 14px; } ul.subject > li > a > span.unread { - padding: 0 4px; - color: #ffffff !important; - background-color: #666666; - -webkit-border-radius: 8px; - border-radius: 8px; + padding: 0 4px; + color: #ffffff !important; + background-color: #666666; + -webkit-border-radius: 8px; + border-radius: 8px; } ul.subject > li > a > span.unread.new { - font-weight: bold; - background-color: #8C99B4; + font-weight: bold; + background-color: #8C99B4; } ul.subject > li > a > span.unread.offline { } ul.subject > li > a > span.count { - white-space: nowrap; - color: #999; - font-size: 14px; + white-space: nowrap; + color: #999; + font-size: 14px; } ul.subject > li > a > span.count:before { - content: "("; + content: "("; } ul.subject > li > a > span.count:after { - content: ")"; + content: ")"; } ul.subject > li > a > span.score { - white-space: nowrap; - color: #666; - font-size: 12px; + white-space: nowrap; + color: #666; + font-size: 12px; } /* }}} */ /* {{{ Pop-up dialog */ div.popup-dialog { - display: none; - position: absolute; - top: 0; - left: 10px; - z-index: 1001; - margin: 5px 0 0 5px; - padding: 0; - max-width: 300px; - color: #ffffff; - background-color: rgba(0, 0, 0, 0.8); - -webkit-box-shadow: rgba(0, 0, 0, 0.7) 0 2px 5px; - box-shadow: rgba(0, 0, 0, 0.7) 0 2px 5px; - -webkit-border-radius: 8px; - border-radius: 8px; + display: none; + position: absolute; + top: 0; + left: 10px; + z-index: 1001; + margin: 5px 0 0 5px; + padding: 0; + max-width: 300px; + color: #ffffff; + background-color: rgba(0, 0, 0, 0.8); + -webkit-box-shadow: rgba(0, 0, 0, 0.7) 0 2px 5px; + box-shadow: rgba(0, 0, 0, 0.7) 0 2px 5px; + -webkit-border-radius: 8px; + border-radius: 8px; } div.popup-dialog > img.close-button { - cursor: pointer; - position: absolute; - top: -12px; - left: -12px; + cursor: pointer; + position: absolute; + top: -12px; + left: -12px; } div.popup-dialog > div { - margin: 0; - font-weight: normal; + margin: 0; + font-weight: normal; } div.popup-dialog > div.popup-dialog-text { - padding: 8px 12px; - text-align: left; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - font-size: 14px !important; - line-height: 14px !important; + padding: 8px 12px; + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: 14px !important; + line-height: 14px !important; } div.popup-dialog > div.popup-dialog-buttons { - padding: 0 12px 8px 12px; - text-align: center; - font-size: 14px !important; - line-height: 14px !important; + padding: 0 12px 8px 12px; + text-align: center; + font-size: 14px !important; + line-height: 14px !important; } div.popup-dialog > div.popup-dialog-buttons > input[type="button"] { - margin: 0; - padding: 0; - width: auto; - height: auto; - font-size: 14px !important; - color: #000000; + margin: 0; + padding: 0; + width: auto; + height: auto; + font-size: 14px !important; + color: #000000; } /* }}} */ /* {{{ Pop-in information */ ul.subject > li.info-pop { - margin: 0; - padding: 10px 5px; - background-color: #333; - color: #ffffff; - font-size: 16px !important; - font-weight: bold; - line-heihgt: 100%; + margin: 0; + padding: 10px 5px; + background-color: #333; + color: #ffffff; + font-size: 16px !important; + font-weight: bold; + line-heihgt: 100%; } ul.subject > li.info-pop > div.info-pop-buttons { - margin: 0; - padding: 0; - width: auto; - text-align: center; - font-size: 14px !important; - line-height: 14px !important; + margin: 0; + padding: 0; + width: auto; + text-align: center; + font-size: 14px !important; + line-height: 14px !important; } ul.subject > li.info-pop > div.info-pop-buttons:not(:first-child) { - margin-top: 10px; + margin-top: 10px; } ul.subject > li.info-pop > div.info-pop-buttons input[type="button"] { - margin: 0; - padding: 0; - width: auto; - height: auto; - font-size: 14px !important; - font-weight: normal; - color: #000000; + margin: 0; + padding: 0; + width: auto; + height: auto; + font-size: 14px !important; + font-weight: normal; + color: #000000; } ul.subject > li.info-pop > table.info-pop-fav { - margin: 10px auto 0 auto; - padding: 0; - width: auto; + margin: 10px auto 0 auto; + padding: 0; + width: auto; } ul.subject > li.info-pop > table.info-pop-fav tbody, ul.subject > li.info-pop > table.info-pop-fav tr { - margin: 0; - padding: 0; + margin: 0; + padding: 0; } ul.subject > li.info-pop > table.info-pop-fav td { - margin: 0; - padding: 2px; - line-height: 100%; - text-align: left; - vertical-align: middle; + margin: 0; + padding: 2px; + line-height: 100%; + text-align: left; + vertical-align: middle; } ul.subject > li.info-pop > table.info-pop-fav td:first-child { - padding-right: 8px; + padding-right: 8px; } /* }}} */ /* {{{ new layout */ body.nopad { - margin: 0; - padding: 0; + margin: 0; + padding: 0; } div.info { - margin: 0; - padding: 5px 10px; - border-top: #808080 solid 1px; - background-color: #ccf; - color: #000; - font-size: 14px; - line-height: 16px; + margin: 0; + padding: 5px 10px; + border-top: #808080 solid 1px; + background-color: #ccf; + color: #000; + font-size: 14px; + line-height: 16px; } a.hoverable { - -webkit-tap-highlight-color: transparent; + -webkit-tap-highlight-color: transparent; } a > img { - border: none; + border: none; } /* }}} */ /* {{{ new toolbar */ div.ntoolbar { - min-width: 320px; - margin: 0; - padding: 0; - background-color: #333; - color: #fff; + min-width: 320px; + margin: 0; + padding: 0; + background-color: #333; + color: #fff; } div.ntoolbar#pager { - background-color: #808080; - color: #fff; + background-color: #808080; + color: #fff; } div.ntoolbar#header { @@ -743,349 +709,343 @@ div.ntoolbar#footer { } h1.ptitle { - margin: 0; - padding: 10px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - text-align: center; - font-weight: bold; - font-size: 16px; - line-height: 16px; + margin: 0; + padding: 10px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-align: center; + font-weight: bold; + font-size: 16px; + line-height: 16px; } h1.ptitle > span.thin { - font-weight: normal; - font-size: 14px; + font-weight: normal; + font-size: 14px; } div.ntoolbar > form, div.ntoolbar > div > form { - margin: 0; - padding: 5px 10px; - border-top: #808080 solid 1px; - font-size: 14px; - line-height: 16px; + margin: 0; + padding: 5px 10px; + border-top: #808080 solid 1px; + font-size: 14px; + line-height: 16px; } div.ntoolbar > div { - margin: 0; - padding: 0; - font-size: 14px; - line-height: 16px; + margin: 0; + padding: 0; + font-size: 14px; + line-height: 16px; } div.ntoolbar > div.hits { - padding: 5px 10px; - border-top: #808080 solid 1px; - background-color: #ffc; - color: #000; + padding: 5px 10px; + border-top: #808080 solid 1px; + background-color: #ffc; + color: #000; } div.ntoolbar > div.extra { - display: none; + display: none; } div.ntoolbar table { - width: 100%; - margin: 0; - padding: 0; - border-collapse: collapse; - empty-cells: show; - table-layout: fixed; + width: 100%; + margin: 0; + padding: 0; + border-collapse: collapse; + empty-cells: show; + table-layout: fixed; } div.ntoolbar td { - position: relative; - width: 20%; - min-width: 64px; - margin: 0; - padding: 4px 0; - text-align: center; - vertical-align: middle; - border-top: #808080 solid 1px; - font-size: 11px; - line-height: 11px; + position: relative; + width: 20%; + min-width: 64px; + margin: 0; + padding: 4px 0; + text-align: center; + vertical-align: middle; + border-top: #808080 solid 1px; + font-size: 11px; + line-height: 11px; } div.ntoolbar#pager td { - padding: 0; - border-top: none; + padding: 0; + border-top: none; } div.ntoolbar td[colspan='2'] { - width: 40%; + width: 40%; } div.ntoolbar td[colspan='3'] { - width: 60%; + width: 60%; } div.ntoolbar td[colspan='4'] { - width: 80%; + width: 80%; } div.ntoolbar td[colspan='5'] { - width: 100%; + width: 100%; } div.ntoolbar td > a { - display: inline-block; - position: relative; - width: 60px; - margin: 0 auto; - padding: 0; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - text-align: center; - text-decoration: none; + display: inline-block; + position: relative; + width: 60px; + margin: 0 auto; + padding: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-align: center; + text-decoration: none; } div.ntoolbar td[colspan] > a { - width: 120px; + width: 120px; } div.ntoolbar a { - text-decoration: none; + text-decoration: none; } div.ntoolbar a:link, div.ntoolbar a:visited { - color: #fff; + color: #fff; } div.ntoolbar a.inactive { - color: #fff; + color: #fff; } + div.ntoolbar span.available { - display: inline-block; + display: inline-block; } + div.ntoolbar span.unavailable { - color: #555; - display: inline-block; + color: #555; + display: inline-block; } div.ntoolbar a.hover, div.ntoolbar a.active, div.ntoolbar a:hover, div.ntoolbar a:active { - color: #b4b4b4; + color: #b4b4b4; } /* バッジの位置決めのためだけ */ div#matome { - display: inline-block; - position: relative; + display: inline-block; + position: relative; } - a > span.badge { - display: inline-block; - position: absolute; - top: 0; - right: 8px; - width: auto; - height: 12px; - margin: 0; - padding: 2px 5px; - -webkit-border-radius: 8px; - border-radius: 8px; - background-color: #8C99B4; - color: #fff; - font-weight: bold; - font-size: 12px; - line-height: 12px; + display: inline-block; + position: absolute; + top: 0; + right: 8px; + width: auto; + height: 12px; + margin: 0; + padding: 2px 5px; + -webkit-border-radius: 8px; + border-radius: 8px; + background-color: #8C99B4; + color: #fff; + font-weight: bold; + font-size: 12px; + line-height: 12px; } a > span.badge.l2 { - right: 5px; + right: 5px; } a > span.badge.l3 { - right: 3px; + right: 3px; } a > span.badge.l4 { - right: 0px; + right: 0px; } a > span.badge.l0 { - display: none; + display: none; } a.hover > span.badge, a.active > span.badge, a:hover > span.badge, a:active > span.badge { - background-color: #36f; + background-color: #36f; } div.ntoolbar a.inactive > img { - filter: alpha(opacity=50); - -ms-filter: "alpha(opacity=50)"; - -moz-opacity:0.5; - opacity:0.5; + filter: alpha(opacity=50); + -ms-filter: "alpha(opacity=50)"; + -moz-opacity: 0.5; + opacity: 0.5; } div.ntoolbar span.unavailable > img { - filter: alpha(opacity=20); - -ms-filter: "alpha(opacity=20)"; - -moz-opacity:0.2; - opacity:0.2; + filter: alpha(opacity=20); + -ms-filter: "alpha(opacity=20)"; + -moz-opacity: 0.2; + opacity: 0.2; } div.ntoolbar a.hover > img, div.ntoolbar a.active > img, div.ntoolbar a:hover > img, div.ntoolbar a:active > img { - filter: alpha(opacity=70); - -ms-filter: "alpha(opacity=70)"; - -moz-opacity:0.7; - opacity:0.7; + filter: alpha(opacity=70); + -ms-filter: "alpha(opacity=70)"; + -moz-opacity: 0.7; + opacity: 0.7; } div.ntoolbar td > select { - font-size: 16px; + font-size: 16px; } div.ntoolbar td > span.large { - font-size: 14px; + font-size: 14px; } /* }}} */ /* {{{ new toolbar / matome */ div.mtoolbar { - position: relative; - min-width: 320px; - margin: 0; - padding: 0; - background-color: #808080; - color: #fff; + position: relative; + min-width: 320px; + margin: 0; + padding: 0; + background-color: #808080; + color: #fff; } div.mtoolbar > .ttitle { - margin: 0 56px 0 0; - padding: 10px 0 10px 10px; - font-weight: bold; + margin: 0 56px 0 0; + padding: 10px 0 10px 10px; + font-weight: bold; } div.mtoolbar > h2.ttitle { - font-size: 14px; - line-height: 16px; + font-size: 14px; + line-height: 16px; } div.mtoolbar > div.ttitle { - font-size: 12px; - line-height: 14px; + font-size: 12px; + line-height: 14px; } div.mtoolbar_top { - border-top: #808080 solid 2px; + border-top: #808080 solid 2px; } div.mtoolbar_bottom { - border-bottom: #808080 solid 1px; + border-bottom: #808080 solid 1px; } div.mtoolbar_bottom > table { - border-bottom: #808080 solid 1px; + border-bottom: #808080 solid 1px; } div.mtoolbar > div.mover { - position: absolute; - right: 8px; + position: absolute; + right: 8px; } div.mtoolbar_top > div.mover { - top: 0; + top: 0; } div.mtoolbar_bottom > div.mover { - bottom: 2px; + bottom: 2px; } div.mtoolbar > .ttitle a { - text-decoration: underline; + text-decoration: underline; } div.mtoolbar > .ttitle > span.btitle { - display: inline-block; - font-weight: normal; + display: inline-block; + font-weight: normal; } /* }}} */ /* {{{ Media Queries for res-popups */ @media screen and (max-width: 320px) { - div.respop { - padding-right: 0; - } + div.respop { + padding-right: 0; + } - div.respop > div.res { - border-right-width: 0 !important; - -webkit-border-top-right-radius: 0; - border-top-right-radius: 0; - -webkit-border-right-left-radius: 0; - border-bottom-right-radius: 0; - } + div.respop > div.res { + border-right-width: 0 !important; + -webkit-border-top-right-radius: 0; + border-top-right-radius: 0; + -webkit-border-right-left-radius: 0; + border-bottom-right-radius: 0; + } } /* }}} */ /* {{{ Media Queries for toolbar items */ @media screen and (min-width: 340px) { - div.ntoolbar td > a { - width: 64px; - } + div.ntoolbar td > a { + width: 64px; + } } @media screen and (min-width: 360px) { - div.ntoolbar td > a { - width: 68px; - } - a > span.badge { - right: 8px !important; - } + div.ntoolbar td > a { + width: 68px; + } + + a > span.badge { + right: 8px !important; + } } @media screen and (min-width: 400px) { - div.ntoolbar td > a { - width: 76px; - } - a > span.badge { - right: 16px !important; - } + div.ntoolbar td > a { + width: 76px; + } + + a > span.badge { + right: 16px !important; + } } @media screen and (min-width: 480px) { - div.ntoolbar td > a { - width: 92px; - } - a > span.badge { - right: 24px !important; - } + div.ntoolbar td > a { + width: 92px; + } + + a > span.badge { + right: 24px !important; + } } +.btn { + background-color: #999999; +} .maxwidth { width: 98%; } -.formelem { - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset; - color: #000; - display: block; - margin-bottom: 15px; - padding: 6px 12px; - transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s; -} - /* }}} */ /* diff --git a/rep2/js/bootstrap.min.js b/rep2/js/bootstrap.min.js new file mode 100644 index 000000000..9bcd2fcca --- /dev/null +++ b/rep2/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
    ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/rep2/js/jquery-3.2.1.min.js b/rep2/js/jquery-3.2.1.min.js new file mode 100644 index 000000000..644d35e27 --- /dev/null +++ b/rep2/js/jquery-3.2.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="
    ",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), +a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), +null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" \n EOP; @@ -114,7 +115,6 @@ if (!$_conf['ktai'] || $_conf['iphone']) { echo << - \n EOP; diff --git a/rep2/read_filter_k.php b/rep2/read_filter_k.php index 61c379aef..f41f37354 100644 --- a/rep2/read_filter_k.php +++ b/rep2/read_filter_k.php @@ -23,6 +23,7 @@ $word_field_ht = ResFilterElement::getWordField(array( 'autocorrect' => 'off', 'autocapitalize' => 'off', + 'class' => 'form-control', )); } else { $word_field_ht = ResFilterElement::getWordField(); diff --git a/rep2/read_new_k.php b/rep2/read_new_k.php index b831c7cd3..91fa896cd 100644 --- a/rep2/read_new_k.php +++ b/rep2/read_new_k.php @@ -130,7 +130,6 @@ // iPhone if ($_conf['iphone']) { $_conf['extra_headers_ht'] .= << EOS; From b4bf5d56148529534a4a0a3582374fe5c1fb8e5d Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Thu, 28 Sep 2017 13:39:59 +0900 Subject: [PATCH 234/339] =?UTF-8?q?rss=E3=83=AA=E3=83=BC=E3=83=80=E3=83=BC?= =?UTF-8?q?=E3=81=8C=E5=8B=95=E4=BD=9C=E3=81=97=E3=81=AA=E3=81=84=E4=B8=8D?= =?UTF-8?q?=E5=85=B7=E5=90=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/expack/rss/parser.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/expack/rss/parser.inc.php b/lib/expack/rss/parser.inc.php index af84ab00a..d8da961fc 100644 --- a/lib/expack/rss/parser.inc.php +++ b/lib/expack/rss/parser.inc.php @@ -50,7 +50,7 @@ function p2GetRSS($remotefile, $atom = 0) } // If-Modified-Sinceつきでダウンロード(ファイルが無いか、古いか、強制リロードのとき) - $cache_time = ($refresh) ? 0 : $_conf['expack.rss.check_interval'] * 60); + $cache_time = ($refresh) ? 0 : ($_conf['expack.rss.check_interval'] * 60); $dl = P2Commun::fileDownload($remotefile, $localpath,$cache_time, true, true); // キャッシュが更新されなかったか、ダウンロード成功ならRSSをパース From 414473e43a112924b1147faa7a21253f6b4f764d Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 1 Oct 2017 22:27:40 +0900 Subject: [PATCH 235/339] =?UTF-8?q?jQuery=E3=81=8C=E4=BA=8C=E9=87=8D?= =?UTF-8?q?=E3=81=AB=E8=AA=AD=E3=81=BF=E8=BE=BC=E3=81=BE=E3=82=8C=E3=82=8B?= =?UTF-8?q?=E4=B8=8D=E5=85=B7=E5=90=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/iv2.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/rep2/iv2.php b/rep2/iv2.php index 46a8380e8..934ff30b3 100644 --- a/rep2/iv2.php +++ b/rep2/iv2.php @@ -30,7 +30,6 @@ $_conf['extra_headers_ht'] .= << - @@ -39,7 +38,6 @@ $_conf['extra_headers_xht'] .= << - @@ -997,11 +995,8 @@ function iv2_sqlite_unix2date($ts) $flexy->setData('page', $page); $flexy->setData('move', $qfObj); $flexy->setData('lightbox', $lightbox); -if ($enable_zip) { $flexy->setData('jquery', $_conf['jquery_version']); -} else { $flexy->setData('jquery', null); -} // ページを表示 P2Util::header_nocache(); From 231de6e53ed2ad7fad956a57b7b53cd50d29d43f Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 1 Oct 2017 22:37:19 +0900 Subject: [PATCH 236/339] =?UTF-8?q?5ch=E6=9A=AB=E5=AE=9A=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 241 ++++++++++++++++++++++++------------------------- 1 file changed, 119 insertions(+), 122 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index c9b1cd6da..05fb850b0 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -130,11 +130,11 @@ static private function encodeCookieName($key) * setcookie() では、auで必要なmax ageが設定されないので、こちらを利用する * * @access public - * @param string $key - * @param string $value - * @param int $expires - * @param string $path - * @param string $domain + * @param string $key + * @param string $value + * @param int $expires + * @param string $path + * @param string $domain * @param boolean $secure * @param boolean $httponly * @return boolean @@ -168,14 +168,14 @@ static public function setCookie($key, $value = '', $expires = null, $path = '', } header( - 'Set-Cookie: '. self::encodeCookieName($key) . '=' . rawurlencode($value) - . (empty($domain) ? '' : '; Domain=' . $domain) - . (empty($expires) ? '' : '; expires=' . gmdate('D, d-M-Y H:i:s', $expires) . ' GMT') - . (empty($maxage) ? '' : '; Max-Age=' . $maxage) - . (empty($path) ? '' : '; Path=' . $path) - . (!$secure ? '' : '; Secure') - . (!$httponly ? '' : '; HttpOnly'), - $replace = false + 'Set-Cookie: ' . self::encodeCookieName($key) . '=' . rawurlencode($value) + . (empty($domain) ? '' : '; Domain=' . $domain) + . (empty($expires) ? '' : '; expires=' . gmdate('D, d-M-Y H:i:s', $expires) . ' GMT') + . (empty($maxage) ? '' : '; Max-Age=' . $maxage) + . (empty($path) ? '' : '; Path=' . $path) + . (!$secure ? '' : '; Secure') + . (!$httponly ? '' : '; HttpOnly'), + $replace = false ); return true; @@ -187,9 +187,9 @@ static public function setCookie($key, $value = '', $expires = null, $path = '', /** * クッキーを消去する。変数 $_COOKIE も。 * - * @param string $key key, k1[k2] - * @param string $path - * @param string $domain + * @param string $key key, k1[k2] + * @param string $path + * @param string $domain * @return boolean */ static public function unsetCookie($key, $path = '', $domain = null) @@ -270,7 +270,7 @@ static public function checkDirWritable($aDir) //$info_msg_ht .= "ディレクトリを自動作成できませんでした。
    手動でディレクトリを作成し、パーミッションを設定して下さい。"; } } else { - //$info_msg_ht .= "ディレクトリを作成し、パーミッションを設定して下さい。"; + //$info_msg_ht .= "ディレクトリを作成し、パーミッションを設定して下さい。"; } //$info_msg_ht .= '

    '; @@ -295,9 +295,9 @@ static public function cacheFileForDL($url) $parsed = parse_url($url); // URL分解 - $save_uri = isset($parsed['host']) ? $parsed['host'] : ''; - $save_uri .= isset($parsed['port']) ? ':' . $parsed['port'] : ''; - $save_uri .= isset($parsed['path']) ? $parsed['path'] : ''; + $save_uri = isset($parsed['host']) ? $parsed['host'] : ''; + $save_uri .= isset($parsed['port']) ? ':' . $parsed['port'] : ''; + $save_uri .= isset($parsed['path']) ? $parsed['path'] : ''; $save_uri .= isset($parsed['query']) ? '?' . $parsed['query'] : ''; $cachefile = $_conf['cache_dir'] . '/' . $save_uri; @@ -382,26 +382,26 @@ static private function _p2DirOfHost($base_dir, $host, $dir_sep = true) if (self::isHost2chs($host)) { $host_dir = $base_dir . DIRECTORY_SEPARATOR . '2channel'; - // machibbs.com + // machibbs.com } elseif (self::isHostMachiBbs($host)) { $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'machibbs.com'; - // tor + // tor } elseif (self::isHostTor($host)) { $tor_host = preg_replace('/\.onion\.(\w+)$/', '.onion', $host); $host_dir = $base_dir . DIRECTORY_SEPARATOR . $tor_host; unset($tor_host); - // jbbs.livedoor.jp (livedoor レンタル掲示板) + // jbbs.livedoor.jp (livedoor レンタル掲示板) } elseif (self::isHostJbbsShitaraba($host)) { if (DIRECTORY_SEPARATOR == '/') { $host_dir = $base_dir . DIRECTORY_SEPARATOR . $host; } else { $host_dir = $base_dir . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $host); } - // vip.2ch.com + // vip.2ch.com } elseif (self::isHostVip2ch($host)) { - $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'ex14.vip2ch.com'; + $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'ex14.vip2ch.com'; - // livedoor レンタル掲示板以外でスラッシュ等の文字を含むとき + // livedoor レンタル掲示板以外でスラッシュ等の文字を含むとき } elseif (preg_match('/[^0-9A-Za-z.\\-_]/', $host)) { $host_dir = $base_dir . DIRECTORY_SEPARATOR . rawurlencode($host); /* @@ -416,7 +416,7 @@ static private function _p2DirOfHost($base_dir, $host, $dir_sep = true) } */ - // その他 + // その他 } else { $host_dir = $base_dir . DIRECTORY_SEPARATOR . $host; } @@ -536,7 +536,7 @@ static public function getKeyPath($base_dir, $key, $extension = '') } return $old_path; - } + } // }}} // {{{ getDatPath() @@ -631,14 +631,14 @@ static public function getListNaviRange($disp_from, $disp_range, $disp_all_num) { if (!$disp_all_num) { return array( - 'all_once' => true, - 'from' => 0, - 'end' => 0, - 'limit' => 0, - 'offset' => 0, - 'mae_from' => 1, + 'all_once' => true, + 'from' => 0, + 'end' => 0, + 'limit' => 0, + 'offset' => 0, + 'mae_from' => 1, 'tugi_from' => 1, - 'range_st' => '-', + 'range_st' => '-', ); } @@ -654,7 +654,7 @@ static public function getListNaviRange($disp_from, $disp_range, $disp_all_num) $disp_navi['from'] = max(1, $disp_all_num - $disp_range); $disp_navi['end'] = $disp_all_num; - // from 越えない + // from 越えない } else { $disp_navi['end'] = $disp_navi['from'] + $disp_range; @@ -690,7 +690,7 @@ static public function getListNaviRange($disp_from, $disp_range, $disp_all_num) /** * key.idx に data を記録する * - * @param array $data 要素の順番に意味あり。 + * @param array $data 要素の順番に意味あり。 */ static public function recKeyIdx($keyidx, $data) { @@ -699,7 +699,7 @@ static public function recKeyIdx($keyidx, $data) // 基本は配列で受け取る if (is_array($data)) { $cont = implode('<>', $data); - // 旧互換用にstringも受付 + // 旧互換用にstringも受付 } else { $cont = rtrim($data); } @@ -719,8 +719,8 @@ static public function recKeyIdx($keyidx, $data) /** * 中継ゲートを通すためのURL変換 * - * @param string $url - * @param int $delay 負数の場合は手動転送、それ以外はゲートの仕様による + * @param string $url + * @param int $delay 負数の場合は手動転送、それ以外はゲートの仕様による * @return string */ static public function throughIme($url, $delay = null) @@ -738,8 +738,8 @@ static public function throughIme($url, $delay = null) /** * URL変換の設定をする * - * @param string $type - * @param array $exceptions + * @param string $type + * @param array $exceptions * @param boolean $ignoreHttp * @return void * @see P2Ime::__construct() @@ -793,7 +793,7 @@ static public function isHostExample($host) static public function isHost2chs($host) { if (!array_key_exists($host, self::$_hostIs2chs)) { - self::$_hostIs2chs[$host] = (bool)preg_match('<^\\w+\\.(?:2ch\\.net|bbspink\\.com)$>', $host); + self::$_hostIs2chs[$host] = (bool)preg_match('<^\\w+\\.(?:2ch\\.net|5ch\\.net|bbspink\\.com)$>', $host); } return self::$_hostIs2chs[$host]; } @@ -807,13 +807,13 @@ static public function isHost2chs($host) * @param string $host * @return bool */ - static public function isHostVip2ch($host) - { - if (!array_key_exists($host, self::$_hostIsVip2ch)) { - self::$_hostIsVip2ch[$host] = (bool)preg_match('<^\\w+\\.(?:vip2ch\\.com)$>', $host); - } - return self::$_hostIsVip2ch[$host]; - } + static public function isHostVip2ch($host) + { + if (!array_key_exists($host, self::$_hostIsVip2ch)) { + self::$_hostIsVip2ch[$host] = (bool)preg_match('<^\\w+\\.(?:vip2ch\\.com)$>', $host); + } + return self::$_hostIsVip2ch[$host]; + } // }}} // {{{ isHostBe2chNet() @@ -826,7 +826,7 @@ static public function isHostVip2ch($host) */ static public function isHostBe2chNet($host) { - return ($host == 'be.2ch.net'); + return ($host == 'be.2ch.net' || $host == 'be.5ch.net'); /* if (!array_key_exists($host, self::$_hostIsBe2chNet)) { self::$_hostIsBe2chNet[$host] = ($host == 'be.2ch.net'); @@ -846,7 +846,7 @@ static public function isHostBe2chNet($host) */ static public function isNotUse2chAPI($host) { - return ($host == 'qb5.2ch.net' || $host == 'carpenter.2ch.net'); + return ($host == 'qb5.2ch.net' || $host == 'carpenter.2ch.net' || $host == 'qb5.5ch.net' || $host == 'carpenter.5ch.net'); } // }}} @@ -870,15 +870,15 @@ static public function isHostBbsPink($host) // {{{ isHostTor() /** - * host が tor 系板 なら true を返す - * - * @access public - * @param string $host - * @return boolean - */ + * host が tor 系板 なら true を返す + * + * @access public + * @param string $host + * @return boolean + */ static function isHostTor($host, $isGatewayMode = 99) { - switch($isGatewayMode){ + switch ($isGatewayMode) { case 0: $ret = (bool)preg_match('/\\.onion$/', $host); break; @@ -890,9 +890,9 @@ static function isHostTor($host, $isGatewayMode = 99) default: $ret = (bool)preg_match('/\\.(onion\\.cab|onion\\.city|onion\\.direct|onion\\.link|onion\\.nu|onion\\.to|onion\\.rip|onion)$/', $host); break; - } + } - return $ret; + return $ret; } // }}} @@ -962,7 +962,7 @@ static public function isHostJbbsShitaraba($in_host) /** * livedoor レンタル掲示板 : したらばのホスト名変更に対応して変更する * - * @param string $in_str ホスト名でもURLでもなんでも良い + * @param string $in_str ホスト名でもURLでもなんでも良い * @return string */ static public function adjustHostJbbs($in_str) @@ -1121,7 +1121,7 @@ static public function recAccessLog($logfile, $maxline = 100, $format = 'dataphp if ($lines) { // 制限行調整 - while (sizeof($lines) > $maxline -1) { + while (sizeof($lines) > $maxline - 1) { array_pop($lines); } } else { @@ -1329,7 +1329,7 @@ static public function print403($msg = '') ERR; // IEデフォルトのメッセージを表示させないようにスペースを出力 if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) { - for ($i = 0 ; $i < 512; $i++) { + for ($i = 0; $i < 512; $i++) { echo ' '; } } @@ -1376,11 +1376,11 @@ static public function scandir_r($dir) * * $targetDirから最終更新より$lifeTime秒以上たったファイルを削除 * - * @param string $targetDir ガーベッジコレクション対象ディレクトリ - * @param integer $lifeTime ファイルの有効期限(秒) - * @param string $prefix 対象ファイル名の接頭辞(オプション) - * @param string $suffix 対象ファイル名の接尾辞(オプション) - * @param boolean $recurive 再帰的にガーベッジコレクションするか否か(デフォルトではfalse) + * @param string $targetDir ガーベッジコレクション対象ディレクトリ + * @param integer $lifeTime ファイルの有効期限(秒) + * @param string $prefix 対象ファイル名の接頭辞(オプション) + * @param string $suffix 対象ファイル名の接尾辞(オプション) + * @param boolean $recurive 再帰的にガーベッジコレクションするか否か(デフォルトではfalse) * @return array 削除に成功したファイルと失敗したファイルを別々に記録した二次元の配列 */ static public function garbageCollection($targetDir, @@ -1388,7 +1388,7 @@ static public function garbageCollection($targetDir, $prefix = '', $suffix = '', $recursive = false - ) + ) { $result = array('successed' => array(), 'failed' => array(), 'skipped' => array()); $expire = time() - $lifeTime; @@ -1401,7 +1401,9 @@ static public function garbageCollection($targetDir, $files = array(); $targetDir = realpath($targetDir) . DIRECTORY_SEPARATOR; foreach ($list as $filename) { - if ($filename == '.' || $filename == '..') { continue; } + if ($filename == '.' || $filename == '..') { + continue; + } $files[] = $targetDir . $filename; } } @@ -1471,8 +1473,8 @@ static public function session_gc() * (バージョン1.0.0以降、Var_Dump::display() の第二引数が真のとき * 直接表示する代わりに、ダンプ結果が文字列として返る。) * - * @param array $info テーブルにしたい配列 - * @param integer $indent 結果のHTMLを見やすくするためのインデント量 + * @param array $info テーブルにしたい配列 + * @param integer $indent 結果のHTMLを見やすくするためのインデント量 * @return string ~
    */ static public function Info_Dump($info, $indent = 0) @@ -1481,16 +1483,18 @@ static public function Info_Dump($info, $indent = 0) $n = count($info); foreach ($info as $key => $value) { if (!is_object($value) && !is_resource($value)) { - for ($i = 0; $i < $indent; $i++) { $table .= "\t"; } + for ($i = 0; $i < $indent; $i++) { + $table .= "\t"; + } if ($n == 1 && $key === 0) { $table .= ''; - /*} elseif (preg_match('/^\w+$/', $key)) { - $table .= '' . $key . '';*/ + /*} elseif (preg_match('/^\w+$/', $key)) { + $table .= '' . $key . '';*/ } else { $table .= '' . $key . ''; } if (is_array($value)) { - $table .= self::Info_Dump($value, $indent+1); //配列の場合は再帰呼び出しで展開 + $table .= self::Info_Dump($value, $indent + 1); //配列の場合は再帰呼び出しで展開 } elseif ($value === true) { $table .= 'true'; } elseif ($value === false) { @@ -1516,7 +1520,9 @@ static public function Info_Dump($info, $indent = 0) $table .= '' . "\n"; } } - for ($i = 1; $i < $indent; $i++) { $table .= "\t"; } + for ($i = 1; $i < $indent; $i++) { + $table .= "\t"; + } $table .= ''; $table = str_replace('', ' - + diff --git a/rep2/spm_k.php b/rep2/spm_k.php index 6bc006da4..e0c111d4a 100644 --- a/rep2/spm_k.php +++ b/rep2/spm_k.php @@ -33,6 +33,7 @@ case 'res_quote': $_GET['resnum'] = $ktv; $_GET['inyou'] = ($_GET['ktool_name'] == 'res') ? -1 : 1; + $_GET['popup'] = 1; include $www_dir_s . 'post_form.php'; exit; case 'copy_quote': From 6b91b7f7d2fed3298778f624a6f0f7e229ddbdf0 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Fri, 13 Oct 2017 01:34:11 +0900 Subject: [PATCH 267/339] =?UTF-8?q?bintan=20=E8=AA=AD=E3=81=BF=E8=BE=BC?= =?UTF-8?q?=E3=81=BF=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index cc08dbf9e..380c324b0 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1885,13 +1885,21 @@ static public function detectThread($url = null) } // 2ch or pink by ula.cc(bintan / bekkanko) - http://choco.2ch.net/test/read.cgi/event/1027770702/ - } elseif (preg_match('<^https?://(?:(?:bintan|same)\\.ula\\.cc|ula\\.2ch\\.net)/test/(?:read\\.(?:cgi|html|so)|r\\.so) + } elseif (preg_match('<^https?://(?:(?:bintan|same)\\.ula\\.cc|ula\\.(?:2ch|5ch)\\.net)/test/(?:read\\.(?:cgi|html|so)|r\\.so) /(.+)/(\\w+)/([0-9]+)(?:/([^/]*))>x', $nama_url, $matches)) { $host = $matches[1]; $bbs = $matches[2]; $key = $matches[3]; $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; + // 2ch or pink by ula.cc(new bintan) - http://choco.2ch.net/test/read.cgi/event/1027770702/ + } elseif (preg_match('<^https?://(ula\\.(?:2ch|5ch)\\.net)/(?:2ch|5ch) + /(\\w+)/(.+)/(\\d+)(?:/([^/]*))>x', $nama_url, $matches)) { + $host = $matches[3]; + $bbs = $matches[2]; + $key = $matches[4]; + $ls = (isset($matches[5]) && strlen($matches[5])) ? $matches[5] : ''; + // 2ch or pink 過去ログhtml - http://pc.2ch.net/mac/kako/1015/10153/1015358199.html } elseif (preg_match('<^(https?://(.+)(?:/[^/]+)?/(\\w+) /kako/\\d+(?:/\\d+)?/(\\d+)).html>x', $nama_url, $matches)) { From e9538e7a089d5228b4fc570dc19180eb75989303 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Fri, 13 Oct 2017 22:27:37 +0900 Subject: [PATCH 268/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=EF=BC=9Amb?= =?UTF-8?q?=5Fconvert=5Fvariables=E3=81=8C=E5=A4=9A=E6=AC=A1=E5=85=83?= =?UTF-8?q?=E9=85=8D=E5=88=97=E3=81=AB=E5=AF=BE=E5=BF=9C=E3=81=97=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=81=AA=E3=81=84=E3=81=AE=E3=81=A7=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=20=E3=82=B9=E3=83=9E=E3=83=9B=EF=BC=9A=E6=9B=B8=E3=81=8D?= =?UTF-8?q?=E8=BE=BC=E3=81=BF=E6=99=82=E3=81=AB=E3=83=AA=E3=83=AD=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=81=97=E3=81=AA=E3=81=84=E4=B8=8D=E5=85=B7=E5=90=88?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/info_js.php | 8 +++++++- rep2/post.php | 9 ++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/rep2/info_js.php b/rep2/info_js.php index 85cb56485..49fcee513 100644 --- a/rep2/info_js.php +++ b/rep2/info_js.php @@ -62,7 +62,13 @@ function info_js_get_thread_info($host, $bbs, $key) */ function info_js_json_encode($values) { - mb_convert_variables('UTF-8', 'CP932', $values); + // mb_convert_variablesは本来多次元配列での動作を保証していないので + // array_walk_recursiveで回す。 + // array_walk_recursiveも多次元配列対応してないはずだけどとりあえず動く。。。 + // https://bugs.php.net/bug.php?id=66964 + array_walk_recursive($values, function(&$value) { + mb_convert_variables('UTF-8', 'CP932', $value); + }); return json_encode($values); } diff --git a/rep2/post.php b/rep2/post.php index fd759938d..2c8970e40 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -592,9 +592,16 @@ function showPostMsg($isDone, $result_msg, $reload) } $kakunin_ht = ''; } else { - $kakunin_ht = <<確認

    EOP; + } } echo "\n"; From 547d9609859dcc006460051dcf170b195888c4b1 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Fri, 13 Oct 2017 22:35:13 +0900 Subject: [PATCH 269/339] v171013.2230 --- conf/conf.inc.php | 2 +- doc/README-774.txt | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 615d2c193..e61474980 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '171011.1515', // rep2のバージョン + 'p2version' => '171013.2230', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index 772beec6b..258d33951 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -72,6 +72,13 @@ PHP7 ●ChangeLog +171013.2230 +* スマホ:一部の環境でスワイプメニューが動作しない不具合修正 +* スマホ:res_popup_reloadの設定が反映されない不具合修正 +* PHP7.1でスレタイ検索を使用するとWarningが出る不具合修正 +* cURLMultiが有るのでfetch-subject-txt.phpのPECL_HTTPチェックを削除 +* expack.ic2.enabledを2にした環境でPCからアクセスするとfatal errorが出る不具合修正 + 171011.1515 * スマホ用readのツールバーをポップアップメニュー形式に変更 * スマホ用readの外部リンクにtarget="_blank"を指定 From b6046eec6dc40ed1c0172ec68a9d974b8f797a5a Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Sat, 14 Oct 2017 21:40:06 +0900 Subject: [PATCH 270/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=EF=BC=9A?= =?UTF-8?q?=E6=96=B0=E7=9D=80=E3=81=BE=E3=81=A8=E3=82=81=E8=AA=AD=E3=81=BF?= =?UTF-8?q?=E3=81=8B=E3=82=89=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=82=93=E3=81=A0?= =?UTF-8?q?=E9=9A=9B=E3=81=AB=E3=83=AA=E3=83=AD=E3=83=BC=E3=83=89=E3=81=97?= =?UTF-8?q?=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=20=E6=96=B0=E7=9D=80=E3=81=BE=E3=81=A8=E3=82=81=E8=AA=AD?= =?UTF-8?q?=E3=81=BF=E3=81=8B=E3=82=89=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=82=93?= =?UTF-8?q?=E3=81=A0=E9=9A=9B=E3=81=AB=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=81=BF?= =?UTF-8?q?=E3=82=A6=E3=82=A4=E3=83=B3=E3=83=89=E3=82=A6=E3=81=8C=E6=B6=88?= =?UTF-8?q?=E3=81=88=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThreadI.php | 4 ++-- rep2/js/spm_iphone.js | 23 +++++++++++++++++++++++ rep2/post.php | 24 ++++++++++++++---------- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/lib/ShowThreadI.php b/lib/ShowThreadI.php index 038a13f02..9d072354d 100644 --- a/lib/ShowThreadI.php +++ b/lib/ShowThreadI.php @@ -581,8 +581,8 @@ static public function getSpmElementHtml()
    >>???
    - これにレス - 引用してレス + これにレス + 引用してレス EOP; if ($_conf['expack.aas.enabled']) { $spm .= <<タグ内もCDATAとして扱われるため、&にしてはいけない $location_noenc = str_replace('&', '&', $location_ht); + // ポップアップは自動的に閉じるコードを追加 if ($popup) { $popup_ht = << // EOJS; } else { + // ポップアップでは無いときは丸ごとリロード $_conf['extra_headers_ht'] .= << EOP; @@ -587,15 +594,12 @@ function showPostMsg($isDone, $result_msg, $reload) EOSCRIPT; } - if ($reload) { - echo $popup_ht; - } + + echo $popup_ht; $kakunin_ht = ''; } else { if($_conf['iphone']) { - if ($reload) { - echo $popup_ht; - } + echo $popup_ht; $kakunin_ht = ''; } else { $kakunin_ht = << Date: Sun, 15 Oct 2017 10:14:03 +0900 Subject: [PATCH 271/339] =?UTF-8?q?PC:subject=E3=81=AE=E3=83=81=E3=82=A7?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=83=9C=E3=83=83=E3=82=AF=E3=82=B9=E3=81=8C?= =?UTF-8?q?=E6=A9=9F=E8=83=BD=E3=81=97=E3=81=AA=E3=81=84=E4=B8=8D=E5=85=B7?= =?UTF-8?q?=E5=90=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/sb_print.inc.php | 2 +- rep2/js/subject.js | 18 ++++++------------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/lib/sb_print.inc.php b/lib/sb_print.inc.php index 9655424fd..90c0ad617 100644 --- a/lib/sb_print.inc.php +++ b/lib/sb_print.inc.php @@ -160,7 +160,7 @@ function sb_print($aThreadList) // チェックボックス if ($checkbox_bool) { echo <<\n +\n EOP; } // No. diff --git a/rep2/js/subject.js b/rep2/js/subject.js index fad98fbbf..eb64127c4 100644 --- a/rep2/js/subject.js +++ b/rep2/js/subject.js @@ -124,18 +124,6 @@ rep2.subject.resizeTitleCell = function () { } }; -// }}} -// {{{ rep2.subject.checkAll() - -rep2.subject.checkAll = function () { - var checkboxes = $('.threadlist input:checkbox[name!=allbox]'); - if ($('#allbox').attr('checked')) { - checkboxes.attr('checked', 'checked'); - } else { - checkboxes.removeAttr('checked'); - } -}; - // }}} // {{{ rep2.subject.offRecent() @@ -234,9 +222,11 @@ rep2.subject.setup = function (group_number) { }); // IE対策 + /* jQuery3.xで削除されたのでコメントアウト if ($.browser.msie) { cells.contents().filter('[nodeType=3]').wrap(''); } + */ }; // }}} @@ -259,6 +249,10 @@ $(document).ready(function(){ i = 0; } + $('#allbox').on('change', function() { + $('.threadlist input:checkbox[name!=allbox]').prop('checked', this.checked); + }); + _.setWindowTitle(); _.resizeTitleCell(); From 043da7f68d4ac415c449bcc88733ed1d6927af86 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Sun, 15 Oct 2017 22:01:42 +0900 Subject: [PATCH 272/339] =?UTF-8?q?2chapi=5Fpost=E3=81=8CON=E3=81=AE?= =?UTF-8?q?=E6=99=82=E3=81=AF=E3=80=81=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=81=BF?= =?UTF-8?q?=E6=99=82=E3=81=AB=E6=B5=AA=E4=BA=BA=E3=83=AD=E3=82=B0=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=81=97=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/post.php | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/rep2/post.php b/rep2/post.php index 55273465d..cb68da647 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -154,12 +154,19 @@ // {{{ 2chで●ログイン中ならsid追加 -if (!empty($_POST['maru']) and P2Util::isHost2chs($host) && file_exists($_conf['sid2ch_php'])) { +if (!empty($_POST['maru']) and P2Util::isHost2chs($host)) { + $maru_time = 0; + + if (file_exists($_conf['sid2ch_php'])) { + $maru_time = filemtime($_conf['sid2ch_php']); + } // ログイン後、24時間以上経過していたら自動再ログイン - if (file_exists($_conf['idpw2ch_php']) && filemtime($_conf['sid2ch_php']) < time() - 60*60*24) { - require_once P2_LIB_DIR . '/login2ch.inc.php'; - login2ch(); + if (file_exists($_conf['idpw2ch_php']) && $maru_time < time() - 60*60*24) { + if($_conf['2chapi_use'] == 0 && $_conf['2chapi_post'] == 0) { + require_once P2_LIB_DIR . '/login2ch.inc.php'; + login2ch(); + } } if($_conf['2chapi_use'] == 1 && $_conf['2chapi_post'] ==1) { From 1fbbf71d2213cda9fb7d663516ab621a9ffc9607 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Mon, 16 Oct 2017 00:32:45 +0900 Subject: [PATCH 273/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=20read?= =?UTF-8?q?=EF=BC=9A=E3=83=9D=E3=83=83=E3=83=97=E3=82=A2=E3=83=83=E3=83=97?= =?UTF-8?q?=E3=81=AE=E9=96=89=E3=81=98=E3=82=8B=E3=83=9C=E3=82=BF=E3=83=B3?= =?UTF-8?q?=E3=82=92=E6=8A=BC=E3=81=97=E3=81=9F=E9=9A=9B=E3=81=AB=E4=BB=96?= =?UTF-8?q?=E3=81=AE=E3=83=9D=E3=83=83=E3=83=97=E3=82=A2=E3=83=83=E3=83=97?= =?UTF-8?q?=E3=82=92=E5=B7=BB=E3=81=8D=E6=B7=BB=E3=81=88=E3=81=AB=E9=96=89?= =?UTF-8?q?=E3=81=98=E3=82=8B=E4=B8=8D=E5=85=B7=E5=90=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/js/respopup_iphone.js | 66 +++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/rep2/js/respopup_iphone.js b/rep2/js/respopup_iphone.js index aed07a1f4..97f1b55da 100644 --- a/rep2/js/respopup_iphone.js +++ b/rep2/js/respopup_iphone.js @@ -28,7 +28,7 @@ var ipoputil = {}; * @param {Element} obj * @return {String} */ -ipoputil.getZ = function() { +ipoputil.getZ = function(obj) { return (10 + _IRESPOPG.serial).toString(); }; @@ -58,13 +58,13 @@ ipoputil.getActivator = function(obj) { * @param {String} key * @return void */ -ipoputil.getDeactivator = function($obj, key) { - return (function(){ +ipoputil.getDeactivator = function(obj, key) { + if(obj!=null &&obj.parentNode !=null) { + $(document).off('click.'+obj.id); delete _IRESPOPG.hash[key]; - //obj.parentNode.removeChild(obj); - $obj.remove(); - delete $obj; - }); + obj.parentNode.removeChild(obj); + delete obj; + } }; // }}} @@ -81,37 +81,39 @@ ipoputil.getDeactivator = function($obj, key) { * @todo use asynchronous request */ ipoputil.callback = function(req, url, popid, yOffset) { - var $container = $("
    "); - var $closer = $(""); - - $container.attr("id",popid); - $container.addClass("respop"); - $container.html(req.responseText); + var container = document.createElement('div'); + var closer = document.createElement('img'); + container.id = popid; + container.className = 'respop'; + container.innerHTML = req.responseText; /* var rx = req.responseXML; while (rx.hasChildNodes()) { container.appendChild(document.importNode(rx.removeChild(rx.firstChild), true)); } */ - $container.css('top',yOffset.toString() + 'px'); - $container.css('z-index',ipoputil.getZ()); - //respop自体等を内部扱いにしておく - $container.skOuterClick(ipoputil.getDeactivator($container, url),$("[id^=_respop]"),$('.close-button'),$('#ic2-info-body'),$('#ic2-info-closer'),$('#spm'),$('#spm-closer')); + container.style.top = yOffset.toString() + 'px'; + container.style.zIndex = ipoputil.getZ(); + //container.onclick = ipoputil.getActivator(container); + + closer.className = 'close-button'; + closer.setAttribute('src', 'img/iphone/close.png'); - $closer.addClass('close-button'); - $closer.attr('src', 'img/iphone/close.png'); - $closer.click(ipoputil.getDeactivator($container, url)); + $(closer).on('click', function(event) { + ipoputil.getDeactivator(container, url); + }); - $container.append($closer); - $(document.body).append($container); + container.appendChild(closer); + document.body.appendChild(container); - iutil.modifyExternalLink($container[0]); + //iutil.modifyInternalLink(container); + iutil.modifyExternalLink(container); - _IRESPOPG.hash[url] = $container[0]; + _IRESPOPG.hash[url] = container; var lastres = document.evaluate('./div[@class="res" and position() = last()]', - $container[0], + container, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null @@ -134,8 +136,20 @@ ipoputil.callback = function(req, url, popid, yOffset) { var i; for (i = 0; i < _IRESPOPG.callbacks.length; i++) { - _IRESPOPG.callbacks[i]($container[0]); + _IRESPOPG.callbacks[i](container); } + + //ウインドウ全体をクリックしたとき + $(document).on('click.'+popid, function(event) { + // レスポップアップと、SPMをクリックしたときは、閉じない + if (!$(event.target).closest('.respop').length && + !$(event.target).closest('#spm-header').length && + !$(event.target).closest('.input-group').length) { + if(true) { + ipoputil.getDeactivator(container, url); + } + } + }); }; // }}} From c2005173dc6b1f3780221e7f0d425a7d6bc47ed3 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Mon, 16 Oct 2017 00:41:52 +0900 Subject: [PATCH 274/339] =?UTF-8?q?ic2=E3=81=AE=E6=83=85=E5=A0=B1=E3=83=9D?= =?UTF-8?q?=E3=83=83=E3=83=97=E3=82=A2=E3=83=83=E3=83=97=E3=81=A7=E9=96=89?= =?UTF-8?q?=E3=81=98=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/js/respopup_iphone.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/rep2/js/respopup_iphone.js b/rep2/js/respopup_iphone.js index 97f1b55da..c75fbe6ac 100644 --- a/rep2/js/respopup_iphone.js +++ b/rep2/js/respopup_iphone.js @@ -142,12 +142,8 @@ ipoputil.callback = function(req, url, popid, yOffset) { //ウインドウ全体をクリックしたとき $(document).on('click.'+popid, function(event) { // レスポップアップと、SPMをクリックしたときは、閉じない - if (!$(event.target).closest('.respop').length && - !$(event.target).closest('#spm-header').length && - !$(event.target).closest('.input-group').length) { - if(true) { - ipoputil.getDeactivator(container, url); - } + if (!$(event.target).closest('.respop,#spm-header,#ic2-info-body,.input-group').length) { + ipoputil.getDeactivator(container, url); } }); }; From 4907729dca66a0afee323e85be989b86e3c3eccd Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 18 Oct 2017 00:17:58 +0900 Subject: [PATCH 275/339] =?UTF-8?q?2chv.tora3.net=E3=81=8CSSL=E5=BF=85?= =?UTF-8?q?=E9=A0=88=E3=81=AB=E3=81=AA=E3=81=A3=E3=81=9F=E3=81=AE=E3=81=A7?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/login2ch.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/login2ch.inc.php b/lib/login2ch.inc.php index 475f415dd..253225ed4 100644 --- a/lib/login2ch.inc.php +++ b/lib/login2ch.inc.php @@ -24,7 +24,7 @@ function login2ch() } $auth2ch_url= http_build_url(array( - "scheme" => $_conf['2chapi_ssl.auth']?"https":"http", + "scheme" => 'https', "host" => "2chv.tora3.net", "path" => "futen.cgi")); From fa4a0565bdecb1b4bf9876358144a93bab3e8d41 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Fri, 13 Oct 2017 01:34:11 +0900 Subject: [PATCH 276/339] =?UTF-8?q?bintan=20=E8=AA=AD=E3=81=BF=E8=BE=BC?= =?UTF-8?q?=E3=81=BF=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index 596b7bfcc..0a9247232 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1885,13 +1885,21 @@ static public function detectThread($url = null) } // 2ch or pink by ula.cc(bintan / bekkanko) - http://choco.2ch.net/test/read.cgi/event/1027770702/ - } elseif (preg_match('<^https?://(?:(?:bintan|same)\\.ula\\.cc|ula\\.2ch\\.net)/test/(?:read\\.(?:cgi|html|so)|r\\.so) + } elseif (preg_match('<^https?://(?:(?:bintan|same)\\.ula\\.cc|ula\\.(?:2ch|5ch)\\.net)/test/(?:read\\.(?:cgi|html|so)|r\\.so) /(.+)/(\\w+)/([0-9]+)(?:/([^/]*))>x', $nama_url, $matches)) { $host = $matches[1]; $bbs = $matches[2]; $key = $matches[3]; $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; + // 2ch or pink by ula.cc(new bintan) - http://choco.2ch.net/test/read.cgi/event/1027770702/ + } elseif (preg_match('<^https?://(ula\\.(?:2ch|5ch)\\.net)/(?:2ch|5ch) + /(\\w+)/(.+)/(\\d+)(?:/([^/]*))>x', $nama_url, $matches)) { + $host = $matches[3]; + $bbs = $matches[2]; + $key = $matches[4]; + $ls = (isset($matches[5]) && strlen($matches[5])) ? $matches[5] : ''; + // 2ch or pink 過去ログhtml - http://pc.2ch.net/mac/kako/1015/10153/1015358199.html } elseif (preg_match('<^(https?://(.+)(?:/[^/]+)?/(\\w+) /kako/\\d+(?:/\\d+)?/(\\d+)).html>x', $nama_url, $matches)) { From 2df4a4e5e601809ebcd0caeee716a56a985724d2 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 18 Oct 2017 15:49:26 +0900 Subject: [PATCH 277/339] v171018.1540 --- conf/conf.inc.php | 2 +- doc/README-774.txt | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index e61474980..6586b7500 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '171013.2230', // rep2のバージョン + 'p2version' => '171018.1540', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index 258d33951..5b8a7057b 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -72,6 +72,13 @@ PHP7 ●ChangeLog +* bintan 読み込み対応 +* 浪人ログイン用の2chv.tora3.netがSSL必須になったので対応 +* スマホ read:ポップアップの閉じるボタンを押した際に他のポップアップを巻き添えに閉じる不具合修正 +* subjectのチェックボックスが機能しない不具合修正 +* スマホ:新着まとめ読みから書き込んだ際にリロードしないように変更 +* 新着まとめ読みから書き込んだ際に書き込みウインドウが消えるように変更 + 171013.2230 * スマホ:一部の環境でスワイプメニューが動作しない不具合修正 * スマホ:res_popup_reloadの設定が反映されない不具合修正 From 206b9b16c0cbbb629f2422c97426f6effecaed1f Mon Sep 17 00:00:00 2001 From: killer4989 Date: Thu, 19 Oct 2017 15:10:53 +0900 Subject: [PATCH 278/339] =?UTF-8?q?fix=20=E6=B5=AA=E4=BA=BA=E3=81=AE?= =?UTF-8?q?=E6=9C=89=E5=8A=B9=E6=80=A7=E3=82=92=E7=A2=BA=E8=AA=8D=E3=81=A7?= =?UTF-8?q?=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index 380c324b0..752d02cde 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -2204,7 +2204,7 @@ function checkRoninExpiration() } try { - $req = P2Commun::getHTTPRequest2($url, HTTP_Request2::METHOD_POST); + $req = P2Commun::createHTTPRequest($url, HTTP_Request2::METHOD_POST); $req->setHeader('User-Agent', $agent); $req->setHeader('X-2ch-UA', $x_2ch_ua); From fbaf255351110f9426f214227cfb25d384b956c5 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Thu, 19 Oct 2017 15:22:24 +0900 Subject: [PATCH 279/339] =?UTF-8?q?bintan=20=E8=AA=AD=E3=81=BF=E8=BE=BC?= =?UTF-8?q?=E3=81=BF=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index 752d02cde..ae4a39ef7 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1885,7 +1885,7 @@ static public function detectThread($url = null) } // 2ch or pink by ula.cc(bintan / bekkanko) - http://choco.2ch.net/test/read.cgi/event/1027770702/ - } elseif (preg_match('<^https?://(?:(?:bintan|same)\\.ula\\.cc|ula\\.(?:2ch|5ch)\\.net)/test/(?:read\\.(?:cgi|html|so)|r\\.so) + } elseif (preg_match('<^https?://(?:(?:bintan|same)\\.ula\\.cc|ula\\.(?:(?:2ch|5ch)\\.net|bbspink\\.com))/test/(?:read\\.(?:cgi|html|so)|r\\.so) /(.+)/(\\w+)/([0-9]+)(?:/([^/]*))>x', $nama_url, $matches)) { $host = $matches[1]; $bbs = $matches[2]; @@ -1893,7 +1893,7 @@ static public function detectThread($url = null) $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; // 2ch or pink by ula.cc(new bintan) - http://choco.2ch.net/test/read.cgi/event/1027770702/ - } elseif (preg_match('<^https?://(ula\\.(?:2ch|5ch)\\.net)/(?:2ch|5ch) + } elseif (preg_match('<^https?://(ula\\.(?:(?:2ch|5ch)\\.net|bbspink\\.com))/(?:2ch|5ch) /(\\w+)/(.+)/(\\d+)(?:/([^/]*))>x', $nama_url, $matches)) { $host = $matches[3]; $bbs = $matches[2]; From b1b3534c583173d283fbb91af455a17ffe4e9dab Mon Sep 17 00:00:00 2001 From: killer4989 Date: Thu, 19 Oct 2017 17:38:41 +0900 Subject: [PATCH 280/339] =?UTF-8?q?5ch=20=E3=81=A7=E3=81=AE=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E7=B5=82=E4=BA=86=E3=83=A1=E3=83=83=E3=82=BB=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 1329d345a..6c521b8ed 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -236,6 +236,8 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { return false; } elseif (mb_strpos ($firstmsg, "2ちゃんねる ★<><>2015/03/13(金) 00:00:00.00 ID:????????<> 3月13日より2") === 0) { return $this->_downloadDat2chNotFound ('404'); + } elseif (mb_strpos ($firstmsg, "5ちゃんねる ★<><>2017/10/01(日) 00:00:00.00 ID:???<> お客様がご") === 0) { + return $this->_downloadDat2chNotFound ('404'); } unset ($firstmsg); @@ -425,6 +427,10 @@ protected function _downloadDat2ch($from_bytes) { $this->getdat_error_msg_ht .= "

    rep2 error: 板サーバから接続を拒否されました
    rep2 info: 2ちゃんねるのDAT提供は終了しました

    "; $this->diedat = true; return false; + } elseif (mb_strpos ($firstmsg, "5ちゃんねる ★<><>2017/10/01(日) 00:00:00.00 ID:???<> お客様がご") === 0) { + $this->getdat_error_msg_ht .= "

    rep2 error: 板サーバから接続を拒否されました
    rep2 info: 2ちゃんねるのDAT提供は終了しました

    "; + $this->diedat = true; + return false; } unset ($firstmsg); } From 832f849ee04eadc3255038ae5d7b6a488c615d79 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Thu, 19 Oct 2017 17:43:44 +0900 Subject: [PATCH 281/339] =?UTF-8?q?=E8=82=A5=E5=A4=A7=E5=8C=96=E3=81=97?= =?UTF-8?q?=E3=81=9F=20P2Util=20=E3=81=8B=E3=82=89=E3=83=9B=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=88=A4=E5=AE=9A=E9=96=A2=E4=BF=82=E3=81=AE=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=E3=82=92=20P2BbsType=20=E3=81=AB=E7=A7=BB=E5=8B=95(?= =?UTF-8?q?=E7=AC=AC1=E5=BC=BE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2BbsType.php | 433 ++++++++++++++++++++++++++++++++++++++++++++ lib/P2CurlMulti.php | 8 +- lib/P2HttpExt.php | 2 +- lib/P2Util.php | 102 ++--------- lib/SettingTxt.php | 2 +- lib/SubjectTxt.php | 2 +- lib/Thread.php | 2 +- lib/ThreadRead.php | 2 +- rep2/post.php | 6 +- rep2/subject.php | 2 +- 10 files changed, 463 insertions(+), 98 deletions(-) create mode 100644 lib/P2BbsType.php diff --git a/lib/P2BbsType.php b/lib/P2BbsType.php new file mode 100644 index 000000000..accb99f6f --- /dev/null +++ b/lib/P2BbsType.php @@ -0,0 +1,433 @@ +', $host); + } + return self::$_hostIs2ch[$host]; + } + + // }}} + // {{{ isHostBe2chNet() + + /** + * host が be.2ch.net なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostBe2chNet($host) + { + return $host == 'be.2ch.net'; + } + + // }}} + // {{{ isNotUse2chAPI() + + /** + * host が API を用いなくても取得できる場合なら true を返す + * + * @param string $host + * @return bool + */ + static public function isNotUse2chAPI($host) + { + return ($host == 'qb5.2ch.net' || $host == 'carpenter.2ch.net'); + } + + // }}} + // {{{ isHost5ch() + + /** + * host が 5ch なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHost5ch($host) + { + if (!array_key_exists($host, self::$_hostIs5ch)) { + self::$_hostIs5ch[$host] = (bool)preg_match('<^\\w+\\.(?:5ch\\.net)$>', $host); + } + return self::$_hostIs5ch[$host]; + } + + // }}} + // {{{ isHostBe5chNet() + + /** + * host が be.2ch.net なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostBe5chNet($host) + { + return $host == 'be.5ch.net'; + } + + // }}} + // {{{ isNotUse5chAPI() + + /** + * host が API を用いなくても取得できる場合なら true を返す + * + * @param string $host + * @return bool + */ + static public function isNotUse5chAPI($host) + { + return ($host == 'qb5.5ch.net' || $host == 'carpenter.5ch.net'); + } + + // }}} + // {{{ isHostBbsPink() + + /** + * host が bbspink なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostBbsPink($host) + { + if (!array_key_exists($host, self::$_hostIsBbsPink)) { + self::$_hostIsBbsPink[$host] = (bool)preg_match('<^\\w+\\.bbspink\\.com$>', $host); + } + return self::$_hostIsBbsPink[$host]; + } + + // }}} + // {{{ isHost2chSc() + + /** + * host が 2ch.sc なら true を返す + * + * @param string $host + * @return boolean + */ + static public function isHost2chSc($host) + { + if (!array_key_exists($host, self::$_hostIs2chSc)) { + self::$_hostIs2chSc[$host] = (bool)preg_match('/\\.(2ch\\.sc)$/', $host); + } + return self::$_hostIs2chSc[$host]; + } + + // }}} + // {{{ isHostOpen2ch() + + /** + * host が おーぷん2ch なら true を返す + * + * @param string $host + * @return boolean + */ + static public function isHostOpen2ch($host) + { + if (!array_key_exists($host, self::$_hostIsOpen2ch)) { + self::$_hostIsOpen2ch[$host] = (bool)preg_match('/\\.(open2ch\\.net)$/', $host); + } + return self::$_hostIsOpen2ch[$host]; + } + + // }}} + // {{{ isHostMachiBbs() + + /** + * host が machibbs なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostMachiBbs($host) + { + if ($host === "machi.to") { + return true; + } + + if (!array_key_exists($host, self::$_hostIsMachiBbs)) { + self::$_hostIsMachiBbs[$host] = (bool)preg_match('<^\\w+\\.machi(?:bbs\\.com|\\.to)$>', $host); + } + return self::$_hostIsMachiBbs[$host]; + } + + // }}} + // {{{ isHostMachiBbsNet() + + /** + * host が machibbs.net まちビねっと なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostMachiBbsNet($host) + { + if (!array_key_exists($host, self::$_hostIsMachiBbsNet)) { + self::$_hostIsMachiBbsNet[$host] = (bool)preg_match('<^\\w+\\.machibbs\\.net$>', $host); + } + return self::$_hostIsMachiBbsNet[$host]; + } + + // }}} + // {{{ isHostJbbsShitaraba() + + /** + * host が livedoor レンタル掲示板 : したらば なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostJbbsShitaraba($in_host) + { + if (!array_key_exists($in_host, self::$_hostIsJbbsShitaraba)) { + if ($in_host == 'rentalbbs.livedoor.com') { + self::$_hostIsJbbsShitaraba[$in_host] = true; + } elseif (preg_match('<^jbbs\\.(?:shitaraba\\.(?:net|com)|livedoor\\.(?:com|jp))(?:/|$)>', $in_host)) { + self::$_hostIsJbbsShitaraba[$in_host] = true; + } else { + self::$_hostIsJbbsShitaraba[$in_host] = false; + } + } + return self::$_hostIsJbbsShitaraba[$in_host]; + } + + // }}} + // {{{ adjustHostJbbs() + + /** + * livedoor レンタル掲示板 : したらばのホスト名変更に対応して変更する + * + * @param string $in_str ホスト名でもURLでもなんでも良い + * @return string + */ + static public function adjustHostJbbs($in_str) + { + return preg_replace('<(^|/)jbbs\\.(?:shitaraba|livedoor)\\.(?:net|com)(/|$)>', '\\1jbbs.shitaraba.net\\2', $in_str, 1); + } + + // }}} + // {{{ isHostTor() + + /** + * host が tor 系板 なら true を返す + * + * @access public + * @param string $host + * @return boolean + */ + static function isHostTor($host, $isGatewayMode = 99) + { + switch ($isGatewayMode) { + case 0: + $ret = (bool)preg_match('/\\.onion$/', $host); + break; + + case 1: + $ret = (bool)preg_match('/\\.(onion\\.cab|onion\\.city|onion\\.direct|onion\\.link|onion\\.nu|onion\\.to|onion\\.rip)$/', $host); + break; + + default: + $ret = (bool)preg_match('/\\.(onion\\.cab|onion\\.city|onion\\.direct|onion\\.link|onion\\.nu|onion\\.to|onion\\.rip|onion)$/', $host); + break; + } + + return $ret; + } + + // }}} + // {{{ isHostVip2ch() + + /** + * host が vip2ch なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostVip2ch($host) + { + if (!array_key_exists($host, self::$_hostIsVip2ch)) { + self::$_hostIsVip2ch[$host] = (bool)preg_match('<^\\w+\\.(?:vip2ch\\.com)$>', $host); + } + return self::$_hostIsVip2ch[$host]; + } + + // }}} + // {{{ isUrlWikipediaJa() + + /** + * URLがウィキペディア日本語版の記事ならtrueを返す + */ + static public function isUrlWikipediaJa($url) + { + return (strncmp($url, 'http://ja.wikipedia.org/wiki/', 29) == 0); + } + + // }}} +} + +// }}} + +/* + * Local Variables: + * mode: php + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ +// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/lib/P2CurlMulti.php b/lib/P2CurlMulti.php index fb43d802c..bb28e1ccb 100644 --- a/lib/P2CurlMulti.php +++ b/lib/P2CurlMulti.php @@ -65,15 +65,15 @@ private function add($subjects, $force = false) { curl_setopt($this->ch[$key], CURLOPT_MAXCONNECTS, $_conf['expack.curl_per_host']); // User-Agent - if(P2Util::isHost2chs($host) && !P2Util::isNotUse2chAPI($host) && $_conf['2chapi_use']){ + if(P2BbsType::isHost2chs($host) && !P2BbsType::isNotUse2chsAPI($host) && $_conf['2chapi_use']){ $user_agent = sprintf ($_conf['2chapi_ua.read'], $_conf['2chapi_appname']); } else { - $user_agent = P2Commun::getP2UA(true, P2Util::isHost2chs($purl['host'])); + $user_agent = P2Commun::getP2UA(true, P2BbsType::isHost2chs($purl['host'])); } curl_setopt($this->ch[$key], CURLOPT_USERAGENT, $user_agent); // プロキシ - if ($_conf['tor_use'] && P2Util::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット + if ($_conf['tor_use'] && P2BbsType::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット $tor_user_info = sprintf("%s%s@", $_conf['tor_proxy_user'], empty($_conf['tor_proxy_password']) ? "" : ":{$_conf['tor_proxy_password']}"); $tor_address = "{$_conf['tor_proxy_host']}:{$_conf['tor_proxy_port']}"; $address = sprintf("http://%s%s", strpos($tor_user_info, "@") === 0 ? "" : $tor_user_info, $tor_address); @@ -171,7 +171,7 @@ private function getResult() { $data = curl_multi_getcontent($ch_array); $header_size = $tmp['header_size']; - if (P2Util::isHostJbbsShitaraba($host) || P2Util::isHostBe2chNet($host)) { + if (P2BbsType::isHostJbbsShitaraba($host) || P2BbsType::isHostBe2chs($host)) { $data = mb_convert_encoding($data, 'CP932', 'CP51932'); } diff --git a/lib/P2HttpExt.php b/lib/P2HttpExt.php index e6d6fcd2c..5503b5363 100644 --- a/lib/P2HttpExt.php +++ b/lib/P2HttpExt.php @@ -931,7 +931,7 @@ static public function fetchSubjectTxt($subjects, $force = false) $url = 'http://' . $host . '/' . $bbs . '/subject.txt'; - if (P2Util::isHostJbbsShitaraba($host) || P2Util::isHostBe2chNet($host)) { + if (P2Util::isHostJbbsShitaraba($host) || P2BbsType::isHostBe2chs($host)) { if ($eucjp2sjis === null) { $eucjp2sjis = new P2HttpCallback_SaveEucjpAsSjis(); } diff --git a/lib/P2Util.php b/lib/P2Util.php index ae4a39ef7..56d3344af 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -802,7 +802,7 @@ static public function normalizeHostName($host) */ static public function isHostExample($host) { - return (bool)preg_match('/(?:^|\\.)example\\.(?:com|net|org|jp)$/i', $host); + return P2BbsType::isHostExample($host); } // }}} @@ -816,7 +816,7 @@ static public function isHostExample($host) */ static public function isHost2chs($host) { - return self::isHost2ch($host) || self::isHost5ch($host) || self::isHostBbsPink($host); + return P2BbsType::isHost2chs($host); } // }}} @@ -830,10 +830,7 @@ static public function isHost2chs($host) */ static public function isHost2ch($host) { - if (!array_key_exists($host, self::$_hostIs2ch)) { - self::$_hostIs2ch[$host] = (bool)preg_match('<^\\w+\\.(?:2ch\\.net)$>', $host); - } - return self::$_hostIs2ch[$host]; + return P2BbsType::isHost2ch($host); } // }}} @@ -847,10 +844,7 @@ static public function isHost2ch($host) */ static public function isHost5ch($host) { - if (!array_key_exists($host, self::$_hostIs5ch)) { - self::$_hostIs5ch[$host] = (bool)preg_match('<^\\w+\\.(?:5ch\\.net)$>', $host); - } - return self::$_hostIs5ch[$host]; + return P2BbsType::isHost5ch($host); } // }}} @@ -864,10 +858,7 @@ static public function isHost5ch($host) */ static public function isHostVip2ch($host) { - if (!array_key_exists($host, self::$_hostIsVip2ch)) { - self::$_hostIsVip2ch[$host] = (bool)preg_match('<^\\w+\\.(?:vip2ch\\.com)$>', $host); - } - return self::$_hostIsVip2ch[$host]; + return P2BbsType::isHostVip2ch($host); } // }}} @@ -881,13 +872,7 @@ static public function isHostVip2ch($host) */ static public function isHostBe2chNet($host) { - return ($host == 'be.2ch.net' || $host == 'be.5ch.net'); - /* - if (!array_key_exists($host, self::$_hostIsBe2chNet)) { - self::$_hostIsBe2chNet[$host] = ($host == 'be.2ch.net'); - } - return self::$_hostIsBe2chNet[$host]; - */ + return P2BbsType::isHostBe2chNet($host); } // }}} @@ -901,7 +886,7 @@ static public function isHostBe2chNet($host) */ static public function isNotUse2chAPI($host) { - return ($host == 'qb5.2ch.net' || $host == 'carpenter.2ch.net' || $host == 'qb5.5ch.net' || $host == 'carpenter.5ch.net'); + return P2BbsType::isNotUse2chAPI($host); } // }}} @@ -915,10 +900,7 @@ static public function isNotUse2chAPI($host) */ static public function isHostBbsPink($host) { - if (!array_key_exists($host, self::$_hostIsBbsPink)) { - self::$_hostIsBbsPink[$host] = (bool)preg_match('<^\\w+\\.bbspink\\.com$>', $host); - } - return self::$_hostIsBbsPink[$host]; + return P2BbsType::isHostBbsPink($host); } // }}} @@ -931,23 +913,9 @@ static public function isHostBbsPink($host) * @param string $host * @return boolean */ - static function isHostTor($host, $isGatewayMode = 99) + static public function isHostTor($host, $isGatewayMode = 99) { - switch ($isGatewayMode) { - case 0: - $ret = (bool)preg_match('/\\.onion$/', $host); - break; - - case 1: - $ret = (bool)preg_match('/\\.(onion\\.cab|onion\\.city|onion\\.direct|onion\\.link|onion\\.nu|onion\\.to|onion\\.rip)$/', $host); - break; - - default: - $ret = (bool)preg_match('/\\.(onion\\.cab|onion\\.city|onion\\.direct|onion\\.link|onion\\.nu|onion\\.to|onion\\.rip|onion)$/', $host); - break; - } - - return $ret; + return P2BbsType::isHostTor($host, $isGatewayMode); } // }}} @@ -961,14 +929,7 @@ static function isHostTor($host, $isGatewayMode = 99) */ static public function isHostMachiBbs($host) { - if ($host === "machi.to") { - return true; - } - - if (!array_key_exists($host, self::$_hostIsMachiBbs)) { - self::$_hostIsMachiBbs[$host] = (bool)preg_match('<^\\w+\\.machi(?:bbs\\.com|\\.to)$>', $host); - } - return self::$_hostIsMachiBbs[$host]; + return P2BbsType::isHostMachiBbs($host); } // }}} @@ -982,10 +943,7 @@ static public function isHostMachiBbs($host) */ static public function isHostMachiBbsNet($host) { - if (!array_key_exists($host, self::$_hostIsMachiBbsNet)) { - self::$_hostIsMachiBbsNet[$host] = (bool)preg_match('<^\\w+\\.machibbs\\.net$>', $host); - } - return self::$_hostIsMachiBbsNet[$host]; + return P2BbsType::isHostMachiBbsNet($host); } // }}} @@ -999,16 +957,7 @@ static public function isHostMachiBbsNet($host) */ static public function isHostJbbsShitaraba($in_host) { - if (!array_key_exists($in_host, self::$_hostIsJbbsShitaraba)) { - if ($in_host == 'rentalbbs.livedoor.com') { - self::$_hostIsJbbsShitaraba[$in_host] = true; - } elseif (preg_match('<^jbbs\\.(?:shitaraba\\.(?:net|com)|livedoor\\.(?:com|jp))(?:/|$)>', $in_host)) { - self::$_hostIsJbbsShitaraba[$in_host] = true; - } else { - self::$_hostIsJbbsShitaraba[$in_host] = false; - } - } - return self::$_hostIsJbbsShitaraba[$in_host]; + return P2BbsType::isHostJbbsShitaraba($in_host); } // }}} @@ -1022,8 +971,7 @@ static public function isHostJbbsShitaraba($in_host) */ static public function adjustHostJbbs($in_str) { - return preg_replace('<(^|/)jbbs\\.(?:shitaraba|livedoor)\\.(?:net|com)(/|$)>', '\\1jbbs.shitaraba.net\\2', $in_str, 1); - //return preg_replace('<(^|/)jbbs\\.(?:shitaraba\\.com|livedoor\\.(?:com|jp))(/|$)>', '\\1rentalbbs.livedoor.com\\2', $in_str, 1); + return P2BbsType::adjustHostJbbs($in_str); } // }}} @@ -1037,10 +985,7 @@ static public function adjustHostJbbs($in_str) */ static public function isHost2chSc($host) { - if (!array_key_exists($host, self::$_hostIs2chSc)) { - self::$_hostIs2chSc[$host] = (bool)preg_match('/\\.(2ch\\.sc)$/', $host); - } - return self::$_hostIs2chSc[$host]; + return P2BbsType::isHost2chSc($host); } // }}} @@ -1054,10 +999,7 @@ static public function isHost2chSc($host) */ static public function isHostOpen2ch($host) { - if (!array_key_exists($host, self::$_hostIsOpen2ch)) { - self::$_hostIsOpen2ch[$host] = (bool)preg_match('/\\.(open2ch\\.net)$/', $host); - } - return self::$_hostIsOpen2ch[$host]; + return P2BbsType::isHostOpen2ch($host); } // }}} @@ -2022,17 +1964,7 @@ static public function getHtmlDom($html, $charset = null, $report_error = true) */ static public function getHostGroupName($host) { - if (self::isHost2chs($host)) { - return '2channel'; - } elseif (self::isHostMachiBbs($host)) { - return 'machibbs'; - } elseif (self::isHostJbbsShitaraba($host)) { - return 'shitaraba'; - } elseif (self::isHostVip2ch($host)) { - return 'vip2ch'; - } else { - return $host; - } + return P2BbsType::getHostGroupName($host); } // }}} diff --git a/lib/SettingTxt.php b/lib/SettingTxt.php index 6fdf41db9..5b8bbc817 100644 --- a/lib/SettingTxt.php +++ b/lib/SettingTxt.php @@ -118,7 +118,7 @@ public function downloadSettingTxt() //var_dump($req->getResponseHeader()); $body = $response->getBody(); // したらば or be.2ch.net ならEUCをSJISに変換 - if (P2Util::isHostJbbsShitaraba($this->host) || P2Util::isHostBe2chNet($this->host)) { + if (P2Util::isHostJbbsShitaraba($this->host) || P2BbsType::isHostBe2chs($this->host)) { $body = mb_convert_encoding($body, 'CP932', 'CP51932'); } if (FileCtl::file_write_contents($this->_setting_txt, $body) === false) { diff --git a/lib/SubjectTxt.php b/lib/SubjectTxt.php index 3f507f33a..495586de9 100644 --- a/lib/SubjectTxt.php +++ b/lib/SubjectTxt.php @@ -114,7 +114,7 @@ public function downloadSubject() //var_dump($req->getResponseHeader()); $body = $response->getBody(); // したらば or be.2ch.net ならEUCをSJISに変換 - if (P2Util::isHostJbbsShitaraba($this->host) || P2Util::isHostBe2chNet($this->host)) { + if (P2Util::isHostJbbsShitaraba($this->host) || P2BbsType::isHostBe2chs($this->host)) { $body = mb_convert_encoding($body, 'CP932', 'CP51932'); } if (FileCtl::file_write_contents($this->subject_file, $body) === false) { diff --git a/lib/Thread.php b/lib/Thread.php index a24bb0ae8..eae31de44 100644 --- a/lib/Thread.php +++ b/lib/Thread.php @@ -456,7 +456,7 @@ public function setTitleFromLocal() $this->setTtitle($d[4]); // be.2ch.net ならEUC→SJIS変換 - if (P2Util::isHostBe2chNet($this->host)) { + if (P2BbsType::isHostBe2chs($this->host)) { $ttitle = mb_convert_encoding($this->ttitle, 'CP932', 'CP51932'); $this->setTtitle($ttitle); } diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 6c521b8ed..885309bdd 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -70,7 +70,7 @@ public function downloadDat() { return $this->_downloadDat2chKako ($_GET['kakolog'], $ext); // 2ch はAPI経由で落とす - } elseif (P2Util::isHost2chs ($this->host) && !P2Util::isNotUse2chAPI ($this->host) && $_conf['2chapi_use'] && empty ($_GET['olddat'])) { + } elseif (P2BbsType::isHost2chs ($this->host) && !P2BbsType::isNotUse2chsAPI ($this->host) && $_conf['2chapi_use'] && empty ($_GET['olddat'])) { // ログインしてなければ or ログイン後、設定した時間経過していたら自動再ログイン if (! file_exists ($_conf['sid2chapi_php']) || ! empty ($_REQUEST['relogin2chapi']) || (filemtime ($_conf['sid2chapi_php']) < time () - 60 * 60 * $_conf['2chapi_interval'])) { diff --git a/rep2/post.php b/rep2/post.php index cb68da647..c9a797531 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -411,7 +411,7 @@ function postIt($host, $bbs, $key, $post) } // be.2ch.net 認証クッキー - if (P2Util::isHostBe2chNet($host) || !empty($_REQUEST['beres'])) { + if (P2BbsType::isHostBe2chs($host) || !empty($_REQUEST['beres'])) { if ($_conf['be_2ch_DMDM'] && $_conf['be_2ch_MDMD']) { $req->addCookie('DMDM', urlencode( rawurldecode( $_conf['be_2ch_DMDM']) ) ); $req->addCookie('MDMD', urlencode( rawurldecode( $_conf['be_2ch_MDMD']) ) ); @@ -428,7 +428,7 @@ function postIt($host, $bbs, $key, $post) while (list($name, $value) = each($post)) { // したらば or be.2ch.netなら、EUCに変換 - if (P2Util::isHostJbbsShitaraba($host) || P2Util::isHostBe2chNet($host)) { + if (P2Util::isHostJbbsShitaraba($host) || P2BbsType::isHostBe2chs($host)) { $value = mb_convert_encoding($value, 'CP51932', 'CP932'); } elseif (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host)) { // 2chはUnicodeの文字列をpostする @@ -464,7 +464,7 @@ function postIt($host, $bbs, $key, $post) } // be.2ch.net or JBBSしたらば 文字コード変換 EUC→SJIS - if (P2Util::isHostBe2chNet($host) || P2Util::isHostJbbsShitaraba($host)) { + if (P2BbsType::isHostBe2chs($host) || P2Util::isHostJbbsShitaraba($host)) { $body = mb_convert_encoding($body, 'CP932', 'CP51932'); // diff --git a/rep2/subject.php b/rep2/subject.php index 482b70e76..a822f3a27 100644 --- a/rep2/subject.php +++ b/rep2/subject.php @@ -1036,7 +1036,7 @@ function matchSbFilter(Thread $aThread) if (file_exists($aThread->keydat)) { $subject = file_get_contents($aThread->keydat); // be.2ch.net はEUC - if (P2Util::isHostBe2chNet($aThread->host)) { + if (P2BbsType::isHostBe2chs($aThread->host)) { $subject = mb_convert_encoding($subject, 'CP932', 'CP51932'); } } else { From 3111b871c706f0d2bfd09f515ba7aa2ca27dd5fc Mon Sep 17 00:00:00 2001 From: killer4989 Date: Thu, 19 Oct 2017 19:56:36 +0900 Subject: [PATCH 282/339] =?UTF-8?q?ImageCache2=20=E3=81=A7=E3=81=AE?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=A0=E3=82=A2=E3=82=A6=E3=83=88=E5=80=A4?= =?UTF-8?q?=E3=82=92=E8=A8=AD=E5=AE=9A=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_ic2.inc.php | 6 ------ conf/conf_user_def_ex.inc.php | 8 ++++++++ rep2/edit_conf_user.php | 2 ++ rep2/ic2.php | 8 ++++---- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/conf/conf_ic2.inc.php b/conf/conf_ic2.inc.php index bebec256a..7e244c00e 100644 --- a/conf/conf_ic2.inc.php +++ b/conf/conf_ic2.inc.php @@ -138,12 +138,6 @@ // ページタイトル $_conf['expack.ic2.getter.title'] = "ImageCache2::Getter"; -// サーバに接続する際にタイムアウトするまでの時間(秒)[0 => http_conn_timeout に依存] -$_conf['expack.ic2.getter.conn_timeout'] = 5; - -// ダウンロードがタイムアウトするまでの時間(秒)[0 => http_read_timeout に依存] -$_conf['expack.ic2.getter.read_timeout'] = 60; - // エラーログにある画像はダウンロードを試みない (no:0;yes:1) $_conf['expack.ic2.getter.checkerror'] = 1; diff --git a/conf/conf_user_def_ex.inc.php b/conf/conf_user_def_ex.inc.php index 58fa1757f..7e584ce58 100644 --- a/conf/conf_user_def_ex.inc.php +++ b/conf/conf_user_def_ex.inc.php @@ -220,6 +220,14 @@ $conf_user_def['expack.ic2.fav_auto_rank_override'] = 0; // (0) $conf_user_rad['expack.ic2.fav_auto_rank_override'] = array('1' => 'する', '2' => 'ランク0だったらする', '3' => 'ランクが上がるならする', '0' => 'しない'); +// サーバに接続する際にタイムアウトするまでの時間(秒)[0 => http_conn_timeout に依存] +$conf_user_def['expack.ic2.getter_conn_timeout'] = 5; +$conf_user_rules['expack.ic2.getter_conn_timeout'] = array('notIntExceptMinusToDef'); + +// ダウンロードがタイムアウトするまでの時間(秒)[0 => http_read_timeout に依存] +$conf_user_def['expack.ic2.getter_read_timeout'] = 60; +$conf_user_rules['expack.ic2.getter_read_timeout'] = array('notIntExceptMinusToDef'); + // }}} // {{{ AAS diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index fabb3d6f5..8bff81d0f 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -718,6 +718,8 @@ array('expack.ic2.fav_auto_rank', 'お気にスレに登録されているスレの画像に自動ランクを設定する'), array('expack.ic2.fav_auto_rank_setting', 'お気にスレの画像を自動ランク設定する場合の設定値(カンマ区切り)[お気に0のランク値,お気に1のランク値, , ,]'), array('expack.ic2.fav_auto_rank_override', 'お気にスレの画像を自動ランク設定する場合に、キャッシュ済み画像に自動ランクを上書きするか'), + array('expack.ic2.getter_conn_timeout', 'サーバに接続する際にタイムアウトするまでの時間(秒)[0 => http_conn_timeout に依存]'), + array('expack.ic2.getter_read_timeout', 'ダウンロードがタイムアウトするまでの時間(秒)[0 => http_read_timeout に依存]'), ); printEditConfGroupHtml($groupname, $conflist, $flags); } diff --git a/rep2/ic2.php b/rep2/ic2.php index 81cb93f7e..c950ee9a1 100644 --- a/rep2/ic2.php +++ b/rep2/ic2.php @@ -296,10 +296,10 @@ public function __destruct() // {{{ init http-client // 設定を確認 -$conn_timeout = (isset($ini['Getter']['conn_timeout']) && $ini['Getter']['conn_timeout'] > 0) - ? $ini['Getter']['conn_timeout'] : $_conf['http_conn_timeout']; -$read_timeout = (isset($ini['Getter']['read_timeout']) && $ini['Getter']['read_timeout'] > 0) - ? $ini['Getter']['read_timeout'] : $_conf['http_read_timeout']; +$conn_timeout = (isset($_conf['expack.ic2.getter_conn_timeout']) && $_conf['expack.ic2.getter_conn_timeout'] > 0) + ? $_conf['expack.ic2.getter_conn_timeout'] : $_conf['http_conn_timeout']; +$read_timeout = (isset($_conf['expack.ic2.getter_read_timeout']) && $_conf['expack.ic2.getter_read_timeout'] > 0) + ? $_conf['expack.ic2.getter_read_timeout'] : $_conf['http_read_timeout']; $ic2_ua = (!empty($_conf['expack.user_agent'])) ? $_conf['expack.user_agent'] : $_SERVER['HTTP_USER_AGENT']; From fd2833957364985608ebc6e7b53c8754883a5f55 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Thu, 26 Oct 2017 12:03:01 +0900 Subject: [PATCH 283/339] =?UTF-8?q?dig5ch=E3=81=AEJSON=E3=81=ABform?= =?UTF-8?q?=E3=82=BF=E3=82=B0=E3=81=8C=E6=B7=B7=E5=85=A5=E3=81=99=E3=82=8B?= =?UTF-8?q?=E4=B8=8D=E5=85=B7=E5=90=88=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/dig2ch.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rep2/dig2ch.php b/rep2/dig2ch.php index 4e6b66e5b..555ecd784 100644 --- a/rep2/dig2ch.php +++ b/rep2/dig2ch.php @@ -33,7 +33,13 @@ function dig2chsearch($query) // 先方の鯖で何か障害が発生したらJSONにHTMLのコメントが混ざるのでその対策 if (strpos($body,"/", "", $body); + $body = preg_replace("/<\!--[\s\S]*?-->/", "", $body); + } + + // formタグが混入することがあるので除去 + if (strpos($body,"/", "", $body); } $jsontest1 = json_decode($body, true); From 24d25640705f79339cdaeb1cf1208941ff6e09c3 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Thu, 26 Oct 2017 12:21:15 +0900 Subject: [PATCH 284/339] =?UTF-8?q?P2HttpExt.php=E4=BB=A5=E5=A4=96?= =?UTF-8?q?=E3=81=AE=E9=80=9A=E4=BF=A1=E3=82=92=E3=81=99=E3=81=B9=E3=81=A6?= =?UTF-8?q?cURL=E3=81=AB=E7=B5=B1=E4=B8=80=E3=80=82=20=E6=B5=AA=E4=BA=BA?= =?UTF-8?q?=E3=81=8CSSL=E5=BF=85=E9=A0=88=E3=81=AB=E3=81=AA=E3=81=A3?= =?UTF-8?q?=E3=81=9F=E3=81=AE=E3=81=A7=E8=A8=AD=E5=AE=9A=E9=A0=85=E7=9B=AE?= =?UTF-8?q?=E3=82=92=E9=99=A4=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf.inc.php | 2 +- conf/conf_user_def.inc.php | 8 -------- doc/README-774.txt | 1 + lib/P2Commun.php | 5 +++-- rep2/edit_conf_user.php | 4 +--- 5 files changed, 6 insertions(+), 14 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 6586b7500..78702187c 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '171018.1540', // rep2のバージョン + 'p2version' => '171026.9001', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 6b2227892..754c08203 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -585,17 +585,9 @@ $conf_user_def['pane_mode'] = 0; // (0) $conf_user_rad['pane_mode'] = array('0' => '標準(に形)', '1' => '横一列(川形)'); -// SSL通信(●ログイン等)に使用する関数 ※該当する拡張をインストールする必要がある -$conf_user_def['ssl_function'] = "curl"; // (socket) -$conf_user_sel['ssl_function'] = array('socket' => 'OpenSSL', 'curl' => 'cURL'); - // SSL通信の接続先を検証するために使用する証明書が格納されたディレクトリ ※検証できない時のみ指定 $conf_user_def['ssl_capath'] = ""; // () -// 2ch.netの●ログインにSSLを使用する -$conf_user_def['2ch_ssl.maru'] = 1; // (1) -$conf_user_rad['2ch_ssl.maru'] = array('1' => 'する', '0' => 'しない'); - // 2ch.netのsubjec.txtとSETTING.TXTの取得にSSLを使用する $conf_user_def['2ch_ssl.subject'] = 0; // (0) $conf_user_rad['2ch_ssl.subject'] = array('1' => 'する', '0' => 'しない'); diff --git a/doc/README-774.txt b/doc/README-774.txt index 5b8a7057b..e9adc5fb1 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -72,6 +72,7 @@ PHP7 ●ChangeLog +171018.1540 * bintan 読み込み対応 * 浪人ログイン用の2chv.tora3.netがSSL必須になったので対応 * スマホ read:ポップアップの閉じるボタンを押した際に他のポップアップを巻き添えに閉じる不具合修正 diff --git a/lib/P2Commun.php b/lib/P2Commun.php index ee4d4416a..659ec82bd 100644 --- a/lib/P2Commun.php +++ b/lib/P2Commun.php @@ -46,10 +46,11 @@ static public function createHTTPRequest($url , $method = HTTP_Request2::METHOD_ 'timeout' => $_conf['http_read_timeout'], )); + // 外部との通信は全てcURLを使う + $req->setAdapter('curl'); + // SSLの設定 if($purl['scheme'] == 'https') { - $req->setAdapter($_conf['ssl_function']); - if($_conf['ssl_capath']) { $req->setConfig ('ssl_capath', $_conf['ssl_capath']); diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index fabb3d6f5..dff6ecad7 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -446,9 +446,7 @@ array('tor_proxy_password', 'Tor プロキシパスワード (使用する場合のみ)'), array('tor_proxy_mode', 'Tor プロキシの種類'), 'SSL通信設定', - array('ssl_function', 'SSL通信(●ログイン等)に使用する関数
    (関数に該当する拡張をインストールする必要がある)'), - array('ssl_capath', 'SSL通信で接続先を検証するための証明書があるディレクトリ ex)"/etc/ssl/certs"
    設定なして動く場合は設定不要
    ssl_functionに対応した形式の証明書が必要'), - array('2ch_ssl.maru', '2ch.netの●ログインにSSLを使用する'), + array('ssl_capath', 'SSL通信で接続先を検証するための証明書があるディレクトリ ex)"/etc/ssl/certs"
    設定なして動く場合は設定不要'), array('2ch_ssl.subject', '2ch.netのsubjec.txtとSETTING.TXTの取得にSSLを使用する'), array('2ch_ssl.post', '2ch.netの書き込みにSSLを使用する'), ); From e2a439134949065268da7a1b38d42b5c7a4b973e Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Fri, 27 Oct 2017 04:24:18 +0900 Subject: [PATCH 285/339] =?UTF-8?q?ic2:=E3=83=80=E3=82=A6=E3=83=B3?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=80=E3=83=BC=E3=81=A7=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E3=81=8C=E5=87=BA=E3=81=AA=E3=81=84=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/ic2_getter.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rep2/ic2_getter.php b/rep2/ic2_getter.php index b862010e6..d77364374 100644 --- a/rep2/ic2_getter.php +++ b/rep2/ic2_getter.php @@ -27,7 +27,7 @@ $autoClose = -1; } else { $isPopUp = 1; - if (array_key_exists('close', $_GET) && is_numeric($_GET['close'])) { + if (array_key_exists('autoclose', $_GET) && is_numeric($_GET['autoclose'])) { $autoClose = (float)$_GET['close'] * 1000.0; if ($autoClose > 0.0) { $autoClose = (int)$autoClose; @@ -58,7 +58,7 @@ 'to' => 'to', 'padding' => '', 'popup' => $isPopUp, - 'close' => $autoClose, + 'autoclose' => $autoClose, ); // フォームの固定値 @@ -107,7 +107,7 @@ // 隠し要素 $qfe['detect_hint'] = $qf->addElement('hidden', '_hint'); $qfe['popup'] = $qf->addElement('hidden', 'popup'); -$qfe['close'] = $qf->addElement('hidden', 'close'); +$qfe['autoclose'] = $qf->addElement('hidden', 'autoclose'); // URLと連番設定 $qfe['uri'] = $qf->addElement('text', 'uri', 'URL', $_attr_uri); @@ -123,7 +123,7 @@ // プレビューの大きさ $preview_size = array(); foreach ($_preview_size as $value => $lavel) { - $preview_size[$value] = HTML_QuickForm::createElement('radio', null, null, $lavel, $value); + $preview_size[$value] = $qf->createElement('radio', null, null, $lavel, $value); } $qf->addGroup($preview_size, 'preview_size', 'プレビュー', ' '); if (!isset($_GET['preview_size'])) { From b4bcf2de8ffe0e2be0331b7bd4475b1584c99cc5 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Fri, 27 Oct 2017 21:34:23 +0900 Subject: [PATCH 286/339] =?UTF-8?q?=E8=82=A5=E5=A4=A7=E5=8C=96=E3=81=97?= =?UTF-8?q?=E3=81=9F=20P2Util=20=E3=81=8B=E3=82=89=E3=83=9B=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=88=A4=E5=AE=9A=E9=96=A2=E4=BF=82=E3=81=AE=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=E3=82=92=20P2BbsType=20=E3=81=AB=E7=A7=BB=E5=8B=95(?= =?UTF-8?q?=E7=AC=AC2=E5=BC=BE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 縺薙l縺ァ遘サ蜍輔ッ縺ァ縺阪◆縺ッ縺 --- lib/BbsMap.php | 8 ++++---- lib/P2Commun.php | 7 ++++--- lib/P2HttpExt.php | 4 ++-- lib/P2Util.php | 16 ++++++++-------- lib/SettingTxt.php | 8 ++++---- lib/ShowThread.php | 6 +++--- lib/ShowThreadI.php | 2 +- lib/ShowThreadK.php | 2 +- lib/SubjectTxt.php | 10 +++++----- lib/Thread.php | 12 ++++++------ lib/ThreadRead.php | 20 ++++++++++---------- lib/expack/tgrep/view.inc.php | 2 +- lib/plugins/hissi/Hissi.php | 2 +- lib/plugins/mimizun/Mimizun.php | 4 ++-- lib/plugins/stalker/Stalker.php | 2 +- lib/post_form_options.inc.php | 6 +++--- lib/read_shitaraba.inc.php | 6 +++--- lib/sb_footer.inc.php | 6 +++--- lib/sb_header_k.inc.php | 4 ++-- lib/sb_print_k.inc.php | 2 +- lib/wiki/Samba.php | 4 ++-- 21 files changed, 67 insertions(+), 66 deletions(-) diff --git a/lib/BbsMap.php b/lib/BbsMap.php index 9fe87d577..d54ef7ca1 100644 --- a/lib/BbsMap.php +++ b/lib/BbsMap.php @@ -404,13 +404,13 @@ static private function _writeData($path, $neolines) */ static private function _detectHostType($host) { - if (P2Util::isHostBbsPink($host)) { + if (P2BbsType::isHostBbsPink($host)) { $type = 'bbspink'; - } elseif (P2Util::isHost2chs($host)) { + } elseif (P2BbsType::isHost2chs($host)) { $type = '2channel'; - } elseif (P2Util::isHostMachiBbs($host)) { + } elseif (P2BbsType::isHostMachiBbs($host)) { $type = 'machibbs'; - } elseif (P2Util::isHostJbbsShitaraba($host)) { + } elseif (P2BbsType::isHostJbbsShitaraba($host)) { $type = 'jbbs'; } else { $type = $host; diff --git a/lib/P2Commun.php b/lib/P2Commun.php index 659ec82bd..12ab2934d 100644 --- a/lib/P2Commun.php +++ b/lib/P2Commun.php @@ -35,7 +35,7 @@ static public function createHTTPRequest($url , $method = HTTP_Request2::METHOD_ // よく使うヘッダを指定 // p2のHTTP通信は特に指定の無い限りMonazillaを名乗るようにする - $req->setHeader ('User-Agent', self::getP2UA(true,P2Util::isHost2chs($purl['host']))); + $req->setHeader ('User-Agent', self::getP2UA(true,P2BbsType::isHost2chs($purl['host']))); $req->setHeader ('Accept-Language', 'ja,en-us;q=0.7,en;q=0.3'); $req->setHeader ('Accept', '*/*'); $req->setHeader ('Accept-Encoding', 'gzip, deflate'); @@ -47,7 +47,8 @@ static public function createHTTPRequest($url , $method = HTTP_Request2::METHOD_ )); // 外部との通信は全てcURLを使う - $req->setAdapter('curl'); +// $req->setAdapter('curl'); + $req->setAdapter('socket'); // SSLの設定 if($purl['scheme'] == 'https') { @@ -58,7 +59,7 @@ static public function createHTTPRequest($url , $method = HTTP_Request2::METHOD_ } // プロキシ - if ($_conf['tor_use'] && P2Util::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット + if ($_conf['tor_use'] && P2BbsType::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット $req->setConfig (array ( 'proxy_host' => $_conf['tor_proxy_host'], 'proxy_port' => $_conf['tor_proxy_port'], diff --git a/lib/P2HttpExt.php b/lib/P2HttpExt.php index 5503b5363..8140abd00 100644 --- a/lib/P2HttpExt.php +++ b/lib/P2HttpExt.php @@ -247,7 +247,7 @@ public function __construct($url, if (!isset($options['useragent'])) { $purl = parse_url($url); // URL分解 - $options['useragent'] = P2Commun::getP2UA(true,P2Util::isHost2chs($purl['host'])); + $options['useragent'] = P2Commun::getP2UA(true,P2BbsType::isHost2chs($purl['host'])); unset($purl); } @@ -931,7 +931,7 @@ static public function fetchSubjectTxt($subjects, $force = false) $url = 'http://' . $host . '/' . $bbs . '/subject.txt'; - if (P2Util::isHostJbbsShitaraba($host) || P2BbsType::isHostBe2chs($host)) { + if (P2BbsType::isHostJbbsShitaraba($host) || P2BbsType::isHostBe2chs($host)) { if ($eucjp2sjis === null) { $eucjp2sjis = new P2HttpCallback_SaveEucjpAsSjis(); } diff --git a/lib/P2Util.php b/lib/P2Util.php index 56d3344af..992a804f4 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -389,9 +389,9 @@ static private function _p2DirOfHost($base_dir, $host, $dir_sep = true) $host = self::normalizeHostName($host); // 2channel or bbspink - if (self::isHost2chs($host)) { + if (P2BbsType::isHost2chs($host)) { $host_dir = $base_dir . DIRECTORY_SEPARATOR . '2channel'; - } elseif (self::isHostOpen2ch($host)) { + } elseif (P2BbsType::isHostOpen2ch($host)) { //互換性維持のため旧式のディレクトリを指定 $host_dir = $base_dir . DIRECTORY_SEPARATOR . rawurlencode($host); if (!file_exists($host_dir)) { @@ -399,7 +399,7 @@ static private function _p2DirOfHost($base_dir, $host, $dir_sep = true) $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'open2ch'; } - } elseif (self::isHost2chSc($host)) { + } elseif (P2BbsType::isHost2chSc($host)) { //互換性維持のため旧式のディレクトリを指定 $host_dir = $base_dir . DIRECTORY_SEPARATOR . rawurlencode($host); if (!file_exists($host_dir)) { @@ -407,22 +407,22 @@ static private function _p2DirOfHost($base_dir, $host, $dir_sep = true) $host_dir = $base_dir . DIRECTORY_SEPARATOR . '2channel_sc'; } // machibbs.com - } elseif (self::isHostMachiBbs($host)) { + } elseif (P2BbsType::isHostMachiBbs($host)) { $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'machibbs.com'; // tor - } elseif (self::isHostTor($host)) { + } elseif (P2BbsType::isHostTor($host)) { $tor_host = preg_replace('/\.onion\.(\w+)$/', '.onion', $host); $host_dir = $base_dir . DIRECTORY_SEPARATOR . $tor_host; unset($tor_host); // jbbs.livedoor.jp (livedoor レンタル掲示板) - } elseif (self::isHostJbbsShitaraba($host)) { + } elseif (P2BbsType::isHostJbbsShitaraba($host)) { if (DIRECTORY_SEPARATOR == '/') { $host_dir = $base_dir . DIRECTORY_SEPARATOR . $host; } else { $host_dir = $base_dir . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $host); } // vip.2ch.com - } elseif (self::isHostVip2ch($host)) { + } elseif (P2BbsType::isHostVip2ch($host)) { $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'ex14.vip2ch.com'; // livedoor レンタル掲示板以外でスラッシュ等の文字を含むとき @@ -2043,7 +2043,7 @@ static private function _getBe2chCodeByMailPass($mail, $pass, $host) $url = http_build_url(array( "scheme" => $_conf['2ch_ssl.post'] ? "https" : "http", - "host" => P2Util::isHost5ch($host) ? "be.5ch.net" : "be.2ch.net", + "host" => P2BbsType::isHost5ch($host) ? "be.5ch.net" : "be.2ch.net", "path" => "index.php")); try { diff --git a/lib/SettingTxt.php b/lib/SettingTxt.php index 5b8bbc817..dd8aa5aeb 100644 --- a/lib/SettingTxt.php +++ b/lib/SettingTxt.php @@ -39,12 +39,12 @@ public function __construct($host, $bbs) $this->_setting_srd = $dat_host_bbs_dir_s . 'p2_kb_setting.srd'; // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) - if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host) && $_conf['2ch_ssl.subject']) { + if (P2BbsType::isHost2chs($host) && ! P2BbsType::isHostBbsPink($host) && $_conf['2ch_ssl.subject']) { $this->_url = 'https://' . $host . '/' . $bbs . '/SETTING.TXT'; } else { $this->_url = 'http://' . $host . '/' . $bbs . '/SETTING.TXT'; } - //$this->_url = P2Util::adjustHostJbbs($this->_url); // したらばのlivedoor移転に対応。読込先をlivedoorとする。 + //$this->_url = P2BbsType::adjustHostJbbs($this->_url); // したらばのlivedoor移転に対応。読込先をlivedoorとする。 $this->setting_array = array(); @@ -80,7 +80,7 @@ public function downloadSettingTxt() global $_conf; // まちBBS・したらば は SETTING.TXT が存在しないものとする - if (P2Util::isHostMachiBbs($this->_host) || P2Util::isHostJbbsShitaraba($this->_host)) { + if (P2BbsType::isHostMachiBbs($this->_host) || P2BbsType::isHostJbbsShitaraba($this->_host)) { return false; } @@ -118,7 +118,7 @@ public function downloadSettingTxt() //var_dump($req->getResponseHeader()); $body = $response->getBody(); // したらば or be.2ch.net ならEUCをSJISに変換 - if (P2Util::isHostJbbsShitaraba($this->host) || P2BbsType::isHostBe2chs($this->host)) { + if (P2BbsType::isHostJbbsShitaraba($this->host) || P2BbsType::isHostBe2chs($this->host)) { $body = mb_convert_encoding($body, 'CP932', 'CP51932'); } if (FileCtl::file_write_contents($this->_setting_txt, $body) === false) { diff --git a/lib/ShowThread.php b/lib/ShowThread.php index 79ac36c8b..1bf139e76 100644 --- a/lib/ShowThread.php +++ b/lib/ShowThread.php @@ -347,11 +347,11 @@ protected function __construct(ThreadRead $aThread, $matome = false) $this->_highlight_nums = array(); $this->_highlight_msgs = array(); - if (P2Util::isHostBbsPink($this->thread->host)) { + if (P2BbsType::isHostBbsPink($this->thread->host)) { $this->_redirector = self::REDIRECTOR_PINKTOWER; - } elseif (P2Util::isHost2chs($this->thread->host)) { + } elseif (P2BbsType::isHost2chs($this->thread->host)) { $this->_redirector = self::REDIRECTOR_IMENU; - } elseif (P2Util::isHostMachiBbs($this->thread->host)) { + } elseif (P2BbsType::isHostMachiBbs($this->thread->host)) { $this->_redirector = self::REDIRECTOR_MACHIBBS; } else { $this->_redirector = self::REDIRECTOR_NONE; diff --git a/lib/ShowThreadI.php b/lib/ShowThreadI.php index 9d072354d..4f9aa49c5 100644 --- a/lib/ShowThreadI.php +++ b/lib/ShowThreadI.php @@ -65,7 +65,7 @@ public function __construct(ThreadRead $aThread, $matome = false) $this->setBbsNonameName(); } - if (P2Util::isHost2chs($aThread->host)) { + if (P2BbsType::isHost2chs($aThread->host)) { $this->_kushiYakiName = ' [―{}@{}@{}-] '; } diff --git a/lib/ShowThreadK.php b/lib/ShowThreadK.php index 6343effd4..8b638ec1c 100644 --- a/lib/ShowThreadK.php +++ b/lib/ShowThreadK.php @@ -65,7 +65,7 @@ public function __construct(ThreadRead $aThread, $matome = false) $this->setBbsNonameName(); } - if (P2Util::isHost2chs($aThread->host)) { + if (P2BbsType::isHost2chs($aThread->host)) { $this->_kushiYakiName = ' [―{}@{}@{}-] '; } diff --git a/lib/SubjectTxt.php b/lib/SubjectTxt.php index 495586de9..2381b3b1d 100644 --- a/lib/SubjectTxt.php +++ b/lib/SubjectTxt.php @@ -31,16 +31,16 @@ public function __construct($host, $bbs) $this->subject_file = P2Util::datDirOfHostBbs($host, $bbs) . 'subject.txt'; // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) - if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host) && $_conf['2ch_ssl.subject']) { + if (P2BbsType::isHost2chs($host) && ! P2BbsType::isHostBbsPink($host) && $_conf['2ch_ssl.subject']) { $this->subject_url = 'https://' . $host . '/' . $bbs . '/subject.txt'; } else { $this->subject_url = 'http://' . $host . '/' . $bbs . '/subject.txt'; } // したらばのlivedoor移転に対応。読込先をlivedoorとする。 - if(P2Util::isHostJbbsShitaraba($host)) + if(P2BbsType::isHostJbbsShitaraba($host)) { - $this->subject_url = P2Util::adjustHostJbbs($this->subject_url); + $this->subject_url = P2BbsType::adjustHostJbbs($this->subject_url); } // subject.txtをダウンロード&セットする @@ -114,7 +114,7 @@ public function downloadSubject() //var_dump($req->getResponseHeader()); $body = $response->getBody(); // したらば or be.2ch.net ならEUCをSJISに変換 - if (P2Util::isHostJbbsShitaraba($this->host) || P2BbsType::isHostBe2chs($this->host)) { + if (P2BbsType::isHostJbbsShitaraba($this->host) || P2BbsType::isHostBe2chs($this->host)) { $body = mb_convert_encoding($body, 'CP932', 'CP51932'); } if (FileCtl::file_write_contents($this->subject_file, $body) === false) { @@ -184,7 +184,7 @@ public function setSubjectLines($cont = '') $this->subject_lines = FileCtl::file_read_lines($this->subject_file); // JBBS@したらばなら重複スレタイを削除する - if (P2Util::isHostJbbsShitaraba($this->host)) { + if (P2BbsType::isHostJbbsShitaraba($this->host)) { $this->subject_lines = array_unique($this->subject_lines); } diff --git a/lib/Thread.php b/lib/Thread.php index eae31de44..45f024606 100644 --- a/lib/Thread.php +++ b/lib/Thread.php @@ -497,13 +497,13 @@ public function getMotoThread($force_pc = false, $ls = null) } // 2ch系 - if (P2Util::isHost2chs($this->host)) { + if (P2BbsType::isHost2chs($this->host)) { // PC if (!$mobile) { $motothre_url = "http://{$this->host}/test/read.cgi/{$this->bbs}/{$this->key}/{$ls}"; // 携帯 } else { - if (P2Util::isHostBbsPink($this->host)) { + if (P2BbsType::isHostBbsPink($this->host)) { //$motothre_url = "http://{$this->host}/test/r.i/{$this->bbs}/{$this->key}/{$ls}"; $motothre_url = "http://speedo.ula.cc/test/r.so/{$this->host}/{$this->bbs}/{$this->key}/{$ls}"; } else { @@ -515,7 +515,7 @@ public function getMotoThread($force_pc = false, $ls = null) } // まちBBS - } elseif (P2Util::isHostMachiBbs($this->host)) { + } elseif (P2BbsType::isHostMachiBbs($this->host)) { if ($mobile) { $motothre_url = "http://{$this->host}/bbs/read.pl?IMODE=TRUE&BBS={$this->bbs}&KEY={$this->key}"; } else { @@ -523,13 +523,13 @@ public function getMotoThread($force_pc = false, $ls = null) } // まちびねっと - } elseif (P2Util::isHostMachiBbsNet($this->host)) { + } elseif (P2BbsType::isHostMachiBbsNet($this->host)) { $motothre_url = "http://{$this->host}/test/read.cgi?bbs={$this->bbs}&key={$this->key}"; if ($mobile) { $motothre_url .= '&imode=true'; } // JBBSしたらば - } elseif (P2Util::isHostJbbsShitaraba($this->host)) { - list($host, $category) = explode('/', P2Util::adjustHostJbbs($this->host), 2); + } elseif (P2BbsType::isHostJbbsShitaraba($this->host)) { + list($host, $category) = explode('/', P2BbsType::adjustHostJbbs($this->host), 2); $bbs_cgi = ($mobile) ? 'i.cgi' : 'read.cgi'; $motothre_url = "http://{$host}/bbs/{$bbs_cgi}/{$category}/{$this->bbs}/{$this->key}/{$ls}"; diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 885309bdd..d71e61805 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -47,10 +47,10 @@ public function downloadDat() { global $_conf; // まちBBS - if (P2Util::isHostMachiBbs ($this->host)) { + if (P2BbsType::isHostMachiBbs ($this->host)) { return DownloadDatMachiBbs::invoke ($this); // JBBS@したらば - } elseif (P2Util::isHostJbbsShitaraba ($this->host)) { + } elseif (P2BbsType::isHostJbbsShitaraba ($this->host)) { if (! function_exists ('shitarabaDownload')) { include P2_LIB_DIR . '/read_shitaraba.inc.php'; } @@ -141,7 +141,7 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { $url= http_build_url(array( "scheme" => $_conf['2chapi_ssl.read']?"https":"http", - "host" => P2Util::isHost5ch($this->host)?"api.5ch.net":"api.2ch.net", + "host" => P2BbsType::isHost5ch($this->host)?"api.5ch.net":"api.2ch.net", "path" => "v1/".$serverName[0] . '/' . $this->bbs . '/' . $this->key)); $message = '/v1/' . $serverName[0] . '/' . $this->bbs . '/' . $this->key . $SID2ch . $AppKey; @@ -418,7 +418,7 @@ protected function _downloadDat2ch($from_bytes) { $this->modified = $response->getHeader ('Last-Modified'); // ホストが2chの時にDATを利用できない旨のメッセージが出たらエラーとする(DAT破損対策) - if (P2Util::isHost2chs ($this->host)) { + if (P2BbsType::isHost2chs ($this->host)) { // 1行目を切り出す $posLF = mb_strpos ($body, "\n"); $firstmsg = mb_substr ($body, 0, $posLF === false ? mb_strlen ($body) : $posLF); @@ -605,7 +605,7 @@ public function get2chDatError($code = null) { } $reason = null; - if (P2Util::isHost2chs ($this->host) || P2Util::isHostVip2ch ($this->host)) { + if (P2BbsType::isHost2chs ($this->host) || P2BbsType::isHostVip2ch ($this->host)) { if ($code == '302') { $body203 = $this->_get2ch203Body(); if ($body203 !== false && preg_match('/過去ログ ★/', $body203)) { @@ -629,7 +629,7 @@ public function get2chDatError($code = null) { try { $req = P2Commun::createHTTPRequest ($read_url.'1', HTTP_Request2::METHOD_GET); // ヘッダ - $req->setHeader ('User-Agent', P2Commun::getP2UA(false,P2Util::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG + $req->setHeader ('User-Agent', P2Commun::getP2UA(false,P2BbsType::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG // Requestの送信 $response = P2Commun::getHTTPResponse($req); @@ -783,7 +783,7 @@ public function previewOne() { fclose ($fd); // be.2ch.net ならEUC→SJIS変換 - if (P2Util::isHostBe2chNet ($this->host)) { + if (P2BbsType::isHostBe2chNet ($this->host)) { $first_line = mb_convert_encoding ($first_line, 'CP932', 'CP51932'); } @@ -833,7 +833,7 @@ public function previewOneNotFound($code = null) { $this->diedat = true; // 2ch, bbspink, vip2ch ならread.cgiで確認 - if (P2Util::isHost2chs ($this->host) || P2Util::isHostVip2ch ($this->host)) { + if (P2BbsType::isHost2chs ($this->host) || P2BbsType::isHostVip2ch ($this->host)) { $this->getdat_error_msg_ht = $this->get2chDatError ($code); if (count ($this->datochi_residuums)) { if ($_conf['ktai']) { @@ -997,7 +997,7 @@ public function readDat() { // be.2ch.net ならEUC→SJIS変換 // 念のためSJISとUTF-8も文字コード判定の候補に入れておく // ・・・が、文字化けしたタイトルのスレッドで誤判定があったので、指定しておく - if (P2Util::isHostBe2chNet ($this->host)) { + if (P2BbsType::isHostBe2chNet ($this->host)) { // mb_convert_variables('CP932', 'CP51932,CP932,UTF-8', $this->datlines); mb_convert_variables ('CP932', 'CP51932', $this->datlines); } @@ -1080,7 +1080,7 @@ public function explodeDatLine($aline) { * @return array */ public function scanOriginalHosts() { - if (P2Util::isHost2chs ($this->host) && file_exists ($this->keydat) && ($dat = file_get_contents ($this->keydat))) { + if (P2BbsType::isHost2chs ($this->host) && file_exists ($this->keydat) && ($dat = file_get_contents ($this->keydat))) { $bbs_re = preg_quote ($this->bbs, '@'); $pattern = "@/(\\w+\\.(?:2ch\\.net|bbspink\\.com))(?:/test/read\\.cgi)?/{$bbs_re}\\b@"; if (preg_match_all ($pattern, $dat, $matches, PREG_PATTERN_ORDER)) { diff --git a/lib/expack/tgrep/view.inc.php b/lib/expack/tgrep/view.inc.php index 8178033c4..0a08ca9e5 100644 --- a/lib/expack/tgrep/view.inc.php +++ b/lib/expack/tgrep/view.inc.php @@ -148,7 +148,7 @@ function moveSubject(href, serachWord, query) { $new = ''; $turl = sprintf('%s?host=%s&bbs=%s&key=%d', $_conf['read_php'], $t->host, $t->bbs, $t->tkey); $burl = sprintf('%s?host=%s&bbs=%s&itaj_en=%s&word=%s', $_conf['subject_php'], $t->host, $t->bbs, UrlSafeBase64::encode($t->ita), $htm['query_en']); - if (P2Util::isHostMachiBbs($t->host)) { + if (P2BbsType::isHostMachiBbs($t->host)) { $ourl = sprintf('http://%s/bbs/read.cgi/%s/%s/', $t->host, $t->bbs, $t->tkey); } else { $ourl = sprintf('http://%s/test/read.cgi/%s/%s/', $t->host, $t->bbs, $t->tkey); diff --git a/lib/plugins/hissi/Hissi.php b/lib/plugins/hissi/Hissi.php index 4f5ec41df..78471b081 100644 --- a/lib/plugins/hissi/Hissi.php +++ b/lib/plugins/hissi/Hissi.php @@ -83,7 +83,7 @@ public function load() public function isEnabled() { if ($this->host) { - if (!P2Util::isHost2chs($this->host)) { + if (!P2BbsType::isHost2chs($this->host)) { return false; } } diff --git a/lib/plugins/mimizun/Mimizun.php b/lib/plugins/mimizun/Mimizun.php index 91702a696..e04213aee 100644 --- a/lib/plugins/mimizun/Mimizun.php +++ b/lib/plugins/mimizun/Mimizun.php @@ -91,11 +91,11 @@ public function isEnabled() // (セットされていなければ2chとみなす) if ($this->host) { // まちBBSならfalse - if (P2Util::isHostMachiBbs($this->host)) { + if (P2BbsType::isHostMachiBbs($this->host)) { return false; } // 2chでなければfalse - if (!P2Util::isHost2chs($this->host)) { + if (!P2BbsType::isHost2chs($this->host)) { return false; } } diff --git a/lib/plugins/stalker/Stalker.php b/lib/plugins/stalker/Stalker.php index b101af913..8c788e959 100644 --- a/lib/plugins/stalker/Stalker.php +++ b/lib/plugins/stalker/Stalker.php @@ -24,7 +24,7 @@ class Stalker public function isEnabled() { if ($this->host) { - if (!P2Util::isHost2chs($this->host)) { + if (!P2BbsType::isHost2chs($this->host)) { return false; } } diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index 3ceda6076..53a61e5e7 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -168,13 +168,13 @@ function setHiddenValue(button) { // {{{ ●/Be 書き込み チェックボックス // 2ch●書き込み -if (P2Util::isHost2chs($host) and file_exists($_conf['sid2ch_php'])) { +if (P2BbsType::isHost2chs($host) and file_exists($_conf['sid2ch_php'])) { $htm['maru_post'] = '' . ''; } // Be -if (P2Util::isHost2chs($host) and P2Util::isEnableBe2ch()) { +if (P2BbsType::isHost2chs($host) and P2Util::isEnableBe2ch()) { $htm['beres'] = '' . ''; } @@ -208,7 +208,7 @@ function setHiddenValue(button) { $htm['dpreview2'] = ''; if (!$_conf['ktai'] && $_conf['expack.editor.dpreview']) { $_dpreview_noname = 'null'; - if (P2Util::isHost2chs($host)) { + if (P2BbsType::isHost2chs($host)) { $_dpreview_st = new SettingTxt($host, $bbs); $_dpreview_st->setSettingArray(); if (!empty($_dpreview_st->setting_array['BBS_NONAME_NAME'])) { diff --git a/lib/read_shitaraba.inc.php b/lib/read_shitaraba.inc.php index 131856c04..00ce27460 100644 --- a/lib/read_shitaraba.inc.php +++ b/lib/read_shitaraba.inc.php @@ -36,9 +36,9 @@ function shitarabaDownload(ThreadRead $aThread) } // JBBS@したらば - if (P2Util::isHostJbbsShitaraba($aThread->host)) { + if (P2BbsType::isHostJbbsShitaraba($aThread->host)) { // したらばのlivedoor移転に対応。読込先をlivedoorとする。 - $host = P2Util::adjustHostJbbs($aThread->host); + $host = P2BbsType::adjustHostJbbs($aThread->host); list($host, $category, ) = explode('/', $host); $machiurl = "http://{$host}/bbs/rawmode.cgi/{$category}/{$aThread->bbs}/{$aThread->key}/{$START}-"; } @@ -55,7 +55,7 @@ function shitarabaDownload(ThreadRead $aThread) unset($machiurl_res); // {{{ したらばならEUCをSJISに変換 - if (P2Util::isHostJbbsShitaraba($aThread->host)) { + if (P2BbsType::isHostJbbsShitaraba($aThread->host)) { $temp_data = FileCtl::file_read_contents($tempfile); $temp_data = mb_convert_encoding($temp_data, 'CP932', 'CP51932'); if (FileCtl::file_write_contents($tempfile, $temp_data) === false) { diff --git a/lib/sb_footer.inc.php b/lib/sb_footer.inc.php index ed383accd..25b443234 100644 --- a/lib/sb_footer.inc.php +++ b/lib/sb_footer.inc.php @@ -82,11 +82,11 @@ // スペシャルモードでなければフォーム入力補完======================== $ini_url_text = ''; if (!$aThreadList->spmode) { - if (P2Util::isHostJbbsShitaraba($aThreadList->host)) { // したらば + if (P2BbsType::isHostJbbsShitaraba($aThreadList->host)) { // したらば $ini_url_text = "http://{$aThreadList->host}/bbs/read.cgi?BBS={$aThreadList->bbs}&KEY="; - } elseif (P2Util::isHostMachiBbs($aThreadList->host)) { // まちBBS + } elseif (P2BbsType::isHostMachiBbs($aThreadList->host)) { // まちBBS $ini_url_text = "http://{$aThreadList->host}/bbs/read.pl?BBS={$aThreadList->bbs}&KEY="; - } elseif (P2Util::isHostMachiBbsNet($aThreadList->host)) { // まちビねっと + } elseif (P2BbsType::isHostMachiBbsNet($aThreadList->host)) { // まちビねっと $ini_url_text = "http://{$aThreadList->host}/test/read.cgi?bbs={$aThreadList->bbs}&key="; } else { $ini_url_text = "http://{$aThreadList->host}/test/read.cgi/{$aThreadList->bbs}/"; diff --git a/lib/sb_header_k.inc.php b/lib/sb_header_k.inc.php index 79f856d38..84eaafe86 100644 --- a/lib/sb_header_k.inc.php +++ b/lib/sb_header_k.inc.php @@ -21,8 +21,8 @@ $ptitle_url = $p2_subject_url; // 2ch系 - } elseif (P2Util::isHost2chs($aThreadList->host)) { - if (P2Util::isHostBbsPink($aThreadList->host)) { + } elseif (P2BbsType::isHost2chs($aThreadList->host)) { + if (P2BbsType::isHostBbsPink($aThreadList->host)) { //$ptitle_url = "http://{$aThreadList->host}/{$aThreadList->bbs}/i/"; $ptitle_url = "http://speedo.ula.cc/test/p.so/{$aThreadList->host}/{$aThreadList->bbs}/"; } else { diff --git a/lib/sb_print_k.inc.php b/lib/sb_print_k.inc.php index db15c40c5..6ac4f3649 100644 --- a/lib/sb_print_k.inc.php +++ b/lib/sb_print_k.inc.php @@ -240,7 +240,7 @@ function sb_print_k($aThreadList) } // >>1のみ, >>1から - if (P2Util::isHost2chs($aThreadList->host) && !$aThread->isKitoku()) { + if (P2BbsType::isHost2chs($aThreadList->host) && !$aThread->isKitoku()) { switch ($_conf['mobile.sb_show_first']) { case 1: $thre_url = $onlyone_url; diff --git a/lib/wiki/Samba.php b/lib/wiki/Samba.php index f4080167f..bca2d7db0 100644 --- a/lib/wiki/Samba.php +++ b/lib/wiki/Samba.php @@ -69,7 +69,7 @@ public function save() public function getSambaTime($host, $bbs) { - if (!P2Util::isHost2chs($host)) { + if (!P2BbsType::isHost2chs($host)) { return false; } // sambaを取得 @@ -105,7 +105,7 @@ public function setWriteTime($host, $bbs) // 残り時間を取得 public function getSamba($host, $bbs) { - if (!P2Util::isHost2chs($host)) { + if (!P2BbsType::isHost2chs($host)) { return -1; } From aa9238e41c3d7b8b2a2f0b041592ae4aa0e6e4fe Mon Sep 17 00:00:00 2001 From: killer4989 Date: Fri, 27 Oct 2017 22:08:47 +0900 Subject: [PATCH 287/339] =?UTF-8?q?2ch=20API=20=E3=81=AE=E7=8A=B6=E6=85=8B?= =?UTF-8?q?=E3=81=8C=E3=83=98=E3=83=83=E3=83=80=E3=83=BC=E3=81=AB=E8=A8=98?= =?UTF-8?q?=E8=BC=89=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84=E3=81=AA=E3=81=84?= =?UTF-8?q?=E5=A0=B4=E5=90=88=E3=81=AF=200=20=E3=81=A8=E3=81=BF=E3=81=AA?= =?UTF-8?q?=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index d71e61805..fb316c9ee 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -180,10 +180,18 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { // 3 (sessionID有効/API認証時にRoninアカウントを付けて取得したもの) // ※ User-Status: が 2,3 の時はdat落ち/過去ログも取れる $apiUserStatus = $response->getHeader('User-Status'); + if(empty($apiUserStatus)){ + // ヘッダーに記載されていない場合は 0 とみなす + $apiUserStatus = 0; + } // Thread-Status: 0 (dat取得不可) or 1 (現行スレ) or 2 (dat落ち) or 3 (過去ログ) or // 8 (dat取得不可/Ronin無しでdat落ち/過去ログを取ろうとしたとき) $apiThreadStatus = $response->getHeader('Thread-Status'); + if(empty($apiThreadStatus)){ + // ヘッダーに記載されていない場合は 0 とみなす + $apiThreadStatus = 0; + } $code = $response->getStatus (); From dc4cdbc418b0f5ed2d20a4baed6d693ad291b88d Mon Sep 17 00:00:00 2001 From: killer4989 Date: Fri, 27 Oct 2017 22:14:47 +0900 Subject: [PATCH 288/339] =?UTF-8?q?dat=E5=8F=96=E5=BE=97=E4=B8=8D=E5=8F=AF?= =?UTF-8?q?=E3=81=A0=E3=81=A3=E3=81=9F=E5=A0=B4=E5=90=88=E3=81=AE=E3=83=A1?= =?UTF-8?q?=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=82=92=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index fb316c9ee..0db2f327d 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -200,6 +200,17 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { P2Util::pushInfoHtml('

    p2 debug(ThreadRead::API):URL='.$url.' User-Status='.$apiUserStatus.' Thread-Status='.$apiThreadStatus.' HTTP-Status='.$code.'

    '); } + // dat取得不可だった場合 + if($apiThreadStatus === 0){ + $this->getdat_error_msg_ht .= "

    rep2 error: sessionID " . ($apiUserStatus === 0 ? 'が無効だったので':'は有効でしたが') . "スレッド取得に失敗しました。

    "; + if($apiUserStatus === 0){ + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&relogin2chapi=true\">APIで再取得を試みる]"; + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&olddat=true\">旧datで再取得を試みる]"; + $this->diedat = true; + return false; + } + } + // APIの返答が過去ログ(Ronin無)だったら過去ログリンクを表示して終了 if($apiThreadStatus == '8') { return $this->_downloadDat2chNotFound ('302'); From 82e3ef770aa1cef38a1d799a15a833b3e25efb7c Mon Sep 17 00:00:00 2001 From: killer4989 Date: Fri, 27 Oct 2017 22:41:06 +0900 Subject: [PATCH 289/339] =?UTF-8?q?=E8=82=A5=E5=A4=A7=E5=8C=96=E3=81=97?= =?UTF-8?q?=E3=81=9F=20P2Util=20=E3=81=8B=E3=82=89=E3=83=9B=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=88=A4=E5=AE=9A=E9=96=A2=E4=BF=82=E3=81=AE=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=E3=82=92=20P2BbsType=20=E3=81=AB=E7=A7=BB=E5=8B=95(?= =?UTF-8?q?=E7=AC=AC3=E5=BC=BE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 縺セ縺縺ゅ▲縺(逋ス逶ョ --- lib/ShowThread.php | 4 ++-- lib/ShowThreadI.php | 4 ++-- lib/ShowThreadK.php | 4 ++-- lib/ShowThreadPc.php | 2 +- rep2/info.php | 2 +- rep2/live_post_form.php | 2 +- rep2/post.php | 20 ++++++++++---------- rep2/post_draft.php | 4 ++-- rep2/post_form.php | 2 +- 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/lib/ShowThread.php b/lib/ShowThread.php index 1bf139e76..d6143b438 100644 --- a/lib/ShowThread.php +++ b/lib/ShowThread.php @@ -1179,7 +1179,7 @@ private function _transLinkDo(array $s) if (strlen($following) > 0) { // ウィキペディア日本語版のURLで、SJISの2バイト文字の上位バイト // (0x81-0x9F,0xE0-0xEF)が続くとき - if (P2Util::isUrlWikipediaJa($url)) { + if (P2BbsType::isUrlWikipediaJa($url)) { $leading = ord($following); if ((($leading ^ 0x90) < 32 && $leading != 0x80) || ($leading ^ 0xE0) < 16) { $url .= rawurlencode(mb_convert_encoding($following, 'UTF-8', 'CP932')); @@ -1229,7 +1229,7 @@ private function _transLinkDo(array $s) $purl['host'] == '127.0.0.1' || //HostCheck::isAddressLocal($purl['host']) || //HostCheck::isAddressPrivate($purl['host']) || - P2Util::isHostExample($purl['host'])) + P2BbsType::isHostExample($purl['host'])) { return $orig; } diff --git a/lib/ShowThreadI.php b/lib/ShowThreadI.php index 4f9aa49c5..8b5f7acb8 100644 --- a/lib/ShowThreadI.php +++ b/lib/ShowThreadI.php @@ -893,7 +893,7 @@ public function plugin_viewImage($url, $purl, $str) { global $_conf; - if (P2Util::isUrlWikipediaJa($url)) { + if (P2BbsType::isUrlWikipediaJa($url)) { return false; } @@ -920,7 +920,7 @@ public function plugin_replaceImageUrl($url, $purl, $str) global $_conf; global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit_k; - if (P2Util::isUrlWikipediaJa($url)) { + if (P2BbsType::isUrlWikipediaJa($url)) { return false; } diff --git a/lib/ShowThreadK.php b/lib/ShowThreadK.php index 8b638ec1c..07c2654c3 100644 --- a/lib/ShowThreadK.php +++ b/lib/ShowThreadK.php @@ -834,7 +834,7 @@ public function plugin_viewImage($url, $purl, $str) { global $_conf; - if (P2Util::isUrlWikipediaJa($url)) { + if (P2BbsType::isUrlWikipediaJa($url)) { return false; } @@ -861,7 +861,7 @@ public function plugin_replaceImageUrl($url, $purl, $str) global $_conf; global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit_k; - if (P2Util::isUrlWikipediaJa($url)) { + if (P2BbsType::isUrlWikipediaJa($url)) { return false; } diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index 353ec8889..3f8de0e08 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -1318,7 +1318,7 @@ public function plugin_viewImage($url, $purl, $str) global $_conf; global $pre_thumb_unlimited, $pre_thumb_limit; - if (P2Util::isUrlWikipediaJa($url)) { + if (P2BbsType::isUrlWikipediaJa($url)) { return false; } diff --git a/rep2/info.php b/rep2/info.php index 7fbe15e64..e7c91a8fe 100644 --- a/rep2/info.php +++ b/rep2/info.php @@ -283,7 +283,7 @@ } $motothre_url = $aThread->getMotoThread(); -if (P2Util::isHost2chs($aThread->host)) { +if (P2BbsType::isHost2chs($aThread->host)) { $motothre_org_url = $aThread->getMotoThread(true); } else { $motothre_org_url = $motothre_url; diff --git a/rep2/live_post_form.php b/rep2/live_post_form.php index 14182b32a..f7b1c5798 100755 --- a/rep2/live_post_form.php +++ b/rep2/live_post_form.php @@ -57,7 +57,7 @@ $ptitle = "{$itaj_hd} - 新規スレッド作成"; // machibbs、JBBS@したらば なら - if (P2Util::isHostMachiBbs($host) or P2Util::isHostJbbsShitaraba($host)) { + if (P2BbsType::isHostMachiBbs($host) or P2BbsType::isHostJbbsShitaraba($host)) { $submit_value = '新規書き込み'; // 2chなら } else { diff --git a/rep2/post.php b/rep2/post.php index c9a797531..d7d57d35b 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -84,13 +84,13 @@ // }}} // machibbs、JBBS@したらば なら -if (P2Util::isHostMachiBbs($host) or P2Util::isHostJbbsShitaraba($host)) { +if (P2BbsType::isHostMachiBbs($host) or P2BbsType::isHostJbbsShitaraba($host)) { $bbs_cgi = '/bbs/write.cgi'; // JBBS@したらば なら - if (P2Util::isHostJbbsShitaraba($host)) { + if (P2BbsType::isHostJbbsShitaraba($host)) { // したらばの移転に対応。post先を現行に合わせる。 - $host = P2Util::adjustHostJbbs($host); + $host = P2BbsType::adjustHostJbbs($host); $bbs_cgi = '../../bbs/write.cgi'; preg_match('/\\/(\\w+)$/', $host, $ar); $dir = $ar[1]; @@ -148,13 +148,13 @@ exit; } -if (P2Util::isHostJbbsShitaraba($host)) { +if (P2BbsType::isHostJbbsShitaraba($host)) { $post[$dir_k] = $dir; } // {{{ 2chで●ログイン中ならsid追加 -if (!empty($_POST['maru']) and P2Util::isHost2chs($host)) { +if (!empty($_POST['maru']) and P2BbsType::isHost2chs($host)) { $maru_time = 0; if (file_exists($_conf['sid2ch_php'])) { @@ -212,7 +212,7 @@ PostDataStore::set($post_backup_key, $post_cache); // cookie 読み込み -$cookie_key = $_login->user_u . '/' . P2Util::normalizeHostName(P2Util::isHostBbsPink($host) ? 'www.bbspink.com' : P2Util::isHost2chs($host) ? 'www.2ch.net' : $host); // 忍法帳対応 +$cookie_key = $_login->user_u . '/' . P2Util::normalizeHostName(P2BbsType::isHostBbsPink($host) ? 'www.bbspink.com' : P2BbsType::isHost2chs($host) ? 'www.2ch.net' : $host); // 忍法帳対応 if ($p2cookies = CookieDataStore::get($cookie_key)) { if (is_array($p2cookies)) { if (array_key_exists('expires', $p2cookies)) { @@ -389,7 +389,7 @@ function postIt($host, $bbs, $key, $post) global $bbs_cgi; // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) - if (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host) && $_conf['2ch_ssl.post']) { + if (P2BbsType::isHost2chs($host) && ! P2BbsType::isHostBbsPink($host) && $_conf['2ch_ssl.post']) { $bbs_cgi_url = 'https://' . $host . $bbs_cgi; } else { $bbs_cgi_url = 'http://' . $host . $bbs_cgi; @@ -428,9 +428,9 @@ function postIt($host, $bbs, $key, $post) while (list($name, $value) = each($post)) { // したらば or be.2ch.netなら、EUCに変換 - if (P2Util::isHostJbbsShitaraba($host) || P2BbsType::isHostBe2chs($host)) { + if (P2BbsType::isHostJbbsShitaraba($host) || P2BbsType::isHostBe2chs($host)) { $value = mb_convert_encoding($value, 'CP51932', 'CP932'); - } elseif (P2Util::isHost2chs($host) && ! P2Util::isHostBbsPink($host)) { + } elseif (P2BbsType::isHost2chs($host) && ! P2BbsType::isHostBbsPink($host)) { // 2chはUnicodeの文字列をpostする $value = html_entity_decode(mb_convert_encoding($value, 'UTF-8', 'CP932'),ENT_QUOTES,'UTF-8'); } @@ -464,7 +464,7 @@ function postIt($host, $bbs, $key, $post) } // be.2ch.net or JBBSしたらば 文字コード変換 EUC→SJIS - if (P2BbsType::isHostBe2chs($host) || P2Util::isHostJbbsShitaraba($host)) { + if (P2BbsType::isHostBe2chs($host) || P2BbsType::isHostJbbsShitaraba($host)) { $body = mb_convert_encoding($body, 'CP932', 'CP51932'); // diff --git a/rep2/post_draft.php b/rep2/post_draft.php index 152585d0b..b70b8f920 100644 --- a/rep2/post_draft.php +++ b/rep2/post_draft.php @@ -44,10 +44,10 @@ } // したらばのlivedoor移転に対応。post先をlivedoorとする。 -$host = P2Util::adjustHostJbbs($host); +$host = P2BbsType::adjustHostJbbs($host); // machibbs、JBBS@したらば なら -if (P2Util::isHostMachiBbs($host) or P2Util::isHostJbbsShitaraba($host)) { +if (P2BbsType::isHostMachiBbs($host) or P2BbsType::isHostJbbsShitaraba($host)) { /* compact() と array_combine() でPOSTする値の配列を作るので、 $post_param_keys と $post_send_keys の値の順序は揃える! */ //$post_param_keys = array('bbs', 'key', 'time', 'FROM', 'mail', 'MESSAGE', 'subject', 'submit'); diff --git a/rep2/post_form.php b/rep2/post_form.php index fb935ca12..f88181be4 100644 --- a/rep2/post_form.php +++ b/rep2/post_form.php @@ -55,7 +55,7 @@ $ptitle = "{$itaj_hd} - 新規スレッド作成"; // machibbs、JBBS@したらば なら - if (P2Util::isHostMachiBbs($host) or P2Util::isHostJbbsShitaraba($host)) { + if (P2BbsType::isHostMachiBbs($host) or P2BbsType::isHostJbbsShitaraba($host)) { $submit_value = '新規書き込み'; // 2chなら } else { From 7e046a92abad6157c2bac31e3d34d28cd1b8ffdc Mon Sep 17 00:00:00 2001 From: killer4989 Date: Fri, 27 Oct 2017 23:10:08 +0900 Subject: [PATCH 290/339] =?UTF-8?q?=E8=82=A5=E5=A4=A7=E5=8C=96=E3=81=97?= =?UTF-8?q?=E3=81=9F=20P2Util=20=E3=81=8B=E3=82=89=E3=83=9B=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=88=A4=E5=AE=9A=E9=96=A2=E4=BF=82=E3=81=AE=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=E3=82=92=20P2BbsType=20=E3=81=AB=E7=A7=BB=E5=8B=95(?= =?UTF-8?q?=E7=AC=AC3=E5=BC=BE)=20=EF=BD=A5=20=E7=89=B9=E3=81=AB=E4=BD=95?= =?UTF-8?q?=E3=82=82=E3=81=AA=E3=81=91=E3=82=8C=E3=81=B0=E5=BE=8C=E6=97=A5?= =?UTF-8?q?=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89=E3=82=92=E6=B6=88=E3=81=99?= =?UTF-8?q?(=E4=BA=88=E5=AE=9A)=20isUrlWikipediaJa=20=E3=82=82=E5=90=AB?= =?UTF-8?q?=E3=82=93=E3=81=A7=E3=81=84=E3=81=9F=E3=81=AE=E3=81=A7=E3=82=AF?= =?UTF-8?q?=E3=83=A9=E3=82=B9=E5=90=8D=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/BbsMap.php | 8 +- lib/P2Commun.php | 4 +- lib/P2CurlMulti.php | 8 +- lib/{P2BbsType.php => P2HostType.php} | 4 +- lib/P2HttpExt.php | 4 +- lib/P2Util.php | 130 ++++++++------------------ lib/SettingTxt.php | 8 +- lib/ShowThread.php | 10 +- lib/ShowThreadI.php | 6 +- lib/ShowThreadK.php | 6 +- lib/ShowThreadPc.php | 2 +- lib/SubjectTxt.php | 10 +- lib/Thread.php | 14 +-- lib/ThreadRead.php | 22 ++--- lib/expack/tgrep/view.inc.php | 2 +- lib/plugins/hissi/Hissi.php | 2 +- lib/plugins/mimizun/Mimizun.php | 4 +- lib/plugins/stalker/Stalker.php | 2 +- lib/post_form_options.inc.php | 6 +- lib/read_shitaraba.inc.php | 6 +- lib/sb_footer.inc.php | 6 +- lib/sb_header_k.inc.php | 4 +- lib/sb_print_k.inc.php | 2 +- lib/wiki/Samba.php | 4 +- rep2/info.php | 2 +- rep2/live_post_form.php | 2 +- rep2/post.php | 22 ++--- rep2/post_draft.php | 4 +- rep2/post_form.php | 2 +- rep2/subject.php | 2 +- 30 files changed, 129 insertions(+), 179 deletions(-) rename lib/{P2BbsType.php => P2HostType.php} (99%) diff --git a/lib/BbsMap.php b/lib/BbsMap.php index d54ef7ca1..4dee44618 100644 --- a/lib/BbsMap.php +++ b/lib/BbsMap.php @@ -404,13 +404,13 @@ static private function _writeData($path, $neolines) */ static private function _detectHostType($host) { - if (P2BbsType::isHostBbsPink($host)) { + if (P2HostType::isHostBbsPink($host)) { $type = 'bbspink'; - } elseif (P2BbsType::isHost2chs($host)) { + } elseif (P2HostType::isHost2chs($host)) { $type = '2channel'; - } elseif (P2BbsType::isHostMachiBbs($host)) { + } elseif (P2HostType::isHostMachiBbs($host)) { $type = 'machibbs'; - } elseif (P2BbsType::isHostJbbsShitaraba($host)) { + } elseif (P2HostType::isHostJbbsShitaraba($host)) { $type = 'jbbs'; } else { $type = $host; diff --git a/lib/P2Commun.php b/lib/P2Commun.php index 12ab2934d..f283436e6 100644 --- a/lib/P2Commun.php +++ b/lib/P2Commun.php @@ -35,7 +35,7 @@ static public function createHTTPRequest($url , $method = HTTP_Request2::METHOD_ // よく使うヘッダを指定 // p2のHTTP通信は特に指定の無い限りMonazillaを名乗るようにする - $req->setHeader ('User-Agent', self::getP2UA(true,P2BbsType::isHost2chs($purl['host']))); + $req->setHeader ('User-Agent', self::getP2UA(true,P2HostType::isHost2chs($purl['host']))); $req->setHeader ('Accept-Language', 'ja,en-us;q=0.7,en;q=0.3'); $req->setHeader ('Accept', '*/*'); $req->setHeader ('Accept-Encoding', 'gzip, deflate'); @@ -59,7 +59,7 @@ static public function createHTTPRequest($url , $method = HTTP_Request2::METHOD_ } // プロキシ - if ($_conf['tor_use'] && P2BbsType::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット + if ($_conf['tor_use'] && P2HostType::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット $req->setConfig (array ( 'proxy_host' => $_conf['tor_proxy_host'], 'proxy_port' => $_conf['tor_proxy_port'], diff --git a/lib/P2CurlMulti.php b/lib/P2CurlMulti.php index bb28e1ccb..3a4862805 100644 --- a/lib/P2CurlMulti.php +++ b/lib/P2CurlMulti.php @@ -65,15 +65,15 @@ private function add($subjects, $force = false) { curl_setopt($this->ch[$key], CURLOPT_MAXCONNECTS, $_conf['expack.curl_per_host']); // User-Agent - if(P2BbsType::isHost2chs($host) && !P2BbsType::isNotUse2chsAPI($host) && $_conf['2chapi_use']){ + if(P2HostType::isHost2chs($host) && !P2HostType::isNotUse2chsAPI($host) && $_conf['2chapi_use']){ $user_agent = sprintf ($_conf['2chapi_ua.read'], $_conf['2chapi_appname']); } else { - $user_agent = P2Commun::getP2UA(true, P2BbsType::isHost2chs($purl['host'])); + $user_agent = P2Commun::getP2UA(true, P2HostType::isHost2chs($purl['host'])); } curl_setopt($this->ch[$key], CURLOPT_USERAGENT, $user_agent); // プロキシ - if ($_conf['tor_use'] && P2BbsType::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット + if ($_conf['tor_use'] && P2HostType::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット $tor_user_info = sprintf("%s%s@", $_conf['tor_proxy_user'], empty($_conf['tor_proxy_password']) ? "" : ":{$_conf['tor_proxy_password']}"); $tor_address = "{$_conf['tor_proxy_host']}:{$_conf['tor_proxy_port']}"; $address = sprintf("http://%s%s", strpos($tor_user_info, "@") === 0 ? "" : $tor_user_info, $tor_address); @@ -171,7 +171,7 @@ private function getResult() { $data = curl_multi_getcontent($ch_array); $header_size = $tmp['header_size']; - if (P2BbsType::isHostJbbsShitaraba($host) || P2BbsType::isHostBe2chs($host)) { + if (P2HostType::isHostJbbsShitaraba($host) || P2HostType::isHostBe2chs($host)) { $data = mb_convert_encoding($data, 'CP932', 'CP51932'); } diff --git a/lib/P2BbsType.php b/lib/P2HostType.php similarity index 99% rename from lib/P2BbsType.php rename to lib/P2HostType.php index accb99f6f..e1664ed53 100644 --- a/lib/P2BbsType.php +++ b/lib/P2HostType.php @@ -1,6 +1,6 @@ $_conf['2ch_ssl.post'] ? "https" : "http", - "host" => P2BbsType::isHost5ch($host) ? "be.5ch.net" : "be.2ch.net", + "host" => P2HostType::isHost5ch($host) ? "be.5ch.net" : "be.2ch.net", "path" => "index.php")); try { @@ -2214,12 +2170,6 @@ static public function debug() echo PHP_EOL; echo '/', '*', '
    ', PHP_EOL;
             echo p2h(print_r(self::$_hostDirs, true)), PHP_EOL;
    -        echo p2h(print_r(array_map('intval', self::$_hostIs2chs), true)), PHP_EOL;
    -        //echo p2h(print_r(array_map('intval', self::$_hostIsBe2chNet), true)), PHP_EOL;
    -        echo p2h(print_r(array_map('intval', self::$_hostIsBbsPink), true)), PHP_EOL;
    -        echo p2h(print_r(array_map('intval', self::$_hostIsMachiBbs), true)), PHP_EOL;
    -        echo p2h(print_r(array_map('intval', self::$_hostIsMachiBbsNet), true)), PHP_EOL;
    -        echo p2h(print_r(array_map('intval', self::$_hostIsJbbsShitaraba), true)), PHP_EOL;
             echo '
    ', '*', '/', PHP_EOL; } */ diff --git a/lib/SettingTxt.php b/lib/SettingTxt.php index dd8aa5aeb..499e18c83 100644 --- a/lib/SettingTxt.php +++ b/lib/SettingTxt.php @@ -39,12 +39,12 @@ public function __construct($host, $bbs) $this->_setting_srd = $dat_host_bbs_dir_s . 'p2_kb_setting.srd'; // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) - if (P2BbsType::isHost2chs($host) && ! P2BbsType::isHostBbsPink($host) && $_conf['2ch_ssl.subject']) { + if (P2HostType::isHost2chs($host) && ! P2HostType::isHostBbsPink($host) && $_conf['2ch_ssl.subject']) { $this->_url = 'https://' . $host . '/' . $bbs . '/SETTING.TXT'; } else { $this->_url = 'http://' . $host . '/' . $bbs . '/SETTING.TXT'; } - //$this->_url = P2BbsType::adjustHostJbbs($this->_url); // したらばのlivedoor移転に対応。読込先をlivedoorとする。 + //$this->_url = P2HostType::adjustHostJbbs($this->_url); // したらばのlivedoor移転に対応。読込先をlivedoorとする。 $this->setting_array = array(); @@ -80,7 +80,7 @@ public function downloadSettingTxt() global $_conf; // まちBBS・したらば は SETTING.TXT が存在しないものとする - if (P2BbsType::isHostMachiBbs($this->_host) || P2BbsType::isHostJbbsShitaraba($this->_host)) { + if (P2HostType::isHostMachiBbs($this->_host) || P2HostType::isHostJbbsShitaraba($this->_host)) { return false; } @@ -118,7 +118,7 @@ public function downloadSettingTxt() //var_dump($req->getResponseHeader()); $body = $response->getBody(); // したらば or be.2ch.net ならEUCをSJISに変換 - if (P2BbsType::isHostJbbsShitaraba($this->host) || P2BbsType::isHostBe2chs($this->host)) { + if (P2HostType::isHostJbbsShitaraba($this->host) || P2HostType::isHostBe2chs($this->host)) { $body = mb_convert_encoding($body, 'CP932', 'CP51932'); } if (FileCtl::file_write_contents($this->_setting_txt, $body) === false) { diff --git a/lib/ShowThread.php b/lib/ShowThread.php index d6143b438..4f2f9d174 100644 --- a/lib/ShowThread.php +++ b/lib/ShowThread.php @@ -347,11 +347,11 @@ protected function __construct(ThreadRead $aThread, $matome = false) $this->_highlight_nums = array(); $this->_highlight_msgs = array(); - if (P2BbsType::isHostBbsPink($this->thread->host)) { + if (P2HostType::isHostBbsPink($this->thread->host)) { $this->_redirector = self::REDIRECTOR_PINKTOWER; - } elseif (P2BbsType::isHost2chs($this->thread->host)) { + } elseif (P2HostType::isHost2chs($this->thread->host)) { $this->_redirector = self::REDIRECTOR_IMENU; - } elseif (P2BbsType::isHostMachiBbs($this->thread->host)) { + } elseif (P2HostType::isHostMachiBbs($this->thread->host)) { $this->_redirector = self::REDIRECTOR_MACHIBBS; } else { $this->_redirector = self::REDIRECTOR_NONE; @@ -1179,7 +1179,7 @@ private function _transLinkDo(array $s) if (strlen($following) > 0) { // ウィキペディア日本語版のURLで、SJISの2バイト文字の上位バイト // (0x81-0x9F,0xE0-0xEF)が続くとき - if (P2BbsType::isUrlWikipediaJa($url)) { + if (P2HostType::isUrlWikipediaJa($url)) { $leading = ord($following); if ((($leading ^ 0x90) < 32 && $leading != 0x80) || ($leading ^ 0xE0) < 16) { $url .= rawurlencode(mb_convert_encoding($following, 'UTF-8', 'CP932')); @@ -1229,7 +1229,7 @@ private function _transLinkDo(array $s) $purl['host'] == '127.0.0.1' || //HostCheck::isAddressLocal($purl['host']) || //HostCheck::isAddressPrivate($purl['host']) || - P2BbsType::isHostExample($purl['host'])) + P2HostType::isHostExample($purl['host'])) { return $orig; } diff --git a/lib/ShowThreadI.php b/lib/ShowThreadI.php index 8b5f7acb8..0f6ccce5e 100644 --- a/lib/ShowThreadI.php +++ b/lib/ShowThreadI.php @@ -65,7 +65,7 @@ public function __construct(ThreadRead $aThread, $matome = false) $this->setBbsNonameName(); } - if (P2BbsType::isHost2chs($aThread->host)) { + if (P2HostType::isHost2chs($aThread->host)) { $this->_kushiYakiName = '
    [―{}@{}@{}-] '; } @@ -893,7 +893,7 @@ public function plugin_viewImage($url, $purl, $str) { global $_conf; - if (P2BbsType::isUrlWikipediaJa($url)) { + if (P2HostType::isUrlWikipediaJa($url)) { return false; } @@ -920,7 +920,7 @@ public function plugin_replaceImageUrl($url, $purl, $str) global $_conf; global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit_k; - if (P2BbsType::isUrlWikipediaJa($url)) { + if (P2HostType::isUrlWikipediaJa($url)) { return false; } diff --git a/lib/ShowThreadK.php b/lib/ShowThreadK.php index 07c2654c3..2f40d4476 100644 --- a/lib/ShowThreadK.php +++ b/lib/ShowThreadK.php @@ -65,7 +65,7 @@ public function __construct(ThreadRead $aThread, $matome = false) $this->setBbsNonameName(); } - if (P2BbsType::isHost2chs($aThread->host)) { + if (P2HostType::isHost2chs($aThread->host)) { $this->_kushiYakiName = ' [―{}@{}@{}-] '; } @@ -834,7 +834,7 @@ public function plugin_viewImage($url, $purl, $str) { global $_conf; - if (P2BbsType::isUrlWikipediaJa($url)) { + if (P2HostType::isUrlWikipediaJa($url)) { return false; } @@ -861,7 +861,7 @@ public function plugin_replaceImageUrl($url, $purl, $str) global $_conf; global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit_k; - if (P2BbsType::isUrlWikipediaJa($url)) { + if (P2HostType::isUrlWikipediaJa($url)) { return false; } diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index 3f8de0e08..f9524c92e 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -1318,7 +1318,7 @@ public function plugin_viewImage($url, $purl, $str) global $_conf; global $pre_thumb_unlimited, $pre_thumb_limit; - if (P2BbsType::isUrlWikipediaJa($url)) { + if (P2HostType::isUrlWikipediaJa($url)) { return false; } diff --git a/lib/SubjectTxt.php b/lib/SubjectTxt.php index 2381b3b1d..7eb1e3d93 100644 --- a/lib/SubjectTxt.php +++ b/lib/SubjectTxt.php @@ -31,16 +31,16 @@ public function __construct($host, $bbs) $this->subject_file = P2Util::datDirOfHostBbs($host, $bbs) . 'subject.txt'; // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) - if (P2BbsType::isHost2chs($host) && ! P2BbsType::isHostBbsPink($host) && $_conf['2ch_ssl.subject']) { + if (P2HostType::isHost2chs($host) && ! P2HostType::isHostBbsPink($host) && $_conf['2ch_ssl.subject']) { $this->subject_url = 'https://' . $host . '/' . $bbs . '/subject.txt'; } else { $this->subject_url = 'http://' . $host . '/' . $bbs . '/subject.txt'; } // したらばのlivedoor移転に対応。読込先をlivedoorとする。 - if(P2BbsType::isHostJbbsShitaraba($host)) + if(P2HostType::isHostJbbsShitaraba($host)) { - $this->subject_url = P2BbsType::adjustHostJbbs($this->subject_url); + $this->subject_url = P2HostType::adjustHostJbbs($this->subject_url); } // subject.txtをダウンロード&セットする @@ -114,7 +114,7 @@ public function downloadSubject() //var_dump($req->getResponseHeader()); $body = $response->getBody(); // したらば or be.2ch.net ならEUCをSJISに変換 - if (P2BbsType::isHostJbbsShitaraba($this->host) || P2BbsType::isHostBe2chs($this->host)) { + if (P2HostType::isHostJbbsShitaraba($this->host) || P2HostType::isHostBe2chs($this->host)) { $body = mb_convert_encoding($body, 'CP932', 'CP51932'); } if (FileCtl::file_write_contents($this->subject_file, $body) === false) { @@ -184,7 +184,7 @@ public function setSubjectLines($cont = '') $this->subject_lines = FileCtl::file_read_lines($this->subject_file); // JBBS@したらばなら重複スレタイを削除する - if (P2BbsType::isHostJbbsShitaraba($this->host)) { + if (P2HostType::isHostJbbsShitaraba($this->host)) { $this->subject_lines = array_unique($this->subject_lines); } diff --git a/lib/Thread.php b/lib/Thread.php index 45f024606..05516566c 100644 --- a/lib/Thread.php +++ b/lib/Thread.php @@ -456,7 +456,7 @@ public function setTitleFromLocal() $this->setTtitle($d[4]); // be.2ch.net ならEUC→SJIS変換 - if (P2BbsType::isHostBe2chs($this->host)) { + if (P2HostType::isHostBe2chs($this->host)) { $ttitle = mb_convert_encoding($this->ttitle, 'CP932', 'CP51932'); $this->setTtitle($ttitle); } @@ -497,13 +497,13 @@ public function getMotoThread($force_pc = false, $ls = null) } // 2ch系 - if (P2BbsType::isHost2chs($this->host)) { + if (P2HostType::isHost2chs($this->host)) { // PC if (!$mobile) { $motothre_url = "http://{$this->host}/test/read.cgi/{$this->bbs}/{$this->key}/{$ls}"; // 携帯 } else { - if (P2BbsType::isHostBbsPink($this->host)) { + if (P2HostType::isHostBbsPink($this->host)) { //$motothre_url = "http://{$this->host}/test/r.i/{$this->bbs}/{$this->key}/{$ls}"; $motothre_url = "http://speedo.ula.cc/test/r.so/{$this->host}/{$this->bbs}/{$this->key}/{$ls}"; } else { @@ -515,7 +515,7 @@ public function getMotoThread($force_pc = false, $ls = null) } // まちBBS - } elseif (P2BbsType::isHostMachiBbs($this->host)) { + } elseif (P2HostType::isHostMachiBbs($this->host)) { if ($mobile) { $motothre_url = "http://{$this->host}/bbs/read.pl?IMODE=TRUE&BBS={$this->bbs}&KEY={$this->key}"; } else { @@ -523,13 +523,13 @@ public function getMotoThread($force_pc = false, $ls = null) } // まちびねっと - } elseif (P2BbsType::isHostMachiBbsNet($this->host)) { + } elseif (P2HostType::isHostMachiBbsNet($this->host)) { $motothre_url = "http://{$this->host}/test/read.cgi?bbs={$this->bbs}&key={$this->key}"; if ($mobile) { $motothre_url .= '&imode=true'; } // JBBSしたらば - } elseif (P2BbsType::isHostJbbsShitaraba($this->host)) { - list($host, $category) = explode('/', P2BbsType::adjustHostJbbs($this->host), 2); + } elseif (P2HostType::isHostJbbsShitaraba($this->host)) { + list($host, $category) = explode('/', P2HostType::adjustHostJbbs($this->host), 2); $bbs_cgi = ($mobile) ? 'i.cgi' : 'read.cgi'; $motothre_url = "http://{$host}/bbs/{$bbs_cgi}/{$category}/{$this->bbs}/{$this->key}/{$ls}"; diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 0db2f327d..3d4838d12 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -47,10 +47,10 @@ public function downloadDat() { global $_conf; // まちBBS - if (P2BbsType::isHostMachiBbs ($this->host)) { + if (P2HostType::isHostMachiBbs ($this->host)) { return DownloadDatMachiBbs::invoke ($this); // JBBS@したらば - } elseif (P2BbsType::isHostJbbsShitaraba ($this->host)) { + } elseif (P2HostType::isHostJbbsShitaraba ($this->host)) { if (! function_exists ('shitarabaDownload')) { include P2_LIB_DIR . '/read_shitaraba.inc.php'; } @@ -70,7 +70,7 @@ public function downloadDat() { return $this->_downloadDat2chKako ($_GET['kakolog'], $ext); // 2ch はAPI経由で落とす - } elseif (P2BbsType::isHost2chs ($this->host) && !P2BbsType::isNotUse2chsAPI ($this->host) && $_conf['2chapi_use'] && empty ($_GET['olddat'])) { + } elseif (P2HostType::isHost2chs ($this->host) && !P2HostType::isNotUse2chsAPI ($this->host) && $_conf['2chapi_use'] && empty ($_GET['olddat'])) { // ログインしてなければ or ログイン後、設定した時間経過していたら自動再ログイン if (! file_exists ($_conf['sid2chapi_php']) || ! empty ($_REQUEST['relogin2chapi']) || (filemtime ($_conf['sid2chapi_php']) < time () - 60 * 60 * $_conf['2chapi_interval'])) { @@ -141,7 +141,7 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { $url= http_build_url(array( "scheme" => $_conf['2chapi_ssl.read']?"https":"http", - "host" => P2BbsType::isHost5ch($this->host)?"api.5ch.net":"api.2ch.net", + "host" => P2HostType::isHost5ch($this->host)?"api.5ch.net":"api.2ch.net", "path" => "v1/".$serverName[0] . '/' . $this->bbs . '/' . $this->key)); $message = '/v1/' . $serverName[0] . '/' . $this->bbs . '/' . $this->key . $SID2ch . $AppKey; @@ -437,7 +437,7 @@ protected function _downloadDat2ch($from_bytes) { $this->modified = $response->getHeader ('Last-Modified'); // ホストが2chの時にDATを利用できない旨のメッセージが出たらエラーとする(DAT破損対策) - if (P2BbsType::isHost2chs ($this->host)) { + if (P2HostType::isHost2chs ($this->host)) { // 1行目を切り出す $posLF = mb_strpos ($body, "\n"); $firstmsg = mb_substr ($body, 0, $posLF === false ? mb_strlen ($body) : $posLF); @@ -624,7 +624,7 @@ public function get2chDatError($code = null) { } $reason = null; - if (P2BbsType::isHost2chs ($this->host) || P2BbsType::isHostVip2ch ($this->host)) { + if (P2HostType::isHost2chs ($this->host) || P2HostType::isHostVip2ch ($this->host)) { if ($code == '302') { $body203 = $this->_get2ch203Body(); if ($body203 !== false && preg_match('/過去ログ ★/', $body203)) { @@ -648,7 +648,7 @@ public function get2chDatError($code = null) { try { $req = P2Commun::createHTTPRequest ($read_url.'1', HTTP_Request2::METHOD_GET); // ヘッダ - $req->setHeader ('User-Agent', P2Commun::getP2UA(false,P2BbsType::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG + $req->setHeader ('User-Agent', P2Commun::getP2UA(false,P2HostType::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG // Requestの送信 $response = P2Commun::getHTTPResponse($req); @@ -802,7 +802,7 @@ public function previewOne() { fclose ($fd); // be.2ch.net ならEUC→SJIS変換 - if (P2BbsType::isHostBe2chNet ($this->host)) { + if (P2HostType::isHostBe2chNet ($this->host)) { $first_line = mb_convert_encoding ($first_line, 'CP932', 'CP51932'); } @@ -852,7 +852,7 @@ public function previewOneNotFound($code = null) { $this->diedat = true; // 2ch, bbspink, vip2ch ならread.cgiで確認 - if (P2BbsType::isHost2chs ($this->host) || P2BbsType::isHostVip2ch ($this->host)) { + if (P2HostType::isHost2chs ($this->host) || P2HostType::isHostVip2ch ($this->host)) { $this->getdat_error_msg_ht = $this->get2chDatError ($code); if (count ($this->datochi_residuums)) { if ($_conf['ktai']) { @@ -1016,7 +1016,7 @@ public function readDat() { // be.2ch.net ならEUC→SJIS変換 // 念のためSJISとUTF-8も文字コード判定の候補に入れておく // ・・・が、文字化けしたタイトルのスレッドで誤判定があったので、指定しておく - if (P2BbsType::isHostBe2chNet ($this->host)) { + if (P2HostType::isHostBe2chNet ($this->host)) { // mb_convert_variables('CP932', 'CP51932,CP932,UTF-8', $this->datlines); mb_convert_variables ('CP932', 'CP51932', $this->datlines); } @@ -1099,7 +1099,7 @@ public function explodeDatLine($aline) { * @return array */ public function scanOriginalHosts() { - if (P2BbsType::isHost2chs ($this->host) && file_exists ($this->keydat) && ($dat = file_get_contents ($this->keydat))) { + if (P2HostType::isHost2chs ($this->host) && file_exists ($this->keydat) && ($dat = file_get_contents ($this->keydat))) { $bbs_re = preg_quote ($this->bbs, '@'); $pattern = "@/(\\w+\\.(?:2ch\\.net|bbspink\\.com))(?:/test/read\\.cgi)?/{$bbs_re}\\b@"; if (preg_match_all ($pattern, $dat, $matches, PREG_PATTERN_ORDER)) { diff --git a/lib/expack/tgrep/view.inc.php b/lib/expack/tgrep/view.inc.php index 0a08ca9e5..3fdf1f99b 100644 --- a/lib/expack/tgrep/view.inc.php +++ b/lib/expack/tgrep/view.inc.php @@ -148,7 +148,7 @@ function moveSubject(href, serachWord, query) { $new = ''; $turl = sprintf('%s?host=%s&bbs=%s&key=%d', $_conf['read_php'], $t->host, $t->bbs, $t->tkey); $burl = sprintf('%s?host=%s&bbs=%s&itaj_en=%s&word=%s', $_conf['subject_php'], $t->host, $t->bbs, UrlSafeBase64::encode($t->ita), $htm['query_en']); - if (P2BbsType::isHostMachiBbs($t->host)) { + if (P2HostType::isHostMachiBbs($t->host)) { $ourl = sprintf('http://%s/bbs/read.cgi/%s/%s/', $t->host, $t->bbs, $t->tkey); } else { $ourl = sprintf('http://%s/test/read.cgi/%s/%s/', $t->host, $t->bbs, $t->tkey); diff --git a/lib/plugins/hissi/Hissi.php b/lib/plugins/hissi/Hissi.php index 78471b081..ef64901c5 100644 --- a/lib/plugins/hissi/Hissi.php +++ b/lib/plugins/hissi/Hissi.php @@ -83,7 +83,7 @@ public function load() public function isEnabled() { if ($this->host) { - if (!P2BbsType::isHost2chs($this->host)) { + if (!P2HostType::isHost2chs($this->host)) { return false; } } diff --git a/lib/plugins/mimizun/Mimizun.php b/lib/plugins/mimizun/Mimizun.php index e04213aee..ec020c6dc 100644 --- a/lib/plugins/mimizun/Mimizun.php +++ b/lib/plugins/mimizun/Mimizun.php @@ -91,11 +91,11 @@ public function isEnabled() // (セットされていなければ2chとみなす) if ($this->host) { // まちBBSならfalse - if (P2BbsType::isHostMachiBbs($this->host)) { + if (P2HostType::isHostMachiBbs($this->host)) { return false; } // 2chでなければfalse - if (!P2BbsType::isHost2chs($this->host)) { + if (!P2HostType::isHost2chs($this->host)) { return false; } } diff --git a/lib/plugins/stalker/Stalker.php b/lib/plugins/stalker/Stalker.php index 8c788e959..ad0be2fc2 100644 --- a/lib/plugins/stalker/Stalker.php +++ b/lib/plugins/stalker/Stalker.php @@ -24,7 +24,7 @@ class Stalker public function isEnabled() { if ($this->host) { - if (!P2BbsType::isHost2chs($this->host)) { + if (!P2HostType::isHost2chs($this->host)) { return false; } } diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index 53a61e5e7..57f90d84c 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -168,13 +168,13 @@ function setHiddenValue(button) { // {{{ ●/Be 書き込み チェックボックス // 2ch●書き込み -if (P2BbsType::isHost2chs($host) and file_exists($_conf['sid2ch_php'])) { +if (P2HostType::isHost2chs($host) and file_exists($_conf['sid2ch_php'])) { $htm['maru_post'] = '' . ''; } // Be -if (P2BbsType::isHost2chs($host) and P2Util::isEnableBe2ch()) { +if (P2HostType::isHost2chs($host) and P2Util::isEnableBe2ch()) { $htm['beres'] = '' . ''; } @@ -208,7 +208,7 @@ function setHiddenValue(button) { $htm['dpreview2'] = ''; if (!$_conf['ktai'] && $_conf['expack.editor.dpreview']) { $_dpreview_noname = 'null'; - if (P2BbsType::isHost2chs($host)) { + if (P2HostType::isHost2chs($host)) { $_dpreview_st = new SettingTxt($host, $bbs); $_dpreview_st->setSettingArray(); if (!empty($_dpreview_st->setting_array['BBS_NONAME_NAME'])) { diff --git a/lib/read_shitaraba.inc.php b/lib/read_shitaraba.inc.php index 00ce27460..a74b4b246 100644 --- a/lib/read_shitaraba.inc.php +++ b/lib/read_shitaraba.inc.php @@ -36,9 +36,9 @@ function shitarabaDownload(ThreadRead $aThread) } // JBBS@したらば - if (P2BbsType::isHostJbbsShitaraba($aThread->host)) { + if (P2HostType::isHostJbbsShitaraba($aThread->host)) { // したらばのlivedoor移転に対応。読込先をlivedoorとする。 - $host = P2BbsType::adjustHostJbbs($aThread->host); + $host = P2HostType::adjustHostJbbs($aThread->host); list($host, $category, ) = explode('/', $host); $machiurl = "http://{$host}/bbs/rawmode.cgi/{$category}/{$aThread->bbs}/{$aThread->key}/{$START}-"; } @@ -55,7 +55,7 @@ function shitarabaDownload(ThreadRead $aThread) unset($machiurl_res); // {{{ したらばならEUCをSJISに変換 - if (P2BbsType::isHostJbbsShitaraba($aThread->host)) { + if (P2HostType::isHostJbbsShitaraba($aThread->host)) { $temp_data = FileCtl::file_read_contents($tempfile); $temp_data = mb_convert_encoding($temp_data, 'CP932', 'CP51932'); if (FileCtl::file_write_contents($tempfile, $temp_data) === false) { diff --git a/lib/sb_footer.inc.php b/lib/sb_footer.inc.php index 25b443234..2ce033c97 100644 --- a/lib/sb_footer.inc.php +++ b/lib/sb_footer.inc.php @@ -82,11 +82,11 @@ // スペシャルモードでなければフォーム入力補完======================== $ini_url_text = ''; if (!$aThreadList->spmode) { - if (P2BbsType::isHostJbbsShitaraba($aThreadList->host)) { // したらば + if (P2HostType::isHostJbbsShitaraba($aThreadList->host)) { // したらば $ini_url_text = "http://{$aThreadList->host}/bbs/read.cgi?BBS={$aThreadList->bbs}&KEY="; - } elseif (P2BbsType::isHostMachiBbs($aThreadList->host)) { // まちBBS + } elseif (P2HostType::isHostMachiBbs($aThreadList->host)) { // まちBBS $ini_url_text = "http://{$aThreadList->host}/bbs/read.pl?BBS={$aThreadList->bbs}&KEY="; - } elseif (P2BbsType::isHostMachiBbsNet($aThreadList->host)) { // まちビねっと + } elseif (P2HostType::isHostMachiBbsNet($aThreadList->host)) { // まちビねっと $ini_url_text = "http://{$aThreadList->host}/test/read.cgi?bbs={$aThreadList->bbs}&key="; } else { $ini_url_text = "http://{$aThreadList->host}/test/read.cgi/{$aThreadList->bbs}/"; diff --git a/lib/sb_header_k.inc.php b/lib/sb_header_k.inc.php index 84eaafe86..59b823fe1 100644 --- a/lib/sb_header_k.inc.php +++ b/lib/sb_header_k.inc.php @@ -21,8 +21,8 @@ $ptitle_url = $p2_subject_url; // 2ch系 - } elseif (P2BbsType::isHost2chs($aThreadList->host)) { - if (P2BbsType::isHostBbsPink($aThreadList->host)) { + } elseif (P2HostType::isHost2chs($aThreadList->host)) { + if (P2HostType::isHostBbsPink($aThreadList->host)) { //$ptitle_url = "http://{$aThreadList->host}/{$aThreadList->bbs}/i/"; $ptitle_url = "http://speedo.ula.cc/test/p.so/{$aThreadList->host}/{$aThreadList->bbs}/"; } else { diff --git a/lib/sb_print_k.inc.php b/lib/sb_print_k.inc.php index 6ac4f3649..e06264217 100644 --- a/lib/sb_print_k.inc.php +++ b/lib/sb_print_k.inc.php @@ -240,7 +240,7 @@ function sb_print_k($aThreadList) } // >>1のみ, >>1から - if (P2BbsType::isHost2chs($aThreadList->host) && !$aThread->isKitoku()) { + if (P2HostType::isHost2chs($aThreadList->host) && !$aThread->isKitoku()) { switch ($_conf['mobile.sb_show_first']) { case 1: $thre_url = $onlyone_url; diff --git a/lib/wiki/Samba.php b/lib/wiki/Samba.php index bca2d7db0..59b1bb243 100644 --- a/lib/wiki/Samba.php +++ b/lib/wiki/Samba.php @@ -69,7 +69,7 @@ public function save() public function getSambaTime($host, $bbs) { - if (!P2BbsType::isHost2chs($host)) { + if (!P2HostType::isHost2chs($host)) { return false; } // sambaを取得 @@ -105,7 +105,7 @@ public function setWriteTime($host, $bbs) // 残り時間を取得 public function getSamba($host, $bbs) { - if (!P2BbsType::isHost2chs($host)) { + if (!P2HostType::isHost2chs($host)) { return -1; } diff --git a/rep2/info.php b/rep2/info.php index e7c91a8fe..05111e28e 100644 --- a/rep2/info.php +++ b/rep2/info.php @@ -283,7 +283,7 @@ } $motothre_url = $aThread->getMotoThread(); -if (P2BbsType::isHost2chs($aThread->host)) { +if (P2HostType::isHost2chs($aThread->host)) { $motothre_org_url = $aThread->getMotoThread(true); } else { $motothre_org_url = $motothre_url; diff --git a/rep2/live_post_form.php b/rep2/live_post_form.php index f7b1c5798..1d868f079 100755 --- a/rep2/live_post_form.php +++ b/rep2/live_post_form.php @@ -57,7 +57,7 @@ $ptitle = "{$itaj_hd} - 新規スレッド作成"; // machibbs、JBBS@したらば なら - if (P2BbsType::isHostMachiBbs($host) or P2BbsType::isHostJbbsShitaraba($host)) { + if (P2HostType::isHostMachiBbs($host) or P2HostType::isHostJbbsShitaraba($host)) { $submit_value = '新規書き込み'; // 2chなら } else { diff --git a/rep2/post.php b/rep2/post.php index d7d57d35b..b5c18b9db 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -84,13 +84,13 @@ // }}} // machibbs、JBBS@したらば なら -if (P2BbsType::isHostMachiBbs($host) or P2BbsType::isHostJbbsShitaraba($host)) { +if (P2HostType::isHostMachiBbs($host) or P2HostType::isHostJbbsShitaraba($host)) { $bbs_cgi = '/bbs/write.cgi'; // JBBS@したらば なら - if (P2BbsType::isHostJbbsShitaraba($host)) { + if (P2HostType::isHostJbbsShitaraba($host)) { // したらばの移転に対応。post先を現行に合わせる。 - $host = P2BbsType::adjustHostJbbs($host); + $host = P2HostType::adjustHostJbbs($host); $bbs_cgi = '../../bbs/write.cgi'; preg_match('/\\/(\\w+)$/', $host, $ar); $dir = $ar[1]; @@ -148,13 +148,13 @@ exit; } -if (P2BbsType::isHostJbbsShitaraba($host)) { +if (P2HostType::isHostJbbsShitaraba($host)) { $post[$dir_k] = $dir; } // {{{ 2chで●ログイン中ならsid追加 -if (!empty($_POST['maru']) and P2BbsType::isHost2chs($host)) { +if (!empty($_POST['maru']) and P2HostType::isHost2chs($host)) { $maru_time = 0; if (file_exists($_conf['sid2ch_php'])) { @@ -212,7 +212,7 @@ PostDataStore::set($post_backup_key, $post_cache); // cookie 読み込み -$cookie_key = $_login->user_u . '/' . P2Util::normalizeHostName(P2BbsType::isHostBbsPink($host) ? 'www.bbspink.com' : P2BbsType::isHost2chs($host) ? 'www.2ch.net' : $host); // 忍法帳対応 +$cookie_key = $_login->user_u . '/' . P2Util::normalizeHostName(P2HostType::isHostBbsPink($host) ? 'www.bbspink.com' : P2HostType::isHost2chs($host) ? 'www.2ch.net' : $host); // 忍法帳対応 if ($p2cookies = CookieDataStore::get($cookie_key)) { if (is_array($p2cookies)) { if (array_key_exists('expires', $p2cookies)) { @@ -389,7 +389,7 @@ function postIt($host, $bbs, $key, $post) global $bbs_cgi; // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) - if (P2BbsType::isHost2chs($host) && ! P2BbsType::isHostBbsPink($host) && $_conf['2ch_ssl.post']) { + if (P2HostType::isHost2chs($host) && ! P2HostType::isHostBbsPink($host) && $_conf['2ch_ssl.post']) { $bbs_cgi_url = 'https://' . $host . $bbs_cgi; } else { $bbs_cgi_url = 'http://' . $host . $bbs_cgi; @@ -411,7 +411,7 @@ function postIt($host, $bbs, $key, $post) } // be.2ch.net 認証クッキー - if (P2BbsType::isHostBe2chs($host) || !empty($_REQUEST['beres'])) { + if (P2HostType::isHostBe2chs($host) || !empty($_REQUEST['beres'])) { if ($_conf['be_2ch_DMDM'] && $_conf['be_2ch_MDMD']) { $req->addCookie('DMDM', urlencode( rawurldecode( $_conf['be_2ch_DMDM']) ) ); $req->addCookie('MDMD', urlencode( rawurldecode( $_conf['be_2ch_MDMD']) ) ); @@ -428,9 +428,9 @@ function postIt($host, $bbs, $key, $post) while (list($name, $value) = each($post)) { // したらば or be.2ch.netなら、EUCに変換 - if (P2BbsType::isHostJbbsShitaraba($host) || P2BbsType::isHostBe2chs($host)) { + if (P2HostType::isHostJbbsShitaraba($host) || P2HostType::isHostBe2chs($host)) { $value = mb_convert_encoding($value, 'CP51932', 'CP932'); - } elseif (P2BbsType::isHost2chs($host) && ! P2BbsType::isHostBbsPink($host)) { + } elseif (P2HostType::isHost2chs($host) && ! P2HostType::isHostBbsPink($host)) { // 2chはUnicodeの文字列をpostする $value = html_entity_decode(mb_convert_encoding($value, 'UTF-8', 'CP932'),ENT_QUOTES,'UTF-8'); } @@ -464,7 +464,7 @@ function postIt($host, $bbs, $key, $post) } // be.2ch.net or JBBSしたらば 文字コード変換 EUC→SJIS - if (P2BbsType::isHostBe2chs($host) || P2BbsType::isHostJbbsShitaraba($host)) { + if (P2HostType::isHostBe2chs($host) || P2HostType::isHostJbbsShitaraba($host)) { $body = mb_convert_encoding($body, 'CP932', 'CP51932'); // diff --git a/rep2/post_draft.php b/rep2/post_draft.php index b70b8f920..a99c01659 100644 --- a/rep2/post_draft.php +++ b/rep2/post_draft.php @@ -44,10 +44,10 @@ } // したらばのlivedoor移転に対応。post先をlivedoorとする。 -$host = P2BbsType::adjustHostJbbs($host); +$host = P2HostType::adjustHostJbbs($host); // machibbs、JBBS@したらば なら -if (P2BbsType::isHostMachiBbs($host) or P2BbsType::isHostJbbsShitaraba($host)) { +if (P2HostType::isHostMachiBbs($host) or P2HostType::isHostJbbsShitaraba($host)) { /* compact() と array_combine() でPOSTする値の配列を作るので、 $post_param_keys と $post_send_keys の値の順序は揃える! */ //$post_param_keys = array('bbs', 'key', 'time', 'FROM', 'mail', 'MESSAGE', 'subject', 'submit'); diff --git a/rep2/post_form.php b/rep2/post_form.php index f88181be4..895499e78 100644 --- a/rep2/post_form.php +++ b/rep2/post_form.php @@ -55,7 +55,7 @@ $ptitle = "{$itaj_hd} - 新規スレッド作成"; // machibbs、JBBS@したらば なら - if (P2BbsType::isHostMachiBbs($host) or P2BbsType::isHostJbbsShitaraba($host)) { + if (P2HostType::isHostMachiBbs($host) or P2HostType::isHostJbbsShitaraba($host)) { $submit_value = '新規書き込み'; // 2chなら } else { diff --git a/rep2/subject.php b/rep2/subject.php index a822f3a27..c12590bad 100644 --- a/rep2/subject.php +++ b/rep2/subject.php @@ -1036,7 +1036,7 @@ function matchSbFilter(Thread $aThread) if (file_exists($aThread->keydat)) { $subject = file_get_contents($aThread->keydat); // be.2ch.net はEUC - if (P2BbsType::isHostBe2chs($aThread->host)) { + if (P2HostType::isHostBe2chs($aThread->host)) { $subject = mb_convert_encoding($subject, 'CP932', 'CP51932'); } } else { From 43d439f40ea14c87cebfd2d1253e35132f1db8aa Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 1 Nov 2017 13:24:36 +0900 Subject: [PATCH 291/339] =?UTF-8?q?SPM=E3=82=92=E4=BD=BF=E7=94=A8=E3=81=97?= =?UTF-8?q?=E3=81=9FNG=E3=81=82=E3=81=BC=E3=83=BC=E3=82=93=E7=99=BB?= =?UTF-8?q?=E9=8C=B2=E6=99=82=E3=81=AB=E3=80=81=E6=9D=BF=E6=AF=8E=E3=81=AE?= =?UTF-8?q?=E7=99=BB=E9=8C=B2=E3=81=8C=E5=87=BA=E6=9D=A5=E3=82=8B=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_admin_ex.inc.php | 2 +- rep2/info_sp.php | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/conf/conf_admin_ex.inc.php b/conf/conf_admin_ex.inc.php index e64d780f5..022056c1f 100644 --- a/conf/conf_admin_ex.inc.php +++ b/conf/conf_admin_ex.inc.php @@ -26,7 +26,7 @@ // pecl_http が利用できる場合、HttpRequestPool による並列ダウンロードを有効にする // (off:0, on:1, コマンドラインで実行:2) -$_conf['expack.use_pecl_http'] = 1; // (1) +$_conf['expack.use_pecl_http'] = 0; // (0) // expack.use_pecl_http が 2 かつCLI用php.iniでhttpエクステンションを // ロードするようになっていない場合のみ 1 にする diff --git a/rep2/info_sp.php b/rep2/info_sp.php index 15943f8d4..e34e2dc2b 100644 --- a/rep2/info_sp.php +++ b/rep2/info_sp.php @@ -18,6 +18,7 @@ $resnum = isset($_GET['resnum']) ? $_GET['resnum'] : null; $popup = isset($_GET['popup']) ? $_GET['popup'] : null; $mode = isset($_GET['mode']) ? $_GET['mode'] : null; +$bbsonly = isset($_GET['bbsonly']) ? (int)$_GET['bbsonly'] : 0; if (isset($_GET['aborn_str_en'])) { $aborn_str_en = $_GET['aborn_str_en']; @@ -100,6 +101,12 @@ if ($popup == 2) { // あぼーん/NG/ハイライトワード登録 if (preg_match('/^(aborn|ng|highlight)_/', $mode) && ($aborn_str = trim($aborn_str)) !== '') { + + // bbsonlyが指定されていた場合は、bbsの指定を追加 + if(!empty($bbs) && $bbsonly) { + $aborn_str = sprintf('%s%s',$bbs,$aborn_str); + } + if (file_exists($path) && ($data = FileCtl::file_read_lines($path))) { $data = array_map('trim', $data); $data = array_filter($data, create_function('$v', 'return ($v !== "");')); @@ -382,6 +389,9 @@ function infoSpLiveAborn() $aborn_id_ht = p2h($aborn_id); echo "\t\n"; } + + echo "\t

    \n"; + echo "\t\n"; if (!$_conf['ktai']) { echo "\t\n"; From 227e6eae651d8ab3a7163531e4222e1547606e01 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Mon, 13 Nov 2017 23:08:47 +0900 Subject: [PATCH 292/339] =?UTF-8?q?itest.5ch.net=E3=81=B8=E3=81=AE?= =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=82=AF=E3=81=AB=E5=AF=BE=E5=BF=9C=20thx!?= =?UTF-8?q?=20http://egg.5ch.net/test/read.cgi/software/1505071083/860=20D?= =?UTF-8?q?AT=E7=A0=B4=E6=90=8D=E9=98=B2=E6=AD=A2=E3=81=AE=E3=81=9F?= =?UTF-8?q?=E3=82=81=E3=81=AB=E6=97=A7=E4=BB=95=E6=A7=98=E3=81=AEitest?= =?UTF-8?q?=E3=82=92=E3=83=AA=E3=83=B3=E3=82=AF=E3=81=97=E3=81=AA=E3=81=84?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4=20=E9=8F=A1?= =?UTF-8?q?=E3=81=AE=E5=9B=BD=E3=81=AEPHP=202chBBS=E3=82=B9=E3=82=AF?= =?UTF-8?q?=E3=83=AA=E3=83=97=E3=83=88(http://script.s16.xrea.com/)?= =?UTF-8?q?=E3=82=92=E4=BD=BF=E7=94=A8=E3=81=97=E3=81=9F=E5=A4=96=E9=83=A8?= =?UTF-8?q?=E6=9D=BF=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/BbsMap.php | 5 +++++ lib/P2Util.php | 9 ++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/BbsMap.php b/lib/BbsMap.php index 9fe87d577..196cd32f6 100644 --- a/lib/BbsMap.php +++ b/lib/BbsMap.php @@ -104,6 +104,11 @@ static public function isRegisteredBbs($host, $bbs) $type = self::_detectHostType($host); + // dat破損防止のためitest.[25]ch.netは問答無用でfalse + if($host == 'itest.5ch.net'||$host == 'itest.2ch.net') { + return false; + } + // 登録無しでもrep2で扱える板はチェック無しでtrue if($host != $type) { return true; diff --git a/lib/P2Util.php b/lib/P2Util.php index 0a9247232..657e1b3b9 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1874,8 +1874,15 @@ static public function detectThread($url = null) $key = $matches[4]; $ls = (isset($matches[5]) && strlen($matches[5])) ? $matches[5] : ''; + // itest - https://itest.5ch.net/hayabusa9/test/read.cgi/mnewsplus/1510531889 + } elseif (preg_match('<^http://itest\.(?:[25])ch.net/(\w+)/test/read\.cgi/(\w+)/(\d+)(?:/(.+$))?>x', $nama_url, $matches)) { + $host = $matches[1].'.5ch.net'; + $bbs = $matches[2]; + $key = $matches[3]; + $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; + // 2ch or pink - http://choco.2ch.net/test/read.cgi/event/1027770702/ - } elseif (preg_match('<^https?://(.+)/test/read\\.(?:cgi|html|so) + } elseif (preg_match('<^https?://(.+)/test/read\\.(?:cgi|html|so|php) /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) { if (BbsMap::isRegisteredBbs($matches[1], $matches[2])) { $host = $matches[1]; From 5bbb4aa545bf066413bc9564c87af3a4d32f453c Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Fri, 17 Nov 2017 23:39:22 +0900 Subject: [PATCH 293/339] =?UTF-8?q?itest=E3=81=AE=E6=AD=A3=E8=A6=8F?= =?UTF-8?q?=E8=A1=A8=E7=8F=BE=E3=82=92SSL=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index 657e1b3b9..875d1fccc 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1875,7 +1875,7 @@ static public function detectThread($url = null) $ls = (isset($matches[5]) && strlen($matches[5])) ? $matches[5] : ''; // itest - https://itest.5ch.net/hayabusa9/test/read.cgi/mnewsplus/1510531889 - } elseif (preg_match('<^http://itest\.(?:[25])ch.net/(\w+)/test/read\.cgi/(\w+)/(\d+)(?:/(.+$))?>x', $nama_url, $matches)) { + } elseif (preg_match('<^https?://itest\.(?:[25])ch.net/(\w+)/test/read\.cgi/(\w+)/(\d+)(?:/(.+$))?>x', $nama_url, $matches)) { $host = $matches[1].'.5ch.net'; $bbs = $matches[2]; $key = $matches[3]; From 2cb094c37a1e15e4a2e0c9d462d3065a0b61bbcb Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Sat, 18 Nov 2017 07:48:39 +0900 Subject: [PATCH 294/339] =?UTF-8?q?=E6=9C=AA=E4=BD=BF=E7=94=A8=E3=81=AE?= =?UTF-8?q?=E3=82=AF=E3=83=A9=E3=82=B9=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/HostCheck.php | 167 ------------------------------------------ lib/ShowThread.php | 2 - lib/startup.funcs.php | 1 - 3 files changed, 170 deletions(-) delete mode 100644 lib/HostCheck.php diff --git a/lib/HostCheck.php b/lib/HostCheck.php deleted file mode 100644 index 7fde9f23f..000000000 --- a/lib/HostCheck.php +++ /dev/null @@ -1,167 +0,0 @@ -= 6) { - return false; - } - $zeros = ':' . str_repeat('0:', 6 - $nsecs); - $pos = strpos($address, '::'); - if ($pos === 0) { - $zeros = '0' . $zeros; - } - if ($pos === strlen($address) - 2) { - $zeros .= '0'; - } - $address = str_replace('::', $zeros, $address); - case 0: - break; - default: - return false; - } - - // 最終チェック - if (preg_match('/^([0-9a-f]{1,4}):([0-9a-f]{1,4}):([0-9a-f]{1,4}):([0-9a-f]{1,4}):([0-9a-f]{1,4}):([0-9a-f]{1,4}):([0-9a-f]{1,4}):([0-9a-f]{1,4})$/', $address, $matches)) { - array_shift($matches); - if ($binary) { - return vsprintf('%016b%016b%016b%016b%016b%016b%016b%016b', array_map('hexdec', $matches)); - } - return vsprintf('%04s:%04s:%04s:%04s:%04s:%04s:%04s:%04s', $matches); - } - - return false; - } - - // }}} - // {{{ isAddressPrivate() - - /** - * プライベートアドレス? - * - * @see RFC1918 - * - * @param string $address - * @param string $class - * - * @return bool - */ - static public function isAddressPrivate($address = '', $class = 'ABC') - { - if (!$address) { - $address = $_SERVER['REMOTE_ADDR']; - } - - $lval = ip2long($address); - if ($lval === false) { - return false; - } - - $classes = array( - 'A' => array('10.0.0.0', '255.0.0.0'), - 'B' => array('172.16.0.0','255.240.0.0'), - 'C' => array('192.168.0.0', '255.255.0.0'), - ); - - foreach ($classes as $k => $v) { - if (stripos($class, $k) !== false) { - $rval = ip2long($v[0]); - $mask = ip2long($v[1]); - if (($lval & $mask) === $rval) { - return true; - } - } - } - - return false; - } - - // }}} -} - -// }}} - -/* - * Local Variables: - * mode: php - * coding: cp932 - * tab-width: 4 - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End: - */ -// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/lib/ShowThread.php b/lib/ShowThread.php index 4f2f9d174..c2dc52f00 100644 --- a/lib/ShowThread.php +++ b/lib/ShowThread.php @@ -1227,8 +1227,6 @@ private function _transLinkDo(array $s) if (!$purl || !array_key_exists('host', $purl) || strpos($purl['host'], '.') === false || $purl['host'] == '127.0.0.1' || - //HostCheck::isAddressLocal($purl['host']) || - //HostCheck::isAddressPrivate($purl['host']) || P2HostType::isHostExample($purl['host'])) { return $orig; diff --git a/lib/startup.funcs.php b/lib/startup.funcs.php index 2a183390b..8771ad52b 100644 --- a/lib/startup.funcs.php +++ b/lib/startup.funcs.php @@ -21,7 +21,6 @@ function p2_load_class($name) DownloadDat[0-9A-Z][0-9A-Za-z]* | FavSetManager | FileCtl | - HostCheck | JStyle | Login | MD5Crypt | From 070074832390105b3f0e00516b8086a98109b323 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Sat, 18 Nov 2017 23:04:57 +0900 Subject: [PATCH 295/339] =?UTF-8?q?P2Util=E3=81=8B=E3=82=89=E6=9C=AA?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E3=81=AE=E9=96=A2=E6=95=B0=E5=89=8A=E9=99=A4?= =?UTF-8?q?=20=E6=AD=A3=E8=A6=8F=E8=A1=A8=E7=8F=BE=E3=81=AE=E3=82=A8?= =?UTF-8?q?=E3=82=B9=E3=82=B1=E3=83=BC=E3=83=97=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 231 +------------------------------------------------ 1 file changed, 1 insertion(+), 230 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index d75353aaf..adf0a513f 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -742,235 +742,6 @@ static public function normalizeHostName($host) } // }}} - -// ** Move to P2HostType *************************************** - - // {{ isHostExample - - /** - * host が例示用ドメインなら true を返す - * - * @param string $host - * @return bool - */ - static public function isHostExample($host) - { - return P2HostType::isHostExample($host); - } - - // }}} - // {{{ isHost2chs() - - /** - * host が 2ch or 5ch or bbspink なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHost2chs($host) - { - return P2HostType::isHost2chs($host); - } - - // }}} - // {{{ isHost2ch() - - /** - * host が 2ch なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHost2ch($host) - { - return P2HostType::isHost2ch($host); - } - - // }}} - // {{{ isHost5ch() - - /** - * host が 5ch なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHost5ch($host) - { - return P2HostType::isHost5ch($host); - } - - // }}} - // {{{ isHostVip2ch() - - /** - * host が vip2ch なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHostVip2ch($host) - { - return P2HostType::isHostVip2ch($host); - } - - // }}} - // {{{ isHostBe2chNet() - - /** - * host が be.2ch.net なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHostBe2chNet($host) - { - return P2HostType::isHostBe2chNet($host); - } - - // }}} - // {{{ isNotUse2chAPI() - - /** - * host が API を用いなくても取得できる場合なら true を返す - * - * @param string $host - * @return bool - */ - static public function isNotUse2chAPI($host) - { - return P2HostType::isNotUse2chAPI($host); - } - - // }}} - // {{{ isHostBbsPink() - - /** - * host が bbspink なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHostBbsPink($host) - { - return P2HostType::isHostBbsPink($host); - } - - // }}} - // {{{ isHostTor() - - /** - * host が tor 系板 なら true を返す - * - * @access public - * @param string $host - * @return boolean - */ - static public function isHostTor($host, $isGatewayMode = 99) - { - return P2HostType::isHostTor($host, $isGatewayMode); - } - - // }}} - // {{{ isHostMachiBbs() - - /** - * host が machibbs なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHostMachiBbs($host) - { - return P2HostType::isHostMachiBbs($host); - } - - // }}} - // {{{ isHostMachiBbsNet() - - /** - * host が machibbs.net まちビねっと なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHostMachiBbsNet($host) - { - return P2HostType::isHostMachiBbsNet($host); - } - - // }}} - // {{{ isHostJbbsShitaraba() - - /** - * host が livedoor レンタル掲示板 : したらば なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHostJbbsShitaraba($in_host) - { - return P2HostType::isHostJbbsShitaraba($in_host); - } - - // }}} - // {{{ adjustHostJbbs() - - /** - * livedoor レンタル掲示板 : したらばのホスト名変更に対応して変更する - * - * @param string $in_str ホスト名でもURLでもなんでも良い - * @return string - */ - static public function adjustHostJbbs($in_str) - { - return P2HostType::adjustHostJbbs($in_str); - } - - // }}} - // {{{ isHost2chSc() - - /** - * host が 2ch.sc なら true を返す - * - * @param string $host - * @return boolean - */ - static public function isHost2chSc($host) - { - return P2HostType::isHost2chSc($host); - } - - // }}} - // {{{ isHostOpen2ch() - - /** - * host が おーぷん2ch なら true を返す - * - * @param string $host - * @return boolean - */ - static public function isHostOpen2ch($host) - { - return P2HostType::isHostOpen2ch($host); - } - - // }}} - - // {{{ isUrlWikipediaJa() - - /** - * URLがウィキペディア日本語版の記事ならtrueを返す - */ - static public function isUrlWikipediaJa($url) - { - return P2HostType::isUrlWikipediaJa($url); - } - - // }}} - -// ** Move to P2HostType *************************************** - // {{{ header_nocache() /** @@ -1773,7 +1544,7 @@ static public function detectThread($url = null) $ls = (isset($matches[5]) && strlen($matches[5])) ? $matches[5] : ''; // itest - https://itest.5ch.net/hayabusa9/test/read.cgi/mnewsplus/1510531889 - } elseif (preg_match('<^https?://itest\.(?:[25])ch.net/(\w+)/test/read\.cgi/(\w+)/(\d+)(?:/(.+$))?>x', $nama_url, $matches)) { + } elseif (preg_match('<^https?://itest\\.(?:[25])ch\\.net/(\\w+)/test/read\\.cgi/(\\w+)/(\\d+)(?:/(.+$))?>x', $nama_url, $matches)) { $host = $matches[1].'.5ch.net'; $bbs = $matches[2]; $key = $matches[3]; From 15fbe28e3524817e28875b6313b6d31d856e2bc5 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Sun, 19 Nov 2017 00:14:49 +0900 Subject: [PATCH 296/339] =?UTF-8?q?BbsMap.php=E3=81=A8P2HostType.php?= =?UTF-8?q?=E3=82=92=E5=90=88=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/FavSetManager.php | 4 +- lib/P2Commun.php | 4 +- lib/P2CurlMulti.php | 8 +- lib/{BbsMap.php => P2HostMgr.php} | 433 ++++++++++++++++++++++++++++-- lib/P2HostType.php | 433 ------------------------------ lib/P2HttpExt.php | 4 +- lib/P2Util.php | 24 +- lib/SettingTxt.php | 10 +- lib/ShowThread.php | 10 +- lib/ShowThreadI.php | 8 +- lib/ShowThreadK.php | 8 +- lib/ShowThreadPc.php | 4 +- lib/SubjectTxt.php | 12 +- lib/Thread.php | 16 +- lib/ThreadRead.php | 26 +- lib/expack/tgrep/view.inc.php | 2 +- lib/get_info.inc.php | 8 +- lib/plugins/hissi/Hissi.php | 2 +- lib/plugins/mimizun/Mimizun.php | 4 +- lib/plugins/stalker/Stalker.php | 2 +- lib/post_form_options.inc.php | 6 +- lib/read_shitaraba.inc.php | 6 +- lib/sb_footer.inc.php | 6 +- lib/sb_header_k.inc.php | 4 +- lib/sb_print_k.inc.php | 2 +- lib/startup.funcs.php | 1 - lib/wiki/Samba.php | 4 +- 27 files changed, 497 insertions(+), 554 deletions(-) rename lib/{BbsMap.php => P2HostMgr.php} (51%) delete mode 100644 lib/P2HostType.php diff --git a/lib/FavSetManager.php b/lib/FavSetManager.php index e136e420b..b145a9930 100644 --- a/lib/FavSetManager.php +++ b/lib/FavSetManager.php @@ -91,7 +91,7 @@ static public function loadAllFavSet($force = false) $key = $lar[1]; $host = $lar[10]; $bbs = $lar[11]; - $group = P2Util::getHostGroupName($host); + $group = P2HostMgr::getHostGroupName($host); $_conf['favlists'][$i][] = array('group' => $group, 'host' => $host, 'bbs' => $bbs, 'key' => $key); } } @@ -107,7 +107,7 @@ static public function loadAllFavSet($force = false) $host = $lar[1]; $bbs = $lar[2]; $itaj = $lar[3]; - $group = P2Util::getHostGroupName($host); + $group = P2HostMgr::getHostGroupName($host); $_conf['favitas'][$i][] = array('group' => $group, 'host' => $host, 'bbs' => $bbs, 'itaj' => $itaj); } } diff --git a/lib/P2Commun.php b/lib/P2Commun.php index f283436e6..9b8d33ace 100644 --- a/lib/P2Commun.php +++ b/lib/P2Commun.php @@ -35,7 +35,7 @@ static public function createHTTPRequest($url , $method = HTTP_Request2::METHOD_ // よく使うヘッダを指定 // p2のHTTP通信は特に指定の無い限りMonazillaを名乗るようにする - $req->setHeader ('User-Agent', self::getP2UA(true,P2HostType::isHost2chs($purl['host']))); + $req->setHeader ('User-Agent', self::getP2UA(true,P2HostMgr::isHost2chs($purl['host']))); $req->setHeader ('Accept-Language', 'ja,en-us;q=0.7,en;q=0.3'); $req->setHeader ('Accept', '*/*'); $req->setHeader ('Accept-Encoding', 'gzip, deflate'); @@ -59,7 +59,7 @@ static public function createHTTPRequest($url , $method = HTTP_Request2::METHOD_ } // プロキシ - if ($_conf['tor_use'] && P2HostType::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット + if ($_conf['tor_use'] && P2HostMgr::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット $req->setConfig (array ( 'proxy_host' => $_conf['tor_proxy_host'], 'proxy_port' => $_conf['tor_proxy_port'], diff --git a/lib/P2CurlMulti.php b/lib/P2CurlMulti.php index 3a4862805..4ad2fc0ac 100644 --- a/lib/P2CurlMulti.php +++ b/lib/P2CurlMulti.php @@ -65,15 +65,15 @@ private function add($subjects, $force = false) { curl_setopt($this->ch[$key], CURLOPT_MAXCONNECTS, $_conf['expack.curl_per_host']); // User-Agent - if(P2HostType::isHost2chs($host) && !P2HostType::isNotUse2chsAPI($host) && $_conf['2chapi_use']){ + if(P2HostMgr::isHost2chs($host) && !P2HostMgr::isNotUse2chsAPI($host) && $_conf['2chapi_use']){ $user_agent = sprintf ($_conf['2chapi_ua.read'], $_conf['2chapi_appname']); } else { - $user_agent = P2Commun::getP2UA(true, P2HostType::isHost2chs($purl['host'])); + $user_agent = P2Commun::getP2UA(true, P2HostMgr::isHost2chs($purl['host'])); } curl_setopt($this->ch[$key], CURLOPT_USERAGENT, $user_agent); // プロキシ - if ($_conf['tor_use'] && P2HostType::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット + if ($_conf['tor_use'] && P2HostMgr::isHostTor($purl['host'], 0)) { // Tor(.onion)はTor用の設定をセット $tor_user_info = sprintf("%s%s@", $_conf['tor_proxy_user'], empty($_conf['tor_proxy_password']) ? "" : ":{$_conf['tor_proxy_password']}"); $tor_address = "{$_conf['tor_proxy_host']}:{$_conf['tor_proxy_port']}"; $address = sprintf("http://%s%s", strpos($tor_user_info, "@") === 0 ? "" : $tor_user_info, $tor_address); @@ -171,7 +171,7 @@ private function getResult() { $data = curl_multi_getcontent($ch_array); $header_size = $tmp['header_size']; - if (P2HostType::isHostJbbsShitaraba($host) || P2HostType::isHostBe2chs($host)) { + if (P2HostMgr::isHostJbbsShitaraba($host) || P2HostMgr::isHostBe2chs($host)) { $data = mb_convert_encoding($data, 'CP932', 'CP51932'); } diff --git a/lib/BbsMap.php b/lib/P2HostMgr.php similarity index 51% rename from lib/BbsMap.php rename to lib/P2HostMgr.php index 510d91318..017dcd076 100644 --- a/lib/BbsMap.php +++ b/lib/P2HostMgr.php @@ -1,17 +1,67 @@ ', $host); + } + return self::$_hostIs2ch[$host]; + } + + // }}} + // {{{ isHostBe2chNet() + + /** + * host が be.2ch.net なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostBe2chNet($host) + { + return $host == 'be.2ch.net'; + } + + // }}} + // {{{ isNotUse2chAPI() + + /** + * host が API を用いなくても取得できる場合なら true を返す + * + * @param string $host + * @return bool + */ + static public function isNotUse2chAPI($host) + { + return ($host == 'qb5.2ch.net' || $host == 'carpenter.2ch.net'); + } + + // }}} + // {{{ isHost5ch() + + /** + * host が 5ch なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHost5ch($host) + { + if (!array_key_exists($host, self::$_hostIs5ch)) { + self::$_hostIs5ch[$host] = (bool)preg_match('<^\\w+\\.(?:5ch\\.net)$>', $host); + } + return self::$_hostIs5ch[$host]; + } + + // }}} + // {{{ isHostBe5chNet() + + /** + * host が be.2ch.net なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostBe5chNet($host) + { + return $host == 'be.5ch.net'; + } + + // }}} + // {{{ isNotUse5chAPI() + + /** + * host が API を用いなくても取得できる場合なら true を返す + * + * @param string $host + * @return bool + */ + static public function isNotUse5chAPI($host) + { + return ($host == 'qb5.5ch.net' || $host == 'carpenter.5ch.net'); + } + + // }}} + // {{{ isHostBbsPink() + + /** + * host が bbspink なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostBbsPink($host) + { + if (!array_key_exists($host, self::$_hostIsBbsPink)) { + self::$_hostIsBbsPink[$host] = (bool)preg_match('<^\\w+\\.bbspink\\.com$>', $host); + } + return self::$_hostIsBbsPink[$host]; + } + + // }}} + // {{{ isHost2chSc() + + /** + * host が 2ch.sc なら true を返す + * + * @param string $host + * @return boolean + */ + static public function isHost2chSc($host) + { + if (!array_key_exists($host, self::$_hostIs2chSc)) { + self::$_hostIs2chSc[$host] = (bool)preg_match('/\\.(2ch\\.sc)$/', $host); + } + return self::$_hostIs2chSc[$host]; + } + + // }}} + // {{{ isHostOpen2ch() + + /** + * host が おーぷん2ch なら true を返す + * + * @param string $host + * @return boolean + */ + static public function isHostOpen2ch($host) + { + if (!array_key_exists($host, self::$_hostIsOpen2ch)) { + self::$_hostIsOpen2ch[$host] = (bool)preg_match('/\\.(open2ch\\.net)$/', $host); + } + return self::$_hostIsOpen2ch[$host]; + } + + // }}} + // {{{ isHostMachiBbs() + + /** + * host が machibbs なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostMachiBbs($host) + { + if ($host === "machi.to") { + return true; + } + + if (!array_key_exists($host, self::$_hostIsMachiBbs)) { + self::$_hostIsMachiBbs[$host] = (bool)preg_match('<^\\w+\\.machi(?:bbs\\.com|\\.to)$>', $host); + } + return self::$_hostIsMachiBbs[$host]; + } + + // }}} + // {{{ isHostMachiBbsNet() + + /** + * host が machibbs.net まちビねっと なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostMachiBbsNet($host) + { + if (!array_key_exists($host, self::$_hostIsMachiBbsNet)) { + self::$_hostIsMachiBbsNet[$host] = (bool)preg_match('<^\\w+\\.machibbs\\.net$>', $host); + } + return self::$_hostIsMachiBbsNet[$host]; + } + + // }}} + // {{{ isHostJbbsShitaraba() + + /** + * host が livedoor レンタル掲示板 : したらば なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostJbbsShitaraba($in_host) + { + if (!array_key_exists($in_host, self::$_hostIsJbbsShitaraba)) { + if ($in_host == 'rentalbbs.livedoor.com') { + self::$_hostIsJbbsShitaraba[$in_host] = true; + } elseif (preg_match('<^jbbs\\.(?:shitaraba\\.(?:net|com)|livedoor\\.(?:com|jp))(?:/|$)>', $in_host)) { + self::$_hostIsJbbsShitaraba[$in_host] = true; + } else { + self::$_hostIsJbbsShitaraba[$in_host] = false; + } + } + return self::$_hostIsJbbsShitaraba[$in_host]; + } + + // }}} + // {{{ adjustHostJbbs() + + /** + * livedoor レンタル掲示板 : したらばのホスト名変更に対応して変更する + * + * @param string $in_str ホスト名でもURLでもなんでも良い + * @return string + */ + static public function adjustHostJbbs($in_str) + { + return preg_replace('<(^|/)jbbs\\.(?:shitaraba|livedoor)\\.(?:net|com)(/|$)>', '\\1jbbs.shitaraba.net\\2', $in_str, 1); + } + + // }}} + // {{{ isHostTor() + + /** + * host が tor 系板 なら true を返す + * + * @access public + * @param string $host + * @return boolean + */ + static function isHostTor($host, $isGatewayMode = 99) + { + switch ($isGatewayMode) { + case 0: + $ret = (bool)preg_match('/\\.onion$/', $host); + break; + + case 1: + $ret = (bool)preg_match('/\\.(onion\\.cab|onion\\.city|onion\\.direct|onion\\.link|onion\\.nu|onion\\.to|onion\\.rip)$/', $host); + break; + + default: + $ret = (bool)preg_match('/\\.(onion\\.cab|onion\\.city|onion\\.direct|onion\\.link|onion\\.nu|onion\\.to|onion\\.rip|onion)$/', $host); + break; + } + + return $ret; + } + + // }}} + // {{{ isHostVip2ch() + + /** + * host が vip2ch なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostVip2ch($host) + { + if (!array_key_exists($host, self::$_hostIsVip2ch)) { + self::$_hostIsVip2ch[$host] = (bool)preg_match('<^\\w+\\.(?:vip2ch\\.com)$>', $host); + } + return self::$_hostIsVip2ch[$host]; + } + + // }}} + // {{{ isUrlWikipediaJa() + + /** + * URLがウィキペディア日本語版の記事ならtrueを返す + */ + static public function isUrlWikipediaJa($url) + { + return (strncmp($url, 'http://ja.wikipedia.org/wiki/', 29) == 0); + } + // }}} // {{{ getCurrentHost() @@ -40,7 +419,7 @@ static public function getCurrentHost($host, $bbs, $autosync = true) if (!$map) { return $host; } - $type = self::_detectHostType($host); + $type = self::getHostGroupName($host); // チェック if (isset($map[$type]) && isset($map[$type][$bbs])) { @@ -76,7 +455,7 @@ static public function getBbsName($host, $bbs) if (!$map) { return $bbs; } - $type = self::_detectHostType($host); + $type = self::getHostGroupName($host); // チェック if (isset($map[$type]) && isset($map[$type][$bbs])) { @@ -102,7 +481,7 @@ static public function isRegisteredBbs($host, $bbs) { global $_conf; - $type = self::_detectHostType($host); + $type = self::getHostGroupName($host); // dat破損防止のためitest.[25]ch.netは問答無用でfalse if($host == 'itest.5ch.net'||$host == 'itest.2ch.net') { @@ -179,7 +558,7 @@ static public function syncBrd($brd_path) $host = $data[1]; $bbs = $data[2]; $itaj = $data[3]; - $type = self::_detectHostType($host); + $type = self::getHostGroupName($host); if (isset($map[$type]) && isset($map[$type][$bbs])) { $newhost = $map[$type][$bbs]['host']; @@ -255,7 +634,7 @@ static public function syncIdx($idx_path) $data = explode('<>', rtrim($line, "\n")); $host = $data[10]; $bbs = $data[11]; - $type = self::_detectHostType($host); + $type = self::getHostGroupName($host); if (isset($map[$type]) && isset($map[$type][$bbs])) { $newhost = $map[$type][$bbs]['host']; @@ -351,7 +730,7 @@ static private function _getMapping() $host = $mita->host; $bbs = $mita->bbs; $itaj = $mita->itaj; - $type = self::_detectHostType($host); + $type = self::getHostGroupName($host); if (!isset($map[$type])) { $map[$type] = array(); } @@ -397,30 +776,28 @@ static private function _writeData($path, $neolines) p2die("cannot write file. ({$path})"); } } - // }}} - // {{{ _detectHostType() + // {{{ getHostGroupName() /** - * ホストの種類を判定する + * ホストに対応するお気に板・お気にスレグループ名を取得する * - * @param string $host ホスト名 - * @return string ホストの種類 + * @param string $host + * @return void */ - static private function _detectHostType($host) + static public function getHostGroupName($host) { - if (P2HostType::isHostBbsPink($host)) { - $type = 'bbspink'; - } elseif (P2HostType::isHost2chs($host)) { - $type = '2channel'; - } elseif (P2HostType::isHostMachiBbs($host)) { - $type = 'machibbs'; - } elseif (P2HostType::isHostJbbsShitaraba($host)) { - $type = 'jbbs'; + if (self::isHost2chs($host)) { + return '2channel'; + } elseif (self::isHostMachiBbs($host)) { + return 'machibbs'; + } elseif (self::isHostJbbsShitaraba($host)) { + return 'shitaraba'; + } elseif (self::isHostVip2ch($host)) { + return 'vip2ch'; } else { - $type = $host; + return $host; } - return $type; } // }}} diff --git a/lib/P2HostType.php b/lib/P2HostType.php deleted file mode 100644 index e1664ed53..000000000 --- a/lib/P2HostType.php +++ /dev/null @@ -1,433 +0,0 @@ -', $host); - } - return self::$_hostIs2ch[$host]; - } - - // }}} - // {{{ isHostBe2chNet() - - /** - * host が be.2ch.net なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHostBe2chNet($host) - { - return $host == 'be.2ch.net'; - } - - // }}} - // {{{ isNotUse2chAPI() - - /** - * host が API を用いなくても取得できる場合なら true を返す - * - * @param string $host - * @return bool - */ - static public function isNotUse2chAPI($host) - { - return ($host == 'qb5.2ch.net' || $host == 'carpenter.2ch.net'); - } - - // }}} - // {{{ isHost5ch() - - /** - * host が 5ch なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHost5ch($host) - { - if (!array_key_exists($host, self::$_hostIs5ch)) { - self::$_hostIs5ch[$host] = (bool)preg_match('<^\\w+\\.(?:5ch\\.net)$>', $host); - } - return self::$_hostIs5ch[$host]; - } - - // }}} - // {{{ isHostBe5chNet() - - /** - * host が be.2ch.net なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHostBe5chNet($host) - { - return $host == 'be.5ch.net'; - } - - // }}} - // {{{ isNotUse5chAPI() - - /** - * host が API を用いなくても取得できる場合なら true を返す - * - * @param string $host - * @return bool - */ - static public function isNotUse5chAPI($host) - { - return ($host == 'qb5.5ch.net' || $host == 'carpenter.5ch.net'); - } - - // }}} - // {{{ isHostBbsPink() - - /** - * host が bbspink なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHostBbsPink($host) - { - if (!array_key_exists($host, self::$_hostIsBbsPink)) { - self::$_hostIsBbsPink[$host] = (bool)preg_match('<^\\w+\\.bbspink\\.com$>', $host); - } - return self::$_hostIsBbsPink[$host]; - } - - // }}} - // {{{ isHost2chSc() - - /** - * host が 2ch.sc なら true を返す - * - * @param string $host - * @return boolean - */ - static public function isHost2chSc($host) - { - if (!array_key_exists($host, self::$_hostIs2chSc)) { - self::$_hostIs2chSc[$host] = (bool)preg_match('/\\.(2ch\\.sc)$/', $host); - } - return self::$_hostIs2chSc[$host]; - } - - // }}} - // {{{ isHostOpen2ch() - - /** - * host が おーぷん2ch なら true を返す - * - * @param string $host - * @return boolean - */ - static public function isHostOpen2ch($host) - { - if (!array_key_exists($host, self::$_hostIsOpen2ch)) { - self::$_hostIsOpen2ch[$host] = (bool)preg_match('/\\.(open2ch\\.net)$/', $host); - } - return self::$_hostIsOpen2ch[$host]; - } - - // }}} - // {{{ isHostMachiBbs() - - /** - * host が machibbs なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHostMachiBbs($host) - { - if ($host === "machi.to") { - return true; - } - - if (!array_key_exists($host, self::$_hostIsMachiBbs)) { - self::$_hostIsMachiBbs[$host] = (bool)preg_match('<^\\w+\\.machi(?:bbs\\.com|\\.to)$>', $host); - } - return self::$_hostIsMachiBbs[$host]; - } - - // }}} - // {{{ isHostMachiBbsNet() - - /** - * host が machibbs.net まちビねっと なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHostMachiBbsNet($host) - { - if (!array_key_exists($host, self::$_hostIsMachiBbsNet)) { - self::$_hostIsMachiBbsNet[$host] = (bool)preg_match('<^\\w+\\.machibbs\\.net$>', $host); - } - return self::$_hostIsMachiBbsNet[$host]; - } - - // }}} - // {{{ isHostJbbsShitaraba() - - /** - * host が livedoor レンタル掲示板 : したらば なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHostJbbsShitaraba($in_host) - { - if (!array_key_exists($in_host, self::$_hostIsJbbsShitaraba)) { - if ($in_host == 'rentalbbs.livedoor.com') { - self::$_hostIsJbbsShitaraba[$in_host] = true; - } elseif (preg_match('<^jbbs\\.(?:shitaraba\\.(?:net|com)|livedoor\\.(?:com|jp))(?:/|$)>', $in_host)) { - self::$_hostIsJbbsShitaraba[$in_host] = true; - } else { - self::$_hostIsJbbsShitaraba[$in_host] = false; - } - } - return self::$_hostIsJbbsShitaraba[$in_host]; - } - - // }}} - // {{{ adjustHostJbbs() - - /** - * livedoor レンタル掲示板 : したらばのホスト名変更に対応して変更する - * - * @param string $in_str ホスト名でもURLでもなんでも良い - * @return string - */ - static public function adjustHostJbbs($in_str) - { - return preg_replace('<(^|/)jbbs\\.(?:shitaraba|livedoor)\\.(?:net|com)(/|$)>', '\\1jbbs.shitaraba.net\\2', $in_str, 1); - } - - // }}} - // {{{ isHostTor() - - /** - * host が tor 系板 なら true を返す - * - * @access public - * @param string $host - * @return boolean - */ - static function isHostTor($host, $isGatewayMode = 99) - { - switch ($isGatewayMode) { - case 0: - $ret = (bool)preg_match('/\\.onion$/', $host); - break; - - case 1: - $ret = (bool)preg_match('/\\.(onion\\.cab|onion\\.city|onion\\.direct|onion\\.link|onion\\.nu|onion\\.to|onion\\.rip)$/', $host); - break; - - default: - $ret = (bool)preg_match('/\\.(onion\\.cab|onion\\.city|onion\\.direct|onion\\.link|onion\\.nu|onion\\.to|onion\\.rip|onion)$/', $host); - break; - } - - return $ret; - } - - // }}} - // {{{ isHostVip2ch() - - /** - * host が vip2ch なら true を返す - * - * @param string $host - * @return bool - */ - static public function isHostVip2ch($host) - { - if (!array_key_exists($host, self::$_hostIsVip2ch)) { - self::$_hostIsVip2ch[$host] = (bool)preg_match('<^\\w+\\.(?:vip2ch\\.com)$>', $host); - } - return self::$_hostIsVip2ch[$host]; - } - - // }}} - // {{{ isUrlWikipediaJa() - - /** - * URLがウィキペディア日本語版の記事ならtrueを返す - */ - static public function isUrlWikipediaJa($url) - { - return (strncmp($url, 'http://ja.wikipedia.org/wiki/', 29) == 0); - } - - // }}} -} - -// }}} - -/* - * Local Variables: - * mode: php - * coding: cp932 - * tab-width: 4 - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End: - */ -// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/lib/P2HttpExt.php b/lib/P2HttpExt.php index 0e55215f7..1dae07957 100644 --- a/lib/P2HttpExt.php +++ b/lib/P2HttpExt.php @@ -247,7 +247,7 @@ public function __construct($url, if (!isset($options['useragent'])) { $purl = parse_url($url); // URL分解 - $options['useragent'] = P2Commun::getP2UA(true,P2HostType::isHost2chs($purl['host'])); + $options['useragent'] = P2Commun::getP2UA(true,P2HostMgr::isHost2chs($purl['host'])); unset($purl); } @@ -931,7 +931,7 @@ static public function fetchSubjectTxt($subjects, $force = false) $url = 'http://' . $host . '/' . $bbs . '/subject.txt'; - if (P2HostType::isHostJbbsShitaraba($host) || P2HostType::isHostBe2chs($host)) { + if (P2HostMgr::isHostJbbsShitaraba($host) || P2HostMgr::isHostBe2chs($host)) { if ($eucjp2sjis === null) { $eucjp2sjis = new P2HttpCallback_SaveEucjpAsSjis(); } diff --git a/lib/P2Util.php b/lib/P2Util.php index adf0a513f..3f45dace0 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -299,7 +299,7 @@ static public function getItaName($host, $bbs) // 板名Longの取得 if (!isset($p2_setting['itaj'])) { - $itaj = BbsMap::getBbsName($host, $bbs); + $itaj = P2HostMgr::getBbsName($host, $bbs); if ($itaj != $bbs) { self::$_itaNames[$id] = $p2_setting['itaj'] = $itaj; @@ -339,9 +339,9 @@ static private function _p2DirOfHost($base_dir, $host, $dir_sep = true) $host = self::normalizeHostName($host); // 2channel or bbspink - if (P2HostType::isHost2chs($host)) { + if (P2HostMgr::isHost2chs($host)) { $host_dir = $base_dir . DIRECTORY_SEPARATOR . '2channel'; - } elseif (P2HostType::isHostOpen2ch($host)) { + } elseif (P2HostMgr::isHostOpen2ch($host)) { //互換性維持のため旧式のディレクトリを指定 $host_dir = $base_dir . DIRECTORY_SEPARATOR . rawurlencode($host); if (!file_exists($host_dir)) { @@ -349,7 +349,7 @@ static private function _p2DirOfHost($base_dir, $host, $dir_sep = true) $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'open2ch'; } - } elseif (P2HostType::isHost2chSc($host)) { + } elseif (P2HostMgr::isHost2chSc($host)) { //互換性維持のため旧式のディレクトリを指定 $host_dir = $base_dir . DIRECTORY_SEPARATOR . rawurlencode($host); if (!file_exists($host_dir)) { @@ -357,22 +357,22 @@ static private function _p2DirOfHost($base_dir, $host, $dir_sep = true) $host_dir = $base_dir . DIRECTORY_SEPARATOR . '2channel_sc'; } // machibbs.com - } elseif (P2HostType::isHostMachiBbs($host)) { + } elseif (P2HostMgr::isHostMachiBbs($host)) { $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'machibbs.com'; // tor - } elseif (P2HostType::isHostTor($host)) { + } elseif (P2HostMgr::isHostTor($host)) { $tor_host = preg_replace('/\.onion\.(\w+)$/', '.onion', $host); $host_dir = $base_dir . DIRECTORY_SEPARATOR . $tor_host; unset($tor_host); // jbbs.livedoor.jp (livedoor レンタル掲示板) - } elseif (P2HostType::isHostJbbsShitaraba($host)) { + } elseif (P2HostMgr::isHostJbbsShitaraba($host)) { if (DIRECTORY_SEPARATOR == '/') { $host_dir = $base_dir . DIRECTORY_SEPARATOR . $host; } else { $host_dir = $base_dir . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $host); } // vip.2ch.com - } elseif (P2HostType::isHostVip2ch($host)) { + } elseif (P2HostMgr::isHostVip2ch($host)) { $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'ex14.vip2ch.com'; // livedoor レンタル掲示板以外でスラッシュ等の文字を含むとき @@ -1553,7 +1553,7 @@ static public function detectThread($url = null) // 2ch or pink - http://choco.2ch.net/test/read.cgi/event/1027770702/ } elseif (preg_match('<^https?://(.+)/test/read\\.(?:cgi|html|so|php) /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) { - if (BbsMap::isRegisteredBbs($matches[1], $matches[2])) { + if (P2HostMgr::isRegisteredBbs($matches[1], $matches[2])) { $host = $matches[1]; $bbs = $matches[2]; $key = $matches[3]; @@ -1579,7 +1579,7 @@ static public function detectThread($url = null) // 2ch or pink 過去ログhtml - http://pc.2ch.net/mac/kako/1015/10153/1015358199.html } elseif (preg_match('<^(https?://(.+)(?:/[^/]+)?/(\\w+) /kako/\\d+(?:/\\d+)?/(\\d+)).html>x', $nama_url, $matches)) { - if (BbsMap::isRegisteredBbs($matches[2], $matches[3])) { + if (P2HostMgr::isRegisteredBbs($matches[2], $matches[3])) { $host = $matches[2]; $bbs = $matches[3]; $key = $matches[4]; @@ -1698,7 +1698,7 @@ static public function getHtmlDom($html, $charset = null, $report_error = true) */ static public function getHostGroupName($host) { - return P2HostType::getHostGroupName($host); + return P2HostMgr::getHostGroupName($host); } // }}} @@ -1777,7 +1777,7 @@ static private function _getBe2chCodeByMailPass($mail, $pass, $host) $url = http_build_url(array( "scheme" => $_conf['2ch_ssl.post'] ? "https" : "http", - "host" => P2HostType::isHost5ch($host) ? "be.5ch.net" : "be.2ch.net", + "host" => P2HostMgr::isHost5ch($host) ? "be.5ch.net" : "be.2ch.net", "path" => "index.php")); try { diff --git a/lib/SettingTxt.php b/lib/SettingTxt.php index 499e18c83..027131616 100644 --- a/lib/SettingTxt.php +++ b/lib/SettingTxt.php @@ -39,12 +39,12 @@ public function __construct($host, $bbs) $this->_setting_srd = $dat_host_bbs_dir_s . 'p2_kb_setting.srd'; // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) - if (P2HostType::isHost2chs($host) && ! P2HostType::isHostBbsPink($host) && $_conf['2ch_ssl.subject']) { + if (P2HostMgr::isHost2chs($host) && ! P2HostMgr::isHostBbsPink($host) && $_conf['2ch_ssl.subject']) { $this->_url = 'https://' . $host . '/' . $bbs . '/SETTING.TXT'; } else { $this->_url = 'http://' . $host . '/' . $bbs . '/SETTING.TXT'; } - //$this->_url = P2HostType::adjustHostJbbs($this->_url); // したらばのlivedoor移転に対応。読込先をlivedoorとする。 + //$this->_url = P2HostMgr::adjustHostJbbs($this->_url); // したらばのlivedoor移転に対応。読込先をlivedoorとする。 $this->setting_array = array(); @@ -80,7 +80,7 @@ public function downloadSettingTxt() global $_conf; // まちBBS・したらば は SETTING.TXT が存在しないものとする - if (P2HostType::isHostMachiBbs($this->_host) || P2HostType::isHostJbbsShitaraba($this->_host)) { + if (P2HostMgr::isHostMachiBbs($this->_host) || P2HostMgr::isHostJbbsShitaraba($this->_host)) { return false; } @@ -109,7 +109,7 @@ public function downloadSettingTxt() $code = $response->getStatus(); if ($code == 302) { // ホストの移転を追跡 - $new_host = BbsMap::getCurrentHost($this->host, $this->bbs); + $new_host = P2HostMgr::getCurrentHost($this->host, $this->bbs); if ($new_host != $this->host) { $aNewSettingTxt = new SettingTxt($new_host, $this->_bbs); return $aNewSettingTxt->downloadSettingTxt(); @@ -118,7 +118,7 @@ public function downloadSettingTxt() //var_dump($req->getResponseHeader()); $body = $response->getBody(); // したらば or be.2ch.net ならEUCをSJISに変換 - if (P2HostType::isHostJbbsShitaraba($this->host) || P2HostType::isHostBe2chs($this->host)) { + if (P2HostMgr::isHostJbbsShitaraba($this->host) || P2HostMgr::isHostBe2chs($this->host)) { $body = mb_convert_encoding($body, 'CP932', 'CP51932'); } if (FileCtl::file_write_contents($this->_setting_txt, $body) === false) { diff --git a/lib/ShowThread.php b/lib/ShowThread.php index c2dc52f00..b73ed9dd1 100644 --- a/lib/ShowThread.php +++ b/lib/ShowThread.php @@ -347,11 +347,11 @@ protected function __construct(ThreadRead $aThread, $matome = false) $this->_highlight_nums = array(); $this->_highlight_msgs = array(); - if (P2HostType::isHostBbsPink($this->thread->host)) { + if (P2HostMgr::isHostBbsPink($this->thread->host)) { $this->_redirector = self::REDIRECTOR_PINKTOWER; - } elseif (P2HostType::isHost2chs($this->thread->host)) { + } elseif (P2HostMgr::isHost2chs($this->thread->host)) { $this->_redirector = self::REDIRECTOR_IMENU; - } elseif (P2HostType::isHostMachiBbs($this->thread->host)) { + } elseif (P2HostMgr::isHostMachiBbs($this->thread->host)) { $this->_redirector = self::REDIRECTOR_MACHIBBS; } else { $this->_redirector = self::REDIRECTOR_NONE; @@ -1179,7 +1179,7 @@ private function _transLinkDo(array $s) if (strlen($following) > 0) { // ウィキペディア日本語版のURLで、SJISの2バイト文字の上位バイト // (0x81-0x9F,0xE0-0xEF)が続くとき - if (P2HostType::isUrlWikipediaJa($url)) { + if (P2HostMgr::isUrlWikipediaJa($url)) { $leading = ord($following); if ((($leading ^ 0x90) < 32 && $leading != 0x80) || ($leading ^ 0xE0) < 16) { $url .= rawurlencode(mb_convert_encoding($following, 'UTF-8', 'CP932')); @@ -1227,7 +1227,7 @@ private function _transLinkDo(array $s) if (!$purl || !array_key_exists('host', $purl) || strpos($purl['host'], '.') === false || $purl['host'] == '127.0.0.1' || - P2HostType::isHostExample($purl['host'])) + P2HostMgr::isHostExample($purl['host'])) { return $orig; } diff --git a/lib/ShowThreadI.php b/lib/ShowThreadI.php index 0f6ccce5e..0e505b10b 100644 --- a/lib/ShowThreadI.php +++ b/lib/ShowThreadI.php @@ -65,7 +65,7 @@ public function __construct(ThreadRead $aThread, $matome = false) $this->setBbsNonameName(); } - if (P2HostType::isHost2chs($aThread->host)) { + if (P2HostMgr::isHost2chs($aThread->host)) { $this->_kushiYakiName = '
    [―{}@{}@{}-] '; } @@ -856,7 +856,7 @@ public function plugin_link2chSubject($url, $purl, $str) if (preg_match('{^https?://(.+)/(.+)/$}', $purl[0], $m)) { //rep2に登録されている板ならばリンクする - if (BbsMap::isRegisteredBbs($m[1], $m[2])) { + if (P2HostMgr::isRegisteredBbs($m[1], $m[2])) { $subject_url = "{$_conf['subject_php']}?host={$m[1]}&bbs={$m[2]}"; return "{$str} [板をp2で開く]"; } @@ -893,7 +893,7 @@ public function plugin_viewImage($url, $purl, $str) { global $_conf; - if (P2HostType::isUrlWikipediaJa($url)) { + if (P2HostMgr::isUrlWikipediaJa($url)) { return false; } @@ -920,7 +920,7 @@ public function plugin_replaceImageUrl($url, $purl, $str) global $_conf; global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit_k; - if (P2HostType::isUrlWikipediaJa($url)) { + if (P2HostMgr::isUrlWikipediaJa($url)) { return false; } diff --git a/lib/ShowThreadK.php b/lib/ShowThreadK.php index 2f40d4476..8ee0d726b 100644 --- a/lib/ShowThreadK.php +++ b/lib/ShowThreadK.php @@ -65,7 +65,7 @@ public function __construct(ThreadRead $aThread, $matome = false) $this->setBbsNonameName(); } - if (P2HostType::isHost2chs($aThread->host)) { + if (P2HostMgr::isHost2chs($aThread->host)) { $this->_kushiYakiName = ' [―{}@{}@{}-] '; } @@ -753,7 +753,7 @@ public function plugin_link2chSubject($url, $purl, $str) if (preg_match('{^https?://(.+)/(.+)/$}', $purl[0], $m)) { //rep2に登録されている板ならばリンクする - if (BbsMap::isRegisteredBbs($m[1],$m[2])) { + if (P2HostMgr::isRegisteredBbs($m[1],$m[2])) { $subject_url = "{$_conf['subject_php']}?host={$m[1]}&bbs={$m[2]}"; return "{$str} [板をp2で開く]"; } @@ -834,7 +834,7 @@ public function plugin_viewImage($url, $purl, $str) { global $_conf; - if (P2HostType::isUrlWikipediaJa($url)) { + if (P2HostMgr::isUrlWikipediaJa($url)) { return false; } @@ -861,7 +861,7 @@ public function plugin_replaceImageUrl($url, $purl, $str) global $_conf; global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit_k; - if (P2HostType::isUrlWikipediaJa($url)) { + if (P2HostMgr::isUrlWikipediaJa($url)) { return false; } diff --git a/lib/ShowThreadPc.php b/lib/ShowThreadPc.php index f9524c92e..bf66e50e6 100644 --- a/lib/ShowThreadPc.php +++ b/lib/ShowThreadPc.php @@ -1262,7 +1262,7 @@ public function plugin_link2chSubject($url, $purl, $str) if (preg_match('{^https?://(.+)/(.+)/$}', $purl[0], $m)) { //rep2に登録されている板ならばリンクする - if (BbsMap::isRegisteredBbs($m[1],$m[2])) { + if (P2HostMgr::isRegisteredBbs($m[1],$m[2])) { $subject_url = "{$_conf['subject_php']}?host={$m[1]}&bbs={$m[2]}"; return "{$str} [板をp2で開く]"; } @@ -1318,7 +1318,7 @@ public function plugin_viewImage($url, $purl, $str) global $_conf; global $pre_thumb_unlimited, $pre_thumb_limit; - if (P2HostType::isUrlWikipediaJa($url)) { + if (P2HostMgr::isUrlWikipediaJa($url)) { return false; } diff --git a/lib/SubjectTxt.php b/lib/SubjectTxt.php index 7eb1e3d93..f45edbba1 100644 --- a/lib/SubjectTxt.php +++ b/lib/SubjectTxt.php @@ -31,16 +31,16 @@ public function __construct($host, $bbs) $this->subject_file = P2Util::datDirOfHostBbs($host, $bbs) . 'subject.txt'; // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) - if (P2HostType::isHost2chs($host) && ! P2HostType::isHostBbsPink($host) && $_conf['2ch_ssl.subject']) { + if (P2HostMgr::isHost2chs($host) && ! P2HostMgr::isHostBbsPink($host) && $_conf['2ch_ssl.subject']) { $this->subject_url = 'https://' . $host . '/' . $bbs . '/subject.txt'; } else { $this->subject_url = 'http://' . $host . '/' . $bbs . '/subject.txt'; } // したらばのlivedoor移転に対応。読込先をlivedoorとする。 - if(P2HostType::isHostJbbsShitaraba($host)) + if(P2HostMgr::isHostJbbsShitaraba($host)) { - $this->subject_url = P2HostType::adjustHostJbbs($this->subject_url); + $this->subject_url = P2HostMgr::adjustHostJbbs($this->subject_url); } // subject.txtをダウンロード&セットする @@ -104,7 +104,7 @@ public function downloadSubject() $code = $response->getStatus(); if ($code == 302) { // ホストの移転を追跡 - $new_host = BbsMap::getCurrentHost($this->host, $this->bbs); + $new_host = P2HostMgr::getCurrentHost($this->host, $this->bbs); if ($new_host != $this->host) { $aNewSubjectTxt = new SubjectTxt($new_host, $this->bbs); $body = $aNewSubjectTxt->downloadSubject(); @@ -114,7 +114,7 @@ public function downloadSubject() //var_dump($req->getResponseHeader()); $body = $response->getBody(); // したらば or be.2ch.net ならEUCをSJISに変換 - if (P2HostType::isHostJbbsShitaraba($this->host) || P2HostType::isHostBe2chs($this->host)) { + if (P2HostMgr::isHostJbbsShitaraba($this->host) || P2HostMgr::isHostBe2chs($this->host)) { $body = mb_convert_encoding($body, 'CP932', 'CP51932'); } if (FileCtl::file_write_contents($this->subject_file, $body) === false) { @@ -184,7 +184,7 @@ public function setSubjectLines($cont = '') $this->subject_lines = FileCtl::file_read_lines($this->subject_file); // JBBS@したらばなら重複スレタイを削除する - if (P2HostType::isHostJbbsShitaraba($this->host)) { + if (P2HostMgr::isHostJbbsShitaraba($this->host)) { $this->subject_lines = array_unique($this->subject_lines); } diff --git a/lib/Thread.php b/lib/Thread.php index 05516566c..d509e7bed 100644 --- a/lib/Thread.php +++ b/lib/Thread.php @@ -456,7 +456,7 @@ public function setTitleFromLocal() $this->setTtitle($d[4]); // be.2ch.net ならEUC→SJIS変換 - if (P2HostType::isHostBe2chs($this->host)) { + if (P2HostMgr::isHostBe2chs($this->host)) { $ttitle = mb_convert_encoding($this->ttitle, 'CP932', 'CP51932'); $this->setTtitle($ttitle); } @@ -497,13 +497,13 @@ public function getMotoThread($force_pc = false, $ls = null) } // 2ch系 - if (P2HostType::isHost2chs($this->host)) { + if (P2HostMgr::isHost2chs($this->host)) { // PC if (!$mobile) { $motothre_url = "http://{$this->host}/test/read.cgi/{$this->bbs}/{$this->key}/{$ls}"; // 携帯 } else { - if (P2HostType::isHostBbsPink($this->host)) { + if (P2HostMgr::isHostBbsPink($this->host)) { //$motothre_url = "http://{$this->host}/test/r.i/{$this->bbs}/{$this->key}/{$ls}"; $motothre_url = "http://speedo.ula.cc/test/r.so/{$this->host}/{$this->bbs}/{$this->key}/{$ls}"; } else { @@ -515,7 +515,7 @@ public function getMotoThread($force_pc = false, $ls = null) } // まちBBS - } elseif (P2HostType::isHostMachiBbs($this->host)) { + } elseif (P2HostMgr::isHostMachiBbs($this->host)) { if ($mobile) { $motothre_url = "http://{$this->host}/bbs/read.pl?IMODE=TRUE&BBS={$this->bbs}&KEY={$this->key}"; } else { @@ -523,13 +523,13 @@ public function getMotoThread($force_pc = false, $ls = null) } // まちびねっと - } elseif (P2HostType::isHostMachiBbsNet($this->host)) { + } elseif (P2HostMgr::isHostMachiBbsNet($this->host)) { $motothre_url = "http://{$this->host}/test/read.cgi?bbs={$this->bbs}&key={$this->key}"; if ($mobile) { $motothre_url .= '&imode=true'; } // JBBSしたらば - } elseif (P2HostType::isHostJbbsShitaraba($this->host)) { - list($host, $category) = explode('/', P2HostType::adjustHostJbbs($this->host), 2); + } elseif (P2HostMgr::isHostJbbsShitaraba($this->host)) { + list($host, $category) = explode('/', P2HostMgr::adjustHostJbbs($this->host), 2); $bbs_cgi = ($mobile) ? 'i.cgi' : 'read.cgi'; $motothre_url = "http://{$host}/bbs/{$bbs_cgi}/{$category}/{$this->bbs}/{$this->key}/{$ls}"; @@ -633,7 +633,7 @@ public function getFavStatus() $this->_favs = array($this->fav); } else { $this->_favs = array_fill(0, $_conf['expack.misc.favset_num'] + 1, false); - $group = P2Util::getHostGroupName($this->host); + $group = P2HostMgr::getHostGroupName($this->host); foreach ($_conf['favlists'] as $num => $favlist) { foreach ($favlist as $fav) { if ($this->key == $fav['key'] && $this->bbs == $fav['bbs'] && $group == $fav['group']) { diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 3d4838d12..b4c9fd3c1 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -47,10 +47,10 @@ public function downloadDat() { global $_conf; // まちBBS - if (P2HostType::isHostMachiBbs ($this->host)) { + if (P2HostMgr::isHostMachiBbs ($this->host)) { return DownloadDatMachiBbs::invoke ($this); // JBBS@したらば - } elseif (P2HostType::isHostJbbsShitaraba ($this->host)) { + } elseif (P2HostMgr::isHostJbbsShitaraba ($this->host)) { if (! function_exists ('shitarabaDownload')) { include P2_LIB_DIR . '/read_shitaraba.inc.php'; } @@ -70,7 +70,7 @@ public function downloadDat() { return $this->_downloadDat2chKako ($_GET['kakolog'], $ext); // 2ch はAPI経由で落とす - } elseif (P2HostType::isHost2chs ($this->host) && !P2HostType::isNotUse2chsAPI ($this->host) && $_conf['2chapi_use'] && empty ($_GET['olddat'])) { + } elseif (P2HostMgr::isHost2chs ($this->host) && !P2HostMgr::isNotUse2chsAPI ($this->host) && $_conf['2chapi_use'] && empty ($_GET['olddat'])) { // ログインしてなければ or ログイン後、設定した時間経過していたら自動再ログイン if (! file_exists ($_conf['sid2chapi_php']) || ! empty ($_REQUEST['relogin2chapi']) || (filemtime ($_conf['sid2chapi_php']) < time () - 60 * 60 * $_conf['2chapi_interval'])) { @@ -141,7 +141,7 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { $url= http_build_url(array( "scheme" => $_conf['2chapi_ssl.read']?"https":"http", - "host" => P2HostType::isHost5ch($this->host)?"api.5ch.net":"api.2ch.net", + "host" => P2HostMgr::isHost5ch($this->host)?"api.5ch.net":"api.2ch.net", "path" => "v1/".$serverName[0] . '/' . $this->bbs . '/' . $this->key)); $message = '/v1/' . $serverName[0] . '/' . $this->bbs . '/' . $this->key . $SID2ch . $AppKey; @@ -309,7 +309,7 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { return true; } elseif ($code == '302') { // Found // ホストの移転を追跡 - $new_host = BbsMap::getCurrentHost ($this->host, $this->bbs); + $new_host = P2HostMgr::getCurrentHost ($this->host, $this->bbs); if ($new_host != $this->host) { $this->old_host = $this->host; $this->host = $new_host; @@ -437,7 +437,7 @@ protected function _downloadDat2ch($from_bytes) { $this->modified = $response->getHeader ('Last-Modified'); // ホストが2chの時にDATを利用できない旨のメッセージが出たらエラーとする(DAT破損対策) - if (P2HostType::isHost2chs ($this->host)) { + if (P2HostMgr::isHost2chs ($this->host)) { // 1行目を切り出す $posLF = mb_strpos ($body, "\n"); $firstmsg = mb_substr ($body, 0, $posLF === false ? mb_strlen ($body) : $posLF); @@ -499,7 +499,7 @@ protected function _downloadDat2ch($from_bytes) { return true; } elseif ($code == '302') { // Found // ホストの移転を追跡 - $new_host = BbsMap::getCurrentHost ($this->host, $this->bbs); + $new_host = P2HostMgr::getCurrentHost ($this->host, $this->bbs); if ($new_host != $this->host) { $this->old_host = $this->host; $this->host = $new_host; @@ -624,7 +624,7 @@ public function get2chDatError($code = null) { } $reason = null; - if (P2HostType::isHost2chs ($this->host) || P2HostType::isHostVip2ch ($this->host)) { + if (P2HostMgr::isHost2chs ($this->host) || P2HostMgr::isHostVip2ch ($this->host)) { if ($code == '302') { $body203 = $this->_get2ch203Body(); if ($body203 !== false && preg_match('/過去ログ ★/', $body203)) { @@ -648,7 +648,7 @@ public function get2chDatError($code = null) { try { $req = P2Commun::createHTTPRequest ($read_url.'1', HTTP_Request2::METHOD_GET); // ヘッダ - $req->setHeader ('User-Agent', P2Commun::getP2UA(false,P2HostType::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG + $req->setHeader ('User-Agent', P2Commun::getP2UA(false,P2HostMgr::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG // Requestの送信 $response = P2Commun::getHTTPResponse($req); @@ -802,7 +802,7 @@ public function previewOne() { fclose ($fd); // be.2ch.net ならEUC→SJIS変換 - if (P2HostType::isHostBe2chNet ($this->host)) { + if (P2HostMgr::isHostBe2chNet ($this->host)) { $first_line = mb_convert_encoding ($first_line, 'CP932', 'CP51932'); } @@ -852,7 +852,7 @@ public function previewOneNotFound($code = null) { $this->diedat = true; // 2ch, bbspink, vip2ch ならread.cgiで確認 - if (P2HostType::isHost2chs ($this->host) || P2HostType::isHostVip2ch ($this->host)) { + if (P2HostMgr::isHost2chs ($this->host) || P2HostMgr::isHostVip2ch ($this->host)) { $this->getdat_error_msg_ht = $this->get2chDatError ($code); if (count ($this->datochi_residuums)) { if ($_conf['ktai']) { @@ -1016,7 +1016,7 @@ public function readDat() { // be.2ch.net ならEUC→SJIS変換 // 念のためSJISとUTF-8も文字コード判定の候補に入れておく // ・・・が、文字化けしたタイトルのスレッドで誤判定があったので、指定しておく - if (P2HostType::isHostBe2chNet ($this->host)) { + if (P2HostMgr::isHostBe2chNet ($this->host)) { // mb_convert_variables('CP932', 'CP51932,CP932,UTF-8', $this->datlines); mb_convert_variables ('CP932', 'CP51932', $this->datlines); } @@ -1099,7 +1099,7 @@ public function explodeDatLine($aline) { * @return array */ public function scanOriginalHosts() { - if (P2HostType::isHost2chs ($this->host) && file_exists ($this->keydat) && ($dat = file_get_contents ($this->keydat))) { + if (P2HostMgr::isHost2chs ($this->host) && file_exists ($this->keydat) && ($dat = file_get_contents ($this->keydat))) { $bbs_re = preg_quote ($this->bbs, '@'); $pattern = "@/(\\w+\\.(?:2ch\\.net|bbspink\\.com))(?:/test/read\\.cgi)?/{$bbs_re}\\b@"; if (preg_match_all ($pattern, $dat, $matches, PREG_PATTERN_ORDER)) { diff --git a/lib/expack/tgrep/view.inc.php b/lib/expack/tgrep/view.inc.php index 3fdf1f99b..1a3081950 100644 --- a/lib/expack/tgrep/view.inc.php +++ b/lib/expack/tgrep/view.inc.php @@ -148,7 +148,7 @@ function moveSubject(href, serachWord, query) { $new = ''; $turl = sprintf('%s?host=%s&bbs=%s&key=%d', $_conf['read_php'], $t->host, $t->bbs, $t->tkey); $burl = sprintf('%s?host=%s&bbs=%s&itaj_en=%s&word=%s', $_conf['subject_php'], $t->host, $t->bbs, UrlSafeBase64::encode($t->ita), $htm['query_en']); - if (P2HostType::isHostMachiBbs($t->host)) { + if (P2HostMgr::isHostMachiBbs($t->host)) { $ourl = sprintf('http://%s/bbs/read.cgi/%s/%s/', $t->host, $t->bbs, $t->tkey); } else { $ourl = sprintf('http://%s/test/read.cgi/%s/%s/', $t->host, $t->bbs, $t->tkey); diff --git a/lib/get_info.inc.php b/lib/get_info.inc.php index 99c158d1a..3da39cced 100644 --- a/lib/get_info.inc.php +++ b/lib/get_info.inc.php @@ -16,7 +16,7 @@ function get_board_info($host, $bbs) { global $_conf; - $group = P2Util::getHostGroupName($host); + $group = P2HostMgr::getHostGroupName($host); $info = new stdClass(); $info->type = 'board'; @@ -59,7 +59,7 @@ function get_board_info($host, $bbs) foreach ($favlines as $l) { $lar = explode("\t", $l); $favitas[0][] = array( - 'group' => P2Util::getHostGroupName($lar[1]), + 'group' => P2HostMgr::getHostGroupName($lar[1]), 'host' => $lar[1], 'bbs' => $lar[2], 'itaj' => $lar[3] @@ -97,7 +97,7 @@ function get_thread_info($host, $bbs, $key) { global $_conf; - $group = P2Util::getHostGroupName($host); + $group = P2HostMgr::getHostGroupName($host); $info = new stdClass(); $info->type = 'thread'; @@ -163,7 +163,7 @@ function get_thread_info($host, $bbs, $key) foreach ($pallines as $l) { $palarray = explode('<>', $l); if ($aThread->key == $palarray[1] && $aThread->bbs == $palarray[11]) { - if (P2Util::getHostGroupName($palarray[10]) == $group) { + if (P2HostMgr::getHostGroupName($palarray[10]) == $group) { $info->palace = true; break; } diff --git a/lib/plugins/hissi/Hissi.php b/lib/plugins/hissi/Hissi.php index ef64901c5..29abac77f 100644 --- a/lib/plugins/hissi/Hissi.php +++ b/lib/plugins/hissi/Hissi.php @@ -83,7 +83,7 @@ public function load() public function isEnabled() { if ($this->host) { - if (!P2HostType::isHost2chs($this->host)) { + if (!P2HostMgr::isHost2chs($this->host)) { return false; } } diff --git a/lib/plugins/mimizun/Mimizun.php b/lib/plugins/mimizun/Mimizun.php index ec020c6dc..bf97c6338 100644 --- a/lib/plugins/mimizun/Mimizun.php +++ b/lib/plugins/mimizun/Mimizun.php @@ -91,11 +91,11 @@ public function isEnabled() // (セットされていなければ2chとみなす) if ($this->host) { // まちBBSならfalse - if (P2HostType::isHostMachiBbs($this->host)) { + if (P2HostMgr::isHostMachiBbs($this->host)) { return false; } // 2chでなければfalse - if (!P2HostType::isHost2chs($this->host)) { + if (!P2HostMgr::isHost2chs($this->host)) { return false; } } diff --git a/lib/plugins/stalker/Stalker.php b/lib/plugins/stalker/Stalker.php index ad0be2fc2..bb93a5828 100644 --- a/lib/plugins/stalker/Stalker.php +++ b/lib/plugins/stalker/Stalker.php @@ -24,7 +24,7 @@ class Stalker public function isEnabled() { if ($this->host) { - if (!P2HostType::isHost2chs($this->host)) { + if (!P2HostMgr::isHost2chs($this->host)) { return false; } } diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index 57f90d84c..0b5618904 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -168,13 +168,13 @@ function setHiddenValue(button) { // {{{ ●/Be 書き込み チェックボックス // 2ch●書き込み -if (P2HostType::isHost2chs($host) and file_exists($_conf['sid2ch_php'])) { +if (P2HostMgr::isHost2chs($host) and file_exists($_conf['sid2ch_php'])) { $htm['maru_post'] = '' . ''; } // Be -if (P2HostType::isHost2chs($host) and P2Util::isEnableBe2ch()) { +if (P2HostMgr::isHost2chs($host) and P2Util::isEnableBe2ch()) { $htm['beres'] = '' . ''; } @@ -208,7 +208,7 @@ function setHiddenValue(button) { $htm['dpreview2'] = ''; if (!$_conf['ktai'] && $_conf['expack.editor.dpreview']) { $_dpreview_noname = 'null'; - if (P2HostType::isHost2chs($host)) { + if (P2HostMgr::isHost2chs($host)) { $_dpreview_st = new SettingTxt($host, $bbs); $_dpreview_st->setSettingArray(); if (!empty($_dpreview_st->setting_array['BBS_NONAME_NAME'])) { diff --git a/lib/read_shitaraba.inc.php b/lib/read_shitaraba.inc.php index a74b4b246..b8d54a8e3 100644 --- a/lib/read_shitaraba.inc.php +++ b/lib/read_shitaraba.inc.php @@ -36,9 +36,9 @@ function shitarabaDownload(ThreadRead $aThread) } // JBBS@したらば - if (P2HostType::isHostJbbsShitaraba($aThread->host)) { + if (P2HostMgr::isHostJbbsShitaraba($aThread->host)) { // したらばのlivedoor移転に対応。読込先をlivedoorとする。 - $host = P2HostType::adjustHostJbbs($aThread->host); + $host = P2HostMgr::adjustHostJbbs($aThread->host); list($host, $category, ) = explode('/', $host); $machiurl = "http://{$host}/bbs/rawmode.cgi/{$category}/{$aThread->bbs}/{$aThread->key}/{$START}-"; } @@ -55,7 +55,7 @@ function shitarabaDownload(ThreadRead $aThread) unset($machiurl_res); // {{{ したらばならEUCをSJISに変換 - if (P2HostType::isHostJbbsShitaraba($aThread->host)) { + if (P2HostMgr::isHostJbbsShitaraba($aThread->host)) { $temp_data = FileCtl::file_read_contents($tempfile); $temp_data = mb_convert_encoding($temp_data, 'CP932', 'CP51932'); if (FileCtl::file_write_contents($tempfile, $temp_data) === false) { diff --git a/lib/sb_footer.inc.php b/lib/sb_footer.inc.php index 2ce033c97..7418c2573 100644 --- a/lib/sb_footer.inc.php +++ b/lib/sb_footer.inc.php @@ -82,11 +82,11 @@ // スペシャルモードでなければフォーム入力補完======================== $ini_url_text = ''; if (!$aThreadList->spmode) { - if (P2HostType::isHostJbbsShitaraba($aThreadList->host)) { // したらば + if (P2HostMgr::isHostJbbsShitaraba($aThreadList->host)) { // したらば $ini_url_text = "http://{$aThreadList->host}/bbs/read.cgi?BBS={$aThreadList->bbs}&KEY="; - } elseif (P2HostType::isHostMachiBbs($aThreadList->host)) { // まちBBS + } elseif (P2HostMgr::isHostMachiBbs($aThreadList->host)) { // まちBBS $ini_url_text = "http://{$aThreadList->host}/bbs/read.pl?BBS={$aThreadList->bbs}&KEY="; - } elseif (P2HostType::isHostMachiBbsNet($aThreadList->host)) { // まちビねっと + } elseif (P2HostMgr::isHostMachiBbsNet($aThreadList->host)) { // まちビねっと $ini_url_text = "http://{$aThreadList->host}/test/read.cgi?bbs={$aThreadList->bbs}&key="; } else { $ini_url_text = "http://{$aThreadList->host}/test/read.cgi/{$aThreadList->bbs}/"; diff --git a/lib/sb_header_k.inc.php b/lib/sb_header_k.inc.php index 59b823fe1..df20a1431 100644 --- a/lib/sb_header_k.inc.php +++ b/lib/sb_header_k.inc.php @@ -21,8 +21,8 @@ $ptitle_url = $p2_subject_url; // 2ch系 - } elseif (P2HostType::isHost2chs($aThreadList->host)) { - if (P2HostType::isHostBbsPink($aThreadList->host)) { + } elseif (P2HostMgr::isHost2chs($aThreadList->host)) { + if (P2HostMgr::isHostBbsPink($aThreadList->host)) { //$ptitle_url = "http://{$aThreadList->host}/{$aThreadList->bbs}/i/"; $ptitle_url = "http://speedo.ula.cc/test/p.so/{$aThreadList->host}/{$aThreadList->bbs}/"; } else { diff --git a/lib/sb_print_k.inc.php b/lib/sb_print_k.inc.php index e06264217..4309b186f 100644 --- a/lib/sb_print_k.inc.php +++ b/lib/sb_print_k.inc.php @@ -240,7 +240,7 @@ function sb_print_k($aThreadList) } // >>1のみ, >>1から - if (P2HostType::isHost2chs($aThreadList->host) && !$aThread->isKitoku()) { + if (P2HostMgr::isHost2chs($aThreadList->host) && !$aThread->isKitoku()) { switch ($_conf['mobile.sb_show_first']) { case 1: $thre_url = $onlyone_url; diff --git a/lib/startup.funcs.php b/lib/startup.funcs.php index 8771ad52b..e5c8c732f 100644 --- a/lib/startup.funcs.php +++ b/lib/startup.funcs.php @@ -14,7 +14,6 @@ function p2_load_class($name) { if (preg_match('/^(?: - BbsMap | BrdCtl | BrdMenu(?:Cate|Ita)? | DataPhp | diff --git a/lib/wiki/Samba.php b/lib/wiki/Samba.php index 59b1bb243..53f41b920 100644 --- a/lib/wiki/Samba.php +++ b/lib/wiki/Samba.php @@ -69,7 +69,7 @@ public function save() public function getSambaTime($host, $bbs) { - if (!P2HostType::isHost2chs($host)) { + if (!P2HostMgr::isHost2chs($host)) { return false; } // sambaを取得 @@ -105,7 +105,7 @@ public function setWriteTime($host, $bbs) // 残り時間を取得 public function getSamba($host, $bbs) { - if (!P2HostType::isHost2chs($host)) { + if (!P2HostMgr::isHost2chs($host)) { return -1; } From 72cb902f58e0e0a0fe60bdf25cb7dd3bd4ba7816 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Sun, 19 Nov 2017 22:31:51 +0900 Subject: [PATCH 297/339] =?UTF-8?q?BbsMap.php=E3=81=A8P2HostType.php?= =?UTF-8?q?=E3=82=92=E5=90=88=E4=BD=93=E3=80=80=E3=82=B3=E3=83=9F=E3=83=83?= =?UTF-8?q?=E3=83=88=E3=81=97=E5=BF=98=E3=82=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/editfavita.php | 2 +- rep2/editpref.php | 4 ++-- rep2/info.php | 2 +- rep2/live_post_form.php | 2 +- rep2/post.php | 22 +++++++++++----------- rep2/post_draft.php | 4 ++-- rep2/post_form.php | 2 +- rep2/subject.php | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/rep2/editfavita.php b/rep2/editfavita.php index a774b566a..25e6104e2 100644 --- a/rep2/editfavita.php +++ b/rep2/editfavita.php @@ -18,7 +18,7 @@ } // お気に板のホストを同期 if (isset($_GET['syncfavita']) || isset($_POST['syncfavita'])) { - BbsMap::syncBrd($_conf['favita_brd']); + P2HostMgr::syncBrd($_conf['favita_brd']); } diff --git a/rep2/editpref.php b/rep2/editpref.php index cea008990..e5449971e 100644 --- a/rep2/editpref.php +++ b/rep2/editpref.php @@ -84,13 +84,13 @@ foreach ($sync_boards as $brd) { if (file_exists($brd)) { - BbsMap::syncBrd($brd); + P2HostMgr::syncBrd($brd); } } foreach ($sync_indexes as $idx) { if (file_exists($idx)) { - BbsMap::syncIdx($idx); + P2HostMgr::syncIdx($idx); } } diff --git a/rep2/info.php b/rep2/info.php index 05111e28e..b430540cb 100644 --- a/rep2/info.php +++ b/rep2/info.php @@ -283,7 +283,7 @@ } $motothre_url = $aThread->getMotoThread(); -if (P2HostType::isHost2chs($aThread->host)) { +if (P2HostMgr::isHost2chs($aThread->host)) { $motothre_org_url = $aThread->getMotoThread(true); } else { $motothre_org_url = $motothre_url; diff --git a/rep2/live_post_form.php b/rep2/live_post_form.php index 1d868f079..23b5bdeef 100755 --- a/rep2/live_post_form.php +++ b/rep2/live_post_form.php @@ -57,7 +57,7 @@ $ptitle = "{$itaj_hd} - 新規スレッド作成"; // machibbs、JBBS@したらば なら - if (P2HostType::isHostMachiBbs($host) or P2HostType::isHostJbbsShitaraba($host)) { + if (P2HostMgr::isHostMachiBbs($host) or P2HostMgr::isHostJbbsShitaraba($host)) { $submit_value = '新規書き込み'; // 2chなら } else { diff --git a/rep2/post.php b/rep2/post.php index b5c18b9db..0b0552d0e 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -84,13 +84,13 @@ // }}} // machibbs、JBBS@したらば なら -if (P2HostType::isHostMachiBbs($host) or P2HostType::isHostJbbsShitaraba($host)) { +if (P2HostMgr::isHostMachiBbs($host) or P2HostMgr::isHostJbbsShitaraba($host)) { $bbs_cgi = '/bbs/write.cgi'; // JBBS@したらば なら - if (P2HostType::isHostJbbsShitaraba($host)) { + if (P2HostMgr::isHostJbbsShitaraba($host)) { // したらばの移転に対応。post先を現行に合わせる。 - $host = P2HostType::adjustHostJbbs($host); + $host = P2HostMgr::adjustHostJbbs($host); $bbs_cgi = '../../bbs/write.cgi'; preg_match('/\\/(\\w+)$/', $host, $ar); $dir = $ar[1]; @@ -148,13 +148,13 @@ exit; } -if (P2HostType::isHostJbbsShitaraba($host)) { +if (P2HostMgr::isHostJbbsShitaraba($host)) { $post[$dir_k] = $dir; } // {{{ 2chで●ログイン中ならsid追加 -if (!empty($_POST['maru']) and P2HostType::isHost2chs($host)) { +if (!empty($_POST['maru']) and P2HostMgr::isHost2chs($host)) { $maru_time = 0; if (file_exists($_conf['sid2ch_php'])) { @@ -212,7 +212,7 @@ PostDataStore::set($post_backup_key, $post_cache); // cookie 読み込み -$cookie_key = $_login->user_u . '/' . P2Util::normalizeHostName(P2HostType::isHostBbsPink($host) ? 'www.bbspink.com' : P2HostType::isHost2chs($host) ? 'www.2ch.net' : $host); // 忍法帳対応 +$cookie_key = $_login->user_u . '/' . P2Util::normalizeHostName(P2HostMgr::isHostBbsPink($host) ? 'www.bbspink.com' : P2HostMgr::isHost2chs($host) ? 'www.2ch.net' : $host); // 忍法帳対応 if ($p2cookies = CookieDataStore::get($cookie_key)) { if (is_array($p2cookies)) { if (array_key_exists('expires', $p2cookies)) { @@ -389,7 +389,7 @@ function postIt($host, $bbs, $key, $post) global $bbs_cgi; // 接続先が2ch.netならばSSL通信を行う(pinkは対応していないのでしない) - if (P2HostType::isHost2chs($host) && ! P2HostType::isHostBbsPink($host) && $_conf['2ch_ssl.post']) { + if (P2HostMgr::isHost2chs($host) && ! P2HostMgr::isHostBbsPink($host) && $_conf['2ch_ssl.post']) { $bbs_cgi_url = 'https://' . $host . $bbs_cgi; } else { $bbs_cgi_url = 'http://' . $host . $bbs_cgi; @@ -411,7 +411,7 @@ function postIt($host, $bbs, $key, $post) } // be.2ch.net 認証クッキー - if (P2HostType::isHostBe2chs($host) || !empty($_REQUEST['beres'])) { + if (P2HostMgr::isHostBe2chs($host) || !empty($_REQUEST['beres'])) { if ($_conf['be_2ch_DMDM'] && $_conf['be_2ch_MDMD']) { $req->addCookie('DMDM', urlencode( rawurldecode( $_conf['be_2ch_DMDM']) ) ); $req->addCookie('MDMD', urlencode( rawurldecode( $_conf['be_2ch_MDMD']) ) ); @@ -428,9 +428,9 @@ function postIt($host, $bbs, $key, $post) while (list($name, $value) = each($post)) { // したらば or be.2ch.netなら、EUCに変換 - if (P2HostType::isHostJbbsShitaraba($host) || P2HostType::isHostBe2chs($host)) { + if (P2HostMgr::isHostJbbsShitaraba($host) || P2HostMgr::isHostBe2chs($host)) { $value = mb_convert_encoding($value, 'CP51932', 'CP932'); - } elseif (P2HostType::isHost2chs($host) && ! P2HostType::isHostBbsPink($host)) { + } elseif (P2HostMgr::isHost2chs($host) && ! P2HostMgr::isHostBbsPink($host)) { // 2chはUnicodeの文字列をpostする $value = html_entity_decode(mb_convert_encoding($value, 'UTF-8', 'CP932'),ENT_QUOTES,'UTF-8'); } @@ -464,7 +464,7 @@ function postIt($host, $bbs, $key, $post) } // be.2ch.net or JBBSしたらば 文字コード変換 EUC→SJIS - if (P2HostType::isHostBe2chs($host) || P2HostType::isHostJbbsShitaraba($host)) { + if (P2HostMgr::isHostBe2chs($host) || P2HostMgr::isHostJbbsShitaraba($host)) { $body = mb_convert_encoding($body, 'CP932', 'CP51932'); // diff --git a/rep2/post_draft.php b/rep2/post_draft.php index a99c01659..f1ca4fcfe 100644 --- a/rep2/post_draft.php +++ b/rep2/post_draft.php @@ -44,10 +44,10 @@ } // したらばのlivedoor移転に対応。post先をlivedoorとする。 -$host = P2HostType::adjustHostJbbs($host); +$host = P2HostMgr::adjustHostJbbs($host); // machibbs、JBBS@したらば なら -if (P2HostType::isHostMachiBbs($host) or P2HostType::isHostJbbsShitaraba($host)) { +if (P2HostMgr::isHostMachiBbs($host) or P2HostMgr::isHostJbbsShitaraba($host)) { /* compact() と array_combine() でPOSTする値の配列を作るので、 $post_param_keys と $post_send_keys の値の順序は揃える! */ //$post_param_keys = array('bbs', 'key', 'time', 'FROM', 'mail', 'MESSAGE', 'subject', 'submit'); diff --git a/rep2/post_form.php b/rep2/post_form.php index 895499e78..62cfe71a7 100644 --- a/rep2/post_form.php +++ b/rep2/post_form.php @@ -55,7 +55,7 @@ $ptitle = "{$itaj_hd} - 新規スレッド作成"; // machibbs、JBBS@したらば なら - if (P2HostType::isHostMachiBbs($host) or P2HostType::isHostJbbsShitaraba($host)) { + if (P2HostMgr::isHostMachiBbs($host) or P2HostMgr::isHostJbbsShitaraba($host)) { $submit_value = '新規書き込み'; // 2chなら } else { diff --git a/rep2/subject.php b/rep2/subject.php index c12590bad..a1fee00ba 100644 --- a/rep2/subject.php +++ b/rep2/subject.php @@ -1036,7 +1036,7 @@ function matchSbFilter(Thread $aThread) if (file_exists($aThread->keydat)) { $subject = file_get_contents($aThread->keydat); // be.2ch.net はEUC - if (P2HostType::isHostBe2chs($aThread->host)) { + if (P2HostMgr::isHostBe2chs($aThread->host)) { $subject = mb_convert_encoding($subject, 'CP932', 'CP51932'); } } else { From 9b0d2afc162cc74665ee501ec468308768890a8c Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Mon, 20 Nov 2017 07:19:27 +0900 Subject: [PATCH 298/339] =?UTF-8?q?UA.php=E3=81=A7=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E3=81=97=E3=81=A6=E3=81=84=E3=82=8B=E3=82=B0=E3=83=AD=E3=83=BC?= =?UTF-8?q?=E3=83=90=E3=83=AB=E5=A4=89=E6=95=B0=E3=82=92=E3=82=AF=E3=83=A9?= =?UTF-8?q?=E3=82=B9=E5=A4=89=E6=95=B0=E3=81=AB=E5=A4=89=E6=9B=B4=20?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84=E3=81=AA?= =?UTF-8?q?=E3=81=84=E3=83=AC=E3=82=B9=E3=83=96=E3=83=83=E3=82=AF=E3=83=9E?= =?UTF-8?q?=E3=83=BC=E3=82=AF=E6=A9=9F=E8=83=BD=E3=81=AE=E6=AE=8B=E9=AA=B8?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/UA.php | 56 +++++++++++++++++++---------------------- lib/setbookmark.inc.php | 36 -------------------------- rep2/httpcmd.php | 38 ---------------------------- rep2/js/invite.js | 1 - 4 files changed, 26 insertions(+), 105 deletions(-) delete mode 100644 lib/setbookmark.inc.php diff --git a/lib/UA.php b/lib/UA.php index bc93110bc..e098c8cff 100644 --- a/lib/UA.php +++ b/lib/UA.php @@ -1,24 +1,6 @@ '); invite.document.writeln(''); invite.document.writeln(''); - invite.document.writeln(''); invite.document.writeln(''); invite.document.close(); invite.resizeTo(winWidth, winHeight); From c6ca1768f96a66d922b826081e23fdcdb0266c97 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Mon, 20 Nov 2017 07:35:12 +0900 Subject: [PATCH 299/339] =?UTF-8?q?HTTP=E9=80=9A=E4=BF=A1=E3=82=92socket?= =?UTF-8?q?=E3=81=8B=E3=82=89cURL=E3=81=AB=E6=88=BB=E3=81=97=E3=81=9F?= =?UTF-8?q?=E3=80=82=20socket=E3=81=AFopenSSL=E3=81=8C=E3=82=89=E3=81=BF?= =?UTF-8?q?=E3=81=A7=E5=9C=B0=E9=9B=B7=E8=B8=8F=E3=82=80=E3=81=AE=E3=81=A7?= =?UTF-8?q?=E7=B5=B6=E5=AF=BE=E4=BD=BF=E7=94=A8=E7=A6=81=E6=AD=A2=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Commun.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/P2Commun.php b/lib/P2Commun.php index 9b8d33ace..d66d7d93f 100644 --- a/lib/P2Commun.php +++ b/lib/P2Commun.php @@ -46,9 +46,8 @@ static public function createHTTPRequest($url , $method = HTTP_Request2::METHOD_ 'timeout' => $_conf['http_read_timeout'], )); - // 外部との通信は全てcURLを使う -// $req->setAdapter('curl'); - $req->setAdapter('socket'); + // 外部との通信は全てcURLを使う(socketはopenSSL絡みで地雷踏むので絶対使用禁止!) + $req->setAdapter('curl'); // SSLの設定 if($purl['scheme'] == 'https') { From 6aeba878eb5d89ecacdc7a64655da83884e80add Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Tue, 21 Nov 2017 07:31:07 +0900 Subject: [PATCH 300/339] =?UTF-8?q?=E2=97=8F=E3=81=AE=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E6=83=85=E5=A0=B1=E3=82=92=E8=AA=AD=E3=81=BF?= =?UTF-8?q?=E8=BE=BC=E3=82=80=E9=9A=9B=E3=81=AE=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E5=87=A6=E7=90=86=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index 3f45dace0..3d9207c06 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1012,9 +1012,11 @@ static public function readIdPw2ch() } $autoLogin2ch = (bool)$rec_autoLogin2ch; + + return array($login2chID, $login2chPW, $autoLogin2ch); } - return array($login2chID, $login2chPW, $autoLogin2ch); + return false; } // }}} From 0340267b0a5a264ef4c1cab9a41419a90f1b17b1 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Mon, 20 Nov 2017 12:41:23 +0900 Subject: [PATCH 301/339] =?UTF-8?q?detectThread=20=E3=81=AB=E9=96=A2?= =?UTF-8?q?=E3=81=97=E3=81=A6=E8=BF=BD=E5=8A=A0=EF=BD=A5=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ス・豁」隕剰。ィ迴セ繝代ち繝シ繝ウ繧貞粋繧上○縺 ス・itest.bbspink.com 繧定ソス蜉 --- lib/P2Util.php | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index 3d9207c06..6934b7fbf 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1497,23 +1497,23 @@ static public function detectThread($url = null) $ls = null; // まちBBS - http://kanto.machi.to/bbs/read.cgi/kanto/1241815559/ - if (preg_match('<^http://(\\w+\\.machi(?:bbs\\.com|\\.to))/bbs/read\\.cgi - /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) { + if (preg_match('<^https?://(\\w+\\.machi(?:bbs\\.com|\\.to))/bbs/read\\.cgi + /(\\w+)/(\\d+)(?:/([^/]*))?>x', $nama_url, $matches)) { $host = $matches[1]; $bbs = $matches[2]; $key = $matches[3]; $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; // まちBBS(ドメインのみ) - http://machi.to/bbs/read.cgi/kanto/1241815559/ - } elseif (preg_match('<^http?://(machi\\.to)/bbs/read\\.cgi - /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) { + } elseif (preg_match('<^https?://(machi\\.to)/bbs/read\\.cgi + /(\\w+)/(\\d+)(?:/([^/]*))?>x', $nama_url, $matches)) { $host = $matches[1]; $bbs = $matches[2]; $key = $matches[3]; $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; // したらばJBBS - http://jbbs.livedoor.com/bbs/read.cgi/computer/2999/1081177036/-100 - } elseif (preg_match('<^http://(jbbs\\.(?:livedoor\\.(?:jp|com)|shitaraba\\.(?:net|com)))/(?:bbs|bbs/lite)/read\\.cgi + } elseif (preg_match('<^https?://(jbbs\\.(?:livedoor\\.(?:jp|com)|shitaraba\\.(?:net|com)))/(?:bbs|bbs/lite)/read\\.cgi /(\\w+)/(\\d+)/(\\d+)/((?:\\d+)?-(?:\\d+)?)?[^"]*>x', $nama_url, $matches)) { $host = $matches[1] . '/' . $matches[2]; $bbs = $matches[3]; @@ -1521,36 +1521,36 @@ static public function detectThread($url = null) $ls = isset($matches[5]) ? $matches[5] : ''; // 旧式まち&したらばJBBS - http://kanto.machibbs.com/bbs/read.pl?BBS=kana&KEY=1034515019 - } elseif (preg_match('<^http://(\\w+\\.machi(?:bbs\\.com|\\.to))/bbs/read\\.(?:pl|cgi)\\?(.+)>', + } elseif (preg_match('<^https?://(\\w+\\.machi(?:bbs\\.com|\\.to))/bbs/read\\.(?:pl|cgi)\\?(.+)>', $nama_url, $matches)) { $host = $matches[1]; list($bbs, $key, $ls) = self::parseMachiQuery($matches[2]); - } elseif (preg_match('<^http://((jbbs\\.(?:livedoor\\.(?:jp|com)|shitaraba\\.(?:net|com)))(?:/(\\w+))?)/bbs/read\\.(?:pl|cgi)\\?(.+)>', + } elseif (preg_match('<^https?://((jbbs\\.(?:livedoor\\.(?:jp|com)|shitaraba\\.(?:net|com)))(?:/(\\w+))?)/bbs/read\\.(?:pl|cgi)\\?(.+)>', $nama_url, $matches)) { $host = $matches[1]; list($bbs, $key, $ls) = self::parseMachiQuery($matches[4]); // vip2ch.com - http://ex14.vip2ch.com/test/read.cgi/news4ssnip/1450958506/ - } elseif (preg_match('<^https?://((\\w+)\\.vip2ch\\.com)/(?:test|i)/(?:read\\.(?:cgi|html|so)|mread\\.cgi|read)/(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) { + } elseif (preg_match('<^https?://((\\w+)\\.vip2ch\\.com)/(?:test|i)/(?:read\\.(?:cgi|html|so)|mread\\.cgi|read)/(\\w+)/(\\d+)(?:/([^/]*))?>x', $nama_url, $matches)) { $host = $matches[1]; $bbs = $matches[3]; $key = $matches[4]; $ls = (isset($matches[5]) && strlen($matches[5])) ? $matches[5] : ''; // vip2ch.com - http://ex14.vip2ch.com/i/responce.html?bbs=news4ssnip&dat=1450958506 - } elseif (preg_match('<^https?://((\\w+)\\.vip2ch\\.com)/i/(?:responce|responce_r18)\\.html\\?bbs=(\\w+)&dat=([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) { + } elseif (preg_match('<^https?://((\\w+)\\.vip2ch\\.com)/i/(?:responce|responce_r18)\\.html\\?bbs=(\\w+)&dat=(\\d+)(?:/([^/]*))?>x', $nama_url, $matches)) { $host = $matches[1]; $bbs = $matches[3]; $key = $matches[4]; $ls = (isset($matches[5]) && strlen($matches[5])) ? $matches[5] : ''; // itest - https://itest.5ch.net/hayabusa9/test/read.cgi/mnewsplus/1510531889 - } elseif (preg_match('<^https?://itest\\.(?:[25])ch\\.net/(\\w+)/test/read\\.cgi/(\\w+)/(\\d+)(?:/(.+$))?>x', $nama_url, $matches)) { - $host = $matches[1].'.5ch.net'; - $bbs = $matches[2]; - $key = $matches[3]; - $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; + } elseif (preg_match('<^https?://(itest\\.(?:[25]ch\\.net|bbspink\\.com))/(\\w+)/test/read\\.cgi/(\\w+)/(\\d+)(?:/(.+$))?>x', $nama_url, $matches)) { + $host = str_replace("itest", $matches[2], $matches[1]); + $bbs = $matches[3]; + $key = $matches[4]; + $ls = (isset($matches[5]) && strlen($matches[5])) ? $matches[5] : ''; // 2ch or pink - http://choco.2ch.net/test/read.cgi/event/1027770702/ } elseif (preg_match('<^https?://(.+)/test/read\\.(?:cgi|html|so|php) @@ -1562,20 +1562,20 @@ static public function detectThread($url = null) $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; } - // 2ch or pink by ula.cc(bintan / bekkanko) - http://choco.2ch.net/test/read.cgi/event/1027770702/ - } elseif (preg_match('<^https?://(?:(?:bintan|same)\\.ula\\.cc|ula\\.(?:(?:2ch|5ch)\\.net|bbspink\\.com))/test/(?:read\\.(?:cgi|html|so)|r\\.so) + // 2ch or pink by ula.cc(bintan / bekkanko) - http://bintan.ula.cc/test/read.cgi/lavender.2ch.net/chakumelo/1509563851/ + } elseif (preg_match('<^https?://(?:(?:bintan|same)\\.ula\\.cc|ula\\.(?:[25]ch\\.net|bbspink\\.com))/test/(?:read\\.(?:cgi|html|so)|r\\.so) /(.+)/(\\w+)/([0-9]+)(?:/([^/]*))>x', $nama_url, $matches)) { $host = $matches[1]; $bbs = $matches[2]; $key = $matches[3]; $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; - // 2ch or pink by ula.cc(new bintan) - http://choco.2ch.net/test/read.cgi/event/1027770702/ - } elseif (preg_match('<^https?://(ula\\.(?:(?:2ch|5ch)\\.net|bbspink\\.com))/(?:2ch|5ch) + // 2ch or pink by ula.cc(new bintan) - http://bintan.ula.cc/2ch/chakumelo/lavender.2ch.net/1509563851/ + } elseif (preg_match('<^https?://(?:(?:bintan|same)\\.ula\\.cc|ula\\.(?:[25]ch\\.net|bbspink\\.com))/[25]ch /(\\w+)/(.+)/(\\d+)(?:/([^/]*))>x', $nama_url, $matches)) { - $host = $matches[3]; - $bbs = $matches[2]; - $key = $matches[4]; + $host = $matches[2]; + $bbs = $matches[1]; + $key = $matches[3]; $ls = (isset($matches[5]) && strlen($matches[5])) ? $matches[5] : ''; // 2ch or pink 過去ログhtml - http://pc.2ch.net/mac/kako/1015/10153/1015358199.html From 213b6f8facc36d57f9a4b2c299cad72ba6f0a650 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Tue, 21 Nov 2017 23:14:04 +0900 Subject: [PATCH 302/339] =?UTF-8?q?=E6=B5=AA=E4=BA=BA=E3=81=AE=E6=9C=89?= =?UTF-8?q?=E5=8A=B9=E6=9C=9F=E9=99=90=E8=A1=A8=E7=A4=BA=E3=82=92=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=81=A7=E5=88=87=E3=82=8A=E6=9B=BF=E3=81=88=E3=82=89?= =?UTF-8?q?=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 縺サ縺シ繧縺」縺、縺代〒'繧ィ繝ゥ繝シス・譛滄剞蛻繧後ョ蝣エ蜷医ョ縺ソ陦ィ遉コ'縺ォ髢「縺励※縺ッ譛滄剞蛻繧後ョ繧「繧ォ繧ヲ繝ウ繝医′縺ェ縺縺ョ縺ァ 莠コ譟ア讖溯ス縺ィ縺縺縺薙→縺ォ縺励※縺上□縺輔>ス。 --- conf/conf.inc.php | 1 + conf/conf_user_def.inc.php | 9 +++++++++ lib/P2Util.php | 11 +++++++++++ rep2/edit_conf_user.php | 2 ++ 4 files changed, 23 insertions(+) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 78702187c..f24188162 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -80,6 +80,7 @@ function p2_init() $_conf['expack.tgrep_url'] = 'http://page2.xrea.jp/tgrep/search'; $_conf['test.dig2ch_url'] = 'https://dig.5ch.net/'; $_conf['expack.gate_php'] = '//open774.github.io/p2-php/gate.html'; + $_conf['title_php'] = 'title.php'; $_conf['menu_php'] = 'menu.php'; $_conf['subject_php'] = 'subject.php'; $_conf['read_php'] = 'read.php'; diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 754c08203..f954f0b12 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -596,6 +596,15 @@ $conf_user_def['2ch_ssl.post'] = 0; // (0) $conf_user_rad['2ch_ssl.post'] = array('1' => 'する', '0' => 'しない'); +// 浪人の有効期限表示 +$conf_user_def['disp_ronin_expiration'] = 0; // (0) +$conf_user_sel['disp_ronin_expiration'] = array( + '0' => 'する', + '1' => 'エラー・期限切れの場合のみ表示', + '2' => 'タイトル画面のみ表示', + '3' => 'しない' +); + // }}} // {{{ 拡張パックとiPhone diff --git a/lib/P2Util.php b/lib/P2Util.php index 6934b7fbf..407da87ac 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1849,6 +1849,10 @@ function checkRoninExpiration() { global $_conf; + if($_conf['disp_ronin_expiration'] === "3"){ + return true; + } + $url = 'https://auth.bbspink.com/auth/timecheck.php'; if($_conf['2chapi_use'] == 1) { @@ -1938,6 +1942,13 @@ function checkRoninExpiration() return true; } + if( + $_conf['disp_ronin_expiration'] === "1" + || ($_conf['disp_ronin_expiration'] === "2" && basename($_SERVER["SCRIPT_NAME"]) !== $_conf['title_php']) + ){ + return true; + } + self::pushInfoHtml("

    p2 info: 浪人<●>の有効期限は {$date} です。

    "); return true; } diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index 71de7bdce..32a4c0e76 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -449,6 +449,8 @@ array('ssl_capath', 'SSL通信で接続先を検証するための証明書があるディレクトリ ex)"/etc/ssl/certs"
    設定なして動く場合は設定不要'), array('2ch_ssl.subject', '2ch.netのsubjec.txtとSETTING.TXTの取得にSSLを使用する'), array('2ch_ssl.post', '2ch.netの書き込みにSSLを使用する'), + '浪人設定', + array('disp_ronin_expiration', '浪人の有効期限を表示設定'), ); printEditConfGroupHtml($groupname, $conflist, $flags); } From ffded0a89d0584556578add1d4ad499ee32812d7 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 22 Nov 2017 15:05:15 +0900 Subject: [PATCH 303/339] v171122.1500 --- conf/conf.inc.php | 2 +- doc/README-774.txt | 15 +++++++++++++++ rep2/edit_conf_user.php | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index f24188162..c6c03b1a8 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '171026.9001', // rep2のバージョン + 'p2version' => '171122.1500', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index e9adc5fb1..9701d0e2f 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -72,6 +72,21 @@ PHP7 ●ChangeLog + +* itest(https://itest.5ch.net/サーバー/test/read.cgi/板/スレ)のリンクを開く機能を追加 +* DAT破損防止のために旧仕様のitestをリンクしないように変更 +* 鏡の国のPHP 2chBBSスクリプト(http://script.s16.xrea.com/)を使用した外部板に対応 +* SPMを使用したNGあぼーん登録時に、板毎の登録が出来る機能を追加 +* ic2:ダウンローダーでfatal errorが出ないように修正 +* P2HttpExt.php以外の通信をすべてcURLに統一 +* 浪人がSSL必須になったので設定項目を除去 +* dig5chのJSONにformタグが混入する不具合に対応 +* 以下、killer4989 さんのパッチを取り込み +* dat取得不可だった場合のメッセージを表示するようにした +* ImageCache2 でのタイムアウト値を設定できるようにした +* 浪人の有効性を確認できるようにした +* 5ch での旧DAT提供終了メッセージをエラー扱いするようにした + 171018.1540 * bintan 読み込み対応 * 浪人ログイン用の2chv.tora3.netがSSL必須になったので対応 diff --git a/rep2/edit_conf_user.php b/rep2/edit_conf_user.php index 32a4c0e76..19a0a031e 100644 --- a/rep2/edit_conf_user.php +++ b/rep2/edit_conf_user.php @@ -450,7 +450,7 @@ array('2ch_ssl.subject', '2ch.netのsubjec.txtとSETTING.TXTの取得にSSLを使用する'), array('2ch_ssl.post', '2ch.netの書き込みにSSLを使用する'), '浪人設定', - array('disp_ronin_expiration', '浪人の有効期限を表示設定'), + array('disp_ronin_expiration', '浪人の有効期限を表示'), ); printEditConfGroupHtml($groupname, $conflist, $flags); } From e882171cda8010928b45af98e64bfe29ac7facb2 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 13 Dec 2017 19:35:39 +0900 Subject: [PATCH 304/339] fix composer.json --- composer.json | 2 +- conf/conf_admin.inc.php | 8 ++------ doc/README-774.txt | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 8310c27a3..4714155ec 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ }, { "type": "vcs", - "url": "https://github.com/2ch774/quickform" + "url": "https://github.com/open774/quickform" } ], "require": { diff --git a/conf/conf_admin.inc.php b/conf/conf_admin.inc.php index 633b761b7..d141a530d 100644 --- a/conf/conf_admin.inc.php +++ b/conf/conf_admin.inc.php @@ -71,15 +71,11 @@ // Cookie IDの有効期限日数 $_conf['cid_expire_day'] = 30; // (30) -// ネットワーク接続タイムアウト時間 (秒) -// @deprecated use $_conf['http_conn_timeout'] and $_conf['http_read_timeout'] -$_conf['fsockopen_time_limit'] = 7; // (7) - // HTTP接続タイムアウト時間 (秒) -$_conf['http_conn_timeout'] = 2; // (2) +$_conf['http_conn_timeout'] = 5; // (5) // HTTP読込タイムアウト時間 (秒) -$_conf['http_read_timeout'] = 8; // (8) +$_conf['http_read_timeout'] = 10; // (10) // p2の最新バージョンを自動チェック(する:1, しない:0) $_conf['updatan_haahaa'] = 1; // (1) diff --git a/doc/README-774.txt b/doc/README-774.txt index 9701d0e2f..bb5e6159d 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -72,7 +72,7 @@ PHP7 ●ChangeLog - +171122.1500 * itest(https://itest.5ch.net/サーバー/test/read.cgi/板/スレ)のリンクを開く機能を追加 * DAT破損防止のために旧仕様のitestをリンクしないように変更 * 鏡の国のPHP 2chBBSスクリプト(http://script.s16.xrea.com/)を使用した外部板に対応 From 0d73f326c53e96461d804cebd729e91b82518230 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Sat, 16 Dec 2017 09:36:55 +0900 Subject: [PATCH 305/339] =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=AE?= =?UTF-8?q?=E8=A1=A8=E7=A4=BA=E6=96=B9=E6=B3=95=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 4 ++-- rep2/post.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index b4c9fd3c1..e985205ed 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -322,7 +322,7 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { return '304 Not Modified'; } elseif ($code == '403') { $this->getdat_error_msg_ht .= "

    rep2 error: CloudFlareに接続を拒否されたため、スレッド取得に失敗しました。設定の変更を検討してください。

    "; - $this->getdat_error_msg_ht .= "

    ".$response->getBody ()."

    "; + $this->getdat_error_msg_ht .= "

    ".p2h($response->getBody ())."

    "; $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&relogin2chapi=true\">APIで再取得を試みる]"; $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&olddat=true\">旧datで再取得を試みる]"; $this->diedat = true; @@ -342,7 +342,7 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { } else { if($_conf['2chapi_debug_print']==1) { - P2Util::pushInfoHtml('

    p2 debug(ThreadRead::API):body='.$response->getBody ().'

    '); + P2Util::pushInfoHtml('

    p2 debug(ThreadRead::API):body='.p2h($response->getBody ()).'

    '); } return $this->_downloadDat2chNotFound ($code); diff --git a/rep2/post.php b/rep2/post.php index 0b0552d0e..f27c50afc 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -845,9 +845,9 @@ function showUnexpectedResponse($response, $line = null) echo 'p2 ERROR'; echo '

    p2 ERROR

    サーバからのレスポンスが変です。'; if (is_numeric($line)) { - echo "({$line})"; + echo "(行番号:{$line})"; } - echo '

    ';
    +    echo '

    レスポンス(報告の際はスレに書く):

    ';
         echo p2h($response);
         echo '
    '; } From 8599ddc1459c1ef74e2db4d82974fac8a8b17eac Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 20 Dec 2017 21:57:35 +0900 Subject: [PATCH 306/339] =?UTF-8?q?=E9=80=A3=E6=83=B3=E9=85=8D=E5=88=97?= =?UTF-8?q?=E3=81=A8shiftjis=E3=81=AB=E9=85=8D=E6=85=AE=E3=81=97=E3=81=9Fp?= =?UTF-8?q?2=5Fjson=5Fencode=E3=82=92=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/JStyle.php | 17 +---------------- lib/global.funcs.php | 20 ++++++++++++++++++++ lib/sb_header.inc.php | 2 +- rep2/info_js.php | 25 ++----------------------- 4 files changed, 24 insertions(+), 40 deletions(-) diff --git a/lib/JStyle.php b/lib/JStyle.php index 77515a2cb..6c43699a4 100644 --- a/lib/JStyle.php +++ b/lib/JStyle.php @@ -30,21 +30,6 @@ static public function singleton() return self::$_instance; } - // }}} - // {{{ encode() - - /** - * 値をShift_JIS→UTF-8返還してからJSONエンコードする - * - * @param mixed $value - * @return string - */ - static public function encode($value) - { - mb_convert_variables('UTF-8', 'SJIS-win', $value); - return json_encode($value); - } - // }}} // {{{ __construct() @@ -99,7 +84,7 @@ public function offsetGet($key) sscanf($this->_style[$key], '%u,%u', $width, $height); $this->_cache[$key] = sprintf('%u,%u', $width, $height); } else { - $this->_cache[$key] = self::encode($this->_style[$key]); + $this->_cache[$key] = p2_json_encode($this->_style[$key]); } } diff --git a/lib/global.funcs.php b/lib/global.funcs.php index 9179dd6f3..d745128e9 100644 --- a/lib/global.funcs.php +++ b/lib/global.funcs.php @@ -705,7 +705,27 @@ function p2_stream_eof($fp, &$timed_out = false) } // }}} +// {{{ p2_json_encode() +/** + * Shift_JISの値をUTF-8に変換してからJSONエンコードする + * + * @param mixed $values + * @return string JSON + */ +function p2_json_encode($values) +{ + // mb_convert_variablesは本来多次元配列での動作を保証していないので + // array_walk_recursiveで回す。 + // array_walk_recursiveも多次元配列対応してないはずだけどとりあえず動く。。。 + // https://bugs.php.net/bug.php?id=66964 + array_walk_recursive($values, function(&$value) { + mb_convert_variables('UTF-8', 'CP932', $value); + }); + return json_encode($values); +} + +// }}} /* * Local Variables: * mode: php diff --git a/lib/sb_header.inc.php b/lib/sb_header.inc.php index 61ba131f3..334eee3a9 100644 --- a/lib/sb_header.inc.php +++ b/lib/sb_header.inc.php @@ -65,7 +65,7 @@ } else { $ptitle_hd = p2h($aThreadList->ptitle); } -$ptitle_json = JStyle::encode($aThreadList->ptitle); +$ptitle_json = p2_json_encode($aThreadList->ptitle); if ($aThreadList->spmode == 'taborn') { $ptitle_ht = << Date: Sun, 18 Feb 2018 09:43:57 +0900 Subject: [PATCH 307/339] =?UTF-8?q?imgur=E3=82=A2=E3=83=83=E3=83=97?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=89=E6=A9=9F=E8=83=BD=E3=81=AE=E5=88=9D?= =?UTF-8?q?=E6=9C=9F=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/upload.php | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/rep2/upload.php b/rep2/upload.php index faeff497f..9833b0fdb 100644 --- a/rep2/upload.php +++ b/rep2/upload.php @@ -86,6 +86,58 @@ public function upload($localPath, $filename) } } +// }}} +// {{{ P2ImgurUploader + +class P2ImgurUploader implements P2UploaderInterface +{ + /** + * @var string + */ + private $client_id; + + /** + * @param string $authJsonFile + * @param string $clientIdentifier + * @param string $prefix + */ + public function __construct($client_id) + { + $this->client_id = $client_id; + } + + /** + * @param string $localPath + * @param string $filename + * + * @return string URL + */ + public function upload($localPath, $filename) + { + $data = fread(fopen($localPath, "rb"), filesize($localPath)); + $imgur_api = 'https://api.imgur.com/3/image.json'; + + $req = P2Commun::createHTTPRequest ($imgur_api,HTTP_Request2::METHOD_POST); + + // ヘッダ + $req->setHeader('Authorization', 'Client-ID ' . $this->client_id); + + // postする内容 + $req->addPostParameter('image', base64_encode($data)); + + $response = P2Commun::getHTTPResponse($req); + + if($response->getStatus() == 200) { + $result = json_decode($response->getBody()); + $image_url = $result->data->link; + $delete_url = 'https://imgur.com/delete/' .$result->data->deletehash; + return $image_url; + } + + return null; + } +} + // }}} // {{{ handle_uploaded_file() From 068413dd01f7ad48e3bc66dbdaccf750c86532d6 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Fri, 22 Dec 2017 19:18:19 +0900 Subject: [PATCH 308/339] =?UTF-8?q?=EF=BD=A2Something=20went=20wrong?= =?UTF-8?q?=EF=BD=A3=E3=81=AE=E3=82=A8=E3=83=A9=E3=83=BC=E5=87=A6=E7=90=86?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index e985205ed..9d6b1007c 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -233,6 +233,11 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { $this->modified = $response->getHeader ('Last-Modified'); + // DAT データが空の場合 + if(!$this->onbytes){ + return $this->_downloadDat2chNotFound ('404'); + } + // 行毎に分割 $lines = explode("\n", $body ,3); @@ -656,10 +661,14 @@ public function get2chDatError($code = null) { $res_code = $response->getStatus (); $test403 = "/403\.dat/"; + $testsw2 = "/Something went wrong/"; + if ($res_code == '200' || $res_code == '206') { // Partial Content $read_response_html = $response->getBody (); } elseif ($res_code == '302' || preg_match ($test403, $response->getBody (), $test403)) { $read_response_html = $response->getBody (); + } elseif ($res_code == '500' || preg_match ($testsw2, $response->getBody (), $testsw2)) { + $read_response_html = $response->getBody (); } else { $url_t = P2Util::throughIme ($read_url); $info_msg_ht = "

    Error: {$code}
    "; @@ -692,6 +701,8 @@ public function get2chDatError($code = null) { $error3939_match = "{2ちゃんねる error 3939}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) $error4002_match = "{2ちゃんねる error 4002}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) + $sw2_match = "/Something went wrong/"; + $vip2ch_ssr_match = "/隊長!新設されたSS速報R板にてスレを発見したですよ!/"; // @@ -713,6 +724,7 @@ public function get2chDatError($code = null) { preg_match ($naidesu_match, $read_response_html, $matches) || preg_match ($error3939_match, $read_response_html, $matches) || preg_match ($error4002_match, $read_response_html, $matches) || + preg_match ($sw2_match, $read_response_html, $matches) || preg_match ($vip2ch_kakosoko_match, $read_response_html, $matches) || preg_match ($vip2ch_ssr_match, $read_response_html, $matches) || preg_match ($soukoni_match, $read_response_html, $matches)) { @@ -734,6 +746,8 @@ public function get2chDatError($code = null) { $kakolog_url_en = rawurlencode ($kakolog_uri); $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; $dat_response_msg = "

    2ch info - 隊長! 過去ログ倉庫で、スレッド {$this->key}.html を発見しました。 [rep2に取り込んで読む]

    "; + } elseif (preg_match ($sw2_match, $read_response_html, $matches)) { + $dat_response_msg = "

    2ch info - datが空でした。[$read_response_html]

    "; } elseif (preg_match ($waithtml_match, $read_response_html, $matches)) { $dat_response_status = "隊長! スレッドはhtml化されるのを待っているようです。"; //$marutori_ht = $this->_generateMarutoriLink (); From 4ddf12bbdb7433726fd02f79f0a83f262d4e264f Mon Sep 17 00:00:00 2001 From: killer4989 Date: Fri, 22 Dec 2017 19:22:21 +0900 Subject: [PATCH 309/339] =?UTF-8?q?error=203001,=20error=203939=20?= =?UTF-8?q?=E3=81=AE=E3=82=A8=E3=83=A9=E3=83=BC=E5=87=A6=E7=90=86=E3=82=92?= =?UTF-8?q?=E4=B8=80=E5=BF=9C=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 9d6b1007c..47fb89ebd 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -698,6 +698,7 @@ public function get2chDatError($code = null) { // 0ちゃんねるスクリプトに反応するように $soukoni_match = "/隊長!過去ログ倉庫に<\/title>/"; + $error3001_match = "{<title>2ちゃんねる error 3001}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) $error3939_match = "{2ちゃんねる error 3939}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) $error4002_match = "{2ちゃんねる error 4002}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) @@ -722,6 +723,7 @@ public function get2chDatError($code = null) { // がそんな板orスレッドないです。or error 3939 } elseif ($reason === 'kakohtml' or preg_match ($naidesu_match, $read_response_html, $matches) || + preg_match ($error3001_match, $read_response_html, $matches) || preg_match ($error3939_match, $read_response_html, $matches) || preg_match ($error4002_match, $read_response_html, $matches) || preg_match ($sw2_match, $read_response_html, $matches) || @@ -738,6 +740,22 @@ public function get2chDatError($code = null) { $kakolog_url_en = rawurlencode ($kakolog_uri); $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; $dat_response_msg = "<p>2ch info - 隊長! 過去ログ倉庫で、<a href=\"{$kakolog_uri}.html\"{$_conf['bbs_win_target_at']}>スレッド {$matches[3]}.html</a> を発見しました。 [<a href=\"{$read_kako_url}\">rep2に取り込んで読む</a>]</p>"; + } elseif (preg_match ($error3001_match, $read_response_html, $matches)) { + $dat_response_status = "隊長! 過去ログ倉庫で、html化されたスレッドを発見しました。"; + $key4 = substr($this->key, 0, 4); + $key5 = substr($this->key, 0, 5); + $kakolog_uri = "http://{$this->host}/{$this->bbs}/kako/{$key4}/{$key5}/{$this->key}"; + $kakolog_url_en = rawurlencode ($kakolog_uri); + $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; + $dat_response_msg = "<p>2ch info - 隊長! 過去ログ倉庫で、<a href=\"{$kakolog_uri}.html\"{$_conf['bbs_win_target_at']}>スレッド {$this->key}.html</a> を発見しました。 [<a href=\"{$read_kako_url}\">rep2に取り込んで読む</a>]</p>"; + } elseif (preg_match ($error3939_match, $read_response_html, $matches)) { + $dat_response_status = "隊長! 過去ログ倉庫で、html化されたスレッドを発見しました。"; + $key4 = substr($this->key, 0, 4); + $key5 = substr($this->key, 0, 5); + $kakolog_uri = "http://{$this->host}/{$this->bbs}/kako/{$key4}/{$key5}/{$this->key}"; + $kakolog_url_en = rawurlencode ($kakolog_uri); + $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; + $dat_response_msg = "<p>2ch info - 隊長! 過去ログ倉庫で、<a href=\"{$kakolog_uri}.html\"{$_conf['bbs_win_target_at']}>スレッド {$this->key}.html</a> を発見しました。 [<a href=\"{$read_kako_url}\">rep2に取り込んで読む</a>]</p>"; } elseif (preg_match ($error4002_match, $read_response_html, $matches)) { $dat_response_status = "隊長! 過去ログ倉庫で、html化されたスレッドを発見しました。"; $key4 = substr($this->key, 0, 4); From 6e61fad0c959e146ca4236798f539be1f8dd4edd Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Mon, 25 Dec 2017 02:35:05 +0900 Subject: [PATCH 310/339] =?UTF-8?q?2ch.net=20=E3=81=A7=E3=82=82=E9=81=8E?= =?UTF-8?q?=E5=8E=BB=E3=83=AD=E3=82=B0=E5=80=89=E5=BA=AB=E3=82=92=E8=A6=8B?= =?UTF-8?q?=E3=81=AB=E8=A1=8C=E3=81=91=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 76 +++++++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 31 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 47fb89ebd..6a963117a 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -650,37 +650,7 @@ public function get2chDatError($code = null) { $read_response_html = ''; if (! $reason) { - try { - $req = P2Commun::createHTTPRequest ($read_url.'1', HTTP_Request2::METHOD_GET); - // ヘッダ - $req->setHeader ('User-Agent', P2Commun::getP2UA(false,P2HostMgr::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG - - // Requestの送信 - $response = P2Commun::getHTTPResponse($req); - - $res_code = $response->getStatus (); - - $test403 = "/403\.dat/"; - $testsw2 = "/Something went wrong/"; - - if ($res_code == '200' || $res_code == '206') { // Partial Content - $read_response_html = $response->getBody (); - } elseif ($res_code == '302' || preg_match ($test403, $response->getBody (), $test403)) { - $read_response_html = $response->getBody (); - } elseif ($res_code == '500' || preg_match ($testsw2, $response->getBody (), $testsw2)) { - $read_response_html = $response->getBody (); - } else { - $url_t = P2Util::throughIme ($read_url); - $info_msg_ht = "<p class=\"info-msg\">Error: {$code}<br>"; - $info_msg_ht .= "rep2 info: <a href=\"{$url_t}\"{$_conf['ext_win_target_at']}>{$read_url}</a> のHTMLを取得出来ませんでした。</p>"; - P2Util::pushInfoHtml ($info_msg_ht); - } - } catch (Exception $e) { - $this->getdat_error_msg_ht .= "<p>サーバ接続エラー: " . $e->getMessage (); - $this->getdat_error_msg_ht .= "<br>rep2 error: 板サーバへの接続に失敗しました。</p>"; - $this->diedat = true; - } - unset ($req, $response); + $read_response_html = self::getReadCGIHtml($read_url); } // }}} @@ -873,6 +843,50 @@ public function previewOne() { return $body; } + // }}} + // {{{ getReadCGIResponse() + /** + * read.cgi のレスポンスを取得 + */ + public function getReadCGIHtml($read_url) { + global $_conf; + + $test403 = "/403\.dat/"; + $testsw2 = "/Something went wrong/"; + + try { + $req = P2Commun::createHTTPRequest ($read_url.'1', HTTP_Request2::METHOD_GET); + // ヘッダ + $req->setHeader ('User-Agent', P2Commun::getP2UA(false,P2HostMgr::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG + + // Requestの送信 + $response = P2Commun::getHTTPResponse($req); + + $res_code = $response->getStatus (); + + if ($res_code == '200' || $res_code == '206') { // Partial Content + $read_response_html = $response->getBody (); + } elseif ($res_code == '301' && P2HostMgr::isHost2ch ($this->host)) { + $read_response_html = self::getReadCGIHtml($response->getHeader ("Location")); + } elseif ($res_code == '302' || preg_match ($test403, $response->getBody (), $test403)) { + $read_response_html = $response->getBody (); + } elseif ($res_code == '500' || preg_match ($testsw2, $response->getBody (), $testsw2)) { + $read_response_html = $response->getBody (); + } else { + $url_t = P2Util::throughIme ($read_url); + $info_msg_ht = "<p class=\"info-msg\">Error: {$code}<br>"; + $info_msg_ht .= "rep2 info: <a href=\"{$url_t}\"{$_conf['ext_win_target_at']}>{$read_url}</a> のHTMLを取得出来ませんでした。</p>"; + P2Util::pushInfoHtml ($info_msg_ht); + } + } catch (Exception $e) { + $this->getdat_error_msg_ht .= "<p>サーバ接続エラー: " . $e->getMessage (); + $this->getdat_error_msg_ht .= "<br>rep2 error: 板サーバへの接続に失敗しました。</p>"; + $this->diedat = true; + } + unset ($req, $response); + + return $read_response_html; + } // }}} // {{{ previewOneNotFound() From cbad845612599ccef522c13d4499f3813341a20d Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Sun, 18 Feb 2018 09:49:41 +0900 Subject: [PATCH 311/339] =?UTF-8?q?2ch=E3=81=AEAPI=E3=81=8C=E9=96=89?= =?UTF-8?q?=E9=8E=96=E3=81=95=E3=82=8C=E3=81=9F=E3=81=AE=E3=81=A7=E6=8E=A5?= =?UTF-8?q?=E7=B6=9A=E5=85=88=E3=82=925ch=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 6a963117a..95ba4e213 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -141,7 +141,7 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { $url= http_build_url(array( "scheme" => $_conf['2chapi_ssl.read']?"https":"http", - "host" => P2HostMgr::isHost5ch($this->host)?"api.5ch.net":"api.2ch.net", + "host" => "api.5ch.net", "path" => "v1/".$serverName[0] . '/' . $this->bbs . '/' . $this->key)); $message = '/v1/' . $serverName[0] . '/' . $this->bbs . '/' . $this->key . $SID2ch . $AppKey; From 45a2f413660a89a4f204a79480f4448241bfe1cd Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Sun, 18 Feb 2018 09:54:55 +0900 Subject: [PATCH 312/339] =?UTF-8?q?=E3=81=97=E3=81=9F=E3=82=89=E3=81=B0?= =?UTF-8?q?=E3=81=AESSL=E5=8C=96=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/read_shitaraba.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/read_shitaraba.inc.php b/lib/read_shitaraba.inc.php index b8d54a8e3..2630ce267 100644 --- a/lib/read_shitaraba.inc.php +++ b/lib/read_shitaraba.inc.php @@ -40,7 +40,7 @@ function shitarabaDownload(ThreadRead $aThread) // したらばのlivedoor移転に対応。読込先をlivedoorとする。 $host = P2HostMgr::adjustHostJbbs($aThread->host); list($host, $category, ) = explode('/', $host); - $machiurl = "http://{$host}/bbs/rawmode.cgi/{$category}/{$aThread->bbs}/{$aThread->key}/{$START}-"; + $machiurl = "https://{$host}/bbs/rawmode.cgi/{$category}/{$aThread->bbs}/{$aThread->key}/{$START}-"; } $tempfile = $aThread->keydat.'.dat.temp'; From d4826ba499dbb5525ea54a1d414f99fd0becde2b Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Sun, 18 Feb 2018 10:09:40 +0900 Subject: [PATCH 313/339] =?UTF-8?q?=E3=81=97=E3=81=9F=E3=82=89=E3=81=B0?= =?UTF-8?q?=E3=81=AESSL=E5=8C=96=E3=81=AB=E5=AF=BE=E5=BF=9C=E3=82=92?= =?UTF-8?q?=E7=84=A1=E3=81=8B=E3=81=A3=E3=81=9F=E3=81=93=E3=81=A8=E3=81=AB?= =?UTF-8?q?=E3=81=97=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/read_shitaraba.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/read_shitaraba.inc.php b/lib/read_shitaraba.inc.php index 2630ce267..b8d54a8e3 100644 --- a/lib/read_shitaraba.inc.php +++ b/lib/read_shitaraba.inc.php @@ -40,7 +40,7 @@ function shitarabaDownload(ThreadRead $aThread) // したらばのlivedoor移転に対応。読込先をlivedoorとする。 $host = P2HostMgr::adjustHostJbbs($aThread->host); list($host, $category, ) = explode('/', $host); - $machiurl = "https://{$host}/bbs/rawmode.cgi/{$category}/{$aThread->bbs}/{$aThread->key}/{$START}-"; + $machiurl = "http://{$host}/bbs/rawmode.cgi/{$category}/{$aThread->bbs}/{$aThread->key}/{$START}-"; } $tempfile = $aThread->keydat.'.dat.temp'; From 00e9656dcb3387944e3a70688b62a34ef2176b51 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Sun, 18 Feb 2018 22:52:23 +0900 Subject: [PATCH 314/339] =?UTF-8?q?API=E3=81=AE=E3=83=AC=E3=82=B9=E3=83=9D?= =?UTF-8?q?=E3=83=B3=E3=82=B9=E3=83=98=E3=83=83=E3=83=80=E3=83=BC=E3=81=AB?= =?UTF-8?q?Content-Length=E3=81=8C=E4=BB=98=E3=81=8B=E3=81=AA=E3=81=84?= =?UTF-8?q?=E4=BA=8B=E3=81=8C=E3=81=82=E3=82=8B=E3=81=AE=E3=81=A7body?= =?UTF-8?q?=E3=81=AE=E3=82=B5=E3=82=A4=E3=82=BA=E3=81=A7=E4=BB=A3=E7=94=A8?= =?UTF-8?q?=E3=81=99=E3=82=8B=E6=A9=9F=E8=83=BD=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 95ba4e213..fa68c5d10 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -225,6 +225,10 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { $this->onbytes = strlen ($body); } elseif ($zero_read) { $this->onbytes = intval ($response->getHeader ('Content-Length')); + if(!$this->onbytes) { + // APIのレスポンスヘッダーにContent-Lengthが付かない事があるのでbodyのサイズで代用 + $this->onbytes = strlen ($body); + } } else { if (preg_match ('@^bytes ([^/]+)/([0-9]+)@i', $response->getHeader ('Content-Range'), $matches)) { $this->onbytes = intval ($matches[2]); From 83311961a7e8eafec6d830183587001600f84255 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Tue, 20 Feb 2018 10:09:52 +0900 Subject: [PATCH 315/339] =?UTF-8?q?p2=5Fjson=5Fencode=E3=81=A7Warning?= =?UTF-8?q?=E3=81=8C=E5=87=BA=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/global.funcs.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/global.funcs.php b/lib/global.funcs.php index d745128e9..7940b0fa4 100644 --- a/lib/global.funcs.php +++ b/lib/global.funcs.php @@ -719,9 +719,14 @@ function p2_json_encode($values) // array_walk_recursiveで回す。 // array_walk_recursiveも多次元配列対応してないはずだけどとりあえず動く。。。 // https://bugs.php.net/bug.php?id=66964 - array_walk_recursive($values, function(&$value) { - mb_convert_variables('UTF-8', 'CP932', $value); - }); + if(is_array($values)){ + array_walk_recursive($values, function(&$value) { + mb_convert_variables('UTF-8', 'CP932', $value); + }); + } else { + mb_convert_variables('UTF-8', 'CP932', $values); + } + return json_encode($values); } From 370316c5e774db99295dbcfecd2f8398204e4254 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Fri, 23 Feb 2018 10:11:13 +0900 Subject: [PATCH 316/339] =?UTF-8?q?SyntaxError:=20JSON=20Parse=20error:=20?= =?UTF-8?q?Unexoectdd=20EOF=20=E7=97=85=E3=81=8C=E5=86=8D=E7=99=BA?= =?UTF-8?q?=E3=81=97=E3=81=9F=E3=81=AE=E3=81=A7=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/global.funcs.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/global.funcs.php b/lib/global.funcs.php index 7940b0fa4..54dbc0eb5 100644 --- a/lib/global.funcs.php +++ b/lib/global.funcs.php @@ -719,7 +719,7 @@ function p2_json_encode($values) // array_walk_recursiveで回す。 // array_walk_recursiveも多次元配列対応してないはずだけどとりあえず動く。。。 // https://bugs.php.net/bug.php?id=66964 - if(is_array($values)){ + if(is_array($values) || is_object($values)){ array_walk_recursive($values, function(&$value) { mb_convert_variables('UTF-8', 'CP932', $value); }); From d9fe8630e65117fc0b9338a82b5b444a3f095fa3 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 28 Mar 2018 10:31:25 +0900 Subject: [PATCH 317/339] =?UTF-8?q?IE11=E3=81=A7IE6=E5=90=91=E3=81=91?= =?UTF-8?q?=E3=81=AE=E3=82=B3=E3=83=BC=E3=83=89=E3=81=8C=E5=AE=9F=E8=A1=8C?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=A6=E4=B8=8B=E6=9B=B8=E3=81=8D=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E3=81=8C=E6=A9=9F=E8=83=BD=E3=81=97=E3=81=AA=E3=81=84?= =?UTF-8?q?=E4=B8=8D=E5=85=B7=E5=90=88=E3=82=92=E4=BF=AE=E6=AD=A3=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=81=9F=E3=82=81=E3=81=AB=E3=80=81XMLHttpRequest?= =?UTF-8?q?=E3=81=8C=E5=AE=9F=E8=A3=85=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84?= =?UTF-8?q?=E3=81=AA=E3=81=84=E3=83=96=E3=83=A9=E3=82=A6=E3=82=B6(IE6?= =?UTF-8?q?=E7=AD=89)=E3=81=AB=E5=AF=BE=E3=81=99=E3=82=8B=E9=85=8D?= =?UTF-8?q?=E6=85=AE=E3=82=92=E7=B5=82=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/js/basic.js | 19 ------------------- rep2/js/delelog.js | 2 +- rep2/js/dpreview.js | 4 ++-- rep2/js/fitimage.js | 2 +- rep2/js/ic2_getcount.js | 2 +- rep2/js/ic2_getinfo.js | 2 +- rep2/js/ic2_switch.js | 2 +- rep2/js/invite.js | 2 +- rep2/js/iv2.js | 2 +- rep2/js/lightbox/lightbox_ic2ext.js | 2 +- rep2/js/menu.js | 4 ++-- rep2/js/post_draft.js | 2 +- rep2/js/setfavjs.js | 2 +- rep2/js/settabornjs.js | 2 +- rep2/js/smartpopup.js | 2 +- rep2/js/tgrepctl.js | 2 +- 16 files changed, 17 insertions(+), 36 deletions(-) diff --git a/rep2/js/basic.js b/rep2/js/basic.js index 214b9fdae..5e877b63d 100644 --- a/rep2/js/basic.js +++ b/rep2/js/basic.js @@ -34,25 +34,6 @@ var setWinTitle = rep2.util.setWindowTitle; // DOMオブジェクトを取得 var p2GetElementById = document.getElementById; -// XMLHttpRequest オブジェクトを取得 -function getXmlHttp() -{ - var objHTTP = null ; - try { - objHTTP = new ActiveXObject("Msxml2.XMLHTTP") ; // Mozilla用 - } catch (e) { - try { - objHTTP = new ActiveXObject("Microsoft.XMLHTTP") ; // IE用 - } catch (oc) { - objHTTP = null ; - } - } - if (!objHTTP && typeof XMLHttpRequest != "undefined") { - objHTTP = new XMLHttpRequest(); // 他 - } - return objHTTP -} - /** * objHTTP とurlを渡して、結果テキストを取得する * diff --git a/rep2/js/delelog.js b/rep2/js/delelog.js index 019835f49..548246340 100644 --- a/rep2/js/delelog.js +++ b/rep2/js/delelog.js @@ -9,7 +9,7 @@ function deleLog(tquery, info_pop_width, info_pop_height, page, obj) return false; } - var objHTTP = getXmlHttp(); + var objHTTP = new XMLHttpRequest(); if (!objHTTP) { // alert("Error: XMLHTTP 通信オブジェクトの作成に失敗しました。") ; diff --git a/rep2/js/dpreview.js b/rep2/js/dpreview.js index 559e621d9..723ddac10 100644 --- a/rep2/js/dpreview.js +++ b/rep2/js/dpreview.js @@ -217,7 +217,7 @@ function DPSetTrip(tk) if (!dpreview_on) { return; } - var objHTTP = getXmlHttp(); + var objHTTP = new XMLHttpRequest(); if (!objHTTP) { DPReplaceInnerText('dp_trip', '◆XMLHTTP Disabled.'); return; @@ -236,7 +236,7 @@ function DPSetTrip(tk) // XMLHttpRequestを用いてトリップを取得する function DPGetTrip(tk) { - var objHTTP = getXmlHttp(); + var objHTTP = new XMLHttpRequest(); if (!objHTTP) { return '◆XMLHTTP Disabled.'; } diff --git a/rep2/js/fitimage.js b/rep2/js/fitimage.js index fa2da02e2..ef00fdb48 100644 --- a/rep2/js/fitimage.js +++ b/rep2/js/fitimage.js @@ -189,7 +189,7 @@ function fiUpdateRank(rank) return false; } - var objHTTP = getXmlHttp(); + var objHTTP = new XMLHttpRequest(); if (!objHTTP) { alert('Error: XMLHTTP 通信オブジェクトの作成に失敗しました。') ; return false; diff --git a/rep2/js/ic2_getcount.js b/rep2/js/ic2_getcount.js index 82b606890..ab8e642da 100644 --- a/rep2/js/ic2_getcount.js +++ b/rep2/js/ic2_getcount.js @@ -11,7 +11,7 @@ function ic2_setcount(key, elem) var ic2_getcount = function (key) { var url, req, res, err; - req = getXmlHttp(); + req = new XMLHttpRequest(); if (!req) { return null; } diff --git a/rep2/js/ic2_getinfo.js b/rep2/js/ic2_getinfo.js index 58e704eaf..a1bef2527 100644 --- a/rep2/js/ic2_getinfo.js +++ b/rep2/js/ic2_getinfo.js @@ -16,7 +16,7 @@ function ic2_getinfo(type, value, thumb) { var url, req, res, err; - req = getXmlHttp(); + req = new XMLHttpRequest(); if (!req) { return null; } diff --git a/rep2/js/ic2_switch.js b/rep2/js/ic2_switch.js index b68330303..c4ead11ba 100644 --- a/rep2/js/ic2_switch.js +++ b/rep2/js/ic2_switch.js @@ -13,7 +13,7 @@ */ function ic2_switch(onoff, mobile) { - var objHTTP = getXmlHttp(); + var objHTTP = new XMLHttpRequest(); if (!objHTTP) { alert('Error: XMLHTTP 通信オブジェクトの作成に失敗しました。'); } diff --git a/rep2/js/invite.js b/rep2/js/invite.js index 1f032c9fe..91ada6625 100644 --- a/rep2/js/invite.js +++ b/rep2/js/invite.js @@ -16,7 +16,7 @@ function Invite(title, url, host, bbs, key, resnum) winHeight = 280; taRows = 15; var uri = 'read_async.php?host='+host+'&bbs='+bbs+'&key='+key+'&ls='+resnum+'n&q=2&offline=1'; - var req = getXmlHttp(); + var req = new XMLHttpRequest(); req.open('get', uri, false); req.withCredentials = true; req.send(null); diff --git a/rep2/js/iv2.js b/rep2/js/iv2.js index c7ec1ed11..ce9f9c949 100644 --- a/rep2/js/iv2.js +++ b/rep2/js/iv2.js @@ -163,7 +163,7 @@ function getRank(itemId) function setRank(itemId, rank) { - var objHTTP = getXmlHttp(); + var objHTTP = new XMLHttpRequest(); if (!objHTTP) { alert("Error: XMLHTTP 通信オブジェクトの作成に失敗しました。") ; } diff --git a/rep2/js/lightbox/lightbox_ic2ext.js b/rep2/js/lightbox/lightbox_ic2ext.js index d4d7f9348..ae87a44f9 100644 --- a/rep2/js/lightbox/lightbox_ic2ext.js +++ b/rep2/js/lightbox/lightbox_ic2ext.js @@ -126,7 +126,7 @@ LightBox.prototype._ic2_set_rank = function (rank) { return; } - var objHTTP = getXmlHttp(); + var objHTTP = new XMLHttpRequest(); if (!objHTTP) { alert("Error: XMLHTTP 通信オブジェクトの作成に失敗しました。") ; } diff --git a/rep2/js/menu.js b/rep2/js/menu.js index efd1969b0..a5bdc49d9 100644 --- a/rep2/js/menu.js +++ b/rep2/js/menu.js @@ -42,7 +42,7 @@ function replaceMenuItem(itemId, qKey, qValue) { var uri = 'menu_async.php?' + qKey + '=' + qValue; - var req = getXmlHttp(); + var req = new XMLHttpRequest(); if (!req) { alert('XMLHttp not available.'); return; @@ -87,7 +87,7 @@ function openFavList(subject_php, set_num, tgt) function changeSkin(skinName) { var uri = 'menu_async.php?m_skin_set=' + skinName; - var req = getXmlHttp(); + var req = new XMLHttpRequest(); var res; if (!req) { diff --git a/rep2/js/post_draft.js b/rep2/js/post_draft.js index a0692a7ac..018ef083d 100644 --- a/rep2/js/post_draft.js +++ b/rep2/js/post_draft.js @@ -33,7 +33,7 @@ var saveDraftForm = function(form) { }; var post_draft = function(host, bbs, key, csrfid, data, fin, err) { - var req = (typeof getXmlHttp === 'undefined') ? new XMLHttpRequest() : getXmlHttp(); + var req = new XMLHttpRequest(); if (!req) return; req.open('POST', 'post_draft.php', true); diff --git a/rep2/js/setfavjs.js b/rep2/js/setfavjs.js index d53c518ef..cc8b59feb 100644 --- a/rep2/js/setfavjs.js +++ b/rep2/js/setfavjs.js @@ -15,7 +15,7 @@ function setFavJs(tquery, favdo, info_pop_width, info_pop_height, page, obj) setnum = '-1'; } - var objHTTP = getXmlHttp(); + var objHTTP = new XMLHttpRequest(); if (!objHTTP) { // alert("Error: XMLHTTP 通信オブジェクトの作成に失敗しました。") ; // XMLHTTP(とinnerHTML) に未対応なら小窓で diff --git a/rep2/js/settabornjs.js b/rep2/js/settabornjs.js index 60d877338..7944cad14 100644 --- a/rep2/js/settabornjs.js +++ b/rep2/js/settabornjs.js @@ -9,7 +9,7 @@ function setTAbornJs(tquery, tabdo, info_pop_width, info_pop_height, page, obj) return false; } - var objHTTP = getXmlHttp(); + var objHTTP = new XMLHttpRequest(); if (!objHTTP) { // alert("Error: XMLHTTP 通信オブジェクトの作成に失敗しました。") ; // XMLHTTP(とinnerHTML) に未対応なら小窓で diff --git a/rep2/js/smartpopup.js b/rep2/js/smartpopup.js index b8df91465..3e96f0c59 100644 --- a/rep2/js/smartpopup.js +++ b/rep2/js/smartpopup.js @@ -451,7 +451,7 @@ SPM.httpcmd = function (cmd, aThread, callback) { var num = spmResNum; var url = 'httpcmd.php?host=' + aThread.host + '&bbs=' + aThread.bbs + '&key=' + aThread.key + '&cmd=' + cmd + '&' + cmd + '=' + num; - var result = getResponseTextHttp(getXmlHttp(), url, true); + var result = getResponseTextHttp(new XMLHttpRequest(), url, true); if (typeof callback === 'function') { callback(result, cmd, aThread, num, url); } diff --git a/rep2/js/tgrepctl.js b/rep2/js/tgrepctl.js index 15e724378..93bef20fd 100644 --- a/rep2/js/tgrepctl.js +++ b/rep2/js/tgrepctl.js @@ -13,7 +13,7 @@ var tGrep = {}; * XmlHttpRequestを実行 */ tGrep.execRequest = function (uri, menuId) { - var req = getXmlHttp(); + var req = new XMLHttpRequest(); if (!req) { alert('XMLHttp not available.'); return false; From ab8ac9460d6940f7c17f508d94d606dd69e58439 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 28 Mar 2018 10:42:23 +0900 Subject: [PATCH 318/339] =?UTF-8?q?=E6=9C=AA=E4=BD=BF=E7=94=A8=E3=81=AEjqu?= =?UTF-8?q?ery-1.8.3.min.js=E3=82=92=E5=89=8A=E9=99=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/js/jquery-1.8.3.min.js | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 rep2/js/jquery-1.8.3.min.js diff --git a/rep2/js/jquery-1.8.3.min.js b/rep2/js/jquery-1.8.3.min.js deleted file mode 100644 index 83589daa7..000000000 --- a/rep2/js/jquery-1.8.3.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v1.8.3 jquery.com | jquery.org/license */ -(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u<a;u++)r=o[u],s=/^\+/.test(r),s&&(r=r.substr(1)||"*"),i=e[r]=e[r]||[],i[s?"unshift":"push"](n)}}function kn(e,n,r,i,s,o){s=s||n.dataTypes[0],o=o||{},o[s]=!0;var u,a=e[s],f=0,l=a?a.length:0,c=e===Sn;for(;f<l&&(c||!u);f++)u=a[f](n,r,i),typeof u=="string"&&(!c||o[u]?u=t:(n.dataTypes.unshift(u),u=kn(e,n,r,i,u,o)));return(c||!u)&&!o["*"]&&(u=kn(e,n,r,i,"*",o)),u}function Ln(e,n){var r,i,s=v.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((s[r]?e:i||(i={}))[r]=n[r]);i&&v.extend(!0,e,i)}function An(e,n,r){var i,s,o,u,a=e.contents,f=e.dataTypes,l=e.responseFields;for(s in l)s in r&&(n[l[s]]=r[s]);while(f[0]==="*")f.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("content-type"));if(i)for(s in a)if(a[s]&&a[s].test(i)){f.unshift(s);break}if(f[0]in r)o=f[0];else{for(s in r){if(!f[0]||e.converters[s+" "+f[0]]){o=s;break}u||(u=s)}o=o||u}if(o)return o!==f[0]&&f.unshift(o),r[o]}function On(e,t){var n,r,i,s,o=e.dataTypes.slice(),u=o[0],a={},f=0;e.dataFilter&&(t=e.dataFilter(t,e.dataType));if(o[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=o[++f];)if(i!=="*"){if(u!=="*"&&u!==i){n=a[u+" "+i]||a["* "+i];if(!n)for(r in a){s=r.split(" ");if(s[1]===i){n=a[u+" "+s[0]]||a["* "+s[0]];if(n){n===!0?n=a[r]:a[r]!==!0&&(i=s[0],o.splice(f--,0,i));break}}}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(l){return{state:"parsererror",error:n?l:"No conversion from "+u+" to "+i}}}u=i}return{state:"success",data:t}}function Fn(){try{return new e.XMLHttpRequest}catch(t){}}function In(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function $n(){return setTimeout(function(){qn=t},0),qn=v.now()}function Jn(e,t){v.each(t,function(t,n){var r=(Vn[t]||[]).concat(Vn["*"]),i=0,s=r.length;for(;i<s;i++)if(r[i].call(e,t,n))return})}function Kn(e,t,n){var r,i=0,s=0,o=Xn.length,u=v.Deferred().always(function(){delete a.elem}),a=function(){var t=qn||$n(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,i=1-r,s=0,o=f.tweens.length;for(;s<o;s++)f.tweens[s].run(i);return u.notifyWith(e,[f,i,n]),i<1&&o?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:v.extend({},t),opts:v.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:qn||$n(),duration:n.duration,tweens:[],createTween:function(t,n,r){var i=v.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(i),i},stop:function(t){var n=0,r=t?f.tweens.length:0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;Qn(l,f.opts.specialEasing);for(;i<o;i++){r=Xn[i].call(f,e,l,f.opts);if(r)return r}return Jn(f,l),v.isFunction(f.opts.start)&&f.opts.start.call(e,f),v.fx.timer(v.extend(a,{anim:f,queue:f.opts.queue,elem:e})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function Qn(e,t){var n,r,i,s,o;for(n in e){r=v.camelCase(n),i=t[r],s=e[n],v.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=v.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function Gn(e,t,n){var r,i,s,o,u,a,f,l,c,h=this,p=e.style,d={},m=[],g=e.nodeType&&Gt(e);n.queue||(l=v._queueHooks(e,"fx"),l.unqueued==null&&(l.unqueued=0,c=l.empty.fire,l.empty.fire=function(){l.unqueued||c()}),l.unqueued++,h.always(function(){h.always(function(){l.unqueued--,v.queue(e,"fx").length||l.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],v.css(e,"display")==="inline"&&v.css(e,"float")==="none"&&(!v.support.inlineBlockNeedsLayout||nn(e.nodeName)==="inline"?p.display="inline-block":p.zoom=1)),n.overflow&&(p.overflow="hidden",v.support.shrinkWrapBlocks||h.done(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t){s=t[r];if(Un.exec(s)){delete t[r],a=a||s==="toggle";if(s===(g?"hide":"show"))continue;m.push(r)}}o=m.length;if(o){u=v._data(e,"fxshow")||v._data(e,"fxshow",{}),"hidden"in u&&(g=u.hidden),a&&(u.hidden=!g),g?v(e).show():h.done(function(){v(e).hide()}),h.done(function(){var t;v.removeData(e,"fxshow",!0);for(t in d)v.style(e,t,d[t])});for(r=0;r<o;r++)i=m[r],f=h.createTween(i,g?u[i]:0),d[i]=u[i]||v.style(e,i),i in u||(u[i]=f.start,g&&(f.end=f.start,f.start=i==="width"||i==="height"?1:0))}}function Yn(e,t,n,r,i){return new Yn.prototype.init(e,t,n,r,i)}function Zn(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=$t[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function tr(e){return v.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n,r,i=e.document,s=e.location,o=e.navigator,u=e.jQuery,a=e.$,f=Array.prototype.push,l=Array.prototype.slice,c=Array.prototype.indexOf,h=Object.prototype.toString,p=Object.prototype.hasOwnProperty,d=String.prototype.trim,v=function(e,t){return new v.fn.init(e,t,n)},m=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,g=/\S/,y=/\s+/,b=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,w=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a<f;a++)if((e=arguments[a])!=null)for(n in e){r=u[n],i=e[n];if(u===i)continue;l&&i&&(v.isPlainObject(i)||(s=v.isArray(i)))?(s?(s=!1,o=r&&v.isArray(r)?r:[]):o=r&&v.isPlainObject(r)?r:{},u[n]=v.extend(l,o,i)):i!==t&&(u[n]=i)}return u},v.extend({noConflict:function(t){return e.$===v&&(e.$=a),t&&e.jQuery===v&&(e.jQuery=u),v},isReady:!1,readyWait:1,holdReady:function(e){e?v.readyWait++:v.ready(!0)},ready:function(e){if(e===!0?--v.readyWait:v.isReady)return;if(!i.body)return setTimeout(v.ready,1);v.isReady=!0;if(e!==!0&&--v.readyWait>0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s<o;)if(n.apply(e[s++],r)===!1)break}else if(u){for(i in e)if(n.call(e[i],i,e[i])===!1)break}else for(;s<o;)if(n.call(e[s],s,e[s++])===!1)break;return e},trim:d&&!d.call("\ufeff\u00a0")?function(e){return e==null?"":d.call(e)}:function(e){return e==null?"":(e+"").replace(b,"")},makeArray:function(e,t){var n,r=t||[];return e!=null&&(n=v.type(e),e.length==null||n==="string"||n==="function"||n==="regexp"||v.isWindow(e)?f.call(r,e):v.merge(r,e)),r},inArray:function(e,t,n){var r;if(t){if(c)return c.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,s=0;if(typeof r=="number")for(;s<r;s++)e[i++]=n[s];else while(n[s]!==t)e[i++]=n[s++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length;n=!!n;for(;s<o;s++)r=!!t(e[s],s),n!==r&&i.push(e[s]);return i},map:function(e,n,r){var i,s,o=[],u=0,a=e.length,f=e instanceof v||a!==t&&typeof a=="number"&&(a>0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u<a;u++)i=n(e[u],u,r),i!=null&&(o[o.length]=i);else for(s in e)i=n(e[s],s,r),i!=null&&(o[o.length]=i);return o.concat.apply([],o)},guid:1,proxy:function(e,n){var r,i,s;return typeof n=="string"&&(r=e[n],n=e,e=r),v.isFunction(e)?(i=l.call(arguments,2),s=function(){return e.apply(n,i.concat(l.call(arguments)))},s.guid=e.guid=e.guid||v.guid++,s):t},access:function(e,n,r,i,s,o,u){var a,f=r==null,l=0,c=e.length;if(r&&typeof r=="object"){for(l in r)v.access(e,n,l,r[l],1,o,i);s=1}else if(i!==t){a=u===t&&v.isFunction(i),f&&(a?(a=n,n=function(e,t,n){return a.call(v(e),n)}):(n.call(e,i),n=null));if(n)for(;l<c;l++)n(e[l],r,a?i.call(e[l],l,n(e[l],r)):i,u);s=1}return s?e:f?n.call(e):c?n(e[0],r):o},now:function(){return(new Date).getTime()}}),v.ready.promise=function(t){if(!r){r=v.Deferred();if(i.readyState==="complete")setTimeout(v.ready,1);else if(i.addEventListener)i.addEventListener("DOMContentLoaded",A,!1),e.addEventListener("load",v.ready,!1);else{i.attachEvent("onreadystatechange",A),e.attachEvent("onload",v.ready);var n=!1;try{n=e.frameElement==null&&i.documentElement}catch(s){}n&&n.doScroll&&function o(){if(!v.isReady){try{n.doScroll("left")}catch(e){return setTimeout(o,50)}v.ready()}}()}}return r.promise(t)},v.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){O["[object "+t+"]"]=t.toLowerCase()}),n=v(i);var M={};v.Callbacks=function(e){e=typeof e=="string"?M[e]||_(e):v.extend({},e);var n,r,i,s,o,u,a=[],f=!e.once&&[],l=function(t){n=e.memory&&t,r=!0,u=s||0,s=0,o=a.length,i=!0;for(;a&&u<o;u++)if(a[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}i=!1,a&&(f?f.length&&l(f.shift()):n?a=[]:c.disable())},c={add:function(){if(a){var t=a.length;(function r(t){v.each(t,function(t,n){var i=v.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this},remove:function(){return a&&v.each(arguments,function(e,t){var n;while((n=v.inArray(t,a,n))>-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t<r;t++)n[t]&&v.isFunction(n[t].promise)?n[t].promise().done(o(t,f,n)).fail(s.reject).progress(o(t,a,u)):--i}return i||s.resolveWith(f,n),s.promise()}}),v.support=function(){var t,n,r,s,o,u,a,f,l,c,h,p=i.createElement("div");p.setAttribute("className","t"),p.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="<table><tr><td></td><td>t</td></tr></table>",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="<div></div>",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i<s;i++)delete r[t[i]];if(!(n?B:v.isEmptyObject)(r))return}}if(!n){delete u[a].data;if(!B(u[a]))return}o?v.cleanData([e],!0):v.support.deleteExpando||u!=u.window?delete u[a]:u[a]=null},_data:function(e,t,n){return v.data(e,t,n,!0)},acceptData:function(e){var t=e.nodeName&&v.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),v.fn.extend({data:function(e,n){var r,i,s,o,u,a=this[0],f=0,l=null;if(e===t){if(this.length){l=v.data(a);if(a.nodeType===1&&!v._data(a,"parsedAttrs")){s=a.attributes;for(u=s.length;f<u;f++)o=s[f].name,o.indexOf("data-")||(o=v.camelCase(o.substring(5)),H(a,o,l[o]));v._data(a,"parsedAttrs",!0)}}return l}return typeof e=="object"?this.each(function(){v.data(this,e)}):(r=e.split(".",2),r[1]=r[1]?"."+r[1]:"",i=r[1]+"!",v.access(this,function(n){if(n===t)return l=this.triggerHandler("getData"+i,[r[0]]),l===t&&a&&(l=v.data(a,e),l=H(a,e,l)),l===t&&r[1]?this.data(r[0]):l;r[1]=n,this.each(function(){var t=v(this);t.triggerHandler("setData"+i,r),v.data(this,e,n),t.triggerHandler("changeData"+i,r)})},null,n,arguments.length>1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length<r?v.queue(this[0],e):n===t?this:this.each(function(){var t=v.queue(this,e,n);v._queueHooks(this,e),e==="fx"&&t[0]!=="inprogress"&&v.dequeue(this,e)})},dequeue:function(e){return this.each(function(){v.dequeue(this,e)})},delay:function(e,t){return e=v.fx?v.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,s=v.Deferred(),o=this,u=this.length,a=function(){--i||s.resolveWith(o,[o])};typeof e!="string"&&(n=e,e=t),e=e||"fx";while(u--)r=v._data(o[u],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(a));return a(),s.promise(n)}});var j,F,I,q=/[\t\r\n]/g,R=/\r/g,U=/^(?:button|input)$/i,z=/^(?:button|input|object|select|textarea)$/i,W=/^a(?:rea|)$/i,X=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,V=v.support.getSetAttribute;v.fn.extend({attr:function(e,t){return v.access(this,v.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n<r;n++){i=this[n];if(i.nodeType===1)if(!i.className&&t.length===1)i.className=e;else{s=" "+i.className+" ";for(o=0,u=t.length;o<u;o++)s.indexOf(" "+t[o]+" ")<0&&(s+=t[o]+" ");i.className=v.trim(s)}}}return this},removeClass:function(e){var n,r,i,s,o,u,a;if(v.isFunction(e))return this.each(function(t){v(this).removeClass(e.call(this,t,this.className))});if(e&&typeof e=="string"||e===t){n=(e||"").split(y);for(u=0,a=this.length;u<a;u++){i=this[u];if(i.nodeType===1&&i.className){r=(" "+i.className+" ").replace(q," ");for(s=0,o=n.length;s<o;s++)while(r.indexOf(" "+n[s]+" ")>=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(q," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(v.support.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!v.nodeName(n.parentNode,"optgroup"))){t=v(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n=v.makeArray(t);return v(e).find("option").each(function(){this.selected=v.inArray(v(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o<r.length;o++)i=r[o],i&&(n=v.propFix[i]||i,s=X.test(i),s||v.attr(e,i,""),e.removeAttribute(V?i:n),s&&n in e&&(e[n]=!1))}},attrHooks:{type:{set:function(e,t){if(U.test(e.nodeName)&&e.parentNode)v.error("type property can't be changed");else if(!v.support.radioValue&&t==="radio"&&v.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return j&&v.nodeName(e,"button")?j.get(e,t):t in e?e.value:null},set:function(e,t,n){if(j&&v.nodeName(e,"button"))return j.set(e,t,n);e.value=t}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,s,o,u=e.nodeType;if(!e||u===3||u===8||u===2)return;return o=u!==1||!v.isXMLDoc(e),o&&(n=v.propFix[n]||n,s=v.propHooks[n]),r!==t?s&&"set"in s&&(i=s.set(e,r,n))!==t?i:e[n]=r:s&&"get"in s&&(i=s.get(e,n))!==null?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):z.test(e.nodeName)||W.test(e.nodeName)&&e.href?0:t}}}}),F={get:function(e,n){var r,i=v.prop(e,n);return i===!0||typeof i!="boolean"&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?v.removeAttr(e,n):(r=v.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},V||(I={name:!0,id:!0,coords:!0},j=v.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(I[n]?r.value!=="":r.specified)?r.value:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=i.createAttribute(n),e.setAttributeNode(r)),r.value=t+""}},v.each(["width","height"],function(e,t){v.attrHooks[t]=v.extend(v.attrHooks[t],{set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}})}),v.attrHooks.contenteditable={get:j.get,set:function(e,t,n){t===""&&(t="false"),j.set(e,t,n)}}),v.support.hrefNormalized||v.each(["href","src","width","height"],function(e,n){v.attrHooks[n]=v.extend(v.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return r===null?t:r}})}),v.support.style||(v.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=t+""}}),v.support.optSelected||(v.propHooks.selected=v.extend(v.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),v.support.enctype||(v.propFix.enctype="encoding"),v.support.checkOn||v.each(["radio","checkbox"],function(){v.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}}),v.each(["radio","checkbox"],function(){v.valHooks[this]=v.extend(v.valHooks[this],{set:function(e,t){if(v.isArray(t))return e.checked=v.inArray(v(e).val(),t)>=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f<n.length;f++){l=J.exec(n[f])||[],c=l[1],h=(l[2]||"").split(".").sort(),g=v.event.special[c]||{},c=(s?g.delegateType:g.bindType)||c,g=v.event.special[c]||{},p=v.extend({type:c,origType:l[1],data:i,handler:r,guid:r.guid,selector:s,needsContext:s&&v.expr.match.needsContext.test(s),namespace:h.join(".")},d),m=a[c];if(!m){m=a[c]=[],m.delegateCount=0;if(!g.setup||g.setup.call(e,i,h,u)===!1)e.addEventListener?e.addEventListener(c,u,!1):e.attachEvent&&e.attachEvent("on"+c,u)}g.add&&(g.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),s?m.splice(m.delegateCount++,0,p):m.push(p),v.event.global[c]=!0}e=null},global:{},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,p,d,m,g=v.hasData(e)&&v._data(e);if(!g||!(h=g.events))return;t=v.trim(Z(t||"")).split(" ");for(s=0;s<t.length;s++){o=J.exec(t[s])||[],u=a=o[1],f=o[2];if(!u){for(u in h)v.event.remove(e,u+t[s],n,r,!0);continue}p=v.event.special[u]||{},u=(r?p.delegateType:p.bindType)||u,d=h[u]||[],l=d.length,f=f?new RegExp("(^|\\.)"+f.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(c=0;c<d.length;c++)m=d[c],(i||a===m.origType)&&(!n||n.guid===m.guid)&&(!f||f.test(m.namespace))&&(!r||r===m.selector||r==="**"&&m.selector)&&(d.splice(c--,1),m.selector&&d.delegateCount--,p.remove&&p.remove.call(e,m));d.length===0&&l!==d.length&&((!p.teardown||p.teardown.call(e,f,g.handle)===!1)&&v.removeEvent(e,u,g.handle),delete h[u])}v.isEmptyObject(h)&&(delete g.handle,v.removeData(e,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,s,o){if(!s||s.nodeType!==3&&s.nodeType!==8){var u,a,f,l,c,h,p,d,m,g,y=n.type||n,b=[];if(Y.test(y+v.event.triggered))return;y.indexOf("!")>=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f<m.length&&!n.isPropagationStopped();f++)l=m[f][0],n.type=m[f][1],d=(v._data(l,"events")||{})[n.type]&&v._data(l,"handle"),d&&d.apply(l,r),d=h&&l[h],d&&v.acceptData(l)&&d.apply&&d.apply(l,r)===!1&&n.preventDefault();return n.type=y,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(s.ownerDocument,r)===!1)&&(y!=="click"||!v.nodeName(s,"a"))&&v.acceptData(s)&&h&&s[y]&&(y!=="focus"&&y!=="blur"||n.target.offsetWidth!==0)&&!v.isWindow(s)&&(c=s[h],c&&(s[h]=null),v.event.triggered=y,s[y](),v.event.triggered=t,c&&(s[h]=c)),n.result}return},dispatch:function(n){n=v.event.fix(n||e.event);var r,i,s,o,u,a,f,c,h,p,d=(v._data(this,"events")||{})[n.type]||[],m=d.delegateCount,g=l.call(arguments),y=!n.exclusive&&!n.namespace,b=v.event.special[n.type]||{},w=[];g[0]=n,n.delegateTarget=this;if(b.preDispatch&&b.preDispatch.call(this,n)===!1)return;if(m&&(!n.button||n.type!=="click"))for(s=n.target;s!=this;s=s.parentNode||this)if(s.disabled!==!0||n.type!=="click"){u={},f=[];for(r=0;r<m;r++)c=d[r],h=c.selector,u[h]===t&&(u[h]=c.needsContext?v(h,this).index(s)>=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r<w.length&&!n.isPropagationStopped();r++){a=w[r],n.currentTarget=a.elem;for(i=0;i<a.matches.length&&!n.isImmediatePropagationStopped();i++){c=a.matches[i];if(y||!n.namespace&&!c.namespace||n.namespace_re&&n.namespace_re.test(c.namespace))n.data=c.data,n.handleObj=c,o=((v.event.special[c.origType]||{}).handle||c.handler).apply(a.elem,g),o!==t&&(n.result=o,o===!1&&(n.preventDefault(),n.stopPropagation()))}}return b.postDispatch&&b.postDispatch.call(this,n),n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,s,o,u=n.button,a=n.fromElement;return e.pageX==null&&n.clientX!=null&&(r=e.target.ownerDocument||i,s=r.documentElement,o=r.body,e.pageX=n.clientX+(s&&s.scrollLeft||o&&o.scrollLeft||0)-(s&&s.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(s&&s.scrollTop||o&&o.scrollTop||0)-(s&&s.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?n.toElement:a),!e.which&&u!==t&&(e.which=u&1?1:u&2?3:u&4?2:0),e}},fix:function(e){if(e[v.expando])return e;var t,n,r=e,s=v.event.fixHooks[e.type]||{},o=s.props?this.props.concat(s.props):this.props;e=v.Event(r);for(t=o.length;t;)n=o[--t],e[n]=r[n];return e.target||(e.target=r.srcElement||i),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,r):e},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){v.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=v.extend(new v.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?v.event.trigger(i,null,t):v.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},v.event.handle=v.event.dispatch,v.removeEvent=i.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]=="undefined"&&(e[r]=null),e.detachEvent(r,n))},v.Event=function(e,t){if(!(this instanceof v.Event))return new v.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?tt:et):this.type=e,t&&v.extend(this,t),this.timeStamp=e&&e.timeStamp||v.now(),this[v.expando]=!0},v.Event.prototype={preventDefault:function(){this.isDefaultPrevented=tt;var e=this.originalEvent;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=tt;var e=this.originalEvent;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()},isDefaultPrevented:et,isPropagationStopped:et,isImmediatePropagationStopped:et},v.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){v.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj,o=s.selector;if(!i||i!==r&&!v.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),v.support.submitBubbles||(v.event.special.submit={setup:function(){if(v.nodeName(this,"form"))return!1;v.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=v.nodeName(n,"input")||v.nodeName(n,"button")?n.form:t;r&&!v._data(r,"_submit_attached")&&(v.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),v._data(r,"_submit_attached",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&v.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(v.nodeName(this,"form"))return!1;v.event.remove(this,"._submit")}}),v.support.changeBubbles||(v.event.special.change={setup:function(){if($.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")v.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),v.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),v.event.simulate("change",this,e,!0)});return!1}v.event.add(this,"beforeactivate._change",function(e){var t=e.target;$.test(t.nodeName)&&!v._data(t,"_change_attached")&&(v.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&v.event.simulate("change",this.parentNode,e,!0)}),v._data(t,"_change_attached",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return v.event.remove(this,"._change"),!$.test(this.nodeName)}}),v.support.focusinBubbles||v.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){v.event.simulate(t,e.target,v.event.fix(e),!0)};v.event.special[t]={setup:function(){n++===0&&i.addEventListener(e,r,!0)},teardown:function(){--n===0&&i.removeEventListener(e,r,!0)}}}),v.fn.extend({on:function(e,n,r,i,s){var o,u;if(typeof e=="object"){typeof n!="string"&&(r=r||n,n=t);for(u in e)this.on(u,n,r,e[u],s);return this}r==null&&i==null?(i=n,r=n=t):i==null&&(typeof n=="string"?(i=r,r=t):(i=r,r=n,n=t));if(i===!1)i=et;else if(!i)return this;return s===1&&(o=i,i=function(e){return v().off(e),o.apply(this,arguments)},i.guid=o.guid||(o.guid=v.guid++)),this.each(function(){v.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,s;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,v(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if(typeof e=="object"){for(s in e)this.off(s,n,e[s]);return this}if(n===!1||typeof n=="function")r=n,n=t;return r===!1&&(r=et),this.each(function(){v.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return v(this.context).on(e,this.selector,t,n),this},die:function(e,t){return v(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){v.event.trigger(e,t,this)})},triggerHandler:function(e,t){if(this[0])return v.event.trigger(e,t,this[0],!0)},toggle:function(e){var t=arguments,n=e.guid||v.guid++,r=0,i=function(n){var i=(v._data(this,"lastToggle"+e.guid)||0)%r;return v._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};i.guid=n;while(r<t.length)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),v.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){v.fn[t]=function(e,n){return n==null&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function ct(e,t,n,r,i,s){return r&&!r[d]&&(r=ct(r)),i&&!i[d]&&(i=ct(i,s)),N(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||dt(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?lt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=lt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?T.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a<s;a++)if(n=i.relative[e[a].type])h=[at(ft(h),n)];else{n=i.filter[e[a].type].apply(null,e[a].matches);if(n[d]){r=++a;for(;r<s;r++)if(i.relative[e[r].type])break;return ct(a>1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a<r&&ht(e.slice(a,r)),r<s&&ht(e=e.slice(r)),r<s&&e.join(""))}h.push(n)}return ft(h)}function pt(e,t){var r=t.length>0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r<i;r++)nt(e,t[r],n);return n}function vt(e,t,n,r,s){var o,u,f,l,c,h=ut(e),p=h.length;if(!r&&h.length===1){u=h[0]=h[0].slice(0);if(u.length>2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},N=function(e,t){return e[d]=t==null||t,e},C=function(){var e={},t=[];return N(function(n,r){return t.push(n)>i.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="<a name='"+d+"'></a><div name='"+d+"'></div>",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:st(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:st(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},f=y.compareDocumentPosition?function(e,t){return e===t?(l=!0,0):(!e.compareDocumentPosition||!t.compareDocumentPosition?e.compareDocumentPosition:e.compareDocumentPosition(t)&4)?-1:1}:function(e,t){if(e===t)return l=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],s=[],o=e.parentNode,u=t.parentNode,a=o;if(o===u)return ot(e,t);if(!o)return-1;if(!u)return 1;while(a)i.unshift(a),a=a.parentNode;a=u;while(a)s.unshift(a),a=a.parentNode;n=i.length,r=s.length;for(var f=0;f<n&&f<r;f++)if(i[f]!==s[f])return ot(i[f],s[f]);return f===n?ot(e,s[f],-1):ot(i[f],t,1)},[0,0].sort(f),h=!l,nt.uniqueSort=function(e){var t,n=[],r=1,i=0;l=h,e.sort(f);if(l){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e},nt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},a=nt.compile=function(e,t){var n,r=[],i=[],s=A[d][e+" "];if(!s){t||(t=ut(e)),n=t.length;while(n--)s=ht(t[n]),s[d]?r.push(s):i.push(s);s=A(e,pt(i,r))}return s},g.querySelectorAll&&function(){var e,t=vt,n=/'|\\/g,r=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,i=[":focus"],s=[":active"],u=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector||y.oMatchesSelector||y.msMatchesSelector;K(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="<p test=''></p>",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="<input type='hidden'/>",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t<n;t++)if(v.contains(u[t],this))return!0});o=this.pushStack("","find",e);for(t=0,n=this.length;t<n;t++){r=o.length,v.find(e,this[t],o);if(t>0)for(i=r;i<o.length;i++)for(s=0;s<r;s++)if(o[s]===o[i]){o.splice(i--,1);break}}return o},has:function(e){var t,n=v(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(v.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1),"not",e)},filter:function(e){return this.pushStack(ft(this,e,!0),"filter",e)},is:function(e){return!!e&&(typeof e=="string"?st.test(e)?v(e,this.context).index(this[0])>=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r<i;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&n.nodeType!==11){if(o?o.index(n)>-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/<tbody/i,gt=/<|&#?\w+;/,yt=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,wt=new RegExp("<(?:"+ct+")[\\s/>]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,Nt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X<div>","</div>"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1></$2>");try{for(;r<i;r++)n=this[r]||{},n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),n.innerHTML=e);n=0}catch(s){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){return ut(this[0])?this.length?this.pushStack(v(v.isFunction(e)?e():e),"replaceWith",e):this:v.isFunction(e)?this.each(function(t){var n=v(this),r=n.html();n.replaceWith(e.call(this,t,r))}):(typeof e!="string"&&(e=v(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;v(this).remove(),t?v(t).before(e):v(n).append(e)}))},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=[].concat.apply([],e);var i,s,o,u,a=0,f=e[0],l=[],c=this.length;if(!v.support.checkClone&&c>1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a<c;a++)r.call(n&&v.nodeName(this[a],"table")?Lt(this[a],"tbody"):this[a],a===u?o:v.clone(o,!0,!0))}o=s=null,l.length&&v.each(l,function(e,t){t.src?v.ajax?v.ajax({url:t.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):v.error("no ajax"):v.globalEval((t.text||t.textContent||t.innerHTML||"").replace(Tt,"")),t.parentNode&&t.parentNode.removeChild(t)})}return this}}),v.buildFragment=function(e,n,r){var s,o,u,a=e[0];return n=n||i,n=!n.nodeType&&n[0]||n,n=n.ownerDocument||n,e.length===1&&typeof a=="string"&&a.length<512&&n===i&&a.charAt(0)==="<"&&!bt.test(a)&&(v.support.checkClone||!St.test(a))&&(v.support.html5Clone||!wt.test(a))&&(o=!0,s=v.fragments[a],u=s!==t),s||(s=n.createDocumentFragment(),v.clean(e,n,s,r),o&&(v.fragments[a]=u&&s)),{fragment:s,cacheable:o}},v.fragments={},v.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){v.fn[e]=function(n){var r,i=0,s=[],o=v(n),u=o.length,a=this.length===1&&this[0].parentNode;if((a==null||a&&a.nodeType===11&&a.childNodes.length===1)&&u===1)return o[t](this[0]),this;for(;i<u;i++)r=(i>0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1></$2>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]==="<table>"&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("<div>").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],Vn[n]=Vn[n]||[],Vn[n].unshift(t)},prefilter:function(e,t){t?Xn.unshift(e):Xn.push(e)}}),v.Tween=Yn,Yn.prototype={constructor:Yn,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(v.cssNumber[n]?"":"px")},cur:function(){var e=Yn.propHooks[this.prop];return e&&e.get?e.get(this):Yn.propHooks._default.get(this)},run:function(e){var t,n=Yn.propHooks[this.prop];return this.options.duration?this.pos=t=v.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yn.propHooks._default.set(this),this}},Yn.prototype.init.prototype=Yn.prototype,Yn.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=v.css(e.elem,e.prop,!1,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){v.fx.step[e.prop]?v.fx.step[e.prop](e):e.elem.style&&(e.elem.style[v.cssProps[e.prop]]!=null||v.cssHooks[e.prop])?v.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yn.propHooks.scrollTop=Yn.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},v.each(["toggle","show","hide"],function(e,t){var n=v.fn[t];v.fn[t]=function(r,i,s){return r==null||typeof r=="boolean"||!e&&v.isFunction(r)&&v.isFunction(i)?n.apply(this,arguments):this.animate(Zn(t,!0),r,i,s)}}),v.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Gt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=v.isEmptyObject(e),s=v.speed(t,n,r),o=function(){var t=Kn(this,v.extend({},e),s);i&&t.stop(!0)};return i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return typeof e!="string"&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=e!=null&&e+"queueHooks",s=v.timers,o=v._data(this);if(n)o[n]&&o[n].stop&&i(o[n]);else for(n in o)o[n]&&o[n].stop&&Wn.test(n)&&i(o[n]);for(n=s.length;n--;)s[n].elem===this&&(e==null||s[n].queue===e)&&(s[n].anim.stop(r),t=!1,s.splice(n,1));(t||!r)&&v.dequeue(this,e)})}}),v.each({slideDown:Zn("show"),slideUp:Zn("hide"),slideToggle:Zn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){v.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),v.speed=function(e,t,n){var r=e&&typeof e=="object"?v.extend({},e):{complete:n||!n&&t||v.isFunction(e)&&e,duration:e,easing:n&&t||t&&!v.isFunction(t)&&t};r.duration=v.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in v.fx.speeds?v.fx.speeds[r.duration]:v.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){v.isFunction(r.old)&&r.old.call(this),r.queue&&v.dequeue(this,r.queue)},r},v.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},v.timers=[],v.fx=Yn.prototype.init,v.fx.tick=function(){var e,n=v.timers,r=0;qn=v.now();for(;r<n.length;r++)e=n[r],!e()&&n[r]===e&&n.splice(r--,1);n.length||v.fx.stop(),qn=t},v.fx.timer=function(e){e()&&v.timers.push(e)&&!Rn&&(Rn=setInterval(v.fx.tick,v.fx.interval))},v.fx.interval=13,v.fx.stop=function(){clearInterval(Rn),Rn=null},v.fx.speeds={slow:600,fast:200,_default:400},v.fx.step={},v.expr&&v.expr.filters&&(v.expr.filters.animated=function(e){return v.grep(v.timers,function(t){return e===t.elem}).length});var er=/^(?:body|html)$/i;v.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){v.offset.setOffset(this,e,t)});var n,r,i,s,o,u,a,f={top:0,left:0},l=this[0],c=l&&l.ownerDocument;if(!c)return;return(r=c.body)===l?v.offset.bodyOffset(l):(n=c.documentElement,v.contains(n,l)?(typeof l.getBoundingClientRect!="undefined"&&(f=l.getBoundingClientRect()),i=tr(c),s=n.clientTop||r.clientTop||0,o=n.clientLeft||r.clientLeft||0,u=i.pageYOffset||n.scrollTop,a=i.pageXOffset||n.scrollLeft,{top:f.top+u-s,left:f.left+a-o}):f)},v.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return v.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(v.css(e,"marginTop"))||0,n+=parseFloat(v.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=v.css(e,"position");r==="static"&&(e.style.position="relative");var i=v(e),s=i.offset(),o=v.css(e,"top"),u=v.css(e,"left"),a=(r==="absolute"||r==="fixed")&&v.inArray("auto",[o,u])>-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window); \ No newline at end of file From 377fdd94aa93b54ec39cf3242081c7cad6a8d576 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Mon, 2 Jul 2018 07:18:42 +0900 Subject: [PATCH 319/339] =?UTF-8?q?=E9=81=8E=E5=8E=BB=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E3=81=AE=E5=8F=96=E3=82=8A=E8=BE=BC=E3=81=BF=E3=82=92strpos?= =?UTF-8?q?=E3=81=AB=E6=9B=B8=E3=81=8D=E6=8F=9B=E3=81=88=20read.cgi?= =?UTF-8?q?=E3=81=ABrep2=E3=81=AEUA=E3=81=A7=E3=82=A2=E3=82=AF=E3=82=BB?= =?UTF-8?q?=E3=82=B9=E3=81=99=E3=82=8B=E3=81=A8=E5=BC=BE=E3=81=8B=E3=82=8C?= =?UTF-8?q?=E3=82=8B=E3=82=B5=E3=82=A4=E3=83=88=E3=81=8C=E3=81=82=E3=82=8B?= =?UTF-8?q?=E3=81=AE=E3=81=A7=E5=AF=BE=E5=87=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 64 +++++++++++++++++++--------------------------- 1 file changed, 26 insertions(+), 38 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index fa68c5d10..4de1ef696 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -654,7 +654,7 @@ public function get2chDatError($code = null) { $read_response_html = ''; if (! $reason) { - $read_response_html = self::getReadCGIHtml($read_url); + $read_response_html = $this->getReadCGIHtml($read_url); } // }}} @@ -667,18 +667,18 @@ public function get2chDatError($code = null) { $kakosoko_match = "/このスレッドは過去ログ倉庫に格.{1,2}されています/"; $kakosoko_match2 = "/http:\/\/turing1000\.nttec\.com\/?(403|404|500)\.dat/"; - $naidesu_match = "/<title>そんな板orスレッドないです。<\/title>/"; + $naidesu_str = "<title>そんな板orスレッドないです。"; // 0ちゃんねるスクリプトに反応するように - $soukoni_match = "/隊長!過去ログ倉庫に<\/title>/"; + $soukoni_str = "<title>隊長!過去ログ倉庫に"; - $error3001_match = "{2ちゃんねる error 3001}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) - $error3939_match = "{2ちゃんねる error 3939}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) - $error4002_match = "{2ちゃんねる error 4002}"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) + $error3001_str = "2ちゃんねる error 3001"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) + $error3939_str = "2ちゃんねる error 3939"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) + $error4002_str = "2ちゃんねる error 4002"; // 過去ログ倉庫でhtml化の時(他にもあるかも、よく知らない) - $sw2_match = "/Something went wrong/"; + $sw2_str = "Something went wrong"; - $vip2ch_ssr_match = "/隊長!新設されたSS速報R板にてスレを発見したですよ!/"; + $vip2ch_ssr_str = "隊長!新設されたSS速報R板にてスレを発見したですよ!"; // // @@ -695,15 +695,15 @@ public function get2chDatError($code = null) { $dat_response_msg = "

    2ch info - このスレッドは過去ログ倉庫に格納されています。浪人ログインすると取得出来るかもしれません。{$plugin_ht}

    "; // がそんな板orスレッドないです。or error 3939 - } elseif ($reason === 'kakohtml' or - preg_match ($naidesu_match, $read_response_html, $matches) || - preg_match ($error3001_match, $read_response_html, $matches) || - preg_match ($error3939_match, $read_response_html, $matches) || - preg_match ($error4002_match, $read_response_html, $matches) || - preg_match ($sw2_match, $read_response_html, $matches) || + } elseif ($reason === 'kakohtml' || preg_match ($vip2ch_kakosoko_match, $read_response_html, $matches) || - preg_match ($vip2ch_ssr_match, $read_response_html, $matches) || - preg_match ($soukoni_match, $read_response_html, $matches)) { + mb_strpos ($read_response_html, $naidesu_str) !== false || + mb_strpos ($read_response_html, $error3001_str) !== false || + mb_strpos ($read_response_html, $error3939_str) !== false || + mb_strpos ($read_response_html, $error4002_str) !== false || + mb_strpos ($read_response_html, $sw2_str) !== false || + mb_strpos ($read_response_html, $vip2ch_ssr_str) !== false || + mb_strpos ($read_response_html, $soukoni_str) !== false) { if ($reason === 'kakohtml' or preg_match ($kakohtml_match, $read_response_html, $matches)) { if ($reason === 'kakohtml') { @@ -714,7 +714,9 @@ public function get2chDatError($code = null) { $kakolog_url_en = rawurlencode ($kakolog_uri); $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; $dat_response_msg = "<p>2ch info - 隊長! 過去ログ倉庫で、<a href=\"{$kakolog_uri}.html\"{$_conf['bbs_win_target_at']}>スレッド {$matches[3]}.html</a> を発見しました。 [<a href=\"{$read_kako_url}\">rep2に取り込んで読む</a>]</p>"; - } elseif (preg_match ($error3001_match, $read_response_html, $matches)) { + } elseif (mb_strpos ($read_response_html, $error3001_str) !== false || + mb_strpos ($read_response_html, $error3939_str) !== false || + mb_strpos ($read_response_html, $error4002_str) !== false) { $dat_response_status = "隊長! 過去ログ倉庫で、html化されたスレッドを発見しました。"; $key4 = substr($this->key, 0, 4); $key5 = substr($this->key, 0, 5); @@ -722,23 +724,7 @@ public function get2chDatError($code = null) { $kakolog_url_en = rawurlencode ($kakolog_uri); $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; $dat_response_msg = "<p>2ch info - 隊長! 過去ログ倉庫で、<a href=\"{$kakolog_uri}.html\"{$_conf['bbs_win_target_at']}>スレッド {$this->key}.html</a> を発見しました。 [<a href=\"{$read_kako_url}\">rep2に取り込んで読む</a>]</p>"; - } elseif (preg_match ($error3939_match, $read_response_html, $matches)) { - $dat_response_status = "隊長! 過去ログ倉庫で、html化されたスレッドを発見しました。"; - $key4 = substr($this->key, 0, 4); - $key5 = substr($this->key, 0, 5); - $kakolog_uri = "http://{$this->host}/{$this->bbs}/kako/{$key4}/{$key5}/{$this->key}"; - $kakolog_url_en = rawurlencode ($kakolog_uri); - $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; - $dat_response_msg = "<p>2ch info - 隊長! 過去ログ倉庫で、<a href=\"{$kakolog_uri}.html\"{$_conf['bbs_win_target_at']}>スレッド {$this->key}.html</a> を発見しました。 [<a href=\"{$read_kako_url}\">rep2に取り込んで読む</a>]</p>"; - } elseif (preg_match ($error4002_match, $read_response_html, $matches)) { - $dat_response_status = "隊長! 過去ログ倉庫で、html化されたスレッドを発見しました。"; - $key4 = substr($this->key, 0, 4); - $key5 = substr($this->key, 0, 5); - $kakolog_uri = "http://{$this->host}/{$this->bbs}/kako/{$key4}/{$key5}/{$this->key}"; - $kakolog_url_en = rawurlencode ($kakolog_uri); - $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; - $dat_response_msg = "<p>2ch info - 隊長! 過去ログ倉庫で、<a href=\"{$kakolog_uri}.html\"{$_conf['bbs_win_target_at']}>スレッド {$this->key}.html</a> を発見しました。 [<a href=\"{$read_kako_url}\">rep2に取り込んで読む</a>]</p>"; - } elseif (preg_match ($sw2_match, $read_response_html, $matches)) { + } elseif (mb_strpos ($read_response_html, $sw2_str) !== false) { $dat_response_msg = "<p>2ch info - datが空でした。[$read_response_html]</p>"; } elseif (preg_match ($waithtml_match, $read_response_html, $matches)) { $dat_response_status = "隊長! スレッドはhtml化されるのを待っているようです。"; @@ -751,7 +737,7 @@ public function get2chDatError($code = null) { $kakolog_url_en = rawurlencode ($kakolog_uri); $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&kakolog={$kakolog_url_en}&kakoget=1"; $dat_response_msg = "<p>2ch info - 隊長! 過去ログ倉庫で、<a href=\"{$kakolog_uri}.html\"{$_conf['bbs_win_target_at']}>スレッド {$this->key}.html</a> を発見しました。 [<a href=\"{$read_kako_url}\">rep2に取り込んで読む</a>]</p>"; - } elseif (preg_match ($vip2ch_ssr_match, $read_response_html, $matches)) { + } elseif (mb_strpos ($read_response_html, $vip2ch_ssr_str) !== false) { $dat_response_status = "隊長! 新設されたSS速報R板にてスレを発見したですよ!"; $movelog_uri = str_replace("news4ssnip", "news4ssr", $read_url); $movelog_url_en = rawurlencode ($movelog_uri); @@ -861,7 +847,9 @@ public function getReadCGIHtml($read_url) { try { $req = P2Commun::createHTTPRequest ($read_url.'1', HTTP_Request2::METHOD_GET); // ヘッダ - $req->setHeader ('User-Agent', P2Commun::getP2UA(false,P2HostMgr::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG + // $req->setHeader ('User-Agent', P2Commun::getP2UA(false,P2HostMgr::isHost2chs($this->host))); // ここは、"Monazilla/" をつけるとNG + // read.cgiにrep2のUAでアクセスすると弾かれるサイトがあるので対処 + $req->setHeader ('User-Agent', $_SERVER['HTTP_USER_AGENT']); // Requestの送信 $response = P2Commun::getHTTPResponse($req); @@ -871,14 +859,14 @@ public function getReadCGIHtml($read_url) { if ($res_code == '200' || $res_code == '206') { // Partial Content $read_response_html = $response->getBody (); } elseif ($res_code == '301' && P2HostMgr::isHost2ch ($this->host)) { - $read_response_html = self::getReadCGIHtml($response->getHeader ("Location")); + $read_response_html = $this->getReadCGIHtml($response->getHeader ("Location")); } elseif ($res_code == '302' || preg_match ($test403, $response->getBody (), $test403)) { $read_response_html = $response->getBody (); } elseif ($res_code == '500' || preg_match ($testsw2, $response->getBody (), $testsw2)) { $read_response_html = $response->getBody (); } else { $url_t = P2Util::throughIme ($read_url); - $info_msg_ht = "<p class=\"info-msg\">Error: {$code}<br>"; + $info_msg_ht = "<p class=\"info-msg\">Error: {$res_code}<br>"; $info_msg_ht .= "rep2 info: <a href=\"{$url_t}\"{$_conf['ext_win_target_at']}>{$read_url}</a> のHTMLを取得出来ませんでした。</p>"; P2Util::pushInfoHtml ($info_msg_ht); } From 799da7a5a228d9e0e1112531b096f99914aaebcf Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Tue, 3 Jul 2018 22:02:38 +0900 Subject: [PATCH 320/339] =?UTF-8?q?live=5Fpost=5Fform.php=E3=81=ABjquery?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/live_post_form.php | 1 + 1 file changed, 1 insertion(+) diff --git a/rep2/live_post_form.php b/rep2/live_post_form.php index 23b5bdeef..5c934622b 100755 --- a/rep2/live_post_form.php +++ b/rep2/live_post_form.php @@ -106,6 +106,7 @@ if (!$_conf['ktai']) { echo <<<EOP + <script type="text/javascript" src="js/jquery-{$_conf['jquery_version']}.min.js"></script> <link rel="stylesheet" type="text/css" href="css.php?css=style&skin={$skin_en}"> <link rel="stylesheet" type="text/css" href="css.php?css=post&skin={$skin_en}">\n EOP; From cf90d948f285276a683f4d6079becfc73c529d7d Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 4 Jul 2018 00:29:26 +0900 Subject: [PATCH 321/339] =?UTF-8?q?=E3=82=B9=E3=83=AC=E3=81=AB=E3=82=A2?= =?UTF-8?q?=E3=82=AF=E3=82=BB=E3=82=B9=E3=81=99=E3=82=8B=E5=BA=A6=E3=81=AB?= =?UTF-8?q?read.cgi=E3=82=92=E5=8F=A9=E3=81=8B=E3=81=AA=E3=81=84=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4=20=E9=81=8E=E5=8E=BB?= =?UTF-8?q?=E3=83=AD=E3=82=B0=E5=80=89=E5=BA=AB=E3=81=8B=E3=82=89=E5=8F=96?= =?UTF-8?q?=E3=82=8A=E8=BE=BC=E3=82=93=E3=81=A0DAT=E3=82=92=E5=86=8D?= =?UTF-8?q?=E3=83=80=E3=82=A6=E3=83=B3=E3=83=AD=E3=83=BC=E3=83=89=E3=81=97?= =?UTF-8?q?=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 4 ++++ lib/Thread.php | 3 ++- lib/ThreadRead.php | 24 ++++++++++++++++++++++++ lib/post_form_options.inc.php | 4 ++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index 407da87ac..2d7fb98fd 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -262,6 +262,10 @@ static public function cacheFileForDL($url) $cachefile = $_conf['cache_dir'] . '/' . $save_uri; + if(substr($cachefile, -1)=='/') { + $cachefile = substr($cachefile,0, -1); + } + FileCtl::mkdirFor($cachefile); return $cachefile; diff --git a/lib/Thread.php b/lib/Thread.php index d509e7bed..8e4657d5a 100644 --- a/lib/Thread.php +++ b/lib/Thread.php @@ -32,7 +32,7 @@ class Thread public $bbs; // ex)mac // idxline[11] public $itaj; // 板名 ex)新・mac - public $datochiok; // DAT落ち取得権限があればtrue(1) // idxline[12] + public $datochiok; // 過去ログ扱いならtrue(1) // idxline[12] // 使っている形跡が無いので再利用 public $torder; // スレッド新しい順番号 public $unum; // 未読(新着レス)数 @@ -359,6 +359,7 @@ public function getThreadInfoFromIdx() $this->fav = (int)$lar[6]; // あえてboolでなく + // 過去ログ取り込み済フラグ if (isset($lar[12])) { $this->datochiok = $lar[12]; } diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 4de1ef696..dc61ca866 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -46,6 +46,10 @@ public function __construct() { public function downloadDat() { global $_conf; + // 過去ログ扱いの場合何もしない + if($this->datochiok) { + return true; + } // まちBBS if (P2HostMgr::isHostMachiBbs ($this->host)) { return DownloadDatMachiBbs::invoke ($this); @@ -578,6 +582,9 @@ protected function _downloadDat2chKako($uri, $ext) { p2die ('cannot write file. downloadDat2chMaru()'); } + // 過去ログ扱いフラグを立てる (idxline[12]に保存される) + $this->datochiok = true; + return true; } elseif ($code == '304') { return '304 Not Modified'; @@ -844,6 +851,17 @@ public function getReadCGIHtml($read_url) { $test403 = "/403\.dat/"; $testsw2 = "/Something went wrong/"; + $cache_file = P2Util::cacheFileForDL($read_url); + // メニューの10倍キャッシュする + $cache_time = $_conf['menu_dl_interval'] * 36000; + + if (file_exists($cache_file)) { + // キャッシュ有効期間ならダウンロードしない + if (filemtime($cache_file) > time() - $cache_time) { + return FileCtl::file_read_contents($cache_file); + } + } + try { $req = P2Commun::createHTTPRequest ($read_url.'1', HTTP_Request2::METHOD_GET); // ヘッダ @@ -870,6 +888,12 @@ public function getReadCGIHtml($read_url) { $info_msg_ht .= "rep2 info: <a href=\"{$url_t}\"{$_conf['ext_win_target_at']}>{$read_url}</a> のHTMLを取得出来ませんでした。</p>"; P2Util::pushInfoHtml ($info_msg_ht); } + + if(isset($read_response_html)) { + if (FileCtl::file_write_contents($cache_file, $read_response_html) === false) { + p2die('cannot write file.'.$cache_file); + } + } } catch (Exception $e) { $this->getdat_error_msg_ht .= "<p>サーバ接続エラー: " . $e->getMessage (); $this->getdat_error_msg_ht .= "<br>rep2 error: 板サーバへの接続に失敗しました。</p>"; diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index 0b5618904..de5649ef9 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -336,11 +336,15 @@ function setHiddenValue(button) { $upload_form = ''; $upload_mode = null; +/* if (!$_conf['ktai'] || $_conf['iphone']) { if (file_exists($_conf['dropbox_auth_json'])) { $upload_mode = 'dropbox'; } } +*/ + +$upload_mode = 'imgur'; if ($upload_mode !== null) { if ($_conf['ktai'] || $_conf['iphone']) { From 142ed43d1ae09fdf26ab0cd83da867d209bcb352 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Thu, 5 Jul 2018 13:00:58 +0900 Subject: [PATCH 322/339] =?UTF-8?q?=E9=81=8E=E5=8E=BB=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E5=8F=96=E3=82=8A=E8=BE=BC=E3=81=BF=E6=99=82=E3=81=ABIf-Modifi?= =?UTF-8?q?ed-Since=E3=82=92=E9=80=81=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index dc61ca866..20e371d6b 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -566,6 +566,10 @@ protected function _downloadDat2chKako($uri, $ext) { try { $req = P2Commun::createHTTPRequest ($url, HTTP_Request2::METHOD_GET); + if ($this->modified) { + $req->setHeader ('If-Modified-Since', $this->modified); + } + // Requestの送信 $response = P2Commun::getHTTPResponse($req); From 64735587118a6e1807d71cf9c142f4f00b6c37db Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Thu, 5 Jul 2018 13:01:38 +0900 Subject: [PATCH 323/339] =?UTF-8?q?=E6=9C=AA=E4=BD=BF=E7=94=A8=E3=81=AE?= =?UTF-8?q?=E5=A4=89=E6=95=B0=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/fetch-dat.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/fetch-dat.php b/scripts/fetch-dat.php index 41f68deb5..e553d36ac 100644 --- a/scripts/fetch-dat.php +++ b/scripts/fetch-dat.php @@ -139,7 +139,7 @@ // スレ情報取得 ============================= if (isset($subject_txts[$subject_id])) { - $it = 1; + $thread_key = (string)$aThread->key; $thread_key_len = strlen($thread_key); foreach ($subject_txts[$subject_id] as $l) { @@ -148,7 +148,6 @@ $aThread->getThreadInfoFromSubjectTxtLine($l); break; } - $it++; } } From e0308371bfd91255dad6916121349d500d2b4ee9 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Thu, 5 Jul 2018 13:03:05 +0900 Subject: [PATCH 324/339] v180705.1300 --- conf/conf.inc.php | 2 +- doc/README-774.txt | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index c6c03b1a8..d037ef844 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '171122.1500', // rep2のバージョン + 'p2version' => '180705.1300', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index bb5e6159d..fdbcf19ac 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -72,6 +72,15 @@ PHP7 ●ChangeLog +180705.1300 +* 2chのAPIが閉鎖されたので接続先を5chに変更 +* api.5ch.netのレスポンスヘッダーにContent-Lengthが付かない不具合に対応 +* composer.jsonを修正して新規インストール時の不具合を修正 +* 書き込みに失敗した際のエラーメッセージを変更 +* DAT落ちの原因を確認するためのread.cgiアクセスをキャッシュするように変更 +* このバージョン以降で過去ログ倉庫から取り込んだスレのDATを再取得しないように変更 +* IE11でIE6向けのコードが実行されて下書き保存が機能しない不具合を修正 + 171122.1500 * itest(https://itest.5ch.net/サーバー/test/read.cgi/板/スレ)のリンクを開く機能を追加 * DAT破損防止のために旧仕様のitestをリンクしないように変更 From 230461336ef40c0caf6388aa2250611c2869fe6d Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Sat, 21 Apr 2018 13:52:22 +0900 Subject: [PATCH 325/339] =?UTF-8?q?UR=20L=E3=82=B2=E3=83=BC=E3=83=88?= =?UTF-8?q?=E3=82=A6=E3=82=A7=E3=82=A4=E3=81=AB=20Hawker!=20=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_user_def.inc.php | 1 + lib/P2Ime.php | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index f954f0b12..acefca2f0 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -476,6 +476,7 @@ 'exm' => 'gate.php (手動転送)', 'expm' => 'gate.php (pのみ手動転送)', 'google' => 'Google', + 'hawker' => 'Hawker!(jump.x0.to)', ); // HTTPSでアクセスしているときは外部URLゲートを通さない(HTTPSでは直:1, 常に通す:0) diff --git a/lib/P2Ime.php b/lib/P2Ime.php index 103c4e3ec..e8fcd6d14 100644 --- a/lib/P2Ime.php +++ b/lib/P2Ime.php @@ -158,6 +158,12 @@ public function __construct($type = null, array $exceptions = null, $ignoreHttp } break; // }}} + // {{{ Hawker!(jump.x0.to) + case 'hawker': + $this->_method = '_throughHawkerGateway'; + $this->_gateUrl = '//jump.x0.to/'; + break; + // }}} default: $this->_method = '_passThrough'; $this->_gateUrl = null; @@ -248,6 +254,21 @@ protected function _throughGoogleGateway($url, $delay) return $this->_gateUrl . rawurlencode($url); } + // }}} + // {{{ _throughHawkerGateway() + + /** + * Hawker!のURLゲートウェイを通すようにURLを変換する + * + * @param string $url + * @param int $delay (unused) + * @return string + */ + protected function _throughHawkerGateway($url, $delay) + { + return $this->_gateUrl . $url; + } + // }}} // {{{ _passThrough() From c6aa2f89316ab95fd5d90db2bcba605ad943ffe3 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Sun, 24 Jun 2018 22:23:04 +0900 Subject: [PATCH 326/339] =?UTF-8?q?fix=20http=E3=81=8C=E7=84=A1=E3=81=8F?= =?UTF-8?q?=E3=81=A6=E3=82=82cURLMulti=E3=81=8C=E4=BD=BF=E3=81=88=E3=82=8B?= =?UTF-8?q?=E3=81=AF=E3=81=9A=E3=81=AA=E3=81=AE=E3=81=A7=E3=83=81=E3=82=A7?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=82=92=E5=A4=89=E6=9B=B4=20(=E3=81=8B?= =?UTF-8?q?=E3=81=AA=E3=82=8A=E3=82=84=E3=81=A3=E3=81=A4=E3=81=91)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/fetch-subject-txt.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/fetch-subject-txt.php b/scripts/fetch-subject-txt.php index 4a3bc170f..5e8793e69 100644 --- a/scripts/fetch-subject-txt.php +++ b/scripts/fetch-subject-txt.php @@ -9,17 +9,17 @@ die('CLI only!'); } -if (!$_conf['expack.use_curl_multi'] && !$_conf['expack.use_pecl_http']) { - fwrite(STDERR, 'Setting of expack.use_curl_multi or expack.use_pecl_http is required.' . PHP_EOL); - exit(1); -} - define('P2_CLI_RUN', 1); define('P2_FETCH_SUBJECT_TXT_DEBUG', 0); define('P2_FETCH_SUBJECT_TXT_DEBUG_OUTPUT_FILE', '/tmp/p2_fetch_subject_txt.log'); require __DIR__ . '/../conf/conf.inc.php'; +if (!$_conf['expack.use_curl_multi'] && !$_conf['expack.use_pecl_http']) { + fwrite(STDERR, 'Setting of expack.use_curl_multi or expack.use_pecl_http is required.' . PHP_EOL); + exit(1); +} + P2HttpExt::activate(); // }}} From 985483a2f1f59eef2bd80e43f892b3b18f304518 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Thu, 5 Jul 2018 22:38:52 +0900 Subject: [PATCH 327/339] =?UTF-8?q?API=20=E3=81=A7=E9=81=8E=E5=8E=BB?= =?UTF-8?q?=E3=83=AD=E3=82=B0=E5=88=A4=E5=AE=9A=E3=81=A0=E3=81=A3=E3=81=9F?= =?UTF-8?q?=E5=A0=B4=E5=90=88=E3=81=A7=E3=82=82=E9=81=8E=E5=8E=BB=E3=83=AD?= =?UTF-8?q?=E3=82=B0=E6=89=B1=E3=81=84=E3=83=95=E3=83=A9=E3=82=B0=E3=82=92?= =?UTF-8?q?=E7=AB=8B=E3=81=A6=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 20e371d6b..6b6a9ebc6 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -319,6 +319,11 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { // 現行スレの時だけセット $this->isonline = true; } + if ($apiThreadStatus == '3') { + // 過去ログ扱いフラグを立てる (idxline[12]に保存される) + $this->datochiok = true; + } + return true; } elseif ($code == '302') { // Found // ホストの移転を追跡 From c52b26deced9a6532a44f560a6daa3fe33ddcda8 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Thu, 5 Jul 2018 23:14:16 +0900 Subject: [PATCH 328/339] =?UTF-8?q?API=20=E3=81=A7=E9=81=8E=E5=8E=BB?= =?UTF-8?q?=E3=83=AD=E3=82=B0=E5=88=A4=E5=AE=9A=E3=81=A0=E3=81=A3=E3=81=9F?= =?UTF-8?q?=E5=A0=B4=E5=90=88=E3=81=A7=E3=82=82=E9=81=8E=E5=8E=BB=E3=83=AD?= =?UTF-8?q?=E3=82=B0=E6=89=B1=E3=81=84=E3=83=95=E3=83=A9=E3=82=B0=E3=82=92?= =?UTF-8?q?=E7=AB=8B=E3=81=A6=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 6b6a9ebc6..a5da8c28b 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -337,6 +337,10 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { } } elseif ($code == '304') { $this->isonline = true; + if ($apiThreadStatus == '3') { + // 過去ログ扱いフラグを立てる (idxline[12]に保存される) + $this->datochiok = true; + } return '304 Not Modified'; } elseif ($code == '403') { $this->getdat_error_msg_ht .= "<p>rep2 error: CloudFlareに接続を拒否されたため、スレッド取得に失敗しました。設定の変更を検討してください。</p>"; From bb12bcf2f9967ec0bd1cbf4e41bc51d9d2962e26 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Tue, 10 Jul 2018 03:30:59 +0900 Subject: [PATCH 329/339] =?UTF-8?q?fix=202ch.net=20=E3=81=A7=E3=82=82?= =?UTF-8?q?=E9=81=8E=E5=8E=BB=E3=83=AD=E3=82=B0=E5=80=89=E5=BA=AB=E3=82=92?= =?UTF-8?q?=E8=A6=8B=E3=81=AB=E8=A1=8C=E3=81=91=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=97=E3=81=9F=20=E9=81=B7=E7=A7=BB=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E3=81=8C=E5=A4=89=E3=82=8F=E3=81=A3=E3=81=9F=E3=81=AE?= =?UTF-8?q?=E3=81=A7=20Location=20=E3=83=98=E3=83=83=E3=83=80=E3=83=BC?= =?UTF-8?q?=E3=81=AE=E6=9C=89=E7=84=A1=E3=81=A7=E5=88=A4=E5=AE=9A=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index a5da8c28b..0e045addb 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -889,7 +889,7 @@ public function getReadCGIHtml($read_url) { if ($res_code == '200' || $res_code == '206') { // Partial Content $read_response_html = $response->getBody (); - } elseif ($res_code == '301' && P2HostMgr::isHost2ch ($this->host)) { + } elseif (!empty($response->getHeader ("Location")) && P2HostMgr::isHost2ch ($this->host)) { $read_response_html = $this->getReadCGIHtml($response->getHeader ("Location")); } elseif ($res_code == '302' || preg_match ($test403, $response->getBody (), $test403)) { $read_response_html = $response->getBody (); From c5cbc6387b69dd9c791252e089821a61d2bbed3a Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Tue, 16 Apr 2019 04:55:53 +0900 Subject: [PATCH 330/339] =?UTF-8?q?refind2ch=20=E3=81=AB=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=E3=80=80=20thx!=20http://egg.5ch.net/test/read.cgi/software/15?= =?UTF-8?q?40808160/423=20merged=20#21?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/refind2ch.php | 78 ++++++++++++++++++++++++++++++++++++++++++++++ rep2/tgrepc.php | 6 ++-- 2 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 rep2/refind2ch.php diff --git a/rep2/refind2ch.php b/rep2/refind2ch.php new file mode 100644 index 000000000..d56445ca3 --- /dev/null +++ b/rep2/refind2ch.php @@ -0,0 +1,78 @@ +<?php +function refind2ch_search ($query) +{ + parse_str($query, $query_arry); + + $q = $query_arry['q']; + + $base_url = 'https://refind2ch.org'; + $endpoint = $base_url . '/module/get_search'; + $referer = $base_url . '/search?q=' . urlencode($q); + + try { + $req = P2Commun::createHTTPRequest ($endpoint, HTTP_Request2::METHOD_POST); + $req->setHeader('Accept', 'application/json'); + $req->setHeader('Referer', $referer); + + $req->addPostParameter('q', $q); + $req->addPostParameter('p', 0); + $req->addPostParameter('pink', 0); + $req->addPostParameter('sort', 'false'); + $req->addPostParameter('alive', 'true'); + $req->addPostParameter('pl', 'false'); + $req->addPostParameter('b', 'false'); + + $response = P2Commun::getHTTPResponse($req); + + $code = $response->getStatus(); + if ($code != 200) { + p2die("HTTP Error - {$code}"); + } + + $body = $response->getBody(); + } catch (Exception $e) { + p2die($e->getMessage()); + } + + $threads = json_decode($body, true)['results']; + + $result = array(); + $boards = array(); + $hits = array(); + $names = array(); + + foreach ($threads as $n => $t) { + $host = parse_url($t['url'])['host']; + $bbs = explode('_', $t['board_key'])[1]; + + $result['threads'][$n] = new stdClass; + $result['threads'][$n]->title = $t['thread_title']; + $result['threads'][$n]->host = $host; + $result['threads'][$n]->bbs = $bbs; + $result['threads'][$n]->tkey = $t['created_at']; + $result['threads'][$n]->resnum = $t['res_num']; + $result['threads'][$n]->ita = $t['board_title']; + $result['threads'][$n]->dayres = $t['res_rate']; + + $bkey = md5($host.'-'.$bbs.'-'.$t['board_title']); + if (! isset($boards[$bkey])) { + $board = new stdClass; + $board->host = $host; + $board->bbs = $bbs; + $names[$bkey] = $board->name = $t['board_title']; + $hits[$bkey] = $board->hits = 1; + $boards[$bkey] = $board; + } else { + $hits[$bkey] = ++$boards[$bkey]->hits; + $names[$bkey] = $boards[$bkey]->name; + } + } + + $result['modified'] = $response->getHeader('Date'); + $result['profile']['regex'] = '/(' . $q .')/i'; + $result['profile']['hits'] = count($threads); + array_multisort($hits, SORT_DESC, $names, $boards); + $result['profile']['boards'] = $boards; + + return $result; +} diff --git a/rep2/tgrepc.php b/rep2/tgrepc.php index e1d4ac85b..3ab668323 100644 --- a/rep2/tgrepc.php +++ b/rep2/tgrepc.php @@ -367,8 +367,10 @@ function tgrep_search($query) } return $result; } else { - require_once './dig2ch.php'; - return dig2chsearch($query); // 追加 +// require_once './dig2ch.php'; +// return dig2chsearch($query); // 追加 + require_once './refind2ch.php'; + return refind2ch_search($query); // 追加 } } From 8ba2448b0661cf6ff756bea7ccdb28dcec5d30f7 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Tue, 16 Apr 2019 04:57:32 +0900 Subject: [PATCH 331/339] =?UTF-8?q?[=E4=BA=BA=E6=9F=B1]=E3=82=B5=E3=83=BC?= =?UTF-8?q?=E3=83=90=E3=83=BC=E5=81=B4=E3=81=AEBASIC=E8=AA=8D=E8=A8=BC?= =?UTF-8?q?=E3=81=AA=E3=81=A9=E3=81=AE=E5=A4=96=E9=83=A8=E8=AA=8D=E8=A8=BC?= =?UTF-8?q?=E3=81=A7rep2=E3=81=AE=E8=AA=8D=E8=A8=BC=E3=82=92=E8=A1=8C?= =?UTF-8?q?=E3=81=88=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= =?UTF-8?q?=E3=80=82=E3=81=AF=E3=81=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_admin.inc.php | 3 +++ lib/Login.php | 19 ++++--------------- lib/login_first.inc.php | 1 + 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/conf/conf_admin.inc.php b/conf/conf_admin.inc.php index d141a530d..5bb3dbd76 100644 --- a/conf/conf_admin.inc.php +++ b/conf/conf_admin.inc.php @@ -107,6 +107,9 @@ // 新着まとめ読みのキャッシュを残す数 (無効:0, 無限:-1) $_conf['matome_cache_max'] = 5; // (5) +// 外部認証を使用したログイン (する:1, しない:0) +$_conf['external_authentication'] = 0; // (0) + // }}} // ---------------------------------------------------------------------- // {{{ 携帯アクセスキー diff --git a/lib/Login.php b/lib/Login.php index a012b63d2..a8157e45a 100644 --- a/lib/Login.php +++ b/lib/Login.php @@ -59,6 +59,7 @@ public function setUser($user) */ public function setdownLoginUser() { + global $_conf; $login_user = null; // ユーザ名決定の優先順位に沿って @@ -86,21 +87,9 @@ public function setdownLoginUser() } elseif (isset($_SESSION['login_user']) && preg_match("/^[0-9A-Za-z_{$add_mail}]+\$/", $_SESSION['login_user'])) { $login_user = $_SESSION['login_user']; - /* - // Basic認証で指定 - } elseif (!empty($_REQUEST['basic'])) { - - if (isset($_SERVER['PHP_AUTH_USER']) && (preg_match("/^[0-9A-Za-z_{$add_mail}]+\$/", $_SERVER['PHP_AUTH_USER']))) { - $login_user = $_SERVER['PHP_AUTH_USER']; - - } else { - header('WWW-Authenticate: Basic realm="zone"'); - header('HTTP/1.0 401 Unauthorized'); - echo 'Login Failed. ユーザ認証に失敗しました。'; - exit; - } - */ - + // 外部認証で指定 + } elseif ($_conf['external_authentication'] && isset($_SERVER['REMOTE_USER']) && (preg_match("/^[0-9A-Za-z_{$add_mail}]+\$/", $_SERVER['REMOTE_USER']))) { + $login_user = $_SERVER['REMOTE_USER']; } return $login_user; diff --git a/lib/login_first.inc.php b/lib/login_first.inc.php index 17d8b3729..dcd439722 100644 --- a/lib/login_first.inc.php +++ b/lib/login_first.inc.php @@ -205,6 +205,7 @@ function printLoginFirst(Login $_login) //========================================================= // HTMLプリント //========================================================= + http_response_code (401); P2Util::header_nocache(); echo $_conf['doctype']; echo <<<EOP From e75815baeb76fa5155d481a96987a883926b70e3 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Tue, 31 Jul 2018 10:48:35 +0900 Subject: [PATCH 332/339] =?UTF-8?q?lastmodify.txt=20=E5=AF=BE=E5=BF=9C=20(?= =?UTF-8?q?base:=20http://egg.5ch.net/test/read.cgi/software/1512235557/86?= =?UTF-8?q?2=20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/LastmodifyTxt.php | 224 ++++++++++++++++++++++++++++++++++++++++++ lib/Thread.php | 25 ++++- lib/ThreadList.php | 32 ++++++ lib/startup.funcs.php | 1 + rep2/read.php | 11 +++ 5 files changed, 292 insertions(+), 1 deletion(-) create mode 100644 lib/LastmodifyTxt.php diff --git a/lib/LastmodifyTxt.php b/lib/LastmodifyTxt.php new file mode 100644 index 000000000..d2b4437f8 --- /dev/null +++ b/lib/LastmodifyTxt.php @@ -0,0 +1,224 @@ +<?php + +// {{{ LastmodifyTxt + +/** + * LastmodifyTxtクラス + */ +class LastmodifyTxt +{ + // {{{ properties + + public $host; + public $bbs; + public $lastmodify_url; + public $lastmodify_file; + public $lastmodify_lines; + public $storage; + + // }}} + // {{{ constructor + + /** + * コンストラクタ + */ + public function __construct($host, $bbs) + { + global $_conf; + $this->host = $host; + $this->bbs = $bbs; + $this->storage = 'file'; + + $this->lastmodify_file = P2Util::datDirOfHostBbs($host, $bbs) . 'lastmodify.txt'; + // 接続先が 2ch.net / 5ch / pink 以外の場合ダウンロードしない + if (!P2HostMgr::isHost2chs($this->host)) { + return ; + } + $this->lastmodify_url = 'https://' . $host . '/' . $bbs . '/lastmodify.txt'; + + // lastmodify.txtを ダウンロード&セットする + $this->dlAndSetLastmodify(); + } + + // }}} + // {{{ dlAndSetLastmodify() + + /** + * lastmodify.txtをダウンロード&セットする + * + * @return boolean セットできれば true、できなければ false + */ + public function dlAndSetLastmodify() + { + $cont = $this->downloadLastmodify(); + if ($this->setLastmodifyLines($cont)) { + return true; + } else { + return false; + } + } + + // }}} + // {{{ downloadLastmodify() + + /** + * lastmodify.txtをダウンロードする + * + * @return string lastmodify.txt の中身 + */ + public function downloadLastmodify() + { + global $_conf; + + if ($this->storage === 'file') { + FileCtl::mkdirFor($this->lastmodify_file); // 板ディレクトリが無ければ作る + + if (file_exists($this->lastmodify_file)) { + if (!empty($_REQUEST['norefresh']) || (empty($_REQUEST['refresh']) && isset($_REQUEST['word']))) { + return; // 更新しない場合は、その場で抜けてしまう + } elseif (!empty($GLOBALS['expack.subject.multi-threaded-download.done'])) { + return; // 並列ダウンロード済の場合も抜ける + } elseif (empty($_POST['newthread']) and $this->isLastmodifyTxtFresh()) { + return; // 新規スレ立て時でなく、更新が新しい場合も抜ける + } + $modified = http_date(filemtime($this->lastmodify_file)); + } else { + $modified = false; + } + } + + // DL + try { + $req = P2Commun::createHTTPRequest($this->lastmodify_url, HTTP_Request2::METHOD_GET); + $modified && $req->setHeader("If-Modified-Since", $modified); + + $response = P2Commun::getHTTPResponse($req); + + $code = $response->getStatus(); + if ($code == 302) { + // ホストの移転を追跡 + $new_host = P2HostMgr::getCurrentHost($this->host, $this->bbs); + if ($new_host != $this->host) { + $aNewLastmodifyTxt = new LastmodifyTxt($new_host, $this->bbs); + $body = $aNewLastmodifyTxt->downloadLastmodify(); + return $body; + } + } elseif ($code == 200 || $code == 206) { + //var_dump($response->getHeader()); + $body = $response->getBody(); + // したらば or be.2ch.net ならEUCをSJISに変換 + if (P2HostMgr::isHostJbbsShitaraba($this->host) || P2HostMgr::isHostBe2chs($this->host)) { + $body = mb_convert_encoding($body, 'CP932', 'CP51932'); + } + if (FileCtl::file_write_contents($this->lastmodify_file, $body) === false) { + p2die('cannot write file'); + } + } elseif ($code == 304) { + // touchすることで更新インターバルが効くので、しばらく再チェックされなくなる + // (変更がないのに修正時間を更新するのは、少し気が進まないが、ここでは特に問題ないだろう) + if ($this->storage === 'file') { + touch($this->lastmodify_file); + } + } else { + $error_msg = $code; + } + } catch (Exception $e) { + $error_msg = $e->getMessage(); + } + + if (isset($error_msg) && strlen($error_msg) > 0) { + $url_t = P2Util::throughIme($this->lastmodify_url); + $info_msg_ht = "<p class=\"info-msg\">Error: {$error_msg}<br>"; + $info_msg_ht .= "rep2 info: <a href=\"{$url_t}\"{$_conf['ext_win_target_at']}>{$this->lastmodify_url}</a> に接続できませんでした。</p>"; + P2Util::pushInfoHtml($info_msg_ht); + $body = ''; + } + + return $body; + } + + // }}} + // {{{ isLastmodifyTxtFresh() + + /** + * lastmodify.txt が新鮮なら true を返す + * + * @return boolean 新鮮なら true。そうでなければ false。 + */ + public function isLastmodifyTxtFresh() + { + global $_conf; + + // キャッシュがある場合 + if (file_exists($this->lastmodify_file)) { + // キャッシュの更新が指定時間以内なら + // clearstatcache(); + if (filemtime($this->lastmodify_file) > time() - $_conf['sb_dl_interval']) { + return true; + } + } + + return false; + } + + // }}} + // {{{ setLastmodifyLines() + + /** + * lastmodify.txt を読み込む + * + * 成功すれば、$this->lastmodify_lines がセットされる + * + * @param string $cont これは eashm 用に渡している。 + * @return boolean 実行成否 + */ + public function setLastmodifyLines($cont = '') + { + $this->lastmodify_lines = FileCtl::file_read_lines($this->lastmodify_file); + + if ($this->lastmodify_lines) { + return true; + } else { + return false; + } + } + + // }}} + // {{{ getThreadExtend() + + /** + * extdat を読み込む + * + * 成功すれば、$this->lastmodify_lines がセットされる + * + * @param string $cont これは eashm 用に渡している。 + * @return boolean 実行成否 + */ + public function getThreadExtend($key) + { + // 接続先が 2ch / 5ch / pink 以外の場合は '' を返す + if (!file_exists($this->lastmodify_file)) { + return ''; + } + + foreach($this->lastmodify_lines as $l){ + if (preg_match("/^($key\.(?:dat|cgi))<>(.+?)<>(\d+)<>(\d+)<>(\d+)<>(\d+)<>(.+?)<>(.+?)<>/", $l, $matches)) { break; } + } + return $matches[8]; + } + + // }}} +} + +// }}} + +/* + * Local Variables: + * mode: php + * coding: cp932 + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ +// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker: diff --git a/lib/Thread.php b/lib/Thread.php index 8e4657d5a..41f030b94 100644 --- a/lib/Thread.php +++ b/lib/Thread.php @@ -27,6 +27,9 @@ class Thread */ public $newline; // 次の新規取得レス番号 // idxline[9] 廃止予定。旧互換のため残してはいる。 + public $lastmodify; // lastmodify(http://info.5ch.net/index.php/Monazilla/develop/lastmodify.txt) + public $extdat; // VIPQ2 !extend(https://info.5ch.net/index.php/%E6%96%B0%E7%94%9FVIPQ2#.21extend:) + // ※hostとはいうものの、2ch外の場合は、host以下のディレクトリまで含まれていたりする。 public $host; // ex)pc.2ch.net // idxline[10] public $bbs; // ex)mac // idxline[11] @@ -404,7 +407,25 @@ public function getThreadInfoFromSubjectTxtLine($l) { //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection('getThreadInfoFromSubjectTxtLine()'); - if (preg_match('/^([0-9]+)\\.(?:dat|cgi)(?:,|<>)(.+) ?(?:\\(|()([0-9]+)(?:\\)|))/', $l, $matches)) { + if (preg_match('/^([0-9]+)\\.(?:dat|cgi)(?:,|<>)(.+) ?(?:\\(|()([0-9]+)(?:\\)|))$/', $l, $matches)) { + $this->isonline = true; + $this->key = $matches[1]; + $this->setTtitle(rtrim($matches[2])); + $this->rescount = (int)$matches[3]; + if ($this->readnum) { + $this->unum = $this->rescount - $this->readnum; + // machi bbs はsageでsubjectの更新が行われないそうなので調整しておく + if ($this->unum < 0) { + $this->unum = 0; + } + $this->nunum = $this->unum; + } + + //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('getThreadInfoFromSubjectTxtLine()'); + return true; + } + + if (preg_match('/^([0-9]+)\.(?:dat|cgi)<>(.+?)<>(\d+)<>(\d+)<>(\d+)<>(\d+)<>(.+?)<>(.+?)<>/', $l, $matches)) { $this->isonline = true; $this->key = $matches[1]; $this->setTtitle(rtrim($matches[2])); @@ -417,6 +438,8 @@ public function getThreadInfoFromSubjectTxtLine($l) } $this->nunum = $this->unum; } + $this->lastmodify = (int)$matches[6]; + $this->extdat = $matches[8]; //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('getThreadInfoFromSubjectTxtLine()'); return true; diff --git a/lib/ThreadList.php b/lib/ThreadList.php index 1856e1930..ccac14013 100644 --- a/lib/ThreadList.php +++ b/lib/ThreadList.php @@ -285,6 +285,38 @@ public function readList() default: if (!$this->spmode) { $aSubjectTxt = new SubjectTxt($this->host, $this->bbs); + if (P2HostMgr::isHost2chs($this->host)) { + // subject.txt を lastmodify.txt 形式に変換つつマージ + // 本来「subject.txt を lastmodify.txt 形式に変換」するのは SubjectTxt クラスの中で行ったほうが + // 将来的にいいかもしれないがとりあえずここでやる + foreach($aSubjectTxt->subject_lines as $l){ + if (!preg_match('/^(([0-9]+)\\.(?:dat|cgi))(?:,|<>)(.+) ?(?:\\(|()([0-9]+)(?:\\)|))/', $l, $matches)) { + continue; + } + + $threads[$matches[2]]['key'] = $matches[1]; // スレッドID + $threads[$matches[2]]['title'] = $matches[3]; // title + $threads[$matches[2]]['rc'] = $matches[4]; // rescount + + $threads[$matches[2]]['param'] = implode('<>',array_fill(0, 5, '')); // lastmodify.txt に含まれないスレを表示できるように + } + + $aLastmodify = new LastmodifyTxt($this->host, $this->bbs); + foreach($aLastmodify->lastmodify_lines as $l){ + if (!preg_match('/^(([0-9]+)\.(?:dat|cgi))<>(.+?)<>(\d+)<>(\d+)<>(\d+)<>(\d+)<>(.+?)<>(.+?)<>/', $l, $matches)) { + continue; + } + + $key = $matches[2]; + array_splice($matches, 0, 5); // subject.txt に含まれているデータは捨てる + $threads[$key]['param'] = implode('<>', $matches); // extend + } + + unset($aSubjectTxt->subject_lines); + foreach($threads as $l){ + $aSubjectTxt->subject_lines[] = implode('<>', $l) . "<>\n"; + } + } $lines = $aSubjectTxt->subject_lines; } } diff --git a/lib/startup.funcs.php b/lib/startup.funcs.php index e5c8c732f..eae0b9261 100644 --- a/lib/startup.funcs.php +++ b/lib/startup.funcs.php @@ -35,6 +35,7 @@ function p2_load_class($name) StrCtl | StrSjis | SubjectTxt | + LastmodifyTxt | Thread(?:List|Read)? | UA | UrlSafeBase64 | diff --git a/rep2/read.php b/rep2/read.php index cc269f4ab..5e0939882 100644 --- a/rep2/read.php +++ b/rep2/read.php @@ -440,6 +440,17 @@ } $newline = $aThread->readnum + 1; // $newlineは廃止予定だが、旧互換用に念のため +/* + + まだ仮の段階なのでコメント + // 接続先が 2ch / 5ch / pink の場合は idx に extdat を保存 + if (!P2HostMgr::isHost2chs($host)) { + $aLastmodify = new LastmodifyTxt($host, $bbs); + echo "extdat:[". $aLastmodify->getThreadExtend($key) ."]<br />\n"; + } + + */ + $sar = array($aThread->ttitle, $aThread->key, $idx_data[2], $aThread->rescount, '', $aThread->readnum, $idx_data[6], $idx_data[7], $idx_data[8], $newline, $idx_data[10], $idx_data[11], $aThread->datochiok); From 86778076389e823c000d9d2faf042e44a64147fe Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Thu, 9 Aug 2018 22:13:31 +0900 Subject: [PATCH 333/339] =?UTF-8?q?=E6=9D=BF=E5=90=8DLong=20=E3=81=AE?= =?UTF-8?q?=E5=8F=96=E5=BE=97=E6=96=B9=E6=B3=95=E3=81=AB=20SETTING.TXT=20?= =?UTF-8?q?=E3=81=8B=E3=82=89=E5=8F=96=E5=BE=97=E3=81=A7=E3=81=8D=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E8=BF=BD=E5=8A=A0=20(P2HostMgr=20?= =?UTF-8?q?=E3=81=AE=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89=E5=90=8D=E3=82=82?= =?UTF-8?q?=E5=A4=89=E6=9B=B4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2HostMgr.php | 4 ++-- lib/P2Util.php | 21 +++++++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/lib/P2HostMgr.php b/lib/P2HostMgr.php index 017dcd076..daacfb69f 100644 --- a/lib/P2HostMgr.php +++ b/lib/P2HostMgr.php @@ -439,7 +439,7 @@ static public function getCurrentHost($host, $bbs, $autosync = true) } // }}} - // {{{ getBbsName() + // {{{ getItaName() /** * 板名LONGを取得する @@ -448,7 +448,7 @@ static public function getCurrentHost($host, $bbs, $autosync = true) * @param string $bbs 板名 * @return string 板メニューに記載されている板名 */ - static public function getBbsName($host, $bbs) + static public function getItaName($host, $bbs) { // マッピング読み込み $map = self::_getMapping(); diff --git a/lib/P2Util.php b/lib/P2Util.php index 2d7fb98fd..cff369bc6 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -287,10 +287,9 @@ static public function getItaName($host, $bbs) return self::$_itaNames[$id]; } + // 板名Longを p2_setting から取得 $p2_setting_txt = self::idxDirOfHostBbs($host, $bbs) . 'p2_setting.txt'; - if (file_exists($p2_setting_txt)) { - $p2_setting_cont = FileCtl::file_read_contents($p2_setting_txt); if ($p2_setting_cont) { $p2_setting = unserialize($p2_setting_cont); @@ -301,9 +300,9 @@ static public function getItaName($host, $bbs) } } - // 板名Longの取得 + // 板名Longをマッピングデータから取得 if (!isset($p2_setting['itaj'])) { - $itaj = P2HostMgr::getBbsName($host, $bbs); + $itaj = P2HostMgr::getItaName($host, $bbs); if ($itaj != $bbs) { self::$_itaNames[$id] = $p2_setting['itaj'] = $itaj; @@ -316,6 +315,20 @@ static public function getItaName($host, $bbs) } } + // 板名Longを p2_kb_setting から取得 + $p2_setting_srd = self::datDirOfHostBbs($host, $bbs) . 'p2_kb_setting.srd'; + if (file_exists($p2_setting_srd)) { + $p2_setting_cont = file_get_contents($p2_setting_srd); + + if ($p2_setting_cont) { + $p2_setting = unserialize($p2_setting_cont); + if (isset($p2_setting['BBS_TITLE'])) { + $ita_names[$id] = $p2_setting['BBS_TITLE']; + return $ita_names[$id]; + } + } + } + return null; } From 2e9208e2201222c7e88f459984c7eec608b16613 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Thu, 9 Aug 2018 22:22:15 +0900 Subject: [PATCH 334/339] =?UTF-8?q?0ch=20=E3=81=AE=E6=90=BA=E5=B8=AF?= =?UTF-8?q?=E7=94=A8=E3=82=B9=E3=82=AF=E3=83=AA=E3=83=97=E3=83=88=E3=81=A7?= =?UTF-8?q?=E3=82=82=E5=8F=8D=E5=BF=9C=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index cff369bc6..3ef6225dd 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -1570,7 +1570,7 @@ static public function detectThread($url = null) $ls = (isset($matches[5]) && strlen($matches[5])) ? $matches[5] : ''; // 2ch or pink - http://choco.2ch.net/test/read.cgi/event/1027770702/ - } elseif (preg_match('<^https?://(.+)/test/read\\.(?:cgi|html|so|php) + } elseif (preg_match('<^https?://(.+)/test/(?:read|r)\\.(?:cgi|html|so|php) /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) { if (P2HostMgr::isRegisteredBbs($matches[1], $matches[2])) { $host = $matches[1]; From ce18f5791094466583bcc27aa315cd1452502459 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Thu, 9 Aug 2018 22:40:46 +0900 Subject: [PATCH 335/339] =?UTF-8?q?=E5=A4=96=E9=83=A8=E6=8E=B2=E7=A4=BA?= =?UTF-8?q?=E6=9D=BF=E8=AA=AD=E3=81=BF=E8=BE=BC=E3=81=BF=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=20=EF=BD=A5next2ch.net=20=EF=BD=A5super2ch.net=20=EF=BD=A5jikk?= =?UTF-8?q?yo.org?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2HostMgr.php | 78 +++++++++++++++++++++++++++++++++++++++++++++++ lib/P2Util.php | 9 ++++++ 2 files changed, 87 insertions(+) diff --git a/lib/P2HostMgr.php b/lib/P2HostMgr.php index daacfb69f..4f8886a5e 100644 --- a/lib/P2HostMgr.php +++ b/lib/P2HostMgr.php @@ -63,6 +63,21 @@ class P2HostMgr */ static private $_hostIsOpen2ch = array(); + /** + * isHostNext2ch()のキャッシュ + */ + static private $_hostIsNext2ch = array(); + + /** + * isHostSuper2ch()のキャッシュ + */ + static private $_hostIsSuper2ch = array(); + + /** + * isHostJikkyoOrg()のキャッシュ + */ + static private $_hostIsJikkyoOrg = array(); + /** * 板-ホストの対応表 * @@ -267,6 +282,48 @@ static public function isHostOpen2ch($host) return self::$_hostIsOpen2ch[$host]; } + // }}} + // {{{ isHostNext2ch() + + /** + * host が next2ch なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostNext2ch($host) + { + if ($host === 'next2ch.net') { + return true; + } + + if (!array_key_exists($host, self::$_hostIsNext2ch)) { + self::$_hostIsNext2ch[$host] = (bool)preg_match('/\\.(next2ch\\.net)$/', $host); + } + return self::$_hostIsNext2ch[$host]; + } + + // }}} + // {{{ isHostSuper2ch() + + /** + * host が super2ch なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostSuper2ch($host) + { + if ($host === 'super2ch.net') { + return true; + } + + if (!array_key_exists($host, self::$_hostIsSuper2ch)) { + self::$_hostIsSuper2ch[$host] = (bool)preg_match('/\\.(super2ch\\.net)$/', $host); + } + return self::$_hostIsSuper2ch[$host]; + } + // }}} // {{{ isHostMachiBbs() @@ -388,6 +445,27 @@ static public function isHostVip2ch($host) return self::$_hostIsVip2ch[$host]; } + // }}} + // {{{ isHostJikkyoOrg() + + /** + * host が jikkyo.org なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHostJikkyoOrg($host) + { + if ($host === 'jikkyo.org' || $host === 'livech.sakura.ne.jp') { + return true; + } + + if (!array_key_exists($host, self::$_hostIsJikkyoOrg)) { + self::$_hostIsJikkyoOrg[$host] = (bool)preg_match('/\\.(jikkyo\\.org)$/', $host); + } + return self::$_hostIsJikkyoOrg[$host]; + } + // }}} // {{{ isUrlWikipediaJa() diff --git a/lib/P2Util.php b/lib/P2Util.php index 3ef6225dd..60a53fedd 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -373,6 +373,12 @@ static private function _p2DirOfHost($base_dir, $host, $dir_sep = true) //旧式のディレクトリが無い=無い新規インストール時or鯖移転のため、ディレクトリの指定を変更 $host_dir = $base_dir . DIRECTORY_SEPARATOR . '2channel_sc'; } + // next2ch.net + } elseif (P2HostMgr::isHostNext2ch($host)) { + $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'next2ch.net'; + // super2ch.net + } elseif (P2HostMgr::isHostSuper2ch($host)) { + $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'super2ch.net'; // machibbs.com } elseif (P2HostMgr::isHostMachiBbs($host)) { $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'machibbs.com'; @@ -388,6 +394,9 @@ static private function _p2DirOfHost($base_dir, $host, $dir_sep = true) } else { $host_dir = $base_dir . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $host); } + // jikkyo.org + } elseif (P2HostMgr::isHostJikkyoOrg($host)) { + $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'jikkyo.org'; // vip.2ch.com } elseif (P2HostMgr::isHostVip2ch($host)) { $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'ex14.vip2ch.com'; From 3169936cbde0a70ef2a16e708238d132423cb129 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Tue, 14 Aug 2018 23:25:03 +0900 Subject: [PATCH 336/339] update README --- doc/README-killer.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/README-killer.txt b/doc/README-killer.txt index 7590d2f9b..81b073ae7 100644 --- a/doc/README-killer.txt +++ b/doc/README-killer.txt @@ -2,10 +2,18 @@ rep2 讖溯ス諡。蠑オ繝代ャ繧ッ 蜈ィ驛ィ蜈・繧(expack all in one) by killer 笳丈ス包シ + rep2-expack_allinone https://github.com/open774/p2-php + 荳願ィ倥d繧ケ繝ャ縺ォ荳翫£繧峨l縺滉ソョ豁」繧貞叙繧願セシ縺ソ縺、縺、豌励↓縺ェ縺」縺溘→縺薙m繧偵ざ繝九Ι繧エ繝九Ι縺吶k繝舌シ繧ク繝ァ繝ウ縺ァ縺吶 +笳丞虚菴懃腸蠅 + + Windows 縺ョ PHP5.6 + Apache 縺ァ蜍穂ス懃「コ隱阪@縺ヲ縺縺セ縺吶 + 縺檎ェ∫┯ス、迺ー蠅繧 PHP7 邉サ縺ォ繧ャ繝ゥ繝縺ィ螟峨∴繧九%縺ィ縺後≠繧翫∪縺呻ス。 + + 笳丞崎イャ 譛ャ繧ス繝輔ヨ繧ヲ繧ァ繧「縺ョ菴ソ逕ィ縺ォ繧医j逶エ謗・縺翫h縺ウ髢捺磁逧縺ォ逕溘§縺溘>縺九↑繧区錐螳ウ繧り」懷─縺縺溘@縺セ縺帙s縲 @@ -29,3 +37,4 @@ rep2 讖溯ス諡。蠑オ繝代ャ繧ッ 蜈ィ驛ィ蜈・繧(expack all in one) by killer 笳修hangeLog https://github.com/killer4989/p2-php/commits/master 縺ォ譖ク縺縺ヲ縺ゅk繧ウ繝溘ャ繝医Ο繧ー縺ァ縺ゥ縺縺(スコセ + From 135b666b06d780474811827b075530e09d163bbd Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Wed, 15 Aug 2018 16:37:49 +0900 Subject: [PATCH 337/339] =?UTF-8?q?fix=20http=E3=81=8C=E7=84=A1=E3=81=8F?= =?UTF-8?q?=E3=81=A6=E3=82=82cURLMulti=E3=81=8C=E4=BD=BF=E3=81=88=E3=82=8B?= =?UTF-8?q?=E3=81=AF=E3=81=9A=E3=81=AA=E3=81=AE=E3=81=A7=E3=83=81=E3=82=A7?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=82=92=E5=A4=89=E6=9B=B4=20=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E3=81=AA=E3=82=AF=E3=83=A9=E3=82=B9=E3=81=8C=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=83=9D=E3=83=BC=E3=83=88=E3=81=95=E3=82=8C=E3=81=A6?= =?UTF-8?q?=E3=81=AA=E3=81=8B=E3=81=A3=E3=81=9F=E3=81=AE=E3=81=A7=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/fetch-subject-txt.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/fetch-subject-txt.php b/scripts/fetch-subject-txt.php index 5e8793e69..687a60d79 100644 --- a/scripts/fetch-subject-txt.php +++ b/scripts/fetch-subject-txt.php @@ -13,7 +13,7 @@ define('P2_FETCH_SUBJECT_TXT_DEBUG', 0); define('P2_FETCH_SUBJECT_TXT_DEBUG_OUTPUT_FILE', '/tmp/p2_fetch_subject_txt.log'); -require __DIR__ . '/../conf/conf.inc.php'; +require __DIR__ . '/../init.php'; if (!$_conf['expack.use_curl_multi'] && !$_conf['expack.use_pecl_http']) { fwrite(STDERR, 'Setting of expack.use_curl_multi or expack.use_pecl_http is required.' . PHP_EOL); From e1811d49a13a9bf49833d0ab62afcc411f98a329 Mon Sep 17 00:00:00 2001 From: killer4989 <killer4989@users.noreply.github.com> Date: Mon, 20 Aug 2018 20:58:07 +0900 Subject: [PATCH 338/339] =?UTF-8?q?extdat=20=E3=81=AE=E3=83=91=E3=83=A9?= =?UTF-8?q?=E3=83=A1=E3=83=BC=E3=82=BF=E3=81=A7=E3=82=B9=E3=83=AC=E3=83=83?= =?UTF-8?q?=E3=83=89=E3=82=92=E3=81=82=E3=81=BC=E3=83=BC=E3=82=93=E5=87=BA?= =?UTF-8?q?=E6=9D=A5=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/subject.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rep2/subject.php b/rep2/subject.php index a1fee00ba..1075fbf22 100644 --- a/rep2/subject.php +++ b/rep2/subject.php @@ -1150,6 +1150,10 @@ function checkThreadTitleAborn(array &$aborn_threads, Thread $aThread) updateThreadTitleAborn($aborn_threads, $k); return true; } + if (isset($aThread->extdat) && $re_method($v['word'], $aThread->extdat)) { + updateThreadTitleAborn($aborn_threads, $k); + return true; + } // 大文字小文字を無視 } elseif ($v['ignorecase']) { if (stripos($subject, $v['word']) !== false) { From f0a58fdabdfdb1ba55cb47af43538e7fdd22777c Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Tue, 16 Apr 2019 22:00:55 +0900 Subject: [PATCH 339/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=E7=94=A8?= =?UTF-8?q?=E3=83=A1=E3=83=8B=E3=83=A5=E3=83=BC=E3=81=AB=E3=80=8C=E3=82=B9?= =?UTF-8?q?=E3=83=ACURL=E3=82=92=E5=85=A5=E5=8A=9B=E3=80=8D=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=20PC=E3=81=AE=E3=83=88=E3=83=83=E3=83=97?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=E3=82=92=E5=91=BC=E3=81=B3=E5=87=BA=E3=81=99?= =?UTF-8?q?=E3=81=A0=E3=81=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/menu_i.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rep2/menu_i.php b/rep2/menu_i.php index 9fa915a8c..071a50b55 100644 --- a/rep2/menu_i.php +++ b/rep2/menu_i.php @@ -175,7 +175,7 @@ <li><a href="iv2.php?reset_filter=1" target="_self">画像キャッシュ一覧</a></li> <?php } ?> <li><a href="#tgrep">スレッド検索</a></li> - + <li><a href="first_cont.php" target="_self">スレURLを入力</a></li> <li class="group">管理</li> <li><a href="editpref.php" target="_self">設定管理</a></li> <li><a href="setting.php" target="_self">ログイン管理</a></li>
    ', $table); @@ -1536,7 +1542,7 @@ static public function mkTrip($key) //if (strlen($key) > 8) { // return self::mkTrip1(substr($key, 0, 8)); //} else { - return self::mkTrip1($key); + return self::mkTrip1($key); //} } @@ -1747,75 +1753,66 @@ static public function detectThread($url = null) // まちBBS - http://kanto.machi.to/bbs/read.cgi/kanto/1241815559/ if (preg_match('<^http://(\\w+\\.machi(?:bbs\\.com|\\.to))/bbs/read\\.cgi - /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) - { + /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) { $host = $matches[1]; $bbs = $matches[2]; $key = $matches[3]; $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; - // まちBBS(ドメインのみ) - http://machi.to/bbs/read.cgi/kanto/1241815559/ + // まちBBS(ドメインのみ) - http://machi.to/bbs/read.cgi/kanto/1241815559/ } elseif (preg_match('<^http?://(machi\\.to)/bbs/read\\.cgi - /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) - { + /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) { $host = $matches[1]; $bbs = $matches[2]; $key = $matches[3]; $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; - - // したらばJBBS - http://jbbs.livedoor.com/bbs/read.cgi/computer/2999/1081177036/-100 + + // したらばJBBS - http://jbbs.livedoor.com/bbs/read.cgi/computer/2999/1081177036/-100 } elseif (preg_match('<^http://(jbbs\\.(?:livedoor\\.(?:jp|com)|shitaraba\\.(?:net|com)))/(?:bbs|bbs/lite)/read\\.cgi - /(\\w+)/(\\d+)/(\\d+)/((?:\\d+)?-(?:\\d+)?)?[^"]*>x', $nama_url, $matches)) - { + /(\\w+)/(\\d+)/(\\d+)/((?:\\d+)?-(?:\\d+)?)?[^"]*>x', $nama_url, $matches)) { $host = $matches[1] . '/' . $matches[2]; $bbs = $matches[3]; $key = $matches[4]; $ls = isset($matches[5]) ? $matches[5] : ''; - // 旧式まち&したらばJBBS - http://kanto.machibbs.com/bbs/read.pl?BBS=kana&KEY=1034515019 - } elseif (preg_match('<^http://(\\w+\\.machi(?:bbs\\.com|\\.to))/bbs/read\\.(?:pl|cgi)\\?(.+)>' , - $nama_url, $matches)) - { + // 旧式まち&したらばJBBS - http://kanto.machibbs.com/bbs/read.pl?BBS=kana&KEY=1034515019 + } elseif (preg_match('<^http://(\\w+\\.machi(?:bbs\\.com|\\.to))/bbs/read\\.(?:pl|cgi)\\?(.+)>', + $nama_url, $matches)) { $host = $matches[1]; list($bbs, $key, $ls) = self::parseMachiQuery($matches[2]); } elseif (preg_match('<^http://((jbbs\\.(?:livedoor\\.(?:jp|com)|shitaraba\\.(?:net|com)))(?:/(\\w+))?)/bbs/read\\.(?:pl|cgi)\\?(.+)>', - $nama_url, $matches)) - { + $nama_url, $matches)) { $host = $matches[1]; list($bbs, $key, $ls) = self::parseMachiQuery($matches[4]); - // vip2ch.com - http://ex14.vip2ch.com/test/read.cgi/news4ssnip/1450958506/ - } elseif (preg_match('<^https?://((\\w+)\\.vip2ch\\.com)/(?:test|i)/(?:read\\.(?:cgi|html|so)|mread\\.cgi|read)/(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) - { + // vip2ch.com - http://ex14.vip2ch.com/test/read.cgi/news4ssnip/1450958506/ + } elseif (preg_match('<^https?://((\\w+)\\.vip2ch\\.com)/(?:test|i)/(?:read\\.(?:cgi|html|so)|mread\\.cgi|read)/(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) { $host = $matches[1]; $bbs = $matches[3]; $key = $matches[4]; $ls = (isset($matches[5]) && strlen($matches[5])) ? $matches[5] : ''; - // vip2ch.com - http://ex14.vip2ch.com/i/responce.html?bbs=news4ssnip&dat=1450958506 - } elseif (preg_match('<^https?://((\\w+)\\.vip2ch\\.com)/i/(?:responce|responce_r18)\\.html\\?bbs=(\\w+)&dat=([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) - { + // vip2ch.com - http://ex14.vip2ch.com/i/responce.html?bbs=news4ssnip&dat=1450958506 + } elseif (preg_match('<^https?://((\\w+)\\.vip2ch\\.com)/i/(?:responce|responce_r18)\\.html\\?bbs=(\\w+)&dat=([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) { $host = $matches[1]; $bbs = $matches[3]; $key = $matches[4]; $ls = (isset($matches[5]) && strlen($matches[5])) ? $matches[5] : ''; - // 2ch or pink - http://choco.2ch.net/test/read.cgi/event/1027770702/ + // 2ch or pink - http://choco.2ch.net/test/read.cgi/event/1027770702/ } elseif (preg_match('<^https?://(.+)/test/read\\.(?:cgi|html|so) - /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) - { - if(BbsMap::isRegisteredBbs($matches[1] ,$matches[2])) { + /(\\w+)/([0-9]+)(?:/([^/]*))?>x', $nama_url, $matches)) { + if (BbsMap::isRegisteredBbs($matches[1], $matches[2])) { $host = $matches[1]; $bbs = $matches[2]; $key = $matches[3]; $ls = (isset($matches[4]) && strlen($matches[4])) ? $matches[4] : ''; } - // 2ch or pink by ula.cc(bintan / bekkanko) - http://choco.2ch.net/test/read.cgi/event/1027770702/ + // 2ch or pink by ula.cc(bintan / bekkanko) - http://choco.2ch.net/test/read.cgi/event/1027770702/ } elseif (preg_match('<^https?://(?:(?:bintan|same)\\.ula\\.cc|ula\\.2ch\\.net)/test/(?:read\\.(?:cgi|html|so)|r\\.so) - /(.+)/(\\w+)/([0-9]+)(?:/([^/]*))>x', $nama_url, $matches)) - { + /(.+)/(\\w+)/([0-9]+)(?:/([^/]*))>x', $nama_url, $matches)) { $host = $matches[1]; $bbs = $matches[2]; $key = $matches[3]; @@ -1823,9 +1820,8 @@ static public function detectThread($url = null) // 2ch or pink 過去ログhtml - http://pc.2ch.net/mac/kako/1015/10153/1015358199.html } elseif (preg_match('<^(https?://(.+)(?:/[^/]+)?/(\\w+) - /kako/\\d+(?:/\\d+)?/(\\d+)).html>x', $nama_url, $matches)) - { - if(BbsMap::isRegisteredBbs($matches[2] ,$matches[3])) { + /kako/\\d+(?:/\\d+)?/(\\d+)).html>x', $nama_url, $matches)) { + if (BbsMap::isRegisteredBbs($matches[2], $matches[3])) { $host = $matches[2]; $bbs = $matches[3]; $key = $matches[4]; @@ -1842,9 +1838,9 @@ static public function detectThread($url = null) } else { $host = isset($_REQUEST['host']) ? $_REQUEST['host'] : null; // "pc.2ch.net" - $bbs = isset($_REQUEST['bbs']) ? $_REQUEST['bbs'] : null; // "php" - $key = isset($_REQUEST['key']) ? $_REQUEST['key'] : null; // "1022999539" - $ls = isset($_REQUEST['ls']) ? $_REQUEST['ls'] : null; // "all" + $bbs = isset($_REQUEST['bbs']) ? $_REQUEST['bbs'] : null; // "php" + $key = isset($_REQUEST['key']) ? $_REQUEST['key'] : null; // "1022999539" + $ls = isset($_REQUEST['ls']) ? $_REQUEST['ls'] : null; // "all" } return array($nama_url, $host, $bbs, $key, $ls); @@ -1856,7 +1852,7 @@ static public function detectThread($url = null) /** * 旧式まち&したらばJBBSのスレッドを指定するQUERY_STRINGを解析する * - * @param string $query + * @param string $query * @return array */ static public function parseMachiQuery($query) @@ -1897,9 +1893,9 @@ static public function parseMachiQuery($query) /** * HTMLからDOMDocumentを生成する * - * @param string $html - * @param string $charset - * @param bool $report_error + * @param string $html + * @param string $charset + * @param bool $report_error * @return DOMDocument */ static public function getHtmlDom($html, $charset = null, $report_error = true) @@ -1951,7 +1947,7 @@ static public function getHostGroupName($host) } elseif (self::isHostJbbsShitaraba($host)) { return 'shitaraba'; } elseif (self::isHostVip2ch($host)) { - return 'vip2ch'; + return 'vip2ch'; } else { return $host; } @@ -1964,7 +1960,7 @@ static public function getHostGroupName($host) * preg_replace_callback()のコールバック関数として * マッチ箇所全体にrawurlencode()をかける * - * @param array $m + * @param array $m * @return string */ static public function rawurlencodeCallback(array $m) @@ -2039,9 +2035,9 @@ static public function getBe2chCodeByMailPass($mail, $pass) } try { - $req = P2Commun::createHTTPRequest ('http://be.2ch.net/index.php', HTTP_Request2::METHOD_POST); + $req = P2Commun::createHTTPRequest('http://be.2ch.net/index.php', HTTP_Request2::METHOD_POST); - $req->setHeader('User-Agent', P2Commun::getP2UA(true,true)); + $req->setHeader('User-Agent', P2Commun::getP2UA(true, true)); $req->addPostParameter('mail', $mail); $req->addPostParameter('pass', $pass); @@ -2074,6 +2070,7 @@ static public function getBe2chCodeByMailPass($mail, $pass) } // }}} + /** * +Wiki:プロフィールIDからBEIDを計算する * @@ -2083,7 +2080,7 @@ public static function calcBeId($prof_id) { for ($y = 2; $y <= 9; $y++) { for ($x = 2; $x <= 9; $x++) { - $id = (($prof_id - $x*10.0 - $y)/100.0 + $x - $y - 5.0)/(3.0 * $x * $y); + $id = (($prof_id - $x * 10.0 - $y) / 100.0 + $x - $y - 5.0) / (3.0 * $x * $y); if ($id == floor($id)) { return $id; } From 475f7f5d856ab757fab528c81d56e5831dfdd443 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 1 Oct 2017 23:37:38 +0900 Subject: [PATCH 237/339] =?UTF-8?q?API=E3=81=AE=E6=8E=A5=E7=B6=9A=E5=85=88?= =?UTF-8?q?=E3=82=925ch=E3=81=AB=E5=88=87=E3=82=8A=E6=9B=BF=E3=81=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 4 ++-- lib/auth2chapi.inc.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 999d091df..dbdb51b81 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -140,9 +140,9 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { // $url="http://news2.2ch.net/test/read.cgi?bbs=newsplus&key=1038486598"; if($_conf['2chapi_ssl.read']) { - $url = 'https://api.2ch.net/v1/'; + $url = 'https://api.5ch.net/v1/'; } else { - $url = 'http://api.2ch.net/v1/'; + $url = 'http://api.5ch.net/v1/'; } $url .= $serverName[0] . '/' . $this->bbs . '/' . $this->key; diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index ae414b1aa..3edb14cc7 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -17,9 +17,9 @@ function authenticate_2chapi() if ($_conf['2chapi_ssl.auth']) { - $url = 'https://api.2ch.net/v1/auth/'; + $url = 'https://api.5ch.net/v1/auth/'; } else { - $url = 'http://api.2ch.net/v1/auth/'; + $url = 'http://api.5ch.net/v1/auth/'; } $CT = time(); From 25fe9ffcd4d3d52da0b5133ec3894da476e1e298 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Sun, 1 Oct 2017 23:43:40 +0900 Subject: [PATCH 238/339] =?UTF-8?q?Revert=20"API=E3=81=AE=E6=8E=A5?= =?UTF-8?q?=E7=B6=9A=E5=85=88=E3=82=925ch=E3=81=AB=E5=88=87=E3=82=8A?= =?UTF-8?q?=E6=9B=BF=E3=81=88"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 475f7f5d856ab757fab528c81d56e5831dfdd443. --- lib/ThreadRead.php | 4 ++-- lib/auth2chapi.inc.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index dbdb51b81..999d091df 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -140,9 +140,9 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { // $url="http://news2.2ch.net/test/read.cgi?bbs=newsplus&key=1038486598"; if($_conf['2chapi_ssl.read']) { - $url = 'https://api.5ch.net/v1/'; + $url = 'https://api.2ch.net/v1/'; } else { - $url = 'http://api.5ch.net/v1/'; + $url = 'http://api.2ch.net/v1/'; } $url .= $serverName[0] . '/' . $this->bbs . '/' . $this->key; diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index 3edb14cc7..ae414b1aa 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -17,9 +17,9 @@ function authenticate_2chapi() if ($_conf['2chapi_ssl.auth']) { - $url = 'https://api.5ch.net/v1/auth/'; + $url = 'https://api.2ch.net/v1/auth/'; } else { - $url = 'http://api.5ch.net/v1/auth/'; + $url = 'http://api.2ch.net/v1/auth/'; } $CT = time(); From fc775fea65fb2a6d831d57b9897297bf07772c70 Mon Sep 17 00:00:00 2001 From: 2ch774 <2ch774@users.noreply.github.com> Date: Tue, 3 Oct 2017 00:08:34 +0900 Subject: [PATCH 239/339] =?UTF-8?q?API=E3=81=AE=E6=8E=A5=E7=B6=9A=E5=85=88?= =?UTF-8?q?=E3=82=925ch=E3=81=AB=E5=A4=89=E6=9B=B4=205ch=E5=81=B4=E3=81=AE?= =?UTF-8?q?CloudFlare=E3=81=AE=E5=88=A4=E5=AE=9A=E3=81=8C=E5=8E=B3?= =?UTF-8?q?=E3=81=97=E3=81=8F=E3=81=AA=E3=81=A3=E3=81=A6=E3=81=84=E3=82=8B?= =?UTF-8?q?=E3=81=9F=E3=82=81=E7=92=B0=E5=A2=83=E3=81=AB=E3=82=88=E3=81=A3?= =?UTF-8?q?=E3=81=A6=E3=81=AF=E8=A8=AD=E5=AE=9A=E8=A6=8B=E7=9B=B4=E3=81=97?= =?UTF-8?q?=E3=81=8C=E5=BF=85=E8=A6=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 11 +++++++++-- lib/auth2chapi.inc.php | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 999d091df..87d2a251c 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -140,9 +140,9 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { // $url="http://news2.2ch.net/test/read.cgi?bbs=newsplus&key=1038486598"; if($_conf['2chapi_ssl.read']) { - $url = 'https://api.2ch.net/v1/'; + $url = 'https://api.5ch.net/v1/'; } else { - $url = 'http://api.2ch.net/v1/'; + $url = 'http://api.5ch.net/v1/'; } $url .= $serverName[0] . '/' . $this->bbs . '/' . $this->key; @@ -308,6 +308,13 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { } elseif ($code == '304') { $this->isonline = true; return '304 Not Modified'; + } elseif ($code == '403') { + $this->getdat_error_msg_ht .= "

    rep2 error: CloudFlareに接続を拒否されたため、スレッド取得に失敗しました。設定の変更を検討してください。

    "; + $this->getdat_error_msg_ht .= "

    ".$response->getBody ()."

    "; + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&relogin2chapi=true\">APIで再取得を試みる]"; + $this->getdat_error_msg_ht .= " [host}&bbs={$this->bbs}&key={$this->key}&ls={$this->ls}&olddat=true\">旧datで再取得を試みる]"; + $this->diedat = true; + return false; } elseif ($code == '416') { // Requested Range Not Satisfiable // echo "あぼーん検出"; $this->onbytes = 0; diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index ae414b1aa..3edb14cc7 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -17,9 +17,9 @@ function authenticate_2chapi() if ($_conf['2chapi_ssl.auth']) { - $url = 'https://api.2ch.net/v1/auth/'; + $url = 'https://api.5ch.net/v1/auth/'; } else { - $url = 'http://api.2ch.net/v1/auth/'; + $url = 'http://api.5ch.net/v1/auth/'; } $CT = time(); From 3947ba5e5baa4f5f424f26b346e0ddf066085193 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Tue, 3 Oct 2017 22:35:34 +0900 Subject: [PATCH 240/339] 2ch774 to open774 --- conf/conf.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 998f34da1..7e8075e3c 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -74,12 +74,12 @@ function p2_init() $_conf['p2web_url'] = 'http://akid.s17.xrea.com/'; $_conf['p2ime_url'] = 'http://akid.s17.xrea.com/p2ime.php'; // $_conf['favrank_url'] = 'http://akid.s17.xrea.com/favrank/favrank.php'; - $_conf['expack.web_url'] = 'http://2ch774.github.io/p2-php/'; + $_conf['expack.web_url'] = 'http://open774.github.io/p2-php/'; $_conf['expack.download_url'] = 'https://github.com/2ch774/p2-php/releases'; $_conf['expack.history_url'] = 'https://github.com/2ch774/p2-php/blob/master/doc/README-774.txt'; $_conf['expack.tgrep_url'] = 'http://page2.xrea.jp/tgrep/search'; $_conf['test.dig2ch_url'] = 'http://dig.2ch.net/'; - $_conf['expack.gate_php'] = '//2ch774.github.io/p2-php/gate.html'; + $_conf['expack.gate_php'] = '//open774.github.io/p2-php/gate.html'; $_conf['menu_php'] = 'menu.php'; $_conf['subject_php'] = 'subject.php'; $_conf['read_php'] = 'read.php'; From a2c7a427f0b4ea3a52c5180d0055c8092cd2212f Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 4 Oct 2017 01:33:36 +0900 Subject: [PATCH 241/339] =?UTF-8?q?2ch(sc)=E3=81=A8open2ch=E3=81=AEDAT?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E3=83=87=E3=82=A3=E3=83=AC=E3=82=AF=E3=83=88?= =?UTF-8?q?=E3=83=AA=E5=A4=89=E6=9B=B4=20=E3=81=93=E3=82=8C=E3=81=AB?= =?UTF-8?q?=E3=82=88=E3=82=8A=E9=AF=96=E7=A7=BB=E8=BB=A2=E3=81=AB=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C=E5=8F=AF=E8=83=BD=E3=81=AB=E3=81=AA=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/lib/P2Util.php b/lib/P2Util.php index 05fb850b0..927979f02 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -63,6 +63,11 @@ class P2Util */ static private $_hostIs2chSc = array(); + /** + * isHostOpen2ch()のキャッシュ + */ + static private $_hostIsOpen2ch = array(); + /** * P2Imeオブジェクト * @@ -381,7 +386,21 @@ static private function _p2DirOfHost($base_dir, $host, $dir_sep = true) // 2channel or bbspink if (self::isHost2chs($host)) { $host_dir = $base_dir . DIRECTORY_SEPARATOR . '2channel'; + } elseif (self::isHostOpen2ch($host)) { + //互換性維持のため旧式のディレクトリを指定 + $host_dir = $base_dir . DIRECTORY_SEPARATOR . rawurlencode($host); + if (!file_exists($host_dir)) { + //旧式のディレクトリが無い=無い新規インストール時or鯖移転のため、ディレクトリの指定を変更 + $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'open2ch'; + } + } elseif (self::isHost2chSc($host)) { + //互換性維持のため旧式のディレクトリを指定 + $host_dir = $base_dir . DIRECTORY_SEPARATOR . rawurlencode($host); + if (!file_exists($host_dir)) { + //旧式のディレクトリが無い=無い新規インストール時or鯖移転のため、ディレクトリの指定を変更 + $host_dir = $base_dir . DIRECTORY_SEPARATOR . '2channel_sc'; + } // machibbs.com } elseif (self::isHostMachiBbs($host)) { $host_dir = $base_dir . DIRECTORY_SEPARATOR . 'machibbs.com'; @@ -989,6 +1008,25 @@ static public function isHost2chSc($host) } // }}} + // {{{ isHostOpen2ch() + + /** + * host が おーぷん2ch なら true を返す + * + * @param string $host + * @return boolean + */ + static public function isHostOpen2ch($host) + { + if (!array_key_exists($host, self::$_hostIsOpen2ch)) { + self::$_hostIsOpen2ch[$host] = (bool)preg_match('/\\.(open2ch\\.net)$/', $host); + } + return self::$_hostIsOpen2ch[$host]; + } + + // }}} + + // {{{ header_nocache() /** From ece627293b3288bad9d9b0a3457c1bb9d3c136a5 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 4 Oct 2017 15:10:59 +0900 Subject: [PATCH 242/339] =?UTF-8?q?http=5Fbuild=5Furl=E3=82=92=E5=B0=8E?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 2 ++ lib/P2Util.php | 48 ++++++++++++++++++++++++++++++++++++------ lib/ThreadRead.php | 12 +++++------ lib/auth2chapi.inc.php | 10 ++++----- 4 files changed, 53 insertions(+), 19 deletions(-) diff --git a/composer.json b/composer.json index 2818ed210..c8534cbaa 100644 --- a/composer.json +++ b/composer.json @@ -37,6 +37,8 @@ "pear-pear.php.net/xml_rss": "1.0.2", "symfony/console": "2.2.*", "symfony/yaml": "2.2.*", + "jakeasmith/http_build_url": "1.0.*", "dropbox/dropbox-sdk": "dev-master" + } } diff --git a/lib/P2Util.php b/lib/P2Util.php index 927979f02..835a57bb8 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -24,9 +24,14 @@ class P2Util static private $_hostDirs = array(); /** - * isHost2chs() のキャッシュ + * isHost2ch() のキャッシュ */ - static private $_hostIs2chs = array(); + static private $_hostIs2ch = array(); + + /** + * isHost5ch() のキャッシュ + */ + static private $_hostIs5ch = array(); /** * isHostBe2chNet() のキャッシュ @@ -804,17 +809,48 @@ static public function isHostExample($host) // {{{ isHost2chs() /** - * host が 2ch or bbspink なら true を返す + * host が 2ch or 5ch or bbspink なら true を返す * * @param string $host * @return bool */ static public function isHost2chs($host) { - if (!array_key_exists($host, self::$_hostIs2chs)) { - self::$_hostIs2chs[$host] = (bool)preg_match('<^\\w+\\.(?:2ch\\.net|5ch\\.net|bbspink\\.com)$>', $host); + return self::isHost2ch($host)||self::isHost5ch($host)||self::isHostBbsPink($host); + } + + // }}} + // {{{ isHost2ch() + + /** + * host が 2ch なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHost2ch($host) + { + if (!array_key_exists($host, self::$_hostIs2ch)) { + self::$_hostIs2ch[$host] = (bool)preg_match('<^\\w+\\.(?:2ch\\.net)$>', $host); + } + return self::$_hostIs2ch[$host]; + } + + // }}} + // {{{ isHost5ch() + + /** + * host が 5ch なら true を返す + * + * @param string $host + * @return bool + */ + static public function isHost5ch($host) + { + if (!array_key_exists($host, self::$_hostIs5ch)) { + self::$_hostIs5ch[$host] = (bool)preg_match('<^\\w+\\.(?:5ch\\.net)$>', $host); } - return self::$_hostIs2chs[$host]; + return self::$_hostIs5ch[$host]; } // }}} diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 87d2a251c..8433f1a95 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -139,13 +139,11 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { // $url = "http://{$this->host}/{$this->bbs}/dat/{$this->key}.dat"; // $url="http://news2.2ch.net/test/read.cgi?bbs=newsplus&key=1038486598"; - if($_conf['2chapi_ssl.read']) { - $url = 'https://api.5ch.net/v1/'; - } else { - $url = 'http://api.5ch.net/v1/'; - } + $url= http_build_url(array( + "scheme" => $_conf['2chapi_ssl.read']?"https":"http", + "host" => P2Util::isHost5ch($this->host)?"api.5ch.net":"api.2ch.net", + "path" => "v1/".$serverName[0] . '/' . $this->bbs . '/' . $this->key)); - $url .= $serverName[0] . '/' . $this->bbs . '/' . $this->key; $message = '/v1/' . $serverName[0] . '/' . $this->bbs . '/' . $this->key . $SID2ch . $AppKey; $HB = hash_hmac ("sha256", $message, $HMKey); @@ -198,7 +196,7 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { if($_conf['2chapi_debug_print']==1) { - P2Util::pushInfoHtml('

    p2 debug(ThreadRead::API): User-Status='.$apiUserStatus.' Thread-Status='.$apiThreadStatus.' HTTP-Status='.$code.'

    '); + P2Util::pushInfoHtml('

    p2 debug(ThreadRead::API):URL='.$url.' User-Status='.$apiUserStatus.' Thread-Status='.$apiThreadStatus.' HTTP-Status='.$code.'

    '); } // APIの返答が過去ログ(Ronin無)だったら過去ログリンクを表示して終了 diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index 3edb14cc7..103257fca 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -15,12 +15,10 @@ function authenticate_2chapi() { global $_conf; - if ($_conf['2chapi_ssl.auth']) - { - $url = 'https://api.5ch.net/v1/auth/'; - } else { - $url = 'http://api.5ch.net/v1/auth/'; - } + $url= http_build_url(array( + "scheme" => $_conf['2chapi_ssl.auth']?"https":"http", + "host" => "api.5ch.net", + "path" => "v1/auth/")); $CT = time(); $AppKey = $_conf['2chapi_appkey']; From 698959409221ab495fb92ba95ee6f4bad0c7a150 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 4 Oct 2017 21:50:53 +0900 Subject: [PATCH 243/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=E7=94=A8?= =?UTF-8?q?=E6=9C=80=E8=BF=91=E8=AA=AD=E3=82=93=E3=81=A0=E3=82=B9=E3=83=AC?= =?UTF-8?q?=E4=B8=80=E8=A6=A7=E7=AD=89=E3=81=AB=E6=9B=B4=E6=96=B0=E3=83=9C?= =?UTF-8?q?=E3=82=BF=E3=83=B3=E3=82=92=E8=BF=BD=E5=8A=A0=20=E2=86=91?= =?UTF-8?q?=E3=81=AB=E4=BC=B4=E3=81=84=E8=87=AA=E5=8B=95=E7=9A=84=E3=81=AB?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E3=81=97=E3=81=AA=E3=81=84=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4=EF=BC=88PC=E3=81=A8=E5=90=8C?= =?UTF-8?q?=E3=81=98=E5=8B=95=E4=BD=9C=EF=BC=89=20RSS=E3=81=ABHTTPS?= =?UTF-8?q?=E3=81=AEURL=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=A7=E3=81=8D?= =?UTF-8?q?=E3=81=AA=E3=81=84=E4=B8=8D=E5=85=B7=E5=90=88=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=20lib/ThreadRead.php=E5=86=85=E3=81=AB=E3=81=82?= =?UTF-8?q?=E3=82=8B=E6=9C=AA=E4=BD=BF=E7=94=A8=E3=81=AE=E5=A4=89=E6=95=B0?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 11 +---------- lib/expack/rss/common.inc.php | 2 +- lib/expack/rss/parser.inc.php | 2 +- lib/index_print_k.inc.php | 2 +- lib/sb_header_i.inc.php | 7 ++++++- rep2/menu_i.php | 2 +- 6 files changed, 11 insertions(+), 15 deletions(-) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 8433f1a95..6a065c9b0 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -147,8 +147,6 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { $message = '/v1/' . $serverName[0] . '/' . $this->bbs . '/' . $this->key . $SID2ch . $AppKey; $HB = hash_hmac ("sha256", $message, $HMKey); - $purl = parse_url ($url); // URL分解 - try { $req = P2Commun::createHTTPRequest ($url, HTTP_Request2::METHOD_POST); @@ -166,11 +164,6 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { $req->setHeader ('If-Modified-Since', $this->modified); } - // Basic認証用のヘッダ - if (isset ($purl['user']) && isset ($purl['pass'])) { - $req->setAuth ($purl['user'], $purl['pass'], HTTP_Request2::AUTH_BASIC); - } - // POSTする内容 $req->addPostParameter (array ( 'sid' => $SID2ch, @@ -527,8 +520,6 @@ protected function _downloadDat2chKako($uri, $ext) { $url = $uri . $ext; - $purl = parse_url ($url); // URL分解 - try { $req = P2Commun::createHTTPRequest ($url, HTTP_Request2::METHOD_GET); @@ -727,7 +718,7 @@ public function get2chDatError($code = null) { } elseif (preg_match ($vip2ch_ssr_match, $read_response_html, $matches)) { $dat_response_status = "隊長! 新設されたSS速報R板にてスレを発見したですよ!"; $movelog_uri = str_replace("news4ssnip", "news4ssr", $read_url); - $movelog_url_en = rawurlencode ($kakolog_uri); + $movelog_url_en = rawurlencode ($movelog_uri); $read_kako_url = "{$_conf['read_php']}?host={$this->host}&bbs=news4ssr&key={$this->key}&ls={$this->ls}"; $dat_response_msg = "

    2ch info - 隊長! 新設されたSS速報R板にて、スレッド を発見しました。 [rep2に取り込んで読む]

    "; } else { diff --git a/lib/expack/rss/common.inc.php b/lib/expack/rss/common.inc.php index bbd435077..ae53a253a 100644 --- a/lib/expack/rss/common.inc.php +++ b/lib/expack/rss/common.inc.php @@ -20,7 +20,7 @@ function rss_get_save_path($remotefile) } $pURL = @parse_url($remotefile); - if (!$pURL || !isset($pURL['scheme']) || $pURL['scheme'] != 'http' || !isset($pURL['host'])) { + if (!$pURL || !isset($pURL['scheme']) || !isset($pURL['host'])) { $errmsg = 'p2 error: 不正なRSSのURL (' . p2h($remotefile) . ')'; $error = PEAR::raiseError($errmsg); return ($finished[$remotefile] = $error); diff --git a/lib/expack/rss/parser.inc.php b/lib/expack/rss/parser.inc.php index d8da961fc..46a7a7444 100644 --- a/lib/expack/rss/parser.inc.php +++ b/lib/expack/rss/parser.inc.php @@ -439,7 +439,7 @@ function rss_url_rel_to_abs($url) { // URL をパース $p = @parse_url($GLOBALS['channel']['link']); - if (!$p || !isset($p['scheme']) || $p['scheme'] != 'http' || !isset($p['host'])) { + if (!$p || !isset($p['scheme']) || !isset($p['host'])) { return $url; } diff --git a/lib/index_print_k.inc.php b/lib/index_print_k.inc.php index 70e6bffef..62590e2f9 100644 --- a/lib/index_print_k.inc.php +++ b/lib/index_print_k.inc.php @@ -68,7 +68,7 @@ function index_print_k() {$_conf['k_accesskey_st'][3]}お気に板
    {$_conf['k_accesskey_st'][4]}板リスト
    {$_conf['k_accesskey_st'][5]}最近読んだスレの新着
    -{$_conf['k_accesskey_st'][6]}最近読んだスレの全て
    +{$_conf['k_accesskey_st'][6]}最近読んだスレの全て
    {$_conf['k_accesskey_st'][7]}書込履歴ログ
    {$_conf['k_accesskey_st'][8]}スレの殿堂
    {$_conf['k_accesskey_st'][9]}ログイン管理
    diff --git a/lib/sb_header_i.inc.php b/lib/sb_header_i.inc.php index 5cae6ca43..43efb8ccc 100644 --- a/lib/sb_header_i.inc.php +++ b/lib/sb_header_i.inc.php @@ -9,9 +9,11 @@ //=============================================================== $newtime = date('gis'); $norefresh_q = '&norefresh=1'; +$refresh_q = '&refresh=1'; $bbs_q = '&bbs=' . $aThreadList->bbs; $host_bbs_q = 'host=' . $aThreadList->host . $bbs_q; -$paging_q = $host_bbs_q . '&spmode=' . $aThreadList->spmode . $norefresh_q; +$spmode_q = '&spmode=' . $aThreadList->spmode; +$paging_q = $host_bbs_q . $spmode_q . $norefresh_q; // {{{ ページタイトル部分URL設定 @@ -143,6 +145,9 @@ // お気に板 if ($board_info) { echo toolbar_i_favita_button('img/glyphish/icons2/28-star.png', null, $board_info); +} elseif ($aThreadList->spmode == 'soko') { + $refresh_url = "{$_conf['subject_php']}?{$host_bbs_q}{$spmode_q}{$_conf['k_at_a']}{$refresh_q}"; + echo toolbar_i_standard_button('img/glyphish/icons2/01-refresh.png', null, $refresh_url); } // その他 diff --git a/rep2/menu_i.php b/rep2/menu_i.php index 27d8d7bf2..41488030d 100644 --- a/rep2/menu_i.php +++ b/rep2/menu_i.php @@ -160,7 +160,7 @@
  • 履歴
  • 最近読んだスレの新着 */ ?> -
  • 最近読んだスレ
  • +
  • 最近読んだスレ
  • 書き込み履歴
  • From 717d19a19e09f74e98d461439b3af9c8cc91dd38 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Thu, 5 Oct 2017 12:10:56 +0900 Subject: [PATCH 244/339] =?UTF-8?q?be=E3=82=925ch=E3=81=AB=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 24 +++++++++++------------- lib/post_form_options.inc.php | 13 +++++++++++-- rep2/post.php | 2 +- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/lib/P2Util.php b/lib/P2Util.php index 835a57bb8..596b7bfcc 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -816,7 +816,7 @@ static public function isHostExample($host) */ static public function isHost2chs($host) { - return self::isHost2ch($host)||self::isHost5ch($host)||self::isHostBbsPink($host); + return self::isHost2ch($host) || self::isHost5ch($host) || self::isHostBbsPink($host); } // }}} @@ -2070,14 +2070,15 @@ static public function isEnableBe2ch() * (認証コードはurlencodeされたままの状態) * * @access public + * @param string $host Be認証するホスト名 * @return array|false|null 認証コード配列|認証できなかった|無設定だった */ - static public function getBe2chCodeWithUserConf() + static public function getBe2chCodeWithUserConf($host) { global $_conf; if ($_conf['be_2ch_mail'] && strlen($_conf['be_2ch_password'])) { - $r = self::getBe2chCodeByMailPass($_conf['be_2ch_mail'], $_conf['be_2ch_password']); + $r = self::_getBe2chCodeByMailPass($_conf['be_2ch_mail'], $_conf['be_2ch_password'], $host); if (is_array($r)) { return $r; } @@ -2093,23 +2094,20 @@ static public function getBe2chCodeWithUserConf() * (認証コードはurlencodeされたままの状態) * * @access private + * @param string $host Be認証するホスト名 * @return array|string 成功|エラーメッセージ */ - static public function getBe2chCodeByMailPass($mail, $pass) + static private function _getBe2chCodeByMailPass($mail, $pass, $host) { global $_conf; - //require_once 'HTTP/Request.php'; - - $params = array('timeout' => $_conf['fsockopen_timeout']); - - if (!empty($GLOBALS['_conf']['proxy_use'])) { - $params['proxy_host'] = $GLOBALS['_conf']['proxy_host']; - $params['proxy_port'] = $GLOBALS['_conf']['proxy_port']; - } + $url = http_build_url(array( + "scheme" => $_conf['2ch_ssl.post'] ? "https" : "http", + "host" => P2Util::isHost5ch($host) ? "be.5ch.net" : "be.2ch.net", + "path" => "index.php")); try { - $req = P2Commun::createHTTPRequest('http://be.2ch.net/index.php', HTTP_Request2::METHOD_POST); + $req = P2Commun::createHTTPRequest($url, HTTP_Request2::METHOD_POST); $req->setHeader('User-Agent', P2Commun::getP2UA(true, true)); diff --git a/lib/post_form_options.inc.php b/lib/post_form_options.inc.php index d9f0481f3..3ceda6076 100644 --- a/lib/post_form_options.inc.php +++ b/lib/post_form_options.inc.php @@ -34,10 +34,19 @@ // +function isNetFront() { + var ua = navigator.userAgent; + if (ua.indexOf("NetFront") != -1 || ua.indexOf("AVEFront/") != -1 || ua.indexOf("AVE-Front/") != -1) { + return true; + } else { + return false; + } +} + function disableSubmit(form) { // 2006/02/15 NetFrontとは相性が悪く固まるらしいので抜ける - if (UA::isNetFront()) { + if (isNetFront()) { return; } @@ -52,7 +61,7 @@ function disableSubmit(form) { function setHiddenValue(button) { // 2006/02/15 NetFrontとは相性が悪く固まるらしいので抜ける - if (UA::isNetFront()) { + if (isNetFront()) { return; } diff --git a/rep2/post.php b/rep2/post.php index e4a537bfa..fd759938d 100644 --- a/rep2/post.php +++ b/rep2/post.php @@ -410,7 +410,7 @@ function postIt($host, $bbs, $key, $post) $req->addCookie('DMDM', urlencode( rawurldecode( $_conf['be_2ch_DMDM']) ) ); $req->addCookie('MDMD', urlencode( rawurldecode( $_conf['be_2ch_MDMD']) ) ); } else { - $ar = P2Util::getBe2chCodeWithUserConf(); // urlencodeされたままの状態 + $ar = P2Util::getBe2chCodeWithUserConf($host); // urlencodeされたままの状態 if (is_array($ar)) { $req->addCookie('DMDM', $ar['DMDM']); $req->addCookie('MDMD', $ar['MDMD']); From 1008fdf3f7f12a3bc0149b91ad8480f1ece95f53 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Thu, 5 Oct 2017 19:36:47 +0900 Subject: [PATCH 245/339] v171005.1930 --- README.md | 6 +++--- conf/conf.inc.php | 10 +++++----- doc/README-774.txt | 20 ++++++++++++++++++-- rep2/live_read.php | 2 +- rep2/read.php | 2 +- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index b3a87aa11..eab3247da 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -サソ# rep2 expack 蜈ィ驛ィ蜈・繧 by 2ch774 +サソ# rep2 expack 蜈ィ驛ィ蜈・繧 by open774 * rep2-expack https://github.com/rsky/p2-php * rep2-expack +live https://github.com/pluslive/p2-php @@ -18,7 +18,7 @@ ### Git & Composer縺ァ 1. 譛ャ菴薙rclone -
    git clone git://github.com/2ch774/p2-php.git
    +  
    git clone git://github.com/open774/p2-php.git
       cd p2-php
    2. 萓晏ュ倥Λ繧、繝悶Λ繝ェ繧偵ム繧ヲ繝ウ繝ュ繝シ繝 @@ -107,7 +107,7 @@ Web繝悶Λ繧ヲ繧カ縺九i螟画峩縺ァ縺阪↑縺鬆逶ョ縺ッ [conf/conf_admin.inc.php](https * **thermon** https://github.com/thermon/p2-php/ * **part32縺ョ892** *(+live)* https://github.com/pluslive/p2-php/ * **orzisun** https://github.com/orzisun/p2-php -* **2ch774** https://github.com/2ch774/p2-php +* **open774** https://github.com/open774/p2-php * **killer4989** https://github.com/killer4989/p2-php * **dgg712** https://github.com/dgg712/p2-php * **2ch p2/rep2繧ケ繝ャ縺ョ>>1-1000** diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 7e8075e3c..59f599963 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '170921.1800', // rep2のバージョン + 'p2version' => '171005.1930', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; @@ -74,11 +74,11 @@ function p2_init() $_conf['p2web_url'] = 'http://akid.s17.xrea.com/'; $_conf['p2ime_url'] = 'http://akid.s17.xrea.com/p2ime.php'; // $_conf['favrank_url'] = 'http://akid.s17.xrea.com/favrank/favrank.php'; - $_conf['expack.web_url'] = 'http://open774.github.io/p2-php/'; - $_conf['expack.download_url'] = 'https://github.com/2ch774/p2-php/releases'; - $_conf['expack.history_url'] = 'https://github.com/2ch774/p2-php/blob/master/doc/README-774.txt'; + $_conf['expack.web_url'] = 'https://open774.github.io/p2-php/'; + $_conf['expack.download_url'] = 'https://github.com/open774/p2-php/releases'; + $_conf['expack.history_url'] = 'https://github.com/open774/p2-php/blob/master/doc/README-774.txt'; $_conf['expack.tgrep_url'] = 'http://page2.xrea.jp/tgrep/search'; - $_conf['test.dig2ch_url'] = 'http://dig.2ch.net/'; + $_conf['test.dig2ch_url'] = 'http://dig.5ch.net/'; $_conf['expack.gate_php'] = '//open774.github.io/p2-php/gate.html'; $_conf['menu_php'] = 'menu.php'; $_conf['subject_php'] = 'subject.php'; diff --git a/doc/README-774.txt b/doc/README-774.txt index 7912995da..c756b29bf 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -24,17 +24,18 @@ PHP7 ### 新機能 * cronとかで最近読んだスレなどのdatをDL出来るスクリプト追加 - - scripts/fetch-dat.php --mode モードを一つ指定(fav recent res_hist) + - php scripts/fetch-dat.php --mode モードを一つ指定(fav recent res_hist) * 名無しが節穴になる板に名無しで書き込むときに警告を出す機能を追加 * NGあぼーんの対象になったレスのIDを自動的にNGあぼーんする機能を追加 - NGあぼーんの条件を削除した場合は自動NGあぼーんのデータ消去しないと反映されません - 自動NGあぼーんのデータは手動NGあぼーんと独立しており、自動NGあぼーんがONの時だけ読み込まれます。 * 「設定管理」からキャッシュ・履歴の消去できる機能を追加 * 本家からbeのログイン部分を移植してBE2.0に対応 -* rep2に登録された外部板へリンクする機能を追加 +* rep2に登録された外部板のリンクををrep2で開けるようにした(Janeと同じ動作) * 0ちゃんねるスクリプトを使用した外部板の過去ログDATを取り込み対応 * SOCKS5プロクシ経由の接続に対応(人柱) * tor内の掲示板(.onionドメイン)をtor経由で閲覧する機能を追加(人柱) +* curl を用いた並列ダウンロード機能を追加(人柱機能) ### 仕様変更 * ローカル板一覧用.brdファイルの置き場所をrep2/boardから$_conf['data_dir']/brardに変更 @@ -46,6 +47,9 @@ PHP7 * headline.2ch.netを最近読んだスレに追記しないように変更 * Youtubeとニコニコ動画を表示する機能を削除 - リンクプラグインを使用してください http://akid.s17.xrea.com/p2puki/index.phtml?%A5%EA%A5%F3%A5%AF%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3 +* スマホ用画面のデザイン変更 +* 2chのUnicode絵文字投稿に対応 +* 表示レス数の上限を2000から65535に変更 その他今時のアレに合わせた修正等gitのコミットログも確認してください。 @@ -68,6 +72,18 @@ PHP7 ●ChangeLog +171005.1930 +* 依存ライブラリを更新(composer update必須) +* スマホ用最近読んだスレ一覧等に更新ボタンを追加 +* ↑に伴い自動的に更新しないように変更(PCと同じ動作) +* 鯖の移転に対応するため、2ch(sc)とopen2chのDAT保存ディレクトリを変更 +* ↑旧仕様のディレクトリにDATが有るときはそちらを優先する +* 5ch暫定対応 +* rssリーダーが動作しない不具合修正 +* rssリーダーにHTTPSのURLを追加できない不具合を修正 +* スマホ向けページにbootstrapを追加して一部デザイン変更 +* 動作チェックの最低条件をPHP5.6以上に変更 + 170921.1800 * vip2ch.com読み込み対応 * 2chのUnicode絵文字投稿に対応 diff --git a/rep2/live_read.php b/rep2/live_read.php index ccc0b1cdb..e79efcf84 100755 --- a/rep2/live_read.php +++ b/rep2/live_read.php @@ -342,7 +342,7 @@ // 履歴を記録 // 速報headlineは最近読んだスレに記録しないようにしてみる //=========================================================== -if ($aThread->rescount && !$is_ajax && $aThread->host != 'headline.2ch.net') { +if ($aThread->rescount && !$is_ajax && $aThread->host != 'headline.2ch.net'&& $aThread->host != 'headline.5ch.net') { recRecent(implode('<>', array($aThread->ttitle, $aThread->key, $idx_data[2], '', '', $aThread->readnum, $idx_data[6], $idx_data[7], $idx_data[8], $newline, $aThread->host, $aThread->bbs))); diff --git a/rep2/read.php b/rep2/read.php index 6ee1cf5b0..4c572b2b8 100644 --- a/rep2/read.php +++ b/rep2/read.php @@ -450,7 +450,7 @@ // 履歴を記録 // 速報headlineは最近読んだスレに記録しないようにしてみる //=========================================================== -if ($aThread->rescount && !$is_ajax && $aThread->host != 'headline.2ch.net') { +if ($aThread->rescount && !$is_ajax && $aThread->host != 'headline.2ch.net'&& $aThread->host != 'headline.2ch.net') { recRecent(implode('<>', array($aThread->ttitle, $aThread->key, $idx_data[2], '', '', $aThread->readnum, $idx_data[6], $idx_data[7], $idx_data[8], $newline, $aThread->host, $aThread->bbs))); From 8f1345ede013d0f4931e83581cf1a37a7604b620 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Thu, 5 Oct 2017 20:56:10 +0900 Subject: [PATCH 246/339] update README --- doc/README-killer.txt | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/doc/README-killer.txt b/doc/README-killer.txt index f83ab1cf9..7590d2f9b 100644 --- a/doc/README-killer.txt +++ b/doc/README-killer.txt @@ -1,28 +1,31 @@ -rep2 機能拡張パック 全部入り(expack all in one) by killer +rep2 讖溯ス諡。蠑オ繝代ャ繧ッ 蜈ィ驛ィ蜈・繧(expack all in one) by killer -●何? - rep2-expack_allinone https://github.com/2ch774/p2-php - 上記やスレに上げられた修正を取り込みつつ気になったところをゴニョゴニョするバージョンです。 +笳丈ス包シ + rep2-expack_allinone https://github.com/open774/p2-php + 荳願ィ倥d繧ケ繝ャ縺ォ荳翫£繧峨l縺滉ソョ豁」繧貞叙繧願セシ縺ソ縺、縺、豌励↓縺ェ縺」縺溘→縺薙m繧偵ざ繝九Ι繧エ繝九Ι縺吶k繝舌シ繧ク繝ァ繝ウ縺ァ縺吶 -●免責 +笳丞崎イャ - 本ソフトウェアの使用により直接および間接的に生じたいかなる損害も補償いたしません。 - 使用は自己責任で。 + 譛ャ繧ス繝輔ヨ繧ヲ繧ァ繧「縺ョ菴ソ逕ィ縺ォ繧医j逶エ謗・縺翫h縺ウ髢捺磁逧縺ォ逕溘§縺溘>縺九↑繧区錐螳ウ繧り」懷─縺縺溘@縺セ縺帙s縲 + 菴ソ逕ィ縺ッ閾ェ蟾ア雋ャ莉サ縺ァ縲 -●注意 +笳乗ウィ諢 - 設置者本人が悪用するのはもちろん、認証を切るなどして - 第三者に悪用されても仕方ない環境で使うのはやめてください。 + 險ュ鄂ョ閠譛ャ莠コ縺梧が逕ィ縺吶k縺ョ縺ッ繧ゅ■繧阪s縲∬ェ崎ィシ繧貞繧九↑縺ゥ縺励※ + 隨ャ荳芽縺ォ謔ェ逕ィ縺輔l縺ヲ繧ゆサ墓婿縺ェ縺迺ー蠅縺ァ菴ソ縺縺ョ縺ッ繧繧√※縺上□縺輔>縲 + 縺セ縺溷倶ココ縺ァ繧ォ繧ケ繧ソ繝縺励◆繧ゅョ繧ゅ≠繧九ョ縺ァ螟峨↑繝舌げス・繧エ繝溘b縺ゅ▲縺溘j縺励∪縺呻ス。 + ス「縺ゅl?ス」縺ィ諤昴▲縺溘i pull 繧 cloneス、 fork 縺礼峩縺励◆繧奇ス、open774 縺輔s縺ョ譛ャ螳カ rep2 繧偵♀菴ソ縺縺上□縺輔>ス。 + (縺溘∪縺ォ縺薙ョ繝ェ繝昴ず繝医Μ繧ゅヵ繧ゥ繝シ繧ッ縺礼峩縺吶%縺ィ縺悟、壹>縺ョ縺ァ縺呻ス。ス。ス。) -●ライセンス +笳上Λ繧、繧サ繝ウ繧ケ - 本家p2と同じく、X11ライセンスです。 + 譛ャ螳カp2縺ィ蜷後§縺上々11繝ゥ繧、繧サ繝ウ繧ケ縺ァ縺吶 -●ChangeLog +笳修hangeLog - https://github.com/killer4989/p2-php/commits/master に書いてあるコミットログでどうぞ(コラ + https://github.com/killer4989/p2-php/commits/master 縺ォ譖ク縺縺ヲ縺ゅk繧ウ繝溘ャ繝医Ο繧ー縺ァ縺ゥ縺縺(スコセ From 9146bb52e553b04644f177cf5af99c3d01e7cd9d Mon Sep 17 00:00:00 2001 From: killer4989 Date: Thu, 5 Oct 2017 21:18:33 +0900 Subject: [PATCH 247/339] =?UTF-8?q?fix=E3=80=80=E6=9C=80=E8=BF=91=E8=AA=AD?= =?UTF-8?q?=E3=82=93=E3=81=A0=E3=82=B9=E3=83=AC=E3=81=AB=E8=A8=98=E9=8C=B2?= =?UTF-8?q?=E3=81=97=E3=81=AA=E3=81=84=E3=83=9B=E3=82=B9=E3=83=88=E3=81=AB?= =?UTF-8?q?=205ch.net=20=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/read.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rep2/read.php b/rep2/read.php index 4c572b2b8..cc269f4ab 100644 --- a/rep2/read.php +++ b/rep2/read.php @@ -450,7 +450,7 @@ // 履歴を記録 // 速報headlineは最近読んだスレに記録しないようにしてみる //=========================================================== -if ($aThread->rescount && !$is_ajax && $aThread->host != 'headline.2ch.net'&& $aThread->host != 'headline.2ch.net') { +if ($aThread->rescount && !$is_ajax && $aThread->host != 'headline.2ch.net'&& $aThread->host != 'headline.5ch.net') { recRecent(implode('<>', array($aThread->ttitle, $aThread->key, $idx_data[2], '', '', $aThread->readnum, $idx_data[6], $idx_data[7], $idx_data[8], $newline, $aThread->host, $aThread->bbs))); From 84e5066e540df74cc9ffce21682be076898591fb Mon Sep 17 00:00:00 2001 From: killer4989 Date: Thu, 5 Oct 2017 22:33:03 +0900 Subject: [PATCH 248/339] =?UTF-8?q?http=5Fbuild=5Furl=E3=82=92=E5=B0=8E?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/login2ch.inc.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/login2ch.inc.php b/lib/login2ch.inc.php index 2b3e99c72..aa78bca58 100644 --- a/lib/login2ch.inc.php +++ b/lib/login2ch.inc.php @@ -23,11 +23,10 @@ function login2ch() return false; } - if ($_conf['2ch_ssl.maru']) { - $auth2ch_url = 'https://2chv.tora3.net/futen.cgi'; - } else { - $auth2ch_url = 'http://2chv.tora3.net/futen.cgi'; - } + $url = http_build_url(array( + "scheme" => $_conf['2ch_ssl.maru'] ? "https" : "http", + "host" => "2chv.tora3.net", + "path" => "futen.cgi")); $dolib2ch = 'DOLIB/1.00'; From b63efa88dbf1f5b5c1b5294ce61d79aaccfe7318 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Thu, 5 Oct 2017 23:27:59 +0900 Subject: [PATCH 249/339] =?UTF-8?q?HTTP=E9=80=9A=E4=BF=A1=E6=99=82?= =?UTF-8?q?=E3=81=AE=E3=83=98=E3=83=83=E3=83=80=E3=83=BC=E3=81=AB=E8=AA=A4?= =?UTF-8?q?=E3=82=8A=E3=81=8C=E3=81=82=E3=81=A3=E3=81=9F=E3=81=AE=E3=81=A7?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20release=E4=BD=9C=E6=A5=AD=E4=B8=AD?= =?UTF-8?q?=E3=81=AB=E4=B8=80=E9=83=A8=E3=81=AE=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E3=81=AA=E3=81=9C=E3=81=8B=E3=81=8C=E5=85=88=E7=A5=96?= =?UTF-8?q?=E8=BF=94=E3=82=8A=E3=81=97=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 2 +- lib/P2Commun.php | 7 +++---- lib/sb_header_i.inc.php | 2 +- rep2/live_read.php | 5 ++--- rep2/read.php | 2 +- rep2/title.php | 1 + rep2/viewtxt.php | 2 +- 7 files changed, 10 insertions(+), 11 deletions(-) diff --git a/composer.json b/composer.json index c8534cbaa..8310c27a3 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "rsky/p2-php", + "name": "open774/p2-php", "description": "The server side 2ch viewer written in PHP", "license": "X11", "repositories": [ diff --git a/lib/P2Commun.php b/lib/P2Commun.php index 162536c13..ee4d4416a 100644 --- a/lib/P2Commun.php +++ b/lib/P2Commun.php @@ -36,7 +36,7 @@ static public function createHTTPRequest($url , $method = HTTP_Request2::METHOD_ // よく使うヘッダを指定 // p2のHTTP通信は特に指定の無い限りMonazillaを名乗るようにする $req->setHeader ('User-Agent', self::getP2UA(true,P2Util::isHost2chs($purl['host']))); - $req->setHeader ('Acecpt-Language', 'ja,en-us;q=0.7,en;q=0.3'); + $req->setHeader ('Accept-Language', 'ja,en-us;q=0.7,en;q=0.3'); $req->setHeader ('Accept', '*/*'); $req->setHeader ('Accept-Encoding', 'gzip, deflate'); @@ -113,7 +113,6 @@ static public function getP2UA($withMonazilla = true,$apiUA = false) } else { p2die("2chと通信するために必要な情報が設定されていません。"); } - } else { $p2ua = $_conf['p2ua']; } @@ -134,7 +133,7 @@ static public function getP2UA($withMonazilla = true,$apiUA = false) * 206 Partial Content * 304 Not Modified → 失敗扱い * - * @return array|false 成功したらページ内容を返す。失敗したらfalseを返す。 + * @return string|false 成功したらページ内容を返す。失敗したらfalseを返す。 */ static public function getWebPage($url, &$error_msg, $timeout = 15) { @@ -203,7 +202,7 @@ static public function fileDownload($url, $localfile, $url_t = P2Util::throughIme($url); $info_msg_ht = "

    Error: {$error_msg}
    "; $info_msg_ht .= "rep2 info: {$url} に接続できませんでした。

    "; - self::pushInfoHtml($info_msg_ht); + P2Util::pushInfoHtml($info_msg_ht); } return null; } diff --git a/lib/sb_header_i.inc.php b/lib/sb_header_i.inc.php index 43efb8ccc..9dbc5ae58 100644 --- a/lib/sb_header_i.inc.php +++ b/lib/sb_header_i.inc.php @@ -145,7 +145,7 @@ // お気に板 if ($board_info) { echo toolbar_i_favita_button('img/glyphish/icons2/28-star.png', null, $board_info); -} elseif ($aThreadList->spmode == 'soko') { +} elseif ($aThreadList->spmode != 'soko') { $refresh_url = "{$_conf['subject_php']}?{$host_bbs_q}{$spmode_q}{$_conf['k_at_a']}{$refresh_q}"; echo toolbar_i_standard_button('img/glyphish/icons2/01-refresh.png', null, $refresh_url); } diff --git a/rep2/live_read.php b/rep2/live_read.php index e79efcf84..a03e8e17f 100755 --- a/rep2/live_read.php +++ b/rep2/live_read.php @@ -32,7 +32,6 @@ //================================================================ $newtime = date('gis'); // 同じリンクをクリックしても再読込しない仕様に対抗するダミークエリー // $_today = date('y/m/d'); -$is_ajax = !empty($_GET['ajax']); //================================================= // スレの指定 @@ -325,7 +324,7 @@ if ($aThread->rescount) { // 検索の時は、既読数を更新しない - if ((isset($GLOBALS['word']) && strlen($GLOBALS['word']) > 0) || $is_ajax) { + if ((isset($GLOBALS['word']) && strlen($GLOBALS['word']) > 0)) { $aThread->readnum = $idx_data[5]; } else { $aThread->readnum = min($aThread->rescount, max(0, $idx_data[5], $aThread->resrange['to'])); @@ -342,7 +341,7 @@ // 履歴を記録 // 速報headlineは最近読んだスレに記録しないようにしてみる //=========================================================== -if ($aThread->rescount && !$is_ajax && $aThread->host != 'headline.2ch.net'&& $aThread->host != 'headline.5ch.net') { +if ($aThread->rescount && $aThread->host != 'headline.2ch.net'&& $aThread->host != 'headline.5ch.net') { recRecent(implode('<>', array($aThread->ttitle, $aThread->key, $idx_data[2], '', '', $aThread->readnum, $idx_data[6], $idx_data[7], $idx_data[8], $newline, $aThread->host, $aThread->bbs))); diff --git a/rep2/read.php b/rep2/read.php index 4c572b2b8..cc269f4ab 100644 --- a/rep2/read.php +++ b/rep2/read.php @@ -450,7 +450,7 @@ // 履歴を記録 // 速報headlineは最近読んだスレに記録しないようにしてみる //=========================================================== -if ($aThread->rescount && !$is_ajax && $aThread->host != 'headline.2ch.net'&& $aThread->host != 'headline.2ch.net') { +if ($aThread->rescount && !$is_ajax && $aThread->host != 'headline.2ch.net'&& $aThread->host != 'headline.5ch.net') { recRecent(implode('<>', array($aThread->ttitle, $aThread->key, $idx_data[2], '', '', $aThread->readnum, $idx_data[6], $idx_data[7], $idx_data[8], $newline, $aThread->host, $aThread->bbs))); diff --git a/rep2/title.php b/rep2/title.php index 142162d06..3fe6c5614 100644 --- a/rep2/title.php +++ b/rep2/title.php @@ -182,6 +182,7 @@
    • README.txt
    • README-EX.txt
    • +
    • README-774.txt
    • ごく簡単な操作法
    • 拡張パック 更新記録
    • diff --git a/rep2/viewtxt.php b/rep2/viewtxt.php index bf63b1ba7..705dedfb4 100644 --- a/rep2/viewtxt.php +++ b/rep2/viewtxt.php @@ -22,7 +22,7 @@ // 前処理 //========================================================= // 読み込めるファイルを限定する -$readable_files = array('doc/README.txt', 'doc/README-EX.txt', 'doc/ChangeLog.txt'); +$readable_files = array('doc/README.txt', 'doc/README-EX.txt', 'doc/ChangeLog.txt', 'doc/README-774.txt'); if ($readable_files && $file && (!in_array($file, $readable_files))) { $files_st = '「' . implode('」と「', $readable_files) . '」'; From 2fa38509240595784750a205bcaab0d8d73a364d Mon Sep 17 00:00:00 2001 From: killer4989 Date: Thu, 5 Oct 2017 20:56:10 +0900 Subject: [PATCH 250/339] update README --- doc/README-killer.txt | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/doc/README-killer.txt b/doc/README-killer.txt index f83ab1cf9..7590d2f9b 100644 --- a/doc/README-killer.txt +++ b/doc/README-killer.txt @@ -1,28 +1,31 @@ -rep2 機能拡張パック 全部入り(expack all in one) by killer +rep2 讖溯ス諡。蠑オ繝代ャ繧ッ 蜈ィ驛ィ蜈・繧(expack all in one) by killer -●何? - rep2-expack_allinone https://github.com/2ch774/p2-php - 上記やスレに上げられた修正を取り込みつつ気になったところをゴニョゴニョするバージョンです。 +笳丈ス包シ + rep2-expack_allinone https://github.com/open774/p2-php + 荳願ィ倥d繧ケ繝ャ縺ォ荳翫£繧峨l縺滉ソョ豁」繧貞叙繧願セシ縺ソ縺、縺、豌励↓縺ェ縺」縺溘→縺薙m繧偵ざ繝九Ι繧エ繝九Ι縺吶k繝舌シ繧ク繝ァ繝ウ縺ァ縺吶 -●免責 +笳丞崎イャ - 本ソフトウェアの使用により直接および間接的に生じたいかなる損害も補償いたしません。 - 使用は自己責任で。 + 譛ャ繧ス繝輔ヨ繧ヲ繧ァ繧「縺ョ菴ソ逕ィ縺ォ繧医j逶エ謗・縺翫h縺ウ髢捺磁逧縺ォ逕溘§縺溘>縺九↑繧区錐螳ウ繧り」懷─縺縺溘@縺セ縺帙s縲 + 菴ソ逕ィ縺ッ閾ェ蟾ア雋ャ莉サ縺ァ縲 -●注意 +笳乗ウィ諢 - 設置者本人が悪用するのはもちろん、認証を切るなどして - 第三者に悪用されても仕方ない環境で使うのはやめてください。 + 險ュ鄂ョ閠譛ャ莠コ縺梧が逕ィ縺吶k縺ョ縺ッ繧ゅ■繧阪s縲∬ェ崎ィシ繧貞繧九↑縺ゥ縺励※ + 隨ャ荳芽縺ォ謔ェ逕ィ縺輔l縺ヲ繧ゆサ墓婿縺ェ縺迺ー蠅縺ァ菴ソ縺縺ョ縺ッ繧繧√※縺上□縺輔>縲 + 縺セ縺溷倶ココ縺ァ繧ォ繧ケ繧ソ繝縺励◆繧ゅョ繧ゅ≠繧九ョ縺ァ螟峨↑繝舌げス・繧エ繝溘b縺ゅ▲縺溘j縺励∪縺呻ス。 + ス「縺ゅl?ス」縺ィ諤昴▲縺溘i pull 繧 cloneス、 fork 縺礼峩縺励◆繧奇ス、open774 縺輔s縺ョ譛ャ螳カ rep2 繧偵♀菴ソ縺縺上□縺輔>ス。 + (縺溘∪縺ォ縺薙ョ繝ェ繝昴ず繝医Μ繧ゅヵ繧ゥ繝シ繧ッ縺礼峩縺吶%縺ィ縺悟、壹>縺ョ縺ァ縺呻ス。ス。ス。) -●ライセンス +笳上Λ繧、繧サ繝ウ繧ケ - 本家p2と同じく、X11ライセンスです。 + 譛ャ螳カp2縺ィ蜷後§縺上々11繝ゥ繧、繧サ繝ウ繧ケ縺ァ縺吶 -●ChangeLog +笳修hangeLog - https://github.com/killer4989/p2-php/commits/master に書いてあるコミットログでどうぞ(コラ + https://github.com/killer4989/p2-php/commits/master 縺ォ譖ク縺縺ヲ縺ゅk繧ウ繝溘ャ繝医Ο繧ー縺ァ縺ゥ縺縺(スコセ From b72a1d9f57bd57ef5d386cf219bdd92187084de0 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Mon, 9 Oct 2017 00:07:16 +0900 Subject: [PATCH 251/339] v171009.0000 --- conf/conf.inc.php | 4 ++-- doc/README-774.txt | 8 ++++++++ lib/login2ch.inc.php | 9 ++++----- lib/sb_print.inc.php | 2 +- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index 59f599963..e1b49cb1c 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '171005.1930', // rep2のバージョン + 'p2version' => '171009.0000', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; @@ -78,7 +78,7 @@ function p2_init() $_conf['expack.download_url'] = 'https://github.com/open774/p2-php/releases'; $_conf['expack.history_url'] = 'https://github.com/open774/p2-php/blob/master/doc/README-774.txt'; $_conf['expack.tgrep_url'] = 'http://page2.xrea.jp/tgrep/search'; - $_conf['test.dig2ch_url'] = 'http://dig.5ch.net/'; + $_conf['test.dig2ch_url'] = 'https://dig.5ch.net/'; $_conf['expack.gate_php'] = '//open774.github.io/p2-php/gate.html'; $_conf['menu_php'] = 'menu.php'; $_conf['subject_php'] = 'subject.php'; diff --git a/doc/README-774.txt b/doc/README-774.txt index c756b29bf..57253aff0 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -72,6 +72,14 @@ PHP7 ●ChangeLog +171009.0000 +* スマホ用画面の更新ボタンの表示条件に誤りがあったのを修正 +* headline.5ch.netのスレを履歴に追加しないように修正 +* HTTP通信時のヘッダーのスペルミス修正 +* 更新チェックに失敗した際にエラーが出る不具合修正 +* スレタイ検索がSSL必須になったので修正 +* 一部の環境でスレ一覧を表示した際に警告が出る不具合修正 + 171005.1930 * 依存ライブラリを更新(composer update必須) * スマホ用最近読んだスレ一覧等に更新ボタンを追加 diff --git a/lib/login2ch.inc.php b/lib/login2ch.inc.php index 2b3e99c72..475f415dd 100644 --- a/lib/login2ch.inc.php +++ b/lib/login2ch.inc.php @@ -23,11 +23,10 @@ function login2ch() return false; } - if ($_conf['2ch_ssl.maru']) { - $auth2ch_url = 'https://2chv.tora3.net/futen.cgi'; - } else { - $auth2ch_url = 'http://2chv.tora3.net/futen.cgi'; - } + $auth2ch_url= http_build_url(array( + "scheme" => $_conf['2chapi_ssl.auth']?"https":"http", + "host" => "2chv.tora3.net", + "path" => "futen.cgi")); $dolib2ch = 'DOLIB/1.00'; diff --git a/lib/sb_print.inc.php b/lib/sb_print.inc.php index 1cda94a63..9655424fd 100644 --- a/lib/sb_print.inc.php +++ b/lib/sb_print.inc.php @@ -450,7 +450,7 @@ function sb_print($aThreadList) // Birth $birth_format = isset($_conf['birth_format']) ? $_conf['birth_format'] : 'y/m/d'; - $birth = date($birth_format, $aThread->key); // (y/m/d H:i) + $birth = date($birth_format, intval($aThread->key)); // (y/m/d H:i) $td['birth'] = "{$birth}\n"; unset($birth_format); From 6197565e811f5f4ffbc4257dc7d45fe532621e31 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Mon, 9 Oct 2017 01:05:03 +0900 Subject: [PATCH 252/339] =?UTF-8?q?API=E7=B5=8C=E7=94=B1=E3=81=A7DAT?= =?UTF-8?q?=E3=82=92=E8=90=BD=E3=81=A8=E3=81=9B=E3=81=AA=E3=81=8B=E3=81=A3?= =?UTF-8?q?=E3=81=9F=E9=9A=9B=E3=81=ABbpdy=E3=82=92=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=81=99=E3=82=8B=E6=A9=9F=E8=83=BD=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=EF=BC=88=E3=83=87=E3=83=90=E3=83=83=E3=82=B0=E5=B0=82=E7=94=A8?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ThreadRead.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/ThreadRead.php b/lib/ThreadRead.php index 6a065c9b0..1329d345a 100644 --- a/lib/ThreadRead.php +++ b/lib/ThreadRead.php @@ -319,6 +319,11 @@ protected function _downloadDat2chAPI($uaMona, $SID2ch, $from_bytes) { } elseif ($code == '501' && $apiUserStatus == '1') { // 浪人無しで尚且つRange付でDAT落ちにアクセスした場合は501 return $this->_downloadDat2chNotFound ('302'); } else { + if($_conf['2chapi_debug_print']==1) + { + P2Util::pushInfoHtml('

      p2 debug(ThreadRead::API):body='.$response->getBody ().'

      '); + } + return $this->_downloadDat2chNotFound ($code); } From e5e105baa415719efeaa7cbaeaa2d0719b98f815 Mon Sep 17 00:00:00 2001 From: killer4989 Date: Mon, 9 Oct 2017 16:31:35 +0900 Subject: [PATCH 253/339] =?UTF-8?q?=E6=B5=AA=E4=BA=BA=E3=81=AE=E6=9C=89?= =?UTF-8?q?=E5=8A=B9=E6=80=A7=E3=82=92=E7=A2=BA=E8=AA=8D=E3=81=A7=E3=81=8D?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/P2Util.php | 106 +++++++++++++++++++++++++++++++++++++++++ lib/auth2chapi.inc.php | 5 ++ lib/login2ch.inc.php | 5 ++ 3 files changed, 116 insertions(+) diff --git a/lib/P2Util.php b/lib/P2Util.php index 596b7bfcc..cc08dbf9e 100644 --- a/lib/P2Util.php +++ b/lib/P2Util.php @@ -2161,6 +2161,112 @@ public static function calcBeId($prof_id) return 0; } + // }}} + // {{{ checkRoninExpiration() + + /** + * 浪人 ID の有効性確認 + * + * @return boolean 浪人 ID があれば true + */ + function checkRoninExpiration() + { + global $_conf; + + $url = 'https://auth.bbspink.com/auth/timecheck.php'; + + if($_conf['2chapi_use'] == 1) { + if(empty($_conf['2chapi_appname'])) { + self::pushInfoHtml("

      p2 error: 2chと通信するために必要な情報が設定されていません。

      "); + return false; + } + $agent = sprintf($_conf['2chapi_ua.auth'], $x_2ch_ua); + $x_2ch_ua = $_conf['2chapi_appname']; + } else { + $agent = 'DOLIB/1.00'; + $x_2ch_ua = self::getP2UA(false,false); + } + + // 2ch浪人<●>ID, PW設定を読み込む + if ($array = self::readIdPw2ch()) { + list($login2chID, $login2chPW, $autoLogin2ch) = $array; + + } else { + return false; + } + + try { + $req = P2Commun::getHTTPRequest2($url, HTTP_Request2::METHOD_POST); + + $req->setHeader('User-Agent', $agent); + $req->setHeader('X-2ch-UA', $x_2ch_ua); + + $req->addPostParameter('email', $login2chID); + $req->addPostParameter('pass', $login2chPW); + + // POSTデータの送信 + $res = P2Commun::getHTTPResponse($req); + + $code = $res->getStatus(); + if ($code != 200) { + self::pushInfoHtml("

      p2 Error: HTTP Error({$code})

      "); + } else { + $body = $res->getBody(); + } + } catch (Exception $e) { + self::pushInfoHtml("

      p2 Error: 浪人<●>の認証確認サーバに接続出来ませんでした。({$e->getMessage()})

      "); + } + + // 接続失敗ならば + if (empty($body)) { + self::pushInfoHtml('

      p2 info: 浪人<●>IDに関する確認を行うには、PHPのcURL関数又はOpenSSL関数が有効である必要があります。

      '); + + self::pushInfoHtml("

      p2 error: 浪人<●>の有効性確認に失敗しました。{$curl_msg}

      "); + return false; + } + + $body = trim($body); + + // エラー検出 + if (preg_match('/ERROR (\d+): (.*)/', $body, $matches)) { + self::pushInfoHtml("

      p2 error: 浪人<●>の有効性確認に失敗しました。{$matches[2]}[{$matches[1]}]

      "); + return false; + } + + // アカウントが未登録 + if (preg_match('/User does not exists/', $body, $matches)) { + self::pushInfoHtml("

      p2 error: 浪人アカウントが登録されていません。

      "); + return false; + } + + // 有効期限取得 + if (!preg_match('/Date of expiration: (\d+)\/(\d+)\/(\d+) (\d+):(\d+):(\d+)/', $body, $matches)) { + self::pushInfoHtml("

      p2 error: 有効期限が取得できませんでした。

      "); + return false; + } + + // タイムゾーンを一時変更 + date_default_timezone_set('America/Los_Angeles'); + $expiration = mktime ($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]); + + date_default_timezone_set(ini_get('date.timezone')); + $date = date("Y/m/d H:i:s", $expiration); + + // 有効期限チェック + if (time() >= $expiration) { + self::pushInfoHtml("

      p2 error: 浪人<●>の有効期限切れです。 有効期限:{$date}

      "); + return true; + } + + self::pushInfoHtml("

      p2 info: 浪人<●>の有効期限は {$date} です。

      "); + return true; + } + + // }}} // {{{ debug() /* static public function debug() diff --git a/lib/auth2chapi.inc.php b/lib/auth2chapi.inc.php index 103257fca..dab45871d 100644 --- a/lib/auth2chapi.inc.php +++ b/lib/auth2chapi.inc.php @@ -39,6 +39,11 @@ function authenticate_2chapi() list($login2chID, $login2chPW, $autoLogin2ch) = $array; } + // 浪人の有効性確認(要 ID / PW) + if (!empty($login2chID) && !empty($login2chPW)) { + P2Util::checkRoninExpiration(); + } + try { $req = P2Commun::createHTTPRequest($url,HTTP_Request2::METHOD_POST); diff --git a/lib/login2ch.inc.php b/lib/login2ch.inc.php index 0215b75b0..078dd1b7a 100644 --- a/lib/login2ch.inc.php +++ b/lib/login2ch.inc.php @@ -23,6 +23,11 @@ function login2ch() return false; } + // 浪人の有効性確認(要 ID / PW) + if (!empty($login2chID) && !empty($login2chPW)) { + P2Util::checkRoninExpiration(); + } + $auth2ch_url= http_build_url(array( "scheme" => $_conf['2ch_ssl.maru']?"https":"http", "host" => "2chv.tora3.net", From 17f3df2f2f8fb755815286258f29ef4b82c3b8c0 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Tue, 10 Oct 2017 10:41:44 +0900 Subject: [PATCH 254/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=E5=90=91?= =?UTF-8?q?=E3=81=91read=E3=81=AE=E3=83=84=E3=83=BC=E3=83=AB=E3=83=90?= =?UTF-8?q?=E3=83=BC=E3=82=92=E3=83=9D=E3=83=83=E3=83=97=E3=82=A2=E3=83=83?= =?UTF-8?q?=E3=83=97=E3=83=A1=E3=83=8B=E3=83=A5=E3=83=BC=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/read_header_i.inc.php | 140 ++++++++++++++++++++------------------ lib/toolbar_i.inc.php | 65 ++++++++++++++---- rep2/css/iphone.css | 4 ++ 3 files changed, 130 insertions(+), 79 deletions(-) diff --git a/lib/read_header_i.inc.php b/lib/read_header_i.inc.php index 56090e7fe..1953ccedb 100644 --- a/lib/read_header_i.inc.php +++ b/lib/read_header_i.inc.php @@ -150,77 +150,37 @@ echo toolbar_i_fav_button('img/glyphish/icons2/28-star.png', null, $thread_info); } -// その他 -echo toolbar_i_showhide_button('img/gp0-more.png', null, 'read_toolbar_extra'); - - -echo ''; - -// }}} -// {{{ その他のツール - -echo '
      '; -echo '
    '; - -// {{{ その他 - お気に入りセット - -if ($thread_info && $_conf['expack.misc.multi_favs']) { - echo ''; - for ($i = 1; $i <= $_conf['expack.misc.favset_num']; $i++) { - echo ''; - if ($i % 5 === 0 && $i != $_conf['expack.misc.favset_num']) { - echo ''; - } - } - $mod_cells = $_conf['expack.misc.favset_num'] % 5; - if ($mod_cells) { - $mod_cells = 5 - $mod_cells; - for ($i = 0; $i < $mod_cells; $i++) { - echo ''; - } - } - echo ''; -} - -// }}} -// {{{ その他 - ボタン類 - -echo ''; +// その他ボタンとドロップダウンメニュー +$icon = "img/gp0-more.png"; +$srcset = _toolbar_i_srcset($icon); +echo ' '; +//echo toolbar_i_dropdown_button('img/gp0-more.png', null); +echo << + '; +echo toolbar_i_menuItem('img/glyphish/icons2/63-runner.png', '>>1に移動', $escaped_url); // 類似スレ検索 -echo ''; +echo toolbar_i_menuItem('img/glyphish/icons2/06-magnifying-glass.png', '類似スレを検索', $escaped_url); // 殿堂入り -echo ''; - -// スレッドあぼーん -echo ''; +echo toolbar_i_palace_menuItem('img/glyphish/icons2/108-badge.png', '殿堂入り', $thread_info); // IC2リンク、件数 if ($_conf['expack.ic2.enabled'] && $_conf['expack.ic2.thread_imagelink']) { $escaped_url = 'iv2.php?field=memo&keyword=' . rawurlencode($aThread->ttitle) . "&session_no_close=1{$_conf['k_at_a']}"; - echo ''; } -echo ''; +// お気に入りセット +if ($thread_info && $_conf['expack.misc.multi_favs']) { + echo toolbar_i_menuItem('img/glyphish/icons2/28-star.png', 'お気に入りセットに登録', '#' ,'data-toggle="modal" data-target="#favsetModal"'); +} -// }}} +echo '
  • '; //仕切り -echo '
    '; - echo toolbar_i_fav_button('img/glyphish/icons2/28-star.png', '-', $thread_info, $i); - echo '
     
    '; +// >>1に移動 $escaped_url = "{$_conf['read_php']}?{$host_bbs_key_q}&ls=1-{$rnum_range}{$offline_q}{$_conf['k_at_a']}"; -echo toolbar_i_standard_button('img/glyphish/icons2/63-runner.png', '>>1', $escaped_url); -echo ''; $escaped_url = "{$_conf['subject_php']}?{$host_bbs_key_q}&itaj_en=" . UrlSafeBase64::encode($aThread->itaj) . '&method=similar&word=' . rawurlencode($aThread->ttitle_hc) . "&refresh=1{$_conf['k_at_a']}"; -echo toolbar_i_standard_button('img/glyphish/icons2/06-magnifying-glass.png', '類似スレ', $escaped_url); -echo ''; -echo toolbar_i_palace_button('img/glyphish/icons2/108-badge.png', '殿堂入り', $thread_info); -echo ''; -echo toolbar_i_aborn_button('img/glyphish/icons2/128-bone.png', 'あぼーん', $thread_info); -echo ''; + if ($_conf['expack.ic2.thread_imagecount']) { require_once P2EX_LIB_DIR . '/ic2_getcount.inc.php'; $cnt = 0; @@ -231,26 +191,76 @@ $cnt = -1; } if ($cnt == 0) { - echo toolbar_i_disabled_button('img/glyphish/icons2/42-photos.png', - '画像'); + echo toolbar_i_disabled_menuItem('img/glyphish/icons2/42-photos.png', + '画像一覧'); } else { - echo toolbar_i_opentab_button('img/glyphish/icons2/42-photos.png', - '画像' . ($cnt < 0 ? '(?)' : "({$cnt})"), $escaped_url); + echo toolbar_i_menuItem('img/glyphish/icons2/42-photos.png', + '画像一覧' . ($cnt < 0 ? '(?)' : "({$cnt})"), $escaped_url, ' target="_blank"'); } } else { - echo toolbar_i_opentab_button('img/glyphish/icons2/42-photos.png', - '画像', $escaped_url); + echo toolbar_i_menuItem('img/glyphish/icons2/42-photos.png', + '画像一覧', $escaped_url, ' target="_blank"'); } - echo '
    '; +// スレッドあぼーん +echo toolbar_i_aborn_menuItem('img/glyphish/icons2/128-bone.png', 'スレをあぼーん', $thread_info); + +// ログ削除 +if (file_exists($aThread->keydat)) { + $escaped_url = "info.php?{$host_bbs_key_q}{$ttitle_en_q}&dele=1{$_conf['k_at_a']}"; + echo toolbar_i_menuItem('img/glyphish/icons2/64-zap.png', 'ログを削除', $escaped_url); +} else { + echo toolbar_i_disabled_menuItem('img/glyphish/icons2/64-zap.png', 'ログを削除'); +} + +echo ''; + +unset($icon,$srcset); +// }}} +// {{{ お気にセットダイアログ +if ($thread_info && $_conf['expack.misc.multi_favs']) { + $favset_body = ''; + for ($i = 1; $i <= $_conf['expack.misc.favset_num']; $i++) { + $favset_body .= ''; + if ($i % 5 === 0 && $i != $_conf['expack.misc.favset_num']) { + $favset_body .= ''; + } + } + $mod_cells = $_conf['expack.misc.favset_num'] % 5; + if ($mod_cells) { + $mod_cells = 5 - $mod_cells; + for ($i = 0; $i < $mod_cells; $i++) { + $favset_body .= ''; + } + } + $favset_body .= '
    '; + $favset_body .= toolbar_i_fav_button('img/glyphish/icons2/28-star.png', '-', $thread_info, $i); + $favset_body .= '
     
    '; -echo ''; +echo << + + +EOP; +} // }}} // {{{ レス検索フォーム diff --git a/lib/toolbar_i.inc.php b/lib/toolbar_i.inc.php index b12eceeae..d763ea56c 100644 --- a/lib/toolbar_i.inc.php +++ b/lib/toolbar_i.inc.php @@ -57,6 +57,53 @@ function _toolbar_i_button($icon, $label, $uri, $attrs = '') EOS; } +// }}} +/** + * ツールバーボタン (リンク) + * + * @param string $icon + * @param string $label + * @param string $uri + * @param string $attrs + * @return string + */ +function toolbar_i_menuItem($icon, $label, $uri, $attrs = '') +{ + global $_conf; + + if (strlen($attrs) && strncmp($attrs, ' ', 1) !== 0) { + $attrs = ' ' . $attrs; + } + + $srcset = _toolbar_i_srcset($icon); + + return <<{$label} +EOS; +} + +// }}} +// {{{ toolbar_i_disabled_button() + +/** + * 無効なツールバーボタン + * + * @param string $icon + * @param string $label + * @param string $uri + * @return string + */ +function toolbar_i_disabled_menuItem($icon, $label) +{ + global $_conf; + + $srcset = _toolbar_i_srcset($icon); + + return <<{$label} +EOS; +} + // }}} // {{{ toolbar_i_standard_button() @@ -279,7 +326,7 @@ function toolbar_i_fav_button($icon, $label, $info, $setnum = 0) * @param object $info @see lib/get_info.inc.php: get_thread_info() * @return string */ -function toolbar_i_palace_button($icon, $label, $info) +function toolbar_i_palace_menuItem($icon, $label, $info) { $attrs = ' onclick="return iutil.toolbarRunHttpCommand(this, event);"'; if (!$info->palace) { @@ -293,13 +340,8 @@ function toolbar_i_palace_button($icon, $label, $info) 'ttitle_en' => UrlSafeBase64::encode($info->ttitle), 'setpal' => 2, ), '', '&'); - if (empty($_conf['expack.iphone.toolbars.no_label']) && !empty($label) ) { - $label = '
    ' . $label; - } else { - $label = ''; - } - return _toolbar_i_button($icon, $label, $uri, $attrs); + return toolbar_i_menuItem($icon, $label, $uri, $attrs); } // }}} @@ -313,7 +355,7 @@ function toolbar_i_palace_button($icon, $label, $info) * @param object $info @see lib/get_info.inc.php: get_thread_info() * @return string */ -function toolbar_i_aborn_button($icon, $label, $info) +function toolbar_i_aborn_menuItem($icon, $label, $info) { $attrs = ' onclick="return iutil.toolbarRunHttpCommand(this, event);"'; if (!$info->taborn) { @@ -327,13 +369,8 @@ function toolbar_i_aborn_button($icon, $label, $info) 'ttitle_en' => UrlSafeBase64::encode($info->ttitle), 'taborn' => 2, ), '', '&'); - if (empty($_conf['expack.iphone.toolbars.no_label']) && !empty($label) ) { - $label = '
    ' . $label; - } else { - $label = ''; - } - return _toolbar_i_button($icon, $label, $uri, $attrs); + return toolbar_i_menuItem($icon, $label, $uri, $attrs); } // }}} diff --git a/rep2/css/iphone.css b/rep2/css/iphone.css index 1bb7603e7..0a8649d89 100644 --- a/rep2/css/iphone.css +++ b/rep2/css/iphone.css @@ -1046,6 +1046,10 @@ div.mtoolbar > .ttitle > span.btitle { width: 98%; } +.popup { + background-color: rgba(0, 0, 0, 0.8); +} + /* }}} */ /* From 70e06d6e8751ec6b0451d3152109c9757097c330 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 11 Oct 2017 01:04:54 +0900 Subject: [PATCH 255/339] =?UTF-8?q?=E6=8A=BC=E3=81=9B=E3=81=AA=E3=81=84?= =?UTF-8?q?=E3=83=A1=E3=83=8B=E3=83=A5=E3=83=BC=E9=A0=85=E7=9B=AE=E3=81=AE?= =?UTF-8?q?=E3=82=B9=E3=82=BF=E3=82=A4=E3=83=AB=E3=82=92=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/toolbar_i.inc.php | 2 +- rep2/css/iphone.css | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/toolbar_i.inc.php b/lib/toolbar_i.inc.php index d763ea56c..8a2f7ba36 100644 --- a/lib/toolbar_i.inc.php +++ b/lib/toolbar_i.inc.php @@ -100,7 +100,7 @@ function toolbar_i_disabled_menuItem($icon, $label) $srcset = _toolbar_i_srcset($icon); return <<{$label} +
  • {$label}{$label}
  • EOS; } diff --git a/rep2/css/iphone.css b/rep2/css/iphone.css index 0a8649d89..89d8f58e4 100644 --- a/rep2/css/iphone.css +++ b/rep2/css/iphone.css @@ -1050,6 +1050,17 @@ div.mtoolbar > .ttitle > span.btitle { background-color: rgba(0, 0, 0, 0.8); } +div.ntoolbar .disabled a:visited { + color: #555;!important +} + +.disabled > a > img{ + filter: alpha(opacity=20); + -ms-filter: "alpha(opacity=20)"; + -moz-opacity: 0.2; + opacity: 0.2; +} + /* }}} */ /* From c56e839012691c6b31b3fdc42d8023187da6e11e Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 11 Oct 2017 10:12:42 +0900 Subject: [PATCH 256/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=EF=BC=9A?= =?UTF-8?q?=E7=94=BB=E5=83=8F=E8=A1=A8=E7=A4=BA=E3=81=AE=E3=83=9C=E3=82=BF?= =?UTF-8?q?=E3=83=B3=E3=81=8C=E6=96=87=E5=AD=97=E3=81=AB=E5=AF=BE=E3=81=97?= =?UTF-8?q?=E3=81=A6=E7=B4=B0=E3=81=99=E3=81=8E=E3=82=8B=E4=B8=8D=E5=85=B7?= =?UTF-8?q?=E5=90=88=E4=BF=AE=E6=AD=A3=20=E3=82=B9=E3=83=9E=E3=83=9B?= =?UTF-8?q?=EF=BC=9AAndroid=E3=81=A7=E3=82=82=E3=82=B9=E3=83=AF=E3=82=A4?= =?UTF-8?q?=E3=83=97=E3=83=A1=E3=83=8B=E3=83=A5=E3=83=BC=E3=81=8C=E5=8B=95?= =?UTF-8?q?=E3=81=8F=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/css/limelight.css | 3 +-- rep2/js/iphone.js | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/rep2/css/limelight.css b/rep2/css/limelight.css index e677202c4..9fb99d110 100644 --- a/rep2/css/limelight.css +++ b/rep2/css/limelight.css @@ -105,7 +105,6 @@ table.limelight-toolbar td { span.limelight-button { display: inline-block; width: 45px; - height: 15px; margin: 0; padding: 5px 10px; background-color: rgba(0, 0, 0, 0.5); @@ -114,7 +113,7 @@ span.limelight-button { color: #fff; text-shadow: #000 1px 1px 1px; font-family: sans-serif; - font-size: 15px; + font-size: 13px; font-weight: bold; text-align: center; line-height: 100%; diff --git a/rep2/js/iphone.js b/rep2/js/iphone.js index 9df463121..976343788 100644 --- a/rep2/js/iphone.js +++ b/rep2/js/iphone.js @@ -9,7 +9,7 @@ var iutil = { * クライアントがiPhoneかどうか * @type {Boolean} */ - 'iphone': (/iP(hone|od)/).test(navigator.userAgent), + 'iphone': (/(iP(hone|od|ad)|Chrome)/).test(navigator.userAgent), /** * 内部リンクの正規表現 * @type {RegExp} From 404b482cc0b0d489d16bb9322d5bcf91e8f3ba8f Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 11 Oct 2017 11:27:51 +0900 Subject: [PATCH 257/339] =?UTF-8?q?XMLHttpRequest();=E3=81=ABwithCredentia?= =?UTF-8?q?ls=20=3D=20true;=E3=82=92=E8=A8=AD=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/js/ic2_iphone.js | 2 ++ rep2/js/ic2_popinfo.js | 1 + rep2/js/invite.js | 1 + rep2/js/iphone.js | 2 ++ rep2/js/menu.js | 2 ++ rep2/js/menu_i.js | 5 +++++ rep2/js/post_draft.js | 1 + rep2/js/respopup_iphone.js | 1 + rep2/js/sb_iphone.js | 1 + rep2/js/tgrepctl.js | 1 + 10 files changed, 17 insertions(+) diff --git a/rep2/js/ic2_iphone.js b/rep2/js/ic2_iphone.js index 1f6d82d9d..87e570937 100644 --- a/rep2/js/ic2_iphone.js +++ b/rep2/js/ic2_iphone.js @@ -135,6 +135,7 @@ document.addEventListener('DOMContentLoaded', function(event) { try { req = new XMLHttpRequest(); req.open('GET', url, false); + req.withCredentials = true; req.send(null); res = null; @@ -177,6 +178,7 @@ document.addEventListener('DOMContentLoaded', function(event) { + _uniquery(), false ); + req.withCredentials = true; req.send(null); if (req.readyState == 4) { diff --git a/rep2/js/ic2_popinfo.js b/rep2/js/ic2_popinfo.js index 55e4c4038..c8f0b33ca 100644 --- a/rep2/js/ic2_popinfo.js +++ b/rep2/js/ic2_popinfo.js @@ -113,6 +113,7 @@ var _ic2_popinfo_js_onload = function() { + _uniquery(), false ); + req.withCredentials = true; req.send(null); if (req.readyState == 4) { diff --git a/rep2/js/invite.js b/rep2/js/invite.js index 7bcc533d7..24f20d8fe 100644 --- a/rep2/js/invite.js +++ b/rep2/js/invite.js @@ -18,6 +18,7 @@ function Invite(title, url, host, bbs, key, resnum) var uri = 'read_async.php?host='+host+'&bbs='+bbs+'&key='+key+'&ls='+resnum+'n&q=2&offline=1'; var req = getXmlHttp(); req.open('get', uri, false); + req.withCredentials = true; req.send(null); if (req.readyState == 4 && req.status == 200) { msg = '\n\n' + req.responseText; diff --git a/rep2/js/iphone.js b/rep2/js/iphone.js index 976343788..a9ce8f136 100644 --- a/rep2/js/iphone.js +++ b/rep2/js/iphone.js @@ -619,6 +619,7 @@ iutil.httpGetText = function(uri) { try { req = new XMLHttpRequest(); req.open('GET', uri, false); + req.withCredentials = true; req.send(null); if (req.readyState == 4) { @@ -645,6 +646,7 @@ iutil.httpGetText = function(uri) { iutil.httpGetAsync = function(uri, callback) { var req = new XMLHttpRequest(); req.open('GET', uri, true); + req.withCredentials = true; req.onreadystatechange = function() { if (req.readyState == 4) { if (req.status == 200) { diff --git a/rep2/js/menu.js b/rep2/js/menu.js index 277df3031..efd1969b0 100644 --- a/rep2/js/menu.js +++ b/rep2/js/menu.js @@ -56,6 +56,7 @@ function replaceMenuItem(itemId, qKey, qValue) receiver.innerHTML = 'Now Loading...'; req.open('get', uri, false); + req.withCredentials = true; req.send(null); if (req.readyState == 4) { @@ -95,6 +96,7 @@ function changeSkin(skinName) } req.open('get', uri, false); + req.withCredentials = true; req.send(null); try { diff --git a/rep2/js/menu_i.js b/rep2/js/menu_i.js index 3ade1fa50..20e564e53 100644 --- a/rep2/js/menu_i.js +++ b/rep2/js/menu_i.js @@ -142,6 +142,7 @@ req = new XMLHttpRequest(); req.open('GET', uri, true); + req.withCredentials = true; req.onreadystatechange = generateOnToggle(req, div, toggled); req.send(null); }; @@ -169,6 +170,7 @@ toggled = div.getAttribute('toggled') === 'true'; req = new XMLHttpRequest(); req.open('GET', uri, true); + req.withCredentials = true; req.onreadystatechange = generateOnToggle(req, div, toggled); req.send(null); }; @@ -195,6 +197,7 @@ req = new XMLHttpRequest(); req.open('GET', uri, true); + req.withCredentials = true; req.onreadystatechange = generateOnToggle(req, div, toggled); req.send(null); }; @@ -546,6 +549,7 @@ if (anchor.href.indexOf('?spmode=merge_favita') === -1) { req = new XMLHttpRequest(); req.open('GET', 'info_js.php?' + sliding.query, true); + req.withCredentials = true; req.onreadystatechange = generateOnBoardInfoGet(req, JSON.parse, pop, table); req.send(null); } @@ -589,6 +593,7 @@ table.style.display = 'none'; req = new XMLHttpRequest(); req.open('GET', 'info_js.php?' + sliding.query, true); + req.withCredentials = true; req.onreadystatechange = generateOnThreadInfoGet(req, JSON.parse, pop, table); req.send(null); diff --git a/rep2/js/post_draft.js b/rep2/js/post_draft.js index 7aa2e8fb4..a0692a7ac 100644 --- a/rep2/js/post_draft.js +++ b/rep2/js/post_draft.js @@ -37,6 +37,7 @@ var post_draft = function(host, bbs, key, csrfid, data, fin, err) { if (!req) return; req.open('POST', 'post_draft.php', true); + req.withCredentials = true; req.onreadystatechange = function (aEvt) { if (req.readyState == 4) { if(req.status == 200) diff --git a/rep2/js/respopup_iphone.js b/rep2/js/respopup_iphone.js index 04634850e..aed07a1f4 100644 --- a/rep2/js/respopup_iphone.js +++ b/rep2/js/respopup_iphone.js @@ -163,6 +163,7 @@ ipoputil.popup = function(url, evt) { var popid = '_respop' + popnum; var req = new XMLHttpRequest(); req.open('GET', url + '&ajax=true&respop_id=' + popnum, true); + req.withCredentials = true; req.onreadystatechange = function() { if (this.readyState == 4) { if (this.status == 200) { diff --git a/rep2/js/sb_iphone.js b/rep2/js/sb_iphone.js index e9e1ae172..0a9eaeac8 100644 --- a/rep2/js/sb_iphone.js +++ b/rep2/js/sb_iphone.js @@ -390,6 +390,7 @@ table.style.display = 'none'; req = new XMLHttpRequest(); req.open('GET', 'info_js.php?' + sliding.query, true); + req.withCredentials = true; req.onreadystatechange = generateOnThreadInfoGet(req, JSON.parse, pop, table); req.send(null); diff --git a/rep2/js/tgrepctl.js b/rep2/js/tgrepctl.js index 7a6099be0..15e724378 100644 --- a/rep2/js/tgrepctl.js +++ b/rep2/js/tgrepctl.js @@ -27,6 +27,7 @@ tGrep.execRequest = function (uri, menuId) { receiver.innerHTML = 'Now Loading...'; req.open('get', uri, false); + req.withCredentials = true; req.send(null); if (req.readyState == 4) { From 8e986cff56e2106363e3dc4e714f6cbd39be97b5 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 11 Oct 2017 11:38:30 +0900 Subject: [PATCH 258/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B:read?= =?UTF-8?q?=E3=81=ABtarget=3D"=5Fblank"=E3=82=92=E6=8C=87=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ShowThreadI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ShowThreadI.php b/lib/ShowThreadI.php index 8db0cc160..038a13f02 100644 --- a/lib/ShowThreadI.php +++ b/lib/ShowThreadI.php @@ -839,7 +839,7 @@ public function plugin_linkURL($url, $purl, $str) } else { $link_url = $url; } - return "{$str}"; + return "{$str}"; } return false; } From c4db142a301e8a2c9fa14451ef46cf2a7c468c9c Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 11 Oct 2017 12:21:46 +0900 Subject: [PATCH 259/339] =?UTF-8?q?API:UA=E3=82=92=E6=9B=B4=E6=96=B0=20thx?= =?UTF-8?q?!=20http://jbbs.shitaraba.net/bbs/read.cgi/computer/44179/14916?= =?UTF-8?q?34793/155?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/conf_user_def.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/conf_user_def.inc.php b/conf/conf_user_def.inc.php index 77233cedc..6b2227892 100644 --- a/conf/conf_user_def.inc.php +++ b/conf/conf_user_def.inc.php @@ -405,14 +405,14 @@ 'DOLIB/1.00' => '1 DOLIB/1.00', 'Monazilla/1.3' => '2 Monazilla/1.3', 'Monazilla/1.00 (%s)' => '3 Monazilla/1.00 (AppName)', - 'Mozilla/3.0 (compatible; %s)' => '4 Mozilla/3.0 (compatible; AppName)', + 'Mozilla/5.0 (compatible; %s)' => '4 Mozilla/5.0 (compatible; AppName)', ); //DAT取得で使用するUser-Agent $conf_user_def['2chapi_ua.read'] = "Mozilla/3.0 (compatible; %s)"; // ("Monazilla/1.3") $conf_user_sel['2chapi_ua.read'] = array( 'Monazilla/1.00 (%s)' => '1 Monazilla/1.00 (AppName)', - 'Mozilla/3.0 (compatible; %s)' => '2 Mozilla/3.0 (compatible; AppName)', + 'Mozilla/5.0 (compatible; %s)' => '2 Mozilla/5.0 (compatible; AppName)', ); // API認証にSSLを使用する From b1b4e0d59f9d1523694065c473e68ae9769b9d0f Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 11 Oct 2017 13:06:38 +0900 Subject: [PATCH 260/339] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B:Android?= =?UTF-8?q?=E3=81=AEFirefox=E3=81=A7=E3=82=B9=E3=83=AF=E3=82=A4=E3=83=97?= =?UTF-8?q?=E3=83=A1=E3=83=8B=E3=83=A5=E3=83=BC=E3=81=8C=E5=8B=95=E3=81=8F?= =?UTF-8?q?=E3=82=89=E3=81=97=E3=81=84=E3=81=AE=E3=81=A7=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rep2/js/iphone.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rep2/js/iphone.js b/rep2/js/iphone.js index a9ce8f136..5ee27b05c 100644 --- a/rep2/js/iphone.js +++ b/rep2/js/iphone.js @@ -9,7 +9,7 @@ var iutil = { * クライアントがiPhoneかどうか * @type {Boolean} */ - 'iphone': (/(iP(hone|od|ad)|Chrome)/).test(navigator.userAgent), + 'iphone': (/(iP(hone|od|ad)|Android)/).test(navigator.userAgent), /** * 内部リンクの正規表現 * @type {RegExp} From d202c2299cb4d313dc3dc268779fa29e5641cee1 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 11 Oct 2017 15:07:31 +0900 Subject: [PATCH 261/339] =?UTF-8?q?Firefox=E3=81=AEAndroid=E7=89=88?= =?UTF-8?q?=E3=82=92=E3=82=B9=E3=83=9E=E3=83=9B=E6=89=B1=E3=81=84=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=E3=80=82=E7=89=B9=E5=88=A5=E3=81=AA=E9=85=8D?= =?UTF-8?q?=E6=85=AE=E3=81=AF=E7=84=A1=E3=81=84=E3=81=AE=E3=81=A7=E4=B8=8D?= =?UTF-8?q?=E5=85=B7=E5=90=88=E3=81=AF=E7=9F=A5=E3=82=89=E3=82=93=E3=80=82?= =?UTF-8?q?=20Android2.2=E4=BB=A5=E4=B8=8B=E3=81=AB=E5=AF=BE=E3=81=99?= =?UTF-8?q?=E3=82=8B=E4=BA=92=E6=8F=9B=E6=80=A7=E3=81=AE=E9=85=8D=E6=85=AE?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4=E3=80=82=E6=97=A9=E3=81=8F=E3=81=AA?= =?UTF-8?q?=E3=82=8B=E3=81=AF=E3=81=9A=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/UA.php | 53 ++++++++++++++++++++++++++++++++++++++++++- lib/bootstrap.php | 4 ++-- lib/toolbar_i.inc.php | 2 +- rep2/menu_i.php | 4 ++-- 4 files changed, 57 insertions(+), 6 deletions(-) diff --git a/lib/UA.php b/lib/UA.php index 37d9f4723..bc93110bc 100644 --- a/lib/UA.php +++ b/lib/UA.php @@ -183,7 +183,7 @@ static public function isIPhoneGroup($aua = null) // iPod touch // Mozilla/5.0 (iPod; U; CPU like Mac OS X; ja-jp) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A110a Safari/419.3 - if (preg_match('/iP(?:hone|[ao]d)/', $ua) || self::isAndroidWebKit($ua)) { + if (preg_match('/iP(?:hone|[ao]d)/', $ua) || self::isAndroid($ua)) { $isiPhoneGroup = true; } @@ -457,6 +457,34 @@ static public function isNintendoDS($ua = null) return false; } + // }}} + // {{{ isAndroid() + + /** + * UAがAndroidならtrueを返す。 + * + * @param string $ua UAを指定するなら + * @return boolean + */ + static public function isAndroid($ua = null) + { + if (is_null($ua) and isset($_SERVER['HTTP_USER_AGENT'])) { + $ua = $_SERVER['HTTP_USER_AGENT']; + } + if (!$ua) { + return false; + } + // シミュレータ + // Mozilla/5.0 (Linux; U; Android 1.0; en-us; generic) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2 + // T-mobile G1 + // Mozilla/5.0 (Linux; U; Android 1.0; en-us; dream) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2 + // genericとdreamが異なる + if (false !== strpos($ua, 'Android')) { + return true; + } + return false; + } + // }}} // {{{ isAndroidWebKit() @@ -485,6 +513,29 @@ static public function isAndroidWebKit($ua = null) return false; } + // }}} + // {{{ isAndroidWebKit() + + /** + * UAがAndroid(でFirefox)ならtrueを返す。 + * + * @param string $ua UAを指定するなら + * @return boolean + */ + static public function isAndroidFirefox($ua = null) + { + if (is_null($ua) and isset($_SERVER['HTTP_USER_AGENT'])) { + $ua = $_SERVER['HTTP_USER_AGENT']; + } + if (!$ua) { + return false; + } + if (false !== strpos($ua, 'Android') && false !== strpos($ua, 'Firefox')) { + return true; + } + return false; + } + // }}} // {{{ isSafariGroup() diff --git a/lib/bootstrap.php b/lib/bootstrap.php index 9f117614b..2e44b29b0 100644 --- a/lib/bootstrap.php +++ b/lib/bootstrap.php @@ -457,7 +457,7 @@ EOS; } - +/* // AndroidではJavaScript-XPathを使う if ($_conf['iphone'] && UA::isAndroidWebKit()) { $_conf['extra_headers_ht'] .= << EOS; } - +*/ // iPhone用スキン if ($_conf['iphone'] && isset($_conf['expack.iphone.skin'])) { if (strpos($_conf['expack.iphone.skin'], DIRECTORY_SEPARATOR) === false) { diff --git a/lib/toolbar_i.inc.php b/lib/toolbar_i.inc.php index 8a2f7ba36..d62a156dd 100644 --- a/lib/toolbar_i.inc.php +++ b/lib/toolbar_i.inc.php @@ -497,7 +497,7 @@ function _toolbar_i_client_type() switch ($_conf['client_type']) { case 'i': - $type = UA::isAndroidWebKit() ? 'android' : 'iphone'; + $type = UA::isAndroid() ? 'android' : 'iphone'; break; case 'i': $type = 'mobile'; diff --git a/rep2/menu_i.php b/rep2/menu_i.php index 41488030d..9fa915a8c 100644 --- a/rep2/menu_i.php +++ b/rep2/menu_i.php @@ -55,10 +55,10 @@ - + - + Date: Wed, 11 Oct 2017 15:16:27 +0900 Subject: [PATCH 262/339] v171011.1515 --- conf/conf.inc.php | 2 +- doc/README-774.txt | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/conf/conf.inc.php b/conf/conf.inc.php index e1b49cb1c..615d2c193 100644 --- a/conf/conf.inc.php +++ b/conf/conf.inc.php @@ -7,7 +7,7 @@ // バージョン情報 $_conf = array( 'p2name' => 'rep2-expack_allinone', // rep2の名前 - 'p2version' => '171009.0000', // rep2のバージョン + 'p2version' => '171011.1515', // rep2のバージョン ); $_conf['p2ua'] = "{$_conf['p2name']}/{$_conf['p2version']}"; diff --git a/doc/README-774.txt b/doc/README-774.txt index 57253aff0..772beec6b 100644 --- a/doc/README-774.txt +++ b/doc/README-774.txt @@ -72,6 +72,14 @@ PHP7 ●ChangeLog +171011.1515 +* スマホ用readのツールバーをポップアップメニュー形式に変更 +* スマホ用readの外部リンクにtarget="_blank"を指定 +* スマホ用画像表示のボタンが文字に対して細すぎる不具合修正 +* FirefoxのAndroid版をスマホ扱いに変更 +* Android 2.2以下に対応するためのコードを削除して表示を高速化 +* スマホ用スレ一覧でAndroidでもスワイプメニューが動くように修正 + 171009.0000 * スマホ用画面の更新ボタンの表示条件に誤りがあったのを修正 * headline.5ch.netのスレを履歴に追加しないように修正 From ebcbc47d97c33f0e49fd03a0a98857048f4f47bc Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Wed, 11 Oct 2017 16:45:03 +0900 Subject: [PATCH 263/339] =?UTF-8?q?expack.ic2.enabled=E3=82=922=E3=81=AB?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=81=A8PC=EF=BE=8B=EF=BE=9E=EF=BD=AD?= =?UTF-8?q?=EF=BD=B0=E3=81=A7=E7=94=BB=E5=83=8FURL=E3=81=8C=E3=81=82?= =?UTF-8?q?=E3=82=8B=E3=81=A8fatal=20error=E3=81=8C=E5=87=BA=E3=82=8B?= =?UTF-8?q?=E4=B8=8D=E5=85=B7=E5=90=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/wiki/read.inc.php | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/wiki/read.inc.php b/lib/wiki/read.inc.php index 52df5997d..379445b5d 100644 --- a/lib/wiki/read.inc.php +++ b/lib/wiki/read.inc.php @@ -4,13 +4,12 @@ read系共通で使用しているため削除不可 */ -// ImageCache2が有効の場合 -if (in_array($_conf['expack.ic2.enabled'], array($_conf['ktai'] ? 1 : 2, 3))) { -// 置換画像URL - if ($_conf['expack.ic2.enabled'] >= 2) { - require_once P2_LIB_DIR . '/wiki/ReplaceImageUrlCtl.php'; - $GLOBALS['replaceImageUrlCtl'] = new ReplaceImageUrlCtl(); - } +// ImageCache2が有効の場合画像置換URLを読み込む +if ((!$_conf['ktai'] && $_conf['expack.ic2.enabled'] % 2 == 1) || + ($_conf['ktai'] && $_conf['expack.ic2.enabled'] >= 2)) { + require_once P2_LIB_DIR . '/wiki/ReplaceImageUrlCtl.php'; + $GLOBALS['replaceImageUrlCtl'] = new ReplaceImageUrlCtl(); + } // 携帯ビュー以外の場合 if (!$_conf['ktai'] || $_conf['iphone']) { From 28e813da3863c5fb083f025550be04f925ca4ea2 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Thu, 12 Oct 2017 11:57:02 +0900 Subject: [PATCH 264/339] =?UTF-8?q?http=E3=81=8C=E7=84=A1=E3=81=8F?= =?UTF-8?q?=E3=81=A6=E3=82=82cURLMulti=E3=81=8C=E4=BD=BF=E3=81=88=E3=82=8B?= =?UTF-8?q?=E3=81=AF=E3=81=9A=E3=81=AA=E3=81=AE=E3=81=A7=E3=83=81=E3=82=A7?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/fetch-subject-txt.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/fetch-subject-txt.php b/scripts/fetch-subject-txt.php index f393cee7e..4a3bc170f 100644 --- a/scripts/fetch-subject-txt.php +++ b/scripts/fetch-subject-txt.php @@ -9,8 +9,8 @@ die('CLI only!'); } -if (!extension_loaded('http')) { - fwrite(STDERR, 'http extension is not loaded.' . PHP_EOL); +if (!$_conf['expack.use_curl_multi'] && !$_conf['expack.use_pecl_http']) { + fwrite(STDERR, 'Setting of expack.use_curl_multi or expack.use_pecl_http is required.' . PHP_EOL); exit(1); } From 00ddb7f4a329ab4de395b43ec4801ba47eef4669 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Thu, 12 Oct 2017 12:35:59 +0900 Subject: [PATCH 265/339] =?UTF-8?q?README.md=E3=80=80=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index eab3247da..c5d93a93e 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,25 @@ 迢ャ閾ェ縺ョ謾ケ濶ッ繧り。後▲縺ヲ縺縺セ縺吶 -### 霑ス蜉讖溯ス +* [繧ケ繧ッ繝ェ繝シ繝ウ繧キ繝ァ繝繝](https://open774.github.io/p2-php/screenshots.html) +* [Wiki](https://github.com/open774/p2-php/wiki) +* **[FAQ](https://github.com/open774/p2-php/wiki/FAQ) 繧ケ繝ャ縺ォ譖ク縺丞燕縺ォ縺九i縺ェ繧峨★遒コ隱** + +### 荳サ縺ェ霑ス蜉讖溯ス 蜷讖溯ス縺ョ隱ャ譏弱ッdoc繝繧」繝ャ繧ッ繝医Μ縺ョREADME繝輔ぃ繧、繝ォ繧定ヲ九※縺上□縺輔>縲 +* cron縺ィ縺九〒譛霑題ェュ繧薙□繧ケ繝ャ縺ェ縺ゥ縺ョdat繧奪L蜃コ譚・繧九せ繧ッ繝ェ繝励ヨ霑ス蜉 +
     php scripts/fetch-dat.php --mode 繝「繝シ繝峨r荳縺、謖螳(fav recent res_hist)
    +* 蜷咲┌縺励′遽遨エ縺ォ縺ェ繧区攸縺ォ蜷咲┌縺励〒譖ク縺崎セシ繧縺ィ縺阪↓隴ヲ蜻翫r蜃コ縺呎ゥ溯ス繧定ソス蜉 +* NG縺ゅ⊂繝シ繧薙ョ蟇セ雎。縺ォ縺ェ縺」縺溘Ξ繧ケ縺ョID繧定ェ蜍慕噪縺ォNG縺ゅ⊂繝シ繧薙☆繧区ゥ溯ス繧定ソス蜉 +* 縲瑚ィュ螳夂ョ。逅縲阪°繧峨く繝」繝繧キ繝・繝サ螻・豁エ縺ョ豸亥悉縺ァ縺阪k讖溯ス繧定ソス蜉 +* 譛ャ螳カ縺九ibe縺ョ繝ュ繧ー繧、繝ウ驛ィ蛻繧堤ァサ讀阪@縺ヲBE2.0縺ォ蟇セ蠢 +* rep2縺ォ逋サ骭イ縺輔l縺溷、夜Κ譚ソ縺ョ繝ェ繝ウ繧ッ繧偵rrep2縺ァ髢九¢繧九h縺縺ォ縺励◆シJane縺ィ蜷後§蜍穂ス懶シ +* 0縺。繧繧薙ュ繧九せ繧ッ繝ェ繝励ヨ繧剃スソ逕ィ縺励◆螟夜Κ譚ソ縺ョ驕主悉繝ュ繧ーDAT繧貞叙繧願セシ縺ソ蟇セ蠢 +* SOCKS5繝励Ο繧ッ繧キ邨檎罰縺ョ謗・邯壹↓蟇セ蠢(莠コ譟ア) +* tor蜀縺ョ謗イ遉コ譚ソ(.onion繝峨Γ繧、繝ウ)繧稚or邨檎罰縺ァ髢イ隕ァ縺吶k讖溯ス繧定ソス蜉(莠コ譟ア) +* curl 繧堤畑縺縺滉クヲ蛻励ム繧ヲ繝ウ繝ュ繝シ繝画ゥ溯ス繧定ソス蜉(莠コ譟ア讖溯ス) ## 繧サ繝繝医い繝繝 @@ -58,7 +73,7 @@ moriyoshi++ 繧ケ繝ャ縺ォ雋シ繧峨l縺ヲ縺繧狗判蜒上r閾ェ蜍輔〒菫晏ュ倥☆繧区ゥ溯ス縲**ImageCache2**縺後≠繧翫∪縺吶 -see also [doc/ImageCache2/README.txt](https://github.com/rsky/p2-php/blob/master/doc/ImageCache2/README.txt), [doc/ImageCache2/INSTALL.txt](https://github.com/rsky/p2-php/blob/master/doc/ImageCache2/INSTALL.txt) +see also [doc/ImageCache2/README.txt](https://github.com/open774/p2-php/blob/master/doc/ImageCache2/README.txt), [doc/ImageCache2/INSTALL.txt](https://github.com/open774/p2-php/blob/master/doc/ImageCache2/INSTALL.txt) ### 貅門y @@ -83,10 +98,25 @@ see also [doc/ImageCache2/README.txt](https://github.com/rsky/p2-php/blob/master 邏ー縺九>謖吝虚縺ョ螟画峩縺ッ `繝。繝九Η繝シ > 險ュ螳夂ョ。逅 > 繝ヲ繝シ繧カ繝シ險ュ螳夂キィ髮` 縺九i陦後∴縺セ縺吶 -Web繝悶Λ繧ヲ繧カ縺九i螟画峩縺ァ縺阪↑縺鬆逶ョ縺ッ [conf/conf_admin.inc.php](https://github.com/rsky/p2-php/blob/master/conf/conf_admin.inc.php) (蝓コ譛ャ), [conf/conf_admin_ex.inc.php](https://github.com/rsky/p2-php/blob/master/conf/conf_admin_ex.inc.php) (諡。蠑オ繝代ャ繧ッ), [conf/conf_ic2.inc.php](https://github.com/rsky/p2-php/blob/master/conf/conf_ic2.inc.php) (ImageCache2) 繧堤峩謗・邱ィ髮縺励∪縺吶 +Web繝悶Λ繧ヲ繧カ縺九i螟画峩縺ァ縺阪↑縺鬆逶ョ縺ッ [conf/conf_admin.inc.php](https://github.com/open774/p2-php/blob/master/conf/conf_admin.inc.php) (蝓コ譛ャ), [conf/conf_admin_ex.inc.php](https://github.com/open774/p2-php/blob/master/conf/conf_admin_ex.inc.php) (諡。蠑オ繝代ャ繧ッ), [conf/conf_ic2.inc.php](https://github.com/open774/p2-php/blob/master/conf/conf_ic2.inc.php) (ImageCache2) 繧堤峩謗・邱ィ髮縺励∪縺吶 縺ゥ縺縺縺縺薙→縺後〒縺阪k縺区嶌縺崎オキ縺薙☆縺ョ縺碁擇蛟偵↑縺ョ縺ァ險ュ螳壹ヵ繧。繧、繝ォ縺ョ繧ウ繝。繝ウ繝医r隕九※縺上□縺輔>縲 +## cron繧剃スソ縺」縺滉セソ蛻ゥ讖溯ス +荳玖ィ倥ョ繧ケ繧ッ繝ェ繝励ヨ繧団ron縺ァ螳壽悄逧縺ォ蝗槭☆縺ィ繧医j萓ソ蛻ゥ縺ォrep2繧剃スソ逕ィ縺吶k縺薙→縺悟コ譚・縺セ縺吶 +蠢隕√↓蠢懊§縺ヲ縺ゥ縺。繧峨°荳縺、繧剃スソ逕ィ縺吶l縺ー蜈蛻縺ァ縺励g縺縲 + +### 螻・豁エ縺ョ譁ー逹謨ー譖エ譁ー +繝悶Λ繧ヲ繧カ縺九i譖エ譁ー繧定。後≧縺ィ荳隕ァ縺ョ陦ィ遉コ縺ォ譎る俣縺後°縺九k縺溘a縲《ubject.txt繧呈峩譁ー縺吶k縺溘a縺ョ繧ケ繧ッ繝ェ繝励ヨ縺御サ伜ア槭@縺ヲ縺縺セ縺吶 +荳ヲ蛻励ム繧ヲ繝ウ繝ュ繝シ繝峨〒鬮倬溘〒縺吶′縲∽スソ逕ィ縺吶k縺溘a縺ォ險ュ螳壼、画峩繧定。後≧蠢隕√′縺ゅj縺セ縺吶 + +
    php scripts/fetch-subject-txt.php --mode 繝「繝シ繝峨r荳縺、謖螳(fav recent res_hist)
    + +### 譖エ譁ー縺、縺縺ァ縺ォDAT縺ョ繝繧ヲ繝ウ繝ュ繝シ繝 +荳ヲ蛻励ム繧ヲ繝ウ繝ュ繝シ繝峨ョ莉」繧上j縺ォsubject.txt縺ィDAT縺ョ繝繧ヲ繝ウ繝ュ繝シ繝画ゥ溯ス繧貞ョ溯」縺励◆繧ケ繧ッ繝ェ繝励ヨ縺ァ縺吶 +譎る俣縺ッ縺九°繧翫∪縺吶′縲∬ィュ螳壼、画峩辟。縺励〒菴ソ縺医k縺ョ縺ァ縺薙■繧峨′縺頑焔霆ス縺ァ縺吶 + +
    php scripts/fetch-dat.php --mode 繝「繝シ繝峨r荳縺、謖螳(fav recent res_hist)
    ## 譖エ譁ー From 405e8742e778701745536e98a33ceb8f50cf1cb5 Mon Sep 17 00:00:00 2001 From: open774 <11309861+open774@users.noreply.github.com> Date: Thu, 12 Oct 2017 15:15:38 +0900 Subject: [PATCH 266/339] =?UTF-8?q?PHP7.1=E3=81=A7Warning=E3=81=8C?= =?UTF-8?q?=E5=87=BA=E3=82=8B=E4=B8=8D=E5=85=B7=E5=90=88=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=20http://egg.5ch.net/test/read.cgi/software/1505071083/425=20?= =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B:res=5Fpopup=5Freload=E3=81=AE?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E3=81=8C=E5=8F=8D=E6=98=A0=E3=81=95=E3=82=8C?= =?UTF-8?q?=E3=81=AA=E3=81=84=E4=B8=8D=E5=85=B7=E5=90=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/expack/tgrep/view.inc.php | 2 +- rep2/spm_k.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/expack/tgrep/view.inc.php b/lib/expack/tgrep/view.inc.php index 352026687..8178033c4 100644 --- a/lib/expack/tgrep/view.inc.php +++ b/lib/expack/tgrep/view.inc.php @@ -167,7 +167,7 @@ function moveSubject(href, serachWord, query) {
    title; ?> ita; ?> tkey); ?>