Файловый менеджер - Редактировать - /home/harasnat/www/mf/player.tar
Назад
vimeo/tests/player_test.php 0000604 00000025422 15062106207 0012071 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Moodle is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. namespace media_vimeo; use core_media_manager; /** * Test script for media embedding. * * @package media_vimeo * @copyright 2016 Marina Glancy * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class player_test extends \advanced_testcase { /** * Pre-test setup. Preserves $CFG. */ public function setUp(): void { parent::setUp(); // Reset $CFG and $SERVER. $this->resetAfterTest(); // Consistent initial setup: all players disabled. \core\plugininfo\media::set_enabled_plugins('vimeo'); // Pretend to be using Firefox browser (must support ogg for tests to work). \core_useragent::instance(true, 'Mozilla/5.0 (X11; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0 '); } /** * Test that plugin is returned as enabled media plugin. */ public function test_is_installed() { $sortorder = \core\plugininfo\media::get_enabled_plugins(); $this->assertEquals(['vimeo' => 'vimeo'], $sortorder); } /** * Test embedding without media filter (for example for displaying URL resorce). */ public function test_embed_url() { global $CFG; $url = new \moodle_url('http://vimeo.com/1176321'); $manager = core_media_manager::instance(); $embedoptions = array( core_media_manager::OPTION_TRUSTED => true, core_media_manager::OPTION_BLOCK => true, ); $this->assertTrue($manager->can_embed_url($url, $embedoptions)); $content = $manager->embed_url($url, 'Test & file', 0, 0, $embedoptions); $this->assertMatchesRegularExpression('~mediaplugin_vimeo~', $content); $this->assertMatchesRegularExpression('~</iframe>~', $content); $this->assertMatchesRegularExpression('~width="' . $CFG->media_default_width . '" height="' . $CFG->media_default_height . '"~', $content); // Repeat sending the specific size to the manager. $content = $manager->embed_url($url, 'New file', 123, 50, $embedoptions); $this->assertMatchesRegularExpression('~width="123" height="50"~', $content); } /** * Test that mediaplugin filter replaces a link to the supported file with media tag. * * filter_mediaplugin is enabled by default. */ public function test_embed_link() { global $CFG; $url = new \moodle_url('http://vimeo.com/1176321'); $text = \html_writer::link($url, 'Watch this one'); $content = format_text($text, FORMAT_HTML); $this->assertMatchesRegularExpression('~mediaplugin_vimeo~', $content); $this->assertMatchesRegularExpression('~</iframe>~', $content); $this->assertMatchesRegularExpression('~width="' . $CFG->media_default_width . '" height="' . $CFG->media_default_height . '"~', $content); } /** * Test that mediaplugin filter adds player code on top of <video> tags. * * filter_mediaplugin is enabled by default. */ public function test_embed_media() { global $CFG; $url = new \moodle_url('http://vimeo.com/1176321'); $trackurl = new \moodle_url('http://example.org/some_filename.vtt'); $text = '<video controls="true"><source src="'.$url.'"/>' . '<track src="'.$trackurl.'">Unsupported text</video>'; $content = format_text($text, FORMAT_HTML); $this->assertMatchesRegularExpression('~mediaplugin_vimeo~', $content); $this->assertMatchesRegularExpression('~</iframe>~', $content); $this->assertMatchesRegularExpression('~width="' . $CFG->media_default_width . '" height="' . $CFG->media_default_height . '"~', $content); // Video tag, unsupported text and tracks are removed. $this->assertDoesNotMatchRegularExpression('~</video>~', $content); $this->assertDoesNotMatchRegularExpression('~<source\b~', $content); $this->assertDoesNotMatchRegularExpression('~Unsupported text~', $content); $this->assertDoesNotMatchRegularExpression('~<track\b~i', $content); // Video with dimensions and source specified as src attribute without <source> tag. $text = '<video controls="true" width="123" height="35" src="'.$url.'">Unsupported text</video>'; $content = format_text($text, FORMAT_HTML); $this->assertMatchesRegularExpression('~mediaplugin_vimeo~', $content); $this->assertMatchesRegularExpression('~</iframe>~', $content); $this->assertMatchesRegularExpression('~width="123" height="35"~', $content); } /** * Test embedding without media filter (for example for displaying URL resorce) * and test that player plugin is parsing the URL with the code. */ public function test_embed_url_with_code() { global $CFG; $url = new \moodle_url('https://vimeo.com/1176321/abcdef12345'); $manager = core_media_manager::instance(); $embedoptions = array( core_media_manager::OPTION_TRUSTED => true, core_media_manager::OPTION_BLOCK => true, ); $this->assertTrue($manager->can_embed_url($url, $embedoptions)); $content = $manager->embed_url($url, 'Test & file', 0, 0, $embedoptions); // Video source URL is contains the new vimeo embedded URL format. $this->assertStringContainsString('player.vimeo.com/video/1176321?h=abcdef12345', $content); $this->assertMatchesRegularExpression('~mediaplugin_vimeo~', $content); $this->assertMatchesRegularExpression('~</iframe>~', $content); $this->assertMatchesRegularExpression('~width="' . $CFG->media_default_width . '" height="' . $CFG->media_default_height . '"~', $content); // Repeat sending the specific size to the manager. $content = $manager->embed_url($url, 'New file', 123, 50, $embedoptions); $this->assertMatchesRegularExpression('~width="123" height="50"~', $content); } /** * Test that mediaplugin filter replaces a link to the supported file with media tag * and test that player plugin is parsing the URL with the code. * * filter_mediaplugin is enabled by default. */ public function test_embed_link_with_code() { global $CFG; $url = new \moodle_url('https://vimeo.com/1176321/abcdef12345'); $text = \html_writer::link($url, 'Watch this one'); $content = format_text($text, FORMAT_HTML); // Video source URL is contains the new vimeo embedded URL format. $this->assertStringContainsString('player.vimeo.com/video/1176321?h=abcdef12345', $content); $this->assertMatchesRegularExpression('~mediaplugin_vimeo~', $content); $this->assertMatchesRegularExpression('~</iframe>~', $content); $this->assertMatchesRegularExpression('~width="' . $CFG->media_default_width . '" height="' . $CFG->media_default_height . '"~', $content); } /** * Test that mediaplugin filter adds player code on top of <video> tags * and test that player plugin is parse the URL with the code. * * filter_mediaplugin is enabled by default. */ public function test_embed_media_with_code() { global $CFG; $url = new \moodle_url('https://vimeo.com/1176321/abcdef12345'); $trackurl = new \moodle_url('http://example.org/some_filename.vtt'); $text = '<video controls="true"><source src="'.$url.'"/>' . '<track src="'.$trackurl.'">Unsupported text</video>'; $content = format_text($text, FORMAT_HTML); // Video source URL is contains the new vimeo embedded URL format. $this->assertStringContainsString('player.vimeo.com/video/1176321?h=abcdef12345', $content); $this->assertMatchesRegularExpression('~mediaplugin_vimeo~', $content); $this->assertMatchesRegularExpression('~</iframe>~', $content); $this->assertMatchesRegularExpression('~width="' . $CFG->media_default_width . '" height="' . $CFG->media_default_height . '"~', $content); // Video tag, unsupported text and tracks are removed. $this->assertDoesNotMatchRegularExpression('~</video>~', $content); $this->assertDoesNotMatchRegularExpression('~<source\b~', $content); $this->assertDoesNotMatchRegularExpression('~Unsupported text~', $content); $this->assertDoesNotMatchRegularExpression('~<track\b~i', $content); // Video with dimensions and source specified as src attribute without <source> tag. $text = '<video controls="true" width="123" height="35" src="'.$url.'">Unsupported text</video>'; $content = format_text($text, FORMAT_HTML); $this->assertMatchesRegularExpression('~mediaplugin_vimeo~', $content); $this->assertMatchesRegularExpression('~</iframe>~', $content); $this->assertMatchesRegularExpression('~width="123" height="35"~', $content); } /** * Test that mediaplugin filter skip the process when the URL is invalid. */ public function test_skip_invalid_url_format_with_code() { $url = new \moodle_url('https://vimeo.com/_________/abcdef12345s'); $text = \html_writer::link($url, 'Invalid Vimeo URL'); $content = format_text($text, FORMAT_HTML); $this->assertStringNotContainsString('player.vimeo.com/video/_________?h=abcdef12345s', $content); $this->assertDoesNotMatchRegularExpression('~mediaplugin_vimeo~', $content); $this->assertDoesNotMatchRegularExpression('~</iframe>~', $content); } /** * Test that Vimeo media plugin renders embed code correctly * when the "do not track" config options is set to true. * * @covers \media_vimeo_plugin::embed_external */ public function test_vimeo_donottrack(): void { // Turn on the do not track option. set_config('donottrack', true, 'media_vimeo'); // Test that the embed code contains the do not track param in the url. $url = new \moodle_url('https://vimeo.com/226053498'); $text = \html_writer::link($url, 'Watch this one'); $content = format_text($text, FORMAT_HTML); $this->assertMatchesRegularExpression('~dnt=1~', $content); } } vimeo/templates/appembed.mustache 0000604 00000003370 15062106207 0013167 0 ustar 00 {{! This file is part of Moodle - http://moodle.org/ Moodle is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Moodle is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Moodle. If not, see <http://www.gnu.org/licenses/>. }} {{! @template media_vimeo/embed This template will render the Vimeo embeded player in a special format for the Moodle mobile app. Variables required for this template: * lang: The language of the user. * width: The width of the video. * height: The height of the video. * style: The style info for iframe. * embedurl: The URL to the video. Example context (json): { "lang": "en", "width": 640, "height": 360, "style": "position:absolute; top:0; left:0; width:100%; height:100%;", "embedurl": "https://player.vimeo.com/video/226053498" } }} <!DOCTYPE html> <html lang="{{lang}}"> <head> <title>{{#str}} pluginname, media_vimeo {{/str}}</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body style="margin:0; padding:0"> <iframe {{#style}}style="{{style}}" {{/style}} {{#width}}width="{{width}}" {{/width}} {{#height}}height="{{height}}" {{/height}} src="{{{embedurl}}}" allow="fullscreen" loading="lazy"> </iframe> </body> </html> vimeo/templates/embed.mustache 0000604 00000002540 15062106207 0012464 0 ustar 00 {{! This file is part of Moodle - http://moodle.org/ Moodle is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Moodle is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Moodle. If not, see <http://www.gnu.org/licenses/>. }} {{! @template media_vimeo/embed This template will render the Vimeo embeded player. Variables required for this template: * title: The title of the video. * width: The width of the video. * height: The height of the video. * embedurl: The URL to the video. Example context (json): { "title": "Vimeo video", "width": 640, "height": 360, "embedurl": "https://player.vimeo.com/video/226053498" } }} <span class="mediaplugin mediaplugin_vimeo"> <iframe title="{{title}}" width="{{width}}" height="{{height}}" style="border:0;" src="{{{embedurl}}}" allow="fullscreen" loading="lazy"></iframe> </span> vimeo/classes/privacy/provider.php 0000604 00000002745 15062106207 0013343 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Moodle is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Privacy provider implementation for media_vimeo. * * @package media_vimeo * @copyright 2018 Mihail Geshoski <mihail@moodle.com> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace media_vimeo\privacy; defined('MOODLE_INTERNAL') || die(); /** * Privacy provider implementation for media_vimeo. * * @copyright 2018 Mihail Geshoski <mihail@moodle.com> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class provider implements \core_privacy\local\metadata\null_provider { /** * Get the language string identifier with the component's language * file to explain why this plugin stores no data. * * @return string */ public static function get_reason() : string { return 'privacy:metadata'; } } vimeo/classes/plugin.php 0000604 00000006673 15062106207 0011336 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Moodle is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Main class for plugin 'media_vimeo' * * @package media_vimeo * @copyright 2016 Marina Glancy * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); /** * Player that embeds Vimeo links. * * @package media_vimeo * @copyright 2016 Marina Glancy * @author 2011 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class media_vimeo_plugin extends core_media_player_external { protected function embed_external(moodle_url $url, $name, $width, $height, $options) { global $OUTPUT; $donottrack = get_config('media_vimeo', 'donottrack'); $videoid = $this->get_video_id(); $info = s($name); $params = []; // Note: resizing via url is not supported, user can click the fullscreen // button instead. iframe embedding is not xhtml strict but it is the only // option that seems to work on most devices. self::pick_video_size($width, $height); // Add do not track parameter. if ($donottrack) { $params['dnt'] = 1; } $embedurl = new moodle_url("https://player.vimeo.com/video/$videoid", $params); // Template context. $context = [ 'width' => $width, 'height' => $height, 'title' => $info, 'embedurl' => $embedurl->out(false), ]; // Return the rendered template. return $OUTPUT->render_from_template('media_vimeo/embed', $context); } /** * Get Vimeo video ID. * @return string */ protected function get_video_id(): string { return $this->get_video_id_with_code() ?? $this->matches[1] ?? ''; } /** * Get video id with code. * @return string|null If NULL then the URL does not contain the code. */ protected function get_video_id_with_code(): ?string { $id = $this->matches[2] ?? null; if (!empty($id)) { $code = $this->matches[3] ?? null; if (!empty($code)) { return "{$id}?h={$code}"; } return $id; } return null; } /** * Returns regular expression to match vimeo URLs. * @return string */ protected function get_regex() { // Initial part of link. $start = '~^https?://vimeo\.com/'; // Middle bit: either 123456789 or 123456789/abdef12345. $middle = '(([0-9]+)/([0-9a-f]+)|[0-9]+)'; return $start . $middle . core_media_player_external::END_LINK_REGEX_PART; } public function get_embeddable_markers() { return array('vimeo.com/'); } /** * Default rank * @return int */ public function get_rank() { return 1010; } } vimeo/settings.php 0000604 00000002334 15062106207 0010231 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Moodle is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Settings file for plugin 'media_vimeo' * * @package media_vimeo * @copyright 2023 Matt Porritt <matt.porritt@moodle.com * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); if ($ADMIN->fulltree) { // Add a settings checkbox to enable or disable do not track vimeo links. $settings->add(new admin_setting_configcheckbox('media_vimeo/donottrack', new lang_string('donottrack', 'media_vimeo'), new lang_string('donottrack_desc', 'media_vimeo'), 0)); } vimeo/version.php 0000604 00000002153 15062106207 0010055 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Moodle is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Version details * * @package media_vimeo * @copyright 2016 Marina Glancy * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); $plugin->version = 2023100900; // The current plugin version (Date: YYYYMMDDXX). $plugin->requires = 2023100400; // Requires this Moodle version. $plugin->component = 'media_vimeo'; // Full name of the plugin (used for diagnostics). vimeo/lang/en/media_vimeo.php 0000604 00000002334 15062106207 0012172 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Moodle is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Strings for plugin 'media_vimeo' * * @package media_vimeo * @copyright 2016 Marina Glancy * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ $string['pluginname'] = 'Vimeo'; $string['pluginname_help'] = 'The video-sharing website vimeo.com.'; $string['privacy:metadata'] = 'The Vimeo media plugin does not store any personal data.'; $string['donottrack'] = 'Enable do not track Vimeo links'; $string['donottrack_desc'] = 'If enabled, the player will not track any session data, including all cookies and analytics.'; vimeo/pix/icon.png 0000604 00000006232 15062106207 0010117 0 ustar 00 �PNG IHDR �a OiCCPPhotoshop ICC profile xڝSgTS�=���BK���KoR RB���&*! J�!��Q�EEȠ�����Q,� ��!��������{�kּ�����>�����H3Q5��B������.@� $p �d!s�# �~<<+"�� x� �M��0���B�\���t�8K� @z�B� @F���&S � `�cb� P- `'�� ����{ [�!�� e�D h; ��V�E X0 fK�9 �- 0IWfH �� ��� 0Q��) { `�##x �� F�W<�+��* x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4��� ����x����6��_-��"bb��ϫp@ �t~�,/��;�m��%�h^�u��f�@� ���W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ �b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5 �j>{�-�]c�K'Xt�� �o��(�h���w��?�G�% �fI�q ^D$.Tʳ?� D��*�A�,����`6�B$��BB d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(�� A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;� 2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8, �c˱"����V����cϱw�E� 6wB aAHXLXN�H� $4� 7 �Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[ �b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w ��Ljg(�gw��L�Ӌ�T071���oUX*�*|�� �J�&�*/T����ުU�U�T��^S}�FU3S� Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k ��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN �(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ �M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��= ���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z�� ��%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%� y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y- �B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy� �+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U �}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n �ڴ �V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#����=TR��+�G�����w- 6 U����#pDy�� � :�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ ��8>99�?r��C�d�&����ˮ/~�����јѡ�m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-� bKGD � � ����� pHYs �� tIME� �넼 �IDAT8˝��ka�?ϓ����شpHQ(��BE��4[ ��8�8�م�c�J� Aq�HAC���8�7m(yis���8�$���n�����'