commit 797ba68bc1ed3a4cfe94352652822ea16cde0e8d Author: Brian Lycett Date: Fri Jun 1 17:10:45 2018 +0100 Initial functioning version, pre-docker. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8c98bbd --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +A PHP GUI admin interface for LDAP account management, designed to be run in a container. diff --git a/change_password/README.md b/change_password/README.md new file mode 100644 index 0000000..22160b4 --- /dev/null +++ b/change_password/README.md @@ -0,0 +1 @@ +Password strength progress taken from https://github.com/martinwnet/zxcvbn-bootstrap-strength-meter diff --git a/change_password/index.php b/change_password/index.php new file mode 100644 index 0000000..9c84bd3 --- /dev/null +++ b/change_password/index.php @@ -0,0 +1,117 @@ + +
+

Your password has been changed.

+
+ +
+

The password wasn't strong enough.

+
+ +
+

The password contained invalid characters.

+
+ +
+

The passwords didn't match.

+
+ + + + + + +
+
+ +
+
Change password
+
+ +
+ + + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ +
+ +
+ +
+ +
+
+
+ +
+
+ +
+
+ + diff --git a/includes/config.inc.php b/includes/config.inc.php new file mode 100644 index 0000000..dd01641 --- /dev/null +++ b/includes/config.inc.php @@ -0,0 +1,72 @@ +

LDAP_URI isn't set

\n"; + } + if (empty($LDAP['base_dn'])) { + $errors .= "

LDAP_BASE_DN isn't set

\n"; + } + if (empty($LDAP['admin_bind_dn'])) { + $errors .= "

LDAP_ADMIN_BIND_DN isn't set

\n"; + } + if (empty($LDAP['admin_bind_pwd'])) { + $errors .= "

LDAP_ADMIN_BIND_PWD isn't set

\n"; + } + if (empty($LDAP['admins_group'])) { + $errors .= "

LDAP_ADMINS_GROUP isn't set

\n"; + } + + if ($errors != "") { + render_header(); + print $errors; + render_footer(); + exit(1); + } + + #POSIX accounts + $min_uid = 2000; + $min_gid = 2000; + + +?> diff --git a/includes/ldap_functions.inc.php b/includes/ldap_functions.inc.php new file mode 100644 index 0000000..4168eb2 --- /dev/null +++ b/includes/ldap_functions.inc.php @@ -0,0 +1,601 @@ + $this_id) { $this_id = $record[$record_attribute][0]; } + } + } + + } + + return($this_id); + +} + + +################################## + + +function ldap_get_group_list($ldap_connection,$start=0,$entries=NULL,$sort="asc",$filters=NULL) { + + global $log_prefix, $LDAP; + + $ldap_search = ldap_search($ldap_connection, "${LDAP['group_dn']}", "(&(objectclass=*)$filters)"); + + $result = ldap_get_entries($ldap_connection, $ldap_search); + + $records = array(); + foreach ($result as $record) { + + if (isset($record['cn'][0])) { + + array_push($records, $record['cn'][0]); + + } + } + + if ($sort == "asc") { sort($records); } else { rsort($records); } + + return(array_slice($records,$start,$entries)); + + +} + + +################################## + +function ldap_get_group_members($ldap_connection,$group_name,$start=0,$entries=NULL,$sort="asc") { + + global $log_prefix, $LDAP; + + $ldap_search = ldap_search($ldap_connection, "${LDAP['group_dn']}", "(cn=$group_name)", array($LDAP['group_membership_attribute'])); + + $result = ldap_get_entries($ldap_connection, $ldap_search); + + $records = array(); + foreach ($result[0][$LDAP['group_membership_attribute']] as $record => $value) { + + if ($record != 'count' and isset($value)) { + array_push($records, $value); + } + } + + if ($sort == "asc") { sort($records); } else { rsort($records); } + + return(array_slice($records,$start,$entries)); + + +} + + +################################## + +function ldap_is_group_member($ldap_connection,$group_name,$username) { + + global $log_prefix, $LDAP; + + $ldap_search = ldap_search($ldap_connection, "${LDAP['group_dn']}", "(cn=$group_name)"); + $result = ldap_get_entries($ldap_connection, $ldap_search); + + if ($LDAP['group_membership_uses_uid'] == FALSE) { + $username = "${LDAP['account_attribute']}=$username,${LDAP['user_dn']}"; + } + + if (preg_grep ("/^${username}$/i", $result[0][$LDAP['group_membership_attribute']])) { + return TRUE; + } + else { + return FALSE; + } + +} + + +################################## + +function ldap_new_group($ldap_connection,$group_name) { + + global $log_prefix, $LDAP; + + if (isset($group_name)) { + + $ldap_search = ldap_search($ldap_connection, "${LDAP['group_dn']}", "(cn=$group_name,${LDAP['group_dn']})"); + $result = ldap_get_entries($ldap_connection, $ldap_search); + + if ($result['count'] == 0) { + + $highest_gid = ldap_get_highest_id($ldap_connection,'gid'); + $new_gid = $highest_gid + 1; + + $add_group = ldap_add($ldap_connection, + "cn=$group_name,${LDAP['group_dn']}", + array( 'objectClass' => array( 'top', 'groupOfUniqueNames', 'posixGroup' ), + 'cn' => $group_name, + 'gidNumber' => $new_gid, + $LDAP['group_membership_attribute'] => '' + ) + ); + + if ($add_group) { + error_log("$log_prefix Added new group $group_name",0); + $update_gid = ldap_mod_replace($ldap_connection, "cn=lastGID,${LDAP['base_dn']}", array( 'serialNumber' => $new_gid )); + if ($update_gid) { + error_log("$log_prefix Updated cn=lastGID with $new_gid",0); + return TRUE; + } + else { + error_log("$log_prefix Failed to update cn=lastGID",0); + } + } + + } + else { + error_log("$log_prefix Create group; group $group_name already exists.",0); + } + } + else { + error_log("$log_prefix Create group; group name wasn't set.",0); + } + + return FALSE; + +} + + +################################## + +function ldap_delete_group($ldap_connection,$group_name) { + + global $log_prefix, $LDAP; + + if (isset($group_name)) { + + $delete = ldap_delete($ldap_connection, "cn=$group_name,${LDAP['group_dn']}"); + + if ($delete) { + error_log("$log_prefix Deleted group $group_name",0); + return TRUE; + } + else { + error_log("$log_prefix Couldn't delete group $group_name",0); + return FALSE; + } + + } + +} + + +################################## + +function ldap_get_gid_of_group($ldap_connection,$group_name) { + + global $log_prefix, $LDAP; + + if (isset($group_name)) { + + $ldap_search = ldap_search($ldap_connection, "${LDAP['group_dn']}", "(cn=$group_name)", array("gidNumber")); + $result = ldap_get_entries($ldap_connection, $ldap_search); + + if (isset($result[0]['gidnumber'][0]) and is_numeric($result[0]['gidnumber'][0])) { + return $result[0]['gidnumber'][0]; + } + + } + + return FALSE; + +} + + +################################## + +function ldap_new_account($ldap_connection,$first_name,$last_name,$username,$password) { + + global $log_prefix, $LDAP, $DEFAULT_USER_SHELL, $DEFAULT_USER_GROUP, $EMAIL_DOMAIN; + + if (isset($first_name) and isset($last_name) and isset($username) and isset($password)) { + + $ldap_search = ldap_search($ldap_connection, "${LDAP['user_dn']}", "(${LDAP['account_attribute']}=$username,${LDAP['user_dn']})"); + $result = ldap_get_entries($ldap_connection, $ldap_search); + + if ($result['count'] == 0) { + + $highest_uid = ldap_get_highest_id($ldap_connection,'uid'); + $new_uid = $highest_uid + 1; + + $default_gid = ldap_get_gid_of_group($ldap_connection,$DEFAULT_USER_GROUP); + + if (!is_numeric($default_gid)) { + $group_add = ldap_new_group($ldap_connection,$username); + $gid = ldap_get_gid_of_group($ldap_connection,$username); + $add_to_group = $username; + } + else { + $gid = $default_gid; + $add_to_group = $DEFAULT_USER_GROUP; + } + + $hashed_pass = ldap_hashed_password($password); + + $user_info = array( 'objectClass' => array( 'person', 'inetOrgPerson', 'posixAccount' ), + 'uid' => $username, + 'givenName' => $first_name, + 'sn' => $last_name, + 'cn' => "$first_name $last_name", + 'displayName' => "$first_name $last_name", + 'uidNumber' => $new_uid, + 'gidNumber' => $gid, + 'loginShell' => $DEFAULT_USER_SHELL, + 'homeDirectory' => "/home/$username", + 'userPassword' => $hashed_pass + ); + + if (isset($EMAIL_DOMAIN)) { + array_push($user_info, ['mail' => "$username@$EMAIL_DOMAIN"]); + } + + $add_account = ldap_add($ldap_connection, + "${LDAP['account_attribute']}=$username,${LDAP['user_dn']}", + $user_info + ); + + if ($add_account) { + error_log("$log_prefix Created new account: $username",0); + ldap_add_member_to_group($ldap_connection,$add_to_group,$username); + $update_uid = ldap_mod_replace($ldap_connection, "cn=lastUID,${LDAP['base_dn']}", array( 'serialNumber' => $new_uid )); + if ($update_uid) { + error_log("$log_prefix Create account; Updated cn=lastUID with $new_uid",0); + return TRUE; + } + else { + error_log("$log_prefix Create account; Failed to update cn=lastUID",0); + } + + } + else { + error_log("$log_prefix Create account; couldn't create the account for $username",0); + } + + } + else { + error_log("$log_prefix Create account; Account for $username already exists",0); + } + + } + else { + error_log("$log_prefix Create account; missing parameters",0); + } + + + return FALSE; + +} + + +################################## + +function ldap_delete_account($ldap_connection,$username) { + + global $log_prefix, $LDAP; + + if (isset($username)) { + + $delete = ldap_delete($ldap_connection, "${LDAP['account_attribute']}=$username,${LDAP['user_dn']}"); + + if ($delete) { + error_log("$log_prefix Deleted account for $username",0); + return TRUE; + } + else { + error_log("$log_prefix Couldn't delete account for $username",0); + return FALSE; + } + + } + +} + + +################################## + +function ldap_add_member_to_group($ldap_connection,$group_name,$username) { + + global $log_prefix, $LDAP; + + $group_dn = "cn=${group_name},${LDAP['group_dn']}"; + + if ($LDAP['group_membership_uses_uid'] == FALSE) { + $username = "${LDAP['account_attribute']}=$username,${LDAP['user_dn']}"; + } + + $group_update = array($LDAP['group_membership_attribute'] => $username); + $update = ldap_mod_add($ldap_connection,$group_dn,$group_update); + + if ($update) { + error_log("$log_prefix Added $username to $group_name",0); + return TRUE; + } + else { + error_log("$log_prefix Couldn't add $username to $group_name",0); + return FALSE; + } + +} + + +################################## + +function ldap_delete_member_from_group($ldap_connection,$group_name,$username) { + + global $log_prefix, $LDAP; + + $group_dn = "cn=${group_name},${LDAP['group_dn']}"; + + if ($LDAP['group_membership_uses_uid'] == FALSE) { + $username = "${LDAP['account_attribute']}=$username,${LDAP['user_dn']}"; + } + + $group_update = array($LDAP['group_membership_attribute'] => $username); + $update = ldap_mod_del($ldap_connection,$group_dn,$group_update); + + if ($update) { + error_log("$log_prefix Removed $username from $group_name",0); + return TRUE; + } + else { + error_log("$log_prefix Couldn't remove $username from $group_name",0); + return FALSE; + } + +} + + +################################## + +function ldap_change_password($ldap_connection,$username,$new_password) { + + global $log_prefix, $LDAP; + + #Find DN of user + + $ldap_search = ldap_search( $ldap_connection, $LDAP['base_dn'], "${LDAP['account_attribute']}=${username}"); + if ($ldap_search) { + $result = ldap_get_entries($ldap_connection, $ldap_search); + if ($result["count"] == 1) { + $this_dn=$result[0]['dn']; + } + else { + error_log("$log_prefix Couldn't find the DN for user $username"); + return FALSE; + } + } + else { + error_log("$log_prefix Couldn't perform an LDAP search for ${LDAP['account_attribute']}=${username}",0); + return FALSE; + } + + #Hash password + + $hashed_pass = ldap_hashed_password($new_password); + + $entries["userPassword"] = $new_password; + $update = ldap_mod_replace($ldap_connection, $this_dn, $entries); + + if ($update) { + error_log("$log_prefix Updated the password for $username"); + return TRUE; + } + else { + error_log("$log_prefix Couldn't update the password for $username"); + return TRUE; + } + +} + + +?> diff --git a/includes/modules.inc.php b/includes/modules.inc.php new file mode 100644 index 0000000..ec3e2ef --- /dev/null +++ b/includes/modules.inc.php @@ -0,0 +1,17 @@ + 'hidden_on_login', + 'change_password' => 'auth', + 'ldap_manager' => 'admin', + 'log_out' => 'auth' + ); + +?> diff --git a/includes/web_functions.inc.php b/includes/web_functions.inc.php new file mode 100644 index 0000000..864aacb --- /dev/null +++ b/includes/web_functions.inc.php @@ -0,0 +1,362 @@ + + + + <?php print "$title"; ?> + + + + + + + + + + + + + + + function check_entity_name_validity(name,div_id) { + + var check_regex = /$USERNAME_REGEX/; + + if (! check_regex.test(name) ) { + document.getElementById(div_id).classList.add("has-error"); + } + else { + document.getElementById(div_id).classList.remove("has-error"); + } + + } + + +EoCheckJS; + +} + + +###################################################### + +function render_js_username_generator($firstname_field_id,$lastname_field_id,$username_field_id,$username_div_id) { + + #Parameters are the IDs of the input fields and username name div in the account creation form. + #The div will be set to warning if the username is invalid. + + global $USERNAME_FORMAT, $USERNAME_REGEX; + + render_js_username_check(); + + print << + + function update_username() { + + var first_name = document.getElementById('$firstname_field_id').value; + var last_name = document.getElementById('$lastname_field_id').value; + var template = '$USERNAME_FORMAT'; + + var actual_username = template; + + actual_username = actual_username.replace('{first_name}', first_name.toLowerCase() ); + actual_username = actual_username.replace('{first_initial}', first_name.charAt(0).toLowerCase() ); + actual_username = actual_username.replace('{last_name}', last_name.toLowerCase() ); + actual_username = actual_username.replace('{last_initial}', last_name.charAt(0).toLowerCase() ); + + check_entity_name_validity(actual_username,'$username_div_id'); + + document.getElementById('$username_field_id').value = actual_username; + + } + +EoRenderJS; + +} + + +?> diff --git a/index.php b/index.php new file mode 100644 index 0000000..8a87d48 --- /dev/null +++ b/index.php @@ -0,0 +1,32 @@ + +
+

You've been automatically logged out because you've been inactive for over + minutes. Click on the 'Log in' link to get back into the system.

+
+ +
+

You're logged in. Select from the menu above.

+
+ +
+

You don't have the necessary permissions needed to use this module.

