text: import os, sys
  
  FRIENDLY_TABLE_ADJS = {
    'a' : [
        "abstract",
        "academic",
        "accelerated",
        "accented",
        "accountant",
        "acquainted",
        "acute",
        "addicting",
        "addictive",
        "adjustable",
        "admired",
        "adult",
        "adverse",
        "advised",
        "aerosol",
        "afraid",
        "aggravated",
        "aggressive",
        "agreeable",
        "alienate",
        "aligned",
        "all-round",
        "alleged",
        "almond",
        "alright",
        "altruistic",
        "ambient",
        "ambivalent",
        "amiable",
        "amino",
        "amorphous",
        "amused",
        "anatomical",
        "ancestral",
        "angelic",
        "angrier",
        "answerable",
        "antiquarian",
        "antiretroviral",
        "appellate",
        "applicable",
        "apportioned",
        "approachable",
        "appropriated",
        "archer",
        "aroused",
        "arrested",
        "assertive",
        "assigned",
        "athletic",
        "atrocious",
        "attained",
        "authoritarian",
        "autobiographical",
        "avaricious",
        "avocado",
        "awake",
        "awesome" ],
  
      'b': [
        "backstage",
        "backwoods",
        "balding",
        "bandaged",
        "banded",
        "banned",
        "barreled",
        "battle",
        "beaten",
        "begotten",
        "beguiled",
        "bellied",
        "belted",
        "beneficent",
        "besieged",
        "betting",
        "big-money",
        "biggest",
        "biochemical",
        "bipolar",
        "blackened",
        "blame",
        "blessed",
        "blindfolded",
        "bloat",
        "blocked",
        "blooded",
        "blue-collar",
        "blushing",
        "boastful",
        "bolder",
        "bolstered",
        "bonnie",
        "bored",
        "boundary",
        "bounded",
        "bounding",
        "branched",
        "brawling",
        "brazen",
        "breeding",
        "bridged",
        "brimming",
        "brimstone",
        "broadest",
        "broiled",
        "broker",
        "bronze",
        "bruising",
        "buffy",
        "bullied",
        "bungling",
        "burial",
        "buttery" ],
  
      'c': [
        "candied",
        "canonical",
        "cantankerous",
        "cardinal",
        "carefree",
        "caretaker",
        "casual",
        "cathartic",
        "causal",
        "chapel",
        "characterized",
        "charcoal",
        "cheeky",
        "cherished",
        "chipotle",
        "chirping",
        "chivalrous",
        "circumstantial",
        "civic",
        "civil",
        "civilised",
        "clanking",
        "clapping",
        "claptrap",
        "classless",
        "cleansed",
        "cleric",
        "cloistered",
        "codified",
        "colloquial",
        "colour",
        "combat",
        "combined",
        "comely",
        "commissioned",
        "commonplace",
        "commuter",
        "commuting",
        "comparable",
        "complementary",
        "compromising",
        "conceding",
        "concentrated",
        "conceptual",
        "conditioned",
        "confederate",
        "confident",
        "confidential",
        "confining",
        "confuse",
        "congressional",
        "consequential",
        "conservative",
        "constituent",
        "contaminated",
        "contemporaneous",
        "contraceptive",
        "convertible",
        "convex",
        "cooked",
        "coronary",
        "corporatist",
        "correlated",
        "corroborated",
        "cosmic",
        "cover",
        "crash",
        "crypto",
        "culminate",
        "cushioned" ],
  
      'd': [
        "dandy",
        "dashing",
        "dazzled",
        "decreased",
        "decrepit",
        "dedicated",
        "defaced",
        "defective",
        "defenseless",
        "deluded",
        "deodorant",
        "departed",
        "depress",
        "designing",
        "despairing",
        "destitute",
        "detective",
        "determined",
        "devastating",
        "deviant",
        "devilish",
        "devoted",
        "diagonal",
        "dictated",
        "didactic",
        "differentiated",
        "diffused",
        "dirtier",
        "disabling",
        "disconnected",
        "discovered",
        "disdainful",
        "diseased",
        "disfigured",
        "disheartened",
        "disheveled",
        "disillusioned",
        "disparate",
        "dissident",
        "doable",
        "doctrinal",
        "doing",
        "dotted",
        "double-blind",
        "downbeat",
        "dozen",
        "draining",
        "draught",
        "dread",
        "dried",
        "dropped",
        "dulled",
        "duplicate" ],
  
      'e': [
        "eaten",
        "echoing",
        "economical",
        "elaborated",
        "elastic",
        "elective",
        "electoral",
        "elven",
        "embryo",
        "emerald",
        "emergency",
        "emissary",
        "emotional",
        "employed",
        "enamel",
        "encased",
        "encrusted",
        "endangered",
        "engraved",
        "engrossing",
        "enlarged",
        "enlisted",
        "enlivened",
        "ensconced",
        "entangled",
        "enthralling",
        "entire",
        "envious",
        "eradicated",
        "eroded",
        "esoteric",
        "essential",
        "evaporated",
        "ever-present",
        "evergreen",
        "everlasting",
        "exacting",
        "exasperated",
        "excess",
        "exciting",
        "executable",
        "existent",
        "exonerated",
        "exorbitant",
        "exponential",
        "export",
        "extraordinary",
        "exultant",
        "exulting" ],
  
      'f': [
        "facsimile",
        "fading",
        "fainter",
        "faith-based",
        "fallacious",
        "faltering",
        "famous",
        "fancier",
        "fast-growing",
        "fated",
        "favourable",
        "fearless",
        "feathered",
        "fellow",
        "fermented",
        "ferocious",
        "fiddling",
        "filling",
        "firmer",
        "fitted",
        "flammable",
        "flawed",
        "fledgling",
        "fleshy",
        "flexible",
        "flickering",
        "floral",
        "flowering",
        "flowing",
        "foggy",
        "folic",
        "foolhardy",
        "foolish",
        "footy",
        "forehand",
        "forked",
        "formative",
        "formulaic",
        "foul-mouthed",
        "fractional",
        "fragrant",
        "fraudulent",
        "freakish",
        "freckled",
        "freelance",
        "freight",
        "fresh",
        "fretted",
        "frugal",
        "fulfilling",
        "fuming",
        "funded",
        "funny" ],
  
      'g': [
        "garbled",
        "gathered",
        "geologic",
        "geometric",
        "gibberish",
        "gilded",
        "ginger",
        "glare",
        "glaring",
        "gleaming",
        "glorified",
        "glorious",
        "goalless",
        "gold-plated",
        "goody",
        "grammatical",
        "grande",
        "grateful",
        "gratuitous",
        "graven",
        "greener",
        "grinding",
        "grizzly",
        "groaning",
        "grudging",
        "guaranteed",
        "gusty" ],
  
      'h': [
        "half-breed",
        "hand-held",
        "handheld",
        "hands-off",
        "hard-pressed",
        "harlot",
        "healing",
        "healthier",
        "healthiest",
        "heart",
        "heart-shaped",
        "heathen",
        "hedonistic",
        "heralded",
        "herbal",
        "high-density",
        "high-performance",
        "high-res",
        "high-yield",
        "hissy",
        "hitless",
        "holiness",
        "homesick",
        "honorable",
        "hooded",
        "hopeless",
        "horrendous",
        "horrible",
        "hot-button",
        "huddled",
        "human",
        "humbling",
        "humid",
        "humiliating",
        "hypnotized" ],
  
      'i': [
        "idealistic",
        "idiosyncratic",
        "ignited",
        "illustrated",
        "illustrative",
        "imitated",
        "immense",
        "immersive",
        "immigrant",
        "immoral",
        "impassive",
        "impressionable",
        "improbable",
        "impulsive",
        "in-between",
        "in-flight",
        "inattentive",
        "inbound",
        "inbounds",
        "incalculable",
        "incomprehensible",
        "indefatigable",
        "indigo",
        "indiscriminate",
        "indomitable",
        "inert",
        "inflate",
        "inform",
        "inheriting",
        "injured",
        "injurious",
        "inking",
        "inoffensive",
        "insane",
        "insensible",
        "insidious",
        "insincere",
        "insistent",
        "insolent",
        "insufferable",
        "intemperate",
        "interdependent",
        "interesting",
        "interfering",
        "intern",
        "interpreted",
        "intersecting",
        "intolerable",
        "intolerant",
        "intuitive",
        "irresolute",
        "irritate" ],
  
      'j': [
        "jealous",
        "janky",
        "joining",
        "joint",
        "journalistic",
        "joyful"],
  
      'k': [
        "keyed",
        "knowing", "krusty", "kettle", "king", "kingly", "knightly", "knifey" ],
  
      'l': [
        "lacklustre",
        "laden",
        "lagging",
        "lamented",
        "laughable",
        "layered",
        "leather",
        "leathern",
        "leery",
        "left-footed",
        "legible",
        "leisure",
        "lessening",
        "liberating",
        "life-size",
        "lifted",
        "lightest",
        "limitless",
        "listening",
        "literary",
        "liver",
        "livid",
        "lobster",
        "locked",
        "long-held",
        "long-lasting",
        "long-running",
        "long-suffering",
        "loudest",
        "loveliest",
        "low-budget",
        "low-carb",
        "lowering",
        "lucid",
        "luckless",
        "lusty",
        "luxurious" ],
  
      'm': [
        "magazine",
        "maniac",
        "manmade",
        "maroon",
        "mastered",
        "mated",
        "material",
        "materialistic",
        "meaningful",
        "measuring",
        "mediaeval",
        "medical",
        "meditated",
        "medley",
        "melodic",
        "memorable",
        "memorial",
        "metabolic",
        "metallic",
        "metallurgical",
        "metering",
        "midair",
        "midterm",
        "midway",
        "mighty",
        "migrating",
        "mind-blowing",
        "mind-boggling",
        "minor",
        "mirrored",
        "misguided",
        "misshapen",
        "mitigated",
        "mixed",
        "modernized",
        "molecular",
        "monarch",
        "monastic",
        "morbid",
        "motley",
        "motorized",
        "mounted",
        "multi-million",
        "multidisciplinary",
        "muscled",
        "muscular",
        "muted",
        "mysterious",
        "mythic" ],
  
      'n': [
        "nail-biting",
        "natural",
        "nauseous",
        "negative",
        "networked",
        "neurological",
        "neutered",
        "newest",
        "night",
        "nitrous",
        "no-fly",
        "noncommercial",
        "nonsense",
        "north",
        "nuanced" ],
  
      'o': [
        "occurring",
        "offensive",
        "oldest",
        "oncoming",
        "one-eyed",
        "one-year",
        "onstage",
        "onward",
        "opaque",
        "open-ended",
        "operating",
        "opportunist",
        "opposing",
        "opt-in",
        "ordinate",
        "outdone",
        "outlaw",
        "outsized",
        "overboard",
        "overheated",
        "oversize",
        "overworked",
        "oyster" ],
  
      'p': [
        "paced",
        "panting",
        "paralyzed",
        "paramount",
        "parental",
        "parted",
        "partisan",
        "passive",
        "pastel",
        "patriot",
        "peacekeeping",
        "pedestrian",
        "peevish",
        "penal",
        "penned",
        "pensive",
        "perceptual",
        "perky",
        "permissible",
        "pernicious",
        "perpetuate",
        "perplexed",
        "pervasive",
        "petrochemical",
        "philosophical",
        "picturesque",
        "pillaged",
        "piped",
        "piquant",
        "pitching",
        "plausible",
        "pliable",
        "plumb",
        "politician",
        "polygamous",
        "poorest",
        "portmanteau",
        "posed",
        "positive",
        "possible",
        "postpartum",
        "prank",
        "pre-emptive",
        "precocious",
        "predicted",
        "premium",
        "preparatory",
        "prerequisite",
        "prescient",
        "preserved",
        "presidential",
        "pressed",
        "pressurized",
        "presumed",
        "prewar",
        "priced",
        "pricier",
        "primal",
        "primer",
        "primetime",
        "printed",
        "private",
        "problem",
        "procedural",
        "process",
        "prodigious",
        "professional",
        "programmed",
        "progressive",
        "prolific",
        "promising",
        "promulgated",
        "pronged",
        "proportionate",
        "protracted",
        "pulled",
        "pulsed",
        "purgatory" ],
  
      'q': [
        "quick", "quirky", "queer", "queen", "quality", "quilled" ],
  
      'r': [
        "rapid-fire",
        "raunchy",
        "razed",
        "reactive",
        "readable",
        "realizing",
        "recognised",
        "recovering",
        "recurrent",
        "recycled",
        "redeemable",
        "reflecting",
        "regal",
        "registering",
        "reliable",
        "reminiscent",
        "remorseless",
        "removable",
        "renewable",
        "repeating",
        "repellent",
        "reserve",
        "resigned",
        "respectful",
        "rested",
        "restrict",
        "resultant",
        "retaliatory",
        "retiring",
        "revelatory",
        "reverend",
        "reversing",
        "revolving",
        "ridiculous",
        "right-hand",
        "ringed",
        "risque",
        "robust",
        "roomful",
        "rotating",
        "roused",
        "rubber",
        "run-down",
        "running",
        "runtime",
        "rustling" ],
  
      's': [
        "safest",
        "salient",
        "sanctioned",
        "saute",
        "saved",
        "scandalized",
        "scarlet",
        "scattering",
        "sceptical",
        "scheming",
        "scoundrel",
        "scratched",
        "scratchy",
        "scrolled",
        "seated",
        "second-best",
        "segregated",
        "self-taught",
        "semiautomatic",
        "senior",
        "sensed",
        "sentient",
        "sexier",
        "shadowy",
        "shaken",
        "shaker",
        "shameless",
        "shaped",
        "shiny",
        "shipped",
        "shivering",
        "shoestring",
        "short",
        "short-lived",
        "signed",
        "simplest",
        "simplistic",
        "sizable",
        "skeleton",
        "skinny",
        "skirting",
        "skyrocketed",
        "slamming",
        "slanting",
        "slapstick",
        "sleek",
        "sleepless",
        "sleepy",
        "slender",
        "slimmer",
        "smacking",
        "smokeless",
        "smothered",
        "smouldering",
        "socialized",
        "solid-state",
        "sometime",
        "sought",
        "spanking",
        "sparing",
        "spattered",
        "specialized",
        "specific",
        "speedy",
        "spherical",
        "spiky",
        "spineless",
        "sprung",
        "squint",
        "stainless",
        "standing",
        "starlight",
        "startled",
        "stately",
        "statewide",
        "stereoscopic",
        "sticky",
        "stimulant",
        "stinky",
        "stoked",
        "stolen",
        "storied",
        "strained",
        "strapping",
        "strengthened",
        "stubborn",
        "stylized",
        "suave",
        "subjective",
        "subjugated",
        "subordinate",
        "succeeding",
        "suffering",
        "summary",
        "sunset",
        "sunshine",
        "supernatural",
        "supervisory",
        "supply-side",
        "surrogate",
        "suspended",
        "suspenseful",
        "swarthy",
        "sweating",
        "sweeping",
        "swinging",
        "swooning",
        "sympathize",
        "synchronized",
        "synonymous",
        "synthetic" ],
  
      't': [
        "tailed",
        "tallest",
        "tangible",
        "tanked",
        "tarry",
        "technical",
        "tectonic",
        "telepathic",
        "tenderest",
        "territorial",
        "testimonial",
        "theistic",
        "thicker",
        "threatening",
        "tight-lipped",
        "timed",
        "timely",
        "timid",
        "torrent",
        "totalled",
        "tougher",
        "traditional",
        "transformed",
        "trapped",
        "traveled",
        "traverse",
        "treated",
        "trial",
        "trunk",
        "trusting",
        "trying",
        "twisted",
        "two-lane",
        "tyrannical" ],
  
      'u': [
        "unaided",
        "unassisted",
        "unassuming",
        "unattractive",
        "uncapped",
        "uncomfortable",
        "uncontrolled",
        "uncooked",
        "uncooperative",
        "underground",
        "undersea",
        "undisturbed",
        "unearthly",
        "uneasy",
        "unequal",
        "unfazed",
        "unfinished",
        "unforeseen",
        "unforgivable",
        "unidentified",
        "unimaginative",
        "uninspired",
        "unintended",
        "uninvited",
        "universal",
        "unmasked",
        "unorthodox",
        "unparalleled",
        "unpleasant",
        "unprincipled",
        "unread",
        "unreasonable",
        "unregulated",
        "unreliable",
        "unremitting",
        "unsafe",
        "unsanitary",
        "unsealed",
        "unsuccessful",
        "unsupervised",
        "untimely",
        "unwary",
        "unwrapped",
        "uppity",
        "upstart",
        "useful",
        "useless",
        "utter",
          "utility",
          "unary" ],
  
      'v': [
        "valiant",
        "valid",
        "valued",
        "vanilla",
        "vaulting",
        "vaunted",
        "veering",
        "vegetative",
        "vented",
        "verbal",
        "verifying",
        "veritable",
        "versed",
        "vinyl",
        "virgin",
        "visceral",
        "visual",
        "voluptuous" ],
  
      'w': [
        "walk-on",
        "wanton",
        "warlike",
        "washed",
        "waterproof",
        "waved",
        "weakest",
        "well-bred",
        "well-chosen",
        "well-informed",
        "wetting",
        "wheeled",
        "whirlwind",
        "widen",
        "widening",
        "willful",
        "willing",
        "winnable",
        "winningest",
        "wireless",
        "wistful",
        "woeful",
        "wooded",
        "woodland",
        "wordless",
        "workable",
        "worldly",
        "worldwide",
        "worst-case",
        "worsted",
        "worthless" ],
  
      'x': [ 'xtra', 'xray', 'xenon', 'xeno', 'xerothermic' ],
      'y': [ 'yawning', 'yearly', 'yellow', 'young', 'yummy', 'yonder', 'yucky' ],
      'z': [ 'zany', 'zealous', 'zippy', 'zillion', 'zigzag', 'zygodactyl', 'zoic' ],
  
  '0' : [ "zero", "zed" ],
  '1' : [ "one" ],
  '2': ["two"],
  '3': ["three"],
  '4': ["four"],
  '5': ["five"],
  '6': ["six"],
  '7': ["seven"],
  '8': ["eight"],
  '9': ["nine"]
  }
  
  FRIENDLY_TABLE_NOUNS = {
      'a' : [
        "aardvark",
        "alligator",
        "alpaca",
        "antelope",
        "ape",
        "armadillo" ],
  
      'b' : [
        "baboon",
        "badger",
        "bat",
        "bear",
        "beaver",
        "bison",
        "boar",
        "buffalo",
        "bull" ],
  
      'c' : [
        "camel",
        "canary",
        "capybara",
        "cat",
        "chameleon",
        "cheetah",
        "chimpanzee",
        "chinchilla",
        "chipmunk",
        "cougar",
        "cow",
        "coyote",
        "crocodile",
        "crow" ],
  
  'd' : [
        "deer",
        "dingo",
        "dog",
        "donkey",
        "dromedary" ],
  
  'e' : [
        "elephant",
        "elk",
        "ewe" ],
  
  'f' : [
        "ferret",
        "finch",
        "fish",
        "fox",
        "frog" ],
  
  'g' : [
        "gazelle",
        "gila monster",
        "giraffe",
        "gnu",
        "goat",
        "gopher",
        "gorilla",
        "grizzly bear",
        "ground hog",
        "guinea pig" ],
  
  'h' : [
        "hamster",
        "hedgehog",
        "hippopotamus",
        "hog",
        "horse",
        "hyena" ],
  
  'i' : [
        "ibex",
        "iguana",
        "impala" ],
  
  'j' : [
        "jackal", "jaguar", "jackrabbit", "jay", "jellyfish", "jerboa" ],
  
  'k' : [
        "kangaroo",
        "koala", "kiwi", "kingfisher", "koa", "kookaburra", "krill" ],
  
  'l' : [
        "lamb",
        "lemur",
        "leopard",
        "lion",
        "lizard",
        "llama",
        "lynx" ],
  
  'm' : [
        "mandrill",
        "marmoset",
        "mink",
        "mole",
        "mongoose",
        "monkey",
        "moose",
        "mountain goat",
        "mouse",
        "mule",
        "muskrat",
        "mustang",
        "mynah bird"],
  
  'n' : [
        "newt",
        "narwhal", "nutria",
        "nightingale"],
  
  'o' : [
        "ocelot",
        "opossum",
        "orangutan",
        "oryx",
        "otter",
        "ox" ],
  
  'p' : [
        "panda",
        "panther",
        "parakeet",
        "parrot",
        "pig",
        "platypus",
        "polar bear",
        "porcupine",
        "porpoise",
        "prairie dog",
        "puma" ],
  
  'q' : [ "quail", "quokka" ],
  
  'r' : [
        "rabbit",
        "raccoon",
        "ram",
        "rat",
        "reindeer",
        "reptile",
        "rhinoceros" ],
  
  's' : [
        "salamander",
        "seal",
        "sheep",
        "shrew",
        "silver fox",
        "skunk",
        "sloth",
        "snake",
        "squirrel"],
  
  't' : [
        "tapir",
        "tiger",
        "toad",
        "turtle" ],
  'u' : [ "unicorn", "urchin", "umbrella" ],
  'v' : [ "vulture", "vicuna", "viper", "vole", "vampire" ],
  
  'w' : [
        "walrus",
        "warthog",
        "weasel",
        "whale",
        "wildcat",
        "wolf",
        "wolverine",
        "wombat",
        "woodchuck" ],
  
  'x' : [ "xylophone", "xenopus", "xerus", "xenops" ],
  
  'y' : [ "yak", "yellowjacket", "yabby" ],
  
  'z' : [ "zebra", "zebu", "zonkey", "zorilla" ],
  
  '0' : [ "zero", "zed" ],
  '1' : [ "one" ],
  '2': ["two"],
  '3': ["three"],
  '4': ["four"],
  '5': ["five"],
  '6': ["six"],
  '7': ["seven"],
  '8': ["eight"],
  '9': ["niner"],
  }
  
  def _buildNameFromList( NAME_TABLE, idchar1, idchar2 ):
  
      ndx1 = ord(idchar2.lower() )
      nameKey = idchar1.lower()
  
      friendlyNameList = NAME_TABLE[ nameKey ]
      friendlyName = friendlyNameList[ ndx1 % len(friendlyNameList) ]
  
      if idchar1.isupper():
        friendlyName = friendlyName.capitalize()
  
      return friendlyName
  
  
  def friendlyName( idstr ):
  
      while len(idstr) < 4:
          idstr += 'a'
  
      friendlyAdj = _buildNameFromList( FRIENDLY_TABLE_ADJS, idstr[0], idstr[2] )
      friendlyAnimal = _buildNameFromList( FRIENDLY_TABLE_NOUNS, idstr[1], idstr[2] )
  
      id =  friendlyAdj + " " + friendlyAnimal
      id = id.replace( " ", "-" )
      result = id + "-" +idstr[:4]
  
      return result
  
  