Imported Upstream version 0.5 debian upstream upstream/0.5
authorDevon Kearns <dookie@kali.org>
Tue, 29 Jan 2013 19:22:31 +0000 (12:22 -0700)
committerDevon Kearns <dookie@kali.org>
Tue, 29 Jan 2013 19:22:31 +0000 (12:22 -0700)
13 files changed:
CHANGELOG [new file with mode: 0644]
README [new file with mode: 0644]
common-misspellings.rb [new file with mode: 0644]
country-codes.txt [new file with mode: 0644]
country-ips.dat [new file with mode: 0644]
country.rb [new file with mode: 0644]
homophones.rb [new file with mode: 0644]
inflections.rb [new file with mode: 0644]
inflector.rb [new file with mode: 0644]
report-facebook.com.txt [new file with mode: 0644]
report-google.com.txt [new file with mode: 0644]
tld.rb [new file with mode: 0644]
urlcrazy [new file with mode: 0755]

diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644 (file)
index 0000000..37229d2
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,16 @@
+New in Version 0.5 (15 July 2012)
+* Support for Ruby 1.9.1
+* CSV output
+* Output files
+* Double character replacement typos
+* Homoglyphs - used https://en.wikipedia.org/wiki/Homoglyph
+* Added IP to country support
+* No longer checks domain popularity by default
+* Updated some text
+* Updated common misspellings from http://en.wikipedia.org/wiki/Wikipedia:Lists_of_common_misspellings/For_machines
+
+New in Version 0.4 (13 September 2011)
+* Bitflipping domains
+* Homophone domains (Words that sound the same)
+* Vowel swap Typos
+
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..e348349
--- /dev/null
+++ b/README
@@ -0,0 +1,158 @@
+Title:          URLCrazy Readme
+Version:        0.5
+Description:    UrlCrazy is for the study of domainname typos and URL hijacking
+Release Date:   July 2012
+Author:         Andrew Horton (urbanadventurer)
+Homepage:        www.morningstarsecurity.com/research/urlcrazy
+Platforms:      Linux, Ruby
+License: Copyright Andrew Horton, 2012. You have permission to use and distribute this software. You do not have permission to distribute modified versions without permission. You do not have permission to use this as part of a commercial service unless it forms part of a penetration testing service. For example a commercial service that provides domain protection for clients must obtain a license first. Email me if you require a license.
+
+
+Description
+------------
+Generate and test domain typos and variations to detect and perform typo squatting, URL hijacking,
+phishing, and corporate espionage.
+
+Use Cases:
+       o) Detect typo squatters profiting from typos on your domain name
+       o) Protect your brand by registering popular typos
+       o) Identify typo domain names that will receive traffic intended for another domain
+       o) Conduct phishing attacks during a penetration test
+
+Features:
+       o) Generates 15 types of domain variants
+       o) Knows over 8000 common misspellings
+       o) Supports cosmic ray induced bit flipping
+       o) Multiple keyboard layouts (qwerty, azerty, qwertz, dvorak)
+       o) Checks if a domain variant is valid
+       o) Test if domain variants are in use
+       o) Estimate popularity of a domain variant
+
+
+Types of Domain Variations Supported
+----------------------------------
+Character Omission.
+These typos are created by leaving out a letter of the domain name, one letter at a time. For example, www.goole.com and www.gogle.com
+
+Character Repeat.
+These typos are created by repeating a letter of the domain name. For example, www.ggoogle.com and www.gooogle.com
+
+Adjacent Character Swap.
+These typos are created by swapping the order of adjacent letters in the domain name. For example, www.googel.com and www.ogogle.com
+
+Adjacent Character Replacement.
+These typos are created by replacing each letter of the domain name with letters to the immediate left and right on the keyboard. For example, www.googke.com and www.goohle.com
+
+Double Character Replacement.
+These typos are created by replacing identical, consecutive letters of the domain name with letters to the immediate left and right on the keyboard. For example, www.gppgle.com and www.giigle.com
+
+Adjacent Character Insertion.
+These typos are created by inserting letters to the immediate left and right on the keyboard of each letter. For example, www.googhle.com and www.goopgle.com
+
+Missing Dot.
+These typos are created by omitting a dot from the domainname. For example, wwwgoogle.com and www.googlecom
+
+Strip Dashes.
+These typos are created by omitting a dash from the domainname. For example, www.domain-name.com becomes www.domainname.com
+
+Singular or Pluralise.
+These typos are created by making a singular domain plural and vice versa. For example, www.google.com becomes www.googles.com and www.games.co.nz becomes www.game.co.nz
+
+Common Misspellings.
+Over 8000 common misspellings from Wikipedia. For example, www.youtube.com becomes www.youtub.com and www.abseil.com becomes www.absail.com
+
+Vowel Swapping.
+Swap vowels within the domain name except for the first letter. For example, www.google.com becomes www.gaagle.com.
+
+Homophones.
+Over 450 sets of words that sound the same when spoken. For example, www.base.com becomes www.bass.com.
+
+Bit Flipping.
+Each letter in a domain name is an 8bit character. The character is substituted with the set of valid characters that can be made after a single bit flip. For example, facebook.com becomes bacebook.com, dacebook.com, faaebook.com,fabebook.com,facabook.com, etc.
+
+Homoglyphs.
+One or more characters that look similar to another character but are different are called homogylphs. An example is that the lower case l looks similar to the numeral one, e.g. l vs 1. For example, google.com becomes goog1e.com.
+
+Wrong Top Level Domain.
+For example, www.trademe.co.nz becomes www.trademe.co.nz and www.google.com becomes www.google.org
+Uses the 19 most common top level domains.
+
+Wrong Second Level Domain.
+Uses an alternate, valid second level domain for the top level domain.
+For example, www.trademe.co.nz becomes www.trademe.ac.nz and www.trademe.iwi.nz
+
+
+Tips
+--------------------------
+The output will often be wider than the width of your terminal. If this bothers you, output your report to a file or increase the width of your terminal.
+
+
+Supported Keyboard Layouts
+---------------------------
+Keyboard layouts supported are:
+       * QWERTY
+       * AZERTY
+       * QWERTZ
+       * DVORAK
+
+
+Is the domain valid?
+--------------------
+UrlCrazy has a database of valid top level and second level domains. This information has been compiled from Wikipedia and domain registrars. We know whether a domain is valid by checking if it matches toplevel and second level domains. For example, www.trademe.co.bz is a valid domain in Belize which allows any second level domain registrations but www.trademe.xo.nz isn't because xo.nz isn't an allowed second level domain in New Zealand.
+
+
+Popularity Estimate
+-------------------
+We can estimate the relative popularity of a typo by measuring how often that typo appears on webpages. Querying goole.com for the number of search results for a typo gives us a indication of how popular a typo is.
+
+The drawback of this approach is that you need to manually identify and omit legitimate domains such as googles.com
+
+For example, consider the following typos for google.com.
+25424 gogle.com
+24031 googel.com
+22490 gooogle.com
+19172 googles.com
+19148 goole.com
+18855 googl.com
+17842 ggoogle.com
+
+
+IP Address
+-------------------
+An IP address for a typo domainname indicates it is in use.
+
+Tip: An IP repeating for multiple typos or IPs in a close range shows common ownership. For example, gogle.com, gogole.com and googel.com all resolve to 64.233.161.104 which is owned by Google.
+
+
+
+Country Code Database
+----------------------
+http://en.wikipedia.org/wiki/Top-level_domain
+http://en.wikipedia.org/wiki/Country_code_top-level_domain
+2nd level domains here:
+http://www.iana.org/domains/root/db/
+
+
+See Also
+---------
+http://en.wikipedia.org/wiki/Wikipedia:AutoWikiBrowser/Typos
+http://en.wikipedia.org/wiki/Wikipedia:Typo
+http://en.wikipedia.org/wiki/Typosquatting
+
+Strider is tool with similar aims and is produced by Microsoft http://research.microsoft.com/csm/strider/
+
+
+Installation
+-------------
+UrlCrazy requires ruby. If you are using Ubuntu or Debian try:
+       $ sudo apt-get install ruby.
+
+
+
+Credits
+--------
+Authored by Andrew Horton (urbanadventurer). Andrew is a security consultant for Stratsec.net
+Thanks to Ruby on Rails for Inflector which allows plural and singular permutations.
+Thanks to Wikipedia for the set of common misspellings, homophones, and homoglyphs.
+Thanks to software77.net for their IP to country database
+
diff --git a/common-misspellings.rb b/common-misspellings.rb
new file mode 100644 (file)
index 0000000..d0248c2
--- /dev/null
@@ -0,0 +1,4265 @@
+# coding: utf-8
+
+class CommonMisspellings
+
+#pp CommonMisspellings.misspelling("zebra")
+
+# from http://en.wikipedia.org/wiki/Wikipedia:Lists_of_common_misspellings/For_machines
+@@t="abandonned->abandoned
+aberation->aberration
+abilties->abilities
+abilty->ability
+abondon->abandon
+abbout->about
+abotu->about
+abouta->about a
+aboutit->about it
+aboutthe->about the
+abscence->absence
+abondoned->abandoned
+abondoning->abandoning
+abondons->abandons
+aborigene->aborigine
+accesories->accessories
+accidant->accident
+abortificant->abortifacient
+abreviate->abbreviate
+abreviated->abbreviated
+abreviation->abbreviation
+abritrary->arbitrary
+absail->abseil
+absailing->abseiling
+absense->absence
+absolutly->absolutely
+absorbsion->absorption
+absorbtion->absorption
+abudance->abundance
+abundacies->abundances
+abundancies->abundances
+abundunt->abundant
+abutts->abuts
+acadamy->academy
+acadmic->academic
+accademic->academic
+accademy->academy
+acccused->accused
+accelleration->acceleration
+accension->accession, ascension
+acceptence->acceptance
+acceptible->acceptable
+accessable->accessible
+accidentaly->accidentally
+accidently->accidentally
+acclimitization->acclimatization
+accomadate->accommodate
+accomadated->accommodated
+accomadates->accommodates
+accomadating->accommodating
+accomadation->accommodation
+accomadations->accommodations
+accomdate->accommodate
+accomodate->accommodate
+accomodated->accommodated
+accomodates->accommodates
+accomodating->accommodating
+accomodation->accommodation
+accomodations->accommodations
+accompanyed->accompanied
+accordeon->accordion
+accordian->accordion
+accoring->according
+accoustic->acoustic
+accquainted->acquainted 
+accrediation->accreditation
+accredidation->accreditation
+accross->across
+accussed->accused
+acedemic->academic
+acheive->achieve
+acheived->achieved
+acheivement->achievement
+acheivements->achievements
+acheives->achieves
+acheiving->achieving
+acheivment->achievement
+acheivments->achievements
+achievment->achievement
+achievments->achievements
+achive->achieve, archive
+achived->achieved, archived
+achivement->achievement
+achivements->achievements
+acknowldeged->acknowledged
+acknowledgeing->acknowledging
+ackward->awkward, backward
+acommodate->accommodate
+acomplish->accomplish
+acomplished->accomplished
+acomplishment->accomplishment
+acomplishments->accomplishments
+acording->according
+acordingly->accordingly
+acquaintence->acquaintance
+acquaintences->acquaintances
+acquiantence->acquaintance
+acquiantences->acquaintances
+acquited->acquitted
+activites->activities
+activly->actively
+actualy->actually
+acuracy->accuracy
+acused->accused
+acustom->accustom
+acustommed->accustomed
+adavanced->advanced
+adbandon->abandon
+addional->additional
+addionally->additionally
+additinally->additionally
+additionaly->additionally
+additonal->additional
+additonally->additionally
+addmission->admission
+addopt->adopt
+addopted->adopted
+addoptive->adoptive
+addres->address, adders
+addresable->addressable
+addresed->addressed
+addresing->addressing
+addressess->addresses
+addtion->addition
+addtional->additional
+adecuate->adequate
+adequit->adequate
+adhearing->adhering
+adherance->adherence
+admendment->amendment
+admininistrative->administrative
+adminstered->administered
+adminstrate->administrate
+adminstration->administration
+adminstrative->administrative
+adminstrator->administrator
+admissability->admissibility
+admissable->admissible
+admited->admitted
+admitedly->admittedly
+adn->and
+adolecent->adolescent
+adquire->acquire
+adquired->acquired
+adquires->acquires
+adquiring->acquiring
+adres->address
+adresable->addressable
+adresing->addressing
+adress->address
+adressable->addressable
+adressed->addressed
+adressing->addressing, dressing
+adventrous->adventurous
+advertisment->advertisement
+advertisments->advertisements
+advesary->adversary
+adviced->advised
+aeriel->aerial
+aeriels->aerials
+afair->affair
+afficianados->aficionados
+afficionado->aficionado
+afficionados->aficionados
+affilate->affiliate
+affilliate->affiliate
+affort->afford, effort
+aforememtioned->aforementioned
+againnst->against
+agains->against
+agaisnt->against
+aganist->against
+aggaravates->aggravates
+aggreed->agreed
+aggreement->agreement
+aggregious->egregious
+aggresive->aggressive
+agian->again
+agianst->against
+agin->again
+agina->again, angina
+aginst->against
+agravate->aggravate
+agre->agree
+agred->agreed
+agreeement->agreement
+agreemnt->agreement
+agregate->aggregate
+agregates->aggregates
+agreing->agreeing
+agression->aggression
+agressive->aggressive
+agressively->aggressively
+agressor->aggressor
+agricultue->agriculture
+agriculure->agriculture
+agricuture->agriculture
+agrieved->aggrieved
+ahev->have
+ahppen->happen
+ahve->have
+aicraft->aircraft
+aiport->airport
+airbourne->airborne
+aircaft->aircraft
+aircrafts->aircraft
+airporta->airports
+airrcraft->aircraft
+aisian->asian
+albiet->albeit
+alchohol->alcohol
+alchoholic->alcoholic
+alchol->alcohol
+alcholic->alcoholic
+alcohal->alcohol
+alcoholical->alcoholic
+aledge->allege
+aledged->alleged
+aledges->alleges
+alege->allege
+aleged->alleged
+alegience->allegiance
+algebraical->algebraic
+algorhitms->algorithms
+algoritm->algorithm
+algoritms->algorithms
+alientating->alienating
+alledge->allege
+alledged->alleged
+alledgedly->allegedly
+alledges->alleges
+allegedely->allegedly
+allegedy->allegedly
+allegely->allegedly
+allegence->allegiance
+allegience->allegiance
+allign->align
+alligned->aligned
+alliviate->alleviate
+allopone->allophone
+allopones->allophones
+allready->already
+allthough->although
+alltime->all-time
+alltogether->altogether
+almsot->almost
+alochol->alcohol
+alomst->almost
+alot->a lot, allot
+alotted->allotted
+alowed->allowed
+alowing->allowing
+alreayd->already
+alse->else
+alsot->also
+alternitives->alternatives
+altho->although
+althought->although
+altough->although
+alusion->allusion, illusion
+alwasy->always
+alwyas->always
+amalgomated->amalgamated
+amatuer->amateur
+amature->armature, amateur
+amendmant->amendment
+Amercia->America
+amerliorate->ameliorate
+amke->make
+amking->making
+ammend->amend
+ammended->amended
+ammendment->amendment
+ammendments->amendments
+ammount->amount
+ammused->amused
+amoung->among
+amoungst->amongst
+amung->among
+amunition->ammunition
+analagous->analogous
+analitic->analytic
+analogeous->analogous
+anarchim->anarchism
+anarchistm->anarchism
+anbd->and
+ancestory->ancestry
+ancilliary->ancillary
+andd->and
+androgenous->androgynous
+androgeny->androgyny
+anihilation->annihilation
+aniversary->anniversary
+annoint->anoint
+annointed->anointed
+annointing->anointing
+annoints->anoints
+annouced->announced
+annualy->annually
+annuled->annulled
+anohter->another
+anomolies->anomalies
+anomolous->anomalous
+anomoly->anomaly
+anonimity->anonymity
+anounced->announced
+anouncement->announcement
+ansalisation->nasalisation
+ansalization->nasalization
+ansestors->ancestors
+antartic->antarctic
+anthromorphization->anthropomorphization
+anthropolgist->anthropologist
+anthropolgy->anthropology
+anual->annual
+anulled->annulled
+anwsered->answered
+anyhwere->anywhere
+anyother->any other
+anytying->anything
+aparent->apparent
+aparment->apartment
+apenines->apennines, Apennines
+aplication->application
+aplied->applied
+apolegetics->apologetics
+apon->upon, apron
+apparant->apparent
+apparantly->apparently
+appart->apart
+appartment->apartment
+appartments->apartments
+appealling->appealing, appalling
+appeareance->appearance
+appearence->appearance
+appearences->appearances
+appenines->apennines, Apennines
+apperance->appearance
+apperances->appearances
+appereance->appearance
+appereances->appearances
+applicaiton->application
+applicaitons->applications
+appologies->apologies
+appology->apology
+apprearance->appearance
+apprieciate->appreciate
+approachs->approaches
+appropiate->appropriate
+appropraite->appropriate
+appropropiate->appropriate
+approproximate->approximate
+approxamately->approximately
+approxiately->approximately
+approximitely->approximately
+aprehensive->apprehensive
+apropriate->appropriate
+aproval->approval 
+aproximate->approximate
+aproximately->approximately
+aquaduct->aqueduct
+aquaintance->acquaintance
+aquainted->acquainted
+aquiantance->acquaintance
+aquire->acquire
+aquired->acquired
+aquiring->acquiring
+aquisition->acquisition
+aquitted->acquitted
+aranged->arranged
+arangement->arrangement
+arbitarily->arbitrarily
+arbitary->arbitrary
+archaelogical->archaeological
+archaelogists->archaeologists
+archaelogy->archaeology
+archaoelogy->archeology, archaeology
+archaology->archeology, archaeology
+archeaologist->archeologist, archaeologist
+archeaologists->archeologists, archaeologists
+archetect->architect
+archetects->architects
+archetectural->architectural
+archetecturally->architecturally
+archetecture->architecture
+archiac->archaic
+archictect->architect
+archimedian->archimedean
+architecht->architect
+architechturally->architecturally
+architechture->architecture
+architechtures->architectures
+architectual->architectural
+archtype->archetype
+archtypes->archetypes
+aready->already
+areodynamics->aerodynamics
+argubly->arguably
+arguement->argument
+arguements->arguments
+arised->arose
+arival->arrival
+armamant->armament
+armistace->armistice
+arogant->arrogant
+arogent->arrogant
+aroud->around
+arrangment->arrangement
+arrangments->arrangements
+arrengement->arrangement
+arrengements->arrangements
+arround->around
+artcile->article
+artical->article
+artice->article
+articel->article
+artifical->artificial
+artifically->artificially
+artillary->artillery
+arund->around
+asetic->ascetic
+asfar->as far
+asign->assign
+aslo->also
+asociated->associated
+asorbed->absorbed
+asphyxation->asphyxiation
+assasin->assassin
+assasinate->assassinate
+assasinated->assassinated
+assasinates->assassinates
+assasination->assassination
+assasinations->assassinations
+assasined->assassinated
+assasins->assassins
+assassintation->assassination
+assemple->assemble
+assertation->assertion
+asside->aside
+assisnate->assassinate
+assit->assist
+assitant->assistant
+assocation->association
+assoicate->associate
+assoicated->associated
+assoicates->associates
+assosication->assassination
+asssassans->assassins
+assualt->assault
+assualted->assaulted
+assymetric->asymmetric
+assymetrical->asymmetrical
+asteriod->asteroid
+asthetic->aesthetic
+asthetical->aesthetical
+asthetically->aesthetically
+asume->assume
+aswell->as well
+atain->attain
+atempting->attempting
+atheistical->atheistic
+athenean->athenian
+atheneans->athenians
+athiesm->atheism
+athiest->atheist
+atorney->attorney
+atribute->attribute
+atributed->attributed
+atributes->attributes
+attaindre->attainder, attained
+attemp->attempt
+attemped->attempted
+attemt->attempt
+attemted->attempted
+attemting->attempting
+attemts->attempts
+attendence->attendance
+attendent->attendant
+attendents->attendants
+attened->attended
+attension->attention
+attitide->attitude
+attributred->attributed
+attrocities->atrocities
+audeince->audience
+auromated->automated
+austrailia->Australia
+austrailian->Australian
+auther->author
+authobiographic->autobiographic
+authobiography->autobiography
+authorative->authoritative
+authorites->authorities
+authorithy->authority
+authoritiers->authorities
+authoritive->authoritative
+authrorities->authorities
+autochtonous->autochthonous
+autoctonous->autochthonous
+automaticly->automatically
+automibile->automobile
+automonomous->autonomous
+autor->author
+autority->authority
+auxilary->auxiliary
+auxillaries->auxiliaries
+auxillary->auxiliary
+auxilliaries->auxiliaries
+auxilliary->auxiliary
+availabe->available
+availablity->availability
+availaible->available
+availble->available
+availiable->available
+availible->available
+avalable->available
+avalance->avalanche
+avaliable->available
+avation->aviation
+avengence->a vengeance
+averageed->averaged
+avilable->available
+awared->awarded
+awya->away
+azn->asian
+baceause->because
+backgorund->background
+backrounds->backgrounds
+bakc->back
+banannas->bananas
+bandwith->bandwidth
+bankrupcy->bankruptcy
+banruptcy->bankruptcy
+baout->about, bout
+basicaly->basically
+basicly->basically
+bcak->back
+beachead->beachhead
+beacuse->because
+beastiality->bestiality
+beatiful->beautiful
+beaurocracy->bureaucracy
+beaurocratic->bureaucratic
+beautyfull->beautiful
+becamae->became
+becames->becomes, became
+becasue->because
+beccause->because
+becomeing->becoming
+becomming->becoming
+becouse->because
+becuase->because
+bedore->before
+beeing->being
+befoer->before
+beggin->begin, begging
+begginer->beginner
+begginers->beginners
+beggining->beginning
+begginings->beginnings
+beggins->begins
+begining->beginning
+beginnig->beginning
+behavour->behavior, behaviour
+beleagured->beleaguered
+beleif->belief
+beleive->believe
+beleived->believed
+beleives->believes
+beleiving->believing
+beligum->belgium
+belive->believe
+belived->believed, beloved
+belives->believes, beliefs
+belligerant->belligerent
+bellweather->bellwether
+bemusemnt->bemusement
+beneficary->beneficiary
+beng->being
+benificial->beneficial
+benifit->benefit
+benifits->benefits
+bergamont->bergamot
+Bernouilli->Bernoulli
+beseige->besiege
+beseiged->besieged
+beseiging->besieging
+beteen->between
+betwen->between
+beween->between
+bewteen->between
+bilateraly->bilaterally
+billingualism->bilingualism
+binominal->binomial
+bizzare->bizarre
+blaim->blame
+blaimed->blamed
+blessure->blessing
+Blitzkreig->Blitzkrieg
+boaut->bout, boat, about
+bodydbuilder->bodybuilder
+bombardement->bombardment
+bombarment->bombardment
+bondary->boundary
+Bonnano->Bonanno
+borke->broke
+boundry->boundary
+bouyancy->buoyancy
+bouyant->buoyant
+boyant->buoyant
+Brasillian->Brazilian
+breakthough->breakthrough
+breakthroughts->breakthroughs
+breif->brief
+breifly->briefly
+brethen->brethren
+bretheren->brethren
+briliant->brilliant
+brillant->brilliant
+brimestone->brimstone
+Britian->Britain
+Brittish->British
+broacasted->broadcast
+broadacasting->broadcasting
+broady->broadly
+Buddah->Buddha
+Buddist->Buddhist
+buisness->business
+buisnessman->businessman
+buoancy->buoyancy
+buring->burying, burning, burin, during
+burried->buried
+busines->business
+busineses->business, businesses
+busness->business
+bussiness->business
+caculater->calculator
+cacuses->caucuses
+cahracters->characters
+calaber->caliber
+calander->calendar, calender, colander
+calculater->calculator
+calculs->calculus
+calenders->calendars
+caligraphy->calligraphy
+caluclate->calculate
+caluclated->calculated
+caluculate->calculate
+caluculated->calculated
+calulate->calculate
+calulated->calculated
+calulater->calculator
+Cambrige->Cambridge
+camoflage->camouflage
+campain->campaign
+campains->campaigns
+candadate->candidate
+candiate->candidate
+candidiate->candidate
+cannister->canister
+cannisters->canisters
+cannnot->cannot
+cannonical->canonical
+cannotation->connotation
+cannotations->connotations
+cant->cannot, can not, can't
+caost->coast
+caperbility->capability
+Capetown->Cape Town
+capible->capable
+captial->capital
+captued->captured
+capturd->captured
+carachter->character
+caracterized->characterized
+carcas->carcass, Caracas
+carefull->careful
+careing->caring
+carismatic->charismatic
+Carmalite->Carmelite
+Carnagie->Carnegie
+Carnagie-Mellon->Carnegie-Mellon
+carnege->carnage, Carnegie
+carnige->carnage, Carnegie
+Carnigie->Carnegie
+Carnigie-Mellon->Carnegie-Mellon
+carniverous->carnivorous
+carreer->career
+carrers->careers
+Carribbean->Caribbean
+Carribean->Caribbean
+cartdridge->cartridge
+Carthagian->Carthaginian
+carthographer->cartographer
+cartilege->cartilage
+cartilidge->cartilage
+cartrige->cartridge
+casette->cassette
+casion->caisson
+cassawory->cassowary
+cassowarry->cassowary
+casue->cause
+casued->caused
+casues->causes
+casuing->causing
+casulaties->casualties
+casulaty->casualty
+catagories->categories
+catagorized->categorized
+catagory->category
+Cataline->Catiline, Catalina
+catapillar->caterpillar
+catapillars->caterpillars
+catapiller->caterpillar
+catapillers->caterpillars
+catepillar->caterpillar
+catepillars->caterpillars
+catergorize->categorize
+catergorized->categorized
+caterpilar->caterpillar
+caterpilars->caterpillars
+caterpiller->caterpillar
+caterpillers->caterpillars
+cathlic->catholic
+catholocism->catholicism
+catterpilar->caterpillar
+catterpilars->caterpillars
+catterpillar->caterpillar
+catterpillars->caterpillars
+cattleship->battleship
+causalities->casualties
+Ceasar->Caesar
+Celcius->Celsius
+cellpading->cellpadding
+cementary->cemetery
+cemetarey->cemetery
+cemetaries->cemeteries
+cemetary->cemetery
+cencus->census
+censur->censor, censure
+cententenial->centennial
+centruies->centuries
+centruy->century
+centuties->centuries
+centuty->century
+ceratin->certain, keratin
+cerimonial->ceremonial
+cerimonies->ceremonies
+cerimonious->ceremonious
+cerimony->ceremony
+ceromony->ceremony
+certainity->certainty
+certian->certain
+cervial->cervical, servile, serval
+chalenging->challenging
+challange->challenge
+challanged->challenged
+challege->challenge
+Champange->Champagne
+changable->changeable
+charachter->character
+charachters->characters
+charactersistic->characteristic
+charactor->character 
+charactors->characters
+charasmatic->charismatic
+charaterized->characterized
+chariman->chairman
+charistics->characteristics
+chasr->chaser, chase
+cheif->chief
+cheifs->chiefs
+chemcial->chemical
+chemcially->chemically
+chemestry->chemistry
+chemicaly->chemically
+childbird->childbirth
+childen->children
+choosen->chosen
+chracter->character
+chuch->church
+churchs->churches
+Cincinatti->Cincinnati
+Cincinnatti->Cincinnati
+circulaton->circulation
+circumsicion->circumcision
+circut->circuit
+ciricuit->circuit
+ciriculum->curriculum
+civillian->civilian
+claer->clear
+claerer->clearer
+claerly->clearly
+claimes->claims
+clas->class
+clasic->classic
+clasical->classical
+clasically->classically
+cleareance->clearance
+clera->clear, sclera
+clincial->clinical
+clinicaly->clinically
+cmo->com
+cmoputer->computer
+co-incided->coincided
+coctail->cocktail
+coform->conform
+cognizent->cognizant
+coincedentally->coincidentally
+colaborations->collaborations
+colateral->collateral
+colelctive->collective
+collaberative->collaborative
+collecton->collection
+collegue->colleague
+collegues->colleagues
+collonade->colonnade
+collonies->colonies
+collony->colony 
+collosal->colossal
+colonizators->colonizers
+comander->commander, commandeer
+comando->commando
+comandos->commandos
+comany->company
+comapany->company
+comback->comeback
+combanations->combinations
+combinatins->combinations
+combusion->combustion
+comdemnation->condemnation
+comemmorates->commemorates
+comemoretion->commemoration
+comision->commission
+comisioned->commissioned
+comisioner->commissioner
+comisioning->commissioning
+comisions->commissions
+comission->commission
+comissioned->commissioned
+comissioner->commissioner
+comissioning->commissioning
+comissions->commissions
+comited->committed
+comiting->committing
+comitted->committed
+comittee->committee
+comitting->committing
+commandoes->commandos
+commedic->comedic
+commemerative->commemorative
+commemmorate->commemorate
+commemmorating->commemorating
+commerical->commercial
+commerically->commercially
+commericial->commercial
+commericially->commercially
+commerorative->commemorative
+comming->coming
+comminication->communication
+commision->commission
+commisioned->commissioned
+commisioner->commissioner
+commisioning->commissioning
+commisions->commissions
+commited->committed
+commitee->committee
+commiting->committing
+committe->committee
+committment->commitment
+committments->commitments
+commmemorated->commemorated
+commongly->commonly
+commonweath->commonwealth
+commuications->communications
+commuinications->communications
+communciation->communication
+communiation->communication
+communites->communities
+compability->compatibility
+comparision->comparison
+comparisions->comparisons
+comparitive->comparative
+comparitively->comparatively
+compatabilities->compatibilities
+compatability->compatibility
+compatable->compatible
+compatablities->compatibilities
+compatablity->compatibility
+compatiable->compatible
+compatiblities->compatibilities
+compatiblity->compatibility
+compeitions->competitions
+compensantion->compensation
+competance->competence
+competant->competent
+competative->competitive
+competion->competition, completion
+competitiion->competition
+competive->competitive
+competiveness->competitiveness
+comphrehensive->comprehensive
+compitent->competent
+completedthe->completed the
+completelyl->completely
+completetion->completion
+complier->compiler
+componant->component
+comprable->comparable
+comprimise->compromise
+compulsary->compulsory
+compulsery->compulsory
+computarized->computerized
+concensus->consensus
+concider->consider
+concidered->considered
+concidering->considering
+conciders->considers
+concieted->conceited
+concieved->conceived
+concious->conscious
+conciously->consciously
+conciousness->consciousness
+condamned->condemned
+condemmed->condemned
+condidtion->condition
+condidtions->conditions
+conditionsof->conditions of
+conected->connected
+conection->connection
+conesencus->consensus
+confidental->confidential
+confidentally->confidentially
+confids->confides
+configureable->configurable
+confortable->comfortable
+congradulations->congratulations
+congresional->congressional
+conived->connived
+conjecutre->conjecture
+conjuction->conjunction
+Conneticut->Connecticut
+conotations->connotations
+conquerd->conquered
+conquerer->conqueror
+conquerers->conquerors
+conqured->conquered
+conscent->consent
+consciouness->consciousness
+consdider->consider
+consdidered->considered
+consdiered->considered
+consectutive->consecutive
+consenquently->consequently
+consentrate->concentrate
+consentrated->concentrated
+consentrates->concentrates
+consept->concept
+consequentually->consequently
+consequeseces->consequences
+consern->concern
+conserned->concerned
+conserning->concerning
+conservitive->conservative
+consiciousness->consciousness
+consicousness->consciousness
+considerd->considered
+consideres->considered
+consious->conscious
+consistant->consistent
+consistantly->consistently
+consituencies->constituencies
+consituency->constituency
+consituted->constituted
+consitution->constitution
+consitutional->constitutional
+consolodate->consolidate
+consolodated->consolidated
+consonent->consonant
+consonents->consonants
+consorcium->consortium
+conspiracys->conspiracies
+conspiriator->conspirator
+constaints->constraints
+constanly->constantly
+constarnation->consternation
+constatn->constant
+constinually->continually
+constituant->constituent
+constituants->constituents
+constituion->constitution
+constituional->constitutional
+consttruction->construction
+constuction->construction
+contstruction->construction
+consulant->consultant
+consumate->consummate
+consumated->consummated
+contaiminate->contaminate
+containes->contains
+contamporaries->contemporaries
+contamporary->contemporary
+contempoary->contemporary
+contemporaneus->contemporaneous
+contempory->contemporary
+contendor->contender
+contibute->contribute 
+contibuted->contributed 
+contibutes->contributes 
+contigent->contingent
+contined->continued
+continous->continuous
+continously->continuously
+continueing->continuing
+contravercial->controversial
+contraversy->controversy
+contributer->contributor
+contributers->contributors
+contritutions->contributions
+controled->controlled
+controling->controlling
+controll->control
+controlls->controls
+controvercial->controversial
+controvercy->controversy
+controveries->controversies
+controversal->controversial
+controversey->controversy
+controvertial->controversial
+controvery->controversy
+contruction->construction
+conveinent->convenient
+convenant->covenant
+convential->conventional
+convertables->convertibles
+convertion->conversion
+conviced->convinced
+convienient->convenient
+coordiantion->coordination
+coorperation->cooperation, corporation
+coorperations->corporations
+copmetitors->competitors
+coputer->computer
+copywrite->copyright
+coridal->cordial
+cornmitted->committed
+corosion->corrosion
+corparate->corporate
+corperations->corporations
+correcters->correctors
+correponding->corresponding
+correposding->corresponding
+correspondant->correspondent
+correspondants->correspondents
+corridoors->corridors
+corrispond->correspond
+corrispondant->correspondent
+corrispondants->correspondents
+corrisponded->corresponded
+corrisponding->corresponding
+corrisponds->corresponds
+costitution->constitution
+coucil->council
+coudl->could, cloud
+councellor->councillor, counselor, councilor
+councellors->councillors, counselors, councilors
+counries->countries
+countains->contains
+countires->countries
+countrie's->countries, countries', country's
+coururier->courier, couturier
+coverted->converted, covered, coveted
+cpoy->coy, copy
+creaeted->created
+creche->crèche 
+creedence->credence
+critereon->criterion
+criterias->criteria
+criticists->critics
+critising->criticising, criticizing
+critisising->criticising
+critisism->criticism
+critisisms->criticisms
+critisize->criticise, criticize
+critisized->criticised, criticized
+critisizes->criticises, criticizes
+critisizing->criticising, criticizing
+critized->criticized
+critizing->criticizing
+crockodiles->crocodiles
+crowm->crown
+crtical->critical
+crticised->criticised
+crucifiction->crucifixion
+crusies->cruises
+crystalisation->crystallisation
+culiminating->culminating
+cumulatative->cumulative
+curch->church
+curcuit->circuit
+currenly->currently
+curriculem->curriculum
+cxan->cyan
+cyclinder->cylinder
+dacquiri->daiquiri
+daed->dead
+dael->deal, dial, dahl
+dalmation->dalmatian
+damenor->demeanor
+dammage->damage
+Dardenelles->Dardanelles
+daugher->daughter
+debateable->debatable
+decendant->descendant
+decendants->descendants
+decendent->descendant
+decendents->descendants
+decideable->decidable
+decidely->decidedly
+decieved->deceived
+decison->decision
+decomissioned->decommissioned
+decomposit->decompose
+decomposited->decomposed
+decompositing->decomposing
+decomposits->decomposes
+decress->decrees
+decribe->describe
+decribed->described
+decribes->describes
+decribing->describing
+dectect->detect
+defendent->defendant
+defendents->defendants
+deffensively->defensively
+deffine->define
+deffined->defined
+definance->defiance
+definate->definite
+definately->definitely
+definatly->definitely
+definetly->definitely
+definining->defining
+definit->definite
+definitly->definitely
+definiton->definition
+defintion->definition
+degrate->degrade
+delagates->delegates
+delapidated->dilapidated
+delerious->delirious
+delevopment->development
+deliberatly->deliberately
+delusionally->delusively
+demenor->demeanor
+demographical->demographic
+demolision->demolition
+demorcracy->democracy
+demostration->demonstration
+denegrating->denigrating
+densly->densely
+deparment->department
+deparmental->departmental
+deparments->departments
+dependance->dependence
+dependancy->dependency
+dependant->dependent
+deram->dram, dream
+deriviated->derived
+derivitive->derivative
+derogitory->derogatory
+descendands->descendants
+descibed->described
+descision->decision
+descisions->decisions
+descriibes->describes
+descripters->descriptors
+descripton->description
+desctruction->destruction
+descuss->discuss
+desgined->designed
+deside->decide
+desigining->designing
+desinations->destinations
+desintegrated->disintegrated
+desintegration->disintegration
+desireable->desirable
+desitned->destined
+desktiop->desktop
+desorder->disorder
+desoriented->disoriented
+desparate->desperate, disparate
+despict->depict
+despiration->desperation
+dessicated->desiccated
+dessigned->designed
+destablized->destabilized
+destory->destroy
+detailled->detailed
+detatched->detached
+deteoriated->deteriorated
+deteriate->deteriorate
+deterioriating->deteriorating
+determinining->determining
+detremental->detrimental
+devasted->devastated
+develope->develop
+developement->development
+developped->developed
+develpment->development
+devels->delves
+devestated->devastated
+devestating->devastating
+devide->divide
+devided->divided
+devistating->devastating
+devolopement->development
+diablical->diabolical
+diamons->diamonds
+diaster->disaster
+dichtomy->dichotomy
+diconnects->disconnects
+dicover->discover
+dicovered->discovered
+dicovering->discovering
+dicovers->discovers
+dicovery->discovery
+dicussed->discussed
+didnt->didn't
+diea->idea, die
+dieing->dying, dyeing
+dieties->deities
+diety->deity
+diferent->different
+diferrent->different
+differentiatiations->differentiations
+differnt->different
+difficulity->difficulty
+diffrent->different
+dificulties->difficulties
+dificulty->difficulty
+dimenions->dimensions
+dimention->dimension
+dimentional->dimensional
+dimentions->dimensions
+dimesnional->dimensional
+diminuitive->diminutive
+dimunitive->diminutive
+diosese->diocese
+diphtong->diphthong
+diphtongs->diphthongs
+diplomancy->diplomacy
+dipthong->diphthong
+dipthongs->diphthongs
+dirived->derived
+disagreeed->disagreed
+disapeared->disappeared
+disapointing->disappointing
+disappearred->disappeared
+disaproval->disapproval
+disasterous->disastrous
+disatisfaction->dissatisfaction
+disatisfied->dissatisfied
+disatrous->disastrous
+discontentment->discontent
+discribe->describe
+discribed->described
+discribes->describes
+discribing->describing
+disctinction->distinction
+disctinctive->distinctive
+disemination->dissemination
+disenchanged->disenchanted
+disiplined->disciplined
+disobediance->disobedience
+disobediant->disobedient
+disolved->dissolved
+disover->discover
+dispair->despair
+disparingly->disparagingly
+dispence->dispense
+dispenced->dispensed
+dispencing->dispensing
+dispicable->despicable
+dispite->despite
+dispostion->disposition
+disproportiate->disproportionate
+disputandem->disputandum
+disricts->districts
+dissagreement->disagreement
+dissapear->disappear
+dissapearance->disappearance
+dissapeared->disappeared
+dissapearing->disappearing
+dissapears->disappears
+dissappear->disappear
+dissappears->disappears
+dissappointed->disappointed
+dissarray->disarray
+dissobediance->disobedience
+dissobediant->disobedient
+dissobedience->disobedience
+dissobedient->disobedient
+distiction->distinction
+distingish->distinguish
+distingished->distinguished
+distingishes->distinguishes
+distingishing->distinguishing
+distingquished->distinguished
+distrubution->distribution
+distruction->destruction
+distructive->destructive
+ditributed->distributed
+diversed->diverse, diverged
+divice->device
+divison->division
+divisons->divisions
+dum->dumb
+doccument->document
+doccumented->documented
+doccuments->documents
+docrines->doctrines
+doctines->doctrines
+documenatry->documentary
+doens->does
+doesnt->doesn't
+doign->doing
+dominaton->domination
+dominent->dominant
+dominiant->dominant
+donig->doing
+dosen't->doesn't
+doub->doubt, daub
+doulbe->double
+dowloads->downloads
+dramtic->dramatic
+draughtman->draughtsman
+Dravadian->Dravidian
+dreasm->dreams
+driectly->directly
+drnik->drink
+druming->drumming
+drummless->drumless
+dupicate->duplicate
+durig->during
+durring->during
+duting->during
+dyas->dryas
+eahc->each
+ealier->earlier
+earlies->earliest
+earnt->earned
+ecclectic->eclectic
+eceonomy->economy
+ecidious->deciduous
+eclispe->eclipse
+ecomonic->economic
+ect->etc
+eearly->early
+efel->evil
+effeciency->efficiency
+effecient->efficient
+effeciently->efficiently
+efficency->efficiency
+efficent->efficient
+efficently->efficiently
+efford->effort, afford
+effords->efforts, affords
+effulence->effluence
+eigth->eighth, eight
+eiter->either
+elction->election
+electic->eclectic, electric
+electon->election, electron
+electrial->electrical
+electricly->electrically
+electricty->electricity
+elementay->elementary
+eleminated->eliminated
+eleminating->eliminating
+eles->eels
+eletricity->electricity
+elicided->elicited
+eligable->eligible
+elimentary->elementary
+ellected->elected
+elphant->elephant
+embarass->embarrass
+embarassed->embarrassed
+embarassing->embarrassing
+embarassment->embarrassment
+embargos->embargoes
+embarras->embarrass
+embarrased->embarrassed
+embarrasing->embarrassing
+embarrasment->embarrassment
+embezelled->embezzled
+emblamatic->emblematic
+eminate->emanate
+eminated->emanated
+emision->emission
+emited->emitted
+emiting->emitting
+emition->emission, emotion
+emmediately->immediately
+emmigrated->emigrated, immigrated
+emminent->eminent, imminent
+emminently->eminently
+emmisaries->emissaries
+emmisarries->emissaries
+emmisarry->emissary
+emmisary->emissary
+emmision->emission
+emmisions->emissions
+emmited->emitted
+emmiting->emitting
+emmitted->emitted
+emmitting->emitting
+emnity->enmity
+emperical->empirical
+emphaised->emphasised
+emphsis->emphasis
+emphysyma->emphysema
+empirial->empirical, imperial
+emprisoned->imprisoned
+enameld->enameled
+enchancement->enhancement
+encouraing->encouraging
+encryptiion->encryption
+encylopedia->encyclopedia
+endevors->endeavors
+endevour->endeavour
+endig->ending
+endolithes->endoliths
+enduce->induce
+ened->need
+enflamed->inflamed
+enforceing->enforcing
+engagment->engagement
+engeneer->engineer
+engeneering->engineering
+engieneer->engineer
+engieneers->engineers
+enlargment->enlargement
+enlargments->enlargements
+Enlish->English, enlist
+enourmous->enormous
+enourmously->enormously
+ensconsed->ensconced
+entaglements->entanglements
+enteratinment->entertainment
+enthusiatic->enthusiastic
+entitity->entity
+entitlied->entitled
+entrepeneur->entrepreneur
+entrepeneurs->entrepreneurs
+enviorment->environment
+enviormental->environmental
+enviormentally->environmentally
+enviorments->environments
+enviornment->environment
+enviornmental->environmental
+enviornmentalist->environmentalist
+enviornmentally->environmentally
+enviornments->environments
+enviroment->environment
+enviromental->environmental
+enviromentalist->environmentalist
+enviromentally->environmentally
+enviroments->environments
+envolutionary->evolutionary
+envrionments->environments
+enxt->next
+epidsodes->episodes
+epsiode->episode
+equialent->equivalent
+equilibium->equilibrium
+equilibrum->equilibrium
+equiped->equipped
+equippment->equipment
+equitorial->equatorial
+equivelant->equivalent
+equivelent->equivalent
+equivilant->equivalent
+equivilent->equivalent
+equivlalent->equivalent
+erally->orally, really
+eratic->erratic
+eratically->erratically
+eraticly->erratically
+erested->arrested, erected
+errupted->erupted
+esential->essential
+esitmated->estimated
+esle->else
+especialy->especially
+essencial->essential
+essense->essence
+essentail->essential
+essentialy->essentially
+essentual->essential
+essesital->essential
+estabishes->establishes
+establising->establishing
+ethnocentricm->ethnocentrism
+ethose->those, ethos
+Europian->European
+Europians->Europeans
+Eurpean->European
+Eurpoean->European
+evenhtually->eventually
+eventally->eventually
+eventhough->even though
+eventially->eventually
+eventualy->eventually
+everthing->everything
+everytime->every time
+everyting->everything
+eveyr->every
+evidentally->evidently
+exagerate->exaggerate
+exagerated->exaggerated
+exagerates->exaggerates
+exagerating->exaggerating
+exagerrate->exaggerate
+exagerrated->exaggerated
+exagerrates->exaggerates
+exagerrating->exaggerating
+examinated->examined
+exampt->exempt
+exapansion->expansion
+excact->exact
+excange->exchange
+excecute->execute
+excecuted->executed
+excecutes->executes
+excecuting->executing
+excecution->execution
+excedded->exceeded
+excelent->excellent
+excell->excel
+excellance->excellence
+excellant->excellent
+excells->excels
+excercise->exercise
+exchanching->exchanging
+excisted->existed
+exculsivly->exclusively
+execising->exercising
+exection->execution
+exectued->executed
+exeedingly->exceedingly
+exelent->excellent
+exellent->excellent
+exemple->example
+exept->except
+exeptional->exceptional
+exerbate->exacerbate
+exerbated->exacerbated
+exerciese->exercises
+exerpt->excerpt
+exerpts->excerpts
+exersize->exercise
+exerternal->external
+exhalted->exalted
+exhibtion->exhibition
+exibition->exhibition
+exibitions->exhibitions
+exicting->exciting
+exinct->extinct
+existance->existence
+existant->existent
+existince->existence
+exliled->exiled
+exludes->excludes
+exmaple->example
+exonorate->exonerate
+exoskelaton->exoskeleton
+expalin->explain
+expatriot->expatriate
+expeced->expected
+expecially->especially
+expeditonary->expeditionary
+expeiments->experiments
+expell->expel
+expells->expels
+experiance->experience
+experianced->experienced
+expiditions->expeditions
+expierence->experience
+explaination->explanation
+explaning->explaining
+explictly->explicitly
+exploititive->exploitative
+explotation->exploitation
+expropiated->expropriated
+expropiation->expropriation
+exressed->expressed
+extemely->extremely
+extention->extension
+extentions->extensions
+extered->exerted
+extermist->extremist
+extint->extinct, extant
+extradiction->extradition
+extraterrestial->extraterrestrial
+extraterrestials->extraterrestrials
+extravagent->extravagant
+extrememly->extremely
+extremeophile->extremophile
+extremly->extremely
+extrordinarily->extraordinarily
+extrordinary->extraordinary
+eyar->year, eyas
+eyars->years, eyas
+eyasr->years, eyas
+faciliate->facilitate
+faciliated->facilitated
+faciliates->facilitates
+facilites->facilities
+facillitate->facilitate
+facinated->fascinated
+facist->fascist
+familes->families
+familliar->familiar
+famoust->famous
+fanatism->fanaticism
+Farenheit->Fahrenheit
+fatc->fact
+faught->fought
+favoutrable->favourable
+feasable->feasible
+Febuary->February
+Feburary->February
+fedreally->federally
+feromone->pheromone
+fertily->fertility
+fianite->finite
+fianlly->finally
+ficticious->fictitious
+fictious->fictitious
+fidn->find
+fiel->feel, field, file, phial
+fiels->feels, fields, files, phials
+fiercly->fiercely
+fightings->fighting
+filiament->filament
+fimilies->families
+finacial->financial
+finaly->finally
+financialy->financially
+firends->friends
+firts->flirts, first
+fisionable->fissionable
+flamable->flammable
+flawess->flawless
+fleed->fled, freed
+Flemmish->Flemish
+florescent->fluorescent
+flourescent->fluorescent
+flourine->fluorine
+fluorish->flourish
+flourishment->flourishing
+follwoing->following
+folowing->following
+fomed->formed
+fomr->from, form
+fonetic->phonetic
+fontrier->fontier
+foootball->football
+forbad->forbade
+forbiden->forbidden
+foreward->foreword
+forfiet->forfeit
+forhead->forehead
+foriegn->foreign
+Formalhaut->Fomalhaut
+formallize->formalize
+formallized->formalized
+formaly->formally, formerly
+formelly->formerly
+formidible->formidable
+formost->foremost
+forsaw->foresaw
+forseeable->foreseeable
+fortelling->foretelling
+forunner->forerunner
+foucs->focus
+foudn->found
+fougth->fought
+foundaries->foundries
+foundary->foundry
+Foundland->Newfoundland
+fourties->forties
+fourty->forty
+fouth->fourth
+foward->forward
+Fransiscan->Franciscan
+Fransiscans->Franciscans
+freind->friend
+freindly->friendly
+frequentily->frequently
+frome->from
+fromed->formed
+froniter->frontier
+fucntion->function
+fucntioning->functioning
+fufill->fulfill
+fufilled->fulfilled
+fulfiled->fulfilled
+fullfill->fulfill
+fullfilled->fulfilled
+fundametal->fundamental
+fundametals->fundamentals
+funguses->fungi
+funtion->function
+furuther->further
+futher->further
+futhermore->furthermore
+futhroc->futhark, futhorc
+gae->game, Gael, gale
+galatic->galactic
+Galations->Galatians
+gallaxies->galaxies
+galvinized->galvanized
+Gameboy->Game Boy
+ganerate->generate
+ganes->games
+ganster->gangster
+garantee->guarantee
+garanteed->guaranteed
+garantees->guarantees
+gardai->gardaí 
+garnison->garrison
+gauarana->guaraná
+gaurantee->guarantee
+gauranteed->guaranteed
+gaurantees->guarantees
+gaurd->guard, gourd
+gaurentee->guarantee
+gaurenteed->guaranteed
+gaurentees->guarantees
+geneological->genealogical
+geneologies->genealogies
+geneology->genealogy
+generaly->generally
+generatting->generating
+genialia->genitalia
+geographicial->geographical
+geometrician->geometer
+geometricians->geometers
+gerat->great
+Ghandi->Gandhi
+glight->flight
+gnawwed->gnawed
+godess->goddess
+godesses->goddesses
+Godounov->Godunov
+gogin->going, Gauguin
+goign->going
+gonig->going
+Gothenberg->Gothenburg
+Gottleib->Gottlieb
+gouvener->governor
+govement->government
+govenment->government
+govenrment->government
+goverance->governance
+goverment->government
+govermental->governmental
+governer->governor
+governmnet->government
+govorment->government
+govormental->governmental
+govornment->government
+gracefull->graceful
+graet->great
+grafitti->graffiti
+gramatically->grammatically
+grammaticaly->grammatically
+grammer->grammar
+grat->great
+gratuitious->gratuitous
+greatful->grateful
+greatfully->gratefully
+greif->grief
+gridles->griddles
+gropu->group
+grwo->grow
+Guaduloupe->Guadalupe, Guadeloupe
+Guadulupe->Guadalupe, Guadeloupe
+guage->gauge
+guarentee->guarantee
+guarenteed->guaranteed
+guarentees->guarantees
+Guatamala->Guatemala
+Guatamalan->Guatemalan
+guerrila->guerrilla
+guerrilas->guerrillas
+guidence->guidance
+Guilia->Giulia
+Guilio->Giulio
+Guiness->Guinness
+Guiseppe->Giuseppe
+gunanine->guanine
+gurantee->guarantee
+guranteed->guaranteed
+gurantees->guarantees
+guttaral->guttural
+gutteral->guttural
+habaeus->habeas
+habeus->habeas
+Habsbourg->Habsburg
+haemorrage->haemorrhage
+haev->have, heave
+halarious->hilarious
+Hallowean->Hallowe'en, Halloween
+halp->help
+hapen->happen
+hapened->happened
+hapening->happening
+happend->happened
+happended->happened
+happenned->happened
+harased->harassed
+harases->harasses
+harasment->harassment
+harasments->harassments
+harassement->harassment
+harras->harass
+harrased->harassed
+harrases->harasses
+harrasing->harassing
+harrasment->harassment
+harrasments->harassments
+harrassed->harassed
+harrasses->harassed
+harrassing->harassing
+harrassment->harassment
+harrassments->harassments
+hasnt->hasn't
+Hatian->Haitian
+haviest->heaviest
+headquarer->headquarter
+headquater->headquarter
+headquatered->headquartered
+headquaters->headquarters
+healthercare->healthcare
+heared->heard
+heathy->healthy
+Heidelburg->Heidelberg
+heigher->higher
+heirarchy->hierarchy
+heiroglyphics->hieroglyphics
+helment->helmet
+helpfull->helpful
+helpped->helped
+hemmorhage->hemorrhage
+herad->heard, Hera
+heridity->heredity
+heroe->hero
+heros->heroes
+hertiage->heritage
+hertzs->hertz
+hesistant->hesitant
+heterogenous->heterogeneous
+hieght->height
+hierachical->hierarchical
+hierachies->hierarchies
+hierachy->hierarchy
+hierarcical->hierarchical
+hierarcy->hierarchy
+hieroglph->hieroglyph
+hieroglphs->hieroglyphs
+higer->higher
+higest->highest
+higway->highway
+hillarious->hilarious
+himselv->himself
+hinderance->hindrance
+hinderence->hindrance
+hindrence->hindrance
+hipopotamus->hippopotamus
+hismelf->himself
+histocompatability->histocompatibility
+historicians->historians
+hitsingles->hit singles
+holf->hold
+holliday->holiday
+homestate->home state
+homogeneize->homogenize
+homogeneized->homogenized
+honory->honorary
+horrifing->horrifying
+hosited->hoisted
+hospitible->hospitable
+hounour->honour
+housr->hours, house
+howver->however
+hsitorians->historians
+hstory->history
+hten->then, hen, the
+htere->there, here
+htey->they
+htikn->think
+hting->thing
+htink->think
+htis->this
+humer->humor, humour
+humerous->humorous, humerus
+huminoid->humanoid
+humoural->humoral
+humurous->humorous
+husban->husband
+hvae->have
+hvaing->having
+hvea->have, heave
+hwihc->which
+hwile->while
+hwole->whole
+hydogen->hydrogen
+hydropile->hydrophile
+hydropilic->hydrophilic
+hydropobe->hydrophobe
+hydropobic->hydrophobic
+hygeine->hygiene
+hypocracy->hypocrisy
+hypocrasy->hypocrisy
+hypocricy->hypocrisy
+hypocrit->hypocrite
+hypocrits->hypocrites
+iconclastic->iconoclastic
+idaeidae->idea
+idaes->ideas
+idealogies->ideologies
+idealogy->ideology
+identicial->identical
+identifers->identifiers
+ideosyncratic->idiosyncratic
+idesa->ideas, ides
+idiosyncracy->idiosyncrasy
+Ihaca->Ithaca
+illegimacy->illegitimacy
+illegitmate->illegitimate
+illess->illness
+illiegal->illegal
+illution->illusion
+ilness->illness
+ilogical->illogical
+imagenary->imaginary
+imagin->imagine
+imaginery->imaginary, imagery
+imanent->eminent, imminent
+imcomplete->incomplete
+imediately->immediately
+imense->immense
+imigrant->emigrant, immigrant
+imigrated->emigrated, immigrated
+imigration->emigration, immigration
+iminent->eminent, imminent, immanent
+immediatley->immediately
+immediatly->immediately
+immidately->immediately
+immidiately->immediately
+immitate->imitate
+immitated->imitated
+immitating->imitating
+immitator->imitator
+immunosupressant->immunosuppressant
+impecabbly->impeccably
+impedence->impedance
+implamenting->implementing
+impliment->implement
+implimented->implemented
+imploys->employs
+importamt->important
+impressario->impresario
+imprioned->imprisoned
+imprisonned->imprisoned
+improvision->improvisation
+improvments->improvements
+inablility->inability
+inaccessable->inaccessible
+inadiquate->inadequate
+inadquate->inadequate
+inadvertant->inadvertent
+inadvertantly->inadvertently
+inagurated->inaugurated
+inaguration->inauguration
+inappropiate->inappropriate
+inaugures->inaugurates
+inbalance->imbalance
+inbalanced->imbalanced
+inbetween->between
+incarcirated->incarcerated
+incidentially->incidentally
+incidently->incidentally
+inclreased->increased
+includ->include
+includng->including
+incompatabilities->incompatibilities
+incompatability->incompatibility
+incompatable->incompatible
+incompatablities->incompatibilities
+incompatablity->incompatibility
+incompatiblities->incompatibilities
+incompatiblity->incompatibility
+incompetance->incompetence
+incompetant->incompetent
+incomptable->incompatible
+incomptetent->incompetent
+inconsistant->inconsistent
+incoroporated->incorporated
+incorperation->incorporation
+incorportaed->incorporated
+incorprates->incorporates
+incorruptable->incorruptible
+incramentally->incrementally
+increadible->incredible
+incredable->incredible
+inctroduce->introduce
+inctroduced->introduced
+incuding->including
+incunabla->incunabula
+indefinately->indefinitely
+indefineable->undefinable
+indefinitly->indefinitely
+indentical->identical
+indepedantly->independently
+indepedence->independence
+independance->independence
+independant->independent
+independantly->independently
+independece->independence
+independendet->independent
+indespensable->indispensable
+indespensible->indispensable
+indictement->indictment
+indigineous->indigenous
+indipendence->independence
+indipendent->independent
+indipendently->independently
+indispensible->indispensable
+indisputible->indisputable
+indisputibly->indisputably
+indite->indict
+individualy->individually
+indpendent->independent
+indpendently->independently
+indulgue->indulge
+indutrial->industrial
+indviduals->individuals
+inefficienty->inefficiently
+inevatible->inevitable
+inevitible->inevitable
+inevititably->inevitably
+infalability->infallibility
+infallable->infallible
+infectuous->infectious
+infered->inferred
+infilitrate->infiltrate
+infilitrated->infiltrated
+infilitration->infiltration
+infinit->infinite
+inflamation->inflammation
+influencial->influential
+influented->influenced
+infomation->information
+informtion->information
+infrantryman->infantryman
+infrigement->infringement
+ingenius->ingenious
+ingreediants->ingredients
+inhabitans->inhabitants
+inherantly->inherently
+inheritage->heritage, inheritance
+inheritence->inheritance
+inital->initial
+initally->initially
+initation->initiation
+initiaitive->initiative
+inlcuding->including
+inmigrant->immigrant
+inmigrants->immigrants
+innoculated->inoculated
+inocence->innocence
+inofficial->unofficial
+inot->into
+inpeach->impeach
+inpolite->impolite
+inprisonment->imprisonment
+inproving->improving
+insectiverous->insectivorous
+insensative->insensitive
+inseperable->inseparable
+insistance->insistence
+insitution->institution
+insitutions->institutions
+inspite->in spite, inspire
+instade->instead
+instatance->instance
+institue->institute
+instuction->instruction
+instuments->instruments
+instutionalized->institutionalized
+instutions->intuitions
+insurence->insurance
+intelectual->intellectual
+inteligence->intelligence
+inteligent->intelligent
+intenational->international
+intented->intended, indented
+intepretation->interpretation
+intepretator->interpretor
+interational->international
+interbread->interbreed, interbred
+interchangable->interchangeable
+interchangably->interchangeably
+intercontinetal->intercontinental
+intered->interred, interned
+interelated->interrelated
+interferance->interference
+interfereing->interfering
+intergrated->integrated
+intergration->integration
+interm->interim
+internation->international
+interpet->interpret
+interrim->interim
+interrugum->interregnum
+intertaining->entertaining
+interupt->interrupt
+intervines->intervenes
+intevene->intervene
+intial->initial
+intially->initially
+intrduced->introduced
+intrest->interest
+introdued->introduced
+intruduced->introduced
+intrument->instrument
+intrumental->instrumental
+intruments->instruments
+intrusted->entrusted
+intutive->intuitive
+intutively->intuitively
+inudstry->industry
+inumerable->enumerable, innumerable
+inventer->inventor
+invertibrates->invertebrates
+investingate->investigate
+involvment->involvement
+irelevent->irrelevant
+iresistable->irresistible
+iresistably->irresistibly
+iresistible->irresistible
+iresistibly->irresistibly
+iritable->irritable
+iritated->irritated
+ironicly->ironically
+irregardless->regardless
+irrelevent->irrelevant
+irreplacable->irreplaceable
+irresistable->irresistible
+irresistably->irresistibly
+isnt->isn't
+Israelies->Israelis
+issueing->issuing
+itnroduced->introduced
+iunior->junior
+iwll->will
+iwth->with
+Janurary->January
+Januray->January
+Japanes->Japanese
+jaques->jacques
+jeapardy->jeopardy
+jewllery->jewellery
+Johanine->Johannine
+jorunal->journal
+Jospeh->Joseph
+jouney->journey
+journied->journeyed
+journies->journeys
+jstu->just
+jsut->just
+Juadaism->Judaism
+Juadism->Judaism
+judical->judicial
+judisuary->judiciary
+juducial->judicial
+juristiction->jurisdiction
+juristictions->jurisdictions
+kindergarden->kindergarten
+klenex->kleenex
+knifes->knives
+knive->knife
+knowlege->knowledge
+knowlegeable->knowledgeable
+knwo->know
+knwos->knows
+konw->know
+konws->knows
+kwno->know
+labatory->lavatory, laboratory
+labled->labelled, labeled
+labratory->laboratory
+laguage->language
+laguages->languages
+larg->large
+largst->largest
+larrry->larry
+lastr->last
+lattitude->latitude
+launchs->launch, launches
+launhed->launched
+lavae->larvae
+layed->laid
+lazyness->laziness
+leage->league
+leanr->lean, learn, leaner
+leathal->lethal
+lefted->left
+legitamate->legitimate
+legitmate->legitimate
+leibnitz->leibniz
+lenght->length
+leran->learn
+lerans->learns
+leutenant->lieutenant
+levetate->levitate
+levetated->levitated
+levetates->levitates
+levetating->levitating
+levle->level
+liasion->liaison
+liason->liaison
+liasons->liaisons
+libary->library
+libell->libel
+libguistic->linguistic
+libguistics->linguistics
+libitarianisn->libertarianism
+lible->libel, liable
+lieing->lying
+liek->like
+liekd->liked
+liesure->leisure
+lieuenant->lieutenant
+lieved->lived
+liftime->lifetime
+lightyear->light year
+lightyears->light years
+likelyhood->likelihood
+linnaena->linnaean
+lippizaner->lipizzaner
+liquify->liquefy
+liscense->license, licence
+lisence->license, licence
+lisense->license, licence
+listners->listeners
+litature->literature
+literaly->literally
+literture->literature
+littel->little
+litterally->literally
+liuke->like
+livley->lively
+lmits->limits
+loev->love
+lonelyness->loneliness
+longitudonal->longitudinal
+lonley->lonely
+lonly->lonely, only
+loosing->losing
+lotharingen->lothringen
+lsat->last
+lukid->likud
+lveo->love
+lvoe->love
+Lybia->Libya
+maching->machine, marching, matching
+mackeral->mackerel
+magasine->magazine
+magincian->magician
+magnificient->magnificent
+magolia->magnolia
+mailny->mainly
+maintainance->maintenance
+maintainence->maintenance
+maintance->maintenance
+maintenence->maintenance
+maintinaing->maintaining
+maintioned->mentioned
+majoroty->majority
+maked->marked, made
+makse->makes
+Malcom->Malcolm
+maltesian->Maltese
+mamal->mammal
+mamalian->mammalian
+managable->manageable, manageably
+managment->management
+maneouvre->manoeuvre
+maneouvred->manoeuvred
+maneouvres->manoeuvres
+maneouvring->manoeuvring
+manisfestations->manifestations
+manoeuverability->maneuverability
+manouver->maneuver, manoeuvre
+manouverability->maneuverability, manoeuvrability, manoeuverability
+manouverable->maneuverable, manoeuvrable
+manouvers->maneuvers, manoeuvres
+mantained->maintained
+manuever->maneuver, manoeuvre
+manuevers->maneuvers, manoeuvres
+manufacturedd->manufactured
+manufature->manufacture
+manufatured->manufactured
+manufaturing->manufacturing
+manuver->maneuver
+mariage->marriage
+marjority->majority
+markes->marks
+marketting->marketing
+marmelade->marmalade
+marrage->marriage
+marraige->marriage
+marrtyred->martyred
+marryied->married
+Massachussets->Massachusetts
+Massachussetts->Massachusetts
+massmedia->mass media
+masterbation->masturbation
+mataphysical->metaphysical
+materalists->materialist
+mathamatics->mathematics
+mathematican->mathematician
+mathematicas->mathematics
+matheticians->mathematicians
+mathmatically->mathematically
+mathmatician->mathematician
+mathmaticians->mathematicians
+mccarthyst->mccarthyist
+mchanics->mechanics
+meaninng->meaning
+mear->wear, mere, mare
+mechandise->merchandise
+medacine->medicine
+medeival->medieval
+medevial->medieval
+mediciney->mediciny
+medievel->medieval
+mediterainnean->mediterranean
+Mediteranean->Mediterranean
+meerkrat->meerkat
+melieux->milieux
+membranaphone->membranophone
+memeber->member
+menally->mentally
+meranda->veranda, Miranda
+mercentile->mercantile
+messanger->messenger
+messenging->messaging
+metalic->metallic
+metalurgic->metallurgic
+metalurgical->metallurgical
+metalurgy->metallurgy
+metamorphysis->metamorphosis
+metaphoricial->metaphorical
+meterologist->meteorologist
+meterology->meteorology
+methaphor->metaphor
+methaphors->metaphors
+Michagan->Michigan
+micoscopy->microscopy
+midwifes->midwives
+mileau->milieu
+milennia->millennia
+milennium->millennium
+mileu->milieu
+miliary->military
+milion->million
+miliraty->military
+millenia->millennia
+millenial->millennial
+millenialism->millennialism
+millenium->millennium
+millepede->millipede
+millioniare->millionaire
+millitary->military
+millon->million
+miltary->military
+minature->miniature
+minerial->mineral
+miniscule->minuscule
+ministery->ministry
+minstries->ministries
+minstry->ministry
+minumum->minimum
+mirrorred->mirrored
+miscelaneous->miscellaneous
+miscellanious->miscellaneous
+miscellanous->miscellaneous
+mischeivous->mischievous
+mischevious->mischievous
+mischievious->mischievous
+misdameanor->misdemeanor
+misdameanors->misdemeanors
+misdemenor->misdemeanor
+misdemenors->misdemeanors
+misfourtunes->misfortunes
+misile->missile
+Misouri->Missouri
+mispell->misspell
+mispelled->misspelled
+mispelling->misspelling
+missen->mizzen
+Missisipi->Mississippi
+Missisippi->Mississippi
+missle->missile
+missonary->missionary
+misterious->mysterious
+mistery->mystery
+misteryous->mysterious
+mkae->make
+mkaes->makes
+mkaing->making
+mkea->make
+moderm->modem
+modle->model
+moent->moment
+moeny->money
+mohammedans->muslims
+moil->mohel
+moil->soil
+moleclues->molecules
+momento->memento
+monestaries->monasteries
+monestary->monastery, monetary
+monickers->monikers
+monolite->monolithic
+Monserrat->Montserrat
+montains->mountains
+montanous->mountainous
+Montnana->Montana
+monts->months
+montypic->monotypic
+moreso->more, more so
+morgage->mortgage
+Morisette->Morissette
+Morrisette->Morissette
+morroccan->moroccan
+morrocco->morocco
+morroco->morocco
+mortage->mortgage
+mosture->moisture
+motiviated->motivated
+mounth->month
+movei->movie
+movment->movement
+mroe->more
+mucuous->mucous
+muder->murder
+mudering->murdering
+muhammadan->muslim
+multicultralism->multiculturalism
+multipled->multiplied
+multiplers->multipliers
+munbers->numbers
+muncipalities->municipalities
+muncipality->municipality
+munnicipality->municipality
+muscels->mussels, muscles
+muscial->musical
+muscician->musician
+muscicians->musicians
+mutiliated->mutilated
+myraid->myriad
+mysef->myself
+mysogynist->misogynist
+mysogyny->misogyny
+mysterous->mysterious
+Mythraic->Mithraic
+naieve->naive
+Naploeon->Napoleon
+Napolean->Napoleon
+Napoleonian->Napoleonic
+naturaly->naturally
+naturely->naturally
+naturual->natural
+naturually->naturally
+Nazereth->Nazareth
+neccesarily->necessarily
+neccesary->necessary
+neccessarily->necessarily
+neccessary->necessary
+neccessities->necessities
+necesarily->necessarily
+necesary->necessary
+necessiate->necessitate
+neglible->negligible
+negligable->negligible
+negociate->negotiate
+negociation->negotiation
+negociations->negotiations
+negotation->negotiation
+neice->niece, nice
+neigborhood->neighborhood
+neigbour->neighbour, neighbor
+neigbourhood->neighbourhood
+neigbouring->neighbouring, neighboring
+neigbours->neighbours, neighbors
+neolitic->neolithic
+nessasarily->necessarily
+nessecary->necessary
+nestin->nesting
+neverthless->nevertheless
+newletters->newsletters
+Newyorker->New Yorker
+nickle->nickel
+nightfa;;->nightfall
+nightime->nighttime
+nineth->ninth
+ninteenth->nineteenth
+ninties->1990s
+ninty->ninety
+nkow->know
+nkwo->know
+nmae->name
+noncombatents->noncombatants
+nonsence->nonsense
+nontheless->nonetheless
+noone->no one
+norhern->northern
+northen->northern
+northereastern->northeastern
+notabley->notably
+noteable->notable
+noteably->notably
+noteriety->notoriety
+noth->north
+nothern->northern
+noticable->noticeable
+noticably->noticeably
+noticeing->noticing
+noticible->noticeable
+notwhithstanding->notwithstanding
+noveau->nouveau
+Novermber->November
+nowdays->nowadays
+nowe->now
+nto->not
+nucular->nuclear
+nuculear->nuclear
+nuisanse->nuisance
+Nullabour->Nullarbor
+numberous->numerous
+Nuremburg->Nuremberg
+nusance->nuisance
+nutritent->nutrient
+nutritents->nutrients
+nuturing->nurturing
+obediance->obedience
+obediant->obedient
+obession->obsession
+obssessed->obsessed
+obstacal->obstacle
+obstancles->obstacles
+obstruced->obstructed
+ocasion->occasion
+ocasional->occasional
+ocasionally->occasionally
+ocasionaly->occasionally
+ocasioned->occasioned
+ocasions->occasions
+ocassion->occasion
+ocassional->occasional
+ocassionally->occasionally
+ocassionaly->occasionally
+ocassioned->occasioned
+ocassions->occasions
+occaison->occasion
+occassion->occasion
+occassional->occasional
+occassionally->occasionally
+occassionaly->occasionally
+occassioned->occasioned
+occassions->occasions
+occationally->occasionally
+occour->occur
+occurance->occurrence
+occurances->occurrences
+occured->occurred
+occurence->occurrence
+occurences->occurrences
+occuring->occurring
+occurr->occur
+occurrance->occurrence
+occurrances->occurrences
+octohedra->octahedra
+octohedral->octahedral
+octohedron->octahedron
+ocuntries->countries
+ocuntry->country
+ocurr->occur
+ocurrance->occurrence
+ocurred->occurred
+ocurrence->occurrence
+offcers->officers
+offcially->officially
+offereings->offerings
+offical->official
+offically->officially
+officals->officials
+officaly->officially
+officialy->officially
+offred->offered
+oftenly->often
+oging->going, ogling
+ok->OK
+omision->omission
+omited->omitted
+omiting->omitting
+omlette->omelette
+ommision->omission
+ommited->omitted
+ommiting->omitting
+ommitted->omitted
+ommitting->omitting
+omniverous->omnivorous
+omniverously->omnivorously
+omre->more
+onot->note, not
+onyl->only
+openess->openness
+oponent->opponent
+oportunity->opportunity
+opose->oppose
+oposite->opposite
+oposition->opposition
+oppenly->openly
+oppinion->opinion
+opponant->opponent
+oppononent->opponent
+oppositition->opposition
+oppossed->opposed
+opprotunity->opportunity
+opression->oppression
+opressive->oppressive
+opthalmic->ophthalmic
+opthalmologist->ophthalmologist
+opthalmology->ophthalmology
+opthamologist->ophthalmologist
+optmizations->optimizations
+optomism->optimism
+orded->ordered
+organim->organism
+organistion->organisation
+organiztion->organization
+orgin->origin, organ
+orginal->original
+orginally->originally
+orginize->organise
+oridinarily->ordinarily
+origanaly->originally
+originall->original, originally
+originaly->originally
+originially->originally
+originnally->originally
+origional->original
+orignally->originally
+orignially->originally
+otehr->other
+oublisher->publisher
+ouevre->oeuvre
+oustanding->outstanding
+overshaddowed->overshadowed
+overthere->over there
+overwelming->overwhelming
+overwheliming->overwhelming
+owrk->work
+owudl->would
+oxigen->oxygen
+oximoron->oxymoron
+p0enis->penis
+paide->paid
+paitience->patience
+palce->place, palace
+paleolitic->paleolithic
+paliamentarian->parliamentarian
+Palistian->Palestinian
+Palistinian->Palestinian
+Palistinians->Palestinians
+pallete->palette
+pamflet->pamphlet
+pamplet->pamphlet
+pantomine->pantomime
+Papanicalou->Papanicolaou
+paralel->parallel
+paralell->parallel
+paralelly->parallelly
+paralely->parallelly
+parallely->parallelly
+paranthesis->parenthesis
+paraphenalia->paraphernalia
+parellels->parallels
+parituclar->particular
+parliment->parliament
+parrakeets->parakeets
+parralel->parallel
+parrallel->parallel
+parrallell->parallel
+parrallelly->parallelly
+parrallely->parallelly
+partialy->partially
+particually->particularly
+particualr->particular
+particuarly->particularly
+particularily->particularly
+particulary->particularly
+pary->party
+pased->passed
+pasengers->passengers
+passerbys->passersby
+pasttime->pastime
+pastural->pastoral
+paticular->particular
+pattented->patented
+pavillion->pavilion
+payed->paid
+pblisher->publisher
+pbulisher->publisher
+peacefuland->peaceful and
+peageant->pageant
+peculure->peculiar
+pedestrain->pedestrian
+peformed->performed
+peice->piece
+Peloponnes->Peloponnesus
+penatly->penalty
+penerator->penetrator
+penisula->peninsula
+penisular->peninsular
+penninsula->peninsula
+penninsular->peninsular
+pennisula->peninsula
+Pennyslvania->Pennsylvania
+pensinula->peninsula
+peom->poem
+peoms->poems
+peopel->people
+peotry->poetry
+perade->parade
+percepted->perceived
+percieve->perceive
+percieved->perceived
+perenially->perennially
+perfomance->performance
+perfomers->performers
+performence->performance
+performes->performed, performs
+perhasp->perhaps
+perheaps->perhaps
+perhpas->perhaps
+peripathetic->peripatetic
+peristent->persistent
+perjery->perjury
+perjorative->pejorative
+permanant->permanent
+permenant->permanent
+permenantly->permanently
+permissable->permissible
+perogative->prerogative
+peronal->personal
+perosnality->personality
+perphas->perhaps
+perpindicular->perpendicular
+perseverence->perseverance
+persistance->persistence
+persistant->persistent
+personel->personnel, personal
+personell->personnel
+personnell->personnel
+persuded->persuaded
+persue->pursue
+persued->pursued
+persuing->pursuing
+persuit->pursuit
+persuits->pursuits
+pertubation->perturbation
+pertubations->perturbations
+pessiary->pessary
+petetion->petition
+Pharoah->Pharaoh
+phenomenom->phenomenon
+phenomenonal->phenomenal
+phenomenonly->phenomenally
+phenomonenon->phenomenon
+phenomonon->phenomenon
+phenonmena->phenomena
+Philipines->Philippines
+philisopher->philosopher
+philisophical->philosophical
+philisophy->philosophy
+Phillipine->Philippine
+Phillipines->Philippines
+Phillippines->Philippines
+phillosophically->philosophically
+philospher->philosopher
+philosphies->philosophies
+philosphy->philosophy
+Phonecian->Phoenecian
+phongraph->phonograph
+phylosophical->philosophical
+physicaly->physically
+piblisher->publisher
+pich->pitch
+pilgrimmage->pilgrimage
+pilgrimmages->pilgrimages
+pinapple->pineapple
+pinnaple->pineapple
+pinoneered->pioneered
+plagarism->plagiarism
+planation->plantation
+planed->planned
+plantiff->plaintiff
+plateu->plateau
+plausable->plausible
+playright->playwright
+playwrite->playwright
+playwrites->playwrights
+pleasent->pleasant
+plebicite->plebiscite
+plesant->pleasant
+poenis->penis
+poeoples->peoples
+poety->poetry
+poisin->poison
+polical->political
+polinator->pollinator
+polinators->pollinators
+politican->politician
+politicans->politicians
+poltical->political
+polute->pollute
+poluted->polluted
+polutes->pollutes
+poluting->polluting
+polution->pollution
+polyphonyic->polyphonic
+polysaccaride->polysaccharide
+polysaccharid->polysaccharide
+pomegranite->pomegranate
+pomotion->promotion
+poportional->proportional
+popoulation->population
+popularaty->popularity
+populare->popular
+populer->popular
+portait->portrait
+portayed->portrayed
+portraing->portraying
+Portugese->Portuguese
+portuguease->portuguese
+portugues->Portuguese
+posess->possess
+posessed->possessed
+posesses->possesses
+posessing->possessing
+posession->possession
+posessions->possessions
+posion->poison
+positon->position, positron
+possable->possible
+possably->possibly
+posseses->possesses
+possesing->possessing
+possesion->possession
+possessess->possesses
+possibile->possible
+possibilty->possibility
+possiblility->possibility
+possiblilty->possibility
+possiblities->possibilities
+possiblity->possibility
+possition->position
+Postdam->Potsdam
+posthomous->posthumous
+postion->position
+postive->positive
+potatos->potatoes
+potrait->portrait
+potrayed->portrayed
+poulations->populations
+poverful->powerful
+poweful->powerful
+powerfull->powerful
+ppublisher->publisher
+practial->practical
+practially->practically
+practicaly->practically
+practicioner->practitioner
+practicioners->practitioners
+practicly->practically
+practioner->practitioner
+practioners->practitioners
+prairy->prairie
+prarie->prairie
+praries->prairies
+pratice->practice
+preample->preamble
+precedessor->predecessor
+preceed->precede
+preceeded->preceded
+preceeding->preceding
+preceeds->precedes
+precentage->percentage
+precice->precise
+precisly->precisely
+precurser->precursor
+predecesors->predecessors
+predicatble->predictable
+predicitons->predictions
+predomiantly->predominately
+prefered->preferred
+prefering->preferring
+preferrably->preferably
+pregancies->pregnancies
+preiod->period
+preliferation->proliferation
+premeire->premiere
+premeired->premiered
+premillenial->premillennial
+preminence->preeminence
+premission->permission
+Premonasterians->Premonstratensians
+preocupation->preoccupation
+prepair->prepare
+prepartion->preparation
+prepatory->preparatory
+preperation->preparation
+preperations->preparations
+preriod->period
+presedential->presidential
+presense->presence
+presidenital->presidential
+presidental->presidential
+presitgious->prestigious
+prespective->perspective
+prestigeous->prestigious
+prestigous->prestigious
+presumabely->presumably
+presumibly->presumably
+pretection->protection
+prevelant->prevalent
+preverse->perverse
+previvous->previous
+pricipal->principal
+priciple->principle
+priestood->priesthood
+primarly->primarily
+primative->primitive
+primatively->primitively
+primatives->primitives
+primordal->primordial
+principlaity->principality
+principaly->principality
+principial->principal
+principly->principally
+prinicipal->principal
+privalege->privilege
+privaleges->privileges
+priveledges->privileges
+privelege->privilege
+priveleged->privileged
+priveleges->privileges
+privelige->privilege
+priveliged->privileged
+priveliges->privileges
+privelleges->privileges
+privilage->privilege
+priviledge->privilege
+priviledges->privileges
+privledge->privilege
+privte->private
+probabilaty->probability
+probablistic->probabilistic
+probablly->probably
+probalibity->probability
+probaly->probably
+probelm->problem
+proccess->process
+proccessing->processing
+procede->proceed, precede
+proceded->proceeded, preceded
+procedes->proceeds, precedes
+procedger->procedure
+proceding->proceeding, preceding
+procedings->proceedings
+proceedure->procedure
+proces->process
+processer->processor
+proclaimation->proclamation
+proclamed->proclaimed
+proclaming->proclaiming
+proclomation->proclamation
+profesion->profusion, profession
+profesor->professor
+professer->professor
+proffesed->professed
+proffesion->profession
+proffesional->professional
+proffesor->professor
+profilic->prolific
+progessed->progressed
+programable->programmable
+progrom->pogrom, program
+progroms->pogroms, programs
+prohabition->prohibition
+prologomena->prolegomena
+prominance->prominence
+prominant->prominent
+prominantly->prominently
+prominately->prominently, predominately
+promiscous->promiscuous
+promotted->promoted
+pronomial->pronominal
+pronouced->pronounced
+pronounched->pronounced
+pronounciation->pronunciation
+proove->prove
+prooved->proved
+prophacy->prophecy
+propietary->proprietary
+propmted->prompted
+propoganda->propaganda
+propogate->propagate
+propogates->propagates
+propogation->propagation
+propostion->proposition
+propotions->proportions
+propper->proper
+propperly->properly
+proprietory->proprietary
+proseletyzing->proselytizing
+protaganist->protagonist
+protaganists->protagonists
+protocal->protocol
+protoganist->protagonist
+protrayed->portrayed
+protruberance->protuberance
+protruberances->protuberances
+prouncements->pronouncements
+provacative->provocative
+provded->provided
+provicial->provincial
+provinicial->provincial
+provisiosn->provision
+provisonal->provisional
+proximty->proximity
+pseudononymous->pseudonymous
+pseudonyn->pseudonym
+psuedo->pseudo
+psycology->psychology
+psyhic->psychic
+pubilsher->publisher
+pubisher->publisher
+publiaher->publisher
+publically->publicly
+publicaly->publicly
+publicher->publisher
+publihser->publisher
+publisehr->publisher
+publiser->publisher
+publisger->publisher
+publisheed->published
+publisherr->publisher
+publishher->publisher
+publishor->publisher
+publishre->publisher
+publissher->publisher
+publlisher->publisher
+publsiher->publisher
+publusher->publisher
+puchasing->purchasing
+Pucini->Puccini
+Puertorrican->Puerto Rican
+Puertorricans->Puerto Ricans
+pulisher->publisher
+pumkin->pumpkin
+puplisher->publisher
+puritannical->puritanical
+purposedly->purposely
+purpotedly->purportedly
+pursuade->persuade
+pursuaded->persuaded
+pursuades->persuades
+pususading->persuading
+puting->putting
+pwoer->power
+pyscic->psychic
+qtuie->quite, quiet
+quantaty->quantity
+quantitiy->quantity
+quarantaine->quarantine
+Queenland->Queensland
+questonable->questionable
+quicklyu->quickly
+quinessential->quintessential
+quitted->quit
+quizes->quizzes
+qutie->quite, quiet
+rabinnical->rabbinical
+racaus->raucous
+radiactive->radioactive
+radify->ratify
+raelly->really
+rarified->rarefied
+reaccurring->recurring
+reacing->reaching
+reacll->recall
+readmition->readmission
+realitvely->relatively
+realsitic->realistic
+realtions->relations
+realy->really
+realyl->really
+reasearch->research
+rebiulding->rebuilding
+rebllions->rebellions
+rebounce->rebound
+reccomend->recommend
+reccomendations->recommendations
+reccomended->recommended
+reccomending->recommending
+reccommend->recommend
+reccommended->recommended
+reccommending->recommending
+reccuring->recurring
+receeded->receded
+receeding->receding
+receivedfrom->received from
+recepient->recipient
+recepients->recipients
+receving->receiving
+rechargable->rechargeable
+reched->reached
+recide->reside
+recided->resided
+recident->resident
+recidents->residents
+reciding->residing
+reciepents->recipients
+reciept->receipt
+recieve->receive
+recieved->received
+reciever->receiver
+recievers->receivers
+recieves->receives
+recieving->receiving
+recipiant->recipient
+recipiants->recipients
+recived->received
+recivership->receivership
+recogise->recognise
+recogize->recognize
+recomend->recommend
+recomended->recommended
+recomending->recommending
+recomends->recommends
+recommedations->recommendations
+recompence->recompense
+reconaissance->reconnaissance
+reconcilation->reconciliation
+reconized->recognized
+reconnaisance->reconnaissance
+reconnaissence->reconnaissance
+recontructed->reconstructed
+recordproducer->record producer
+recquired->required
+recrational->recreational
+recrod->record
+recuiting->recruiting
+recuring->recurring
+recurrance->recurrence
+rediculous->ridiculous
+reedeming->redeeming
+reenforced->reinforced
+refect->reflect
+refedendum->referendum
+referal->referral
+referece->reference
+refereces->references
+refered->referred
+referemce->reference
+referemces->references
+referencs->references
+referenece->reference
+refereneced->referenced
+refereneces->references
+referiang->referring
+refering->referring
+refernce->reference
+refernce->references
+refernces->references
+referrence->reference
+referrences->references
+referrs->refers
+reffered->referred
+refference->reference
+reffering->referring
+refrence->reference
+refrences->references
+refrers->refers
+refridgeration->refrigeration
+refridgerator->refrigerator
+refromist->reformist
+refusla->refusal
+regardes->regards
+regluar->regular
+reguarly->regularly
+regulaion->regulation
+regulaotrs->regulators
+regularily->regularly
+rehersal->rehearsal
+reicarnation->reincarnation
+reigining->reigning
+reknown->renown
+reknowned->renowned
+rela->real
+relaly->really
+relatiopnship->relationship
+relativly->relatively
+relected->reelected
+releive->relieve
+releived->relieved
+releiver->reliever
+releses->releases
+relevence->relevance
+relevent->relevant
+reliablity->reliability
+relient->reliant
+religeous->religious
+religous->religious
+religously->religiously
+relinqushment->relinquishment
+relitavely->relatively
+relized->realised, realized
+relpacement->replacement
+remaing->remaining
+remeber->remember
+rememberable->memorable
+rememberance->remembrance
+remembrence->remembrance
+remenant->remnant
+remenicent->reminiscent
+reminent->remnant
+reminescent->reminiscent
+reminscent->reminiscent
+reminsicent->reminiscent
+rendevous->rendezvous
+rendezous->rendezvous
+renedered->rende
+renewl->renewal
+rennovate->renovate
+rennovated->renovated
+rennovating->renovating
+rennovation->renovation
+rentors->renters
+reoccurrence->recurrence
+reorganision->reorganisation
+repatition->repetition, repartition
+repblic->republic
+repblican->republican
+repblicans->republicans
+repblics->republics
+repectively->respectively
+repeition->repetition
+repentence->repentance
+repentent->repentant
+repeteadly->repeatedly
+repetion->repetition
+repid->rapid
+reponse->response
+reponsible->responsible
+reportadly->reportedly
+represantative->representative
+representive->representative
+representives->representatives
+reproducable->reproducible
+reprtoire->repertoire
+repsectively->respectively
+reptition->repetition
+repubic->republic
+repubican->republican
+repubicans->republicans
+repubics->republics
+republi->republic
+republian->republican
+republians->republicans
+republis->republics
+repulic->republic
+repulican->republican
+repulicans->republicans
+repulics->republics
+requirment->requirement
+requred->required
+resaurant->restaurant
+resembelance->resemblance
+resembes->resembles
+resemblence->resemblance
+resevoir->reservoir
+residental->residential
+resignement->resignment
+resistable->resistible
+resistence->resistance
+resistent->resistant
+respectivly->respectively
+responce->response
+responibilities->responsibilities
+responisble->responsible
+responnsibilty->responsibility
+responsability->responsibility
+responsibile->responsible
+responsibilites->responsibilities
+responsiblities->responsibilities
+responsiblity->responsibility
+ressemblance->resemblance
+ressemble->resemble
+ressembled->resembled
+ressemblence->resemblance
+ressembling->resembling
+resssurecting->resurrecting
+ressurect->resurrect
+ressurected->resurrected
+ressurection->resurrection
+ressurrection->resurrection
+restarant->restaurant
+restarants->restaurants
+restaraunt->restaurant
+restaraunteur->restaurateur
+restaraunteurs->restaurateurs
+restaraunts->restaurants
+restauranteurs->restaurateurs
+restauration->restoration
+restauraunt->restaurant
+resteraunt->restaurant
+resteraunts->restaurants
+resticted->restricted
+restraunt->restraint, restaurant
+resturant->restaurant
+resturants->restaurants
+resturaunt->restaurant
+resturaunts->restaurants
+resurecting->resurrecting
+retalitated->retaliated
+retalitation->retaliation
+retreive->retrieve
+returnd->returned
+revaluated->reevaluated
+reveiw->review
+reveral->reversal
+reversable->reversible
+revolutionar->revolutionary
+rewitten->rewritten
+rewriet->rewrite
+rference->reference
+rferences->references
+rhymme->rhyme
+rhythem->rhythm
+rhythim->rhythm
+rhytmic->rhythmic
+rigeur->rigueur, rigour, rigor
+rigourous->rigorous
+rininging->ringing
+rised->rose
+Rockerfeller->Rockefeller
+rococco->rococo
+rocord->record
+roomate->roommate
+rougly->roughly
+rucuperate->recuperate
+rudimentatry->rudimentary
+rulle->rule
+runing->running
+runnung->running
+russina->Russian
+Russion->Russian
+rwite->write
+rythem->rhythm
+rythim->rhythm
+rythm->rhythm
+rythmic->rhythmic
+rythyms->rhythms
+sacrafice->sacrifice
+sacreligious->sacrilegious
+sacrifical->sacrificial
+saftey->safety
+safty->safety
+salery->salary
+sanctionning->sanctioning
+sandwhich->sandwich
+Sanhedrim->Sanhedrin
+santioned->sanctioned
+sargant->sergeant
+sargeant->sergeant
+sasy->says, sassy
+satelite->satellite
+satelites->satellites
+Saterday->Saturday
+Saterdays->Saturdays
+satisfactority->satisfactorily
+satric->satiric
+satrical->satirical
+satrically->satirically
+sattelite->satellite
+sattelites->satellites
+saught->sought
+saveing->saving
+saxaphone->saxophone
+scaleable->scalable
+scandanavia->Scandinavia
+scaricity->scarcity
+scavanged->scavenged
+schedual->schedule
+scholarhip->scholarship
+scholarstic->scholastic, scholarly
+scientfic->scientific
+scientifc->scientific
+scientis->scientist
+scince->science
+scinece->science
+scirpt->script
+scoll->scroll
+screenwrighter->screenwriter
+scrutinity->scrutiny
+scuptures->sculptures
+seach->search
+seached->searched
+seaches->searches
+secceeded->seceded, succeeded
+seceed->succeed, secede
+seceeded->succeeded, seceded
+secratary->secretary
+secretery->secretary
+sedereal->sidereal
+seeked->sought
+segementation->segmentation
+seguoys->segues
+seige->siege
+seing->seeing
+seinor->senior
+seldomly->seldom
+senarios->scenarios
+sence->sense, since
+senstive->sensitive
+sensure->censure
+seperate->separate
+seperated->separated
+seperately->separately
+seperates->separates
+seperating->separating
+seperation->separation
+seperatism->separatism
+seperatist->separatist
+sepina->subpoena
+sepulchure->sepulchre, sepulcher
+sepulcre->sepulchre, sepulcher
+sergent->sergeant
+settelement->settlement
+settlment->settlement
+severeal->several
+severley->severely
+severly->severely
+sevice->service
+shadasloo->shadaloo
+shaddow->shadow
+shadoloo->shadaloo
+shamen->shaman, shamans
+sheat->sheath, sheet, cheat
+sheild->shield
+sherif->sheriff
+shineing->shining
+shiped->shipped
+shiping->shipping
+shopkeeepers->shopkeepers
+shorly->shortly
+shortwhile->short while
+shoudl->should
+shoudln->should, shouldn't
+shouldnt->shouldn't
+shreak->shriek
+shrinked->shrunk
+sicne->since
+sideral->sidereal
+sieze->seize, size
+siezed->seized, sized
+siezing->seizing, sizing
+siezure->seizure
+siezures->seizures
+siginificant->significant
+signficant->significant
+signficiant->significant
+signfies->signifies
+signifantly->significantly
+significently->significantly
+signifigant->significant
+signifigantly->significantly
+signitories->signatories
+signitory->signatory
+similarily->similarly
+similiar->similar
+similiarity->similarity
+similiarly->similarly
+simmilar->similar
+simpley->simply
+simplier->simpler
+simultanous->simultaneous
+simultanously->simultaneously
+sincerley->sincerely
+singsog->singsong
+sinse->sines, since
+Sionist->Zionist
+Sionists->Zionists
+Sixtin->Sistine
+Skagerak->Skagerrak
+skateing->skating
+slaugterhouses->slaughterhouses
+slighly->slightly
+slippy->slippery
+slowy->slowly
+smae->same
+smealting->smelting
+smoe->some
+sneeks->sneaks
+snese->sneeze
+socalism->socialism
+socities->societies
+soem->some
+sofware->software
+sohw->show
+soilders->soldiers
+solatary->solitary
+soley->solely
+soliders->soldiers
+soliliquy->soliloquy
+soluable->soluble
+somene->someone
+somtimes->sometimes
+somwhere->somewhere
+sophicated->sophisticated
+sophmore->sophomore
+sorceror->sorcerer
+sorrounding->surrounding
+sotry->story
+sotyr->satyr, story
+soudn->sound
+soudns->sounds
+sould->could, should, sold, soul
+sountrack->soundtrack
+sourth->south
+sourthern->southern
+souvenier->souvenir
+souveniers->souvenirs
+soveits->soviets
+sovereignity->sovereignty
+soverign->sovereign
+soverignity->sovereignty
+soverignty->sovereignty
+spainish->Spanish
+speach->speech
+specfic->specific
+speciallized->specialised, specialized
+specif->specific, specify
+specifiying->specifying
+speciman->specimen
+spectauclar->spectacular
+spectaulars->spectaculars
+spects->aspects, expects
+spectum->spectrum
+speices->species
+spendour->splendour
+spermatozoan->spermatozoon
+spoace->space
+sponser->sponsor
+sponsered->sponsored
+spontanous->spontaneous
+sponzored->sponsored
+spoonfulls->spoonfuls
+sppeches->speeches
+spreaded->spread
+sprech->speech
+spred->spread
+spriritual->spiritual
+spritual->spiritual
+sqaure->square
+stablility->stability
+stainlees->stainless
+staion->station
+standars->standards
+stange->strange
+startegic->strategic
+startegies->strategies
+startegy->strategy
+stateman->statesman
+statememts->statements
+statment->statement
+steriods->steroids
+sterotypes->stereotypes
+stilus->stylus
+stingent->stringent
+stiring->stirring
+stirrs->stirs
+stlye->style
+stomache->stomach
+stong->strong
+stopry->story
+storeis->stories
+storise->stories
+stornegst->strongest
+stoyr->story
+stpo->stop
+stradegies->strategies
+stradegy->strategy
+strat->start, strata
+stratagically->strategically
+streemlining->streamlining
+stregth->strength
+strenghen->strengthen
+strenghened->strengthened
+strenghening->strengthening
+strenght->strength
+strenghten->strengthen
+strenghtened->strengthened
+strenghtening->strengthening
+strengtened->strengthened
+strenous->strenuous
+strictist->strictest
+strikely->strikingly
+strnad->strand
+stroy->story, destroy
+structual->structural
+stubborness->stubbornness
+stucture->structure
+stuctured->structured
+studdy->study
+studing->studying
+stuggling->struggling
+sturcture->structure
+subcatagories->subcategories
+subcatagory->subcategory
+subconsiously->subconsciously
+subjudgation->subjugation
+submachne->submachine
+subpecies->subspecies
+subsidary->subsidiary
+subsiduary->subsidiary
+subsquent->subsequent
+subsquently->subsequently
+substace->substance
+substancial->substantial
+substatial->substantial
+substituded->substituted
+substract->subtract
+substracted->subtracted
+substracting->subtracting
+substraction->subtraction
+substracts->subtracts
+subtances->substances
+subterranian->subterranean
+suburburban->suburban
+succceeded->succeeded
+succcesses->successes
+succedded->succeeded
+succeded->succeeded
+succeds->succeeds
+succesful->successful
+succesfully->successfully
+succesfuly->successfully
+succesion->succession
+succesive->successive
+successfull->successful
+successully->successfully
+succsess->success
+succsessfull->successful
+suceed->succeed
+suceeded->succeeded
+suceeding->succeeding
+suceeds->succeeds
+sucesful->successful
+sucesfully->successfully
+sucesfuly->successfully
+sucesion->succession
+sucess->success
+sucesses->successes
+sucessful->successful
+sucessfull->successful
+sucessfully->successfully
+sucessfuly->successfully
+sucession->succession
+sucessive->successive
+sucessor->successor
+sucessot->successor
+sucide->suicide
+sucidial->suicidal
+sufferage->suffrage
+sufferred->suffered
+sufferring->suffering
+sufficent->sufficient
+sufficently->sufficiently
+sumary->summary
+sunglases->sunglasses
+suop->soup
+superceeded->superseded
+superintendant->superintendent
+suphisticated->sophisticated
+suplimented->supplemented
+supose->suppose
+suposed->supposed
+suposedly->supposedly
+suposes->supposes
+suposing->supposing
+supplamented->supplemented
+suppliementing->supplementing
+suppoed->supposed
+supposingly->supposedly
+suppy->supply
+supress->suppress
+supressed->suppressed
+supresses->suppresses
+supressing->suppressing
+suprise->surprise
+suprised->surprised
+suprising->surprising
+suprisingly->surprisingly
+suprize->surprise
+suprized->surprised
+suprizing->surprising
+suprizingly->surprisingly
+surfce->surface
+surley->surly, surely
+suround->surround
+surounded->surrounded
+surounding->surrounding
+suroundings->surroundings
+surounds->surrounds
+surplanted->supplanted
+surpress->suppress
+surpressed->suppressed
+surprize->surprise
+surprized->surprised
+surprizing->surprising
+surprizingly->surprisingly
+surrended->surrounded, surrendered
+surrepetitious->surreptitious
+surrepetitiously->surreptitiously
+surreptious->surreptitious
+surreptiously->surreptitiously
+surronded->surrounded
+surrouded->surrounded
+surrouding->surrounding
+surrundering->surrendering
+surveilence->surveillance
+surveill->surveil
+surveyer->surveyor
+surviver->survivor
+survivers->survivors
+survivied->survived
+suseptable->susceptible
+suseptible->susceptible
+suspention->suspension
+swaer->swear
+swaers->swears
+swepth->swept
+swiming->swimming
+syas->says
+symetrical->symmetrical
+symetrically->symmetrically
+symetry->symmetry
+symettric->symmetric
+symmetral->symmetric
+symmetricaly->symmetrically
+synagouge->synagogue
+syncronization->synchronization
+synonomous->synonymous
+synonymns->synonyms
+synphony->symphony
+syphyllis->syphilis
+sypmtoms->symptoms
+syrap->syrup
+sysmatically->systematically
+sytem->system
+sytle->style
+tabacco->tobacco
+tahn->than
+taht->that
+talekd->talked
+targetted->targeted
+targetting->targeting
+tast->taste
+tath->that
+tattooes->tattoos
+taxanomic->taxonomic
+taxanomy->taxonomy
+teached->taught
+techician->technician
+techicians->technicians
+techiniques->techniques
+technitian->technician
+technnology->technology
+technolgy->technology
+teh->the
+tehy->they
+telelevision->television
+televsion->television
+telphony->telephony
+temerature->temperature
+tempalte->template
+tempaltes->templates
+temparate->temperate
+temperarily->temporarily
+temperment->temperament
+tempertaure->temperature
+temperture->temperature
+temprary->temporary
+tenacle->tentacle
+tenacles->tentacles
+tendacy->tendency
+tendancies->tendencies
+tendancy->tendency
+tennisplayer->tennis player
+tepmorarily->temporarily
+terrestial->terrestrial
+terriories->territories
+terriory->territory
+territorist->terrorist
+territoy->territory
+terroist->terrorist
+testiclular->testicular
+tghe->the
+thast->that, that's
+theather->theater
+theese->these
+theif->thief
+theives->thieves
+themselfs->themselves
+themslves->themselves
+ther->there, their, the
+therafter->thereafter
+therby->thereby
+theri->their
+theyre->they're
+thgat->that
+thge->the
+thier->their
+thign->thing
+thigns->things
+thigsn->things
+thikn->think
+thikning->thinking, thickening
+thikns->thinks
+thiunk->think
+thn->then
+thna->than
+thne->then
+thnig->thing
+thnigs->things
+thoughout->throughout
+threatend->threatened
+threatning->threatening
+threee->three
+threshhold->threshold
+thrid->third
+throrough->thorough
+throughly->thoroughly
+throught->thought, through, throughout
+througout->throughout
+thru->through
+thsi->this
+thsoe->those
+thta->that
+thyat->that
+tiem->time, Tim
+tihkn->think
+tihs->this
+timne->time
+tiome->time, tome
+tje->the
+tjhe->the
+tjpanishad->upanishad
+tkae->take
+tkaes->takes
+tkaing->taking
+tlaking->talking
+tobbaco->tobacco
+todays->today's
+todya->today
+toghether->together
+toke->took
+tolerence->tolerance
+Tolkein->Tolkien
+tomatos->tomatoes
+tommorow->tomorrow
+tommorrow->tomorrow
+tongiht->tonight
+toriodal->toroidal
+tormenters->tormentors
+tornadoe->tornado
+torpeados->torpedoes
+torpedos->torpedoes
+tothe->to the
+toubles->troubles
+tounge->tongue
+tourch->torch, touch
+towords->towards
+towrad->toward
+tradionally->traditionally
+traditionaly->traditionally
+traditionnal->traditional
+traditition->tradition
+tradtionally->traditionally
+trafficed->trafficked
+trafficing->trafficking
+trafic->traffic
+trancendent->transcendent
+trancending->transcending
+tranform->transform
+tranformed->transformed
+transcendance->transcendence
+transcendant->transcendent
+transcendentational->transcendental
+transcripting->transcribing, transcription
+transending->transcending
+transesxuals->transsexuals
+transfered->transferred
+transfering->transferring
+transformaton->transformation
+transistion->transition
+translater->translator
+translaters->translators
+transmissable->transmissible
+transporation->transportation
+tremelo->tremolo
+tremelos->tremolos
+triguered->triggered
+triology->trilogy
+troling->trolling
+troup->troupe
+troups->troupes, troops
+truely->truly
+trustworthyness->trustworthiness
+turnk->turnkey, trunk
+Tuscon->Tucson
+tust->trust
+twelth->twelfth
+twon->town
+twpo->two
+tyhat->that
+tyhe->they
+typcial->typical
+typicaly->typically
+tyranies->tyrannies
+tyrany->tyranny
+tyrranies->tyrannies
+tyrrany->tyranny
+ubiquitious->ubiquitous
+ublisher->publisher
+uise->use
+Ukranian->Ukrainian
+ultimely->ultimately
+unacompanied->unaccompanied
+unahppy->unhappy
+unanymous->unanimous
+unathorised->unauthorised
+unavailible->unavailable
+unballance->unbalance
+unbeknowst->unbeknownst
+unbeleivable->unbelievable
+uncertainity->uncertainty
+unchallengable->unchallengeable
+unchangable->unchangeable
+uncompetive->uncompetitive
+unconcious->unconscious
+unconciousness->unconsciousness
+unconfortability->discomfort
+uncontitutional->unconstitutional
+unconvential->unconventional
+undecideable->undecidable
+understoon->understood
+undesireable->undesirable
+undetecable->undetectable
+undoubtely->undoubtedly
+undreground->underground
+uneccesary->unnecessary
+unecessary->unnecessary
+unequalities->inequalities
+unforetunately->unfortunately
+unforgetable->unforgettable
+unforgiveable->unforgivable
+unfortunatley->unfortunately
+unfortunatly->unfortunately
+unfourtunately->unfortunately
+unihabited->uninhabited
+unilateraly->unilaterally
+unilatreal->unilateral
+unilatreally->unilaterally
+uninterruped->uninterrupted
+uninterupted->uninterrupted
+UnitesStates->UnitedStates
+univeral->universal
+univeristies->universities
+univeristy->university
+univerity->university
+universtiy->university
+univesities->universities
+univesity->university
+unkown->unknown
+unlikey->unlikely
+unmanouverable->unmaneuverable, unmanoeuvrable
+unmistakeably->unmistakably
+unneccesarily->unnecessarily
+unneccesary->unnecessary
+unneccessarily->unnecessarily
+unneccessary->unnecessary
+unnecesarily->unnecessarily
+unnecesary->unnecessary
+unoffical->unofficial
+unoperational->nonoperational
+unoticeable->unnoticeable
+unplease->displease
+unplesant->unpleasant
+unprecendented->unprecedented
+unprecidented->unprecedented
+unrepentent->unrepentant
+unrepetant->unrepentant
+unrepetent->unrepentant
+unsed->used, unused, unsaid
+unsubstanciated->unsubstantiated
+unsuccesful->unsuccessful
+unsuccesfully->unsuccessfully
+unsuccessfull->unsuccessful
+unsucesful->unsuccessful
+unsucesfuly->unsuccessfully
+unsucessful->unsuccessful
+unsucessfull->unsuccessful
+unsucessfully->unsuccessfully
+unsuprised->unsurprised
+unsuprising->unsurprising
+unsuprisingly->unsurprisingly
+unsuprized->unsurprised
+unsuprizing->unsurprising
+unsuprizingly->unsurprisingly
+unsurprized->unsurprised
+unsurprizing->unsurprising
+unsurprizingly->unsurprisingly
+untill->until
+untranslateable->untranslatable
+unuseable->unusable
+unusuable->unusable
+unviersity->university
+unwarrented->unwarranted
+unweildly->unwieldy
+unwieldly->unwieldy
+upcomming->upcoming
+upgradded->upgraded
+upto->up to
+usally->usually
+useage->usage
+usefull->useful
+usefuly->usefully
+useing->using
+usualy->usually
+ususally->usually
+vaccum->vacuum
+vaccume->vacuum
+vacinity->vicinity
+vaguaries->vagaries
+vaieties->varieties
+vailidty->validity
+valetta->valletta
+valuble->valuable
+valueable->valuable
+varations->variations
+varient->variant
+variey->variety
+varing->varying
+varities->varieties
+varity->variety
+vasall->vassal
+vasalls->vassals
+vegatarian->vegetarian
+vegitable->vegetable
+vegitables->vegetables
+vegtable->vegetable
+vehicule->vehicle
+vell->well
+venemous->venomous
+vengance->vengeance
+vengence->vengeance
+verfication->verification
+verison->version
+verisons->versions
+vermillion->vermilion
+versitilaty->versatility
+versitlity->versatility
+vetween->between
+veyr->very
+vigeur->vigueur, vigour, vigor
+vigilence->vigilance
+vigourous->vigorous
+villian->villain
+villification->vilification
+villify->vilify
+villin->villi, villain, villein
+vincinity->vicinity
+violentce->violence
+virtualy->virtually
+virutal->virtual
+virutally->virtually
+visable->visible
+visably->visibly
+visting->visiting
+vistors->visitors
+vitories->victories
+volcanoe->volcano
+voleyball->volleyball
+volontary->voluntary
+volonteer->volunteer
+volonteered->volunteered
+volonteering->volunteering
+volonteers->volunteers
+volounteer->volunteer
+volounteered->volunteered
+volounteering->volunteering
+volounteers->volunteers
+volumne->volume
+vreity->variety
+vrey->very
+vriety->variety
+vulnerablility->vulnerability
+vyer->very
+vyre->very
+waht->what
+wanna->want to
+warantee->warranty
+wardobe->wardrobe
+warrent->warrant
+warrriors->warriors
+wasnt->wasn't
+wass->was
+watn->want
+wayword->wayward
+weaponary->weaponry
+weas->was
+wehn->when
+weild->wield, wild
+weilded->wielded
+wendsay->Wednesday
+wensday->Wednesday
+wereabouts->whereabouts
+whant->want
+whants->wants
+whcih->which
+wheras->whereas
+wherease->whereas
+whereever->wherever
+whic->which
+whihc->which
+whith->with
+whlch->which
+whn->when
+wholey->wholly
+wholy->wholly, holy
+whta->what
+whther->whether
+wich->which, witch
+widesread->widespread
+wief->wife
+wierd->weird
+wiew->view
+wih->with
+wiht->with
+wille->will
+willk->will
+willingless->willingness
+wirting->writing
+withdrawl->withdrawal, withdraw
+witheld->withheld
+withh->with
+withing->within
+withold->withhold
+witht->with
+witn->with
+wiull->will
+wnat->want
+wnated->wanted
+wnats->wants
+wohle->whole
+wokr->work
+wokring->working
+wonderfull->wonderful
+wordlwide->worldwide
+workststion->workstation
+worls->world
+worstened->worsened
+woudl->would
+wresters->wrestlers
+wriet->write
+writen->written
+wroet->wrote
+wrok->work
+wroking->working
+wtih->with
+wupport->support
+xenophoby->xenophobia
+yaching->yachting
+yaer->year
+yaerly->yearly
+yaers->years
+yatch->yacht
+yearm->year
+yeasr->years
+yeild->yield
+yeilding->yielding
+Yementite->Yemenite, Yemeni
+yera->year
+yrea->year
+yeras->years
+yersa->years
+yotube->youtube
+youseff->yousef
+youself->yourself
+ytou->you
+yuo->you
+zeebra->zebra"
+
+       def self.dictionary
+               setup unless defined? @@dictionary
+               @@dictionary
+       end
+
+       def self.misspelling(w)
+               setup unless defined? @@dictionary
+               @@dictionary[w]
+       end
+
+       private
+
+       def self.setup
+               @@dictionary={}
+               @@t.split("\n").map {|x| y=x.split("->"); [y[1],y[0]] }.map do |words,misspelling|
+                       words.split(',').each {|w| w.strip!; @@dictionary[w] = misspelling }
+               end
+       end
+end
+
+
diff --git a/country-codes.txt b/country-codes.txt
new file mode 100644 (file)
index 0000000..736eb46
--- /dev/null
@@ -0,0 +1,254 @@
+AFGHANISTAN,AF,AFG,APNIC\r
+ALBANIA,AL,ALB,RIPE\r
+ALGERIA,DZ,DZA,AFRINIC\r
+AMERICAN SAMOA,AS,ASM,APNIC\r
+ANDORRA,AD,AND,RIPE\r
+ANGOLA,AO,AGO,AFRINIC\r
+ANGUILLA,AI,AIA,ARIN\r
+ANTARCTICA,AQ,ATA,ARIN\r
+ANTIGUA AND BARBUDA,AG,ATG,ARIN\r
+ARGENTINA,AR,ARG,LACNIC\r
+ARMENIA,AM,ARM,RIPE\r
+ARUBA,AW,ABW,LACNIC\r
+ASCENSION ISLAND,AC,AC-,RIPE\r
+AUSTRALIA,AU,AUS,APNIC\r
+AUSTRIA,AT,AUT,RIPE\r
+AZERBAIJAN,AZ,AZE,RIPE\r
+BAHAMAS,BS,BHS,ARIN\r
+BAHRAIN,BH,BHR,RIPE\r
+BANGLADESH,BD,BGD,APNIC\r
+BARBADOS,BB,BRB,ARIN\r
+BELARUS,BY,BLR,RIPE\r
+BELGIUM,BE,BEL,RIPE\r
+BELIZE,BZ,BLZ,LACNIC\r
+BENIN,BJ,BEN,AFRINIC\r
+BERMUDA,BM,BMU,ARIN\r
+BHUTAN,BT,BTN,APNIC\r
+BOLIVIA,BO,BOL,LACNIC\r
+BOSNIA AND HERZEGOWINA,BA,BIH,RIPE\r
+BOTSWANA,BW,BWA,AFRINIC\r
+BOUVET ISLAND,BV,BVT,ARIN\r
+BRAZIL,BR,BRA,LACNIC\r
+BRITISH INDIAN OCEAN TERRITORY,IO,IOT,APNIC\r
+BRUNEI DARUSSALAM,BN,BRN,APNIC\r
+BULGARIA,BG,BGR,RIPE\r
+BURKINA FASO,BF,BFA,AFRINIC\r
+BURUNDI,BI,BDI,AFRINIC\r
+CAMBODIA,KH,KHM,APNIC\r
+CAMEROON,CM,CMR,AFRINIC\r
+CANADA,CA,CAN,ARIN\r
+CAPE VERDE,CV,CPV,AFRINIC\r
+CAYMAN ISLANDS,KY,CYM,ARIN\r
+CENTRAL AFRICAN REPUBLIC,CF,CAF,AFRINIC\r
+CHAD,TD,TCD,AFRINIC\r
+CHILE,CL,CHL,LACNIC\r
+CHINA,CN,CHN,APNIC\r
+CHRISTMAS ISLAND,CX,CXR,APNIC\r
+COCOS (KEELING) ISLANDS,CC,CCK,APNIC\r
+COLOMBIA,CO,COL,LACNIC\r
+COMOROS,KM,COM,AFRINIC\r
+CONGO THE DEMOCRATIC REPUBLIC OF THE,CD,COD,AFRINIC\r
+CONGO,CG,COG,AFRINIC\r
+COOK ISLANDS,CK,COK,APNIC\r
+COSTA RICA,CR,CRI,LACNIC\r
+COTE D'IVOIRE,CI,CIV,AFRINIC\r
+CROATIA (local name: Hrvatska),HR,HRV,RIPE\r
+CUBA,CU,CUB,LACNIC\r
+CYPRUS,CY,CYP,RIPE\r
+CZECH REPUBLIC,CZ,CZE,RIPE\r
+DENMARK,DK,DNK,RIPE\r
+DJIBOUTI,DJ,DJI,AFRINIC\r
+DOMINICA,DM,DMA,ARIN\r
+DOMINICAN REPUBLIC,DO,DOM,LACNIC\r
+EAST TIMOR,TP,TMP,APNIC\r
+ECUADOR,EC,ECU,LACNIC\r
+EGYPT,EG,EGY,AFRINIC\r
+EL SALVADOR,SV,SLV,LACNIC\r
+EQUATORIAL GUINEA,GQ,GNQ,AFRINIC\r
+ERITREA,ER,ERI,AFRINIC\r
+ESTONIA,EE,EST,RIPE\r
+ETHIOPIA,ET,ETH,AFRINIC\r
+EUROPEAN UNION,EU,EU,RIPE\r
+FALKLAND ISLANDS (MALVINAS),FK,FLK,LACNIC\r
+FAROE ISLANDS,FO,FRO,RIPE\r
+FIJI,FJ,FJI,APNIC\r
+FINLAND,FI,FIN,RIPE\r
+FRANCE METRO,FX,FRA,RIPE\r
+FRANCE,FR,FRA,RIPE\r
+FRENCH GUIANA,GF,GUF,LACNIC\r
+FRENCH POLYNESIA,PF,PYF,APNIC\r
+FRENCH SOUTHERN TERRITORIES,TF,ATF,APNIC\r
+GABON,GA,GAB,AFRINIC\r
+GAMBIA,GM,GMB,AFRINIC\r
+GEORGIA,GE,GEO,RIPE\r
+GERMANY,DE,DEU,RIPE\r
+GHANA,GH,GHA,AFRINIC\r
+GIBRALTAR,GI,GIB,RIPE\r
+GREECE,GR,GRC,RIPE\r
+GREENLAND,GL,GRL,RIPE\r
+GRENADA,GD,GRD,ARIN\r
+GUADELOUPE,GP,GLP,ARIN\r
+GUAM,GU,GUM,APNIC\r
+GUATEMALA,GT,GTM,LACNIC\r
+GUERNSEY,GG,GGY,RIPE\r
+GUINEA,GN,GIN,AFRINIC\r
+GUINEA-BISSAU,GW,GNB,AFRINIC\r
+GUYANA,GY,GUY,LACNIC\r
+HAITI,HT,HTI,LACNIC\r
+HEARD AND MC DONALD ISLANDS,HM,HMD,ARIN\r
+HOLY SEE (VATICAN CITY STATE),VA,VAT,RIPE\r
+HONDURAS,HN,HND,LACNIC\r
+HONG KONG,HK,HKG,APNIC\r
+HUNGARY,HU,HUN,RIPE\r
+ICELAND,IS,ISL,RIPE\r
+INDIA,IN,IND,APNIC\r
+INDONESIA,ID,IDN,APNIC\r
+IRAN (ISLAMIC REPUBLIC OF),IR,IRN,RIPE\r
+IRAQ,IQ,IRQ,RIPE\r
+IRELAND,IE,IRL,RIPE\r
+ISLE OF MAN,IM,IMN,RIPE\r
+ISRAEL,IL,ISR,RIPE\r
+ITALY,IT,ITA,RIPE\r
+JAMAICA,JM,JAM,ARIN\r
+JAPAN,JP,JPN,APNIC\r
+JERSEY,JE,JEY,RIPE\r
+JORDAN,JO,JOR,RIPE\r
+KAZAKHSTAN,KZ,KAZ,RIPE\r
+KENYA,KE,KEN,AFRINIC\r
+KIRIBATI,KI,KIR,APNIC\r
+KOREA DEMOCRATIC PEOPLE'S REPUBLIC OF,KP,PRK,APNIC\r
+KOREA REPUBLIC OF,KR,KOR,APNIC\r
+KUWAIT,KW,KWT,RIPE\r
+KYRGYZSTAN,KG,KGZ,RIPE\r
+LAO PEOPLE'S DEMOCRATIC REPUBLIC,LA,LAO,APNIC\r
+LATVIA,LV,LVA,RIPE\r
+LEBANON,LB,LBN,RIPE\r
+LESOTHO,LS,LSO,AFRINIC\r
+LIBERIA,LR,LBR,AFRINIC\r
+LIBYAN ARAB JAMAHIRIYA,LY,LBY,AFRINIC\r
+LIECHTENSTEIN,LI,LIE,RIPE\r
+LITHUANIA,LT,LTU,RIPE\r
+LUXEMBOURG,LU,LUX,RIPE\r
+MACAU,MO,MAC,APNIC\r
+MACEDONIA,MK,MKD,RIPE\r
+MADAGASCAR,MG,MDG,AFRINIC\r
+MALAWI,MW,MWI,AFRINIC\r
+MALAYSIA,MY,MYS,APNIC\r
+MALDIVES,MV,MDV,APNIC\r
+MALI,ML,MLI,AFRINIC\r
+MALTA,MT,MLT,RIPE\r
+MARSHALL ISLANDS,MH,MHL,APNIC\r
+MARTINIQUE,MQ,MTQ,ARIN\r
+MAURITANIA,MR,MRT,AFRINIC\r
+MAURITIUS,MU,MUS,AFRINIC\r
+MAYOTTE,YT,MYT,APNIC\r
+MEXICO,MX,MEX,LACNIC\r
+MICRONESIA FEDERATED STATES OF,FM,FSM,APNIC\r
+MOLDOVA REPUBLIC OF,MD,MDA,RIPE\r
+MONACO,MC,MCO,RIPE\r
+MONGOLIA,MN,MNG,APNIC\r
+MONTSERRAT,MS,MSR,RIPE\r
+MOROCCO,MA,MAR,AFRINIC\r
+MOZAMBIQUE,MZ,MOZ,AFRINIC\r
+MYANMAR,MM,MMR,APNIC\r
+Montenegro,ME,MNE,RIPE\r
+NAMIBIA,NA,NAM,AFRINIC\r
+NAURU,NR,NRU,APNIC\r
+NEPAL,NP,NPL,APNIC\r
+NETHERLANDS ANTILLES,AN,ANT,LACNIC\r
+NETHERLANDS,NL,NLD,RIPE\r
+NEW CALEDONIA,NC,NCL,APNIC\r
+NEW ZEALAND,NZ,NZL,APNIC\r
+NICARAGUA,NI,NIC,LACNIC\r
+NIGER,NE,NER,AFRINIC\r
+NIGERIA,NG,NGA,AFRINIC\r
+NIUE,NU,NIU,APNIC\r
+NON-SPEC ASIA PAS LOCATION,AP,AFR,APNIC\r
+NORFOLK ISLAND,NF,NFK,APNIC\r
+NORTHERN MARIANA ISLANDS,MP,MNP,APNIC\r
+NORWAY,NO,NOR,RIPE\r
+OMAN,OM,OMN,RIPE\r
+PAKISTAN,PK,PAK,APNIC\r
+PALAU,PW,PLW,APNIC\r
+PALESTINIAN TERRITORY OCCUPIED,PS,PSE,RIPE\r
+PANAMA,PA,PAN,LACNIC\r
+PAPUA NEW GUINEA,PG,PNG,APNIC\r
+PARAGUAY,PY,PRY,LACNIC\r
+PERU,PE,PER,LACNIC\r
+PHILIPPINES,PH,PHL,APNIC\r
+PITCAIRN,PN,PCN,APNIC\r
+POLAND,PL,POL,RIPE\r
+PORTUGAL,PT,PRT,RIPE\r
+PUERTO RICO,PR,PRI,ARIN\r
+QATAR,QA,QAT,RIPE\r
+RESERVED,ZZ,ZZZ,IANA\r
+REUNION,RE,REU,APNIC\r
+ROMANIA,RO,ROM,RIPE\r
+RUSSIAN FEDERATION,RU,RUS,RIPE\r
+RWANDA,RW,RWA,AFRINIC\r
+SAINT KITTS AND NEVIS,KN,KNA,ARIN\r
+SAINT LUCIA,LC,LCA,ARIN\r
+SAINT VINCENT AND THE GRENADINES,VC,VCT,ARIN\r
+SAMOA,WS,WSM,APNIC\r
+SAN MARINO,SM,SMR,RIPE\r
+SAO TOME AND PRINCIPE,ST,STP,AFRINIC\r
+SAUDI ARABIA,SA,SAU,RIPE\r
+SENEGAL,SN,SEN,AFRINIC\r
+SEYCHELLES,SC,SYC,AFRINIC\r
+SIERRA LEONE,SL,SLE,AFRINIC\r
+SINGAPORE,SG,SGP,APNIC\r
+SLOVAKIA (Slovak Republic),SK,SVK,RIPE\r
+SLOVENIA,SI,SVN,RIPE\r
+SOLOMON ISLANDS,SB,SLB,APNIC\r
+SOMALIA,SO,SOM,AFRINIC\r
+SOUTH AFRICA,ZA,ZAF,AFRINIC\r
+SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS,GS,SGS,LACNIC\r
+SPAIN,ES,ESP,RIPE\r
+SRI LANKA,LK,LKA,APNIC\r
+ST. HELENA,SH,SHN,ARIN\r
+ST. PIERRE AND MIQUELON,PM,SPM,ARIN\r
+SUDAN,SD,SDN,AFRINIC\r
+SURINAME,SR,SUR,LACNIC\r
+SVALBARD AND JAN MAYEN ISLANDS,SJ,SJM,RIPE\r
+SWAZILAND,SZ,SWZ,AFRINIC\r
+SWEDEN,SE,SWE,RIPE\r
+SWITZERLAND,CH,CHE,RIPE\r
+SYRIAN ARAB REPUBLIC,SY,SYR,RIPE\r
+Serbia and Montenegro,CS,CS,RIPE\r
+Serbia and Montenegro,YU,YUG,RIPE\r
+Serbia,RS,SRB,RIPE\r
+TAIWAN; REPUBLIC OF CHINA (ROC),TW,TWN,APNIC\r
+TAJIKISTAN,TJ,TJK,RIPE\r
+TANZANIA UNITED REPUBLIC OF,TZ,TZA,AFRINIC\r
+THAILAND,TH,THA,APNIC\r
+TIMOR-LESTE,TL,TLS,APNIC\r
+TOGO,TG,TGO,AFRINIC\r
+TOKELAU,TK,TKL,APNIC\r
+TONGA,TO,TON,APNIC\r
+TRINIDAD AND TOBAGO,TT,TTO,LACNIC\r
+TUNISIA,TN,TUN,AFRINIC\r
+TURKEY,TR,TUR,RIPE\r
+TURKMENISTAN,TM,TKM,RIPE\r
+TURKS AND CAICOS ISLANDS,TC,TCA,ARIN\r
+TUVALU,TV,TUV,APNIC\r
+UGANDA,UG,UGA,AFRINIC\r
+UKRAINE,UA,UKR,RIPE\r
+UNITED ARAB EMIRATES,AE,ARE,RIPE\r
+UNITED KINGDOM,GB,GBR,RIPE\r
+UNITED KINGDOM,UK,GBR,RIPE\r
+UNITED STATES MINOR OUTLYING ISLANDS,UM,UMI,ARIN\r
+UNITED STATES,US,USA,ARIN\r
+URUGUAY,UY,URY,LACNIC\r
+UZBEKISTAN,UZ,UZB,RIPE\r
+VANUATU,VU,VUT,APNIC\r
+VENEZUELA,VE,VEN,LACNIC\r
+VIET NAM,VN,VNM,APNIC\r
+VIRGIN ISLANDS (BRITISH),VG,VGB,ARIN\r
+VIRGIN ISLANDS (U.S.),VI,VIR,ARIN\r
+WALLIS AND FUTUNA ISLANDS,WF,WLF,APNIC\r
+WESTERN SAHARA,EH,ESH,AFRINIC\r
+YEMEN,YE,YEM,RIPE\r
+ZAMBIA,ZM,ZMB,AFRINIC\r
+ZIMBABWE,ZW,ZWE,AFRINIC\r
+ÅLAND ISLANDS,AX,ALA,RIPE\r
+SAINT MARTIN,MF,MAF,ARIN\r
diff --git a/country-ips.dat b/country-ips.dat
new file mode 100644 (file)
index 0000000..cc63887
Binary files /dev/null and b/country-ips.dat differ
diff --git a/country.rb b/country.rb
new file mode 100644 (file)
index 0000000..48e4056
--- /dev/null
@@ -0,0 +1,107 @@
+class Countrylookup
+# This is borrowed from WhatWeb
+
+# Lookup code developed by Matthias Wachter for rubyquiz.com and used with permission.
+# Local IPv4 addresses are represented as ZZ according to an ISO convention.
+
+# How to Update Database
+# ----------------------
+# rm plugins/country-ips.dat plugins/IpToCountry.csv
+# wget software77.net/geo-ip/?DL=1 -O plugins/IpToCountry.csv.gz
+# gzip -d plugins/IpToCountry.csv.gz
+
+def Countrylookup.startup
+# ok, set up @rfile. open once.
+       folder=File.expand_path(File.dirname(__FILE__)) 
+       country_db = folder + "/country-ips.dat"
+
+       if File.exists?(country_db)
+               @rfile=File.open(country_db,"rb")
+       else
+               if File.exists?(folder + "/IpToCountry.csv")
+               # pack that file & do it once
+                       last_start=nil
+                       last_end=nil
+                       last_country=nil
+                       File.open(folder + "/country-ips.dat","wb") do |wfile|
+                               IO.foreach(folder + "/IpToCountry.csv") do |line|
+          next if line[0..0] =="#"
+                                       next if !(line =~ /^"/ )
+                                       s,e,d1,d2,co=line.delete!("\"").split(",")
+                                       s,e = s.to_i,e.to_i
+                                       if !last_start
+                                               # initialize with first entry
+                                               last_start,last_end,last_country = s,e,co
+                                       else
+                                               if s==last_end+1 and co==last_country
+                                                       # squeeze if successive ranges have zero gap
+                                                       last_end=e
+                                               else
+                                                       # append last entry, remember new one
+                                                       wfile << [last_start,last_end,last_country].pack("NNa2")
+                                                       last_start,last_end,last_country = s,e,co
+                                               end
+                                       end
+                               end
+                               # print last entry
+                               if last_start
+                                       wfile << [last_start,last_end,last_country].pack("NNa2")
+                               end
+                       end
+                       # open the DB now
+                       @rfile=File.open(country_db,"rb")
+               else
+      raise "Aborting: Cannot find country database."
+    end
+       end
+
+       f = folder + "/country-codes.txt"
+       @ccnames={};
+       File.open(f,"r:UTF-8").readlines.each do |line|
+               x=line.split(",");
+               @ccnames[x[1]] = x[0]
+       end
+end
+
+
+def Countrylookup.ip2cc(ip)
+  found=[]
+
+  if @rfile and ip and ip =~ /^([0-9]{1,3}\.){3}[0-9]{1,3}$/
+         @rfile.seek(0,IO::SEEK_END)
+         record_max=@rfile.pos/10-1
+
+           # build a 4-char string representation of IP address
+           # in network byte order so it can be a string compare below
+           ipstr= ip.split(".").map {|x| x.to_i.chr}.join
+
+           # low/high water marks initialized
+           low,high=0,record_max
+           while true
+             mid=(low+high)/2       # binary search median
+             @rfile.seek(10*mid)     # one record is 10 byte, seek to position
+             str=@rfile.read(8)      # for range matching, we need only 8 bytes
+             # at comparison, values are big endian, i.e. packed("N")
+             if ipstr>=str[0,4]     # is this IP not below the current range?
+               if ipstr<=str[4,4]   # is this IP not above the current range?
+                 #puts  # a perfect match, voila!
+                 cc=@rfile.read(2)
+      found =[cc,@ccnames[cc]]
+                 break
+               else
+                 low=mid+1          # binary search: raise lower limit
+               end
+             else
+               high=mid-1           # binary search: reduce upper limit
+             end
+             if low>high            # no entries left? nothing found           
+               #m << {:string=>"No country"}   
+               break
+             end
+           end
+  end
+found
+end
+
+end
+
diff --git a/homophones.rb b/homophones.rb
new file mode 100644 (file)
index 0000000..bdb0f11
--- /dev/null
@@ -0,0 +1,491 @@
+class Homophones
+
+# from http://en.wikipedia.org/wiki/Wikipedia:Lists_of_common_misspellings/Homophones 13/9/2011
+@@homophones="accept,except
+acclamation,acclimation
+acts,ax,axe
+adolescence,adolescents
+aeration,erration
+aerie,airy
+affect,effect
+aid,aide
+ail,ale
+air,heir,err,ere
+aisle,isle,I'll
+all,awl
+allowed,aloud
+allude,elude
+altar,alter
+appose,oppose
+arc,ark
+are,our
+ascent,assent
+ate,eight
+away,aweigh
+aye,I,eye
+bade,bayed
+bail,bale
+bait,bate
+bald,bawled,balled
+ball,bawl
+band,banned
+bard,barred
+bare,bear
+baron,barren
+base,bass
+based,baste
+bazaar,bizarre
+be,bee
+beach,beech
+bean,been
+beat,beet
+been,bin
+beer,bier
+bell,belle
+berry,bury
+berth,birth
+better,bettor
+bight,bite
+billed,build
+bird,burred
+blew,blue
+boar,bore,boor
+board,bored
+boarder,border
+bode,bowed
+bold,bowled
+bolder,boulder,bowlder
+bole,bowl
+boos,booze
+bough,bow
+boy,buoy
+braid,brayed
+braise,braze,brays,braize
+brake,break
+breach,breech
+bread,bred
+brewed,brood
+brews,bruise
+bridal,bridle
+burro,burrow
+bus,buss
+bused,bust
+but,butt
+buy,bye,by
+cache,cash
+callous,callus
+can't,cant
+cannon,canon
+canter,cantor
+carat,carrot,caret
+caries,carries
+cast,caste
+cede,seed
+cell,sell
+cellar,seller
+censor,sensor
+cent,sent,scent
+cents,sense,scents
+cereal,serial
+cession,session
+chaise,chase
+chalk,chock
+chance,chants
+chased,chaste
+cheap,cheep
+chews,choose
+chic,sheik
+choir,quire
+chord,cored,cord
+chute,shoot
+cite,site,sight
+clause,claws
+click,clique
+close,clothes
+coal,cole
+coaled,cold
+coarse,course
+coated,coded
+cocks,cox
+complement,compliment
+contingence,contingents
+coo,coup
+coop,coupe
+correspondence,correspondents
+cosign,cosine
+council,counsel
+councilor,counselor
+creak,creek
+crewed,crude
+crews,cruise
+cue,queue
+currant,current
+curser,cursor
+dam,damn
+Dane,deign
+days,daze
+dear,deer
+dense,dents
+dependence,dependents
+dew,due,do
+die,dye
+dire,dyer
+discreet,discrete
+doe,dough
+does,doze,doughs
+done,dun
+dual,duel
+ducked,duct
+earn,urn
+either,ether
+emigrant,immigrant
+eutopia,utopia
+ewe,you,yew
+eyed,I'd
+fain,feign
+faint,feint
+fair,fare
+fairy,ferry
+fate,fete
+faze,phase
+feat,feet
+feudal,futile
+find,fined
+finish,Finnish
+fir,fur
+flair,flare
+flea,flee
+flecks,flex
+flew,flue
+flour,flower
+foaled,fold
+for,four,fore
+forego,forgo
+foreword,forward
+forth,fourth
+foul,fowl
+frees,frieze,freeze
+friar,fryer
+gage,gauge
+gait,gate
+gel,jell
+gene,jean
+gild,guild
+gneiss,nice
+gored,gourd
+grade,grayed,greyed
+grate,great
+grays,greys,graze
+grisly,grizzly
+groan,grown
+guessed,guest
+guide,guyed
+guise,guys
+hail,hale
+hair,hare
+hairy,harry
+hall,haul
+halve,have
+hangar,hanger
+hay,hey
+hays,haze
+he'd,heed
+he'll,heel,heal
+hear,here
+heard,herd
+heated,heeded
+hew,hue
+hi,high
+higher,hire
+him,hymn
+ho,hoe
+hoar,whore
+hoard,horde
+hoarse,horse
+hoes,hose
+hold,holed
+hole,whole
+holey,wholly,holy
+hostel,hostile
+hour,our
+idle,idol
+immanent,imminent
+in,inn
+incidence,incidents
+incite,insight
+instance,instants
+intense,intents
+intension,intention
+it's,its
+jam,jamb
+knave,nave
+knead,need,kneed
+knew,new
+knight,night
+knit,nit
+knot,not,naught
+know,no
+knows,nose
+lacks,lax
+lade,laid
+lain,lane
+lair,layer
+lam,lamb
+laps,lapse
+lay,lei
+lays,laze
+leach,leech
+lead,led
+leak,leek
+lean,lien
+leased,least
+lends,lens
+lessen,lesson
+lesser,lessor
+let's,lets
+levee,levy
+liar,lyre
+lichen,liken
+lickerish,licorice
+lie,lye
+links,lynx
+lo,low
+load,lode
+loan,lone
+loch,lock
+locks,lox
+loop,loupe
+loos,lose
+lose,loose
+made,maid
+mail,male
+main,mane
+maize,maze,Mays
+mall,maul
+manner,manor
+marshal,martial
+massed,mast
+mat,matte
+mean,mien
+meat,mete,meet
+medal,mettle,meddle,metal
+might,mite
+mince,mints
+mind,mined
+miner,minor
+missed,mist
+moat,mote
+mood,mooed
+moor,more
+morning,mourning
+muscle,mussel
+mussed,must
+naval,navel
+nay,neigh
+nicks,nix
+none,nun
+oar,ore,or
+ode,owed
+oh,owe
+once,wants
+one,won
+oohs,ooze
+overseas,oversees
+paced,paste
+packed,pact
+pail,pale
+pain,pane
+pair,pear,pare
+palate,pallet,palette
+parish,perish
+passed,past
+patience,patients
+pause,paws
+peace,piece
+peak,pique,peek
+peal,peel
+pearl,purl
+pedal,petal,peddle
+peer,pier
+penance,pennants
+per,purr
+pi,pie
+plain,plane
+plainer,planer,planar
+plait,plate
+pleas,please
+pole,poll
+poor,pour,pore
+populace,populous
+praise,preys,prays
+pray,prey
+precedence,precedents
+premier,premiere
+presence,presents
+pride,pried
+prier,prior
+pries,prize
+prince,prints
+principal,principle
+profit,prophet
+rack,wrack
+raid,rayed
+rail,rale
+rain,rein,reign
+raise,raze,rays
+rap,wrap
+rapt,wrapped,wrapt
+re-cover,recover
+re-lay,relay
+read,red
+read,reed
+real,reel
+recede,reseed
+reek,wreak
+residence,residents
+rest,wrest
+retch,wretch
+rhyme,rime
+right,write,rite,wright
+ring,wring
+ringer,wringer
+rise,ryes
+road,rowed,rode
+roe,row
+roil,royal
+role,roll
+roomer,rumor,rumour
+root,route
+rose,rows
+rote,wrote
+rude,rued
+rues,ruse
+rung,wrung
+rye,wry
+sail,sale
+scene,seen
+sea,see
+seam,seem
+sear,seer
+seas,seize,sees
+sects,sex
+sew,sow,so
+shake,sheik
+shear,sheer
+shoe,shoo
+sic,sick
+sics,six
+side,sighed
+sighs,size
+sign,sine
+slay,sleigh
+sleight,slight
+slew,slough
+soar,sore
+soared,sword
+sold,soled
+sole,soul
+some,sum
+son,sun
+stair,stare
+stake,steak
+steal,steel
+step,steppe
+storey,story
+straight,strait
+suite,sweet
+tacked,tact
+tacks,tax
+tail,tale
+taper,tapir
+tarry,terry
+taught,taut
+tea,tee
+team,teem
+tears,tiers
+teas,tees,tease
+tense,tents
+than,then
+there,they're,their
+threw,through
+throne,thrown
+thyme,time
+tide,tied
+tier,tire
+tighten,titan
+to,two,too
+toad,towed,toed
+toe,tow
+told,tolled
+tracked,tract
+tray,trey
+udder,utter
+vain,vein,vane
+vale,veil
+vial,vile
+vice,vise
+wade,weighed
+wail,whale
+waist,waste
+wait,weight
+waive,wave
+waiver,waver
+wale,whale
+war,wore
+ward,warred
+ware,where,wear
+warn,worn
+wax,whacks
+way,whey,weigh
+we,wee
+we'd,weed
+we'll,wheel,weal,wheal
+we're,weir,were
+we're,whir
+we've,weave
+weak,week
+wearer,where're
+weather,whether
+wet,whet
+wheeled,wield
+which,witch
+while,wile
+whiled,wild
+whine,wine
+whined,wined,wind
+whirled,world
+whit,wit
+whither,wither
+who's,whose
+whoa,woe
+wood,would
+yack,yak
+yaw,your,yore,you're
+yoke,yolk
+yore,your,you're
+you'll,Yule
+aahed,odd
+adieu,ado
+ant,aunt
+aural,oral
+marry,merry
+rout,route
+seated,seeded
+shone,shown
+tidal,title
+trader,traitor
+vary,very"
+
+       def self.dictionary
+               setup unless defined? @@dictionary
+               @@dictionary
+       end
+
+       private
+
+       def self.setup
+               @@word_sets= @@homophones.each_line.map {|x| x.downcase.strip.split(",") }
+               @@dictionary={};
+               @@word_sets.each {|set| set.each {|word| @@dictionary[word] = set  } }
+       end
+end
diff --git a/inflections.rb b/inflections.rb
new file mode 100644 (file)
index 0000000..b6d2769
--- /dev/null
@@ -0,0 +1,55 @@
+module ActiveSupport
+  Inflector.inflections do |inflect|
+    inflect.plural(/$/, 's')
+    inflect.plural(/s$/i, 's')
+    inflect.plural(/(ax|test)is$/i, '\1es')
+    inflect.plural(/(octop|vir)us$/i, '\1i')
+    inflect.plural(/(alias|status)$/i, '\1es')
+    inflect.plural(/(bu)s$/i, '\1ses')
+    inflect.plural(/(buffal|tomat)o$/i, '\1oes')
+    inflect.plural(/([ti])um$/i, '\1a')
+    inflect.plural(/sis$/i, 'ses')
+    inflect.plural(/(?:([^f])fe|([lr])f)$/i, '\1\2ves')
+    inflect.plural(/(hive)$/i, '\1s')
+    inflect.plural(/([^aeiouy]|qu)y$/i, '\1ies')
+    inflect.plural(/(x|ch|ss|sh)$/i, '\1es')
+    inflect.plural(/(matr|vert|ind)(?:ix|ex)$/i, '\1ices')
+    inflect.plural(/([m|l])ouse$/i, '\1ice')
+    inflect.plural(/^(ox)$/i, '\1en')
+    inflect.plural(/(quiz)$/i, '\1zes')
+
+    inflect.singular(/s$/i, '')
+    inflect.singular(/(n)ews$/i, '\1ews')
+    inflect.singular(/([ti])a$/i, '\1um')
+    inflect.singular(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i, '\1\2sis')
+    inflect.singular(/(^analy)ses$/i, '\1sis')
+    inflect.singular(/([^f])ves$/i, '\1fe')
+    inflect.singular(/(hive)s$/i, '\1')
+    inflect.singular(/(tive)s$/i, '\1')
+    inflect.singular(/([lr])ves$/i, '\1f')
+    inflect.singular(/([^aeiouy]|qu)ies$/i, '\1y')
+    inflect.singular(/(s)eries$/i, '\1eries')
+    inflect.singular(/(m)ovies$/i, '\1ovie')
+    inflect.singular(/(x|ch|ss|sh)es$/i, '\1')
+    inflect.singular(/([m|l])ice$/i, '\1ouse')
+    inflect.singular(/(bus)es$/i, '\1')
+    inflect.singular(/(o)es$/i, '\1')
+    inflect.singular(/(shoe)s$/i, '\1')
+    inflect.singular(/(cris|ax|test)es$/i, '\1is')
+    inflect.singular(/(octop|vir)i$/i, '\1us')
+    inflect.singular(/(alias|status)es$/i, '\1')
+    inflect.singular(/^(ox)en/i, '\1')
+    inflect.singular(/(vert|ind)ices$/i, '\1ex')
+    inflect.singular(/(matr)ices$/i, '\1ix')
+    inflect.singular(/(quiz)zes$/i, '\1')
+
+    inflect.irregular('person', 'people')
+    inflect.irregular('man', 'men')
+    inflect.irregular('child', 'children')
+    inflect.irregular('sex', 'sexes')
+    inflect.irregular('move', 'moves')
+    inflect.irregular('cow', 'kine')
+
+    inflect.uncountable(%w(equipment information rice money species series fish sheep))
+  end
+end
diff --git a/inflector.rb b/inflector.rb
new file mode 100644 (file)
index 0000000..dbe098b
--- /dev/null
@@ -0,0 +1,313 @@
+require 'singleton'
+
+module ActiveSupport
+  # The Inflector transforms words from singular to plural, class names to table names, modularized class names to ones without,
+  # and class names to foreign keys. The default inflections for pluralization, singularization, and uncountable words are kept
+  # in inflections.rb.
+  #
+  # The Rails core team has stated patches for the inflections library will not be accepted
+  # in order to avoid breaking legacy applications which may be relying on errant inflections.
+  # If you discover an incorrect inflection and require it for your application, you'll need
+  # to correct it yourself (explained below).
+  module Inflector
+    # A singleton instance of this class is yielded by Inflector.inflections, which can then be used to specify additional
+    # inflection rules. Examples:
+    #
+    #   Inflector.inflections do |inflect|
+    #     inflect.plural /^(ox)$/i, '\1\2en'
+    #     inflect.singular /^(ox)en/i, '\1'
+    #
+    #     inflect.irregular 'octopus', 'octopi'
+    #
+    #     inflect.uncountable "equipment"
+    #   end
+    #
+    # New rules are added at the top. So in the example above, the irregular rule for octopus will now be the first of the
+    # pluralization and singularization rules that is runs. This guarantees that your rules run before any of the rules that may
+    # already have been loaded.
+    class Inflections
+      include Singleton
+
+      attr_reader :plurals, :singulars, :uncountables
+
+      def initialize
+        @plurals, @singulars, @uncountables = [], [], []
+      end
+
+      # Specifies a new pluralization rule and its replacement. The rule can either be a string or a regular expression.
+      # The replacement should always be a string that may include references to the matched data from the rule.
+      def plural(rule, replacement)
+        @plurals.insert(0, [rule, replacement])
+      end
+
+      # Specifies a new singularization rule and its replacement. The rule can either be a string or a regular expression.
+      # The replacement should always be a string that may include references to the matched data from the rule.
+      def singular(rule, replacement)
+        @singulars.insert(0, [rule, replacement])
+      end
+
+      # Specifies a new irregular that applies to both pluralization and singularization at the same time. This can only be used
+      # for strings, not regular expressions. You simply pass the irregular in singular and plural form.
+      #
+      # Examples:
+      #   irregular 'octopus', 'octopi'
+      #   irregular 'person', 'people'
+      def irregular(singular, plural)
+        if singular[0,1].upcase == plural[0,1].upcase
+          plural(Regexp.new("(#{singular[0,1]})#{singular[1..-1]}$", "i"), '\1' + plural[1..-1])
+          singular(Regexp.new("(#{plural[0,1]})#{plural[1..-1]}$", "i"), '\1' + singular[1..-1])
+        else
+          plural(Regexp.new("#{singular[0,1].upcase}(?i)#{singular[1..-1]}$"), plural[0,1].upcase + plural[1..-1])
+          plural(Regexp.new("#{singular[0,1].downcase}(?i)#{singular[1..-1]}$"), plural[0,1].downcase + plural[1..-1])
+          singular(Regexp.new("#{plural[0,1].upcase}(?i)#{plural[1..-1]}$"), singular[0,1].upcase + singular[1..-1])
+          singular(Regexp.new("#{plural[0,1].downcase}(?i)#{plural[1..-1]}$"), singular[0,1].downcase + singular[1..-1])
+        end
+      end
+
+      # Add uncountable words that shouldn't be attempted inflected.
+      #
+      # Examples:
+      #   uncountable "money"
+      #   uncountable "money", "information"
+      #   uncountable %w( money information rice )
+      def uncountable(*words)
+        (@uncountables << words).flatten!
+      end
+
+      # Clears the loaded inflections within a given scope (default is <tt>:all</tt>).
+      # Give the scope as a symbol of the inflection type, the options are: <tt>:plurals</tt>,
+      # <tt>:singulars</tt>, <tt>:uncountables</tt>.
+      #
+      # Examples:
+      #   clear :all
+      #   clear :plurals
+      def clear(scope = :all)
+        case scope
+          when :all
+            @plurals, @singulars, @uncountables = [], [], []
+          else
+            instance_variable_set "@#{scope}", []
+        end
+      end
+    end
+
+    extend self
+
+    # Yields a singleton instance of Inflector::Inflections so you can specify additional
+    # inflector rules.
+    #
+    # Example:
+    #   Inflector.inflections do |inflect|
+    #     inflect.uncountable "rails"
+    #   end
+    def inflections
+      if block_given?
+        yield Inflections.instance
+      else
+        Inflections.instance
+      end
+    end
+
+    # Returns the plural form of the word in the string.
+    #
+    # Examples:
+    #   "post".pluralize             # => "posts"
+    #   "octopus".pluralize          # => "octopi"
+    #   "sheep".pluralize            # => "sheep"
+    #   "words".pluralize            # => "words"
+    #   "the blue mailman".pluralize # => "the blue mailmen"
+    #   "CamelOctopus".pluralize     # => "CamelOctopi"
+    def pluralize(word)
+      result = word.to_s.dup
+
+      if word.empty? || inflections.uncountables.include?(result.downcase)
+        result
+      else
+        inflections.plurals.each { |(rule, replacement)| break if result.gsub!(rule, replacement) }
+        result
+      end
+    end
+
+    # The reverse of +pluralize+, returns the singular form of a word in a string.
+    #
+    # Examples:
+    #   "posts".singularize            # => "post"
+    #   "octopi".singularize           # => "octopus"
+    #   "sheep".singluarize            # => "sheep"
+    #   "word".singluarize             # => "word"
+    #   "the blue mailmen".singularize # => "the blue mailman"
+    #   "CamelOctopi".singularize      # => "CamelOctopus"
+    def singularize(word)
+      result = word.to_s.dup
+
+      if inflections.uncountables.include?(result.downcase)
+        result
+      else
+        inflections.singulars.each { |(rule, replacement)| break if result.gsub!(rule, replacement) }
+        result
+      end
+    end
+
+    # By default, +camelize+ converts strings to UpperCamelCase. If the argument to +camelize+
+    # is set to <tt>:lower</tt> then +camelize+ produces lowerCamelCase.
+    #
+    # +camelize+ will also convert '/' to '::' which is useful for converting paths to namespaces.
+    #
+    # Examples:
+    #   "active_record".camelize                # => "ActiveRecord"
+    #   "active_record".camelize(:lower)        # => "activeRecord"
+    #   "active_record/errors".camelize         # => "ActiveRecord::Errors"
+    #   "active_record/errors".camelize(:lower) # => "activeRecord::Errors"
+    def camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)
+      if first_letter_in_uppercase
+        lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
+      else
+        lower_case_and_underscored_word.first + camelize(lower_case_and_underscored_word)[1..-1]
+      end
+    end
+
+    # Capitalizes all the words and replaces some characters in the string to create
+    # a nicer looking title. +titleize+ is meant for creating pretty output. It is not
+    # used in the Rails internals.
+    #
+    # +titleize+ is also aliased as as +titlecase+.
+    #
+    # Examples:
+    #   "man from the boondocks".titleize # => "Man From The Boondocks"
+    #   "x-men: the last stand".titleize  # => "X Men: The Last Stand"
+    def titleize(word)
+      humanize(underscore(word)).gsub(/\b('?[a-z])/) { $1.capitalize }
+    end
+
+    # The reverse of +camelize+. Makes an underscored, lowercase form from the expression in the string.
+    #
+    # Changes '::' to '/' to convert namespaces to paths.
+    #
+    # Examples:
+    #   "ActiveRecord".underscore         # => "active_record"
+    #   "ActiveRecord::Errors".underscore # => active_record/errors
+    def underscore(camel_cased_word)
+      camel_cased_word.to_s.gsub(/::/, '/').
+        gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
+        gsub(/([a-z\d])([A-Z])/,'\1_\2').
+        tr("-", "_").
+        downcase
+    end
+
+    # Replaces underscores with dashes in the string.
+    #
+    # Example:
+    #   "puni_puni" # => "puni-puni"
+    def dasherize(underscored_word)
+      underscored_word.gsub(/_/, '-')
+    end
+
+    # Capitalizes the first word and turns underscores into spaces and strips a
+    # trailing "_id", if any. Like +titleize+, this is meant for creating pretty output.
+    #
+    # Examples:
+    #   "employee_salary" # => "Employee salary"
+    #   "author_id"       # => "Author"
+    def humanize(lower_case_and_underscored_word)
+      lower_case_and_underscored_word.to_s.gsub(/_id$/, "").gsub(/_/, " ").capitalize
+    end
+
+    # Removes the module part from the expression in the string.
+    #
+    # Examples:
+    #   "ActiveRecord::CoreExtensions::String::Inflections".demodulize # => "Inflections"
+    #   "Inflections".demodulize                                       # => "Inflections"
+    def demodulize(class_name_in_module)
+      class_name_in_module.to_s.gsub(/^.*::/, '')
+    end
+
+    # Create the name of a table like Rails does for models to table names. This method
+    # uses the +pluralize+ method on the last word in the string.
+    #
+    # Examples
+    #   "RawScaledScorer".tableize # => "raw_scaled_scorers"
+    #   "egg_and_ham".tableize     # => "egg_and_hams"
+    #   "fancyCategory".tableize   # => "fancy_categories"
+    def tableize(class_name)
+      pluralize(underscore(class_name))
+    end
+
+    # Create a class name from a plural table name like Rails does for table names to models.
+    # Note that this returns a string and not a Class. (To convert to an actual class
+    # follow +classify+ with +constantize+.)
+    #
+    # Examples:
+    #   "egg_and_hams".classify # => "EggAndHam"
+    #   "posts".classify        # => "Post"
+    #
+    # Singular names are not handled correctly:
+    #   "business".classify     # => "Busines"
+    def classify(table_name)
+      # strip out any leading schema name
+      camelize(singularize(table_name.to_s.sub(/.*\./, '')))
+    end
+
+    # Creates a foreign key name from a class name.
+    # +separate_class_name_and_id_with_underscore+ sets whether
+    # the method should put '_' between the name and 'id'.
+    #
+    # Examples:
+    #   "Message".foreign_key        # => "message_id"
+    #   "Message".foreign_key(false) # => "messageid"
+    #   "Admin::Post".foreign_key    # => "post_id"
+    def foreign_key(class_name, separate_class_name_and_id_with_underscore = true)
+      underscore(demodulize(class_name)) + (separate_class_name_and_id_with_underscore ? "_id" : "id")
+    end
+
+    # Tries to find a constant with the name specified in the argument string:
+    #
+    #   "Module".constantize     # => Module
+    #   "Test::Unit".constantize # => Test::Unit
+    #
+    # The name is assumed to be the one of a top-level constant, no matter whether
+    # it starts with "::" or not. No lexical context is taken into account:
+    #
+    #   C = 'outside'
+    #   module M
+    #     C = 'inside'
+    #     C               # => 'inside'
+    #     "C".constantize # => 'outside', same as ::C
+    #   end
+    #
+    # NameError is raised when the name is not in CamelCase or the constant is
+    # unknown.
+    def constantize(camel_cased_word)
+      names = camel_cased_word.split('::')
+      names.shift if names.empty? || names.first.empty?
+
+      constant = Object
+      names.each do |name|
+        constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
+      end
+      constant
+    end
+
+    # Turns a number into an ordinal string used to denote the position in an
+    # ordered sequence such as 1st, 2nd, 3rd, 4th.
+    #
+    # Examples:
+    #   ordinalize(1)     # => "1st"
+    #   ordinalize(2)     # => "2nd"
+    #   ordinalize(1002)  # => "1002nd"
+    #   ordinalize(1003)  # => "1003rd"
+    def ordinalize(number)
+      if (11..13).include?(number.to_i % 100)
+        "#{number}th"
+      else
+        case number.to_i % 10
+          when 1; "#{number}st"
+          when 2; "#{number}nd"
+          when 3; "#{number}rd"
+          else    "#{number}th"
+        end
+      end
+    end
+  end
+end
+
+require File.dirname(__FILE__) + '/inflections'
diff --git a/report-facebook.com.txt b/report-facebook.com.txt
new file mode 100644 (file)
index 0000000..907fb51
--- /dev/null
@@ -0,0 +1,119 @@
+URLCrazy Domain Report
+Domain    : facebook.com
+Keyboard  : qwerty
+At        : 2012-07-18 01:13:24 -0400
+
+# Please wait. 109 hostnames to process
+
+Typo Type                     Typo             Pop      DNS-A            CC-A              DNS-MX                       Extn  
+------------------------------------------------------------------------------------------------------------------------------
+Character Omission            facbook.com      241000   69.171.224.37    US,UNITED STATES                               com   
+Character Omission            facebok.com      219000   66.220.149.11    US,UNITED STATES                               com   
+Character Omission            faceboo.com      36500    69.171.229.11    US,UNITED STATES                               com   
+Character Omission            facebook.cm      45300    85.25.146.60     DE,GERMANY                                     cm    
+Character Omission            faceook.com      5330     63.156.206.48    US,UNITED STATES                               com   
+Character Omission            faebook.com      94700                     ?                                              com   
+Character Omission            fcebook.com      19900                     ?                                              com   
+Character Repeat              faacebook.com    31600    69.171.242.11    US,UNITED STATES                               com   
+Character Repeat              faccebook.com    9570                      ?                                              com   
+Character Repeat              facebbook.com    10600                     ?                                              com   
+Character Repeat              facebookk.com    1240     127.0.0.1        ZZ,RESERVED       nullmx.domainmanager.com     com   
+Character Repeat              faceboook.com    133000                    ?                                              com   
+Character Repeat              faceebook.com    3490                      ?                                              com   
+Character Repeat              ffacebook.com    27500                     ?                                              com   
+Character Swap                afcebook.com     24400    63.156.206.48    US,UNITED STATES                               com   
+Character Swap                facbeook.com     14500    63.156.206.48    US,UNITED STATES                               com   
+Character Swap                faceboko.com     16800                     ?                                              com   
+Character Swap                faceobok.com     26100    69.171.229.11    US,UNITED STATES                               com   
+Character Swap                faecbook.com     195000   204.236.239.5    US,UNITED STATES                               com   
+Character Swap                fcaebook.com     31200    66.220.158.11    US,UNITED STATES                               com   
+Character Replacement         dacebook.com     11800                     ?                                              com   
+Character Replacement         facebiok.com     2050     63.156.206.48    US,UNITED STATES                               com   
+Character Replacement         faceboik.com     2220     63.156.206.48    US,UNITED STATES                               com   
+Character Replacement         facebooj.com     5640                      ?                                              com   
+Character Replacement         facebool.com     157000                    ?                                              com   
+Character Replacement         facebopk.com     12900    63.156.206.48    US,UNITED STATES                               com   
+Character Replacement         facebpok.com     540      63.156.206.48    US,UNITED STATES                               com   
+Character Replacement         facenook.com     23000    204.236.239.5    US,UNITED STATES                               com   
+Character Replacement         facevook.com     23900    204.236.239.5    US,UNITED STATES                               com   
+Character Replacement         facrbook.com     5940                      ?                                              com   
+Character Replacement         facwbook.com     84800    204.13.162.123   US,UNITED STATES  mx.fakemx.net                com   
+Character Replacement         favebook.com     7110                      ?                                              com   
+Character Replacement         faxebook.com     2370                      ?                                              com   
+Character Replacement         fscebook.com     10400                     ?                                              com   
+Character Replacement         gacebook.com     3870                      ?                                              com   
+Double Character Replacement  facebiik.com     1100     64.202.189.170   US,UNITED STATES  mailstore1.secureserver.net  com   
+Double Character Replacement  facebppk.com     619      64.202.189.170   US,UNITED STATES  mailstore1.secureserver.net  com   
+Character Insertion           facebnook.com    661      64.202.189.170   US,UNITED STATES  mailstore1.secureserver.net  com   
+Character Insertion           faceboiok.com    9470     63.251.133.40    US,UNITED STATES  localhost.localhost.com      com   
+Character Insertion           facebooik.com    27300    208.94.147.150   US,UNITED STATES  domain.not.configured        com   
+Character Insertion           facebookj.com    7530     64.202.189.170   US,UNITED STATES  smtp.secureserver.net        com   
+Character Insertion           facebookl.com    13000    127.0.0.1        ZZ,RESERVED       nullmx.domainmanager.com     com   
+Character Insertion           faceboopk.com    13700    199.59.242.249   CN,CHINA                                       com   
+Character Insertion           facebopok.com    674      199.59.242.249   CN,CHINA                                       com   
+Character Insertion           facebvook.com    991      63.156.206.48    US,UNITED STATES                               com   
+Character Insertion           facerbook.com    1960                      ?                                              com   
+Character Insertion           facewbook.com    34800    204.13.162.123   US,UNITED STATES  mx.fakemx.net                com   
+Character Insertion           facvebook.com    20200                     ?                                              com   
+Character Insertion           facxebook.com    1160                      ?                                              com   
+Character Insertion           fascebook.com    7230     204.13.162.123   US,UNITED STATES  mx.fakemx.net                com   
+Character Insertion           fdacebook.com    1390     199.59.242.249   CN,CHINA                                       com   
+Character Insertion           fgacebook.com    482      208.94.147.150   US,UNITED STATES  domain.not.configured        com   
+Missing Dot                   facebookcom.com  18800    66.220.158.11    US,UNITED STATES                               com   
+Missing Dot                   wwwfacebook.com  116000                    ?                                              com   
+Singular or Pluralise         facebooks.com    93200    69.171.242.11    US,UNITED STATES                               com   
+Vowel Swap                    facabook.com     44300    208.87.149.250   US,UNITED STATES                               com   
+Vowel Swap                    facibook.com     1380     69.43.160.178    US,UNITED STATES                               com   
+Vowel Swap                    facobook.com     6450     208.87.149.250   US,UNITED STATES                               com   
+Vowel Swap                    facubook.com     3670     199.59.242.249   CN,CHINA                                       com   
+Vowel Swap                    fecebook.com     98900    63.251.133.40    US,UNITED STATES  localhost.localhost.com      com   
+Vowel Swap                    ficebook.com     1390     141.8.224.25     CH,SWITZERLAND                                 com   
+Vowel Swap                    focebook.com     923      202.75.55.149    MY,MALAYSIA       mail.focebook.com            com   
+Vowel Swap                    fucebook.com     972      69.170.135.92    US,UNITED STATES                               com   
+Bit Flipping                  bacebook.com     3990     184.154.126.182  US,UNITED STATES                               com   
+Bit Flipping                  faaebook.com     4940     174.37.175.247   US,UNITED STATES  faaebook.com                 com   
+Bit Flipping                  fabebook.com     7060     208.87.149.250   US,UNITED STATES                               com   
+Bit Flipping                  facdbook.com     2410                      ?                                              com   
+Bit Flipping                  facebgok.com     264      208.94.147.150   US,UNITED STATES  domain.not.configured        com   
+Bit Flipping                  facebkok.com     10200    63.156.206.48    US,UNITED STATES                               com   
+Bit Flipping                  facebmok.com     458      204.13.162.123   US,UNITED STATES  mx.fakemx.net                com   
+Bit Flipping                  facebnok.com     5060                      ?                                              com   
+Bit Flipping                  facebogk.com     269      204.13.162.123   US,UNITED STATES  mx.fakemx.net                com   
+Bit Flipping                  facebokk.com     45800                     ?                                              com   
+Bit Flipping                  facebomk.com     2140     204.13.162.123   US,UNITED STATES  mx.fakemx.net                com   
+Bit Flipping                  facebonk.com     3040                      ?                                              com   
+Bit Flipping                  facebooc.com     275000                    ?                                              com   
+Bit Flipping                  facebooi.com     19500                     ?                                              com   
+Bit Flipping                  facebooo.com     14300    199.59.242.249   CN,CHINA                                       com   
+Bit Flipping                  facecook.com     9820     63.156.206.48    US,UNITED STATES                               com   
+Bit Flipping                  facefook.com     42800    98.124.199.1     US,UNITED STATES                               com   
+Bit Flipping                  facejook.com     1960     81.27.32.130     NO,NORWAY         mx.webhuset.no               com   
+Bit Flipping                  facerook.com     354      75.126.102.246   US,UNITED STATES                               com   
+Bit Flipping                  facgbook.com     1380     199.59.242.249   CN,CHINA                                       com   
+Bit Flipping                  facmbook.com     242      199.59.242.249   CN,CHINA                                       com   
+Bit Flipping                  fagebook.com     433000   199.59.242.249   CN,CHINA                                       com   
+Bit Flipping                  fakebook.com     5530     98.131.4.39      US,UNITED STATES  mail301.ixwebhosting.com     com   
+Bit Flipping                  fasebook.com     318000                    ?                                              com   
+Bit Flipping                  fccebook.com     494      199.59.242.249   CN,CHINA                                       com   
+Bit Flipping                  fqcebook.com     1970                      ?                                              com   
+Bit Flipping                  nacebook.com     8510     64.202.189.170   US,UNITED STATES  smtp.secureserver.net        com   
+Bit Flipping                  vacebook.com     533      199.59.241.250   CN,CHINA                                       com   
+Homoglyphs                    faceb00k.com     72500    127.0.0.1        ZZ,RESERVED       nullmx.domainmanager.com     com   
+Homoglyphs                    faceb0ok.com     3600     199.59.242.249   CN,CHINA                                       com   
+Homoglyphs                    facebo0k.com     144000   199.59.242.249   CN,CHINA                                       com   
+Wrong TLD                     facebook.ca      197000   66.220.149.11    US,UNITED STATES                               ca    
+Wrong TLD                     facebook.ch      16000                     ?                                              ch    
+Wrong TLD                     facebook.de      4750000  66.220.149.11    US,UNITED STATES                               de    
+Wrong TLD                     facebook.edu     42300                     ?                                              edu   
+Wrong TLD                     facebook.es      4110000  69.171.242.11    US,UNITED STATES                               es    
+Wrong TLD                     facebook.fr      870000   66.220.158.11    US,UNITED STATES                               fr    
+Wrong TLD                     facebook.it      7610000  69.171.224.37    US,UNITED STATES                               it    
+Wrong TLD                     facebook.jp      405000   69.171.242.11    US,UNITED STATES                               jp    
+Wrong TLD                     facebook.net     3180000                   ?                                              net   
+Wrong TLD                     facebook.nl      53700    69.171.229.11    US,UNITED STATES                               nl    
+Wrong TLD                     facebook.no      5690000  69.171.229.11    US,UNITED STATES                               no    
+Wrong TLD                     facebook.org     489000   69.171.229.11    US,UNITED STATES                               org   
+Wrong TLD                     facebook.ru      224000                    ?                 mailhub.ftc.ru               ru    
+Wrong TLD                     facebook.se      3970000  66.220.158.11    US,UNITED STATES                               se    
+Wrong TLD                     facebook.us      1820000  69.171.242.11    US,UNITED STATES                               us    
+
diff --git a/report-google.com.txt b/report-google.com.txt
new file mode 100644 (file)
index 0000000..9f67856
--- /dev/null
@@ -0,0 +1,97 @@
+URLCrazy Domain Report
+Domain    : google.com
+Keyboard  : qwerty
+At        : 2012-07-18 01:13:43 -0400
+
+# Please wait. 87 hostnames to process
+
+Typo Type                     Typo           Pop       DNS-A            CC-A              DNS-MX                             Extn  
+-----------------------------------------------------------------------------------------------------------------------------------
+Character Omission            gogle.com      370000    74.125.237.82    US,UNITED STATES  google.com.s9b2.psmtp.com          com   
+Character Omission            googe.com      107000    97.74.27.1       US,UNITED STATES  smtp.secureserver.net              com   
+Character Omission            googl.com      203000    74.125.237.83    US,UNITED STATES  google.com.s9a1.psmtp.com          com   
+Character Omission            google.cm      348000    74.125.237.87    US,UNITED STATES  google.com.s9a2.psmtp.com          cm    
+Character Omission            goole.com      299000    213.165.70.39    DE,GERMANY        mx00.1and1.co.uk                   com   
+Character Repeat              ggoogle.com    79200     74.125.237.80    US,UNITED STATES  google.com.s9a1.psmtp.com          com   
+Character Repeat              googgle.com    36600                      ?                                                    com   
+Character Repeat              googlee.com    118000    74.125.237.84    US,UNITED STATES  google.com.s9b2.psmtp.com          com   
+Character Repeat              googlle.com    9950      72.44.90.115     US,UNITED STATES                                     com   
+Character Repeat              gooogle.com    76000     74.125.237.82    US,UNITED STATES                                     com   
+Character Swap                gogole.com     167000    74.125.237.80    US,UNITED STATES  google.com.s9b2.psmtp.com          com   
+Character Swap                googel.com     1250000   74.125.237.84    US,UNITED STATES  google.com.s9a2.psmtp.com          com   
+Character Swap                goolge.com     45500     74.125.237.83    US,UNITED STATES  google.com.s9a1.psmtp.com          com   
+Character Swap                ogogle.com     37600     74.125.237.81    US,UNITED STATES  google.com.s9b2.psmtp.com          com   
+Character Replacement         foogle.com     41100     173.236.151.213  US,UNITED STATES  mx2.sub4.homie.mail.dreamhost.com  com   
+Character Replacement         giogle.com     829000    216.151.212.175  US,UNITED STATES                                     com   
+Character Replacement         goigle.com     39100     74.86.197.160    US,UNITED STATES  nullmx.domainmanager.com           com   
+Character Replacement         goofle.com     69900     69.89.22.115     US,UNITED STATES  goofle.com                         com   
+Character Replacement         googke.com     28900                      ?                                                    com   
+Character Replacement         googlr.com     73000     74.125.237.84    US,UNITED STATES  google.com.s9b2.psmtp.com          com   
+Character Replacement         googlw.com     41000                      ?                 eforwardct2.name-services.com      com   
+Character Replacement         goohle.com     22700     116.212.117.220  HK,HONG KONG                                         com   
+Character Replacement         gopgle.com     17500     208.87.34.15     BS,BAHAMAS        nullmx.domainmanager.com           com   
+Character Replacement         gpogle.com     29900     63.156.206.48    US,UNITED STATES                                     com   
+Character Replacement         hoogle.com     34200     64.202.189.170   US,UNITED STATES  mailstore1.secureserver.net        com   
+Double Character Replacement  giigle.com     14200     208.87.34.15     BS,BAHAMAS        nullmx.domainmanager.com           com   
+Double Character Replacement  gppgle.com     31100     74.125.237.84    US,UNITED STATES  google.com.s9a1.psmtp.com          com   
+Character Insertion           gfoogle.com    14800                      ?                                                    com   
+Character Insertion           ghoogle.com    30500                      ?                                                    com   
+Character Insertion           goiogle.com    16500                      ?                                                    com   
+Character Insertion           googfle.com    1420000   199.59.242.249   CN,CHINA                                             com   
+Character Insertion           googhle.com    20100     208.87.34.15     BS,BAHAMAS        nullmx.domainmanager.com           com   
+Character Insertion           googler.com    167000                     ?                                                    com   
+Character Insertion           googlew.com    25500     216.65.41.185    US,UNITED STATES                                     com   
+Character Insertion           googlke.com    21500     216.65.41.185    US,UNITED STATES                                     com   
+Character Insertion           gooigle.com    26600                      ?                                                    com   
+Character Insertion           goopgle.com    14900     82.98.86.169     DE,GERMANY                                           com   
+Character Insertion           gopogle.com    21400     216.65.41.185    US,UNITED STATES                                     com   
+Missing Dot                   googlecom.com  32800     74.125.237.83    US,UNITED STATES  google.com.s9b2.psmtp.com          com   
+Missing Dot                   wwwgoogle.com  55000     74.125.237.81    US,UNITED STATES  google.com.s9a1.psmtp.com          com   
+Singular or Pluralise         googles.com    93300                      ?                                                    com   
+Vowel Swap                    googla.com     204000                     ?                                                    com   
+Vowel Swap                    googli.com     39400                      ?                                                    com   
+Vowel Swap                    googlo.com     26900     74.86.197.160    US,UNITED STATES  nullmx.domainmanager.com           com   
+Vowel Swap                    googlu.com     9020                       ?                                                    com   
+Bit Flipping                  coogle.com     27700     82.98.86.161     DE,GERMANY                                           com   
+Bit Flipping                  eoogle.com     11300     204.13.162.123   US,UNITED STATES  mx.fakemx.net                      com   
+Bit Flipping                  ggogle.com     29100                      ?                                                    com   
+Bit Flipping                  gkogle.com     14300                      ?                                                    com   
+Bit Flipping                  gmogle.com     1130      141.8.224.106    CH,SWITZERLAND                                       com   
+Bit Flipping                  gnogle.com     1230                       ?                                                    com   
+Bit Flipping                  goggle.com     167000    85.17.162.24     NL,NETHERLANDS    nullmx.domainmanager.com           com   
+Bit Flipping                  gokgle.com     14600                      ?                                                    com   
+Bit Flipping                  gomgle.com     2600                       ?                                                    com   
+Bit Flipping                  gongle.com     15400                      ?                                                    com   
+Bit Flipping                  goocle.com     6640                       ?                                                    com   
+Bit Flipping                  gooele.com     4340                       ?                                                    com   
+Bit Flipping                  googde.com     1330                       ?                                                    com   
+Bit Flipping                  googhe.com     14400     199.59.242.249   CN,CHINA                                             com   
+Bit Flipping                  googld.com     24200     208.87.34.15     BS,BAHAMAS        nullmx.domainmanager.com           com   
+Bit Flipping                  googlg.com     5930                       ?                                                    com   
+Bit Flipping                  googlm.com     11700     174.139.230.46   US,UNITED STATES                                     com   
+Bit Flipping                  googme.com     2240      199.59.242.249   CN,CHINA                                             com   
+Bit Flipping                  googne.com     4860                       ?                                                    com   
+Bit Flipping                  gooole.com     10100     98.124.199.1     US,UNITED STATES                                     com   
+Bit Flipping                  goowle.com     1830      199.59.242.249   CN,CHINA                                             com   
+Bit Flipping                  ooogle.com     51000     74.86.197.160    US,UNITED STATES  nullmx.domainmanager.com           com   
+Bit Flipping                  woogle.com     3180      216.65.41.188    US,UNITED STATES  woogle.com                         com   
+Homoglyphs                    g00gle.com     26400                      ?                                                    com   
+Homoglyphs                    g0ogle.com     16200                      ?                                                    com   
+Homoglyphs                    go0gle.com     26700                      ?                                                    com   
+Homoglyphs                    goog1e.com     9260                       ?                                                    com   
+Wrong TLD                     google.ca      9230000   74.125.237.87    US,UNITED STATES  alt1.aspmx.l.google.com            ca    
+Wrong TLD                     google.ch      2200000   74.125.237.88    US,UNITED STATES  alt2.aspmx.l.google.com            ch    
+Wrong TLD                     google.de      18600000  74.125.237.87    US,UNITED STATES  alt3.aspmx.l.google.com            de    
+Wrong TLD                     google.edu     87900                      ?                                                    edu   
+Wrong TLD                     google.es      12600000  74.125.237.95    US,UNITED STATES  aspmx.l.google.com                 es    
+Wrong TLD                     google.fr      10000000  74.125.237.88    US,UNITED STATES  alt1.aspmx.l.google.com            fr    
+Wrong TLD                     google.it      22400000  74.125.237.95    US,UNITED STATES  aspmx.l.google.com                 it    
+Wrong TLD                     google.jp      230000    74.125.237.87    US,UNITED STATES  alt4.aspmx.l.google.com            jp    
+Wrong TLD                     google.net     538000    74.125.237.84    US,UNITED STATES  alt4.aspmx.l.google.com            net   
+Wrong TLD                     google.nl      5490000   74.125.237.95    US,UNITED STATES  alt4.aspmx.l.google.com            nl    
+Wrong TLD                     google.no      5440000   74.125.237.88    US,UNITED STATES  google.com.s9a1.psmtp.com          no    
+Wrong TLD                     google.org     880000    216.239.32.27    US,UNITED STATES  alt3.aspmx.l.google.com            org   
+Wrong TLD                     google.ru      10400000  74.125.237.87    US,UNITED STATES  alt2.aspmx.l.google.com            ru    
+Wrong TLD                     google.se      6100000   74.125.237.87    US,UNITED STATES  alt1.aspmx.l.google.com            se    
+Wrong TLD                     google.us      1370000   74.125.237.81    US,UNITED STATES  google.com.s9b1.psmtp.com          us    
+
diff --git a/tld.rb b/tld.rb
new file mode 100644 (file)
index 0000000..f38a55a
--- /dev/null
+++ b/tld.rb
@@ -0,0 +1,410 @@
+# coding: utf-8
+#
+# Copyright Andrew Horton, 2010
+# Permission is granted for use of this source code to be used within WhatWeb
+#
+
+class TLD
+       attr_reader :tlds
+
+# test domains such as XN--0ZWM56D are not included
+
+       @tlds=["biz","com","info","name","net","org","pro", # generic
+       "aero","asia","cat","coop","edu","gov","int","jobs","mil","mobi","museum","tel","travel", "xxx", #sponsored
+       "arpa", #infrastructure
+
+"ac","ad","ae","af","ag","ai","al","am","an","ao","aq","ar","as","at","au","aw","ax","az","ba","bb","bd","be","bf",
+"bg","bh","bi","bj","bm","bn","bo","br","bs","bt","bv","bw","by","bz","ca","cc","cd","cf","cg","ch","ci","ck","cl",
+"cm","cn","co","cr","cu","cv","cx","cy","cz","de","dj","dk","dm","do","dz","ec","ee","eg","eh","er","es","et","eu",
+"fi","fj","fk","fm","fo","fr","ga","gb","gd","ge","gf","gg","gh","gi","gl","gm","gn","gp","gq","gr","gs","gt","gu",
+"gw","gy","hk","hm","hn","hr","ht","hu","id","ie","il","im","in","io","iq","ir","is","it","je","jm","jo","jp","ke",
+"kg","kh","ki","km","kn","kp","kr","kw","ky","kz","la","lb","lc","li","lk","lr","ls","lt","lu","lv","ly","ma","mc",
+"md","me","mg","mh","mk","ml","mm","mn","mo","mp","mq","mr","ms","mt","mu","mv","mw","mx","my","mz","na","nc","ne",
+"nf","ng","ni","nl","no","np","nr","nu","nz","om","pa","pe","pf","pg","ph","pk","pl","pm","pn","pr","ps","pt","pw",
+"py","qa","re","ro","rs","ru","rw","sa","sb","sc","sd","se","sg","sh","si","sj","sk","sl","sm","sn","so","sr","st",
+"su","sv","sy","sz","tc","td","tf","tg","th","tj","tk","tl","tm","tn","to","tp","tr","tt","tv","tw","tz","ua","ug",
+"uk","us","uy","uz","va","vc","ve","vg","vi","vn","vu","wf","ws","ye","yt","za","zm","zw" #countries
+       ]
+
+# if you can register at the 2nd level, then sld's arent listed.
+# the point of this is to identify & remove domains that aren't possible.
+# also used to work out pluralisation - may miss some slds not listed
+
+# would be more complete with antoehr variable to say if 2nd level reg is possible and have slds for all countries
+
+@tld={
+"biz"=>{"type"=>"tld","tld"=>"biz","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+"com"=>{"type"=>"tld","tld"=>"com","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+"info"=>{"type"=>"tld","tld"=>"info","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+"name"=>{"type"=>"tld","tld"=>"name","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+"net"=>{"type"=>"tld","tld"=>"net","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+"org"=>{"type"=>"tld","tld"=>"org","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+"pro"=>{"type"=>"tld","tld"=>"pro","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+
+"aero"=>{"type"=>"tld","tld"=>"aero","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+"asia"=>{"type"=>"tld","tld"=>"asia","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+"cat"=>{"type"=>"tld","tld"=>"cat","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+"coop"=>{"type"=>"tld","tld"=>"coop","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+
+"edu"=>{"type"=>"tld","tld"=>"edu","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"US","slds"=>[]},
+"gov"=>{"type"=>"tld","tld"=>"gov","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"US","slds"=>[]},
+"int"=>{"type"=>"tld","tld"=>"int","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+"jobs"=>{"type"=>"tld","tld"=>"jobs","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+"mil"=>{"type"=>"tld","tld"=>"mil","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Intl","slds"=>[]},
+"mobi"=>{"type"=>"tld","tld"=>"mobi","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+"museum"=>{"type"=>"tld","tld"=>"museum","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+"tel"=>{"type"=>"tld","tld"=>"tel","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+"travel"=>{"type"=>"tld","tld"=>"travel","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+"arpa"=>{"type"=>"tld","tld"=>"arpa","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Intl","slds"=>[]},
+
+
+"ac"=>{"type"=>"country","tld"=>"ac","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Ascension Island","slds"=>[]},
+"ad"=>{"type"=>"country","tld"=>"ad","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Andorra","slds"=>[]},
+"ae"=>{"type"=>"country","tld"=>"ae","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"United Arab Emirates","slds"=>[]},
+"af"=>{"type"=>"country","tld"=>"af","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Afghanistan","slds"=>[]},
+"ag"=>{"type"=>"country","tld"=>"ag","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Antigua and Barbuda","slds"=>[]},
+"ai"=>{"type"=>"country","tld"=>"ai","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Anguilla","slds"=>[]},
+"al"=>{"type"=>"country","tld"=>"al","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Albania","slds"=>["gov.al","edu.al","org.al","com.al","net.al"]},
+"am"=>{"type"=>"country","tld"=>"am","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Armenia","slds"=>[]},
+"an"=>{"type"=>"country","tld"=>"an","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Netherlands Antilles","slds"=>[]},
+"ao"=>{"type"=>"country","tld"=>"ao","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Angola","slds"=>["ed.ao","gv.ao","og.ao","co.ao","pb.ao","it.ao"]},
+"aq"=>{"type"=>"country","tld"=>"aq","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Antarctica","slds"=>[]},
+"ar"=>{"type"=>"country","tld"=>"ar","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Argentina","slds"=>["com.ar","edu.ar","gob.ar","gov.ar","int.ar","mil.ar","net.ar","org.ar","tur.ar"]},
+"as"=>{"type"=>"country","tld"=>"as","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"American Samoa","slds"=>[]},
+"at"=>{"type"=>"country","tld"=>"at","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Austria","slds"=>[]},
+"au"=>{"type"=>"country","tld"=>"au","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Australia","slds"=>["com.au","net.au","org.au","edu.au","gov.au","csiro.au","asn.au","id.au","act.au","nsw.au","nt.au","qld.au","sa.au","tas.au","vic.au","wa.au"]},
+"aw"=>{"type"=>"country","tld"=>"aw","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Aruba","slds"=>[]},
+"ax"=>{"type"=>"country","tld"=>"ax","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Åland Islands","slds"=>[]},
+"az"=>{"type"=>"country","tld"=>"az","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Azerbaijan","slds"=>[]},
+"ba"=>{"type"=>"country","tld"=>"ba","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Bosnia and Herzegovina","slds"=>[]},
+"bb"=>{"type"=>"country","tld"=>"bb","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Barbados","slds"=>[]},
+"bd"=>{"type"=>"country","tld"=>"bd","2nd_level_registration"=>false,"2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Bangladesh","slds"=>["com.bd","edu.bd","ac.bd","net.bd","gov.bd","org.bd","mil.bd"]},
+"be"=>{"type"=>"country","tld"=>"be","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Belgium","slds"=>[]},
+"bf"=>{"type"=>"country","tld"=>"bf","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Burkina Faso","slds"=>[]},
+"bg"=>{"type"=>"country","tld"=>"bg","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Bulgaria","slds"=>[]},
+"bh"=>{"type"=>"country","tld"=>"bh","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Bahrain","slds"=>[]},
+"bi"=>{"type"=>"country","tld"=>"bi","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Burundi","slds"=>[]},
+"bj"=>{"type"=>"country","tld"=>"bj","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Benin","slds"=>[]},
+"bm"=>{"type"=>"country","tld"=>"bm","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Bermuda","slds"=>[]},
+"bn"=>{"type"=>"country","tld"=>"bn","2nd_level_registration"=>false,"2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Brunei","slds"=>["com.bn","edu.bn","org.bn","net.bn"]},
+"bo"=>{"type"=>"country","tld"=>"bo","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Bolivia","slds"=>[]},
+"br"=>{"type"=>"country","tld"=>"br","2nd_level_registration"=>false,"2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Brazil","slds"=>["adm.br","adv.br","agr.br","am.br","arq.br","art.br","ato.br","bio.br","blog.br","bmd.br","cim.br","cng.br","cnt.br","com.br","coop.br","ecn.br","edu.br","eng.br","esp.br","etc.br","eti.br","far.br","flog.br","fm.br","fnd.br","fot.br","fst.br","g12.br","ggf.br","gov.br","imb.br","ind.br","inf.br","jor.br","jus.br","lel.br","mat.br","med.br","mil.br","mus.br","net.br","nom.br","not.br","ntr.br","odo.br","org.br","ppg.br","pro.br","psc.br","psi.br","qsl.br","rec.br","slg.br","srv.br","tmp.br","trd.br","tur.br","tv.br","vet.br","vlog.br","wiki.br","zlg.br"]},
+"bs"=>{"type"=>"country","tld"=>"bs","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Bahamas","slds"=>[]},
+"bt"=>{"type"=>"country","tld"=>"bt","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Bhutan","slds"=>[]},
+# {"type"=>"country","tld"=>"bv","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Bouvet Island","slds"=>[]},
+"bw"=>{"type"=>"country","tld"=>"bw","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Botswana","slds"=>[]},
+"by"=>{"type"=>"country","tld"=>"by","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Belarus","slds"=>[]},
+"bz"=>{"type"=>"country","tld"=>"bz","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Belize","slds"=>[]},
+"ca"=>{"type"=>"country","tld"=>"ca","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Canada","slds"=>[]},
+"cc"=>{"type"=>"country","tld"=>"cc","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Cocos  Islands","slds"=>[]},
+"cd"=>{"type"=>"country","tld"=>"cd","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Democratic Republic of the Congo","slds"=>[]},
+"cf"=>{"type"=>"country","tld"=>"cf","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Central African Republic","slds"=>[]},
+"cg"=>{"type"=>"country","tld"=>"cg","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Republic of the Congo","slds"=>[]},
+"ch"=>{"type"=>"country","tld"=>"ch","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Switzerland","slds"=>[]},
+"ci"=>{"type"=>"country","tld"=>"ci","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Côte d'Ivoire","slds"=>[]},
+"ck"=>{"type"=>"country","tld"=>"ck","2nd_level_registration"=>false,"foreign_registration"=>true,"country"=>"Cook Islands","slds"=>["co.ck","org.ck","edu.ck","gov.ck","net.ck","gen.ck","biz.ck","info.ck"]},
+"cl"=>{"type"=>"country","tld"=>"cl","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Chile","slds"=>[]},
+"cm"=>{"type"=>"country","tld"=>"cm","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Cameroon","slds"=>[]},
+"cn"=>{"type"=>"country","tld"=>"cn","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"People's Republic of China","slds"=>[]},
+"co"=>{"type"=>"country","tld"=>"co","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Colombia","slds"=>["com.co","org.co","edu.co","gov.co","net.co","mil.co","nom.co"]},
+"cr"=>{"type"=>"country","tld"=>"cr","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Costa Rica","slds"=>[]},
+"cu"=>{"type"=>"country","tld"=>"cu","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Cuba","slds"=>[]},
+"cv"=>{"type"=>"country","tld"=>"cv","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Cape Verde","slds"=>[]},
+"cx"=>{"type"=>"country","tld"=>"cx","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Christmas Island","slds"=>[]},
+"cy"=>{"type"=>"country","tld"=>"cy","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Cyprus","slds"=>["ac.cy","net.cy","gov.cy","org.cy","pro.cy","name.cy","ekloges.cy","tm.cy","ltd.cy","biz.cy","press.cy","parliament.cy","com.cy"]},
+"cz"=>{"type"=>"country","tld"=>"cz","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Czech Republic","slds"=>[]},
+"de"=>{"type"=>"country","tld"=>"de","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Germany","slds"=>[]},
+"dj"=>{"type"=>"country","tld"=>"dj","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Djibouti","slds"=>[]},
+"dk"=>{"type"=>"country","tld"=>"dk","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Denmark","slds"=>[]},
+"dm"=>{"type"=>"country","tld"=>"dm","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Dominica","slds"=>[]},
+"do"=>{"type"=>"country","tld"=>"do","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Dominican Republic","slds"=>["edu.do","gob.do","com.do","sld.do","org.do","net.do","web.do","mil.do","art.do"]},
+"dz"=>{"type"=>"country","tld"=>"dz","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Algeria","slds"=>[]},
+"ec"=>{"type"=>"country","tld"=>"ec","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Ecuador","slds"=>[]},
+"ee"=>{"type"=>"country","tld"=>"ee","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Estonia","slds"=>[]},
+"eg"=>{"type"=>"country","tld"=>"eg","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Egypt","slds"=>["com.eg","edu.eg","eun.eg","gov.eg","mil.eg","name.eg","net.eg","org.eg","sci.eg"]},
+# {"type"=>"country","tld"=>"eh","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Western Sahara","slds"=>[]},
+"er"=>{"type"=>"country","tld"=>"er","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Eritrea","slds"=>["com.er","edu.er","gov.er","mil.er","net.er","org.er","ind.er","rochest.er","w.er"]},
+"es"=>{"type"=>"country","tld"=>"es","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Spain","slds"=>[]},
+"et"=>{"type"=>"country","tld"=>"et","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Ethiopia","slds"=>["com.et","gov.et","org.et","edu.et","net.et","biz.et","name.et","info.et"]},
+"eu"=>{"type"=>"country","tld"=>"eu","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"European Union","slds"=>[]},
+"fi"=>{"type"=>"country","tld"=>"fi","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Finland","slds"=>[]},
+"fj"=>{"type"=>"country","tld"=>"fj","2nd_level_registration"=>false,"foreign_registration"=>true,"country"=>"Fiji","slds"=>["ac.fj","biz.fj","com.fj","info.fj","mil.fj","name.fj","net.fj","org.fj","pro.fj"]},
+"fk"=>{"type"=>"country","tld"=>"fk","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Falkland Islands","slds"=>["co.fk","org.fk","gov.fk","ac.fk","nom.fk","net.fk"]},
+"fm"=>{"type"=>"country","tld"=>"fm","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Federated States of Micronesia","slds"=>[]},
+"fo"=>{"type"=>"country","tld"=>"fo","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Faroe Islands","slds"=>[]},
+"fr"=>{"type"=>"country","tld"=>"fr","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"France","slds"=>[]},
+"ga"=>{"type"=>"country","tld"=>"ga","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Gabon","slds"=>[]},
+# {"type"=>"country","tld"=>"gb","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"United Kingdom","slds"=>[]}
+"gd"=>{"type"=>"country","tld"=>"gd","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Grenada","slds"=>[]},
+"ge"=>{"type"=>"country","tld"=>"ge","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Georgia","slds"=>[]},
+"gf"=>{"type"=>"country","tld"=>"gf","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"French Guiana","slds"=>[]},
+"gg"=>{"type"=>"country","tld"=>"gg","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Guernsey","slds"=>[]},
+"gh"=>{"type"=>"country","tld"=>"gh","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Ghana","slds"=>["com.gh","edu.gh","gov.gh","org.gh","mil.gh"]},
+"gi"=>{"type"=>"country","tld"=>"gi","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Gibraltar","slds"=>[]},
+"gl"=>{"type"=>"country","tld"=>"gl","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Greenland","slds"=>[]},
+"gm"=>{"type"=>"country","tld"=>"gm","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Gambia","slds"=>[]},
+"gn"=>{"type"=>"country","tld"=>"gn","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Guinea","slds"=>["com.gn","ac.gn","gov.gn","org.gn","net.gn"]},
+"gp"=>{"type"=>"country","tld"=>"gp","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Guadeloupe","slds"=>[]},
+"gq"=>{"type"=>"country","tld"=>"gq","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Equatorial Guinea","slds"=>[]},
+"gr"=>{"type"=>"country","tld"=>"gr","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Greece","slds"=>[]},
+"gs"=>{"type"=>"country","tld"=>"gs","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"South Georgia and the South Sandwich Islands","slds"=>[]},
+"gt"=>{"type"=>"country","tld"=>"gt","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Guatemala","slds"=>[]},
+"gu"=>{"type"=>"country","tld"=>"gu","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Guam","slds"=>[]},
+"gw"=>{"type"=>"country","tld"=>"gw","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Guinea-Bissau","slds"=>[]},
+"gy"=>{"type"=>"country","tld"=>"gy","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Guyana","slds"=>[]},
+"hk"=>{"type"=>"country","tld"=>"hk","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Hong Kong","slds"=>[]},
+"hm"=>{"type"=>"country","tld"=>"hm","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Heard Island and McDonald Islands","slds"=>[]},
+"hn"=>{"type"=>"country","tld"=>"hn","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Honduras","slds"=>[]},
+"hr"=>{"type"=>"country","tld"=>"hr","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Croatia","slds"=>[]},
+"ht"=>{"type"=>"country","tld"=>"ht","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Haiti","slds"=>[]},
+"hu"=>{"type"=>"country","tld"=>"hu","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Hungary","slds"=>[]},
+"id"=>{"type"=>"country","tld"=>"id","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Indonesia","slds"=>["ac.id","co.id","net.id","or.id","web.id","sch.id","mil.id","go.id"]},
+"ie"=>{"type"=>"country","tld"=>"ie","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Ireland","slds"=>[]},
+"il"=>{"type"=>"country","tld"=>"il","2nd_level_registration"=>false,"foreign_registration"=>true,"country"=>"Israel","slds"=>["ac.il","co.il","org.il","net.il","k12.il","gov.il","muni.il","idf.il"]},
+"im"=>{"type"=>"country","tld"=>"im","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Isle of Man","slds"=>[]},
+"in"=>{"type"=>"country","tld"=>"in","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"India","slds"=>[]},
+"io"=>{"type"=>"country","tld"=>"io","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"British Indian Ocean Territory","slds"=>[]},
+"iq"=>{"type"=>"country","tld"=>"iq","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Iraq","slds"=>[]},
+"ir"=>{"type"=>"country","tld"=>"ir","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Iran","slds"=>[]},
+"is"=>{"type"=>"country","tld"=>"is","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Iceland","slds"=>[]},
+"it"=>{"type"=>"country","tld"=>"it","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Italy","slds"=>[]},
+"je"=>{"type"=>"country","tld"=>"je","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Jersey","slds"=>[]},
+"jm"=>{"type"=>"country","tld"=>"jm","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Jamaica","slds"=>["com.jm","net.jm","org.jm","edu.jm","gov.jm","mil.jm"]},
+"jo"=>{"type"=>"country","tld"=>"jo","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Jordan","slds"=>[]},
+"jp"=>{"type"=>"country","tld"=>"jp","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Japan","slds"=>[]},
+"ke"=>{"type"=>"country","tld"=>"ke","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Kenya","slds"=>["co.ke","or.ke","ne.ke","go.ke","ac.ke","sc.ke"]},
+"kg"=>{"type"=>"country","tld"=>"kg","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Kyrgyzstan","slds"=>[]},
+"kh"=>{"type"=>"country","tld"=>"kh","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Cambodia","slds"=>["per.kh","com.kh","edu.kh","gov.kh","mil.kh","net.kh","org.kh"]},
+"ki"=>{"type"=>"country","tld"=>"ki","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Kiribati","slds"=>[]},
+"km"=>{"type"=>"country","tld"=>"km","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Comoros","slds"=>[]},
+"kn"=>{"type"=>"country","tld"=>"kn","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Saint Kitts and Nevis","slds"=>[]},
+"kp"=>{"type"=>"country","tld"=>"kp","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"North Korea","slds"=>[]},
+"kr"=>{"type"=>"country","tld"=>"kr","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"South Korea","slds"=>[]},
+"kw"=>{"type"=>"country","tld"=>"kw","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Kuwait","slds"=>["edu.kw","com.kw","net.kw","org.kw","gov.kw"]},
+"ky"=>{"type"=>"country","tld"=>"ky","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Cayman Islands","slds"=>[]},
+"kz"=>{"type"=>"country","tld"=>"kz","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Kazakhstan","slds"=>[]},
+"la"=>{"type"=>"country","tld"=>"la","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Laos","slds"=>[]},
+"lb"=>{"type"=>"country","tld"=>"lb","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Lebanon","slds"=>["com.lb","edu.lb","gov.lb","net.lb","org.lb"]},
+"lc"=>{"type"=>"country","tld"=>"lc","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Saint Lucia","slds"=>[]},
+"li"=>{"type"=>"country","tld"=>"li","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Liechtenstein","slds"=>[]},
+"lk"=>{"type"=>"country","tld"=>"lk","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Sri Lanka","slds"=>[]},
+"lr"=>{"type"=>"country","tld"=>"lr","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Liberia","slds"=>["com.lr","edu.lr","gov.lr","org.lr","net.lr"]},
+"ls"=>{"type"=>"country","tld"=>"ls","2nd_level_registration"=>false,"foreign_registration"=>true,"country"=>"Lesotho","slds"=>["co.ls","org.ls"]},
+"lt"=>{"type"=>"country","tld"=>"lt","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Lithuania","slds"=>[]},
+"lu"=>{"type"=>"country","tld"=>"lu","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Luxembourg","slds"=>[]},
+"lv"=>{"type"=>"country","tld"=>"lv","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Latvia","slds"=>[]},
+"ly"=>{"type"=>"country","tld"=>"ly","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Libya","slds"=>[]},
+"ma"=>{"type"=>"country","tld"=>"ma","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Morocco","slds"=>[]},
+"mc"=>{"type"=>"country","tld"=>"mc","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Monaco","slds"=>[]},
+"md"=>{"type"=>"country","tld"=>"md","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Moldova","slds"=>[]},
+"me"=>{"type"=>"country","tld"=>"me","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Montenegro","slds"=>[]},
+"mg"=>{"type"=>"country","tld"=>"mg","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Madagascar","slds"=>[]},
+"mh"=>{"type"=>"country","tld"=>"mh","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Marshall Islands","slds"=>[]},
+"mk"=>{"type"=>"country","tld"=>"mk","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Republic of Macedonia","slds"=>[]},
+"ml"=>{"type"=>"country","tld"=>"ml","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Mali","slds"=>["com.ml","net.ml","org.ml","edu.ml","gov.ml","presse.ml"]},
+"mm"=>{"type"=>"country","tld"=>"mm","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Myanmar","slds"=>["net.mm","com.mm","org.mm","edu.mm","gov.mm"]},
+"mn"=>{"type"=>"country","tld"=>"mn","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Mongolia","slds"=>[]},
+"mo"=>{"type"=>"country","tld"=>"mo","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Macau","slds"=>[]},
+"mp"=>{"type"=>"country","tld"=>"mp","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Northern Mariana Islands","slds"=>[]},
+"mq"=>{"type"=>"country","tld"=>"mq","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Martinique","slds"=>[]},
+"mr"=>{"type"=>"country","tld"=>"mr","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Mauritania","slds"=>[]},
+"ms"=>{"type"=>"country","tld"=>"ms","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Montserrat","slds"=>[]},
+"mt"=>{"type"=>"country","tld"=>"mt","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Malta","slds"=>["com.mt","org.mt","net.mt","edu.mt","gov.mt"]},
+"mu"=>{"type"=>"country","tld"=>"mu","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Mauritius","slds"=>[]},
+"mv"=>{"type"=>"country","tld"=>"mv","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Maldives","slds"=>["aero.mv","biz.mv","com.mv","coop.mv","edu.mv","gov.mv","info.mv","int.mv","mil.mv","museum.mv","name.mv","net.mv","org.mv","pro.mv"]},
+"mw"=>{"type"=>"country","tld"=>"mw","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Malawi","slds"=>[]},
+"mx"=>{"type"=>"country","tld"=>"mx","2nd_level_registration"=>false,"foreign_registration"=>true,"country"=>"Mexico","slds"=>["com.mx","net.mx","org.mx","edu.mx","gob.mx"]},
+"my"=>{"type"=>"country","tld"=>"my","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Malaysia","slds"=>["com.my","net.my","org.my","gov.my","edu.my","mil.my","name.my"]},
+"mz"=>{"type"=>"country","tld"=>"mz","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Mozambique","slds"=>["co.mz","org.mz","gov.mz","edu.mz"]},
+"na"=>{"type"=>"country","tld"=>"na","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Namibia","slds"=>[]},
+"nc"=>{"type"=>"country","tld"=>"nc","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"New Caledonia","slds"=>[]},
+"ne"=>{"type"=>"country","tld"=>"ne","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Niger","slds"=>[]},
+"nf"=>{"type"=>"country","tld"=>"nf","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Norfolk Island","slds"=>[]},
+"ng"=>{"type"=>"country","tld"=>"ng","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Nigeria","slds"=>["com.ng","org.ng","gov.ng","edu.ng","net.ng"]},
+"ni"=>{"type"=>"country","tld"=>"ni","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Nicaragua","slds"=>["gob.ni","co.ni","com.ni","ac.ni","org.ni","nom.ni","net.ni","mil.ni"]},
+"nl"=>{"type"=>"country","tld"=>"nl","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Netherlands","slds"=>[]},
+"no"=>{"type"=>"country","tld"=>"no","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Norway","slds"=>[]},
+"np"=>{"type"=>"country","tld"=>"np","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Nepal","slds"=>["com.np","org.np","edu.np","net.np","gov.np","mil.np"]},
+"nr"=>{"type"=>"country","tld"=>"nr","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Nauru","slds"=>[]},
+"nu"=>{"type"=>"country","tld"=>"nu","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Niue","slds"=>[]},
+"nz"=>{"type"=>"country","tld"=>"nz","2nd_level_registration"=>false,"foreign_registration"=>true,"country"=>"New Zealand","slds"=>["ac.nz","co.nz","geek.nz","gen.nz","maori.nz","net.nz","org.nz","school.nz","cri.nz","govt.nz","iwi.nz","parliament.nz","mil.nz"]},
+"om"=>{"type"=>"country","tld"=>"om","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Oman","slds"=>["com.om","co.om","edu.om","ac.om","sch.om","gov.om","net.om","org.om","mil.om","museum.om","biz.om","pro.om","med.om"]},
+"pa"=>{"type"=>"country","tld"=>"pa","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Panama","slds"=>["net.pa","com.pa","ac.pa","sld.pa","gob.pa","edu.pa","org.pa","abo.pa","ing.pa","med.pa","nom.pa"]},
+"pe"=>{"type"=>"country","tld"=>"pe","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Peru","slds"=>[]},
+"pf"=>{"type"=>"country","tld"=>"pf","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"French Polynesia","slds"=>[]},
+"pg"=>{"type"=>"country","tld"=>"pg","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Papua New Guinea","slds"=>["com.pg","net.pg","ac.pg","gov.pg","mil.pg","org.pg"]},
+"ph"=>{"type"=>"country","tld"=>"ph","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Philippines","slds"=>[]},
+"pk"=>{"type"=>"country","tld"=>"pk","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Pakistan","slds"=>[]},
+"pl"=>{"type"=>"country","tld"=>"pl","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Poland","slds"=>[]},
+"pm"=>{"type"=>"country","tld"=>"pm","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Saint Pierre and Miquelon","slds"=>[]},
+"pn"=>{"type"=>"country","tld"=>"pn","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Pitcairn Islands","slds"=>[]},
+"pr"=>{"type"=>"country","tld"=>"pr","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Puerto Rico","slds"=>[]},
+"ps"=>{"type"=>"country","tld"=>"ps","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Palestine","slds"=>[]},
+"pt"=>{"type"=>"country","tld"=>"pt","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Portugal","slds"=>[]},
+"pw"=>{"type"=>"country","tld"=>"pw","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Palau","slds"=>[]},
+"py"=>{"type"=>"country","tld"=>"py","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Paraguay","slds"=>["org.py","edu.py","mil.py","gov.py","net.py"]},
+"qa"=>{"type"=>"country","tld"=>"qa","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Qatar","slds"=>[]},
+"re"=>{"type"=>"country","tld"=>"re","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Réunion","slds"=>[]},
+"ro"=>{"type"=>"country","tld"=>"ro","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Romania","slds"=>[]},
+"rs"=>{"type"=>"country","tld"=>"rs","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Serbia","slds"=>[]},
+"ru"=>{"type"=>"country","tld"=>"ru","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Russia","slds"=>[]},
+"rw"=>{"type"=>"country","tld"=>"rw","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Rwanda","slds"=>[]},
+"sa"=>{"type"=>"country","tld"=>"sa","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Saudi Arabia","slds"=>["com.sa","edu.sa","sch.sa","med.sa","gov.sa","net.sa","org.sa","pub.sa"]},
+"sb"=>{"type"=>"country","tld"=>"sb","2nd_level_registration"=>false,"foreign_registration"=>true,"country"=>"Solomon Islands","slds"=>["com.sb","net.sb","edu.sb","org.sb","gov.sb"]},
+"sc"=>{"type"=>"country","tld"=>"sc","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Seychelles","slds"=>[]},
+"sd"=>{"type"=>"country","tld"=>"sd","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Sudan","slds"=>[]},
+"se"=>{"type"=>"country","tld"=>"se","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Sweden","slds"=>[]},
+"sg"=>{"type"=>"country","tld"=>"sg","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Singapore","slds"=>[]},
+"sh"=>{"type"=>"country","tld"=>"sh","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Saint Helena","slds"=>[]},
+"si"=>{"type"=>"country","tld"=>"si","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Slovenia","slds"=>[]},
+# {"type"=>"country","tld"=>"sj","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Svalbard and Jan Mayen islands","slds"=>[]},
+"sk"=>{"type"=>"country","tld"=>"sk","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Slovakia","slds"=>[]},
+"sl"=>{"type"=>"country","tld"=>"sl","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Sierra Leone","slds"=>[]},
+"sm"=>{"type"=>"country","tld"=>"sm","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"San Marino","slds"=>[]},
+"sn"=>{"type"=>"country","tld"=>"sn","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Senegal","slds"=>[]},
+# {"type"=>"country","tld"=>"so","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Somalia","slds"=>[]},
+"sr"=>{"type"=>"country","tld"=>"sr","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Suriname","slds"=>[]},
+"st"=>{"type"=>"country","tld"=>"st","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"São Tomé and Príncipe","slds"=>[]},
+"su"=>{"type"=>"country","tld"=>"su","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Soviet Union","slds"=>[]},
+"sv"=>{"type"=>"country","tld"=>"sv","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"El Salvador","slds"=>["edu.sv","gob.sv","com.sv","org.sv","red.sv"]},
+"sy"=>{"type"=>"country","tld"=>"sy","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Syria","slds"=>[]},
+"sz"=>{"type"=>"country","tld"=>"sz","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Swaziland","slds"=>[]},
+"tc"=>{"type"=>"country","tld"=>"tc","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Turks and Caicos Islands","slds"=>[]},
+"td"=>{"type"=>"country","tld"=>"td","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Chad","slds"=>[]},
+"tf"=>{"type"=>"country","tld"=>"tf","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"French Southern Territories","slds"=>[]},
+"tg"=>{"type"=>"country","tld"=>"tg","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Togo","slds"=>[]},
+"th"=>{"type"=>"country","tld"=>"th","2nd_level_registration"=>false,"foreign_registration"=>true,"country"=>"Thailand","slds"=>["ac.th","co.th","in.th","go.th","mi.th","or.th","net.th"]},
+"tj"=>{"type"=>"country","tld"=>"tj","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Tajikistan","slds"=>[]},
+"tk"=>{"type"=>"country","tld"=>"tk","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Tokelau","slds"=>[]},
+"tl"=>{"type"=>"country","tld"=>"tl","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"East Timor","slds"=>[]},
+"tm"=>{"type"=>"country","tld"=>"tm","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Turkmenistan","slds"=>[]},
+"tn"=>{"type"=>"country","tld"=>"tn","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Tunisia","slds"=>[]},
+"to"=>{"type"=>"country","tld"=>"to","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Tonga","slds"=>[]},
+"tp"=>{"type"=>"country","tld"=>"tp","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"East Timor","slds"=>[]},
+"tr"=>{"type"=>"country","tld"=>"tr","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Turkey","slds"=>["nc.tr","com.tr","gen.tr","org.tr","biz.tr","info.tr","av.tr","dr.tr","pol.tr","bel.tr","mil.tr","bbs.tr","k12.tr","edu.tr","name.tr","net.tr","gov.tr","web.tr","tel.tr","tv.tr"]},
+"tt"=>{"type"=>"country","tld"=>"tt","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Trinidad and Tobago","slds"=>[]},
+"tv"=>{"type"=>"country","tld"=>"tv","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Tuvalu","slds"=>[]},
+"tw"=>{"type"=>"country","tld"=>"tw","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Taiwan","slds"=>[]},
+"tz"=>{"type"=>"country","tld"=>"tz","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Tanzania","slds"=>["co.tz","ac.tz","go.tz","or.tz","ne.tz"]},
+"ua"=>{"type"=>"country","tld"=>"ua","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Ukraine","slds"=>["com.ua","gov.ua","net.ua","edu.ua","org.ua","in.ua"]},
+"ug"=>{"type"=>"country","tld"=>"ug","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Uganda","slds"=>[]},
+"uk"=>{"type"=>"country","tld"=>"uk","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"United Kingdom","slds"=>["ac.uk","co.uk","gov.uk","ltd.uk","me.uk","mod.uk","net.uk","nic.uk","nhs.uk","org.uk","plc.uk","police.uk","sch.uk","bl.uk","british-library.uk","icnet.uk","jet.uk","nls.uk","parliament.uk" ]},
+"us"=>{"type"=>"country","tld"=>"us","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"United States","slds"=>[]},
+"uy"=>{"type"=>"country","tld"=>"uy","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Uruguay","slds"=>["com.uy","edu.uy","gub.uy","net.uy","mil.uy","org.uy"]},
+"uz"=>{"type"=>"country","tld"=>"uz","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Uzbekistan","slds"=>[]},
+"va"=>{"type"=>"country","tld"=>"va","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Vatican City","slds"=>[]},
+"vc"=>{"type"=>"country","tld"=>"vc","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Saint Vincent and the Grenadines","slds"=>[]},
+"ve"=>{"type"=>"country","tld"=>"ve","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Venezuela","slds"=>["com.ve","edu.ve","gob.ve","mil.ve","net.ve","org.ve","info.ve","co.ve","web.ve","fuc.ve"]},
+"vg"=>{"type"=>"country","tld"=>"vg","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"British Virgin Islands","slds"=>[]},
+"vi"=>{"type"=>"country","tld"=>"vi","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"United States Virgin Islands","slds"=>[]},
+"vn"=>{"type"=>"country","tld"=>"vn","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Vietnam","slds"=>[]},
+"vu"=>{"type"=>"country","tld"=>"vu","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Vanuatu","slds"=>[]},
+"wf"=>{"type"=>"country","tld"=>"wf","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Wallis and Futuna","slds"=>[]},
+"ws"=>{"type"=>"country","tld"=>"ws","2nd_level_registration"=>true,"foreign_registration"=>true,"country"=>"Samoa","slds"=>[]},
+"ye"=>{"type"=>"country","tld"=>"ye","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Yemen","slds"=>["com.ye","net.ye"]},
+"yt"=>{"type"=>"country","tld"=>"yt","2nd_level_registration"=>true,"foreign_registration"=>false,"country"=>"Mayotte","slds"=>[]},
+"za"=>{"type"=>"country","tld"=>"za","2nd_level_registration"=>false,"foreign_registration"=>true,"country"=>"South Africa","slds"=>["ac.za","city.za","co.za","edu.za","gov.za","law.za","mil.za","nom.za","org.za","school.za","alt.za","net.za","ngo.za","tm.za","web.za","bourse.za","agric.za","cybernet.za","grondar.za","iaccess.za","inca.za","nis.za","olivetti.za","pix.za","db.za","imt.za"]},
+"zm"=>{"type"=>"country","tld"=>"zm","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Zambia","slds"=>["co.zm","org.zm","ac.zm"]},
+"zw"=>{"type"=>"country","tld"=>"zw","2nd_level_registration"=>false,"foreign_registration"=>false,"country"=>"Zimbabwe","slds"=>["co.zw","ac.zw","org.zw"]}
+
+}
+
+       def TLD.cc(c)
+               @tld[c]
+       end
+
+       def TLD.valid_tld?(t) # does the TLD exist? true or false
+               tld(t).nil? ? false : true
+       end
+
+       def TLD.valid_sld?(d) # does the SLD exist? true or false
+               sld(d).nil? ? false : true
+       end
+
+       def TLD.tld(d) # nil if invalid, otherwise string
+               tld=d.split('.')[-1]
+               t=@tld[tld]
+               t.nil? ? nil : t["tld"]
+       end
+
+       def TLD.sld(d) # nil if invalid, otherwise string
+               return nil if valid_tld?(d) == false
+               a=tld_a(d)
+               sld=d.split(".")[-2..-1].join(".")
+               a["slds"].include?(sld) ? sld : nil     
+       end
+
+       def TLD.tld_a(d) # returns an array of the tld
+               @tld[d.split(".")[-1]]
+       end
+
+       def TLD.valid_domain?(d)        
+               return false if d.include?('..')
+               extension(d).nil? ? false : true
+       end
+
+       def TLD.extension(d) # what domain is this in?  tld + sld is needed.   nil or string
+               tld = tld(d)
+               return nil if tld.nil?
+               a=tld_a(d)
+
+               if a["2nd_level_registration"] == true
+                       return tld
+               else
+                       sld = sld(d)
+                       sld.nil? ? nil : sld
+               end             
+       end
+
+       def TLD.registered_name(d) # return just the registered name, like dogs from dogs.com or dogs.co.uk
+               return nil if !valid_domain?(d)
+               tld_len=extension(d).split(".").length          
+               d.split(".")[0..-(tld_len+1)][-1]
+       end
+
+       def TLD.domain_name(d) 
+               return nil if !valid_domain?(d)
+               registered_name(d) + "." + extension(d)
+       end
+
+       def TLD.same_domain?(a,b)
+               domain_name(a) == domain_name(b)
+       end
+
+       def tests
+               # get the au array
+               tlds=["au","nz","nn","edu"].each {|tld|
+                       domains=["yahoo","yahoo.com","yahoo.co"].each {|domain|
+
+                       d=domain+"."+tld
+                       puts "testing #{d}"
+                       if valid_domain?(d)==true
+                               puts "#{d} domain is valid"
+                       else
+                               puts "#{d} domain is invalid"
+                       end
+                       puts "domain ext is #{extension(d)}"
+                       puts "registered name is #{registered_name(d)}"
+#                      puts "tld is #{tld(d)}"
+=begin
+
+                       if valid_tld?(d)==true
+                               puts "#{d} tld is valid"
+                       else
+                               puts "#{d} tld is invalid"
+                       end
+                                               
+                       if valid_sld?(d)==true
+                               puts "#{d} sld is valid"
+                       else
+                               puts "#{d} sld is invalid"
+                       end
+=end                                           
+                       puts
+                }
+               }
+       end
+
+end
+
diff --git a/urlcrazy b/urlcrazy
new file mode 100755 (executable)
index 0000000..fd2f448
--- /dev/null
+++ b/urlcrazy
@@ -0,0 +1,714 @@
+#!/usr/bin/env ruby
+#
+# URLCrazy
+# Copyright Andrew Horton
+#
+#License: Copyright Andrew Horton, 2012. You have permission to use and distribute this software. You do not have permission to distribute modified versions without permission. You do not have permission to use this as part of a commercial service unless it forms part of a penetration testing service. For example a commercial service that provides domain protection for clients must obtain a license first. Email me if you require a license.
+
+
+require 'rubygems'
+require 'getoptlong'
+require 'singleton'
+require 'pp'
+require 'socket'
+require 'net/http'
+require 'resolv'
+require 'resolv-replace'
+
+# add the directory of the file currently being executed to the load path
+$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless
+    $:.include?(File.dirname(__FILE__)) || $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
+
+# if __FILE__ is a symlink then follow *every* symlink
+if File.symlink?(__FILE__)
+  require 'pathname'
+  $LOAD_PATH << File.dirname( Pathname.new(__FILE__).realpath )
+end
+
+require 'inflector.rb'
+require 'tld.rb'
+require 'common-misspellings.rb'
+require 'homophones.rb'
+require 'country.rb'
+
+$VERSION="0.5"
+
+class Keyboard
+       def initialize(layout)
+               case layout
+                       when "qwerty" then @rows=["1234567890-","qwertyuiop","asdfghjkl","zxcvbnm"]
+                       # france, belgium
+                       when "azerty" then @rows=["1234567890-","azertyuiop","qsdfghjklm","wxcvbn"]
+                       # germany, austria, switzerland, hungary
+                       when "qwertz" then @rows=["1234567890-","qwertzuiop","asdfghjkl","yxcvbnm"]
+                       # dvorak                        
+                       when "dvorak" then @rows=["1234567890-","pyfgcrl","aoeuidhtns","qjkxbmwvz"]
+                       else raise("Unknown keyboard: #{layout}")
+               end             
+       end
+       
+       def key_left(char)
+               r=row(char)
+               return nil if r.nil?
+               return nil if r.index(char).nil?
+               return nil if r.index(char)==0  # already far left              
+               r[r.index(char)-1].nil? ? nil : "%c" % r[r.index(char)-1]               
+       end
+       
+       def key_right(char)
+               r=row(char)
+               return nil if r.nil?
+               return nil if r.index(char).nil?
+               return nil if r.index(char)==r.length-1  # already far right
+               r[r.index(char)+1].nil? ? nil : "%c" % r[r.index(char)+1]
+       end
+       
+       def row(char)
+               #returns keyboard. eg. qwertyuiop  or nil if not found
+               r=@rows.map {|k| k if k.include?(char) }.join
+               r.empty? ? nil : r
+       end
+end
+
+
+
+class Typo
+attr_accessor :type, :name, :valid_name, :tld, :extension, :registered_name, :popularity, :resolved_a, :resolved_mx, :country_a
+       
+       def get_resolved
+               @resolved_a=""
+               @resolved_mx=""
+               return if !@valid_name
+
+               begin
+                       @resolved_a=IPSocket.getaddress(@name)
+      if @resolved_a
+        @country_a = Countrylookup.ip2cc(@resolved_a)
+      end
+                       rescue
+               end
+               begin
+                       dns=Resolv::DNS.new
+                       @resolved_mx=dns.getresources(@name,Resolv::DNS::Resource::IN::MX).first.exchange.to_s
+                       rescue
+               end
+       end
+
+       
+       def get_popularity
+               # Google confuses dots for commas and spaces
+       
+               return "" if !@valid_name
+               begin
+                       http = Net::HTTP.new("www.google.com");
+                       req=Net::HTTP::Get.new("/search?q=%22#{@name}%22",{"User-Agent" =>"Opera/9.20 (Windows NT 6.0; U; en)"})
+                       res=http.request(req)
+                       resp=res.body
+                       r=resp.scan(/About ([\d,]+)/).flatten.first.delete(",").to_i            
+               rescue
+                       return 0
+               rescue Timeout::Error
+                       puts "# Timeout for #{@name}. Retrying"
+                       retry
+               end
+               return @popularity=r
+       end
+end
+
+
+class Domainname
+       attr_accessor :domain, :registered_name, :tld, :extension,:valid, :typos
+       
+       def initialize(s)
+               @domain=s
+               @registered_name=TLD.registered_name(@domain)
+               @tld=TLD.tld(@domain)
+               @extension=TLD.extension(@domain)
+               @valid=TLD.valid_domain?(@domain)
+               @typos=Array.new
+       end
+       
+       def create_typos
+               self.character_omission.sort.uniq.each {|c|
+                       t=Typo.new
+                       t.type ="Character Omission"
+                       t.name=c
+                       @typos<< t
+               }
+
+               self.character_repeat.sort.uniq.each {|c|
+                       t=Typo.new
+                       t.type ="Character Repeat"
+                       t.name=c
+                       @typos<< t
+               }
+               
+               self.character_swap.sort.uniq.each {|c|
+                       t=Typo.new
+                       t.type ="Character Swap"
+                       t.name=c
+                       @typos<< t
+               }
+               self.character_replacement.sort.uniq.each {|c|
+                       t=Typo.new
+                       t.type ="Character Replacement"
+                       t.name=c
+                       @typos<< t
+               }
+               self.double_character_replacement.sort.uniq.each {|c|
+                       t=Typo.new
+                       t.type ="Double Character Replacement"
+                       t.name=c
+                       @typos<< t
+               }
+               self.character_insertion.sort.uniq.each {|c|
+                       t=Typo.new
+                       t.type ="Character Insertion"
+                       t.name=c
+                       @typos<< t
+               }
+       
+               self.missingdot.sort.uniq.each {|c|
+                       t=Typo.new
+                       t.type ="Missing Dot"
+                       t.name=c
+                       @typos<< t
+               }
+               
+               self.stripdashes.sort.uniq.each {|c|
+                       t=Typo.new
+                       t.type ="Strip Dashes"
+                       t.name=c
+                       @typos<< t
+               }
+       
+               self.singular_or_pluralise.sort.uniq.each {|c|
+                       t=Typo.new
+                       t.type ="Singular or Pluralise"
+                       t.name=c
+                       @typos<< t
+               } 
+
+               self.common_misspellings.sort.uniq.each {|c|
+                       t=Typo.new
+                       t.type ="Common Misspelling"
+                       t.name=c
+                       @typos<< t
+               } 
+
+               self.vowel_swap.sort.uniq.each {|c|
+                       t=Typo.new
+                       t.type ="Vowel Swap"
+                       t.name=c
+                       @typos<< t
+               } 
+
+               self.homophones.sort.uniq.each {|c|
+                       t=Typo.new
+                       t.type ="Homophones"
+                       t.name=c
+                       @typos<< t
+               } 
+                       
+               self.bit_flipping.sort.uniq.each {|c|
+                       t=Typo.new
+                       t.type ="Bit Flipping"
+                       t.name=c
+                       @typos<< t
+               } 
+
+unless RUBY_VERSION =~ /^1.8/
+               self.homoglyphs.sort.uniq.each {|c|
+                       t=Typo.new
+                       t.type ="Homoglyphs"
+                       t.name=c
+                       @typos<< t
+               } 
+end
+
+               self.wrong_tld.sort.uniq.each {|c|
+                       t=Typo.new
+                       t.type ="Wrong TLD"
+                       t.name=c
+                       @typos<< t
+               } 
+
+               self.wrong_sld.sort.uniq.each {|c|
+                       t=Typo.new
+                       t.type ="Wrong SLD"
+                       t.name=c
+                       @typos<< t
+               } 
+
+               
+               # remove duplicate names
+               found=Hash.new(0);
+               @typos= @typos.select {|x| x if 1==found[x.name]+=1; }
+               # remove actual name
+               @typos.delete_if {|x| x.name == self.domain }
+               
+               @typos.each {|t|
+                       t.valid_name = TLD.valid_domain?(t.name)
+                       t.tld = TLD.tld(t.name)
+                       t.registered_name = TLD.registered_name(t.name)
+                       t.extension = TLD.extension(t.name)
+               }
+       end
+       
+       
+       def character_omission
+               (0..@domain.length-2).map {|i|  @domain[0..i].to_s + @domain[i+2..@domain.length] }
+       end
+       
+       def character_swap
+               (0..@domain.length-2).map {|i|
+                       d=@domain.split(//) #split string to chars
+                       d[i],d[i+1]=d[i+1],d[i] # swap array elements
+                       d.join #
+               }
+       end
+       
+       def character_replacement
+               kb=$keyboard
+               list=Array.new
+
+               (0..@domain.length-1).each {|i|         
+                       keyleft=kb.key_left(@domain[i..i])
+                       if !keyleft.nil?
+                               x=@domain.dup
+                               x[i]=keyleft
+                               list << x                       
+                       end
+               
+                       keyright=kb.key_right(@domain[i..i])
+                       if !keyright.nil?
+                               x=@domain.dup
+                               x[i]=keyright
+                               list << x
+                       end
+               }
+               list
+       end
+       
+       def double_character_replacement
+               kb=$keyboard
+               list=Array.new
+
+               (0..@domain.length-1).each {|i|
+                       if @domain[i..i] == @domain[i+1..i+1]
+                               keyleft=kb.key_left(@domain[i..i])
+                               if !keyleft.nil?
+                                       x=@domain.dup
+                                       x[i]=keyleft
+                                       x[i+1]=keyleft
+                                       list << x                       
+                               end
+               
+                               keyright=kb.key_right(@domain[i..i])
+                               if !keyright.nil?
+                                       x=@domain.dup
+                                       x[i]=keyright
+                                       x[i+1]=keyright
+                                       list << x
+                               end
+                               next
+                       end                     
+               }
+               list
+       end
+
+
+
+       def character_insertion
+               kb=$keyboard
+               list=Array.new
+               (0..@domain.length-1).each {|i|
+                       keyleft=kb.key_left(@domain[i..i])
+                       if !keyleft.nil?
+                               list << @domain[0..i] + keyleft + @domain[i+1..-1]
+                       
+                       end
+               
+                       list << @domain[0..i] + @domain[i..i] + @domain[i+1..-1]
+               
+                       keyright=kb.key_right(@domain[i..i])
+                       if !keyright.nil?
+                               list << @domain[0..i] + keyright + @domain[i+1..-1]
+                       end
+               }
+               list
+       end
+       
+       
+       
+       def missingdot
+               list=Array.new
+               # first add www to the domain like wwwyahoo.com
+               list << "www"+@domain
+               dotindex=0
+               while dotindex=@domain.index(".",dotindex+1) do
+                       domain_array=@domain.split(//)
+                       domain_array.delete_at(dotindex)
+                       list << domain_array.join
+               end
+               # if a domain doesn't have an extension, add .com like a webbrowser does
+               list.each {|d| d << ".com" if !d.include?(".") }
+       end
+       
+       
+       def stripdashes
+               [@domain.delete("-")]
+       end
+       
+       
+       def singular_or_pluralise
+               list= Array.new
+               list << ActiveSupport::Inflector.singularize(@registered_name)+"."+@extension.to_s
+               list << ActiveSupport::Inflector.pluralize(@registered_name)+"."+@extension.to_s
+               list.delete(@domain)
+               list
+       end
+       
+       def character_repeat    
+               (0..@domain.size-1).map {|x| @domain[0..x] + @domain[x].chr + @domain[x+1..-1] }
+       end
+
+
+       # unused
+       def popular_sld
+               reg_name = TLD.registered_name(@domain)
+               common_tlds = %w|co.uk com.au co.za |
+               common_tlds.map {|tld| [reg_name,tld].join(".") }       
+       end
+
+       def wrong_sld
+               if TLD.valid_sld?(@domain)
+                       reg_name = TLD.registered_name(@domain)
+                       TLD.cc(TLD.tld(@domain))['slds'].map {|x| [reg_name,x].join(".") }
+               else
+                       []
+               end
+       end
+
+       def common_misspellings
+               CommonMisspellings.dictionary.keys.select {|x| @domain.include?(x) }.map {|word|        
+                       @domain.gsub(word, CommonMisspellings.misspelling(word)) }
+       end
+
+       # swap the vowels, but never the first letter of the word
+       def vowel_swap
+               vowels = %w| a e i o u|
+               word=@domain
+               ord=word[1..-1];
+               (vowels.map {|x| vowels.map {|y| ord.gsub(x,y) }}.flatten.sort.uniq - [word]).map {|x| word.chars.first+x }
+       end
+
+       def homophones
+               Homophones.dictionary.keys.select {|x| @domain.include?(x) }.map {|word|
+                       Homophones.dictionary[word].map {|homophoneword| @domain.gsub(word,homophoneword) } }.flatten
+               
+       end
+
+       def bit_flipping
+               masks = [128,64,32,16,8,4,2,1]
+               allowed_chars = /[a-zA-Z0-9_\-\.]/
+
+               domains=[]
+               @domain.split(//).each_with_index do |c,i| 
+                       flipped = masks.map {|mask| (c[0].ord ^ mask).chr.downcase }.select {|x| x =~ allowed_chars }
+                       domains << flipped.map {|x| e=@domain.clone; e[i]=x; e }
+               end
+               domains.flatten!.sort!.uniq!
+               domains
+       end
+
+       def wrong_tld
+=begin
+.com   Commercial      4,860,000,000
+.org   Noncommercial   1,950,000,000
+.edu   US accredited postsecondary institutions        1,550,000,000
+.gov   United States Government        1,060,000,000
+.uk    United Kingdom  473,000,000
+.net   Network services        206,000,000
+.ca    Canada  165,000,000
+.de    Germany 145,000,000
+.jp     Japan  139,000,000
+.fr     France 96,700,000
+.au    Australia       91,000,000
+.us    United States   68,300,000
+.ru    Russian Federation      67,900,000
+.ch    Switzerland     62,100,000
+.it    Italy   55,200,000
+.nl    Netherlands     45,700,000
+.se    Sweden  39,000,000
+.no    Norway  32,300,000
+.es    Spain   31,000,000
+=end
+               reg_name = TLD.registered_name(@domain)
+               common_tlds = %w|com org edu uk net ca de jp fr au us ru ch it nl se no es|
+               common_tlds.map {|tld| [reg_name,tld].join(".") }       
+       end
+
+       
+       def replace_permutations(string,pattern,replacement)
+               permutations=[]
+               # how many times does pattern appear? it is n
+               n = string.scan(pattern).size
+               # generate perumations map for n times
+               map = [pattern,replacement].repeated_permutation(n).map
+
+               occurances = string.match(pattern)
+               # for each occurance of pattern, replace using the map
+               map.each do |mapset| 
+                       #puts mapset.inspect
+                       strsplit = string.split(pattern)
+                       mapset.each_with_index do |thisreplacement,i|
+                               #puts [i,thisreplacement].inspect
+                               strsplit[i] = strsplit[i] + thisreplacement
+                       end
+                       permutations << strsplit.join
+               end
+               permutations.flatten.sort.uniq - [string]
+       end
+
+
+       def homoglyphs
+               #https://en.wikipedia.org/wiki/Homoglyph
+               homoglyphs = {"0"=>"o", "1"=>"l", "l"=> "i", "rn" => "m", "cl"=>"d", "vv"=>"w" }
+               all_homoglyphs = homoglyphs.merge(homoglyphs.invert)
+               list=[]
+               all_homoglyphs.each_pair {|x,y|
+                       list << replace_permutations(@domain,x,y)
+               }
+               list.flatten.sort.uniq
+       end
+
+end
+
+
+def usage 
+print "URLCrazy version #{$VERSION}
+by Andrew Horton (urbanadventurer)
+http://www.morningstarsecurity.com/research/urlcrazy
+
+Generate and test domain typos and variations to detect and perform typo squatting, URL hijacking,
+phishing, and corporate espionage.
+
+Supports the following domain variations:
+Character omission, character repeat, adjacent character swap, adjacent character replacement, double 
+character replacement, adjacent character insertion, missing dot, strip dashes, singular or pluralise,
+common misspellings, vowel swaps, homophones, bit flipping (cosmic rays), homoglyphs, wrong top level 
+domain, and wrong second level domain.
+
+Usage: #{$0} [options] domain
+
+Options
+ -k, --keyboard=LAYOUT Options are: qwerty, azerty, qwertz, dvorak (default: qwerty)
+ -p, --popularity      Check domain popularity with Google
+ -r, --no-resolve      Do not resolve DNS
+ -i, --show-invalid    Show invalid domain names
+ -f, --format=TYPE     Human readable or CSV (default: human readable)
+ -o, --output=FILE     Output file
+ -h, --help            This help
+ -v, --version         Print version information. This version is #{$VERSION}
+
+"
+# -R, --only-resolve   Show only domain names that DNS resolve
+if RUBY_VERSION.to_f < 1.9
+       puts "Warning: You are using a Ruby version below 1.9. Some features are not available.\n\n"
+end
+
+end
+
+# send output to the screen, file, or both
+def puts_output(*s)
+       unless s.empty?
+               $output_filep.puts s.first if $output_filep
+               puts s.first
+       else
+               # as puts with no arguments
+               $output_filep.puts if $output_filep
+               puts
+       end
+end
+
+def print_output(s)
+       $output_filep.print s if $output_filep
+       print s
+end
+
+
+
+# -----------------------------------------------------------------
+check_popularity=false
+resolve_domains=true
+show_invalid=false
+show_only_resolve=false
+output_filename=nil
+$output_filep=nil
+keyboard_layout="qwerty"
+output_type="human"
+
+ opts = GetoptLong.new(
+      [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
+      [ '--keyboard','-k', GetoptLong::REQUIRED_ARGUMENT ],
+      [ '--no-resolve','-r', GetoptLong::NO_ARGUMENT ],
+      [ '--popularity','-p', GetoptLong::NO_ARGUMENT ],
+      [ '--show-invalid','-i', GetoptLong::NO_ARGUMENT ],
+      [ '--output','-o', GetoptLong::REQUIRED_ARGUMENT ],
+      [ '--format','-f', GetoptLong::REQUIRED_ARGUMENT ],
+      [ '--only-resolve','-R', GetoptLong::NO_ARGUMENT ],
+      [ '-v','--version', GetoptLong::NO_ARGUMENT ]
+    )
+
+begin
+ opts.each do |opt, arg|
+    case opt
+        when '--help','-h'
+                usage
+                exit
+        when '--keyboard','-k'
+                if ['qwerty','qwertz','dvorak','azerty'].include? arg.downcase
+                       keyboard_layout=arg.downcase
+               else
+                       puts "Error: Unknown keyboard layout: #{arg}"
+                       exit
+               end
+        when '--no-resolve','-r'
+                resolve_domains=false
+       when '--show-invalid','-i'
+                show_invalid=true
+       when '--only-resolve','-R'
+                show_only_resolve=true  
+        when '--popularity','-p'
+                check_popularity=true 
+        when '--format','-f'
+                output_type=arg.downcase
+               unless ["human","csv"].include?(output_type)
+                       puts "Invalid output type"
+                       exit 1
+               end
+        when '--output','-o'
+                output_filename=arg
+               begin
+                       $output_filep = File.new(output_filename,"w")                   
+               rescue
+                       puts "Cannot write to output file, #{output_filename}"
+                       exit 1
+               end
+        when '-V','--version'
+                puts $VERSION; exit
+    end
+ end
+rescue
+       puts
+       usage
+       exit
+end
+
+if ARGV.length < 1
+        usage
+        exit
+end
+
+$keyboard=Keyboard.new(keyboard_layout)
+
+d=Domainname.new(ARGV[0].downcase)
+abort "Aborting. Invalid domainname." unless d.valid == true
+
+abort "Aborting. Cannot show only domains that resolve when not resolving domains." if show_only_resolve and not resolve_domains
+
+if output_type=="human"
+       puts_output "URLCrazy Domain Report"
+       puts_output "Domain".ljust(10) +": #{d.domain}"
+       puts_output "Keyboard".ljust(10) +": #{keyboard_layout}"
+       puts_output "At".ljust(10) +": #{Time.now}"
+       puts_output
+end
+
+# initiate the country IP address DB
+Countrylookup.startup
+
+d.create_typos
+
+# output
+columns=Array.new
+widths=Array.new
+
+if output_type=="human"
+  headings=["Typo Type","Typo","Valid","Pop","DNS-A","CC-A","DNS-MX","Extn"]
+else
+  headings=["Typo Type","Typo","Valid","Pop","DNS-A","CC-A","Country-A","DNS-MX","Extn"]
+end
+(0..headings.size-1).each {|c| columns[c]=Array.new }
+
+# remove invalid hostnames
+if show_invalid==false
+       d.typos = d.typos.select {|x| x if x.valid_name }
+end
+
+puts_output "# Please wait. #{d.typos.size} hostnames to process\n\n" if output_type=="human"
+
+# resolve popularity faster with threads
+threads=[]
+d.typos.each {|typo|
+       threads << Thread.new(typo) {|thistypo|
+               typo.get_resolved if resolve_domains
+               thistypo.get_popularity if check_popularity
+       }
+}
+threads.each {|aThread| aThread.join }
+
+# make report
+d.typos.each {|typo|
+               columns[0] << typo.type.to_s
+               columns[1] << typo.name.to_s
+               columns[2] << typo.valid_name.to_s
+               columns[3] << (check_popularity == true ? typo.popularity.to_s : "?")
+               columns[4] << (resolve_domains == true ? typo.resolved_a.to_s : "?" )
+               columns[5] << (resolve_domains == true and typo.country_a ? typo.country_a.join(",") : "?" )
+               columns[6] << (resolve_domains == true ? typo.resolved_mx.to_s : "?" )
+               columns[7] << typo.extension.to_s
+}
+
+# trim unneeded columns
+unless show_invalid
+       headings -= ["Valid"] 
+       columns[2] = nil
+end
+unless check_popularity
+       headings -= ["Pop"]
+       columns[3] = nil
+end
+unless resolve_domains
+       headings -= ["DNS-A"] 
+       headings -= ["DNS-MX"]
+       columns[4] =nil
+       columns[5] =nil
+end
+headings.compact!
+columns.compact!
+
+# print report columns
+columns.each_with_index {|column,i|
+       widths[i]=((column.map {|row| row.nil? ? 0 : row.length } << headings[i].length).compact.sort[-1].to_i) + 2
+       print_output headings[i]
+       print_output " " * (widths[i] - headings[i].length) if output_type=="human"
+       print_output "," if output_type=="csv" and i < columns.size-1
+}
+puts_output
+puts_output widths.map {|w| "-" *w}.join if output_type=="human"
+
+# print rows
+columns[0].each_with_index {|row,i|
+       columns.each_with_index {|col,j|
+               print_output columns[j][i]
+               print_output " " * (widths[j]-columns[j][i].length) if output_type=="human"
+               print_output "," if output_type=="csv" and j < columns.size-1
+       }
+       puts_output
+}
+puts_output
+
+$output_filep.close if $output_filep
+