+
+ diff --git a/js/generate_passphrase.js b/js/generate_passphrase.js new file mode 100644 index 0000000..a6b6c58 --- /dev/null +++ b/js/generate_passphrase.js @@ -0,0 +1,71 @@ +'use strict'; + +//Adapted from https://github.com/mike-hearn/useapassphrase + +function generatePassword(numberOfWords,seperator,passwordField,confirmField) { + + // IDs of password field and confirm field + var passwordField = document.getElementById(passwordField); + var confirmField = document.getElementById(confirmField); + + // Cryptographically generated random numbers + numberOfWords = parseInt(numberOfWords); + + var array = new Uint32Array(numberOfWords); + var crypto = window.crypto || window.msCrypto; + crypto.getRandomValues(array); + + // Empty array to be filled with wordlist + var generatedPasswordArray = []; + + var integerIndex = getRandomInt(4); + var integerValue = getRandomInt(99); + + var uppercaseIndex = getRandomInt(4); + while (uppercaseIndex == integerIndex) { + uppercaseIndex = getRandomInt(4); + } + + // Grab a random word, push it to the password array + for (var i = 0; i < array.length; i++) { + + var this_word = ""; + + if (i == integerIndex ) { + + this_word = integerValue; + + } + else { + + var index = (array[i] % 5852); + this_word = wordlist[index]; + + if (i == uppercaseIndex) { + this_word = this_word[0].toUpperCase() + this_word.slice(1); + } + + } + + generatedPasswordArray.push(this_word); + } + + var this_password = generatedPasswordArray.join(seperator); + + passwordField.type = 'text'; + passwordField.value = this_password; + + confirmField.type = 'text'; + confirmField.value = this_password; + + //Copy to the clipboard + passwordField.focus(); + passwordField.select(); + document.execCommand("copy"); + +} + + +function getRandomInt(max) { + return Math.floor(Math.random() * Math.floor(max)); +} diff --git a/js/wordlist.js b/js/wordlist.js new file mode 100644 index 0000000..a4c6c44 --- /dev/null +++ b/js/wordlist.js @@ -0,0 +1,5839 @@ +var wordlist = [ + 'a', + 'b', + 'c', + 'd', + 'e', + 'f', + 'g', + 'h', + 'i', + 'j', + 'k', + 'l', + 'm', + 'n', + 'o', + 'p', + 'q', + 'r', + 's', + 't', + 'u', + 'v', + 'w', + 'x', + 'y', + 'z', + 'al', + 'am', + 'an', + 'as', + 'at', + 'be', + 'by', + 'cc', + 'cd', + 'cm', + 'co', + 'ed', + 'go', + 'he', + 'hp', + 'id', + 'if', + 'in', + 'is', + 'it', + 'ma', + 'ny', + 'of', + 'oh', + 'ok', + 'on', + 'or', + 'to', + 'tv', + 'uk', + 'un', + 'up', + 'us', + 'vs', + 'we', + 'ado', + 'aft', + 'age', + 'aid', + 'aim', + 'arb', + 'aww', + 'aye', + 'bag', + 'bib', + 'bio', + 'biz', + 'bog', + 'bow', + 'bum', + 'buy', + 'cat', + 'cob', + 'con', + 'coy', + 'cry', + 'cub', + 'dam', + 'dba', + 'doe', + 'dud', + 'due', + 'dun', + 'ebb', + 'elm', + 'far', + 'fax', + 'fen', + 'fez', + 'fig', + 'fit', + 'fix', + 'flu', + 'fly', + 'foe', + 'fog', + 'gay', + 'git', + 'guy', + 'gym', + 'hat', + 'haw', + 'hen', + 'her', + 'hie', + 'his', + 'hog', + 'hot', + 'hum', + 'icy', + 'ill', + 'ire', + 'irk', + 'jab', + 'jar', + 'jot', + 'lap', + 'law', + 'lax', + 'lay', + 'lea', + 'lik', + 'lip', + 'lot', + 'lug', + 'lye', + 'map', + 'may', + 'men', + 'mil', + 'mop', + 'mug', + 'nap', + 'nay', + 'net', + 'nil', + 'nit', + 'not', + 'nub', + 'oar', + 'ode', + 'off', + 'oil', + 'oke', + 'orb', + 'ore', + 'out', + 'par', + 'pat', + 'pec', + 'peg', + 'per', + 'pig', + 'pin', + 'pro', + 'pyx', + 'ram', + 'rap', + 'rat', + 'raw', + 'rec', + 'rig', + 'rip', + 'rue', + 'rut', + 'sac', + 'sad', + 'sap', + 'say', + 'set', + 'sir', + 'sit', + 'sky', + 'sly', + 'sop', + 'sow', + 'spy', + 'sue', + 'tan', + 'tax', + 'tea', + 'tee', + 'thy', + 'tic', + 'too', + 'top', + 'toy', + 'tug', + 'ugh', + 'vet', + 'vie', + 'vow', + 'wad', + 'way', + 'wed', + 'wee', + 'wry', + 'yaw', + 'yen', + 'yin', + 'yon', + 'you', + 'yum', + 'zip', + 'able', + 'acid', + 'acts', + 'adds', + 'aged', + 'ages', + 'aide', + 'aids', + 'aims', + 'alan', + 'alex', + 'ally', + 'also', + 'alto', + 'amid', + 'andy', + 'anne', + 'ansi', + 'aoun', + 'arab', + 'area', + 'ariz', + 'arms', + 'army', + 'arts', + 'asia', + 'asks', + 'auto', + 'away', + 'axis', + 'baby', + 'back', + 'bags', + 'bail', + 'ball', + 'band', + 'bank', + 'bars', + 'base', + 'bass', + 'bays', + 'bcci', + 'beam', + 'bear', + 'beat', + 'beds', + 'beef', + 'been', + 'beer', + 'bell', + 'belt', + 'best', + 'beta', + 'bias', + 'bids', + 'bill', + 'bios', + 'bird', + 'bits', + 'blew', + 'bloc', + 'blow', + 'blue', + 'blvd', + 'boat', + 'body', + 'bold', + 'bomb', + 'bond', + 'bone', + 'bonn', + 'book', + 'boom', + 'boot', + 'born', + 'boss', + 'both', + 'bowl', + 'boys', + 'bugs', + 'bulk', + 'bull', + 'burn', + 'bush', + 'busy', + 'buys', + 'byrd', + 'byte', + 'call', + 'calm', + 'came', + 'camp', + 'cans', + 'cape', + 'capt', + 'card', + 'care', + 'carl', + 'cars', + 'case', + 'cash', + 'cast', + 'cell', + 'cent', + 'chip', + 'cics', + 'cite', + 'city', + 'clip', + 'club', + 'cmos', + 'coal', + 'code', + 'coke', + 'cold', + 'cole', + 'come', + 'conn', + 'cook', + 'cool', + 'cope', + 'copy', + 'core', + 'corn', + 'corp', + 'cost', + 'coup', + 'cpus', + 'cray', + 'crew', + 'crop', + 'cruz', + 'cuba', + 'curb', + 'cure', + 'cuts', + 'dale', + 'dark', + 'data', + 'date', + 'dave', + 'dawn', + 'days', + 'dbms', + 'dead', + 'deal', + 'dean', + 'debt', + 'deck', + 'deep', + 'dell', + 'deng', + 'deny', + 'desk', + 'dial', + 'dick', + 'died', + 'diet', + 'dirt', + 'disc', + 'disk', + 'does', + 'dogs', + 'dole', + 'done', + 'door', + 'dose', + 'dots', + 'doug', + 'down', + 'drag', + 'dram', + 'draw', + 'drew', + 'drop', + 'drug', + 'drum', + 'dual', + 'duke', + 'dumb', + 'dump', + 'dust', + 'duty', + 'each', + 'earn', + 'ease', + 'east', + 'easy', + 'edge', + 'edit', + 'eggs', + 'eisa', + 'else', + 'ends', + 'eric', + 'esdi', + 'even', + 'ever', + 'exit', + 'expo', + 'eyes', + 'face', + 'fact', + 'fail', + 'fair', + 'fall', + 'fans', + 'fare', + 'farm', + 'fast', + 'fate', + 'fddi', + 'fdic', + 'fear', + 'feed', + 'feel', + 'fees', + 'feet', + 'fell', + 'felt', + 'figs', + 'file', + 'fill', + 'film', + 'find', + 'fine', + 'fire', + 'firm', + 'fish', + 'fits', + 'five', + 'flag', + 'flat', + 'fled', + 'flee', + 'flew', + 'flow', + 'flux', + 'font', + 'food', + 'foot', + 'ford', + 'form', + 'fort', + 'four', + 'fred', + 'free', + 'from', + 'fuel', + 'full', + 'fund', + 'gain', + 'game', + 'gang', + 'gary', + 'gate', + 'gave', + 'gaza', + 'gear', + 'gene', + 'gets', + 'gift', + 'girl', + 'give', + 'glad', + 'goal', + 'goes', + 'gold', + 'golf', + 'gone', + 'good', + 'gore', + 'grab', + 'gray', + 'greg', + 'grew', + 'grid', + 'grip', + 'grow', + 'gulf', + 'guns', + 'guys', + 'hair', + 'half', + 'hall', + 'halt', + 'hand', + 'hang', + 'hard', + 'harm', + 'hart', + 'hate', + 'have', + 'hdtv', + 'head', + 'hear', + 'heat', + 'held', + 'hell', + 'help', + 'here', + 'hero', + 'hide', + 'high', + 'hill', + 'hire', + 'hits', + 'hold', + 'hole', + 'home', + 'hong', + 'hook', + 'hope', + 'host', + 'hour', + 'hubs', + 'huge', + 'hung', + 'hunt', + 'hurt', + 'icon', + 'idea', + 'idle', + 'ieee', + 'inch', + 'into', + 'ions', + 'iowa', + 'iran', + 'iraq', + 'iron', + 'isdn', + 'item', + 'ivan', + 'jack', + 'jail', + 'jane', + 'jazz', + 'jean', + 'jeff', + 'jets', + 'jews', + 'joan', + 'jobs', + 'joel', + 'john', + 'join', + 'joke', + 'jose', + 'juan', + 'july', + 'jump', + 'june', + 'junk', + 'jury', + 'just', + 'keen', + 'keep', + 'kemp', + 'kent', + 'kept', + 'keys', + 'kick', + 'kids', + 'kill', + 'kind', + 'king', + 'kits', + 'knee', + 'knew', + 'know', + 'koch', + 'kohl', + 'kong', + 'labs', + 'lack', + 'lady', + 'laid', + 'lake', + 'land', + 'lane', + 'lans', + 'last', + 'late', + 'lawn', + 'laws', + 'lead', + 'leak', + 'lean', + 'leap', + 'left', + 'legs', + 'lend', + 'leon', + 'less', + 'lets', + 'levy', + 'lies', + 'life', + 'lift', + 'like', + 'lima', + 'line', + 'link', + 'lisa', + 'list', + 'live', + 'load', + 'loan', + 'lock', + 'logo', + 'logs', + 'long', + 'look', + 'loop', + 'lord', + 'lose', + 'loss', + 'lost', + 'lots', + 'loud', + 'love', + 'lows', + 'lsqb', + 'luck', + 'luis', + 'lung', + 'lure', + 'lynn', + 'macs', + 'made', + 'mail', + 'main', + 'make', + 'male', + 'mall', + 'many', + 'maps', + 'mark', + 'mary', + 'mask', + 'mass', + 'mate', + 'math', + 'meal', + 'mean', + 'meat', + 'meet', + 'memo', + 'menu', + 'merc', + 'mere', + 'mesa', + 'mess', + 'mice', + 'mich', + 'mike', + 'mild', + 'mile', + 'milk', + 'mill', + 'mind', + 'mine', + 'minn', + 'mips', + 'miss', + 'mode', + 'mood', + 'moon', + 'more', + 'most', + 'move', + 'much', + 'must', + 'name', + 'nasa', + 'nato', + 'navy', + 'near', + 'neck', + 'need', + 'neil', + 'news', + 'next', + 'nice', + 'nine', + 'node', + 'none', + 'noon', + 'nose', + 'note', + 'nunn', + 'odds', + 'oems', + 'ohio', + 'oils', + 'once', + 'ones', + 'only', + 'onto', + 'opec', + 'open', + 'oral', + 'osha', + 'over', + 'owed', + 'owen', + 'owes', + 'owns', + 'pace', + 'pack', + 'pact', + 'page', + 'paid', + 'pain', + 'pair', + 'palm', + 'palo', + 'park', + 'part', + 'pass', + 'past', + 'path', + 'paul', + 'pays', + 'peak', + 'penn', + 'peru', + 'pete', + 'phil', + 'pick', + 'pict', + 'pill', + 'pink', + 'pipe', + 'pits', + 'plan', + 'play', + 'plea', + 'plot', + 'plug', + 'plus', + 'poll', + 'pont', + 'pool', + 'poor', + 'pope', + 'pork', + 'port', + 'pose', + 'post', + 'pull', + 'pulp', + 'pump', + 'pure', + 'push', + 'puts', + 'quit', + 'race', + 'raid', + 'rail', + 'rain', + 'rank', + 'rape', + 'rare', + 'rate', + 'rats', + 'read', + 'real', + 'rear', + 'reed', + 'refs', + 'rely', + 'rent', + 'rest', + 'rice', + 'rich', + 'rick', + 'rico', + 'ride', + 'ring', + 'riot', + 'risc', + 'rise', + 'risk', + 'road', + 'rock', + 'role', + 'roll', + 'rome', + 'roof', + 'room', + 'root', + 'rose', + 'ross', + 'rows', + 'rsqb', + 'rule', + 'runs', + 'rush', + 'ryan', + 'safe', + 'said', + 'sale', + 'salt', + 'same', + 'sand', + 'sang', + 'sank', + 'save', + 'says', + 'scan', + 'scsi', + 'seal', + 'seat', + 'seed', + 'seek', + 'seem', + 'seen', + 'sees', + 'sell', + 'send', + 'sent', + 'sept', + 'sets', + 'shaw', + 'shed', + 'ship', + 'shop', + 'shot', + 'show', + 'shut', + 'sick', + 'side', + 'sign', + 'sikh', + 'sing', + 'site', + 'sits', + 'size', + 'skin', + 'slid', + 'slim', + 'slip', + 'slot', + 'slow', + 'snap', + 'snmp', + 'snow', + 'soft', + 'soil', + 'sold', + 'sole', + 'some', + 'song', + 'sons', + 'sony', + 'soon', + 'sort', + 'span', + 'spin', + 'spot', + 'spur', + 'star', + 'stay', + 'stem', + 'step', + 'stop', + 'such', + 'sued', + 'suit', + 'sums', + 'sure', + 'swap', + 'tabs', + 'tail', + 'take', + 'tale', + 'talk', + 'tall', + 'tank', + 'tape', + 'task', + 'tass', + 'team', + 'tear', + 'tech', + 'tell', + 'tend', + 'tenn', + 'tens', + 'term', + 'test', + 'text', + 'thai', + 'than', + 'that', + 'them', + 'then', + 'they', + 'thin', + 'this', + 'thus', + 'tide', + 'tied', + 'ties', + 'tiff', + 'time', + 'tiny', + 'tips', + 'tire', + 'told', + 'toll', + 'tone', + 'tons', + 'tony', + 'took', + 'tool', + 'tops', + 'tory', + 'tour', + 'town', + 'toys', + 'trap', + 'tree', + 'trim', + 'trip', + 'troy', + 'true', + 'tube', + 'tune', + 'turn', + 'twin', + 'type', + 'unit', + 'unix', + 'upon', + 'urge', + 'usda', + 'used', + 'user', + 'uses', + 'utah', + 'vars', + 'vary', + 'vast', + 'very', + 'veto', + 'vice', + 'view', + 'visa', + 'void', + 'vote', + 'wage', + 'wait', + 'wake', + 'walk', + 'wall', + 'walt', + 'wang', + 'want', + 'ward', + 'warm', + 'warn', + 'wars', + 'wary', + 'wash', + 'wave', + 'ways', + 'weak', + 'wear', + 'webb', + 'week', + 'well', + 'went', + 'were', + 'west', + 'what', + 'when', + 'whom', + 'wide', + 'wife', + 'wild', + 'will', + 'wind', + 'wine', + 'wing', + 'wins', + 'wire', + 'wise', + 'wish', + 'with', + 'woes', + 'wolf', + 'wood', + 'word', + 'wore', + 'work', + 'yale', + 'yard', + 'year', + 'york', + 'your', + 'zero', + 'zone', + 'about', + 'above', + 'abuse', + 'acres', + 'acted', + 'actor', + 'acute', + 'adams', + 'adapt', + 'added', + 'admit', + 'adobe', + 'adopt', + 'adult', + 'after', + 'again', + 'agent', + 'aging', + 'agree', + 'ahead', + 'aided', + 'aides', + 'aimed', + 'alarm', + 'album', + 'aldus', + 'alert', + 'alike', + 'alive', + 'allen', + 'allow', + 'alloy', + 'alone', + 'along', + 'alpha', + 'alter', + 'altos', + 'amend', + 'among', + 'anger', + 'angle', + 'angry', + 'apart', + 'apple', + 'apply', + 'april', + 'arabs', + 'areas', + 'arena', + 'argue', + 'arise', + 'armed', + 'array', + 'ascii', + 'asian', + 'aside', + 'asked', + 'asset', + 'atoms', + 'audio', + 'audit', + 'avoid', + 'award', + 'aware', + 'awful', + 'backs', + 'badly', + 'baker', + 'bands', + 'banks', + 'barry', + 'based', + 'bases', + 'basic', + 'basin', + 'basis', + 'batch', + 'beach', + 'beams', + 'bears', + 'began', + 'begin', + 'begun', + 'being', + 'below', + 'bench', + 'bible', + 'bills', + 'billy', + 'birds', + 'birth', + 'black', + 'blame', + 'blank', + 'blast', + 'blaze', + 'blend', + 'blind', + 'block', + 'blood', + 'board', + 'boats', + 'bombs', + 'bonds', + 'bones', + 'bonus', + 'books', + 'boost', + 'booth', + 'boris', + 'bound', + 'boxes', + 'brady', + 'brain', + 'brand', + 'bread', + 'break', + 'brian', + 'brief', + 'bring', + 'broad', + 'broke', + 'brown', + 'bruce', + 'brush', + 'bryan', + 'build', + 'built', + 'bunch', + 'burns', + 'burst', + 'buses', + 'buyer', + 'bytes', + 'cable', + 'cache', + 'cairo', + 'calif', + 'calls', + 'camps', + 'canal', + 'canon', + 'cards', + 'cargo', + 'carlo', + 'carol', + 'carry', + 'cases', + 'casey', + 'catch', + 'cause', + 'cells', + 'cents', + 'chain', + 'chair', + 'chaos', + 'chart', + 'chase', + 'cheap', + 'check', + 'chest', + 'chief', + 'child', + 'chile', + 'china', + 'chips', + 'chose', + 'chris', + 'chuck', + 'cited', + 'cites', + 'civil', + 'claim', + 'clark', + 'clash', + 'class', + 'clean', + 'clear', + 'clerk', + 'click', + 'climb', + 'clock', + 'clone', + 'close', + 'cloud', + 'clout', + 'clubs', + 'coach', + 'coals', + 'coast', + 'cobol', + 'codes', + 'cohen', + 'color', + 'comes', + 'comex', + 'comic', + 'corps', + 'costa', + 'costs', + 'could', + 'count', + 'court', + 'cover', + 'crack', + 'craft', + 'craig', + 'crash', + 'crazy', + 'cream', + 'creek', + 'crews', + 'crime', + 'crops', + 'cross', + 'crowd', + 'crude', + 'cuban', + 'cubic', + 'cuomo', + 'curve', + 'cycle', + 'daily', + 'dairy', + 'dance', + 'dated', + 'dates', + 'david', + 'davis', + 'dbase', + 'deals', + 'dealt', + 'death', + 'debts', + 'debut', + 'decay', + 'delay', + 'delta', + 'depth', + 'diego', + 'dirty', + 'disks', + 'dodge', + 'doing', + 'doors', + 'doses', + 'doubt', + 'dozen', + 'draft', + 'drain', + 'drama', + 'drawn', + 'draws', + 'dream', + 'dress', + 'drift', + 'drink', + 'drive', + 'drops', + 'drove', + 'drugs', + 'dutch', + 'dying', + 'eager', + 'eagle', + 'early', + 'earth', + 'eased', + 'eddie', + 'edged', + 'edges', + 'edwin', + 'egypt', + 'eight', + 'elect', + 'elite', + 'empty', + 'ended', + 'enemy', + 'enjoy', + 'enter', + 'entry', + 'epson', + 'equal', + 'error', + 'evans', + 'event', + 'every', + 'exact', + 'excel', + 'exile', + 'exist', + 'extra', + 'exxon', + 'faced', + 'faces', + 'facto', + 'facts', + 'fails', + 'faith', + 'falls', + 'false', + 'fancy', + 'fares', + 'farms', + 'fatal', + 'fault', + 'favor', + 'faxes', + 'fears', + 'feels', + 'fence', + 'ferry', + 'fewer', + 'fiber', + 'field', + 'fifth', + 'fight', + 'filed', + 'files', + 'fills', + 'films', + 'final', + 'finds', + 'fined', + 'fines', + 'fired', + 'fires', + 'firms', + 'first', + 'fixed', + 'flags', + 'flame', + 'flash', + 'flaws', + 'fleet', + 'float', + 'flood', + 'floor', + 'flown', + 'flows', + 'fluid', + 'focus', + 'foley', + 'folks', + 'fonts', + 'foods', + 'force', + 'forms', + 'forth', + 'forum', + 'found', + 'frame', + 'franc', + 'frank', + 'fraud', + 'freed', + 'fresh', + 'front', + 'fruit', + 'fuels', + 'fully', + 'funds', + 'funny', + 'gains', + 'games', + 'gamma', + 'gases', + 'gates', + 'gatos', + 'gauge', + 'genes', + 'giant', + 'gifts', + 'gilts', + 'girls', + 'given', + 'gives', + 'glass', + 'glenn', + 'goals', + 'going', + 'goods', + 'grade', + 'grain', + 'grand', + 'grant', + 'graph', + 'grass', + 'grave', + 'great', + 'greek', + 'green', + 'gross', + 'group', + 'grown', + 'grows', + 'guard', + 'guess', + 'guest', + 'guide', + 'haiti', + 'hands', + 'handy', + 'happy', + 'harry', + 'harsh', + 'hayes', + 'heads', + 'heard', + 'heart', + 'heavy', + 'hefty', + 'helms', + 'helps', + 'hence', + 'henry', + 'highs', + 'hills', + 'hired', + 'holds', + 'holes', + 'holly', + 'homes', + 'honda', + 'honor', + 'hoped', + 'hopes', + 'horse', + 'hosts', + 'hotel', + 'hours', + 'house', + 'human', + 'humor', + 'icahn', + 'icons', + 'idaho', + 'ideal', + 'ideas', + 'image', + 'index', + 'india', + 'inner', + 'input', + 'intel', + 'iraqi', + 'irish', + 'issue', + 'italy', + 'items', + 'james', + 'japan', + 'jerry', + 'jesse', + 'jesus', + 'jimmy', + 'joins', + 'joint', + 'jokes', + 'jones', + 'judge', + 'juice', + 'kabul', + 'karen', + 'keeps', + 'keith', + 'kelly', + 'kevin', + 'khmer', + 'kinds', + 'klein', + 'klerk', + 'knife', + 'known', + 'knows', + 'kodak', + 'korea', + 'label', + 'labor', + 'lacks', + 'lakes', + 'lands', + 'large', + 'larry', + 'laser', + 'later', + 'latin', + 'layer', + 'leads', + 'leaks', + 'learn', + 'lease', + 'least', + 'leave', + 'legal', + 'level', + 'lewis', + 'libya', + 'light', + 'liked', + 'likes', + 'likud', + 'limit', + 'linda', + 'lined', + 'lines', + 'links', + 'lists', + 'lived', + 'liver', + 'lives', + 'lloyd', + 'loads', + 'loans', + 'lobby', + 'local', + 'logic', + 'looks', + 'loops', + 'loose', + 'loses', + 'lotus', + 'louis', + 'loved', + 'lower', + 'loyal', + 'lucas', + 'lucky', + 'lunch', + 'lying', + 'lynch', + 'macro', + 'magic', + 'maine', + 'major', + 'maker', + 'makes', + 'march', + 'maria', + 'mario', + 'marks', + 'mason', + 'match', + 'maybe', + 'mayor', + 'meals', + 'means', + 'meant', + 'media', + 'meese', + 'meets', + 'menlo', + 'menus', + 'merge', + 'merit', + 'metal', + 'miami', + 'micro', + 'midst', + 'might', + 'milan', + 'miles', + 'mills', + 'minds', + 'mines', + 'minor', + 'minus', + 'mixed', + 'mobil', + 'model', + 'modem', + 'modes', + 'money', + 'monte', + 'month', + 'moore', + 'moral', + 'motif', + 'motor', + 'mount', + 'mouse', + 'mouth', + 'moved', + 'moves', + 'movie', + 'music', + 'myers', + 'named', + 'names', + 'nancy', + 'naval', + 'needs', + 'never', + 'newer', + 'newly', + 'niche', + 'night', + 'ninth', + 'nixon', + 'nobel', + 'nodes', + 'noise', + 'north', + 'noted', + 'notes', + 'novel', + 'nubus', + 'nurse', + 'occur', + 'ocean', + 'offer', + 'often', + 'older', + 'opens', + 'opera', + 'optic', + 'orbit', + 'order', + 'oscar', + 'other', + 'ought', + 'ounce', + 'outer', + 'owned', + 'owner', + 'oxide', + 'ozone', + 'pages', + 'paint', + 'pairs', + 'panel', + 'panic', + 'paper', + 'paris', + 'parks', + 'parts', + 'party', + 'paste', + 'patch', + 'paths', + 'peace', + 'pence', + 'peres', + 'perez', + 'perry', + 'peter', + 'phase', + 'phone', + 'photo', + 'piano', + 'picks', + 'piece', + 'pilot', + 'pipes', + 'pitch', + 'pixel', + 'place', + 'plain', + 'plane', + 'plans', + 'plant', + 'plate', + 'plays', + 'plaza', + 'plots', + 'point', + 'polls', + 'pools', + 'ports', + 'posed', + 'poses', + 'posts', + 'pound', + 'power', + 'press', + 'price', + 'pride', + 'prime', + 'print', + 'prior', + 'prize', + 'probe', + 'proof', + 'proud', + 'prove', + 'proxy', + 'pulse', + 'pumps', + 'quake', + 'queen', + 'query', + 'queue', + 'quick', + 'quiet', + 'quite', + 'quota', + 'races', + 'radar', + 'radio', + 'raids', + 'rains', + 'raise', + 'rally', + 'ralph', + 'ranch', + 'range', + 'ranks', + 'rapid', + 'rated', + 'rates', + 'ratio', + 'rdbms', + 'reach', + 'react', + 'reads', + 'ready', + 'rebel', + 'refer', + 'relay', + 'repay', + 'reply', + 'reset', + 'rhode', + 'ridge', + 'rifle', + 'right', + 'rigid', + 'rings', + 'riots', + 'risen', + 'rises', + 'risks', + 'risky', + 'rival', + 'river', + 'roads', + 'robin', + 'rocks', + 'rocky', + 'roger', + 'roles', + 'roman', + 'rooms', + 'roots', + 'rouge', + 'rough', + 'round', + 'route', + 'royal', + 'ruled', + 'rules', + 'rumor', + 'rural', + 'sachs', + 'safer', + 'sales', + 'santa', + 'sauce', + 'saudi', + 'saved', + 'saves', + 'scale', + 'scans', + 'scene', + 'scope', + 'score', + 'scott', + 'scrap', + 'sears', + 'seats', + 'seeds', + 'seeks', + 'seems', + 'seize', + 'sells', + 'sends', + 'sense', + 'seoul', + 'serve', + 'setup', + 'seven', + 'shake', + 'shall', + 'shape', + 'share', + 'sharp', + 'sheet', + 'shelf', + 'shell', + 'shift', + 'ships', + 'shirt', + 'shock', + 'shoes', + 'shook', + 'shoot', + 'shops', + 'shore', + 'short', + 'shots', + 'shown', + 'shows', + 'sides', + 'sight', + 'signs', + 'simon', + 'since', + 'singh', + 'sites', + 'sixth', + 'sizes', + 'skill', + 'slain', + 'slash', + 'sleep', + 'slide', + 'slots', + 'slump', + 'small', + 'smart', + 'smile', + 'smith', + 'smoke', + 'solar', + 'solid', + 'solve', + 'songs', + 'sorry', + 'sorts', + 'sound', + 'south', + 'space', + 'spain', + 'sparc', + 'spare', + 'spark', + 'speak', + 'speed', + 'spell', + 'spend', + 'spent', + 'spill', + 'spite', + 'split', + 'spoke', + 'sport', + 'spots', + 'squad', + 'stack', + 'staff', + 'stage', + 'stake', + 'stamp', + 'stand', + 'stars', + 'start', + 'state', + 'stays', + 'steal', + 'steam', + 'steel', + 'steep', + 'stems', + 'steps', + 'steve', + 'stick', + 'stiff', + 'still', + 'stock', + 'stole', + 'stone', + 'stood', + 'stops', + 'store', + 'storm', + 'story', + 'strip', + 'stuck', + 'study', + 'stuff', + 'style', + 'sugar', + 'suite', + 'suits', + 'super', + 'surge', + 'susan', + 'sweep', + 'sweet', + 'swept', + 'swing', + 'swiss', + 'syria', + 'table', + 'taken', + 'takes', + 'talks', + 'tamil', + 'tampa', + 'tandy', + 'tanks', + 'tapes', + 'tasks', + 'taste', + 'taxes', + 'teach', + 'teams', + 'tears', + 'teeth', + 'tells', + 'tends', + 'terms', + 'terry', + 'tests', + 'texas', + 'thank', + 'theft', + 'their', + 'theme', + 'there', + 'these', + 'thick', + 'thing', + 'think', + 'third', + 'those', + 'three', + 'threw', + 'throw', + 'tight', + 'times', + 'tired', + 'tires', + 'title', + 'today', + 'token', + 'tokyo', + 'tonne', + 'tools', + 'topic', + 'total', + 'touch', + 'tough', + 'tower', + 'towns', + 'toxic', + 'trace', + 'track', + 'trade', + 'trail', + 'train', + 'trash', + 'treat', + 'trees', + 'trend', + 'trial', + 'trick', + 'tried', + 'tries', + 'trips', + 'troop', + 'truce', + 'truck', + 'truly', + 'trump', + 'trust', + 'truth', + 'tubes', + 'tumor', + 'turbo', + 'turns', + 'twice', + 'types', + 'tyson', + 'under', + 'union', + 'units', + 'unity', + 'until', + 'upper', + 'upset', + 'urban', + 'urged', + 'usage', + 'usair', + 'users', + 'using', + 'usual', + 'vague', + 'valid', + 'value', + 'valve', + 'vapor', + 'vegas', + 'video', + 'views', + 'vines', + 'virus', + 'visas', + 'visit', + 'vital', + 'voice', + 'voted', + 'voter', + 'votes', + 'vowed', + 'wages', + 'wales', + 'walls', + 'walsh', + 'wants', + 'warns', + 'waste', + 'watch', + 'water', + 'waves', + 'wayne', + 'weeks', + 'weigh', + 'weiss', + 'wells', + 'wheat', + 'wheel', + 'where', + 'which', + 'while', + 'white', + 'whole', + 'whose', + 'wider', + 'widow', + 'width', + 'winds', + 'wines', + 'wings', + 'wires', + 'woman', + 'women', + 'woods', + 'words', + 'works', + 'world', + 'worry', + 'worse', + 'worst', + 'worth', + 'would', + 'wound', + 'write', + 'wrong', + 'wrote', + 'xenix', + 'xerox', + 'yards', + 'years', + 'yield', + 'young', + 'youth', + 'zones', + 'aboard', + 'abroad', + 'absent', + 'absorb', + 'abuses', + 'accept', + 'access', + 'accord', + 'across', + 'acting', + 'action', + 'active', + 'actors', + 'actual', + 'adding', + 'adjust', + 'admits', + 'adults', + 'advice', + 'advise', + 'affair', + 'affect', + 'afford', + 'afghan', + 'afraid', + 'africa', + 'agency', + 'agenda', + 'agents', + 'agreed', + 'agrees', + 'ailing', + 'aiming', + 'airbus', + 'alaska', + 'albert', + 'alfred', + 'allied', + 'allies', + 'allows', + 'alloys', + 'almost', + 'always', + 'amount', + 'analog', + 'andrew', + 'animal', + 'annual', + 'answer', + 'anyone', + 'anyway', + 'apollo', + 'appeal', + 'appear', + 'aquino', + 'arabia', + 'arafat', + 'argued', + 'argues', + 'arnold', + 'around', + 'arrays', + 'arrest', + 'arrive', + 'arthur', + 'artist', + 'asking', + 'aspect', + 'assess', + 'assets', + 'assign', + 'assist', + 'assume', + 'assure', + 'asylum', + 'atomic', + 'attach', + 'attack', + 'attend', + 'august', + 'austin', + 'author', + 'autumn', + 'avenue', + 'awards', + 'babies', + 'backed', + 'backup', + 'bakker', + 'ballot', + 'baltic', + 'banker', + 'banned', + 'banyan', + 'barely', + 'barney', + 'barred', + 'barrel', + 'battle', + 'beaten', + 'beauty', + 'became', + 'become', + 'before', + 'begins', + 'behalf', + 'behind', + 'beirut', + 'belief', + 'belong', + 'benson', + 'berlin', + 'better', + 'beyond', + 'bidder', + 'bigger', + 'billed', + 'binary', + 'bitter', + 'blacks', + 'blamed', + 'blocks', + 'bloody', + 'boards', + 'boasts', + 'bodies', + 'boeing', + 'boesky', + 'boiler', + 'bomber', + 'border', + 'borrow', + 'boston', + 'bother', + 'bottle', + 'bottom', + 'bought', + 'branch', + 'brands', + 'brazil', + 'breach', + 'breaks', + 'breast', + 'bridge', + 'bright', + 'brings', + 'broken', + 'broker', + 'brooks', + 'budget', + 'buffer', + 'builds', + 'bullet', + 'bundle', + 'burden', + 'bureau', + 'burial', + 'buried', + 'burned', + 'bushel', + 'butler', + 'butter', + 'button', + 'buyers', + 'buying', + 'buyout', + 'bypass', + 'cables', + 'called', + 'caller', + 'camera', + 'campus', + 'canada', + 'cancel', + 'cancer', + 'cannot', + 'capped', + 'carbon', + 'career', + 'carlos', + 'cartel', + 'carter', + 'casino', + 'castle', + 'castro', + 'casual', + 'cattle', + 'caught', + 'caused', + 'causes', + 'cement', + 'census', + 'center', + 'centre', + 'chains', + 'chairs', + 'chance', + 'change', + 'chapel', + 'charge', + 'charts', + 'checks', + 'cheese', + 'cheney', + 'choice', + 'choose', + 'chosen', + 'church', + 'circle', + 'cities', + 'citing', + 'claims', + 'claris', + 'clarke', + 'clause', + 'clever', + 'client', + 'clinic', + 'clones', + 'closed', + 'closer', + 'clouds', + 'cloudy', + 'coding', + 'coffee', + 'colony', + 'colors', + 'colour', + 'column', + 'combat', + 'comdex', + 'comedy', + 'coming', + 'commit', + 'common', + 'compaq', + 'comply', + 'config', + 'contra', + 'cooper', + 'copied', + 'copies', + 'copper', + 'corner', + 'costly', + 'cotton', + 'counts', + 'county', + 'couple', + 'coupon', + 'course', + 'courts', + 'covers', + 'cracks', + 'create', + 'credit', + 'crimes', + 'crisis', + 'critic', + 'crowds', + 'cruise', + 'curfew', + 'cursor', + 'curves', + 'custom', + 'cycles', + 'cyprus', + 'dakota', + 'dallas', + 'damage', + 'danger', + 'daniel', + 'danish', + 'dating', + 'dayton', + 'deadly', + 'dealer', + 'deaths', + 'debate', + 'debris', + 'decade', + 'decent', + 'decide', + 'decnet', + 'decree', + 'deemed', + 'deeper', + 'deeply', + 'defeat', + 'defect', + 'defend', + 'define', + 'degree', + 'delays', + 'delete', + 'demand', + 'denied', + 'denies', + 'dennis', + 'denver', + 'depend', + 'deputy', + 'desert', + 'design', + 'desire', + 'detail', + 'detect', + 'device', + 'dialog', + 'diesel', + 'differ', + 'dinner', + 'dipped', + 'direct', + 'disney', + 'divide', + 'docket', + 'doctor', + 'dollar', + 'domain', + 'donald', + 'donors', + 'double', + 'doubts', + 'dozens', + 'dreams', + 'drexel', + 'drinks', + 'driven', + 'driver', + 'drives', + 'dubbed', + 'dumped', + 'during', + 'duties', + 'earned', + 'easier', + 'easily', + 'easing', + 'easter', + 'eating', + 'edison', + 'edited', + 'editor', + 'edward', + 'effect', + 'effort', + 'eighth', + 'either', + 'emerge', + 'empire', + 'employ', + 'enable', + 'ending', + 'energy', + 'engage', + 'engine', + 'enough', + 'ensure', + 'enters', + 'entire', + 'entity', + 'equals', + 'equity', + 'errors', + 'escape', + 'estate', + 'ethics', + 'ethnic', + 'eugene', + 'europe', + 'events', + 'everex', + 'exceed', + 'except', + 'excess', + 'excuse', + 'exempt', + 'exists', + 'exotic', + 'expand', + 'expect', + 'expert', + 'expire', + 'export', + 'extend', + 'extent', + 'facing', + 'factor', + 'failed', + 'fairly', + 'fallen', + 'family', + 'famous', + 'farmer', + 'faster', + 'father', + 'faults', + 'faulty', + 'favors', + 'favour', + 'feared', + 'fellow', + 'felony', + 'female', + 'fields', + 'fierce', + 'figure', + 'filing', + 'filled', + 'filter', + 'finder', + 'finger', + 'finish', + 'finite', + 'firing', + 'firmly', + 'fiscal', + 'fisher', + 'fitted', + 'flames', + 'flight', + 'floors', + 'floppy', + 'flying', + 'folder', + 'follow', + 'forced', + 'forces', + 'forest', + 'forget', + 'formal', + 'format', + 'formed', + 'former', + 'foster', + 'fought', + 'fourth', + 'foxpro', + 'frames', + 'france', + 'francs', + 'freely', + 'freeze', + 'french', + 'friday', + 'friend', + 'frozen', + 'fueled', + 'funded', + 'fusion', + 'future', + 'gained', + 'gallon', + 'gandhi', + 'garage', + 'garcia', + 'garden', + 'gather', + 'geared', + 'geneva', + 'george', + 'gerald', + 'german', + 'giants', + 'giving', + 'global', + 'golden', + 'gordon', + 'gotten', + 'grades', + 'graham', + 'grains', + 'grants', + 'graphs', + 'greece', + 'greene', + 'ground', + 'groups', + 'growth', + 'guards', + 'guests', + 'guides', + 'guilty', + 'gunman', + 'gunmen', + 'habits', + 'hailed', + 'halted', + 'hammer', + 'handed', + 'handle', + 'hanson', + 'happen', + 'harbor', + 'harder', + 'hardly', + 'harold', + 'harris', + 'harvey', + 'having', + 'hawaii', + 'hazard', + 'headed', + 'header', + 'health', + 'hearts', + 'heated', + 'height', + 'helmut', + 'helped', + 'herald', + 'heroin', + 'hidden', + 'hiding', + 'higher', + 'highly', + 'hilton', + 'hinted', + 'hiring', + 'holder', + 'holmes', + 'honest', + 'hoping', + 'horses', + 'hotels', + 'hourly', + 'houses', + 'howard', + 'hudson', + 'hughes', + 'humans', + 'hunger', + 'hunter', + 'hutton', + 'hybrid', + 'ignore', + 'images', + 'immune', + 'impact', + 'import', + 'impose', + 'inches', + 'income', + 'indeed', + 'indian', + 'infant', + 'inform', + 'ingres', + 'injury', + 'inputs', + 'insert', + 'inside', + 'insist', + 'intact', + 'intend', + 'intent', + 'invest', + 'invoke', + 'iraqis', + 'irvine', + 'irving', + 'island', + 'israel', + 'issued', + 'issues', + 'itself', + 'jacket', + 'jacobs', + 'jailed', + 'jersey', + 'jewish', + 'joined', + 'jordan', + 'joseph', + 'judged', + 'judges', + 'jumped', + 'junior', + 'jurors', + 'kansas', + 'kernel', + 'kicked', + 'kidder', + 'kidney', + 'killed', + 'killer', + 'korean', + 'kuwait', + 'labels', + 'labour', + 'lacked', + 'landed', + 'laptop', + 'larger', + 'lasers', + 'lasted', + 'lately', + 'latest', + 'latter', + 'launch', + 'lawyer', + 'layers', + 'laying', + 'layout', + 'leader', + 'league', + 'leased', + 'leases', + 'leaves', + 'lehman', + 'length', + 'lesser', + 'lesson', + 'letter', + 'levels', + 'levine', + 'liable', + 'lifted', + 'lights', + 'likely', + 'limits', + 'linear', + 'linked', + 'liquid', + 'liquor', + 'listed', + 'listen', + 'little', + 'living', + 'loaded', + 'locate', + 'locked', + 'london', + 'longer', + 'looked', + 'losers', + 'losing', + 'losses', + 'lowest', + 'luxury', + 'macros', + 'madrid', + 'mailed', + 'mainly', + 'makers', + 'makeup', + 'making', + 'manage', + 'manila', + 'manner', + 'manual', + 'manuel', + 'marcos', + 'margin', + 'marine', + 'marion', + 'marked', + 'market', + 'marlin', + 'martin', + 'masses', + 'master', + 'matrix', + 'matter', + 'mature', + 'mbytes', + 'mecham', + 'median', + 'medium', + 'member', + 'memory', + 'mental', + 'merely', + 'merged', + 'merger', + 'merits', + 'messrs', + 'metals', + 'meters', + 'method', + 'metric', + 'mexico', + 'michel', + 'midday', + 'middle', + 'milken', + 'miller', + 'miners', + 'mining', + 'minute', + 'mirror', + 'missed', + 'mixing', + 'mobile', + 'models', + 'modems', + 'modern', + 'modest', + 'modify', + 'module', + 'moment', + 'monday', + 'months', + 'morgan', + 'morris', + 'morton', + 'moscow', + 'moslem', + 'mostly', + 'mother', + 'motion', + 'motive', + 'motors', + 'movies', + 'moving', + 'murder', + 'murphy', + 'murray', + 'muscle', + 'museum', + 'mutual', + 'myself', + 'naming', + 'narrow', + 'nasdaq', + 'nation', + 'native', + 'nature', + 'nearby', + 'nearly', + 'needed', + 'nelson', + 'neural', + 'nevada', + 'newark', + 'newest', + 'nickel', + 'nights', + 'nikkei', + 'nippon', + 'nissan', + 'nobody', + 'nomura', + 'normal', + 'norman', + 'norton', + 'norway', + 'notice', + 'notify', + 'noting', + 'notion', + 'novell', + 'nuclei', + 'number', + 'nurses', + 'object', + 'obtain', + 'occurs', + 'offers', + 'office', + 'offset', + 'oldest', + 'oliver', + 'online', + 'opened', + 'openly', + 'oppose', + 'option', + 'oracle', + 'orange', + 'orders', + 'oregon', + 'organs', + 'origin', + 'ortega', + 'others', + 'ottawa', + 'ounces', + 'ousted', + 'outlet', + 'output', + 'owners', + 'oxford', + 'oxygen', + 'packed', + 'packet', + 'palace', + 'panama', + 'panels', + 'papers', + 'parade', + 'parent', + 'parity', + 'parked', + 'parker', + 'parole', + 'partly', + 'pascal', + 'passed', + 'passes', + 'patent', + 'patrol', + 'paying', + 'people', + 'period', + 'permit', + 'person', + 'phases', + 'philip', + 'phones', + 'photos', + 'phrase', + 'picked', + 'pickup', + 'pieces', + 'pierce', + 'pilots', + 'pixels', + 'placed', + 'places', + 'plains', + 'planes', + 'planet', + 'plants', + 'plasma', + 'plates', + 'played', + 'player', + 'please', + 'pledge', + 'plenty', + 'plunge', + 'pocket', + 'points', + 'poison', + 'poland', + 'police', + 'policy', + 'polish', + 'poorly', + 'ported', + 'postal', + 'posted', + 'pounds', + 'poured', + 'powder', + 'powell', + 'powers', + 'prague', + 'praise', + 'prayer', + 'prefer', + 'pretax', + 'pretty', + 'priced', + 'prices', + 'priest', + 'prince', + 'prints', + 'prison', + 'profit', + 'prompt', + 'proper', + 'proved', + 'proven', + 'proves', + 'public', + 'puerto', + 'pulled', + 'purely', + 'pursue', + 'pushed', + 'quayle', + 'quebec', + 'quotas', + 'quoted', + 'quotes', + 'racial', + 'racing', + 'radius', + 'raised', + 'raises', + 'random', + 'ranged', + 'ranges', + 'ranked', + 'rarely', + 'rather', + 'rating', + 'ratios', + 'reader', + 'reagan', + 'really', + 'reason', + 'rebels', + 'recall', + 'recent', + 'record', + 'redeem', + 'reduce', + 'refers', + 'reform', + 'refuge', + 'refund', + 'refuse', + 'regain', + 'regard', + 'regime', + 'region', + 'reject', + 'relate', + 'relied', + 'relief', + 'relies', + 'remain', + 'remote', + 'remove', + 'rental', + 'reopen', + 'repair', + 'repeat', + 'report', + 'rescue', + 'reside', + 'resign', + 'resist', + 'resort', + 'result', + 'resume', + 'retail', + 'retain', + 'retire', + 'return', + 'reveal', + 'review', + 'revise', + 'revive', + 'revolt', + 'reward', + 'riding', + 'rifles', + 'rights', + 'rising', + 'rivals', + 'rivers', + 'robert', + 'robins', + 'robust', + 'rocket', + 'rogers', + 'rolled', + 'ronald', + 'rounds', + 'router', + 'routes', + 'rubber', + 'ruling', + 'rumors', + 'runoff', + 'runway', + 'rushed', + 'russia', + 'saddam', + 'safely', + 'safety', + 'salary', + 'salmon', + 'sample', + 'samuel', + 'saving', + 'saying', + 'scaled', + 'scales', + 'scarce', + 'scared', + 'scenes', + 'scheme', + 'school', + 'scored', + 'scores', + 'screen', + 'script', + 'scroll', + 'sealed', + 'search', + 'season', + 'second', + 'secret', + 'sector', + 'secure', + 'seeing', + 'seemed', + 'seized', + 'seldom', + 'select', + 'seller', + 'senate', + 'senior', + 'serial', + 'series', + 'served', + 'server', + 'serves', + 'settle', + 'severe', + 'sexual', + 'shades', + 'shadow', + 'shamir', + 'shapes', + 'shared', + 'shares', + 'sharon', + 'sheets', + 'shells', + 'shield', + 'shifts', + 'shiite', + 'should', + 'showed', + 'shrink', + 'shultz', + 'sierra', + 'signal', + 'signed', + 'silent', + 'silver', + 'simple', + 'simply', + 'singer', + 'single', + 'sister', + 'skills', + 'slated', + 'slides', + 'slight', + 'slowed', + 'slower', + 'slowly', + 'smooth', + 'soared', + 'soccer', + 'social', + 'socket', + 'sodium', + 'solely', + 'solved', + 'sooner', + 'sought', + 'sounds', + 'source', + 'soviet', + 'spaces', + 'speaks', + 'speech', + 'speeds', + 'spends', + 'spirit', + 'spoken', + 'sports', + 'spread', + 'spring', + 'sprint', + 'square', + 'stable', + 'stacks', + 'staged', + 'stages', + 'stakes', + 'stalin', + 'stance', + 'stands', + 'starts', + 'stated', + 'states', + 'static', + 'status', + 'stayed', + 'steady', + 'steven', + 'stocks', + 'stolen', + 'stones', + 'stored', + 'stores', + 'storms', + 'strain', + 'stream', + 'street', + 'stress', + 'strict', + 'strike', + 'string', + 'stroke', + 'strong', + 'struck', + 'stuart', + 'studio', + 'styles', + 'submit', + 'subset', + 'subtle', + 'suburb', + 'subway', + 'sudden', + 'suffer', + 'suited', + 'sulfur', + 'summer', + 'summit', + 'sunday', + 'sununu', + 'supply', + 'surely', + 'surged', + 'survey', + 'sweden', + 'switch', + 'sybase', + 'sydney', + 'symbol', + 'syntax', + 'syrian', + 'system', + 'tables', + 'tackle', + 'taiwan', + 'taking', + 'talent', + 'talked', + 'tandem', + 'tanker', + 'target', + 'tariff', + 'taught', + 'taylor', + 'tehran', + 'temple', + 'tended', + 'tender', + 'tennis', + 'tenure', + 'tested', + 'texaco', + 'thanks', + 'themes', + 'theory', + 'things', + 'thinks', + 'thomas', + 'though', + 'thread', + 'threat', + 'thrift', + 'thrown', + 'thrust', + 'ticket', + 'timber', + 'timely', + 'timing', + 'tissue', + 'titles', + 'tonnes', + 'topics', + 'topped', + 'totals', + 'toward', + 'toyota', + 'tracks', + 'traded', + 'trader', + 'trades', + 'trains', + 'travel', + 'treaty', + 'trends', + 'trials', + 'tribal', + 'triple', + 'troops', + 'trucks', + 'trusts', + 'trying', + 'tumors', + 'tunnel', + 'turkey', + 'turned', + 'turner', + 'typing', + 'unable', + 'unfair', + 'unions', + 'unique', + 'united', + 'unless', + 'unlike', + 'unrest', + 'update', + 'upheld', + 'upward', + 'urgent', + 'urging', + 'usable', + 'useful', + 'vacant', + 'vacuum', + 'valley', + 'valued', + 'values', + 'varied', + 'varies', + 'vector', + 'vendor', + 'verify', + 'versus', + 'vessel', + 'viable', + 'victim', + 'victor', + 'vienna', + 'viewed', + 'virgin', + 'vision', + 'visits', + 'visual', + 'voices', + 'volume', + 'voters', + 'voting', + 'waited', + 'walesa', + 'walked', + 'walker', + 'walter', + 'wanted', + 'warned', + 'warner', + 'warren', + 'warsaw', + 'wastes', + 'waters', + 'watson', + 'weaken', + 'weaker', + 'wealth', + 'weapon', + 'weekly', + 'weighs', + 'weight', + 'whites', + 'wholly', + 'widely', + 'wilson', + 'window', + 'winner', + 'winter', + 'wiring', + 'wisdom', + 'wishes', + 'within', + 'witter', + 'wonder', + 'wooden', + 'worked', + 'worker', + 'wounds', + 'wright', + 'writer', + 'writes', + 'yearly', + 'yellow', + 'yields', + 'youths', + 'zenith', + 'zurich', + 'abandon', + 'ability', + 'absence', + 'academy', + 'accepts', + 'account', + 'accused', + 'achieve', + 'acquire', + 'actions', + 'actress', + 'adapted', + 'adapter', + 'address', + 'adopted', + 'advance', + 'adverse', + 'advised', + 'adviser', + 'affairs', + 'affects', + 'african', + 'against', + 'airline', + 'airport', + 'airways', + 'alabama', + 'alberta', + 'alcohol', + 'alleged', + 'alleges', + 'allowed', + 'already', + 'altered', + 'amazing', + 'amended', + 'america', + 'amnesty', + 'amounts', + 'analyst', + 'analyze', + 'ancient', + 'angeles', + 'angular', + 'animals', + 'another', + 'answers', + 'anthony', + 'antonio', + 'anxious', + 'anybody', + 'anymore', + 'apparel', + 'appeals', + 'appears', + 'applied', + 'applies', + 'approve', + 'arguing', + 'arising', + 'arizona', + 'armenia', + 'armored', + 'arrange', + 'arrests', + 'arrival', + 'arrived', + 'arrives', + 'article', + 'artists', + 'aspects', + 'assault', + 'asserts', + 'assumed', + 'assumes', + 'assured', + 'atlanta', + 'attacks', + 'attempt', + 'attract', + 'auction', + 'austria', + 'authors', + 'autocad', + 'average', + 'avoided', + 'awarded', + 'awkward', + 'backers', + 'backing', + 'backlog', + 'backups', + 'baghdad', + 'bailout', + 'balance', + 'balloon', + 'ballots', + 'bancorp', + 'bankers', + 'banking', + 'banning', + 'barbara', + 'bargain', + 'barrels', + 'barrier', + 'barring', + 'battery', + 'battles', + 'beaches', + 'bearing', + 'bearish', + 'beating', + 'because', + 'becomes', + 'beijing', + 'belgian', + 'belgium', + 'believe', + 'belongs', + 'beneath', + 'benefit', + 'bennett', + 'bentsen', + 'bernard', + 'besides', + 'betting', + 'between', + 'beverly', + 'bidders', + 'bidding', + 'biggest', + 'billing', + 'billion', + 'binding', + 'bishops', + 'blanket', + 'blocked', + 'bolster', + 'bombing', + 'bonuses', + 'booming', + 'boosted', + 'borders', + 'borland', + 'bottles', + 'boycott', + 'bradley', + 'brennan', + 'bridges', + 'briefly', + 'britain', + 'british', + 'broaden', + 'broader', + 'broadly', + 'brokers', + 'brother', + 'brought', + 'budgets', + 'buffalo', + 'buffers', + 'buildup', + 'bullets', + 'bullion', + 'bullish', + 'bundled', + 'burnham', + 'burning', + 'bushels', + 'buttons', + 'cabinet', + 'cabling', + 'caching', + 'callers', + 'calling', + 'cameras', + 'campeau', + 'capable', + 'capital', + 'capitol', + 'captain', + 'capture', + 'carbide', + 'careers', + 'careful', + 'carried', + 'carrier', + 'carries', + 'catalog', + 'causing', + 'caution', + 'ceiling', + 'centers', + 'central', + 'centres', + 'century', + 'ceramic', + 'certain', + 'chamber', + 'chances', + 'changed', + 'changes', + 'channel', + 'chapter', + 'charged', + 'charges', + 'charity', + 'charles', + 'charter', + 'chassis', + 'cheaper', + 'checked', + 'checker', + 'chevron', + 'chicago', + 'chicken', + 'chinese', + 'choices', + 'chronic', + 'circles', + 'circuit', + 'citizen', + 'claimed', + 'clarify', + 'clashes', + 'classes', + 'classic', + 'clayton', + 'cleanup', + 'cleared', + 'clearly', + 'clients', + 'climate', + 'climbed', + 'clinics', + 'clinton', + 'clipper', + 'closely', + 'closest', + 'closing', + 'closure', + 'clothes', + 'cluster', + 'coastal', + 'cocaine', + 'coleman', + 'collect', + 'college', + 'collins', + 'columns', + 'combine', + 'comfort', + 'command', + 'comment', + 'commons', + 'compact', + 'company', + 'compare', + 'compete', + 'compile', + 'complex', + 'concede', + 'concept', + 'concern', + 'concert', + 'conduct', + 'confirm', + 'conform', + 'connect', + 'consent', + 'consist', + 'console', + 'contact', + 'contain', + 'contend', + 'content', + 'contest', + 'context', + 'contras', + 'control', + 'convert', + 'cooking', + 'cooling', + 'copying', + 'correct', + 'costing', + 'council', + 'counsel', + 'counted', + 'counter', + 'country', + 'coupled', + 'couples', + 'courier', + 'courses', + 'covered', + 'crashed', + 'crashes', + 'created', + 'creates', + 'credits', + 'critics', + 'crossed', + 'crowded', + 'crucial', + 'crushed', + 'crystal', + 'cuellar', + 'culture', + 'current', + 'custody', + 'customs', + 'cutting', + 'damaged', + 'damages', + 'dancing', + 'dangers', + 'dealers', + 'dealing', + 'decades', + 'decided', + 'decides', + 'declare', + 'decline', + 'default', + 'defects', + 'defence', + 'defense', + 'deficit', + 'defined', + 'defines', + 'degrees', + 'delayed', + 'deleted', + 'deliver', + 'demands', + 'denmark', + 'density', + 'denying', + 'depends', + 'deposit', + 'derived', + 'deserve', + 'designs', + 'desired', + 'desktop', + 'despite', + 'destroy', + 'details', + 'detroit', + 'develop', + 'devices', + 'devised', + 'devoted', + 'diagram', + 'dialing', + 'diamond', + 'differs', + 'digital', + 'dilemma', + 'diluted', + 'dioxide', + 'discuss', + 'disease', + 'dismiss', + 'display', + 'dispute', + 'distant', + 'diverse', + 'divided', + 'divorce', + 'doctors', + 'dollars', + 'donated', + 'doubled', + 'douglas', + 'drafted', + 'dragged', + 'drastic', + 'drawing', + 'dressed', + 'drivers', + 'driving', + 'dropped', + 'drought', + 'dukakis', + 'dumping', + 'durable', + 'dynamic', + 'earlier', + 'earning', + 'easiest', + 'eastern', + 'eastman', + 'economy', + 'editing', + 'edition', + 'editors', + 'edwards', + 'effects', + 'efforts', + 'elderly', + 'elected', + 'elegant', + 'element', + 'embargo', + 'embassy', + 'emerged', + 'employs', + 'emulate', + 'enabled', + 'enables', + 'enacted', + 'endorse', + 'enemies', + 'enforce', + 'engaged', + 'engines', + 'england', + 'english', + 'enhance', + 'enjoyed', + 'ensures', + 'entered', + 'entries', + 'episode', + 'equally', + 'erosion', + 'erupted', + 'escaped', + 'essence', + 'ethical', + 'evening', + 'evident', + 'evolved', + 'exactly', + 'examine', + 'example', + 'exceeds', + 'excited', + 'exclude', + 'execute', + 'exhaust', + 'exhibit', + 'existed', + 'expects', + 'expense', + 'experts', + 'expired', + 'expires', + 'explain', + 'exploit', + 'explore', + 'exports', + 'exposed', + 'express', + 'extends', + 'extract', + 'extreme', + 'faction', + 'factors', + 'factory', + 'faculty', + 'failing', + 'failure', + 'falling', + 'farmers', + 'farming', + 'fashion', + 'fastest', + 'fatigue', + 'favored', + 'feature', + 'federal', + 'feeding', + 'feeling', + 'fighter', + 'figured', + 'figures', + 'filings', + 'filling', + 'filters', + 'finally', + 'finance', + 'finding', + 'fingers', + 'finland', + 'fishing', + 'fission', + 'fleeing', + 'flights', + 'flooded', + 'florida', + 'flowers', + 'flowing', + 'focused', + 'focuses', + 'folders', + 'follows', + 'forcing', + 'foreign', + 'forests', + 'forever', + 'formats', + 'forming', + 'formula', + 'fortran', + 'fortune', + 'forward', + 'founded', + 'founder', + 'fragile', + 'francis', + 'freedom', + 'freeman', + 'freight', + 'fremont', + 'friends', + 'fujitsu', + 'fulfill', + 'funding', + 'funeral', + 'furnace', + 'further', + 'futures', + 'gainers', + 'gaining', + 'gallery', + 'gallons', + 'garbage', + 'gateway', + 'general', + 'generic', + 'genetic', + 'genuine', + 'georgia', + 'germans', + 'germany', + 'gesture', + 'getting', + 'gilbert', + 'glasses', + 'goldman', + 'grabbed', + 'gradual', + 'granted', + 'graphic', + 'gravity', + 'greater', + 'greatly', + 'greeted', + 'gregory', + 'grocery', + 'grounds', + 'growers', + 'growing', + 'gunfire', + 'handful', + 'handled', + 'handles', + 'hanging', + 'hanover', + 'happens', + 'hardest', + 'harvard', + 'harvest', + 'hazards', + 'heading', + 'healthy', + 'hearing', + 'heating', + 'heavily', + 'helpful', + 'helping', + 'herbert', + 'herself', + 'higgins', + 'highest', + 'highway', + 'himself', + 'history', + 'hitting', + 'hoffman', + 'holders', + 'holding', + 'holiday', + 'honored', + 'hopeful', + 'hopkins', + 'horizon', + 'hostage', + 'hostile', + 'housing', + 'houston', + 'however', + 'hundred', + 'hungary', + 'hunting', + 'husband', + 'hussein', + 'hyundai', + 'ignored', + 'illegal', + 'illness', + 'imagine', + 'imaging', + 'impacts', + 'implies', + 'imports', + 'imposed', + 'improve', + 'include', + 'incomes', + 'indexed', + 'indexes', + 'indiana', + 'indians', + 'induced', + 'initial', + 'injured', + 'inmates', + 'inquiry', + 'insider', + 'insists', + 'install', + 'instant', + 'instead', + 'insured', + 'insurer', + 'integer', + 'intends', + 'intense', + 'interim', + 'invaded', + 'invited', + 'invoked', + 'involve', + 'iranian', + 'ireland', + 'islamic', + 'islands', + 'israeli', + 'issuing', + 'italian', + 'jackson', + 'january', + 'jeffrey', + 'jewelry', + 'jobless', + 'johnson', + 'joining', + 'jointly', + 'journal', + 'journey', + 'jumping', + 'justice', + 'justify', + 'keating', + 'keeping', + 'kennedy', + 'kenneth', + 'killing', + 'kingdom', + 'kitchen', + 'knocked', + 'knowing', + 'kremlin', + 'kuwaiti', + 'labeled', + 'lacking', + 'lambert', + 'landing', + 'laptops', + 'largely', + 'largest', + 'lasting', + 'lattice', + 'lawsuit', + 'lawyers', + 'layoffs', + 'leaders', + 'leading', + 'learned', + 'leasing', + 'leaving', + 'lebanon', + 'leftist', + 'legally', + 'lenders', + 'lending', + 'lengths', + 'lengthy', + 'leonard', + 'lesions', + 'lessons', + 'letters', + 'letting', + 'liberal', + 'liberty', + 'library', + 'licence', + 'license', + 'lifting', + 'lighter', + 'limited', + 'lincoln', + 'linking', + 'listing', + 'loading', + 'locally', + 'located', + 'locking', + 'logging', + 'logical', + 'longest', + 'looking', + 'lorenzo', + 'lottery', + 'lowered', + 'loyalty', + 'machine', + 'macweek', + 'madison', + 'mailing', + 'managed', + 'manager', + 'manages', + 'mandate', + 'mandela', + 'manuals', + 'mapping', + 'marched', + 'margins', + 'marines', + 'markets', + 'marking', + 'married', + 'martial', + 'marxist', + 'massive', + 'matched', + 'matches', + 'matters', + 'maximum', + 'maxwell', + 'meaning', + 'measure', + 'medical', + 'meeting', + 'members', + 'memphis', + 'mention', + 'mercury', + 'mergers', + 'merging', + 'merrill', + 'message', + 'methane', + 'methods', + 'mexican', + 'michael', + 'mideast', + 'midland', + 'midwest', + 'migrate', + 'mikhail', + 'militia', + 'million', + 'mineral', + 'minimal', + 'minimum', + 'minutes', + 'missile', + 'missing', + 'mission', + 'mistake', + 'mixture', + 'modular', + 'modules', + 'moments', + 'monitor', + 'montana', + 'monthly', + 'morning', + 'moslems', + 'mothers', + 'mounted', + 'murders', + 'musical', + 'mystery', + 'nabisco', + 'namibia', + 'nations', + 'natural', + 'nearest', + 'neither', + 'nervous', + 'netbios', + 'netview', + 'netware', + 'network', + 'neutral', + 'neutron', + 'newport', + 'newwave', + 'nominal', + 'nominee', + 'noriega', + 'notable', + 'notably', + 'nothing', + 'noticed', + 'notices', + 'nowhere', + 'nuclear', + 'numbers', + 'numeric', + 'nursing', + 'oakland', + 'objects', + 'obscure', + 'observe', + 'obvious', + 'october', + 'offense', + 'offered', + 'officer', + 'offices', + 'olympic', + 'ongoing', + 'ontario', + 'opening', + 'operate', + 'opinion', + 'opposed', + 'opposes', + 'optical', + 'optimal', + 'optimum', + 'options', + 'ordered', + 'organic', + 'orlando', + 'orleans', + 'outcome', + 'outdoor', + 'outlets', + 'outline', + 'outlook', + 'outside', + 'overall', + 'overlay', + 'oversee', + 'pacific', + 'package', + 'packets', + 'painful', + 'painted', + 'palette', + 'paradox', + 'parents', + 'parking', + 'partial', + 'parties', + 'partner', + 'passage', + 'passing', + 'passive', + 'patents', + 'patient', + 'patrick', + 'pattern', + 'payable', + 'payment', + 'payroll', + 'peabody', + 'penalty', + 'pending', + 'pension', + 'percent', + 'perfect', + 'perform', + 'perhaps', + 'periods', + 'permits', + 'persian', + 'persons', + 'philips', + 'phoenix', + 'physics', + 'picking', + 'picture', + 'placing', + 'plagued', + 'planned', + 'planted', + 'plastic', + 'players', + 'playing', + 'pleaded', + 'pleased', + 'pledged', + 'plunged', + 'pockets', + 'pointed', + 'pointer', + 'polling', + 'popular', + 'portion', + 'posting', + 'poverty', + 'powered', + 'praised', + 'precise', + 'predict', + 'prefers', + 'premier', + 'premium', + 'prepare', + 'present', + 'pressed', + 'prevent', + 'preview', + 'pricing', + 'priests', + 'primary', + 'printed', + 'printer', + 'privacy', + 'private', + 'problem', + 'proceed', + 'process', + 'produce', + 'product', + 'profile', + 'profits', + 'program', + 'project', + 'promise', + 'promote', + 'prompts', + 'propose', + 'protect', + 'protein', + 'protest', + 'provide', + 'proving', + 'publish', + 'pulling', + 'pumping', + 'purpose', + 'pursued', + 'pursuit', + 'pushing', + 'putting', + 'qualify', + 'quality', + 'quantum', + 'quarter', + 'quattro', + 'queries', + 'quickly', + 'quietly', + 'radical', + 'railway', + 'raising', + 'rallied', + 'rallies', + 'ranging', + 'ranking', + 'rapidly', + 'ratings', + 'raymond', + 'reached', + 'reaches', + 'reacted', + 'reactor', + 'readers', + 'readily', + 'reading', + 'reality', + 'realize', + 'reasons', + 'rebound', + 'rebuild', + 'recalls', + 'receipt', + 'receive', + 'records', + 'recover', + 'reduced', + 'reduces', + 'refined', + 'reflect', + 'reforms', + 'refugee', + 'refusal', + 'refused', + 'refuses', + 'regions', + 'regular', + 'related', + 'relaxed', + 'release', + 'relying', + 'remains', + 'remarks', + 'removal', + 'removed', + 'renewal', + 'renewed', + 'repairs', + 'replace', + 'replied', + 'reports', + 'request', + 'require', + 'rescued', + 'reserve', + 'resides', + 'resolve', + 'respect', + 'respond', + 'restore', + 'results', + 'resumed', + 'retains', + 'retired', + 'retreat', + 'returns', + 'reuters', + 'reveals', + 'revenue', + 'reverse', + 'reviews', + 'revised', + 'revival', + 'rewards', + 'richard', + 'richter', + 'robbery', + 'roberts', + 'rockets', + 'rolling', + 'romania', + 'roughly', + 'routers', + 'routine', + 'routing', + 'rulings', + 'running', + 'russell', + 'russian', + 'saatchi', + 'sailors', + 'salinas', + 'salomon', + 'samples', + 'satisfy', + 'savings', + 'scaling', + 'scandal', + 'scanned', + 'scanner', + 'schemes', + 'schools', + 'science', + 'scoring', + 'scratch', + 'screens', + 'scripts', + 'seagate', + 'seasons', + 'seattle', + 'seconds', + 'secrets', + 'section', + 'sectors', + 'secured', + 'seeking', + 'segment', + 'seismic', + 'sellers', + 'selling', + 'seminar', + 'senator', + 'sending', + 'sensors', + 'serious', + 'servers', + 'service', + 'serving', + 'session', + 'setback', + 'setting', + 'settled', + 'seventh', + 'several', + 'shallow', + 'sharing', + 'sharply', + 'shelter', + 'shelves', + 'shifted', + 'shipped', + 'shocked', + 'shorter', + 'shortly', + 'shouted', + 'showers', + 'showing', + 'shuttle', + 'siemens', + 'signals', + 'signing', + 'silence', + 'silicon', + 'similar', + 'simmons', + 'simpler', + 'simpson', + 'singing', + 'singled', + 'sitting', + 'sizable', + 'skilled', + 'slashed', + 'slaying', + 'slipped', + 'slowing', + 'slumped', + 'smaller', + 'smoking', + 'soaring', + 'society', + 'soldier', + 'solvent', + 'solving', + 'somehow', + 'someone', + 'sorting', + 'sounded', + 'sources', + 'soviets', + 'soybean', + 'spacing', + 'spanish', + 'sparked', + 'spatial', + 'speaker', + 'special', + 'species', + 'specify', + 'spectra', + 'spencer', + 'spirits', + 'sponsor', + 'spotted', + 'springs', + 'spurred', + 'squeeze', + 'stadium', + 'staging', + 'stalled', + 'stanley', + 'started', + 'startup', + 'station', + 'statute', + 'staying', + 'stearns', + 'stemmed', + 'stephen', + 'stepped', + 'stevens', + 'stewart', + 'stomach', + 'stopped', + 'storage', + 'stories', + 'storing', + 'strains', + 'strange', + 'streams', + 'streets', + 'stretch', + 'strikes', + 'strings', + 'student', + 'studied', + 'studies', + 'subject', + 'subsidy', + 'suburbs', + 'succeed', + 'success', + 'suffers', + 'suggest', + 'suicide', + 'summary', + 'support', + 'suppose', + 'supreme', + 'surface', + 'surgery', + 'surplus', + 'surveys', + 'survive', + 'suspect', + 'suspend', + 'sustain', + 'swedish', + 'symbols', + 'systems', + 'tactics', + 'talking', + 'tankers', + 'targets', + 'tariffs', + 'taxable', + 'teacher', + 'telecom', + 'telling', + 'tenants', + 'tension', + 'testify', + 'testing', + 'textile', + 'theater', + 'therapy', + 'thereby', + 'thermal', + 'thomson', + 'thought', + 'threats', + 'thrifts', + 'through', + 'tickets', + 'tighten', + 'tighter', + 'tightly', + 'timothy', + 'tobacco', + 'tonight', + 'toolkit', + 'toronto', + 'toshiba', + 'totaled', + 'totally', + 'touched', + 'tougher', + 'tourism', + 'tourist', + 'towards', + 'traders', + 'trading', + 'traffic', + 'tragedy', + 'trained', + 'transit', + 'trapped', + 'treated', + 'tribune', + 'trigger', + 'tritium', + 'trouble', + 'trustee', + 'tuesday', + 'tumbled', + 'turbine', + 'turkish', + 'turmoil', + 'turning', + 'twisted', + 'typical', + 'ukraine', + 'unaware', + 'unclear', + 'undergo', + 'unhappy', + 'unified', + 'uniform', + 'unknown', + 'unusual', + 'updated', + 'updates', + 'upgrade', + 'uranium', + 'usually', + 'utility', + 'utilize', + 'vaccine', + 'variety', + 'various', + 'varying', + 'vatican', + 'vehicle', + 'vendors', + 'ventura', + 'venture', + 'verdict', + 'vermont', + 'version', + 'vessels', + 'veteran', + 'victims', + 'victory', + 'vietnam', + 'viewers', + 'viewing', + 'village', + 'vincent', + 'violate', + 'violent', + 'virtual', + 'viruses', + 'visible', + 'visited', + 'voltage', + 'volumes', + 'waiting', + 'walking', + 'wallace', + 'wanting', + 'warburg', + 'warfare', + 'warming', + 'warning', + 'warrant', + 'watched', + 'watkins', + 'wealthy', + 'weapons', + 'wearing', + 'weather', + 'wedding', + 'weekend', + 'weighed', + 'welcome', + 'welfare', + 'western', + 'whereas', + 'whether', + 'whitney', + 'widened', + 'william', + 'willing', + 'windows', + 'winners', + 'winning', + 'without', + 'witness', + 'workers', + 'working', + 'worried', + 'worries', + 'wounded', + 'wrapped', + 'writers', + 'writing', + 'written', + 'wyoming', + 'wysiwyg', + 'yeltsin', + 'yielded', + 'yitzhak', + 'younger', + 'zealand', + 'abortion', + 'absolute', + 'absorbed', + 'abstract', + 'academic', + 'accepted', + 'accessed', + 'accident', + 'accounts', + 'accuracy', + 'accurate', + 'accusing', + 'achieved', + 'acquired', + 'actively', + 'activist', + 'activity', + 'actually', + 'adapters', + 'addition', + 'adequate', + 'adjacent', + 'adjusted', + 'admitted', + 'adollars', + 'adopting', + 'adoption', + 'advanced', + 'advances', + 'advisers', + 'advisory', + 'advocate', + 'affected', + 'agencies', + 'agreeing', + 'aircraft', + 'airlines', + 'airplane', + 'airports', + 'alleging', + 'alliance', + 'allocate', + 'allowing', + 'although', + 'aluminum', + 'american', + 'amounted', + 'analyses', + 'analysis', + 'analysts', + 'analyzed', + 'analyzer', + 'andersen', + 'anderson', + 'animated', + 'announce', + 'annually', + 'answered', + 'anything', + 'anywhere', + 'apparent', + 'appealed', + 'appeared', + 'applying', + 'approach', + 'approval', + 'approved', + 'argument', + 'arkansas', + 'armenian', + 'arranged', + 'arrested', + 'arriving', + 'articles', + 'artistic', + 'asbestos', + 'assembly', + 'asserted', + 'assessed', + 'assigned', + 'assuming', + 'atlantic', + 'atlantis', + 'attached', + 'attacked', + 'attempts', + 'attended', + 'attitude', + 'attorney', + 'audience', + 'auditors', + 'austrian', + 'automate', + 'autonomy', + 'averaged', + 'averages', + 'aviation', + 'avoiding', + 'awaiting', + 'backbone', + 'backward', + 'bacteria', + 'balanced', + 'barclays', + 'barriers', + 'baseball', + 'basement', + 'battered', + 'battling', + 'becoming', + 'behavior', + 'believed', + 'believes', + 'benefits', + 'benjamin', + 'berkeley', + 'billions', + 'birthday', + 'blocking', + 'bombings', + 'boosting', + 'borrowed', + 'boundary', + 'branches', + 'breaking', + 'briefing', + 'bringing', + 'broadway', + 'brooklyn', + 'brothers', + 'brussels', + 'building', + 'bulgaria', + 'bulletin', + 'business', + 'calendar', + 'cambodia', + 'campaign', + 'campbell', + 'canadian', + 'canceled', + 'capacity', + 'captured', + 'cardinal', + 'carolina', + 'carriers', + 'carrying', + 'cassette', + 'catalyst', + 'category', + 'catholic', + 'cautious', + 'cdollars', + 'cellular', + 'cemetery', + 'centered', + 'ceremony', + 'chairman', + 'chambers', + 'champion', + 'changing', + 'channels', + 'chapters', + 'charging', + 'checking', + 'chemical', + 'children', + 'choosing', + 'chrysler', + 'churches', + 'circuits', + 'citicorp', + 'citizens', + 'civilian', + 'claiming', + 'cleaning', + 'clearing', + 'clicking', + 'climbing', + 'clinical', + 'closings', + 'clothing', + 'clusters', + 'collapse', + 'colleges', + 'colombia', + 'colorado', + 'columbia', + 'columbus', + 'combined', + 'combines', + 'commands', + 'comments', + 'commerce', + 'commonly', + 'compared', + 'compares', + 'compiled', + 'compiler', + 'complain', + 'complete', + 'composed', + 'compound', + 'comprise', + 'computed', + 'computer', + 'conceded', + 'concedes', + 'concepts', + 'concerns', + 'conclude', + 'concrete', + 'confined', + 'conflict', + 'confused', + 'congress', + 'connects', + 'consider', + 'consists', + 'constant', + 'consumed', + 'consumer', + 'contacts', + 'contains', + 'contends', + 'contents', + 'continue', + 'contract', + 'contrary', + 'contrast', + 'controls', + 'converts', + 'convince', + 'counties', + 'counting', + 'coupling', + 'coverage', + 'covering', + 'cracking', + 'creating', + 'creation', + 'creative', + 'credited', + 'creditor', + 'criminal', + 'criteria', + 'critical', + 'crossing', + 'crystals', + 'cultural', + 'currency', + 'customer', + 'cutbacks', + 'cyclical', + 'damaging', + 'database', + 'daughter', + 'deadline', + 'dealings', + 'debugger', + 'december', + 'deciding', + 'decision', + 'declared', + 'declined', + 'declines', + 'decrease', + 'defaults', + 'defeated', + 'defended', + 'deferred', + 'deficits', + 'defining', + 'definite', + 'delaware', + 'delegate', + 'delicate', + 'delivers', + 'delivery', + 'demanded', + 'democrat', + 'deployed', + 'deposits', + 'deputies', + 'describe', + 'deserves', + 'designed', + 'designer', + 'detailed', + 'detained', + 'detected', + 'detector', + 'deutsche', + 'develops', + 'diagrams', + 'dialogue', + 'diameter', + 'dictator', + 'diplomat', + 'directed', + 'directly', + 'director', + 'disabled', + 'disagree', + 'disaster', + 'disclose', + 'discount', + 'discover', + 'discrete', + 'diseases', + 'diskette', + 'diskless', + 'displays', + 'disposal', + 'disputed', + 'disputes', + 'distance', + 'distinct', + 'district', + 'dividend', + 'division', + 'document', + 'domestic', + 'dominant', + 'dominate', + 'doubling', + 'download', + 'downtown', + 'downturn', + 'downward', + 'drafting', + 'dramatic', + 'drawback', + 'drawings', + 'drilling', + 'drinking', + 'dropping', + 'duration', + 'dynamics', + 'earliest', + 'earnings', + 'economic', + 'editions', + 'egyptian', + 'election', + 'electric', + 'electron', + 'elements', + 'elevated', + 'eligible', + 'embedded', + 'emerging', + 'emission', + 'emphasis', + 'employed', + 'employee', + 'employer', + 'enabling', + 'endorsed', + 'energies', + 'engineer', + 'enhanced', + 'enormous', + 'ensuring', + 'entering', + 'entirely', + 'entities', + 'entitled', + 'entrance', + 'envelope', + 'equation', + 'equipped', + 'equities', + 'estimate', + 'ethernet', + 'european', + 'evaluate', + 'eventual', + 'everyone', + 'evidence', + 'examined', + 'examines', + 'examples', + 'exceeded', + 'exchange', + 'exciting', + 'excluded', + 'executed', + 'exercise', + 'exhibits', + 'existing', + 'expanded', + 'expected', + 'expelled', + 'expenses', + 'explains', + 'explicit', + 'exploded', + 'exported', + 'exposure', + 'extended', + 'external', + 'facility', + 'factions', + 'failures', + 'familiar', + 'families', + 'favorite', + 'feasible', + 'featured', + 'features', + 'february', + 'feedback', + 'feelings', + 'festival', + 'fidelity', + 'fighters', + 'fighting', + 'financed', + 'finances', + 'findings', + 'finished', + 'flagship', + 'flexible', + 'floating', + 'flooding', + 'focusing', + 'followed', + 'football', + 'forecast', + 'formally', + 'formerly', + 'formulas', + 'fortunes', + 'founding', + 'fraction', + 'fracture', + 'franklin', + 'freezing', + 'frequent', + 'friction', + 'friendly', + 'function', + 'gambling', + 'gasoline', + 'gateways', + 'gathered', + 'generate', + 'generous', + 'geometry', + 'gephardt', + 'gillette', + 'gonzalez', + 'governor', + 'graduate', + 'granting', + 'graphics', + 'greatest', + 'guidance', + 'guinness', + 'hamilton', + 'hampered', + 'handlers', + 'handling', + 'happened', + 'hardware', + 'harrison', + 'hartford', + 'headline', + 'hearings', + 'hercules', + 'heritage', + 'highways', + 'hispanic', + 'historic', + 'holdings', + 'holidays', + 'homeland', + 'homeless', + 'hometown', + 'honduras', + 'hospital', + 'hostages', + 'hundreds', + 'hydrogen', + 'identify', + 'identity', + 'illinois', + 'imminent', + 'immunity', + 'imperial', + 'imported', + 'imposing', + 'improper', + 'improved', + 'improves', + 'incident', + 'inclined', + 'included', + 'includes', + 'incoming', + 'increase', + 'incurred', + 'indexing', + 'indicate', + 'indicted', + 'indirect', + 'industry', + 'infected', + 'informal', + 'informed', + 'informix', + 'infrared', + 'inherent', + 'initiate', + 'injected', + 'injuries', + 'injuring', + 'innocent', + 'inserted', + 'insiders', + 'insisted', + 'inspired', + 'instance', + 'insurers', + 'integral', + 'intended', + 'interact', + 'interest', + 'interior', + 'internal', + 'internet', + 'interval', + 'invasion', + 'invented', + 'invested', + 'investor', + 'invoices', + 'involved', + 'involves', + 'iranians', + 'isolated', + 'israelis', + 'issuance', + 'japanese', + 'jetliner', + 'johnston', + 'jonathan', + 'judgment', + 'judicial', + 'justices', + 'kentucky', + 'keyboard', + 'khomeini', + 'killings', + 'kohlberg', + 'landmark', + 'language', + 'laserjet', + 'launched', + 'lawrence', + 'lawsuits', + 'learning', + 'lebanese', + 'leverage', + 'licensed', + 'licenses', + 'lifetime', + 'lighting', + 'limiting', + 'listings', + 'lobbying', + 'location', + 'lockheed', + 'longtime', + 'lowering', + 'machines', + 'magazine', + 'magellan', + 'magnetic', + 'mainland', + 'maintain', + 'majority', + 'malaysia', + 'managers', + 'managing', + 'manually', + 'margaret', + 'marginal', + 'marketed', + 'marriage', + 'marshall', + 'martinez', + 'maryland', + 'matching', + 'material', + 'maturity', + 'mccarthy', + 'meantime', + 'measured', + 'measures', + 'medicaid', + 'medicare', + 'medicine', + 'meetings', + 'megabyte', + 'memorial', + 'memories', + 'merchant', + 'messages', + 'michigan', + 'microvax', + 'midnight', + 'midrange', + 'military', + 'millions', + 'minimize', + 'minister', + 'ministry', + 'minority', + 'missiles', + 'missions', + 'missouri', + 'mistakes', + 'mitchell', + 'mixtures', + 'modeling', + 'moderate', + 'modified', + 'mohammed', + 'moisture', + 'momentum', + 'monetary', + 'monitors', + 'monopoly', + 'montreal', + 'moreover', + 'morrison', + 'mortgage', + 'motorola', + 'mountain', + 'mounting', + 'movement', + 'multiple', + 'narrowed', + 'narrowly', + 'national', + 'nebraska', + 'negative', + 'neighbor', + 'networks', + 'nicholas', + 'nintendo', + 'nitrogen', + 'normally', + 'northern', + 'notebook', + 'notified', + 'november', + 'numerous', + 'objected', + 'observed', + 'observer', + 'obsolete', + 'obstacle', + 'obtained', + 'occasion', + 'occupied', + 'occurred', + 'offering', + 'officers', + 'official', + 'offshore', + 'oklahoma', + 'olivetti', + 'olympics', + 'openness', + 'operated', + 'operates', + 'operator', + 'opinions', + 'opponent', + 'opposing', + 'opposite', + 'optimism', + 'optimize', + 'optional', + 'ordering', + 'ordinary', + 'organize', + 'oriented', + 'original', + 'outgoing', + 'outlawed', + 'outlined', + 'outlines', + 'outright', + 'overcome', + 'overhaul', + 'overhead', + 'override', + 'overseas', + 'oversees', + 'overtime', + 'overview', + 'packaged', + 'packages', + 'painting', + 'pakistan', + 'parallel', + 'particle', + 'partners', + 'password', + 'patients', + 'patricia', + 'patterns', + 'payments', + 'peaceful', + 'pennzoil', + 'pensions', + 'pentagon', + 'performs', + 'periodic', + 'personal', + 'persuade', + 'peterson', + 'petition', + 'phillips', + 'physical', + 'pictures', + 'pipeline', + 'planners', + 'planning', + 'planting', + 'plastics', + 'platform', + 'platinum', + 'pleasure', + 'plotting', + 'pointers', + 'pointing', + 'polaroid', + 'policies', + 'politics', + 'portable', + 'portions', + 'portland', + 'portrait', + 'portugal', + 'position', + 'positive', + 'possible', + 'possibly', + 'potatoes', + 'powerful', + 'practice', + 'precious', + 'predicts', + 'pregnant', + 'premiums', + 'prepared', + 'presence', + 'presents', + 'preserve', + 'pressing', + 'pressure', + 'prevents', + 'previous', + 'printers', + 'printing', + 'priority', + 'prisoner', + 'probable', + 'probably', + 'problems', + 'proceeds', + 'produced', + 'producer', + 'produces', + 'products', + 'profiles', + 'programs', + 'progress', + 'prohibit', + 'projects', + 'promised', + 'promises', + 'promoted', + 'prompted', + 'promptly', + 'properly', + 'property', + 'proposal', + 'proposed', + 'proposes', + 'prospect', + 'protests', + 'protocol', + 'provided', + 'provider', + 'provides', + 'province', + 'publicly', + 'punitive', + 'purchase', + 'purposes', + 'pursuant', + 'pursuing', + 'quantity', + 'quarters', + 'question', + 'radicals', + 'railroad', + 'reaching', + 'reaction', + 'reactors', + 'realized', + 'recalled', + 'receipts', + 'received', + 'receiver', + 'receives', + 'recently', + 'recorded', + 'recorder', + 'recovery', + 'reducing', + 'referred', + 'refinery', + 'refining', + 'reflects', + 'refugees', + 'refusing', + 'regarded', + 'regional', + 'register', + 'regulate', + 'rejected', + 'relating', + 'relation', + 'relative', + 'released', + 'releases', + 'relevant', + 'reliable', + 'relieved', + 'religion', + 'remained', + 'remember', + 'removing', + 'repeated', + 'replaced', + 'replaces', + 'reported', + 'reporter', + 'republic', + 'requests', + 'required', + 'requires', + 'research', + 'reseller', + 'reserved', + 'reserves', + 'resident', + 'residual', + 'resigned', + 'resisted', + 'resolved', + 'resource', + 'respects', + 'response', + 'restored', + 'restrict', + 'resulted', + 'retailer', + 'retained', + 'retiring', + 'retrieve', + 'returned', + 'revealed', + 'revenues', + 'reversal', + 'reversed', + 'reviewed', + 'revision', + 'reynolds', + 'rhetoric', + 'richards', + 'richmond', + 'robinson', + 'rockwell', + 'romanian', + 'rotation', + 'routines', + 'russians', + 'salaries', + 'salesman', + 'salvador', + 'sampling', + 'saturday', + 'scalable', + 'scanners', + 'scanning', + 'scenario', + 'schedule', + 'sciences', + 'scotland', + 'scottish', + 'scrutiny', + 'searched', + 'searches', + 'seasonal', + 'sections', + 'security', + 'segments', + 'selected', + 'seminars', + 'senators', + 'sensible', + 'sentence', + 'separate', + 'sequence', + 'services', + 'sessions', + 'settings', + 'settling', + 'severely', + 'sexually', + 'shanghai', + 'shearson', + 'shelters', + 'shifting', + 'shipment', + 'shipping', + 'shooting', + 'shoppers', + 'shopping', + 'shortage', + 'shoulder', + 'shutdown', + 'simplify', + 'simulate', + 'sleeping', + 'slightly', + 'slowdown', + 'sluggish', + 'smallest', + 'smoothly', + 'software', + 'soldiers', + 'solution', + 'somebody', + 'sometime', + 'somewhat', + 'southern', + 'soybeans', + 'speakers', + 'speaking', + 'specific', + 'spectral', + 'spectrum', + 'speeches', + 'spelling', + 'spending', + 'sponsors', + 'staffers', + 'standard', + 'standing', + 'stanford', + 'starring', + 'starting', + 'stations', + 'steadily', + 'steering', + 'stemming', + 'stepping', + 'sterling', + 'sticking', + 'stopping', + 'straight', + 'strategy', + 'strength', + 'stressed', + 'stresses', + 'strictly', + 'strikers', + 'striking', + 'stripped', + 'stronger', + 'strongly', + 'struggle', + 'students', + 'studying', + 'subjects', + 'suburban', + 'succeeds', + 'suddenly', + 'suffered', + 'suggests', + 'suitable', + 'sullivan', + 'superior', + 'supplied', + 'supplier', + 'supplies', + 'supports', + 'supposed', + 'surfaced', + 'surfaces', + 'surprise', + 'surveyed', + 'survival', + 'survived', + 'suspects', + 'sweeping', + 'swimming', + 'switched', + 'switches', + 'symantec', + 'symbolic', + 'sympathy', + 'symphony', + 'symptoms', + 'syndrome', + 'tailored', + 'takeover', + 'targeted', + 'taxpayer', + 'teachers', + 'teaching', + 'template', + 'tendency', + 'tendered', + 'tensions', + 'terminal', + 'terrible', + 'thailand', + 'thatcher', + 'theaters', + 'theories', + 'thinking', + 'thompson', + 'thorough', + 'thoughts', + 'thousand', + 'threaten', + 'throwing', + 'thursday', + 'together', + 'tomorrow', + 'totaling', + 'tourists', + 'tracking', + 'training', + 'transfer', + 'transmit', + 'traveled', + 'treasury', + 'treating', + 'trillion', + 'tropical', + 'troubled', + 'troubles', + 'truetype', + 'trustees', + 'turnover', + 'tutorial', + 'ultimate', + 'umbrella', + 'universe', + 'unlikely', + 'unstable', + 'unveiled', + 'upcoming', + 'updating', + 'upgraded', + 'upgrades', + 'uprising', + 'utilized', + 'vacation', + 'validity', + 'valuable', + 'variable', + 'vehicles', + 'velocity', + 'ventures', + 'versions', + 'vertical', + 'veterans', + 'villages', + 'violated', + 'violence', + 'virginia', + 'visiting', + 'visitors', + 'volatile', + 'warnings', + 'warrants', + 'warranty', + 'watching', + 'weakened', + 'weakness', + 'weighing', + 'weighted', + 'welcomed', + 'whatever', + 'whenever', + 'wildlife', + 'williams', + 'wireless', + 'withdraw', + 'withdrew', + 'withheld', + 'wordstar', + 'worrying', + 'yielding', + 'yourself' +]; diff --git a/js/zxcvbn-bootstrap-strength-meter.js b/js/zxcvbn-bootstrap-strength-meter.js new file mode 100644 index 0000000..7e58a45 --- /dev/null +++ b/js/zxcvbn-bootstrap-strength-meter.js @@ -0,0 +1,77 @@ +//Requires zxcvbn.js and Bootstrap +(function ($) { + + $.fn.zxcvbnProgressBar = function (options) { + + //init settings + var settings = $.extend({ + passwordInput: '#Password', + userInputs: [], + ratings: ["Very poor", "Poor", "Lukewarm", "Good", "Great"], + //all progress bar classes removed before adding score specific css class + allProgressBarClasses: "progress-bar-danger progress-bar-warning progress-bar-success progress-bar-striped active", + //bootstrap css classes (0-4 corresponds with zxcvbn score) + progressBarClass0: "progress-bar-danger progress-bar-striped active", + progressBarClass1: "progress-bar-danger progress-bar-striped active", + progressBarClass2: "progress-bar-warning progress-bar-striped active", + progressBarClass3: "progress-bar-success", + progressBarClass4: "progress-bar-success" + }, options); + + return this.each(function () { + settings.progressBar = this; + //init progress bar display + UpdateProgressBar(); + //Update progress bar on each keypress of password input + $(settings.passwordInput).keyup(function (event) { + UpdateProgressBar(); + }); + }); + + function UpdateProgressBar() { + var progressBar = settings.progressBar; + var password = $(settings.passwordInput).val(); + if (password) { + var result = zxcvbn(password, settings.userInputs); + //result.score: 0, 1, 2, 3 or 4 - if crack time is less than 10**2, 10**4, 10**6, 10**8, Infinity. + var scorePercentage = (result.score + 1) * 20; + $(progressBar).css('width', scorePercentage + '%'); + $( "input#pass_score" ).val(result.score); + + if (result.score == 0) { + //weak + $(progressBar).removeClass(settings.allProgressBarClasses).addClass(settings.progressBarClass0); + $(progressBar).html(settings.ratings[0]); + } + else if (result.score == 1) { + //normal + $(progressBar).removeClass(settings.allProgressBarClasses).addClass(settings.progressBarClass1); + $(progressBar).html(settings.ratings[1]); + } + else if (result.score == 2) { + //medium + $(progressBar).removeClass(settings.allProgressBarClasses).addClass(settings.progressBarClass2); + $(progressBar).html(settings.ratings[2]); + } + else if (result.score == 3) { + //strong + $(progressBar).removeClass(settings.allProgressBarClasses).addClass(settings.progressBarClass3); + $(progressBar).html(settings.ratings[3]); + } + else if (result.score == 4) { + //very strong + $(progressBar).removeClass(settings.allProgressBarClasses).addClass(settings.progressBarClass4); + $(progressBar).html(settings.ratings[4]); + } + } + else { + $(progressBar).css('width', '0%'); + $(progressBar).removeClass(settings.allProgressBarClasses).addClass(settings.progressBarClass0); + $(progressBar).html(''); + } + } + + update_password_bar = UpdateProgressBar; + + }; +})(jQuery); diff --git a/ldap_manager/groups.php b/ldap_manager/groups.php new file mode 100644 index 0000000..63a1622 --- /dev/null +++ b/ldap_manager/groups.php @@ -0,0 +1,97 @@ + + + + + + + + +
+ +
+
+ + + +
+
+ + + + + + + + +\n \n \n"; +} +?> + +
Group name
$group
+
+ diff --git a/ldap_manager/index.php b/ldap_manager/index.php new file mode 100644 index 0000000..6e88e43 --- /dev/null +++ b/ldap_manager/index.php @@ -0,0 +1,80 @@ + + + + + + + +
+
+ +
+ + + + + + + + + + $attribs){ + print " \n \n"; + print " \n"; + print " \n"; + print " \n"; +} +?> + +
UsernameFirst nameLast name
$username" . $people[$username]['givenname'] . "" . $people[$username]['sn'] . "
+
+ diff --git a/ldap_manager/module_functions.inc.php b/ldap_manager/module_functions.inc.php new file mode 100644 index 0000000..b5f0726 --- /dev/null +++ b/ldap_manager/module_functions.inc.php @@ -0,0 +1,37 @@ + 'index.php', + 'groups' => 'groups.php' + ); + ?> + + diff --git a/ldap_manager/new_user.php b/ldap_manager/new_user.php new file mode 100644 index 0000000..9206209 --- /dev/null +++ b/ldap_manager/new_user.php @@ -0,0 +1,212 @@ + +
+

