<?php
function escape_and_linkify($text) {
$regex =
'`https?+:(?://(?:(?:[-.0-9_a-z~]|%[0-9a-f][0-9a-f]' .
'|[!$&-,:;=])*+@)?+(?:\[(?:(?:[0-9a-f]{1,4}:){6}(?:' .
'[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:\d|[1-9]\d|1\d{2}|2' .
'[0-4]\d|25[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25' .
'[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(?' .
':\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]))|::(?:[0-9a-f' .
']{1,4}:){5}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:\d|[1' .
'-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(?:\d|[1-9]\d|1\d{' .
'2}|2[0-4]\d|25[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\\' .
'd|25[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])' .
')|(?:[0-9a-f]{1,4})?+::(?:[0-9a-f]{1,4}:){4}(?:[0-' .
'9a-f]{1,4}:[0-9a-f]{1,4}|(?:\d|[1-9]\d|1\d{2}|2[0-' .
'4]\d|25[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-' .
'5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(?:\d' .
'|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]))|(?:(?:[0-9a-f]{' .
'1,4}:)?+[0-9a-f]{1,4})?+::(?:[0-9a-f]{1,4}:){3}(?:' .
'[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:\d|[1-9]\d|1\d{2}|2' .
'[0-4]\d|25[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25' .
'[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(?' .
':\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]))|(?:(?:[0-9a-' .
'f]{1,4}:){0,2}[0-9a-f]{1,4})?+::(?:[0-9a-f]{1,4}:)' .
'{2}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:\d|[1-9]\d|1\\' .
'd{2}|2[0-4]\d|25[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4' .
']\d|25[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5' .
'])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]))|(?:(?:' .
'[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?+::[0-9a-f]{1,4' .
'}:(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:\d|[1-9]\d|1\d' .
'{2}|2[0-4]\d|25[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]' .
'\d|25[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]' .
')\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]))|(?:(?:[' .
'0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?+::(?:[0-9a-f]{1' .
',4}:[0-9a-f]{1,4}|(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25' .
'[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(?' .
':\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(?:\d|[1-9]\\' .
'd|1\d{2}|2[0-4]\d|25[0-5]))|(?:(?:[0-9a-f]{1,4}:){' .
'0,5}[0-9a-f]{1,4})?+::[0-9a-f]{1,4}|(?:(?:[0-9a-f]' .
'{1,4}:){0,6}[0-9a-f]{1,4})?+::|v[0-9a-f]++\.[!$&-.' .
'0-;=_a-z~]++)\]|(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0' .
'-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(?:\\' .
'd|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(?:\d|[1-9]\d|' .
'1\d{2}|2[0-4]\d|25[0-5])|(?:[-.0-9_a-z~]|%[0-9a-f]' .
'[0-9a-f]|[!$&-,;=])*+)(?::\d*+)?+(?:/(?:[-.0-9_a-z' .
'~]|%[0-9a-f][0-9a-f]|[!$&-,:;=@])*+)*+|/(?:(?:[-.0' .
'-9_a-z~]|%[0-9a-f][0-9a-f]|[!$&-,:;=@])++(?:/(?:[-' .
'.0-9_a-z~]|%[0-9a-f][0-9a-f]|[!$&-,:;=@])*+)*+)?+|' .
'(?:[-.0-9_a-z~]|%[0-9a-f][0-9a-f]|[!$&-,:;=@])++(?' .
':/(?:[-.0-9_a-z~]|%[0-9a-f][0-9a-f]|[!$&-,:;=@])*+' .
')*+)?+(?:\?+(?:[-.0-9_a-z~]|%[0-9a-f][0-9a-f]|[!$&' .
'-,/:;=?+@])*+)?+(?:#(?:[-.0-9_a-z~]|%[0-9a-f][0-9a' .
'-f]|[!$&-,/:;=?+@])*+)?+`i'
;
$regex,
function ($m) {
if (!isset($p['host'])) { return false;
}
switch ($p['host']) {
case 'www.nicovideo.jp':
return
preg_match('@^/watch/([sn]m\d++)/*+$@', $p['path'], $n) ?
'<script type="text/javascript" src="http://e...content-available-to-author-only...o.jp/thumb_watch/' . $n[1] . '"></script>' :
;
case 'nico.ms':
return
preg_match('@^/([sn]m\d++)/*+$@', $p['path'], $n) ?
'<script type="text/javascript" src="http://e...content-available-to-author-only...o.jp/thumb_watch/' . $n[1] . '"></script>' :
;
case 'youtu.be':
return
'<iframe width="420" height="315" src="//www.youtube.com/embed/' . $n[1] .'" frameborder="0" allowfullscreen></iframe>' :
;
case 'www.youtube.com':
case 'youtube.com':
case 'jp.youtube.com':
return false;
}
return
'<iframe width="420" height="315" src="//www.youtube.com/embed/' . $q['v'] .'" frameborder="0" allowfullscreen></iframe>' :
;
default:
}
},
);
}
$text = <<<EOD
Youtubeにはhttp://w...content-available-to-author-only...e.com/watch?v=s0SE8GMgeEIとか
http://y...content-available-to-author-only...u.be/s0SE8GMgeEIのようなURLフォーマットがあります。
http://w...content-available-to-author-only...e.com/watch?foo=hoge&v=s0SE8GMgeEI&bar=hogeのように
余分なクエリがついていてもちゃんと処理すべきでしょう。
日本に限定するならば
http://j...content-available-to-author-only...e.com/watch?v=s0SE8GMgeEIもちゃんと処理すべきですね。
一方ニコニコ動画には
http://w...content-available-to-author-only...o.jp/watch/sm1136355だけではなく
http://w...content-available-to-author-only...o.jp/watch/nm1136355のように、
「s」と「m」両方が来る可能性があります。また、
http://n...content-available-to-author-only...o.ms/sm1136355のような短縮URLもあります。
これらにはちゃんと対応すべきです。
とはいっても、無効なURLもちゃんと判別しなければなりません。
例えばhttp://y...content-available-to-author-only...u.be/s0SE8GMgeEI/hogehoge&a=bとかは明らかにおかしいし、
http://w...content-available-to-author-only...o.jp/watch/nm11363abcもニコニコ動画の仕様としてはおかしいです。
こういったものは無視する必要があります。当然、関係ないものはエスケープして表示させましょう。
「&」「<」「>」といった文字がちゃんとエスケープされるか確認してください。
EOD;
echo escape_and_linkify($text);
PD9waHAKCmZ1bmN0aW9uIGVzY2FwZV9hbmRfbGlua2lmeSgkdGV4dCkgewogICAgJHJlZ2V4ID0gCiAgICAgICAgJ2BodHRwcz8rOig/Oi8vKD86KD86Wy0uMC05X2Eten5dfCVbMC05YS1mXVswLTlhLWZdJyAuCiAgICAgICAgJ3xbISQmLSw6Oz1dKSorQCk/Kyg/OlxbKD86KD86WzAtOWEtZl17MSw0fTopezZ9KD86JyAuCiAgICAgICAgJ1swLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpcZHxbMS05XVxkfDFcZHsyfXwyJyAuCiAgICAgICAgJ1swLTRdXGR8MjVbMC01XSlcLig/OlxkfFsxLTldXGR8MVxkezJ9fDJbMC00XVxkfDI1JyAuCiAgICAgICAgJ1swLTVdKVwuKD86XGR8WzEtOV1cZHwxXGR7Mn18MlswLTRdXGR8MjVbMC01XSlcLig/JyAuCiAgICAgICAgJzpcZHxbMS05XVxkfDFcZHsyfXwyWzAtNF1cZHwyNVswLTVdKSl8OjooPzpbMC05YS1mJyAuCiAgICAgICAgJ117MSw0fTopezV9KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlxkfFsxJyAuCiAgICAgICAgJy05XVxkfDFcZHsyfXwyWzAtNF1cZHwyNVswLTVdKVwuKD86XGR8WzEtOV1cZHwxXGR7JyAuCiAgICAgICAgJzJ9fDJbMC00XVxkfDI1WzAtNV0pXC4oPzpcZHxbMS05XVxkfDFcZHsyfXwyWzAtNF1cXCcgLgogICAgICAgICdkfDI1WzAtNV0pXC4oPzpcZHxbMS05XVxkfDFcZHsyfXwyWzAtNF1cZHwyNVswLTVdKScgLgogICAgICAgICcpfCg/OlswLTlhLWZdezEsNH0pPys6Oig/OlswLTlhLWZdezEsNH06KXs0fSg/OlswLScgLgogICAgICAgICc5YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86XGR8WzEtOV1cZHwxXGR7Mn18MlswLScgLgogICAgICAgICc0XVxkfDI1WzAtNV0pXC4oPzpcZHxbMS05XVxkfDFcZHsyfXwyWzAtNF1cZHwyNVswLScgLgogICAgICAgICc1XSlcLig/OlxkfFsxLTldXGR8MVxkezJ9fDJbMC00XVxkfDI1WzAtNV0pXC4oPzpcZCcgLgogICAgICAgICd8WzEtOV1cZHwxXGR7Mn18MlswLTRdXGR8MjVbMC01XSkpfCg/Oig/OlswLTlhLWZdeycgLgogICAgICAgICcxLDR9Oik/K1swLTlhLWZdezEsNH0pPys6Oig/OlswLTlhLWZdezEsNH06KXszfSg/OicgLgogICAgICAgICdbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86XGR8WzEtOV1cZHwxXGR7Mn18MicgLgogICAgICAgICdbMC00XVxkfDI1WzAtNV0pXC4oPzpcZHxbMS05XVxkfDFcZHsyfXwyWzAtNF1cZHwyNScgLgogICAgICAgICdbMC01XSlcLig/OlxkfFsxLTldXGR8MVxkezJ9fDJbMC00XVxkfDI1WzAtNV0pXC4oPycgLgogICAgICAgICc6XGR8WzEtOV1cZHwxXGR7Mn18MlswLTRdXGR8MjVbMC01XSkpfCg/Oig/OlswLTlhLScgLgogICAgICAgICdmXXsxLDR9Oil7MCwyfVswLTlhLWZdezEsNH0pPys6Oig/OlswLTlhLWZdezEsNH06KScgLgogICAgICAgICd7Mn0oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86XGR8WzEtOV1cZHwxXFwnIC4KICAgICAgICAnZHsyfXwyWzAtNF1cZHwyNVswLTVdKVwuKD86XGR8WzEtOV1cZHwxXGR7Mn18MlswLTQnIC4KICAgICAgICAnXVxkfDI1WzAtNV0pXC4oPzpcZHxbMS05XVxkfDFcZHsyfXwyWzAtNF1cZHwyNVswLTUnIC4KICAgICAgICAnXSlcLig/OlxkfFsxLTldXGR8MVxkezJ9fDJbMC00XVxkfDI1WzAtNV0pKXwoPzooPzonIC4KICAgICAgICAnWzAtOWEtZl17MSw0fTopezAsM31bMC05YS1mXXsxLDR9KT8rOjpbMC05YS1mXXsxLDQnIC4KICAgICAgICAnfTooPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86XGR8WzEtOV1cZHwxXGQnIC4KICAgICAgICAnezJ9fDJbMC00XVxkfDI1WzAtNV0pXC4oPzpcZHxbMS05XVxkfDFcZHsyfXwyWzAtNF0nIC4KICAgICAgICAnXGR8MjVbMC01XSlcLig/OlxkfFsxLTldXGR8MVxkezJ9fDJbMC00XVxkfDI1WzAtNV0nIC4KICAgICAgICAnKVwuKD86XGR8WzEtOV1cZHwxXGR7Mn18MlswLTRdXGR8MjVbMC01XSkpfCg/Oig/OlsnIC4KICAgICAgICAnMC05YS1mXXsxLDR9Oil7MCw0fVswLTlhLWZdezEsNH0pPys6Oig/OlswLTlhLWZdezEnIC4KICAgICAgICAnLDR9OlswLTlhLWZdezEsNH18KD86XGR8WzEtOV1cZHwxXGR7Mn18MlswLTRdXGR8MjUnIC4KICAgICAgICAnWzAtNV0pXC4oPzpcZHxbMS05XVxkfDFcZHsyfXwyWzAtNF1cZHwyNVswLTVdKVwuKD8nIC4KICAgICAgICAnOlxkfFsxLTldXGR8MVxkezJ9fDJbMC00XVxkfDI1WzAtNV0pXC4oPzpcZHxbMS05XVxcJyAuCiAgICAgICAgJ2R8MVxkezJ9fDJbMC00XVxkfDI1WzAtNV0pKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7JyAuCiAgICAgICAgJzAsNX1bMC05YS1mXXsxLDR9KT8rOjpbMC05YS1mXXsxLDR9fCg/Oig/OlswLTlhLWZdJyAuCiAgICAgICAgJ3sxLDR9Oil7MCw2fVswLTlhLWZdezEsNH0pPys6Onx2WzAtOWEtZl0rK1wuWyEkJi0uJyAuCiAgICAgICAgJzAtOz1fYS16fl0rKylcXXwoPzpcZHxbMS05XVxkfDFcZHsyfXwyWzAtNF1cZHwyNVswJyAuCiAgICAgICAgJy01XSlcLig/OlxkfFsxLTldXGR8MVxkezJ9fDJbMC00XVxkfDI1WzAtNV0pXC4oPzpcXCcgLgogICAgICAgICdkfFsxLTldXGR8MVxkezJ9fDJbMC00XVxkfDI1WzAtNV0pXC4oPzpcZHxbMS05XVxkfCcgLgogICAgICAgICcxXGR7Mn18MlswLTRdXGR8MjVbMC01XSl8KD86Wy0uMC05X2Eten5dfCVbMC05YS1mXScgLgogICAgICAgICdbMC05YS1mXXxbISQmLSw7PV0pKispKD86OlxkKispPysoPzovKD86Wy0uMC05X2EteicgLgogICAgICAgICd+XXwlWzAtOWEtZl1bMC05YS1mXXxbISQmLSw6Oz1AXSkqKykqK3wvKD86KD86Wy0uMCcgLgogICAgICAgICctOV9hLXp+XXwlWzAtOWEtZl1bMC05YS1mXXxbISQmLSw6Oz1AXSkrKyg/Oi8oPzpbLScgLgogICAgICAgICcuMC05X2Eten5dfCVbMC05YS1mXVswLTlhLWZdfFshJCYtLDo7PUBdKSorKSorKT8rfCcgLgogICAgICAgICcoPzpbLS4wLTlfYS16fl18JVswLTlhLWZdWzAtOWEtZl18WyEkJi0sOjs9QF0pKysoPycgLgogICAgICAgICc6Lyg/OlstLjAtOV9hLXp+XXwlWzAtOWEtZl1bMC05YS1mXXxbISQmLSw6Oz1AXSkqKycgLgogICAgICAgICcpKispPysoPzpcPysoPzpbLS4wLTlfYS16fl18JVswLTlhLWZdWzAtOWEtZl18WyEkJicgLgogICAgICAgICctLC86Oz0/K0BdKSorKT8rKD86Iyg/OlstLjAtOV9hLXp+XXwlWzAtOWEtZl1bMC05YScgLgogICAgICAgICctZl18WyEkJi0sLzo7PT8rQF0pKispPytgaScKICAgIDsKICAgIHJldHVybiBwcmVnX3JlcGxhY2VfY2FsbGJhY2soCiAgICAgICAgJHJlZ2V4LAogICAgICAgIGZ1bmN0aW9uICgkbSkgewogICAgICAgICAgICAkcCA9IHBhcnNlX3VybChodG1sc3BlY2lhbGNoYXJzX2RlY29kZSgkbVswXSwgRU5UX1FVT1RFUykpOwogICAgICAgICAgICBpZiAoIWlzc2V0KCRwWydob3N0J10pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHAgKz0gYXJyYXlfZmlsbF9rZXlzKGFycmF5KCdwYXRoJywgJ3F1ZXJ5JyksICcnKTsKICAgICAgICAgICAgcGFyc2Vfc3RyKCRwWydxdWVyeSddLCAkcSk7CiAgICAgICAgICAgIHN3aXRjaCAoJHBbJ2hvc3QnXSkgewogICAgICAgICAgICAgICAgY2FzZSAnd3d3Lm5pY292aWRlby5qcCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIAogICAgICAgICAgICAgICAgICAgICAgICBwcmVnX21hdGNoKCdAXi93YXRjaC8oW3NuXW1cZCsrKS8qKyRAJywgJHBbJ3BhdGgnXSwgJG4pID8KICAgICAgICAgICAgICAgICAgICAgICAgJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9lLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5vLmpwL3RodW1iX3dhdGNoLycgLiAkblsxXSAuICciPjwvc2NyaXB0PicgOgogICAgICAgICAgICAgICAgICAgICAgICBodG1sc3BlY2lhbGNoYXJzKCRtWzBdLCBFTlRfUVVPVEVTLCAnVVRGLTgnKQogICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgIGNhc2UgJ25pY28ubXMnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAKICAgICAgICAgICAgICAgICAgICAgICAgcHJlZ19tYXRjaCgnQF4vKFtzbl1tXGQrKykvKiskQCcsICRwWydwYXRoJ10sICRuKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vZS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uby5qcC90aHVtYl93YXRjaC8nIC4gJG5bMV0gLiAnIj48L3NjcmlwdD4nIDoKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbHNwZWNpYWxjaGFycygkbVswXSwgRU5UX1FVT1RFUywgJ1VURi04JykKICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICBjYXNlICd5b3V0dS5iZSc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIAogICAgICAgICAgICAgICAgICAgICAgICBwcmVnX21hdGNoKCdAXi8oXHcrKykvKiskQCcsICRwWydwYXRoJ10sICRuKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICc8aWZyYW1lIHdpZHRoPSI0MjAiIGhlaWdodD0iMzE1IiBzcmM9Ii8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLycgLiAkblsxXSAuJyIgZnJhbWVib3JkZXI9IjAiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT4nIDoKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbHNwZWNpYWxjaGFycygkbVswXSwgRU5UX1FVT1RFUywgJ1VURi04JykKICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICBjYXNlICd3d3cueW91dHViZS5jb20nOgogICAgICAgICAgICAgICAgY2FzZSAneW91dHViZS5jb20nOgogICAgICAgICAgICAgICAgY2FzZSAnanAueW91dHViZS5jb20nOgogICAgICAgICAgICAgICAgICAgIGlmICghaXNzZXQoJHFbJ3YnXSkgfHwgIWlzX3N0cmluZygkcVsndiddKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAKICAgICAgICAgICAgICAgICAgICAgICAgcHJlZ19tYXRjaCgnQF4vKFx3KyspLyorJEAnLCAkcFsncGF0aCddLCAkbikgPwogICAgICAgICAgICAgICAgICAgICAgICAnPGlmcmFtZSB3aWR0aD0iNDIwIiBoZWlnaHQ9IjMxNSIgc3JjPSIvL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8nIC4gJHFbJ3YnXSAuJyIgZnJhbWVib3JkZXI9IjAiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT4nIDoKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbHNwZWNpYWxjaGFycygkbVswXSwgRU5UX1FVT1RFUywgJ1VURi04JykKICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBodG1sc3BlY2lhbGNoYXJzKCRtWzBdLCBFTlRfUVVPVEVTLCAnVVRGLTgnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgaHRtbHNwZWNpYWxjaGFycygkdGV4dCwgRU5UX1FVT1RFUywgJ1VURi04JykKICAgICk7Cn0KCiR0ZXh0ID0gPDw8RU9ECllvdXR1YmXjgavjga9odHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vd2F0Y2g/dj1zMFNFOEdNZ2VFSeOBqOOBiwpodHRwOi8veS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4udS5iZS9zMFNFOEdNZ2VFSeOBruOCiOOBhuOBqlVSTOODleOCqeODvOODnuODg+ODiOOBjOOBguOCiuOBvuOBmeOAggpodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vd2F0Y2g/Zm9vPWhvZ2Umdj1zMFNFOEdNZ2VFSSZiYXI9aG9nZeOBruOCiOOBhuOBqwrkvZnliIbjgarjgq/jgqjjg6rjgYzjgaTjgYTjgabjgYTjgabjgoLjgaHjgoPjgpPjgajlh6bnkIbjgZnjgbnjgY3jgafjgZfjgofjgYbjgIIK5pel5pys44Gr6ZmQ5a6a44GZ44KL44Gq44KJ44GwCmh0dHA6Ly9qLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbS93YXRjaD92PXMwU0U4R01nZUVJ44KC44Gh44KD44KT44Go5Yem55CG44GZ44G544GN44Gn44GZ44Gt44CCCgrkuIDmlrnjg4vjgrPjg4vjgrPli5XnlLvjgavjga8KaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLm8uanAvd2F0Y2gvc20xMTM2MzU144Gg44GR44Gn44Gv44Gq44GPCmh0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5vLmpwL3dhdGNoL25tMTEzNjM1NeOBruOCiOOBhuOBq+OAgQrjgIxz44CN44Go44CMbeOAjeS4oeaWueOBjOadpeOCi+WPr+iDveaAp+OBjOOBguOCiuOBvuOBmeOAguOBvuOBn+OAgQpodHRwOi8vbi4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uby5tcy9zbTExMzYzNTXjga7jgojjgYbjgarnn63nuK5VUkzjgoLjgYLjgorjgb7jgZnjgIIK44GT44KM44KJ44Gr44Gv44Gh44KD44KT44Go5a++5b+c44GZ44G544GN44Gn44GZ44CCCgrjgajjga/jgYTjgaPjgabjgoLjgIHnhKHlirnjgapVUkzjgoLjgaHjgoPjgpPjgajliKTliKXjgZfjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgIIK5L6L44GI44GwaHR0cDovL3kuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnUuYmUvczBTRThHTWdlRUkvaG9nZWhvZ2UmYT1i44Go44GL44Gv5piO44KJ44GL44Gr44GK44GL44GX44GE44GX44CBCmh0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5vLmpwL3dhdGNoL25tMTEzNjNhYmPjgoLjg4vjgrPjg4vjgrPli5XnlLvjga7ku5Xmp5jjgajjgZfjgabjga/jgYrjgYvjgZfjgYTjgafjgZnjgIIK44GT44GG44GE44Gj44Gf44KC44Gu44Gv54Sh6KaW44GZ44KL5b+F6KaB44GM44GC44KK44G+44GZ44CC5b2T54S244CB6Zai5L+C44Gq44GE44KC44Gu44Gv44Ko44K544Kx44O844OX44GX44Gm6KGo56S644GV44Gb44G+44GX44KH44GG44CCCuOAjCbjgI3jgIw844CN44CMPuOAjeOBqOOBhOOBo+OBn+aWh+Wtl+OBjOOBoeOCg+OCk+OBqOOCqOOCueOCseODvOODl+OBleOCjOOCi+OBi+eiuuiqjeOBl+OBpuOBj+OBoOOBleOBhOOAggpFT0Q7CgplY2hvIGVzY2FwZV9hbmRfbGlua2lmeSgkdGV4dCk7