Got an iPhone or iPad? We have a brand new Pastebin App for both devices, and it's totally free! Click here to download the new Pastebin App for iOS.
Guest

ssmy

By: a guest on Apr 10th, 2009  |  syntax: JavaScript  |  size: 16.35 KB  |  hits: 105  |  expires: Never
download  |  raw  |  embed  |  report abuse
Copied
  1. // ==UserScript==
  2. // @name                        Add Torrents To wTorrent (v1.2)
  3. // @namespace                   http://www.brooksworks.com
  4. // @description                 Let's you download torrents using wTorrent, an rTorrent interface, remotely from your browser.
  5. // @include                     *
  6. // @include                     http://isohunt.com/torrent_details/*
  7. // @include                     http://thepiratebay.org/details.php?*
  8. // @include                     http://torrentreactor.net/view.php?*
  9. // @include                     http://www.mininova.org/*
  10. // @include                     http://www.torrentspy.com/*
  11. // @include                     http://ts.searching.com/*
  12. // ==/UserScript==
  13.  
  14. /*
  15.         Add Torrents to wTorrent (v1.2)
  16.         Created                 2008-10-30
  17.         Copyright               Shannon Brooks (c) 2008
  18.         License                 GPL License (http://www.gnu.org/copyleft/gpl.html)
  19.  
  20.         Let's you download torrents using wTorrent, an rTorrent interface, remotely
  21.         from your browser. Visit wTorrent Homepage (http://www.wtorrent-project.org/)
  22.         to learn more about rTorrent and wTorrent.The idea for this script and some
  23.         of its functions taken from "Add Torrents To uTorrent" by Julien Couvreur.
  24.         The original uTorrent script by Julien can be found on userscripts.org.
  25.        
  26.         This script includes the ability to auto-login, though you don't need to use
  27.         that functionality. If you wish to log in manually (just open a tab with
  28.         wTorrent) you just need to set the wTorrent_OverRideCheck option in
  29.         about:config to true.
  30.  
  31.         Preferences are saved in firefox. Open about:config and type wtorrent into
  32.         filter box. Variables are pretty self explanitory, but you can see what each
  33.         corresponds to below.
  34.  
  35.         Change Log:
  36.         v1.0    Released 2008-10-30
  37.                 Initial Release
  38.         v1.1    Released 2008-10-31
  39.                 - Fix bug with matching any link with "undefined" somewhere in the body.
  40.                 - Fix bug causing you to have to click twice on a link to add a torrent
  41.                   if you are not logged in.
  42.         v1.2    Released 2008-12-14
  43.                 - Fix bug with URLs containing ampersands not being interpreted properly
  44.                   (thanks Constantine P.)
  45. */
  46.  
  47.  
  48.  
  49. (function() {
  50.  
  51.         // wTorrent FQDN or IP
  52.         var host = GM_getValue("wTorrent_FQDN","wtorrent") ;
  53.         // wTorrent Port (if not 80)
  54.         var port = GM_getValue("wTorrent_Port","80");
  55.         // wTorrent Username
  56.         var username = GM_getValue("wTorrent_User","");
  57.         // wTorrent Password
  58.         var password = GM_getValue("wTorrent_Pass","");
  59.         // Download dir
  60.         var download_dir = GM_getValue("wTorrent_Download_Dir","");
  61.        
  62.         // init variables in firefox about:config
  63.         if (GM_getValue("wTorrent_FQDN") == undefined) {
  64.                 GM_setValue("wTorrent_FQDN","wtorrent");
  65.                 GM_setValue("wTorrent_Port","80");
  66.                 GM_setValue("wTorrent_User","");
  67.                 GM_setValue("wTorrent_Pass","");
  68.                 GM_setValue("wTorrent_OverRideCheck",false);
  69.                 GM_setValue("wTorrent_OverRideCheck","");
  70.                 GM_setValue("wTorrent_Download_Dir","");
  71.         }
  72.  
  73.         // sanity checks
  74.         if (GM_getValue("wTorrent_OverRideCheck")===false) { if (host == "" || username == "" || password == "") { alert("You need to configure the \"Add Torrents To wTorrent\" user script with your wTorrent parameters before using it.\n\nType about:config in the address bar and filter for wtorrent. Variables are self explanitory."); return false; } }
  75.         if (port == "80" || port == "") { port = ""; } else { port = ":"+port; }
  76.                        
  77.         // register menu item to enable opening wTorrent page
  78.         function wTorrentMenu() { GM_openInTab("http://"+host+port); }
  79.         GM_registerMenuCommand("Open wTorrent", wTorrentMenu, "w", "shift alt");
  80.        
  81.         // this function makes a wTorrent link using embeded images
  82.         var wTorrentLinkIdCounter = 0;
  83.         function makeWTorrentLink(link) {
  84.                 var wTorrentLink = document.createElement('a');
  85.                 wTorrentLink.setAttribute("href", link.href);
  86.                 wTorrentLink.setAttribute("id","wTorrentLink"+wTorrentLinkIdCounter); wTorrentLinkIdCounter++;
  87.                 wTorrentLink.setAttribute("class", "wtorrentlink");
  88.                 wTorrentLink.addEventListener('click',wTorrentClick,false);
  89.                 wTorrentLink.setAttribute("onclick", "return false;");
  90.                 wTorrentLink.innerHTML = "<img src=\"" + wTorrentImage + "\" style='border: 0px; padding: 0 1px;' alt='Open with wTorrent' title='Open with wTorrent' />";
  91.                 return wTorrentLink;
  92.                 }
  93.  
  94.         // wrapper function for wTorrentAdd to fix issue with not getting an error
  95.         // when clicking a torrent link the first time after not being logged in
  96.         function wTorrentClick() { wTorrentAdd(this.id); }
  97.        
  98.         // this function posts the url for the torrent to wTorrent
  99.         function wTorrentAdd(wTorrentLinkId) {
  100.        
  101.                 // reference the link
  102.                 var wTorrentLink = document.getElementById(wTorrentLinkId);
  103.                
  104.                 // here we actually send the form data with the torrenturl
  105.                 post('http://'+host+port+'/index.php?cls=AddT', 'torrenturl='+encodeURIComponent(wTorrentLink.href)+'&start_now=on&download_dir='+download_dir, function(s) {
  106.                        
  107.                         // our regexes to do checks after adding torrents
  108.                         var match_added = /Torrent added correctly/gmi;
  109.                         var already_exists = /Error: File already exists in torrent directory, can't create .torrent/gmi;
  110.                         var login_needed = /login-username/gmi;
  111.                        
  112.                         // check for string 'torrent added correctly' in return HTML
  113.                         if (match_added.exec(s)) {
  114.                                 show_message('Torrent Successfully Added<br/>to wTorrent');
  115.                                 wTorrentLink.getElementsByTagName('img')[0].src=wTorrentSuccess;
  116.                                 wTorrentLink.getElementsByTagName('img')[0].title="Torrent Downloading";
  117.                                 }
  118.                         // check for string 'error: file already exists in torrent directory'
  119.                         else if (already_exists.exec(s)) {
  120.                                 show_message('Torrent Already Added<br />to wTorrent');
  121.                                 wTorrentLink.getElementsByTagName('img')[0].src=wTorrentFailed;
  122.                                 wTorrentLink.getElementsByTagName('img')[0].title="Torrent Already Downloaded";
  123.                                 }
  124.                         // check for login page, and if we find the login we attempt to login
  125.                         else if (login_needed.exec(s)) {
  126.                                 post('http://'+host+'/','userf='+username+'&passwdf='+password+'&user_login=Login', function(l) {
  127.                                         // if we are still getting a login page there is probably a typo in the config
  128.                                         var login_needed = /login-username/gmi;
  129.                                         if (login_needed.exec(l)) { show_message('Login Failed!<br />Check configuration...'); }
  130.                                         else { wTorrentAdd(wTorrentLinkId); }
  131.                                         });
  132.                                 }
  133.                         // un-handled issue, try adding torrent manually as you may be having an issue with wtorrent
  134.                         else {
  135.                                 show_message('Problem Adding Torrent<br />to wTorrent');
  136.                                 // debug
  137.                                 //alert("torrent url: "+wTorrentLink.href+"\n\nDebug Info:\n"+s);
  138.                                 wTorrentLink.getElementsByTagName('img')[0].src=wTorrentFailed;
  139.                                 wTorrentLink.getElementsByTagName('img')[0].title="Torrent Download Failed";
  140.                                 }
  141.                         })
  142.                 }
  143.  
  144.         // generic post function taken from GreaseSpot
  145.         // http://wiki.greasespot.net/Code_snippets#POST_data_to_a_URL_with_callback_function
  146.         function post(url, data, cb) {
  147.                 GM_xmlhttpRequest({
  148.                         method: "POST",
  149.                         url: url,
  150.                         headers:{'Content-type':'application/x-www-form-urlencoded'},
  151.                         data: data,
  152.                         onload: function(xhr) { cb(xhr.responseText); }
  153.                         });
  154.                 }
  155.  
  156.         // function from Julien's "Add Torrents to uTorrent" script
  157.         // this function inits the script and adds all the wTorrent download links
  158.         function scanLinks() {
  159.                 var links = getLinks();
  160.  
  161.                 for (var i=0; i < links.length; i++){
  162.                         var link = links[i];
  163.                         if (match(link.href)) {
  164.                                 var wTorrentLink = makeWTorrentLink(link);
  165.                                 link.parentNode.insertBefore(wTorrentLink, link.nextSibling);
  166.                                 }
  167.                         }
  168.                 }
  169.        
  170.         // function from Julien's "Add Torrents to uTorrent" script
  171.         // this function puts all the links on the page into an array
  172.         function getLinks() {
  173.                 var doc_links = document.links;
  174.                 var links = new Array();
  175.                 for (var i=0; i < doc_links.length; i++){
  176.                         links.push(doc_links[i]);
  177.                         }
  178.                 return links;
  179.                 }
  180.  
  181.         // function from Julien's "Add Torrents to uTorrent" script
  182.         // modified to be a little more efficient.
  183.         function match(url) {
  184.  
  185.                 var matchRegex = new Array(
  186.        
  187.                         // isohunt
  188.                         /http:\/\/.*isohunt\.com\/download\//i,
  189.                         /http:\/\/.*bt-chat\.com\/download\.php/,
  190.                
  191.                         // TorrentReactor
  192.                         /http:\/\/dl\.torrentreactor\.net\/download.php\?/i,
  193.                
  194.                         // Mininova
  195.                         /http:\/\/www\.mininova\.org\/get\//i,
  196.                
  197.                         // TorrentSpy
  198.                         /http:\/\/ts\.searching\.com\/download\.asp\?/i,
  199.                         /http:\/\/www\.torrentspy\.com\/download.asp\?/i,
  200.                
  201.                         // Seedler
  202.                         /http:\/\/.*seedler\.org\/download\.x\?/i,
  203.                
  204.                         // all direct torrent links
  205.                         /\.torrent$/
  206.                        
  207.                         );
  208.        
  209.                 for (r=0; r<matchRegex.length; r++) {
  210.                         if (url.match(matchRegex[r])) {
  211.                                 if (r<3) { alert(url.match(matchRegex[r])); }
  212.                                 return true;
  213.                                 }
  214.                         }
  215.                 return false;
  216.                 }
  217.  
  218.         // opacity script from brainerror.net
  219.         // http://brainerror.net/scripts/javascript/blendtrans/
  220.         function opacity(id, opacStart, opacEnd, millisec) {
  221.             //speed for each frame
  222.             var speed = Math.round(millisec / 100);
  223.             var timer = 0;
  224.             //determine the direction for the blending, if start and end are the same nothing happens
  225.             if(opacStart > opacEnd) {
  226.                 for(i = opacStart; i >= opacEnd; i--) {
  227.                     setTimeout(opacity_change,(timer * speed),i,id);
  228.                     timer++;
  229.                 }
  230.             }
  231.                 else if(opacStart < opacEnd) {
  232.                 for(i = opacStart; i <= opacEnd; i++) {
  233.                     setTimeout(opacity_change,(timer * speed),i,id);
  234.                     timer++;
  235.                 }
  236.             }
  237.         }
  238.         function opacity_change(opacity, id) {
  239.             var object = document.getElementById(id).style;
  240.             object.opacity = (opacity / 100);
  241.             object.MozOpacity = (opacity / 100);
  242.             object.KhtmlOpacity = (opacity / 100);
  243.             object.filter = "alpha(opacity=" + opacity + ")";
  244.         }
  245.         function opacity_shift(id) {
  246.                 //if an element is invisible, make it visible, else make it ivisible
  247.             if(document.getElementById(id).style.opacity == 0) { opacity(id, 0, 100, 1000); }
  248.                 else { opacity(id, 100, 0, 1000); }
  249.         }
  250.        
  251.         // these functions show and hide status messages so that there is no need to click ok when
  252.         // adding torrents
  253.         GM_addStyle('#wtorrent_message { z-index: 9999; position: fixed; bottom: 5px; right: 5px; font-weight: bold; color: #333; background: #FFF url("data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAQEASABIAAD%2F2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7%2FwAALCABQAAEBAREA%2F8QAFQABAQAAAAAAAAAAAAAAAAAABAX%2FxAAYEAEBAQEBAAAAAAAAAAAAAAAAE2EBUf%2FaAAgBAQAAPwB0MVIYqRxRhilE%2BWHyw6XPDJFz1%2F%2FZ") repeat; border: 2px solid #333; width: 200px; height: 60px; text-align: center; }');
  254.         function show_message(text,autohide) {
  255.                 if (autohide == undefined) { var autohide = true; }
  256.                 if (node=document.getElementById('wtorrent_message')) { node.parentNode.removeChild(node); }
  257.                 var wTorrentMessage = document.createElement('div');
  258.                 wTorrentMessage.setAttribute("id","wtorrent_message");
  259.                 wTorrentMessage.innerHTML = "<p>"+text+"</p>";
  260.                 wTorrentMessage.addEventListener('click',hide_message,false);
  261.                 document.body.insertBefore(wTorrentMessage, document.body.firstChild);
  262.                 opacity_shift('wtorrent_message');
  263.                 if (autohide) { setTimeout(hide_message,4000); }
  264.         }
  265.         function hide_message() {
  266.                 if(document.getElementById('wtorrent_message').style.opacity>0) { opacity_shift('wtorrent_message',true); }
  267.         }
  268.        
  269.     // wTorrent Icons
  270.     var wTorrentImage = "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP38%2FAPy7egu7ebdRPv6%2BQri1shw3c%2B%2Fhe3m3UT%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAPby7h%2FApYX%2Fu6mJ%2F7Kwkf%2FApYX%2Fq7aX%2F6DAof%2B5q4v%2F3M69if%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAOng1VTApYX%2Fprqb%2F3bhxf9y5cn%2FrbWW%2F23pzf9r68%2F%2FdOPG%2F7upiv%2FZyreU%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwDPu6O%2Fkcyu%2F2fu0%2F9s6s7%2FbOrO%2F3Dmyv9t6c3%2FbenN%2F2vqzv9s6s7%2FvaeH%2F%2FDr5DX%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwDn3dFes7CR%2F2jt0f9t6c3%2FbenN%2F23pzf9t6c3%2FbenN%2F23pzf9t6c3%2FaezR%2F57Aov%2FXxrKf%2F%2F%2F%2FAP%2F%2F%2FwD28%2B8evqeH%2F5bIqv9q7ND%2FbenN%2F23pzf9t6c3%2FbenN%2F23pzf9t6c3%2FbenN%2F23pzf9t6c3%2Fv6aG%2F%2Fby7h%2F%2F%2F%2F8A7ebdRLesjf%2BC2Lr%2FbOrO%2F23pzf9s6s7%2FbenN%2F23pzf9t6c3%2FbenN%2F23pzf9t6c3%2FaO3S%2F621lv%2Fg08R4%2F%2F%2F%2FAOzk20i6qor%2Fg9e5%2F2ns0P9w5sr%2Fd%2BHF%2F2zqzv9t6c3%2FbenN%2F23pzf9t6c3%2FbenN%2F2rrz%2F%2BWyKr%2F1MOtqP%2F%2F%2FwD%2F%2F%2F8A49fJbr6mhv944MP%2Fgdq8%2F7aujv9q7ND%2FbenN%2F23pzf9s6s7%2FduHF%2F23pzf9s6s7%2FhNa5%2F865oMX%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwDe0cGBv6aG%2F6q4mP%2FPuqLBkM2v%2F2fu0v9m79P%2FqbiZ%2F621lv9o7dH%2FbOnO%2F4PYu%2F%2FNt57J%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAPj28xXg08R46d%2FVVr6nh%2F%2BRzK7%2FsbGS%2F8y2nM2H1Lf%2FZu%2FT%2F2ns0P%2BB2bz%2Fzbifx%2F%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwDp39VWz7ujv%2BTZzGfApYX%2Fp7qb%2F6S8nf%2Bmu5v%2Fu6mJ%2F%2Bfd0V7%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A9vLuH9zNvIvZybaX4NPDefHr5TP%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F%2F%2FAP%2F%2F%2FwD%2F%2F%2F8A%2F%2F8AAP%2B%2FAADwDwAA4AcAAMAHAADAAwAAgAMAAIADAACAAQAAwAEAAMABAAD8AQAA%2FoMAAP%2FPAAD%2F%2FwAA%2F%2F8AAA%3D%3D";
  271.         var wTorrentFailed = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%10%00%00%00%10%08%06%00%00%00%1F%F3%FFa%00%00%00%04gAMA%00%00%AF%C87%05%8A%E9%00%00%00%19tEXtSoftware%00Adobe%20ImageReadyq%C9e%3C%00%00%02%5DIDAT8%CB%A5%93%FBKSa%18%C7%FD%5B%B6%1F%A2%04%89n%84%84QP%98%F32w%D6%DA%DC%A6%CE%B3L%8F%5B%2Cbi%8E%9Da%9AA%8D%C5%5C%F8C%A8%A5v%D5%CA_2Ml%94ZFj%D7%A1%E5%B1%F2%D2NMjm%9E%B3k%CA%B7%B9%60%26.%23z%E1%FB%CB%CB%FB%F9%BC%3C%0F%CF%93%02%20%E5%7F%B2%E6bV%AF%17%CEP%15%E6%F7T%193%A5%25%B9I%AD%86%7BG%AA%99qRiv%95%C8%85%EB%0A%E6tz%E2%23E%B1%DF%1C6%84%07%9D%88%BC%19Edd%08%FC%DD%0E%CC%1AJ%F1%AA%90%60%9F%AB%C5DR%C12%3C%5DN%F1%0B%B7%3B%B04%F5%16%D1%BE%3B%88%B6%DB%11m%3E%87%1F7%9B%B08%DC%07%8F%C9%80Qe6%FFL%9EI%AC%12%CC%E8t%82%18%EC%E6%AE%B7c%89q!z%F1%0C%7Cv%0B%FC%B6j%84%2FX%10i%A0%11%B6%9E%40%F8%DE%0D%CC%1D%251%7Ch%9F%FB%B1l%8F%20!%88%C1%F4%7C%AD%19%8B%AE%B1%F8%8F!%07%0D%EFY%23%82u%BAU%E1N%92%08w%5D%C1%CB%BC%0C%0CH3%E8%84%E0%03u%84%09t%5DE%B4%B3%19%3Ek%25%BE%16I%93f%A1%92%04o%AB%81%C7R%85%87D%3A%93%100%E5%DA%60%E4~%17%A2%0E%0B%7C%A7%0D%F8%D3%F1(r%E0%A5%0A%E1on%843oG0!%98%24%8B%82%A1%CEV%84%EB%0D%08%9E*%5BW0_%AA%82%BF%A9%11%FD%E2-%2B%82%89%12%15%E3%B5%D6%20d%A7%C1%1DW%C7%1F%26%8D2%0F%BEZ%13fMF%F4%89%D2VJp%15%CBiF%26B%B0%B3%0D%3E%AD%0C%DER%C9%1A%98%95g%83-%90%20%D0~%09C%E2m%E8%CD%DA%B4%D2%C4%D7ER%C1%0B%0D%E1%9E%AB%D0%20p%AB5%DE%B0y%95%F8%17%A8%C8%05%2B%8B%C121%F8%B6%16%8C%17K%97aw%B7h%A3%60%D5%20%8D%15%E4%10%23%8A%03%FC%F4a%15%02%D7Z%F1%BD%9E%86%87T%E2%B3Z%01o%9D%19%FC%E5%16L%A8%F3%D1%93%95%CA%C7%60%22%E9(%3F%95%EF'%9E%1C%DC%CB%8EJv%E1K%B5%11%DE%86%F3%F1%7C%AA%3A%86G9%5B%97a%F6w8%E92%0DJw%0B%07%C4%E9f'%B1%93y%90%BF%9D%EB%17m%E6zs%D3%98%9E%ECTsw%E6%06%E1_%B7%F1_%F3%13%1D%D2%CE%B9Ir%1B%FE%00%00%00%00IEND%AEB%60%82";
  272.         var wTorrentSuccess = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%10%00%00%00%10%08%06%00%00%00%1F%F3%FFa%00%00%00%01sRGB%00%AE%CE%1C%E9%00%00%00%06bKGD%00%FF%00%FF%00%FF%A0%BD%A7%93%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%07tIME%07%D8%0A%1D%16%177%7F%EF%5DZ%00%00%01yIDAT8%CB%A5%93%CD%2BDQ%18%C6%9Fs%EF%99%D3qgJ%B84%F9%18%9A%C9wI(%0B%A3d%C3%DAJ%B2%B4%B2%B1%B1%90dmia%C1%8E%FF%40%F64Q%12%93PL%94h%CCD%9Ad%CAm%A63%E7%9Ckc%A1i%AE%8F%EE%BB%7C%17%BF~o%CF%FB%10%D7u%E1g%0C%F8%1C%DF%00Zi9%B5%19%85E98%E5%E0%94%81%1A%0C%EB3%87%7F%07%14%85%C0%F4%E0%02%A8Ia%12%03%FB%D7%3B%FF3%E0%8C%E9%BD%CB-%F2%DD%00%00%F1c%A0%FFd%10%5D%25%B0%18A8dCj%85%EC%FB%03Z%EB%DA!%B4%C4%DC%F6%008e%D8%98%3D%A9%9C%82%BDD%A0%B4%89%A1%C88%8AR%40j%85%92%96PZAH%89%88%DD%0D!%85w%8C%B95%17%A6%A1%9Cd%FA%C0%89%D9%BDD%B9%1AR%97%A0%E1%A2%A9%B6%C3H%E7R%0E%A3%CC%F1%3C%C1%5E%22UAjZC%911%0C%B7%8D%E29%9FFI%95%F0%92%CF%A0%AF9%8E%00%0DX%99%5C%EAG%83BA%ABh%E2n%3F%9BL%1F%A36%14%86a0%D4%04%1Bp%FAx%80%9B%EC9%84%96V9%80%94w%A1q%99t2%8A%C4D%D7dx%A0e%04%17OG%B8%7F%BD%D4%16%E3%A1%DD%F9%C7%C2%AF%80%2FH%0F%A7H%8C%C4%E2%F5%B7%CFg%9AS%AB%FAp%F1%ED%A3R%8C%C4%AB%8D%CD%CB%A4%DFbHrJ%EA%AEVt%DE%EB%0F%88%DF%3A%7F%02_%1F%95%FF%E8%EA%EB%2C%00%00%00%00IEND%AEB%60%82";
  273.        
  274.         // start the script
  275.         scanLinks();
  276.                
  277.         })();