Account created.

+
+
+

+ +

+
+ +
+

Couldn't create the account.

+
+ +
+

The password wasn't strong enough.

+
+ +
+

The password contained invalid characters.

+
+ +
+

The passwords didn't match.

+
+ +
+

The username is invalid.

+
+ + + + + + + + +
+
+ +
+
New account
+
+ +
+ + + + +
+ +
+ onkeyup="update_username()"> +
+
+ +
+ +
+ onkeyup="update_username()"> +
+
+ +
+ +
+ onkeyup="check_username_validity(document.getElementById('username').value)"> +
+
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+
+
+ +
+
+ +
+
+ diff --git a/ldap_manager/show_group.php b/ldap_manager/show_group.php new file mode 100644 index 0000000..db1d3c8 --- /dev/null +++ b/ldap_manager/show_group.php @@ -0,0 +1,302 @@ + +
+

The group name is missing.

+
+ +
+

The group name is invalid.

+
+ $value) { + if ($key != 'count') { + $this_member = preg_replace("/^.*?=(.*?),.*/", "$1", $value); + array_push($current_members, $this_member); + } + } +} + +$all_accounts = ldap_get_user_list($ldap_connection); +$all_people = array(); +foreach ($all_accounts as $this_person => $attrs) { + array_push($all_people, $this_person); +} + +$non_members = array_diff($all_people,$current_members); + +if (isset($_POST["update_members"])) { + + $updated_membership = array(); + + foreach ($_POST as $index => $member) { + + if (is_numeric($index) and preg_match("/$USERNAME_REGEX/",$member)) { + array_push($updated_membership,$member); + } + } + + $members_to_del = array_diff($current_members,$updated_membership); + $members_to_add = array_diff($updated_membership,$current_members); + + foreach ($members_to_del as $this_member) { + ldap_delete_member_from_group($ldap_connection,$group_cn,$this_member); + } + foreach ($members_to_add as $this_member) { + ldap_add_member_to_group($ldap_connection,$group_cn,$this_member); + } + + $non_members = array_diff($all_people,$updated_membership); + $group_members = $updated_membership; + + ?> + + + + + + + + + + +
+ +
+
+

+ +
+
+
+ + +
+ +
+ Members +
+
+
+
+ + +
+
+
+
+ +
+
+
+
    + $member\n"; + } + ?> +
+
+
+ +
+ + +
+ + +
+ +
+ +
+ Available accounts +
+
+
+
+ +
+
+
+
+ + +
+
+
+
    + $nonmember\n"; + } + ?> +
+
+
+ +
+
+ + + + diff --git a/ldap_manager/show_user.php b/ldap_manager/show_user.php new file mode 100644 index 0000000..db50aad --- /dev/null +++ b/ldap_manager/show_user.php @@ -0,0 +1,472 @@ + "First name", + "sn" => "Last name", + "uidnumber" => "UID", + "gidnumber" => "GID", + "loginshell" => "Login shell", + "homedirectory" => "Home directory" + ); + + +$ldap_connection = open_ldap_connection(); + + +if (!isset($_POST['username']) and !isset($_GET['username'])) { +?> +
+

The username is missing.

+
+ +
+

The username is invalid.

+
+ $value) { + + if ($user[0][$key][0] != $_POST[$key]) { + $to_update[$key] = $_POST[$key]; + $user[0][$key][0] = $_POST[$key]; + } + + } + + if (isset($_POST['password']) and $_POST['password'] != "") { + + $password = $_POST['password']; + + if (!is_numeric($_POST['pass_score']) or $_POST['pass_score'] < 3) { $weak_password = True; } + if (preg_match("/\"|'/",$password)) { $invalid_password = True; } + if ($_POST['password'] != $_POST['password_match']) { $mismatched_passwords = True; } + if (!preg_match("/$USERNAME_REGEX/",$username)) { $invalid_username = True; } + + if ( !$mismatched_passwords + and !$weak_password + and !$invalid_password + ) { + $to_update['userpassword'] = ldap_hashed_password($password); + } + } + + + $updated_account = ldap_mod_replace($ldap_connection, $user[0]['dn'] , $to_update); + + if ($updated_account) { + ?> + + + + + + +
+

The password wasn't strong enough.

+
+ +
+

The password contained invalid characters.

+
+ +
+

The passwords didn't match.

+
+ $group) { + if (is_numeric($index) and preg_match("/$USERNAME_REGEX/",$group)) { + array_push($updated_group_membership,$group); + } + } + + $groups_to_add = array_diff($updated_group_membership,$currently_member_of); + $groups_to_del = array_diff($currently_member_of,$updated_group_membership); + + + foreach ($groups_to_del as $this_group) { + ldap_delete_member_from_group($ldap_connection,$this_group,$username); + } + foreach ($groups_to_add as $this_group) { + ldap_add_member_to_group($ldap_connection,$this_group,$username); + } + + $not_member_of = array_diff($all_groups,$updated_group_membership); + $member_of = $updated_group_membership; + + ?> + + + + + + + + + + + +
+
+ +
+
+

