mIRC Music Downloader

By FordLawnmower on Jun 06, 2009

Image
This is a project that I just started working on. This script will search kohit.net and retrieve 0 to 30 results. The results can then be selected and downloaded using mirc sockets.
You can download as many songs as you want at a time, however, each download will open a separate
progress bar dialog. I plan to change this to a single download manager but at this point I am focusing on adding more content and sites to the script.

You can find this dialog from any menu, under mIRC Music Downloader.

To use it, just enter a artist or song name or both and click search.
To download, just select one of the results and click Download.
After you have some music downloaded you can click "play file" to view or listen to music.

All downloads are stored in the current directory(ie mircdir) \mIRCMusic\Artist_Name\songtitle.mp3 For instance c:\mymircdir\mIRCMusic\Ozzy_Osbourne\Crazy_Train.mp3

Update Added a second search site and page numbers :) Now you can view all of the results for your search if you want :)
Added

  • A second search engine.
  • Page change drop down. (To view all the results)
  • More efficient code for faster downloads.
  • Better error checking to quickly tell you if a file is bad or missing.
  • Lots of bug fixes.

FYI -- There is some code here that is not currently being used, but I will be implementing it soon.

;mIRC Music Downloader By Ford_Lawnmower irc.mindforge.org #USA-Chat
;
;This section is part of an unfinished edition to this script. Stay Tuned :)
;syntax airmp3 artist_name Song_name  If no Artist then use /airmp3 - song_name  Song name is Optional  UnderScores are required
alias airmp3 {
  var %sockname $+(airmp3G,$ticks)
  sockopen %sockname www.airmp3.net 80
  sockmark %sockname www.airmp3.net $+(/search/,$FRD($1),/,$FRD($2),$iif(!$2,mp3/,/mp3/))
}
On *:sockopen:airmp3*: {
  echo -a $gettok($sock($sockname).mark,1,32)  $gettok($sock($sockname).mark,2,32)
  sockwrite -nt $sockname GET $gettok($sock($sockname).mark,2,32) HTTP/1.1
  sockwrite -nt $sockname Host: $gettok($sock($sockname).mark,1,32) $+ $str($crlf,2)
  sockwrite -nt $sockname Connection: keep-alive 30
  sockwrite -nt $sockname $crlf
}
On *:sockread:airmp3G*: {
  if ($sockerr > 0) { echo -at socket error airmp3 -->> $sockerr }
  else {
    var %airmp3 | sockread %airmp3
    if (Location: isin %airmp3) { redirect $remove(%airmp3,Location: ) | echo -a redirecting | sockclose $sockname }
  }
}
On *:sockread:airmp3R*: {
  if ($sockerr > 0) { echo -at socket error airmp3 -->> $sockerr }
  else {
    sockread &airmp3
    bwrite airmp3.pat -1 -1 &airmp3
    var %count $calc(%count + 1)
    while ($bintween(&airmp3,<a title=",",%count)) { 
      echo -a $v1 $+(http://www.airmp3.net/,$bintween(&airmp3,$+($v1,",$chr(32),href="),">,1))
      inc %count
    }
  }
}
alias -l redirect {
  var %sockname $+(airmp3R,$ticks)
  sockopen %sockname www.airmp3.net 80
  sockmark %sockname www.airmp3.net $remove($1,http://www.airmp3.net)
}
;Start of Working Script
;www.dilandau.com
alias -l dilandau {
  var %sockname $+(dilandau,$ticks)
  sockopen %sockname www.dilandau.com 80
  sockmark %sockname $+(/download_music/,$replace($2-,$chr(32),% $+ 20),-,$1,.html) 0 0 $1
}
On *:sockopen:dilandau*: {
  if ($dialog(M_D)) {
    if (!$sockerr) {
      sockwrite -nt $sockname GET $gettok($sock($sockname).mark,1,32) HTTP/1.1
      sockwrite -n $sockname Host: www.dilandau.com $+ $str($crlf,2)
      $iif($dialog(M_D),did -r M_D 9)
    }
    else { echo -st Socket Error $nopath($script) | sockclose $sockname | return }
  }
  else { sockclose $sockname | return }
}
On *:sockread:dilandau*: {
  if (!$sockerr) {
    var %dilandau, %count 1 | sockread %dilandau
    if ($between(%dilandau,<h2 class="title" title=",">,1)) {
      sockmark $sockname $puttok($sock($sockname).mark,$replace($v1,$chr(32),_),2,32)
    }
    if ($dialog(M_D)) && ($between(%dilandau,<a class="button" href=",",1)) {
      did -a M_D 9 $replace($+($gettok($sock($sockname).mark,2,32),$chr(7),$replace($v1,$chr(32),% $+ 20)),_,$chr(32))
    }
    while ($between(%dilandau,rel="nofollow">,</a><a,%count)) {
      sockmark $sockname $puttok($sock($sockname).mark,$replace($v1,$chr(32),_),3,32)
      inc %count
    }
    if (<div id="footer_bottom_bg"></div> isin %dilandau) {
      if ($gettok($sock($sockname).mark,3,32)) {
        var %stop $v1, %start 1
        $iif($dialog(M_D),did -r M_D 15)
        while (%start <= %stop) {
          $iif($dialog(M_D),did -a M_D 15 %start)
          inc %start
        }
        $iif($dialog(M_D),did -c M_D 15 $gettok($sock($sockname).mark,4,32))
      }
      sockclose $sockname
      return 
    }
  }
  else { echo -st Socket error $script | sockclose $sockname | return }
}
;syntax kohit artist-name-Song-name 
alias kohit {
  var %sockname $+(kohitF,$ticks)
  sockopen %sockname $+($1,-search-downloads.kohit.net) 80
  sockmark %sockname $+($1,-search-downloads.kohit.net) $+(/_/,$2)
}
On *:sockopen:kohitF*: {
  if ($dialog(M_D)) {
    if (!$sockerr) {
      $iif($dialog(M_D),did -a M_D 5 Searching $gettok($sock($sockname).mark,1,32)  $gettok($sock($sockname).mark,2,32) ....)
      .timer 1 4 did -a M_D 5
      $iif($dialog(M_D),did -r M_D 9)
      sockwrite -nt $sockname GET $gettok($sock($sockname).mark,2,32) HTTP/1.1
      sockwrite -n $sockname Host: $gettok($sock($sockname).mark,1,32) $+ $str($crlf,2)
    }
    else { echo -st socket error $nopath($script) | return }
  }
  else { sockclose $sockname }
}
On *:sockread:kohitF*: {
  if ($sockerr > 0) { echo -at socket error kohit -->> $sockerr }
  else {
    var %kohit | sockread %kohit
    if (<a href="http:// isin %kohit) && (MP3 Free"> isin %kohit) {
      if ($dialog(M_D)) { did -a M_D 9 $fixchars($between(%kohit,Free">,</a>,1)) $chr(7) $between(%kohit,<a href="," class=,1) }
      else { sockclose $sockname }
    }
    if ($regex(%kohit,/Page\s(\d+)\s\/\s(\d+)?/)) && ($dialog(M_D)) {
      var %current $regml(1), %end $regml(2), %start 1
      did -r M_D 15
      while (%start <= %end) {
        did -a M_D 15 %start
        inc %start
      }
      did -c M_D 15 %current
    }
  }
}
;syntax is /kohitD full path to download page
alias kohitD {
  var %sockname $+(kohitD,$ticks)
  sockopen %sockname $gettok($1,$calc($gettok($1,0,47) - 2),47) 80
  sockmark %sockname $gettok($1,$calc($gettok($1,0,47) - 2),47) $+(/_/,$nopath($1))
}
On *:sockopen:kohitD*: {
  if (!$sockerr) { 
    sockwrite -nt $sockname GET $gettok($sock($sockname).mark,2,32) HTTP/1.1
    sockwrite -nt $sockname Host: $gettok($sock($sockname).mark,1,32) $+ $str($crlf,2)
  }
  else { echo -st Socket error $nopath($script) | sockclose $sockname | return }
}
On *:sockread:kohitD*: {
  if ($sockerr > 0) { echo -at socket error kohitD -->> $sockerr }
  else {
    var %kohitD | sockread %kohitD
    if (Download Now: isin %kohitD) {
      sockclose $sockname
      getfile $between(%kohitD,<a href=",",1) $_($replace($gettok($between(%kohitD,<u>,</u>,1),1,45),$chr(32),_)) $mkfn($_($replace($gettok($between(%kohitD,<u>,</u>,1),2,45),$chr(32),_)))
    }
    if (declared broken. isin %kohitD) && ($dialog(M_D)) {
      did -a M_D 5 Sorry :( Broken Link!!
      .timer 1 4 $!iif($dialog(M_D),did -a M_D 5,noop)
      sockclose $sockname
      return
    }
  }
}
alias -l _ { return $regsubex($1,/^_|_$/g,$null) }
Alias GetFile {
  var %sockname = $+(Getfile,$ticks)
  if (!$isdir(mIRCMusic)) { mkdir mIRCMusic }
  if (!$isfile($+(mIRCMusic\,$2,\) $+ $+($3,.mp3))) { 
    sockopen %sockname $gettok($remove($1,http://),1,47) 80 
    sockmark %sockname $+(mIRCMusic\,$mkfn($2),\) $gettok($remove($1,http://),1,47) $remove($1,$gettok($1,1,47),$gettok($1,2,47),//) $+($3,.mp3) 0 0
  }
  else {
    sockopen %sockname $gettok($remove($1,http://),1,47) 80
    sockmark %sockname $+(mIRCMusic\,$mkfn($2),\) $gettok($remove($1,http://),1,47) $remove($1,$gettok($1,1,47),$gettok($1,2,47),//) $+($3,$ticks,.mp3) 0 0
  }
}
On *:sockopen:GetFile*:{
  if (!$sockerr) {
    sockwrite -nt $sockname GET $gettok($sock($sockname).mark,3,32) HTTP/1.0
    sockwrite $sockname Host: $gettok($sock($sockname).mark,2,32) $+ $crlf $+ $crlf
  }
  else { echo -st Socket Error $nopath($script) }
}
On *:sockread:GetFile*:{
  if ($gettok($sock($sockname).mark,5,32) == 0) {
    var %GetFile.var | sockread %GetFile.var
    if (Content-Length: isin %GetFile.var) && (1502 !isin %GetFile.var) {
      sockmark $sockname $sock($sockname).mark $calc($remove(%GetFile.var,Content-Length:))
      if ($gettok($sock($sockname).mark,7,32) > 1000) { downloader $sockname }
      elseif (!$gettok($sock($sockname).mark,7,32)) {
        $iif($dialog(M_D),did -a M_D 5 Bad or Missing File!!)
        .timer 1 4 $!iif($dialog(M_D),did -a M_D 5,noop)
        sockclose $sockname
        return
      }
    }
    if (Content-Type: text/html isin %GetFile.var) {
      $iif($dialog(M_D),did -a M_D 5 Bad or Missing File!!)
      .timer 1 4 $!iif($dialog(M_D),did -a M_D 5,noop)
      sockclose $sockname
      return
    }
    if (%GetFile.var == $null) { 
      sockmark $sockname $puttok($sock($sockname).mark,1,5,32)
      if ($dialog($sockname)) {
        did -a $sockname 1 $gettok($sock($sockname).mark,4,32) $bytes($gettok($sock($sockname).mark,7,32),m).suf
      }
    }
  }
  else {
    sockread &GetFile
    set %GetFile.done $calc(%GetFile.Done + $bvar(&GetFile,0))
    if ($isdir($gettok($sock($sockname).mark,1,32))) {
      bwrite $qt($gettok($sock($sockname).mark,1,32) $+ $gettok($sock($sockname).mark,4,32)) -1 -1 &GetFile
      if ($file($gettok($sock($sockname).mark,1,32) $+ $gettok($sock($sockname).mark,4,32)).size == $gettok($sock($sockname).mark,7,32)) {
        if ($dialog($sockname)) {
          did -a $sockname 2 ||||||||||||||||||||||||||||||||||||||||
          did -a $sockname 4 100 $+ %
          did -a $sockname 1 Download Complete $gettok($sock($sockname).mark,1,32) $+ $gettok($sock($sockname).mark,4,32) $gettok($sock($sockname).mark,7,32)
          dialog -x $sockname
        }
        sockclose $sockname
      }
      if ($round($calc($file($gettok($sock($sockname).mark,1,32) $+ $gettok($sock($sockname).mark,4,32)).size / $gettok($sock($sockname).mark,7,32) * 100),0) == $gettok($sock($sockname).mark,6,32)) {
        if ($dialog($sockname)) {
          did -a $sockname 4 $gettok($sock($sockname).mark,6,32) $+ %
          did -a $sockname 2 ||
          sockmark $sockname $puttok($sock($sockname).mark,$calc($gettok($sock($sockname).mark,6,32) + 5),6,32)
        }
      }
    }
    else {
      mkdir $gettok($sock($sockname).mark,1,32)
      bwrite $qt($gettok($sock($sockname).mark,1,32) $+ $gettok($sock($sockname).mark,4,32)) -1 -1 &GetFile
      if ($file($gettok($sock($sockname).mark,1,32) $+ $gettok($sock($sockname).mark,4,32)).size == $gettok($sock($sockname).mark,7,32)) {
        if ($dialog($sockname)) {
          did -a $sockname 1 Download Complete $gettok($sock($sockname).mark,1,32) $+ $gettok($sock($sockname).mark,4,32) $gettok($sock($sockname).mark,7,32)
        }
        else {
          echo -a Download Complete 100%
        }
        sockclose $sockname
      }
      if ($round($calc($file($gettok($sock($sockname).mark,1,32) $+ $gettok($sock($sockname).mark,4,32)).size / $gettok($sock($sockname).mark,7,32) * 100),0) == $gettok($sock($sockname).mark,6,32)) {
        if ($dialog($sockname)) {
          did -a $sockname 4 $gettok($sock($sockname).mark,6,32) $+ %
          did -a $sockname 2 ||
          sockmark $sockname $puttok($sock($sockname).mark,$calc($gettok($sock($sockname).mark,6,32) + 5),6,32)
        }
      }
    } 
  }
}
On *:SockWrite:GetFile*: {
  if ($sockerr) {
    echo -a Download has failed badly - $sockerr
    halt
  }
}
alias -l Downloader {
  if (!$dialog($1)) { dialog -md $1 mIRC_Downloader }
  else { dialog -v $1 mIRC_Downloader }
}
On *:Dialog:GetFile*:Sclick:3: {
  if ($gettok($sock($dname).mark,1,32)) {
    dialog -x $dname
    .remove $+($gettok($sock($dname).mark,1,32),$gettok($sock($dname).mark,4,32))
    sockclose $sockname
  }
}
On *:Dialog:GetFile*:Sclick:5: { dialog -x $dname }
On *:Dialog:GetFile*:init:*: {
  did -a $dname 1 Found file $gettok($sock($dname).mark,1,32) $+ $gettok($sock($dname).mark,4,32)
  did -a $dname 4 0 $+ %
}
dialog -l mIRC_Downloader {
  title "mIRC Downloader"
  size -1 -1 120 48
  option dbu
  text "", 1, 0 0 121 24, center
  edit "", 2, 16 25 82 10, read
  button "Cancel", 3, 89 36 29 12
  text "", 4, 16 35 25 8
  button "Close", 5, 56 36 29 12
}
dialog -l M_D {
  title "mIRC Music Downloader"
  size -1 -1 200 232
  option dbu
  text "Artist", 1, 43 6 25 8, center
  text "Song Name", 2, 132 6 33 8, center
  text "Search Site", 3, 34 26 41 8, center
  text "Results", 4, 88 50 25 8, center
  text "", 5, 0 208 201 8, center
  edit "", 6, 10 15 90 10, autohs
  edit "", 7, 104 15 88 10, autohs
  combo 8, 10 35 87 10, sort drop
  combo 9, 8 60 186 144, sort hsbar vsbar
  button "Close", 10, 12 218 37 12, cancel
  button "Download", 11, 106 218 37 12
  button "Search", 12, 152 218 37 12
  button "Play File", 13, 59 218 37 12
  text "Page Number", 14, 133 26 33 8
  combo 15, 105 35 88 10, drop
}
On *:Dialog:M_D:edit:6-7: { did -rac $dname 15 1 }
On *:Dialog:M_D:init:*: {
  did -ac $dname 8 www.kohit.net
  did -a $dname 8 www.dilandau.com
  did -ac $dname 15 1
}
On *:Dialog:M_D:Sclick:8,11-13,15: {
  if ($did == 8) {
    did -r $dname 9,15
    did -ac $dname 15 1
  }
  if ($did == 12) || ($did == 15) {
    if ($did($dname,6).text) || ($did($dname,7).text) {
      if ($did($dname,8).seltext == www.kohit.net) {
        kohit $replace($did($dname,6).text $did($dname,7).text,$chr(32),-) $iif($calc($did($dname,15).seltext - 1),$v1)
      }
      if ($did($dname,8).seltext == www.dilandau.com) {
        dilandau $did($dname,15).seltext $replace($did($dname,6).text $did($dname,7).text,$chr(32),% $+ 20)
      }
    }
    else { 
      did -a $dname 5 Please Enter a Artist or Song to Search!
      .timer 1 4 if ($!dialog($dname)) { did -a $dname 5 }
    }   
  }
  if ($did == 11) {
    if ($did($dname,9).seltext) {
      if ($did($dname,8).seltext == www.kohit.net) {
        kohitD $gettok($did($dname,9).seltext,2,7)
      }
      if ($did($dname,8).seltext == www.dilandau.com) {
        var %link $gettok($did($dname,9).seltext,2,7)
        getfile %link $iif($gettok($gettok($did($dname,9).seltext,1,7),-1,45),$mkfn($replace($v1,$chr(32),_)),Misc) $mkfn($replace($gettok($nopath(%link),1,46),$chr(32),_,% $+ 20,_))
      }
    }
    else {
      did -a M_D 5 Please Select a Song to Download!
      .timer 1 4 if ($!dialog($dname)) { did -a $dname 5 }
    }
  }
  if ($did == 13) {
    if ($isdir(mircmusic)) { if ($sfile(mircmusic\,mIRC Music Downloader by Ford_Lawnmower)) { run $v1 }  }
    else { did -a $dname 5 Download some Music first! | .timer 1 4 if ($!dialog($dname)) { did -a $dname 5 } }
  }
}
alias -l DidOpen {
  dialog $iif($dialog($1),-v,-md) $1 $1
}
menu * {
  mIRC Music Downloader:DidOpen M_D
}
;alias to force redirect consistantly
alias -l FRD { return $+($upper($left($1,1)),$lower($right($1,$calc($len($1) - 1)))) }
alias -l bintween {
  var %count = 1, %mark = 0, %mark2 = 0
  while (%count <= $4) {
    if ($bfind($1, %mark2, $2).text) {
      %mark = $calc($bfind($1, %mark2, $2).text + $len($2))
      if ($bfind($1, %mark, $3).text) {
        %mark2 = $bfind($1, %mark, $3).text
      }
      else { return 0 } 
    }
    else { return 0 }
    inc %count
  }
  if ($calc(%mark2 - %mark) > 960) && ($version < 6.32) { return 0 }
  else { return $bvar($1, $iif(%mark > 0,%mark,1), $calc(%mark2 - %mark)).text }
}
alias -l fixchars {
  var %fixmatch = $regex($1-,/(&#.*?;)/g), %fixtext = $1-
  while (%fixmatch) {
    %fixtext = $replace(%fixtext,$regml(%fixmatch),$chr($remove($regml(%fixmatch),&#,;)))
    dec %fixmatch
  }
  return %fixtext
}
;alias by Gummo
alias -l between { 
  noop $regex($1,/\Q $+ $2 $+ \E(.*?)\Q $+ $3 $+ \E/gi) 
  return $regml($4) 
}

Comments

Sign in to comment.
blackvenomm666   -  Jun 14, 2011

this is awesome

 Respond  
JDavis   -  Nov 17, 2009

thx Ford

 Respond  
FordLawnmower   -  Nov 16, 2009

What jonesy44 said :)
I have http://www.hawkee.com/snippet/6250/ <<--- THIS SCRIPT for searching with the bot JDavis.

 Respond  
Jonesy44   -  Nov 16, 2009

mm.. that doesn't really make sense... A bot, unless local has no connection to you besides over IRC -- max transfer rate is about 12bytes - 1kb per second, if that. Unless you socket it over -- direct connection (ports need to be available etc.)

 Respond  
JDavis   -  Nov 16, 2009

it'd be nice if this would work for a bot.. so your members could dl the shizzle..

 Respond  
JDavis   -  Nov 16, 2009

Megadeath is what Pink Floyds 1st band name was.. That is why Dave named his band Megadeth.. So no copyright issues.. lol

 Respond  
Jonesy44   -  Aug 27, 2009

mmm. gotta love bit of old school metal:P

 Respond  
FordLawnmower   -  Aug 26, 2009

Only one of them left to form megade(a)th

 Respond  
GlobalAnomaly   -  Aug 26, 2009

_>

Former members
Ron McGovney
Dave Mustaine
Cliff Burton
Jason Newsted

Name one! :P

 Respond  
FordLawnmower   -  Aug 26, 2009

Oh, haha. I never knew that jonesy44 ;/
That one guy who used to be in metallica would freak out if he saw that.

 Respond  
Jonesy44   -  Aug 26, 2009

Haha! That is a simple shortuct. However, MEGADETH spelled incorrectly would simply cause an error in search.

 Respond  
sunslayer   -  Aug 26, 2009

btw "spelt" is spelt "spelled" L :p

 Respond  
Jonesy44   -  Aug 26, 2009

Btw. "Megadeath" is spelt "Megadeth":P

edit: and really freaky how i openned this post & megadeth - the killing road starts playing... strraannngee :L

 Respond  
||--RICKY--||   -  Aug 26, 2009

Awesome script! Works great! 10/10

 Respond  
FordLawnmower   -  Aug 25, 2009

@Mhz I'll consider adding some folder options on the next re-write.
Sorry there is nothing I can do about the bad links atm. However, at some point, I will be adding more search engines to this script. It's just a matter of finding sites with consistent enough results to be worth adding.

Thank you jeroen :)

 Respond  
jeroen   -  Aug 24, 2009

works very good

 Respond  
GlobalAnomaly   -  Aug 24, 2009

That'd be a problem with the sites files, I think. Not sure.

 Respond  
Mhz   -  Aug 24, 2009

Hello
I like it very much, the only problem I had is with some french group. They are call Beau Dommage. All there song report Bad or missing file ! Except for that very good, i add a select working directory that's all. Love it !

 Respond  
GlobalAnomaly   -  Aug 23, 2009

Yep..good band. I was forced to listen to Tool (girlfriend is a music freak) but I liked it right away xD! Er...off topic >_>

 Respond  
FordLawnmower   -  Aug 23, 2009

Good Idea :) I love Tool :))

 Respond  
GlobalAnomaly   -  Aug 23, 2009

mhm, and thanks for replying XD? I'm using it to download Tool >_>

 Respond  
FordLawnmower   -  Aug 23, 2009

Thanks Phoenix- :)
Thanks PATX :)
@GlobalAnomaly It's possible to do that but I don't think it is necessary. A mp3 virus is a real long shot and would need a exploit in your media player to get in. Also the script excludes small files that would most often hold viruses. I addition, all of these files come from servers that are scanned for viruses on a regular basis.
More often than not you will get viruses from P2P.
It's something to think about though :) I might just try and figure out how to do it out of curiosity but I probably won't be adding it to this script.
Thanks for the comment :)

 Respond  
GlobalAnomaly   -  Aug 23, 2009

lmao sunslayer

 Respond  
sunslayer   -  Aug 23, 2009

i agree with Phonenix- word by word :)

http://en.wikipedia.org/wiki/Plagiarism

 Respond  
GlobalAnomaly   -  Aug 23, 2009

Would it be possible to set the script to scan the file after downloading, using whatever anti-virus someone has? Nice script though. 10/10

 Respond  
PATX   -  Aug 23, 2009

i agree with Phonenix- word by word :)

 Respond  
Phoenix-   -  Aug 23, 2009

FordLawnmower ... you are absolutely incredible.
This works perfect and I wouldn't want anything changed from it at all.
The search works great and returns so many results, the download bar (which I didn't expect) was great and I downloaded so fast from it. You made a directory for the name and made it play in WMP, which is great.

This script deserves a 10/10.

 Respond  
FordLawnmower   -  Aug 23, 2009

Major update
Image
Added

  • A second search engine.
  • Page change drop down. (To view all the results)
  • More efficient code for faster downloads.
  • Better error checking to quickly tell you if a file is bad or missing.
  • Lots of bug fixes.
    Enjoy :)
 Respond  
FordLawnmower   -  Jun 27, 2009

Thanks M3nt0k :)

 Respond  
m3nt0k   -  Jun 27, 2009

Fantasic addon, but ya already know i think this ^^

 Respond  
Are you sure you want to unfollow this person?
Are you sure you want to delete this?
Click "Unsubscribe" to stop receiving notices pertaining to this post.
Click "Subscribe" to resume notices pertaining to this post.