+ +
+
+
+
+ + + + + + + $value) { + ?> +
+ +
+ +
+
+ + +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+ +
+

+
+ +
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+

Group membership

+
+
+ +
+ +
+ Member of +
+
+
+
+ + +
+
+
+
+ +
+
+
+
    + $group\n"; + } + ?> +
+
+
+ +
+ + +
+ + +
+ +
+ +
+ Available groups +
+
+
+
+ +
+
+
+
+ + +
+
+
+
    + $group\n"; + } + ?> +
+
+
+ +
+
+
+ + + diff --git a/log_in/index.php b/log_in/index.php new file mode 100644 index 0000000..cc50fbe --- /dev/null +++ b/log_in/index.php @@ -0,0 +1,76 @@ + +
+
+ +
+
Log in
+
+ + +
+ The username and/or password are unrecognised. +
+ + + +
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+
+ +
+ +
+ +
+
+
+
+ diff --git a/log_out/index.php b/log_out/index.php new file mode 100644 index 0000000..9624e9a --- /dev/null +++ b/log_out/index.php @@ -0,0 +1,4 @@ + diff --git a/setup/index.php b/setup/index.php new file mode 100644 index 0000000..067f9b9 --- /dev/null +++ b/setup/index.php @@ -0,0 +1,52 @@ + +
+

The password was incorrect.

+
+ +
+
+
Password for
+
+
+
+ +
+
+ +
+
+
+
+
+
+ diff --git a/setup/module_functions.inc.php b/setup/module_functions.inc.php new file mode 100644 index 0000000..3091dc4 --- /dev/null +++ b/setup/module_functions.inc.php @@ -0,0 +1,7 @@ +$GOOD_ICON"; +$li_warn="
  • $WARN_ICON"; +$li_fail="
  • $FAIL_ICON"; + +?> diff --git a/setup/run_checks.php b/setup/run_checks.php new file mode 100644 index 0000000..3190dbf --- /dev/null +++ b/setup/run_checks.php @@ -0,0 +1,235 @@ + + +
    +
    " method="post"> + + + +
    + +
    +
    LDAP connection tests
    +
    +
      +\n"; + +#TLS? +if ($LDAP['starttls'] && $ENCRYPTED == True) { + print "$li_good Encrypted connection to ${LDAP['uri']} via STARTTLS\n"; +} +else { + print "$li_warn Unable to connect to ${LDAP['uri']} via STARTTLS. "; + print "What's this?\n"; +} + + +?> +
    +
    +
    + +
    +
    LDAP OU checks
    +
    +
      +${LDAP['group_dn']}) doesn't exist. "; + print "What's this?"; + print ""; + print "\n"; + $show_finish_button = False; + +} +else { + print "$li_good The group OU (${LDAP['group_dn']}) is present."; +} + +$user_filter = "(&(objectclass=organizationalUnit)(ou=${LDAP['user_ou']}))"; +$ldap_user_search = ldap_search($ldap_connection, "${LDAP['base_dn']}", $user_filter); +$user_result = ldap_get_entries($ldap_connection, $ldap_user_search); + +if ($user_result['count'] != 1) { + + print "$li_fail The user OU (${LDAP['user_dn']}) doesn't exist. "; + print "What's this?"; + print ""; + print "\n"; + $show_finish_button = False; + +} +else { + print "$li_good The user OU (${LDAP['user_dn']}) is present."; +} + +?> +
    +
    +
    + +
    +
    LDAP group and settings
    +
    +
      +lastGID entry doesn't exist. "; + print "What's this?"; + print ""; + print "\n"; + $show_finish_button = False; + +} +else { + print "$li_good The lastGID entry is present."; +} + + +$uid_filter = "(&(objectclass=device)(cn=lastUID))"; +$ldap_uid_search = ldap_search($ldap_connection, "${LDAP['base_dn']}", $uid_filter); +$uid_result = ldap_get_entries($ldap_connection, $ldap_uid_search); + +if ($uid_result['count'] != 1) { + + print "$li_warn The lastUID entry doesn't exist. "; + print "What's this?"; + print ""; + print "\n"; + $show_finish_button = False; + +} +else { + print "$li_good The lastUID entry is present."; +} + + +$defgroup_filter = "(&(objectclass=posixGroup)(cn=${DEFAULT_USER_GROUP}))"; +$ldap_defgroup_search = ldap_search($ldap_connection, "${LDAP['base_dn']}", $defgroup_filter); +$defgroup_result = ldap_get_entries($ldap_connection, $ldap_defgroup_search); + +if ($defgroup_result['count'] != 1) { + + print "$li_warn The default group ($DEFAULT_USER_GROUP) doesn't exist. "; + print "What's this?"; + print ""; + print "\n"; + $show_finish_button = False; + +} +else { + print "$li_good The default user group ($DEFAULT_USER_GROUP) is present."; +} + + +$adminsgroup_filter = "(&(objectclass=posixGroup)(cn=${LDAP['admins_group']}))"; +$ldap_adminsgroup_search = ldap_search($ldap_connection, "${LDAP['base_dn']}", $adminsgroup_filter); +$adminsgroup_result = ldap_get_entries($ldap_connection, $ldap_adminsgroup_search); + +if ($adminsgroup_result['count'] != 1) { + + print "$li_fail The group defining LDAP account administrators (${LDAP['admins_group']}) doesn't exist. "; + print "What's this?"; + print ""; + print "\n"; + $show_finish_button = False; + +} +else { + print "$li_good The LDAP account administrators group (${LDAP['admins_group']}) is present."; + + $admins = ldap_get_group_members($ldap_connection,$LDAP['admins_group']); + + if (count($admins) < 1) { + print "$li_fail The LDAP administration group is empty. You can add an admin account in the next section."; + $show_finish_button = False; + } +} + + + + + +?> +
    +
    +
    + + +
    +
    + +
    +
    + +
    + +
    + + +
    +
    + diff --git a/setup/setup_admin_account.php b/setup/setup_admin_account.php new file mode 100644 index 0000000..26fa788 --- /dev/null +++ b/setup/setup_admin_account.php @@ -0,0 +1,204 @@ + +
    +

    Account created.

    +
    +
    +

    + +

    +
    + +
    +

    Couldn't create the account.

    +
    + +
    +

    Couldn't add the account to the admin group.

    +
    + +
    +

    + +

    +
    + +
    +

    The password wasn't strong enough.

    +
    + +
    +

    The password contained invalid characters.

    +
    + +
    +

    The passwords didn't match.

    +
    + +
    +

    The username is invalid.

    +
    + + + + + + +
    +
    + +
    +
    New administrator account
    +
    + +
    + + + + +
    + +
    + onkeyup="update_username()"> +
    +
    + +
    + +
    + onkeyup="update_username()"> +
    +
    + +
    + +
    + onkeyup="check_username_validity(document.getElementById('username').value)"> +
    +
    + +
    + +
    + +
    +
    + + +
    +
    +
    +
    + + +
    + +
    + +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    + diff --git a/setup/setup_ldap.php b/setup/setup_ldap.php new file mode 100644 index 0000000..b7a2fc2 --- /dev/null +++ b/setup/setup_ldap.php @@ -0,0 +1,196 @@ + + +
    + +
    +
    Updating LDAP...
    +
    +
      + + 'organizationalUnit', 'ou' => $LDAP['group_ou'] )); + if ($ou_add == True) { + print "$li_good Created OU ${LDAP['group_dn']}\n"; + } + else { + $error = ldap_error($ldap_connection); + print "$li_fail Couldn't create ${LDAP['group_dn']}:
      $error
      \n"; + $no_errors = False; + } + } + + + if (isset($_POST['setup_user_ou'])) { + $ou_add = ldap_add($ldap_connection, $LDAP['user_dn'], array( 'objectClass' => 'organizationalUnit', 'ou' => $LDAP['user_ou'] )); + if ($ou_add == True) { + print "$li_good Created OU ${LDAP['user_dn']}\n"; + } + else { + $error = ldap_error($ldap_connection); + print "$li_fail Couldn't create ${LDAP['user_dn']}:
      $error
      \n"; + $no_errors = False; + } + } + + + if (isset($_POST['setup_last_gid'])) { + + $highest_gid = ldap_get_highest_id($ldap_connection,'gid'); + $description = "Records the last GID used to create a Posix group. This prevents the re-use of a GID from a deleted group."; + + $gid_add = ldap_add($ldap_connection, "cn=lastGID,${LDAP['base_dn']}", array( 'objectClass' => array('device','top'), + 'serialnumber' => $highest_gid, + 'description' => $description ) + ); + + if ($gid_add == True) { + print "$li_good Created cn=lastGID,${LDAP['base_dn']}\n"; + } + else { + $error = ldap_error($ldap_connection); + print "$li_fail Couldn't create cn=lastGID,${LDAP['base_dn']}:
      $error
      \n"; + $no_errors = False; + } + } + + + if (isset($_POST['setup_last_uid'])) { + + $highest_uid = ldap_get_highest_id($ldap_connection,'uid'); + $description = "Records the last UID used to create a Posix account. This prevents the re-use of a UID from a deleted account."; + + $uid_add = ldap_add($ldap_connection, "cn=lastUID,${LDAP['base_dn']}", array( 'objectClass' => array('device','top'), + 'serialnumber' => $highest_uid, + 'description' => $description ) + ); + + if ($uid_add == True) { + print "$li_good Created cn=lastUID,${LDAP['base_dn']}\n"; + } + else { + $error = ldap_error($ldap_connection); + print "$li_fail Couldn't create cn=lastUID,${LDAP['base_dn']}:
      $error
      \n"; + $no_errors = False; + } + } + + + if (isset($_POST['setup_default_group'])) { + + $group_add = ldap_new_group($ldap_connection,$DEFAULT_USER_GROUP); + + if ($group_add == True) { + print "$li_good Created default group: $DEFAULT_USER_GROUP\n"; + } + else { + $error = ldap_error($ldap_connection); + print "$li_fail Couldn't create default group:
      $error
      \n"; + $no_errors = False; + } + } + + if (isset($_POST['setup_admins_group'])) { + + $group_add = ldap_new_group($ldap_connection,$LDAP['admins_group']); + + if ($group_add == True) { + print "$li_good Created LDAP administrators group: ${LDAP['admins_group']}\n"; + } + else { + $error = ldap_error($ldap_connection); + print "$li_fail Couldn't create LDAP administrators group:
      $error
      \n"; + $no_errors = False; + } + } + + $admins = ldap_get_group_members($ldap_connection,$LDAP['admins_group']); + + if (count($admins) < 1) { + + ?> +
      +
      " method="post"> + + What's this?"; + print ""; + print "\n"; + $show_create_admin_button = True; + + } + else { + print "$li_good The LDAP account administrators group (${LDAP['admins_group']}) isn't empty."; + } + + +?> +
    +
    +
    + +
    + + + +
    + +
    + + +
    + +
    +
    + +
    +
    +